diff --git a/.codacy.yaml b/.codacy.yaml index 85a7ccdad6..326a6209f4 100644 --- a/.codacy.yaml +++ b/.codacy.yaml @@ -1,3 +1,5 @@ --- exclude_paths: - '3rdparty/**' + - '*.md' + - '**/*.md' diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0ebafb66fb..f47201d873 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -26,13 +26,17 @@ The following is a list of *general* style recommendations that will make review * Please try to prefix your commit message, indicating what area of the project was modified. * For example `gs: message...`. * Looking at the project's commit history will help with keeping prefixes consistent overtime, *there is no strictly enforced list*. + * Try to keep messages brief and informative + * Remove unnecessary commits and squash commits together when appropriate. * If you are not familiar with rebasing with git, check out the following resources: * CLI - https://thoughtbot.com/blog/git-interactive-rebase-squash-amend-rewriting-history * GUI (SourceTree) - https://www.atlassian.com/blog/sourcetree/interactive-rebase-sourcetree + * Code Styling and Formatting * [Consult the style guide](https://github.com/tadanokojin/pcsx2/blob/coding-guide/pcsx2/Docs/Coding_Guidelines.md) + * Run `clang-format` using the configuration file in the root of the repository * Visual Studio Setup - https://devblogs.microsoft.com/cppblog/clangformat-support-in-visual-studio-2017-15-7-preview-1/ * IMPORTANT - if you are running `clang-format` on unrelated changes (ie. formatting an entire file), please do so in a separate commit. @@ -41,9 +45,9 @@ The following is a list of *general* style recommendations that will make review ## General Documentation And Coding Strategies * [Commenting Etiquette](https://github.com/PCSX2/pcsx2/wiki/Commenting-Etiquette) + * [Coding style](https://github.com/PCSX2/pcsx2/wiki/Code-Formatting-Guidelines) * [More comprehensive style-guide (Currently in Draft)](https://github.com/tadanokojin/pcsx2/blob/coding-guide/pcsx2/Docs/Coding_Guidelines.md) -* [wxWidgets coding strategies](https://github.com/PCSX2/pcsx2/wiki/wxWidgets-Coding-Strategies) ## Tasks diff --git a/.github/ISSUE_TEMPLATE/app_bug_report.yaml b/.github/ISSUE_TEMPLATE/app_bug_report.yaml index 64cc4bcc68..8ee75abdf5 100644 --- a/.github/ISSUE_TEMPLATE/app_bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/app_bug_report.yaml @@ -60,11 +60,8 @@ body: label: Operating System options: - Windows 11 - - Windows 10 (32bit) - Windows 10 (64bit) - - Windows 8.1 (32bit) - Windows 8.1 (64bit) - - Linux (32bit) - Specify Distro Below - Linux (64bit) - Specify Distro Below - macOS (Monteray) - macOS (BigSur) diff --git a/.github/ISSUE_TEMPLATE/emu_bug_report.yaml b/.github/ISSUE_TEMPLATE/emu_bug_report.yaml index 138514b19d..fa21a747c7 100644 --- a/.github/ISSUE_TEMPLATE/emu_bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/emu_bug_report.yaml @@ -54,9 +54,6 @@ body: Please make sure your system meets our requirements for OS version, CPU and GPU - [System Requirements](https://github.com/PCSX2/pcsx2#system-requirements) - We **do not** accept bug reports for **unsupported operating systems**. - - [For macOS Support](https://forums.pcsx2.net/Thread-Native-Mac-Testing-Build) - Performance issues as a result of not meeting our hardware requirements are not valid Please read our known issues pages for AMD and Intel drivers. @@ -78,11 +75,8 @@ body: label: Operating System options: - Windows 11 - - Windows 10 (32bit) - Windows 10 (64bit) - - Windows 8.1 (32bit) - Windows 8.1 (64bit) - - Linux (32bit) - Specify Distro Below - Linux (64bit) - Specify Distro Below - macOS (Monteray) - macOS (BigSur) diff --git a/.github/labeler.yml b/.github/labeler.yml index 8648303256..80199fac07 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -12,7 +12,6 @@ - 'cmake/**/*' - 'CMakeLists.txt' - '**/CMakeLists.txt' - - 'buildbot.xml' - 'build.sh' 'Dependencies': - '3rdparty/*' diff --git a/.github/workflows/lint_gamedb.yml b/.github/workflows/lint_gamedb.yml index bbd320ffec..d386634685 100644 --- a/.github/workflows/lint_gamedb.yml +++ b/.github/workflows/lint_gamedb.yml @@ -21,12 +21,9 @@ jobs: uses: actions/checkout@v3 - name: Validate Contents - env: - GAMEDB_PATH: ./bin/resources/GameIndex.yaml - SCRIPT_DIR: .github/workflows/scripts/lint/gamedb run: | - pip install -r "${SCRIPT_DIR}/requirements.txt" - python "${SCRIPT_DIR}/lint.py" + npm install -g ajv-cli + ajv validate -s ./pcsx2/Docs/gamedb-schema.json --spec=draft2020 -d ./bin/resources/GameIndex.yaml - name: Check Formatting run: | diff --git a/.github/workflows/linux_build_matrix.yml b/.github/workflows/linux_build_matrix.yml index 38c30b0b6b..dffad5e0a4 100644 --- a/.github/workflows/linux_build_matrix.yml +++ b/.github/workflows/linux_build_matrix.yml @@ -15,7 +15,7 @@ jobs: with: jobName: "with LTO" compiler: gcc - cmakeflags: "-DLTO_PCSX2_CORE=ON" + cmakeflags: "-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON" buildAppImage: true secrets: inherit diff --git a/.github/workflows/linux_build_qt.yml b/.github/workflows/linux_build_qt.yml index 769520e3ca..5dabdb7cb3 100644 --- a/.github/workflows/linux_build_qt.yml +++ b/.github/workflows/linux_build_qt.yml @@ -32,6 +32,10 @@ on: required: false type: string default: "" + cheats_url: + required: false + type: string + default: https://github.com/PCSX2/pcsx2_patches/releases/latest/download jobs: build_linux: @@ -69,10 +73,7 @@ jobs: # -- SETUP CCACHE - https://cristianadam.eu/20200113/speeding-up-c-plus-plus-github-actions-using-ccache/ - name: Prepare ccache timestamp id: ccache_cache_timestamp - shell: cmake -P {0} - run: | - string(TIMESTAMP current_date "%Y-%m-%d-%H;%M;%S" UTC) - message("::set-output name=timestamp::${current_date}") + run: echo "timestamp=$(date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT - name: ccache cache files uses: actions/cache@v3 @@ -97,6 +98,11 @@ jobs: if: steps.cache-deps.outputs.cache-hit != 'true' run: .github/workflows/scripts/linux/build-dependencies-qt.sh + - name: Download cheats + run: | + cd bin/resources + aria2c -Z "${{ inputs.cheats_url }}/cheats_ni.zip" "${{ inputs.cheats_url }}/cheats_ws.zip" + - name: Generate CMake env: COMPILER: ${{ inputs.compiler }} diff --git a/.github/workflows/linux_build_wx.yml b/.github/workflows/linux_build_wx.yml index 55f8382257..7f4e08ce8e 100644 --- a/.github/workflows/linux_build_wx.yml +++ b/.github/workflows/linux_build_wx.yml @@ -9,7 +9,7 @@ on: os: required: false type: string - default: ubuntu-18.04 + default: ubuntu-20.04 platform: required: false type: string @@ -28,6 +28,10 @@ on: required: false type: string default: "" + cheats_url: + required: false + type: string + default: https://github.com/PCSX2/pcsx2_patches/releases/latest/download jobs: build_linux: @@ -41,7 +45,7 @@ jobs: CCACHE_COMPRESS: true CCACHE_COMPRESSLEVEL: 9 CCACHE_MAXSIZE: 100M - SDL: SDL2-2.0.22 + SDL: SDL2-2.26.0 PATCHELF_VERSION: 0.12 steps: @@ -67,10 +71,7 @@ jobs: # -- SETUP CCACHE - https://cristianadam.eu/20200113/speeding-up-c-plus-plus-github-actions-using-ccache/ - name: Prepare ccache timestamp id: ccache_cache_timestamp - shell: cmake -P {0} - run: | - string(TIMESTAMP current_date "%Y-%m-%d-%H;%M;%S" UTC) - message("::set-output name=timestamp::${current_date}") + run: echo "timestamp=$(date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT - name: ccache cache files uses: actions/cache@v3 @@ -115,6 +116,11 @@ jobs: fi sudo make -C 3rdparty/${{ env.SDL }} install + - name: Download cheats + run: | + cd bin/resources + aria2c -Z "${{ inputs.cheats_url }}/cheats_ni.zip" "${{ inputs.cheats_url }}/cheats_ws.zip" + - name: Generate CMake env: PLATFORM: ${{ inputs.platform }} diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index 9c51998f43..a8f98c07a9 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -17,6 +17,10 @@ on: gui: required: true type: string + cheats_url: + required: false + type: string + default: https://github.com/PCSX2/pcsx2_patches/releases/latest/download jobs: build_macos: @@ -26,11 +30,11 @@ jobs: timeout-minutes: 90 env: POWERSHELL_TELEMETRY_OPTOUT: 1 - BUILDCACHE_COMPRESS_FORMAT: ZSTD - BUILDCACHE_COMPRESS_LEVEL: 9 - BUILDCACHE_MAX_CACHE_SIZE: 536870912 # 512MB - BUILDCACHE_DIRECT_MODE: true - BUILDCACHE_LOG_FILE: ${{ github.workspace }}\buildcache.log + CCACHE_BASEDIR: ${{ github.workspace }} + CCACHE_DIR: ${{ github.workspace }}/.ccache + CCACHE_COMPRESS: true + CCACHE_COMPRESSLEVEL: 9 + CCACHE_MAXSIZE: 100M steps: - name: Checkout Repository @@ -58,11 +62,12 @@ jobs: HOMEBREW_NO_INSTALL_CLEANUP: 1 HOMEBREW_NO_ANALYTICS: 1 run: | - brew unlink libjpeg libpng # Conflicts with our self-built dependencies + brew unlink libjpeg || true # Conflicts with our self-built dependencies + brew unlink libpng || true # Unlike other packages, brew's MoltenVK build uses MoltenVK's minimum macOS version of 10.13 so we can use it - if ! brew install molten-vk; then + if ! brew install molten-vk ccache; then brew update - brew install molten-vk + brew install molten-vk ccache fi - name: Cache Dependencies @@ -78,14 +83,54 @@ jobs: GUI: ${{ inputs.gui }} run: .github/workflows/scripts/macos/build-dependencies.sh + - name: Download cheats + run: | + cd bin/resources + aria2c -Z "${{ inputs.cheats_url }}/cheats_ni.zip" "${{ inputs.cheats_url }}/cheats_ws.zip" + + # -- SETUP CCACHE - https://cristianadam.eu/20200113/speeding-up-c-plus-plus-github-actions-using-ccache/ + - name: Prepare ccache timestamp + id: ccache_cache_timestamp + run: echo "timestamp=$(date -u "+%Y-%m-%d-%H;%M;%S")" >> $GITHUB_OUTPUT + + - name: Cache ccache cache + uses: actions/cache@v3 + with: + path: .ccache + key: ${{ inputs.os }} ${{ inputs.platform }} ${{ inputs.gui }} ccache ${{ steps.ccache_cache_timestamp.outputs.timestamp }} + restore-keys: ${{ inputs.os }} ${{ inputs.platform }} ${{ inputs.gui }} ccache + - name: Generate CMake Files run: | QT_BUILD=$([ "${{ inputs.gui }}" == "Qt" ] && echo "ON" || echo "OFF") - cmake -DCMAKE_PREFIX_PATH="$HOME/deps" -DCMAKE_BUILD_TYPE=Release -DQT_BUILD="$QT_BUILD" -DUSE_OPENGL=OFF -DDISABLE_ADVANCE_SIMD=ON -DLTO_PCSX2_CORE=ON -DUSE_SYSTEM_LIBS=OFF -DUSE_SYSTEM_SDL2=ON -B build . + cmake -DCMAKE_PREFIX_PATH="$HOME/deps" \ + -DCMAKE_BUILD_TYPE=Release \ + -DQT_BUILD="$QT_BUILD" \ + -DUSE_OPENGL=OFF \ + -DDISABLE_ADVANCE_SIMD=ON \ + -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \ + -DUSE_SYSTEM_LIBS=OFF \ + -DUSE_SYSTEM_SDL2=ON \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_DISABLE_PRECOMPILE_HEADERS=ON \ + -B build . - name: Build PCSX2 working-directory: build - run: make -j$(getconf _NPROCESSORS_ONLN) # macOS doesn't use make install + run: | + ccache -p + ccache -s + ccache -z + make -j$(getconf _NPROCESSORS_ONLN) # macOS doesn't use make install + ccache -s + # Ensure there's no global constructors in multi-isa files + for dir in */CMakeFiles/GS-{avx,avx2}.dir; do + if find "$dir" -name "*.o" | xargs nm | grep _GLOBAL_; then + echo "::error::Multi-isa files must not have global constructors!" + exit 1 + fi + done - name: Run Tests working-directory: build diff --git a/.github/workflows/release_new_tag.yml b/.github/workflows/release_new_tag.yml index 55219b399d..18e0989d59 100644 --- a/.github/workflows/release_new_tag.yml +++ b/.github/workflows/release_new_tag.yml @@ -32,7 +32,7 @@ jobs: # Docs - https://github.com/mathieudutour/github-tag-action - name: Bump Version and Push Tag id: tag_version - uses: mathieudutour/github-tag-action@v6.0 + uses: mathieudutour/github-tag-action@v6.1 with: # Workflows cannot trigger other workflows implicitly # - https://github.community/t/github-actions-workflow-not-triggering-with-tag-push/17053/7 diff --git a/.github/workflows/release_pipeline.yml b/.github/workflows/release_pipeline.yml index 6ece4f6c59..bbbb844337 100644 --- a/.github/workflows/release_pipeline.yml +++ b/.github/workflows/release_pipeline.yml @@ -15,7 +15,7 @@ jobs: with: jobName: "wxWidgets" compiler: gcc - cmakeflags: "-DLTO_PCSX2_CORE=ON" + cmakeflags: "-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON" buildAppImage: true secrets: inherit diff --git a/.github/workflows/scripts/common/name-artifacts.sh b/.github/workflows/scripts/common/name-artifacts.sh index dd2e6618ff..c65460b2d8 100755 --- a/.github/workflows/scripts/common/name-artifacts.sh +++ b/.github/workflows/scripts/common/name-artifacts.sh @@ -21,7 +21,7 @@ NAME="" if [ "${OS}" == "macos" ]; then NAME="PCSX2-${OS}-${GUI_FRAMEWORK}" -elif [[ "${OS}" == "windows" || ("$OS" == "linux" && "$GUI_FRAMEWORK" == "QT") ]]; then +elif [[ ("${OS}" == "windows" && "$BUILD_SYSTEM" != "cmake") || ("$OS" == "linux" && "$GUI_FRAMEWORK" == "QT") ]]; then NAME="PCSX2-${OS}-${GUI_FRAMEWORK}-${ARCH}-${SIMD}" else NAME="PCSX2-${OS}-${GUI_FRAMEWORK}-${ARCH}" @@ -54,4 +54,4 @@ fi # Trim the Name NAME=$(printf "%.199s]" "$NAME") echo "${NAME}" -echo "##[set-output name=artifact-name;]${NAME}" +echo "artifact-name=${NAME}" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/scripts/lint/gamedb/lint.py b/.github/workflows/scripts/lint/gamedb/lint.py deleted file mode 100644 index aa6bd756ff..0000000000 --- a/.github/workflows/scripts/lint/gamedb/lint.py +++ /dev/null @@ -1,270 +0,0 @@ -import os -import yaml - -# Assumes this is ran from the root of the repository -file_path = os.environ['GAMEDB_PATH'] - -# These settings have to be manually kept in sync with the emulator code unfortunately. -# up to date validation should ALWAYS be provided via the application! -allowed_game_options = [ - "name", - "region", - "compat", - "roundModes", - "clampModes", - "gameFixes", - "gsHWFixes", - "speedHacks", - "memcardFilters", - "patches", -] -allowed_round_modes = ["eeRoundMode", "vuRoundMode"] -allowed_clamp_modes = ["eeClampMode", "vuClampMode"] -allowed_game_fixes = [ - "FpuMulHack", - "FpuNegDivHack", - "GoemonTlbHack", - "SoftwareRendererFMVHack", - "SkipMPEGHack", - "OPHFlagHack", - "EETimingHack", - "DMABusyHack", - "GIFFIFOHack", - "VIFFIFOHack", - "VIF1StallHack", - "VuAddSubHack", - "IbitHack", - "VUSyncHack", - "VUOverflowHack", - "XGKickHack", - "BlitInternalFPSHack", -] -allowed_gs_hw_fixes = [ - "autoFlush", - "conservativeFramebuffer", - "cpuFramebufferConversion", - "disableDepthSupport", - "wrapGSMem", - "preloadFrameData", - "disablePartialInvalidation", - "textureInsideRT", - "alignSprite", - "mergeSprite", - "wildArmsHack", - "pointListPalette", - "mipmap", - "trilinearFiltering", - "skipDrawStart", - "skipDrawEnd", - "halfBottomOverride", - "halfPixelOffset", - "roundSprite", - "texturePreloading", - "deinterlace", - "cpuSpriteRenderBW", -] -gs_hw_fix_ranges = { - "mipmap": (0, 2), - "trilinearFiltering": (0, 2), - "skipDrawStart": (0, 100000), - "skipDrawEnd": (0, 100000), - "halfPixelOffset": (0, 3), - "roundSprite": (0, 2), - "deinterlace": (0, 7), - "cpuSpriteRenderBW": (1, 10), -} -allowed_speed_hacks = ["mvuFlagSpeedHack", "InstantVU1SpeedHack", "MTVUSpeedHack"] -# Patches are allowed to have a 'default' key or a crc-32 key, followed by -allowed_patch_options = ["author", "content"] - -issue_list = [] - - -def is_hex_number(string): - try: - int(string, 16) - return True - except Exception: - return False - - -def validate_string_option(serial, key, value): - if not isinstance(value, str): - issue_list.append("[{}]: '{}' must be a string".format(serial, key)) - - -def validate_int_option(serial, key, value, low, high): - if not isinstance(value, int) or (value < low or value > high): - issue_list.append( - "[{}]: '{}' must be an int and between {}-{} (inclusive)".format( - serial, key, low, high - ) - ) - - -def validate_list_of_strings(serial, key, value): - if not isinstance(value, list) or not all(isinstance(item, str) for item in value): - issue_list.append("[{}]: '{}' must be a list of strings".format(serial, key)) - - -def validate_valid_options(serial, key, value, allowed_values): - if value not in allowed_values: - issue_list.append("[{}]: Invalid '{}' option [{}]".format(serial, key, value)) - - -def validate_clamp_round_modes(serial, key, value, allowed_values): - if not isinstance(value, dict): - issue_list.append("[{}]: '{}' must be a valid object".format(serial, key)) - return - for mode_key, mode_value in value.items(): - validate_valid_options(serial, key, mode_key, allowed_values) - validate_int_option(serial, key, mode_value, 0, 3) - - -def validate_game_fixes(serial, key, value): - if not isinstance(value, list): - issue_list.append( - "[{}]: 'gameFixes' must be a list of valid gameFixes".format(serial) - ) - return - for gamefix in value: - validate_valid_options(serial, key, gamefix, allowed_game_fixes) - - -def validate_gs_hw_fix_value(serial, key, value): - low, high = 0, 1 - if key in gs_hw_fix_ranges: - low, high = gs_hw_fix_ranges[key] - validate_int_option(serial, key, value, low, high) - - -def validate_gs_hw_fixes(serial, key, value): - if not isinstance(value, dict): - issue_list.append("[{}]: 'gsHWFixes' must be a valid object".format(serial)) - return - for fix, fix_value in value.items(): - validate_valid_options(serial, key, fix, allowed_gs_hw_fixes) - validate_gs_hw_fix_value(serial, fix, fix_value) - - # skipdraw range must have end >= start - skip_draw_start = value["skipDrawStart"] if "skipDrawStart" in value else 0 - skip_draw_end = value["skipDrawEnd"] if "skipDrawEnd" in value else 0 - if isinstance(skip_draw_start, int) and isinstance(skip_draw_end, int) and skip_draw_end < skip_draw_start: - issue_list.append("[{}]: skipDrawStart({}) must be greater or equal to skipDrawEnd({})".format( - serial, skip_draw_start, skip_draw_end)) - - -def validate_speed_hacks(serial, key, value): - if not isinstance(value, dict): - issue_list.append("[{}]: 'speedHacks' must be a valid object".format(serial)) - return - for speedhack, speedhack_value in value.items(): - validate_valid_options(serial, key, speedhack, allowed_speed_hacks) - validate_int_option(serial, speedhack, speedhack_value, 0, 1) - - -def validate_patches(serial, key, value): - if not isinstance(value, dict): - issue_list.append( - "[{}]: 'patches' must be valid mapping of CRC32 -> Patch Objects".format( - serial - ) - ) - return - for crc, patch in value.items(): - if crc != "default" and not is_hex_number(str(crc)): - issue_list.append( - "[{}]: Patches must either be key'd with 'default' or a valid CRC-32 Hex String".format( - serial - ) - ) - continue - for patch_option, option_value in patch.items(): - validate_valid_options(serial, key, patch_option, allowed_patch_options) - if patch_option == "author": - validate_string_option(serial, patch_option, option_value) - if patch_option == "content": - validate_string_option(serial, patch_option, option_value) - - -# pylint:disable=unnecessary-lambda -option_validation_handlers = { - "name": (lambda serial, key, value: validate_string_option(serial, key, value)), - "region": (lambda serial, key, value: validate_string_option(serial, key, value)), - "compat": ( - lambda serial, key, value: validate_int_option(serial, key, value, 0, 6) - ), - "roundModes": ( - lambda serial, key, value: validate_clamp_round_modes( - serial, key, value, allowed_round_modes - ) - ), - "clampModes": ( - lambda serial, key, value: validate_clamp_round_modes( - serial, key, value, allowed_clamp_modes - ) - ), - "gameFixes": (lambda serial, key, value: validate_game_fixes(serial, key, value)), - "gsHWFixes": (lambda serial, key, value: validate_gs_hw_fixes(serial, key, value)), - "speedHacks": (lambda serial, key, value: validate_speed_hacks(serial, key, value)), - "memcardFilters": ( - lambda serial, key, value: validate_list_of_strings(serial, key, value) - ), - "patches": (lambda serial, key, value: validate_patches(serial, key, value)), -} - -class UniqueKeyLoader(yaml.FullLoader): - def construct_mapping(self, node, deep=False): - mapping = set() - for key_node, _ in node.value: - key = self.construct_object(key_node, deep=deep) - if key in mapping: - raise ValueError(f"Duplicate {key!r} key found in YAML.") - mapping.add(key) - return super().construct_mapping(node, deep) - -print("Opening {}...".format(file_path)) -with open(file_path, encoding="utf-8") as f: - try: - print("Attempting to parse GameDB file...") - gamedb = yaml.load(f, Loader=UniqueKeyLoader) - except Exception as err: - print(err) - print( - "Unable to parse GameDB. Exiting, verify that the file indeed is valid YAML." - ) - exit(1) - - print("File loaded successfully, validating schema...") - progress_counter = 0 - for serial, game_options in gamedb.items(): - progress_counter = progress_counter + 1 - if progress_counter % 500 == 0 or progress_counter >= len(gamedb.items()): - print( - "[{}/{}] Processing GameDB Entries...".format( - progress_counter, len(gamedb.items()) - ) - ) - - # Check for required values - if not "name" in game_options.keys(): - issue_list.append("[{}]: 'name' is a required value".format(serial)) - if not "region" in game_options.keys(): - issue_list.append("[{}]: 'region' is a required value".format(serial)) - - # Check the options - for key, value in game_options.items(): - if key not in allowed_game_options: - issue_list.append("[{}]: Invalid option [{}]".format(serial, key)) - continue - - if key in option_validation_handlers: - option_validation_handlers[key](serial, key, value) - -if len(issue_list) > 0: - print("Issues found during validation:") - print(*issue_list, sep="\n") - exit(1) -else: - print("GameDB Validated Successfully!") - exit(0) diff --git a/.github/workflows/scripts/lint/gamedb/requirements.txt b/.github/workflows/scripts/lint/gamedb/requirements.txt deleted file mode 100644 index a9d757b4fa..0000000000 --- a/.github/workflows/scripts/lint/gamedb/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -PyYAML==5.4.1 \ No newline at end of file diff --git a/.github/workflows/scripts/linux/AppRun-qt b/.github/workflows/scripts/linux/AppRun-qt index 973b76be02..3b4d78de90 100755 --- a/.github/workflows/scripts/linux/AppRun-qt +++ b/.github/workflows/scripts/linux/AppRun-qt @@ -1,4 +1,4 @@ #!/bin/sh -cd "$(dirname "$0")" -exec ./usr/bin/pcsx2-qt "$@" +APPDIR=$(dirname "$0") +exec "$APPDIR/usr/bin/pcsx2-qt" "$@" diff --git a/.github/workflows/scripts/linux/app-variables.sh b/.github/workflows/scripts/linux/app-variables.sh index e48db82095..834b934b47 100644 --- a/.github/workflows/scripts/linux/app-variables.sh +++ b/.github/workflows/scripts/linux/app-variables.sh @@ -10,7 +10,7 @@ fi export BINARY_NAME=$(basename "$ARGV0") if [[ ! -e "$PWD/$BINARY_NAME.config" ]]; then mkdir "$PWD/$BINARY_NAME.config" -fi +fi export XDG_CONFIG_HOME="$PWD/$BINARY_NAME.config" mkdir -p "$HOME"/.local/share/icons/hicolor/scalable/apps && cp "$APPDIR"/PCSX2.png "$HOME"/.local/share/icons/hicolor/scalable/apps diff --git a/.github/workflows/scripts/linux/appimage-qt.sh b/.github/workflows/scripts/linux/appimage-qt.sh index 72a471fa1f..691cfdd4c4 100755 --- a/.github/workflows/scripts/linux/appimage-qt.sh +++ b/.github/workflows/scripts/linux/appimage-qt.sh @@ -90,6 +90,7 @@ declare -a SYSLIBS=( "libxkbcommon.so.0" "libxkbcommon-x11.so.0" "pulseaudio/libpulsecommon-13.99.so" + "libasound.so.2" "libfreetype.so.6" "libpcre2-16.so.0" "libexpat.so.1" @@ -118,6 +119,42 @@ declare -a SYSLIBS=( "libpng16.so.16" "libudev.so.1" "libuuid.so.1" + "libcurl.so.4" + "libnghttp2.so.14" + "libidn2.so.0" + "librtmp.so.1" + "libssh.so.4" + "libpsl.so.5" + "libssl.so.1.1" + "libnettle.so.7" + "libgnutls.so.30" + "libgssapi_krb5.so.2" + "libldap_r-2.4.so.2" + "liblber-2.4.so.2" + "libbrotlidec.so.1" + "libunistring.so.2" + "libhogweed.so.5" + "libgmp.so.10" + "libp11-kit.so.0" + "libtasn1.so.6" + "libkrb5.so.3" + "libk5crypto.so.3" + "libcom_err.so.2" + "libkrb5support.so.0" + "libsasl2.so.2" + "libgssapi.so.3" + "libbrotlicommon.so.1" + "libkeyutils.so.1" + "libheimntlm.so.0" + "libkrb5.so.26" + "libasn1.so.8" + "libhcrypto.so.4" + "libroken.so.18" + "libwind.so.0" + "libheimbase.so.1" + "libhx509.so.5" + "libsqlite3.so.0" + "libcrypt.so.1" ) declare -a DEPLIBS=( @@ -143,6 +180,7 @@ declare -a QTPLUGINS=( "plugins/imageformats" "plugins/platforms" #"plugins/platformthemes" # Enable this if we want to ship GTK+ themes at any point. + "plugins/tls" "plugins/wayland-decoration-client" "plugins/wayland-graphics-integration-client" "plugins/wayland-graphics-integration-server" @@ -165,7 +203,7 @@ mkdir "$OUTDIR" mkdir -p "$OUTDIR/usr/bin" "$OUTDIR/usr/lib" "$OUTDIR/usr/lib/pulseaudio" echo "Copying binary and resources..." -cp -a "$BINDIR/$BINARY" "$BINDIR/resources" "$BINDIR/shaders" "$OUTDIR/usr/bin" +cp -a "$BINDIR/$BINARY" "$BINDIR/resources" "$OUTDIR/usr/bin" # Don't need old wx locales. rm -fr "$OUTDIR/usr/bin/resources/locale" diff --git a/.github/workflows/scripts/linux/appimage.sh b/.github/workflows/scripts/linux/appimage.sh index 8dfc4d9a9a..39ab913c59 100755 --- a/.github/workflows/scripts/linux/appimage.sh +++ b/.github/workflows/scripts/linux/appimage.sh @@ -23,7 +23,7 @@ sudo cp /usr/local/bin/patchelf /tmp/squashfs-root/usr/bin/patchelf cd "$GITHUB_WORKSPACE" ninja -C build install cp ./pcsx2/gui/Resources/AppIcon64.png ./squashfs-root/PCSX2.png -cp ./linux_various/PCSX2.desktop.in ./squashfs-root/PCSX2.desktop +cp ./linux_various/PCSX2.desktop.in ./squashfs-root/PCSX2.desktop sed -i -e 's|Categories=@PCSX2_MENU_CATEGORIES@|Categories=Game;Emulator;|g' ./squashfs-root/PCSX2.desktop sed -i -e 's|__GL_THREADED_OPTIMIZATIONS=1|__GL_THREADED_OPTIMIZATIONS=0|g' ./squashfs-root/PCSX2.desktop curl -sSfL "https://github.com/AppImage/AppImageKit/releases/download/continuous/runtime-$APPARCH" -o ./squashfs-root/runtime diff --git a/.github/workflows/scripts/linux/build-dependencies-qt.sh b/.github/workflows/scripts/linux/build-dependencies-qt.sh index 55a35cc64f..2b5b12743a 100755 --- a/.github/workflows/scripts/linux/build-dependencies-qt.sh +++ b/.github/workflows/scripts/linux/build-dependencies-qt.sh @@ -4,19 +4,19 @@ set -e INSTALLDIR="$HOME/deps" NPROCS="$(getconf _NPROCESSORS_ONLN)" -SDL=SDL2-2.0.22 -QT=6.3.0 +SDL=SDL2-2.26.0 +QT=6.3.1 mkdir -p deps-build cd deps-build cat > SHASUMS < SHASUMS <> %GITHUB_OUTPUT% + cmake . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DDISABLE_ADVANCE_SIMD=ON -G Ninja - name: Build PCSX2 shell: cmd run: | if "${{ inputs.configuration }}"=="CMake" ( - call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\${{ steps.cmake.outputs.vcvars }}" - cmake --build build --config ${{ steps.cmake.outputs.buildtype }} + call "%ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\${{ steps.cmake.outputs.vcvars }}" + cmake --build build --config Release || exit /b cp build/pcsx2/pcsx2* bin/ ) else ( msbuild "PCSX2_suite.sln" /m /v:m /p:Configuration="${{ inputs.configuration }}" /p:Platform="${{ inputs.platform }}" @@ -98,8 +95,8 @@ jobs: if: inputs.configuration == 'CMake' shell: cmd run: | - call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\${{ steps.cmake.outputs.vcvars }}" - cmake --build build --config ${{ steps.cmake.outputs.buildtype }} --target unittests + call "%ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\${{ steps.cmake.outputs.vcvars }}" + cmake --build build --config Release --target unittests - name: Upload artifact uses: actions/upload-artifact@v3 @@ -116,7 +113,6 @@ jobs: !./bin/**/*.lib - name: Upload artifact - with symbols - if: inputs.configuration != 'CMake' uses: actions/upload-artifact@v3 with: name: ${{ steps.artifact-metadata.outputs.artifact-name }}-symbols diff --git a/.gitignore b/.gitignore index 9cb112d236..b3091f88ff 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ Debug.txt install_log.txt padLog.txt GS_opengl_debug.txt +bad_shader_* Debug Release diff --git a/.gitmodules b/.gitmodules index f85b7b95d7..caf9c8738a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,16 +14,10 @@ path = 3rdparty/wil url = https://github.com/microsoft/wil.git branch = master -[submodule "3rdparty/cubeb/cubeb"] - path = 3rdparty/cubeb/cubeb - url = https://github.com/mozilla/cubeb.git [submodule "3rdparty/rapidyaml/rapidyaml"] path = 3rdparty/rapidyaml/rapidyaml url = https://github.com/biojppm/rapidyaml.git branch = master -[submodule "3rdparty/imgui/imgui"] - path = 3rdparty/imgui/imgui - url = https://github.com/ocornut/imgui.git [submodule "3rdparty/glslang/glslang"] path = 3rdparty/glslang/glslang url = https://github.com/KhronosGroup/glslang.git @@ -38,4 +32,7 @@ url = https://github.com/nih-at/libzip.git [submodule "3rdparty/zstd/zstd"] path = 3rdparty/zstd/zstd - url = https://github.com/facebook/zstd.git \ No newline at end of file + url = https://github.com/facebook/zstd.git +[submodule "3rdparty/rcheevos/rcheevos"] + path = 3rdparty/rcheevos/rcheevos + url = https://github.com/RetroAchievements/rcheevos.git diff --git a/3rdparty/cubeb/AUTHORS b/3rdparty/cubeb/AUTHORS new file mode 100644 index 0000000000..f0f9595227 --- /dev/null +++ b/3rdparty/cubeb/AUTHORS @@ -0,0 +1,16 @@ +Matthew Gregan +Alexandre Ratchov +Michael Wu +Paul Adenot +David Richards +Sebastien Alaiwan +KO Myung-Hun +Haakon Sporsheim +Alex Chronopoulos +Jan Beich +Vito Caputo +Landry Breuil +Jacek Caban +Paul Hancock +Ted Mielczarek +Chun-Min Chang diff --git a/3rdparty/cubeb/CMakeLists.txt b/3rdparty/cubeb/CMakeLists.txt index cf767642a5..447ef7f9eb 100644 --- a/3rdparty/cubeb/CMakeLists.txt +++ b/3rdparty/cubeb/CMakeLists.txt @@ -1,10 +1,301 @@ -# Disable building the stuff we don't need. -set(BUILD_SHARED_LIBS OFF) -set(BUILD_TESTS OFF) -set(BUILD_RUST_LIBS OFF) -set(BUILD_TOOLS OFF) -set(BUNDLE_SPEEX ON) -set(USE_SANITIZERS OFF) -set(LAZY_LOAD_LIBS ON) +# TODO +# - backend selection via command line, rather than simply detecting headers. + +cmake_minimum_required(VERSION 3.14 FATAL_ERROR) +project(cubeb + VERSION 0.0.0) + +option(BUILD_RUST_LIBS "Build rust backends" OFF) +option(LAZY_LOAD_LIBS "Lazily load shared libraries" ON) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) +endif() + +set(CMAKE_C_STANDARD 99) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +if (BUILD_RUST_LIBS) + if(EXISTS "${PROJECT_SOURCE_DIR}/src/cubeb-pulse-rs") + set(USE_PULSE_RUST 1) + endif() + if(EXISTS "${PROJECT_SOURCE_DIR}/src/cubeb-coreaudio-rs") + set(USE_AUDIOUNIT_RUST 1) + endif() +endif() + +set(CMAKE_CXX_WARNING_LEVEL 4) +if(NOT MSVC) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wno-unused-parameter") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-parameter -fno-exceptions -fno-rtti") +else() + string(REPLACE "/GR" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # Disable RTTI + string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # Disable Exceptions +endif() + +add_library(cubeb + src/cubeb.c + src/cubeb_mixer.cpp + src/cubeb_resampler.cpp + src/cubeb_log.cpp + src/cubeb_strings.c + src/cubeb_utils.cpp +) +target_include_directories(cubeb + PUBLIC $ $ +) +set_target_properties(cubeb PROPERTIES + VERSION ${cubeb_VERSION} + SOVERSION ${cubeb_VERSION_MAJOR} +) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + COMPATIBILITY SameMajorVersion +) + +configure_package_config_file( + "Config.cmake.in" + "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" +) + +install( + FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" +) + +install(TARGETS cubeb EXPORT "${PROJECT_NAME}Targets") +install( + EXPORT "${PROJECT_NAME}Targets" + NAMESPACE "${PROJECT_NAME}::" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" +) + +add_library(speex OBJECT subprojects/speex/resample.c) +set_target_properties(speex PROPERTIES POSITION_INDEPENDENT_CODE TRUE) +target_include_directories(speex INTERFACE subprojects) +target_compile_definitions(speex PUBLIC +OUTSIDE_SPEEX +FLOATING_POINT +EXPORT= +RANDOM_PREFIX=speex +) + +# $ required because of https://gitlab.kitware.com/cmake/cmake/-/issues/15415 +target_link_libraries(cubeb PRIVATE $) + +include(CheckIncludeFiles) + +# Threads needed by cubeb_log, _pulse, _alsa, _jack, _sndio, _oss and _sun +set(THREADS_PREFER_PTHREAD_FLAG ON) +find_package(Threads) +target_link_libraries(cubeb PRIVATE Threads::Threads) + +if(LAZY_LOAD_LIBS) + check_include_files(pulse/pulseaudio.h USE_PULSE) + check_include_files(alsa/asoundlib.h USE_ALSA) + check_include_files(jack/jack.h USE_JACK) + check_include_files(sndio.h USE_SNDIO) + check_include_files(aaudio/AAudio.h USE_AAUDIO) + + if(USE_PULSE OR USE_ALSA OR USE_JACK OR USE_SNDIO OR USE_AAUDIO) + target_link_libraries(cubeb PRIVATE ${CMAKE_DL_LIBS}) + endif() + +else() + + find_package(PkgConfig REQUIRED) + + pkg_check_modules(libpulse IMPORTED_TARGET libpulse) + if(libpulse_FOUND) + set(USE_PULSE ON) + target_compile_definitions(cubeb PRIVATE DISABLE_LIBPULSE_DLOPEN) + target_link_libraries(cubeb PRIVATE PkgConfig::libpulse) + endif() + + pkg_check_modules(alsa IMPORTED_TARGET alsa) + if(alsa_FOUND) + set(USE_ALSA ON) + target_compile_definitions(cubeb PRIVATE DISABLE_LIBASOUND_DLOPEN) + target_link_libraries(cubeb PRIVATE PkgConfig::alsa) + endif() + + pkg_check_modules(jack IMPORTED_TARGET jack) + if(jack_FOUND) + set(USE_JACK ON) + target_compile_definitions(cubeb PRIVATE DISABLE_LIBJACK_DLOPEN) + target_link_libraries(cubeb PRIVATE PkgConfig::jack) + endif() + + check_include_files(sndio.h USE_SNDIO) + if(USE_SNDIO) + target_compile_definitions(cubeb PRIVATE DISABLE_LIBSNDIO_DLOPEN) + target_link_libraries(cubeb PRIVATE sndio) + endif() + + check_include_files(aaudio/AAudio.h USE_AAUDIO) + if(USE_AAUDIO) + target_compile_definitions(cubeb PRIVATE DISABLE_LIBAAUDIO_DLOPEN) + target_link_libraries(cubeb PRIVATE aaudio) + endif() +endif() + +if(USE_PULSE) + target_sources(cubeb PRIVATE src/cubeb_pulse.c) + target_compile_definitions(cubeb PRIVATE USE_PULSE) +endif() + +if(USE_ALSA) + target_sources(cubeb PRIVATE src/cubeb_alsa.c) + target_compile_definitions(cubeb PRIVATE USE_ALSA) +endif() + +if(USE_JACK) + target_sources(cubeb PRIVATE src/cubeb_jack.cpp) + target_compile_definitions(cubeb PRIVATE USE_JACK) +endif() + +if(USE_SNDIO) + target_sources(cubeb PRIVATE src/cubeb_sndio.c) + target_compile_definitions(cubeb PRIVATE USE_SNDIO) +endif() + +if(USE_AAUDIO) + target_sources(cubeb PRIVATE src/cubeb_aaudio.cpp) + target_compile_definitions(cubeb PRIVATE USE_AAUDIO) + + # set this definition to enable low latency mode. Possibly bad for battery + target_compile_definitions(cubeb PRIVATE CUBEB_AAUDIO_LOW_LATENCY) + + # set this definition to enable power saving mode. Possibly resulting + # in high latency + # target_compile_definitions(cubeb PRIVATE CUBEB_AAUDIO_LOW_POWER_SAVING) + + # set this mode to make the backend use an exclusive stream. + # will decrease latency. + # target_compile_definitions(cubeb PRIVATE CUBEB_AAUDIO_EXCLUSIVE_STREAM) +endif() + +check_include_files(AudioUnit/AudioUnit.h USE_AUDIOUNIT) +if(USE_AUDIOUNIT) + target_sources(cubeb PRIVATE + src/cubeb_audiounit.cpp + src/cubeb_osx_run_loop.cpp) + target_compile_definitions(cubeb PRIVATE USE_AUDIOUNIT) + target_link_libraries(cubeb PRIVATE "-framework AudioUnit" "-framework CoreAudio" "-framework CoreServices") +endif() + +check_include_files(audioclient.h USE_WASAPI) +if(USE_WASAPI) + target_sources(cubeb PRIVATE + src/cubeb_wasapi.cpp) + target_compile_definitions(cubeb PRIVATE USE_WASAPI) + target_link_libraries(cubeb PRIVATE avrt ole32 ksuser) +endif() + +check_include_files("windows.h;mmsystem.h" USE_WINMM) +if(USE_WINMM) + target_sources(cubeb PRIVATE + src/cubeb_winmm.c) + target_compile_definitions(cubeb PRIVATE USE_WINMM) + target_link_libraries(cubeb PRIVATE winmm) +endif() + +check_include_files(SLES/OpenSLES.h USE_OPENSL) +if(USE_OPENSL) + target_sources(cubeb PRIVATE + src/cubeb_opensl.c + src/cubeb-jni.cpp) + target_compile_definitions(cubeb PRIVATE USE_OPENSL) + target_link_libraries(cubeb PRIVATE OpenSLES) +endif() + +check_include_files(sys/soundcard.h HAVE_SYS_SOUNDCARD_H) +if(HAVE_SYS_SOUNDCARD_H) + try_compile(USE_OSS "${PROJECT_BINARY_DIR}/compile_tests" + ${PROJECT_SOURCE_DIR}/cmake/compile_tests/oss_is_v4.c) + if(USE_OSS) + # strlcpy is not available on BSD systems that use glibc, + # like Debian kfreebsd, so try using libbsd if available + include(CheckSymbolExists) + check_symbol_exists(strlcpy string.h HAVE_STRLCPY) + if(NOT HAVE_STRLCPY) + pkg_check_modules(libbsd-overlay IMPORTED_TARGET libbsd-overlay) + if(libbsd-overlay_FOUND) + target_link_libraries(cubeb PRIVATE PkgConfig::libbsd-overlay) + set(HAVE_STRLCPY true) + endif() + endif() + if (HAVE_STRLCPY) + target_sources(cubeb PRIVATE + src/cubeb_oss.c) + target_compile_definitions(cubeb PRIVATE USE_OSS) + endif() + endif() +endif() + +check_include_files(android/log.h USE_AUDIOTRACK) +if(USE_AUDIOTRACK) + target_sources(cubeb PRIVATE + src/cubeb_audiotrack.c) + target_compile_definitions(cubeb PRIVATE USE_AUDIOTRACK) + target_link_libraries(cubeb PRIVATE log) +endif() + +check_include_files(sys/audioio.h USE_SUN) +if(USE_SUN) + target_sources(cubeb PRIVATE + src/cubeb_sun.c) + target_compile_definitions(cubeb PRIVATE USE_SUN) +endif() + +check_include_files(kai.h USE_KAI) +if(USE_KAI) + target_sources(cubeb PRIVATE + src/cubeb_kai.c) + target_compile_definitions(cubeb PRIVATE USE_KAI) + target_link_libraries(cubeb PRIVATE kai) +endif() + +if(USE_PULSE AND USE_PULSE_RUST) + include(ExternalProject) + set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/rust) + ExternalProject_Add( + cubeb_pulse_rs + DOWNLOAD_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND cargo build COMMAND cargo build --release + BUILD_ALWAYS ON + BINARY_DIR "${PROJECT_SOURCE_DIR}/src/cubeb-pulse-rs" + INSTALL_COMMAND "" + LOG_BUILD ON) + add_dependencies(cubeb cubeb_pulse_rs) + target_compile_definitions(cubeb PRIVATE USE_PULSE_RUST) + target_link_libraries(cubeb PRIVATE + debug "${PROJECT_SOURCE_DIR}/src/cubeb-pulse-rs/target/debug/libcubeb_pulse.a" + optimized "${PROJECT_SOURCE_DIR}/src/cubeb-pulse-rs/target/release/libcubeb_pulse.a" pulse) +endif() + +if(USE_AUDIOUNIT AND USE_AUDIOUNIT_RUST) + include(ExternalProject) + set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/rust) + ExternalProject_Add( + cubeb_coreaudio_rs + DOWNLOAD_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND cargo build COMMAND cargo build --release + BUILD_ALWAYS ON + BINARY_DIR "${PROJECT_SOURCE_DIR}/src/cubeb-coreaudio-rs" + INSTALL_COMMAND "" + LOG_BUILD ON) + add_dependencies(cubeb cubeb_coreaudio_rs) + target_compile_definitions(cubeb PRIVATE USE_AUDIOUNIT_RUST) + target_link_libraries(cubeb PRIVATE + debug "${PROJECT_SOURCE_DIR}/src/cubeb-coreaudio-rs/target/debug/libcubeb_coreaudio.a" + optimized "${PROJECT_SOURCE_DIR}/src/cubeb-coreaudio-rs/target/release/libcubeb_coreaudio.a") +endif() -add_subdirectory(cubeb) diff --git a/3rdparty/cubeb/Config.cmake.in b/3rdparty/cubeb/Config.cmake.in new file mode 100644 index 0000000000..be464aa492 --- /dev/null +++ b/3rdparty/cubeb/Config.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/cubebTargets.cmake") +check_required_components(cubeb) diff --git a/3rdparty/cubeb/INSTALL.md b/3rdparty/cubeb/INSTALL.md new file mode 100644 index 0000000000..4f83a65200 --- /dev/null +++ b/3rdparty/cubeb/INSTALL.md @@ -0,0 +1,45 @@ +# Build instructions for libcubeb + +You must have CMake v3.14 or later installed. + +1. `git clone --recursive https://github.com/mozilla/cubeb.git` +2. `cd cubeb` +3. `cmake -B ./build .` +4. `cmake --build ./build` +5. `cd build && ctest` + +# Windows build notes + +Windows builds can use Microsoft Visual Studio 2015, Microsoft Visual Studio +2017, or MinGW-w64 with Win32 threads (by passing `cmake -G` to generate the +appropriate build configuration). + +## Microsoft Visual Studio 2015 or 2017 Command Line + +CMake can be used from the command line by following the build steps at the top +of this file. CMake will select a default generator based on the environment, +or one can be specified with the `-G` argument. + +## Microsoft Visual Studio 2017 IDE + +Visual Studio 2017 adds in built support for CMake. CMake can be used from +within the IDE via the following steps: + +- Navigate to `File -> Open -> Cmake...` +- Open `CMakeLists.txt` file in the root of the project. + +Note, to generate the build in the cubeb dir CMake settings need to be updated +via: `CMake -> Change CMake Settings -> CMakeLists.txt`. The default +configuration used by Visual Studio will place the build in a different location +than the steps detailed at the top of this file. + +## MinGW-w64 + +To build with MinGW-w64, install the following items: + +- Download and install MinGW-w64 with Win32 threads. +- Download and install CMake. +- Run MinGW-w64 Terminal from the Start Menu. +- Follow the build steps at the top of this file, but at step 4 run: + `cmake -G "MinGW Makefiles" ../cubeb` +- Continue the build steps at the top of this file. diff --git a/3rdparty/cubeb/LICENSE b/3rdparty/cubeb/LICENSE new file mode 100644 index 0000000000..fffc9dc405 --- /dev/null +++ b/3rdparty/cubeb/LICENSE @@ -0,0 +1,13 @@ +Copyright © 2011 Mozilla Foundation + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/3rdparty/cubeb/README.md b/3rdparty/cubeb/README.md new file mode 100644 index 0000000000..e4e1658824 --- /dev/null +++ b/3rdparty/cubeb/README.md @@ -0,0 +1,7 @@ +[![Build Status](https://github.com/mozilla/cubeb/actions/workflows/build.yml/badge.svg)](https://github.com/mozilla/cubeb/actions/workflows/build.yml) + +See INSTALL.md for build instructions. + +See [Backend Support](https://github.com/mozilla/cubeb/wiki/Backend-Support) in the wiki for the support level of each backend. + +Licensed under an ISC-style license. See LICENSE for details. diff --git a/3rdparty/cubeb/cmake/compile_tests/oss_is_v4.c b/3rdparty/cubeb/cmake/compile_tests/oss_is_v4.c new file mode 100644 index 0000000000..a46bb1554d --- /dev/null +++ b/3rdparty/cubeb/cmake/compile_tests/oss_is_v4.c @@ -0,0 +1,10 @@ +#include + +#if SOUND_VERSION < 0x040000 +# error "OSSv4 is not available in sys/soundcard.h" +#endif + +int main() +{ + return 0; +} diff --git a/3rdparty/cubeb/cmake/toolchain-cross-mingw.cmake b/3rdparty/cubeb/cmake/toolchain-cross-mingw.cmake new file mode 100644 index 0000000000..6d29fe2405 --- /dev/null +++ b/3rdparty/cubeb/cmake/toolchain-cross-mingw.cmake @@ -0,0 +1,14 @@ +SET(CMAKE_SYSTEM_NAME Windows) + +set(COMPILER_PREFIX "i686-w64-mingw32") + +find_program(CMAKE_RC_COMPILER NAMES ${COMPILER_PREFIX}-windres) +find_program(CMAKE_C_COMPILER NAMES ${COMPILER_PREFIX}-gcc-posix) +find_program(CMAKE_CXX_COMPILER NAMES ${COMPILER_PREFIX}-g++-posix) + +SET(CMAKE_FIND_ROOT_PATH /usr/${COMPILER_PREFIX}) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + diff --git a/3rdparty/cubeb/cubeb b/3rdparty/cubeb/cubeb deleted file mode 160000 index 773f16b7ea..0000000000 --- a/3rdparty/cubeb/cubeb +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 773f16b7ea308392c05be3e290163d1f636e6024 diff --git a/3rdparty/cubeb/cubeb.supp b/3rdparty/cubeb/cubeb.supp new file mode 100644 index 0000000000..0012ea51e6 --- /dev/null +++ b/3rdparty/cubeb/cubeb.supp @@ -0,0 +1,36 @@ +{ + snd_config_update-malloc + Memcheck:Leak + fun:malloc + ... + fun:snd_config_update_r +} +{ + snd1_dlobj_cache_get-malloc + Memcheck:Leak + fun:malloc + ... + fun:snd1_dlobj_cache_get +} +{ + parse_defs-malloc + Memcheck:Leak + fun:malloc + ... + fun:parse_defs +} +{ + parse_defs-calloc + Memcheck:Leak + fun:calloc + ... + fun:parse_defs +} +{ + pa_client_conf_from_x11-malloc + Memcheck:Leak + fun:malloc + ... + fun:pa_client_conf_from_x11 +} + diff --git a/3rdparty/cubeb/cubeb.vcxproj b/3rdparty/cubeb/cubeb.vcxproj index 133ef74a2b..cf8b1a20b1 100644 --- a/3rdparty/cubeb/cubeb.vcxproj +++ b/3rdparty/cubeb/cubeb.vcxproj @@ -33,44 +33,44 @@ TurnOffAllWarnings USE_WASAPI;USE_WINMM;OUTSIDE_SPEEX;FLOATING_POINT;RANDOM_PREFIX=speex;EXPORT=;%(PreprocessorDefinitions) - $(ProjectDir)include;$(ProjectDir)cubeb\include;$(ProjectDir)cubeb\src;$(ProjectDir)cubeb\subprojects;%(AdditionalIncludeDirectories) + $(ProjectDir)include;$(ProjectDir)src;$(ProjectDir)subprojects;%(AdditionalIncludeDirectories) stdcpp14 - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + diff --git a/3rdparty/cubeb/cubeb.vcxproj.filters b/3rdparty/cubeb/cubeb.vcxproj.filters index 50a7761d75..5920cfb6b1 100644 --- a/3rdparty/cubeb/cubeb.vcxproj.filters +++ b/3rdparty/cubeb/cubeb.vcxproj.filters @@ -1,41 +1,41 @@  - - - - - - - - - - - - - - + + + + + + + + + + + + + + speex - + speex - + speex - + speex - + speex - + speex - + speex - + @@ -44,15 +44,15 @@ - - - - - - - - - + + + + + + + + + speex diff --git a/3rdparty/cubeb/cubeb.vcxproj.user b/3rdparty/cubeb/cubeb.vcxproj.user new file mode 100644 index 0000000000..88a550947e --- /dev/null +++ b/3rdparty/cubeb/cubeb.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/3rdparty/cubeb/include/cubeb/cubeb.h b/3rdparty/cubeb/include/cubeb/cubeb.h new file mode 100644 index 0000000000..300e4b3188 --- /dev/null +++ b/3rdparty/cubeb/include/cubeb/cubeb.h @@ -0,0 +1,730 @@ +/* + * Copyright © 2011 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#if !defined(CUBEB_c2f983e9_c96f_e71c_72c3_bbf62992a382) +#define CUBEB_c2f983e9_c96f_e71c_72c3_bbf62992a382 + +#include "cubeb_export.h" +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/** @mainpage + + @section intro Introduction + + This is the documentation for the libcubeb C API. + libcubeb is a callback-based audio API library allowing the + authoring of portable multiplatform audio playback and recording. + + @section example Example code + + This example shows how to create a duplex stream that pipes the microphone + to the speakers, with minimal latency and the proper sample-rate for the + platform. + + @code + cubeb * app_ctx; + cubeb_init(&app_ctx, "Example Application", NULL); + int rv; + uint32_t rate; + uint32_t latency_frames; + uint64_t ts; + + rv = cubeb_get_preferred_sample_rate(app_ctx, &rate); + if (rv != CUBEB_OK) { + fprintf(stderr, "Could not get preferred sample-rate"); + return rv; + } + + cubeb_stream_params output_params; + output_params.format = CUBEB_SAMPLE_FLOAT32NE; + output_params.rate = rate; + output_params.channels = 2; + output_params.layout = CUBEB_LAYOUT_UNDEFINED; + output_params.prefs = CUBEB_STREAM_PREF_NONE; + + rv = cubeb_get_min_latency(app_ctx, &output_params, &latency_frames); + if (rv != CUBEB_OK) { + fprintf(stderr, "Could not get minimum latency"); + return rv; + } + + cubeb_stream_params input_params; + input_params.format = CUBEB_SAMPLE_FLOAT32NE; + input_params.rate = rate; + input_params.channels = 1; + input_params.layout = CUBEB_LAYOUT_UNDEFINED; + input_params.prefs = CUBEB_STREAM_PREF_NONE; + + cubeb_stream * stm; + rv = cubeb_stream_init(app_ctx, &stm, "Example Stream 1", + NULL, &input_params, + NULL, &output_params, + latency_frames, + data_cb, state_cb, + NULL); + if (rv != CUBEB_OK) { + fprintf(stderr, "Could not open the stream"); + return rv; + } + + rv = cubeb_stream_start(stm); + if (rv != CUBEB_OK) { + fprintf(stderr, "Could not start the stream"); + return rv; + } + for (;;) { + cubeb_stream_get_position(stm, &ts); + printf("time=%llu\n", ts); + sleep(1); + } + rv = cubeb_stream_stop(stm); + if (rv != CUBEB_OK) { + fprintf(stderr, "Could not stop the stream"); + return rv; + } + + cubeb_stream_destroy(stm); + cubeb_destroy(app_ctx); + @endcode + + @code + long data_cb(cubeb_stream * stm, void * user, + const void * input_buffer, void * output_buffer, long nframes) + { + const float * in = input_buffer; + float * out = output_buffer; + + for (int i = 0; i < nframes; ++i) { + for (int c = 0; c < 2; ++c) { + out[2 * i + c] = in[i]; + } + } + return nframes; + } + @endcode + + @code + void state_cb(cubeb_stream * stm, void * user, cubeb_state state) + { + printf("state=%d\n", state); + } + @endcode +*/ + +/** @file + The libcubeb C API. */ + +typedef struct cubeb + cubeb; /**< Opaque handle referencing the application state. */ +typedef struct cubeb_stream + cubeb_stream; /**< Opaque handle referencing the stream state. */ + +/** Sample format enumeration. */ +typedef enum { + /**< Little endian 16-bit signed PCM. */ + CUBEB_SAMPLE_S16LE, + /**< Big endian 16-bit signed PCM. */ + CUBEB_SAMPLE_S16BE, + /**< Little endian 32-bit IEEE floating point PCM. */ + CUBEB_SAMPLE_FLOAT32LE, + /**< Big endian 32-bit IEEE floating point PCM. */ + CUBEB_SAMPLE_FLOAT32BE, +#if defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) + /**< Native endian 16-bit signed PCM. */ + CUBEB_SAMPLE_S16NE = CUBEB_SAMPLE_S16BE, + /**< Native endian 32-bit IEEE floating point PCM. */ + CUBEB_SAMPLE_FLOAT32NE = CUBEB_SAMPLE_FLOAT32BE +#else + /**< Native endian 16-bit signed PCM. */ + CUBEB_SAMPLE_S16NE = CUBEB_SAMPLE_S16LE, + /**< Native endian 32-bit IEEE floating point PCM. */ + CUBEB_SAMPLE_FLOAT32NE = CUBEB_SAMPLE_FLOAT32LE +#endif +} cubeb_sample_format; + +/** An opaque handle used to refer a particular input or output device + * across calls. */ +typedef void const * cubeb_devid; + +/** Level (verbosity) of logging for a particular cubeb context. */ +typedef enum { + CUBEB_LOG_DISABLED = 0, /** < Logging disabled */ + CUBEB_LOG_NORMAL = + 1, /**< Logging lifetime operation (creation/destruction). */ + CUBEB_LOG_VERBOSE = 2, /**< Verbose logging of callbacks, can have performance + implications. */ +} cubeb_log_level; + +typedef enum { + CHANNEL_UNKNOWN = 0, + CHANNEL_FRONT_LEFT = 1 << 0, + CHANNEL_FRONT_RIGHT = 1 << 1, + CHANNEL_FRONT_CENTER = 1 << 2, + CHANNEL_LOW_FREQUENCY = 1 << 3, + CHANNEL_BACK_LEFT = 1 << 4, + CHANNEL_BACK_RIGHT = 1 << 5, + CHANNEL_FRONT_LEFT_OF_CENTER = 1 << 6, + CHANNEL_FRONT_RIGHT_OF_CENTER = 1 << 7, + CHANNEL_BACK_CENTER = 1 << 8, + CHANNEL_SIDE_LEFT = 1 << 9, + CHANNEL_SIDE_RIGHT = 1 << 10, + CHANNEL_TOP_CENTER = 1 << 11, + CHANNEL_TOP_FRONT_LEFT = 1 << 12, + CHANNEL_TOP_FRONT_CENTER = 1 << 13, + CHANNEL_TOP_FRONT_RIGHT = 1 << 14, + CHANNEL_TOP_BACK_LEFT = 1 << 15, + CHANNEL_TOP_BACK_CENTER = 1 << 16, + CHANNEL_TOP_BACK_RIGHT = 1 << 17 +} cubeb_channel; + +typedef uint32_t cubeb_channel_layout; +// Some common layout definitions. +enum { + CUBEB_LAYOUT_UNDEFINED = 0, // Indicate the speaker's layout is undefined. + CUBEB_LAYOUT_MONO = CHANNEL_FRONT_CENTER, + CUBEB_LAYOUT_MONO_LFE = CUBEB_LAYOUT_MONO | CHANNEL_LOW_FREQUENCY, + CUBEB_LAYOUT_STEREO = CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT, + CUBEB_LAYOUT_STEREO_LFE = CUBEB_LAYOUT_STEREO | CHANNEL_LOW_FREQUENCY, + CUBEB_LAYOUT_3F = + CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT | CHANNEL_FRONT_CENTER, + CUBEB_LAYOUT_3F_LFE = CUBEB_LAYOUT_3F | CHANNEL_LOW_FREQUENCY, + CUBEB_LAYOUT_2F1 = + CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT | CHANNEL_BACK_CENTER, + CUBEB_LAYOUT_2F1_LFE = CUBEB_LAYOUT_2F1 | CHANNEL_LOW_FREQUENCY, + CUBEB_LAYOUT_3F1 = CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT | + CHANNEL_FRONT_CENTER | CHANNEL_BACK_CENTER, + CUBEB_LAYOUT_3F1_LFE = CUBEB_LAYOUT_3F1 | CHANNEL_LOW_FREQUENCY, + CUBEB_LAYOUT_2F2 = CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT | + CHANNEL_SIDE_LEFT | CHANNEL_SIDE_RIGHT, + CUBEB_LAYOUT_2F2_LFE = CUBEB_LAYOUT_2F2 | CHANNEL_LOW_FREQUENCY, + CUBEB_LAYOUT_QUAD = CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT | + CHANNEL_BACK_LEFT | CHANNEL_BACK_RIGHT, + CUBEB_LAYOUT_QUAD_LFE = CUBEB_LAYOUT_QUAD | CHANNEL_LOW_FREQUENCY, + CUBEB_LAYOUT_3F2 = CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT | + CHANNEL_FRONT_CENTER | CHANNEL_SIDE_LEFT | + CHANNEL_SIDE_RIGHT, + CUBEB_LAYOUT_3F2_LFE = CUBEB_LAYOUT_3F2 | CHANNEL_LOW_FREQUENCY, + CUBEB_LAYOUT_3F2_BACK = CUBEB_LAYOUT_QUAD | CHANNEL_FRONT_CENTER, + CUBEB_LAYOUT_3F2_LFE_BACK = CUBEB_LAYOUT_3F2_BACK | CHANNEL_LOW_FREQUENCY, + CUBEB_LAYOUT_3F3R_LFE = CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT | + CHANNEL_FRONT_CENTER | CHANNEL_LOW_FREQUENCY | + CHANNEL_BACK_CENTER | CHANNEL_SIDE_LEFT | + CHANNEL_SIDE_RIGHT, + CUBEB_LAYOUT_3F4_LFE = CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT | + CHANNEL_FRONT_CENTER | CHANNEL_LOW_FREQUENCY | + CHANNEL_BACK_LEFT | CHANNEL_BACK_RIGHT | + CHANNEL_SIDE_LEFT | CHANNEL_SIDE_RIGHT, +}; + +/** Miscellaneous stream preferences. */ +typedef enum { + CUBEB_STREAM_PREF_NONE = 0x00, /**< No stream preferences are requested. */ + CUBEB_STREAM_PREF_LOOPBACK = + 0x01, /**< Request a loopback stream. Should be + specified on the input params and an + output device to loopback from should + be passed in place of an input device. */ + CUBEB_STREAM_PREF_DISABLE_DEVICE_SWITCHING = 0x02, /**< Disable switching + default device on OS + changes. */ + CUBEB_STREAM_PREF_VOICE = + 0x04, /**< This stream is going to transport voice data. + Depending on the backend and platform, this can + change the audio input or output devices + selected, as well as the quality of the stream, + for example to accomodate bluetooth SCO modes on + bluetooth devices. */ + CUBEB_STREAM_PREF_RAW = + 0x08, /**< Windows only. Bypass all signal processing + except for always on APO, driver and hardware. */ + CUBEB_STREAM_PREF_PERSIST = 0x10, /**< Request that the volume and mute + settings should persist across restarts + of the stream and/or application. This is + obsolete and ignored by all backends. */ + CUBEB_STREAM_PREF_JACK_NO_AUTO_CONNECT = 0x20 /**< Don't automatically try to + connect ports. Only affects + the jack backend. */ +} cubeb_stream_prefs; + +/** Stream format initialization parameters. */ +typedef struct { + cubeb_sample_format format; /**< Requested sample format. One of + #cubeb_sample_format. */ + uint32_t rate; /**< Requested sample rate. Valid range is [1000, 192000]. */ + uint32_t channels; /**< Requested channel count. Valid range is [1, 8]. */ + cubeb_channel_layout + layout; /**< Requested channel layout. This must be consistent with the + provided channels. CUBEB_LAYOUT_UNDEFINED if unknown */ + cubeb_stream_prefs prefs; /**< Requested preferences. */ +} cubeb_stream_params; + +/** Audio device description */ +typedef struct { + char * output_name; /**< The name of the output device */ + char * input_name; /**< The name of the input device */ +} cubeb_device; + +/** Stream states signaled via state_callback. */ +typedef enum { + CUBEB_STATE_STARTED, /**< Stream started. */ + CUBEB_STATE_STOPPED, /**< Stream stopped. */ + CUBEB_STATE_DRAINED, /**< Stream drained. */ + CUBEB_STATE_ERROR /**< Stream disabled due to error. */ +} cubeb_state; + +/** Result code enumeration. */ +enum { + CUBEB_OK = 0, /**< Success. */ + CUBEB_ERROR = -1, /**< Unclassified error. */ + CUBEB_ERROR_INVALID_FORMAT = + -2, /**< Unsupported #cubeb_stream_params requested. */ + CUBEB_ERROR_INVALID_PARAMETER = -3, /**< Invalid parameter specified. */ + CUBEB_ERROR_NOT_SUPPORTED = + -4, /**< Optional function not implemented in current backend. */ + CUBEB_ERROR_DEVICE_UNAVAILABLE = + -5 /**< Device specified by #cubeb_devid not available. */ +}; + +/** + * Whether a particular device is an input device (e.g. a microphone), or an + * output device (e.g. headphones). */ +typedef enum { + CUBEB_DEVICE_TYPE_UNKNOWN, + CUBEB_DEVICE_TYPE_INPUT, + CUBEB_DEVICE_TYPE_OUTPUT +} cubeb_device_type; + +/** + * The state of a device. + */ +typedef enum { + CUBEB_DEVICE_STATE_DISABLED, /**< The device has been disabled at the system + level. */ + CUBEB_DEVICE_STATE_UNPLUGGED, /**< The device is enabled, but nothing is + plugged into it. */ + CUBEB_DEVICE_STATE_ENABLED /**< The device is enabled. */ +} cubeb_device_state; + +/** + * Architecture specific sample type. + */ +typedef enum { + CUBEB_DEVICE_FMT_S16LE = 0x0010, /**< 16-bit integers, Little Endian. */ + CUBEB_DEVICE_FMT_S16BE = 0x0020, /**< 16-bit integers, Big Endian. */ + CUBEB_DEVICE_FMT_F32LE = 0x1000, /**< 32-bit floating point, Little Endian. */ + CUBEB_DEVICE_FMT_F32BE = 0x2000 /**< 32-bit floating point, Big Endian. */ +} cubeb_device_fmt; + +#if defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) +/** 16-bit integers, native endianess, when on a Big Endian environment. */ +#define CUBEB_DEVICE_FMT_S16NE CUBEB_DEVICE_FMT_S16BE +/** 32-bit floating points, native endianess, when on a Big Endian environment. + */ +#define CUBEB_DEVICE_FMT_F32NE CUBEB_DEVICE_FMT_F32BE +#else +/** 16-bit integers, native endianess, when on a Little Endian environment. */ +#define CUBEB_DEVICE_FMT_S16NE CUBEB_DEVICE_FMT_S16LE +/** 32-bit floating points, native endianess, when on a Little Endian + * environment. */ +#define CUBEB_DEVICE_FMT_F32NE CUBEB_DEVICE_FMT_F32LE +#endif +/** All the 16-bit integers types. */ +#define CUBEB_DEVICE_FMT_S16_MASK \ + (CUBEB_DEVICE_FMT_S16LE | CUBEB_DEVICE_FMT_S16BE) +/** All the 32-bit floating points types. */ +#define CUBEB_DEVICE_FMT_F32_MASK \ + (CUBEB_DEVICE_FMT_F32LE | CUBEB_DEVICE_FMT_F32BE) +/** All the device formats types. */ +#define CUBEB_DEVICE_FMT_ALL \ + (CUBEB_DEVICE_FMT_S16_MASK | CUBEB_DEVICE_FMT_F32_MASK) + +/** Channel type for a `cubeb_stream`. Depending on the backend and platform + * used, this can control inter-stream interruption, ducking, and volume + * control. + */ +typedef enum { + CUBEB_DEVICE_PREF_NONE = 0x00, + CUBEB_DEVICE_PREF_MULTIMEDIA = 0x01, + CUBEB_DEVICE_PREF_VOICE = 0x02, + CUBEB_DEVICE_PREF_NOTIFICATION = 0x04, + CUBEB_DEVICE_PREF_ALL = 0x0F +} cubeb_device_pref; + +/** This structure holds the characteristics + * of an input or output audio device. It is obtained using + * `cubeb_enumerate_devices`, which returns these structures via + * `cubeb_device_collection` and must be destroyed via + * `cubeb_device_collection_destroy`. */ +typedef struct { + cubeb_devid devid; /**< Device identifier handle. */ + char const * + device_id; /**< Device identifier which might be presented in a UI. */ + char const * friendly_name; /**< Friendly device name which might be presented + in a UI. */ + char const * group_id; /**< Two devices have the same group identifier if they + belong to the same physical device; for example a + headset and microphone. */ + char const * vendor_name; /**< Optional vendor name, may be NULL. */ + + cubeb_device_type type; /**< Type of device (Input/Output). */ + cubeb_device_state state; /**< State of device disabled/enabled/unplugged. */ + cubeb_device_pref preferred; /**< Preferred device. */ + + cubeb_device_fmt format; /**< Sample format supported. */ + cubeb_device_fmt + default_format; /**< The default sample format for this device. */ + uint32_t max_channels; /**< Channels. */ + uint32_t default_rate; /**< Default/Preferred sample rate. */ + uint32_t max_rate; /**< Maximum sample rate supported. */ + uint32_t min_rate; /**< Minimum sample rate supported. */ + + uint32_t latency_lo; /**< Lowest possible latency in frames. */ + uint32_t latency_hi; /**< Higest possible latency in frames. */ +} cubeb_device_info; + +/** Device collection. + * Returned by `cubeb_enumerate_devices` and destroyed by + * `cubeb_device_collection_destroy`. */ +typedef struct { + cubeb_device_info * device; /**< Array of pointers to device info. */ + size_t count; /**< Device count in collection. */ +} cubeb_device_collection; + +/** User supplied data callback. + - Calling other cubeb functions from this callback is unsafe. + - The code in the callback should be non-blocking. + - Returning less than the number of frames this callback asks for or + provides puts the stream in drain mode. This callback will not be called + again, and the state callback will be called with CUBEB_STATE_DRAINED when + all the frames have been output. + @param stream The stream for which this callback fired. + @param user_ptr The pointer passed to cubeb_stream_init. + @param input_buffer A pointer containing the input data, or nullptr + if this is an output-only stream. + @param output_buffer A pointer to a buffer to be filled with audio samples, + or nullptr if this is an input-only stream. + @param nframes The number of frames of the two buffer. + @retval If the stream has output, this is the number of frames written to + the output buffer. In this case, if this number is less than + nframes then the stream will start to drain. If the stream is + input only, then returning nframes indicates data has been read. + In this case, a value less than nframes will result in the stream + being stopped. + @retval CUBEB_ERROR on error, in which case the data callback will stop + and the stream will enter a shutdown state. */ +typedef long (*cubeb_data_callback)(cubeb_stream * stream, void * user_ptr, + void const * input_buffer, + void * output_buffer, long nframes); + +/** User supplied state callback. + @param stream The stream for this this callback fired. + @param user_ptr The pointer passed to cubeb_stream_init. + @param state The new state of the stream. */ +typedef void (*cubeb_state_callback)(cubeb_stream * stream, void * user_ptr, + cubeb_state state); + +/** + * User supplied callback called when the underlying device changed. + * @param user The pointer passed to cubeb_stream_init. */ +typedef void (*cubeb_device_changed_callback)(void * user_ptr); + +/** + * User supplied callback called when the underlying device collection changed. + * @param context A pointer to the cubeb context. + * @param user_ptr The pointer passed to + * cubeb_register_device_collection_changed. */ +typedef void (*cubeb_device_collection_changed_callback)(cubeb * context, + void * user_ptr); + +/** User supplied callback called when a message needs logging. */ +typedef void (*cubeb_log_callback)(char const * fmt, ...); + +/** Initialize an application context. This will perform any library or + application scoped initialization. + + Note: On Windows platforms, COM must be initialized in MTA mode on + any thread that will call the cubeb API. + + @param context A out param where an opaque pointer to the application + context will be returned. + @param context_name A name for the context. Depending on the platform this + can appear in different locations. + @param backend_name The name of the cubeb backend user desires to select. + Accepted values self-documented in cubeb.c: init_oneshot + If NULL, a default ordering is used for backend choice. + A valid choice overrides all other possible backends, + so long as the backend was included at compile time. + @retval CUBEB_OK in case of success. + @retval CUBEB_ERROR in case of error, for example because the host + has no audio hardware. */ +CUBEB_EXPORT int +cubeb_init(cubeb ** context, char const * context_name, + char const * backend_name); + +/** Returns a list of backend names which can be supplid to cubeb_init(). + Array is null-terminated. */ +CUBEB_EXPORT const char* const* +cubeb_get_backend_names(); + +/** Get a read-only string identifying this context's current backend. + @param context A pointer to the cubeb context. + @retval Read-only string identifying current backend. */ +CUBEB_EXPORT char const * +cubeb_get_backend_id(cubeb * context); + +/** Get the maximum possible number of channels. + @param context A pointer to the cubeb context. + @param max_channels The maximum number of channels. + @retval CUBEB_OK + @retval CUBEB_ERROR_INVALID_PARAMETER + @retval CUBEB_ERROR_NOT_SUPPORTED + @retval CUBEB_ERROR */ +CUBEB_EXPORT int +cubeb_get_max_channel_count(cubeb * context, uint32_t * max_channels); + +/** Get the minimal latency value, in frames, that is guaranteed to work + when creating a stream for the specified sample rate. This is platform, + hardware and backend dependent. + @param context A pointer to the cubeb context. + @param params On some backends, the minimum achievable latency depends on + the characteristics of the stream. + @param latency_frames The latency value, in frames, to pass to + cubeb_stream_init. + @retval CUBEB_OK + @retval CUBEB_ERROR_INVALID_PARAMETER + @retval CUBEB_ERROR_NOT_SUPPORTED */ +CUBEB_EXPORT int +cubeb_get_min_latency(cubeb * context, cubeb_stream_params * params, + uint32_t * latency_frames); + +/** Get the preferred sample rate for this backend: this is hardware and + platform dependent, and can avoid resampling, and/or trigger fastpaths. + @param context A pointer to the cubeb context. + @param rate The samplerate (in Hz) the current configuration prefers. + @retval CUBEB_OK + @retval CUBEB_ERROR_INVALID_PARAMETER + @retval CUBEB_ERROR_NOT_SUPPORTED */ +CUBEB_EXPORT int +cubeb_get_preferred_sample_rate(cubeb * context, uint32_t * rate); + +/** Destroy an application context. This must be called after all stream have + * been destroyed. + @param context A pointer to the cubeb context.*/ +CUBEB_EXPORT void +cubeb_destroy(cubeb * context); + +/** Initialize a stream associated with the supplied application context. + @param context A pointer to the cubeb context. + @param stream An out parameter to be filled with the an opaque pointer to a + cubeb stream. + @param stream_name A name for this stream. + @param input_device Device for the input side of the stream. If NULL the + default input device is used. Passing a valid + cubeb_devid means the stream only ever uses that device. Passing a NULL + cubeb_devid allows the stream to follow that device + type's OS default. + @param input_stream_params Parameters for the input side of the stream, or + NULL if this stream is output only. + @param output_device Device for the output side of the stream. If NULL the + default output device is used. Passing a valid + cubeb_devid means the stream only ever uses that device. Passing a NULL + cubeb_devid allows the stream to follow that device + type's OS default. + @param output_stream_params Parameters for the output side of the stream, or + NULL if this stream is input only. When input + and output stream parameters are supplied, their + rate has to be the same. + @param latency_frames Stream latency in frames. Valid range + is [1, 96000]. + @param data_callback Will be called to preroll data before playback is + started by cubeb_stream_start. + @param state_callback A pointer to a state callback. + @param user_ptr A pointer that will be passed to the callbacks. This pointer + must outlive the life time of the stream. + @retval CUBEB_OK + @retval CUBEB_ERROR + @retval CUBEB_ERROR_INVALID_FORMAT + @retval CUBEB_ERROR_DEVICE_UNAVAILABLE */ +CUBEB_EXPORT int +cubeb_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + uint32_t latency_frames, cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr); + +/** Destroy a stream. `cubeb_stream_stop` MUST be called before destroying a + stream. + @param stream The stream to destroy. */ +CUBEB_EXPORT void +cubeb_stream_destroy(cubeb_stream * stream); + +/** Start playback. + @param stream + @retval CUBEB_OK + @retval CUBEB_ERROR */ +CUBEB_EXPORT int +cubeb_stream_start(cubeb_stream * stream); + +/** Stop playback. + @param stream + @retval CUBEB_OK + @retval CUBEB_ERROR */ +CUBEB_EXPORT int +cubeb_stream_stop(cubeb_stream * stream); + +/** Get the current stream playback position. + @param stream + @param position Playback position in frames. + @retval CUBEB_OK + @retval CUBEB_ERROR */ +CUBEB_EXPORT int +cubeb_stream_get_position(cubeb_stream * stream, uint64_t * position); + +/** Get the latency for this stream, in frames. This is the number of frames + between the time cubeb acquires the data in the callback and the listener + can hear the sound. + @param stream + @param latency Current approximate stream latency in frames. + @retval CUBEB_OK + @retval CUBEB_ERROR_NOT_SUPPORTED + @retval CUBEB_ERROR */ +CUBEB_EXPORT int +cubeb_stream_get_latency(cubeb_stream * stream, uint32_t * latency); + +/** Get the input latency for this stream, in frames. This is the number of + frames between the time the audio input devices records the data, and they + are available in the data callback. + This returns CUBEB_ERROR when the stream is output-only. + @param stream + @param latency Current approximate stream latency in frames. + @retval CUBEB_OK + @retval CUBEB_ERROR_NOT_SUPPORTED + @retval CUBEB_ERROR */ +CUBEB_EXPORT int +cubeb_stream_get_input_latency(cubeb_stream * stream, uint32_t * latency); +/** Set the volume for a stream. + @param stream the stream for which to adjust the volume. + @param volume a float between 0.0 (muted) and 1.0 (maximum volume) + @retval CUBEB_OK + @retval CUBEB_ERROR_INVALID_PARAMETER volume is outside [0.0, 1.0] or + stream is an invalid pointer + @retval CUBEB_ERROR_NOT_SUPPORTED */ +CUBEB_EXPORT int +cubeb_stream_set_volume(cubeb_stream * stream, float volume); + +/** Change a stream's name. + @param stream the stream for which to set the name. + @param stream_name the new name for the stream + @retval CUBEB_OK + @retval CUBEB_ERROR_INVALID_PARAMETER if any pointer is invalid + @retval CUBEB_ERROR_NOT_SUPPORTED */ +CUBEB_EXPORT int +cubeb_stream_set_name(cubeb_stream * stream, char const * stream_name); + +/** Get the current output device for this stream. + @param stm the stream for which to query the current output device + @param device a pointer in which the current output device will be stored. + @retval CUBEB_OK in case of success + @retval CUBEB_ERROR_INVALID_PARAMETER if either stm, device or count are + invalid pointers + @retval CUBEB_ERROR_NOT_SUPPORTED */ +CUBEB_EXPORT int +cubeb_stream_get_current_device(cubeb_stream * stm, + cubeb_device ** const device); + +/** Destroy a cubeb_device structure. + @param stream the stream passed in cubeb_stream_get_current_device + @param devices the devices to destroy + @retval CUBEB_OK in case of success + @retval CUBEB_ERROR_INVALID_PARAMETER if devices is an invalid pointer + @retval CUBEB_ERROR_NOT_SUPPORTED */ +CUBEB_EXPORT int +cubeb_stream_device_destroy(cubeb_stream * stream, cubeb_device * devices); + +/** Set a callback to be notified when the output device changes. + @param stream the stream for which to set the callback. + @param device_changed_callback a function called whenever the device has + changed. Passing NULL allow to unregister a function + @retval CUBEB_OK + @retval CUBEB_ERROR_INVALID_PARAMETER if either stream or + device_changed_callback are invalid pointers. + @retval CUBEB_ERROR_NOT_SUPPORTED */ +CUBEB_EXPORT int +cubeb_stream_register_device_changed_callback( + cubeb_stream * stream, + cubeb_device_changed_callback device_changed_callback); + +/** Return the user data pointer registered with the stream with + cubeb_stream_init. + @param stream the stream for which to retrieve user data pointer. + @retval user data pointer */ +CUBEB_EXPORT void * +cubeb_stream_user_ptr(cubeb_stream * stream); + +/** Returns enumerated devices. + @param context + @param devtype device type to include + @param collection output collection. Must be destroyed with + cubeb_device_collection_destroy + @retval CUBEB_OK in case of success + @retval CUBEB_ERROR_INVALID_PARAMETER if collection is an invalid pointer + @retval CUBEB_ERROR_NOT_SUPPORTED */ +CUBEB_EXPORT int +cubeb_enumerate_devices(cubeb * context, cubeb_device_type devtype, + cubeb_device_collection * collection); + +/** Destroy a cubeb_device_collection, and its `cubeb_device_info`. + @param context + @param collection collection to destroy + @retval CUBEB_OK + @retval CUBEB_ERROR_INVALID_PARAMETER if collection is an invalid pointer */ +CUBEB_EXPORT int +cubeb_device_collection_destroy(cubeb * context, + cubeb_device_collection * collection); + +/** Registers a callback which is called when the system detects + a new device or a device is removed. + @param context + @param devtype device type to include. Different callbacks and user pointers + can be registered for each devtype. The hybrid devtype + `CUBEB_DEVICE_TYPE_INPUT | CUBEB_DEVICE_TYPE_OUTPUT` is also valid + and will register the provided callback and user pointer in both + sides. + @param callback a function called whenever the system device list changes. + Passing NULL allow to unregister a function. You have to unregister + first before you register a new callback. + @param user_ptr pointer to user specified data which will be present in + subsequent callbacks. + @retval CUBEB_ERROR_NOT_SUPPORTED */ +CUBEB_EXPORT int +cubeb_register_device_collection_changed( + cubeb * context, cubeb_device_type devtype, + cubeb_device_collection_changed_callback callback, void * user_ptr); + +/** Set a callback to be called with a message. + @param log_level CUBEB_LOG_VERBOSE, CUBEB_LOG_NORMAL. + @param log_callback A function called with a message when there is + something to log. Pass NULL to unregister. + @retval CUBEB_OK in case of success. + @retval CUBEB_ERROR_INVALID_PARAMETER if either context or log_callback are + invalid pointers, or if level is not + in cubeb_log_level. */ +CUBEB_EXPORT int +cubeb_set_log_callback(cubeb_log_level log_level, + cubeb_log_callback log_callback); + +#if defined(__cplusplus) +} +#endif + +#endif /* CUBEB_c2f983e9_c96f_e71c_72c3_bbf62992a382 */ diff --git a/3rdparty/cubeb/src/android/audiotrack_definitions.h b/3rdparty/cubeb/src/android/audiotrack_definitions.h new file mode 100644 index 0000000000..f6b6931fa4 --- /dev/null +++ b/3rdparty/cubeb/src/android/audiotrack_definitions.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * 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. + */ + +#include + +/* + * The following definitions are copied from the android sources. Only the + * relevant enum member and values needed are copied. + */ + +/* + * From + * https://android.googlesource.com/platform/frameworks/base/+/android-2.2.3_r2.1/include/utils/Errors.h + */ +typedef int32_t status_t; + +/* + * From + * https://android.googlesource.com/platform/frameworks/base/+/android-2.2.3_r2.1/include/media/AudioTrack.h + */ +struct Buffer { + uint32_t flags; + int channelCount; + int format; + size_t frameCount; + size_t size; + union { + void * raw; + short * i16; + int8_t * i8; + }; +}; + +enum event_type { + EVENT_MORE_DATA = 0, + EVENT_UNDERRUN = 1, + EVENT_LOOP_END = 2, + EVENT_MARKER = 3, + EVENT_NEW_POS = 4, + EVENT_BUFFER_END = 5 +}; + +/** + * From + * https://android.googlesource.com/platform/frameworks/base/+/android-2.2.3_r2.1/include/media/AudioSystem.h + * and + * https://android.googlesource.com/platform/system/core/+/android-4.2.2_r1/include/system/audio.h + */ + +#define AUDIO_STREAM_TYPE_MUSIC 3 + +enum { + AUDIO_CHANNEL_OUT_FRONT_LEFT_ICS = 0x1, + AUDIO_CHANNEL_OUT_FRONT_RIGHT_ICS = 0x2, + AUDIO_CHANNEL_OUT_MONO_ICS = AUDIO_CHANNEL_OUT_FRONT_LEFT_ICS, + AUDIO_CHANNEL_OUT_STEREO_ICS = + (AUDIO_CHANNEL_OUT_FRONT_LEFT_ICS | AUDIO_CHANNEL_OUT_FRONT_RIGHT_ICS) +} AudioTrack_ChannelMapping_ICS; + +enum { + AUDIO_CHANNEL_OUT_FRONT_LEFT_Legacy = 0x4, + AUDIO_CHANNEL_OUT_FRONT_RIGHT_Legacy = 0x8, + AUDIO_CHANNEL_OUT_MONO_Legacy = AUDIO_CHANNEL_OUT_FRONT_LEFT_Legacy, + AUDIO_CHANNEL_OUT_STEREO_Legacy = (AUDIO_CHANNEL_OUT_FRONT_LEFT_Legacy | + AUDIO_CHANNEL_OUT_FRONT_RIGHT_Legacy) +} AudioTrack_ChannelMapping_Legacy; + +typedef enum { + AUDIO_FORMAT_PCM = 0x00000000, + AUDIO_FORMAT_PCM_SUB_16_BIT = 0x1, + AUDIO_FORMAT_PCM_16_BIT = (AUDIO_FORMAT_PCM | AUDIO_FORMAT_PCM_SUB_16_BIT), +} AudioTrack_SampleType; diff --git a/3rdparty/cubeb/src/android/cubeb-output-latency.h b/3rdparty/cubeb/src/android/cubeb-output-latency.h new file mode 100644 index 0000000000..870a884a3c --- /dev/null +++ b/3rdparty/cubeb/src/android/cubeb-output-latency.h @@ -0,0 +1,76 @@ +#ifndef _CUBEB_OUTPUT_LATENCY_H_ +#define _CUBEB_OUTPUT_LATENCY_H_ + +#include "../cubeb-jni.h" +#include "cubeb_media_library.h" +#include + +struct output_latency_function { + media_lib * from_lib; + cubeb_jni * from_jni; + int version; +}; + +typedef struct output_latency_function output_latency_function; + +const int ANDROID_JELLY_BEAN_MR1_4_2 = 17; + +output_latency_function * +cubeb_output_latency_load_method(int version) +{ + output_latency_function * ol = NULL; + ol = calloc(1, sizeof(output_latency_function)); + + ol->version = version; + + if (ol->version > ANDROID_JELLY_BEAN_MR1_4_2) { + ol->from_jni = cubeb_jni_init(); + return ol; + } + + ol->from_lib = cubeb_load_media_library(); + return ol; +} + +bool +cubeb_output_latency_method_is_loaded(output_latency_function * ol) +{ + assert(ol); + if (ol->version > ANDROID_JELLY_BEAN_MR1_4_2) { + return !!ol->from_jni; + } + + return !!ol->from_lib; +} + +void +cubeb_output_latency_unload_method(output_latency_function * ol) +{ + if (!ol) { + return; + } + + if (ol->version > ANDROID_JELLY_BEAN_MR1_4_2 && ol->from_jni) { + cubeb_jni_destroy(ol->from_jni); + } + + if (ol->version <= ANDROID_JELLY_BEAN_MR1_4_2 && ol->from_lib) { + cubeb_close_media_library(ol->from_lib); + } + + free(ol); +} + +uint32_t +cubeb_get_output_latency(output_latency_function * ol) +{ + assert(cubeb_output_latency_method_is_loaded(ol)); + + if (ol->version > ANDROID_JELLY_BEAN_MR1_4_2) { + return cubeb_get_output_latency_from_jni(ol->from_jni); + } + + return cubeb_get_output_latency_from_media_library(ol->from_lib); +} + +#endif // _CUBEB_OUTPUT_LATENCY_H_ diff --git a/3rdparty/cubeb/src/android/cubeb_media_library.h b/3rdparty/cubeb/src/android/cubeb_media_library.h new file mode 100644 index 0000000000..27fbc86ec2 --- /dev/null +++ b/3rdparty/cubeb/src/android/cubeb_media_library.h @@ -0,0 +1,64 @@ +#ifndef _CUBEB_MEDIA_LIBRARY_H_ +#define _CUBEB_MEDIA_LIBRARY_H_ + +struct media_lib { + void * libmedia; + int32_t (*get_output_latency)(uint32_t * latency, int stream_type); +}; + +typedef struct media_lib media_lib; + +media_lib * +cubeb_load_media_library() +{ + media_lib ml = {0}; + ml.libmedia = dlopen("libmedia.so", RTLD_LAZY); + if (!ml.libmedia) { + return NULL; + } + + // Get the latency, in ms, from AudioFlinger. First, try the most recent + // signature. status_t AudioSystem::getOutputLatency(uint32_t* latency, + // audio_stream_type_t streamType) + ml.get_output_latency = dlsym( + ml.libmedia, + "_ZN7android11AudioSystem16getOutputLatencyEPj19audio_stream_type_t"); + if (!ml.get_output_latency) { + // In case of failure, try the signature from legacy version. + // status_t AudioSystem::getOutputLatency(uint32_t* latency, int streamType) + ml.get_output_latency = + dlsym(ml.libmedia, "_ZN7android11AudioSystem16getOutputLatencyEPji"); + if (!ml.get_output_latency) { + return NULL; + } + } + + media_lib * rv = NULL; + rv = calloc(1, sizeof(media_lib)); + assert(rv); + *rv = ml; + return rv; +} + +void +cubeb_close_media_library(media_lib * ml) +{ + dlclose(ml->libmedia); + ml->libmedia = NULL; + ml->get_output_latency = NULL; + free(ml); +} + +uint32_t +cubeb_get_output_latency_from_media_library(media_lib * ml) +{ + uint32_t latency = 0; + const int audio_stream_type_music = 3; + int32_t r = ml->get_output_latency(&latency, audio_stream_type_music); + if (r) { + return 0; + } + return latency; +} + +#endif // _CUBEB_MEDIA_LIBRARY_H_ diff --git a/3rdparty/cubeb/src/android/sles_definitions.h b/3rdparty/cubeb/src/android/sles_definitions.h new file mode 100644 index 0000000000..b107003d1b --- /dev/null +++ b/3rdparty/cubeb/src/android/sles_definitions.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * 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. + */ + +/** + * This file is similar to the file "OpenSLES_AndroidConfiguration.h" found in + * the Android NDK, but removes the #ifdef __cplusplus defines, so we can keep + * using a C compiler in cubeb. + */ + +#ifndef OPENSL_ES_ANDROIDCONFIGURATION_H_ +#define OPENSL_ES_ANDROIDCONFIGURATION_H_ + +/*---------------------------------------------------------------------------*/ +/* Android AudioRecorder configuration */ +/*---------------------------------------------------------------------------*/ + +/** Audio recording preset */ +/** Audio recording preset key */ +#define SL_ANDROID_KEY_RECORDING_PRESET \ + ((const SLchar *)"androidRecordingPreset") +/** Audio recording preset values */ +/** preset "none" cannot be set, it is used to indicate the current settings + * do not match any of the presets. */ +#define SL_ANDROID_RECORDING_PRESET_NONE ((SLuint32)0x00000000) +/** generic recording configuration on the platform */ +#define SL_ANDROID_RECORDING_PRESET_GENERIC ((SLuint32)0x00000001) +/** uses the microphone audio source with the same orientation as the camera + * if available, the main device microphone otherwise */ +#define SL_ANDROID_RECORDING_PRESET_CAMCORDER ((SLuint32)0x00000002) +/** uses the main microphone tuned for voice recognition */ +#define SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION ((SLuint32)0x00000003) +/** uses the main microphone tuned for audio communications */ +#define SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION ((SLuint32)0x00000004) +/** uses the main microphone unprocessed */ +#define SL_ANDROID_RECORDING_PRESET_UNPROCESSED ((SLuint32)0x00000005) + +/*---------------------------------------------------------------------------*/ +/* Android AudioPlayer configuration */ +/*---------------------------------------------------------------------------*/ + +/** Audio playback stream type */ +/** Audio playback stream type key */ +#define SL_ANDROID_KEY_STREAM_TYPE ((const SLchar *)"androidPlaybackStreamType") + +/** Audio playback stream type values */ +/* same as android.media.AudioManager.STREAM_VOICE_CALL */ +#define SL_ANDROID_STREAM_VOICE ((SLint32)0x00000000) +/* same as android.media.AudioManager.STREAM_SYSTEM */ +#define SL_ANDROID_STREAM_SYSTEM ((SLint32)0x00000001) +/* same as android.media.AudioManager.STREAM_RING */ +#define SL_ANDROID_STREAM_RING ((SLint32)0x00000002) +/* same as android.media.AudioManager.STREAM_MUSIC */ +#define SL_ANDROID_STREAM_MEDIA ((SLint32)0x00000003) +/* same as android.media.AudioManager.STREAM_ALARM */ +#define SL_ANDROID_STREAM_ALARM ((SLint32)0x00000004) +/* same as android.media.AudioManager.STREAM_NOTIFICATION */ +#define SL_ANDROID_STREAM_NOTIFICATION ((SLint32)0x00000005) + +/*---------------------------------------------------------------------------*/ +/* Android AudioPlayer and AudioRecorder configuration */ +/*---------------------------------------------------------------------------*/ + +/** Audio Performance mode. + * Performance mode tells the framework how to configure the audio path + * for a player or recorder according to application performance and + * functional requirements. + * It affects the output or input latency based on acceptable tradeoffs on + * battery drain and use of pre or post processing effects. + * Performance mode should be set before realizing the object and should be + * read after realizing the object to check if the requested mode could be + * granted or not. + */ +/** Audio Performance mode key */ +#define SL_ANDROID_KEY_PERFORMANCE_MODE \ + ((const SLchar *)"androidPerformanceMode") + +/** Audio performance values */ +/* No specific performance requirement. Allows HW and SW pre/post + * processing. */ +#define SL_ANDROID_PERFORMANCE_NONE ((SLuint32)0x00000000) +/* Priority given to latency. No HW or software pre/post processing. + * This is the default if no performance mode is specified. */ +#define SL_ANDROID_PERFORMANCE_LATENCY ((SLuint32)0x00000001) +/* Priority given to latency while still allowing HW pre and post + * processing. */ +#define SL_ANDROID_PERFORMANCE_LATENCY_EFFECTS ((SLuint32)0x00000002) +/* Priority given to power saving if latency is not a concern. + * Allows HW and SW pre/post processing. */ +#define SL_ANDROID_PERFORMANCE_POWER_SAVING ((SLuint32)0x00000003) + +#endif /* OPENSL_ES_ANDROIDCONFIGURATION_H_ */ diff --git a/3rdparty/cubeb/src/cubeb-internal.h b/3rdparty/cubeb/src/cubeb-internal.h new file mode 100644 index 0000000000..79326e1ebf --- /dev/null +++ b/3rdparty/cubeb/src/cubeb-internal.h @@ -0,0 +1,74 @@ +/* + * Copyright © 2013 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#if !defined(CUBEB_INTERNAL_0eb56756_4e20_4404_a76d_42bf88cd15a5) +#define CUBEB_INTERNAL_0eb56756_4e20_4404_a76d_42bf88cd15a5 + +#include "cubeb/cubeb.h" +#include "cubeb_assert.h" +#include "cubeb_log.h" +#include +#include + +#ifdef __clang__ +#ifndef CLANG_ANALYZER_NORETURN +#if __has_feature(attribute_analyzer_noreturn) +#define CLANG_ANALYZER_NORETURN __attribute__((analyzer_noreturn)) +#else +#define CLANG_ANALYZER_NORETURN +#endif // ifndef CLANG_ANALYZER_NORETURN +#endif // __has_feature(attribute_analyzer_noreturn) +#else // __clang__ +#define CLANG_ANALYZER_NORETURN +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +#if defined(__cplusplus) +} +#endif + +struct cubeb_ops { + int (*init)(cubeb ** context, char const * context_name); + char const * (*get_backend_id)(cubeb * context); + int (*get_max_channel_count)(cubeb * context, uint32_t * max_channels); + int (*get_min_latency)(cubeb * context, cubeb_stream_params params, + uint32_t * latency_ms); + int (*get_preferred_sample_rate)(cubeb * context, uint32_t * rate); + int (*enumerate_devices)(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection); + int (*device_collection_destroy)(cubeb * context, + cubeb_device_collection * collection); + void (*destroy)(cubeb * context); + int (*stream_init)(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency, cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr); + void (*stream_destroy)(cubeb_stream * stream); + int (*stream_start)(cubeb_stream * stream); + int (*stream_stop)(cubeb_stream * stream); + int (*stream_get_position)(cubeb_stream * stream, uint64_t * position); + int (*stream_get_latency)(cubeb_stream * stream, uint32_t * latency); + int (*stream_get_input_latency)(cubeb_stream * stream, uint32_t * latency); + int (*stream_set_volume)(cubeb_stream * stream, float volumes); + int (*stream_set_name)(cubeb_stream * stream, char const * stream_name); + int (*stream_get_current_device)(cubeb_stream * stream, + cubeb_device ** const device); + int (*stream_device_destroy)(cubeb_stream * stream, cubeb_device * device); + int (*stream_register_device_changed_callback)( + cubeb_stream * stream, + cubeb_device_changed_callback device_changed_callback); + int (*register_device_collection_changed)( + cubeb * context, cubeb_device_type devtype, + cubeb_device_collection_changed_callback callback, void * user_ptr); +}; + +#endif /* CUBEB_INTERNAL_0eb56756_4e20_4404_a76d_42bf88cd15a5 */ diff --git a/3rdparty/cubeb/src/cubeb-jni-instances.h b/3rdparty/cubeb/src/cubeb-jni-instances.h new file mode 100644 index 0000000000..4fed046592 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb-jni-instances.h @@ -0,0 +1,30 @@ +#ifndef _CUBEB_JNI_INSTANCES_H_ +#define _CUBEB_JNI_INSTANCES_H_ + +/* + * The methods in this file offer a way to pass in the required + * JNI instances in the cubeb library. By default they return NULL. + * In this case part of the cubeb API that depends on JNI + * will return CUBEB_ERROR_NOT_SUPPORTED. Currently only one + * method depends on that: + * + * cubeb_stream_get_position() + * + * Users that want to use that cubeb API method must "override" + * the methods bellow to return a valid instance of JavaVM + * and application's Context object. + * */ + +JNIEnv * +cubeb_get_jni_env_for_thread() +{ + return nullptr; +} + +jobject +cubeb_jni_get_context_instance() +{ + return nullptr; +} + +#endif //_CUBEB_JNI_INSTANCES_H_ diff --git a/3rdparty/cubeb/src/cubeb-jni.cpp b/3rdparty/cubeb/src/cubeb-jni.cpp new file mode 100644 index 0000000000..8e7345b8aa --- /dev/null +++ b/3rdparty/cubeb/src/cubeb-jni.cpp @@ -0,0 +1,82 @@ +/* clang-format off */ +#include "jni.h" +#include +#include "cubeb-jni-instances.h" +/* clang-format on */ + +#define AUDIO_STREAM_TYPE_MUSIC 3 + +struct cubeb_jni { + jobject s_audio_manager_obj = nullptr; + jclass s_audio_manager_class = nullptr; + jmethodID s_get_output_latency_id = nullptr; +}; + +extern "C" cubeb_jni * +cubeb_jni_init() +{ + jobject ctx_obj = cubeb_jni_get_context_instance(); + JNIEnv * jni_env = cubeb_get_jni_env_for_thread(); + if (!jni_env || !ctx_obj) { + return nullptr; + } + + cubeb_jni * cubeb_jni_ptr = new cubeb_jni; + assert(cubeb_jni_ptr); + + // Find the audio manager object and make it global to call it from another + // method + jclass context_class = jni_env->FindClass("android/content/Context"); + jfieldID audio_service_field = jni_env->GetStaticFieldID( + context_class, "AUDIO_SERVICE", "Ljava/lang/String;"); + jstring jstr = (jstring)jni_env->GetStaticObjectField(context_class, + audio_service_field); + jmethodID get_system_service_id = + jni_env->GetMethodID(context_class, "getSystemService", + "(Ljava/lang/String;)Ljava/lang/Object;"); + jobject audio_manager_obj = + jni_env->CallObjectMethod(ctx_obj, get_system_service_id, jstr); + cubeb_jni_ptr->s_audio_manager_obj = + reinterpret_cast(jni_env->NewGlobalRef(audio_manager_obj)); + + // Make the audio manager class a global reference in order to preserve method + // id + jclass audio_manager_class = jni_env->FindClass("android/media/AudioManager"); + cubeb_jni_ptr->s_audio_manager_class = + reinterpret_cast(jni_env->NewGlobalRef(audio_manager_class)); + cubeb_jni_ptr->s_get_output_latency_id = + jni_env->GetMethodID(audio_manager_class, "getOutputLatency", "(I)I"); + + jni_env->DeleteLocalRef(ctx_obj); + jni_env->DeleteLocalRef(context_class); + jni_env->DeleteLocalRef(jstr); + jni_env->DeleteLocalRef(audio_manager_obj); + jni_env->DeleteLocalRef(audio_manager_class); + + return cubeb_jni_ptr; +} + +extern "C" int +cubeb_get_output_latency_from_jni(cubeb_jni * cubeb_jni_ptr) +{ + assert(cubeb_jni_ptr); + JNIEnv * jni_env = cubeb_get_jni_env_for_thread(); + return jni_env->CallIntMethod( + cubeb_jni_ptr->s_audio_manager_obj, + cubeb_jni_ptr->s_get_output_latency_id, + AUDIO_STREAM_TYPE_MUSIC); // param: AudioManager.STREAM_MUSIC +} + +extern "C" void +cubeb_jni_destroy(cubeb_jni * cubeb_jni_ptr) +{ + assert(cubeb_jni_ptr); + + JNIEnv * jni_env = cubeb_get_jni_env_for_thread(); + assert(jni_env); + + jni_env->DeleteGlobalRef(cubeb_jni_ptr->s_audio_manager_obj); + jni_env->DeleteGlobalRef(cubeb_jni_ptr->s_audio_manager_class); + + delete cubeb_jni_ptr; +} diff --git a/3rdparty/cubeb/src/cubeb-jni.h b/3rdparty/cubeb/src/cubeb-jni.h new file mode 100644 index 0000000000..c4a712a062 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb-jni.h @@ -0,0 +1,13 @@ +#ifndef _CUBEB_JNI_H_ +#define _CUBEB_JNI_H_ + +typedef struct cubeb_jni cubeb_jni; + +cubeb_jni * +cubeb_jni_init(); +int +cubeb_get_output_latency_from_jni(cubeb_jni * cubeb_jni_ptr); +void +cubeb_jni_destroy(cubeb_jni * cubeb_jni_ptr); + +#endif // _CUBEB_JNI_H_ diff --git a/3rdparty/cubeb/src/cubeb-sles.h b/3rdparty/cubeb/src/cubeb-sles.h new file mode 100644 index 0000000000..ca93543c0b --- /dev/null +++ b/3rdparty/cubeb/src/cubeb-sles.h @@ -0,0 +1,38 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#ifndef _CUBEB_SLES_H_ +#define _CUBEB_SLES_H_ +#include + +static SLresult +cubeb_get_sles_engine(SLObjectItf * pEngine, SLuint32 numOptions, + const SLEngineOption * pEngineOptions, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired) +{ + return slCreateEngine(pEngine, numOptions, pEngineOptions, numInterfaces, + pInterfaceIds, pInterfaceRequired); +} + +static void +cubeb_destroy_sles_engine(SLObjectItf * self) +{ + if (*self != NULL) { + (**self)->Destroy(*self); + *self = NULL; + } +} + +static SLresult +cubeb_realize_sles_engine(SLObjectItf self) +{ + return (*self)->Realize(self, SL_BOOLEAN_FALSE); +} + +#endif diff --git a/3rdparty/cubeb/src/cubeb-speex-resampler.h b/3rdparty/cubeb/src/cubeb-speex-resampler.h new file mode 100644 index 0000000000..9ecf747cb0 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb-speex-resampler.h @@ -0,0 +1 @@ +#include diff --git a/3rdparty/cubeb/src/cubeb.c b/3rdparty/cubeb/src/cubeb.c new file mode 100644 index 0000000000..99659ce939 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb.c @@ -0,0 +1,766 @@ +/* + * Copyright © 2013 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#undef NDEBUG +#include "cubeb/cubeb.h" +#include "cubeb-internal.h" +#include +#include +#include +#include + +#define NELEMS(x) ((int)(sizeof(x) / sizeof(x[0]))) + +struct cubeb { + struct cubeb_ops * ops; +}; + +struct cubeb_stream { + /* + * Note: All implementations of cubeb_stream must keep the following + * layout. + */ + struct cubeb * context; + void * user_ptr; +}; + +#if defined(USE_PULSE) +int +pulse_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_PULSE_RUST) +int +pulse_rust_init(cubeb ** contet, char const * context_name); +#endif +#if defined(USE_JACK) +int +jack_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_ALSA) +int +alsa_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_AUDIOUNIT) +int +audiounit_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_AUDIOUNIT_RUST) +int +audiounit_rust_init(cubeb ** contet, char const * context_name); +#endif +#if defined(USE_WINMM) +int +winmm_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_WASAPI) +int +wasapi_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_SNDIO) +int +sndio_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_SUN) +int +sun_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_OPENSL) +int +opensl_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_OSS) +int +oss_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_AAUDIO) +int +aaudio_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_AUDIOTRACK) +int +audiotrack_init(cubeb ** context, char const * context_name); +#endif +#if defined(USE_KAI) +int +kai_init(cubeb ** context, char const * context_name); +#endif + +static int +validate_stream_params(cubeb_stream_params * input_stream_params, + cubeb_stream_params * output_stream_params) +{ + XASSERT(input_stream_params || output_stream_params); + if (output_stream_params) { + if (output_stream_params->rate < 1000 || + output_stream_params->rate > 192000 || + output_stream_params->channels < 1 || + output_stream_params->channels > UINT8_MAX) { + return CUBEB_ERROR_INVALID_FORMAT; + } + } + if (input_stream_params) { + if (input_stream_params->rate < 1000 || + input_stream_params->rate > 192000 || + input_stream_params->channels < 1 || + input_stream_params->channels > UINT8_MAX) { + return CUBEB_ERROR_INVALID_FORMAT; + } + } + // Rate and sample format must be the same for input and output, if using a + // duplex stream + if (input_stream_params && output_stream_params) { + if (input_stream_params->rate != output_stream_params->rate || + input_stream_params->format != output_stream_params->format) { + return CUBEB_ERROR_INVALID_FORMAT; + } + } + + cubeb_stream_params * params = + input_stream_params ? input_stream_params : output_stream_params; + + switch (params->format) { + case CUBEB_SAMPLE_S16LE: + case CUBEB_SAMPLE_S16BE: + case CUBEB_SAMPLE_FLOAT32LE: + case CUBEB_SAMPLE_FLOAT32BE: + return CUBEB_OK; + } + + return CUBEB_ERROR_INVALID_FORMAT; +} + +static int +validate_latency(int latency) +{ + if (latency < 1 || latency > 96000) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + return CUBEB_OK; +} + +int +cubeb_init(cubeb ** context, char const * context_name, + char const * backend_name) +{ + int (*init_oneshot)(cubeb **, char const *) = NULL; + + if (backend_name != NULL) { + if (!strcmp(backend_name, "pulse")) { +#if defined(USE_PULSE) + init_oneshot = pulse_init; +#endif + } else if (!strcmp(backend_name, "pulse-rust")) { +#if defined(USE_PULSE_RUST) + init_oneshot = pulse_rust_init; +#endif + } else if (!strcmp(backend_name, "jack")) { +#if defined(USE_JACK) + init_oneshot = jack_init; +#endif + } else if (!strcmp(backend_name, "alsa")) { +#if defined(USE_ALSA) + init_oneshot = alsa_init; +#endif + } else if (!strcmp(backend_name, "audiounit")) { +#if defined(USE_AUDIOUNIT) + init_oneshot = audiounit_init; +#endif + } else if (!strcmp(backend_name, "audiounit-rust")) { +#if defined(USE_AUDIOUNIT_RUST) + init_oneshot = audiounit_rust_init; +#endif + } else if (!strcmp(backend_name, "wasapi")) { +#if defined(USE_WASAPI) + init_oneshot = wasapi_init; +#endif + } else if (!strcmp(backend_name, "winmm")) { +#if defined(USE_WINMM) + init_oneshot = winmm_init; +#endif + } else if (!strcmp(backend_name, "sndio")) { +#if defined(USE_SNDIO) + init_oneshot = sndio_init; +#endif + } else if (!strcmp(backend_name, "sun")) { +#if defined(USE_SUN) + init_oneshot = sun_init; +#endif + } else if (!strcmp(backend_name, "opensl")) { +#if defined(USE_OPENSL) + init_oneshot = opensl_init; +#endif + } else if (!strcmp(backend_name, "oss")) { +#if defined(USE_OSS) + init_oneshot = oss_init; +#endif + } else if (!strcmp(backend_name, "aaudio")) { +#if defined(USE_AAUDIO) + init_oneshot = aaudio_init; +#endif + } else if (!strcmp(backend_name, "audiotrack")) { +#if defined(USE_AUDIOTRACK) + init_oneshot = audiotrack_init; +#endif + } else if (!strcmp(backend_name, "kai")) { +#if defined(USE_KAI) + init_oneshot = kai_init; +#endif + } else { + /* Already set */ + } + } + + int (*default_init[])(cubeb **, char const *) = { + /* + * init_oneshot must be at the top to allow user + * to override all other choices + */ + init_oneshot, +#if defined(USE_PULSE_RUST) + pulse_rust_init, +#endif +#if defined(USE_PULSE) + pulse_init, +#endif +#if defined(USE_JACK) + jack_init, +#endif +#if defined(USE_SNDIO) + sndio_init, +#endif +#if defined(USE_ALSA) + alsa_init, +#endif +#if defined(USE_OSS) + oss_init, +#endif +#if defined(USE_AUDIOUNIT_RUST) + audiounit_rust_init, +#endif +#if defined(USE_AUDIOUNIT) + audiounit_init, +#endif +#if defined(USE_WASAPI) + wasapi_init, +#endif +#if defined(USE_WINMM) + winmm_init, +#endif +#if defined(USE_SUN) + sun_init, +#endif +#if defined(USE_OPENSL) + opensl_init, +#endif + // TODO: should probably be preferred over OpenSLES when available. + // Initialization will fail on old android devices. +#if defined(USE_AAUDIO) + aaudio_init, +#endif +#if defined(USE_AUDIOTRACK) + audiotrack_init, +#endif +#if defined(USE_KAI) + kai_init, +#endif + }; + int i; + + if (!context) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + +#define OK(fn) assert((*context)->ops->fn) + for (i = 0; i < NELEMS(default_init); ++i) { + if (default_init[i] && default_init[i](context, context_name) == CUBEB_OK) { + /* Assert that the minimal API is implemented. */ + OK(get_backend_id); + OK(destroy); + OK(stream_init); + OK(stream_destroy); + OK(stream_start); + OK(stream_stop); + OK(stream_get_position); + return CUBEB_OK; + } + } + return CUBEB_ERROR; +} + +const char* const* +cubeb_get_backend_names() +{ + static const char* backend_names[] = { +#if defined(USE_PULSE) + "pulse", +#endif +#if defined(USE_PULSE_RUST) + "pulse-rust", +#endif +#if defined(USE_JACK) + "jack", +#endif +#if defined(USE_ALSA) + "alsa", +#endif +#if defined(USE_AUDIOUNIT) + "audiounit", +#endif +#if defined(USE_AUDIOUNIT_RUST) + "audiounit-rust", +#endif +#if defined(USE_WASAPI) + "wasapi", +#endif +#if defined(USE_WINMM) + "winmm", +#endif +#if defined(USE_SNDIO) + "sndio", +#endif +#if defined(USE_SUN) + "sun", +#endif +#if defined(USE_OPENSL) + "opensl", +#endif +#if defined(USE_OSS) + "oss", +#endif +#if defined(USE_AAUDIO) + "aaudio", +#endif +#if defined(USE_AUDIOTRACK) + "audiotrack", +#endif +#if defined(USE_KAI) + "kai", +#endif + NULL, + }; + + return backend_names; +} + +char const * +cubeb_get_backend_id(cubeb * context) +{ + if (!context) { + return NULL; + } + + return context->ops->get_backend_id(context); +} + +int +cubeb_get_max_channel_count(cubeb * context, uint32_t * max_channels) +{ + if (!context || !max_channels) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!context->ops->get_max_channel_count) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return context->ops->get_max_channel_count(context, max_channels); +} + +int +cubeb_get_min_latency(cubeb * context, cubeb_stream_params * params, + uint32_t * latency_ms) +{ + if (!context || !params || !latency_ms) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!context->ops->get_min_latency) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return context->ops->get_min_latency(context, *params, latency_ms); +} + +int +cubeb_get_preferred_sample_rate(cubeb * context, uint32_t * rate) +{ + if (!context || !rate) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!context->ops->get_preferred_sample_rate) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return context->ops->get_preferred_sample_rate(context, rate); +} + +void +cubeb_destroy(cubeb * context) +{ + if (!context) { + return; + } + + context->ops->destroy(context); +} + +int +cubeb_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency, cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + int r; + + if (!context || !stream || !data_callback || !state_callback) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if ((r = validate_stream_params(input_stream_params, output_stream_params)) != + CUBEB_OK || + (r = validate_latency(latency)) != CUBEB_OK) { + return r; + } + + r = context->ops->stream_init(context, stream, stream_name, input_device, + input_stream_params, output_device, + output_stream_params, latency, data_callback, + state_callback, user_ptr); + + if (r == CUBEB_ERROR_INVALID_FORMAT) { + LOG("Invalid format, %p %p %d %d", output_stream_params, + input_stream_params, + output_stream_params && output_stream_params->format, + input_stream_params && input_stream_params->format); + } + + return r; +} + +void +cubeb_stream_destroy(cubeb_stream * stream) +{ + if (!stream) { + return; + } + + stream->context->ops->stream_destroy(stream); +} + +int +cubeb_stream_start(cubeb_stream * stream) +{ + if (!stream) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + return stream->context->ops->stream_start(stream); +} + +int +cubeb_stream_stop(cubeb_stream * stream) +{ + if (!stream) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + return stream->context->ops->stream_stop(stream); +} + +int +cubeb_stream_get_position(cubeb_stream * stream, uint64_t * position) +{ + if (!stream || !position) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + return stream->context->ops->stream_get_position(stream, position); +} + +int +cubeb_stream_get_latency(cubeb_stream * stream, uint32_t * latency) +{ + if (!stream || !latency) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!stream->context->ops->stream_get_latency) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return stream->context->ops->stream_get_latency(stream, latency); +} + +int +cubeb_stream_get_input_latency(cubeb_stream * stream, uint32_t * latency) +{ + if (!stream || !latency) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!stream->context->ops->stream_get_input_latency) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return stream->context->ops->stream_get_input_latency(stream, latency); +} + +int +cubeb_stream_set_volume(cubeb_stream * stream, float volume) +{ + if (!stream || volume > 1.0 || volume < 0.0) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!stream->context->ops->stream_set_volume) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return stream->context->ops->stream_set_volume(stream, volume); +} + +int +cubeb_stream_set_name(cubeb_stream * stream, char const * stream_name) +{ + if (!stream || !stream_name) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!stream->context->ops->stream_set_name) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return stream->context->ops->stream_set_name(stream, stream_name); +} + +int +cubeb_stream_get_current_device(cubeb_stream * stream, + cubeb_device ** const device) +{ + if (!stream || !device) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!stream->context->ops->stream_get_current_device) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return stream->context->ops->stream_get_current_device(stream, device); +} + +int +cubeb_stream_device_destroy(cubeb_stream * stream, cubeb_device * device) +{ + if (!stream || !device) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!stream->context->ops->stream_device_destroy) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return stream->context->ops->stream_device_destroy(stream, device); +} + +int +cubeb_stream_register_device_changed_callback( + cubeb_stream * stream, + cubeb_device_changed_callback device_changed_callback) +{ + if (!stream) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (!stream->context->ops->stream_register_device_changed_callback) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return stream->context->ops->stream_register_device_changed_callback( + stream, device_changed_callback); +} + +void * +cubeb_stream_user_ptr(cubeb_stream * stream) +{ + if (!stream) { + return NULL; + } + + return stream->user_ptr; +} + +static void +log_device(cubeb_device_info * device_info) +{ + char devfmts[128] = ""; + const char *devtype, *devstate, *devdeffmt; + + switch (device_info->type) { + case CUBEB_DEVICE_TYPE_INPUT: + devtype = "input"; + break; + case CUBEB_DEVICE_TYPE_OUTPUT: + devtype = "output"; + break; + case CUBEB_DEVICE_TYPE_UNKNOWN: + default: + devtype = "unknown?"; + break; + }; + + switch (device_info->state) { + case CUBEB_DEVICE_STATE_DISABLED: + devstate = "disabled"; + break; + case CUBEB_DEVICE_STATE_UNPLUGGED: + devstate = "unplugged"; + break; + case CUBEB_DEVICE_STATE_ENABLED: + devstate = "enabled"; + break; + default: + devstate = "unknown?"; + break; + }; + + switch (device_info->default_format) { + case CUBEB_DEVICE_FMT_S16LE: + devdeffmt = "S16LE"; + break; + case CUBEB_DEVICE_FMT_S16BE: + devdeffmt = "S16BE"; + break; + case CUBEB_DEVICE_FMT_F32LE: + devdeffmt = "F32LE"; + break; + case CUBEB_DEVICE_FMT_F32BE: + devdeffmt = "F32BE"; + break; + default: + devdeffmt = "unknown?"; + break; + }; + + if (device_info->format & CUBEB_DEVICE_FMT_S16LE) { + strcat(devfmts, " S16LE"); + } + if (device_info->format & CUBEB_DEVICE_FMT_S16BE) { + strcat(devfmts, " S16BE"); + } + if (device_info->format & CUBEB_DEVICE_FMT_F32LE) { + strcat(devfmts, " F32LE"); + } + if (device_info->format & CUBEB_DEVICE_FMT_F32BE) { + strcat(devfmts, " F32BE"); + } + + LOG("DeviceID: \"%s\"%s\n" + "\tName:\t\"%s\"\n" + "\tGroup:\t\"%s\"\n" + "\tVendor:\t\"%s\"\n" + "\tType:\t%s\n" + "\tState:\t%s\n" + "\tMaximum channels:\t%u\n" + "\tFormat:\t%s (0x%x) (default: %s)\n" + "\tRate:\t[%u, %u] (default: %u)\n" + "\tLatency: lo %u frames, hi %u frames", + device_info->device_id, device_info->preferred ? " (PREFERRED)" : "", + device_info->friendly_name, device_info->group_id, + device_info->vendor_name, devtype, devstate, device_info->max_channels, + (devfmts[0] == '\0') ? devfmts : devfmts + 1, + (unsigned int)device_info->format, devdeffmt, device_info->min_rate, + device_info->max_rate, device_info->default_rate, device_info->latency_lo, + device_info->latency_hi); +} + +int +cubeb_enumerate_devices(cubeb * context, cubeb_device_type devtype, + cubeb_device_collection * collection) +{ + int rv; + if ((devtype & (CUBEB_DEVICE_TYPE_INPUT | CUBEB_DEVICE_TYPE_OUTPUT)) == 0) + return CUBEB_ERROR_INVALID_PARAMETER; + if (context == NULL || collection == NULL) + return CUBEB_ERROR_INVALID_PARAMETER; + if (!context->ops->enumerate_devices) + return CUBEB_ERROR_NOT_SUPPORTED; + + rv = context->ops->enumerate_devices(context, devtype, collection); + + if (cubeb_log_get_callback()) { + for (size_t i = 0; i < collection->count; i++) { + log_device(&collection->device[i]); + } + } + + return rv; +} + +int +cubeb_device_collection_destroy(cubeb * context, + cubeb_device_collection * collection) +{ + int r; + + if (context == NULL || collection == NULL) + return CUBEB_ERROR_INVALID_PARAMETER; + + if (!context->ops->device_collection_destroy) + return CUBEB_ERROR_NOT_SUPPORTED; + + if (!collection->device) + return CUBEB_OK; + + r = context->ops->device_collection_destroy(context, collection); + if (r == CUBEB_OK) { + collection->device = NULL; + collection->count = 0; + } + + return r; +} + +int +cubeb_register_device_collection_changed( + cubeb * context, cubeb_device_type devtype, + cubeb_device_collection_changed_callback callback, void * user_ptr) +{ + if (context == NULL || + (devtype & (CUBEB_DEVICE_TYPE_INPUT | CUBEB_DEVICE_TYPE_OUTPUT)) == 0) + return CUBEB_ERROR_INVALID_PARAMETER; + + if (!context->ops->register_device_collection_changed) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + return context->ops->register_device_collection_changed(context, devtype, + callback, user_ptr); +} + +int +cubeb_set_log_callback(cubeb_log_level log_level, + cubeb_log_callback log_callback) +{ + if (log_level < CUBEB_LOG_DISABLED || log_level > CUBEB_LOG_VERBOSE) { + return CUBEB_ERROR_INVALID_FORMAT; + } + + if (!log_callback && log_level != CUBEB_LOG_DISABLED) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (cubeb_log_get_callback() && log_callback) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + cubeb_log_set(log_level, log_callback); + + return CUBEB_OK; +} diff --git a/3rdparty/cubeb/src/cubeb_aaudio.cpp b/3rdparty/cubeb/src/cubeb_aaudio.cpp new file mode 100644 index 0000000000..2ac67c2e6c --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_aaudio.cpp @@ -0,0 +1,1507 @@ +/* ex: set tabstop=2 shiftwidth=2 expandtab: + * Copyright © 2019 Jan Kelling + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_android.h" +#include "cubeb_log.h" +#include "cubeb_resampler.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef DISABLE_LIBAAUDIO_DLOPEN +#define WRAP(x) x +#else +#define WRAP(x) (*cubeb_##x) +#define LIBAAUDIO_API_VISIT(X) \ + X(AAudio_convertResultToText) \ + X(AAudio_convertStreamStateToText) \ + X(AAudio_createStreamBuilder) \ + X(AAudioStreamBuilder_openStream) \ + X(AAudioStreamBuilder_setChannelCount) \ + X(AAudioStreamBuilder_setBufferCapacityInFrames) \ + X(AAudioStreamBuilder_setDirection) \ + X(AAudioStreamBuilder_setFormat) \ + X(AAudioStreamBuilder_setSharingMode) \ + X(AAudioStreamBuilder_setPerformanceMode) \ + X(AAudioStreamBuilder_setSampleRate) \ + X(AAudioStreamBuilder_delete) \ + X(AAudioStreamBuilder_setDataCallback) \ + X(AAudioStreamBuilder_setErrorCallback) \ + X(AAudioStream_close) \ + X(AAudioStream_read) \ + X(AAudioStream_requestStart) \ + X(AAudioStream_requestPause) \ + X(AAudioStream_setBufferSizeInFrames) \ + X(AAudioStream_getTimestamp) \ + X(AAudioStream_requestFlush) \ + X(AAudioStream_requestStop) \ + X(AAudioStream_getPerformanceMode) \ + X(AAudioStream_getSharingMode) \ + X(AAudioStream_getBufferSizeInFrames) \ + X(AAudioStream_getBufferCapacityInFrames) \ + X(AAudioStream_getSampleRate) \ + X(AAudioStream_waitForStateChange) \ + X(AAudioStream_getFramesRead) \ + X(AAudioStream_getState) \ + X(AAudioStream_getFramesWritten) \ + X(AAudioStream_getFramesPerBurst) \ + X(AAudioStreamBuilder_setInputPreset) \ + X(AAudioStreamBuilder_setUsage) + +// not needed or added later on +// X(AAudioStreamBuilder_setFramesPerDataCallback) \ + // X(AAudioStreamBuilder_setDeviceId) \ + // X(AAudioStreamBuilder_setSamplesPerFrame) \ + // X(AAudioStream_getSamplesPerFrame) \ + // X(AAudioStream_getDeviceId) \ + // X(AAudioStream_write) \ + // X(AAudioStream_getChannelCount) \ + // X(AAudioStream_getFormat) \ + // X(AAudioStream_getXRunCount) \ + // X(AAudioStream_isMMapUsed) \ + // X(AAudioStreamBuilder_setContentType) \ + // X(AAudioStreamBuilder_setSessionId) \ + // X(AAudioStream_getUsage) \ + // X(AAudioStream_getContentType) \ + // X(AAudioStream_getInputPreset) \ + // X(AAudioStream_getSessionId) \ +// END: not needed or added later on + +#define MAKE_TYPEDEF(x) static decltype(x) * cubeb_##x; +LIBAAUDIO_API_VISIT(MAKE_TYPEDEF) +#undef MAKE_TYPEDEF +#endif + +const uint8_t MAX_STREAMS = 16; + +using unique_lock = std::unique_lock; +using lock_guard = std::lock_guard; + +enum class stream_state { + INIT = 0, + STOPPED, + STOPPING, + STARTED, + STARTING, + DRAINING, + ERROR, + SHUTDOWN, +}; + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context{}; + void * user_ptr{}; + + std::atomic in_use{false}; + std::atomic state{stream_state::INIT}; + + AAudioStream * ostream{}; + AAudioStream * istream{}; + cubeb_data_callback data_callback{}; + cubeb_state_callback state_callback{}; + cubeb_resampler * resampler{}; + + // mutex synchronizes access to the stream from the state thread + // and user-called functions. Everything that is accessed in the + // aaudio data (or error) callback is synchronized only via atomics. + std::mutex mutex; + + std::unique_ptr in_buf; + unsigned in_frame_size{}; // size of one input frame + + cubeb_sample_format out_format{}; + std::atomic volume{1.f}; + unsigned out_channels{}; + unsigned out_frame_size{}; + int64_t latest_output_latency = 0; + int64_t latest_input_latency = 0; + bool voice_input; + bool voice_output; + uint64_t previous_clock; +}; + +struct cubeb { + struct cubeb_ops const * ops{}; + void * libaaudio{}; + + struct { + // The state thread: it waits for state changes and stops + // drained streams. + std::thread thread; + std::thread notifier; + std::mutex mutex; + std::condition_variable cond; + std::atomic join{false}; + std::atomic waiting{false}; + } state; + + // streams[i].in_use signals whether a stream is used + struct cubeb_stream streams[MAX_STREAMS]; +}; + +// Only allowed from state thread, while mutex on stm is locked +static void +shutdown(cubeb_stream * stm) +{ + if (stm->istream) { + WRAP(AAudioStream_requestStop)(stm->istream); + } + if (stm->ostream) { + WRAP(AAudioStream_requestStop)(stm->ostream); + } + + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + stm->state.store(stream_state::SHUTDOWN); +} + +// Returns whether the given state is one in which we wait for +// an asynchronous change +static bool +waiting_state(stream_state state) +{ + switch (state) { + case stream_state::DRAINING: + case stream_state::STARTING: + case stream_state::STOPPING: + return true; + default: + return false; + } +} + +static void +update_state(cubeb_stream * stm) +{ + // Fast path for streams that don't wait for state change or are invalid + enum stream_state old_state = stm->state.load(); + if (old_state == stream_state::INIT || old_state == stream_state::STARTED || + old_state == stream_state::STOPPED || + old_state == stream_state::SHUTDOWN) { + return; + } + + // If the main thread currently operates on this thread, we don't + // have to wait for it + unique_lock lock(stm->mutex, std::try_to_lock); + if (!lock.owns_lock()) { + return; + } + + // check again: if this is true now, the stream was destroyed or + // changed between our fast path check and locking the mutex + old_state = stm->state.load(); + if (old_state == stream_state::INIT || old_state == stream_state::STARTED || + old_state == stream_state::STOPPED || + old_state == stream_state::SHUTDOWN) { + return; + } + + // We compute the new state the stream has and then compare_exchange it + // if it has changed. This way we will never just overwrite state + // changes that were set from the audio thread in the meantime, + // such as a DRAINING or error state. + enum stream_state new_state; + do { + if (old_state == stream_state::SHUTDOWN) { + return; + } + + if (old_state == stream_state::ERROR) { + shutdown(stm); + return; + } + + new_state = old_state; + + aaudio_stream_state_t istate = 0; + aaudio_stream_state_t ostate = 0; + + // We use waitForStateChange (with zero timeout) instead of just + // getState since only the former internally updates the state. + // See the docs of aaudio getState/waitForStateChange for details, + // why we are passing STATE_UNKNOWN. + aaudio_result_t res; + if (stm->istream) { + res = WRAP(AAudioStream_waitForStateChange)( + stm->istream, AAUDIO_STREAM_STATE_UNKNOWN, &istate, 0); + if (res != AAUDIO_OK) { + LOG("AAudioStream_waitForStateChanged: %s", + WRAP(AAudio_convertResultToText)(res)); + return; + } + assert(istate); + } + + if (stm->ostream) { + res = WRAP(AAudioStream_waitForStateChange)( + stm->ostream, AAUDIO_STREAM_STATE_UNKNOWN, &ostate, 0); + if (res != AAUDIO_OK) { + LOG("AAudioStream_waitForStateChanged: %s", + WRAP(AAudio_convertResultToText)(res)); + return; + } + assert(ostate); + } + + // handle invalid stream states + if (istate == AAUDIO_STREAM_STATE_PAUSING || + istate == AAUDIO_STREAM_STATE_PAUSED || + istate == AAUDIO_STREAM_STATE_FLUSHING || + istate == AAUDIO_STREAM_STATE_FLUSHED || + istate == AAUDIO_STREAM_STATE_UNKNOWN || + istate == AAUDIO_STREAM_STATE_DISCONNECTED) { + const char * name = WRAP(AAudio_convertStreamStateToText)(istate); + LOG("Unexpected android input stream state %s", name); + shutdown(stm); + return; + } + + if (ostate == AAUDIO_STREAM_STATE_PAUSING || + ostate == AAUDIO_STREAM_STATE_PAUSED || + ostate == AAUDIO_STREAM_STATE_FLUSHING || + ostate == AAUDIO_STREAM_STATE_FLUSHED || + ostate == AAUDIO_STREAM_STATE_UNKNOWN || + ostate == AAUDIO_STREAM_STATE_DISCONNECTED) { + const char * name = WRAP(AAudio_convertStreamStateToText)(istate); + LOG("Unexpected android output stream state %s", name); + shutdown(stm); + return; + } + + switch (old_state) { + case stream_state::STARTING: + if ((!istate || istate == AAUDIO_STREAM_STATE_STARTED) && + (!ostate || ostate == AAUDIO_STREAM_STATE_STARTED)) { + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STARTED); + new_state = stream_state::STARTED; + } + break; + case stream_state::DRAINING: + // The DRAINING state means that we want to stop the streams but + // may not have done so yet. + // The aaudio docs state that returning STOP from the callback isn't + // enough, the stream has to be stopped from another thread + // afterwards. + // No callbacks are triggered anymore when requestStop returns. + // That is important as we otherwise might read from a closed istream + // for a duplex stream. + // Therefor it is important to close ostream first. + if (ostate && ostate != AAUDIO_STREAM_STATE_STOPPING && + ostate != AAUDIO_STREAM_STATE_STOPPED) { + res = WRAP(AAudioStream_requestStop)(stm->ostream); + if (res != AAUDIO_OK) { + LOG("AAudioStream_requestStop: %s", + WRAP(AAudio_convertResultToText)(res)); + return; + } + } + if (istate && istate != AAUDIO_STREAM_STATE_STOPPING && + istate != AAUDIO_STREAM_STATE_STOPPED) { + res = WRAP(AAudioStream_requestStop)(stm->istream); + if (res != AAUDIO_OK) { + LOG("AAudioStream_requestStop: %s", + WRAP(AAudio_convertResultToText)(res)); + return; + } + } + + // we always wait until both streams are stopped until we + // send CUBEB_STATE_DRAINED. Then we can directly transition + // our logical state to STOPPED, not triggering + // an additional CUBEB_STATE_STOPPED callback (which might + // be unexpected for the user). + if ((!ostate || ostate == AAUDIO_STREAM_STATE_STOPPED) && + (!istate || istate == AAUDIO_STREAM_STATE_STOPPED)) { + new_state = stream_state::STOPPED; + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + } + break; + case stream_state::STOPPING: + assert(!istate || istate == AAUDIO_STREAM_STATE_STOPPING || + istate == AAUDIO_STREAM_STATE_STOPPED); + assert(!ostate || ostate == AAUDIO_STREAM_STATE_STOPPING || + ostate == AAUDIO_STREAM_STATE_STOPPED); + if ((!istate || istate == AAUDIO_STREAM_STATE_STOPPED) && + (!ostate || ostate == AAUDIO_STREAM_STATE_STOPPED)) { + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STOPPED); + new_state = stream_state::STOPPED; + } + break; + default: + assert(false && "Unreachable: invalid state"); + } + } while (old_state != new_state && + !stm->state.compare_exchange_strong(old_state, new_state)); +} + +// See https://nyorain.github.io/lock-free-wakeup.html for a note +// why this is needed. The audio thread notifies the state thread about +// state changes and must not block. The state thread on the other hand should +// sleep until there is work to be done. So we need a lockfree producer +// and blocking producer. This can only be achieved safely with a new thread +// that only serves as notifier backup (in case the notification happens +// right between the state thread checking and going to sleep in which case +// this thread will kick in and signal it right again). +static void +notifier_thread(cubeb * ctx) +{ + unique_lock lock(ctx->state.mutex); + + while (!ctx->state.join.load()) { + ctx->state.cond.wait(lock); + if (ctx->state.waiting.load()) { + // This must signal our state thread since there is no other + // thread currently waiting on the condition variable. + // The state change thread is guaranteed to be waiting since + // we hold the mutex it locks when awake. + ctx->state.cond.notify_one(); + } + } + + // make sure other thread joins as well + ctx->state.cond.notify_one(); + LOG("Exiting notifier thread"); +} + +static void +state_thread(cubeb * ctx) +{ + unique_lock lock(ctx->state.mutex); + + bool waiting = false; + while (!ctx->state.join.load()) { + waiting |= ctx->state.waiting.load(); + if (waiting) { + ctx->state.waiting.store(false); + waiting = false; + for (unsigned i = 0u; i < MAX_STREAMS; ++i) { + cubeb_stream * stm = &ctx->streams[i]; + update_state(stm); + waiting |= waiting_state(atomic_load(&stm->state)); + } + + // state changed from another thread, update again immediately + if (ctx->state.waiting.load()) { + waiting = true; + continue; + } + + // Not waiting for any change anymore: we can wait on the + // condition variable without timeout + if (!waiting) { + continue; + } + + // while any stream is waiting for state change we sleep with regular + // timeouts. But we wake up immediately if signaled. + // This might seem like a poor man's implementation of state change + // waiting but (as of october 2020), the implementation of + // AAudioStream_waitForStateChange is just sleeping with regular + // timeouts as well: + // https://android.googlesource.com/platform/frameworks/av/+/refs/heads/master/media/libaaudio/src/core/AudioStream.cpp + auto dur = std::chrono::milliseconds(5); + ctx->state.cond.wait_for(lock, dur); + } else { + ctx->state.cond.wait(lock); + } + } + + // make sure other thread joins as well + ctx->state.cond.notify_one(); + LOG("Exiting state thread"); +} + +static char const * +aaudio_get_backend_id(cubeb * /* ctx */) +{ + return "aaudio"; +} + +static int +aaudio_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + assert(ctx && max_channels); + // NOTE: we might get more, AAudio docs don't specify anything. + *max_channels = 2; + return CUBEB_OK; +} + +static void +aaudio_destroy(cubeb * ctx) +{ + assert(ctx); + +#ifndef NDEBUG + // make sure all streams were destroyed + for (unsigned i = 0u; i < MAX_STREAMS; ++i) { + assert(!ctx->streams[i].in_use.load()); + } +#endif + + // broadcast joining to both threads + // they will additionally signal each other before joining + ctx->state.join.store(true); + ctx->state.cond.notify_all(); + + if (ctx->state.thread.joinable()) { + ctx->state.thread.join(); + } + if (ctx->state.notifier.joinable()) { + ctx->state.notifier.join(); + } +#ifndef DISABLE_LIBAAUDIO_DLOPEN + if (ctx->libaaudio) { + dlclose(ctx->libaaudio); + } +#endif + delete ctx; +} + +static void +apply_volume(cubeb_stream * stm, void * audio_data, uint32_t num_frames) +{ + float volume = stm->volume.load(); + // optimization: we don't have to change anything in this case + if (volume == 1.f) { + return; + } + + switch (stm->out_format) { + case CUBEB_SAMPLE_S16NE: + for (uint32_t i = 0u; i < num_frames * stm->out_channels; ++i) { + (static_cast(audio_data))[i] *= volume; + } + break; + case CUBEB_SAMPLE_FLOAT32NE: + for (uint32_t i = 0u; i < num_frames * stm->out_channels; ++i) { + (static_cast(audio_data))[i] *= volume; + } + break; + default: + assert(false && "Unreachable: invalid stream out_format"); + } +} + +// Returning AAUDIO_CALLBACK_RESULT_STOP seems to put the stream in +// an invalid state. Seems like an AAudio bug/bad documentation. +// We therefore only return it on error. + +static aaudio_data_callback_result_t +aaudio_duplex_data_cb(AAudioStream * astream, void * user_data, + void * audio_data, int32_t num_frames) +{ + cubeb_stream * stm = (cubeb_stream *)user_data; + assert(stm->ostream == astream); + assert(stm->istream); + assert(num_frames >= 0); + + stream_state state = atomic_load(&stm->state); + // int istate = WRAP(AAudioStream_getState)(stm->istream); + // int ostate = WRAP(AAudioStream_getState)(stm->ostream); + // ALOGV("aaudio duplex data cb on stream %p: state %ld (in: %d, out: %d), + // num_frames: %ld", + // (void*) stm, state, istate, ostate, num_frames); + + // all other states may happen since the callback might be called + // from within requestStart + assert(state != stream_state::SHUTDOWN); + + // This might happen when we started draining but not yet actually + // stopped the stream from the state thread. + if (state == stream_state::DRAINING) { + std::memset(audio_data, 0x0, num_frames * stm->out_frame_size); + return AAUDIO_CALLBACK_RESULT_CONTINUE; + } + + // The aaudio docs state that AAudioStream_read must not be called on + // the stream associated with a callback. But we call it on the input stream + // while this callback is for the output stream so this is ok. + // We also pass timeout 0, giving us strong non-blocking guarantees. + // This is exactly how it's done in the aaudio duplex example code snippet. + long in_num_frames = + WRAP(AAudioStream_read)(stm->istream, stm->in_buf.get(), num_frames, 0); + if (in_num_frames < 0) { // error + stm->state.store(stream_state::ERROR); + LOG("AAudioStream_read: %s", + WRAP(AAudio_convertResultToText)(in_num_frames)); + return AAUDIO_CALLBACK_RESULT_STOP; + } + + // This can happen shortly after starting the stream. AAudio might immediately + // begin to buffer output but not have any input ready yet. We could + // block AAudioStream_read (passing a timeout > 0) but that leads to issues + // since blocking in this callback is a bad idea in general and it might break + // the stream when it is stopped by another thread shortly after being + // started. We therefore simply send silent input to the application, as shown + // in the AAudio duplex stream code example. + if (in_num_frames < num_frames) { + // LOG("AAudioStream_read returned not enough frames: %ld instead of %d", + // in_num_frames, num_frames); + unsigned left = num_frames - in_num_frames; + char * buf = stm->in_buf.get() + in_num_frames * stm->in_frame_size; + std::memset(buf, 0x0, left * stm->in_frame_size); + in_num_frames = num_frames; + } + + long done_frames = + cubeb_resampler_fill(stm->resampler, stm->in_buf.get(), &in_num_frames, + audio_data, num_frames); + + if (done_frames < 0 || done_frames > num_frames) { + LOG("Error in data callback or resampler: %ld", done_frames); + stm->state.store(stream_state::ERROR); + return AAUDIO_CALLBACK_RESULT_STOP; + } else if (done_frames < num_frames) { + stm->state.store(stream_state::DRAINING); + stm->context->state.waiting.store(true); + stm->context->state.cond.notify_one(); + + char * begin = + static_cast(audio_data) + done_frames * stm->out_frame_size; + std::memset(begin, 0x0, (num_frames - done_frames) * stm->out_frame_size); + } + + apply_volume(stm, audio_data, done_frames); + return AAUDIO_CALLBACK_RESULT_CONTINUE; +} + +static aaudio_data_callback_result_t +aaudio_output_data_cb(AAudioStream * astream, void * user_data, + void * audio_data, int32_t num_frames) +{ + cubeb_stream * stm = (cubeb_stream *)user_data; + assert(stm->ostream == astream); + assert(!stm->istream); + assert(num_frames >= 0); + + stream_state state = stm->state.load(); + // int ostate = WRAP(AAudioStream_getState)(stm->ostream); + // ALOGV("aaudio output data cb on stream %p: state %ld (%d), num_frames: + // %ld", + // (void*) stm, state, ostate, num_frames); + + // all other states may happen since the callback might be called + // from within requestStart + assert(state != stream_state::SHUTDOWN); + + // This might happen when we started draining but not yet actually + // stopped the stream from the state thread. + if (state == stream_state::DRAINING) { + std::memset(audio_data, 0x0, num_frames * stm->out_frame_size); + return AAUDIO_CALLBACK_RESULT_CONTINUE; + } + + long done_frames = + cubeb_resampler_fill(stm->resampler, NULL, NULL, audio_data, num_frames); + if (done_frames < 0 || done_frames > num_frames) { + LOG("Error in data callback or resampler: %ld", done_frames); + stm->state.store(stream_state::ERROR); + return AAUDIO_CALLBACK_RESULT_STOP; + } else if (done_frames < num_frames) { + stm->state.store(stream_state::DRAINING); + stm->context->state.waiting.store(true); + stm->context->state.cond.notify_one(); + + char * begin = + static_cast(audio_data) + done_frames * stm->out_frame_size; + std::memset(begin, 0x0, (num_frames - done_frames) * stm->out_frame_size); + } + + apply_volume(stm, audio_data, done_frames); + return AAUDIO_CALLBACK_RESULT_CONTINUE; +} + +static aaudio_data_callback_result_t +aaudio_input_data_cb(AAudioStream * astream, void * user_data, + void * audio_data, int32_t num_frames) +{ + cubeb_stream * stm = (cubeb_stream *)user_data; + assert(stm->istream == astream); + assert(!stm->ostream); + assert(num_frames >= 0); + + stream_state state = stm->state.load(); + // int istate = WRAP(AAudioStream_getState)(stm->istream); + // ALOGV("aaudio input data cb on stream %p: state %ld (%d), num_frames: %ld", + // (void*) stm, state, istate, num_frames); + + // all other states may happen since the callback might be called + // from within requestStart + assert(state != stream_state::SHUTDOWN); + + // This might happen when we started draining but not yet actually + // STOPPED the stream from the state thread. + if (state == stream_state::DRAINING) { + return AAUDIO_CALLBACK_RESULT_CONTINUE; + } + + long input_frame_count = num_frames; + long done_frames = cubeb_resampler_fill(stm->resampler, audio_data, + &input_frame_count, NULL, 0); + if (done_frames < 0 || done_frames > num_frames) { + LOG("Error in data callback or resampler: %ld", done_frames); + stm->state.store(stream_state::ERROR); + return AAUDIO_CALLBACK_RESULT_STOP; + } else if (done_frames < input_frame_count) { + // we don't really drain an input stream, just have to + // stop it from the state thread. That is signaled via the + // DRAINING state. + stm->state.store(stream_state::DRAINING); + stm->context->state.waiting.store(true); + stm->context->state.cond.notify_one(); + } + + return AAUDIO_CALLBACK_RESULT_CONTINUE; +} + +static void +aaudio_error_cb(AAudioStream * astream, void * user_data, aaudio_result_t error) +{ + cubeb_stream * stm = static_cast(user_data); + assert(stm->ostream == astream || stm->istream == astream); + LOG("AAudio error callback: %s", WRAP(AAudio_convertResultToText)(error)); + stm->state.store(stream_state::ERROR); +} + +static int +realize_stream(AAudioStreamBuilder * sb, const cubeb_stream_params * params, + AAudioStream ** stream, unsigned * frame_size) +{ + aaudio_result_t res; + assert(params->rate); + assert(params->channels); + + WRAP(AAudioStreamBuilder_setSampleRate)(sb, params->rate); + WRAP(AAudioStreamBuilder_setChannelCount)(sb, params->channels); + + aaudio_format_t fmt; + switch (params->format) { + case CUBEB_SAMPLE_S16NE: + fmt = AAUDIO_FORMAT_PCM_I16; + *frame_size = sizeof(int16_t) * params->channels; + break; + case CUBEB_SAMPLE_FLOAT32NE: + fmt = AAUDIO_FORMAT_PCM_FLOAT; + *frame_size = sizeof(float) * params->channels; + break; + default: + return CUBEB_ERROR_INVALID_FORMAT; + } + + WRAP(AAudioStreamBuilder_setFormat)(sb, fmt); + res = WRAP(AAudioStreamBuilder_openStream)(sb, stream); + if (res == AAUDIO_ERROR_INVALID_FORMAT) { + LOG("AAudio device doesn't support output format %d", fmt); + return CUBEB_ERROR_INVALID_FORMAT; + } else if (params->rate && res == AAUDIO_ERROR_INVALID_RATE) { + // The requested rate is not supported. + // Just try again with default rate, we create a resampler anyways + WRAP(AAudioStreamBuilder_setSampleRate)(sb, AAUDIO_UNSPECIFIED); + res = WRAP(AAudioStreamBuilder_openStream)(sb, stream); + LOG("Requested rate of %u is not supported, inserting resampler", + params->rate); + } + + // When the app has no permission to record audio + // (android.permission.RECORD_AUDIO) but requested and input stream, this will + // return INVALID_ARGUMENT. + if (res != AAUDIO_OK) { + LOG("AAudioStreamBuilder_openStream: %s", + WRAP(AAudio_convertResultToText)(res)); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +static void +aaudio_stream_destroy(cubeb_stream * stm) +{ + lock_guard lock(stm->mutex); + assert(stm->state == stream_state::STOPPED || + stm->state == stream_state::STOPPING || + stm->state == stream_state::INIT || + stm->state == stream_state::DRAINING || + stm->state == stream_state::ERROR || + stm->state == stream_state::SHUTDOWN); + + aaudio_result_t res; + + // No callbacks are triggered anymore when requestStop returns. + // That is important as we otherwise might read from a closed istream + // for a duplex stream. + if (stm->ostream) { + if (stm->state != stream_state::STOPPED && + stm->state != stream_state::STOPPING && + stm->state != stream_state::SHUTDOWN) { + res = WRAP(AAudioStream_requestStop)(stm->ostream); + if (res != AAUDIO_OK) { + LOG("AAudioStreamBuilder_requestStop: %s", + WRAP(AAudio_convertResultToText)(res)); + } + } + + WRAP(AAudioStream_close)(stm->ostream); + stm->ostream = NULL; + } + + if (stm->istream) { + if (stm->state != stream_state::STOPPED && + stm->state != stream_state::STOPPING && + stm->state != stream_state::SHUTDOWN) { + res = WRAP(AAudioStream_requestStop)(stm->istream); + if (res != AAUDIO_OK) { + LOG("AAudioStreamBuilder_requestStop: %s", + WRAP(AAudio_convertResultToText)(res)); + } + } + + WRAP(AAudioStream_close)(stm->istream); + stm->istream = NULL; + } + + if (stm->resampler) { + cubeb_resampler_destroy(stm->resampler); + stm->resampler = NULL; + } + + stm->in_buf = {}; + stm->in_frame_size = {}; + stm->out_format = {}; + stm->out_channels = {}; + stm->out_frame_size = {}; + + stm->state.store(stream_state::INIT); + stm->in_use.store(false); +} + +static int +aaudio_stream_init_impl(cubeb_stream * stm, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames) +{ + assert(stm->state.load() == stream_state::INIT); + stm->in_use.store(true); + + aaudio_result_t res; + AAudioStreamBuilder * sb; + res = WRAP(AAudio_createStreamBuilder)(&sb); + if (res != AAUDIO_OK) { + LOG("AAudio_createStreamBuilder: %s", + WRAP(AAudio_convertResultToText)(res)); + return CUBEB_ERROR; + } + + // make sure the builder is always destroyed + struct StreamBuilderDestructor { + void operator()(AAudioStreamBuilder * sb) + { + WRAP(AAudioStreamBuilder_delete)(sb); + } + }; + + std::unique_ptr sbPtr(sb); + + WRAP(AAudioStreamBuilder_setErrorCallback)(sb, aaudio_error_cb, stm); + WRAP(AAudioStreamBuilder_setBufferCapacityInFrames)(sb, latency_frames); + + AAudioStream_dataCallback in_data_callback{}; + AAudioStream_dataCallback out_data_callback{}; + if (output_stream_params && input_stream_params) { + out_data_callback = aaudio_duplex_data_cb; + in_data_callback = NULL; + } else if (input_stream_params) { + in_data_callback = aaudio_input_data_cb; + } else if (output_stream_params) { + out_data_callback = aaudio_output_data_cb; + } else { + LOG("Tried to open stream without input or output parameters"); + return CUBEB_ERROR; + } + +#ifdef CUBEB_AAUDIO_EXCLUSIVE_STREAM + LOG("AAudio setting exclusive share mode for stream"); + WRAP(AAudioStreamBuilder_setSharingMode)(sb, AAUDIO_SHARING_MODE_EXCLUSIVE); +#endif + + if (latency_frames <= POWERSAVE_LATENCY_FRAMES_THRESHOLD) { + LOG("AAudio setting low latency mode for stream"); + WRAP(AAudioStreamBuilder_setPerformanceMode) + (sb, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY); + } else { + LOG("AAudio setting power saving mode for stream"); + WRAP(AAudioStreamBuilder_setPerformanceMode) + (sb, AAUDIO_PERFORMANCE_MODE_POWER_SAVING); + } + + unsigned frame_size; + + // initialize streams + // output + uint32_t target_sample_rate = 0; + cubeb_stream_params out_params; + if (output_stream_params) { + int output_preset = stm->voice_output ? AAUDIO_USAGE_VOICE_COMMUNICATION + : AAUDIO_USAGE_MEDIA; + WRAP(AAudioStreamBuilder_setUsage)(sb, output_preset); + WRAP(AAudioStreamBuilder_setDirection)(sb, AAUDIO_DIRECTION_OUTPUT); + WRAP(AAudioStreamBuilder_setDataCallback)(sb, out_data_callback, stm); + int res_err = + realize_stream(sb, output_stream_params, &stm->ostream, &frame_size); + if (res_err) { + return res_err; + } + + // output debug information + aaudio_sharing_mode_t sm = WRAP(AAudioStream_getSharingMode)(stm->ostream); + aaudio_performance_mode_t pm = + WRAP(AAudioStream_getPerformanceMode)(stm->ostream); + int bcap = WRAP(AAudioStream_getBufferCapacityInFrames)(stm->ostream); + int bsize = WRAP(AAudioStream_getBufferSizeInFrames)(stm->ostream); + int rate = WRAP(AAudioStream_getSampleRate)(stm->ostream); + LOG("AAudio output stream sharing mode: %d", sm); + LOG("AAudio output stream performance mode: %d", pm); + LOG("AAudio output stream buffer capacity: %d", bcap); + LOG("AAudio output stream buffer size: %d", bsize); + LOG("AAudio output stream buffer rate: %d", rate); + + target_sample_rate = output_stream_params->rate; + out_params = *output_stream_params; + out_params.rate = rate; + + stm->out_channels = output_stream_params->channels; + stm->out_format = output_stream_params->format; + stm->out_frame_size = frame_size; + stm->volume.store(1.f); + } + + // input + cubeb_stream_params in_params; + if (input_stream_params) { + // Match what the OpenSL backend does for now, we could use UNPROCESSED and + // VOICE_COMMUNICATION here, but we'd need to make it clear that + // application-level AEC and other voice processing should be disabled + // there. + int input_preset = stm->voice_input ? AAUDIO_INPUT_PRESET_VOICE_RECOGNITION + : AAUDIO_INPUT_PRESET_CAMCORDER; + WRAP(AAudioStreamBuilder_setInputPreset)(sb, input_preset); + WRAP(AAudioStreamBuilder_setDirection)(sb, AAUDIO_DIRECTION_INPUT); + WRAP(AAudioStreamBuilder_setDataCallback)(sb, in_data_callback, stm); + int res_err = + realize_stream(sb, input_stream_params, &stm->istream, &frame_size); + if (res_err) { + return res_err; + } + + // output debug information + aaudio_sharing_mode_t sm = WRAP(AAudioStream_getSharingMode)(stm->istream); + aaudio_performance_mode_t pm = + WRAP(AAudioStream_getPerformanceMode)(stm->istream); + int bcap = WRAP(AAudioStream_getBufferCapacityInFrames)(stm->istream); + int bsize = WRAP(AAudioStream_getBufferSizeInFrames)(stm->istream); + int rate = WRAP(AAudioStream_getSampleRate)(stm->istream); + LOG("AAudio input stream sharing mode: %d", sm); + LOG("AAudio input stream performance mode: %d", pm); + LOG("AAudio input stream buffer capacity: %d", bcap); + LOG("AAudio input stream buffer size: %d", bsize); + LOG("AAudio input stream buffer rate: %d", rate); + + stm->in_buf.reset(new char[bcap * frame_size]()); + assert(!target_sample_rate || + target_sample_rate == input_stream_params->rate); + + target_sample_rate = input_stream_params->rate; + in_params = *input_stream_params; + in_params.rate = rate; + stm->in_frame_size = frame_size; + } + + // initialize resampler + stm->resampler = cubeb_resampler_create( + stm, input_stream_params ? &in_params : NULL, + output_stream_params ? &out_params : NULL, target_sample_rate, + stm->data_callback, stm->user_ptr, CUBEB_RESAMPLER_QUALITY_DEFAULT, + CUBEB_RESAMPLER_RECLOCK_NONE); + + if (!stm->resampler) { + LOG("Failed to create resampler"); + return CUBEB_ERROR; + } + + // the stream isn't started initially. We don't need to differentiate + // between a stream that was just initialized and one that played + // already but was stopped. + stm->state.store(stream_state::STOPPED); + LOG("Cubeb stream (%p) INIT success", (void *)stm); + return CUBEB_OK; +} + +static int +aaudio_stream_init(cubeb * ctx, cubeb_stream ** stream, + char const * /* stream_name */, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + assert(!input_device); + assert(!output_device); + + // atomically find a free stream. + cubeb_stream * stm = NULL; + unique_lock lock; + for (unsigned i = 0u; i < MAX_STREAMS; ++i) { + // This check is only an optimization, we don't strictly need it + // since we check again after locking the mutex. + if (ctx->streams[i].in_use.load()) { + continue; + } + + // if this fails, another thread initialized this stream + // between our check of in_use and this. + lock = unique_lock(ctx->streams[i].mutex, std::try_to_lock); + if (!lock.owns_lock()) { + continue; + } + + if (ctx->streams[i].in_use.load()) { + lock = {}; + continue; + } + + stm = &ctx->streams[i]; + break; + } + + if (!stm) { + LOG("Error: maximum number of streams reached"); + return CUBEB_ERROR; + } + + stm->context = ctx; + stm->user_ptr = user_ptr; + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->voice_input = input_stream_params && + !!(input_stream_params->prefs & CUBEB_STREAM_PREF_VOICE); + stm->voice_output = output_stream_params && + !!(output_stream_params->prefs & CUBEB_STREAM_PREF_VOICE); + stm->previous_clock = 0; + + LOG("cubeb stream prefs: voice_input: %s voice_output: %s", + stm->voice_input ? "true" : "false", + stm->voice_output ? "true" : "false"); + + int err = aaudio_stream_init_impl(stm, input_device, input_stream_params, + output_device, output_stream_params, + latency_frames); + if (err != CUBEB_OK) { + // This is needed since aaudio_stream_destroy will lock the mutex again. + // It's no problem that there is a gap in between as the stream isn't + // actually in u se. + lock.unlock(); + aaudio_stream_destroy(stm); + return err; + } + + *stream = stm; + return CUBEB_OK; +} + +static int +aaudio_stream_start(cubeb_stream * stm) +{ + assert(stm && stm->in_use.load()); + lock_guard lock(stm->mutex); + + stream_state state = stm->state.load(); + int istate = stm->istream ? WRAP(AAudioStream_getState)(stm->istream) : 0; + int ostate = stm->ostream ? WRAP(AAudioStream_getState)(stm->ostream) : 0; + LOGV("STARTING stream %p: %d (%d %d)", (void *)stm, state, istate, ostate); + + switch (state) { + case stream_state::STARTED: + case stream_state::STARTING: + LOG("cubeb stream %p already STARTING/STARTED", (void *)stm); + return CUBEB_OK; + case stream_state::ERROR: + case stream_state::SHUTDOWN: + return CUBEB_ERROR; + case stream_state::INIT: + assert(false && "Invalid stream"); + return CUBEB_ERROR; + case stream_state::STOPPED: + case stream_state::STOPPING: + case stream_state::DRAINING: + break; + } + + aaudio_result_t res; + + // Important to start istream before ostream. + // As soon as we start ostream, the callbacks might be triggered an we + // might read from istream (on duplex). If istream wasn't started yet + // this is a problem. + if (stm->istream) { + res = WRAP(AAudioStream_requestStart)(stm->istream); + if (res != AAUDIO_OK) { + LOG("AAudioStream_requestStart (istream): %s", + WRAP(AAudio_convertResultToText)(res)); + stm->state.store(stream_state::ERROR); + return CUBEB_ERROR; + } + } + + if (stm->ostream) { + res = WRAP(AAudioStream_requestStart)(stm->ostream); + if (res != AAUDIO_OK) { + LOG("AAudioStream_requestStart (ostream): %s", + WRAP(AAudio_convertResultToText)(res)); + stm->state.store(stream_state::ERROR); + return CUBEB_ERROR; + } + } + + int ret = CUBEB_OK; + bool success; + + while (!(success = stm->state.compare_exchange_strong( + state, stream_state::STARTING))) { + // we land here only if the state has changed in the meantime + switch (state) { + // If an error ocurred in the meantime, we can't change that. + // The stream will be stopped when shut down. + case stream_state::ERROR: + ret = CUBEB_ERROR; + break; + // The only situation in which the state could have switched to draining + // is if the callback was already fired and requested draining. Don't + // overwrite that. It's not an error either though. + case stream_state::DRAINING: + break; + + // If the state switched [DRAINING -> STOPPING] or [DRAINING/STOPPING -> + // STOPPED] in the meantime, we can simply overwrite that since we restarted + // the stream. + case stream_state::STOPPING: + case stream_state::STOPPED: + continue; + + // There is no situation in which the state could have been valid before + // but now in shutdown mode, since we hold the streams mutex. + // There is also no way that it switched *into* STARTING or + // STARTED mode. + default: + assert(false && "Invalid state change"); + ret = CUBEB_ERROR; + break; + } + + break; + } + + if (success) { + stm->context->state.waiting.store(true); + stm->context->state.cond.notify_one(); + } + + return ret; +} + +static int +aaudio_stream_stop(cubeb_stream * stm) +{ + assert(stm && stm->in_use.load()); + lock_guard lock(stm->mutex); + + stream_state state = stm->state.load(); + int istate = stm->istream ? WRAP(AAudioStream_getState)(stm->istream) : 0; + int ostate = stm->ostream ? WRAP(AAudioStream_getState)(stm->ostream) : 0; + LOGV("STOPPING stream %p: %d (%d %d)", (void *)stm, state, istate, ostate); + + switch (state) { + case stream_state::STOPPED: + case stream_state::STOPPING: + case stream_state::DRAINING: + LOG("cubeb stream %p already STOPPING/STOPPED", (void *)stm); + return CUBEB_OK; + case stream_state::ERROR: + case stream_state::SHUTDOWN: + return CUBEB_ERROR; + case stream_state::INIT: + assert(false && "Invalid stream"); + return CUBEB_ERROR; + case stream_state::STARTED: + case stream_state::STARTING: + break; + } + + aaudio_result_t res; + + // No callbacks are triggered anymore when requestStop returns. + // That is important as we otherwise might read from a closed istream + // for a duplex stream. + // Therefor it is important to close ostream first. + if (stm->ostream) { + // Could use pause + flush here as well, the public cubeb interface + // doesn't state behavior. + res = WRAP(AAudioStream_requestStop)(stm->ostream); + if (res != AAUDIO_OK) { + LOG("AAudioStream_requestStop (ostream): %s", + WRAP(AAudio_convertResultToText)(res)); + stm->state.store(stream_state::ERROR); + return CUBEB_ERROR; + } + } + + if (stm->istream) { + res = WRAP(AAudioStream_requestStop)(stm->istream); + if (res != AAUDIO_OK) { + LOG("AAudioStream_requestStop (istream): %s", + WRAP(AAudio_convertResultToText)(res)); + stm->state.store(stream_state::ERROR); + return CUBEB_ERROR; + } + } + + int ret = CUBEB_OK; + bool success; + while (!(success = atomic_compare_exchange_strong(&stm->state, &state, + stream_state::STOPPING))) { + // we land here only if the state has changed in the meantime + switch (state) { + // If an error ocurred in the meantime, we can't change that. + // The stream will be STOPPED when shut down. + case stream_state::ERROR: + ret = CUBEB_ERROR; + break; + // If it was switched to DRAINING in the meantime, it was or + // will be STOPPED soon anyways. We don't interfere with + // the DRAINING process, no matter in which state. + // Not an error + case stream_state::DRAINING: + case stream_state::STOPPING: + case stream_state::STOPPED: + break; + + // If the state switched from STARTING to STARTED in the meantime + // we can simply overwrite that since we just STOPPED it. + case stream_state::STARTED: + continue; + + // There is no situation in which the state could have been valid before + // but now in shutdown mode, since we hold the streams mutex. + // There is also no way that it switched *into* STARTING mode. + default: + assert(false && "Invalid state change"); + ret = CUBEB_ERROR; + break; + } + + break; + } + + if (success) { + stm->context->state.waiting.store(true); + stm->context->state.cond.notify_one(); + } + + return ret; +} + +static int +aaudio_stream_get_position(cubeb_stream * stm, uint64_t * position) +{ + assert(stm && stm->in_use.load()); + lock_guard lock(stm->mutex); + + stream_state state = stm->state.load(); + AAudioStream * stream = stm->ostream ? stm->ostream : stm->istream; + switch (state) { + case stream_state::ERROR: + case stream_state::SHUTDOWN: + return CUBEB_ERROR; + case stream_state::DRAINING: + case stream_state::STOPPED: + case stream_state::STOPPING: + // getTimestamp is only valid when the stream is playing. + // Simply return the number of frames passed to aaudio + *position = WRAP(AAudioStream_getFramesRead)(stream); + if (*position < stm->previous_clock) { + *position = stm->previous_clock; + } else { + stm->previous_clock = *position; + } + return CUBEB_OK; + case stream_state::INIT: + assert(false && "Invalid stream"); + return CUBEB_ERROR; + case stream_state::STARTED: + case stream_state::STARTING: + break; + } + + int64_t pos; + int64_t ns; + aaudio_result_t res; + res = WRAP(AAudioStream_getTimestamp)(stream, CLOCK_MONOTONIC, &pos, &ns); + if (res != AAUDIO_OK) { + // When the audio stream is not running, invalid_state is returned and we + // simply fall back to the method we use for non-playing streams. + if (res == AAUDIO_ERROR_INVALID_STATE) { + *position = WRAP(AAudioStream_getFramesRead)(stream); + if (*position < stm->previous_clock) { + *position = stm->previous_clock; + } else { + stm->previous_clock = *position; + } + return CUBEB_OK; + } + + LOG("AAudioStream_getTimestamp: %s", WRAP(AAudio_convertResultToText)(res)); + return CUBEB_ERROR; + } + + *position = pos; + if (*position < stm->previous_clock) { + *position = stm->previous_clock; + } else { + stm->previous_clock = *position; + } + return CUBEB_OK; +} + +static int +aaudio_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +{ + int64_t pos; + int64_t ns; + aaudio_result_t res; + + if (!stm->ostream) { + LOG("error: aaudio_stream_get_latency on input-only stream"); + return CUBEB_ERROR; + } + + res = + WRAP(AAudioStream_getTimestamp)(stm->ostream, CLOCK_MONOTONIC, &pos, &ns); + if (res != AAUDIO_OK) { + LOG("aaudio_stream_get_latency, AAudioStream_getTimestamp: %s, returning " + "memoized value", + WRAP(AAudio_convertResultToText)(res)); + // Expected when the stream is paused. + *latency = stm->latest_output_latency; + return CUBEB_OK; + } + + int64_t read = WRAP(AAudioStream_getFramesRead)(stm->ostream); + + *latency = stm->latest_output_latency = read - pos; + LOG("aaudio_stream_get_latency, %u", *latency); + + return CUBEB_OK; +} + +static int +aaudio_stream_get_input_latency(cubeb_stream * stm, uint32_t * latency) +{ + int64_t pos; + int64_t ns; + aaudio_result_t res; + + if (!stm->istream) { + LOG("error: aaudio_stream_get_input_latency on an ouput-only stream"); + return CUBEB_ERROR; + } + + res = + WRAP(AAudioStream_getTimestamp)(stm->istream, CLOCK_MONOTONIC, &pos, &ns); + if (res != AAUDIO_OK) { + // Expected when the stream is paused. + LOG("aaudio_stream_get_input_latency, AAudioStream_getTimestamp: %s, " + "returning memoized value", + WRAP(AAudio_convertResultToText)(res)); + *latency = stm->latest_input_latency; + return CUBEB_OK; + } + + int64_t written = WRAP(AAudioStream_getFramesWritten)(stm->istream); + + *latency = stm->latest_input_latency = written - pos; + LOG("aaudio_stream_get_input_latency, %u", *latency); + + return CUBEB_OK; +} + +static int +aaudio_stream_set_volume(cubeb_stream * stm, float volume) +{ + assert(stm && stm->in_use.load() && stm->ostream); + stm->volume.store(volume); + return CUBEB_OK; +} + +aaudio_data_callback_result_t +dummy_callback(AAudioStream * stream, void * userData, void * audioData, + int32_t numFrames) +{ + return AAUDIO_CALLBACK_RESULT_STOP; +} + +// Returns a dummy stream with all default settings +static AAudioStream * +init_dummy_stream() +{ + AAudioStreamBuilder * streamBuilder; + aaudio_result_t res; + res = WRAP(AAudio_createStreamBuilder)(&streamBuilder); + if (res != AAUDIO_OK) { + LOG("init_dummy_stream: AAudio_createStreamBuilder: %s", + WRAP(AAudio_convertResultToText)(res)); + return nullptr; + } + WRAP(AAudioStreamBuilder_setDataCallback) + (streamBuilder, dummy_callback, nullptr); + WRAP(AAudioStreamBuilder_setPerformanceMode) + (streamBuilder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY); + + AAudioStream * stream; + res = WRAP(AAudioStreamBuilder_openStream)(streamBuilder, &stream); + if (res != AAUDIO_OK) { + LOG("init_dummy_stream: AAudioStreamBuilder_openStream %s", + WRAP(AAudio_convertResultToText)(res)); + return nullptr; + } + WRAP(AAudioStreamBuilder_delete)(streamBuilder); + + return stream; +} + +static void +destroy_dummy_stream(AAudioStream * stream) +{ + WRAP(AAudioStream_close)(stream); +} + +static int +aaudio_get_min_latency(cubeb * ctx, cubeb_stream_params params, + uint32_t * latency_frames) +{ + AAudioStream * stream = init_dummy_stream(); + + if (!stream) { + return CUBEB_ERROR; + } + + // https://android.googlesource.com/platform/compatibility/cdd/+/refs/heads/master/5_multimedia/5_6_audio-latency.md + *latency_frames = WRAP(AAudioStream_getFramesPerBurst)(stream); + + LOG("aaudio_get_min_latency: %u frames", *latency_frames); + + destroy_dummy_stream(stream); + + return CUBEB_OK; +} + +int +aaudio_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) +{ + AAudioStream * stream = init_dummy_stream(); + + if (!stream) { + return CUBEB_ERROR; + } + + *rate = WRAP(AAudioStream_getSampleRate)(stream); + + LOG("aaudio_get_preferred_sample_rate %uHz", *rate); + + destroy_dummy_stream(stream); + + return CUBEB_OK; +} + +extern "C" int +aaudio_init(cubeb ** context, char const * context_name); + +const static struct cubeb_ops aaudio_ops = { + /*.init =*/aaudio_init, + /*.get_backend_id =*/aaudio_get_backend_id, + /*.get_max_channel_count =*/aaudio_get_max_channel_count, + /* .get_min_latency =*/aaudio_get_min_latency, + /*.get_preferred_sample_rate =*/aaudio_get_preferred_sample_rate, + /*.enumerate_devices =*/NULL, + /*.device_collection_destroy =*/NULL, + /*.destroy =*/aaudio_destroy, + /*.stream_init =*/aaudio_stream_init, + /*.stream_destroy =*/aaudio_stream_destroy, + /*.stream_start =*/aaudio_stream_start, + /*.stream_stop =*/aaudio_stream_stop, + /*.stream_get_position =*/aaudio_stream_get_position, + /*.stream_get_latency =*/aaudio_stream_get_latency, + /*.stream_get_input_latency =*/aaudio_stream_get_input_latency, + /*.stream_set_volume =*/aaudio_stream_set_volume, + /*.stream_set_name =*/NULL, + /*.stream_get_current_device =*/NULL, + /*.stream_device_destroy =*/NULL, + /*.stream_register_device_changed_callback =*/NULL, + /*.register_device_collection_changed =*/NULL}; + +extern "C" /*static*/ int +aaudio_init(cubeb ** context, char const * /* context_name */) +{ + // load api + void * libaaudio = NULL; +#ifndef DISABLE_LIBAAUDIO_DLOPEN + libaaudio = dlopen("libaaudio.so", RTLD_NOW); + if (!libaaudio) { + return CUBEB_ERROR; + } + +#define LOAD(x) \ + { \ + cubeb_##x = (decltype(x) *)(dlsym(libaaudio, #x)); \ + if (!WRAP(x)) { \ + LOG("AAudio: Failed to load %s", #x); \ + dlclose(libaaudio); \ + return CUBEB_ERROR; \ + } \ + } + + LIBAAUDIO_API_VISIT(LOAD); +#undef LOAD +#endif + + cubeb * ctx = new cubeb; + ctx->ops = &aaudio_ops; + ctx->libaaudio = libaaudio; + + ctx->state.thread = std::thread(state_thread, ctx); + + // NOTE: using platform-specific APIs we could set the priority of the + // notifier thread lower than the priority of the state thread. + // This way, it's more likely that the state thread will be woken up + // by the condition variable signal when both are currently waiting + ctx->state.notifier = std::thread(notifier_thread, ctx); + + *context = ctx; + return CUBEB_OK; +} diff --git a/3rdparty/cubeb/src/cubeb_alsa.c b/3rdparty/cubeb/src/cubeb_alsa.c new file mode 100644 index 0000000000..7481c1668e --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_alsa.c @@ -0,0 +1,1487 @@ +/* + * Copyright © 2011 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#undef NDEBUG +#define _DEFAULT_SOURCE +#define _BSD_SOURCE +#define _XOPEN_SOURCE 500 +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_tracing.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef DISABLE_LIBASOUND_DLOPEN +#define WRAP(x) x +#else +#define WRAP(x) (*cubeb_##x) +#define LIBASOUND_API_VISIT(X) \ + X(snd_config) \ + X(snd_config_add) \ + X(snd_config_copy) \ + X(snd_config_delete) \ + X(snd_config_get_id) \ + X(snd_config_get_string) \ + X(snd_config_imake_integer) \ + X(snd_config_search) \ + X(snd_config_search_definition) \ + X(snd_lib_error_set_handler) \ + X(snd_pcm_avail_update) \ + X(snd_pcm_close) \ + X(snd_pcm_delay) \ + X(snd_pcm_drain) \ + X(snd_pcm_frames_to_bytes) \ + X(snd_pcm_get_params) \ + X(snd_pcm_hw_params_any) \ + X(snd_pcm_hw_params_get_channels_max) \ + X(snd_pcm_hw_params_get_rate) \ + X(snd_pcm_hw_params_set_rate_near) \ + X(snd_pcm_hw_params_sizeof) \ + X(snd_pcm_nonblock) \ + X(snd_pcm_open) \ + X(snd_pcm_open_lconf) \ + X(snd_pcm_pause) \ + X(snd_pcm_poll_descriptors) \ + X(snd_pcm_poll_descriptors_count) \ + X(snd_pcm_poll_descriptors_revents) \ + X(snd_pcm_readi) \ + X(snd_pcm_recover) \ + X(snd_pcm_set_params) \ + X(snd_pcm_start) \ + X(snd_pcm_state) \ + X(snd_pcm_writei) + +#define MAKE_TYPEDEF(x) static typeof(x) * cubeb_##x; +LIBASOUND_API_VISIT(MAKE_TYPEDEF); +#undef MAKE_TYPEDEF +/* snd_pcm_hw_params_alloca is actually a macro */ +#define snd_pcm_hw_params_sizeof cubeb_snd_pcm_hw_params_sizeof +#endif + +#define CUBEB_STREAM_MAX 16 +#define CUBEB_WATCHDOG_MS 10000 + +#define CUBEB_ALSA_PCM_NAME "default" + +#define ALSA_PA_PLUGIN "ALSA <-> PulseAudio PCM I/O Plugin" + +/* ALSA is not thread-safe. snd_pcm_t instances are individually protected + by the owning cubeb_stream's mutex. snd_pcm_t creation and destruction + is not thread-safe until ALSA 1.0.24 (see alsa-lib.git commit 91c9c8f1), + so those calls must be wrapped in the following mutex. */ +static pthread_mutex_t cubeb_alsa_mutex = PTHREAD_MUTEX_INITIALIZER; +static int cubeb_alsa_error_handler_set = 0; + +static struct cubeb_ops const alsa_ops; + +struct cubeb { + struct cubeb_ops const * ops; + void * libasound; + + pthread_t thread; + + /* Mutex for streams array, must not be held while blocked in poll(2). */ + pthread_mutex_t mutex; + + /* Sparse array of streams managed by this context. */ + cubeb_stream * streams[CUBEB_STREAM_MAX]; + + /* fds and nfds are only updated by alsa_run when rebuild is set. */ + struct pollfd * fds; + nfds_t nfds; + int rebuild; + + int shutdown; + + /* Control pipe for forcing poll to wake and rebuild fds or recalculate the + * timeout. */ + int control_fd_read; + int control_fd_write; + + /* Track number of active streams. This is limited to CUBEB_STREAM_MAX + due to resource contraints. */ + unsigned int active_streams; + + /* Local configuration with handle_underrun workaround set for PulseAudio + ALSA plugin. Will be NULL if the PA ALSA plugin is not in use or the + workaround is not required. */ + snd_config_t * local_config; + int is_pa; +}; + +enum stream_state { INACTIVE, RUNNING, DRAINING, PROCESSING, ERROR }; + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context; + void * user_ptr; + /**/ + pthread_mutex_t mutex; + snd_pcm_t * pcm; + cubeb_data_callback data_callback; + cubeb_state_callback state_callback; + snd_pcm_uframes_t stream_position; + snd_pcm_uframes_t last_position; + snd_pcm_uframes_t buffer_size; + cubeb_stream_params params; + + /* Every member after this comment is protected by the owning context's + mutex rather than the stream's mutex, or is only used on the context's + run thread. */ + pthread_cond_t cond; /* Signaled when the stream's state is changed. */ + + enum stream_state state; + + struct pollfd * saved_fds; /* A copy of the pollfds passed in at init time. */ + struct pollfd * + fds; /* Pointer to this waitable's pollfds within struct cubeb's fds. */ + nfds_t nfds; + + struct timeval drain_timeout; + + /* XXX: Horrible hack -- if an active stream has been idle for + CUBEB_WATCHDOG_MS it will be disabled and the error callback will be + called. This works around a bug seen with older versions of ALSA and + PulseAudio where streams would stop requesting new data despite still + being logically active and playing. */ + struct timeval last_activity; + float volume; + + char * buffer; + snd_pcm_uframes_t bufframes; + snd_pcm_stream_t stream_type; + + struct cubeb_stream * other_stream; +}; + +static int +any_revents(struct pollfd * fds, nfds_t nfds) +{ + nfds_t i; + + for (i = 0; i < nfds; ++i) { + if (fds[i].revents) { + return 1; + } + } + + return 0; +} + +static int +cmp_timeval(struct timeval * a, struct timeval * b) +{ + if (a->tv_sec == b->tv_sec) { + if (a->tv_usec == b->tv_usec) { + return 0; + } + return a->tv_usec > b->tv_usec ? 1 : -1; + } + return a->tv_sec > b->tv_sec ? 1 : -1; +} + +static int +timeval_to_relative_ms(struct timeval * tv) +{ + struct timeval now; + struct timeval dt; + long long t; + int r; + + gettimeofday(&now, NULL); + r = cmp_timeval(tv, &now); + if (r >= 0) { + timersub(tv, &now, &dt); + } else { + timersub(&now, tv, &dt); + } + t = dt.tv_sec; + t *= 1000; + t += (dt.tv_usec + 500) / 1000; + + if (t > INT_MAX) { + t = INT_MAX; + } else if (t < INT_MIN) { + t = INT_MIN; + } + + return r >= 0 ? t : -t; +} + +static int +ms_until(struct timeval * tv) +{ + return timeval_to_relative_ms(tv); +} + +static int +ms_since(struct timeval * tv) +{ + return -timeval_to_relative_ms(tv); +} + +static void +rebuild(cubeb * ctx) +{ + nfds_t nfds; + int i; + nfds_t j; + cubeb_stream * stm; + + assert(ctx->rebuild); + + /* Always count context's control pipe fd. */ + nfds = 1; + for (i = 0; i < CUBEB_STREAM_MAX; ++i) { + stm = ctx->streams[i]; + if (stm) { + stm->fds = NULL; + if (stm->state == RUNNING) { + nfds += stm->nfds; + } + } + } + + free(ctx->fds); + ctx->fds = calloc(nfds, sizeof(struct pollfd)); + assert(ctx->fds); + ctx->nfds = nfds; + + /* Include context's control pipe fd. */ + ctx->fds[0].fd = ctx->control_fd_read; + ctx->fds[0].events = POLLIN | POLLERR; + + for (i = 0, j = 1; i < CUBEB_STREAM_MAX; ++i) { + stm = ctx->streams[i]; + if (stm && stm->state == RUNNING) { + memcpy(&ctx->fds[j], stm->saved_fds, stm->nfds * sizeof(struct pollfd)); + stm->fds = &ctx->fds[j]; + j += stm->nfds; + } + } + + ctx->rebuild = 0; +} + +static void +poll_wake(cubeb * ctx) +{ + if (write(ctx->control_fd_write, "x", 1) < 0) { + /* ignore write error */ + } +} + +static void +set_timeout(struct timeval * timeout, unsigned int ms) +{ + gettimeofday(timeout, NULL); + timeout->tv_sec += ms / 1000; + timeout->tv_usec += (ms % 1000) * 1000; +} + +static void +stream_buffer_decrement(cubeb_stream * stm, long count) +{ + char * bufremains = + stm->buffer + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, count); + memmove(stm->buffer, bufremains, + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->bufframes - count)); + stm->bufframes -= count; +} + +static void +alsa_set_stream_state(cubeb_stream * stm, enum stream_state state) +{ + cubeb * ctx; + int r; + + ctx = stm->context; + stm->state = state; + r = pthread_cond_broadcast(&stm->cond); + assert(r == 0); + ctx->rebuild = 1; + poll_wake(ctx); +} + +static enum stream_state +alsa_process_stream(cubeb_stream * stm) +{ + unsigned short revents; + snd_pcm_sframes_t avail; + int draining; + + draining = 0; + + pthread_mutex_lock(&stm->mutex); + + /* Call _poll_descriptors_revents() even if we don't use it + to let underlying plugins clear null events. Otherwise poll() + may wake up again and again, producing unnecessary CPU usage. */ + WRAP(snd_pcm_poll_descriptors_revents) + (stm->pcm, stm->fds, stm->nfds, &revents); + + avail = WRAP(snd_pcm_avail_update)(stm->pcm); + + /* Got null event? Bail and wait for another wakeup. */ + if (avail == 0) { + pthread_mutex_unlock(&stm->mutex); + return RUNNING; + } + + /* This could happen if we were suspended with SIGSTOP/Ctrl+Z for a long time. + */ + if ((unsigned int)avail > stm->buffer_size) { + avail = stm->buffer_size; + } + + /* Capture: Read available frames */ + if (stm->stream_type == SND_PCM_STREAM_CAPTURE && avail > 0) { + snd_pcm_sframes_t got; + + if (avail + stm->bufframes > stm->buffer_size) { + /* Buffer overflow. Skip and overwrite with new data. */ + stm->bufframes = 0; + // TODO: should it be marked as DRAINING? + } + + got = WRAP(snd_pcm_readi)(stm->pcm, stm->buffer + stm->bufframes, avail); + + if (got < 0) { + avail = got; // the error handler below will recover us + } else { + stm->bufframes += got; + stm->stream_position += got; + + gettimeofday(&stm->last_activity, NULL); + } + } + + /* Capture: Pass read frames to callback function */ + if (stm->stream_type == SND_PCM_STREAM_CAPTURE && stm->bufframes > 0 && + (!stm->other_stream || + stm->other_stream->bufframes < stm->other_stream->buffer_size)) { + snd_pcm_sframes_t wrote = stm->bufframes; + struct cubeb_stream * mainstm = stm->other_stream ? stm->other_stream : stm; + void * other_buffer = stm->other_stream ? stm->other_stream->buffer + + stm->other_stream->bufframes + : NULL; + + /* Correct write size to the other stream available space */ + if (stm->other_stream && + wrote > (snd_pcm_sframes_t)(stm->other_stream->buffer_size - + stm->other_stream->bufframes)) { + wrote = stm->other_stream->buffer_size - stm->other_stream->bufframes; + } + + pthread_mutex_unlock(&stm->mutex); + wrote = stm->data_callback(mainstm, stm->user_ptr, stm->buffer, + other_buffer, wrote); + pthread_mutex_lock(&stm->mutex); + + if (wrote < 0) { + avail = wrote; // the error handler below will recover us + } else { + stream_buffer_decrement(stm, wrote); + + if (stm->other_stream) { + stm->other_stream->bufframes += wrote; + } + } + } + + /* Playback: Don't have enough data? Let's ask for more. */ + if (stm->stream_type == SND_PCM_STREAM_PLAYBACK && + avail > (snd_pcm_sframes_t)stm->bufframes && + (!stm->other_stream || stm->other_stream->bufframes > 0)) { + long got = avail - stm->bufframes; + void * other_buffer = stm->other_stream ? stm->other_stream->buffer : NULL; + char * buftail = + stm->buffer + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->bufframes); + + /* Correct read size to the other stream available frames */ + if (stm->other_stream && + got > (snd_pcm_sframes_t)stm->other_stream->bufframes) { + got = stm->other_stream->bufframes; + } + + pthread_mutex_unlock(&stm->mutex); + got = stm->data_callback(stm, stm->user_ptr, other_buffer, buftail, got); + pthread_mutex_lock(&stm->mutex); + + if (got < 0) { + avail = got; // the error handler below will recover us + } else { + stm->bufframes += got; + + if (stm->other_stream) { + stream_buffer_decrement(stm->other_stream, got); + } + } + } + + /* Playback: Still don't have enough data? Add some silence. */ + if (stm->stream_type == SND_PCM_STREAM_PLAYBACK && + avail > (snd_pcm_sframes_t)stm->bufframes) { + long drain_frames = avail - stm->bufframes; + double drain_time = (double)drain_frames / stm->params.rate; + + char * buftail = + stm->buffer + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->bufframes); + memset(buftail, 0, WRAP(snd_pcm_frames_to_bytes)(stm->pcm, drain_frames)); + stm->bufframes = avail; + + /* Mark as draining, unless we're waiting for capture */ + if (!stm->other_stream || stm->other_stream->bufframes > 0) { + set_timeout(&stm->drain_timeout, drain_time * 1000); + + draining = 1; + } + } + + /* Playback: Have enough data and no errors. Let's write it out. */ + if (stm->stream_type == SND_PCM_STREAM_PLAYBACK && avail > 0) { + snd_pcm_sframes_t wrote; + + if (stm->params.format == CUBEB_SAMPLE_FLOAT32NE) { + float * b = (float *)stm->buffer; + for (uint32_t i = 0; i < avail * stm->params.channels; i++) { + b[i] *= stm->volume; + } + } else { + short * b = (short *)stm->buffer; + for (uint32_t i = 0; i < avail * stm->params.channels; i++) { + b[i] *= stm->volume; + } + } + + wrote = WRAP(snd_pcm_writei)(stm->pcm, stm->buffer, avail); + if (wrote < 0) { + avail = wrote; // the error handler below will recover us + } else { + stream_buffer_decrement(stm, wrote); + + stm->stream_position += wrote; + gettimeofday(&stm->last_activity, NULL); + } + } + + /* Got some error? Let's try to recover the stream. */ + if (avail < 0) { + avail = WRAP(snd_pcm_recover)(stm->pcm, avail, 0); + + /* Capture pcm must be started after initial setup/recover */ + if (avail >= 0 && stm->stream_type == SND_PCM_STREAM_CAPTURE && + WRAP(snd_pcm_state)(stm->pcm) == SND_PCM_STATE_PREPARED) { + avail = WRAP(snd_pcm_start)(stm->pcm); + } + } + + /* Failed to recover, this stream must be broken. */ + if (avail < 0) { + pthread_mutex_unlock(&stm->mutex); + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + return ERROR; + } + + pthread_mutex_unlock(&stm->mutex); + return draining ? DRAINING : RUNNING; +} + +static int +alsa_run(cubeb * ctx) +{ + int r; + int timeout; + int i; + char dummy; + cubeb_stream * stm; + enum stream_state state; + + pthread_mutex_lock(&ctx->mutex); + + if (ctx->rebuild) { + rebuild(ctx); + } + + /* Wake up at least once per second for the watchdog. */ + timeout = 1000; + for (i = 0; i < CUBEB_STREAM_MAX; ++i) { + stm = ctx->streams[i]; + if (stm && stm->state == DRAINING) { + r = ms_until(&stm->drain_timeout); + if (r >= 0 && timeout > r) { + timeout = r; + } + } + } + + pthread_mutex_unlock(&ctx->mutex); + r = poll(ctx->fds, ctx->nfds, timeout); + pthread_mutex_lock(&ctx->mutex); + + if (r > 0) { + if (ctx->fds[0].revents & POLLIN) { + if (read(ctx->control_fd_read, &dummy, 1) < 0) { + /* ignore read error */ + } + + if (ctx->shutdown) { + pthread_mutex_unlock(&ctx->mutex); + return -1; + } + } + + for (i = 0; i < CUBEB_STREAM_MAX; ++i) { + stm = ctx->streams[i]; + /* We can't use snd_pcm_poll_descriptors_revents here because of + https://github.com/kinetiknz/cubeb/issues/135. */ + if (stm && stm->state == RUNNING && stm->fds && + any_revents(stm->fds, stm->nfds)) { + alsa_set_stream_state(stm, PROCESSING); + pthread_mutex_unlock(&ctx->mutex); + state = alsa_process_stream(stm); + pthread_mutex_lock(&ctx->mutex); + alsa_set_stream_state(stm, state); + } + } + } else if (r == 0) { + for (i = 0; i < CUBEB_STREAM_MAX; ++i) { + stm = ctx->streams[i]; + if (stm) { + if (stm->state == DRAINING && ms_since(&stm->drain_timeout) >= 0) { + alsa_set_stream_state(stm, INACTIVE); + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + } else if (stm->state == RUNNING && + ms_since(&stm->last_activity) > CUBEB_WATCHDOG_MS) { + alsa_set_stream_state(stm, ERROR); + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + } + } + } + } + + pthread_mutex_unlock(&ctx->mutex); + + return 0; +} + +static void * +alsa_run_thread(void * context) +{ + cubeb * ctx = context; + int r; + + CUBEB_REGISTER_THREAD("cubeb rendering thread"); + + do { + r = alsa_run(ctx); + } while (r >= 0); + + CUBEB_UNREGISTER_THREAD(); + + return NULL; +} + +static snd_config_t * +get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) +{ + int r; + snd_config_t * slave_pcm; + snd_config_t * slave_def; + snd_config_t * pcm; + char const * string; + char node_name[64]; + + slave_def = NULL; + + r = WRAP(snd_config_search)(root_pcm, "slave", &slave_pcm); + if (r < 0) { + return NULL; + } + + r = WRAP(snd_config_get_string)(slave_pcm, &string); + if (r >= 0) { + r = WRAP(snd_config_search_definition)(lconf, "pcm_slave", string, + &slave_def); + if (r < 0) { + return NULL; + } + } + + do { + r = WRAP(snd_config_search)(slave_def ? slave_def : slave_pcm, "pcm", &pcm); + if (r < 0) { + break; + } + + r = WRAP(snd_config_get_string)(slave_def ? slave_def : slave_pcm, &string); + if (r < 0) { + break; + } + + r = snprintf(node_name, sizeof(node_name), "pcm.%s", string); + if (r < 0 || r > (int)sizeof(node_name)) { + break; + } + r = WRAP(snd_config_search)(lconf, node_name, &pcm); + if (r < 0) { + break; + } + + return pcm; + } while (0); + + if (slave_def) { + WRAP(snd_config_delete)(slave_def); + } + + return NULL; +} + +/* Work around PulseAudio ALSA plugin bug where the PA server forces a + higher than requested latency, but the plugin does not update its (and + ALSA's) internal state to reflect that, leading to an immediate underrun + situation. Inspired by WINE's make_handle_underrun_config. + Reference: http://mailman.alsa-project.org/pipermail/alsa-devel/2012-July/05 + */ +static snd_config_t * +init_local_config_with_workaround(char const * pcm_name) +{ + int r; + snd_config_t * lconf; + snd_config_t * pcm_node; + snd_config_t * node; + char const * string; + char node_name[64]; + + lconf = NULL; + + if (WRAP(snd_config) == NULL) { + return NULL; + } + + r = WRAP(snd_config_copy)(&lconf, WRAP(snd_config)); + if (r < 0) { + return NULL; + } + + do { + r = WRAP(snd_config_search_definition)(lconf, "pcm", pcm_name, &pcm_node); + if (r < 0) { + break; + } + + r = WRAP(snd_config_get_id)(pcm_node, &string); + if (r < 0) { + break; + } + + r = snprintf(node_name, sizeof(node_name), "pcm.%s", string); + if (r < 0 || r > (int)sizeof(node_name)) { + break; + } + r = WRAP(snd_config_search)(lconf, node_name, &pcm_node); + if (r < 0) { + break; + } + + /* If this PCM has a slave, walk the slave configurations until we reach the + * bottom. */ + while ((node = get_slave_pcm_node(lconf, pcm_node)) != NULL) { + pcm_node = node; + } + + /* Fetch the PCM node's type, and bail out if it's not the PulseAudio + * plugin. */ + r = WRAP(snd_config_search)(pcm_node, "type", &node); + if (r < 0) { + break; + } + + r = WRAP(snd_config_get_string)(node, &string); + if (r < 0) { + break; + } + + if (strcmp(string, "pulse") != 0) { + break; + } + + /* Don't clobber an explicit existing handle_underrun value, set it only + if it doesn't already exist. */ + r = WRAP(snd_config_search)(pcm_node, "handle_underrun", &node); + if (r != -ENOENT) { + break; + } + + /* Disable pcm_pulse's asynchronous underrun handling. */ + r = WRAP(snd_config_imake_integer)(&node, "handle_underrun", 0); + if (r < 0) { + break; + } + + r = WRAP(snd_config_add)(pcm_node, node); + if (r < 0) { + break; + } + + return lconf; + } while (0); + + WRAP(snd_config_delete)(lconf); + + return NULL; +} + +static int +alsa_locked_pcm_open(snd_pcm_t ** pcm, char const * pcm_name, + snd_pcm_stream_t stream, snd_config_t * local_config) +{ + int r; + + pthread_mutex_lock(&cubeb_alsa_mutex); + if (local_config) { + r = WRAP(snd_pcm_open_lconf)(pcm, pcm_name, stream, SND_PCM_NONBLOCK, + local_config); + } else { + r = WRAP(snd_pcm_open)(pcm, pcm_name, stream, SND_PCM_NONBLOCK); + } + pthread_mutex_unlock(&cubeb_alsa_mutex); + + return r; +} + +static int +alsa_locked_pcm_close(snd_pcm_t * pcm) +{ + int r; + + pthread_mutex_lock(&cubeb_alsa_mutex); + r = WRAP(snd_pcm_close)(pcm); + pthread_mutex_unlock(&cubeb_alsa_mutex); + + return r; +} + +static int +alsa_register_stream(cubeb * ctx, cubeb_stream * stm) +{ + int i; + + pthread_mutex_lock(&ctx->mutex); + for (i = 0; i < CUBEB_STREAM_MAX; ++i) { + if (!ctx->streams[i]) { + ctx->streams[i] = stm; + break; + } + } + pthread_mutex_unlock(&ctx->mutex); + + return i == CUBEB_STREAM_MAX; +} + +static void +alsa_unregister_stream(cubeb_stream * stm) +{ + cubeb * ctx; + int i; + + ctx = stm->context; + + pthread_mutex_lock(&ctx->mutex); + for (i = 0; i < CUBEB_STREAM_MAX; ++i) { + if (ctx->streams[i] == stm) { + ctx->streams[i] = NULL; + break; + } + } + pthread_mutex_unlock(&ctx->mutex); +} + +static void +silent_error_handler(char const * file, int line, char const * function, + int err, char const * fmt, ...) +{ + (void)file; + (void)line; + (void)function; + (void)err; + (void)fmt; +} + +/*static*/ int +alsa_init(cubeb ** context, char const * context_name) +{ + (void)context_name; + void * libasound = NULL; + cubeb * ctx; + int r; + int i; + int fd[2]; + pthread_attr_t attr; + snd_pcm_t * dummy; + + assert(context); + *context = NULL; + +#ifndef DISABLE_LIBASOUND_DLOPEN + libasound = dlopen("libasound.so.2", RTLD_LAZY); + if (!libasound) { + libasound = dlopen("libasound.so", RTLD_LAZY); + if (!libasound) { + return CUBEB_ERROR; + } + } + +#define LOAD(x) \ + { \ + cubeb_##x = dlsym(libasound, #x); \ + if (!cubeb_##x) { \ + dlclose(libasound); \ + return CUBEB_ERROR; \ + } \ + } + + LIBASOUND_API_VISIT(LOAD); +#undef LOAD +#endif + + pthread_mutex_lock(&cubeb_alsa_mutex); + if (!cubeb_alsa_error_handler_set) { + WRAP(snd_lib_error_set_handler)(silent_error_handler); + cubeb_alsa_error_handler_set = 1; + } + pthread_mutex_unlock(&cubeb_alsa_mutex); + + ctx = calloc(1, sizeof(*ctx)); + assert(ctx); + + ctx->ops = &alsa_ops; + ctx->libasound = libasound; + + r = pthread_mutex_init(&ctx->mutex, NULL); + assert(r == 0); + + r = pipe(fd); + assert(r == 0); + + for (i = 0; i < 2; ++i) { + fcntl(fd[i], F_SETFD, fcntl(fd[i], F_GETFD) | FD_CLOEXEC); + fcntl(fd[i], F_SETFL, fcntl(fd[i], F_GETFL) | O_NONBLOCK); + } + + ctx->control_fd_read = fd[0]; + ctx->control_fd_write = fd[1]; + + /* Force an early rebuild when alsa_run is first called to ensure fds and + nfds have been initialized. */ + ctx->rebuild = 1; + + r = pthread_attr_init(&attr); + assert(r == 0); + + r = pthread_attr_setstacksize(&attr, 256 * 1024); + assert(r == 0); + + r = pthread_create(&ctx->thread, &attr, alsa_run_thread, ctx); + assert(r == 0); + + r = pthread_attr_destroy(&attr); + assert(r == 0); + + /* Open a dummy PCM to force the configuration space to be evaluated so that + init_local_config_with_workaround can find and modify the default node. */ + r = alsa_locked_pcm_open(&dummy, CUBEB_ALSA_PCM_NAME, SND_PCM_STREAM_PLAYBACK, + NULL); + if (r >= 0) { + alsa_locked_pcm_close(dummy); + } + ctx->is_pa = 0; + pthread_mutex_lock(&cubeb_alsa_mutex); + ctx->local_config = init_local_config_with_workaround(CUBEB_ALSA_PCM_NAME); + pthread_mutex_unlock(&cubeb_alsa_mutex); + if (ctx->local_config) { + ctx->is_pa = 1; + r = alsa_locked_pcm_open(&dummy, CUBEB_ALSA_PCM_NAME, + SND_PCM_STREAM_PLAYBACK, ctx->local_config); + /* If we got a local_config, we found a PA PCM. If opening a PCM with that + config fails with EINVAL, the PA PCM is too old for this workaround. */ + if (r == -EINVAL) { + pthread_mutex_lock(&cubeb_alsa_mutex); + WRAP(snd_config_delete)(ctx->local_config); + pthread_mutex_unlock(&cubeb_alsa_mutex); + ctx->local_config = NULL; + } else if (r >= 0) { + alsa_locked_pcm_close(dummy); + } + } + + *context = ctx; + + return CUBEB_OK; +} + +static char const * +alsa_get_backend_id(cubeb * ctx) +{ + (void)ctx; + return "alsa"; +} + +static void +alsa_destroy(cubeb * ctx) +{ + int r; + + assert(ctx); + + pthread_mutex_lock(&ctx->mutex); + ctx->shutdown = 1; + poll_wake(ctx); + pthread_mutex_unlock(&ctx->mutex); + + r = pthread_join(ctx->thread, NULL); + assert(r == 0); + + close(ctx->control_fd_read); + close(ctx->control_fd_write); + pthread_mutex_destroy(&ctx->mutex); + free(ctx->fds); + + if (ctx->local_config) { + pthread_mutex_lock(&cubeb_alsa_mutex); + WRAP(snd_config_delete)(ctx->local_config); + pthread_mutex_unlock(&cubeb_alsa_mutex); + } +#ifndef DISABLE_LIBASOUND_DLOPEN + if (ctx->libasound) { + dlclose(ctx->libasound); + } +#endif + free(ctx); +} + +static void +alsa_stream_destroy(cubeb_stream * stm); + +static int +alsa_stream_init_single(cubeb * ctx, cubeb_stream ** stream, + char const * stream_name, snd_pcm_stream_t stream_type, + cubeb_devid deviceid, + cubeb_stream_params * stream_params, + unsigned int latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + (void)stream_name; + cubeb_stream * stm; + int r; + snd_pcm_format_t format; + snd_pcm_uframes_t period_size; + int latency_us = 0; + char const * pcm_name = + deviceid ? (char const *)deviceid : CUBEB_ALSA_PCM_NAME; + + assert(ctx && stream); + + *stream = NULL; + + if (stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + switch (stream_params->format) { + case CUBEB_SAMPLE_S16LE: + format = SND_PCM_FORMAT_S16_LE; + break; + case CUBEB_SAMPLE_S16BE: + format = SND_PCM_FORMAT_S16_BE; + break; + case CUBEB_SAMPLE_FLOAT32LE: + format = SND_PCM_FORMAT_FLOAT_LE; + break; + case CUBEB_SAMPLE_FLOAT32BE: + format = SND_PCM_FORMAT_FLOAT_BE; + break; + default: + return CUBEB_ERROR_INVALID_FORMAT; + } + + pthread_mutex_lock(&ctx->mutex); + if (ctx->active_streams >= CUBEB_STREAM_MAX) { + pthread_mutex_unlock(&ctx->mutex); + return CUBEB_ERROR; + } + ctx->active_streams += 1; + pthread_mutex_unlock(&ctx->mutex); + + stm = calloc(1, sizeof(*stm)); + assert(stm); + + stm->context = ctx; + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->user_ptr = user_ptr; + stm->params = *stream_params; + stm->state = INACTIVE; + stm->volume = 1.0; + stm->buffer = NULL; + stm->bufframes = 0; + stm->stream_type = stream_type; + stm->other_stream = NULL; + + r = pthread_mutex_init(&stm->mutex, NULL); + assert(r == 0); + + r = pthread_cond_init(&stm->cond, NULL); + assert(r == 0); + + r = alsa_locked_pcm_open(&stm->pcm, pcm_name, stm->stream_type, + ctx->local_config); + if (r < 0) { + alsa_stream_destroy(stm); + return CUBEB_ERROR; + } + + r = WRAP(snd_pcm_nonblock)(stm->pcm, 1); + assert(r == 0); + + latency_us = latency_frames * 1e6 / stm->params.rate; + + /* Ugly hack: the PA ALSA plugin allows buffer configurations that can't + possibly work. See https://bugzilla.mozilla.org/show_bug.cgi?id=761274. + Only resort to this hack if the handle_underrun workaround failed. */ + if (!ctx->local_config && ctx->is_pa) { + const int min_latency = 5e5; + latency_us = latency_us < min_latency ? min_latency : latency_us; + } + + r = WRAP(snd_pcm_set_params)(stm->pcm, format, SND_PCM_ACCESS_RW_INTERLEAVED, + stm->params.channels, stm->params.rate, 1, + latency_us); + if (r < 0) { + alsa_stream_destroy(stm); + return CUBEB_ERROR_INVALID_FORMAT; + } + + r = WRAP(snd_pcm_get_params)(stm->pcm, &stm->buffer_size, &period_size); + assert(r == 0); + + /* Double internal buffer size to have enough space when waiting for the other + * side of duplex connection */ + stm->buffer_size *= 2; + stm->buffer = + calloc(1, WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->buffer_size)); + assert(stm->buffer); + + stm->nfds = WRAP(snd_pcm_poll_descriptors_count)(stm->pcm); + assert(stm->nfds > 0); + + stm->saved_fds = calloc(stm->nfds, sizeof(struct pollfd)); + assert(stm->saved_fds); + r = WRAP(snd_pcm_poll_descriptors)(stm->pcm, stm->saved_fds, stm->nfds); + assert((nfds_t)r == stm->nfds); + + if (alsa_register_stream(ctx, stm) != 0) { + alsa_stream_destroy(stm); + return CUBEB_ERROR; + } + + *stream = stm; + + return CUBEB_OK; +} + +static int +alsa_stream_init(cubeb * ctx, cubeb_stream ** stream, char const * stream_name, + cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + int result = CUBEB_OK; + cubeb_stream *instm = NULL, *outstm = NULL; + + if (result == CUBEB_OK && input_stream_params) { + result = alsa_stream_init_single(ctx, &instm, stream_name, + SND_PCM_STREAM_CAPTURE, input_device, + input_stream_params, latency_frames, + data_callback, state_callback, user_ptr); + } + + if (result == CUBEB_OK && output_stream_params) { + result = alsa_stream_init_single(ctx, &outstm, stream_name, + SND_PCM_STREAM_PLAYBACK, output_device, + output_stream_params, latency_frames, + data_callback, state_callback, user_ptr); + } + + if (result == CUBEB_OK && input_stream_params && output_stream_params) { + instm->other_stream = outstm; + outstm->other_stream = instm; + } + + if (result != CUBEB_OK && instm) { + alsa_stream_destroy(instm); + } + + *stream = outstm ? outstm : instm; + + return result; +} + +static void +alsa_stream_destroy(cubeb_stream * stm) +{ + int r; + cubeb * ctx; + + assert(stm && (stm->state == INACTIVE || stm->state == ERROR || + stm->state == DRAINING)); + + ctx = stm->context; + + if (stm->other_stream) { + stm->other_stream->other_stream = NULL; // to stop infinite recursion + alsa_stream_destroy(stm->other_stream); + } + + pthread_mutex_lock(&stm->mutex); + if (stm->pcm) { + if (stm->state == DRAINING) { + WRAP(snd_pcm_drain)(stm->pcm); + } + alsa_locked_pcm_close(stm->pcm); + stm->pcm = NULL; + } + free(stm->saved_fds); + pthread_mutex_unlock(&stm->mutex); + pthread_mutex_destroy(&stm->mutex); + + r = pthread_cond_destroy(&stm->cond); + assert(r == 0); + + alsa_unregister_stream(stm); + + pthread_mutex_lock(&ctx->mutex); + assert(ctx->active_streams >= 1); + ctx->active_streams -= 1; + pthread_mutex_unlock(&ctx->mutex); + + free(stm->buffer); + + free(stm); +} + +static int +alsa_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + int r; + cubeb_stream * stm; + snd_pcm_hw_params_t * hw_params; + cubeb_stream_params params; + params.rate = 44100; + params.format = CUBEB_SAMPLE_FLOAT32NE; + params.channels = 2; + + snd_pcm_hw_params_alloca(&hw_params); + + assert(ctx); + + r = alsa_stream_init(ctx, &stm, "", NULL, NULL, NULL, ¶ms, 100, NULL, + NULL, NULL); + if (r != CUBEB_OK) { + return CUBEB_ERROR; + } + + assert(stm); + + r = WRAP(snd_pcm_hw_params_any)(stm->pcm, hw_params); + if (r < 0) { + return CUBEB_ERROR; + } + + r = WRAP(snd_pcm_hw_params_get_channels_max)(hw_params, max_channels); + if (r < 0) { + return CUBEB_ERROR; + } + + alsa_stream_destroy(stm); + + return CUBEB_OK; +} + +static int +alsa_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) +{ + (void)ctx; + int r, dir; + snd_pcm_t * pcm; + snd_pcm_hw_params_t * hw_params; + + snd_pcm_hw_params_alloca(&hw_params); + + /* get a pcm, disabling resampling, so we get a rate the + * hardware/dmix/pulse/etc. supports. */ + r = WRAP(snd_pcm_open)(&pcm, CUBEB_ALSA_PCM_NAME, SND_PCM_STREAM_PLAYBACK, + SND_PCM_NO_AUTO_RESAMPLE); + if (r < 0) { + return CUBEB_ERROR; + } + + r = WRAP(snd_pcm_hw_params_any)(pcm, hw_params); + if (r < 0) { + WRAP(snd_pcm_close)(pcm); + return CUBEB_ERROR; + } + + r = WRAP(snd_pcm_hw_params_get_rate)(hw_params, rate, &dir); + if (r >= 0) { + /* There is a default rate: use it. */ + WRAP(snd_pcm_close)(pcm); + return CUBEB_OK; + } + + /* Use a common rate, alsa may adjust it based on hw/etc. capabilities. */ + *rate = 44100; + + r = WRAP(snd_pcm_hw_params_set_rate_near)(pcm, hw_params, rate, NULL); + if (r < 0) { + WRAP(snd_pcm_close)(pcm); + return CUBEB_ERROR; + } + + WRAP(snd_pcm_close)(pcm); + + return CUBEB_OK; +} + +static int +alsa_get_min_latency(cubeb * ctx, cubeb_stream_params params, + uint32_t * latency_frames) +{ + (void)ctx; + /* 40ms is found to be an acceptable minimum, even on a super low-end + * machine. */ + *latency_frames = 40 * params.rate / 1000; + + return CUBEB_OK; +} + +static int +alsa_stream_start(cubeb_stream * stm) +{ + cubeb * ctx; + + assert(stm); + ctx = stm->context; + + if (stm->stream_type == SND_PCM_STREAM_PLAYBACK && stm->other_stream) { + int r = alsa_stream_start(stm->other_stream); + if (r != CUBEB_OK) + return r; + } + + pthread_mutex_lock(&stm->mutex); + /* Capture pcm must be started after initial setup/recover */ + if (stm->stream_type == SND_PCM_STREAM_CAPTURE && + WRAP(snd_pcm_state)(stm->pcm) == SND_PCM_STATE_PREPARED) { + WRAP(snd_pcm_start)(stm->pcm); + } + WRAP(snd_pcm_pause)(stm->pcm, 0); + gettimeofday(&stm->last_activity, NULL); + pthread_mutex_unlock(&stm->mutex); + + pthread_mutex_lock(&ctx->mutex); + if (stm->state != INACTIVE) { + pthread_mutex_unlock(&ctx->mutex); + return CUBEB_ERROR; + } + alsa_set_stream_state(stm, RUNNING); + pthread_mutex_unlock(&ctx->mutex); + + return CUBEB_OK; +} + +static int +alsa_stream_stop(cubeb_stream * stm) +{ + cubeb * ctx; + int r; + + assert(stm); + ctx = stm->context; + + if (stm->stream_type == SND_PCM_STREAM_PLAYBACK && stm->other_stream) { + int r = alsa_stream_stop(stm->other_stream); + if (r != CUBEB_OK) + return r; + } + + pthread_mutex_lock(&ctx->mutex); + while (stm->state == PROCESSING) { + r = pthread_cond_wait(&stm->cond, &ctx->mutex); + assert(r == 0); + } + + alsa_set_stream_state(stm, INACTIVE); + pthread_mutex_unlock(&ctx->mutex); + + pthread_mutex_lock(&stm->mutex); + WRAP(snd_pcm_pause)(stm->pcm, 1); + pthread_mutex_unlock(&stm->mutex); + + return CUBEB_OK; +} + +static int +alsa_stream_get_position(cubeb_stream * stm, uint64_t * position) +{ + snd_pcm_sframes_t delay; + + assert(stm && position); + + pthread_mutex_lock(&stm->mutex); + + delay = -1; + if (WRAP(snd_pcm_state)(stm->pcm) != SND_PCM_STATE_RUNNING || + WRAP(snd_pcm_delay)(stm->pcm, &delay) != 0) { + *position = stm->last_position; + pthread_mutex_unlock(&stm->mutex); + return CUBEB_OK; + } + + assert(delay >= 0); + + *position = 0; + if (stm->stream_position >= (snd_pcm_uframes_t)delay) { + *position = stm->stream_position - delay; + } + + stm->last_position = *position; + + pthread_mutex_unlock(&stm->mutex); + return CUBEB_OK; +} + +static int +alsa_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +{ + snd_pcm_sframes_t delay; + /* This function returns the delay in frames until a frame written using + snd_pcm_writei is sent to the DAC. The DAC delay should be < 1ms anyways. + */ + if (WRAP(snd_pcm_delay)(stm->pcm, &delay)) { + return CUBEB_ERROR; + } + + *latency = delay; + + return CUBEB_OK; +} + +static int +alsa_stream_set_volume(cubeb_stream * stm, float volume) +{ + /* setting the volume using an API call does not seem very stable/supported */ + pthread_mutex_lock(&stm->mutex); + stm->volume = volume; + pthread_mutex_unlock(&stm->mutex); + + return CUBEB_OK; +} + +static int +alsa_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection) +{ + cubeb_device_info * device = NULL; + + if (!context) + return CUBEB_ERROR; + + uint32_t rate, max_channels; + int r; + + r = alsa_get_preferred_sample_rate(context, &rate); + if (r != CUBEB_OK) { + return CUBEB_ERROR; + } + + r = alsa_get_max_channel_count(context, &max_channels); + if (r != CUBEB_OK) { + return CUBEB_ERROR; + } + + char const * a_name = "default"; + device = (cubeb_device_info *)calloc(1, sizeof(cubeb_device_info)); + assert(device); + if (!device) + return CUBEB_ERROR; + + device->device_id = a_name; + device->devid = (cubeb_devid)device->device_id; + device->friendly_name = a_name; + device->group_id = a_name; + device->vendor_name = a_name; + device->type = type; + device->state = CUBEB_DEVICE_STATE_ENABLED; + device->preferred = CUBEB_DEVICE_PREF_ALL; + device->format = CUBEB_DEVICE_FMT_S16NE; + device->default_format = CUBEB_DEVICE_FMT_S16NE; + device->max_channels = max_channels; + device->min_rate = rate; + device->max_rate = rate; + device->default_rate = rate; + device->latency_lo = 0; + device->latency_hi = 0; + + collection->device = device; + collection->count = 1; + + return CUBEB_OK; +} + +static int +alsa_device_collection_destroy(cubeb * context, + cubeb_device_collection * collection) +{ + assert(collection->count == 1); + (void)context; + free(collection->device); + return CUBEB_OK; +} + +static struct cubeb_ops const alsa_ops = { + .init = alsa_init, + .get_backend_id = alsa_get_backend_id, + .get_max_channel_count = alsa_get_max_channel_count, + .get_min_latency = alsa_get_min_latency, + .get_preferred_sample_rate = alsa_get_preferred_sample_rate, + .enumerate_devices = alsa_enumerate_devices, + .device_collection_destroy = alsa_device_collection_destroy, + .destroy = alsa_destroy, + .stream_init = alsa_stream_init, + .stream_destroy = alsa_stream_destroy, + .stream_start = alsa_stream_start, + .stream_stop = alsa_stream_stop, + .stream_get_position = alsa_stream_get_position, + .stream_get_latency = alsa_stream_get_latency, + .stream_get_input_latency = NULL, + .stream_set_volume = alsa_stream_set_volume, + .stream_set_name = NULL, + .stream_get_current_device = NULL, + .stream_device_destroy = NULL, + .stream_register_device_changed_callback = NULL, + .register_device_collection_changed = NULL}; diff --git a/3rdparty/cubeb/src/cubeb_android.h b/3rdparty/cubeb/src/cubeb_android.h new file mode 100644 index 0000000000..c21a941ab5 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_android.h @@ -0,0 +1,17 @@ +#ifndef CUBEB_ANDROID_H +#define CUBEB_ANDROID_H + +#ifdef __cplusplus +extern "C" { +#endif +// If the latency requested is above this threshold, this stream is considered +// intended for playback (vs. real-time). Tell Android it should favor saving +// power over performance or latency. +// This is around 100ms at 44100 or 48000 +const uint16_t POWERSAVE_LATENCY_FRAMES_THRESHOLD = 4000; + +#ifdef __cplusplus +}; +#endif + +#endif // CUBEB_ANDROID_H diff --git a/3rdparty/cubeb/src/cubeb_array_queue.h b/3rdparty/cubeb/src/cubeb_array_queue.h new file mode 100644 index 0000000000..d6d9581325 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_array_queue.h @@ -0,0 +1,99 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#ifndef CUBEB_ARRAY_QUEUE_H +#define CUBEB_ARRAY_QUEUE_H + +#include +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef struct { + void ** buf; + size_t num; + size_t writePos; + size_t readPos; + pthread_mutex_t mutex; +} array_queue; + +array_queue * +array_queue_create(size_t num) +{ + assert(num != 0); + array_queue * new_queue = (array_queue *)calloc(1, sizeof(array_queue)); + new_queue->buf = (void **)calloc(1, sizeof(void *) * num); + new_queue->readPos = 0; + new_queue->writePos = 0; + new_queue->num = num; + + pthread_mutex_init(&new_queue->mutex, NULL); + + return new_queue; +} + +void +array_queue_destroy(array_queue * aq) +{ + assert(aq); + + free(aq->buf); + pthread_mutex_destroy(&aq->mutex); + free(aq); +} + +int +array_queue_push(array_queue * aq, void * item) +{ + assert(item); + + pthread_mutex_lock(&aq->mutex); + int ret = -1; + if (aq->buf[aq->writePos % aq->num] == NULL) { + aq->buf[aq->writePos % aq->num] = item; + aq->writePos = (aq->writePos + 1) % aq->num; + ret = 0; + } + // else queue is full + pthread_mutex_unlock(&aq->mutex); + return ret; +} + +void * +array_queue_pop(array_queue * aq) +{ + pthread_mutex_lock(&aq->mutex); + void * value = aq->buf[aq->readPos % aq->num]; + if (value) { + aq->buf[aq->readPos % aq->num] = NULL; + aq->readPos = (aq->readPos + 1) % aq->num; + } + pthread_mutex_unlock(&aq->mutex); + return value; +} + +size_t +array_queue_get_size(array_queue * aq) +{ + pthread_mutex_lock(&aq->mutex); + ssize_t r = aq->writePos - aq->readPos; + if (r < 0) { + r = aq->num + r; + assert(r >= 0); + } + pthread_mutex_unlock(&aq->mutex); + return (size_t)r; +} + +#if defined(__cplusplus) +} +#endif + +#endif // CUBE_ARRAY_QUEUE_H diff --git a/3rdparty/cubeb/src/cubeb_assert.h b/3rdparty/cubeb/src/cubeb_assert.h new file mode 100644 index 0000000000..d81a1eacaf --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_assert.h @@ -0,0 +1,27 @@ +/* + * Copyright © 2017 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#ifndef CUBEB_ASSERT +#define CUBEB_ASSERT + +#include +#include + +/** + * This allow using an external release assert method. This file should only + * export a function or macro called XASSERT that aborts the program. + */ + +#define XASSERT(expr) \ + do { \ + if (!(expr)) { \ + fprintf(stderr, "%s:%d - fatal error: %s\n", __FILE__, __LINE__, #expr); \ + abort(); \ + } \ + } while (0) + +#endif diff --git a/3rdparty/cubeb/src/cubeb_audiotrack.c b/3rdparty/cubeb/src/cubeb_audiotrack.c new file mode 100644 index 0000000000..59deba148a --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_audiotrack.c @@ -0,0 +1,472 @@ +/* + * Copyright © 2013 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#if !defined(NDEBUG) +#define NDEBUG +#endif +#include +#include +#include +#include +#include +#include + +#include "android/audiotrack_definitions.h" +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" + +#ifndef ALOG +#if defined(DEBUG) || defined(FORCE_ALOG) +#define ALOG(args...) \ + __android_log_print(ANDROID_LOG_INFO, "Gecko - Cubeb", ##args) +#else +#define ALOG(args...) +#endif +#endif + +/** + * A lot of bytes for safety. It should be possible to bring this down a bit. */ +#define SIZE_AUDIOTRACK_INSTANCE 256 + +/** + * call dlsym to get the symbol |mangled_name|, handle the error and store the + * pointer in |pointer|. Because depending on Android version, we want different + * symbols, not finding a symbol is not an error. */ +#define DLSYM_DLERROR(mangled_name, pointer, lib) \ + do { \ + pointer = dlsym(lib, mangled_name); \ + if (!pointer) { \ + ALOG("error while loading %stm: %stm\n", mangled_name, dlerror()); \ + } else { \ + ALOG("%stm: OK", mangled_name); \ + } \ + } while (0); + +static struct cubeb_ops const audiotrack_ops; +void +audiotrack_destroy(cubeb * context); +void +audiotrack_stream_destroy(cubeb_stream * stream); + +struct AudioTrack { + /* only available on ICS and later. The second int paramter is in fact of type + * audio_stream_type_t. */ + /* static */ status_t (*get_min_frame_count)(int * frame_count, + int stream_type, uint32_t rate); + /* if we have a recent ctor, but can't find the above symbol, we + * can get the minimum frame count with this signature, and we are + * running gingerbread. */ + /* static */ status_t (*get_min_frame_count_gingerbread)(int * frame_count, + int stream_type, + uint32_t rate); + void * (*ctor)(void * instance, int, unsigned int, int, int, int, + unsigned int, void (*)(int, void *, void *), void *, int, int); + void * (*dtor)(void * instance); + void (*start)(void * instance); + void (*pause)(void * instance); + uint32_t (*latency)(void * instance); + status_t (*check)(void * instance); + status_t (*get_position)(void * instance, uint32_t * position); + /* static */ int (*get_output_samplingrate)(int * samplerate, int stream); + status_t (*set_marker_position)(void * instance, unsigned int); + status_t (*set_volume)(void * instance, float left, float right); +}; + +struct cubeb { + struct cubeb_ops const * ops; + void * library; + struct AudioTrack klass; +}; + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context; + void * user_ptr; + /**/ + cubeb_stream_params params; + cubeb_data_callback data_callback; + cubeb_state_callback state_callback; + void * instance; + /* Number of frames that have been passed to the AudioTrack callback */ + long unsigned written; + int draining; +}; + +static void +audiotrack_refill(int event, void * user, void * info) +{ + cubeb_stream * stream = user; + switch (event) { + case EVENT_MORE_DATA: { + long got = 0; + struct Buffer * b = (struct Buffer *)info; + + if (stream->draining) { + return; + } + + got = stream->data_callback(stream, stream->user_ptr, NULL, b->raw, + b->frameCount); + + stream->written += got; + + if (got != (long)b->frameCount) { + stream->draining = 1; + /* set a marker so we are notified when the are done draining, that is, + * when every frame has been played by android. */ + stream->context->klass.set_marker_position(stream->instance, + stream->written); + } + + break; + } + case EVENT_UNDERRUN: + ALOG("underrun in cubeb backend."); + break; + case EVENT_LOOP_END: + assert(0 && "We don't support the loop feature of audiotrack."); + break; + case EVENT_MARKER: + assert(stream->draining); + stream->state_callback(stream, stream->user_ptr, CUBEB_STATE_DRAINED); + break; + case EVENT_NEW_POS: + assert( + 0 && + "We don't support the setPositionUpdatePeriod feature of audiotrack."); + break; + case EVENT_BUFFER_END: + assert(0 && "Should not happen."); + break; + } +} + +/* We are running on gingerbread if we found the gingerbread signature for + * getMinFrameCount */ +static int +audiotrack_version_is_gingerbread(cubeb * ctx) +{ + return ctx->klass.get_min_frame_count_gingerbread != NULL; +} + +int +audiotrack_get_min_frame_count(cubeb * ctx, cubeb_stream_params * params, + int * min_frame_count) +{ + status_t status; + /* Recent Android have a getMinFrameCount method. */ + if (!audiotrack_version_is_gingerbread(ctx)) { + status = ctx->klass.get_min_frame_count( + min_frame_count, AUDIO_STREAM_TYPE_MUSIC, params->rate); + } else { + status = ctx->klass.get_min_frame_count_gingerbread( + min_frame_count, AUDIO_STREAM_TYPE_MUSIC, params->rate); + } + if (status != 0) { + ALOG("error getting the min frame count"); + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +int +audiotrack_init(cubeb ** context, char const * context_name) +{ + cubeb * ctx; + struct AudioTrack * c; + + assert(context); + *context = NULL; + + ctx = calloc(1, sizeof(*ctx)); + assert(ctx); + + /* If we use an absolute path here ("/system/lib/libmedia.so"), and on Android + * 2.2, the dlopen succeeds, all the dlsym succeed, but a segfault happens on + * the first call to a dlsym'ed function. Somehow this does not happen when + * using only the name of the library. */ + ctx->library = dlopen("libmedia.so", RTLD_LAZY); + if (!ctx->library) { + ALOG("dlopen error: %s.", dlerror()); + free(ctx); + return CUBEB_ERROR; + } + + /* Recent Android first, then Gingerbread. */ + DLSYM_DLERROR("_ZN7android10AudioTrackC1EijiiijPFviPvS1_ES1_ii", + ctx->klass.ctor, ctx->library); + DLSYM_DLERROR("_ZN7android10AudioTrackD1Ev", ctx->klass.dtor, ctx->library); + + DLSYM_DLERROR("_ZNK7android10AudioTrack7latencyEv", ctx->klass.latency, + ctx->library); + DLSYM_DLERROR("_ZNK7android10AudioTrack9initCheckEv", ctx->klass.check, + ctx->library); + + DLSYM_DLERROR("_ZN7android11AudioSystem21getOutputSamplingRateEPii", + ctx->klass.get_output_samplingrate, ctx->library); + + /* |getMinFrameCount| is available on gingerbread and ICS with different + * signatures. */ + DLSYM_DLERROR( + "_ZN7android10AudioTrack16getMinFrameCountEPi19audio_stream_type_tj", + ctx->klass.get_min_frame_count, ctx->library); + if (!ctx->klass.get_min_frame_count) { + DLSYM_DLERROR("_ZN7android10AudioTrack16getMinFrameCountEPiij", + ctx->klass.get_min_frame_count_gingerbread, ctx->library); + } + + DLSYM_DLERROR("_ZN7android10AudioTrack5startEv", ctx->klass.start, + ctx->library); + DLSYM_DLERROR("_ZN7android10AudioTrack5pauseEv", ctx->klass.pause, + ctx->library); + DLSYM_DLERROR("_ZN7android10AudioTrack11getPositionEPj", + ctx->klass.get_position, ctx->library); + DLSYM_DLERROR("_ZN7android10AudioTrack17setMarkerPositionEj", + ctx->klass.set_marker_position, ctx->library); + DLSYM_DLERROR("_ZN7android10AudioTrack9setVolumeEff", ctx->klass.set_volume, + ctx->library); + + /* check that we have a combination of symbol that makes sense */ + c = &ctx->klass; + if (!(c->ctor && c->dtor && c->latency && c->check && + /* at least one way to get the minimum frame count to request. */ + (c->get_min_frame_count || c->get_min_frame_count_gingerbread) && + c->start && c->pause && c->get_position && c->set_marker_position)) { + ALOG("Could not find all the symbols we need."); + audiotrack_destroy(ctx); + return CUBEB_ERROR; + } + + ctx->ops = &audiotrack_ops; + + *context = ctx; + + return CUBEB_OK; +} + +char const * +audiotrack_get_backend_id(cubeb * context) +{ + return "audiotrack"; +} + +static int +audiotrack_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + assert(ctx && max_channels); + + /* The android mixer handles up to two channels, see + http://androidxref.com/4.2.2_r1/xref/frameworks/av/services/audioflinger/AudioFlinger.h#67 + */ + *max_channels = 2; + + return CUBEB_OK; +} + +static int +audiotrack_get_min_latency(cubeb * ctx, cubeb_stream_params params, + uint32_t * latency_ms) +{ + /* We always use the lowest latency possible when using this backend (see + * audiotrack_stream_init), so this value is not going to be used. */ + int r; + + r = audiotrack_get_min_frame_count(ctx, ¶ms, (int *)latency_ms); + if (r != CUBEB_OK) { + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +static int +audiotrack_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) +{ + status_t r; + + r = ctx->klass.get_output_samplingrate((int32_t *)rate, 3 /* MUSIC */); + + return r == 0 ? CUBEB_OK : CUBEB_ERROR; +} + +void +audiotrack_destroy(cubeb * context) +{ + assert(context); + + dlclose(context->library); + + free(context); +} + +int +audiotrack_stream_init(cubeb * ctx, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency, cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + cubeb_stream * stm; + int32_t channels; + uint32_t min_frame_count; + + assert(ctx && stream); + + assert(!input_stream_params && "not supported"); + if (input_device || output_device) { + /* Device selection not yet implemented. */ + return CUBEB_ERROR_DEVICE_UNAVAILABLE; + } + + if (output_stream_params->format == CUBEB_SAMPLE_FLOAT32LE || + output_stream_params->format == CUBEB_SAMPLE_FLOAT32BE) { + return CUBEB_ERROR_INVALID_FORMAT; + } + + if (audiotrack_get_min_frame_count(ctx, output_stream_params, + (int *)&min_frame_count)) { + return CUBEB_ERROR; + } + + stm = calloc(1, sizeof(*stm)); + assert(stm); + + stm->context = ctx; + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->user_ptr = user_ptr; + stm->params = *output_stream_params; + + stm->instance = calloc(SIZE_AUDIOTRACK_INSTANCE, 1); + (*(uint32_t *)((intptr_t)stm->instance + SIZE_AUDIOTRACK_INSTANCE - 4)) = + 0xbaadbaad; + assert(stm->instance && "cubeb: EOM"); + + /* gingerbread uses old channel layout enum */ + if (audiotrack_version_is_gingerbread(ctx)) { + channels = stm->params.channels == 2 ? AUDIO_CHANNEL_OUT_STEREO_Legacy + : AUDIO_CHANNEL_OUT_MONO_Legacy; + } else { + channels = stm->params.channels == 2 ? AUDIO_CHANNEL_OUT_STEREO_ICS + : AUDIO_CHANNEL_OUT_MONO_ICS; + } + + ctx->klass.ctor(stm->instance, AUDIO_STREAM_TYPE_MUSIC, stm->params.rate, + AUDIO_FORMAT_PCM_16_BIT, channels, min_frame_count, 0, + audiotrack_refill, stm, 0, 0); + + assert((*(uint32_t *)((intptr_t)stm->instance + SIZE_AUDIOTRACK_INSTANCE - + 4)) == 0xbaadbaad); + + if (ctx->klass.check(stm->instance)) { + ALOG("stream not initialized properly."); + audiotrack_stream_destroy(stm); + return CUBEB_ERROR; + } + + *stream = stm; + + return CUBEB_OK; +} + +void +audiotrack_stream_destroy(cubeb_stream * stream) +{ + assert(stream->context); + + stream->context->klass.dtor(stream->instance); + + free(stream->instance); + stream->instance = NULL; + free(stream); +} + +int +audiotrack_stream_start(cubeb_stream * stream) +{ + assert(stream->instance); + + stream->context->klass.start(stream->instance); + stream->state_callback(stream, stream->user_ptr, CUBEB_STATE_STARTED); + + return CUBEB_OK; +} + +int +audiotrack_stream_stop(cubeb_stream * stream) +{ + assert(stream->instance); + + stream->context->klass.pause(stream->instance); + stream->state_callback(stream, stream->user_ptr, CUBEB_STATE_STOPPED); + + return CUBEB_OK; +} + +int +audiotrack_stream_get_position(cubeb_stream * stream, uint64_t * position) +{ + uint32_t p; + + assert(stream->instance && position); + stream->context->klass.get_position(stream->instance, &p); + *position = p; + + return CUBEB_OK; +} + +int +audiotrack_stream_get_latency(cubeb_stream * stream, uint32_t * latency) +{ + assert(stream->instance && latency); + + /* Android returns the latency in ms, we want it in frames. */ + *latency = stream->context->klass.latency(stream->instance); + /* with rate <= 96000, we won't overflow until 44.739 seconds of latency */ + *latency = (*latency * stream->params.rate) / 1000; + + return 0; +} + +int +audiotrack_stream_set_volume(cubeb_stream * stream, float volume) +{ + status_t status; + + status = stream->context->klass.set_volume(stream->instance, volume, volume); + + if (status) { + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +static struct cubeb_ops const audiotrack_ops = { + .init = audiotrack_init, + .get_backend_id = audiotrack_get_backend_id, + .get_max_channel_count = audiotrack_get_max_channel_count, + .get_min_latency = audiotrack_get_min_latency, + .get_preferred_sample_rate = audiotrack_get_preferred_sample_rate, + .enumerate_devices = NULL, + .device_collection_destroy = NULL, + .destroy = audiotrack_destroy, + .stream_init = audiotrack_stream_init, + .stream_destroy = audiotrack_stream_destroy, + .stream_start = audiotrack_stream_start, + .stream_stop = audiotrack_stream_stop, + .stream_get_position = audiotrack_stream_get_position, + .stream_get_latency = audiotrack_stream_get_latency, + .stream_get_input_latency = NULL, + .stream_set_volume = audiotrack_stream_set_volume, + .stream_set_name = NULL, + .stream_get_current_device = NULL, + .stream_device_destroy = NULL, + .stream_register_device_changed_callback = NULL, + .register_device_collection_changed = NULL}; diff --git a/3rdparty/cubeb/src/cubeb_audiounit.cpp b/3rdparty/cubeb/src/cubeb_audiounit.cpp new file mode 100644 index 0000000000..37036a3f28 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_audiounit.cpp @@ -0,0 +1,3685 @@ +/* + * Copyright © 2011 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#undef NDEBUG + +#include +#include +#include +#include +#include +#include +#if !TARGET_OS_IPHONE +#include +#include +#include +#include +#endif +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_mixer.h" +#include +#include +#if !TARGET_OS_IPHONE +#include "cubeb_osx_run_loop.h" +#endif +#include "cubeb_resampler.h" +#include "cubeb_ring_array.h" +#include +#include +#include +#include +#include +#include + +using namespace std; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101000 +typedef UInt32 AudioFormatFlags; +#endif + +#define AU_OUT_BUS 0 +#define AU_IN_BUS 1 + +const char * DISPATCH_QUEUE_LABEL = "org.mozilla.cubeb"; +const char * PRIVATE_AGGREGATE_DEVICE_NAME = "CubebAggregateDevice"; + +#ifdef ALOGV +#undef ALOGV +#endif +#define ALOGV(msg, ...) \ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), \ + ^{ \ + LOGV(msg, ##__VA_ARGS__); \ + }) + +#ifdef ALOG +#undef ALOG +#endif +#define ALOG(msg, ...) \ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), \ + ^{ \ + LOG(msg, ##__VA_ARGS__); \ + }) + +/* Testing empirically, some headsets report a minimal latency that is very + * low, but this does not work in practice. Lie and say the minimum is 256 + * frames. */ +const uint32_t SAFE_MIN_LATENCY_FRAMES = 128; +const uint32_t SAFE_MAX_LATENCY_FRAMES = 512; + +const AudioObjectPropertyAddress DEFAULT_INPUT_DEVICE_PROPERTY_ADDRESS = { + kAudioHardwarePropertyDefaultInputDevice, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + +const AudioObjectPropertyAddress DEFAULT_OUTPUT_DEVICE_PROPERTY_ADDRESS = { + kAudioHardwarePropertyDefaultOutputDevice, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + +const AudioObjectPropertyAddress DEVICE_IS_ALIVE_PROPERTY_ADDRESS = { + kAudioDevicePropertyDeviceIsAlive, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + +const AudioObjectPropertyAddress DEVICES_PROPERTY_ADDRESS = { + kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + +const AudioObjectPropertyAddress INPUT_DATA_SOURCE_PROPERTY_ADDRESS = { + kAudioDevicePropertyDataSource, kAudioDevicePropertyScopeInput, + kAudioObjectPropertyElementMaster}; + +const AudioObjectPropertyAddress OUTPUT_DATA_SOURCE_PROPERTY_ADDRESS = { + kAudioDevicePropertyDataSource, kAudioDevicePropertyScopeOutput, + kAudioObjectPropertyElementMaster}; + +typedef uint32_t device_flags_value; + +enum device_flags { + DEV_UNKNOWN = 0x00, /* Unknown */ + DEV_INPUT = 0x01, /* Record device like mic */ + DEV_OUTPUT = 0x02, /* Playback device like speakers */ + DEV_SYSTEM_DEFAULT = 0x04, /* System default device */ + DEV_SELECTED_DEFAULT = + 0x08, /* User selected to use the system default device */ +}; + +void +audiounit_stream_stop_internal(cubeb_stream * stm); +static int +audiounit_stream_start_internal(cubeb_stream * stm); +static void +audiounit_close_stream(cubeb_stream * stm); +static int +audiounit_setup_stream(cubeb_stream * stm); +static vector +audiounit_get_devices_of_type(cubeb_device_type devtype); +static UInt32 +audiounit_get_device_presentation_latency(AudioObjectID devid, + AudioObjectPropertyScope scope); + +#if !TARGET_OS_IPHONE +static AudioObjectID +audiounit_get_default_device_id(cubeb_device_type type); +static int +audiounit_uninstall_device_changed_callback(cubeb_stream * stm); +static int +audiounit_uninstall_system_changed_callback(cubeb_stream * stm); +static void +audiounit_reinit_stream_async(cubeb_stream * stm, device_flags_value flags); +#endif + +extern cubeb_ops const audiounit_ops; + +struct cubeb { + cubeb_ops const * ops = &audiounit_ops; + owned_critical_section mutex; + int active_streams = 0; + uint32_t global_latency_frames = 0; + cubeb_device_collection_changed_callback input_collection_changed_callback = + nullptr; + void * input_collection_changed_user_ptr = nullptr; + cubeb_device_collection_changed_callback output_collection_changed_callback = + nullptr; + void * output_collection_changed_user_ptr = nullptr; + // Store list of devices to detect changes + vector input_device_array; + vector output_device_array; + // The queue should be released when it’s no longer needed. + dispatch_queue_t serial_queue = + dispatch_queue_create(DISPATCH_QUEUE_LABEL, DISPATCH_QUEUE_SERIAL); + // Current used channel layout + atomic layout{CUBEB_LAYOUT_UNDEFINED}; + uint32_t channels = 0; +}; + +static unique_ptr +make_sized_audio_channel_layout(size_t sz) +{ + assert(sz >= sizeof(AudioChannelLayout)); + AudioChannelLayout * acl = + reinterpret_cast(calloc(1, sz)); + assert(acl); // Assert the allocation works. + return unique_ptr(acl, free); +} + +enum class io_side { + INPUT, + OUTPUT, +}; + +static char const * +to_string(io_side side) +{ + switch (side) { + case io_side::INPUT: + return "input"; + case io_side::OUTPUT: + return "output"; + } +} + +struct device_info { + AudioDeviceID id = kAudioObjectUnknown; + device_flags_value flags = DEV_UNKNOWN; +}; + +struct property_listener { + AudioDeviceID device_id; + const AudioObjectPropertyAddress * property_address; + AudioObjectPropertyListenerProc callback; + cubeb_stream * stream; + + property_listener(AudioDeviceID id, + const AudioObjectPropertyAddress * address, + AudioObjectPropertyListenerProc proc, cubeb_stream * stm) + : device_id(id), property_address(address), callback(proc), stream(stm) + { + } +}; + +struct cubeb_stream { + explicit cubeb_stream(cubeb * context); + + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context; + void * user_ptr = nullptr; + /**/ + + cubeb_data_callback data_callback = nullptr; + cubeb_state_callback state_callback = nullptr; + cubeb_device_changed_callback device_changed_callback = nullptr; + owned_critical_section device_changed_callback_lock; + /* Stream creation parameters */ + cubeb_stream_params input_stream_params = {CUBEB_SAMPLE_FLOAT32NE, 0, 0, + CUBEB_LAYOUT_UNDEFINED, + CUBEB_STREAM_PREF_NONE}; + cubeb_stream_params output_stream_params = {CUBEB_SAMPLE_FLOAT32NE, 0, 0, + CUBEB_LAYOUT_UNDEFINED, + CUBEB_STREAM_PREF_NONE}; + device_info input_device; + device_info output_device; + /* Format descriptions */ + AudioStreamBasicDescription input_desc; + AudioStreamBasicDescription output_desc; + /* I/O AudioUnits */ + AudioUnit input_unit = nullptr; + AudioUnit output_unit = nullptr; + /* I/O device sample rate */ + Float64 input_hw_rate = 0; + Float64 output_hw_rate = 0; + /* Expected I/O thread interleave, + * calculated from I/O hw rate. */ + int expected_output_callbacks_in_a_row = 0; + owned_critical_section mutex; + // Hold the input samples in every input callback iteration. + // Only accessed on input/output callback thread and during initial configure. + unique_ptr input_linear_buffer; + /* Frame counters */ + atomic frames_played{0}; + uint64_t frames_queued = 0; + // How many frames got read from the input since the stream started (includes + // padded silence) + atomic frames_read{0}; + // How many frames got written to the output device since the stream started + atomic frames_written{0}; + atomic shutdown{true}; + atomic draining{false}; + atomic reinit_pending{false}; + atomic destroy_pending{false}; + /* Latency requested by the user. */ + uint32_t latency_frames = 0; + atomic current_latency_frames{0}; + atomic total_output_latency_frames{0}; + unique_ptr resampler; + /* This is true if a device change callback is currently running. */ + atomic switching_device{false}; + atomic buffer_size_change_state{false}; + AudioDeviceID aggregate_device_id = + kAudioObjectUnknown; // the aggregate device id + AudioObjectID plugin_id = + kAudioObjectUnknown; // used to create aggregate device + /* Mixer interface */ + unique_ptr mixer; + /* Buffer where remixing/resampling will occur when upmixing is required */ + /* Only accessed from callback thread */ + unique_ptr temp_buffer; + size_t temp_buffer_size = 0; // size in bytes. + /* Listeners indicating what system events are monitored. */ + unique_ptr default_input_listener; + unique_ptr default_output_listener; + unique_ptr input_alive_listener; + unique_ptr input_source_listener; + unique_ptr output_source_listener; +}; + +bool +has_input(cubeb_stream * stm) +{ + return stm->input_stream_params.rate != 0; +} + +bool +has_output(cubeb_stream * stm) +{ + return stm->output_stream_params.rate != 0; +} + +cubeb_channel +channel_label_to_cubeb_channel(UInt32 label) +{ + switch (label) { + case kAudioChannelLabel_Left: + return CHANNEL_FRONT_LEFT; + case kAudioChannelLabel_Right: + return CHANNEL_FRONT_RIGHT; + case kAudioChannelLabel_Center: + return CHANNEL_FRONT_CENTER; + case kAudioChannelLabel_LFEScreen: + return CHANNEL_LOW_FREQUENCY; + case kAudioChannelLabel_LeftSurround: + return CHANNEL_BACK_LEFT; + case kAudioChannelLabel_RightSurround: + return CHANNEL_BACK_RIGHT; + case kAudioChannelLabel_LeftCenter: + return CHANNEL_FRONT_LEFT_OF_CENTER; + case kAudioChannelLabel_RightCenter: + return CHANNEL_FRONT_RIGHT_OF_CENTER; + case kAudioChannelLabel_CenterSurround: + return CHANNEL_BACK_CENTER; + case kAudioChannelLabel_LeftSurroundDirect: + return CHANNEL_SIDE_LEFT; + case kAudioChannelLabel_RightSurroundDirect: + return CHANNEL_SIDE_RIGHT; + case kAudioChannelLabel_TopCenterSurround: + return CHANNEL_TOP_CENTER; + case kAudioChannelLabel_VerticalHeightLeft: + return CHANNEL_TOP_FRONT_LEFT; + case kAudioChannelLabel_VerticalHeightCenter: + return CHANNEL_TOP_FRONT_CENTER; + case kAudioChannelLabel_VerticalHeightRight: + return CHANNEL_TOP_FRONT_RIGHT; + case kAudioChannelLabel_TopBackLeft: + return CHANNEL_TOP_BACK_LEFT; + case kAudioChannelLabel_TopBackCenter: + return CHANNEL_TOP_BACK_CENTER; + case kAudioChannelLabel_TopBackRight: + return CHANNEL_TOP_BACK_RIGHT; + default: + return CHANNEL_UNKNOWN; + } +} + +AudioChannelLabel +cubeb_channel_to_channel_label(cubeb_channel channel) +{ + switch (channel) { + case CHANNEL_FRONT_LEFT: + return kAudioChannelLabel_Left; + case CHANNEL_FRONT_RIGHT: + return kAudioChannelLabel_Right; + case CHANNEL_FRONT_CENTER: + return kAudioChannelLabel_Center; + case CHANNEL_LOW_FREQUENCY: + return kAudioChannelLabel_LFEScreen; + case CHANNEL_BACK_LEFT: + return kAudioChannelLabel_LeftSurround; + case CHANNEL_BACK_RIGHT: + return kAudioChannelLabel_RightSurround; + case CHANNEL_FRONT_LEFT_OF_CENTER: + return kAudioChannelLabel_LeftCenter; + case CHANNEL_FRONT_RIGHT_OF_CENTER: + return kAudioChannelLabel_RightCenter; + case CHANNEL_BACK_CENTER: + return kAudioChannelLabel_CenterSurround; + case CHANNEL_SIDE_LEFT: + return kAudioChannelLabel_LeftSurroundDirect; + case CHANNEL_SIDE_RIGHT: + return kAudioChannelLabel_RightSurroundDirect; + case CHANNEL_TOP_CENTER: + return kAudioChannelLabel_TopCenterSurround; + case CHANNEL_TOP_FRONT_LEFT: + return kAudioChannelLabel_VerticalHeightLeft; + case CHANNEL_TOP_FRONT_CENTER: + return kAudioChannelLabel_VerticalHeightCenter; + case CHANNEL_TOP_FRONT_RIGHT: + return kAudioChannelLabel_VerticalHeightRight; + case CHANNEL_TOP_BACK_LEFT: + return kAudioChannelLabel_TopBackLeft; + case CHANNEL_TOP_BACK_CENTER: + return kAudioChannelLabel_TopBackCenter; + case CHANNEL_TOP_BACK_RIGHT: + return kAudioChannelLabel_TopBackRight; + default: + return kAudioChannelLabel_Unknown; + } +} + +#if TARGET_OS_IPHONE +typedef UInt32 AudioDeviceID; +typedef UInt32 AudioObjectID; + +#define AudioGetCurrentHostTime mach_absolute_time + +#endif + +uint64_t +ConvertHostTimeToNanos(uint64_t host_time) +{ + static struct mach_timebase_info timebase_info; + static bool initialized = false; + if (!initialized) { + mach_timebase_info(&timebase_info); + initialized = true; + } + + long double answer = host_time; + if (timebase_info.numer != timebase_info.denom) { + answer *= timebase_info.numer; + answer /= timebase_info.denom; + } + return (uint64_t)answer; +} + +static void +audiounit_increment_active_streams(cubeb * ctx) +{ + ctx->mutex.assert_current_thread_owns(); + ctx->active_streams += 1; +} + +static void +audiounit_decrement_active_streams(cubeb * ctx) +{ + ctx->mutex.assert_current_thread_owns(); + ctx->active_streams -= 1; +} + +static int +audiounit_active_streams(cubeb * ctx) +{ + ctx->mutex.assert_current_thread_owns(); + return ctx->active_streams; +} + +static void +audiounit_set_global_latency(cubeb * ctx, uint32_t latency_frames) +{ + ctx->mutex.assert_current_thread_owns(); + assert(audiounit_active_streams(ctx) == 1); + ctx->global_latency_frames = latency_frames; +} + +static void +audiounit_make_silent(AudioBuffer * ioData) +{ + assert(ioData); + assert(ioData->mData); + memset(ioData->mData, 0, ioData->mDataByteSize); +} + +static OSStatus +audiounit_render_input(cubeb_stream * stm, AudioUnitRenderActionFlags * flags, + AudioTimeStamp const * tstamp, UInt32 bus, + UInt32 input_frames) +{ + /* Create the AudioBufferList to store input. */ + AudioBufferList input_buffer_list; + input_buffer_list.mBuffers[0].mDataByteSize = + stm->input_desc.mBytesPerFrame * input_frames; + input_buffer_list.mBuffers[0].mData = nullptr; + input_buffer_list.mBuffers[0].mNumberChannels = + stm->input_desc.mChannelsPerFrame; + input_buffer_list.mNumberBuffers = 1; + + /* Render input samples */ + OSStatus r = AudioUnitRender(stm->input_unit, flags, tstamp, bus, + input_frames, &input_buffer_list); + + if (r != noErr) { + LOG("AudioUnitRender rv=%d", r); + if (r != kAudioUnitErr_CannotDoInCurrentContext) { + return r; + } + if (stm->output_unit) { + // kAudioUnitErr_CannotDoInCurrentContext is returned when using a BT + // headset and the profile is changed from A2DP to HFP/HSP. The previous + // output device is no longer valid and must be reset. + audiounit_reinit_stream_async(stm, DEV_INPUT | DEV_OUTPUT); + } + // For now state that no error occurred and feed silence, stream will be + // resumed once reinit has completed. + ALOGV("(%p) input: reinit pending feeding silence instead", stm); + stm->input_linear_buffer->push_silence(input_frames * + stm->input_desc.mChannelsPerFrame); + } else { + /* Copy input data in linear buffer. */ + stm->input_linear_buffer->push(input_buffer_list.mBuffers[0].mData, + input_frames * + stm->input_desc.mChannelsPerFrame); + } + + /* Advance input frame counter. */ + assert(input_frames > 0); + stm->frames_read += input_frames; + + ALOGV("(%p) input: buffers %u, size %u, channels %u, rendered frames %d, " + "total frames %lu.", + stm, (unsigned int)input_buffer_list.mNumberBuffers, + (unsigned int)input_buffer_list.mBuffers[0].mDataByteSize, + (unsigned int)input_buffer_list.mBuffers[0].mNumberChannels, + (unsigned int)input_frames, + stm->input_linear_buffer->length() / stm->input_desc.mChannelsPerFrame); + + return noErr; +} + +static OSStatus +audiounit_input_callback(void * user_ptr, AudioUnitRenderActionFlags * flags, + AudioTimeStamp const * tstamp, UInt32 bus, + UInt32 input_frames, AudioBufferList * /* bufs */) +{ + cubeb_stream * stm = static_cast(user_ptr); + + assert(stm->input_unit != NULL); + assert(AU_IN_BUS == bus); + + if (stm->shutdown) { + ALOG("(%p) input shutdown", stm); + return noErr; + } + + if (stm->draining) { + OSStatus r = AudioOutputUnitStop(stm->input_unit); + assert(r == 0); + // Only fire state callback in input-only stream. For duplex stream, + // the state callback will be fired in output callback. + if (stm->output_unit == NULL) { + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + } + return noErr; + } + + OSStatus r = audiounit_render_input(stm, flags, tstamp, bus, input_frames); + if (r != noErr) { + return r; + } + + // Full Duplex. We'll call data_callback in the AudioUnit output callback. + if (stm->output_unit != NULL) { + return noErr; + } + + /* Input only. Call the user callback through resampler. + Resampler will deliver input buffer in the correct rate. */ + assert(input_frames <= stm->input_linear_buffer->length() / + stm->input_desc.mChannelsPerFrame); + long total_input_frames = + stm->input_linear_buffer->length() / stm->input_desc.mChannelsPerFrame; + long outframes = cubeb_resampler_fill(stm->resampler.get(), + stm->input_linear_buffer->data(), + &total_input_frames, NULL, 0); + if (outframes < 0) { + stm->shutdown = true; + OSStatus r = AudioOutputUnitStop(stm->input_unit); + assert(r == 0); + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + return noErr; + } + stm->draining = outframes < total_input_frames; + + // Reset input buffer + stm->input_linear_buffer->clear(); + + return noErr; +} + +static void +audiounit_mix_output_buffer(cubeb_stream * stm, size_t output_frames, + void * input_buffer, size_t input_buffer_size, + void * output_buffer, size_t output_buffer_size) +{ + assert(input_buffer_size >= + cubeb_sample_size(stm->output_stream_params.format) * + stm->output_stream_params.channels * output_frames); + assert(output_buffer_size >= stm->output_desc.mBytesPerFrame * output_frames); + + int r = cubeb_mixer_mix(stm->mixer.get(), output_frames, input_buffer, + input_buffer_size, output_buffer, output_buffer_size); + if (r != 0) { + LOG("Remix error = %d", r); + } +} + +// Return how many input frames (sampled at input_hw_rate) are needed to provide +// output_frames (sampled at output_stream_params.rate) +static int64_t +minimum_resampling_input_frames(cubeb_stream * stm, uint32_t output_frames) +{ + if (stm->input_hw_rate == stm->output_stream_params.rate) { + // Fast path. + return output_frames; + } + return ceil(stm->input_hw_rate * output_frames / + stm->output_stream_params.rate); +} + +static OSStatus +audiounit_output_callback(void * user_ptr, + AudioUnitRenderActionFlags * /* flags */, + AudioTimeStamp const * tstamp, UInt32 bus, + UInt32 output_frames, AudioBufferList * outBufferList) +{ + assert(AU_OUT_BUS == bus); + assert(outBufferList->mNumberBuffers == 1); + + cubeb_stream * stm = static_cast(user_ptr); + + uint64_t now = ConvertHostTimeToNanos(mach_absolute_time()); + uint64_t audio_output_time = ConvertHostTimeToNanos(tstamp->mHostTime); + uint64_t output_latency_ns = audio_output_time - now; + + const int ns2s = 1e9; + // The total output latency is the timestamp difference + the stream latency + + // the hardware latency. + stm->total_output_latency_frames = + output_latency_ns * stm->output_hw_rate / ns2s + + stm->current_latency_frames; + + ALOGV("(%p) output: buffers %u, size %u, channels %u, frames %u, total input " + "frames %lu.", + stm, (unsigned int)outBufferList->mNumberBuffers, + (unsigned int)outBufferList->mBuffers[0].mDataByteSize, + (unsigned int)outBufferList->mBuffers[0].mNumberChannels, + (unsigned int)output_frames, + has_input(stm) ? stm->input_linear_buffer->length() / + stm->input_desc.mChannelsPerFrame + : 0); + + long input_frames = 0; + void *output_buffer = NULL, *input_buffer = NULL; + + if (stm->shutdown) { + ALOG("(%p) output shutdown.", stm); + audiounit_make_silent(&outBufferList->mBuffers[0]); + return noErr; + } + + if (stm->draining) { + OSStatus r = AudioOutputUnitStop(stm->output_unit); + assert(r == 0); + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + audiounit_make_silent(&outBufferList->mBuffers[0]); + return noErr; + } + + /* Get output buffer. */ + if (stm->mixer) { + // If remixing needs to occur, we can't directly work in our final + // destination buffer as data may be overwritten or too small to start with. + size_t size_needed = output_frames * stm->output_stream_params.channels * + cubeb_sample_size(stm->output_stream_params.format); + if (stm->temp_buffer_size < size_needed) { + stm->temp_buffer.reset(new uint8_t[size_needed]); + stm->temp_buffer_size = size_needed; + } + output_buffer = stm->temp_buffer.get(); + } else { + output_buffer = outBufferList->mBuffers[0].mData; + } + + stm->frames_written += output_frames; + + /* If Full duplex get also input buffer */ + if (stm->input_unit != NULL) { + /* If the output callback came first and this is a duplex stream, we need to + * fill in some additional silence in the resampler. + * Otherwise, if we had more than expected callbacks in a row, or we're + * currently switching, we add some silence as well to compensate for the + * fact that we're lacking some input data. */ + uint32_t input_frames_needed = + minimum_resampling_input_frames(stm, stm->frames_written); + long missing_frames = input_frames_needed - stm->frames_read; + if (missing_frames > 0) { + stm->input_linear_buffer->push_silence(missing_frames * + stm->input_desc.mChannelsPerFrame); + stm->frames_read = input_frames_needed; + + ALOG("(%p) %s pushed %ld frames of input silence.", stm, + stm->frames_read == 0 ? "Input hasn't started," + : stm->switching_device ? "Device switching," + : "Drop out,", + missing_frames); + } + input_buffer = stm->input_linear_buffer->data(); + // Number of input frames in the buffer. It will change to actually used + // frames inside fill + input_frames = + stm->input_linear_buffer->length() / stm->input_desc.mChannelsPerFrame; + } + + /* Call user callback through resampler. */ + long outframes = cubeb_resampler_fill(stm->resampler.get(), input_buffer, + input_buffer ? &input_frames : NULL, + output_buffer, output_frames); + + if (input_buffer) { + // Pop from the buffer the frames used by the the resampler. + stm->input_linear_buffer->pop(input_frames * + stm->input_desc.mChannelsPerFrame); + } + + if (outframes < 0 || outframes > output_frames) { + stm->shutdown = true; + OSStatus r = AudioOutputUnitStop(stm->output_unit); + assert(r == 0); + if (stm->input_unit) { + r = AudioOutputUnitStop(stm->input_unit); + assert(r == 0); + } + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + audiounit_make_silent(&outBufferList->mBuffers[0]); + return noErr; + } + + stm->draining = (UInt32)outframes < output_frames; + stm->frames_played = stm->frames_queued; + stm->frames_queued += outframes; + + /* Post process output samples. */ + if (stm->draining) { + /* Clear missing frames (silence) */ + size_t channels = stm->output_stream_params.channels; + size_t missing_samples = (output_frames - outframes) * channels; + size_t size_sample = cubeb_sample_size(stm->output_stream_params.format); + /* number of bytes that have been filled with valid audio by the callback. + */ + size_t audio_byte_count = outframes * channels * size_sample; + PodZero((uint8_t *)output_buffer + audio_byte_count, + missing_samples * size_sample); + } + + /* Mixing */ + if (stm->mixer) { + audiounit_mix_output_buffer(stm, output_frames, output_buffer, + stm->temp_buffer_size, + outBufferList->mBuffers[0].mData, + outBufferList->mBuffers[0].mDataByteSize); + } + + return noErr; +} + +extern "C" { +int +audiounit_init(cubeb ** context, char const * /* context_name */) +{ +#if !TARGET_OS_IPHONE + cubeb_set_coreaudio_notification_runloop(); +#endif + + *context = new cubeb; + + return CUBEB_OK; +} +} + +static char const * +audiounit_get_backend_id(cubeb * /* ctx */) +{ + return "audiounit"; +} + +#if !TARGET_OS_IPHONE + +static int +audiounit_stream_get_volume(cubeb_stream * stm, float * volume); +static int +audiounit_stream_set_volume(cubeb_stream * stm, float volume); + +static int +audiounit_set_device_info(cubeb_stream * stm, AudioDeviceID id, io_side side) +{ + assert(stm); + + device_info * info = nullptr; + cubeb_device_type type = CUBEB_DEVICE_TYPE_UNKNOWN; + + if (side == io_side::INPUT) { + info = &stm->input_device; + type = CUBEB_DEVICE_TYPE_INPUT; + } else if (side == io_side::OUTPUT) { + info = &stm->output_device; + type = CUBEB_DEVICE_TYPE_OUTPUT; + } + memset(info, 0, sizeof(device_info)); + info->id = id; + + if (side == io_side::INPUT) { + info->flags |= DEV_INPUT; + } else if (side == io_side::OUTPUT) { + info->flags |= DEV_OUTPUT; + } + + AudioDeviceID default_device_id = audiounit_get_default_device_id(type); + if (default_device_id == kAudioObjectUnknown) { + return CUBEB_ERROR; + } + if (id == kAudioObjectUnknown) { + info->id = default_device_id; + info->flags |= DEV_SELECTED_DEFAULT; + } + + if (info->id == default_device_id) { + info->flags |= DEV_SYSTEM_DEFAULT; + } + + assert(info->id); + assert(info->flags & DEV_INPUT && !(info->flags & DEV_OUTPUT) || + !(info->flags & DEV_INPUT) && info->flags & DEV_OUTPUT); + + return CUBEB_OK; +} + +static int +audiounit_reinit_stream(cubeb_stream * stm, device_flags_value flags) +{ + auto_lock context_lock(stm->context->mutex); + assert((flags & DEV_INPUT && stm->input_unit) || + (flags & DEV_OUTPUT && stm->output_unit)); + if (!stm->shutdown) { + audiounit_stream_stop_internal(stm); + } + + int r = audiounit_uninstall_device_changed_callback(stm); + if (r != CUBEB_OK) { + LOG("(%p) Could not uninstall all device change listeners.", stm); + } + + { + auto_lock lock(stm->mutex); + float volume = 0.0; + int vol_rv = CUBEB_ERROR; + if (stm->output_unit) { + vol_rv = audiounit_stream_get_volume(stm, &volume); + } + + audiounit_close_stream(stm); + + /* Reinit occurs in one of the following case: + * - When the device is not alive any more + * - When the default system device change. + * - The bluetooth device changed from A2DP to/from HFP/HSP profile + * We first attempt to re-use the same device id, should that fail we will + * default to the (potentially new) default device. */ + AudioDeviceID input_device = + flags & DEV_INPUT ? stm->input_device.id : kAudioObjectUnknown; + if (flags & DEV_INPUT) { + r = audiounit_set_device_info(stm, input_device, io_side::INPUT); + if (r != CUBEB_OK) { + LOG("(%p) Set input device info failed. This can happen when last " + "media device is unplugged", + stm); + return CUBEB_ERROR; + } + } + + /* Always use the default output on reinit. This is not correct in every + * case but it is sufficient for Firefox and prevent reinit from reporting + * failures. It will change soon when reinit mechanism will be updated. */ + r = audiounit_set_device_info(stm, kAudioObjectUnknown, io_side::OUTPUT); + if (r != CUBEB_OK) { + LOG("(%p) Set output device info failed. This can happen when last media " + "device is unplugged", + stm); + return CUBEB_ERROR; + } + + if (audiounit_setup_stream(stm) != CUBEB_OK) { + LOG("(%p) Stream reinit failed.", stm); + if (flags & DEV_INPUT && input_device != kAudioObjectUnknown) { + // Attempt to re-use the same device-id failed, so attempt again with + // default input device. + audiounit_close_stream(stm); + if (audiounit_set_device_info(stm, kAudioObjectUnknown, + io_side::INPUT) != CUBEB_OK || + audiounit_setup_stream(stm) != CUBEB_OK) { + LOG("(%p) Second stream reinit failed.", stm); + return CUBEB_ERROR; + } + } + } + + if (vol_rv == CUBEB_OK) { + audiounit_stream_set_volume(stm, volume); + } + + // If the stream was running, start it again. + if (!stm->shutdown) { + r = audiounit_stream_start_internal(stm); + if (r != CUBEB_OK) { + return CUBEB_ERROR; + } + } + } + return CUBEB_OK; +} + +static void +audiounit_reinit_stream_async(cubeb_stream * stm, device_flags_value flags) +{ + if (std::atomic_exchange(&stm->reinit_pending, true)) { + // A reinit task is already pending, nothing more to do. + ALOG("(%p) re-init stream task already pending, cancelling request", stm); + return; + } + + // Use a new thread, through the queue, to avoid deadlock when calling + // Get/SetProperties method from inside notify callback + dispatch_async(stm->context->serial_queue, ^() { + if (stm->destroy_pending) { + ALOG("(%p) stream pending destroy, cancelling reinit task", stm); + return; + } + + if (audiounit_reinit_stream(stm, flags) != CUBEB_OK) { + if (audiounit_uninstall_system_changed_callback(stm) != CUBEB_OK) { + LOG("(%p) Could not uninstall system changed callback", stm); + } + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + LOG("(%p) Could not reopen the stream after switching.", stm); + } + stm->switching_device = false; + stm->reinit_pending = false; + }); +} + +static char const * +event_addr_to_string(AudioObjectPropertySelector selector) +{ + switch (selector) { + case kAudioHardwarePropertyDefaultOutputDevice: + return "kAudioHardwarePropertyDefaultOutputDevice"; + case kAudioHardwarePropertyDefaultInputDevice: + return "kAudioHardwarePropertyDefaultInputDevice"; + case kAudioDevicePropertyDeviceIsAlive: + return "kAudioDevicePropertyDeviceIsAlive"; + case kAudioDevicePropertyDataSource: + return "kAudioDevicePropertyDataSource"; + default: + return "Unknown"; + } +} + +static OSStatus +audiounit_property_listener_callback( + AudioObjectID id, UInt32 address_count, + const AudioObjectPropertyAddress * addresses, void * user) +{ + cubeb_stream * stm = (cubeb_stream *)user; + if (stm->switching_device) { + LOG("Switching is already taking place. Skip Event %s for id=%d", + event_addr_to_string(addresses[0].mSelector), id); + return noErr; + } + stm->switching_device = true; + + LOG("(%p) Audio device changed, %u events.", stm, + (unsigned int)address_count); + for (UInt32 i = 0; i < address_count; i++) { + switch (addresses[i].mSelector) { + case kAudioHardwarePropertyDefaultOutputDevice: { + LOG("Event[%u] - mSelector == kAudioHardwarePropertyDefaultOutputDevice " + "for id=%d", + (unsigned int)i, id); + } break; + case kAudioHardwarePropertyDefaultInputDevice: { + LOG("Event[%u] - mSelector == kAudioHardwarePropertyDefaultInputDevice " + "for id=%d", + (unsigned int)i, id); + } break; + case kAudioDevicePropertyDeviceIsAlive: { + LOG("Event[%u] - mSelector == kAudioDevicePropertyDeviceIsAlive for " + "id=%d", + (unsigned int)i, id); + // If this is the default input device ignore the event, + // kAudioHardwarePropertyDefaultInputDevice will take care of the switch + if (stm->input_device.flags & DEV_SYSTEM_DEFAULT) { + LOG("It's the default input device, ignore the event"); + stm->switching_device = false; + return noErr; + } + } break; + case kAudioDevicePropertyDataSource: { + LOG("Event[%u] - mSelector == kAudioDevicePropertyDataSource for id=%d", + (unsigned int)i, id); + } break; + default: + LOG("Event[%u] - mSelector == Unexpected Event id %d, return", + (unsigned int)i, addresses[i].mSelector); + stm->switching_device = false; + return noErr; + } + } + + // Allow restart to choose the new default + device_flags_value switch_side = DEV_UNKNOWN; + if (has_input(stm)) { + switch_side |= DEV_INPUT; + } + if (has_output(stm)) { + switch_side |= DEV_OUTPUT; + } + + for (UInt32 i = 0; i < address_count; i++) { + switch (addresses[i].mSelector) { + case kAudioHardwarePropertyDefaultOutputDevice: + case kAudioHardwarePropertyDefaultInputDevice: + case kAudioDevicePropertyDeviceIsAlive: + /* fall through */ + case kAudioDevicePropertyDataSource: { + auto_lock dev_cb_lock(stm->device_changed_callback_lock); + if (stm->device_changed_callback) { + stm->device_changed_callback(stm->user_ptr); + } + break; + } + } + } + + audiounit_reinit_stream_async(stm, switch_side); + + return noErr; +} + +OSStatus +audiounit_add_listener(const property_listener * listener) +{ + assert(listener); + return AudioObjectAddPropertyListener(listener->device_id, + listener->property_address, + listener->callback, listener->stream); +} + +OSStatus +audiounit_remove_listener(const property_listener * listener) +{ + assert(listener); + return AudioObjectRemovePropertyListener( + listener->device_id, listener->property_address, listener->callback, + listener->stream); +} + +static int +audiounit_install_device_changed_callback(cubeb_stream * stm) +{ + OSStatus rv; + int r = CUBEB_OK; + + if (stm->output_unit) { + /* This event will notify us when the data source on the same device + * changes, for example when the user plugs in a normal (non-usb) headset in + * the headphone jack. */ + stm->output_source_listener.reset(new property_listener( + stm->output_device.id, &OUTPUT_DATA_SOURCE_PROPERTY_ADDRESS, + &audiounit_property_listener_callback, stm)); + rv = audiounit_add_listener(stm->output_source_listener.get()); + if (rv != noErr) { + stm->output_source_listener.reset(); + LOG("AudioObjectAddPropertyListener/output/" + "kAudioDevicePropertyDataSource rv=%d, device id=%d", + rv, stm->output_device.id); + r = CUBEB_ERROR; + } + } + + if (stm->input_unit) { + /* This event will notify us when the data source on the input device + * changes. */ + stm->input_source_listener.reset(new property_listener( + stm->input_device.id, &INPUT_DATA_SOURCE_PROPERTY_ADDRESS, + &audiounit_property_listener_callback, stm)); + rv = audiounit_add_listener(stm->input_source_listener.get()); + if (rv != noErr) { + stm->input_source_listener.reset(); + LOG("AudioObjectAddPropertyListener/input/kAudioDevicePropertyDataSource " + "rv=%d, device id=%d", + rv, stm->input_device.id); + r = CUBEB_ERROR; + } + + /* Event to notify when the input is going away. */ + stm->input_alive_listener.reset(new property_listener( + stm->input_device.id, &DEVICE_IS_ALIVE_PROPERTY_ADDRESS, + &audiounit_property_listener_callback, stm)); + rv = audiounit_add_listener(stm->input_alive_listener.get()); + if (rv != noErr) { + stm->input_alive_listener.reset(); + LOG("AudioObjectAddPropertyListener/input/" + "kAudioDevicePropertyDeviceIsAlive rv=%d, device id =%d", + rv, stm->input_device.id); + r = CUBEB_ERROR; + } + } + + return r; +} + +static int +audiounit_install_system_changed_callback(cubeb_stream * stm) +{ + OSStatus r; + + if (stm->output_unit) { + /* This event will notify us when the default audio device changes, + * for example when the user plugs in a USB headset and the system chooses + * it automatically as the default, or when another device is chosen in the + * dropdown list. */ + stm->default_output_listener.reset(new property_listener( + kAudioObjectSystemObject, &DEFAULT_OUTPUT_DEVICE_PROPERTY_ADDRESS, + &audiounit_property_listener_callback, stm)); + r = audiounit_add_listener(stm->default_output_listener.get()); + if (r != noErr) { + stm->default_output_listener.reset(); + LOG("AudioObjectAddPropertyListener/output/" + "kAudioHardwarePropertyDefaultOutputDevice rv=%d", + r); + return CUBEB_ERROR; + } + } + + if (stm->input_unit) { + /* This event will notify us when the default input device changes. */ + stm->default_input_listener.reset(new property_listener( + kAudioObjectSystemObject, &DEFAULT_INPUT_DEVICE_PROPERTY_ADDRESS, + &audiounit_property_listener_callback, stm)); + r = audiounit_add_listener(stm->default_input_listener.get()); + if (r != noErr) { + stm->default_input_listener.reset(); + LOG("AudioObjectAddPropertyListener/input/" + "kAudioHardwarePropertyDefaultInputDevice rv=%d", + r); + return CUBEB_ERROR; + } + } + + return CUBEB_OK; +} + +static int +audiounit_uninstall_device_changed_callback(cubeb_stream * stm) +{ + OSStatus rv; + // Failing to uninstall listeners is not a fatal error. + int r = CUBEB_OK; + + if (stm->output_source_listener) { + rv = audiounit_remove_listener(stm->output_source_listener.get()); + if (rv != noErr) { + LOG("AudioObjectRemovePropertyListener/output/" + "kAudioDevicePropertyDataSource rv=%d, device id=%d", + rv, stm->output_device.id); + r = CUBEB_ERROR; + } + stm->output_source_listener.reset(); + } + + if (stm->input_source_listener) { + rv = audiounit_remove_listener(stm->input_source_listener.get()); + if (rv != noErr) { + LOG("AudioObjectRemovePropertyListener/input/" + "kAudioDevicePropertyDataSource rv=%d, device id=%d", + rv, stm->input_device.id); + r = CUBEB_ERROR; + } + stm->input_source_listener.reset(); + } + + if (stm->input_alive_listener) { + rv = audiounit_remove_listener(stm->input_alive_listener.get()); + if (rv != noErr) { + LOG("AudioObjectRemovePropertyListener/input/" + "kAudioDevicePropertyDeviceIsAlive rv=%d, device id=%d", + rv, stm->input_device.id); + r = CUBEB_ERROR; + } + stm->input_alive_listener.reset(); + } + + return r; +} + +static int +audiounit_uninstall_system_changed_callback(cubeb_stream * stm) +{ + OSStatus r; + + if (stm->default_output_listener) { + r = audiounit_remove_listener(stm->default_output_listener.get()); + if (r != noErr) { + return CUBEB_ERROR; + } + stm->default_output_listener.reset(); + } + + if (stm->default_input_listener) { + r = audiounit_remove_listener(stm->default_input_listener.get()); + if (r != noErr) { + return CUBEB_ERROR; + } + stm->default_input_listener.reset(); + } + return CUBEB_OK; +} + +/* Get the acceptable buffer size (in frames) that this device can work with. */ +static int +audiounit_get_acceptable_latency_range(AudioValueRange * latency_range) +{ + UInt32 size; + OSStatus r; + AudioDeviceID output_device_id; + AudioObjectPropertyAddress output_device_buffer_size_range = { + kAudioDevicePropertyBufferFrameSizeRange, kAudioDevicePropertyScopeOutput, + kAudioObjectPropertyElementMaster}; + + output_device_id = audiounit_get_default_device_id(CUBEB_DEVICE_TYPE_OUTPUT); + if (output_device_id == kAudioObjectUnknown) { + LOG("Could not get default output device id."); + return CUBEB_ERROR; + } + + /* Get the buffer size range this device supports */ + size = sizeof(*latency_range); + + r = AudioObjectGetPropertyData(output_device_id, + &output_device_buffer_size_range, 0, NULL, + &size, latency_range); + if (r != noErr) { + LOG("AudioObjectGetPropertyData/buffer size range rv=%d", r); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} +#endif /* !TARGET_OS_IPHONE */ + +static AudioObjectID +audiounit_get_default_device_id(cubeb_device_type type) +{ + const AudioObjectPropertyAddress * adr; + if (type == CUBEB_DEVICE_TYPE_OUTPUT) { + adr = &DEFAULT_OUTPUT_DEVICE_PROPERTY_ADDRESS; + } else if (type == CUBEB_DEVICE_TYPE_INPUT) { + adr = &DEFAULT_INPUT_DEVICE_PROPERTY_ADDRESS; + } else { + return kAudioObjectUnknown; + } + + AudioDeviceID devid; + UInt32 size = sizeof(AudioDeviceID); + if (AudioObjectGetPropertyData(kAudioObjectSystemObject, adr, 0, NULL, &size, + &devid) != noErr) { + return kAudioObjectUnknown; + } + + return devid; +} + +int +audiounit_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ +#if TARGET_OS_IPHONE + // TODO: [[AVAudioSession sharedInstance] maximumOutputNumberOfChannels] + *max_channels = 2; +#else + UInt32 size; + OSStatus r; + AudioDeviceID output_device_id; + AudioStreamBasicDescription stream_format; + AudioObjectPropertyAddress stream_format_address = { + kAudioDevicePropertyStreamFormat, kAudioDevicePropertyScopeOutput, + kAudioObjectPropertyElementMaster}; + + assert(ctx && max_channels); + + output_device_id = audiounit_get_default_device_id(CUBEB_DEVICE_TYPE_OUTPUT); + if (output_device_id == kAudioObjectUnknown) { + return CUBEB_ERROR; + } + + size = sizeof(stream_format); + + r = AudioObjectGetPropertyData(output_device_id, &stream_format_address, 0, + NULL, &size, &stream_format); + if (r != noErr) { + LOG("AudioObjectPropertyAddress/StreamFormat rv=%d", r); + return CUBEB_ERROR; + } + + *max_channels = stream_format.mChannelsPerFrame; +#endif + return CUBEB_OK; +} + +static int +audiounit_get_min_latency(cubeb * /* ctx */, cubeb_stream_params /* params */, + uint32_t * latency_frames) +{ +#if TARGET_OS_IPHONE + // TODO: [[AVAudioSession sharedInstance] inputLatency] + return CUBEB_ERROR_NOT_SUPPORTED; +#else + AudioValueRange latency_range; + if (audiounit_get_acceptable_latency_range(&latency_range) != CUBEB_OK) { + LOG("Could not get acceptable latency range."); + return CUBEB_ERROR; + } + + *latency_frames = + max(latency_range.mMinimum, SAFE_MIN_LATENCY_FRAMES); +#endif + + return CUBEB_OK; +} + +static int +audiounit_get_preferred_sample_rate(cubeb * /* ctx */, uint32_t * rate) +{ +#if TARGET_OS_IPHONE + // TODO + return CUBEB_ERROR_NOT_SUPPORTED; +#else + UInt32 size; + OSStatus r; + Float64 fsamplerate; + AudioDeviceID output_device_id; + AudioObjectPropertyAddress samplerate_address = { + kAudioDevicePropertyNominalSampleRate, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + + output_device_id = audiounit_get_default_device_id(CUBEB_DEVICE_TYPE_OUTPUT); + if (output_device_id == kAudioObjectUnknown) { + return CUBEB_ERROR; + } + + size = sizeof(fsamplerate); + r = AudioObjectGetPropertyData(output_device_id, &samplerate_address, 0, NULL, + &size, &fsamplerate); + + if (r != noErr) { + return CUBEB_ERROR; + } + + *rate = static_cast(fsamplerate); +#endif + return CUBEB_OK; +} + +static cubeb_channel_layout +audiounit_convert_channel_layout(AudioChannelLayout * layout) +{ + // When having one or two channel, force mono or stereo. Some devices (namely, + // Bose QC35, mark 1 and 2), expose a single channel mapped to the right for + // some reason. + if (layout->mNumberChannelDescriptions == 1) { + return CUBEB_LAYOUT_MONO; + } else if (layout->mNumberChannelDescriptions == 2) { + return CUBEB_LAYOUT_STEREO; + } + + if (layout->mChannelLayoutTag != + kAudioChannelLayoutTag_UseChannelDescriptions) { + // kAudioChannelLayoutTag_UseChannelBitmap + // kAudioChannelLayoutTag_Mono + // kAudioChannelLayoutTag_Stereo + // .... + LOG("Only handle UseChannelDescriptions for now.\n"); + return CUBEB_LAYOUT_UNDEFINED; + } + + cubeb_channel_layout cl = 0; + for (UInt32 i = 0; i < layout->mNumberChannelDescriptions; ++i) { + cubeb_channel cc = channel_label_to_cubeb_channel( + layout->mChannelDescriptions[i].mChannelLabel); + if (cc == CHANNEL_UNKNOWN) { + return CUBEB_LAYOUT_UNDEFINED; + } + cl |= cc; + } + + return cl; +} + +static cubeb_channel_layout +audiounit_get_preferred_channel_layout(AudioUnit output_unit) +{ + OSStatus rv = noErr; + UInt32 size = 0; + rv = AudioUnitGetPropertyInfo( + output_unit, kAudioDevicePropertyPreferredChannelLayout, + kAudioUnitScope_Output, AU_OUT_BUS, &size, nullptr); + if (rv != noErr) { + LOG("AudioUnitGetPropertyInfo/kAudioDevicePropertyPreferredChannelLayout " + "rv=%d", + rv); + return CUBEB_LAYOUT_UNDEFINED; + } + assert(size > 0); + + auto layout = make_sized_audio_channel_layout(size); + rv = AudioUnitGetProperty( + output_unit, kAudioDevicePropertyPreferredChannelLayout, + kAudioUnitScope_Output, AU_OUT_BUS, layout.get(), &size); + if (rv != noErr) { + LOG("AudioUnitGetProperty/kAudioDevicePropertyPreferredChannelLayout rv=%d", + rv); + return CUBEB_LAYOUT_UNDEFINED; + } + + return audiounit_convert_channel_layout(layout.get()); +} + +static cubeb_channel_layout +audiounit_get_current_channel_layout(AudioUnit output_unit) +{ + OSStatus rv = noErr; + UInt32 size = 0; + rv = AudioUnitGetPropertyInfo( + output_unit, kAudioUnitProperty_AudioChannelLayout, + kAudioUnitScope_Output, AU_OUT_BUS, &size, nullptr); + if (rv != noErr) { + LOG("AudioUnitGetPropertyInfo/kAudioUnitProperty_AudioChannelLayout rv=%d", + rv); + // This property isn't known before macOS 10.12, attempt another method. + return audiounit_get_preferred_channel_layout(output_unit); + } + assert(size > 0); + + auto layout = make_sized_audio_channel_layout(size); + rv = AudioUnitGetProperty(output_unit, kAudioUnitProperty_AudioChannelLayout, + kAudioUnitScope_Output, AU_OUT_BUS, layout.get(), + &size); + if (rv != noErr) { + LOG("AudioUnitGetProperty/kAudioUnitProperty_AudioChannelLayout rv=%d", rv); + return CUBEB_LAYOUT_UNDEFINED; + } + + return audiounit_convert_channel_layout(layout.get()); +} + +static int +audiounit_create_unit(AudioUnit * unit, device_info * device); + +static OSStatus +audiounit_remove_device_listener(cubeb * context, cubeb_device_type devtype); + +static void +audiounit_destroy(cubeb * ctx) +{ + { + auto_lock lock(ctx->mutex); + + // Disabling this assert for bug 1083664 -- we seem to leak a stream + // assert(ctx->active_streams == 0); + if (audiounit_active_streams(ctx) > 0) { + LOG("(%p) API misuse, %d streams active when context destroyed!", ctx, + audiounit_active_streams(ctx)); + } + + // Destroying a cubeb context with device collection callbacks registered + // is misuse of the API, assert then attempt to clean up. + assert(!ctx->input_collection_changed_callback && + !ctx->input_collection_changed_user_ptr && + !ctx->output_collection_changed_callback && + !ctx->output_collection_changed_user_ptr); + + /* Unregister the callback if necessary. */ + if (ctx->input_collection_changed_callback) { + audiounit_remove_device_listener(ctx, CUBEB_DEVICE_TYPE_INPUT); + } + if (ctx->output_collection_changed_callback) { + audiounit_remove_device_listener(ctx, CUBEB_DEVICE_TYPE_OUTPUT); + } + } + + dispatch_release(ctx->serial_queue); + + delete ctx; +} + +static void +audiounit_stream_destroy(cubeb_stream * stm); + +static int +audio_stream_desc_init(AudioStreamBasicDescription * ss, + const cubeb_stream_params * stream_params) +{ + switch (stream_params->format) { + case CUBEB_SAMPLE_S16LE: + ss->mBitsPerChannel = 16; + ss->mFormatFlags = kAudioFormatFlagIsSignedInteger; + break; + case CUBEB_SAMPLE_S16BE: + ss->mBitsPerChannel = 16; + ss->mFormatFlags = + kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsBigEndian; + break; + case CUBEB_SAMPLE_FLOAT32LE: + ss->mBitsPerChannel = 32; + ss->mFormatFlags = kAudioFormatFlagIsFloat; + break; + case CUBEB_SAMPLE_FLOAT32BE: + ss->mBitsPerChannel = 32; + ss->mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsBigEndian; + break; + default: + return CUBEB_ERROR_INVALID_FORMAT; + } + + ss->mFormatID = kAudioFormatLinearPCM; + ss->mFormatFlags |= kLinearPCMFormatFlagIsPacked; + ss->mSampleRate = stream_params->rate; + ss->mChannelsPerFrame = stream_params->channels; + + ss->mBytesPerFrame = (ss->mBitsPerChannel / 8) * ss->mChannelsPerFrame; + ss->mFramesPerPacket = 1; + ss->mBytesPerPacket = ss->mBytesPerFrame * ss->mFramesPerPacket; + + ss->mReserved = 0; + + return CUBEB_OK; +} + +void +audiounit_init_mixer(cubeb_stream * stm) +{ + // We can't rely on macOS' AudioUnit to properly downmix (or upmix) the audio + // data, it silently drop the channels so we need to remix the + // audio data by ourselves to keep all the information. + stm->mixer.reset(cubeb_mixer_create( + stm->output_stream_params.format, stm->output_stream_params.channels, + stm->output_stream_params.layout, stm->context->channels, + stm->context->layout)); + assert(stm->mixer); +} + +static int +audiounit_set_channel_layout(AudioUnit unit, io_side side, + cubeb_channel_layout layout) +{ + if (side != io_side::OUTPUT) { + return CUBEB_ERROR; + } + + if (layout == CUBEB_LAYOUT_UNDEFINED) { + // We leave everything as-is... + return CUBEB_OK; + } + + OSStatus r; + uint32_t nb_channels = cubeb_channel_layout_nb_channels(layout); + + // We do not use CoreAudio standard layout for lack of documentation on what + // the actual channel orders are. So we set a custom layout. + size_t size = offsetof(AudioChannelLayout, mChannelDescriptions[nb_channels]); + auto au_layout = make_sized_audio_channel_layout(size); + au_layout->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions; + au_layout->mNumberChannelDescriptions = nb_channels; + + uint32_t channels = 0; + cubeb_channel_layout channelMap = layout; + for (uint32_t i = 0; channelMap != 0; ++i) { + XASSERT(channels < nb_channels); + uint32_t channel = (channelMap & 1) << i; + if (channel != 0) { + au_layout->mChannelDescriptions[channels].mChannelLabel = + cubeb_channel_to_channel_label(static_cast(channel)); + au_layout->mChannelDescriptions[channels].mChannelFlags = + kAudioChannelFlags_AllOff; + channels++; + } + channelMap = channelMap >> 1; + } + + r = AudioUnitSetProperty(unit, kAudioUnitProperty_AudioChannelLayout, + kAudioUnitScope_Input, AU_OUT_BUS, au_layout.get(), + size); + if (r != noErr) { + LOG("AudioUnitSetProperty/%s/kAudioUnitProperty_AudioChannelLayout rv=%d", + to_string(side), r); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +void +audiounit_layout_init(cubeb_stream * stm, io_side side) +{ + // We currently don't support the input layout setting. + if (side == io_side::INPUT) { + return; + } + + stm->context->layout = audiounit_get_current_channel_layout(stm->output_unit); + + audiounit_set_channel_layout(stm->output_unit, io_side::OUTPUT, + stm->context->layout); +} + +static vector +audiounit_get_sub_devices(AudioDeviceID device_id) +{ + vector sub_devices; + AudioObjectPropertyAddress property_address = { + kAudioAggregateDevicePropertyActiveSubDeviceList, + kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster}; + UInt32 size = 0; + OSStatus rv = AudioObjectGetPropertyDataSize(device_id, &property_address, 0, + nullptr, &size); + + if (rv != noErr) { + sub_devices.push_back(device_id); + return sub_devices; + } + + uint32_t count = static_cast(size / sizeof(AudioObjectID)); + sub_devices.resize(count); + rv = AudioObjectGetPropertyData(device_id, &property_address, 0, nullptr, + &size, sub_devices.data()); + if (rv != noErr) { + sub_devices.clear(); + sub_devices.push_back(device_id); + } else { + LOG("Found %u sub-devices", count); + } + return sub_devices; +} + +static int +audiounit_create_blank_aggregate_device(AudioObjectID * plugin_id, + AudioDeviceID * aggregate_device_id) +{ + AudioObjectPropertyAddress address_plugin_bundle_id = { + kAudioHardwarePropertyPlugInForBundleID, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + UInt32 size = 0; + OSStatus r = AudioObjectGetPropertyDataSize( + kAudioObjectSystemObject, &address_plugin_bundle_id, 0, NULL, &size); + if (r != noErr) { + LOG("AudioObjectGetPropertyDataSize/" + "kAudioHardwarePropertyPlugInForBundleID, rv=%d", + r); + return CUBEB_ERROR; + } + + AudioValueTranslation translation_value; + CFStringRef in_bundle_ref = CFSTR("com.apple.audio.CoreAudio"); + translation_value.mInputData = &in_bundle_ref; + translation_value.mInputDataSize = sizeof(in_bundle_ref); + translation_value.mOutputData = plugin_id; + translation_value.mOutputDataSize = sizeof(*plugin_id); + + r = AudioObjectGetPropertyData(kAudioObjectSystemObject, + &address_plugin_bundle_id, 0, nullptr, &size, + &translation_value); + if (r != noErr) { + LOG("AudioObjectGetPropertyData/kAudioHardwarePropertyPlugInForBundleID, " + "rv=%d", + r); + return CUBEB_ERROR; + } + + AudioObjectPropertyAddress create_aggregate_device_address = { + kAudioPlugInCreateAggregateDevice, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + r = AudioObjectGetPropertyDataSize( + *plugin_id, &create_aggregate_device_address, 0, nullptr, &size); + if (r != noErr) { + LOG("AudioObjectGetPropertyDataSize/kAudioPlugInCreateAggregateDevice, " + "rv=%d", + r); + return CUBEB_ERROR; + } + + CFMutableDictionaryRef aggregate_device_dict = CFDictionaryCreateMutable( + kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + struct timeval timestamp; + gettimeofday(×tamp, NULL); + long long int time_id = timestamp.tv_sec * 1000000LL + timestamp.tv_usec; + CFStringRef aggregate_device_name = CFStringCreateWithFormat( + NULL, NULL, CFSTR("%s_%llx"), PRIVATE_AGGREGATE_DEVICE_NAME, time_id); + CFDictionaryAddValue(aggregate_device_dict, + CFSTR(kAudioAggregateDeviceNameKey), + aggregate_device_name); + CFRelease(aggregate_device_name); + + CFStringRef aggregate_device_UID = + CFStringCreateWithFormat(NULL, NULL, CFSTR("org.mozilla.%s_%llx"), + PRIVATE_AGGREGATE_DEVICE_NAME, time_id); + CFDictionaryAddValue(aggregate_device_dict, + CFSTR(kAudioAggregateDeviceUIDKey), + aggregate_device_UID); + CFRelease(aggregate_device_UID); + + int private_value = 1; + CFNumberRef aggregate_device_private_key = + CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &private_value); + CFDictionaryAddValue(aggregate_device_dict, + CFSTR(kAudioAggregateDeviceIsPrivateKey), + aggregate_device_private_key); + CFRelease(aggregate_device_private_key); + + int stacked_value = 0; + CFNumberRef aggregate_device_stacked_key = + CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &stacked_value); + CFDictionaryAddValue(aggregate_device_dict, + CFSTR(kAudioAggregateDeviceIsStackedKey), + aggregate_device_stacked_key); + CFRelease(aggregate_device_stacked_key); + + r = AudioObjectGetPropertyData(*plugin_id, &create_aggregate_device_address, + sizeof(aggregate_device_dict), + &aggregate_device_dict, &size, + aggregate_device_id); + CFRelease(aggregate_device_dict); + if (r != noErr) { + LOG("AudioObjectGetPropertyData/kAudioPlugInCreateAggregateDevice, rv=%d", + r); + return CUBEB_ERROR; + } + LOG("New aggregate device %u", *aggregate_device_id); + + return CUBEB_OK; +} + +// The returned CFStringRef object needs to be released (via CFRelease) +// if it's not NULL, since the reference count of the returned CFStringRef +// object is increased. +static CFStringRef +get_device_name(AudioDeviceID id) +{ + UInt32 size = sizeof(CFStringRef); + CFStringRef UIname = nullptr; + AudioObjectPropertyAddress address_uuid = {kAudioDevicePropertyDeviceUID, + kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + OSStatus err = + AudioObjectGetPropertyData(id, &address_uuid, 0, nullptr, &size, &UIname); + return (err == noErr) ? UIname : NULL; +} + +static int +audiounit_set_aggregate_sub_device_list(AudioDeviceID aggregate_device_id, + AudioDeviceID input_device_id, + AudioDeviceID output_device_id) +{ + LOG("Add devices input %u and output %u into aggregate device %u", + input_device_id, output_device_id, aggregate_device_id); + const vector output_sub_devices = + audiounit_get_sub_devices(output_device_id); + const vector input_sub_devices = + audiounit_get_sub_devices(input_device_id); + + CFMutableArrayRef aggregate_sub_devices_array = + CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); + /* The order of the items in the array is significant and is used to determine + the order of the streams of the AudioAggregateDevice. */ + for (UInt32 i = 0; i < output_sub_devices.size(); i++) { + CFStringRef ref = get_device_name(output_sub_devices[i]); + if (ref == NULL) { + CFRelease(aggregate_sub_devices_array); + return CUBEB_ERROR; + } + CFArrayAppendValue(aggregate_sub_devices_array, ref); + CFRelease(ref); + } + for (UInt32 i = 0; i < input_sub_devices.size(); i++) { + CFStringRef ref = get_device_name(input_sub_devices[i]); + if (ref == NULL) { + CFRelease(aggregate_sub_devices_array); + return CUBEB_ERROR; + } + CFArrayAppendValue(aggregate_sub_devices_array, ref); + CFRelease(ref); + } + + AudioObjectPropertyAddress aggregate_sub_device_list = { + kAudioAggregateDevicePropertyFullSubDeviceList, + kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster}; + UInt32 size = sizeof(CFMutableArrayRef); + OSStatus rv = AudioObjectSetPropertyData( + aggregate_device_id, &aggregate_sub_device_list, 0, nullptr, size, + &aggregate_sub_devices_array); + CFRelease(aggregate_sub_devices_array); + if (rv != noErr) { + LOG("AudioObjectSetPropertyData/" + "kAudioAggregateDevicePropertyFullSubDeviceList, rv=%d", + rv); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +static int +audiounit_set_master_aggregate_device(const AudioDeviceID aggregate_device_id) +{ + assert(aggregate_device_id != kAudioObjectUnknown); + AudioObjectPropertyAddress master_aggregate_sub_device = { + kAudioAggregateDevicePropertyMasterSubDevice, + kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster}; + + // Master become the 1st output sub device + AudioDeviceID output_device_id = + audiounit_get_default_device_id(CUBEB_DEVICE_TYPE_OUTPUT); + const vector output_sub_devices = + audiounit_get_sub_devices(output_device_id); + CFStringRef master_sub_device = get_device_name(output_sub_devices[0]); + + UInt32 size = sizeof(CFStringRef); + OSStatus rv = AudioObjectSetPropertyData(aggregate_device_id, + &master_aggregate_sub_device, 0, + NULL, size, &master_sub_device); + if (master_sub_device) { + CFRelease(master_sub_device); + } + if (rv != noErr) { + LOG("AudioObjectSetPropertyData/" + "kAudioAggregateDevicePropertyMasterSubDevice, rv=%d", + rv); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +static int +audiounit_activate_clock_drift_compensation( + const AudioDeviceID aggregate_device_id) +{ + assert(aggregate_device_id != kAudioObjectUnknown); + AudioObjectPropertyAddress address_owned = { + kAudioObjectPropertyOwnedObjects, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + + UInt32 qualifier_data_size = sizeof(AudioObjectID); + AudioClassID class_id = kAudioSubDeviceClassID; + void * qualifier_data = &class_id; + UInt32 size = 0; + OSStatus rv = AudioObjectGetPropertyDataSize( + aggregate_device_id, &address_owned, qualifier_data_size, qualifier_data, + &size); + if (rv != noErr) { + LOG("AudioObjectGetPropertyDataSize/kAudioObjectPropertyOwnedObjects, " + "rv=%d", + rv); + return CUBEB_ERROR; + } + + UInt32 subdevices_num = 0; + subdevices_num = size / sizeof(AudioObjectID); + AudioObjectID sub_devices[subdevices_num]; + size = sizeof(sub_devices); + + rv = AudioObjectGetPropertyData(aggregate_device_id, &address_owned, + qualifier_data_size, qualifier_data, &size, + sub_devices); + if (rv != noErr) { + LOG("AudioObjectGetPropertyData/kAudioObjectPropertyOwnedObjects, rv=%d", + rv); + return CUBEB_ERROR; + } + + AudioObjectPropertyAddress address_drift = { + kAudioSubDevicePropertyDriftCompensation, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + + // Start from the second device since the first is the master clock + for (UInt32 i = 1; i < subdevices_num; ++i) { + UInt32 drift_compensation_value = 1; + rv = AudioObjectSetPropertyData(sub_devices[i], &address_drift, 0, nullptr, + sizeof(UInt32), &drift_compensation_value); + if (rv != noErr) { + LOG("AudioObjectSetPropertyData/" + "kAudioSubDevicePropertyDriftCompensation, rv=%d", + rv); + return CUBEB_OK; + } + } + return CUBEB_OK; +} + +static int +audiounit_destroy_aggregate_device(AudioObjectID plugin_id, + AudioDeviceID * aggregate_device_id); +static void +audiounit_get_available_samplerate(AudioObjectID devid, + AudioObjectPropertyScope scope, + uint32_t * min, uint32_t * max, + uint32_t * def); +static int +audiounit_create_device_from_hwdev(cubeb_device_info * dev_info, + AudioObjectID devid, cubeb_device_type type); +static void +audiounit_device_destroy(cubeb_device_info * device); + +static void +audiounit_workaround_for_airpod(cubeb_stream * stm) +{ + cubeb_device_info input_device_info; + audiounit_create_device_from_hwdev(&input_device_info, stm->input_device.id, + CUBEB_DEVICE_TYPE_INPUT); + + cubeb_device_info output_device_info; + audiounit_create_device_from_hwdev(&output_device_info, stm->output_device.id, + CUBEB_DEVICE_TYPE_OUTPUT); + + std::string input_name_str(input_device_info.friendly_name); + std::string output_name_str(output_device_info.friendly_name); + + if (input_name_str.find("AirPods") != std::string::npos && + output_name_str.find("AirPods") != std::string::npos) { + uint32_t input_min_rate = 0; + uint32_t input_max_rate = 0; + uint32_t input_nominal_rate = 0; + audiounit_get_available_samplerate( + stm->input_device.id, kAudioObjectPropertyScopeGlobal, &input_min_rate, + &input_max_rate, &input_nominal_rate); + LOG("(%p) Input device %u, name: %s, min: %u, max: %u, nominal rate: %u", + stm, stm->input_device.id, input_device_info.friendly_name, + input_min_rate, input_max_rate, input_nominal_rate); + uint32_t output_min_rate = 0; + uint32_t output_max_rate = 0; + uint32_t output_nominal_rate = 0; + audiounit_get_available_samplerate( + stm->output_device.id, kAudioObjectPropertyScopeGlobal, + &output_min_rate, &output_max_rate, &output_nominal_rate); + LOG("(%p) Output device %u, name: %s, min: %u, max: %u, nominal rate: %u", + stm, stm->output_device.id, output_device_info.friendly_name, + output_min_rate, output_max_rate, output_nominal_rate); + + Float64 rate = input_nominal_rate; + AudioObjectPropertyAddress addr = {kAudioDevicePropertyNominalSampleRate, + kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + + OSStatus rv = AudioObjectSetPropertyData(stm->aggregate_device_id, &addr, 0, + nullptr, sizeof(Float64), &rate); + if (rv != noErr) { + LOG("Non fatal error, " + "AudioObjectSetPropertyData/kAudioDevicePropertyNominalSampleRate, " + "rv=%d", + rv); + } + } + audiounit_device_destroy(&input_device_info); + audiounit_device_destroy(&output_device_info); +} + +/* + * Aggregate Device is a virtual audio interface which utilizes inputs and + * outputs of one or more physical audio interfaces. It is possible to use the + * clock of one of the devices as a master clock for all the combined devices + * and enable drift compensation for the devices that are not designated clock + * master. + * + * Creating a new aggregate device programmatically requires [0][1]: + * 1. Locate the base plug-in ("com.apple.audio.CoreAudio") + * 2. Create a dictionary that describes the aggregate device + * (don't add sub-devices in that step, prone to fail [0]) + * 3. Ask the base plug-in to create the aggregate device (blank) + * 4. Add the array of sub-devices. + * 5. Set the master device (1st output device in our case) + * 6. Enable drift compensation for the non-master devices + * + * [0] https://lists.apple.com/archives/coreaudio-api/2006/Apr/msg00092.html + * [1] https://lists.apple.com/archives/coreaudio-api/2005/Jul/msg00150.html + * [2] CoreAudio.framework/Headers/AudioHardware.h + * */ +static int +audiounit_create_aggregate_device(cubeb_stream * stm) +{ + int r = audiounit_create_blank_aggregate_device(&stm->plugin_id, + &stm->aggregate_device_id); + if (r != CUBEB_OK) { + LOG("(%p) Failed to create blank aggregate device", stm); + return CUBEB_ERROR; + } + + r = audiounit_set_aggregate_sub_device_list( + stm->aggregate_device_id, stm->input_device.id, stm->output_device.id); + if (r != CUBEB_OK) { + LOG("(%p) Failed to set aggregate sub-device list", stm); + audiounit_destroy_aggregate_device(stm->plugin_id, + &stm->aggregate_device_id); + return CUBEB_ERROR; + } + + r = audiounit_set_master_aggregate_device(stm->aggregate_device_id); + if (r != CUBEB_OK) { + LOG("(%p) Failed to set master sub-device for aggregate device", stm); + audiounit_destroy_aggregate_device(stm->plugin_id, + &stm->aggregate_device_id); + return CUBEB_ERROR; + } + + r = audiounit_activate_clock_drift_compensation(stm->aggregate_device_id); + if (r != CUBEB_OK) { + LOG("(%p) Failed to activate clock drift compensation for aggregate device", + stm); + audiounit_destroy_aggregate_device(stm->plugin_id, + &stm->aggregate_device_id); + return CUBEB_ERROR; + } + + audiounit_workaround_for_airpod(stm); + + return CUBEB_OK; +} + +static int +audiounit_destroy_aggregate_device(AudioObjectID plugin_id, + AudioDeviceID * aggregate_device_id) +{ + assert(aggregate_device_id && *aggregate_device_id != kAudioDeviceUnknown && + plugin_id != kAudioObjectUnknown); + AudioObjectPropertyAddress destroy_aggregate_device_addr = { + kAudioPlugInDestroyAggregateDevice, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + UInt32 size; + OSStatus rv = AudioObjectGetPropertyDataSize( + plugin_id, &destroy_aggregate_device_addr, 0, NULL, &size); + if (rv != noErr) { + LOG("AudioObjectGetPropertyDataSize/kAudioPlugInDestroyAggregateDevice, " + "rv=%d", + rv); + return CUBEB_ERROR; + } + + rv = AudioObjectGetPropertyData(plugin_id, &destroy_aggregate_device_addr, 0, + NULL, &size, aggregate_device_id); + if (rv != noErr) { + LOG("AudioObjectGetPropertyData/kAudioPlugInDestroyAggregateDevice, rv=%d", + rv); + return CUBEB_ERROR; + } + + LOG("Destroyed aggregate device %d", *aggregate_device_id); + *aggregate_device_id = kAudioObjectUnknown; + return CUBEB_OK; +} + +static int +audiounit_new_unit_instance(AudioUnit * unit, device_info * device) +{ + AudioComponentDescription desc; + AudioComponent comp; + OSStatus rv; + + desc.componentType = kAudioUnitType_Output; +#if TARGET_OS_IPHONE + desc.componentSubType = kAudioUnitSubType_RemoteIO; +#else + // Use the DefaultOutputUnit for output when no device is specified + // so we retain automatic output device switching when the default + // changes. Once we have complete support for device notifications + // and switching, we can use the AUHAL for everything. + if ((device->flags & DEV_SYSTEM_DEFAULT) && (device->flags & DEV_OUTPUT)) { + desc.componentSubType = kAudioUnitSubType_DefaultOutput; + } else { + desc.componentSubType = kAudioUnitSubType_HALOutput; + } +#endif + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + comp = AudioComponentFindNext(NULL, &desc); + if (comp == NULL) { + LOG("Could not find matching audio hardware."); + return CUBEB_ERROR; + } + + rv = AudioComponentInstanceNew(comp, unit); + if (rv != noErr) { + LOG("AudioComponentInstanceNew rv=%d", rv); + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +enum enable_state { + DISABLE, + ENABLE, +}; + +static int +audiounit_enable_unit_scope(AudioUnit * unit, io_side side, enable_state state) +{ + OSStatus rv; + UInt32 enable = state; + rv = AudioUnitSetProperty(*unit, kAudioOutputUnitProperty_EnableIO, + (side == io_side::INPUT) ? kAudioUnitScope_Input + : kAudioUnitScope_Output, + (side == io_side::INPUT) ? AU_IN_BUS : AU_OUT_BUS, + &enable, sizeof(UInt32)); + if (rv != noErr) { + LOG("AudioUnitSetProperty/kAudioOutputUnitProperty_EnableIO rv=%d", rv); + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +static int +audiounit_create_unit(AudioUnit * unit, device_info * device) +{ + assert(*unit == nullptr); + assert(device); + + OSStatus rv; + int r; + + r = audiounit_new_unit_instance(unit, device); + if (r != CUBEB_OK) { + return r; + } + assert(*unit); + + if ((device->flags & DEV_SYSTEM_DEFAULT) && (device->flags & DEV_OUTPUT)) { + return CUBEB_OK; + } + + if (device->flags & DEV_INPUT) { + r = audiounit_enable_unit_scope(unit, io_side::INPUT, ENABLE); + if (r != CUBEB_OK) { + LOG("Failed to enable audiounit input scope"); + return r; + } + r = audiounit_enable_unit_scope(unit, io_side::OUTPUT, DISABLE); + if (r != CUBEB_OK) { + LOG("Failed to disable audiounit output scope"); + return r; + } + } else if (device->flags & DEV_OUTPUT) { + r = audiounit_enable_unit_scope(unit, io_side::OUTPUT, ENABLE); + if (r != CUBEB_OK) { + LOG("Failed to enable audiounit output scope"); + return r; + } + r = audiounit_enable_unit_scope(unit, io_side::INPUT, DISABLE); + if (r != CUBEB_OK) { + LOG("Failed to disable audiounit input scope"); + return r; + } + } else { + assert(false); + } + + rv = AudioUnitSetProperty(*unit, kAudioOutputUnitProperty_CurrentDevice, + kAudioUnitScope_Global, 0, &device->id, + sizeof(AudioDeviceID)); + if (rv != noErr) { + LOG("AudioUnitSetProperty/kAudioOutputUnitProperty_CurrentDevice rv=%d", + rv); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +static int +audiounit_init_input_linear_buffer(cubeb_stream * stream, uint32_t capacity) +{ + uint32_t size = + capacity * stream->latency_frames * stream->input_desc.mChannelsPerFrame; + if (stream->input_desc.mFormatFlags & kAudioFormatFlagIsSignedInteger) { + stream->input_linear_buffer.reset(new auto_array_wrapper_impl(size)); + } else { + stream->input_linear_buffer.reset(new auto_array_wrapper_impl(size)); + } + assert(stream->input_linear_buffer->length() == 0); + + return CUBEB_OK; +} + +static uint32_t +audiounit_clamp_latency(cubeb_stream * stm, uint32_t latency_frames) +{ + // For the 1st stream set anything within safe min-max + assert(audiounit_active_streams(stm->context) > 0); + if (audiounit_active_streams(stm->context) == 1) { + return max(min(latency_frames, SAFE_MAX_LATENCY_FRAMES), + SAFE_MIN_LATENCY_FRAMES); + } + assert(stm->output_unit); + + // If more than one stream operates in parallel + // allow only lower values of latency + int r; + UInt32 output_buffer_size = 0; + UInt32 size = sizeof(output_buffer_size); + if (stm->output_unit) { + r = AudioUnitGetProperty( + stm->output_unit, kAudioDevicePropertyBufferFrameSize, + kAudioUnitScope_Output, AU_OUT_BUS, &output_buffer_size, &size); + if (r != noErr) { + LOG("AudioUnitGetProperty/output/kAudioDevicePropertyBufferFrameSize " + "rv=%d", + r); + return 0; + } + + output_buffer_size = + max(min(output_buffer_size, SAFE_MAX_LATENCY_FRAMES), + SAFE_MIN_LATENCY_FRAMES); + } + + UInt32 input_buffer_size = 0; + if (stm->input_unit) { + r = AudioUnitGetProperty( + stm->input_unit, kAudioDevicePropertyBufferFrameSize, + kAudioUnitScope_Input, AU_IN_BUS, &input_buffer_size, &size); + if (r != noErr) { + LOG("AudioUnitGetProperty/input/kAudioDevicePropertyBufferFrameSize " + "rv=%d", + r); + return 0; + } + + input_buffer_size = + max(min(input_buffer_size, SAFE_MAX_LATENCY_FRAMES), + SAFE_MIN_LATENCY_FRAMES); + } + + // Every following active streams can only set smaller latency + UInt32 upper_latency_limit = 0; + if (input_buffer_size != 0 && output_buffer_size != 0) { + upper_latency_limit = min(input_buffer_size, output_buffer_size); + } else if (input_buffer_size != 0) { + upper_latency_limit = input_buffer_size; + } else if (output_buffer_size != 0) { + upper_latency_limit = output_buffer_size; + } else { + upper_latency_limit = SAFE_MAX_LATENCY_FRAMES; + } + + return max(min(latency_frames, upper_latency_limit), + SAFE_MIN_LATENCY_FRAMES); +} + +/* + * Change buffer size is prone to deadlock thus we change it + * following the steps: + * - register a listener for the buffer size property + * - change the property + * - wait until the listener is executed + * - property has changed, remove the listener + * */ +static void +buffer_size_changed_callback(void * inClientData, AudioUnit inUnit, + AudioUnitPropertyID inPropertyID, + AudioUnitScope inScope, AudioUnitElement inElement) +{ + cubeb_stream * stm = (cubeb_stream *)inClientData; + + AudioUnit au = inUnit; + AudioUnitScope au_scope = kAudioUnitScope_Input; + AudioUnitElement au_element = inElement; + char const * au_type = "output"; + + if (AU_IN_BUS == inElement) { + au_scope = kAudioUnitScope_Output; + au_type = "input"; + } + + switch (inPropertyID) { + + case kAudioDevicePropertyBufferFrameSize: { + if (inScope != au_scope) { + break; + } + UInt32 new_buffer_size; + UInt32 outSize = sizeof(UInt32); + OSStatus r = + AudioUnitGetProperty(au, kAudioDevicePropertyBufferFrameSize, au_scope, + au_element, &new_buffer_size, &outSize); + if (r != noErr) { + LOG("(%p) Event: kAudioDevicePropertyBufferFrameSize: Cannot get current " + "buffer size", + stm); + } else { + LOG("(%p) Event: kAudioDevicePropertyBufferFrameSize: New %s buffer size " + "= %d for scope %d", + stm, au_type, new_buffer_size, inScope); + } + stm->buffer_size_change_state = true; + break; + } + } +} + +static int +audiounit_set_buffer_size(cubeb_stream * stm, uint32_t new_size_frames, + io_side side) +{ + AudioUnit au = stm->output_unit; + AudioUnitScope au_scope = kAudioUnitScope_Input; + AudioUnitElement au_element = AU_OUT_BUS; + + if (side == io_side::INPUT) { + au = stm->input_unit; + au_scope = kAudioUnitScope_Output; + au_element = AU_IN_BUS; + } + + uint32_t buffer_frames = 0; + UInt32 size = sizeof(buffer_frames); + int r = AudioUnitGetProperty(au, kAudioDevicePropertyBufferFrameSize, + au_scope, au_element, &buffer_frames, &size); + if (r != noErr) { + LOG("AudioUnitGetProperty/%s/kAudioDevicePropertyBufferFrameSize rv=%d", + to_string(side), r); + return CUBEB_ERROR; + } + + if (new_size_frames == buffer_frames) { + LOG("(%p) No need to update %s buffer size already %u frames", stm, + to_string(side), buffer_frames); + return CUBEB_OK; + } + + r = AudioUnitAddPropertyListener(au, kAudioDevicePropertyBufferFrameSize, + buffer_size_changed_callback, stm); + if (r != noErr) { + LOG("AudioUnitAddPropertyListener/%s/kAudioDevicePropertyBufferFrameSize " + "rv=%d", + to_string(side), r); + return CUBEB_ERROR; + } + + stm->buffer_size_change_state = false; + + r = AudioUnitSetProperty(au, kAudioDevicePropertyBufferFrameSize, au_scope, + au_element, &new_size_frames, + sizeof(new_size_frames)); + if (r != noErr) { + LOG("AudioUnitSetProperty/%s/kAudioDevicePropertyBufferFrameSize rv=%d", + to_string(side), r); + + r = AudioUnitRemovePropertyListenerWithUserData( + au, kAudioDevicePropertyBufferFrameSize, buffer_size_changed_callback, + stm); + if (r != noErr) { + LOG("AudioUnitAddPropertyListener/%s/kAudioDevicePropertyBufferFrameSize " + "rv=%d", + to_string(side), r); + } + + return CUBEB_ERROR; + } + + int count = 0; + while (!stm->buffer_size_change_state && count++ < 30) { + struct timespec req, rem; + req.tv_sec = 0; + req.tv_nsec = 100000000L; // 0.1 sec + if (nanosleep(&req, &rem) < 0) { + LOG("(%p) Warning: nanosleep call failed or interrupted. Remaining time " + "%ld nano secs \n", + stm, rem.tv_nsec); + } + LOG("(%p) audiounit_set_buffer_size : wait count = %d", stm, count); + } + + r = AudioUnitRemovePropertyListenerWithUserData( + au, kAudioDevicePropertyBufferFrameSize, buffer_size_changed_callback, + stm); + if (r != noErr) { + LOG("AudioUnitAddPropertyListener/%s/kAudioDevicePropertyBufferFrameSize " + "rv=%d", + to_string(side), r); + return CUBEB_ERROR; + } + + if (!stm->buffer_size_change_state && count >= 30) { + LOG("(%p) Error, did not get buffer size change callback ...", stm); + return CUBEB_ERROR; + } + + LOG("(%p) %s buffer size changed to %u frames.", stm, to_string(side), + new_size_frames); + return CUBEB_OK; +} + +static int +audiounit_configure_input(cubeb_stream * stm) +{ + assert(stm && stm->input_unit); + + int r = 0; + UInt32 size; + AURenderCallbackStruct aurcbs_in; + + LOG("(%p) Opening input side: rate %u, channels %u, format %d, latency in " + "frames %u.", + stm, stm->input_stream_params.rate, stm->input_stream_params.channels, + stm->input_stream_params.format, stm->latency_frames); + + /* Get input device sample rate. */ + AudioStreamBasicDescription input_hw_desc; + size = sizeof(AudioStreamBasicDescription); + r = AudioUnitGetProperty(stm->input_unit, kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, AU_IN_BUS, &input_hw_desc, + &size); + if (r != noErr) { + LOG("AudioUnitGetProperty/input/kAudioUnitProperty_StreamFormat rv=%d", r); + return CUBEB_ERROR; + } + stm->input_hw_rate = input_hw_desc.mSampleRate; + LOG("(%p) Input device sampling rate: %.2f", stm, stm->input_hw_rate); + + /* Set format description according to the input params. */ + r = audio_stream_desc_init(&stm->input_desc, &stm->input_stream_params); + if (r != CUBEB_OK) { + LOG("(%p) Setting format description for input failed.", stm); + return r; + } + + // Use latency to set buffer size + r = audiounit_set_buffer_size(stm, stm->latency_frames, io_side::INPUT); + if (r != CUBEB_OK) { + LOG("(%p) Error in change input buffer size.", stm); + return CUBEB_ERROR; + } + + AudioStreamBasicDescription src_desc = stm->input_desc; + /* Input AudioUnit must be configured with device's sample rate. + we will resample inside input callback. */ + src_desc.mSampleRate = stm->input_hw_rate; + + r = AudioUnitSetProperty(stm->input_unit, kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, AU_IN_BUS, &src_desc, + sizeof(AudioStreamBasicDescription)); + if (r != noErr) { + LOG("AudioUnitSetProperty/input/kAudioUnitProperty_StreamFormat rv=%d", r); + return CUBEB_ERROR; + } + + /* Frames per buffer in the input callback. */ + r = AudioUnitSetProperty( + stm->input_unit, kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Global, AU_IN_BUS, &stm->latency_frames, sizeof(UInt32)); + if (r != noErr) { + LOG("AudioUnitSetProperty/input/kAudioUnitProperty_MaximumFramesPerSlice " + "rv=%d", + r); + return CUBEB_ERROR; + } + + // Input only capacity + unsigned int array_capacity = 1; + if (has_output(stm)) { + // Full-duplex increase capacity + array_capacity = 8; + } + if (audiounit_init_input_linear_buffer(stm, array_capacity) != CUBEB_OK) { + return CUBEB_ERROR; + } + + aurcbs_in.inputProc = audiounit_input_callback; + aurcbs_in.inputProcRefCon = stm; + + r = AudioUnitSetProperty( + stm->input_unit, kAudioOutputUnitProperty_SetInputCallback, + kAudioUnitScope_Global, AU_OUT_BUS, &aurcbs_in, sizeof(aurcbs_in)); + if (r != noErr) { + LOG("AudioUnitSetProperty/input/kAudioOutputUnitProperty_SetInputCallback " + "rv=%d", + r); + return CUBEB_ERROR; + } + + stm->frames_read = 0; + + LOG("(%p) Input audiounit init successfully.", stm); + + return CUBEB_OK; +} + +static int +audiounit_configure_output(cubeb_stream * stm) +{ + assert(stm && stm->output_unit); + + int r; + AURenderCallbackStruct aurcbs_out; + UInt32 size; + + LOG("(%p) Opening output side: rate %u, channels %u, format %d, latency in " + "frames %u.", + stm, stm->output_stream_params.rate, stm->output_stream_params.channels, + stm->output_stream_params.format, stm->latency_frames); + + r = audio_stream_desc_init(&stm->output_desc, &stm->output_stream_params); + if (r != CUBEB_OK) { + LOG("(%p) Could not initialize the audio stream description.", stm); + return r; + } + + /* Get output device sample rate. */ + AudioStreamBasicDescription output_hw_desc; + size = sizeof(AudioStreamBasicDescription); + memset(&output_hw_desc, 0, size); + r = AudioUnitGetProperty(stm->output_unit, kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, AU_OUT_BUS, &output_hw_desc, + &size); + if (r != noErr) { + LOG("AudioUnitGetProperty/output/kAudioUnitProperty_StreamFormat rv=%d", r); + return CUBEB_ERROR; + } + stm->output_hw_rate = output_hw_desc.mSampleRate; + LOG("(%p) Output device sampling rate: %.2f", stm, + output_hw_desc.mSampleRate); + stm->context->channels = output_hw_desc.mChannelsPerFrame; + + // Set the input layout to match the output device layout. + audiounit_layout_init(stm, io_side::OUTPUT); + if (stm->context->channels != stm->output_stream_params.channels || + stm->context->layout != stm->output_stream_params.layout) { + LOG("Incompatible channel layouts detected, setting up remixer"); + audiounit_init_mixer(stm); + // We will be remixing the data before it reaches the output device. + // We need to adjust the number of channels and other + // AudioStreamDescription details. + stm->output_desc.mChannelsPerFrame = stm->context->channels; + stm->output_desc.mBytesPerFrame = (stm->output_desc.mBitsPerChannel / 8) * + stm->output_desc.mChannelsPerFrame; + stm->output_desc.mBytesPerPacket = + stm->output_desc.mBytesPerFrame * stm->output_desc.mFramesPerPacket; + } else { + stm->mixer = nullptr; + } + + r = AudioUnitSetProperty(stm->output_unit, kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, AU_OUT_BUS, &stm->output_desc, + sizeof(AudioStreamBasicDescription)); + if (r != noErr) { + LOG("AudioUnitSetProperty/output/kAudioUnitProperty_StreamFormat rv=%d", r); + return CUBEB_ERROR; + } + + r = audiounit_set_buffer_size(stm, stm->latency_frames, io_side::OUTPUT); + if (r != CUBEB_OK) { + LOG("(%p) Error in change output buffer size.", stm); + return CUBEB_ERROR; + } + + /* Frames per buffer in the input callback. */ + r = AudioUnitSetProperty( + stm->output_unit, kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Global, AU_OUT_BUS, &stm->latency_frames, sizeof(UInt32)); + if (r != noErr) { + LOG("AudioUnitSetProperty/output/kAudioUnitProperty_MaximumFramesPerSlice " + "rv=%d", + r); + return CUBEB_ERROR; + } + + aurcbs_out.inputProc = audiounit_output_callback; + aurcbs_out.inputProcRefCon = stm; + r = AudioUnitSetProperty( + stm->output_unit, kAudioUnitProperty_SetRenderCallback, + kAudioUnitScope_Global, AU_OUT_BUS, &aurcbs_out, sizeof(aurcbs_out)); + if (r != noErr) { + LOG("AudioUnitSetProperty/output/kAudioUnitProperty_SetRenderCallback " + "rv=%d", + r); + return CUBEB_ERROR; + } + + stm->frames_written = 0; + + LOG("(%p) Output audiounit init successfully.", stm); + return CUBEB_OK; +} + +static int +audiounit_setup_stream(cubeb_stream * stm) +{ + stm->mutex.assert_current_thread_owns(); + + if ((stm->input_stream_params.prefs & CUBEB_STREAM_PREF_LOOPBACK) || + (stm->output_stream_params.prefs & CUBEB_STREAM_PREF_LOOPBACK)) { + LOG("(%p) Loopback not supported for audiounit.", stm); + return CUBEB_ERROR_NOT_SUPPORTED; + } + + int r = 0; + + device_info in_dev_info = stm->input_device; + device_info out_dev_info = stm->output_device; + + if (has_input(stm) && has_output(stm) && + stm->input_device.id != stm->output_device.id) { + r = audiounit_create_aggregate_device(stm); + if (r != CUBEB_OK) { + stm->aggregate_device_id = kAudioObjectUnknown; + LOG("(%p) Create aggregate devices failed.", stm); + // !!!NOTE: It is not necessary to return here. If it does not + // return it will fallback to the old implementation. The intention + // is to investigate how often it fails. I plan to remove + // it after a couple of weeks. + return r; + } else { + in_dev_info.id = out_dev_info.id = stm->aggregate_device_id; + in_dev_info.flags = DEV_INPUT; + out_dev_info.flags = DEV_OUTPUT; + } + } + + if (has_input(stm)) { + r = audiounit_create_unit(&stm->input_unit, &in_dev_info); + if (r != CUBEB_OK) { + LOG("(%p) AudioUnit creation for input failed.", stm); + return r; + } + } + + if (has_output(stm)) { + r = audiounit_create_unit(&stm->output_unit, &out_dev_info); + if (r != CUBEB_OK) { + LOG("(%p) AudioUnit creation for output failed.", stm); + return r; + } + } + + /* Latency cannot change if another stream is operating in parallel. In this + * case latency is set to the other stream value. */ + if (audiounit_active_streams(stm->context) > 1) { + LOG("(%p) More than one active stream, use global latency.", stm); + stm->latency_frames = stm->context->global_latency_frames; + } else { + /* Silently clamp the latency down to the platform default, because we + * synthetize the clock from the callbacks, and we want the clock to update + * often. */ + stm->latency_frames = audiounit_clamp_latency(stm, stm->latency_frames); + assert(stm->latency_frames); // Ugly error check + audiounit_set_global_latency(stm->context, stm->latency_frames); + } + + /* Configure I/O stream */ + if (has_input(stm)) { + r = audiounit_configure_input(stm); + if (r != CUBEB_OK) { + LOG("(%p) Configure audiounit input failed.", stm); + return r; + } + } + + if (has_output(stm)) { + r = audiounit_configure_output(stm); + if (r != CUBEB_OK) { + LOG("(%p) Configure audiounit output failed.", stm); + return r; + } + } + + // Setting the latency doesn't work well for USB headsets (eg. plantronics). + // Keep the default latency for now. +#if 0 + buffer_size = latency; + + /* Get the range of latency this particular device can work with, and clamp + * the requested latency to this acceptable range. */ +#if !TARGET_OS_IPHONE + if (audiounit_get_acceptable_latency_range(&latency_range) != CUBEB_OK) { + return CUBEB_ERROR; + } + + if (buffer_size < (unsigned int) latency_range.mMinimum) { + buffer_size = (unsigned int) latency_range.mMinimum; + } else if (buffer_size > (unsigned int) latency_range.mMaximum) { + buffer_size = (unsigned int) latency_range.mMaximum; + } + + /** + * Get the default buffer size. If our latency request is below the default, + * set it. Otherwise, use the default latency. + **/ + size = sizeof(default_buffer_size); + if (AudioUnitGetProperty(stm->output_unit, kAudioDevicePropertyBufferFrameSize, + kAudioUnitScope_Output, 0, &default_buffer_size, &size) != 0) { + return CUBEB_ERROR; + } + + if (buffer_size < default_buffer_size) { + /* Set the maximum number of frame that the render callback will ask for, + * effectively setting the latency of the stream. This is process-wide. */ + if (AudioUnitSetProperty(stm->output_unit, kAudioDevicePropertyBufferFrameSize, + kAudioUnitScope_Output, 0, &buffer_size, sizeof(buffer_size)) != 0) { + return CUBEB_ERROR; + } + } +#else // TARGET_OS_IPHONE + //TODO: [[AVAudioSession sharedInstance] inputLatency] + // http://stackoverflow.com/questions/13157523/kaudiodevicepropertybufferframesize-replacement-for-ios +#endif +#endif + + /* We use a resampler because input AudioUnit operates + * reliable only in the capture device sample rate. + * Resampler will convert it to the user sample rate + * and deliver it to the callback. */ + uint32_t target_sample_rate; + if (has_input(stm)) { + target_sample_rate = stm->input_stream_params.rate; + } else { + assert(has_output(stm)); + target_sample_rate = stm->output_stream_params.rate; + } + + cubeb_stream_params input_unconverted_params; + if (has_input(stm)) { + input_unconverted_params = stm->input_stream_params; + /* Use the rate of the input device. */ + input_unconverted_params.rate = stm->input_hw_rate; + } + + /* Create resampler. Output params are unchanged + * because we do not need conversion on the output. */ + stm->resampler.reset(cubeb_resampler_create( + stm, has_input(stm) ? &input_unconverted_params : NULL, + has_output(stm) ? &stm->output_stream_params : NULL, target_sample_rate, + stm->data_callback, stm->user_ptr, CUBEB_RESAMPLER_QUALITY_DESKTOP, + CUBEB_RESAMPLER_RECLOCK_NONE)); + if (!stm->resampler) { + LOG("(%p) Could not create resampler.", stm); + return CUBEB_ERROR; + } + + if (stm->input_unit != NULL) { + r = AudioUnitInitialize(stm->input_unit); + if (r != noErr) { + LOG("AudioUnitInitialize/input rv=%d", r); + return CUBEB_ERROR; + } + } + + if (stm->output_unit != NULL) { + r = AudioUnitInitialize(stm->output_unit); + if (r != noErr) { + LOG("AudioUnitInitialize/output rv=%d", r); + return CUBEB_ERROR; + } + + stm->current_latency_frames = audiounit_get_device_presentation_latency( + stm->output_device.id, kAudioDevicePropertyScopeOutput); + + Float64 unit_s; + UInt32 size = sizeof(unit_s); + if (AudioUnitGetProperty(stm->output_unit, kAudioUnitProperty_Latency, + kAudioUnitScope_Global, 0, &unit_s, + &size) == noErr) { + stm->current_latency_frames += + static_cast(unit_s * stm->output_desc.mSampleRate); + } + } + + if (stm->input_unit && stm->output_unit) { + // According to the I/O hardware rate it is expected a specific pattern of + // callbacks for example is input is 44100 and output is 48000 we expected + // no more than 2 out callback in a row. + stm->expected_output_callbacks_in_a_row = + ceilf(stm->output_hw_rate / stm->input_hw_rate); + } + + r = audiounit_install_device_changed_callback(stm); + if (r != CUBEB_OK) { + LOG("(%p) Could not install all device change callback.", stm); + } + + return CUBEB_OK; +} + +cubeb_stream::cubeb_stream(cubeb * context) + : context(context), resampler(nullptr, cubeb_resampler_destroy), + mixer(nullptr, cubeb_mixer_destroy) +{ + PodZero(&input_desc, 1); + PodZero(&output_desc, 1); +} + +static void +audiounit_stream_destroy_internal(cubeb_stream * stm); + +static int +audiounit_stream_init(cubeb * context, cubeb_stream ** stream, + char const * /* stream_name */, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + assert(context); + auto_lock context_lock(context->mutex); + audiounit_increment_active_streams(context); + unique_ptr stm( + new cubeb_stream(context), audiounit_stream_destroy_internal); + int r; + *stream = NULL; + assert(latency_frames > 0); + + /* These could be different in the future if we have both + * full-duplex stream and different devices for input vs output. */ + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->user_ptr = user_ptr; + stm->latency_frames = latency_frames; + + if ((input_device && !input_stream_params) || + (output_device && !output_stream_params)) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + if (input_stream_params) { + stm->input_stream_params = *input_stream_params; + r = audiounit_set_device_info( + stm.get(), reinterpret_cast(input_device), io_side::INPUT); + if (r != CUBEB_OK) { + LOG("(%p) Fail to set device info for input.", stm.get()); + return r; + } + } + if (output_stream_params) { + stm->output_stream_params = *output_stream_params; + r = audiounit_set_device_info( + stm.get(), reinterpret_cast(output_device), io_side::OUTPUT); + if (r != CUBEB_OK) { + LOG("(%p) Fail to set device info for output.", stm.get()); + return r; + } + } + + { + // It's not critical to lock here, because no other thread has been started + // yet, but it allows to assert that the lock has been taken in + // `audiounit_setup_stream`. + auto_lock lock(stm->mutex); + r = audiounit_setup_stream(stm.get()); + } + + if (r != CUBEB_OK) { + LOG("(%p) Could not setup the audiounit stream.", stm.get()); + return r; + } + + r = audiounit_install_system_changed_callback(stm.get()); + if (r != CUBEB_OK) { + LOG("(%p) Could not install the device change callback.", stm.get()); + return r; + } + + *stream = stm.release(); + LOG("(%p) Cubeb stream init successful.", *stream); + return CUBEB_OK; +} + +static void +audiounit_close_stream(cubeb_stream * stm) +{ + stm->mutex.assert_current_thread_owns(); + + if (stm->input_unit) { + AudioUnitUninitialize(stm->input_unit); + AudioComponentInstanceDispose(stm->input_unit); + stm->input_unit = nullptr; + } + + stm->input_linear_buffer.reset(); + + if (stm->output_unit) { + AudioUnitUninitialize(stm->output_unit); + AudioComponentInstanceDispose(stm->output_unit); + stm->output_unit = nullptr; + } + + stm->resampler.reset(); + stm->mixer.reset(); + + if (stm->aggregate_device_id != kAudioObjectUnknown) { + audiounit_destroy_aggregate_device(stm->plugin_id, + &stm->aggregate_device_id); + stm->aggregate_device_id = kAudioObjectUnknown; + } +} + +static void +audiounit_stream_destroy_internal(cubeb_stream * stm) +{ + stm->context->mutex.assert_current_thread_owns(); + + int r = audiounit_uninstall_system_changed_callback(stm); + if (r != CUBEB_OK) { + LOG("(%p) Could not uninstall the device changed callback", stm); + } + r = audiounit_uninstall_device_changed_callback(stm); + if (r != CUBEB_OK) { + LOG("(%p) Could not uninstall all device change listeners", stm); + } + + auto_lock lock(stm->mutex); + audiounit_close_stream(stm); + assert(audiounit_active_streams(stm->context) >= 1); + audiounit_decrement_active_streams(stm->context); +} + +static void +audiounit_stream_destroy(cubeb_stream * stm) +{ + int r = audiounit_uninstall_system_changed_callback(stm); + if (r != CUBEB_OK) { + LOG("(%p) Could not uninstall the device changed callback", stm); + } + r = audiounit_uninstall_device_changed_callback(stm); + if (r != CUBEB_OK) { + LOG("(%p) Could not uninstall all device change listeners", stm); + } + + if (!stm->shutdown.load()) { + auto_lock context_lock(stm->context->mutex); + audiounit_stream_stop_internal(stm); + stm->shutdown = true; + } + + stm->destroy_pending = true; + // Execute close in serial queue to avoid collision + // with reinit when un/plug devices + dispatch_sync(stm->context->serial_queue, ^() { + auto_lock context_lock(stm->context->mutex); + audiounit_stream_destroy_internal(stm); + }); + + LOG("Cubeb stream (%p) destroyed successful.", stm); + delete stm; +} + +static int +audiounit_stream_start_internal(cubeb_stream * stm) +{ + OSStatus r; + if (stm->input_unit != NULL) { + r = AudioOutputUnitStart(stm->input_unit); + if (r != noErr) { + LOG("AudioOutputUnitStart (input) rv=%d", r); + return CUBEB_ERROR; + } + } + if (stm->output_unit != NULL) { + r = AudioOutputUnitStart(stm->output_unit); + if (r != noErr) { + LOG("AudioOutputUnitStart (output) rv=%d", r); + return CUBEB_ERROR; + } + } + return CUBEB_OK; +} + +static int +audiounit_stream_start(cubeb_stream * stm) +{ + auto_lock context_lock(stm->context->mutex); + stm->shutdown = false; + stm->draining = false; + + int r = audiounit_stream_start_internal(stm); + if (r != CUBEB_OK) { + return r; + } + + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STARTED); + + LOG("Cubeb stream (%p) started successfully.", stm); + return CUBEB_OK; +} + +void +audiounit_stream_stop_internal(cubeb_stream * stm) +{ + OSStatus r; + if (stm->input_unit != NULL) { + r = AudioOutputUnitStop(stm->input_unit); + assert(r == 0); + } + if (stm->output_unit != NULL) { + r = AudioOutputUnitStop(stm->output_unit); + assert(r == 0); + } +} + +static int +audiounit_stream_stop(cubeb_stream * stm) +{ + auto_lock context_lock(stm->context->mutex); + stm->shutdown = true; + + audiounit_stream_stop_internal(stm); + + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STOPPED); + + LOG("Cubeb stream (%p) stopped successfully.", stm); + return CUBEB_OK; +} + +static int +audiounit_stream_get_position(cubeb_stream * stm, uint64_t * position) +{ + assert(stm); + if (stm->current_latency_frames > stm->frames_played) { + *position = 0; + } else { + *position = stm->frames_played - stm->current_latency_frames; + } + return CUBEB_OK; +} + +int +audiounit_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +{ +#if TARGET_OS_IPHONE + // TODO + return CUBEB_ERROR_NOT_SUPPORTED; +#else + *latency = stm->total_output_latency_frames; + return CUBEB_OK; +#endif +} + +static int +audiounit_stream_get_volume(cubeb_stream * stm, float * volume) +{ + assert(stm->output_unit); + OSStatus r = AudioUnitGetParameter(stm->output_unit, kHALOutputParam_Volume, + kAudioUnitScope_Global, 0, volume); + if (r != noErr) { + LOG("AudioUnitGetParameter/kHALOutputParam_Volume rv=%d", r); + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +static int +audiounit_stream_set_volume(cubeb_stream * stm, float volume) +{ + assert(stm->output_unit); + OSStatus r; + r = AudioUnitSetParameter(stm->output_unit, kHALOutputParam_Volume, + kAudioUnitScope_Global, 0, volume, 0); + + if (r != noErr) { + LOG("AudioUnitSetParameter/kHALOutputParam_Volume rv=%d", r); + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +unique_ptr +convert_uint32_into_string(UInt32 data) +{ + // Simply create an empty string if no data. + size_t size = data == 0 ? 0 : 4; // 4 bytes for uint32. + auto str = unique_ptr{new char[size + 1]}; // + 1 for '\0'. + str[size] = '\0'; + if (size < 4) { + return str; + } + + // Reverse 0xWXYZ into 0xZYXW. + str[0] = (char)(data >> 24); + str[1] = (char)(data >> 16); + str[2] = (char)(data >> 8); + str[3] = (char)(data); + return str; +} + +int +audiounit_get_default_device_datasource(cubeb_device_type type, UInt32 * data) +{ + AudioDeviceID id = audiounit_get_default_device_id(type); + if (id == kAudioObjectUnknown) { + return CUBEB_ERROR; + } + + UInt32 size = sizeof(*data); + /* This fails with some USB headsets (e.g., Plantronic .Audio 628). */ + OSStatus r = AudioObjectGetPropertyData( + id, + type == CUBEB_DEVICE_TYPE_INPUT ? &INPUT_DATA_SOURCE_PROPERTY_ADDRESS + : &OUTPUT_DATA_SOURCE_PROPERTY_ADDRESS, + 0, NULL, &size, data); + if (r != noErr) { + *data = 0; + } + + return CUBEB_OK; +} + +int +audiounit_get_default_device_name(cubeb_stream * stm, + cubeb_device * const device, + cubeb_device_type type) +{ + assert(stm); + assert(device); + + UInt32 data; + int r = audiounit_get_default_device_datasource(type, &data); + if (r != CUBEB_OK) { + return r; + } + char ** name = type == CUBEB_DEVICE_TYPE_INPUT ? &device->input_name + : &device->output_name; + *name = convert_uint32_into_string(data).release(); + if (!strlen(*name)) { // empty string. + LOG("(%p) name of %s device is empty!", stm, + type == CUBEB_DEVICE_TYPE_INPUT ? "input" : "output"); + } + return CUBEB_OK; +} + +int +audiounit_stream_get_current_device(cubeb_stream * stm, + cubeb_device ** const device) +{ +#if TARGET_OS_IPHONE + // TODO + return CUBEB_ERROR_NOT_SUPPORTED; +#else + *device = new cubeb_device; + if (!*device) { + return CUBEB_ERROR; + } + PodZero(*device, 1); + + int r = + audiounit_get_default_device_name(stm, *device, CUBEB_DEVICE_TYPE_OUTPUT); + if (r != CUBEB_OK) { + return r; + } + + r = audiounit_get_default_device_name(stm, *device, CUBEB_DEVICE_TYPE_INPUT); + if (r != CUBEB_OK) { + return r; + } + + return CUBEB_OK; +#endif +} + +int +audiounit_stream_device_destroy(cubeb_stream * /* stream */, + cubeb_device * device) +{ + delete[] device->output_name; + delete[] device->input_name; + delete device; + return CUBEB_OK; +} + +int +audiounit_stream_register_device_changed_callback( + cubeb_stream * stream, + cubeb_device_changed_callback device_changed_callback) +{ + auto_lock dev_cb_lock(stream->device_changed_callback_lock); + /* Note: second register without unregister first causes 'nope' error. + * Current implementation requires unregister before register a new cb. */ + assert(!device_changed_callback || !stream->device_changed_callback); + stream->device_changed_callback = device_changed_callback; + return CUBEB_OK; +} + +static char * +audiounit_strref_to_cstr_utf8(CFStringRef strref) +{ + CFIndex len, size; + char * ret; + if (strref == NULL) { + return NULL; + } + + len = CFStringGetLength(strref); + // Add 1 to size to allow for '\0' termination character. + size = CFStringGetMaximumSizeForEncoding(len, kCFStringEncodingUTF8) + 1; + ret = new char[size]; + + if (!CFStringGetCString(strref, ret, size, kCFStringEncodingUTF8)) { + delete[] ret; + ret = NULL; + } + + return ret; +} + +static uint32_t +audiounit_get_channel_count(AudioObjectID devid, AudioObjectPropertyScope scope) +{ + AudioObjectPropertyAddress adr = {0, scope, + kAudioObjectPropertyElementMaster}; + UInt32 size = 0; + uint32_t i, ret = 0; + + adr.mSelector = kAudioDevicePropertyStreamConfiguration; + + if (AudioObjectGetPropertyDataSize(devid, &adr, 0, NULL, &size) == noErr && + size > 0) { + AudioBufferList * list = static_cast(alloca(size)); + if (AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, list) == + noErr) { + for (i = 0; i < list->mNumberBuffers; i++) + ret += list->mBuffers[i].mNumberChannels; + } + } + + return ret; +} + +static void +audiounit_get_available_samplerate(AudioObjectID devid, + AudioObjectPropertyScope scope, + uint32_t * min, uint32_t * max, + uint32_t * def) +{ + AudioObjectPropertyAddress adr = {0, scope, + kAudioObjectPropertyElementMaster}; + + adr.mSelector = kAudioDevicePropertyNominalSampleRate; + if (AudioObjectHasProperty(devid, &adr)) { + UInt32 size = sizeof(Float64); + Float64 fvalue = 0.0; + if (AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, &fvalue) == + noErr) { + *def = fvalue; + } + } + + adr.mSelector = kAudioDevicePropertyAvailableNominalSampleRates; + UInt32 size = 0; + AudioValueRange range; + if (AudioObjectHasProperty(devid, &adr) && + AudioObjectGetPropertyDataSize(devid, &adr, 0, NULL, &size) == noErr) { + uint32_t count = size / sizeof(AudioValueRange); + vector ranges(count); + range.mMinimum = 9999999999.0; + range.mMaximum = 0.0; + if (AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, + ranges.data()) == noErr) { + for (uint32_t i = 0; i < count; i++) { + if (ranges[i].mMaximum > range.mMaximum) + range.mMaximum = ranges[i].mMaximum; + if (ranges[i].mMinimum < range.mMinimum) + range.mMinimum = ranges[i].mMinimum; + } + } + *max = static_cast(range.mMaximum); + *min = static_cast(range.mMinimum); + } else { + *min = *max = 0; + } +} + +static UInt32 +audiounit_get_device_presentation_latency(AudioObjectID devid, + AudioObjectPropertyScope scope) +{ + AudioObjectPropertyAddress adr = {0, scope, + kAudioObjectPropertyElementMaster}; + UInt32 size, dev, stream = 0; + AudioStreamID sid[1]; + + adr.mSelector = kAudioDevicePropertyLatency; + size = sizeof(UInt32); + if (AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, &dev) != noErr) { + dev = 0; + } + + adr.mSelector = kAudioDevicePropertyStreams; + size = sizeof(sid); + if (AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, sid) == noErr) { + adr.mSelector = kAudioStreamPropertyLatency; + size = sizeof(UInt32); + AudioObjectGetPropertyData(sid[0], &adr, 0, NULL, &size, &stream); + } + + return dev + stream; +} + +static int +audiounit_create_device_from_hwdev(cubeb_device_info * dev_info, + AudioObjectID devid, cubeb_device_type type) +{ + AudioObjectPropertyAddress adr = {0, 0, kAudioObjectPropertyElementMaster}; + UInt32 size; + + if (type == CUBEB_DEVICE_TYPE_OUTPUT) { + adr.mScope = kAudioDevicePropertyScopeOutput; + } else if (type == CUBEB_DEVICE_TYPE_INPUT) { + adr.mScope = kAudioDevicePropertyScopeInput; + } else { + return CUBEB_ERROR; + } + + UInt32 ch = audiounit_get_channel_count(devid, adr.mScope); + if (ch == 0) { + return CUBEB_ERROR; + } + + PodZero(dev_info, 1); + + CFStringRef device_id_str = nullptr; + size = sizeof(CFStringRef); + adr.mSelector = kAudioDevicePropertyDeviceUID; + OSStatus ret = + AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, &device_id_str); + if (ret == noErr && device_id_str != NULL) { + dev_info->device_id = audiounit_strref_to_cstr_utf8(device_id_str); + static_assert(sizeof(cubeb_devid) >= sizeof(decltype(devid)), + "cubeb_devid can't represent devid"); + dev_info->devid = reinterpret_cast(devid); + dev_info->group_id = dev_info->device_id; + CFRelease(device_id_str); + } + + CFStringRef friendly_name_str = nullptr; + UInt32 ds; + size = sizeof(UInt32); + adr.mSelector = kAudioDevicePropertyDataSource; + ret = AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, &ds); + if (ret == noErr) { + AudioValueTranslation trl = {&ds, sizeof(ds), &friendly_name_str, + sizeof(CFStringRef)}; + adr.mSelector = kAudioDevicePropertyDataSourceNameForIDCFString; + size = sizeof(AudioValueTranslation); + AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, &trl); + } + + // If there is no datasource for this device, fall back to the + // device name. + if (!friendly_name_str) { + size = sizeof(CFStringRef); + adr.mSelector = kAudioObjectPropertyName; + AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, &friendly_name_str); + } + + if (friendly_name_str) { + dev_info->friendly_name = audiounit_strref_to_cstr_utf8(friendly_name_str); + CFRelease(friendly_name_str); + } else { + // Couldn't get a datasource name nor a device name, return a + // valid string of length 0. + char * fallback_name = new char[1]; + fallback_name[0] = '\0'; + dev_info->friendly_name = fallback_name; + } + + CFStringRef vendor_name_str = nullptr; + size = sizeof(CFStringRef); + adr.mSelector = kAudioObjectPropertyManufacturer; + ret = + AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, &vendor_name_str); + if (ret == noErr && vendor_name_str != NULL) { + dev_info->vendor_name = audiounit_strref_to_cstr_utf8(vendor_name_str); + CFRelease(vendor_name_str); + } + + dev_info->type = type; + dev_info->state = CUBEB_DEVICE_STATE_ENABLED; + dev_info->preferred = (devid == audiounit_get_default_device_id(type)) + ? CUBEB_DEVICE_PREF_ALL + : CUBEB_DEVICE_PREF_NONE; + + dev_info->max_channels = ch; + dev_info->format = + (cubeb_device_fmt)CUBEB_DEVICE_FMT_ALL; /* CoreAudio supports All! */ + /* kAudioFormatFlagsAudioUnitCanonical is deprecated, prefer floating point */ + dev_info->default_format = CUBEB_DEVICE_FMT_F32NE; + audiounit_get_available_samplerate(devid, adr.mScope, &dev_info->min_rate, + &dev_info->max_rate, + &dev_info->default_rate); + + UInt32 latency = audiounit_get_device_presentation_latency(devid, adr.mScope); + + AudioValueRange range; + adr.mSelector = kAudioDevicePropertyBufferFrameSizeRange; + size = sizeof(AudioValueRange); + ret = AudioObjectGetPropertyData(devid, &adr, 0, NULL, &size, &range); + if (ret == noErr) { + dev_info->latency_lo = latency + range.mMinimum; + dev_info->latency_hi = latency + range.mMaximum; + } else { + dev_info->latency_lo = + 10 * dev_info->default_rate / 1000; /* Default to 10ms */ + dev_info->latency_hi = + 100 * dev_info->default_rate / 1000; /* Default to 100ms */ + } + + return CUBEB_OK; +} + +bool +is_aggregate_device(cubeb_device_info * device_info) +{ + assert(device_info->friendly_name); + return !strncmp(device_info->friendly_name, PRIVATE_AGGREGATE_DEVICE_NAME, + strlen(PRIVATE_AGGREGATE_DEVICE_NAME)); +} + +static int +audiounit_enumerate_devices(cubeb * /* context */, cubeb_device_type type, + cubeb_device_collection * collection) +{ + vector input_devs; + vector output_devs; + + // Count number of input and output devices. This is not + // necessarily the same as the count of raw devices supported by the + // system since, for example, with Soundflower installed, some + // devices may report as being both input *and* output and cubeb + // separates those into two different devices. + + if (type & CUBEB_DEVICE_TYPE_OUTPUT) { + output_devs = audiounit_get_devices_of_type(CUBEB_DEVICE_TYPE_OUTPUT); + } + + if (type & CUBEB_DEVICE_TYPE_INPUT) { + input_devs = audiounit_get_devices_of_type(CUBEB_DEVICE_TYPE_INPUT); + } + + auto devices = new cubeb_device_info[output_devs.size() + input_devs.size()]; + collection->count = 0; + + if (type & CUBEB_DEVICE_TYPE_OUTPUT) { + for (auto dev : output_devs) { + auto device = &devices[collection->count]; + auto err = audiounit_create_device_from_hwdev(device, dev, + CUBEB_DEVICE_TYPE_OUTPUT); + if (err != CUBEB_OK || is_aggregate_device(device)) { + continue; + } + collection->count += 1; + } + } + + if (type & CUBEB_DEVICE_TYPE_INPUT) { + for (auto dev : input_devs) { + auto device = &devices[collection->count]; + auto err = audiounit_create_device_from_hwdev(device, dev, + CUBEB_DEVICE_TYPE_INPUT); + if (err != CUBEB_OK || is_aggregate_device(device)) { + continue; + } + collection->count += 1; + } + } + + if (collection->count > 0) { + collection->device = devices; + } else { + delete[] devices; + collection->device = NULL; + } + + return CUBEB_OK; +} + +static void +audiounit_device_destroy(cubeb_device_info * device) +{ + delete[] device->device_id; + delete[] device->friendly_name; + delete[] device->vendor_name; +} + +static int +audiounit_device_collection_destroy(cubeb * /* context */, + cubeb_device_collection * collection) +{ + for (size_t i = 0; i < collection->count; i++) { + audiounit_device_destroy(&collection->device[i]); + } + delete[] collection->device; + + return CUBEB_OK; +} + +static vector +audiounit_get_devices_of_type(cubeb_device_type devtype) +{ + UInt32 size = 0; + OSStatus ret = AudioObjectGetPropertyDataSize( + kAudioObjectSystemObject, &DEVICES_PROPERTY_ADDRESS, 0, NULL, &size); + if (ret != noErr) { + return vector(); + } + vector devices(size / sizeof(AudioObjectID)); + ret = AudioObjectGetPropertyData(kAudioObjectSystemObject, + &DEVICES_PROPERTY_ADDRESS, 0, NULL, &size, + devices.data()); + if (ret != noErr) { + return vector(); + } + + // Remove the aggregate device from the list of devices (if any). + for (auto it = devices.begin(); it != devices.end();) { + CFStringRef name = get_device_name(*it); + if (name && CFStringFind(name, CFSTR("CubebAggregateDevice"), 0).location != + kCFNotFound) { + it = devices.erase(it); + } else { + it++; + } + if (name) { + CFRelease(name); + } + } + + /* Expected sorted but did not find anything in the docs. */ + sort(devices.begin(), devices.end(), + [](AudioObjectID a, AudioObjectID b) { return a < b; }); + + if (devtype == (CUBEB_DEVICE_TYPE_INPUT | CUBEB_DEVICE_TYPE_OUTPUT)) { + return devices; + } + + AudioObjectPropertyScope scope = (devtype == CUBEB_DEVICE_TYPE_INPUT) + ? kAudioDevicePropertyScopeInput + : kAudioDevicePropertyScopeOutput; + + vector devices_in_scope; + for (uint32_t i = 0; i < devices.size(); ++i) { + /* For device in the given scope channel must be > 0. */ + if (audiounit_get_channel_count(devices[i], scope) > 0) { + devices_in_scope.push_back(devices[i]); + } + } + + return devices_in_scope; +} + +static OSStatus +audiounit_collection_changed_callback( + AudioObjectID /* inObjectID */, UInt32 /* inNumberAddresses */, + const AudioObjectPropertyAddress * /* inAddresses */, void * inClientData) +{ + cubeb * context = static_cast(inClientData); + + // This can be called from inside an AudioUnit function, dispatch to another + // queue. + dispatch_async(context->serial_queue, ^() { + auto_lock lock(context->mutex); + if (!context->input_collection_changed_callback && + !context->output_collection_changed_callback) { + /* Listener removed while waiting in mutex, abort. */ + return; + } + if (context->input_collection_changed_callback) { + vector devices = + audiounit_get_devices_of_type(CUBEB_DEVICE_TYPE_INPUT); + /* Elements in the vector expected sorted. */ + if (context->input_device_array != devices) { + context->input_device_array = devices; + context->input_collection_changed_callback( + context, context->input_collection_changed_user_ptr); + } + } + if (context->output_collection_changed_callback) { + vector devices = + audiounit_get_devices_of_type(CUBEB_DEVICE_TYPE_OUTPUT); + /* Elements in the vector expected sorted. */ + if (context->output_device_array != devices) { + context->output_device_array = devices; + context->output_collection_changed_callback( + context, context->output_collection_changed_user_ptr); + } + } + }); + return noErr; +} + +static OSStatus +audiounit_add_device_listener( + cubeb * context, cubeb_device_type devtype, + cubeb_device_collection_changed_callback collection_changed_callback, + void * user_ptr) +{ + context->mutex.assert_current_thread_owns(); + assert(devtype & (CUBEB_DEVICE_TYPE_INPUT | CUBEB_DEVICE_TYPE_OUTPUT)); + /* Note: second register without unregister first causes 'nope' error. + * Current implementation requires unregister before register a new cb. */ + assert((devtype & CUBEB_DEVICE_TYPE_INPUT) && + !context->input_collection_changed_callback || + (devtype & CUBEB_DEVICE_TYPE_OUTPUT) && + !context->output_collection_changed_callback); + + if (!context->input_collection_changed_callback && + !context->output_collection_changed_callback) { + OSStatus ret = AudioObjectAddPropertyListener( + kAudioObjectSystemObject, &DEVICES_PROPERTY_ADDRESS, + audiounit_collection_changed_callback, context); + if (ret != noErr) { + return ret; + } + } + if (devtype & CUBEB_DEVICE_TYPE_INPUT) { + /* Expected empty after unregister. */ + assert(context->input_device_array.empty()); + context->input_device_array = + audiounit_get_devices_of_type(CUBEB_DEVICE_TYPE_INPUT); + context->input_collection_changed_callback = collection_changed_callback; + context->input_collection_changed_user_ptr = user_ptr; + } + if (devtype & CUBEB_DEVICE_TYPE_OUTPUT) { + /* Expected empty after unregister. */ + assert(context->output_device_array.empty()); + context->output_device_array = + audiounit_get_devices_of_type(CUBEB_DEVICE_TYPE_OUTPUT); + context->output_collection_changed_callback = collection_changed_callback; + context->output_collection_changed_user_ptr = user_ptr; + } + return noErr; +} + +static OSStatus +audiounit_remove_device_listener(cubeb * context, cubeb_device_type devtype) +{ + context->mutex.assert_current_thread_owns(); + + if (devtype & CUBEB_DEVICE_TYPE_INPUT) { + context->input_collection_changed_callback = nullptr; + context->input_collection_changed_user_ptr = nullptr; + context->input_device_array.clear(); + } + if (devtype & CUBEB_DEVICE_TYPE_OUTPUT) { + context->output_collection_changed_callback = nullptr; + context->output_collection_changed_user_ptr = nullptr; + context->output_device_array.clear(); + } + + if (context->input_collection_changed_callback || + context->output_collection_changed_callback) { + return noErr; + } + /* Note: unregister a non registered cb is not a problem, not checking. */ + return AudioObjectRemovePropertyListener( + kAudioObjectSystemObject, &DEVICES_PROPERTY_ADDRESS, + audiounit_collection_changed_callback, context); +} + +int +audiounit_register_device_collection_changed( + cubeb * context, cubeb_device_type devtype, + cubeb_device_collection_changed_callback collection_changed_callback, + void * user_ptr) +{ + if (devtype == CUBEB_DEVICE_TYPE_UNKNOWN) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + OSStatus ret; + auto_lock lock(context->mutex); + if (collection_changed_callback) { + ret = audiounit_add_device_listener(context, devtype, + collection_changed_callback, user_ptr); + } else { + ret = audiounit_remove_device_listener(context, devtype); + } + return (ret == noErr) ? CUBEB_OK : CUBEB_ERROR; +} + +cubeb_ops const audiounit_ops = { + /*.init =*/audiounit_init, + /*.get_backend_id =*/audiounit_get_backend_id, + /*.get_max_channel_count =*/audiounit_get_max_channel_count, + /*.get_min_latency =*/audiounit_get_min_latency, + /*.get_preferred_sample_rate =*/audiounit_get_preferred_sample_rate, + /*.enumerate_devices =*/audiounit_enumerate_devices, + /*.device_collection_destroy =*/audiounit_device_collection_destroy, + /*.destroy =*/audiounit_destroy, + /*.stream_init =*/audiounit_stream_init, + /*.stream_destroy =*/audiounit_stream_destroy, + /*.stream_start =*/audiounit_stream_start, + /*.stream_stop =*/audiounit_stream_stop, + /*.stream_get_position =*/audiounit_stream_get_position, + /*.stream_get_latency =*/audiounit_stream_get_latency, + /*.stream_get_input_latency =*/NULL, + /*.stream_set_volume =*/audiounit_stream_set_volume, + /*.stream_set_name =*/NULL, + /*.stream_get_current_device =*/audiounit_stream_get_current_device, + /*.stream_device_destroy =*/audiounit_stream_device_destroy, + /*.stream_register_device_changed_callback =*/ + audiounit_stream_register_device_changed_callback, + /*.register_device_collection_changed =*/ + audiounit_register_device_collection_changed}; diff --git a/3rdparty/cubeb/src/cubeb_jack.cpp b/3rdparty/cubeb/src/cubeb_jack.cpp new file mode 100644 index 0000000000..d851c79f90 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_jack.cpp @@ -0,0 +1,1166 @@ +/* + * Copyright © 2012 David Richards + * Copyright © 2013 Sebastien Alaiwan + * Copyright © 2016 Damien Zammit + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#define _DEFAULT_SOURCE +#define _BSD_SOURCE +#ifndef __FreeBSD__ +#define _POSIX_SOURCE +#endif +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_resampler.h" +#include "cubeb_utils.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef DISABLE_LIBJACK_DLOPEN +#define WRAP(x) x +#else +#define WRAP(x) (*api_##x) +#define JACK_API_VISIT(X) \ + X(jack_activate) \ + X(jack_client_close) \ + X(jack_client_open) \ + X(jack_connect) \ + X(jack_free) \ + X(jack_get_ports) \ + X(jack_get_sample_rate) \ + X(jack_get_xrun_delayed_usecs) \ + X(jack_get_buffer_size) \ + X(jack_port_get_buffer) \ + X(jack_port_name) \ + X(jack_port_register) \ + X(jack_port_unregister) \ + X(jack_port_get_latency_range) \ + X(jack_set_process_callback) \ + X(jack_set_xrun_callback) \ + X(jack_set_graph_order_callback) \ + X(jack_set_error_function) \ + X(jack_set_info_function) + +#define IMPORT_FUNC(x) static decltype(x) * api_##x; +JACK_API_VISIT(IMPORT_FUNC); +#undef IMPORT_FUNC +#endif + +#define JACK_DEFAULT_IN "JACK capture" +#define JACK_DEFAULT_OUT "JACK playback" + +static const int MAX_STREAMS = 16; +static const int MAX_CHANNELS = 8; +static const int FIFO_SIZE = 4096 * sizeof(float); + +enum devstream { + NONE = 0, + IN_ONLY, + OUT_ONLY, + DUPLEX, +}; + +enum cbjack_connect_ports_options { + CBJACK_CP_OPTIONS_NONE = 0x0, + CBJACK_CP_OPTIONS_SKIP_OUTPUT = 0x1, + CBJACK_CP_OPTIONS_SKIP_INPUT = 0x2, +}; + +static void +s16ne_to_float(float * dst, const int16_t * src, size_t n) +{ + for (size_t i = 0; i < n; i++) + *(dst++) = (float)((float)*(src++) / 32767.0f); +} + +static void +float_to_s16ne(int16_t * dst, float * src, size_t n) +{ + for (size_t i = 0; i < n; i++) { + if (*src > 1.f) + *src = 1.f; + if (*src < -1.f) + *src = -1.f; + *(dst++) = (int16_t)((int16_t)(*(src++) * 32767)); + } +} + +extern "C" { +/*static*/ int +jack_init(cubeb ** context, char const * context_name); +} +static char const * +cbjack_get_backend_id(cubeb * context); +static int +cbjack_get_max_channel_count(cubeb * ctx, uint32_t * max_channels); +static int +cbjack_get_min_latency(cubeb * ctx, cubeb_stream_params params, + uint32_t * latency_frames); +static int +cbjack_get_latency(cubeb_stream * stm, unsigned int * latency_frames); +static int +cbjack_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate); +static void +cbjack_destroy(cubeb * context); +static void +cbjack_interleave_capture(cubeb_stream * stream, float ** in, + jack_nframes_t nframes, bool format_mismatch); +static void +cbjack_deinterleave_playback_refill_s16ne(cubeb_stream * stream, + short ** bufs_in, float ** bufs_out, + jack_nframes_t nframes); +static void +cbjack_deinterleave_playback_refill_float(cubeb_stream * stream, + float ** bufs_in, float ** bufs_out, + jack_nframes_t nframes); +static int +cbjack_stream_device_destroy(cubeb_stream * stream, cubeb_device * device); +static int +cbjack_stream_get_current_device(cubeb_stream * stm, + cubeb_device ** const device); +static int +cbjack_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection); +static int +cbjack_device_collection_destroy(cubeb * context, + cubeb_device_collection * collection); +static int +cbjack_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr); +static void +cbjack_stream_destroy(cubeb_stream * stream); +static int +cbjack_stream_start(cubeb_stream * stream); +static int +cbjack_stream_stop(cubeb_stream * stream); +static int +cbjack_stream_get_position(cubeb_stream * stream, uint64_t * position); +static int +cbjack_stream_set_volume(cubeb_stream * stm, float volume); + +static struct cubeb_ops const cbjack_ops = { + .init = jack_init, + .get_backend_id = cbjack_get_backend_id, + .get_max_channel_count = cbjack_get_max_channel_count, + .get_min_latency = cbjack_get_min_latency, + .get_preferred_sample_rate = cbjack_get_preferred_sample_rate, + .enumerate_devices = cbjack_enumerate_devices, + .device_collection_destroy = cbjack_device_collection_destroy, + .destroy = cbjack_destroy, + .stream_init = cbjack_stream_init, + .stream_destroy = cbjack_stream_destroy, + .stream_start = cbjack_stream_start, + .stream_stop = cbjack_stream_stop, + .stream_get_position = cbjack_stream_get_position, + .stream_get_latency = cbjack_get_latency, + .stream_get_input_latency = NULL, + .stream_set_volume = cbjack_stream_set_volume, + .stream_set_name = NULL, + .stream_get_current_device = cbjack_stream_get_current_device, + .stream_device_destroy = cbjack_stream_device_destroy, + .stream_register_device_changed_callback = NULL, + .register_device_collection_changed = NULL}; + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context; + void * user_ptr; + /**/ + + /**< Mutex for each stream */ + pthread_mutex_t mutex; + + bool in_use; /**< Set to false iff the stream is free */ + bool ports_ready; /**< Set to true iff the JACK ports are ready */ + + cubeb_data_callback data_callback; + cubeb_state_callback state_callback; + cubeb_stream_params in_params; + cubeb_stream_params out_params; + + cubeb_resampler * resampler; + + uint64_t position; + bool pause; + float ratio; + enum devstream devs; + char stream_name[256]; + jack_port_t * output_ports[MAX_CHANNELS]; + jack_port_t * input_ports[MAX_CHANNELS]; + float volume; +}; + +struct cubeb { + struct cubeb_ops const * ops; + void * libjack; + + /**< Mutex for whole context */ + pthread_mutex_t mutex; + + /**< Audio buffers, converted to float */ + float in_float_interleaved_buffer[FIFO_SIZE * MAX_CHANNELS]; + float out_float_interleaved_buffer[FIFO_SIZE * MAX_CHANNELS]; + + /**< Audio buffer, at the sampling rate of the output */ + float in_resampled_interleaved_buffer_float[FIFO_SIZE * MAX_CHANNELS * 3]; + int16_t in_resampled_interleaved_buffer_s16ne[FIFO_SIZE * MAX_CHANNELS * 3]; + float out_resampled_interleaved_buffer_float[FIFO_SIZE * MAX_CHANNELS * 3]; + int16_t out_resampled_interleaved_buffer_s16ne[FIFO_SIZE * MAX_CHANNELS * 3]; + + cubeb_stream streams[MAX_STREAMS]; + unsigned int active_streams; + + cubeb_device_collection_changed_callback collection_changed_callback; + + bool active; + unsigned int jack_sample_rate; + unsigned int jack_latency; + unsigned int jack_xruns; + unsigned int jack_buffer_size; + unsigned int fragment_size; + unsigned int output_bytes_per_frame; + jack_client_t * jack_client; +}; + +static int +load_jack_lib(cubeb * context) +{ +#ifndef DISABLE_LIBJACK_DLOPEN +#ifdef __APPLE__ + context->libjack = dlopen("libjack.0.dylib", RTLD_LAZY); + context->libjack = dlopen("/usr/local/lib/libjack.0.dylib", RTLD_LAZY); +#elif defined(__WIN32__) +#ifdef _WIN64 + context->libjack = LoadLibrary("libjack64.dll"); +#else + context->libjack = LoadLibrary("libjack.dll"); +#endif +#else + context->libjack = dlopen("libjack.so.0", RTLD_LAZY); + if (!context->libjack) { + context->libjack = dlopen("libjack.so", RTLD_LAZY); + } +#endif + if (!context->libjack) { + return CUBEB_ERROR; + } + +#define LOAD(x) \ + { \ + api_##x = (decltype(x) *)dlsym(context->libjack, #x); \ + if (!api_##x) { \ + dlclose(context->libjack); \ + return CUBEB_ERROR; \ + } \ + } + + JACK_API_VISIT(LOAD); +#undef LOAD +#endif + return CUBEB_OK; +} + +static void +cbjack_connect_port_out(cubeb_stream * stream, const size_t out_port, + const char * const phys_in_port) +{ + const char * src_port = WRAP(jack_port_name)(stream->output_ports[out_port]); + + WRAP(jack_connect)(stream->context->jack_client, src_port, phys_in_port); +} + +static void +cbjack_connect_port_in(cubeb_stream * stream, const char * const phys_out_port, + size_t in_port) +{ + const char * src_port = WRAP(jack_port_name)(stream->input_ports[in_port]); + + WRAP(jack_connect)(stream->context->jack_client, phys_out_port, src_port); +} + +static int +cbjack_connect_ports(cubeb_stream * stream, + enum cbjack_connect_ports_options options) +{ + int r = CUBEB_ERROR; + const char ** phys_in_ports = + WRAP(jack_get_ports)(stream->context->jack_client, NULL, NULL, + JackPortIsInput | JackPortIsPhysical); + const char ** phys_out_ports = + WRAP(jack_get_ports)(stream->context->jack_client, NULL, NULL, + JackPortIsOutput | JackPortIsPhysical); + + if (phys_in_ports == NULL || *phys_in_ports == NULL || + options & CBJACK_CP_OPTIONS_SKIP_OUTPUT) { + goto skipplayback; + } + + // Connect outputs to playback + for (unsigned int c = 0; + c < stream->out_params.channels && phys_in_ports[c] != NULL; c++) { + cbjack_connect_port_out(stream, c, phys_in_ports[c]); + } + + // Special case playing mono source in stereo + if (stream->out_params.channels == 1 && phys_in_ports[1] != NULL) { + cbjack_connect_port_out(stream, 0, phys_in_ports[1]); + } + + r = CUBEB_OK; + +skipplayback: + if (phys_out_ports == NULL || *phys_out_ports == NULL || + options & CBJACK_CP_OPTIONS_SKIP_INPUT) { + goto end; + } + // Connect inputs to capture + for (unsigned int c = 0; + c < stream->in_params.channels && phys_out_ports[c] != NULL; c++) { + cbjack_connect_port_in(stream, phys_out_ports[c], c); + } + r = CUBEB_OK; +end: + if (phys_out_ports) { + WRAP(jack_free)(phys_out_ports); + } + if (phys_in_ports) { + WRAP(jack_free)(phys_in_ports); + } + return r; +} + +static int +cbjack_xrun_callback(void * arg) +{ + cubeb * ctx = (cubeb *)arg; + + float delay = WRAP(jack_get_xrun_delayed_usecs)(ctx->jack_client); + float fragments = ceilf(((delay / 1000000.0) * ctx->jack_sample_rate) / + ctx->jack_buffer_size); + + ctx->jack_xruns += (unsigned int)fragments; + return 0; +} + +static int +cbjack_graph_order_callback(void * arg) +{ + cubeb * ctx = (cubeb *)arg; + int i; + jack_latency_range_t latency_range; + jack_nframes_t port_latency, max_latency = 0; + + for (int j = 0; j < MAX_STREAMS; j++) { + cubeb_stream * stm = &ctx->streams[j]; + + if (!stm->in_use) + continue; + if (!stm->ports_ready) + continue; + + for (i = 0; i < (int)stm->out_params.channels; ++i) { + WRAP(jack_port_get_latency_range) + (stm->output_ports[i], JackPlaybackLatency, &latency_range); + port_latency = latency_range.max; + if (port_latency > max_latency) + max_latency = port_latency; + } + /* Cap minimum latency to 128 frames */ + if (max_latency < 128) + max_latency = 128; + } + + ctx->jack_latency = max_latency; + + return 0; +} + +static int +cbjack_process(jack_nframes_t nframes, void * arg) +{ + cubeb * ctx = (cubeb *)arg; + unsigned int t_jack_xruns = ctx->jack_xruns; + int i; + + ctx->jack_xruns = 0; + + for (int j = 0; j < MAX_STREAMS; j++) { + cubeb_stream * stm = &ctx->streams[j]; + float * bufs_out[stm->out_params.channels]; + float * bufs_in[stm->in_params.channels]; + + if (!stm->in_use) + continue; + + // handle xruns by skipping audio that should have been played + stm->position += t_jack_xruns * ctx->fragment_size * stm->ratio; + + if (!stm->ports_ready) + continue; + + if (stm->devs & OUT_ONLY) { + // get jack output buffers + for (i = 0; i < (int)stm->out_params.channels; i++) + bufs_out[i] = + (float *)WRAP(jack_port_get_buffer)(stm->output_ports[i], nframes); + } + if (stm->devs & IN_ONLY) { + // get jack input buffers + for (i = 0; i < (int)stm->in_params.channels; i++) + bufs_in[i] = + (float *)WRAP(jack_port_get_buffer)(stm->input_ports[i], nframes); + } + if (stm->pause) { + // paused, play silence on output + if (stm->devs & OUT_ONLY) { + for (unsigned int c = 0; c < stm->out_params.channels; c++) { + float * buffer_out = bufs_out[c]; + for (long f = 0; f < nframes; f++) { + buffer_out[f] = 0.f; + } + } + } + if (stm->devs & IN_ONLY) { + // paused, capture silence + for (unsigned int c = 0; c < stm->in_params.channels; c++) { + float * buffer_in = bufs_in[c]; + for (long f = 0; f < nframes; f++) { + buffer_in[f] = 0.f; + } + } + } + } else { + + // try to lock stream mutex + if (pthread_mutex_trylock(&stm->mutex) == 0) { + + int16_t * in_s16ne = + stm->context->in_resampled_interleaved_buffer_s16ne; + float * in_float = stm->context->in_resampled_interleaved_buffer_float; + + // unpaused, play audio + if (stm->devs == DUPLEX) { + if (stm->out_params.format == CUBEB_SAMPLE_S16NE) { + cbjack_interleave_capture(stm, bufs_in, nframes, true); + cbjack_deinterleave_playback_refill_s16ne(stm, &in_s16ne, bufs_out, + nframes); + } else if (stm->out_params.format == CUBEB_SAMPLE_FLOAT32NE) { + cbjack_interleave_capture(stm, bufs_in, nframes, false); + cbjack_deinterleave_playback_refill_float(stm, &in_float, bufs_out, + nframes); + } + } else if (stm->devs == IN_ONLY) { + if (stm->in_params.format == CUBEB_SAMPLE_S16NE) { + cbjack_interleave_capture(stm, bufs_in, nframes, true); + cbjack_deinterleave_playback_refill_s16ne(stm, &in_s16ne, nullptr, + nframes); + } else if (stm->in_params.format == CUBEB_SAMPLE_FLOAT32NE) { + cbjack_interleave_capture(stm, bufs_in, nframes, false); + cbjack_deinterleave_playback_refill_float(stm, &in_float, nullptr, + nframes); + } + } else if (stm->devs == OUT_ONLY) { + if (stm->out_params.format == CUBEB_SAMPLE_S16NE) { + cbjack_deinterleave_playback_refill_s16ne(stm, nullptr, bufs_out, + nframes); + } else if (stm->out_params.format == CUBEB_SAMPLE_FLOAT32NE) { + cbjack_deinterleave_playback_refill_float(stm, nullptr, bufs_out, + nframes); + } + } + // unlock stream mutex + pthread_mutex_unlock(&stm->mutex); + + } else { + // could not lock mutex + // output silence + if (stm->devs & OUT_ONLY) { + for (unsigned int c = 0; c < stm->out_params.channels; c++) { + float * buffer_out = bufs_out[c]; + for (long f = 0; f < nframes; f++) { + buffer_out[f] = 0.f; + } + } + } + if (stm->devs & IN_ONLY) { + // capture silence + for (unsigned int c = 0; c < stm->in_params.channels; c++) { + float * buffer_in = bufs_in[c]; + for (long f = 0; f < nframes; f++) { + buffer_in[f] = 0.f; + } + } + } + } + } + } + return 0; +} + +static void +cbjack_deinterleave_playback_refill_float(cubeb_stream * stream, float ** in, + float ** bufs_out, + jack_nframes_t nframes) +{ + float * out_interleaved_buffer = nullptr; + + float * inptr = (in != NULL) ? *in : nullptr; + float * outptr = (bufs_out != NULL) ? *bufs_out : nullptr; + + long needed_frames = (bufs_out != NULL) ? nframes : 0; + long done_frames = 0; + long input_frames_count = (in != NULL) ? nframes : 0; + + done_frames = cubeb_resampler_fill( + stream->resampler, inptr, &input_frames_count, + (bufs_out != NULL) + ? stream->context->out_resampled_interleaved_buffer_float + : NULL, + needed_frames); + + out_interleaved_buffer = + stream->context->out_resampled_interleaved_buffer_float; + + if (outptr) { + // convert interleaved output buffers to contiguous buffers + for (unsigned int c = 0; c < stream->out_params.channels; c++) { + float * buffer = bufs_out[c]; + for (long f = 0; f < done_frames; f++) { + buffer[f] = + out_interleaved_buffer[(f * stream->out_params.channels) + c] * + stream->volume; + } + if (done_frames < needed_frames) { + // draining + for (long f = done_frames; f < needed_frames; f++) { + buffer[f] = 0.f; + } + } + if (done_frames == 0) { + // stop, but first zero out the existing buffer + for (long f = 0; f < needed_frames; f++) { + buffer[f] = 0.f; + } + } + } + } + + if (done_frames >= 0 && done_frames < needed_frames) { + // set drained + stream->state_callback(stream, stream->user_ptr, CUBEB_STATE_DRAINED); + // stop stream + cbjack_stream_stop(stream); + } + if (done_frames > 0 && done_frames <= needed_frames) { + // advance stream position + stream->position += done_frames * stream->ratio; + } + if (done_frames < 0 || done_frames > needed_frames) { + // stream error + stream->state_callback(stream, stream->user_ptr, CUBEB_STATE_ERROR); + } +} + +static void +cbjack_deinterleave_playback_refill_s16ne(cubeb_stream * stream, short ** in, + float ** bufs_out, + jack_nframes_t nframes) +{ + float * out_interleaved_buffer = nullptr; + + short * inptr = (in != NULL) ? *in : nullptr; + float * outptr = (bufs_out != NULL) ? *bufs_out : nullptr; + + long needed_frames = (bufs_out != NULL) ? nframes : 0; + long done_frames = 0; + long input_frames_count = (in != NULL) ? nframes : 0; + + done_frames = cubeb_resampler_fill( + stream->resampler, inptr, &input_frames_count, + (bufs_out != NULL) + ? stream->context->out_resampled_interleaved_buffer_s16ne + : NULL, + needed_frames); + + s16ne_to_float(stream->context->out_resampled_interleaved_buffer_float, + stream->context->out_resampled_interleaved_buffer_s16ne, + done_frames * stream->out_params.channels); + + out_interleaved_buffer = + stream->context->out_resampled_interleaved_buffer_float; + + if (outptr) { + // convert interleaved output buffers to contiguous buffers + for (unsigned int c = 0; c < stream->out_params.channels; c++) { + float * buffer = bufs_out[c]; + for (long f = 0; f < done_frames; f++) { + buffer[f] = + out_interleaved_buffer[(f * stream->out_params.channels) + c] * + stream->volume; + } + if (done_frames < needed_frames) { + // draining + for (long f = done_frames; f < needed_frames; f++) { + buffer[f] = 0.f; + } + } + if (done_frames == 0) { + // stop, but first zero out the existing buffer + for (long f = 0; f < needed_frames; f++) { + buffer[f] = 0.f; + } + } + } + } + + if (done_frames >= 0 && done_frames < needed_frames) { + // set drained + stream->state_callback(stream, stream->user_ptr, CUBEB_STATE_DRAINED); + // stop stream + cbjack_stream_stop(stream); + } + if (done_frames > 0 && done_frames <= needed_frames) { + // advance stream position + stream->position += done_frames * stream->ratio; + } + if (done_frames < 0 || done_frames > needed_frames) { + // stream error + stream->state_callback(stream, stream->user_ptr, CUBEB_STATE_ERROR); + } +} + +static void +cbjack_interleave_capture(cubeb_stream * stream, float ** in, + jack_nframes_t nframes, bool format_mismatch) +{ + float * in_buffer = stream->context->in_float_interleaved_buffer; + + for (unsigned int c = 0; c < stream->in_params.channels; c++) { + for (long f = 0; f < nframes; f++) { + in_buffer[(f * stream->in_params.channels) + c] = + in[c][f] * stream->volume; + } + } + if (format_mismatch) { + float_to_s16ne(stream->context->in_resampled_interleaved_buffer_s16ne, + in_buffer, nframes * stream->in_params.channels); + } else { + memset(stream->context->in_resampled_interleaved_buffer_float, 0, + (FIFO_SIZE * MAX_CHANNELS * 3) * sizeof(float)); + memcpy(stream->context->in_resampled_interleaved_buffer_float, in_buffer, + (FIFO_SIZE * MAX_CHANNELS * 2) * sizeof(float)); + } +} + +static void +silent_jack_error_callback(char const * /*msg*/) +{ +} + +/*static*/ int +jack_init(cubeb ** context, char const * context_name) +{ + int r; + + *context = NULL; + + cubeb * ctx = (cubeb *)calloc(1, sizeof(*ctx)); + if (ctx == NULL) { + return CUBEB_ERROR; + } + + r = load_jack_lib(ctx); + if (r != 0) { + cbjack_destroy(ctx); + return CUBEB_ERROR; + } + + WRAP(jack_set_error_function)(silent_jack_error_callback); + WRAP(jack_set_info_function)(silent_jack_error_callback); + + ctx->ops = &cbjack_ops; + + ctx->mutex = PTHREAD_MUTEX_INITIALIZER; + for (r = 0; r < MAX_STREAMS; r++) { + ctx->streams[r].mutex = PTHREAD_MUTEX_INITIALIZER; + } + + const char * jack_client_name = "cubeb"; + if (context_name) + jack_client_name = context_name; + + ctx->jack_client = + WRAP(jack_client_open)(jack_client_name, JackNoStartServer, NULL); + + if (ctx->jack_client == NULL) { + cbjack_destroy(ctx); + return CUBEB_ERROR; + } + + ctx->jack_xruns = 0; + + WRAP(jack_set_process_callback)(ctx->jack_client, cbjack_process, ctx); + WRAP(jack_set_xrun_callback)(ctx->jack_client, cbjack_xrun_callback, ctx); + WRAP(jack_set_graph_order_callback) + (ctx->jack_client, cbjack_graph_order_callback, ctx); + + if (WRAP(jack_activate)(ctx->jack_client)) { + cbjack_destroy(ctx); + return CUBEB_ERROR; + } + + ctx->jack_sample_rate = WRAP(jack_get_sample_rate)(ctx->jack_client); + ctx->jack_latency = 128 * 1000 / ctx->jack_sample_rate; + + ctx->active = true; + *context = ctx; + + return CUBEB_OK; +} + +static char const * +cbjack_get_backend_id(cubeb * /*context*/) +{ + return "jack"; +} + +static int +cbjack_get_max_channel_count(cubeb * /*ctx*/, uint32_t * max_channels) +{ + *max_channels = MAX_CHANNELS; + return CUBEB_OK; +} + +static int +cbjack_get_latency(cubeb_stream * stm, unsigned int * latency_ms) +{ + *latency_ms = stm->context->jack_latency; + return CUBEB_OK; +} + +static int +cbjack_get_min_latency(cubeb * ctx, cubeb_stream_params /*params*/, + uint32_t * latency_ms) +{ + *latency_ms = ctx->jack_latency; + return CUBEB_OK; +} + +static int +cbjack_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) +{ + if (!ctx->jack_client) { + jack_client_t * testclient = + WRAP(jack_client_open)("test-samplerate", JackNoStartServer, NULL); + if (!testclient) { + return CUBEB_ERROR; + } + + *rate = WRAP(jack_get_sample_rate)(testclient); + WRAP(jack_client_close)(testclient); + + } else { + *rate = WRAP(jack_get_sample_rate)(ctx->jack_client); + } + return CUBEB_OK; +} + +static void +cbjack_destroy(cubeb * context) +{ + context->active = false; + + if (context->jack_client != NULL) + WRAP(jack_client_close)(context->jack_client); +#ifndef DISABLE_LIBJACK_DLOPEN + if (context->libjack) + dlclose(context->libjack); +#endif + free(context); +} + +static cubeb_stream * +context_alloc_stream(cubeb * context, char const * stream_name) +{ + for (int i = 0; i < MAX_STREAMS; i++) { + if (!context->streams[i].in_use) { + cubeb_stream * stm = &context->streams[i]; + stm->in_use = true; + snprintf(stm->stream_name, 255, "%s_%u", stream_name, i); + return stm; + } + } + return NULL; +} + +static int +cbjack_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int /*latency_frames*/, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + int stream_actual_rate = 0; + int jack_rate = WRAP(jack_get_sample_rate)(context->jack_client); + + if (output_stream_params && + (output_stream_params->format != CUBEB_SAMPLE_FLOAT32NE && + output_stream_params->format != CUBEB_SAMPLE_S16NE)) { + return CUBEB_ERROR_INVALID_FORMAT; + } + + if (input_stream_params && + (input_stream_params->format != CUBEB_SAMPLE_FLOAT32NE && + input_stream_params->format != CUBEB_SAMPLE_S16NE)) { + return CUBEB_ERROR_INVALID_FORMAT; + } + + if ((input_device && input_device != JACK_DEFAULT_IN) || + (output_device && output_device != JACK_DEFAULT_OUT)) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + // Loopback is unsupported + if ((input_stream_params && + (input_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK)) || + (output_stream_params && + (output_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK))) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + *stream = NULL; + + // Find a free stream. + pthread_mutex_lock(&context->mutex); + cubeb_stream * stm = context_alloc_stream(context, stream_name); + + // No free stream? + if (stm == NULL) { + pthread_mutex_unlock(&context->mutex); + return CUBEB_ERROR; + } + + // unlock context mutex + pthread_mutex_unlock(&context->mutex); + + // Lock active stream + pthread_mutex_lock(&stm->mutex); + + stm->ports_ready = false; + stm->user_ptr = user_ptr; + stm->context = context; + stm->devs = NONE; + if (output_stream_params && !input_stream_params) { + stm->out_params = *output_stream_params; + stream_actual_rate = stm->out_params.rate; + stm->out_params.rate = jack_rate; + stm->devs = OUT_ONLY; + if (stm->out_params.format == CUBEB_SAMPLE_FLOAT32NE) { + context->output_bytes_per_frame = sizeof(float); + } else { + context->output_bytes_per_frame = sizeof(short); + } + } + if (input_stream_params && output_stream_params) { + stm->in_params = *input_stream_params; + stm->out_params = *output_stream_params; + stream_actual_rate = stm->out_params.rate; + stm->in_params.rate = jack_rate; + stm->out_params.rate = jack_rate; + stm->devs = DUPLEX; + if (stm->out_params.format == CUBEB_SAMPLE_FLOAT32NE) { + context->output_bytes_per_frame = sizeof(float); + stm->in_params.format = CUBEB_SAMPLE_FLOAT32NE; + } else { + context->output_bytes_per_frame = sizeof(short); + stm->in_params.format = CUBEB_SAMPLE_S16NE; + } + } else if (input_stream_params && !output_stream_params) { + stm->in_params = *input_stream_params; + stream_actual_rate = stm->in_params.rate; + stm->in_params.rate = jack_rate; + stm->devs = IN_ONLY; + if (stm->in_params.format == CUBEB_SAMPLE_FLOAT32NE) { + context->output_bytes_per_frame = sizeof(float); + } else { + context->output_bytes_per_frame = sizeof(short); + } + } + + stm->ratio = (float)stream_actual_rate / (float)jack_rate; + + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->position = 0; + stm->volume = 1.0f; + context->jack_buffer_size = WRAP(jack_get_buffer_size)(context->jack_client); + context->fragment_size = context->jack_buffer_size; + + if (stm->devs == NONE) { + pthread_mutex_unlock(&stm->mutex); + return CUBEB_ERROR; + } + + stm->resampler = NULL; + + if (stm->devs == DUPLEX) { + stm->resampler = cubeb_resampler_create( + stm, &stm->in_params, &stm->out_params, stream_actual_rate, + stm->data_callback, stm->user_ptr, CUBEB_RESAMPLER_QUALITY_DESKTOP, + CUBEB_RESAMPLER_RECLOCK_NONE); + } else if (stm->devs == IN_ONLY) { + stm->resampler = cubeb_resampler_create( + stm, &stm->in_params, nullptr, stream_actual_rate, stm->data_callback, + stm->user_ptr, CUBEB_RESAMPLER_QUALITY_DESKTOP, + CUBEB_RESAMPLER_RECLOCK_NONE); + } else if (stm->devs == OUT_ONLY) { + stm->resampler = cubeb_resampler_create( + stm, nullptr, &stm->out_params, stream_actual_rate, stm->data_callback, + stm->user_ptr, CUBEB_RESAMPLER_QUALITY_DESKTOP, + CUBEB_RESAMPLER_RECLOCK_NONE); + } + + if (!stm->resampler) { + stm->in_use = false; + pthread_mutex_unlock(&stm->mutex); + return CUBEB_ERROR; + } + + if (stm->devs == DUPLEX || stm->devs == OUT_ONLY) { + for (unsigned int c = 0; c < stm->out_params.channels; c++) { + char portname[256]; + snprintf(portname, 255, "%s_out_%d", stm->stream_name, c); + stm->output_ports[c] = WRAP(jack_port_register)( + stm->context->jack_client, portname, JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, 0); + if (!(output_stream_params->prefs & + CUBEB_STREAM_PREF_JACK_NO_AUTO_CONNECT)) { + if (cbjack_connect_ports(stm, CBJACK_CP_OPTIONS_SKIP_INPUT) != + CUBEB_OK) { + pthread_mutex_unlock(&stm->mutex); + cbjack_stream_destroy(stm); + return CUBEB_ERROR; + } + } + } + } + + if (stm->devs == DUPLEX || stm->devs == IN_ONLY) { + for (unsigned int c = 0; c < stm->in_params.channels; c++) { + char portname[256]; + snprintf(portname, 255, "%s_in_%d", stm->stream_name, c); + stm->input_ports[c] = + WRAP(jack_port_register)(stm->context->jack_client, portname, + JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); + if (!(input_stream_params->prefs & + CUBEB_STREAM_PREF_JACK_NO_AUTO_CONNECT)) { + if (cbjack_connect_ports(stm, CBJACK_CP_OPTIONS_SKIP_OUTPUT) != + CUBEB_OK) { + pthread_mutex_unlock(&stm->mutex); + cbjack_stream_destroy(stm); + return CUBEB_ERROR; + } + } + } + } + + *stream = stm; + + stm->ports_ready = true; + stm->pause = true; + pthread_mutex_unlock(&stm->mutex); + + return CUBEB_OK; +} + +static void +cbjack_stream_destroy(cubeb_stream * stream) +{ + pthread_mutex_lock(&stream->mutex); + stream->ports_ready = false; + + if (stream->devs == DUPLEX || stream->devs == OUT_ONLY) { + for (unsigned int c = 0; c < stream->out_params.channels; c++) { + if (stream->output_ports[c]) { + WRAP(jack_port_unregister) + (stream->context->jack_client, stream->output_ports[c]); + stream->output_ports[c] = NULL; + } + } + } + + if (stream->devs == DUPLEX || stream->devs == IN_ONLY) { + for (unsigned int c = 0; c < stream->in_params.channels; c++) { + if (stream->input_ports[c]) { + WRAP(jack_port_unregister) + (stream->context->jack_client, stream->input_ports[c]); + stream->input_ports[c] = NULL; + } + } + } + + if (stream->resampler) { + cubeb_resampler_destroy(stream->resampler); + stream->resampler = NULL; + } + stream->in_use = false; + pthread_mutex_unlock(&stream->mutex); +} + +static int +cbjack_stream_start(cubeb_stream * stream) +{ + stream->pause = false; + stream->state_callback(stream, stream->user_ptr, CUBEB_STATE_STARTED); + return CUBEB_OK; +} + +static int +cbjack_stream_stop(cubeb_stream * stream) +{ + stream->pause = true; + stream->state_callback(stream, stream->user_ptr, CUBEB_STATE_STOPPED); + return CUBEB_OK; +} + +static int +cbjack_stream_get_position(cubeb_stream * stream, uint64_t * position) +{ + *position = stream->position; + return CUBEB_OK; +} + +static int +cbjack_stream_set_volume(cubeb_stream * stm, float volume) +{ + stm->volume = volume; + return CUBEB_OK; +} + +static int +cbjack_stream_get_current_device(cubeb_stream * stm, + cubeb_device ** const device) +{ + *device = (cubeb_device *)calloc(1, sizeof(cubeb_device)); + if (*device == NULL) + return CUBEB_ERROR; + + const char * j_in = JACK_DEFAULT_IN; + const char * j_out = JACK_DEFAULT_OUT; + const char * empty = ""; + + if (stm->devs == DUPLEX) { + (*device)->input_name = strdup(j_in); + (*device)->output_name = strdup(j_out); + } else if (stm->devs == IN_ONLY) { + (*device)->input_name = strdup(j_in); + (*device)->output_name = strdup(empty); + } else if (stm->devs == OUT_ONLY) { + (*device)->input_name = strdup(empty); + (*device)->output_name = strdup(j_out); + } + + return CUBEB_OK; +} + +static int +cbjack_stream_device_destroy(cubeb_stream * /*stream*/, cubeb_device * device) +{ + if (device->input_name) + free(device->input_name); + if (device->output_name) + free(device->output_name); + free(device); + return CUBEB_OK; +} + +static int +cbjack_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection) +{ + if (!context) + return CUBEB_ERROR; + + uint32_t rate; + cbjack_get_preferred_sample_rate(context, &rate); + + cubeb_device_info * devices = new cubeb_device_info[2]; + if (!devices) + return CUBEB_ERROR; + PodZero(devices, 2); + collection->count = 0; + + if (type & CUBEB_DEVICE_TYPE_OUTPUT) { + cubeb_device_info * cur = &devices[collection->count]; + cur->device_id = JACK_DEFAULT_OUT; + cur->devid = (cubeb_devid)cur->device_id; + cur->friendly_name = JACK_DEFAULT_OUT; + cur->group_id = JACK_DEFAULT_OUT; + cur->vendor_name = JACK_DEFAULT_OUT; + cur->type = CUBEB_DEVICE_TYPE_OUTPUT; + cur->state = CUBEB_DEVICE_STATE_ENABLED; + cur->preferred = CUBEB_DEVICE_PREF_ALL; + cur->format = CUBEB_DEVICE_FMT_F32NE; + cur->default_format = CUBEB_DEVICE_FMT_F32NE; + cur->max_channels = MAX_CHANNELS; + cur->min_rate = rate; + cur->max_rate = rate; + cur->default_rate = rate; + cur->latency_lo = 0; + cur->latency_hi = 0; + collection->count += 1; + } + + if (type & CUBEB_DEVICE_TYPE_INPUT) { + cubeb_device_info * cur = &devices[collection->count]; + cur->device_id = JACK_DEFAULT_IN; + cur->devid = (cubeb_devid)cur->device_id; + cur->friendly_name = JACK_DEFAULT_IN; + cur->group_id = JACK_DEFAULT_IN; + cur->vendor_name = JACK_DEFAULT_IN; + cur->type = CUBEB_DEVICE_TYPE_INPUT; + cur->state = CUBEB_DEVICE_STATE_ENABLED; + cur->preferred = CUBEB_DEVICE_PREF_ALL; + cur->format = CUBEB_DEVICE_FMT_F32NE; + cur->default_format = CUBEB_DEVICE_FMT_F32NE; + cur->max_channels = MAX_CHANNELS; + cur->min_rate = rate; + cur->max_rate = rate; + cur->default_rate = rate; + cur->latency_lo = 0; + cur->latency_hi = 0; + collection->count += 1; + } + + collection->device = devices; + + return CUBEB_OK; +} + +static int +cbjack_device_collection_destroy(cubeb * /*ctx*/, + cubeb_device_collection * collection) +{ + XASSERT(collection); + delete[] collection->device; + return CUBEB_OK; +} diff --git a/3rdparty/cubeb/src/cubeb_kai.c b/3rdparty/cubeb/src/cubeb_kai.c new file mode 100644 index 0000000000..0a0d67661f --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_kai.c @@ -0,0 +1,369 @@ +/* + * Copyright © 2015 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#include +#include +#include +#include + +#include + +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" + +/* We don't support more than 2 channels in KAI */ +#define MAX_CHANNELS 2 + +#define NBUFS 2 +#define FRAME_SIZE 2048 + +struct cubeb_stream_item { + cubeb_stream * stream; +}; + +static struct cubeb_ops const kai_ops; + +struct cubeb { + struct cubeb_ops const * ops; +}; + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context; + void * user_ptr; + /**/ + cubeb_stream_params params; + cubeb_data_callback data_callback; + cubeb_state_callback state_callback; + + HKAI hkai; + KAISPEC spec; + uint64_t total_frames; + float soft_volume; + _fmutex mutex; + float float_buffer[FRAME_SIZE * MAX_CHANNELS]; +}; + +static inline long +frames_to_bytes(long frames, cubeb_stream_params params) +{ + return frames * 2 * params.channels; /* 2 bytes per frame */ +} + +static inline long +bytes_to_frames(long bytes, cubeb_stream_params params) +{ + return bytes / 2 / params.channels; /* 2 bytes per frame */ +} + +static void +kai_destroy(cubeb * ctx); + +/*static*/ int +kai_init(cubeb ** context, char const * context_name) +{ + cubeb * ctx; + + XASSERT(context); + *context = NULL; + + if (kaiInit(KAIM_AUTO)) + return CUBEB_ERROR; + + ctx = calloc(1, sizeof(*ctx)); + XASSERT(ctx); + + ctx->ops = &kai_ops; + + *context = ctx; + + return CUBEB_OK; +} + +static char const * +kai_get_backend_id(cubeb * ctx) +{ + return "kai"; +} + +static void +kai_destroy(cubeb * ctx) +{ + kaiDone(); + + free(ctx); +} + +static void +float_to_s16ne(int16_t * dst, float * src, size_t n) +{ + long l; + + while (n--) { + l = lrintf(*src++ * 0x8000); + if (l > 32767) + l = 32767; + if (l < -32768) + l = -32768; + *dst++ = (int16_t)l; + } +} + +static ULONG APIENTRY +kai_callback(PVOID cbdata, PVOID buffer, ULONG len) +{ + cubeb_stream * stm = cbdata; + void * p; + long wanted_frames; + long frames; + float soft_volume; + int elements = len / sizeof(int16_t); + + p = stm->params.format == CUBEB_SAMPLE_FLOAT32NE ? stm->float_buffer : buffer; + + wanted_frames = bytes_to_frames(len, stm->params); + frames = stm->data_callback(stm, stm->user_ptr, NULL, p, wanted_frames); + + _fmutex_request(&stm->mutex, 0); + stm->total_frames += frames; + soft_volume = stm->soft_volume; + _fmutex_release(&stm->mutex); + + if (frames < wanted_frames) + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + + if (stm->params.format == CUBEB_SAMPLE_FLOAT32NE) + float_to_s16ne(buffer, p, elements); + + if (soft_volume != -1.0f) { + int16_t * b = buffer; + int i; + + for (i = 0; i < elements; i++) + *b++ *= soft_volume; + } + + return frames_to_bytes(frames, stm->params); +} + +static void +kai_stream_destroy(cubeb_stream * stm); + +static int +kai_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency, cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + cubeb_stream * stm; + KAISPEC wanted_spec; + + XASSERT(!input_stream_params && "not supported."); + if (input_device || output_device) { + /* Device selection not yet implemented. */ + return CUBEB_ERROR_DEVICE_UNAVAILABLE; + } + + if (!output_stream_params) + return CUBEB_ERROR_INVALID_PARAMETER; + + // Loopback is unsupported + if (output_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + if (output_stream_params->channels < 1 || + output_stream_params->channels > MAX_CHANNELS) + return CUBEB_ERROR_INVALID_FORMAT; + + XASSERT(context); + XASSERT(stream); + + *stream = NULL; + + stm = calloc(1, sizeof(*stm)); + XASSERT(stm); + + stm->context = context; + stm->params = *output_stream_params; + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->user_ptr = user_ptr; + stm->soft_volume = -1.0f; + + if (_fmutex_create(&stm->mutex, 0)) { + free(stm); + return CUBEB_ERROR; + } + + wanted_spec.usDeviceIndex = 0; + wanted_spec.ulType = KAIT_PLAY; + wanted_spec.ulBitsPerSample = BPS_16; + wanted_spec.ulSamplingRate = stm->params.rate; + wanted_spec.ulDataFormat = MCI_WAVE_FORMAT_PCM; + wanted_spec.ulChannels = stm->params.channels; + wanted_spec.ulNumBuffers = NBUFS; + wanted_spec.ulBufferSize = frames_to_bytes(FRAME_SIZE, stm->params); + wanted_spec.fShareable = TRUE; + wanted_spec.pfnCallBack = kai_callback; + wanted_spec.pCallBackData = stm; + + if (kaiOpen(&wanted_spec, &stm->spec, &stm->hkai)) { + _fmutex_close(&stm->mutex); + free(stm); + return CUBEB_ERROR; + } + + *stream = stm; + + return CUBEB_OK; +} + +static void +kai_stream_destroy(cubeb_stream * stm) +{ + kaiClose(stm->hkai); + _fmutex_close(&stm->mutex); + free(stm); +} + +static int +kai_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + XASSERT(ctx && max_channels); + + *max_channels = MAX_CHANNELS; + + return CUBEB_OK; +} + +static int +kai_get_min_latency(cubeb * ctx, cubeb_stream_params params, uint32_t * latency) +{ + /* We have at least two buffers. One is being played, the other one is being + filled. So there is as much latency as one buffer. */ + *latency = FRAME_SIZE; + + return CUBEB_OK; +} + +static int +kai_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) +{ + cubeb_stream_params params; + KAISPEC wanted_spec; + KAISPEC spec; + HKAI hkai; + + params.format = CUBEB_SAMPLE_S16NE; + params.rate = 48000; + params.channels = 2; + + wanted_spec.usDeviceIndex = 0; + wanted_spec.ulType = KAIT_PLAY; + wanted_spec.ulBitsPerSample = BPS_16; + wanted_spec.ulSamplingRate = params.rate; + wanted_spec.ulDataFormat = MCI_WAVE_FORMAT_PCM; + wanted_spec.ulChannels = params.channels; + wanted_spec.ulNumBuffers = NBUFS; + wanted_spec.ulBufferSize = frames_to_bytes(FRAME_SIZE, params); + wanted_spec.fShareable = TRUE; + wanted_spec.pfnCallBack = kai_callback; + wanted_spec.pCallBackData = NULL; + + /* Test 48KHz */ + if (kaiOpen(&wanted_spec, &spec, &hkai)) { + /* Not supported. Fall back to 44.1KHz */ + params.rate = 44100; + } else { + /* Supported. Use 48KHz */ + kaiClose(hkai); + } + + *rate = params.rate; + + return CUBEB_OK; +} + +static int +kai_stream_start(cubeb_stream * stm) +{ + if (kaiPlay(stm->hkai)) + return CUBEB_ERROR; + + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STARTED); + + return CUBEB_OK; +} + +static int +kai_stream_stop(cubeb_stream * stm) +{ + if (kaiStop(stm->hkai)) + return CUBEB_ERROR; + + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STOPPED); + + return CUBEB_OK; +} + +static int +kai_stream_get_position(cubeb_stream * stm, uint64_t * position) +{ + _fmutex_request(&stm->mutex, 0); + *position = stm->total_frames; + _fmutex_release(&stm->mutex); + + return CUBEB_OK; +} + +static int +kai_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +{ + /* Out of buffers, one is being played, the others are being filled. + So there is as much latency as total buffers - 1. */ + *latency = bytes_to_frames(stm->spec.ulBufferSize, stm->params) * + (stm->spec.ulNumBuffers - 1); + + return CUBEB_OK; +} + +static int +kai_stream_set_volume(cubeb_stream * stm, float volume) +{ + _fmutex_request(&stm->mutex, 0); + stm->soft_volume = volume; + _fmutex_release(&stm->mutex); + + return CUBEB_OK; +} + +static struct cubeb_ops const kai_ops = { + /*.init =*/kai_init, + /*.get_backend_id =*/kai_get_backend_id, + /*.get_max_channel_count=*/kai_get_max_channel_count, + /*.get_min_latency=*/kai_get_min_latency, + /*.get_preferred_sample_rate =*/kai_get_preferred_sample_rate, + /*.get_preferred_channel_layout =*/NULL, + /*.enumerate_devices =*/NULL, + /*.device_collection_destroy =*/NULL, + /*.destroy =*/kai_destroy, + /*.stream_init =*/kai_stream_init, + /*.stream_destroy =*/kai_stream_destroy, + /*.stream_start =*/kai_stream_start, + /*.stream_stop =*/kai_stream_stop, + /*.stream_get_position =*/kai_stream_get_position, + /*.stream_get_latency = */ kai_stream_get_latency, + /*.stream_get_input_latency = */ NULL, + /*.stream_set_volume =*/kai_stream_set_volume, + /*.stream_set_name =*/NULL, + /*.stream_get_current_device =*/NULL, + /*.stream_device_destroy =*/NULL, + /*.stream_register_device_changed_callback=*/NULL, + /*.register_device_collection_changed=*/NULL}; diff --git a/3rdparty/cubeb/src/cubeb_log.cpp b/3rdparty/cubeb/src/cubeb_log.cpp new file mode 100644 index 0000000000..0d86518b4e --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_log.cpp @@ -0,0 +1,168 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#define NOMINMAX + +#include "cubeb_log.h" +#include "cubeb_ringbuffer.h" +#include "cubeb_tracing.h" +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +std::atomic g_cubeb_log_level; +std::atomic g_cubeb_log_callback; + +/** The maximum size of a log message, after having been formatted. */ +const size_t CUBEB_LOG_MESSAGE_MAX_SIZE = 256; +/** The maximum number of log messages that can be queued before dropping + * messages. */ +const size_t CUBEB_LOG_MESSAGE_QUEUE_DEPTH = 40; +/** Number of milliseconds to wait before dequeuing log messages. */ +#define CUBEB_LOG_BATCH_PRINT_INTERVAL_MS 10 + +/** + * This wraps an inline buffer, that represents a log message, that must be + * null-terminated. + * This class should not use system calls or other potentially blocking code. + */ +class cubeb_log_message { +public: + cubeb_log_message() { *storage = '\0'; } + cubeb_log_message(char const str[CUBEB_LOG_MESSAGE_MAX_SIZE]) + { + size_t length = strlen(str); + /* paranoia against malformed message */ + assert(length < CUBEB_LOG_MESSAGE_MAX_SIZE); + if (length > CUBEB_LOG_MESSAGE_MAX_SIZE - 1) { + return; + } + PodCopy(storage, str, length); + storage[length] = '\0'; + } + char const * get() { return storage; } + +private: + char storage[CUBEB_LOG_MESSAGE_MAX_SIZE]; +}; + +/** Lock-free asynchronous logger, made so that logging from a + * real-time audio callback does not block the audio thread. */ +class cubeb_async_logger { +public: + /* This is thread-safe since C++11 */ + static cubeb_async_logger & get() + { + static cubeb_async_logger instance; + return instance; + } + void push(char const str[CUBEB_LOG_MESSAGE_MAX_SIZE]) + { + cubeb_log_message msg(str); + msg_queue.enqueue(msg); + } + void run() + { + std::thread([this]() { + CUBEB_REGISTER_THREAD("cubeb_log"); + while (true) { + cubeb_log_message msg; + while (msg_queue.dequeue(&msg, 1)) { + cubeb_log_internal_no_format(msg.get()); + } +#ifdef _WIN32 + Sleep(CUBEB_LOG_BATCH_PRINT_INTERVAL_MS); +#else + timespec sleep_duration = sleep_for; + timespec remainder; + do { + if (nanosleep(&sleep_duration, &remainder) == 0 || errno != EINTR) { + break; + } + sleep_duration = remainder; + } while (remainder.tv_sec || remainder.tv_nsec); +#endif + } + CUBEB_UNREGISTER_THREAD(); + }).detach(); + } + // Tell the underlying queue the producer thread has changed, so it does not + // assert in debug. This should be called with the thread stopped. + void reset_producer_thread() { msg_queue.reset_thread_ids(); } + +private: +#ifndef _WIN32 + const struct timespec sleep_for = { + CUBEB_LOG_BATCH_PRINT_INTERVAL_MS / 1000, + (CUBEB_LOG_BATCH_PRINT_INTERVAL_MS % 1000) * 1000 * 1000}; +#endif + cubeb_async_logger() : msg_queue(CUBEB_LOG_MESSAGE_QUEUE_DEPTH) { run(); } + /** This is quite a big data structure, but is only instantiated if the + * asynchronous logger is used.*/ + lock_free_queue msg_queue; +}; + +void +cubeb_log_internal(char const * file, uint32_t line, char const * fmt, ...) +{ + va_list args; + va_start(args, fmt); + char msg[CUBEB_LOG_MESSAGE_MAX_SIZE]; + vsnprintf(msg, CUBEB_LOG_MESSAGE_MAX_SIZE, fmt, args); + g_cubeb_log_callback.load()("%s:%d:%s", file, line, msg); + va_end(args); +} + +void +cubeb_log_internal_no_format(const char * msg) +{ + g_cubeb_log_callback.load()(msg); +} + +void +cubeb_async_log(char const * fmt, ...) +{ + // This is going to copy a 256 bytes array around, which is fine. + // We don't want to allocate memory here, because this is made to + // be called from a real-time callback. + va_list args; + va_start(args, fmt); + char msg[CUBEB_LOG_MESSAGE_MAX_SIZE]; + vsnprintf(msg, CUBEB_LOG_MESSAGE_MAX_SIZE, fmt, args); + cubeb_async_logger::get().push(msg); + va_end(args); +} + +void +cubeb_async_log_reset_threads(void) +{ + if (!g_cubeb_log_callback) { + return; + } + cubeb_async_logger::get().reset_producer_thread(); +} + +void +cubeb_log_set(cubeb_log_level log_level, cubeb_log_callback log_callback) +{ + g_cubeb_log_level = log_level; + g_cubeb_log_callback = log_callback; +} + +cubeb_log_level +cubeb_log_get_level() +{ + return g_cubeb_log_level; +} + +cubeb_log_callback +cubeb_log_get_callback() +{ + return g_cubeb_log_callback; +} diff --git a/3rdparty/cubeb/src/cubeb_log.h b/3rdparty/cubeb/src/cubeb_log.h new file mode 100644 index 0000000000..93ab560566 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_log.h @@ -0,0 +1,74 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#ifndef CUBEB_LOG +#define CUBEB_LOG + +#include "cubeb/cubeb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__GNUC__) || defined(__clang__) +#define PRINTF_FORMAT(fmt, args) __attribute__((format(printf, fmt, args))) +#if defined(__FILE_NAME__) +#define __FILENAME__ __FILE_NAME__ +#else +#define __FILENAME__ \ + (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 \ + : __FILE__) +#endif +#else +#define PRINTF_FORMAT(fmt, args) +#include +#define __FILENAME__ \ + (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#endif + +void +cubeb_log_set(cubeb_log_level log_level, cubeb_log_callback log_callback); +cubeb_log_level +cubeb_log_get_level(); +cubeb_log_callback +cubeb_log_get_callback(); +void +cubeb_log_internal_no_format(const char * msg); +void +cubeb_log_internal(const char * filename, uint32_t line, const char * fmt, ...); +void +cubeb_async_log(const char * fmt, ...); +void +cubeb_async_log_reset_threads(void); + +#ifdef __cplusplus +} +#endif + +#define LOGV(msg, ...) LOG_INTERNAL(CUBEB_LOG_VERBOSE, msg, ##__VA_ARGS__) +#define LOG(msg, ...) LOG_INTERNAL(CUBEB_LOG_NORMAL, msg, ##__VA_ARGS__) + +#define LOG_INTERNAL(level, fmt, ...) \ + do { \ + if (cubeb_log_get_level() >= level && cubeb_log_get_callback()) { \ + cubeb_log_internal(__FILENAME__, __LINE__, fmt, ##__VA_ARGS__); \ + } \ + } while (0) + +#define ALOG_INTERNAL(level, fmt, ...) \ + do { \ + if (cubeb_log_get_level() >= level && cubeb_log_get_callback()) { \ + cubeb_async_log(fmt, ##__VA_ARGS__); \ + } \ + } while (0) + +/* Asynchronous logging macros to log in real-time callbacks. */ +/* Should not be used on android due to the use of global/static variables. */ +#define ALOGV(msg, ...) ALOG_INTERNAL(CUBEB_LOG_VERBOSE, msg, ##__VA_ARGS__) +#define ALOG(msg, ...) ALOG_INTERNAL(CUBEB_LOG_NORMAL, msg, ##__VA_ARGS__) + +#endif // CUBEB_LOG diff --git a/3rdparty/cubeb/src/cubeb_mixer.cpp b/3rdparty/cubeb/src/cubeb_mixer.cpp new file mode 100644 index 0000000000..74bab71399 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_mixer.cpp @@ -0,0 +1,621 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + * + * Adapted from code based on libswresample's rematrix.c + */ + +#define NOMINMAX + +#include "cubeb_mixer.h" +#include "cubeb-internal.h" +#include "cubeb_utils.h" +#include +#include +#include +#include +#include +#include +#include + +#ifndef FF_ARRAY_ELEMS +#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) +#endif + +#define CHANNELS_MAX 32 +#define FRONT_LEFT 0 +#define FRONT_RIGHT 1 +#define FRONT_CENTER 2 +#define LOW_FREQUENCY 3 +#define BACK_LEFT 4 +#define BACK_RIGHT 5 +#define FRONT_LEFT_OF_CENTER 6 +#define FRONT_RIGHT_OF_CENTER 7 +#define BACK_CENTER 8 +#define SIDE_LEFT 9 +#define SIDE_RIGHT 10 +#define TOP_CENTER 11 +#define TOP_FRONT_LEFT 12 +#define TOP_FRONT_CENTER 13 +#define TOP_FRONT_RIGHT 14 +#define TOP_BACK_LEFT 15 +#define TOP_BACK_CENTER 16 +#define TOP_BACK_RIGHT 17 +#define NUM_NAMED_CHANNELS 18 + +#ifndef M_SQRT1_2 +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#endif +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#endif +#define SQRT3_2 1.22474487139158904909 /* sqrt(3/2) */ + +#define C30DB M_SQRT2 +#define C15DB 1.189207115 +#define C__0DB 1.0 +#define C_15DB 0.840896415 +#define C_30DB M_SQRT1_2 +#define C_45DB 0.594603558 +#define C_60DB 0.5 + +static cubeb_channel_layout +cubeb_channel_layout_check(cubeb_channel_layout l, uint32_t c) +{ + if (l == CUBEB_LAYOUT_UNDEFINED) { + switch (c) { + case 1: + return CUBEB_LAYOUT_MONO; + case 2: + return CUBEB_LAYOUT_STEREO; + } + } + return l; +} + +unsigned int +cubeb_channel_layout_nb_channels(cubeb_channel_layout x) +{ +#if __GNUC__ || __clang__ + return __builtin_popcount(x); +#else + x -= (x >> 1) & 0x55555555; + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + x += x >> 8; + return (x + (x >> 16)) & 0x3F; +#endif +} + +struct MixerContext { + MixerContext(cubeb_sample_format f, uint32_t in_channels, + cubeb_channel_layout in, uint32_t out_channels, + cubeb_channel_layout out) + : _format(f), _in_ch_layout(cubeb_channel_layout_check(in, in_channels)), + _out_ch_layout(cubeb_channel_layout_check(out, out_channels)), + _in_ch_count(in_channels), _out_ch_count(out_channels) + { + if (in_channels != cubeb_channel_layout_nb_channels(in) || + out_channels != cubeb_channel_layout_nb_channels(out)) { + // Mismatch between channels and layout, aborting. + return; + } + _valid = init() >= 0; + } + + static bool even(cubeb_channel_layout layout) + { + if (!layout) { + return true; + } + if (layout & (layout - 1)) { + return true; + } + return false; + } + + // Ensure that the layout is sane (that is have symmetrical left/right + // channels), if not, layout will be treated as mono. + static cubeb_channel_layout clean_layout(cubeb_channel_layout layout) + { + if (layout && layout != CHANNEL_FRONT_LEFT && !(layout & (layout - 1))) { + LOG("Treating layout as mono"); + return CHANNEL_FRONT_CENTER; + } + + return layout; + } + + static bool sane_layout(cubeb_channel_layout layout) + { + if (!(layout & CUBEB_LAYOUT_3F)) { // at least 1 front speaker + return false; + } + if (!even(layout & (CHANNEL_FRONT_LEFT | + CHANNEL_FRONT_RIGHT))) { // no asymetric front + return false; + } + if (!even(layout & + (CHANNEL_SIDE_LEFT | CHANNEL_SIDE_RIGHT))) { // no asymetric side + return false; + } + if (!even(layout & (CHANNEL_BACK_LEFT | CHANNEL_BACK_RIGHT))) { + return false; + } + if (!even(layout & + (CHANNEL_FRONT_LEFT_OF_CENTER | CHANNEL_FRONT_RIGHT_OF_CENTER))) { + return false; + } + if (cubeb_channel_layout_nb_channels(layout) >= CHANNELS_MAX) { + return false; + } + return true; + } + + int auto_matrix(); + int init(); + + const cubeb_sample_format _format; + const cubeb_channel_layout _in_ch_layout; ///< input channel layout + const cubeb_channel_layout _out_ch_layout; ///< output channel layout + const uint32_t _in_ch_count; ///< input channel count + const uint32_t _out_ch_count; ///< output channel count + const float _surround_mix_level = C_30DB; ///< surround mixing level + const float _center_mix_level = C_30DB; ///< center mixing level + const float _lfe_mix_level = 1; ///< LFE mixing level + double _matrix[CHANNELS_MAX][CHANNELS_MAX] = { + {0}}; ///< floating point rematrixing coefficients + float _matrix_flt[CHANNELS_MAX][CHANNELS_MAX] = { + {0}}; ///< single precision floating point rematrixing coefficients + int32_t _matrix32[CHANNELS_MAX][CHANNELS_MAX] = { + {0}}; ///< 17.15 fixed point rematrixing coefficients + uint8_t _matrix_ch[CHANNELS_MAX][CHANNELS_MAX + 1] = { + {0}}; ///< Lists of input channels per output channel that have non zero + ///< rematrixing coefficients + bool _clipping = false; ///< Set to true if clipping detection is required + bool _valid = false; ///< Set to true if context is valid. +}; + +int +MixerContext::auto_matrix() +{ + double matrix[NUM_NAMED_CHANNELS][NUM_NAMED_CHANNELS] = {{0}}; + double maxcoef = 0; + float maxval; + + cubeb_channel_layout in_ch_layout = clean_layout(_in_ch_layout); + cubeb_channel_layout out_ch_layout = clean_layout(_out_ch_layout); + + if (!sane_layout(in_ch_layout)) { + // Channel Not Supported + LOG("Input Layout %x is not supported", _in_ch_layout); + return -1; + } + + if (!sane_layout(out_ch_layout)) { + LOG("Output Layout %x is not supported", _out_ch_layout); + return -1; + } + + for (uint32_t i = 0; i < FF_ARRAY_ELEMS(matrix); i++) { + if (in_ch_layout & out_ch_layout & (1U << i)) { + matrix[i][i] = 1.0; + } + } + + cubeb_channel_layout unaccounted = in_ch_layout & ~out_ch_layout; + + // Rematrixing is done via a matrix of coefficient that should be applied to + // all channels. Channels are treated as pair and must be symmetrical (if a + // left channel exists, the corresponding right should exist too) unless the + // output layout has similar layout. Channels are then mixed toward the front + // center or back center if they exist with a slight bias toward the front. + + if (unaccounted & CHANNEL_FRONT_CENTER) { + if ((out_ch_layout & CUBEB_LAYOUT_STEREO) == CUBEB_LAYOUT_STEREO) { + if (in_ch_layout & CUBEB_LAYOUT_STEREO) { + matrix[FRONT_LEFT][FRONT_CENTER] += _center_mix_level; + matrix[FRONT_RIGHT][FRONT_CENTER] += _center_mix_level; + } else { + matrix[FRONT_LEFT][FRONT_CENTER] += M_SQRT1_2; + matrix[FRONT_RIGHT][FRONT_CENTER] += M_SQRT1_2; + } + } + } + if (unaccounted & CUBEB_LAYOUT_STEREO) { + if (out_ch_layout & CHANNEL_FRONT_CENTER) { + matrix[FRONT_CENTER][FRONT_LEFT] += M_SQRT1_2; + matrix[FRONT_CENTER][FRONT_RIGHT] += M_SQRT1_2; + if (in_ch_layout & CHANNEL_FRONT_CENTER) + matrix[FRONT_CENTER][FRONT_CENTER] = _center_mix_level * M_SQRT2; + } + } + + if (unaccounted & CHANNEL_BACK_CENTER) { + if (out_ch_layout & CHANNEL_BACK_LEFT) { + matrix[BACK_LEFT][BACK_CENTER] += M_SQRT1_2; + matrix[BACK_RIGHT][BACK_CENTER] += M_SQRT1_2; + } else if (out_ch_layout & CHANNEL_SIDE_LEFT) { + matrix[SIDE_LEFT][BACK_CENTER] += M_SQRT1_2; + matrix[SIDE_RIGHT][BACK_CENTER] += M_SQRT1_2; + } else if (out_ch_layout & CHANNEL_FRONT_LEFT) { + matrix[FRONT_LEFT][BACK_CENTER] += _surround_mix_level * M_SQRT1_2; + matrix[FRONT_RIGHT][BACK_CENTER] += _surround_mix_level * M_SQRT1_2; + } else if (out_ch_layout & CHANNEL_FRONT_CENTER) { + matrix[FRONT_CENTER][BACK_CENTER] += _surround_mix_level * M_SQRT1_2; + } + } + if (unaccounted & CHANNEL_BACK_LEFT) { + if (out_ch_layout & CHANNEL_BACK_CENTER) { + matrix[BACK_CENTER][BACK_LEFT] += M_SQRT1_2; + matrix[BACK_CENTER][BACK_RIGHT] += M_SQRT1_2; + } else if (out_ch_layout & CHANNEL_SIDE_LEFT) { + if (in_ch_layout & CHANNEL_SIDE_LEFT) { + matrix[SIDE_LEFT][BACK_LEFT] += M_SQRT1_2; + matrix[SIDE_RIGHT][BACK_RIGHT] += M_SQRT1_2; + } else { + matrix[SIDE_LEFT][BACK_LEFT] += 1.0; + matrix[SIDE_RIGHT][BACK_RIGHT] += 1.0; + } + } else if (out_ch_layout & CHANNEL_FRONT_LEFT) { + matrix[FRONT_LEFT][BACK_LEFT] += _surround_mix_level; + matrix[FRONT_RIGHT][BACK_RIGHT] += _surround_mix_level; + } else if (out_ch_layout & CHANNEL_FRONT_CENTER) { + matrix[FRONT_CENTER][BACK_LEFT] += _surround_mix_level * M_SQRT1_2; + matrix[FRONT_CENTER][BACK_RIGHT] += _surround_mix_level * M_SQRT1_2; + } + } + + if (unaccounted & CHANNEL_SIDE_LEFT) { + if (out_ch_layout & CHANNEL_BACK_LEFT) { + /* if back channels do not exist in the input, just copy side + channels to back channels, otherwise mix side into back */ + if (in_ch_layout & CHANNEL_BACK_LEFT) { + matrix[BACK_LEFT][SIDE_LEFT] += M_SQRT1_2; + matrix[BACK_RIGHT][SIDE_RIGHT] += M_SQRT1_2; + } else { + matrix[BACK_LEFT][SIDE_LEFT] += 1.0; + matrix[BACK_RIGHT][SIDE_RIGHT] += 1.0; + } + } else if (out_ch_layout & CHANNEL_BACK_CENTER) { + matrix[BACK_CENTER][SIDE_LEFT] += M_SQRT1_2; + matrix[BACK_CENTER][SIDE_RIGHT] += M_SQRT1_2; + } else if (out_ch_layout & CHANNEL_FRONT_LEFT) { + matrix[FRONT_LEFT][SIDE_LEFT] += _surround_mix_level; + matrix[FRONT_RIGHT][SIDE_RIGHT] += _surround_mix_level; + } else if (out_ch_layout & CHANNEL_FRONT_CENTER) { + matrix[FRONT_CENTER][SIDE_LEFT] += _surround_mix_level * M_SQRT1_2; + matrix[FRONT_CENTER][SIDE_RIGHT] += _surround_mix_level * M_SQRT1_2; + } + } + + if (unaccounted & CHANNEL_FRONT_LEFT_OF_CENTER) { + if (out_ch_layout & CHANNEL_FRONT_LEFT) { + matrix[FRONT_LEFT][FRONT_LEFT_OF_CENTER] += 1.0; + matrix[FRONT_RIGHT][FRONT_RIGHT_OF_CENTER] += 1.0; + } else if (out_ch_layout & CHANNEL_FRONT_CENTER) { + matrix[FRONT_CENTER][FRONT_LEFT_OF_CENTER] += M_SQRT1_2; + matrix[FRONT_CENTER][FRONT_RIGHT_OF_CENTER] += M_SQRT1_2; + } + } + /* mix LFE into front left/right or center */ + if (unaccounted & CHANNEL_LOW_FREQUENCY) { + if (out_ch_layout & CHANNEL_FRONT_CENTER) { + matrix[FRONT_CENTER][LOW_FREQUENCY] += _lfe_mix_level; + } else if (out_ch_layout & CHANNEL_FRONT_LEFT) { + matrix[FRONT_LEFT][LOW_FREQUENCY] += _lfe_mix_level * M_SQRT1_2; + matrix[FRONT_RIGHT][LOW_FREQUENCY] += _lfe_mix_level * M_SQRT1_2; + } + } + + // Normalize the conversion matrix. + for (uint32_t out_i = 0, i = 0; i < CHANNELS_MAX; i++) { + double sum = 0; + int in_i = 0; + if ((out_ch_layout & (1U << i)) == 0) { + continue; + } + for (uint32_t j = 0; j < CHANNELS_MAX; j++) { + if ((in_ch_layout & (1U << j)) == 0) { + continue; + } + if (i < FF_ARRAY_ELEMS(matrix) && j < FF_ARRAY_ELEMS(matrix[0])) { + _matrix[out_i][in_i] = matrix[i][j]; + } else { + _matrix[out_i][in_i] = + i == j && (in_ch_layout & out_ch_layout & (1U << i)); + } + sum += fabs(_matrix[out_i][in_i]); + in_i++; + } + maxcoef = std::max(maxcoef, sum); + out_i++; + } + + if (_format == CUBEB_SAMPLE_S16NE) { + maxval = 1.0; + } else { + maxval = INT_MAX; + } + + // Normalize matrix if needed. + if (maxcoef > maxval) { + maxcoef /= maxval; + for (uint32_t i = 0; i < CHANNELS_MAX; i++) + for (uint32_t j = 0; j < CHANNELS_MAX; j++) { + _matrix[i][j] /= maxcoef; + } + } + + if (_format == CUBEB_SAMPLE_FLOAT32NE) { + for (uint32_t i = 0; i < FF_ARRAY_ELEMS(_matrix); i++) { + for (uint32_t j = 0; j < FF_ARRAY_ELEMS(_matrix[0]); j++) { + _matrix_flt[i][j] = _matrix[i][j]; + } + } + } + + return 0; +} + +int +MixerContext::init() +{ + int r = auto_matrix(); + if (r) { + return r; + } + + // Determine if matrix operation would overflow + if (_format == CUBEB_SAMPLE_S16NE) { + int maxsum = 0; + for (uint32_t i = 0; i < _out_ch_count; i++) { + double rem = 0; + int sum = 0; + + for (uint32_t j = 0; j < _in_ch_count; j++) { + double target = _matrix[i][j] * 32768 + rem; + int value = lrintf(target); + rem += target - value; + sum += std::abs(value); + } + maxsum = std::max(maxsum, sum); + } + if (maxsum > 32768) { + _clipping = true; + } + } + + // FIXME quantize for integers + for (uint32_t i = 0; i < CHANNELS_MAX; i++) { + int ch_in = 0; + for (uint32_t j = 0; j < CHANNELS_MAX; j++) { + _matrix32[i][j] = lrintf(_matrix[i][j] * 32768); + if (_matrix[i][j]) { + _matrix_ch[i][++ch_in] = j; + } + } + _matrix_ch[i][0] = ch_in; + } + + return 0; +} + +template +void +sum2(TYPE_SAMPLE * out, uint32_t stride_out, const TYPE_SAMPLE * in1, + const TYPE_SAMPLE * in2, uint32_t stride_in, TYPE_COEFF coeff1, + TYPE_COEFF coeff2, F && operand, uint32_t frames) +{ + static_assert( + std::is_same::value, + "function must return the same type as used by coeff1 and coeff2"); + for (uint32_t i = 0; i < frames; i++) { + *out = operand(coeff1 * *in1 + coeff2 * *in2); + out += stride_out; + in1 += stride_in; + in2 += stride_in; + } +} + +template +void +copy(TYPE_SAMPLE * out, uint32_t stride_out, const TYPE_SAMPLE * in, + uint32_t stride_in, TYPE_COEFF coeff, F && operand, uint32_t frames) +{ + static_assert(std::is_same::value, + "function must return the same type as used by coeff"); + for (uint32_t i = 0; i < frames; i++) { + *out = operand(coeff * *in); + out += stride_out; + in += stride_in; + } +} + +template +static int +rematrix(const MixerContext * s, TYPE * aOut, const TYPE * aIn, + const TYPE_COEFF (&matrix_coeff)[COLS][COLS], F && aF, uint32_t frames) +{ + static_assert( + std::is_same::value, + "function must return the same type as used by matrix_coeff"); + + for (uint32_t out_i = 0; out_i < s->_out_ch_count; out_i++) { + TYPE * out = aOut + out_i; + switch (s->_matrix_ch[out_i][0]) { + case 0: + for (uint32_t i = 0; i < frames; i++) { + out[i * s->_out_ch_count] = 0; + } + break; + case 1: { + int in_i = s->_matrix_ch[out_i][1]; + copy(out, s->_out_ch_count, aIn + in_i, s->_in_ch_count, + matrix_coeff[out_i][in_i], aF, frames); + } break; + case 2: + sum2(out, s->_out_ch_count, aIn + s->_matrix_ch[out_i][1], + aIn + s->_matrix_ch[out_i][2], s->_in_ch_count, + matrix_coeff[out_i][s->_matrix_ch[out_i][1]], + matrix_coeff[out_i][s->_matrix_ch[out_i][2]], aF, frames); + break; + default: + for (uint32_t i = 0; i < frames; i++) { + TYPE_COEFF v = 0; + for (uint32_t j = 0; j < s->_matrix_ch[out_i][0]; j++) { + uint32_t in_i = s->_matrix_ch[out_i][1 + j]; + v += *(aIn + in_i + i * s->_in_ch_count) * matrix_coeff[out_i][in_i]; + } + out[i * s->_out_ch_count] = aF(v); + } + break; + } + } + return 0; +} + +struct cubeb_mixer { + cubeb_mixer(cubeb_sample_format format, uint32_t in_channels, + cubeb_channel_layout in_layout, uint32_t out_channels, + cubeb_channel_layout out_layout) + : _context(format, in_channels, in_layout, out_channels, out_layout) + { + } + + template + void copy_and_trunc(size_t frames, const T * input_buffer, + T * output_buffer) const + { + if (_context._in_ch_count <= _context._out_ch_count) { + // Not enough channels to copy, fill the gaps with silence. + if (_context._in_ch_count == 1 && _context._out_ch_count >= 2) { + // Special case for upmixing mono input to stereo and more. We will + // duplicate the mono channel to the first two channels. On most system, + // the first two channels are for left and right. It is commonly + // expected that mono will on both left+right channels + for (uint32_t i = 0; i < frames; i++) { + output_buffer[0] = output_buffer[1] = *input_buffer; + PodZero(output_buffer + 2, _context._out_ch_count - 2); + output_buffer += _context._out_ch_count; + input_buffer++; + } + return; + } + for (uint32_t i = 0; i < frames; i++) { + PodCopy(output_buffer, input_buffer, _context._in_ch_count); + output_buffer += _context._in_ch_count; + input_buffer += _context._in_ch_count; + PodZero(output_buffer, _context._out_ch_count - _context._in_ch_count); + output_buffer += _context._out_ch_count - _context._in_ch_count; + } + } else { + for (uint32_t i = 0; i < frames; i++) { + PodCopy(output_buffer, input_buffer, _context._out_ch_count); + output_buffer += _context._out_ch_count; + input_buffer += _context._in_ch_count; + } + } + } + + int mix(size_t frames, const void * input_buffer, size_t input_buffer_size, + void * output_buffer, size_t output_buffer_size) const + { + if (frames <= 0 || _context._out_ch_count == 0) { + return 0; + } + + // Check if output buffer is of sufficient size. + size_t size_read_needed = + frames * _context._in_ch_count * cubeb_sample_size(_context._format); + if (input_buffer_size < size_read_needed) { + // We don't have enough data to read! + return -1; + } + if (output_buffer_size * _context._in_ch_count < + size_read_needed * _context._out_ch_count) { + return -1; + } + + if (!valid()) { + // The channel layouts were invalid or unsupported, instead we will simply + // either drop the extra channels, or fill with silence the missing ones + if (_context._format == CUBEB_SAMPLE_FLOAT32NE) { + copy_and_trunc(frames, static_cast(input_buffer), + static_cast(output_buffer)); + } else { + assert(_context._format == CUBEB_SAMPLE_S16NE); + copy_and_trunc(frames, static_cast(input_buffer), + reinterpret_cast(output_buffer)); + } + return 0; + } + + switch (_context._format) { + case CUBEB_SAMPLE_FLOAT32NE: { + auto f = [](float x) { return x; }; + return rematrix(&_context, static_cast(output_buffer), + static_cast(input_buffer), + _context._matrix_flt, f, frames); + } + case CUBEB_SAMPLE_S16NE: + if (_context._clipping) { + auto f = [](int x) { + int y = (x + 16384) >> 15; + // clip the signed integer value into the -32768,32767 range. + if ((y + 0x8000U) & ~0xFFFF) { + return (y >> 31) ^ 0x7FFF; + } + return y; + }; + return rematrix(&_context, static_cast(output_buffer), + static_cast(input_buffer), + _context._matrix32, f, frames); + } else { + auto f = [](int x) { return (x + 16384) >> 15; }; + return rematrix(&_context, static_cast(output_buffer), + static_cast(input_buffer), + _context._matrix32, f, frames); + } + break; + default: + assert(false); + break; + } + + return -1; + } + + // Return false if any of the input or ouput layout were invalid. + bool valid() const { return _context._valid; } + + virtual ~cubeb_mixer(){}; + + MixerContext _context; +}; + +cubeb_mixer * +cubeb_mixer_create(cubeb_sample_format format, uint32_t in_channels, + cubeb_channel_layout in_layout, uint32_t out_channels, + cubeb_channel_layout out_layout) +{ + return new cubeb_mixer(format, in_channels, in_layout, out_channels, + out_layout); +} + +void +cubeb_mixer_destroy(cubeb_mixer * mixer) +{ + delete mixer; +} + +int +cubeb_mixer_mix(cubeb_mixer * mixer, size_t frames, const void * input_buffer, + size_t input_buffer_size, void * output_buffer, + size_t output_buffer_size) +{ + return mixer->mix(frames, input_buffer, input_buffer_size, output_buffer, + output_buffer_size); +} diff --git a/3rdparty/cubeb/src/cubeb_mixer.h b/3rdparty/cubeb/src/cubeb_mixer.h new file mode 100644 index 0000000000..1859dab467 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_mixer.h @@ -0,0 +1,36 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#ifndef CUBEB_MIXER +#define CUBEB_MIXER + +#include "cubeb/cubeb.h" // for cubeb_channel_layout and cubeb_stream_params. + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef struct cubeb_mixer cubeb_mixer; +cubeb_mixer * +cubeb_mixer_create(cubeb_sample_format format, uint32_t in_channels, + cubeb_channel_layout in_layout, uint32_t out_channels, + cubeb_channel_layout out_layout); +void +cubeb_mixer_destroy(cubeb_mixer * mixer); +int +cubeb_mixer_mix(cubeb_mixer * mixer, size_t frames, const void * input_buffer, + size_t input_buffer_size, void * output_buffer, + size_t output_buffer_size); + +unsigned int +cubeb_channel_layout_nb_channels(cubeb_channel_layout channel_layout); + +#if defined(__cplusplus) +} +#endif + +#endif // CUBEB_MIXER diff --git a/3rdparty/cubeb/src/cubeb_opensl.c b/3rdparty/cubeb/src/cubeb_opensl.c new file mode 100644 index 0000000000..efac34d24e --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_opensl.c @@ -0,0 +1,1797 @@ +/* + * Copyright © 2012 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#undef NDEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__ANDROID__) +#include "android/sles_definitions.h" +#include +#include +#include +#include +#include +#endif +#include "android/cubeb-output-latency.h" +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_android.h" +#include "cubeb_array_queue.h" +#include "cubeb_resampler.h" + +#if defined(__ANDROID__) +#ifdef LOG +#undef LOG +#endif +//#define LOGGING_ENABLED +#ifdef LOGGING_ENABLED +#define LOG(args...) \ + __android_log_print(ANDROID_LOG_INFO, "Cubeb_OpenSL", ##args) +#else +#define LOG(...) +#endif + +//#define TIMESTAMP_ENABLED +#ifdef TIMESTAMP_ENABLED +#define FILENAME \ + (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#define LOG_TS(args...) \ + __android_log_print(ANDROID_LOG_INFO, "Cubeb_OpenSL ES: Timestamp(usec)", \ + ##args) +#define TIMESTAMP(msg) \ + do { \ + struct timeval timestamp; \ + int ts_ret = gettimeofday(×tamp, NULL); \ + if (ts_ret == 0) { \ + LOG_TS("%lld: %s (%s %s:%d)", \ + timestamp.tv_sec * 1000000LL + timestamp.tv_usec, msg, \ + __FUNCTION__, FILENAME, __LINE__); \ + } else { \ + LOG_TS("Error: %s (%s %s:%d) - %s", msg, __FUNCTION__, FILENAME, \ + __LINE__); \ + } \ + } while (0) +#else +#define TIMESTAMP(...) +#endif + +#define ANDROID_VERSION_GINGERBREAD_MR1 10 +#define ANDROID_VERSION_JELLY_BEAN 18 +#define ANDROID_VERSION_LOLLIPOP 21 +#define ANDROID_VERSION_MARSHMALLOW 23 +#define ANDROID_VERSION_N_MR1 25 +#endif + +#define DEFAULT_SAMPLE_RATE 48000 +#define DEFAULT_NUM_OF_FRAMES 480 + +static struct cubeb_ops const opensl_ops; + +struct cubeb { + struct cubeb_ops const * ops; + void * lib; + SLInterfaceID SL_IID_BUFFERQUEUE; + SLInterfaceID SL_IID_PLAY; +#if defined(__ANDROID__) + SLInterfaceID SL_IID_ANDROIDCONFIGURATION; + SLInterfaceID SL_IID_ANDROIDSIMPLEBUFFERQUEUE; +#endif + SLInterfaceID SL_IID_VOLUME; + SLInterfaceID SL_IID_RECORD; + SLObjectItf engObj; + SLEngineItf eng; + SLObjectItf outmixObj; + output_latency_function * p_output_latency_function; +}; + +#define NELEMS(A) (sizeof(A) / sizeof A[0]) +#define NBUFS 2 + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context; + void * user_ptr; + /**/ + pthread_mutex_t mutex; + SLObjectItf playerObj; + SLPlayItf play; + SLBufferQueueItf bufq; + SLVolumeItf volume; + void ** queuebuf; + uint32_t queuebuf_capacity; + int queuebuf_idx; + long queuebuf_len; + long bytespersec; + long framesize; + /* Total number of played frames. + * Synchronized by stream::mutex lock. */ + long written; + /* Flag indicating draining. Synchronized + * by stream::mutex lock. */ + int draining; + /* Flags to determine in/out.*/ + uint32_t input_enabled; + uint32_t output_enabled; + /* Recorder abstract object. */ + SLObjectItf recorderObj; + /* Recorder Itf for input capture. */ + SLRecordItf recorderItf; + /* Buffer queue for input capture. */ + SLAndroidSimpleBufferQueueItf recorderBufferQueueItf; + /* Store input buffers. */ + void ** input_buffer_array; + /* The capacity of the array. + * On capture only can be small (4). + * On full duplex is calculated to + * store 1 sec of data buffers. */ + uint32_t input_array_capacity; + /* Current filled index of input buffer array. + * It is initiated to -1 indicating buffering + * have not started yet. */ + int input_buffer_index; + /* Length of input buffer.*/ + uint32_t input_buffer_length; + /* Input frame size */ + uint32_t input_frame_size; + /* Device sampling rate. If user rate is not + * accepted an compatible rate is set. If it is + * accepted this is equal to params.rate. */ + uint32_t input_device_rate; + /* Exchange input buffers between input + * and full duplex threads. */ + array_queue * input_queue; + /* Silent input buffer used on full duplex. */ + void * input_silent_buffer; + /* Number of input frames from the start of the stream*/ + uint32_t input_total_frames; + /* Flag to stop the execution of user callback and + * close all working threads. Synchronized by + * stream::mutex lock. */ + uint32_t shutdown; + /* Store user callback. */ + cubeb_data_callback data_callback; + /* Store state callback. */ + cubeb_state_callback state_callback; + + cubeb_resampler * resampler; + unsigned int user_output_rate; + unsigned int output_configured_rate; + unsigned int buffer_size_frames; + // Audio output latency used in cubeb_stream_get_position(). + unsigned int output_latency_ms; + int64_t lastPosition; + int64_t lastPositionTimeStamp; + int64_t lastCompensativePosition; + int voice_input; + int voice_output; +}; + +/* Forward declaration. */ +static int +opensl_stop_player(cubeb_stream * stm); +static int +opensl_stop_recorder(cubeb_stream * stm); + +static int +opensl_get_draining(cubeb_stream * stm) +{ +#ifdef DEBUG + int r = pthread_mutex_trylock(&stm->mutex); + assert((r == EDEADLK || r == EBUSY) && + "get_draining: mutex should be locked but it's not."); +#endif + return stm->draining; +} + +static void +opensl_set_draining(cubeb_stream * stm, int value) +{ +#ifdef DEBUG + int r = pthread_mutex_trylock(&stm->mutex); + LOG("set draining try r = %d", r); + assert((r == EDEADLK || r == EBUSY) && + "set_draining: mutex should be locked but it's not."); +#endif + assert(value == 0 || value == 1); + stm->draining = value; +} + +static void +opensl_notify_drained(cubeb_stream * stm) +{ + assert(stm); + int r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + int draining = opensl_get_draining(stm); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + if (draining) { + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + if (stm->play) { + LOG("stop player in play_callback"); + r = opensl_stop_player(stm); + assert(r == CUBEB_OK); + } + if (stm->recorderItf) { + r = opensl_stop_recorder(stm); + assert(r == CUBEB_OK); + } + } +} + +static uint32_t +opensl_get_shutdown(cubeb_stream * stm) +{ +#ifdef DEBUG + int r = pthread_mutex_trylock(&stm->mutex); + assert((r == EDEADLK || r == EBUSY) && + "get_shutdown: mutex should be locked but it's not."); +#endif + return stm->shutdown; +} + +static void +opensl_set_shutdown(cubeb_stream * stm, uint32_t value) +{ +#ifdef DEBUG + int r = pthread_mutex_trylock(&stm->mutex); + LOG("set shutdown try r = %d", r); + assert((r == EDEADLK || r == EBUSY) && + "set_shutdown: mutex should be locked but it's not."); +#endif + assert(value == 0 || value == 1); + stm->shutdown = value; +} + +static void +play_callback(SLPlayItf caller, void * user_ptr, SLuint32 event) +{ + cubeb_stream * stm = user_ptr; + assert(stm); + switch (event) { + case SL_PLAYEVENT_HEADATMARKER: + opensl_notify_drained(stm); + break; + default: + break; + } +} + +static void +recorder_marker_callback(SLRecordItf caller, void * pContext, SLuint32 event) +{ + cubeb_stream * stm = pContext; + assert(stm); + + if (event == SL_RECORDEVENT_HEADATMARKER) { + int r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + int draining = opensl_get_draining(stm); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + if (draining) { + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + if (stm->recorderItf) { + r = opensl_stop_recorder(stm); + assert(r == CUBEB_OK); + } + if (stm->play) { + r = opensl_stop_player(stm); + assert(r == CUBEB_OK); + } + } + } +} + +static void +bufferqueue_callback(SLBufferQueueItf caller, void * user_ptr) +{ + cubeb_stream * stm = user_ptr; + assert(stm); + SLBufferQueueState state; + SLresult res; + long written = 0; + + res = (*stm->bufq)->GetState(stm->bufq, &state); + assert(res == SL_RESULT_SUCCESS); + + if (state.count > 1) { + return; + } + + uint8_t * buf = stm->queuebuf[stm->queuebuf_idx]; + written = 0; + int r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + int draining = opensl_get_draining(stm); + uint32_t shutdown = opensl_get_shutdown(stm); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + if (!draining && !shutdown) { + written = cubeb_resampler_fill(stm->resampler, NULL, NULL, buf, + stm->queuebuf_len / stm->framesize); + LOG("bufferqueue_callback: resampler fill returned %ld frames", written); + if (written < 0 || written * stm->framesize > stm->queuebuf_len) { + r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + opensl_set_shutdown(stm, 1); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + opensl_stop_player(stm); + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + return; + } + } + + // Keep sending silent data even in draining mode to prevent the audio + // back-end from being stopped automatically by OpenSL/ES. + assert(stm->queuebuf_len >= written * stm->framesize); + memset(buf + written * stm->framesize, 0, + stm->queuebuf_len - written * stm->framesize); + res = (*stm->bufq)->Enqueue(stm->bufq, buf, stm->queuebuf_len); + assert(res == SL_RESULT_SUCCESS); + stm->queuebuf_idx = (stm->queuebuf_idx + 1) % stm->queuebuf_capacity; + + if (written > 0) { + pthread_mutex_lock(&stm->mutex); + stm->written += written; + pthread_mutex_unlock(&stm->mutex); + } + + if (!draining && written * stm->framesize < stm->queuebuf_len) { + LOG("bufferqueue_callback draining"); + r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + int64_t written_duration = + INT64_C(1000) * stm->written * stm->framesize / stm->bytespersec; + opensl_set_draining(stm, 1); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + + if (written_duration == 0) { + // since we didn't write any sample, it's not possible to reach the marker + // time and trigger the callback. We should initiative notify drained. + opensl_notify_drained(stm); + } else { + // Use SL_PLAYEVENT_HEADATMARKER event from slPlayCallback of SLPlayItf + // to make sure all the data has been processed. + (*stm->play) + ->SetMarkerPosition(stm->play, (SLmillisecond)written_duration); + } + return; + } +} + +static int +opensl_enqueue_recorder(cubeb_stream * stm, void ** last_filled_buffer) +{ + assert(stm); + + int current_index = stm->input_buffer_index; + void * last_buffer = NULL; + + if (current_index < 0) { + // This is the first enqueue + current_index = 0; + } else { + // The current index hold the last filled buffer get it before advance + // index. + last_buffer = stm->input_buffer_array[current_index]; + // Advance to get next available buffer + current_index = (current_index + 1) % stm->input_array_capacity; + } + // enqueue next empty buffer to be filled by the recorder + SLresult res = (*stm->recorderBufferQueueItf) + ->Enqueue(stm->recorderBufferQueueItf, + stm->input_buffer_array[current_index], + stm->input_buffer_length); + if (res != SL_RESULT_SUCCESS) { + LOG("Enqueue recorder failed. Error code: %lu", res); + return CUBEB_ERROR; + } + // All good, update buffer and index. + stm->input_buffer_index = current_index; + if (last_filled_buffer) { + *last_filled_buffer = last_buffer; + } + return CUBEB_OK; +} + +// input data callback +void +recorder_callback(SLAndroidSimpleBufferQueueItf bq, void * context) +{ + assert(context); + cubeb_stream * stm = context; + assert(stm->recorderBufferQueueItf); + + int r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + uint32_t shutdown = opensl_get_shutdown(stm); + int draining = opensl_get_draining(stm); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + + if (shutdown || draining) { + // According to the OpenSL ES 1.1 Specification, 8.14 SLBufferQueueItf + // page 184, on transition to the SL_RECORDSTATE_STOPPED state, + // the application should continue to enqueue buffers onto the queue + // to retrieve the residual recorded data in the system. + r = opensl_enqueue_recorder(stm, NULL); + assert(r == CUBEB_OK); + return; + } + + // Enqueue next available buffer and get the last filled buffer. + void * input_buffer = NULL; + r = opensl_enqueue_recorder(stm, &input_buffer); + assert(r == CUBEB_OK); + assert(input_buffer); + // Fill resampler with last input + long input_frame_count = stm->input_buffer_length / stm->input_frame_size; + long got = cubeb_resampler_fill(stm->resampler, input_buffer, + &input_frame_count, NULL, 0); + // Error case + if (got < 0 || got > input_frame_count) { + r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + opensl_set_shutdown(stm, 1); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + r = opensl_stop_recorder(stm); + assert(r == CUBEB_OK); + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + } + + // Advance total stream frames + stm->input_total_frames += got; + + if (got < input_frame_count) { + r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + opensl_set_draining(stm, 1); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + int64_t duration = + INT64_C(1000) * stm->input_total_frames / stm->input_device_rate; + (*stm->recorderItf) + ->SetMarkerPosition(stm->recorderItf, (SLmillisecond)duration); + return; + } +} + +void +recorder_fullduplex_callback(SLAndroidSimpleBufferQueueItf bq, void * context) +{ + assert(context); + cubeb_stream * stm = context; + assert(stm->recorderBufferQueueItf); + + int r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + int draining = opensl_get_draining(stm); + uint32_t shutdown = opensl_get_shutdown(stm); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + + if (shutdown || draining) { + /* On draining and shutdown the recorder should have been stoped from + * the one set the flags. Accordint to the doc, on transition to + * the SL_RECORDSTATE_STOPPED state, the application should + * continue to enqueue buffers onto the queue to retrieve the residual + * recorded data in the system. */ + LOG("Input shutdown %d or drain %d", shutdown, draining); + int r = opensl_enqueue_recorder(stm, NULL); + assert(r == CUBEB_OK); + return; + } + + // Enqueue next available buffer and get the last filled buffer. + void * input_buffer = NULL; + r = opensl_enqueue_recorder(stm, &input_buffer); + assert(r == CUBEB_OK); + assert(input_buffer); + + assert(stm->input_queue); + r = array_queue_push(stm->input_queue, input_buffer); + if (r == -1) { + LOG("Input queue is full, drop input ..."); + return; + } + + LOG("Input pushed in the queue, input array %zu", + array_queue_get_size(stm->input_queue)); +} + +static void +player_fullduplex_callback(SLBufferQueueItf caller, void * user_ptr) +{ + TIMESTAMP("ENTER"); + cubeb_stream * stm = user_ptr; + assert(stm); + SLresult res; + + int r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + int draining = opensl_get_draining(stm); + uint32_t shutdown = opensl_get_shutdown(stm); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + + // Get output + void * output_buffer = NULL; + r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + output_buffer = stm->queuebuf[stm->queuebuf_idx]; + // Advance the output buffer queue index + stm->queuebuf_idx = (stm->queuebuf_idx + 1) % stm->queuebuf_capacity; + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + + if (shutdown || draining) { + LOG("Shutdown/draining, send silent"); + // Set silent on buffer + memset(output_buffer, 0, stm->queuebuf_len); + + // Enqueue data in player buffer queue + res = (*stm->bufq)->Enqueue(stm->bufq, output_buffer, stm->queuebuf_len); + assert(res == SL_RESULT_SUCCESS); + return; + } + + // Get input. + void * input_buffer = array_queue_pop(stm->input_queue); + long input_frame_count = stm->input_buffer_length / stm->input_frame_size; + long frames_needed = stm->queuebuf_len / stm->framesize; + if (!input_buffer) { + LOG("Input hole set silent input buffer"); + input_buffer = stm->input_silent_buffer; + } + + long written = 0; + // Trigger user callback through resampler + written = + cubeb_resampler_fill(stm->resampler, input_buffer, &input_frame_count, + output_buffer, frames_needed); + + LOG("Fill: written %ld, frames_needed %ld, input array size %zu", written, + frames_needed, array_queue_get_size(stm->input_queue)); + + if (written < 0 || written > frames_needed) { + // Error case + r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + opensl_set_shutdown(stm, 1); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + opensl_stop_player(stm); + opensl_stop_recorder(stm); + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + memset(output_buffer, 0, stm->queuebuf_len); + + // Enqueue data in player buffer queue + res = (*stm->bufq)->Enqueue(stm->bufq, output_buffer, stm->queuebuf_len); + assert(res == SL_RESULT_SUCCESS); + return; + } + + // Advance total out written frames counter + r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + stm->written += written; + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + + if (written < frames_needed) { + r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + int64_t written_duration = + INT64_C(1000) * stm->written * stm->framesize / stm->bytespersec; + opensl_set_draining(stm, 1); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + + // Use SL_PLAYEVENT_HEADATMARKER event from slPlayCallback of SLPlayItf + // to make sure all the data has been processed. + (*stm->play)->SetMarkerPosition(stm->play, (SLmillisecond)written_duration); + } + + // Keep sending silent data even in draining mode to prevent the audio + // back-end from being stopped automatically by OpenSL/ES. + memset((uint8_t *)output_buffer + written * stm->framesize, 0, + stm->queuebuf_len - written * stm->framesize); + + // Enqueue data in player buffer queue + res = (*stm->bufq)->Enqueue(stm->bufq, output_buffer, stm->queuebuf_len); + assert(res == SL_RESULT_SUCCESS); + TIMESTAMP("EXIT"); +} + +static void +opensl_destroy(cubeb * ctx); + +#if defined(__ANDROID__) +#if (__ANDROID_API__ >= ANDROID_VERSION_LOLLIPOP) +typedef int(system_property_get)(const char *, char *); + +static int +wrap_system_property_get(const char * name, char * value) +{ + void * libc = dlopen("libc.so", RTLD_LAZY); + if (!libc) { + LOG("Failed to open libc.so"); + return -1; + } + system_property_get * func = + (system_property_get *)dlsym(libc, "__system_property_get"); + int ret = -1; + if (func) { + ret = func(name, value); + } + dlclose(libc); + return ret; +} +#endif + +static int +get_android_version(void) +{ + char version_string[PROP_VALUE_MAX]; + + memset(version_string, 0, PROP_VALUE_MAX); + +#if (__ANDROID_API__ >= ANDROID_VERSION_LOLLIPOP) + int len = wrap_system_property_get("ro.build.version.sdk", version_string); +#else + int len = __system_property_get("ro.build.version.sdk", version_string); +#endif + if (len <= 0) { + LOG("Failed to get Android version!\n"); + return len; + } + + int version = (int)strtol(version_string, NULL, 10); + LOG("Android version %d", version); + return version; +} +#endif + +/*static*/ int +opensl_init(cubeb ** context, char const * context_name) +{ + cubeb * ctx; + +#if defined(__ANDROID__) + int android_version = get_android_version(); + if (android_version > 0 && + android_version <= ANDROID_VERSION_GINGERBREAD_MR1) { + // Don't even attempt to run on Gingerbread and lower + return CUBEB_ERROR; + } +#endif + + *context = NULL; + + ctx = calloc(1, sizeof(*ctx)); + assert(ctx); + + ctx->ops = &opensl_ops; + + ctx->lib = dlopen("libOpenSLES.so", RTLD_LAZY); + if (!ctx->lib) { + free(ctx); + return CUBEB_ERROR; + } + + typedef SLresult (*slCreateEngine_t)( + SLObjectItf *, SLuint32, const SLEngineOption *, SLuint32, + const SLInterfaceID *, const SLboolean *); + slCreateEngine_t f_slCreateEngine = + (slCreateEngine_t)dlsym(ctx->lib, "slCreateEngine"); + SLInterfaceID SL_IID_ENGINE = + *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_ENGINE"); + SLInterfaceID SL_IID_OUTPUTMIX = + *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_OUTPUTMIX"); + ctx->SL_IID_VOLUME = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_VOLUME"); + ctx->SL_IID_BUFFERQUEUE = + *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_BUFFERQUEUE"); +#if defined(__ANDROID__) + ctx->SL_IID_ANDROIDCONFIGURATION = + *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_ANDROIDCONFIGURATION"); + ctx->SL_IID_ANDROIDSIMPLEBUFFERQUEUE = + *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_ANDROIDSIMPLEBUFFERQUEUE"); +#endif + ctx->SL_IID_PLAY = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_PLAY"); + ctx->SL_IID_RECORD = *(SLInterfaceID *)dlsym(ctx->lib, "SL_IID_RECORD"); + + if (!f_slCreateEngine || !SL_IID_ENGINE || !SL_IID_OUTPUTMIX || + !ctx->SL_IID_BUFFERQUEUE || +#if defined(__ANDROID__) + !ctx->SL_IID_ANDROIDCONFIGURATION || + !ctx->SL_IID_ANDROIDSIMPLEBUFFERQUEUE || +#endif + !ctx->SL_IID_PLAY || !ctx->SL_IID_RECORD) { + opensl_destroy(ctx); + return CUBEB_ERROR; + } + + const SLEngineOption opt[] = {{SL_ENGINEOPTION_THREADSAFE, SL_BOOLEAN_TRUE}}; + + SLresult res; + res = f_slCreateEngine(&ctx->engObj, 1, opt, 0, NULL, NULL); + + if (res != SL_RESULT_SUCCESS) { + opensl_destroy(ctx); + return CUBEB_ERROR; + } + + res = (*ctx->engObj)->Realize(ctx->engObj, SL_BOOLEAN_FALSE); + if (res != SL_RESULT_SUCCESS) { + opensl_destroy(ctx); + return CUBEB_ERROR; + } + + res = (*ctx->engObj)->GetInterface(ctx->engObj, SL_IID_ENGINE, &ctx->eng); + if (res != SL_RESULT_SUCCESS) { + opensl_destroy(ctx); + return CUBEB_ERROR; + } + + const SLInterfaceID idsom[] = {SL_IID_OUTPUTMIX}; + const SLboolean reqom[] = {SL_BOOLEAN_TRUE}; + res = + (*ctx->eng)->CreateOutputMix(ctx->eng, &ctx->outmixObj, 1, idsom, reqom); + if (res != SL_RESULT_SUCCESS) { + opensl_destroy(ctx); + return CUBEB_ERROR; + } + + res = (*ctx->outmixObj)->Realize(ctx->outmixObj, SL_BOOLEAN_FALSE); + if (res != SL_RESULT_SUCCESS) { + opensl_destroy(ctx); + return CUBEB_ERROR; + } + + ctx->p_output_latency_function = + cubeb_output_latency_load_method(android_version); + if (!cubeb_output_latency_method_is_loaded(ctx->p_output_latency_function)) { + LOG("Warning: output latency is not available, cubeb_stream_get_position() " + "is not supported"); + } + + *context = ctx; + + LOG("Cubeb init (%p) success", ctx); + return CUBEB_OK; +} + +static char const * +opensl_get_backend_id(cubeb * ctx) +{ + return "opensl"; +} + +static int +opensl_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + assert(ctx && max_channels); + /* The android mixer handles up to two channels, see + http://androidxref.com/4.2.2_r1/xref/frameworks/av/services/audioflinger/AudioFlinger.h#67 + */ + *max_channels = 2; + + return CUBEB_OK; +} + +static void +opensl_destroy(cubeb * ctx) +{ + if (ctx->outmixObj) { + (*ctx->outmixObj)->Destroy(ctx->outmixObj); + } + if (ctx->engObj) { + (*ctx->engObj)->Destroy(ctx->engObj); + } + dlclose(ctx->lib); + if (ctx->p_output_latency_function) + cubeb_output_latency_unload_method(ctx->p_output_latency_function); + free(ctx); +} + +static void +opensl_stream_destroy(cubeb_stream * stm); + +#if defined(__ANDROID__) && (__ANDROID_API__ >= ANDROID_VERSION_LOLLIPOP) +static int +opensl_set_format_ext(SLAndroidDataFormat_PCM_EX * format, + cubeb_stream_params * params) +{ + assert(format); + assert(params); + + format->formatType = SL_ANDROID_DATAFORMAT_PCM_EX; + format->numChannels = params->channels; + // sampleRate is in milliHertz + format->sampleRate = params->rate * 1000; + format->channelMask = params->channels == 1 + ? SL_SPEAKER_FRONT_CENTER + : SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; + + switch (params->format) { + case CUBEB_SAMPLE_S16LE: + format->bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; + format->containerSize = SL_PCMSAMPLEFORMAT_FIXED_16; + format->representation = SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT; + format->endianness = SL_BYTEORDER_LITTLEENDIAN; + break; + case CUBEB_SAMPLE_S16BE: + format->bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; + format->containerSize = SL_PCMSAMPLEFORMAT_FIXED_16; + format->representation = SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT; + format->endianness = SL_BYTEORDER_BIGENDIAN; + break; + case CUBEB_SAMPLE_FLOAT32LE: + format->bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_32; + format->containerSize = SL_PCMSAMPLEFORMAT_FIXED_32; + format->representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT; + format->endianness = SL_BYTEORDER_LITTLEENDIAN; + break; + case CUBEB_SAMPLE_FLOAT32BE: + format->bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_32; + format->containerSize = SL_PCMSAMPLEFORMAT_FIXED_32; + format->representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT; + format->endianness = SL_BYTEORDER_BIGENDIAN; + break; + default: + return CUBEB_ERROR_INVALID_FORMAT; + } + return CUBEB_OK; +} +#endif + +static int +opensl_set_format(SLDataFormat_PCM * format, cubeb_stream_params * params) +{ + assert(format); + assert(params); + + format->formatType = SL_DATAFORMAT_PCM; + format->numChannels = params->channels; + // samplesPerSec is in milliHertz + format->samplesPerSec = params->rate * 1000; + format->bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; + format->containerSize = SL_PCMSAMPLEFORMAT_FIXED_16; + format->channelMask = params->channels == 1 + ? SL_SPEAKER_FRONT_CENTER + : SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; + + switch (params->format) { + case CUBEB_SAMPLE_S16LE: + format->endianness = SL_BYTEORDER_LITTLEENDIAN; + break; + case CUBEB_SAMPLE_S16BE: + format->endianness = SL_BYTEORDER_BIGENDIAN; + break; + default: + return CUBEB_ERROR_INVALID_FORMAT; + } + return CUBEB_OK; +} + +static int +opensl_configure_capture(cubeb_stream * stm, cubeb_stream_params * params) +{ + assert(stm); + assert(params); + + SLDataLocator_AndroidSimpleBufferQueue lDataLocatorOut; + lDataLocatorOut.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; + lDataLocatorOut.numBuffers = NBUFS; + + SLDataFormat_PCM lDataFormat; + int r = opensl_set_format(&lDataFormat, params); + if (r != CUBEB_OK) { + return CUBEB_ERROR_INVALID_FORMAT; + } + + /* For now set device rate to params rate. */ + stm->input_device_rate = params->rate; + + SLDataSink lDataSink; + lDataSink.pLocator = &lDataLocatorOut; + lDataSink.pFormat = &lDataFormat; + + SLDataLocator_IODevice lDataLocatorIn; + lDataLocatorIn.locatorType = SL_DATALOCATOR_IODEVICE; + lDataLocatorIn.deviceType = SL_IODEVICE_AUDIOINPUT; + lDataLocatorIn.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT; + lDataLocatorIn.device = NULL; + + SLDataSource lDataSource; + lDataSource.pLocator = &lDataLocatorIn; + lDataSource.pFormat = NULL; + + const SLInterfaceID lSoundRecorderIIDs[] = { + stm->context->SL_IID_RECORD, + stm->context->SL_IID_ANDROIDSIMPLEBUFFERQUEUE, + stm->context->SL_IID_ANDROIDCONFIGURATION}; + + const SLboolean lSoundRecorderReqs[] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, + SL_BOOLEAN_TRUE}; + // create the audio recorder abstract object + SLresult res = (*stm->context->eng) + ->CreateAudioRecorder( + stm->context->eng, &stm->recorderObj, &lDataSource, + &lDataSink, NELEMS(lSoundRecorderIIDs), + lSoundRecorderIIDs, lSoundRecorderReqs); + // Sample rate not supported. Try again with default sample rate! + if (res == SL_RESULT_CONTENT_UNSUPPORTED) { + if (stm->output_enabled && stm->output_configured_rate != 0) { + // Set the same with the player. Since there is no + // api for input device this is a safe choice. + stm->input_device_rate = stm->output_configured_rate; + } else { + // The output preferred rate is used for an input only scenario. + // The default rate expected to be supported from all android devices. + stm->input_device_rate = DEFAULT_SAMPLE_RATE; + } + lDataFormat.samplesPerSec = stm->input_device_rate * 1000; + res = (*stm->context->eng) + ->CreateAudioRecorder(stm->context->eng, &stm->recorderObj, + &lDataSource, &lDataSink, + NELEMS(lSoundRecorderIIDs), + lSoundRecorderIIDs, lSoundRecorderReqs); + + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to create recorder. Error code: %lu", res); + return CUBEB_ERROR; + } + } + + if (get_android_version() > ANDROID_VERSION_JELLY_BEAN) { + SLAndroidConfigurationItf recorderConfig; + res = (*stm->recorderObj) + ->GetInterface(stm->recorderObj, + stm->context->SL_IID_ANDROIDCONFIGURATION, + &recorderConfig); + + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to get the android configuration interface for recorder. " + "Error " + "code: %lu", + res); + return CUBEB_ERROR; + } + + // Voice recognition is the lowest latency, according to the docs. Camcorder + // uses a microphone that is in the same direction as the camera. + SLint32 streamType = stm->voice_input + ? SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION + : SL_ANDROID_RECORDING_PRESET_CAMCORDER; + + res = + (*recorderConfig) + ->SetConfiguration(recorderConfig, SL_ANDROID_KEY_RECORDING_PRESET, + &streamType, sizeof(SLint32)); + + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to set the android configuration to VOICE for the recorder. " + "Error code: %lu", + res); + return CUBEB_ERROR; + } + } + // realize the audio recorder + res = (*stm->recorderObj)->Realize(stm->recorderObj, SL_BOOLEAN_FALSE); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to realize recorder. Error code: %lu", res); + return CUBEB_ERROR; + } + // get the record interface + res = (*stm->recorderObj) + ->GetInterface(stm->recorderObj, stm->context->SL_IID_RECORD, + &stm->recorderItf); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to get recorder interface. Error code: %lu", res); + return CUBEB_ERROR; + } + + res = (*stm->recorderItf) + ->RegisterCallback(stm->recorderItf, recorder_marker_callback, stm); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to register recorder marker callback. Error code: %lu", res); + return CUBEB_ERROR; + } + + (*stm->recorderItf)->SetMarkerPosition(stm->recorderItf, (SLmillisecond)0); + + res = (*stm->recorderItf) + ->SetCallbackEventsMask(stm->recorderItf, + (SLuint32)SL_RECORDEVENT_HEADATMARKER); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to set headatmarker event mask. Error code: %lu", res); + return CUBEB_ERROR; + } + // get the simple android buffer queue interface + res = (*stm->recorderObj) + ->GetInterface(stm->recorderObj, + stm->context->SL_IID_ANDROIDSIMPLEBUFFERQUEUE, + &stm->recorderBufferQueueItf); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to get recorder (android) buffer queue interface. Error code: " + "%lu", + res); + return CUBEB_ERROR; + } + + // register callback on record (input) buffer queue + slAndroidSimpleBufferQueueCallback rec_callback = recorder_callback; + if (stm->output_enabled) { + // Register full duplex callback instead. + rec_callback = recorder_fullduplex_callback; + } + res = (*stm->recorderBufferQueueItf) + ->RegisterCallback(stm->recorderBufferQueueItf, rec_callback, stm); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to register recorder buffer queue callback. Error code: %lu", + res); + return CUBEB_ERROR; + } + + // Calculate length of input buffer according to requested latency + stm->input_frame_size = params->channels * sizeof(int16_t); + stm->input_buffer_length = (stm->input_frame_size * stm->buffer_size_frames); + + // Calculate the capacity of input array + stm->input_array_capacity = NBUFS; + if (stm->output_enabled) { + // Full duplex, update capacity to hold 1 sec of data + stm->input_array_capacity = + 1 * stm->input_device_rate / stm->input_buffer_length; + } + // Allocate input array + stm->input_buffer_array = + (void **)calloc(1, sizeof(void *) * stm->input_array_capacity); + // Buffering has not started yet. + stm->input_buffer_index = -1; + // Prepare input buffers + for (uint32_t i = 0; i < stm->input_array_capacity; ++i) { + stm->input_buffer_array[i] = calloc(1, stm->input_buffer_length); + } + + // On full duplex allocate input queue and silent buffer + if (stm->output_enabled) { + stm->input_queue = array_queue_create(stm->input_array_capacity); + assert(stm->input_queue); + stm->input_silent_buffer = calloc(1, stm->input_buffer_length); + assert(stm->input_silent_buffer); + } + + // Enqueue buffer to start rolling once recorder started + r = opensl_enqueue_recorder(stm, NULL); + if (r != CUBEB_OK) { + return r; + } + + LOG("Cubeb stream init recorder success"); + + return CUBEB_OK; +} + +static int +opensl_configure_playback(cubeb_stream * stm, cubeb_stream_params * params) +{ + assert(stm); + assert(params); + + stm->user_output_rate = params->rate; + if (params->format == CUBEB_SAMPLE_S16NE || + params->format == CUBEB_SAMPLE_S16BE) { + stm->framesize = params->channels * sizeof(int16_t); + } else if (params->format == CUBEB_SAMPLE_FLOAT32NE || + params->format == CUBEB_SAMPLE_FLOAT32BE) { + stm->framesize = params->channels * sizeof(float); + } + stm->lastPosition = -1; + stm->lastPositionTimeStamp = 0; + stm->lastCompensativePosition = -1; + + void * format = NULL; + SLuint32 * format_sample_rate = NULL; + +#if defined(__ANDROID__) && (__ANDROID_API__ >= ANDROID_VERSION_LOLLIPOP) + SLAndroidDataFormat_PCM_EX pcm_ext_format; + if (get_android_version() >= ANDROID_VERSION_LOLLIPOP) { + if (opensl_set_format_ext(&pcm_ext_format, params) != CUBEB_OK) { + return CUBEB_ERROR_INVALID_FORMAT; + } + format = &pcm_ext_format; + format_sample_rate = &pcm_ext_format.sampleRate; + } +#endif + + SLDataFormat_PCM pcm_format; + if (!format) { + if (opensl_set_format(&pcm_format, params) != CUBEB_OK) { + return CUBEB_ERROR_INVALID_FORMAT; + } + format = &pcm_format; + format_sample_rate = &pcm_format.samplesPerSec; + } + + SLDataLocator_BufferQueue loc_bufq; + loc_bufq.locatorType = SL_DATALOCATOR_BUFFERQUEUE; + loc_bufq.numBuffers = NBUFS; + SLDataSource source; + source.pLocator = &loc_bufq; + source.pFormat = format; + + SLDataLocator_OutputMix loc_outmix; + loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; + loc_outmix.outputMix = stm->context->outmixObj; + SLDataSink sink; + sink.pLocator = &loc_outmix; + sink.pFormat = NULL; + +#if defined(__ANDROID__) + const SLInterfaceID ids[] = {stm->context->SL_IID_BUFFERQUEUE, + stm->context->SL_IID_VOLUME, + stm->context->SL_IID_ANDROIDCONFIGURATION}; + const SLboolean req[] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE}; +#else + const SLInterfaceID ids[] = {ctx->SL_IID_BUFFERQUEUE, ctx->SL_IID_VOLUME}; + const SLboolean req[] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE}; +#endif + assert(NELEMS(ids) == NELEMS(req)); + + uint32_t preferred_sampling_rate = stm->user_output_rate; + SLresult res = SL_RESULT_CONTENT_UNSUPPORTED; + if (preferred_sampling_rate) { + res = (*stm->context->eng) + ->CreateAudioPlayer(stm->context->eng, &stm->playerObj, &source, + &sink, NELEMS(ids), ids, req); + } + + // Sample rate not supported? Try again with primary sample rate! + if (res == SL_RESULT_CONTENT_UNSUPPORTED && + preferred_sampling_rate != DEFAULT_SAMPLE_RATE) { + preferred_sampling_rate = DEFAULT_SAMPLE_RATE; + *format_sample_rate = preferred_sampling_rate * 1000; + res = (*stm->context->eng) + ->CreateAudioPlayer(stm->context->eng, &stm->playerObj, &source, + &sink, NELEMS(ids), ids, req); + } + + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to create audio player. Error code: %lu", res); + return CUBEB_ERROR; + } + + stm->output_configured_rate = preferred_sampling_rate; + stm->bytespersec = stm->output_configured_rate * stm->framesize; + stm->queuebuf_len = stm->framesize * stm->buffer_size_frames; + + // Calculate the capacity of input array + stm->queuebuf_capacity = NBUFS; + if (stm->output_enabled) { + // Full duplex, update capacity to hold 1 sec of data + stm->queuebuf_capacity = + 1 * stm->output_configured_rate / stm->queuebuf_len; + } + // Allocate input array + stm->queuebuf = (void **)calloc(1, sizeof(void *) * stm->queuebuf_capacity); + for (uint32_t i = 0; i < stm->queuebuf_capacity; ++i) { + stm->queuebuf[i] = calloc(1, stm->queuebuf_len); + assert(stm->queuebuf[i]); + } + + SLAndroidConfigurationItf playerConfig = NULL; + + if (get_android_version() >= ANDROID_VERSION_N_MR1) { + res = (*stm->playerObj) + ->GetInterface(stm->playerObj, + stm->context->SL_IID_ANDROIDCONFIGURATION, + &playerConfig); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to get Android configuration interface. Error code: %lu", + res); + return CUBEB_ERROR; + } + + SLint32 streamType = SL_ANDROID_STREAM_MEDIA; + if (stm->voice_output) { + streamType = SL_ANDROID_STREAM_VOICE; + } + res = (*playerConfig) + ->SetConfiguration(playerConfig, SL_ANDROID_KEY_STREAM_TYPE, + &streamType, sizeof(streamType)); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to set Android configuration to %d Error code: %lu", + streamType, res); + } + + SLuint32 performanceMode = SL_ANDROID_PERFORMANCE_LATENCY; + if (stm->buffer_size_frames > POWERSAVE_LATENCY_FRAMES_THRESHOLD) { + performanceMode = SL_ANDROID_PERFORMANCE_POWER_SAVING; + } + + res = (*playerConfig) + ->SetConfiguration(playerConfig, SL_ANDROID_KEY_PERFORMANCE_MODE, + &performanceMode, sizeof(performanceMode)); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to set Android performance mode to %d Error code: %lu. This " + "is" + " not fatal", + performanceMode, res); + } + } + + res = (*stm->playerObj)->Realize(stm->playerObj, SL_BOOLEAN_FALSE); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to realize player object. Error code: %lu", res); + return CUBEB_ERROR; + } + + // There are two ways of getting the audio output latency: + // - a configuration value, only available on some devices (notably devices + // running FireOS) + // - A Java method, that we call using JNI. + // + // The first method is prefered, if available, because it can account for more + // latency causes, and is more precise. + + // Latency has to be queried after the realization of the interface, when + // using SL_IID_ANDROIDCONFIGURATION. + SLuint32 audioLatency = 0; + SLuint32 paramSize = sizeof(SLuint32); + // The reported latency is in milliseconds. + if (playerConfig) { + res = (*playerConfig) + ->GetConfiguration(playerConfig, + (const SLchar *)"androidGetAudioLatency", + ¶mSize, &audioLatency); + if (res == SL_RESULT_SUCCESS) { + LOG("Got playback latency using android configuration extension"); + stm->output_latency_ms = audioLatency; + } + } + // `playerConfig` is available, but the above failed, or `playerConfig` is not + // available. In both cases, we need to acquire the output latency by an other + // mean. + if ((playerConfig && res != SL_RESULT_SUCCESS) || !playerConfig) { + if (cubeb_output_latency_method_is_loaded( + stm->context->p_output_latency_function)) { + LOG("Got playback latency using JNI"); + stm->output_latency_ms = + cubeb_get_output_latency(stm->context->p_output_latency_function); + } else { + LOG("No alternate latency querying method loaded, A/V sync will be off."); + stm->output_latency_ms = 0; + } + } + + LOG("Audio output latency: %dms", stm->output_latency_ms); + + res = + (*stm->playerObj) + ->GetInterface(stm->playerObj, stm->context->SL_IID_PLAY, &stm->play); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to get play interface. Error code: %lu", res); + return CUBEB_ERROR; + } + + res = (*stm->playerObj) + ->GetInterface(stm->playerObj, stm->context->SL_IID_BUFFERQUEUE, + &stm->bufq); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to get bufferqueue interface. Error code: %lu", res); + return CUBEB_ERROR; + } + + res = (*stm->playerObj) + ->GetInterface(stm->playerObj, stm->context->SL_IID_VOLUME, + &stm->volume); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to get volume interface. Error code: %lu", res); + return CUBEB_ERROR; + } + + res = (*stm->play)->RegisterCallback(stm->play, play_callback, stm); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to register play callback. Error code: %lu", res); + return CUBEB_ERROR; + } + + // Work around wilhelm/AudioTrack badness, bug 1221228 + (*stm->play)->SetMarkerPosition(stm->play, (SLmillisecond)0); + + res = (*stm->play) + ->SetCallbackEventsMask(stm->play, + (SLuint32)SL_PLAYEVENT_HEADATMARKER); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to set headatmarker event mask. Error code: %lu", res); + return CUBEB_ERROR; + } + + slBufferQueueCallback player_callback = bufferqueue_callback; + if (stm->input_enabled) { + player_callback = player_fullduplex_callback; + } + res = (*stm->bufq)->RegisterCallback(stm->bufq, player_callback, stm); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to register bufferqueue callback. Error code: %lu", res); + return CUBEB_ERROR; + } + + { + // Enqueue a silent frame so once the player becomes playing, the frame + // will be consumed and kick off the buffer queue callback. + // Note the duration of a single frame is less than 1ms. We don't bother + // adjusting the playback position. + uint8_t * buf = stm->queuebuf[stm->queuebuf_idx++]; + memset(buf, 0, stm->framesize); + res = (*stm->bufq)->Enqueue(stm->bufq, buf, stm->framesize); + assert(res == SL_RESULT_SUCCESS); + } + + LOG("Cubeb stream init playback success"); + return CUBEB_OK; +} + +static int +opensl_validate_stream_param(cubeb_stream_params * stream_params) +{ + if ((stream_params && + (stream_params->channels < 1 || stream_params->channels > 32))) { + return CUBEB_ERROR_INVALID_FORMAT; + } + if ((stream_params && (stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK))) { + LOG("Loopback is not supported"); + return CUBEB_ERROR_NOT_SUPPORTED; + } + return CUBEB_OK; +} + +int +has_pref_set(cubeb_stream_params * input_params, + cubeb_stream_params * output_params, cubeb_stream_prefs pref) +{ + return (input_params && input_params->prefs & pref) || + (output_params && output_params->prefs & pref); +} + +static int +opensl_stream_init(cubeb * ctx, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + cubeb_stream * stm; + + assert(ctx); + if (input_device || output_device) { + LOG("Device selection is not supported in Android. The default will be " + "used"); + } + + *stream = NULL; + + int r = opensl_validate_stream_param(output_stream_params); + if (r != CUBEB_OK) { + LOG("Output stream params not valid"); + return r; + } + r = opensl_validate_stream_param(input_stream_params); + if (r != CUBEB_OK) { + LOG("Input stream params not valid"); + return r; + } + + stm = calloc(1, sizeof(*stm)); + assert(stm); + + stm->context = ctx; + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->user_ptr = user_ptr; + stm->buffer_size_frames = + latency_frames ? latency_frames : DEFAULT_NUM_OF_FRAMES; + stm->input_enabled = (input_stream_params) ? 1 : 0; + stm->output_enabled = (output_stream_params) ? 1 : 0; + stm->shutdown = 1; + stm->voice_input = + has_pref_set(input_stream_params, NULL, CUBEB_STREAM_PREF_VOICE); + stm->voice_output = + has_pref_set(NULL, output_stream_params, CUBEB_STREAM_PREF_VOICE); + + LOG("cubeb stream prefs: voice_input: %s voice_output: %s", + stm->voice_input ? "true" : "false", + stm->voice_output ? "true" : "false"); + +#ifdef DEBUG + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); + r = pthread_mutex_init(&stm->mutex, &attr); +#else + r = pthread_mutex_init(&stm->mutex, NULL); +#endif + assert(r == 0); + + if (output_stream_params) { + LOG("Playback params: Rate %d, channels %d, format %d, latency in frames " + "%d.", + output_stream_params->rate, output_stream_params->channels, + output_stream_params->format, stm->buffer_size_frames); + r = opensl_configure_playback(stm, output_stream_params); + if (r != CUBEB_OK) { + opensl_stream_destroy(stm); + return r; + } + } + + if (input_stream_params) { + LOG("Capture params: Rate %d, channels %d, format %d, latency in frames " + "%d.", + input_stream_params->rate, input_stream_params->channels, + input_stream_params->format, stm->buffer_size_frames); + r = opensl_configure_capture(stm, input_stream_params); + if (r != CUBEB_OK) { + opensl_stream_destroy(stm); + return r; + } + } + + /* Configure resampler*/ + uint32_t target_sample_rate; + if (input_stream_params) { + target_sample_rate = input_stream_params->rate; + } else { + assert(output_stream_params); + target_sample_rate = output_stream_params->rate; + } + + // Use the actual configured rates for input + // and output. + cubeb_stream_params input_params; + if (input_stream_params) { + input_params = *input_stream_params; + input_params.rate = stm->input_device_rate; + } + cubeb_stream_params output_params; + if (output_stream_params) { + output_params = *output_stream_params; + output_params.rate = stm->output_configured_rate; + } + + stm->resampler = cubeb_resampler_create( + stm, input_stream_params ? &input_params : NULL, + output_stream_params ? &output_params : NULL, target_sample_rate, + data_callback, user_ptr, CUBEB_RESAMPLER_QUALITY_DEFAULT, + CUBEB_RESAMPLER_RECLOCK_NONE); + if (!stm->resampler) { + LOG("Failed to create resampler"); + opensl_stream_destroy(stm); + return CUBEB_ERROR; + } + + *stream = stm; + LOG("Cubeb stream (%p) init success", stm); + return CUBEB_OK; +} + +static int +opensl_start_player(cubeb_stream * stm) +{ + assert(stm->playerObj); + SLuint32 playerState; + (*stm->playerObj)->GetState(stm->playerObj, &playerState); + if (playerState == SL_OBJECT_STATE_REALIZED) { + SLresult res = (*stm->play)->SetPlayState(stm->play, SL_PLAYSTATE_PLAYING); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to start player. Error code: %lu", res); + return CUBEB_ERROR; + } + } + return CUBEB_OK; +} + +static int +opensl_start_recorder(cubeb_stream * stm) +{ + assert(stm->recorderObj); + SLuint32 recorderState; + (*stm->recorderObj)->GetState(stm->recorderObj, &recorderState); + if (recorderState == SL_OBJECT_STATE_REALIZED) { + SLresult res = + (*stm->recorderItf) + ->SetRecordState(stm->recorderItf, SL_RECORDSTATE_RECORDING); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to start recorder. Error code: %lu", res); + return CUBEB_ERROR; + } + } + return CUBEB_OK; +} + +static int +opensl_stream_start(cubeb_stream * stm) +{ + assert(stm); + + int r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + opensl_set_shutdown(stm, 0); + opensl_set_draining(stm, 0); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + + if (stm->playerObj) { + r = opensl_start_player(stm); + if (r != CUBEB_OK) { + return r; + } + } + + if (stm->recorderObj) { + int r = opensl_start_recorder(stm); + if (r != CUBEB_OK) { + return r; + } + } + + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STARTED); + LOG("Cubeb stream (%p) started", stm); + return CUBEB_OK; +} + +static int +opensl_stop_player(cubeb_stream * stm) +{ + assert(stm->playerObj); + assert(stm->shutdown || stm->draining); + + SLresult res = (*stm->play)->SetPlayState(stm->play, SL_PLAYSTATE_PAUSED); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to stop player. Error code: %lu", res); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +static int +opensl_stop_recorder(cubeb_stream * stm) +{ + assert(stm->recorderObj); + assert(stm->shutdown || stm->draining); + + SLresult res = (*stm->recorderItf) + ->SetRecordState(stm->recorderItf, SL_RECORDSTATE_PAUSED); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to stop recorder. Error code: %lu", res); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +static int +opensl_stream_stop(cubeb_stream * stm) +{ + assert(stm); + + int r = pthread_mutex_lock(&stm->mutex); + assert(r == 0); + opensl_set_shutdown(stm, 1); + r = pthread_mutex_unlock(&stm->mutex); + assert(r == 0); + + if (stm->playerObj) { + r = opensl_stop_player(stm); + if (r != CUBEB_OK) { + return r; + } + } + + if (stm->recorderObj) { + int r = opensl_stop_recorder(stm); + if (r != CUBEB_OK) { + return r; + } + } + + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STOPPED); + LOG("Cubeb stream (%p) stopped", stm); + return CUBEB_OK; +} + +static int +opensl_destroy_recorder(cubeb_stream * stm) +{ + assert(stm); + assert(stm->recorderObj); + + if (stm->recorderBufferQueueItf) { + SLresult res = + (*stm->recorderBufferQueueItf)->Clear(stm->recorderBufferQueueItf); + if (res != SL_RESULT_SUCCESS) { + LOG("Failed to clear recorder buffer queue. Error code: %lu", res); + return CUBEB_ERROR; + } + stm->recorderBufferQueueItf = NULL; + for (uint32_t i = 0; i < stm->input_array_capacity; ++i) { + free(stm->input_buffer_array[i]); + } + } + + (*stm->recorderObj)->Destroy(stm->recorderObj); + stm->recorderObj = NULL; + stm->recorderItf = NULL; + + if (stm->input_queue) { + array_queue_destroy(stm->input_queue); + } + free(stm->input_silent_buffer); + + return CUBEB_OK; +} + +static void +opensl_stream_destroy(cubeb_stream * stm) +{ + assert(stm->draining || stm->shutdown); + + if (stm->playerObj) { + (*stm->playerObj)->Destroy(stm->playerObj); + stm->playerObj = NULL; + stm->play = NULL; + stm->bufq = NULL; + for (uint32_t i = 0; i < stm->queuebuf_capacity; ++i) { + free(stm->queuebuf[i]); + } + } + + if (stm->recorderObj) { + int r = opensl_destroy_recorder(stm); + assert(r == CUBEB_OK); + } + + if (stm->resampler) { + cubeb_resampler_destroy(stm->resampler); + } + + pthread_mutex_destroy(&stm->mutex); + + LOG("Cubeb stream (%p) destroyed", stm); + free(stm); +} + +static int +opensl_stream_get_position(cubeb_stream * stm, uint64_t * position) +{ + SLmillisecond msec; + uint32_t compensation_msec = 0; + SLresult res; + + res = (*stm->play)->GetPosition(stm->play, &msec); + if (res != SL_RESULT_SUCCESS) + return CUBEB_ERROR; + + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + if (stm->lastPosition == msec) { + compensation_msec = + (t.tv_sec * 1000000000LL + t.tv_nsec - stm->lastPositionTimeStamp) / + 1000000; + } else { + stm->lastPositionTimeStamp = t.tv_sec * 1000000000LL + t.tv_nsec; + stm->lastPosition = msec; + } + + uint64_t samplerate = stm->user_output_rate; + uint32_t output_latency = stm->output_latency_ms; + + pthread_mutex_lock(&stm->mutex); + int64_t maximum_position = stm->written * (int64_t)stm->user_output_rate / + stm->output_configured_rate; + pthread_mutex_unlock(&stm->mutex); + assert(maximum_position >= 0); + + if (msec > output_latency) { + int64_t unadjusted_position; + if (stm->lastCompensativePosition > msec + compensation_msec) { + // Over compensation, use lastCompensativePosition. + unadjusted_position = + samplerate * (stm->lastCompensativePosition - output_latency) / 1000; + } else { + unadjusted_position = + samplerate * (msec - output_latency + compensation_msec) / 1000; + stm->lastCompensativePosition = msec + compensation_msec; + } + *position = unadjusted_position < maximum_position ? unadjusted_position + : maximum_position; + } else { + *position = 0; + } + return CUBEB_OK; +} + +static int +opensl_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +{ + assert(stm); + assert(latency); + + uint32_t stream_latency_frames = + stm->user_output_rate * stm->output_latency_ms / 1000; + + return stream_latency_frames + cubeb_resampler_latency(stm->resampler); +} + +int +opensl_stream_set_volume(cubeb_stream * stm, float volume) +{ + SLresult res; + SLmillibel max_level, millibels; + float unclamped_millibels; + + res = (*stm->volume)->GetMaxVolumeLevel(stm->volume, &max_level); + + if (res != SL_RESULT_SUCCESS) { + return CUBEB_ERROR; + } + + /* millibels are 100*dB, so the conversion from the volume's linear amplitude + * is 100 * 20 * log(volume). However we clamp the resulting value before + * passing it to lroundf() in order to prevent it from silently returning an + * erroneous value when the unclamped value exceeds the size of a long. */ + unclamped_millibels = 100.0f * 20.0f * log10f(fmaxf(volume, 0.0f)); + unclamped_millibels = fmaxf(unclamped_millibels, SL_MILLIBEL_MIN); + unclamped_millibels = fminf(unclamped_millibels, max_level); + + millibels = lroundf(unclamped_millibels); + + res = (*stm->volume)->SetVolumeLevel(stm->volume, millibels); + + if (res != SL_RESULT_SUCCESS) { + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +static struct cubeb_ops const opensl_ops = { + .init = opensl_init, + .get_backend_id = opensl_get_backend_id, + .get_max_channel_count = opensl_get_max_channel_count, + .get_min_latency = NULL, + .get_preferred_sample_rate = NULL, + .enumerate_devices = NULL, + .device_collection_destroy = NULL, + .destroy = opensl_destroy, + .stream_init = opensl_stream_init, + .stream_destroy = opensl_stream_destroy, + .stream_start = opensl_stream_start, + .stream_stop = opensl_stream_stop, + .stream_get_position = opensl_stream_get_position, + .stream_get_latency = opensl_stream_get_latency, + .stream_get_input_latency = NULL, + .stream_set_volume = opensl_stream_set_volume, + .stream_set_name = NULL, + .stream_get_current_device = NULL, + .stream_device_destroy = NULL, + .stream_register_device_changed_callback = NULL, + .register_device_collection_changed = NULL}; diff --git a/3rdparty/cubeb/src/cubeb_oss.c b/3rdparty/cubeb/src/cubeb_oss.c new file mode 100644 index 0000000000..8718fa3067 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_oss.c @@ -0,0 +1,1353 @@ +/* + * Copyright © 2019-2020 Nia Alarie + * Copyright © 2020 Ka Ho Ng + * Copyright © 2020 The FreeBSD Foundation + * + * Portions of this software were developed by Ka Ho Ng + * under sponsorship from the FreeBSD Foundation. + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_mixer.h" +#include "cubeb_strings.h" +#include "cubeb_tracing.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Supported well by most hardware. */ +#ifndef OSS_PREFER_RATE +#define OSS_PREFER_RATE (48000) +#endif + +/* Standard acceptable minimum. */ +#ifndef OSS_LATENCY_MS +#define OSS_LATENCY_MS (8) +#endif + +#ifndef OSS_NFRAGS +#define OSS_NFRAGS (4) +#endif + +#ifndef OSS_DEFAULT_DEVICE +#define OSS_DEFAULT_DEVICE "/dev/dsp" +#endif + +#ifndef OSS_DEFAULT_MIXER +#define OSS_DEFAULT_MIXER "/dev/mixer" +#endif + +#define ENV_AUDIO_DEVICE "AUDIO_DEVICE" + +#ifndef OSS_MAX_CHANNELS +#if defined(__FreeBSD__) || defined(__DragonFly__) +/* + * The current maximum number of channels supported + * on FreeBSD is 8. + * + * Reference: FreeBSD 12.1-RELEASE + */ +#define OSS_MAX_CHANNELS (8) +#elif defined(__sun__) +/* + * The current maximum number of channels supported + * on Illumos is 16. + * + * Reference: PSARC 2008/318 + */ +#define OSS_MAX_CHANNELS (16) +#else +#define OSS_MAX_CHANNELS (2) +#endif +#endif + +#if defined(__FreeBSD__) || defined(__DragonFly__) +#define SNDSTAT_BEGIN_STR "Installed devices:" +#define SNDSTAT_USER_BEGIN_STR "Installed devices from userspace:" +#define SNDSTAT_FV_BEGIN_STR "File Versions:" +#endif + +static struct cubeb_ops const oss_ops; + +struct cubeb { + struct cubeb_ops const * ops; + + /* Our intern string store */ + pthread_mutex_t mutex; /* protects devid_strs */ + cubeb_strings * devid_strs; +}; + +struct oss_stream { + oss_devnode_t name; + int fd; + void * buf; + unsigned int bufframes; + unsigned int maxframes; + + struct stream_info { + int channels; + int sample_rate; + int fmt; + int precision; + } info; + + unsigned int frame_size; /* precision in bytes * channels */ + bool floating; +}; + +struct cubeb_stream { + struct cubeb * context; + void * user_ptr; + pthread_t thread; + bool doorbell; /* (m) */ + pthread_cond_t doorbell_cv; /* (m) */ + pthread_cond_t stopped_cv; /* (m) */ + pthread_mutex_t mtx; /* Members protected by this should be marked (m) */ + bool thread_created; /* (m) */ + bool running; /* (m) */ + bool destroying; /* (m) */ + cubeb_state state; /* (m) */ + float volume /* (m) */; + struct oss_stream play; + struct oss_stream record; + cubeb_data_callback data_cb; + cubeb_state_callback state_cb; + uint64_t frames_written /* (m) */; +}; + +static char const * +oss_cubeb_devid_intern(cubeb * context, char const * devid) +{ + char const * is; + pthread_mutex_lock(&context->mutex); + is = cubeb_strings_intern(context->devid_strs, devid); + pthread_mutex_unlock(&context->mutex); + return is; +} + +int +oss_init(cubeb ** context, char const * context_name) +{ + cubeb * c; + + (void)context_name; + if ((c = calloc(1, sizeof(cubeb))) == NULL) { + return CUBEB_ERROR; + } + + if (cubeb_strings_init(&c->devid_strs) == CUBEB_ERROR) { + goto fail; + } + + if (pthread_mutex_init(&c->mutex, NULL) != 0) { + goto fail; + } + + c->ops = &oss_ops; + *context = c; + return CUBEB_OK; + +fail: + cubeb_strings_destroy(c->devid_strs); + free(c); + return CUBEB_ERROR; +} + +static void +oss_destroy(cubeb * context) +{ + pthread_mutex_destroy(&context->mutex); + cubeb_strings_destroy(context->devid_strs); + free(context); +} + +static char const * +oss_get_backend_id(cubeb * context) +{ + return "oss"; +} + +static int +oss_get_preferred_sample_rate(cubeb * context, uint32_t * rate) +{ + (void)context; + + *rate = OSS_PREFER_RATE; + return CUBEB_OK; +} + +static int +oss_get_max_channel_count(cubeb * context, uint32_t * max_channels) +{ + (void)context; + + *max_channels = OSS_MAX_CHANNELS; + return CUBEB_OK; +} + +static int +oss_get_min_latency(cubeb * context, cubeb_stream_params params, + uint32_t * latency_frames) +{ + (void)context; + + *latency_frames = (OSS_LATENCY_MS * params.rate) / 1000; + return CUBEB_OK; +} + +static void +oss_free_cubeb_device_info_strings(cubeb_device_info * cdi) +{ + free((char *)cdi->device_id); + free((char *)cdi->friendly_name); + free((char *)cdi->group_id); + cdi->device_id = NULL; + cdi->friendly_name = NULL; + cdi->group_id = NULL; +} + +#if defined(__FreeBSD__) || defined(__DragonFly__) +/* + * Check if the specified DSP is okay for the purpose specified + * in type. Here type can only specify one operation each time + * this helper is called. + * + * Return 0 if OK, otherwise 1. + */ +static int +oss_probe_open(const char * dsppath, cubeb_device_type type, int * fdp, + oss_audioinfo * resai) +{ + oss_audioinfo ai; + int error; + int oflags = (type == CUBEB_DEVICE_TYPE_INPUT) ? O_RDONLY : O_WRONLY; + int dspfd = open(dsppath, oflags); + if (dspfd == -1) + return 1; + + ai.dev = -1; + error = ioctl(dspfd, SNDCTL_AUDIOINFO, &ai); + if (error < 0) { + close(dspfd); + return 1; + } + + if (resai) + *resai = ai; + if (fdp) + *fdp = dspfd; + else + close(dspfd); + return 0; +} + +struct sndstat_info { + oss_devnode_t devname; + const char * desc; + cubeb_device_type type; + int preferred; +}; + +static int +oss_sndstat_line_parse(char * line, int is_ud, struct sndstat_info * sinfo) +{ + char *matchptr = line, *n = NULL; + struct sndstat_info res; + + memset(&res, 0, sizeof(res)); + + n = strchr(matchptr, ':'); + if (n == NULL) + goto fail; + if (is_ud == 0) { + unsigned int devunit; + + if (sscanf(matchptr, "pcm%u: ", &devunit) < 1) + goto fail; + + if (snprintf(res.devname, sizeof(res.devname), "/dev/dsp%u", devunit) < 1) + goto fail; + } else { + if (n - matchptr >= (ssize_t)(sizeof(res.devname) - strlen("/dev/"))) + goto fail; + + strlcpy(res.devname, "/dev/", sizeof(res.devname)); + strncat(res.devname, matchptr, n - matchptr); + } + matchptr = n + 1; + + n = strchr(matchptr, '<'); + if (n == NULL) + goto fail; + matchptr = n + 1; + n = strrchr(matchptr, '>'); + if (n == NULL) + goto fail; + *n = 0; + res.desc = matchptr; + matchptr = n + 1; + + n = strchr(matchptr, '('); + if (n == NULL) + goto fail; + matchptr = n + 1; + n = strrchr(matchptr, ')'); + if (n == NULL) + goto fail; + *n = 0; + if (!isdigit(matchptr[0])) { + if (strstr(matchptr, "play") != NULL) + res.type |= CUBEB_DEVICE_TYPE_OUTPUT; + if (strstr(matchptr, "rec") != NULL) + res.type |= CUBEB_DEVICE_TYPE_INPUT; + } else { + int p, r; + if (sscanf(matchptr, "%dp:%*dv/%dr:%*dv", &p, &r) != 2) + goto fail; + if (p > 0) + res.type |= CUBEB_DEVICE_TYPE_OUTPUT; + if (r > 0) + res.type |= CUBEB_DEVICE_TYPE_INPUT; + } + matchptr = n + 1; + if (strstr(matchptr, "default") != NULL) + res.preferred = 1; + + *sinfo = res; + return 0; + +fail: + return 1; +} + +/* + * XXX: On FreeBSD we have to rely on SNDCTL_CARDINFO to get all + * the usable audio devices currently, as SNDCTL_AUDIOINFO will + * never return directly usable audio device nodes. + */ +static int +oss_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection) +{ + cubeb_device_info * devinfop = NULL; + char * line = NULL; + size_t linecap = 0; + FILE * sndstatfp = NULL; + int collection_cnt = 0; + int is_ud = 0; + int skipall = 0; + + devinfop = calloc(1, sizeof(cubeb_device_info)); + if (devinfop == NULL) + goto fail; + + sndstatfp = fopen("/dev/sndstat", "r"); + if (sndstatfp == NULL) + goto fail; + while (getline(&line, &linecap, sndstatfp) > 0) { + const char * devid = NULL; + struct sndstat_info sinfo; + oss_audioinfo ai; + + if (!strncmp(line, SNDSTAT_FV_BEGIN_STR, strlen(SNDSTAT_FV_BEGIN_STR))) { + skipall = 1; + continue; + } + if (!strncmp(line, SNDSTAT_BEGIN_STR, strlen(SNDSTAT_BEGIN_STR))) { + is_ud = 0; + skipall = 0; + continue; + } + if (!strncmp(line, SNDSTAT_USER_BEGIN_STR, + strlen(SNDSTAT_USER_BEGIN_STR))) { + is_ud = 1; + skipall = 0; + continue; + } + if (skipall || isblank(line[0])) + continue; + + if (oss_sndstat_line_parse(line, is_ud, &sinfo)) + continue; + + devinfop[collection_cnt].type = 0; + switch (sinfo.type) { + case CUBEB_DEVICE_TYPE_INPUT: + if (type & CUBEB_DEVICE_TYPE_OUTPUT) + continue; + break; + case CUBEB_DEVICE_TYPE_OUTPUT: + if (type & CUBEB_DEVICE_TYPE_INPUT) + continue; + break; + case 0: + continue; + } + + if (oss_probe_open(sinfo.devname, type, NULL, &ai)) + continue; + + devid = oss_cubeb_devid_intern(context, sinfo.devname); + if (devid == NULL) + continue; + + devinfop[collection_cnt].device_id = strdup(sinfo.devname); + asprintf((char **)&devinfop[collection_cnt].friendly_name, "%s: %s", + sinfo.devname, sinfo.desc); + devinfop[collection_cnt].group_id = strdup(sinfo.devname); + devinfop[collection_cnt].vendor_name = NULL; + if (devinfop[collection_cnt].device_id == NULL || + devinfop[collection_cnt].friendly_name == NULL || + devinfop[collection_cnt].group_id == NULL) { + oss_free_cubeb_device_info_strings(&devinfop[collection_cnt]); + continue; + } + + devinfop[collection_cnt].type = type; + devinfop[collection_cnt].devid = devid; + devinfop[collection_cnt].state = CUBEB_DEVICE_STATE_ENABLED; + devinfop[collection_cnt].preferred = + (sinfo.preferred) ? CUBEB_DEVICE_PREF_ALL : CUBEB_DEVICE_PREF_NONE; + devinfop[collection_cnt].format = CUBEB_DEVICE_FMT_S16NE; + devinfop[collection_cnt].default_format = CUBEB_DEVICE_FMT_S16NE; + devinfop[collection_cnt].max_channels = ai.max_channels; + devinfop[collection_cnt].default_rate = OSS_PREFER_RATE; + devinfop[collection_cnt].max_rate = ai.max_rate; + devinfop[collection_cnt].min_rate = ai.min_rate; + devinfop[collection_cnt].latency_lo = 0; + devinfop[collection_cnt].latency_hi = 0; + + collection_cnt++; + + void * newp = + reallocarray(devinfop, collection_cnt + 1, sizeof(cubeb_device_info)); + if (newp == NULL) + goto fail; + devinfop = newp; + } + + free(line); + fclose(sndstatfp); + + collection->count = collection_cnt; + collection->device = devinfop; + + return CUBEB_OK; + +fail: + free(line); + if (sndstatfp) + fclose(sndstatfp); + free(devinfop); + return CUBEB_ERROR; +} + +#else + +static int +oss_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection) +{ + oss_sysinfo si; + int error, i; + cubeb_device_info * devinfop = NULL; + int collection_cnt = 0; + int mixer_fd = -1; + + mixer_fd = open(OSS_DEFAULT_MIXER, O_RDWR); + if (mixer_fd == -1) { + LOG("Failed to open mixer %s. errno: %d", OSS_DEFAULT_MIXER, errno); + return CUBEB_ERROR; + } + + error = ioctl(mixer_fd, SNDCTL_SYSINFO, &si); + if (error) { + LOG("Failed to run SNDCTL_SYSINFO on mixer %s. errno: %d", + OSS_DEFAULT_MIXER, errno); + goto fail; + } + + devinfop = calloc(si.numaudios, sizeof(cubeb_device_info)); + if (devinfop == NULL) + goto fail; + + collection->count = 0; + for (i = 0; i < si.numaudios; i++) { + oss_audioinfo ai; + cubeb_device_info cdi = {0}; + const char * devid = NULL; + + ai.dev = i; + error = ioctl(mixer_fd, SNDCTL_AUDIOINFO, &ai); + if (error) + goto fail; + + assert(ai.dev < si.numaudios); + if (!ai.enabled) + continue; + + cdi.type = 0; + switch (ai.caps & DSP_CAP_DUPLEX) { + case DSP_CAP_INPUT: + if (type & CUBEB_DEVICE_TYPE_OUTPUT) + continue; + break; + case DSP_CAP_OUTPUT: + if (type & CUBEB_DEVICE_TYPE_INPUT) + continue; + break; + case 0: + continue; + } + cdi.type = type; + + devid = oss_cubeb_devid_intern(context, ai.devnode); + cdi.device_id = strdup(ai.name); + cdi.friendly_name = strdup(ai.name); + cdi.group_id = strdup(ai.name); + if (devid == NULL || cdi.device_id == NULL || cdi.friendly_name == NULL || + cdi.group_id == NULL) { + oss_free_cubeb_device_info_strings(&cdi); + continue; + } + + cdi.devid = devid; + cdi.vendor_name = NULL; + cdi.state = CUBEB_DEVICE_STATE_ENABLED; + cdi.preferred = CUBEB_DEVICE_PREF_NONE; + cdi.format = CUBEB_DEVICE_FMT_S16NE; + cdi.default_format = CUBEB_DEVICE_FMT_S16NE; + cdi.max_channels = ai.max_channels; + cdi.default_rate = OSS_PREFER_RATE; + cdi.max_rate = ai.max_rate; + cdi.min_rate = ai.min_rate; + cdi.latency_lo = 0; + cdi.latency_hi = 0; + + devinfop[collection_cnt++] = cdi; + } + + collection->count = collection_cnt; + collection->device = devinfop; + + if (mixer_fd != -1) + close(mixer_fd); + return CUBEB_OK; + +fail: + if (mixer_fd != -1) + close(mixer_fd); + free(devinfop); + return CUBEB_ERROR; +} + +#endif + +static int +oss_device_collection_destroy(cubeb * context, + cubeb_device_collection * collection) +{ + size_t i; + for (i = 0; i < collection->count; i++) { + oss_free_cubeb_device_info_strings(&collection->device[i]); + } + free(collection->device); + collection->device = NULL; + collection->count = 0; + return 0; +} + +static unsigned int +oss_chn_from_cubeb(cubeb_channel chn) +{ + switch (chn) { + case CHANNEL_FRONT_LEFT: + return CHID_L; + case CHANNEL_FRONT_RIGHT: + return CHID_R; + case CHANNEL_FRONT_CENTER: + return CHID_C; + case CHANNEL_LOW_FREQUENCY: + return CHID_LFE; + case CHANNEL_BACK_LEFT: + return CHID_LR; + case CHANNEL_BACK_RIGHT: + return CHID_RR; + case CHANNEL_SIDE_LEFT: + return CHID_LS; + case CHANNEL_SIDE_RIGHT: + return CHID_RS; + default: + return CHID_UNDEF; + } +} + +static unsigned long long +oss_cubeb_layout_to_chnorder(cubeb_channel_layout layout) +{ + unsigned int i, nchns = 0; + unsigned long long chnorder = 0; + + for (i = 0; layout; i++, layout >>= 1) { + unsigned long long chid = oss_chn_from_cubeb((layout & 1) << i); + if (chid == CHID_UNDEF) + continue; + + chnorder |= (chid & 0xf) << nchns * 4; + nchns++; + } + + return chnorder; +} + +static int +oss_copy_params(int fd, cubeb_stream * stream, cubeb_stream_params * params, + struct stream_info * sinfo) +{ + unsigned long long chnorder; + + sinfo->channels = params->channels; + sinfo->sample_rate = params->rate; + switch (params->format) { + case CUBEB_SAMPLE_S16LE: + sinfo->fmt = AFMT_S16_LE; + sinfo->precision = 16; + break; + case CUBEB_SAMPLE_S16BE: + sinfo->fmt = AFMT_S16_BE; + sinfo->precision = 16; + break; + case CUBEB_SAMPLE_FLOAT32NE: + sinfo->fmt = AFMT_S32_NE; + sinfo->precision = 32; + break; + default: + LOG("Unsupported format"); + return CUBEB_ERROR_INVALID_FORMAT; + } + if (ioctl(fd, SNDCTL_DSP_CHANNELS, &sinfo->channels) == -1) { + return CUBEB_ERROR; + } + if (ioctl(fd, SNDCTL_DSP_SETFMT, &sinfo->fmt) == -1) { + return CUBEB_ERROR; + } + if (ioctl(fd, SNDCTL_DSP_SPEED, &sinfo->sample_rate) == -1) { + return CUBEB_ERROR; + } + /* Mono layout is an exception */ + if (params->layout != CUBEB_LAYOUT_UNDEFINED && + params->layout != CUBEB_LAYOUT_MONO) { + chnorder = oss_cubeb_layout_to_chnorder(params->layout); + if (ioctl(fd, SNDCTL_DSP_SET_CHNORDER, &chnorder) == -1) + LOG("Non-fatal error %d occured when setting channel order.", errno); + } + return CUBEB_OK; +} + +static int +oss_stream_stop(cubeb_stream * s) +{ + pthread_mutex_lock(&s->mtx); + if (s->thread_created && s->running) { + s->running = false; + s->doorbell = false; + pthread_cond_wait(&s->stopped_cv, &s->mtx); + } + if (s->state != CUBEB_STATE_STOPPED) { + s->state = CUBEB_STATE_STOPPED; + pthread_mutex_unlock(&s->mtx); + s->state_cb(s, s->user_ptr, CUBEB_STATE_STOPPED); + } else { + pthread_mutex_unlock(&s->mtx); + } + return CUBEB_OK; +} + +static void +oss_stream_destroy(cubeb_stream * s) +{ + pthread_mutex_lock(&s->mtx); + if (s->thread_created) { + s->destroying = true; + s->doorbell = true; + pthread_cond_signal(&s->doorbell_cv); + } + pthread_mutex_unlock(&s->mtx); + pthread_join(s->thread, NULL); + + pthread_cond_destroy(&s->doorbell_cv); + pthread_cond_destroy(&s->stopped_cv); + pthread_mutex_destroy(&s->mtx); + if (s->play.fd != -1) { + close(s->play.fd); + } + if (s->record.fd != -1) { + close(s->record.fd); + } + free(s->play.buf); + free(s->record.buf); + free(s); +} + +static void +oss_float_to_linear32(void * buf, unsigned sample_count, float vol) +{ + float * in = buf; + int32_t * out = buf; + int32_t * tail = out + sample_count; + + while (out < tail) { + int64_t f = *(in++) * vol * 0x80000000LL; + if (f < -INT32_MAX) + f = -INT32_MAX; + else if (f > INT32_MAX) + f = INT32_MAX; + *(out++) = f; + } +} + +static void +oss_linear32_to_float(void * buf, unsigned sample_count) +{ + int32_t * in = buf; + float * out = buf; + float * tail = out + sample_count; + + while (out < tail) { + *(out++) = (1.0 / 0x80000000LL) * *(in++); + } +} + +static void +oss_linear16_set_vol(int16_t * buf, unsigned sample_count, float vol) +{ + unsigned i; + int32_t multiplier = vol * 0x8000; + + for (i = 0; i < sample_count; ++i) { + buf[i] = (buf[i] * multiplier) >> 15; + } +} + +static int +oss_get_rec_frames(cubeb_stream * s, unsigned int nframes) +{ + size_t rem = nframes * s->record.frame_size; + size_t read_ofs = 0; + while (rem > 0) { + ssize_t n; + if ((n = read(s->record.fd, (uint8_t *)s->record.buf + read_ofs, rem)) < + 0) { + if (errno == EINTR) + continue; + return CUBEB_ERROR; + } + read_ofs += n; + rem -= n; + } + return 0; +} + +static int +oss_put_play_frames(cubeb_stream * s, unsigned int nframes) +{ + size_t rem = nframes * s->play.frame_size; + size_t write_ofs = 0; + while (rem > 0) { + ssize_t n; + if ((n = write(s->play.fd, (uint8_t *)s->play.buf + write_ofs, rem)) < 0) { + if (errno == EINTR) + continue; + return CUBEB_ERROR; + } + pthread_mutex_lock(&s->mtx); + s->frames_written += n / s->play.frame_size; + pthread_mutex_unlock(&s->mtx); + write_ofs += n; + rem -= n; + } + return 0; +} + +static int +oss_wait_fds_for_space(cubeb_stream * s, long * nfrp) +{ + audio_buf_info bi; + struct pollfd pfds[2]; + long nfr, tnfr; + int i; + + assert(s->play.fd != -1 || s->record.fd != -1); + pfds[0].events = POLLOUT | POLLHUP; + pfds[0].revents = 0; + pfds[0].fd = s->play.fd; + pfds[1].events = POLLIN | POLLHUP; + pfds[1].revents = 0; + pfds[1].fd = s->record.fd; + +retry: + nfr = LONG_MAX; + + if (poll(pfds, 2, 1000) == -1) { + return CUBEB_ERROR; + } + + for (i = 0; i < 2; i++) { + if (pfds[i].revents & POLLHUP) { + return CUBEB_ERROR; + } + } + + if (s->play.fd != -1) { + if (ioctl(s->play.fd, SNDCTL_DSP_GETOSPACE, &bi) == -1) { + return CUBEB_STATE_ERROR; + } + tnfr = bi.bytes / s->play.frame_size; + if (tnfr <= 0) { + /* too little space - stop polling record, if any */ + pfds[0].fd = s->play.fd; + pfds[1].fd = -1; + goto retry; + } else if (tnfr > (long)s->play.maxframes) { + /* too many frames available - limit */ + tnfr = (long)s->play.maxframes; + } + if (nfr > tnfr) { + nfr = tnfr; + } + } + if (s->record.fd != -1) { + if (ioctl(s->record.fd, SNDCTL_DSP_GETISPACE, &bi) == -1) { + return CUBEB_STATE_ERROR; + } + tnfr = bi.bytes / s->record.frame_size; + if (tnfr <= 0) { + /* too little space - stop polling playback, if any */ + pfds[0].fd = -1; + pfds[1].fd = s->record.fd; + goto retry; + } else if (tnfr > (long)s->record.maxframes) { + /* too many frames available - limit */ + tnfr = (long)s->record.maxframes; + } + if (nfr > tnfr) { + nfr = tnfr; + } + } + + *nfrp = nfr; + return 0; +} + +/* 1 - Stopped by cubeb_stream_stop, otherwise 0 */ +static int +oss_audio_loop(cubeb_stream * s, cubeb_state * new_state) +{ + cubeb_state state = CUBEB_STATE_STOPPED; + int trig = 0, drain = 0; + const bool play_on = s->play.fd != -1, record_on = s->record.fd != -1; + long nfr = 0; + + if (record_on) { + if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) { + LOG("Error %d occured when setting trigger on record fd", errno); + state = CUBEB_STATE_ERROR; + goto breakdown; + } + + trig |= PCM_ENABLE_INPUT; + memset(s->record.buf, 0, s->record.bufframes * s->record.frame_size); + + if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig) == -1) { + LOG("Error %d occured when setting trigger on record fd", errno); + state = CUBEB_STATE_ERROR; + goto breakdown; + } + } + + if (!play_on && !record_on) { + /* + * Stop here if the stream is not play & record stream, + * play-only stream or record-only stream + */ + + goto breakdown; + } + + while (1) { + pthread_mutex_lock(&s->mtx); + if (!s->running || s->destroying) { + pthread_mutex_unlock(&s->mtx); + break; + } + pthread_mutex_unlock(&s->mtx); + + long got = 0; + if (nfr > 0) { + if (record_on) { + if (oss_get_rec_frames(s, nfr) == CUBEB_ERROR) { + state = CUBEB_STATE_ERROR; + goto breakdown; + } + if (s->record.floating) { + oss_linear32_to_float(s->record.buf, s->record.info.channels * nfr); + } + } + + got = s->data_cb(s, s->user_ptr, s->record.buf, s->play.buf, nfr); + if (got == CUBEB_ERROR) { + state = CUBEB_STATE_ERROR; + goto breakdown; + } + if (got < nfr) { + if (s->play.fd != -1) { + drain = 1; + } else { + /* + * This is a record-only stream and number of frames + * returned from data_cb() is smaller than number + * of frames required to read. Stop here. + */ + state = CUBEB_STATE_STOPPED; + goto breakdown; + } + } + + if (got > 0 && play_on) { + float vol; + + pthread_mutex_lock(&s->mtx); + vol = s->volume; + pthread_mutex_unlock(&s->mtx); + + if (s->play.floating) { + oss_float_to_linear32(s->play.buf, s->play.info.channels * got, vol); + } else { + oss_linear16_set_vol((int16_t *)s->play.buf, + s->play.info.channels * got, vol); + } + if (oss_put_play_frames(s, got) == CUBEB_ERROR) { + state = CUBEB_STATE_ERROR; + goto breakdown; + } + } + if (drain) { + state = CUBEB_STATE_DRAINED; + goto breakdown; + } + } + + if (oss_wait_fds_for_space(s, &nfr) != 0) { + state = CUBEB_STATE_ERROR; + goto breakdown; + } + } + + return 1; + +breakdown: + pthread_mutex_lock(&s->mtx); + *new_state = s->state = state; + s->running = false; + pthread_mutex_unlock(&s->mtx); + return 0; +} + +static void * +oss_io_routine(void * arg) +{ + cubeb_stream * s = arg; + cubeb_state new_state; + int stopped; + + CUBEB_REGISTER_THREAD("cubeb rendering thread"); + + do { + pthread_mutex_lock(&s->mtx); + if (s->destroying) { + pthread_mutex_unlock(&s->mtx); + break; + } + pthread_mutex_unlock(&s->mtx); + + stopped = oss_audio_loop(s, &new_state); + if (s->record.fd != -1) + ioctl(s->record.fd, SNDCTL_DSP_HALT_INPUT, NULL); + if (!stopped) + s->state_cb(s, s->user_ptr, new_state); + + pthread_mutex_lock(&s->mtx); + pthread_cond_signal(&s->stopped_cv); + if (s->destroying) { + pthread_mutex_unlock(&s->mtx); + break; + } + while (!s->doorbell) { + pthread_cond_wait(&s->doorbell_cv, &s->mtx); + } + s->doorbell = false; + pthread_mutex_unlock(&s->mtx); + } while (1); + + pthread_mutex_lock(&s->mtx); + s->thread_created = false; + pthread_mutex_unlock(&s->mtx); + + CUBEB_UNREGISTER_THREAD(); + + return NULL; +} + +static inline int +oss_calc_frag_shift(unsigned int frames, unsigned int frame_size) +{ + int n = 4; + int blksize = frames * frame_size; + while ((1 << n) < blksize) { + n++; + } + return n; +} + +static inline int +oss_get_frag_params(unsigned int shift) +{ + return (OSS_NFRAGS << 16) | shift; +} + +static int +oss_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + int ret = CUBEB_OK; + cubeb_stream * s = NULL; + const char * defdsp; + + if (!(defdsp = getenv(ENV_AUDIO_DEVICE)) || *defdsp == '\0') + defdsp = OSS_DEFAULT_DEVICE; + + (void)stream_name; + if ((s = calloc(1, sizeof(cubeb_stream))) == NULL) { + ret = CUBEB_ERROR; + goto error; + } + s->state = CUBEB_STATE_STOPPED; + s->record.fd = s->play.fd = -1; + if (input_device != NULL) { + strlcpy(s->record.name, input_device, sizeof(s->record.name)); + } else { + strlcpy(s->record.name, defdsp, sizeof(s->record.name)); + } + if (output_device != NULL) { + strlcpy(s->play.name, output_device, sizeof(s->play.name)); + } else { + strlcpy(s->play.name, defdsp, sizeof(s->play.name)); + } + if (input_stream_params != NULL) { + unsigned int nb_channels; + uint32_t minframes; + + if (input_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + LOG("Loopback not supported"); + ret = CUBEB_ERROR_NOT_SUPPORTED; + goto error; + } + nb_channels = cubeb_channel_layout_nb_channels(input_stream_params->layout); + if (input_stream_params->layout != CUBEB_LAYOUT_UNDEFINED && + nb_channels != input_stream_params->channels) { + LOG("input_stream_params->layout does not match " + "input_stream_params->channels"); + ret = CUBEB_ERROR_INVALID_PARAMETER; + goto error; + } + if ((s->record.fd = open(s->record.name, O_RDONLY)) == -1) { + LOG("Audio device \"%s\" could not be opened as read-only", + s->record.name); + ret = CUBEB_ERROR_DEVICE_UNAVAILABLE; + goto error; + } + if ((ret = oss_copy_params(s->record.fd, s, input_stream_params, + &s->record.info)) != CUBEB_OK) { + LOG("Setting record params failed"); + goto error; + } + s->record.floating = + (input_stream_params->format == CUBEB_SAMPLE_FLOAT32NE); + s->record.frame_size = + s->record.info.channels * (s->record.info.precision / 8); + s->record.bufframes = latency_frames; + + oss_get_min_latency(context, *input_stream_params, &minframes); + if (s->record.bufframes < minframes) { + s->record.bufframes = minframes; + } + } + if (output_stream_params != NULL) { + unsigned int nb_channels; + uint32_t minframes; + + if (output_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + LOG("Loopback not supported"); + ret = CUBEB_ERROR_NOT_SUPPORTED; + goto error; + } + nb_channels = + cubeb_channel_layout_nb_channels(output_stream_params->layout); + if (output_stream_params->layout != CUBEB_LAYOUT_UNDEFINED && + nb_channels != output_stream_params->channels) { + LOG("output_stream_params->layout does not match " + "output_stream_params->channels"); + ret = CUBEB_ERROR_INVALID_PARAMETER; + goto error; + } + if ((s->play.fd = open(s->play.name, O_WRONLY)) == -1) { + LOG("Audio device \"%s\" could not be opened as write-only", + s->play.name); + ret = CUBEB_ERROR_DEVICE_UNAVAILABLE; + goto error; + } + if ((ret = oss_copy_params(s->play.fd, s, output_stream_params, + &s->play.info)) != CUBEB_OK) { + LOG("Setting play params failed"); + goto error; + } + s->play.floating = (output_stream_params->format == CUBEB_SAMPLE_FLOAT32NE); + s->play.frame_size = s->play.info.channels * (s->play.info.precision / 8); + s->play.bufframes = latency_frames; + + oss_get_min_latency(context, *output_stream_params, &minframes); + if (s->play.bufframes < minframes) { + s->play.bufframes = minframes; + } + } + if (s->play.fd != -1) { + int frag = oss_get_frag_params( + oss_calc_frag_shift(s->play.bufframes, s->play.frame_size)); + if (ioctl(s->play.fd, SNDCTL_DSP_SETFRAGMENT, &frag)) + LOG("Failed to set play fd with SNDCTL_DSP_SETFRAGMENT. frag: 0x%x", + frag); + audio_buf_info bi; + if (ioctl(s->play.fd, SNDCTL_DSP_GETOSPACE, &bi)) + LOG("Failed to get play fd's buffer info."); + else { + s->play.bufframes = (bi.fragsize * bi.fragstotal) / s->play.frame_size; + } + int lw; + + /* + * Force 32 ms service intervals at most, or when recording is + * active, use the recording service intervals as a reference. + */ + s->play.maxframes = (32 * output_stream_params->rate) / 1000; + if (s->record.fd != -1 || s->play.maxframes >= s->play.bufframes) { + lw = s->play.frame_size; /* Feed data when possible. */ + s->play.maxframes = s->play.bufframes; + } else { + lw = (s->play.bufframes - s->play.maxframes) * s->play.frame_size; + } + if (ioctl(s->play.fd, SNDCTL_DSP_LOW_WATER, &lw)) + LOG("Audio device \"%s\" (play) could not set trigger threshold", + s->play.name); + } + if (s->record.fd != -1) { + int frag = oss_get_frag_params( + oss_calc_frag_shift(s->record.bufframes, s->record.frame_size)); + if (ioctl(s->record.fd, SNDCTL_DSP_SETFRAGMENT, &frag)) + LOG("Failed to set record fd with SNDCTL_DSP_SETFRAGMENT. frag: 0x%x", + frag); + audio_buf_info bi; + if (ioctl(s->record.fd, SNDCTL_DSP_GETISPACE, &bi)) + LOG("Failed to get record fd's buffer info."); + else { + s->record.bufframes = + (bi.fragsize * bi.fragstotal) / s->record.frame_size; + } + + s->record.maxframes = s->record.bufframes; + int lw = s->record.frame_size; + if (ioctl(s->record.fd, SNDCTL_DSP_LOW_WATER, &lw)) + LOG("Audio device \"%s\" (record) could not set trigger threshold", + s->record.name); + } + s->context = context; + s->volume = 1.0; + s->state_cb = state_callback; + s->data_cb = data_callback; + s->user_ptr = user_ptr; + + if (pthread_mutex_init(&s->mtx, NULL) != 0) { + LOG("Failed to create mutex"); + goto error; + } + if (pthread_cond_init(&s->doorbell_cv, NULL) != 0) { + LOG("Failed to create cv"); + goto error; + } + if (pthread_cond_init(&s->stopped_cv, NULL) != 0) { + LOG("Failed to create cv"); + goto error; + } + s->doorbell = false; + + if (s->play.fd != -1) { + if ((s->play.buf = calloc(s->play.bufframes, s->play.frame_size)) == NULL) { + ret = CUBEB_ERROR; + goto error; + } + } + if (s->record.fd != -1) { + if ((s->record.buf = calloc(s->record.bufframes, s->record.frame_size)) == + NULL) { + ret = CUBEB_ERROR; + goto error; + } + } + + *stream = s; + return CUBEB_OK; +error: + if (s != NULL) { + oss_stream_destroy(s); + } + return ret; +} + +static int +oss_stream_thr_create(cubeb_stream * s) +{ + if (s->thread_created) { + s->doorbell = true; + pthread_cond_signal(&s->doorbell_cv); + return CUBEB_OK; + } + + if (pthread_create(&s->thread, NULL, oss_io_routine, s) != 0) { + LOG("Couldn't create thread"); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +static int +oss_stream_start(cubeb_stream * s) +{ + s->state_cb(s, s->user_ptr, CUBEB_STATE_STARTED); + pthread_mutex_lock(&s->mtx); + /* Disallow starting an already started stream */ + assert(!s->running && s->state != CUBEB_STATE_STARTED); + if (oss_stream_thr_create(s) != CUBEB_OK) { + pthread_mutex_unlock(&s->mtx); + s->state_cb(s, s->user_ptr, CUBEB_STATE_ERROR); + return CUBEB_ERROR; + } + s->state = CUBEB_STATE_STARTED; + s->thread_created = true; + s->running = true; + pthread_mutex_unlock(&s->mtx); + return CUBEB_OK; +} + +static int +oss_stream_get_position(cubeb_stream * s, uint64_t * position) +{ + pthread_mutex_lock(&s->mtx); + *position = s->frames_written; + pthread_mutex_unlock(&s->mtx); + return CUBEB_OK; +} + +static int +oss_stream_get_latency(cubeb_stream * s, uint32_t * latency) +{ + int delay; + + if (ioctl(s->play.fd, SNDCTL_DSP_GETODELAY, &delay) == -1) { + return CUBEB_ERROR; + } + + /* Return number of frames there */ + *latency = delay / s->play.frame_size; + return CUBEB_OK; +} + +static int +oss_stream_set_volume(cubeb_stream * stream, float volume) +{ + if (volume < 0.0) + volume = 0.0; + else if (volume > 1.0) + volume = 1.0; + pthread_mutex_lock(&stream->mtx); + stream->volume = volume; + pthread_mutex_unlock(&stream->mtx); + return CUBEB_OK; +} + +static int +oss_get_current_device(cubeb_stream * stream, cubeb_device ** const device) +{ + *device = calloc(1, sizeof(cubeb_device)); + if (*device == NULL) { + return CUBEB_ERROR; + } + (*device)->input_name = + stream->record.fd != -1 ? strdup(stream->record.name) : NULL; + (*device)->output_name = + stream->play.fd != -1 ? strdup(stream->play.name) : NULL; + return CUBEB_OK; +} + +static int +oss_stream_device_destroy(cubeb_stream * stream, cubeb_device * device) +{ + (void)stream; + free(device->input_name); + free(device->output_name); + free(device); + return CUBEB_OK; +} + +static struct cubeb_ops const oss_ops = { + .init = oss_init, + .get_backend_id = oss_get_backend_id, + .get_max_channel_count = oss_get_max_channel_count, + .get_min_latency = oss_get_min_latency, + .get_preferred_sample_rate = oss_get_preferred_sample_rate, + .enumerate_devices = oss_enumerate_devices, + .device_collection_destroy = oss_device_collection_destroy, + .destroy = oss_destroy, + .stream_init = oss_stream_init, + .stream_destroy = oss_stream_destroy, + .stream_start = oss_stream_start, + .stream_stop = oss_stream_stop, + .stream_get_position = oss_stream_get_position, + .stream_get_latency = oss_stream_get_latency, + .stream_get_input_latency = NULL, + .stream_set_volume = oss_stream_set_volume, + .stream_set_name = NULL, + .stream_get_current_device = oss_get_current_device, + .stream_device_destroy = oss_stream_device_destroy, + .stream_register_device_changed_callback = NULL, + .register_device_collection_changed = NULL}; diff --git a/3rdparty/cubeb/src/cubeb_osx_run_loop.cpp b/3rdparty/cubeb/src/cubeb_osx_run_loop.cpp new file mode 100644 index 0000000000..5828db6e95 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_osx_run_loop.cpp @@ -0,0 +1,34 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#include "cubeb_osx_run_loop.h" +#include "cubeb_log.h" +#include +#include +#include +#include +#include + +void +cubeb_set_coreaudio_notification_runloop() +{ + /* This is needed so that AudioUnit listeners get called on this thread, and + * not the main thread. If we don't do that, they are not called, or a crash + * occur, depending on the OSX version. */ + AudioObjectPropertyAddress runloop_address = { + kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster}; + + CFRunLoopRef run_loop = nullptr; + + OSStatus r; + r = AudioObjectSetPropertyData(kAudioObjectSystemObject, &runloop_address, 0, + NULL, sizeof(CFRunLoopRef), &run_loop); + if (r != noErr) { + LOG("Could not make global CoreAudio notifications use their own thread."); + } +} diff --git a/3rdparty/cubeb/src/cubeb_osx_run_loop.h b/3rdparty/cubeb/src/cubeb_osx_run_loop.h new file mode 100644 index 0000000000..8d88a37140 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_osx_run_loop.h @@ -0,0 +1,23 @@ +/* + * Copyright © 2014 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +/* On OSX 10.6 and after, the notification callbacks from the audio hardware are + * called on the main thread. Setting the kAudioHardwarePropertyRunLoop property + * to null tells the OSX to use a separate thread for that. + * + * This has to be called only once per process, so it is in a separate header + * for easy integration in other code bases. */ +#if defined(__cplusplus) +extern "C" { +#endif + +void +cubeb_set_coreaudio_notification_runloop(); + +#if defined(__cplusplus) +} +#endif diff --git a/3rdparty/cubeb/src/cubeb_pulse.c b/3rdparty/cubeb/src/cubeb_pulse.c new file mode 100644 index 0000000000..6866405250 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_pulse.c @@ -0,0 +1,1709 @@ +/* + * Copyright © 2011 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#undef NDEBUG +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_mixer.h" +#include "cubeb_strings.h" +#include +#include +#include +#include +#include +#include + +#ifdef DISABLE_LIBPULSE_DLOPEN +#define WRAP(x) x +#else +#define WRAP(x) (*cubeb_##x) +#define LIBPULSE_API_VISIT(X) \ + X(pa_channel_map_can_balance) \ + X(pa_channel_map_init) \ + X(pa_context_connect) \ + X(pa_context_disconnect) \ + X(pa_context_drain) \ + X(pa_context_get_server_info) \ + X(pa_context_get_sink_info_by_name) \ + X(pa_context_get_sink_info_list) \ + X(pa_context_get_sink_input_info) \ + X(pa_context_get_source_info_list) \ + X(pa_context_get_state) \ + X(pa_context_new) \ + X(pa_context_rttime_new) \ + X(pa_context_set_sink_input_volume) \ + X(pa_context_set_state_callback) \ + X(pa_context_unref) \ + X(pa_cvolume_set) \ + X(pa_cvolume_set_balance) \ + X(pa_frame_size) \ + X(pa_operation_get_state) \ + X(pa_operation_unref) \ + X(pa_proplist_gets) \ + X(pa_rtclock_now) \ + X(pa_stream_begin_write) \ + X(pa_stream_cancel_write) \ + X(pa_stream_connect_playback) \ + X(pa_stream_cork) \ + X(pa_stream_disconnect) \ + X(pa_stream_get_channel_map) \ + X(pa_stream_get_index) \ + X(pa_stream_get_latency) \ + X(pa_stream_get_sample_spec) \ + X(pa_stream_get_state) \ + X(pa_stream_get_time) \ + X(pa_stream_new) \ + X(pa_stream_set_state_callback) \ + X(pa_stream_set_write_callback) \ + X(pa_stream_unref) \ + X(pa_stream_update_timing_info) \ + X(pa_stream_write) \ + X(pa_sw_volume_from_linear) \ + X(pa_threaded_mainloop_free) \ + X(pa_threaded_mainloop_get_api) \ + X(pa_threaded_mainloop_in_thread) \ + X(pa_threaded_mainloop_lock) \ + X(pa_threaded_mainloop_new) \ + X(pa_threaded_mainloop_signal) \ + X(pa_threaded_mainloop_start) \ + X(pa_threaded_mainloop_stop) \ + X(pa_threaded_mainloop_unlock) \ + X(pa_threaded_mainloop_wait) \ + X(pa_usec_to_bytes) \ + X(pa_stream_set_read_callback) \ + X(pa_stream_connect_record) \ + X(pa_stream_readable_size) \ + X(pa_stream_writable_size) \ + X(pa_stream_peek) \ + X(pa_stream_drop) \ + X(pa_stream_get_buffer_attr) \ + X(pa_stream_get_device_name) \ + X(pa_context_set_subscribe_callback) \ + X(pa_context_subscribe) \ + X(pa_mainloop_api_once) \ + X(pa_get_library_version) \ + X(pa_channel_map_init_auto) \ + X(pa_stream_set_name) + +#define MAKE_TYPEDEF(x) static typeof(x) * cubeb_##x; +LIBPULSE_API_VISIT(MAKE_TYPEDEF); +#undef MAKE_TYPEDEF +#endif + +#if PA_CHECK_VERSION(2, 0, 0) +static int has_pulse_v2 = 0; +#endif + +static struct cubeb_ops const pulse_ops; + +struct cubeb_default_sink_info { + pa_channel_map channel_map; + uint32_t sample_spec_rate; + pa_sink_flags_t flags; +}; + +struct cubeb { + struct cubeb_ops const * ops; + void * libpulse; + pa_threaded_mainloop * mainloop; + pa_context * context; + struct cubeb_default_sink_info * default_sink_info; + char * context_name; + int error; + cubeb_device_collection_changed_callback output_collection_changed_callback; + void * output_collection_changed_user_ptr; + cubeb_device_collection_changed_callback input_collection_changed_callback; + void * input_collection_changed_user_ptr; + cubeb_strings * device_ids; +}; + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context; + void * user_ptr; + /**/ + pa_stream * output_stream; + pa_stream * input_stream; + cubeb_data_callback data_callback; + cubeb_state_callback state_callback; + pa_time_event * drain_timer; + pa_sample_spec output_sample_spec; + pa_sample_spec input_sample_spec; + int shutdown; + float volume; + cubeb_state state; +}; + +static const float PULSE_NO_GAIN = -1.0; + +enum cork_state { UNCORK = 0, CORK = 1 << 0, NOTIFY = 1 << 1 }; + +static int +intern_device_id(cubeb * ctx, char const ** id) +{ + char const * interned; + + assert(ctx); + assert(id); + + interned = cubeb_strings_intern(ctx->device_ids, *id); + if (!interned) { + return CUBEB_ERROR; + } + + *id = interned; + + return CUBEB_OK; +} + +static void +sink_info_callback(pa_context * context, const pa_sink_info * info, int eol, + void * u) +{ + (void)context; + cubeb * ctx = u; + if (!eol) { + free(ctx->default_sink_info); + ctx->default_sink_info = malloc(sizeof(struct cubeb_default_sink_info)); + memcpy(&ctx->default_sink_info->channel_map, &info->channel_map, + sizeof(pa_channel_map)); + ctx->default_sink_info->sample_spec_rate = info->sample_spec.rate; + ctx->default_sink_info->flags = info->flags; + } + WRAP(pa_threaded_mainloop_signal)(ctx->mainloop, 0); +} + +static void +server_info_callback(pa_context * context, const pa_server_info * info, + void * u) +{ + pa_operation * o; + o = WRAP(pa_context_get_sink_info_by_name)(context, info->default_sink_name, + sink_info_callback, u); + if (o) { + WRAP(pa_operation_unref)(o); + } +} + +static void +context_state_callback(pa_context * c, void * u) +{ + cubeb * ctx = u; + if (!PA_CONTEXT_IS_GOOD(WRAP(pa_context_get_state)(c))) { + ctx->error = 1; + } + WRAP(pa_threaded_mainloop_signal)(ctx->mainloop, 0); +} + +static void +context_notify_callback(pa_context * c, void * u) +{ + (void)c; + cubeb * ctx = u; + WRAP(pa_threaded_mainloop_signal)(ctx->mainloop, 0); +} + +static void +stream_success_callback(pa_stream * s, int success, void * u) +{ + (void)s; + (void)success; + cubeb_stream * stm = u; + WRAP(pa_threaded_mainloop_signal)(stm->context->mainloop, 0); +} + +static void +stream_state_change_callback(cubeb_stream * stm, cubeb_state s) +{ + stm->state = s; + stm->state_callback(stm, stm->user_ptr, s); +} + +static void +stream_drain_callback(pa_mainloop_api * a, pa_time_event * e, + struct timeval const * tv, void * u) +{ + (void)a; + (void)tv; + cubeb_stream * stm = u; + assert(stm->drain_timer == e); + stream_state_change_callback(stm, CUBEB_STATE_DRAINED); + /* there's no pa_rttime_free, so use this instead. */ + a->time_free(stm->drain_timer); + stm->drain_timer = NULL; + WRAP(pa_threaded_mainloop_signal)(stm->context->mainloop, 0); +} + +static void +stream_state_callback(pa_stream * s, void * u) +{ + cubeb_stream * stm = u; + if (!PA_STREAM_IS_GOOD(WRAP(pa_stream_get_state)(s))) { + stream_state_change_callback(stm, CUBEB_STATE_ERROR); + } + WRAP(pa_threaded_mainloop_signal)(stm->context->mainloop, 0); +} + +static void +trigger_user_callback(pa_stream * s, void const * input_data, size_t nbytes, + cubeb_stream * stm) +{ + void * buffer; + size_t size; + int r; + long got; + size_t towrite, read_offset; + size_t frame_size; + + frame_size = WRAP(pa_frame_size)(&stm->output_sample_spec); + assert(nbytes % frame_size == 0); + + towrite = nbytes; + read_offset = 0; + while (towrite) { + size = towrite; + r = WRAP(pa_stream_begin_write)(s, &buffer, &size); + // Note: this has failed running under rr on occassion - needs + // investigation. + assert(r == 0); + assert(size > 0); + assert(size % frame_size == 0); + + LOGV("Trigger user callback with output buffer size=%zd, read_offset=%zd", + size, read_offset); + got = stm->data_callback(stm, stm->user_ptr, + (uint8_t const *)input_data + read_offset, buffer, + size / frame_size); + if (got < 0) { + WRAP(pa_stream_cancel_write)(s); + stm->shutdown = 1; + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + return; + } + // If more iterations move offset of read buffer + if (input_data) { + size_t in_frame_size = WRAP(pa_frame_size)(&stm->input_sample_spec); + read_offset += (size / frame_size) * in_frame_size; + } + + if (stm->volume != PULSE_NO_GAIN) { + uint32_t samples = size * stm->output_sample_spec.channels / frame_size; + + if (stm->output_sample_spec.format == PA_SAMPLE_S16BE || + stm->output_sample_spec.format == PA_SAMPLE_S16LE) { + short * b = buffer; + for (uint32_t i = 0; i < samples; i++) { + b[i] *= stm->volume; + } + } else { + float * b = buffer; + for (uint32_t i = 0; i < samples; i++) { + b[i] *= stm->volume; + } + } + } + + r = WRAP(pa_stream_write)(s, buffer, got * frame_size, NULL, 0, + PA_SEEK_RELATIVE); + assert(r == 0); + + if ((size_t)got < size / frame_size) { + pa_usec_t latency = 0; + r = WRAP(pa_stream_get_latency)(s, &latency, NULL); + if (r == -PA_ERR_NODATA) { + /* this needs a better guess. */ + latency = 100 * PA_USEC_PER_MSEC; + } + assert(r == 0 || r == -PA_ERR_NODATA); + /* pa_stream_drain is useless, see PA bug# 866. this is a workaround. */ + /* arbitrary safety margin: double the current latency. */ + assert(!stm->drain_timer); + stm->drain_timer = WRAP(pa_context_rttime_new)( + stm->context->context, WRAP(pa_rtclock_now)() + 2 * latency, + stream_drain_callback, stm); + stm->shutdown = 1; + return; + } + + towrite -= size; + } + + assert(towrite == 0); +} + +static int +read_from_input(pa_stream * s, void const ** buffer, size_t * size) +{ + size_t readable_size = WRAP(pa_stream_readable_size)(s); + if (readable_size > 0) { + if (WRAP(pa_stream_peek)(s, buffer, size) < 0) { + return -1; + } + } + return readable_size; +} + +static void +stream_write_callback(pa_stream * s, size_t nbytes, void * u) +{ + LOGV("Output callback to be written buffer size %zd", nbytes); + cubeb_stream * stm = u; + if (stm->shutdown || stm->state != CUBEB_STATE_STARTED) { + return; + } + + if (!stm->input_stream) { + // Output/playback only operation. + // Write directly to output + assert(!stm->input_stream && stm->output_stream); + trigger_user_callback(s, NULL, nbytes, stm); + } +} + +static void +stream_read_callback(pa_stream * s, size_t nbytes, void * u) +{ + LOGV("Input callback buffer size %zd", nbytes); + cubeb_stream * stm = u; + if (stm->shutdown) { + return; + } + + void const * read_data = NULL; + size_t read_size; + while (read_from_input(s, &read_data, &read_size) > 0) { + /* read_data can be NULL in case of a hole. */ + if (read_data) { + size_t in_frame_size = WRAP(pa_frame_size)(&stm->input_sample_spec); + size_t read_frames = read_size / in_frame_size; + + if (stm->output_stream) { + // input/capture + output/playback operation + size_t out_frame_size = WRAP(pa_frame_size)(&stm->output_sample_spec); + size_t write_size = read_frames * out_frame_size; + // Offer full duplex data for writing + trigger_user_callback(stm->output_stream, read_data, write_size, stm); + } else { + // input/capture only operation. Call callback directly + long got = stm->data_callback(stm, stm->user_ptr, read_data, NULL, + read_frames); + if (got < 0 || (size_t)got != read_frames) { + WRAP(pa_stream_cancel_write)(s); + stm->shutdown = 1; + if (got < 0) { + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + } + break; + } + } + } + if (read_size > 0) { + WRAP(pa_stream_drop)(s); + } + + if (stm->shutdown) { + return; + } + } +} + +static int +wait_until_context_ready(cubeb * ctx) +{ + for (;;) { + pa_context_state_t state = WRAP(pa_context_get_state)(ctx->context); + if (!PA_CONTEXT_IS_GOOD(state)) + return -1; + if (state == PA_CONTEXT_READY) + break; + WRAP(pa_threaded_mainloop_wait)(ctx->mainloop); + } + return 0; +} + +static int +wait_until_io_stream_ready(pa_stream * stream, pa_threaded_mainloop * mainloop) +{ + if (!stream || !mainloop) { + return -1; + } + for (;;) { + pa_stream_state_t state = WRAP(pa_stream_get_state)(stream); + if (!PA_STREAM_IS_GOOD(state)) + return -1; + if (state == PA_STREAM_READY) + break; + WRAP(pa_threaded_mainloop_wait)(mainloop); + } + return 0; +} + +static int +wait_until_stream_ready(cubeb_stream * stm) +{ + if (stm->output_stream && + wait_until_io_stream_ready(stm->output_stream, stm->context->mainloop) == + -1) { + return -1; + } + if (stm->input_stream && + wait_until_io_stream_ready(stm->input_stream, stm->context->mainloop) == + -1) { + return -1; + } + return 0; +} + +static int +operation_wait(cubeb * ctx, pa_stream * stream, pa_operation * o) +{ + while (WRAP(pa_operation_get_state)(o) == PA_OPERATION_RUNNING) { + WRAP(pa_threaded_mainloop_wait)(ctx->mainloop); + if (!PA_CONTEXT_IS_GOOD(WRAP(pa_context_get_state)(ctx->context))) { + return -1; + } + if (stream && !PA_STREAM_IS_GOOD(WRAP(pa_stream_get_state)(stream))) { + return -1; + } + } + return 0; +} + +static void +cork_io_stream(cubeb_stream * stm, pa_stream * io_stream, enum cork_state state) +{ + pa_operation * o; + if (!io_stream) { + return; + } + o = WRAP(pa_stream_cork)(io_stream, state & CORK, stream_success_callback, + stm); + if (o) { + operation_wait(stm->context, io_stream, o); + WRAP(pa_operation_unref)(o); + } +} + +static void +stream_cork(cubeb_stream * stm, enum cork_state state) +{ + WRAP(pa_threaded_mainloop_lock)(stm->context->mainloop); + cork_io_stream(stm, stm->output_stream, state); + cork_io_stream(stm, stm->input_stream, state); + WRAP(pa_threaded_mainloop_unlock)(stm->context->mainloop); + + if (state & NOTIFY) { + stream_state_change_callback(stm, state & CORK ? CUBEB_STATE_STOPPED + : CUBEB_STATE_STARTED); + } +} + +static int +stream_update_timing_info(cubeb_stream * stm) +{ + int r = -1; + pa_operation * o = NULL; + if (stm->output_stream) { + o = WRAP(pa_stream_update_timing_info)(stm->output_stream, + stream_success_callback, stm); + if (o) { + r = operation_wait(stm->context, stm->output_stream, o); + WRAP(pa_operation_unref)(o); + } + if (r != 0) { + return r; + } + } + + if (stm->input_stream) { + o = WRAP(pa_stream_update_timing_info)(stm->input_stream, + stream_success_callback, stm); + if (o) { + r = operation_wait(stm->context, stm->input_stream, o); + WRAP(pa_operation_unref)(o); + } + } + + return r; +} + +static pa_channel_position_t +cubeb_channel_to_pa_channel(cubeb_channel channel) +{ + switch (channel) { + case CHANNEL_FRONT_LEFT: + return PA_CHANNEL_POSITION_FRONT_LEFT; + case CHANNEL_FRONT_RIGHT: + return PA_CHANNEL_POSITION_FRONT_RIGHT; + case CHANNEL_FRONT_CENTER: + return PA_CHANNEL_POSITION_FRONT_CENTER; + case CHANNEL_LOW_FREQUENCY: + return PA_CHANNEL_POSITION_LFE; + case CHANNEL_BACK_LEFT: + return PA_CHANNEL_POSITION_REAR_LEFT; + case CHANNEL_BACK_RIGHT: + return PA_CHANNEL_POSITION_REAR_RIGHT; + case CHANNEL_FRONT_LEFT_OF_CENTER: + return PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER; + case CHANNEL_FRONT_RIGHT_OF_CENTER: + return PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER; + case CHANNEL_BACK_CENTER: + return PA_CHANNEL_POSITION_REAR_CENTER; + case CHANNEL_SIDE_LEFT: + return PA_CHANNEL_POSITION_SIDE_LEFT; + case CHANNEL_SIDE_RIGHT: + return PA_CHANNEL_POSITION_SIDE_RIGHT; + case CHANNEL_TOP_CENTER: + return PA_CHANNEL_POSITION_TOP_CENTER; + case CHANNEL_TOP_FRONT_LEFT: + return PA_CHANNEL_POSITION_TOP_FRONT_LEFT; + case CHANNEL_TOP_FRONT_CENTER: + return PA_CHANNEL_POSITION_TOP_FRONT_CENTER; + case CHANNEL_TOP_FRONT_RIGHT: + return PA_CHANNEL_POSITION_TOP_FRONT_RIGHT; + case CHANNEL_TOP_BACK_LEFT: + return PA_CHANNEL_POSITION_TOP_REAR_LEFT; + case CHANNEL_TOP_BACK_CENTER: + return PA_CHANNEL_POSITION_TOP_REAR_CENTER; + case CHANNEL_TOP_BACK_RIGHT: + return PA_CHANNEL_POSITION_TOP_REAR_RIGHT; + default: + return PA_CHANNEL_POSITION_INVALID; + } +} + +static void +layout_to_channel_map(cubeb_channel_layout layout, pa_channel_map * cm) +{ + assert(cm && layout != CUBEB_LAYOUT_UNDEFINED); + + WRAP(pa_channel_map_init)(cm); + + uint32_t channels = 0; + cubeb_channel_layout channelMap = layout; + for (uint32_t i = 0; channelMap != 0; ++i) { + uint32_t channel = (channelMap & 1) << i; + if (channel != 0) { + cm->map[channels] = cubeb_channel_to_pa_channel(channel); + channels++; + } + channelMap = channelMap >> 1; + } + unsigned int channels_from_layout = cubeb_channel_layout_nb_channels(layout); + assert(channels_from_layout <= UINT8_MAX); + cm->channels = (uint8_t)channels_from_layout; + + // Special case single channel center mapping as mono. + if (cm->channels == 1 && cm->map[0] == PA_CHANNEL_POSITION_FRONT_CENTER) { + cm->map[0] = PA_CHANNEL_POSITION_MONO; + } +} + +static void +pulse_context_destroy(cubeb * ctx); +static void +pulse_destroy(cubeb * ctx); + +static int +pulse_context_init(cubeb * ctx) +{ + int r; + + if (ctx->context) { + assert(ctx->error == 1); + pulse_context_destroy(ctx); + } + + ctx->context = WRAP(pa_context_new)( + WRAP(pa_threaded_mainloop_get_api)(ctx->mainloop), ctx->context_name); + if (!ctx->context) { + return -1; + } + WRAP(pa_context_set_state_callback) + (ctx->context, context_state_callback, ctx); + + WRAP(pa_threaded_mainloop_lock)(ctx->mainloop); + r = WRAP(pa_context_connect)(ctx->context, NULL, 0, NULL); + + if (r < 0 || wait_until_context_ready(ctx) != 0) { + WRAP(pa_threaded_mainloop_unlock)(ctx->mainloop); + pulse_context_destroy(ctx); + ctx->context = NULL; + return -1; + } + + WRAP(pa_threaded_mainloop_unlock)(ctx->mainloop); + + ctx->error = 0; + + return 0; +} + +static int +pulse_subscribe_notifications(cubeb * context, pa_subscription_mask_t mask); + +/*static*/ int +pulse_init(cubeb ** context, char const * context_name) +{ + void * libpulse = NULL; + cubeb * ctx; + pa_operation * o; + + *context = NULL; + +#ifndef DISABLE_LIBPULSE_DLOPEN + libpulse = dlopen("libpulse.so.0", RTLD_LAZY); + if (!libpulse) { + libpulse = dlopen("libpulse.so", RTLD_LAZY); + if (!libpulse) { + return CUBEB_ERROR; + } + } + +#define LOAD(x) \ + { \ + cubeb_##x = dlsym(libpulse, #x); \ + if (!cubeb_##x) { \ + dlclose(libpulse); \ + return CUBEB_ERROR; \ + } \ + } + + LIBPULSE_API_VISIT(LOAD); +#undef LOAD +#endif + +#if PA_CHECK_VERSION(2, 0, 0) + const char * version = WRAP(pa_get_library_version)(); + has_pulse_v2 = strtol(version, NULL, 10) >= 2; +#endif + + ctx = calloc(1, sizeof(*ctx)); + assert(ctx); + + ctx->ops = &pulse_ops; + ctx->libpulse = libpulse; + if (cubeb_strings_init(&ctx->device_ids) != CUBEB_OK) { + pulse_destroy(ctx); + return CUBEB_ERROR; + } + + ctx->mainloop = WRAP(pa_threaded_mainloop_new)(); + ctx->default_sink_info = NULL; + + WRAP(pa_threaded_mainloop_start)(ctx->mainloop); + + ctx->context_name = context_name ? strdup(context_name) : NULL; + if (pulse_context_init(ctx) != 0) { + pulse_destroy(ctx); + return CUBEB_ERROR; + } + + /* server_info_callback performs a second async query, which is + responsible for initializing default_sink_info and signalling the + mainloop to end the wait. */ + WRAP(pa_threaded_mainloop_lock)(ctx->mainloop); + o = WRAP(pa_context_get_server_info)(ctx->context, server_info_callback, ctx); + if (o) { + operation_wait(ctx, NULL, o); + WRAP(pa_operation_unref)(o); + } + WRAP(pa_threaded_mainloop_unlock)(ctx->mainloop); + + /* Update `default_sink_info` when the default device changes. */ + pulse_subscribe_notifications(ctx, PA_SUBSCRIPTION_MASK_SERVER); + + *context = ctx; + + return CUBEB_OK; +} + +static char const * +pulse_get_backend_id(cubeb * ctx) +{ + (void)ctx; + return "pulse"; +} + +static int +pulse_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + (void)ctx; + assert(ctx && max_channels); + + if (!ctx->default_sink_info) + return CUBEB_ERROR; + + *max_channels = ctx->default_sink_info->channel_map.channels; + + return CUBEB_OK; +} + +static int +pulse_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) +{ + assert(ctx && rate); + (void)ctx; + + if (!ctx->default_sink_info) + return CUBEB_ERROR; + + *rate = ctx->default_sink_info->sample_spec_rate; + + return CUBEB_OK; +} + +static int +pulse_get_min_latency(cubeb * ctx, cubeb_stream_params params, + uint32_t * latency_frames) +{ + (void)ctx; + // According to PulseAudio developers, this is a safe minimum. + *latency_frames = 25 * params.rate / 1000; + + return CUBEB_OK; +} + +static void +pulse_context_destroy(cubeb * ctx) +{ + pa_operation * o; + + WRAP(pa_threaded_mainloop_lock)(ctx->mainloop); + o = WRAP(pa_context_drain)(ctx->context, context_notify_callback, ctx); + if (o) { + operation_wait(ctx, NULL, o); + WRAP(pa_operation_unref)(o); + } + WRAP(pa_context_set_state_callback)(ctx->context, NULL, NULL); + WRAP(pa_context_disconnect)(ctx->context); + WRAP(pa_context_unref)(ctx->context); + WRAP(pa_threaded_mainloop_unlock)(ctx->mainloop); +} + +static void +pulse_destroy(cubeb * ctx) +{ + assert(!ctx->input_collection_changed_callback && + !ctx->input_collection_changed_user_ptr && + !ctx->output_collection_changed_callback && + !ctx->output_collection_changed_user_ptr); + free(ctx->context_name); + if (ctx->context) { + pulse_context_destroy(ctx); + } + + if (ctx->mainloop) { + WRAP(pa_threaded_mainloop_stop)(ctx->mainloop); + WRAP(pa_threaded_mainloop_free)(ctx->mainloop); + } + + if (ctx->device_ids) { + cubeb_strings_destroy(ctx->device_ids); + } +#ifndef DISABLE_LIBPULSE_DLOPEN + if (ctx->libpulse) { + dlclose(ctx->libpulse); + } +#endif + free(ctx->default_sink_info); + free(ctx); +} + +static void +pulse_stream_destroy(cubeb_stream * stm); + +static pa_sample_format_t +to_pulse_format(cubeb_sample_format format) +{ + switch (format) { + case CUBEB_SAMPLE_S16LE: + return PA_SAMPLE_S16LE; + case CUBEB_SAMPLE_S16BE: + return PA_SAMPLE_S16BE; + case CUBEB_SAMPLE_FLOAT32LE: + return PA_SAMPLE_FLOAT32LE; + case CUBEB_SAMPLE_FLOAT32BE: + return PA_SAMPLE_FLOAT32BE; + default: + return PA_SAMPLE_INVALID; + } +} + +static cubeb_channel_layout +pulse_default_layout_for_channels(uint32_t ch) +{ + assert(ch > 0 && ch <= 8); + switch (ch) { + case 1: + return CUBEB_LAYOUT_MONO; + case 2: + return CUBEB_LAYOUT_STEREO; + case 3: + return CUBEB_LAYOUT_3F; + case 4: + return CUBEB_LAYOUT_QUAD; + case 5: + return CUBEB_LAYOUT_3F2; + case 6: + return CUBEB_LAYOUT_3F_LFE | CHANNEL_SIDE_LEFT | CHANNEL_SIDE_RIGHT; + case 7: + return CUBEB_LAYOUT_3F3R_LFE; + case 8: + return CUBEB_LAYOUT_3F4_LFE; + } + // Never get here! + return CUBEB_LAYOUT_UNDEFINED; +} + +static int +create_pa_stream(cubeb_stream * stm, pa_stream ** pa_stm, + cubeb_stream_params * stream_params, char const * stream_name) +{ + assert(stm && stream_params); + assert(&stm->input_stream == pa_stm || + (&stm->output_stream == pa_stm && + (stream_params->layout == CUBEB_LAYOUT_UNDEFINED || + (stream_params->layout != CUBEB_LAYOUT_UNDEFINED && + cubeb_channel_layout_nb_channels(stream_params->layout) == + stream_params->channels)))); + if (stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + *pa_stm = NULL; + pa_sample_spec ss; + ss.format = to_pulse_format(stream_params->format); + if (ss.format == PA_SAMPLE_INVALID) + return CUBEB_ERROR_INVALID_FORMAT; + ss.rate = stream_params->rate; + if (stream_params->channels > UINT8_MAX) + return CUBEB_ERROR_INVALID_FORMAT; + ss.channels = (uint8_t)stream_params->channels; + + if (stream_params->layout == CUBEB_LAYOUT_UNDEFINED) { + pa_channel_map cm; + if (stream_params->channels <= 8 && + !WRAP(pa_channel_map_init_auto)(&cm, stream_params->channels, + PA_CHANNEL_MAP_DEFAULT)) { + LOG("Layout undefined and PulseAudio's default layout has not been " + "configured, guess one."); + layout_to_channel_map( + pulse_default_layout_for_channels(stream_params->channels), &cm); + *pa_stm = + WRAP(pa_stream_new)(stm->context->context, stream_name, &ss, &cm); + } else { + LOG("Layout undefined, PulseAudio will use its default."); + *pa_stm = + WRAP(pa_stream_new)(stm->context->context, stream_name, &ss, NULL); + } + } else { + pa_channel_map cm; + layout_to_channel_map(stream_params->layout, &cm); + *pa_stm = WRAP(pa_stream_new)(stm->context->context, stream_name, &ss, &cm); + } + return (*pa_stm == NULL) ? CUBEB_ERROR : CUBEB_OK; +} + +static pa_buffer_attr +set_buffering_attribute(unsigned int latency_frames, + pa_sample_spec * sample_spec) +{ + pa_buffer_attr battr; + battr.maxlength = -1; + battr.prebuf = -1; + battr.tlength = latency_frames * WRAP(pa_frame_size)(sample_spec); + battr.minreq = battr.tlength / 4; + battr.fragsize = battr.minreq; + + LOG("Requested buffer attributes maxlength %u, tlength %u, prebuf %u, minreq " + "%u, fragsize %u", + battr.maxlength, battr.tlength, battr.prebuf, battr.minreq, + battr.fragsize); + + return battr; +} + +static int +pulse_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + cubeb_stream * stm; + pa_buffer_attr battr; + int r; + + assert(context); + + // If the connection failed for some reason, try to reconnect + if (context->error == 1 && pulse_context_init(context) != 0) { + return CUBEB_ERROR; + } + + *stream = NULL; + + stm = calloc(1, sizeof(*stm)); + assert(stm); + + stm->context = context; + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->user_ptr = user_ptr; + stm->volume = PULSE_NO_GAIN; + stm->state = -1; + assert(stm->shutdown == 0); + + WRAP(pa_threaded_mainloop_lock)(stm->context->mainloop); + if (output_stream_params) { + r = create_pa_stream(stm, &stm->output_stream, output_stream_params, + stream_name); + if (r != CUBEB_OK) { + WRAP(pa_threaded_mainloop_unlock)(stm->context->mainloop); + pulse_stream_destroy(stm); + return r; + } + + stm->output_sample_spec = + *(WRAP(pa_stream_get_sample_spec)(stm->output_stream)); + + WRAP(pa_stream_set_state_callback) + (stm->output_stream, stream_state_callback, stm); + WRAP(pa_stream_set_write_callback) + (stm->output_stream, stream_write_callback, stm); + + battr = set_buffering_attribute(latency_frames, &stm->output_sample_spec); + WRAP(pa_stream_connect_playback) + (stm->output_stream, (char const *)output_device, &battr, + PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_INTERPOLATE_TIMING | + PA_STREAM_START_CORKED | PA_STREAM_ADJUST_LATENCY, + NULL, NULL); + } + + // Set up input stream + if (input_stream_params) { + r = create_pa_stream(stm, &stm->input_stream, input_stream_params, + stream_name); + if (r != CUBEB_OK) { + WRAP(pa_threaded_mainloop_unlock)(stm->context->mainloop); + pulse_stream_destroy(stm); + return r; + } + + stm->input_sample_spec = + *(WRAP(pa_stream_get_sample_spec)(stm->input_stream)); + + WRAP(pa_stream_set_state_callback) + (stm->input_stream, stream_state_callback, stm); + WRAP(pa_stream_set_read_callback) + (stm->input_stream, stream_read_callback, stm); + + battr = set_buffering_attribute(latency_frames, &stm->input_sample_spec); + WRAP(pa_stream_connect_record) + (stm->input_stream, (char const *)input_device, &battr, + PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_INTERPOLATE_TIMING | + PA_STREAM_START_CORKED | PA_STREAM_ADJUST_LATENCY); + } + + r = wait_until_stream_ready(stm); + if (r == 0) { + /* force a timing update now, otherwise timing info does not become valid + until some point after initialization has completed. */ + r = stream_update_timing_info(stm); + } + + WRAP(pa_threaded_mainloop_unlock)(stm->context->mainloop); + + if (r != 0) { + pulse_stream_destroy(stm); + return CUBEB_ERROR; + } + + if (cubeb_log_get_level()) { + if (output_stream_params) { + const pa_buffer_attr * output_att; + output_att = WRAP(pa_stream_get_buffer_attr)(stm->output_stream); + LOG("Output buffer attributes maxlength %u, tlength %u, prebuf %u, " + "minreq %u, fragsize %u", + output_att->maxlength, output_att->tlength, output_att->prebuf, + output_att->minreq, output_att->fragsize); + } + + if (input_stream_params) { + const pa_buffer_attr * input_att; + input_att = WRAP(pa_stream_get_buffer_attr)(stm->input_stream); + LOG("Input buffer attributes maxlength %u, tlength %u, prebuf %u, minreq " + "%u, fragsize %u", + input_att->maxlength, input_att->tlength, input_att->prebuf, + input_att->minreq, input_att->fragsize); + } + } + + *stream = stm; + LOG("Cubeb stream (%p) init successful.", *stream); + + return CUBEB_OK; +} + +static void +pulse_stream_destroy(cubeb_stream * stm) +{ + stream_cork(stm, CORK); + + WRAP(pa_threaded_mainloop_lock)(stm->context->mainloop); + if (stm->output_stream) { + + if (stm->drain_timer) { + /* there's no pa_rttime_free, so use this instead. */ + WRAP(pa_threaded_mainloop_get_api) + (stm->context->mainloop)->time_free(stm->drain_timer); + } + + WRAP(pa_stream_set_state_callback)(stm->output_stream, NULL, NULL); + WRAP(pa_stream_set_write_callback)(stm->output_stream, NULL, NULL); + WRAP(pa_stream_disconnect)(stm->output_stream); + WRAP(pa_stream_unref)(stm->output_stream); + } + + if (stm->input_stream) { + WRAP(pa_stream_set_state_callback)(stm->input_stream, NULL, NULL); + WRAP(pa_stream_set_read_callback)(stm->input_stream, NULL, NULL); + WRAP(pa_stream_disconnect)(stm->input_stream); + WRAP(pa_stream_unref)(stm->input_stream); + } + WRAP(pa_threaded_mainloop_unlock)(stm->context->mainloop); + + LOG("Cubeb stream (%p) destroyed successfully.", stm); + free(stm); +} + +static void +pulse_defer_event_cb(pa_mainloop_api * a, void * userdata) +{ + (void)a; + cubeb_stream * stm = userdata; + if (stm->shutdown) { + return; + } + size_t writable_size = WRAP(pa_stream_writable_size)(stm->output_stream); + trigger_user_callback(stm->output_stream, NULL, writable_size, stm); +} + +static int +pulse_stream_start(cubeb_stream * stm) +{ + stm->shutdown = 0; + stream_cork(stm, UNCORK | NOTIFY); + + if (stm->output_stream && !stm->input_stream) { + /* On output only case need to manually call user cb once in order to make + * things roll. This is done via a defer event in order to execute it + * from PA server thread. */ + WRAP(pa_threaded_mainloop_lock)(stm->context->mainloop); + WRAP(pa_mainloop_api_once) + (WRAP(pa_threaded_mainloop_get_api)(stm->context->mainloop), + pulse_defer_event_cb, stm); + WRAP(pa_threaded_mainloop_unlock)(stm->context->mainloop); + } + + LOG("Cubeb stream (%p) started successfully.", stm); + return CUBEB_OK; +} + +static int +pulse_stream_stop(cubeb_stream * stm) +{ + WRAP(pa_threaded_mainloop_lock)(stm->context->mainloop); + stm->shutdown = 1; + // If draining is taking place wait to finish + while (stm->drain_timer) { + WRAP(pa_threaded_mainloop_wait)(stm->context->mainloop); + } + WRAP(pa_threaded_mainloop_unlock)(stm->context->mainloop); + + stream_cork(stm, CORK | NOTIFY); + LOG("Cubeb stream (%p) stopped successfully.", stm); + return CUBEB_OK; +} + +static int +pulse_stream_get_position(cubeb_stream * stm, uint64_t * position) +{ + int r, in_thread; + pa_usec_t r_usec; + uint64_t bytes; + + if (!stm || !stm->output_stream) { + return CUBEB_ERROR; + } + + in_thread = WRAP(pa_threaded_mainloop_in_thread)(stm->context->mainloop); + + if (!in_thread) { + WRAP(pa_threaded_mainloop_lock)(stm->context->mainloop); + } + r = WRAP(pa_stream_get_time)(stm->output_stream, &r_usec); + if (!in_thread) { + WRAP(pa_threaded_mainloop_unlock)(stm->context->mainloop); + } + + if (r != 0) { + return CUBEB_ERROR; + } + + bytes = WRAP(pa_usec_to_bytes)(r_usec, &stm->output_sample_spec); + *position = bytes / WRAP(pa_frame_size)(&stm->output_sample_spec); + + return CUBEB_OK; +} + +static int +pulse_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +{ + pa_usec_t r_usec; + int negative, r; + + if (!stm || !stm->output_stream) { + return CUBEB_ERROR; + } + + r = WRAP(pa_stream_get_latency)(stm->output_stream, &r_usec, &negative); + assert(!negative); + if (r) { + return CUBEB_ERROR; + } + + *latency = r_usec * stm->output_sample_spec.rate / PA_USEC_PER_SEC; + return CUBEB_OK; +} + +static void +volume_success(pa_context * c, int success, void * userdata) +{ + (void)success; + (void)c; + cubeb_stream * stream = userdata; + assert(success); + WRAP(pa_threaded_mainloop_signal)(stream->context->mainloop, 0); +} + +static void +rename_success(pa_stream * s, int success, void * userdata) +{ + cubeb_stream * stream = userdata; + assert(success); + WRAP(pa_threaded_mainloop_signal)(stream->context->mainloop, 0); +} + +static int +pulse_stream_set_volume(cubeb_stream * stm, float volume) +{ + uint32_t index; + pa_operation * op; + pa_volume_t vol; + pa_cvolume cvol; + const pa_sample_spec * ss; + cubeb * ctx; + + if (!stm->output_stream) { + return CUBEB_ERROR; + } + + WRAP(pa_threaded_mainloop_lock)(stm->context->mainloop); + + /* if the pulse daemon is configured to use flat volumes, + * apply our own gain instead of changing the input volume on the sink. */ + ctx = stm->context; + if (ctx->default_sink_info && + (ctx->default_sink_info->flags & PA_SINK_FLAT_VOLUME)) { + stm->volume = volume; + } else { + ss = WRAP(pa_stream_get_sample_spec)(stm->output_stream); + + vol = WRAP(pa_sw_volume_from_linear)(volume); + WRAP(pa_cvolume_set)(&cvol, ss->channels, vol); + + index = WRAP(pa_stream_get_index)(stm->output_stream); + + op = WRAP(pa_context_set_sink_input_volume)(ctx->context, index, &cvol, + volume_success, stm); + if (op) { + operation_wait(ctx, stm->output_stream, op); + WRAP(pa_operation_unref)(op); + } + } + + WRAP(pa_threaded_mainloop_unlock)(ctx->mainloop); + + return CUBEB_OK; +} + +static int +pulse_stream_set_name(cubeb_stream * stm, char const * stream_name) +{ + if (!stm || !stm->output_stream) { + return CUBEB_ERROR; + } + + WRAP(pa_threaded_mainloop_lock)(stm->context->mainloop); + + pa_operation * op = WRAP(pa_stream_set_name)(stm->output_stream, stream_name, + rename_success, stm); + + if (op) { + operation_wait(stm->context, stm->output_stream, op); + WRAP(pa_operation_unref)(op); + } + + WRAP(pa_threaded_mainloop_unlock)(stm->context->mainloop); + + return CUBEB_OK; +} + +typedef struct { + char * default_sink_name; + char * default_source_name; + + cubeb_device_info * devinfo; + uint32_t max; + uint32_t count; + cubeb * context; +} pulse_dev_list_data; + +static cubeb_device_fmt +pulse_format_to_cubeb_format(pa_sample_format_t format) +{ + switch (format) { + case PA_SAMPLE_S16LE: + return CUBEB_DEVICE_FMT_S16LE; + case PA_SAMPLE_S16BE: + return CUBEB_DEVICE_FMT_S16BE; + case PA_SAMPLE_FLOAT32LE: + return CUBEB_DEVICE_FMT_F32LE; + case PA_SAMPLE_FLOAT32BE: + return CUBEB_DEVICE_FMT_F32BE; + default: + return CUBEB_DEVICE_FMT_F32NE; + } +} + +static void +pulse_ensure_dev_list_data_list_size(pulse_dev_list_data * list_data) +{ + if (list_data->count == list_data->max) { + list_data->max += 8; + list_data->devinfo = + realloc(list_data->devinfo, sizeof(cubeb_device_info) * list_data->max); + } +} + +static cubeb_device_state +pulse_get_state_from_sink_port(pa_sink_port_info * info) +{ + if (info != NULL) { +#if PA_CHECK_VERSION(2, 0, 0) + if (has_pulse_v2 && info->available == PA_PORT_AVAILABLE_NO) + return CUBEB_DEVICE_STATE_UNPLUGGED; + else /*if (info->available == PA_PORT_AVAILABLE_YES) + UNKNOWN */ +#endif + return CUBEB_DEVICE_STATE_ENABLED; + } + + return CUBEB_DEVICE_STATE_ENABLED; +} + +static void +pulse_sink_info_cb(pa_context * context, const pa_sink_info * info, int eol, + void * user_data) +{ + pulse_dev_list_data * list_data = user_data; + cubeb_device_info * devinfo; + char const * prop = NULL; + char const * device_id = NULL; + + (void)context; + + if (eol) { + WRAP(pa_threaded_mainloop_signal)(list_data->context->mainloop, 0); + return; + } + + if (info == NULL) + return; + + device_id = info->name; + if (intern_device_id(list_data->context, &device_id) != CUBEB_OK) { + assert(NULL); + return; + } + + pulse_ensure_dev_list_data_list_size(list_data); + devinfo = &list_data->devinfo[list_data->count]; + memset(devinfo, 0, sizeof(cubeb_device_info)); + + devinfo->device_id = device_id; + devinfo->devid = (cubeb_devid)devinfo->device_id; + devinfo->friendly_name = strdup(info->description); + prop = WRAP(pa_proplist_gets)(info->proplist, "sysfs.path"); + if (prop) + devinfo->group_id = strdup(prop); + prop = WRAP(pa_proplist_gets)(info->proplist, "device.vendor.name"); + if (prop) + devinfo->vendor_name = strdup(prop); + + devinfo->type = CUBEB_DEVICE_TYPE_OUTPUT; + devinfo->state = pulse_get_state_from_sink_port(info->active_port); + devinfo->preferred = (strcmp(info->name, list_data->default_sink_name) == 0) + ? CUBEB_DEVICE_PREF_ALL + : CUBEB_DEVICE_PREF_NONE; + + devinfo->format = CUBEB_DEVICE_FMT_ALL; + devinfo->default_format = + pulse_format_to_cubeb_format(info->sample_spec.format); + devinfo->max_channels = info->channel_map.channels; + devinfo->min_rate = 1; + devinfo->max_rate = PA_RATE_MAX; + devinfo->default_rate = info->sample_spec.rate; + + devinfo->latency_lo = 0; + devinfo->latency_hi = 0; + + list_data->count += 1; +} + +static cubeb_device_state +pulse_get_state_from_source_port(pa_source_port_info * info) +{ + if (info != NULL) { +#if PA_CHECK_VERSION(2, 0, 0) + if (has_pulse_v2 && info->available == PA_PORT_AVAILABLE_NO) + return CUBEB_DEVICE_STATE_UNPLUGGED; + else /*if (info->available == PA_PORT_AVAILABLE_YES) + UNKNOWN */ +#endif + return CUBEB_DEVICE_STATE_ENABLED; + } + + return CUBEB_DEVICE_STATE_ENABLED; +} + +static void +pulse_source_info_cb(pa_context * context, const pa_source_info * info, int eol, + void * user_data) +{ + pulse_dev_list_data * list_data = user_data; + cubeb_device_info * devinfo; + char const * prop = NULL; + char const * device_id = NULL; + + (void)context; + + if (eol) { + WRAP(pa_threaded_mainloop_signal)(list_data->context->mainloop, 0); + return; + } + + device_id = info->name; + if (intern_device_id(list_data->context, &device_id) != CUBEB_OK) { + assert(NULL); + return; + } + + pulse_ensure_dev_list_data_list_size(list_data); + devinfo = &list_data->devinfo[list_data->count]; + memset(devinfo, 0, sizeof(cubeb_device_info)); + + devinfo->device_id = device_id; + devinfo->devid = (cubeb_devid)devinfo->device_id; + devinfo->friendly_name = strdup(info->description); + prop = WRAP(pa_proplist_gets)(info->proplist, "sysfs.path"); + if (prop) + devinfo->group_id = strdup(prop); + prop = WRAP(pa_proplist_gets)(info->proplist, "device.vendor.name"); + if (prop) + devinfo->vendor_name = strdup(prop); + + devinfo->type = CUBEB_DEVICE_TYPE_INPUT; + devinfo->state = pulse_get_state_from_source_port(info->active_port); + devinfo->preferred = (strcmp(info->name, list_data->default_source_name) == 0) + ? CUBEB_DEVICE_PREF_ALL + : CUBEB_DEVICE_PREF_NONE; + + devinfo->format = CUBEB_DEVICE_FMT_ALL; + devinfo->default_format = + pulse_format_to_cubeb_format(info->sample_spec.format); + devinfo->max_channels = info->channel_map.channels; + devinfo->min_rate = 1; + devinfo->max_rate = PA_RATE_MAX; + devinfo->default_rate = info->sample_spec.rate; + + devinfo->latency_lo = 0; + devinfo->latency_hi = 0; + + list_data->count += 1; +} + +static void +pulse_server_info_cb(pa_context * c, const pa_server_info * i, void * userdata) +{ + pulse_dev_list_data * list_data = userdata; + + (void)c; + + free(list_data->default_sink_name); + free(list_data->default_source_name); + list_data->default_sink_name = + i->default_sink_name ? strdup(i->default_sink_name) : NULL; + list_data->default_source_name = + i->default_source_name ? strdup(i->default_source_name) : NULL; + + WRAP(pa_threaded_mainloop_signal)(list_data->context->mainloop, 0); +} + +static int +pulse_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection) +{ + pulse_dev_list_data user_data = {NULL, NULL, NULL, 0, 0, context}; + pa_operation * o; + + WRAP(pa_threaded_mainloop_lock)(context->mainloop); + + o = WRAP(pa_context_get_server_info)(context->context, pulse_server_info_cb, + &user_data); + if (o) { + operation_wait(context, NULL, o); + WRAP(pa_operation_unref)(o); + } + + if (type & CUBEB_DEVICE_TYPE_OUTPUT) { + o = WRAP(pa_context_get_sink_info_list)(context->context, + pulse_sink_info_cb, &user_data); + if (o) { + operation_wait(context, NULL, o); + WRAP(pa_operation_unref)(o); + } + } + + if (type & CUBEB_DEVICE_TYPE_INPUT) { + o = WRAP(pa_context_get_source_info_list)(context->context, + pulse_source_info_cb, &user_data); + if (o) { + operation_wait(context, NULL, o); + WRAP(pa_operation_unref)(o); + } + } + + WRAP(pa_threaded_mainloop_unlock)(context->mainloop); + + collection->device = user_data.devinfo; + collection->count = user_data.count; + + free(user_data.default_sink_name); + free(user_data.default_source_name); + return CUBEB_OK; +} + +static int +pulse_device_collection_destroy(cubeb * ctx, + cubeb_device_collection * collection) +{ + size_t n; + + for (n = 0; n < collection->count; n++) { + free((void *)collection->device[n].friendly_name); + free((void *)collection->device[n].vendor_name); + free((void *)collection->device[n].group_id); + } + + free(collection->device); + return CUBEB_OK; +} + +static int +pulse_stream_get_current_device(cubeb_stream * stm, + cubeb_device ** const device) +{ +#if PA_CHECK_VERSION(0, 9, 8) + *device = calloc(1, sizeof(cubeb_device)); + if (*device == NULL) + return CUBEB_ERROR; + + if (stm->input_stream) { + const char * name = WRAP(pa_stream_get_device_name)(stm->input_stream); + (*device)->input_name = (name == NULL) ? NULL : strdup(name); + } + + if (stm->output_stream) { + const char * name = WRAP(pa_stream_get_device_name)(stm->output_stream); + (*device)->output_name = (name == NULL) ? NULL : strdup(name); + } + + return CUBEB_OK; +#else + return CUBEB_ERROR_NOT_SUPPORTED; +#endif +} + +static int +pulse_stream_device_destroy(cubeb_stream * stream, cubeb_device * device) +{ + (void)stream; + free(device->input_name); + free(device->output_name); + free(device); + return CUBEB_OK; +} + +static void +pulse_subscribe_callback(pa_context * ctx, pa_subscription_event_type_t t, + uint32_t index, void * userdata) +{ + (void)ctx; + cubeb * context = userdata; + + switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { + case PA_SUBSCRIPTION_EVENT_SERVER: + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE) { + LOG("Server changed %d", index); + WRAP(pa_context_get_server_info) + (context->context, server_info_callback, context); + } + break; + case PA_SUBSCRIPTION_EVENT_SOURCE: + case PA_SUBSCRIPTION_EVENT_SINK: + + if (cubeb_log_get_level()) { + if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == + PA_SUBSCRIPTION_EVENT_SOURCE && + (t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == + PA_SUBSCRIPTION_EVENT_REMOVE) { + LOG("Removing source index %d", index); + } else if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == + PA_SUBSCRIPTION_EVENT_SOURCE && + (t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == + PA_SUBSCRIPTION_EVENT_NEW) { + LOG("Adding source index %d", index); + } + if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == + PA_SUBSCRIPTION_EVENT_SINK && + (t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == + PA_SUBSCRIPTION_EVENT_REMOVE) { + LOG("Removing sink index %d", index); + } else if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == + PA_SUBSCRIPTION_EVENT_SINK && + (t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == + PA_SUBSCRIPTION_EVENT_NEW) { + LOG("Adding sink index %d", index); + } + } + + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE || + (t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) { + if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == + PA_SUBSCRIPTION_EVENT_SOURCE) { + context->input_collection_changed_callback( + context, context->input_collection_changed_user_ptr); + } + if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == + PA_SUBSCRIPTION_EVENT_SINK) { + context->output_collection_changed_callback( + context, context->output_collection_changed_user_ptr); + } + } + break; + } +} + +static void +subscribe_success(pa_context * c, int success, void * userdata) +{ + (void)c; + cubeb * context = userdata; + assert(success); + WRAP(pa_threaded_mainloop_signal)(context->mainloop, 0); +} + +static int +pulse_subscribe_notifications(cubeb * context, pa_subscription_mask_t mask) +{ + WRAP(pa_threaded_mainloop_lock)(context->mainloop); + + WRAP(pa_context_set_subscribe_callback) + (context->context, pulse_subscribe_callback, context); + + pa_operation * o; + o = WRAP(pa_context_subscribe)(context->context, mask, subscribe_success, + context); + if (o == NULL) { + WRAP(pa_threaded_mainloop_unlock)(context->mainloop); + LOG("Context subscribe failed"); + return CUBEB_ERROR; + } + operation_wait(context, NULL, o); + WRAP(pa_operation_unref)(o); + + WRAP(pa_threaded_mainloop_unlock)(context->mainloop); + + return CUBEB_OK; +} + +static int +pulse_register_device_collection_changed( + cubeb * context, cubeb_device_type devtype, + cubeb_device_collection_changed_callback collection_changed_callback, + void * user_ptr) +{ + if (devtype & CUBEB_DEVICE_TYPE_INPUT) { + context->input_collection_changed_callback = collection_changed_callback; + context->input_collection_changed_user_ptr = user_ptr; + } + if (devtype & CUBEB_DEVICE_TYPE_OUTPUT) { + context->output_collection_changed_callback = collection_changed_callback; + context->output_collection_changed_user_ptr = user_ptr; + } + + pa_subscription_mask_t mask = PA_SUBSCRIPTION_MASK_NULL; + if (context->input_collection_changed_callback) { + /* Input added or removed */ + mask |= PA_SUBSCRIPTION_MASK_SOURCE; + } + if (context->output_collection_changed_callback) { + /* Output added or removed */ + mask |= PA_SUBSCRIPTION_MASK_SINK; + } + /* Default device changed, this is always registered in order to update the + * `default_sink_info` when the default device changes. */ + mask |= PA_SUBSCRIPTION_MASK_SERVER; + + return pulse_subscribe_notifications(context, mask); +} + +static struct cubeb_ops const pulse_ops = { + .init = pulse_init, + .get_backend_id = pulse_get_backend_id, + .get_max_channel_count = pulse_get_max_channel_count, + .get_min_latency = pulse_get_min_latency, + .get_preferred_sample_rate = pulse_get_preferred_sample_rate, + .enumerate_devices = pulse_enumerate_devices, + .device_collection_destroy = pulse_device_collection_destroy, + .destroy = pulse_destroy, + .stream_init = pulse_stream_init, + .stream_destroy = pulse_stream_destroy, + .stream_start = pulse_stream_start, + .stream_stop = pulse_stream_stop, + .stream_get_position = pulse_stream_get_position, + .stream_get_latency = pulse_stream_get_latency, + .stream_get_input_latency = NULL, + .stream_set_volume = pulse_stream_set_volume, + .stream_set_name = pulse_stream_set_name, + .stream_get_current_device = pulse_stream_get_current_device, + .stream_device_destroy = pulse_stream_device_destroy, + .stream_register_device_changed_callback = NULL, + .register_device_collection_changed = + pulse_register_device_collection_changed}; diff --git a/3rdparty/cubeb/src/cubeb_resampler.cpp b/3rdparty/cubeb/src/cubeb_resampler.cpp new file mode 100644 index 0000000000..c31944b826 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_resampler.cpp @@ -0,0 +1,373 @@ +/* + * Copyright © 2014 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#ifndef NOMINMAX +#define NOMINMAX +#endif // NOMINMAX + +#include "cubeb_resampler.h" +#include "cubeb-speex-resampler.h" +#include "cubeb_resampler_internal.h" +#include "cubeb_utils.h" +#include +#include +#include +#include +#include +#include + +int +to_speex_quality(cubeb_resampler_quality q) +{ + switch (q) { + case CUBEB_RESAMPLER_QUALITY_VOIP: + return SPEEX_RESAMPLER_QUALITY_VOIP; + case CUBEB_RESAMPLER_QUALITY_DEFAULT: + return SPEEX_RESAMPLER_QUALITY_DEFAULT; + case CUBEB_RESAMPLER_QUALITY_DESKTOP: + return SPEEX_RESAMPLER_QUALITY_DESKTOP; + default: + assert(false); + return 0XFFFFFFFF; + } +} + +uint32_t +min_buffered_audio_frame(uint32_t sample_rate) +{ + return sample_rate / 20; +} + +template +passthrough_resampler::passthrough_resampler(cubeb_stream * s, + cubeb_data_callback cb, + void * ptr, + uint32_t input_channels, + uint32_t sample_rate) + : processor(input_channels), stream(s), data_callback(cb), user_ptr(ptr), + sample_rate(sample_rate) +{ +} + +template +long +passthrough_resampler::fill(void * input_buffer, long * input_frames_count, + void * output_buffer, long output_frames) +{ + if (input_buffer) { + assert(input_frames_count); + } + assert((input_buffer && output_buffer) || + (output_buffer && !input_buffer && + (!input_frames_count || *input_frames_count == 0)) || + (input_buffer && !output_buffer && output_frames == 0)); + + // When we have no pending input data and exactly as much input + // as output data, we don't need to copy it into the internal buffer + // and can directly forward it to the callback. + void * in_buf = input_buffer; + unsigned long pop_input_count = 0u; + if (input_buffer && !output_buffer) { + output_frames = *input_frames_count; + } else if (input_buffer) { + if (internal_input_buffer.length() != 0 || + *input_frames_count < output_frames) { + // If we have pending input data left and have to first append the input + // so we can pass it as one pointer to the callback. Or this is a glitch. + // It can happen when system's performance is poor. Audible silence is + // being pushed at the end of the short input buffer. An improvement for + // the future is to resample to the output number of frames, when that + // happens. + internal_input_buffer.push(static_cast(input_buffer), + frames_to_samples(*input_frames_count)); + if (internal_input_buffer.length() < frames_to_samples(output_frames)) { + // This is unxpected but it can happen when a glitch occurs. Fill the + // buffer with silence. First keep the actual number of input samples + // used without the silence. + pop_input_count = internal_input_buffer.length(); + internal_input_buffer.push_silence(frames_to_samples(output_frames) - + internal_input_buffer.length()); + } else { + pop_input_count = frames_to_samples(output_frames); + } + in_buf = internal_input_buffer.data(); + } else if (*input_frames_count > output_frames) { + // In this case we have more input that we need output and + // fill the overflowing input into internal_input_buffer + // Since we have no other pending data, we can nonetheless + // pass the current input data directly to the callback + assert(pop_input_count == 0); + unsigned long samples_off = frames_to_samples(output_frames); + internal_input_buffer.push( + static_cast(input_buffer) + samples_off, + frames_to_samples(*input_frames_count - output_frames)); + } + } + + long rv = + data_callback(stream, user_ptr, in_buf, output_buffer, output_frames); + + if (input_buffer) { + if (pop_input_count) { + internal_input_buffer.pop(nullptr, pop_input_count); + *input_frames_count = samples_to_frames(pop_input_count); + } else { + *input_frames_count = output_frames; + } + drop_audio_if_needed(); + } + + return rv; +} + +// Explicit instantiation of template class. +template class passthrough_resampler; +template class passthrough_resampler; + +template +cubeb_resampler_speex:: + cubeb_resampler_speex(InputProcessor * input_processor, + OutputProcessor * output_processor, cubeb_stream * s, + cubeb_data_callback cb, void * ptr) + : input_processor(input_processor), output_processor(output_processor), + stream(s), data_callback(cb), user_ptr(ptr) +{ + if (input_processor && output_processor) { + fill_internal = &cubeb_resampler_speex::fill_internal_duplex; + } else if (input_processor) { + fill_internal = &cubeb_resampler_speex::fill_internal_input; + } else if (output_processor) { + fill_internal = &cubeb_resampler_speex::fill_internal_output; + } +} + +template +cubeb_resampler_speex::~cubeb_resampler_speex() +{ +} + +template +long +cubeb_resampler_speex::fill( + void * input_buffer, long * input_frames_count, void * output_buffer, + long output_frames_needed) +{ + /* Input and output buffers, typed */ + T * in_buffer = reinterpret_cast(input_buffer); + T * out_buffer = reinterpret_cast(output_buffer); + return (this->*fill_internal)(in_buffer, input_frames_count, out_buffer, + output_frames_needed); +} + +template +long +cubeb_resampler_speex::fill_internal_output( + T * input_buffer, long * input_frames_count, T * output_buffer, + long output_frames_needed) +{ + assert(!input_buffer && (!input_frames_count || *input_frames_count == 0) && + output_buffer && output_frames_needed); + + if (!draining) { + long got = 0; + T * out_unprocessed = nullptr; + long output_frames_before_processing = 0; + + /* fill directly the input buffer of the output processor to save a copy */ + output_frames_before_processing = + output_processor->input_needed_for_output(output_frames_needed); + + out_unprocessed = + output_processor->input_buffer(output_frames_before_processing); + + got = data_callback(stream, user_ptr, nullptr, out_unprocessed, + output_frames_before_processing); + + if (got < output_frames_before_processing) { + draining = true; + + if (got < 0) { + return got; + } + } + + output_processor->written(got); + } + + /* Process the output. If not enough frames have been returned from the + * callback, drain the processors. */ + return output_processor->output(output_buffer, output_frames_needed); +} + +template +long +cubeb_resampler_speex::fill_internal_input( + T * input_buffer, long * input_frames_count, T * output_buffer, + long /*output_frames_needed*/) +{ + assert(input_buffer && input_frames_count && *input_frames_count && + !output_buffer); + + /* The input data, after eventual resampling. This is passed to the callback. + */ + T * resampled_input = nullptr; + uint32_t resampled_frame_count = + input_processor->output_for_input(*input_frames_count); + + /* process the input, and present exactly `output_frames_needed` in the + * callback. */ + input_processor->input(input_buffer, *input_frames_count); + + /* resampled_frame_count == 0 happens if the resampler + * doesn't have enough input frames buffered to produce 1 resampled frame. */ + if (resampled_frame_count == 0) { + return *input_frames_count; + } + + size_t frames_resampled = 0; + resampled_input = + input_processor->output(resampled_frame_count, &frames_resampled); + *input_frames_count = frames_resampled; + + long got = data_callback(stream, user_ptr, resampled_input, nullptr, + resampled_frame_count); + + /* Return the number of initial input frames or part of it. + * Since output_frames_needed == 0 in input scenario, the only + * available number outside resampler is the initial number of frames. */ + return (*input_frames_count) * (got / resampled_frame_count); +} + +template +long +cubeb_resampler_speex::fill_internal_duplex( + T * in_buffer, long * input_frames_count, T * out_buffer, + long output_frames_needed) +{ + if (draining) { + // discard input and drain any signal remaining in the resampler. + return output_processor->output(out_buffer, output_frames_needed); + } + + /* The input data, after eventual resampling. This is passed to the callback. + */ + T * resampled_input = nullptr; + /* The output buffer passed down in the callback, that might be resampled. */ + T * out_unprocessed = nullptr; + long output_frames_before_processing = 0; + /* The number of frames returned from the callback. */ + long got = 0; + + /* We need to determine how much frames to present to the consumer. + * - If we have a two way stream, but we're only resampling input, we resample + * the input to the number of output frames. + * - If we have a two way stream, but we're only resampling the output, we + * resize the input buffer of the output resampler to the number of input + * frames, and we resample it afterwards. + * - If we resample both ways, we resample the input to the number of frames + * we would need to pass down to the consumer (before resampling the output), + * get the output data, and resample it to the number of frames needed by the + * caller. */ + + output_frames_before_processing = + output_processor->input_needed_for_output(output_frames_needed); + /* fill directly the input buffer of the output processor to save a copy */ + out_unprocessed = + output_processor->input_buffer(output_frames_before_processing); + + if (in_buffer) { + /* process the input, and present exactly `output_frames_needed` in the + * callback. */ + input_processor->input(in_buffer, *input_frames_count); + + size_t frames_resampled = 0; + resampled_input = input_processor->output(output_frames_before_processing, + &frames_resampled); + *input_frames_count = frames_resampled; + } else { + resampled_input = nullptr; + } + + got = data_callback(stream, user_ptr, resampled_input, out_unprocessed, + output_frames_before_processing); + + if (got < output_frames_before_processing) { + draining = true; + + if (got < 0) { + return got; + } + } + + output_processor->written(got); + + input_processor->drop_audio_if_needed(); + + /* Process the output. If not enough frames have been returned from the + * callback, drain the processors. */ + got = output_processor->output(out_buffer, output_frames_needed); + + output_processor->drop_audio_if_needed(); + + return got; +} + +/* Resampler C API */ + +cubeb_resampler * +cubeb_resampler_create(cubeb_stream * stream, + cubeb_stream_params * input_params, + cubeb_stream_params * output_params, + unsigned int target_rate, cubeb_data_callback callback, + void * user_ptr, cubeb_resampler_quality quality, + cubeb_resampler_reclock reclock) +{ + cubeb_sample_format format; + + assert(input_params || output_params); + + if (input_params) { + format = input_params->format; + } else { + format = output_params->format; + } + + switch (format) { + case CUBEB_SAMPLE_S16NE: + return cubeb_resampler_create_internal( + stream, input_params, output_params, target_rate, callback, user_ptr, + quality, reclock); + case CUBEB_SAMPLE_FLOAT32NE: + return cubeb_resampler_create_internal( + stream, input_params, output_params, target_rate, callback, user_ptr, + quality, reclock); + default: + assert(false); + return nullptr; + } +} + +long +cubeb_resampler_fill(cubeb_resampler * resampler, void * input_buffer, + long * input_frames_count, void * output_buffer, + long output_frames_needed) +{ + return resampler->fill(input_buffer, input_frames_count, output_buffer, + output_frames_needed); +} + +void +cubeb_resampler_destroy(cubeb_resampler * resampler) +{ + delete resampler; +} + +long +cubeb_resampler_latency(cubeb_resampler * resampler) +{ + return resampler->latency(); +} diff --git a/3rdparty/cubeb/src/cubeb_resampler.h b/3rdparty/cubeb/src/cubeb_resampler.h new file mode 100644 index 0000000000..711a3771d4 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_resampler.h @@ -0,0 +1,91 @@ +/* + * Copyright © 2014 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#ifndef CUBEB_RESAMPLER_H +#define CUBEB_RESAMPLER_H + +#include "cubeb/cubeb.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef struct cubeb_resampler cubeb_resampler; + +typedef enum { + CUBEB_RESAMPLER_QUALITY_VOIP, + CUBEB_RESAMPLER_QUALITY_DEFAULT, + CUBEB_RESAMPLER_QUALITY_DESKTOP +} cubeb_resampler_quality; + +typedef enum { + CUBEB_RESAMPLER_RECLOCK_NONE, + CUBEB_RESAMPLER_RECLOCK_INPUT +} cubeb_resampler_reclock; + +/** + * Create a resampler to adapt the requested sample rate into something that + * is accepted by the audio backend. + * @param stream A cubeb_stream instance supplied to the data callback. + * @param input_params Used to calculate bytes per frame and buffer size for + * resampling of the input side of the stream. NULL if input should not be + * resampled. + * @param output_params Used to calculate bytes per frame and buffer size for + * resampling of the output side of the stream. NULL if output should not be + * resampled. + * @param target_rate The sampling rate after resampling for the input side of + * the stream, and/or the sampling rate prior to resampling of the output side + * of the stream. + * @param callback A callback to request data for resampling. + * @param user_ptr User data supplied to the data callback. + * @param quality Quality of the resampler. + * @retval A non-null pointer if success. + */ +cubeb_resampler * +cubeb_resampler_create(cubeb_stream * stream, + cubeb_stream_params * input_params, + cubeb_stream_params * output_params, + unsigned int target_rate, cubeb_data_callback callback, + void * user_ptr, cubeb_resampler_quality quality, + cubeb_resampler_reclock reclock); + +/** + * Fill the buffer with frames acquired using the data callback. Resampling will + * happen if necessary. + * @param resampler A cubeb_resampler instance. + * @param input_buffer A buffer of input samples + * @param input_frame_count The size of the buffer. Returns the number of frames + * consumed. + * @param output_buffer The buffer to be filled. + * @param output_frames_needed Number of frames that should be produced. + * @retval Number of frames that are actually produced. + * @retval CUBEB_ERROR on error. + */ +long +cubeb_resampler_fill(cubeb_resampler * resampler, void * input_buffer, + long * input_frame_count, void * output_buffer, + long output_frames_needed); + +/** + * Destroy a cubeb_resampler. + * @param resampler A cubeb_resampler instance. + */ +void +cubeb_resampler_destroy(cubeb_resampler * resampler); + +/** + * Returns the latency, in frames, of the resampler. + * @param resampler A cubeb resampler instance. + * @retval The latency, in frames, induced by the resampler. + */ +long +cubeb_resampler_latency(cubeb_resampler * resampler); + +#if defined(__cplusplus) +} +#endif + +#endif /* CUBEB_RESAMPLER_H */ diff --git a/3rdparty/cubeb/src/cubeb_resampler_internal.h b/3rdparty/cubeb/src/cubeb_resampler_internal.h new file mode 100644 index 0000000000..285f24dd0b --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_resampler_internal.h @@ -0,0 +1,591 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#if !defined(CUBEB_RESAMPLER_INTERNAL) +#define CUBEB_RESAMPLER_INTERNAL + +#include +#include +#include +#include +#ifdef CUBEB_GECKO_BUILD +#include "mozilla/UniquePtr.h" +// In libc++, symbols such as std::unique_ptr may be defined in std::__1. +// The _LIBCPP_BEGIN_NAMESPACE_STD and _LIBCPP_END_NAMESPACE_STD macros +// will expand to the correct namespace. +#ifdef _LIBCPP_BEGIN_NAMESPACE_STD +#define MOZ_BEGIN_STD_NAMESPACE _LIBCPP_BEGIN_NAMESPACE_STD +#define MOZ_END_STD_NAMESPACE _LIBCPP_END_NAMESPACE_STD +#else +#define MOZ_BEGIN_STD_NAMESPACE namespace std { +#define MOZ_END_STD_NAMESPACE } +#endif +MOZ_BEGIN_STD_NAMESPACE +using mozilla::DefaultDelete; +using mozilla::UniquePtr; +#define default_delete DefaultDelete +#define unique_ptr UniquePtr +MOZ_END_STD_NAMESPACE +#endif +#include "cubeb-speex-resampler.h" +#include "cubeb/cubeb.h" +#include "cubeb_log.h" +#include "cubeb_resampler.h" +#include "cubeb_utils.h" +#include + +/* This header file contains the internal C++ API of the resamplers, for + * testing. */ + +// When dropping audio input frames to prevent building +// an input delay, this function returns the number of frames +// to keep in the buffer. +// @parameter sample_rate The sample rate of the stream. +// @return A number of frames to keep. +uint32_t +min_buffered_audio_frame(uint32_t sample_rate); + +int +to_speex_quality(cubeb_resampler_quality q); + +struct cubeb_resampler { + virtual long fill(void * input_buffer, long * input_frames_count, + void * output_buffer, long frames_needed) = 0; + virtual long latency() = 0; + virtual ~cubeb_resampler() {} +}; + +/** Base class for processors. This is just used to share methods for now. */ +class processor { +public: + explicit processor(uint32_t channels) : channels(channels) {} + +protected: + size_t frames_to_samples(size_t frames) const { return frames * channels; } + size_t samples_to_frames(size_t samples) const + { + assert(!(samples % channels)); + return samples / channels; + } + /** The number of channel of the audio buffers to be resampled. */ + const uint32_t channels; +}; + +template +class passthrough_resampler : public cubeb_resampler, public processor { +public: + passthrough_resampler(cubeb_stream * s, cubeb_data_callback cb, void * ptr, + uint32_t input_channels, uint32_t sample_rate); + + virtual long fill(void * input_buffer, long * input_frames_count, + void * output_buffer, long output_frames); + + virtual long latency() { return 0; } + + void drop_audio_if_needed() + { + uint32_t to_keep = min_buffered_audio_frame(sample_rate); + uint32_t available = samples_to_frames(internal_input_buffer.length()); + if (available > to_keep) { + ALOGV("Dropping %u frames", available - to_keep); + internal_input_buffer.pop(nullptr, + frames_to_samples(available - to_keep)); + } + } + +private: + cubeb_stream * const stream; + const cubeb_data_callback data_callback; + void * const user_ptr; + /* This allows to buffer some input to account for the fact that we buffer + * some inputs. */ + auto_array internal_input_buffer; + uint32_t sample_rate; +}; + +/** Bidirectional resampler, can resample an input and an output stream, or just + * an input stream or output stream. In this case a delay is inserted in the + * opposite direction to keep the streams synchronized. */ +template +class cubeb_resampler_speex : public cubeb_resampler { +public: + cubeb_resampler_speex(InputProcessing * input_processor, + OutputProcessing * output_processor, cubeb_stream * s, + cubeb_data_callback cb, void * ptr); + + virtual ~cubeb_resampler_speex(); + + virtual long fill(void * input_buffer, long * input_frames_count, + void * output_buffer, long output_frames_needed); + + virtual long latency() + { + if (input_processor && output_processor) { + assert(input_processor->latency() == output_processor->latency()); + return input_processor->latency(); + } else if (input_processor) { + return input_processor->latency(); + } else { + return output_processor->latency(); + } + } + +private: + typedef long (cubeb_resampler_speex::*processing_callback)( + T * input_buffer, long * input_frames_count, T * output_buffer, + long output_frames_needed); + + long fill_internal_duplex(T * input_buffer, long * input_frames_count, + T * output_buffer, long output_frames_needed); + long fill_internal_input(T * input_buffer, long * input_frames_count, + T * output_buffer, long output_frames_needed); + long fill_internal_output(T * input_buffer, long * input_frames_count, + T * output_buffer, long output_frames_needed); + + std::unique_ptr input_processor; + std::unique_ptr output_processor; + processing_callback fill_internal; + cubeb_stream * const stream; + const cubeb_data_callback data_callback; + void * const user_ptr; + bool draining = false; +}; + +/** Handles one way of a (possibly) duplex resampler, working on interleaved + * audio buffers of type T. This class is designed so that the number of frames + * coming out of the resampler can be precisely controled. It manages its own + * input buffer, and can use the caller's output buffer, or allocate its own. */ +template class cubeb_resampler_speex_one_way : public processor { +public: + /** The sample type of this resampler, either 16-bit integers or 32-bit + * floats. */ + typedef T sample_type; + /** Construct a resampler resampling from #source_rate to #target_rate, that + * can be arbitrary, strictly positive number. + * @parameter channels The number of channels this resampler will resample. + * @parameter source_rate The sample-rate of the audio input. + * @parameter target_rate The sample-rate of the audio output. + * @parameter quality A number between 0 (fast, low quality) and 10 (slow, + * high quality). */ + cubeb_resampler_speex_one_way(uint32_t channels, uint32_t source_rate, + uint32_t target_rate, int quality) + : processor(channels), + resampling_ratio(static_cast(source_rate) / target_rate), + source_rate(source_rate), additional_latency(0), leftover_samples(0) + { + int r; + speex_resampler = + speex_resampler_init(channels, source_rate, target_rate, quality, &r); + assert(r == RESAMPLER_ERR_SUCCESS && "resampler allocation failure"); + + uint32_t input_latency = speex_resampler_get_input_latency(speex_resampler); + const size_t LATENCY_SAMPLES = 8192; + T input_buffer[LATENCY_SAMPLES] = {}; + T output_buffer[LATENCY_SAMPLES] = {}; + uint32_t input_frame_count = input_latency; + uint32_t output_frame_count = LATENCY_SAMPLES; + assert(input_latency * channels <= LATENCY_SAMPLES); + speex_resample(input_buffer, &input_frame_count, output_buffer, + &output_frame_count); + } + + /** Destructor, deallocate the resampler */ + virtual ~cubeb_resampler_speex_one_way() + { + speex_resampler_destroy(speex_resampler); + } + + /* Fill the resampler with `input_frame_count` frames. */ + void input(T * input_buffer, size_t input_frame_count) + { + resampling_in_buffer.push(input_buffer, + frames_to_samples(input_frame_count)); + } + + /** Outputs exactly `output_frame_count` into `output_buffer`. + * `output_buffer` has to be at least `output_frame_count` long. */ + size_t output(T * output_buffer, size_t output_frame_count) + { + uint32_t in_len = samples_to_frames(resampling_in_buffer.length()); + uint32_t out_len = output_frame_count; + + speex_resample(resampling_in_buffer.data(), &in_len, output_buffer, + &out_len); + + /* This shifts back any unresampled samples to the beginning of the input + buffer. */ + resampling_in_buffer.pop(nullptr, frames_to_samples(in_len)); + + return out_len; + } + + size_t output_for_input(uint32_t input_frames) + { + return (size_t)floorf( + (input_frames + samples_to_frames(resampling_in_buffer.length())) / + resampling_ratio); + } + + /** Returns a buffer containing exactly `output_frame_count` resampled frames. + * The consumer should not hold onto the pointer. */ + T * output(size_t output_frame_count, size_t * input_frames_used) + { + if (resampling_out_buffer.capacity() < + frames_to_samples(output_frame_count)) { + resampling_out_buffer.reserve(frames_to_samples(output_frame_count)); + } + + uint32_t in_len = samples_to_frames(resampling_in_buffer.length()); + uint32_t out_len = output_frame_count; + + speex_resample(resampling_in_buffer.data(), &in_len, + resampling_out_buffer.data(), &out_len); + + if (out_len < output_frame_count) { + LOGV("underrun during resampling: got %u frames, expected %zu", + (unsigned)out_len, output_frame_count); + // silence the rightmost part + T * data = resampling_out_buffer.data(); + for (uint32_t i = frames_to_samples(out_len); + i < frames_to_samples(output_frame_count); i++) { + data[i] = 0; + } + } + + /* This shifts back any unresampled samples to the beginning of the input + buffer. */ + resampling_in_buffer.pop(nullptr, frames_to_samples(in_len)); + *input_frames_used = in_len; + + return resampling_out_buffer.data(); + } + + /** Get the latency of the resampler, in output frames. */ + uint32_t latency() const + { + /* The documentation of the resampler talks about "samples" here, but it + * only consider a single channel here so it's the same number of frames. */ + int latency = 0; + + latency = speex_resampler_get_output_latency(speex_resampler) + + additional_latency; + + assert(latency >= 0); + + return latency; + } + + /** Returns the number of frames to pass in the input of the resampler to have + * exactly `output_frame_count` resampled frames. This can return a number + * slightly bigger than what is strictly necessary, but it guaranteed that the + * number of output frames will be exactly equal. */ + uint32_t input_needed_for_output(int32_t output_frame_count) const + { + assert(output_frame_count >= 0); // Check overflow + int32_t unresampled_frames_left = + samples_to_frames(resampling_in_buffer.length()); + int32_t resampled_frames_left = + samples_to_frames(resampling_out_buffer.length()); + float input_frames_needed = + (output_frame_count - unresampled_frames_left) * resampling_ratio - + resampled_frames_left; + if (input_frames_needed < 0) { + return 0; + } + return (uint32_t)ceilf(input_frames_needed); + } + + /** Returns a pointer to the input buffer, that contains empty space for at + * least `frame_count` elements. This is useful so that consumer can directly + * write into the input buffer of the resampler. The pointer returned is + * adjusted so that leftover data are not overwritten. + */ + T * input_buffer(size_t frame_count) + { + leftover_samples = resampling_in_buffer.length(); + resampling_in_buffer.reserve(leftover_samples + + frames_to_samples(frame_count)); + return resampling_in_buffer.data() + leftover_samples; + } + + /** This method works with `input_buffer`, and allows to inform the processor + how much frames have been written in the provided buffer. */ + void written(size_t written_frames) + { + resampling_in_buffer.set_length(leftover_samples + + frames_to_samples(written_frames)); + } + + void drop_audio_if_needed() + { + // Keep at most 100ms buffered. + uint32_t available = samples_to_frames(resampling_in_buffer.length()); + uint32_t to_keep = min_buffered_audio_frame(source_rate); + if (available > to_keep) { + ALOGV("Dropping %u frames", available - to_keep); + resampling_in_buffer.pop(nullptr, frames_to_samples(available - to_keep)); + } + } + +private: + /** Wrapper for the speex resampling functions to have a typed + * interface. */ + void speex_resample(float * input_buffer, uint32_t * input_frame_count, + float * output_buffer, uint32_t * output_frame_count) + { +#ifndef NDEBUG + int rv; + rv = +#endif + speex_resampler_process_interleaved_float( + speex_resampler, input_buffer, input_frame_count, output_buffer, + output_frame_count); + assert(rv == RESAMPLER_ERR_SUCCESS); + } + + void speex_resample(short * input_buffer, uint32_t * input_frame_count, + short * output_buffer, uint32_t * output_frame_count) + { +#ifndef NDEBUG + int rv; + rv = +#endif + speex_resampler_process_interleaved_int( + speex_resampler, input_buffer, input_frame_count, output_buffer, + output_frame_count); + assert(rv == RESAMPLER_ERR_SUCCESS); + } + /** The state for the speex resampler used internaly. */ + SpeexResamplerState * speex_resampler; + /** Source rate / target rate. */ + const float resampling_ratio; + const uint32_t source_rate; + /** Storage for the input frames, to be resampled. Also contains + * any unresampled frames after resampling. */ + auto_array resampling_in_buffer; + /* Storage for the resampled frames, to be passed back to the caller. */ + auto_array resampling_out_buffer; + /** Additional latency inserted into the pipeline for synchronisation. */ + uint32_t additional_latency; + /** When `input_buffer` is called, this allows tracking the number of samples + that were in the buffer. */ + uint32_t leftover_samples; +}; + +/** This class allows delaying an audio stream by `frames` frames. */ +template class delay_line : public processor { +public: + /** Constructor + * @parameter frames the number of frames of delay. + * @parameter channels the number of channels of this delay line. + * @parameter sample_rate sample-rate of the audio going through this delay + * line */ + delay_line(uint32_t frames, uint32_t channels, uint32_t sample_rate) + : processor(channels), length(frames), leftover_samples(0), + sample_rate(sample_rate) + { + /* Fill the delay line with some silent frames to add latency. */ + delay_input_buffer.push_silence(frames * channels); + } + /** Push some frames into the delay line. + * @parameter buffer the frames to push. + * @parameter frame_count the number of frames in #buffer. */ + void input(T * buffer, uint32_t frame_count) + { + delay_input_buffer.push(buffer, frames_to_samples(frame_count)); + } + /** Pop some frames from the internal buffer, into a internal output buffer. + * @parameter frames_needed the number of frames to be returned. + * @return a buffer containing the delayed frames. The consumer should not + * hold onto the pointer. */ + T * output(uint32_t frames_needed, size_t * input_frames_used) + { + if (delay_output_buffer.capacity() < frames_to_samples(frames_needed)) { + delay_output_buffer.reserve(frames_to_samples(frames_needed)); + } + + delay_output_buffer.clear(); + delay_output_buffer.push(delay_input_buffer.data(), + frames_to_samples(frames_needed)); + delay_input_buffer.pop(nullptr, frames_to_samples(frames_needed)); + *input_frames_used = frames_needed; + + return delay_output_buffer.data(); + } + /** Get a pointer to the first writable location in the input buffer> + * @parameter frames_needed the number of frames the user needs to write into + * the buffer. + * @returns a pointer to a location in the input buffer where #frames_needed + * can be writen. */ + T * input_buffer(uint32_t frames_needed) + { + leftover_samples = delay_input_buffer.length(); + delay_input_buffer.reserve(leftover_samples + + frames_to_samples(frames_needed)); + return delay_input_buffer.data() + leftover_samples; + } + /** This method works with `input_buffer`, and allows to inform the processor + how much frames have been written in the provided buffer. */ + void written(size_t frames_written) + { + delay_input_buffer.set_length(leftover_samples + + frames_to_samples(frames_written)); + } + /** Drains the delay line, emptying the buffer. + * @parameter output_buffer the buffer in which the frames are written. + * @parameter frames_needed the maximum number of frames to write. + * @return the actual number of frames written. */ + size_t output(T * output_buffer, uint32_t frames_needed) + { + uint32_t in_len = samples_to_frames(delay_input_buffer.length()); + uint32_t out_len = frames_needed; + + uint32_t to_pop = std::min(in_len, out_len); + + delay_input_buffer.pop(output_buffer, frames_to_samples(to_pop)); + + return to_pop; + } + /** Returns the number of frames one needs to input into the delay line to get + * #frames_needed frames back. + * @parameter frames_needed the number of frames one want to write into the + * delay_line + * @returns the number of frames one will get. */ + uint32_t input_needed_for_output(int32_t frames_needed) const + { + assert(frames_needed >= 0); // Check overflow + return frames_needed; + } + /** Returns the number of frames produces for `input_frames` frames in input + */ + size_t output_for_input(uint32_t input_frames) { return input_frames; } + /** The number of frames this delay line delays the stream by. + * @returns The number of frames of delay. */ + size_t latency() { return length; } + + void drop_audio_if_needed() + { + size_t available = samples_to_frames(delay_input_buffer.length()); + uint32_t to_keep = min_buffered_audio_frame(sample_rate); + if (available > to_keep) { + ALOGV("Dropping %u frames", available - to_keep); + delay_input_buffer.pop(nullptr, frames_to_samples(available - to_keep)); + } + } + +private: + /** The length, in frames, of this delay line */ + uint32_t length; + /** When `input_buffer` is called, this allows tracking the number of samples + that where in the buffer. */ + uint32_t leftover_samples; + /** The input buffer, where the delay is applied. */ + auto_array delay_input_buffer; + /** The output buffer. This is only ever used if using the ::output with a + * single argument. */ + auto_array delay_output_buffer; + uint32_t sample_rate; +}; + +/** This sits behind the C API and is more typed. */ +template +cubeb_resampler * +cubeb_resampler_create_internal(cubeb_stream * stream, + cubeb_stream_params * input_params, + cubeb_stream_params * output_params, + unsigned int target_rate, + cubeb_data_callback callback, void * user_ptr, + cubeb_resampler_quality quality, + cubeb_resampler_reclock reclock) +{ + std::unique_ptr> input_resampler = nullptr; + std::unique_ptr> output_resampler = nullptr; + std::unique_ptr> input_delay = nullptr; + std::unique_ptr> output_delay = nullptr; + + assert((input_params || output_params) && + "need at least one valid parameter pointer."); + + /* All the streams we have have a sample rate that matches the target + sample rate, use a no-op resampler, that simply forwards the buffers to the + callback. */ + if (((input_params && input_params->rate == target_rate) && + (output_params && output_params->rate == target_rate)) || + (input_params && !output_params && (input_params->rate == target_rate)) || + (output_params && !input_params && + (output_params->rate == target_rate))) { + LOG("Input and output sample-rate match, target rate of %dHz", target_rate); + return new passthrough_resampler( + stream, callback, user_ptr, input_params ? input_params->channels : 0, + target_rate); + } + + /* Determine if we need to resampler one or both directions, and create the + resamplers. */ + if (output_params && (output_params->rate != target_rate)) { + output_resampler.reset(new cubeb_resampler_speex_one_way( + output_params->channels, target_rate, output_params->rate, + to_speex_quality(quality))); + if (!output_resampler) { + return NULL; + } + } + + if (input_params && (input_params->rate != target_rate)) { + input_resampler.reset(new cubeb_resampler_speex_one_way( + input_params->channels, input_params->rate, target_rate, + to_speex_quality(quality))); + if (!input_resampler) { + return NULL; + } + } + + /* If we resample only one direction but we have a duplex stream, insert a + * delay line with a length equal to the resampler latency of the + * other direction so that the streams are synchronized. */ + if (input_resampler && !output_resampler && input_params && output_params) { + output_delay.reset(new delay_line(input_resampler->latency(), + output_params->channels, + output_params->rate)); + if (!output_delay) { + return NULL; + } + } else if (output_resampler && !input_resampler && input_params && + output_params) { + input_delay.reset(new delay_line(output_resampler->latency(), + input_params->channels, + output_params->rate)); + if (!input_delay) { + return NULL; + } + } + + if (input_resampler && output_resampler) { + LOG("Resampling input (%d) and output (%d) to target rate of %dHz", + input_params->rate, output_params->rate, target_rate); + return new cubeb_resampler_speex, + cubeb_resampler_speex_one_way>( + input_resampler.release(), output_resampler.release(), stream, callback, + user_ptr); + } else if (input_resampler) { + LOG("Resampling input (%d) to target and output rate of %dHz", + input_params->rate, target_rate); + return new cubeb_resampler_speex, + delay_line>(input_resampler.release(), + output_delay.release(), + stream, callback, user_ptr); + } else { + LOG("Resampling output (%dHz) to target and input rate of %dHz", + output_params->rate, target_rate); + return new cubeb_resampler_speex, + cubeb_resampler_speex_one_way>( + input_delay.release(), output_resampler.release(), stream, callback, + user_ptr); + } +} + +#endif /* CUBEB_RESAMPLER_INTERNAL */ diff --git a/3rdparty/cubeb/src/cubeb_ring_array.h b/3rdparty/cubeb/src/cubeb_ring_array.h new file mode 100644 index 0000000000..05a8fe9620 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_ring_array.h @@ -0,0 +1,155 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#ifndef CUBEB_RING_ARRAY_H +#define CUBEB_RING_ARRAY_H + +#include "cubeb_utils.h" + +/** Ring array of pointers is used to hold buffers. In case that + asynchronous producer/consumer callbacks do not arrive in a + repeated order the ring array stores the buffers and fetch + them in the correct order. */ + +typedef struct { + AudioBuffer * buffer_array; /**< Array that hold pointers of the allocated + space for the buffers. */ + unsigned int tail; /**< Index of the last element (first to deliver). */ + unsigned int count; /**< Number of elements in the array. */ + unsigned int capacity; /**< Total length of the array. */ +} ring_array; + +static int +single_audiobuffer_init(AudioBuffer * buffer, uint32_t bytesPerFrame, + uint32_t channelsPerFrame, uint32_t frames) +{ + assert(buffer); + assert(bytesPerFrame > 0 && channelsPerFrame && frames > 0); + + size_t size = bytesPerFrame * frames; + buffer->mData = operator new(size); + if (buffer->mData == NULL) { + return CUBEB_ERROR; + } + PodZero(static_cast(buffer->mData), size); + + buffer->mNumberChannels = channelsPerFrame; + buffer->mDataByteSize = size; + + return CUBEB_OK; +} + +/** Initialize the ring array. + @param ra The ring_array pointer of allocated structure. + @retval 0 on success. */ +int +ring_array_init(ring_array * ra, uint32_t capacity, uint32_t bytesPerFrame, + uint32_t channelsPerFrame, uint32_t framesPerBuffer) +{ + assert(ra); + if (capacity == 0 || bytesPerFrame == 0 || channelsPerFrame == 0 || + framesPerBuffer == 0) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + ra->capacity = capacity; + ra->tail = 0; + ra->count = 0; + + ra->buffer_array = new AudioBuffer[ra->capacity]; + PodZero(ra->buffer_array, ra->capacity); + if (ra->buffer_array == NULL) { + return CUBEB_ERROR; + } + + for (unsigned int i = 0; i < ra->capacity; ++i) { + if (single_audiobuffer_init(&ra->buffer_array[i], bytesPerFrame, + channelsPerFrame, + framesPerBuffer) != CUBEB_OK) { + return CUBEB_ERROR; + } + } + + return CUBEB_OK; +} + +/** Destroy the ring array. + @param ra The ring_array pointer.*/ +void +ring_array_destroy(ring_array * ra) +{ + assert(ra); + if (ra->buffer_array == NULL) { + return; + } + for (unsigned int i = 0; i < ra->capacity; ++i) { + if (ra->buffer_array[i].mData) { + operator delete(ra->buffer_array[i].mData); + } + } + delete[] ra->buffer_array; +} + +/** Get the allocated buffer to be stored with fresh data. + @param ra The ring_array pointer. + @retval Pointer of the allocated space to be stored with fresh data or NULL + if full. */ +AudioBuffer * +ring_array_get_free_buffer(ring_array * ra) +{ + assert(ra && ra->buffer_array); + assert(ra->buffer_array[0].mData != NULL); + if (ra->count == ra->capacity) { + return NULL; + } + + assert(ra->count == 0 || (ra->tail + ra->count) % ra->capacity != ra->tail); + AudioBuffer * ret = &ra->buffer_array[(ra->tail + ra->count) % ra->capacity]; + + ++ra->count; + assert(ra->count <= ra->capacity); + + return ret; +} + +/** Get the next available buffer with data. + @param ra The ring_array pointer. + @retval Pointer of the next in order data buffer or NULL if empty. */ +AudioBuffer * +ring_array_get_data_buffer(ring_array * ra) +{ + assert(ra && ra->buffer_array); + assert(ra->buffer_array[0].mData != NULL); + + if (ra->count == 0) { + return NULL; + } + AudioBuffer * ret = &ra->buffer_array[ra->tail]; + + ra->tail = (ra->tail + 1) % ra->capacity; + assert(ra->tail < ra->capacity); + + assert(ra->count > 0); + --ra->count; + + return ret; +} + +/** When array is empty get the first allocated buffer in the array. + @param ra The ring_array pointer. + @retval If arrays is empty, pointer of the allocated space else NULL. */ +AudioBuffer * +ring_array_get_dummy_buffer(ring_array * ra) +{ + assert(ra && ra->buffer_array); + assert(ra->capacity > 0); + if (ra->count > 0) { + return NULL; + } + return &ra->buffer_array[0]; +} + +#endif // CUBEB_RING_ARRAY_H diff --git a/3rdparty/cubeb/src/cubeb_ringbuffer.h b/3rdparty/cubeb/src/cubeb_ringbuffer.h new file mode 100644 index 0000000000..f020351566 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_ringbuffer.h @@ -0,0 +1,468 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#ifndef CUBEB_RING_BUFFER_H +#define CUBEB_RING_BUFFER_H + +#include "cubeb_utils.h" +#include +#include +#include +#include +#include + +/** + * Single producer single consumer lock-free and wait-free ring buffer. + * + * This data structure allows producing data from one thread, and consuming it + * on another thread, safely and without explicit synchronization. If used on + * two threads, this data structure uses atomics for thread safety. It is + * possible to disable the use of atomics at compile time and only use this data + * structure on one thread. + * + * The role for the producer and the consumer must be constant, i.e., the + * producer should always be on one thread and the consumer should always be on + * another thread. + * + * Some words about the inner workings of this class: + * - Capacity is fixed. Only one allocation is performed, in the constructor. + * When reading and writing, the return value of the method allows checking if + * the ring buffer is empty or full. + * - We always keep the read index at least one element ahead of the write + * index, so we can distinguish between an empty and a full ring buffer: an + * empty ring buffer is when the write index is at the same position as the + * read index. A full buffer is when the write index is exactly one position + * before the read index. + * - We synchronize updates to the read index after having read the data, and + * the write index after having written the data. This means that the each + * thread can only touch a portion of the buffer that is not touched by the + * other thread. + * - Callers are expected to provide buffers. When writing to the queue, + * elements are copied into the internal storage from the buffer passed in. + * When reading from the queue, the user is expected to provide a buffer. + * Because this is a ring buffer, data might not be contiguous in memory, + * providing an external buffer to copy into is an easy way to have linear + * data for further processing. + */ +template class ring_buffer_base { +public: + /** + * Constructor for a ring buffer. + * + * This performs an allocation, but is the only allocation that will happen + * for the life time of a `ring_buffer_base`. + * + * @param capacity The maximum number of element this ring buffer will hold. + */ + ring_buffer_base(int capacity) + /* One more element to distinguish from empty and full buffer. */ + : capacity_(capacity + 1) + { + assert(storage_capacity() < std::numeric_limits::max() / 2 && + "buffer too large for the type of index used."); + assert(capacity_ > 0); + + data_.reset(new T[storage_capacity()]); + /* If this queue is using atomics, initializing those members as the last + * action in the constructor acts as a full barrier, and allow capacity() to + * be thread-safe. */ + write_index_ = 0; + read_index_ = 0; + } + /** + * Push `count` zero or default constructed elements in the array. + * + * Only safely called on the producer thread. + * + * @param count The number of elements to enqueue. + * @return The number of element enqueued. + */ + int enqueue_default(int count) { return enqueue(nullptr, count); } + /** + * @brief Put an element in the queue + * + * Only safely called on the producer thread. + * + * @param element The element to put in the queue. + * + * @return 1 if the element was inserted, 0 otherwise. + */ + int enqueue(T & element) { return enqueue(&element, 1); } + /** + * Push `count` elements in the ring buffer. + * + * Only safely called on the producer thread. + * + * @param elements a pointer to a buffer containing at least `count` elements. + * If `elements` is nullptr, zero or default constructed elements are + * enqueued. + * @param count The number of elements to read from `elements` + * @return The number of elements successfully coped from `elements` and + * inserted into the ring buffer. + */ + int enqueue(T * elements, int count) + { +#ifndef NDEBUG + assert_correct_thread(producer_id); +#endif + + int wr_idx = write_index_.load(std::memory_order_relaxed); + int rd_idx = read_index_.load(std::memory_order_acquire); + + if (full_internal(rd_idx, wr_idx)) { + return 0; + } + + int to_write = std::min(available_write_internal(rd_idx, wr_idx), count); + + /* First part, from the write index to the end of the array. */ + int first_part = std::min(storage_capacity() - wr_idx, to_write); + /* Second part, from the beginning of the array */ + int second_part = to_write - first_part; + + if (elements) { + Copy(data_.get() + wr_idx, elements, first_part); + Copy(data_.get(), elements + first_part, second_part); + } else { + ConstructDefault(data_.get() + wr_idx, first_part); + ConstructDefault(data_.get(), second_part); + } + + write_index_.store(increment_index(wr_idx, to_write), + std::memory_order_release); + + return to_write; + } + /** + * Retrieve at most `count` elements from the ring buffer, and copy them to + * `elements`, if non-null. + * + * Only safely called on the consumer side. + * + * @param elements A pointer to a buffer with space for at least `count` + * elements. If `elements` is `nullptr`, `count` element will be discarded. + * @param count The maximum number of elements to dequeue. + * @return The number of elements written to `elements`. + */ + int dequeue(T * elements, int count) + { +#ifndef NDEBUG + assert_correct_thread(consumer_id); +#endif + + int rd_idx = read_index_.load(std::memory_order_relaxed); + int wr_idx = write_index_.load(std::memory_order_acquire); + + if (empty_internal(rd_idx, wr_idx)) { + return 0; + } + + int to_read = std::min(available_read_internal(rd_idx, wr_idx), count); + + int first_part = std::min(storage_capacity() - rd_idx, to_read); + int second_part = to_read - first_part; + + if (elements) { + Copy(elements, data_.get() + rd_idx, first_part); + Copy(elements + first_part, data_.get(), second_part); + } + + read_index_.store(increment_index(rd_idx, to_read), + std::memory_order_release); + + return to_read; + } + /** + * Get the number of available element for consuming. + * + * Only safely called on the consumer thread. + * + * @return The number of available elements for reading. + */ + int available_read() const + { +#ifndef NDEBUG + assert_correct_thread(consumer_id); +#endif + return available_read_internal( + read_index_.load(std::memory_order_relaxed), + write_index_.load(std::memory_order_acquire)); + } + /** + * Get the number of available elements for consuming. + * + * Only safely called on the producer thread. + * + * @return The number of empty slots in the buffer, available for writing. + */ + int available_write() const + { +#ifndef NDEBUG + assert_correct_thread(producer_id); +#endif + return available_write_internal( + read_index_.load(std::memory_order_acquire), + write_index_.load(std::memory_order_relaxed)); + } + /** + * Get the total capacity, for this ring buffer. + * + * Can be called safely on any thread. + * + * @return The maximum capacity of this ring buffer. + */ + int capacity() const { return storage_capacity() - 1; } + /** + * Reset the consumer and producer thread identifier, in case the thread are + * being changed. This has to be externally synchronized. This is no-op when + * asserts are disabled. + */ + void reset_thread_ids() + { +#ifndef NDEBUG + consumer_id = producer_id = std::thread::id(); +#endif + } + +private: + /** Return true if the ring buffer is empty. + * + * @param read_index the read index to consider + * @param write_index the write index to consider + * @return true if the ring buffer is empty, false otherwise. + **/ + bool empty_internal(int read_index, int write_index) const + { + return write_index == read_index; + } + /** Return true if the ring buffer is full. + * + * This happens if the write index is exactly one element behind the read + * index. + * + * @param read_index the read index to consider + * @param write_index the write index to consider + * @return true if the ring buffer is full, false otherwise. + **/ + bool full_internal(int read_index, int write_index) const + { + return (write_index + 1) % storage_capacity() == read_index; + } + /** + * Return the size of the storage. It is one more than the number of elements + * that can be stored in the buffer. + * + * @return the number of elements that can be stored in the buffer. + */ + int storage_capacity() const { return capacity_; } + /** + * Returns the number of elements available for reading. + * + * @return the number of available elements for reading. + */ + int available_read_internal(int read_index, int write_index) const + { + if (write_index >= read_index) { + return write_index - read_index; + } else { + return write_index + storage_capacity() - read_index; + } + } + /** + * Returns the number of empty elements, available for writing. + * + * @return the number of elements that can be written into the array. + */ + int available_write_internal(int read_index, int write_index) const + { + /* We substract one element here to always keep at least one sample + * free in the buffer, to distinguish between full and empty array. */ + int rv = read_index - write_index - 1; + if (write_index >= read_index) { + rv += storage_capacity(); + } + return rv; + } + /** + * Increments an index, wrapping it around the storage. + * + * @param index a reference to the index to increment. + * @param increment the number by which `index` is incremented. + * @return the new index. + */ + int increment_index(int index, int increment) const + { + assert(increment >= 0); + return (index + increment) % storage_capacity(); + } + /** + * @brief This allows checking that enqueue (resp. dequeue) are always called + * by the right thread. + * + * @param id the id of the thread that has called the calling method first. + */ +#ifndef NDEBUG + static void assert_correct_thread(std::thread::id & id) + { + if (id == std::thread::id()) { + id = std::this_thread::get_id(); + return; + } + assert(id == std::this_thread::get_id()); + } +#endif + /** Index at which the oldest element is at, in samples. */ + std::atomic read_index_; + /** Index at which to write new elements. `write_index` is always at + * least one element ahead of `read_index_`. */ + std::atomic write_index_; + /** Maximum number of elements that can be stored in the ring buffer. */ + const int capacity_; + /** Data storage */ + std::unique_ptr data_; +#ifndef NDEBUG + /** The id of the only thread that is allowed to read from the queue. */ + mutable std::thread::id consumer_id; + /** The id of the only thread that is allowed to write from the queue. */ + mutable std::thread::id producer_id; +#endif +}; + +/** + * Adapter for `ring_buffer_base` that exposes an interface in frames. + */ +template class audio_ring_buffer_base { +public: + /** + * @brief Constructor. + * + * @param channel_count Number of channels. + * @param capacity_in_frames The capacity in frames. + */ + audio_ring_buffer_base(int channel_count, int capacity_in_frames) + : channel_count(channel_count), + ring_buffer(frames_to_samples(capacity_in_frames)) + { + assert(channel_count > 0); + } + /** + * @brief Enqueue silence. + * + * Only safely called on the producer thread. + * + * @param frame_count The number of frames of silence to enqueue. + * @return The number of frames of silence actually written to the queue. + */ + int enqueue_default(int frame_count) + { + return samples_to_frames( + ring_buffer.enqueue(nullptr, frames_to_samples(frame_count))); + } + /** + * @brief Enqueue `frames_count` frames of audio. + * + * Only safely called from the producer thread. + * + * @param [in] frames If non-null, the frames to enqueue. + * Otherwise, silent frames are enqueued. + * @param frame_count The number of frames to enqueue. + * + * @return The number of frames enqueued + */ + + int enqueue(T * frames, int frame_count) + { + return samples_to_frames( + ring_buffer.enqueue(frames, frames_to_samples(frame_count))); + } + + /** + * @brief Removes `frame_count` frames from the buffer, and + * write them to `frames` if it is non-null. + * + * Only safely called on the consumer thread. + * + * @param frames If non-null, the frames are copied to `frames`. + * Otherwise, they are dropped. + * @param frame_count The number of frames to remove. + * + * @return The number of frames actually dequeud. + */ + int dequeue(T * frames, int frame_count) + { + return samples_to_frames( + ring_buffer.dequeue(frames, frames_to_samples(frame_count))); + } + /** + * Get the number of available frames of audio for consuming. + * + * Only safely called on the consumer thread. + * + * @return The number of available frames of audio for reading. + */ + int available_read() const + { + return samples_to_frames(ring_buffer.available_read()); + } + /** + * Get the number of available frames of audio for consuming. + * + * Only safely called on the producer thread. + * + * @return The number of empty slots in the buffer, available for writing. + */ + int available_write() const + { + return samples_to_frames(ring_buffer.available_write()); + } + /** + * Get the total capacity, for this ring buffer. + * + * Can be called safely on any thread. + * + * @return The maximum capacity of this ring buffer. + */ + int capacity() const { return samples_to_frames(ring_buffer.capacity()); } + +private: + /** + * @brief Frames to samples conversion. + * + * @param frames The number of frames. + * + * @return A number of samples. + */ + int frames_to_samples(int frames) const { return frames * channel_count; } + /** + * @brief Samples to frames conversion. + * + * @param samples The number of samples. + * + * @return A number of frames. + */ + int samples_to_frames(int samples) const { return samples / channel_count; } + /** Number of channels of audio that will stream through this ring buffer. */ + int channel_count; + /** The underlying ring buffer that is used to store the data. */ + ring_buffer_base ring_buffer; +}; + +/** + * Lock-free instantiation of the `ring_buffer_base` type. This is safe to use + * from two threads, one producer, one consumer (that never change role), + * without explicit synchronization. + */ +template using lock_free_queue = ring_buffer_base; +/** + * Lock-free instantiation of the `audio_ring_buffer` type. This is safe to use + * from two threads, one producer, one consumer (that never change role), + * without explicit synchronization. + */ +template +using lock_free_audio_ring_buffer = audio_ring_buffer_base; + +#endif // CUBEB_RING_BUFFER_H diff --git a/3rdparty/cubeb/src/cubeb_sndio.c b/3rdparty/cubeb/src/cubeb_sndio.c new file mode 100644 index 0000000000..665110b8f8 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_sndio.c @@ -0,0 +1,678 @@ +/* + * Copyright (c) 2011 Alexandre Ratchov + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_tracing.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(CUBEB_SNDIO_DEBUG) +#define DPR(...) fprintf(stderr, __VA_ARGS__); +#else +#define DPR(...) \ + do { \ + } while (0) +#endif + +#ifdef DISABLE_LIBSNDIO_DLOPEN +#define WRAP(x) x +#else +#define WRAP(x) (*cubeb_##x) +#define LIBSNDIO_API_VISIT(X) \ + X(sio_close) \ + X(sio_eof) \ + X(sio_getpar) \ + X(sio_initpar) \ + X(sio_nfds) \ + X(sio_onmove) \ + X(sio_open) \ + X(sio_pollfd) \ + X(sio_read) \ + X(sio_revents) \ + X(sio_setpar) \ + X(sio_start) \ + X(sio_stop) \ + X(sio_write) + +#define MAKE_TYPEDEF(x) static typeof(x) * cubeb_##x; +LIBSNDIO_API_VISIT(MAKE_TYPEDEF); +#undef MAKE_TYPEDEF +#endif + +static struct cubeb_ops const sndio_ops; + +struct cubeb { + struct cubeb_ops const * ops; + void * libsndio; +}; + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context; + void * arg; /* user arg to {data,state}_cb */ + /**/ + pthread_t th; /* to run real-time audio i/o */ + pthread_mutex_t mtx; /* protects hdl and pos */ + struct sio_hdl * hdl; /* link us to sndio */ + int mode; /* bitmap of SIO_{PLAY,REC} */ + int active; /* cubec_start() called */ + int conv; /* need float->s16 conversion */ + unsigned char * rbuf; /* rec data consumed from here */ + unsigned char * pbuf; /* play data is prepared here */ + unsigned int nfr; /* number of frames in ibuf and obuf */ + unsigned int rbpf; /* rec bytes per frame */ + unsigned int pbpf; /* play bytes per frame */ + unsigned int rchan; /* number of rec channels */ + unsigned int pchan; /* number of play channels */ + unsigned int nblks; /* number of blocks in the buffer */ + uint64_t hwpos; /* frame number Joe hears right now */ + uint64_t swpos; /* number of frames produced/consumed */ + cubeb_data_callback data_cb; /* cb to preapare data */ + cubeb_state_callback state_cb; /* cb to notify about state changes */ + float volume; /* current volume */ +}; + +static void +s16_setvol(void * ptr, long nsamp, float volume) +{ + int16_t * dst = ptr; + int32_t mult = volume * 32768; + int32_t s; + + while (nsamp-- > 0) { + s = *dst; + s = (s * mult) >> 15; + *(dst++) = s; + } +} + +static void +float_to_s16(void * ptr, long nsamp, float volume) +{ + int16_t * dst = ptr; + float * src = ptr; + float mult = volume * 32768; + int s; + + while (nsamp-- > 0) { + s = lrintf(*(src++) * mult); + if (s < -32768) + s = -32768; + else if (s > 32767) + s = 32767; + *(dst++) = s; + } +} + +static void +s16_to_float(void * ptr, long nsamp) +{ + int16_t * src = ptr; + float * dst = ptr; + + src += nsamp; + dst += nsamp; + while (nsamp-- > 0) + *(--dst) = (1. / 32768) * *(--src); +} + +static const char * +sndio_get_device() +{ +#ifdef __linux__ + /* + * On other platforms default to sndio devices, + * so cubebs other backends can be used instead. + */ + const char * dev = getenv("AUDIODEVICE"); + if (dev == NULL || *dev == '\0') + return "snd/0"; + return dev; +#else + return SIO_DEVANY; +#endif +} + +static void +sndio_onmove(void * arg, int delta) +{ + cubeb_stream * s = (cubeb_stream *)arg; + + s->hwpos += delta; +} + +static void * +sndio_mainloop(void * arg) +{ + struct pollfd * pfds; + cubeb_stream * s = arg; + int n, eof = 0, prime, nfds, events, revents, state = CUBEB_STATE_STARTED; + size_t pstart = 0, pend = 0, rstart = 0, rend = 0; + long nfr; + + CUBEB_REGISTER_THREAD("cubeb rendering thread"); + + nfds = WRAP(sio_nfds)(s->hdl); + pfds = calloc(nfds, sizeof(struct pollfd)); + if (pfds == NULL) { + CUBEB_UNREGISTER_THREAD(); + return NULL; + } + + DPR("sndio_mainloop()\n"); + s->state_cb(s, s->arg, CUBEB_STATE_STARTED); + pthread_mutex_lock(&s->mtx); + if (!WRAP(sio_start)(s->hdl)) { + pthread_mutex_unlock(&s->mtx); + free(pfds); + CUBEB_UNREGISTER_THREAD(); + return NULL; + } + DPR("sndio_mainloop(), started\n"); + + if (s->mode & SIO_PLAY) { + pstart = pend = s->nfr * s->pbpf; + prime = s->nblks; + if (s->mode & SIO_REC) { + memset(s->rbuf, 0, s->nfr * s->rbpf); + rstart = rend = s->nfr * s->rbpf; + } + } else { + prime = 0; + rstart = 0; + rend = s->nfr * s->rbpf; + } + + for (;;) { + if (!s->active) { + DPR("sndio_mainloop() stopped\n"); + state = CUBEB_STATE_STOPPED; + break; + } + + /* do we have a complete block? */ + if ((!(s->mode & SIO_PLAY) || pstart == pend) && + (!(s->mode & SIO_REC) || rstart == rend)) { + + if (eof) { + DPR("sndio_mainloop() drained\n"); + state = CUBEB_STATE_DRAINED; + break; + } + + if ((s->mode & SIO_REC) && s->conv) + s16_to_float(s->rbuf, s->nfr * s->rchan); + + /* invoke call-back, it returns less that s->nfr if done */ + pthread_mutex_unlock(&s->mtx); + nfr = s->data_cb(s, s->arg, s->rbuf, s->pbuf, s->nfr); + pthread_mutex_lock(&s->mtx); + if (nfr < 0) { + DPR("sndio_mainloop() cb err\n"); + state = CUBEB_STATE_ERROR; + break; + } + s->swpos += nfr; + + /* was this last call-back invocation (aka end-of-stream) ? */ + if (nfr < s->nfr) { + + if (!(s->mode & SIO_PLAY) || nfr == 0) { + state = CUBEB_STATE_DRAINED; + break; + } + + /* need to write (aka drain) the partial play block we got */ + pend = nfr * s->pbpf; + eof = 1; + } + + if (prime > 0) + prime--; + + if (s->mode & SIO_PLAY) { + if (s->conv) + float_to_s16(s->pbuf, nfr * s->pchan, s->volume); + else + s16_setvol(s->pbuf, nfr * s->pchan, s->volume); + } + + if (s->mode & SIO_REC) + rstart = 0; + if (s->mode & SIO_PLAY) + pstart = 0; + } + + events = 0; + if ((s->mode & SIO_REC) && rstart < rend && prime == 0) + events |= POLLIN; + if ((s->mode & SIO_PLAY) && pstart < pend) + events |= POLLOUT; + nfds = WRAP(sio_pollfd)(s->hdl, pfds, events); + + if (nfds > 0) { + pthread_mutex_unlock(&s->mtx); + n = poll(pfds, nfds, -1); + pthread_mutex_lock(&s->mtx); + if (n < 0) + continue; + } + + revents = WRAP(sio_revents)(s->hdl, pfds); + + if (revents & POLLHUP) { + state = CUBEB_STATE_ERROR; + break; + } + + if (revents & POLLOUT) { + n = WRAP(sio_write)(s->hdl, s->pbuf + pstart, pend - pstart); + if (n == 0 && WRAP(sio_eof)(s->hdl)) { + DPR("sndio_mainloop() werr\n"); + state = CUBEB_STATE_ERROR; + break; + } + pstart += n; + } + + if (revents & POLLIN) { + n = WRAP(sio_read)(s->hdl, s->rbuf + rstart, rend - rstart); + if (n == 0 && WRAP(sio_eof)(s->hdl)) { + DPR("sndio_mainloop() rerr\n"); + state = CUBEB_STATE_ERROR; + break; + } + rstart += n; + } + + /* skip rec block, if not recording (yet) */ + if (prime > 0 && (s->mode & SIO_REC)) + rstart = rend; + } + WRAP(sio_stop)(s->hdl); + s->hwpos = s->swpos; + pthread_mutex_unlock(&s->mtx); + s->state_cb(s, s->arg, state); + free(pfds); + CUBEB_UNREGISTER_THREAD(); + return NULL; +} + +/*static*/ int +sndio_init(cubeb ** context, char const * context_name) +{ + void * libsndio = NULL; + struct sio_hdl * hdl; + + assert(context); + +#ifndef DISABLE_LIBSNDIO_DLOPEN + libsndio = dlopen("libsndio.so.7.0", RTLD_LAZY); + if (!libsndio) { + libsndio = dlopen("libsndio.so", RTLD_LAZY); + if (!libsndio) { + DPR("sndio_init(%s) failed dlopen(libsndio.so)\n", context_name); + return CUBEB_ERROR; + } + } + +#define LOAD(x) \ + { \ + cubeb_##x = dlsym(libsndio, #x); \ + if (!cubeb_##x) { \ + DPR("sndio_init(%s) failed dlsym(%s)\n", context_name, #x); \ + dlclose(libsndio); \ + return CUBEB_ERROR; \ + } \ + } + + LIBSNDIO_API_VISIT(LOAD); +#undef LOAD +#endif + + /* test if sndio works */ + hdl = WRAP(sio_open)(sndio_get_device(), SIO_PLAY, 1); + if (hdl == NULL) { + return CUBEB_ERROR; + } + WRAP(sio_close)(hdl); + + DPR("sndio_init(%s)\n", context_name); + *context = malloc(sizeof(**context)); + if (*context == NULL) + return CUBEB_ERROR; + (*context)->libsndio = libsndio; + (*context)->ops = &sndio_ops; + (void)context_name; + return CUBEB_OK; +} + +static char const * +sndio_get_backend_id(cubeb * context) +{ + return "sndio"; +} + +static void +sndio_destroy(cubeb * context) +{ + DPR("sndio_destroy()\n"); +#ifndef DISABLE_LIBSNDIO_DLOPEN + if (context->libsndio) + dlclose(context->libsndio); +#endif + free(context); +} + +static int +sndio_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + cubeb_stream * s; + struct sio_par wpar, rpar; + cubeb_sample_format format; + int rate; + size_t bps; + + DPR("sndio_stream_init(%s)\n", stream_name); + + s = malloc(sizeof(cubeb_stream)); + if (s == NULL) + return CUBEB_ERROR; + memset(s, 0, sizeof(cubeb_stream)); + s->mode = 0; + if (input_stream_params) { + if (input_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + DPR("sndio_stream_init(), loopback not supported\n"); + goto err; + } + s->mode |= SIO_REC; + format = input_stream_params->format; + rate = input_stream_params->rate; + } + if (output_stream_params) { + if (output_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + DPR("sndio_stream_init(), loopback not supported\n"); + goto err; + } + s->mode |= SIO_PLAY; + format = output_stream_params->format; + rate = output_stream_params->rate; + } + if (s->mode == 0) { + DPR("sndio_stream_init(), neither playing nor recording\n"); + goto err; + } + s->context = context; + s->hdl = WRAP(sio_open)(sndio_get_device(), s->mode, 1); + if (s->hdl == NULL) { + DPR("sndio_stream_init(), sio_open() failed\n"); + goto err; + } + WRAP(sio_initpar)(&wpar); + wpar.sig = 1; + wpar.bits = 16; + switch (format) { + case CUBEB_SAMPLE_S16LE: + wpar.le = 1; + break; + case CUBEB_SAMPLE_S16BE: + wpar.le = 0; + break; + case CUBEB_SAMPLE_FLOAT32NE: + wpar.le = SIO_LE_NATIVE; + break; + default: + DPR("sndio_stream_init() unsupported format\n"); + goto err; + } + wpar.rate = rate; + if (s->mode & SIO_REC) + wpar.rchan = input_stream_params->channels; + if (s->mode & SIO_PLAY) + wpar.pchan = output_stream_params->channels; + wpar.appbufsz = latency_frames; + if (!WRAP(sio_setpar)(s->hdl, &wpar) || !WRAP(sio_getpar)(s->hdl, &rpar)) { + DPR("sndio_stream_init(), sio_setpar() failed\n"); + goto err; + } + if (rpar.bits != wpar.bits || rpar.le != wpar.le || rpar.sig != wpar.sig || + rpar.rate != wpar.rate || + ((s->mode & SIO_REC) && rpar.rchan != wpar.rchan) || + ((s->mode & SIO_PLAY) && rpar.pchan != wpar.pchan)) { + DPR("sndio_stream_init() unsupported params\n"); + goto err; + } + WRAP(sio_onmove)(s->hdl, sndio_onmove, s); + s->active = 0; + s->nfr = rpar.round; + s->rbpf = rpar.bps * rpar.rchan; + s->pbpf = rpar.bps * rpar.pchan; + s->rchan = rpar.rchan; + s->pchan = rpar.pchan; + s->nblks = rpar.bufsz / rpar.round; + s->data_cb = data_callback; + s->state_cb = state_callback; + s->arg = user_ptr; + s->mtx = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER; + s->hwpos = s->swpos = 0; + if (format == CUBEB_SAMPLE_FLOAT32LE) { + s->conv = 1; + bps = sizeof(float); + } else { + s->conv = 0; + bps = rpar.bps; + } + if (s->mode & SIO_PLAY) { + s->pbuf = malloc(bps * rpar.pchan * rpar.round); + if (s->pbuf == NULL) + goto err; + } + if (s->mode & SIO_REC) { + s->rbuf = malloc(bps * rpar.rchan * rpar.round); + if (s->rbuf == NULL) + goto err; + } + s->volume = 1.; + *stream = s; + DPR("sndio_stream_init() end, ok\n"); + (void)context; + (void)stream_name; + return CUBEB_OK; +err: + if (s->hdl) + WRAP(sio_close)(s->hdl); + if (s->pbuf) + free(s->pbuf); + if (s->rbuf) + free(s->pbuf); + free(s); + return CUBEB_ERROR; +} + +static int +sndio_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + assert(ctx && max_channels); + + *max_channels = 8; + + return CUBEB_OK; +} + +static int +sndio_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) +{ + /* + * We've no device-independent prefered rate; any rate will work if + * sndiod is running. If it isn't, 48kHz is what is most likely to + * work as most (but not all) devices support it. + */ + *rate = 48000; + return CUBEB_OK; +} + +static int +sndio_get_min_latency(cubeb * ctx, cubeb_stream_params params, + uint32_t * latency_frames) +{ + /* + * We've no device-independent minimum latency. + */ + *latency_frames = 2048; + + return CUBEB_OK; +} + +static void +sndio_stream_destroy(cubeb_stream * s) +{ + DPR("sndio_stream_destroy()\n"); + WRAP(sio_close)(s->hdl); + if (s->mode & SIO_PLAY) + free(s->pbuf); + if (s->mode & SIO_REC) + free(s->rbuf); + free(s); +} + +static int +sndio_stream_start(cubeb_stream * s) +{ + int err; + + DPR("sndio_stream_start()\n"); + s->active = 1; + err = pthread_create(&s->th, NULL, sndio_mainloop, s); + if (err) { + s->active = 0; + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +static int +sndio_stream_stop(cubeb_stream * s) +{ + void * dummy; + + DPR("sndio_stream_stop()\n"); + if (s->active) { + s->active = 0; + pthread_join(s->th, &dummy); + } + return CUBEB_OK; +} + +static int +sndio_stream_get_position(cubeb_stream * s, uint64_t * p) +{ + pthread_mutex_lock(&s->mtx); + DPR("sndio_stream_get_position() %" PRId64 "\n", s->hwpos); + *p = s->hwpos; + pthread_mutex_unlock(&s->mtx); + return CUBEB_OK; +} + +static int +sndio_stream_set_volume(cubeb_stream * s, float volume) +{ + DPR("sndio_stream_set_volume(%f)\n", volume); + pthread_mutex_lock(&s->mtx); + if (volume < 0.) + volume = 0.; + else if (volume > 1.0) + volume = 1.; + s->volume = volume; + pthread_mutex_unlock(&s->mtx); + return CUBEB_OK; +} + +int +sndio_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +{ + // http://www.openbsd.org/cgi-bin/man.cgi?query=sio_open + // in the "Measuring the latency and buffers usage" paragraph. + *latency = stm->swpos - stm->hwpos; + return CUBEB_OK; +} + +static int +sndio_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection) +{ + static char dev[] = SIO_DEVANY; + cubeb_device_info * device; + + device = malloc(sizeof(cubeb_device_info)); + if (device == NULL) + return CUBEB_ERROR; + + device->devid = dev; /* passed to stream_init() */ + device->device_id = dev; /* printable in UI */ + device->friendly_name = dev; /* same, but friendly */ + device->group_id = dev; /* actual device if full-duplex */ + device->vendor_name = NULL; /* may be NULL */ + device->type = type; /* Input/Output */ + device->state = CUBEB_DEVICE_STATE_ENABLED; + device->preferred = CUBEB_DEVICE_PREF_ALL; + device->format = CUBEB_DEVICE_FMT_S16NE; + device->default_format = CUBEB_DEVICE_FMT_S16NE; + device->max_channels = (type == CUBEB_DEVICE_TYPE_INPUT) ? 2 : 8; + device->default_rate = 48000; + device->min_rate = 4000; + device->max_rate = 192000; + device->latency_lo = 480; + device->latency_hi = 9600; + collection->device = device; + collection->count = 1; + return CUBEB_OK; +} + +static int +sndio_device_collection_destroy(cubeb * context, + cubeb_device_collection * collection) +{ + free(collection->device); + return CUBEB_OK; +} + +static struct cubeb_ops const sndio_ops = { + .init = sndio_init, + .get_backend_id = sndio_get_backend_id, + .get_max_channel_count = sndio_get_max_channel_count, + .get_min_latency = sndio_get_min_latency, + .get_preferred_sample_rate = sndio_get_preferred_sample_rate, + .enumerate_devices = sndio_enumerate_devices, + .device_collection_destroy = sndio_device_collection_destroy, + .destroy = sndio_destroy, + .stream_init = sndio_stream_init, + .stream_destroy = sndio_stream_destroy, + .stream_start = sndio_stream_start, + .stream_stop = sndio_stream_stop, + .stream_get_position = sndio_stream_get_position, + .stream_get_latency = sndio_stream_get_latency, + .stream_set_volume = sndio_stream_set_volume, + .stream_set_name = NULL, + .stream_get_current_device = NULL, + .stream_device_destroy = NULL, + .stream_register_device_changed_callback = NULL, + .register_device_collection_changed = NULL}; diff --git a/3rdparty/cubeb/src/cubeb_strings.c b/3rdparty/cubeb/src/cubeb_strings.c new file mode 100644 index 0000000000..5fe5b791e2 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_strings.c @@ -0,0 +1,154 @@ +/* + * Copyright © 2011 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#include "cubeb_strings.h" + +#include +#include +#include + +#define CUBEB_STRINGS_INLINE_COUNT 4 + +struct cubeb_strings { + uint32_t size; + uint32_t count; + char ** data; + char * small_store[CUBEB_STRINGS_INLINE_COUNT]; +}; + +int +cubeb_strings_init(cubeb_strings ** strings) +{ + cubeb_strings * strs = NULL; + + if (!strings) { + return CUBEB_ERROR; + } + + strs = calloc(1, sizeof(cubeb_strings)); + assert(strs); + + if (!strs) { + return CUBEB_ERROR; + } + + strs->size = sizeof(strs->small_store) / sizeof(strs->small_store[0]); + strs->count = 0; + strs->data = strs->small_store; + + *strings = strs; + + return CUBEB_OK; +} + +void +cubeb_strings_destroy(cubeb_strings * strings) +{ + char ** sp = NULL; + char ** se = NULL; + + if (!strings) { + return; + } + + sp = strings->data; + se = sp + strings->count; + + for (; sp != se; sp++) { + if (*sp) { + free(*sp); + } + } + + if (strings->data != strings->small_store) { + free(strings->data); + } + + free(strings); +} + +/** Look for string in string storage. + @param strings Opaque pointer to interned string storage. + @param s String to look up. + @retval Read-only string or NULL if not found. */ +static char const * +cubeb_strings_lookup(cubeb_strings * strings, char const * s) +{ + char ** sp = NULL; + char ** se = NULL; + + if (!strings || !s) { + return NULL; + } + + sp = strings->data; + se = sp + strings->count; + + for (; sp != se; sp++) { + if (*sp && strcmp(*sp, s) == 0) { + return *sp; + } + } + + return NULL; +} + +static char const * +cubeb_strings_push(cubeb_strings * strings, char const * s) +{ + char * is = NULL; + + if (strings->count == strings->size) { + char ** new_data; + uint32_t value_size = sizeof(char const *); + uint32_t new_size = strings->size * 2; + if (!new_size || value_size > (uint32_t)-1 / new_size) { + // overflow + return NULL; + } + + if (strings->small_store == strings->data) { + // First time heap allocation. + new_data = malloc(new_size * value_size); + if (new_data) { + memcpy(new_data, strings->small_store, sizeof(strings->small_store)); + } + } else { + new_data = realloc(strings->data, new_size * value_size); + } + + if (!new_data) { + // out of memory + return NULL; + } + + strings->size = new_size; + strings->data = new_data; + } + + is = strdup(s); + strings->data[strings->count++] = is; + + return is; +} + +char const * +cubeb_strings_intern(cubeb_strings * strings, char const * s) +{ + char const * is = NULL; + + if (!strings || !s) { + return NULL; + } + + is = cubeb_strings_lookup(strings, s); + if (is) { + return is; + } + + return cubeb_strings_push(strings, s); +} diff --git a/3rdparty/cubeb/src/cubeb_strings.h b/3rdparty/cubeb/src/cubeb_strings.h new file mode 100644 index 0000000000..cfffbbc68a --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_strings.h @@ -0,0 +1,47 @@ +/* + * Copyright © 2011 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#ifndef CUBEB_STRINGS_H +#define CUBEB_STRINGS_H + +#include "cubeb/cubeb.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** Opaque handle referencing interned string storage. */ +typedef struct cubeb_strings cubeb_strings; + +/** Initialize an interned string structure. + @param strings An out param where an opaque pointer to the + interned string storage will be returned. + @retval CUBEB_OK in case of success. + @retval CUBEB_ERROR in case of error. */ +CUBEB_EXPORT int +cubeb_strings_init(cubeb_strings ** strings); + +/** Destroy an interned string structure freeing all associated memory. + @param strings An opaque pointer to the interned string storage to + destroy. */ +CUBEB_EXPORT void +cubeb_strings_destroy(cubeb_strings * strings); + +/** Add string to internal storage. + @param strings Opaque pointer to interned string storage. + @param s String to add to storage. + @retval CUBEB_OK + @retval CUBEB_ERROR + */ +CUBEB_EXPORT char const * +cubeb_strings_intern(cubeb_strings * strings, char const * s); + +#if defined(__cplusplus) +} +#endif + +#endif // !CUBEB_STRINGS_H diff --git a/3rdparty/cubeb/src/cubeb_sun.c b/3rdparty/cubeb/src/cubeb_sun.c new file mode 100644 index 0000000000..d3dcb12ff3 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_sun.c @@ -0,0 +1,737 @@ +/* + * Copyright © 2019-2020 Nia Alarie + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_tracing.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Default to 4 + 1 for the default device. */ +#ifndef SUN_DEVICE_COUNT +#define SUN_DEVICE_COUNT (5) +#endif + +/* Supported well by most hardware. */ +#ifndef SUN_PREFER_RATE +#define SUN_PREFER_RATE (48000) +#endif + +/* Standard acceptable minimum. */ +#ifndef SUN_LATENCY_MS +#define SUN_LATENCY_MS (40) +#endif + +#ifndef SUN_DEFAULT_DEVICE +#define SUN_DEFAULT_DEVICE "/dev/audio" +#endif + +#ifndef SUN_BUFFER_FRAMES +#define SUN_BUFFER_FRAMES (32) +#endif + +/* + * Supported on NetBSD regardless of hardware. + */ + +#ifndef SUN_MAX_CHANNELS +#ifdef __NetBSD__ +#define SUN_MAX_CHANNELS (12) +#else +#define SUN_MAX_CHANNELS (2) +#endif +#endif + +#ifndef SUN_MIN_RATE +#define SUN_MIN_RATE (1000) +#endif + +#ifndef SUN_MAX_RATE +#define SUN_MAX_RATE (192000) +#endif + +static struct cubeb_ops const sun_ops; + +struct cubeb { + struct cubeb_ops const * ops; +}; + +struct sun_stream { + char name[32]; + int fd; + void * buf; + struct audio_info info; + unsigned frame_size; /* precision in bytes * channels */ + bool floating; +}; + +struct cubeb_stream { + struct cubeb * context; + void * user_ptr; + pthread_t thread; + pthread_mutex_t mutex; /* protects running, volume, frames_written */ + bool running; + float volume; + struct sun_stream play; + struct sun_stream record; + cubeb_data_callback data_cb; + cubeb_state_callback state_cb; + uint64_t frames_written; + uint64_t blocks_written; +}; + +int +sun_init(cubeb ** context, char const * context_name) +{ + cubeb * c; + + (void)context_name; + if ((c = calloc(1, sizeof(cubeb))) == NULL) { + return CUBEB_ERROR; + } + c->ops = &sun_ops; + *context = c; + return CUBEB_OK; +} + +static void +sun_destroy(cubeb * context) +{ + free(context); +} + +static char const * +sun_get_backend_id(cubeb * context) +{ + return "sun"; +} + +static int +sun_get_preferred_sample_rate(cubeb * context, uint32_t * rate) +{ + (void)context; + + *rate = SUN_PREFER_RATE; + return CUBEB_OK; +} + +static int +sun_get_max_channel_count(cubeb * context, uint32_t * max_channels) +{ + (void)context; + + *max_channels = SUN_MAX_CHANNELS; + return CUBEB_OK; +} + +static int +sun_get_min_latency(cubeb * context, cubeb_stream_params params, + uint32_t * latency_frames) +{ + (void)context; + + *latency_frames = SUN_LATENCY_MS * params.rate / 1000; + return CUBEB_OK; +} + +static int +sun_get_hwinfo(const char * device, struct audio_info * format, int * props, + struct audio_device * dev) +{ + int fd = -1; + + if ((fd = open(device, O_RDONLY)) == -1) { + goto error; + } +#ifdef AUDIO_GETFORMAT + if (ioctl(fd, AUDIO_GETFORMAT, format) != 0) { + goto error; + } +#endif +#ifdef AUDIO_GETPROPS + if (ioctl(fd, AUDIO_GETPROPS, props) != 0) { + goto error; + } +#endif + if (ioctl(fd, AUDIO_GETDEV, dev) != 0) { + goto error; + } + close(fd); + return CUBEB_OK; +error: + if (fd != -1) { + close(fd); + } + return CUBEB_ERROR; +} + +/* + * XXX: PR kern/54264 + */ +static int +sun_prinfo_verify_sanity(struct audio_prinfo * prinfo) +{ + return prinfo->precision >= 8 && prinfo->precision <= 32 && + prinfo->channels >= 1 && prinfo->channels < SUN_MAX_CHANNELS && + prinfo->sample_rate < SUN_MAX_RATE && + prinfo->sample_rate > SUN_MIN_RATE; +} + +static int +sun_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection) +{ + unsigned i; + cubeb_device_info device = {0}; + char dev[16] = SUN_DEFAULT_DEVICE; + char dev_friendly[64]; + struct audio_info hwfmt; + struct audio_device hwname; + struct audio_prinfo * prinfo = NULL; + int hwprops; + + collection->device = calloc(SUN_DEVICE_COUNT, sizeof(cubeb_device_info)); + if (collection->device == NULL) { + return CUBEB_ERROR; + } + collection->count = 0; + + for (i = 0; i < SUN_DEVICE_COUNT; ++i) { + if (i > 0) { + (void)snprintf(dev, sizeof(dev), "/dev/audio%u", i - 1); + } + if (sun_get_hwinfo(dev, &hwfmt, &hwprops, &hwname) != CUBEB_OK) { + continue; + } +#ifdef AUDIO_GETPROPS + device.type = 0; + if ((hwprops & AUDIO_PROP_CAPTURE) != 0 && + sun_prinfo_verify_sanity(&hwfmt.record)) { + /* the device supports recording, probably */ + device.type |= CUBEB_DEVICE_TYPE_INPUT; + } + if ((hwprops & AUDIO_PROP_PLAYBACK) != 0 && + sun_prinfo_verify_sanity(&hwfmt.play)) { + /* the device supports playback, probably */ + device.type |= CUBEB_DEVICE_TYPE_OUTPUT; + } + switch (device.type) { + case 0: + /* device doesn't do input or output, aliens probably involved */ + continue; + case CUBEB_DEVICE_TYPE_INPUT: + if ((type & CUBEB_DEVICE_TYPE_INPUT) == 0) { + /* this device is input only, not scanning for those, skip it */ + continue; + } + break; + case CUBEB_DEVICE_TYPE_OUTPUT: + if ((type & CUBEB_DEVICE_TYPE_OUTPUT) == 0) { + /* this device is output only, not scanning for those, skip it */ + continue; + } + break; + } + if ((type & CUBEB_DEVICE_TYPE_INPUT) != 0) { + prinfo = &hwfmt.record; + } + if ((type & CUBEB_DEVICE_TYPE_OUTPUT) != 0) { + prinfo = &hwfmt.play; + } +#endif + if (i > 0) { + (void)snprintf(dev_friendly, sizeof(dev_friendly), "%s %s %s (%d)", + hwname.name, hwname.version, hwname.config, i - 1); + } else { + (void)snprintf(dev_friendly, sizeof(dev_friendly), "%s %s %s (default)", + hwname.name, hwname.version, hwname.config); + } + device.devid = (void *)(uintptr_t)i; + device.device_id = strdup(dev); + device.friendly_name = strdup(dev_friendly); + device.group_id = strdup(dev); + device.vendor_name = strdup(hwname.name); + device.type = type; + device.state = CUBEB_DEVICE_STATE_ENABLED; + device.preferred = + (i == 0) ? CUBEB_DEVICE_PREF_ALL : CUBEB_DEVICE_PREF_NONE; +#ifdef AUDIO_GETFORMAT + device.max_channels = prinfo->channels; + device.default_rate = prinfo->sample_rate; +#else + device.max_channels = 2; + device.default_rate = SUN_PREFER_RATE; +#endif + device.default_format = CUBEB_DEVICE_FMT_S16NE; + device.format = CUBEB_DEVICE_FMT_S16NE; + device.min_rate = SUN_MIN_RATE; + device.max_rate = SUN_MAX_RATE; + device.latency_lo = SUN_LATENCY_MS * SUN_MIN_RATE / 1000; + device.latency_hi = SUN_LATENCY_MS * SUN_MAX_RATE / 1000; + collection->device[collection->count++] = device; + } + return CUBEB_OK; +} + +static int +sun_device_collection_destroy(cubeb * context, + cubeb_device_collection * collection) +{ + unsigned i; + + for (i = 0; i < collection->count; ++i) { + free((char *)collection->device[i].device_id); + free((char *)collection->device[i].friendly_name); + free((char *)collection->device[i].group_id); + free((char *)collection->device[i].vendor_name); + } + free(collection->device); + return CUBEB_OK; +} + +static int +sun_copy_params(int fd, cubeb_stream * stream, cubeb_stream_params * params, + struct audio_info * info, struct audio_prinfo * prinfo) +{ + prinfo->channels = params->channels; + prinfo->sample_rate = params->rate; +#ifdef AUDIO_ENCODING_SLINEAR_LE + switch (params->format) { + case CUBEB_SAMPLE_S16LE: + prinfo->encoding = AUDIO_ENCODING_SLINEAR_LE; + prinfo->precision = 16; + break; + case CUBEB_SAMPLE_S16BE: + prinfo->encoding = AUDIO_ENCODING_SLINEAR_BE; + prinfo->precision = 16; + break; + case CUBEB_SAMPLE_FLOAT32NE: + prinfo->encoding = AUDIO_ENCODING_SLINEAR; + prinfo->precision = 32; + break; + default: + LOG("Unsupported format"); + return CUBEB_ERROR_INVALID_FORMAT; + } +#else + switch (params->format) { + case CUBEB_SAMPLE_S16NE: + prinfo->encoding = AUDIO_ENCODING_LINEAR; + prinfo->precision = 16; + break; + case CUBEB_SAMPLE_FLOAT32NE: + prinfo->encoding = AUDIO_ENCODING_LINEAR; + prinfo->precision = 32; + break; + default: + LOG("Unsupported format"); + return CUBEB_ERROR_INVALID_FORMAT; + } +#endif + if (ioctl(fd, AUDIO_SETINFO, info) == -1) { + return CUBEB_ERROR; + } + if (ioctl(fd, AUDIO_GETINFO, info) == -1) { + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +static int +sun_stream_stop(cubeb_stream * s) +{ + pthread_mutex_lock(&s->mutex); + if (s->running) { + s->running = false; + pthread_mutex_unlock(&s->mutex); + pthread_join(s->thread, NULL); + } else { + pthread_mutex_unlock(&s->mutex); + } + return CUBEB_OK; +} + +static void +sun_stream_destroy(cubeb_stream * s) +{ + sun_stream_stop(s); + pthread_mutex_destroy(&s->mutex); + if (s->play.fd != -1) { + close(s->play.fd); + } + if (s->record.fd != -1) { + close(s->record.fd); + } + free(s->play.buf); + free(s->record.buf); + free(s); +} + +static void +sun_float_to_linear32(void * buf, unsigned sample_count, float vol) +{ + float * in = buf; + int32_t * out = buf; + int32_t * tail = out + sample_count; + + while (out < tail) { + float f = *(in++) * vol; + if (f < -1.0) + f = -1.0; + else if (f > 1.0) + f = 1.0; + *(out++) = f * (float)INT32_MAX; + } +} + +static void +sun_linear32_to_float(void * buf, unsigned sample_count) +{ + int32_t * in = buf; + float * out = buf; + float * tail = out + sample_count; + + while (out < tail) { + *(out++) = (1.0 / 0x80000000) * *(in++); + } +} + +static void +sun_linear16_set_vol(int16_t * buf, unsigned sample_count, float vol) +{ + unsigned i; + int32_t multiplier = vol * 0x8000; + + for (i = 0; i < sample_count; ++i) { + buf[i] = (buf[i] * multiplier) >> 15; + } +} + +static void * +sun_io_routine(void * arg) +{ + cubeb_stream * s = arg; + cubeb_state state = CUBEB_STATE_STARTED; + size_t to_read = 0; + long to_write = 0; + size_t write_ofs = 0; + size_t read_ofs = 0; + int drain = 0; + + CUBEB_REGISTER_THREAD("cubeb rendering thread"); + + s->state_cb(s, s->user_ptr, CUBEB_STATE_STARTED); + while (state != CUBEB_STATE_ERROR) { + pthread_mutex_lock(&s->mutex); + if (!s->running) { + pthread_mutex_unlock(&s->mutex); + state = CUBEB_STATE_STOPPED; + break; + } + pthread_mutex_unlock(&s->mutex); + if (s->record.fd != -1 && s->record.floating) { + sun_linear32_to_float(s->record.buf, + s->record.info.record.channels * SUN_BUFFER_FRAMES); + } + to_write = s->data_cb(s, s->user_ptr, s->record.buf, s->play.buf, + SUN_BUFFER_FRAMES); + if (to_write == CUBEB_ERROR) { + state = CUBEB_STATE_ERROR; + break; + } + if (s->play.fd != -1) { + float vol; + + pthread_mutex_lock(&s->mutex); + vol = s->volume; + pthread_mutex_unlock(&s->mutex); + + if (s->play.floating) { + sun_float_to_linear32(s->play.buf, + s->play.info.play.channels * to_write, vol); + } else { + sun_linear16_set_vol(s->play.buf, s->play.info.play.channels * to_write, + vol); + } + } + if (to_write < SUN_BUFFER_FRAMES) { + drain = 1; + } + to_write = s->play.fd != -1 ? to_write : 0; + to_read = s->record.fd != -1 ? SUN_BUFFER_FRAMES : 0; + write_ofs = 0; + read_ofs = 0; + while (to_write > 0 || to_read > 0) { + size_t bytes; + ssize_t n, frames; + + if (to_write > 0) { + bytes = to_write * s->play.frame_size; + if ((n = write(s->play.fd, (uint8_t *)s->play.buf + write_ofs, bytes)) < + 0) { + state = CUBEB_STATE_ERROR; + break; + } + frames = n / s->play.frame_size; + pthread_mutex_lock(&s->mutex); + s->frames_written += frames; + pthread_mutex_unlock(&s->mutex); + to_write -= frames; + write_ofs += n; + } + if (to_read > 0) { + bytes = to_read * s->record.frame_size; + if ((n = read(s->record.fd, (uint8_t *)s->record.buf + read_ofs, + bytes)) < 0) { + state = CUBEB_STATE_ERROR; + break; + } + frames = n / s->record.frame_size; + to_read -= frames; + read_ofs += n; + } + } + if (drain && state != CUBEB_STATE_ERROR) { + state = CUBEB_STATE_DRAINED; + break; + } + } + s->state_cb(s, s->user_ptr, state); + CUBEB_UNREGISTER_THREAD(); + return NULL; +} + +static int +sun_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned latency_frames, cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + int ret = CUBEB_OK; + cubeb_stream * s = NULL; + + (void)stream_name; + (void)latency_frames; + if ((s = calloc(1, sizeof(cubeb_stream))) == NULL) { + ret = CUBEB_ERROR; + goto error; + } + s->record.fd = -1; + s->play.fd = -1; + if (input_device != 0) { + snprintf(s->record.name, sizeof(s->record.name), "/dev/audio%zu", + (uintptr_t)input_device - 1); + } else { + snprintf(s->record.name, sizeof(s->record.name), "%s", SUN_DEFAULT_DEVICE); + } + if (output_device != 0) { + snprintf(s->play.name, sizeof(s->play.name), "/dev/audio%zu", + (uintptr_t)output_device - 1); + } else { + snprintf(s->play.name, sizeof(s->play.name), "%s", SUN_DEFAULT_DEVICE); + } + if (input_stream_params != NULL) { + if (input_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + LOG("Loopback not supported"); + ret = CUBEB_ERROR_NOT_SUPPORTED; + goto error; + } + if (s->record.fd == -1) { + if ((s->record.fd = open(s->record.name, O_RDONLY)) == -1) { + LOG("Audio device could not be opened as read-only"); + ret = CUBEB_ERROR_DEVICE_UNAVAILABLE; + goto error; + } + } + AUDIO_INITINFO(&s->record.info); +#ifdef AUMODE_RECORD + s->record.info.mode = AUMODE_RECORD; +#endif + if ((ret = sun_copy_params(s->record.fd, s, input_stream_params, + &s->record.info, &s->record.info.record)) != + CUBEB_OK) { + LOG("Setting record params failed"); + goto error; + } + s->record.floating = + (input_stream_params->format == CUBEB_SAMPLE_FLOAT32NE); + } + if (output_stream_params != NULL) { + if (output_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + LOG("Loopback not supported"); + ret = CUBEB_ERROR_NOT_SUPPORTED; + goto error; + } + if (s->play.fd == -1) { + if ((s->play.fd = open(s->play.name, O_WRONLY)) == -1) { + LOG("Audio device could not be opened as write-only"); + ret = CUBEB_ERROR_DEVICE_UNAVAILABLE; + goto error; + } + } + AUDIO_INITINFO(&s->play.info); +#ifdef AUMODE_PLAY + s->play.info.mode = AUMODE_PLAY; +#endif + if ((ret = sun_copy_params(s->play.fd, s, output_stream_params, + &s->play.info, &s->play.info.play)) != + CUBEB_OK) { + LOG("Setting play params failed"); + goto error; + } + s->play.floating = (output_stream_params->format == CUBEB_SAMPLE_FLOAT32NE); + } + s->context = context; + s->volume = 1.0; + s->state_cb = state_callback; + s->data_cb = data_callback; + s->user_ptr = user_ptr; + if (pthread_mutex_init(&s->mutex, NULL) != 0) { + LOG("Failed to create mutex"); + goto error; + } + s->play.frame_size = + s->play.info.play.channels * (s->play.info.play.precision / 8); + if (s->play.fd != -1 && + (s->play.buf = calloc(SUN_BUFFER_FRAMES, s->play.frame_size)) == NULL) { + ret = CUBEB_ERROR; + goto error; + } + s->record.frame_size = + s->record.info.record.channels * (s->record.info.record.precision / 8); + if (s->record.fd != -1 && + (s->record.buf = calloc(SUN_BUFFER_FRAMES, s->record.frame_size)) == + NULL) { + ret = CUBEB_ERROR; + goto error; + } + *stream = s; + return CUBEB_OK; +error: + if (s != NULL) { + sun_stream_destroy(s); + } + return ret; +} + +static int +sun_stream_start(cubeb_stream * s) +{ + s->running = true; + if (pthread_create(&s->thread, NULL, sun_io_routine, s) != 0) { + LOG("Couldn't create thread"); + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +static int +sun_stream_get_position(cubeb_stream * s, uint64_t * position) +{ +#ifdef AUDIO_GETOOFFS + struct audio_offset offset; + + if (ioctl(s->play.fd, AUDIO_GETOOFFS, &offset) == -1) { + return CUBEB_ERROR; + } + s->blocks_written += offset.deltablks; + *position = (s->blocks_written * s->play.info.blocksize) / s->play.frame_size; + return CUBEB_OK; +#else + pthread_mutex_lock(&s->mutex); + *position = s->frames_written; + pthread_mutex_unlock(&s->mutex); + return CUBEB_OK; +#endif +} + +static int +sun_stream_get_latency(cubeb_stream * s, uint32_t * latency) +{ +#ifdef AUDIO_GETBUFINFO + struct audio_info info; + + if (ioctl(s->play.fd, AUDIO_GETBUFINFO, &info) == -1) { + return CUBEB_ERROR; + } + + *latency = (info.play.seek + info.blocksize) / s->play.frame_size; + return CUBEB_OK; +#else + cubeb_stream_params params; + + params.rate = s->play.info.play.sample_rate; + + return sun_get_min_latency(NULL, params, latency); +#endif +} + +static int +sun_stream_set_volume(cubeb_stream * stream, float volume) +{ + pthread_mutex_lock(&stream->mutex); + stream->volume = volume; + pthread_mutex_unlock(&stream->mutex); + return CUBEB_OK; +} + +static int +sun_get_current_device(cubeb_stream * stream, cubeb_device ** const device) +{ + *device = calloc(1, sizeof(cubeb_device)); + if (*device == NULL) { + return CUBEB_ERROR; + } + (*device)->input_name = + stream->record.fd != -1 ? strdup(stream->record.name) : NULL; + (*device)->output_name = + stream->play.fd != -1 ? strdup(stream->play.name) : NULL; + return CUBEB_OK; +} + +static int +sun_stream_device_destroy(cubeb_stream * stream, cubeb_device * device) +{ + (void)stream; + free(device->input_name); + free(device->output_name); + free(device); + return CUBEB_OK; +} + +static struct cubeb_ops const sun_ops = { + .init = sun_init, + .get_backend_id = sun_get_backend_id, + .get_max_channel_count = sun_get_max_channel_count, + .get_min_latency = sun_get_min_latency, + .get_preferred_sample_rate = sun_get_preferred_sample_rate, + .enumerate_devices = sun_enumerate_devices, + .device_collection_destroy = sun_device_collection_destroy, + .destroy = sun_destroy, + .stream_init = sun_stream_init, + .stream_destroy = sun_stream_destroy, + .stream_start = sun_stream_start, + .stream_stop = sun_stream_stop, + .stream_get_position = sun_stream_get_position, + .stream_get_latency = sun_stream_get_latency, + .stream_get_input_latency = NULL, + .stream_set_volume = sun_stream_set_volume, + .stream_set_name = NULL, + .stream_get_current_device = sun_get_current_device, + .stream_device_destroy = sun_stream_device_destroy, + .stream_register_device_changed_callback = NULL, + .register_device_collection_changed = NULL}; diff --git a/3rdparty/cubeb/src/cubeb_tracing.h b/3rdparty/cubeb/src/cubeb_tracing.h new file mode 100644 index 0000000000..49944cdf67 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_tracing.h @@ -0,0 +1,23 @@ +/* + * Copyright © 2022 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#ifndef CUBEB_TRACING_H +#define CUBEB_TRACING_H + +/* Empty header to allow hooking up a frame profiler. */ + +// To be called once on a thread to register for tracing. +#define CUBEB_REGISTER_THREAD(name) +// To be called once before a registered threads exits. +#define CUBEB_UNREGISTER_THREAD() +// Insert a tracing marker, with a particular name. +// Phase can be 'x': instant marker, start time but no duration +// 'b': beginning of a marker with a duration +// 'e': end of a marker with a duration +#define CUBEB_TRACE(name, phase) + +#endif // CUBEB_TRACING_H diff --git a/3rdparty/cubeb/src/cubeb_utils.cpp b/3rdparty/cubeb/src/cubeb_utils.cpp new file mode 100644 index 0000000000..dd1aef7b82 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_utils.cpp @@ -0,0 +1,25 @@ +/* + * Copyright © 2018 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#include "cubeb_utils.h" + +size_t +cubeb_sample_size(cubeb_sample_format format) +{ + switch (format) { + case CUBEB_SAMPLE_S16LE: + case CUBEB_SAMPLE_S16BE: + return sizeof(int16_t); + case CUBEB_SAMPLE_FLOAT32LE: + case CUBEB_SAMPLE_FLOAT32BE: + return sizeof(float); + default: + // should never happen as all cases are handled above. + assert(false); + return 0; + } +} diff --git a/3rdparty/cubeb/src/cubeb_utils.h b/3rdparty/cubeb/src/cubeb_utils.h new file mode 100644 index 0000000000..fd7a3d7406 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_utils.h @@ -0,0 +1,309 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#if !defined(CUBEB_UTILS) +#define CUBEB_UTILS + +#include "cubeb/cubeb.h" + +#ifdef __cplusplus + +#include +#include +#include +#include +#include +#if defined(_WIN32) +#include "cubeb_utils_win.h" +#else +#include "cubeb_utils_unix.h" +#endif + +/** Similar to memcpy, but accounts for the size of an element. */ +template +void +PodCopy(T * destination, const T * source, size_t count) +{ + static_assert(std::is_trivial::value, "Requires trivial type"); + assert(destination && source); + memcpy(destination, source, count * sizeof(T)); +} + +/** Similar to memmove, but accounts for the size of an element. */ +template +void +PodMove(T * destination, const T * source, size_t count) +{ + static_assert(std::is_trivial::value, "Requires trivial type"); + assert(destination && source); + memmove(destination, source, count * sizeof(T)); +} + +/** Similar to a memset to zero, but accounts for the size of an element. */ +template +void +PodZero(T * destination, size_t count) +{ + static_assert(std::is_trivial::value, "Requires trivial type"); + assert(destination); + memset(destination, 0, count * sizeof(T)); +} + +namespace { +template +void +Copy(T * destination, const T * source, size_t count, Trait) +{ + for (size_t i = 0; i < count; i++) { + destination[i] = source[i]; + } +} + +template +void +Copy(T * destination, const T * source, size_t count, std::true_type) +{ + PodCopy(destination, source, count); +} +} // namespace + +/** + * This allows copying a number of elements from a `source` pointer to a + * `destination` pointer, using `memcpy` if it is safe to do so, or a loop that + * calls the constructors and destructors otherwise. + */ +template +void +Copy(T * destination, const T * source, size_t count) +{ + assert(destination && source); + Copy(destination, source, count, typename std::is_trivial::type()); +} + +namespace { +template +void +ConstructDefault(T * destination, size_t count, Trait) +{ + for (size_t i = 0; i < count; i++) { + destination[i] = T(); + } +} + +template +void +ConstructDefault(T * destination, size_t count, std::true_type) +{ + PodZero(destination, count); +} +} // namespace + +/** + * This allows zeroing (using memset) or default-constructing a number of + * elements calling the constructors and destructors if necessary. + */ +template +void +ConstructDefault(T * destination, size_t count) +{ + assert(destination); + ConstructDefault(destination, count, typename std::is_arithmetic::type()); +} + +template class auto_array { +public: + explicit auto_array(uint32_t capacity = 0) + : data_(capacity ? new T[capacity] : nullptr), capacity_(capacity), + length_(0) + { + } + + ~auto_array() { delete[] data_; } + + /** Get a constant pointer to the underlying data. */ + T * data() const { return data_; } + + T * end() const { return data_ + length_; } + + const T & at(size_t index) const + { + assert(index < length_ && "out of range"); + return data_[index]; + } + + T & at(size_t index) + { + assert(index < length_ && "out of range"); + return data_[index]; + } + + /** Get how much underlying storage this auto_array has. */ + size_t capacity() const { return capacity_; } + + /** Get how much elements this auto_array contains. */ + size_t length() const { return length_; } + + /** Keeps the storage, but removes all the elements from the array. */ + void clear() { length_ = 0; } + + /** Change the storage of this auto array, copying the elements to the new + * storage. + * @returns true in case of success + * @returns false if the new capacity is not big enough to accomodate for the + * elements in the array. + */ + bool reserve(size_t new_capacity) + { + if (new_capacity < length_) { + return false; + } + T * new_data = new T[new_capacity]; + if (data_ && length_) { + PodCopy(new_data, data_, length_); + } + capacity_ = new_capacity; + delete[] data_; + data_ = new_data; + + return true; + } + + /** Append `length` elements to the end of the array, resizing the array if + * needed. + * @parameter elements the elements to append to the array. + * @parameter length the number of elements to append to the array. + */ + void push(const T * elements, size_t length) + { + if (length_ + length > capacity_) { + reserve(length_ + length); + } + PodCopy(data_ + length_, elements, length); + length_ += length; + } + + /** Append `length` zero-ed elements to the end of the array, resizing the + * array if needed. + * @parameter length the number of elements to append to the array. + */ + void push_silence(size_t length) + { + if (length_ + length > capacity_) { + reserve(length + length_); + } + PodZero(data_ + length_, length); + length_ += length; + } + + /** Prepend `length` zero-ed elements to the end of the array, resizing the + * array if needed. + * @parameter length the number of elements to prepend to the array. + */ + void push_front_silence(size_t length) + { + if (length_ + length > capacity_) { + reserve(length + length_); + } + PodMove(data_ + length, data_, length_); + PodZero(data_, length); + length_ += length; + } + + /** Return the number of free elements in the array. */ + size_t available() const { return capacity_ - length_; } + + /** Copies `length` elements to `elements` if it is not null, and shift + * the remaining elements of the `auto_array` to the beginning. + * @parameter elements a buffer to copy the elements to, or nullptr. + * @parameter length the number of elements to copy. + * @returns true in case of success. + * @returns false if the auto_array contains less than `length` elements. */ + bool pop(T * elements, size_t length) + { + if (length > length_) { + return false; + } + if (elements) { + PodCopy(elements, data_, length); + } + PodMove(data_, data_ + length, length_ - length); + + length_ -= length; + + return true; + } + + void set_length(size_t length) + { + assert(length <= capacity_); + length_ = length; + } + +private: + /** The underlying storage */ + T * data_; + /** The size, in number of elements, of the storage. */ + size_t capacity_; + /** The number of elements the array contains. */ + size_t length_; +}; + +struct auto_array_wrapper { + virtual void push(void * elements, size_t length) = 0; + virtual size_t length() = 0; + virtual void push_silence(size_t length) = 0; + virtual bool pop(size_t length) = 0; + virtual void * data() = 0; + virtual void * end() = 0; + virtual void clear() = 0; + virtual bool reserve(size_t capacity) = 0; + virtual void set_length(size_t length) = 0; + virtual ~auto_array_wrapper() {} +}; + +template +struct auto_array_wrapper_impl : public auto_array_wrapper { + auto_array_wrapper_impl() {} + + explicit auto_array_wrapper_impl(uint32_t size) : ar(size) {} + + void push(void * elements, size_t length) override + { + ar.push(static_cast(elements), length); + } + + size_t length() override { return ar.length(); } + + void push_silence(size_t length) override { ar.push_silence(length); } + + bool pop(size_t length) override { return ar.pop(nullptr, length); } + + void * data() override { return ar.data(); } + + void * end() override { return ar.end(); } + + void clear() override { ar.clear(); } + + bool reserve(size_t capacity) override { return ar.reserve(capacity); } + + void set_length(size_t length) override { ar.set_length(length); } + + ~auto_array_wrapper_impl() { ar.clear(); } + +private: + auto_array ar; +}; + +extern "C" { +size_t +cubeb_sample_size(cubeb_sample_format format); +} + +using auto_lock = std::lock_guard; +#endif // __cplusplus + +#endif /* CUBEB_UTILS */ diff --git a/3rdparty/cubeb/src/cubeb_utils_unix.h b/3rdparty/cubeb/src/cubeb_utils_unix.h new file mode 100644 index 0000000000..b6618ca45e --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_utils_unix.h @@ -0,0 +1,88 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#if !defined(CUBEB_UTILS_UNIX) +#define CUBEB_UTILS_UNIX + +#include +#include +#include + +/* This wraps a critical section to track the owner in debug mode. */ +class owned_critical_section { +public: + owned_critical_section() + { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); +#ifndef NDEBUG + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); +#else + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); +#endif + +#ifndef NDEBUG + int r = +#endif + pthread_mutex_init(&mutex, &attr); +#ifndef NDEBUG + assert(r == 0); +#endif + + pthread_mutexattr_destroy(&attr); + } + + ~owned_critical_section() + { +#ifndef NDEBUG + int r = +#endif + pthread_mutex_destroy(&mutex); +#ifndef NDEBUG + assert(r == 0); +#endif + } + + void lock() + { +#ifndef NDEBUG + int r = +#endif + pthread_mutex_lock(&mutex); +#ifndef NDEBUG + assert(r == 0 && "Deadlock"); +#endif + } + + void unlock() + { +#ifndef NDEBUG + int r = +#endif + pthread_mutex_unlock(&mutex); +#ifndef NDEBUG + assert(r == 0 && "Unlocking unlocked mutex"); +#endif + } + + void assert_current_thread_owns() + { +#ifndef NDEBUG + int r = pthread_mutex_lock(&mutex); + assert(r == EDEADLK); +#endif + } + +private: + pthread_mutex_t mutex; + + // Disallow copy and assignment because pthread_mutex_t cannot be copied. + owned_critical_section(const owned_critical_section &); + owned_critical_section & operator=(const owned_critical_section &); +}; + +#endif /* CUBEB_UTILS_UNIX */ diff --git a/3rdparty/cubeb/src/cubeb_utils_win.h b/3rdparty/cubeb/src/cubeb_utils_win.h new file mode 100644 index 0000000000..48e7b1b6d0 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_utils_win.h @@ -0,0 +1,67 @@ +/* + * Copyright © 2016 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ + +#if !defined(CUBEB_UTILS_WIN) +#define CUBEB_UTILS_WIN + +#include "cubeb-internal.h" +#include + +/* This wraps an SRWLock to track the owner in debug mode, adapted from + NSPR and http://blogs.msdn.com/b/oldnewthing/archive/2013/07/12/10433554.aspx + */ +class owned_critical_section { +public: + owned_critical_section() + : srwlock(SRWLOCK_INIT) +#ifndef NDEBUG + , + owner(0) +#endif + { + } + + void lock() + { + AcquireSRWLockExclusive(&srwlock); +#ifndef NDEBUG + XASSERT(owner != GetCurrentThreadId() && "recursive locking"); + owner = GetCurrentThreadId(); +#endif + } + + void unlock() + { +#ifndef NDEBUG + /* GetCurrentThreadId cannot return 0: it is not a the valid thread id */ + owner = 0; +#endif + ReleaseSRWLockExclusive(&srwlock); + } + + /* This is guaranteed to have the good behaviour if it succeeds. The behaviour + is undefined otherwise. */ + void assert_current_thread_owns() + { +#ifndef NDEBUG + /* This implies owner != 0, because GetCurrentThreadId cannot return 0. */ + XASSERT(owner == GetCurrentThreadId()); +#endif + } + +private: + SRWLOCK srwlock; +#ifndef NDEBUG + DWORD owner; +#endif + + // Disallow copy and assignment because SRWLock cannot be copied. + owned_critical_section(const owned_critical_section &); + owned_critical_section & operator=(const owned_critical_section &); +}; + +#endif /* CUBEB_UTILS_WIN */ diff --git a/3rdparty/cubeb/src/cubeb_wasapi.cpp b/3rdparty/cubeb/src/cubeb_wasapi.cpp new file mode 100644 index 0000000000..6bbaab5cff --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_wasapi.cpp @@ -0,0 +1,3544 @@ +/* + * Copyright © 2013 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#define _WIN32_WINNT 0x0603 +#define NOMINMAX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include "cubeb_mixer.h" +#include "cubeb_resampler.h" +#include "cubeb_strings.h" +#include "cubeb_tracing.h" +#include "cubeb_utils.h" + +// Windows 10 exposes the IAudioClient3 interface to create low-latency streams. +// Copy the interface definition from audioclient.h here to make the code +// simpler and so that we can still access IAudioClient3 via COM if cubeb was +// compiled against an older SDK. +#ifndef __IAudioClient3_INTERFACE_DEFINED__ +#define __IAudioClient3_INTERFACE_DEFINED__ +MIDL_INTERFACE("7ED4EE07-8E67-4CD4-8C1A-2B7A5987AD42") +IAudioClient3 : public IAudioClient +{ +public: + virtual HRESULT STDMETHODCALLTYPE GetSharedModeEnginePeriod( + /* [annotation][in] */ + _In_ const WAVEFORMATEX * pFormat, + /* [annotation][out] */ + _Out_ UINT32 * pDefaultPeriodInFrames, + /* [annotation][out] */ + _Out_ UINT32 * pFundamentalPeriodInFrames, + /* [annotation][out] */ + _Out_ UINT32 * pMinPeriodInFrames, + /* [annotation][out] */ + _Out_ UINT32 * pMaxPeriodInFrames) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetCurrentSharedModeEnginePeriod( + /* [unique][annotation][out] */ + _Out_ WAVEFORMATEX * *ppFormat, + /* [annotation][out] */ + _Out_ UINT32 * pCurrentPeriodInFrames) = 0; + + virtual HRESULT STDMETHODCALLTYPE InitializeSharedAudioStream( + /* [annotation][in] */ + _In_ DWORD StreamFlags, + /* [annotation][in] */ + _In_ UINT32 PeriodInFrames, + /* [annotation][in] */ + _In_ const WAVEFORMATEX * pFormat, + /* [annotation][in] */ + _In_opt_ LPCGUID AudioSessionGuid) = 0; +}; +#ifdef __CRT_UUID_DECL +// Required for MinGW +__CRT_UUID_DECL(IAudioClient3, 0x7ED4EE07, 0x8E67, 0x4CD4, 0x8C, 0x1A, 0x2B, + 0x7A, 0x59, 0x87, 0xAD, 0x42) +#endif +#endif +// Copied from audioclient.h in the Windows 10 SDK +#ifndef AUDCLNT_E_ENGINE_PERIODICITY_LOCKED +#define AUDCLNT_E_ENGINE_PERIODICITY_LOCKED AUDCLNT_ERR(0x028) +#endif + +#ifndef PKEY_Device_FriendlyName +DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, + 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, + 14); // DEVPROP_TYPE_STRING +#endif +#ifndef PKEY_Device_InstanceId +DEFINE_PROPERTYKEY(PKEY_Device_InstanceId, 0x78c34fc8, 0x104a, 0x4aca, 0x9e, + 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, + 0x00000100); // VT_LPWSTR +#endif + +namespace { + +const int64_t LATENCY_NOT_AVAILABLE_YET = -1; + +struct com_heap_ptr_deleter { + void operator()(void * ptr) const noexcept { CoTaskMemFree(ptr); } +}; + +template +using com_heap_ptr = std::unique_ptr; + +template constexpr size_t ARRAY_LENGTH(T (&)[N]) +{ + return N; +} + +template class no_addref_release : public T { + ULONG STDMETHODCALLTYPE AddRef() = 0; + ULONG STDMETHODCALLTYPE Release() = 0; +}; + +template class com_ptr { +public: + com_ptr() noexcept = default; + + com_ptr(com_ptr const & other) noexcept = delete; + com_ptr & operator=(com_ptr const & other) noexcept = delete; + T ** operator&() const noexcept = delete; + + ~com_ptr() noexcept { release(); } + + com_ptr(com_ptr && other) noexcept : ptr(other.ptr) { other.ptr = nullptr; } + + com_ptr & operator=(com_ptr && other) noexcept + { + if (ptr != other.ptr) { + release(); + ptr = other.ptr; + other.ptr = nullptr; + } + return *this; + } + + explicit operator bool() const noexcept { return nullptr != ptr; } + + no_addref_release * operator->() const noexcept + { + return static_cast *>(ptr); + } + + T * get() const noexcept { return ptr; } + + T ** receive() noexcept + { + XASSERT(ptr == nullptr); + return &ptr; + } + + void ** receive_vpp() noexcept + { + return reinterpret_cast(receive()); + } + + com_ptr & operator=(std::nullptr_t) noexcept + { + release(); + return *this; + } + + void reset(T * p = nullptr) noexcept + { + release(); + ptr = p; + } + +private: + void release() noexcept + { + T * temp = ptr; + + if (temp) { + ptr = nullptr; + temp->Release(); + } + } + + T * ptr = nullptr; +}; + +extern cubeb_ops const wasapi_ops; + +static com_heap_ptr +wasapi_get_default_device_id(EDataFlow flow, ERole role, + IMMDeviceEnumerator * enumerator); + +struct wasapi_default_devices { + wasapi_default_devices(IMMDeviceEnumerator * enumerator) + : render_console_id( + wasapi_get_default_device_id(eRender, eConsole, enumerator)), + render_comms_id( + wasapi_get_default_device_id(eRender, eCommunications, enumerator)), + capture_console_id( + wasapi_get_default_device_id(eCapture, eConsole, enumerator)), + capture_comms_id( + wasapi_get_default_device_id(eCapture, eCommunications, enumerator)) + { + } + + bool is_default(EDataFlow flow, ERole role, wchar_t const * id) + { + wchar_t const * default_id = nullptr; + if (flow == eRender && role == eConsole) { + default_id = this->render_console_id.get(); + } else if (flow == eRender && role == eCommunications) { + default_id = this->render_comms_id.get(); + } else if (flow == eCapture && role == eConsole) { + default_id = this->capture_console_id.get(); + } else if (flow == eCapture && role == eCommunications) { + default_id = this->capture_comms_id.get(); + } + + return default_id && wcscmp(id, default_id) == 0; + } + +private: + com_heap_ptr render_console_id; + com_heap_ptr render_comms_id; + com_heap_ptr capture_console_id; + com_heap_ptr capture_comms_id; +}; + +struct AutoRegisterThread { + AutoRegisterThread(const char * name) { CUBEB_REGISTER_THREAD(name); } + ~AutoRegisterThread() { CUBEB_UNREGISTER_THREAD(); } +}; + +int +wasapi_stream_stop(cubeb_stream * stm); +int +wasapi_stream_start(cubeb_stream * stm); +void +close_wasapi_stream(cubeb_stream * stm); +int +setup_wasapi_stream(cubeb_stream * stm); +ERole +pref_to_role(cubeb_stream_prefs param); +int +wasapi_create_device(cubeb * ctx, cubeb_device_info & ret, + IMMDeviceEnumerator * enumerator, IMMDevice * dev, + wasapi_default_devices * defaults); +void +wasapi_destroy_device(cubeb_device_info * device_info); +static int +wasapi_enumerate_devices_internal(cubeb * context, cubeb_device_type type, + cubeb_device_collection * out, + DWORD state_mask); +static int +wasapi_device_collection_destroy(cubeb * ctx, + cubeb_device_collection * collection); +static char const * +wstr_to_utf8(wchar_t const * str); +static std::unique_ptr +utf8_to_wstr(char const * str); + +} // namespace + +class wasapi_collection_notification_client; +class monitor_device_notifications; + +struct cubeb { + cubeb_ops const * ops = &wasapi_ops; + owned_critical_section lock; + cubeb_strings * device_ids; + /* Device enumerator to get notifications when the + device collection change. */ + com_ptr device_collection_enumerator; + com_ptr collection_notification_client; + /* Collection changed for input (capture) devices. */ + cubeb_device_collection_changed_callback input_collection_changed_callback = + nullptr; + void * input_collection_changed_user_ptr = nullptr; + /* Collection changed for output (render) devices. */ + cubeb_device_collection_changed_callback output_collection_changed_callback = + nullptr; + void * output_collection_changed_user_ptr = nullptr; + UINT64 performance_counter_frequency; +}; + +class wasapi_endpoint_notification_client; + +/* We have three possible callbacks we can use with a stream: + * - input only + * - output only + * - synchronized input and output + * + * Returns true when we should continue to play, false otherwise. + */ +typedef bool (*wasapi_refill_callback)(cubeb_stream * stm); + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context = nullptr; + void * user_ptr = nullptr; + /**/ + + /* Mixer pameters. We need to convert the input stream to this + samplerate/channel layout, as WASAPI does not resample nor upmix + itself. */ + cubeb_stream_params input_mix_params = {CUBEB_SAMPLE_FLOAT32NE, 0, 0, + CUBEB_LAYOUT_UNDEFINED, + CUBEB_STREAM_PREF_NONE}; + cubeb_stream_params output_mix_params = {CUBEB_SAMPLE_FLOAT32NE, 0, 0, + CUBEB_LAYOUT_UNDEFINED, + CUBEB_STREAM_PREF_NONE}; + /* Stream parameters. This is what the client requested, + * and what will be presented in the callback. */ + cubeb_stream_params input_stream_params = {CUBEB_SAMPLE_FLOAT32NE, 0, 0, + CUBEB_LAYOUT_UNDEFINED, + CUBEB_STREAM_PREF_NONE}; + cubeb_stream_params output_stream_params = {CUBEB_SAMPLE_FLOAT32NE, 0, 0, + CUBEB_LAYOUT_UNDEFINED, + CUBEB_STREAM_PREF_NONE}; + /* A MMDevice role for this stream: either communication or console here. */ + ERole role; + /* True if this stream will transport voice-data. */ + bool voice; + /* True if the input device of this stream is using bluetooth handsfree. */ + bool input_bluetooth_handsfree; + /* The input and output device, or NULL for default. */ + std::unique_ptr input_device_id; + std::unique_ptr output_device_id; + com_ptr input_device; + com_ptr output_device; + /* The latency initially requested for this stream, in frames. */ + unsigned latency = 0; + cubeb_state_callback state_callback = nullptr; + cubeb_data_callback data_callback = nullptr; + wasapi_refill_callback refill_callback = nullptr; + /* True when a loopback device is requested with no output device. In this + case a dummy output device is opened to drive the loopback, but should not + be exposed. */ + bool has_dummy_output = false; + /* Lifetime considerations: + - client, render_client, audio_clock and audio_stream_volume are interface + pointer to the IAudioClient. + - The lifetime for device_enumerator and notification_client, resampler, + mix_buffer are the same as the cubeb_stream instance. */ + + /* Main handle on the WASAPI stream. */ + com_ptr output_client; + /* Interface pointer to use the event-driven interface. */ + com_ptr render_client; +#ifdef CUBEB_WASAPI_USE_IAUDIOSTREAMVOLUME + /* Interface pointer to use the volume facilities. */ + com_ptr audio_stream_volume; +#endif + /* Interface pointer to use the stream audio clock. */ + com_ptr audio_clock; + /* Frames written to the stream since it was opened. Reset on device + change. Uses mix_params.rate. */ + UINT64 frames_written = 0; + /* Frames written to the (logical) stream since it was first + created. Updated on device change. Uses stream_params.rate. */ + UINT64 total_frames_written = 0; + /* Last valid reported stream position. Used to ensure the position + reported by stream_get_position increases monotonically. */ + UINT64 prev_position = 0; + /* Device enumerator to be able to be notified when the default + device change. */ + com_ptr device_enumerator; + /* Device notification client, to be able to be notified when the default + audio device changes and route the audio to the new default audio output + device */ + com_ptr notification_client; + /* Main andle to the WASAPI capture stream. */ + com_ptr input_client; + /* Interface to use the event driven capture interface */ + com_ptr capture_client; + /* This event is set by the stream_stop and stream_destroy + function, so the render loop can exit properly. */ + HANDLE shutdown_event = 0; + /* Set by OnDefaultDeviceChanged when a stream reconfiguration is required. + The reconfiguration is handled by the render loop thread. */ + HANDLE reconfigure_event = 0; + /* This is set by WASAPI when we should refill the stream. */ + HANDLE refill_event = 0; + /* This is set by WASAPI when we should read from the input stream. In + * practice, we read from the input stream in the output callback, so + * this is not used, but it is necessary to start getting input data. */ + HANDLE input_available_event = 0; + /* Each cubeb_stream has its own thread. */ + HANDLE thread = 0; + /* The lock protects all members that are touched by the render thread or + change during a device reset, including: audio_clock, audio_stream_volume, + client, frames_written, mix_params, total_frames_written, prev_position. */ + owned_critical_section stream_reset_lock; + /* Maximum number of frames that can be passed down in a callback. */ + uint32_t input_buffer_frame_count = 0; + /* Maximum number of frames that can be requested in a callback. */ + uint32_t output_buffer_frame_count = 0; + /* Resampler instance. Resampling will only happen if necessary. */ + std::unique_ptr + resampler = {nullptr, cubeb_resampler_destroy}; + /* Mixer interfaces */ + std::unique_ptr output_mixer = { + nullptr, cubeb_mixer_destroy}; + std::unique_ptr input_mixer = { + nullptr, cubeb_mixer_destroy}; + /* A buffer for up/down mixing multi-channel audio output. */ + std::vector mix_buffer; + /* WASAPI input works in "packets". We re-linearize the audio packets + * into this buffer before handing it to the resampler. */ + std::unique_ptr linear_input_buffer; + /* Bytes per sample. This multiplied by the number of channels is the number + * of bytes per frame. */ + size_t bytes_per_sample = 0; + /* WAVEFORMATEXTENSIBLE sub-format: either PCM or float. */ + GUID waveformatextensible_sub_format = GUID_NULL; + /* Stream volume. Set via stream_set_volume and used to reset volume on + device changes. */ + float volume = 1.0; + /* True if the stream is draining. */ + bool draining = false; + /* If the render thread fails to stop, this is set to true and ownership of + * the stm is "leaked" to the render thread for later cleanup. */ + std::atomic emergency_bailout{false}; + /* This needs an active audio input stream to be known, and is updated in the + * first audio input callback. */ + std::atomic input_latency_hns{LATENCY_NOT_AVAILABLE_YET}; + + /* Those attributes count the number of frames requested (resp. received) by + the OS, to be able to detect drifts. This is only used for logging for now. */ + size_t total_input_frames = 0; + size_t total_output_frames = 0; +}; + +class monitor_device_notifications { +public: + monitor_device_notifications(cubeb * context) : cubeb_context(context) + { + create_thread(); + } + + ~monitor_device_notifications() + { + SetEvent(begin_shutdown); + WaitForSingleObject(shutdown_complete, INFINITE); + CloseHandle(thread); + + CloseHandle(input_changed); + CloseHandle(output_changed); + CloseHandle(begin_shutdown); + CloseHandle(shutdown_complete); + } + + void notify(EDataFlow flow) + { + XASSERT(cubeb_context); + if (flow == eCapture && cubeb_context->input_collection_changed_callback) { + bool res = SetEvent(input_changed); + if (!res) { + LOG("Failed to set input changed event"); + } + return; + } + if (flow == eRender && cubeb_context->output_collection_changed_callback) { + bool res = SetEvent(output_changed); + if (!res) { + LOG("Failed to set output changed event"); + } + } + } + +private: + static unsigned int __stdcall thread_proc(LPVOID args) + { + AutoRegisterThread raii("WASAPI device notification thread"); + XASSERT(args); + auto mdn = static_cast(args); + mdn->notification_thread_loop(); + SetEvent(mdn->shutdown_complete); + return 0; + } + + void notification_thread_loop() + { + struct auto_com { + auto_com() + { + HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); + XASSERT(SUCCEEDED(hr)); + } + ~auto_com() { CoUninitialize(); } + } com; + + HANDLE wait_array[3] = { + input_changed, + output_changed, + begin_shutdown, + }; + + while (true) { + Sleep(200); + + DWORD wait_result = WaitForMultipleObjects(ARRAY_LENGTH(wait_array), + wait_array, FALSE, INFINITE); + if (wait_result == WAIT_OBJECT_0) { // input changed + cubeb_context->input_collection_changed_callback( + cubeb_context, cubeb_context->input_collection_changed_user_ptr); + } else if (wait_result == WAIT_OBJECT_0 + 1) { // output changed + cubeb_context->output_collection_changed_callback( + cubeb_context, cubeb_context->output_collection_changed_user_ptr); + } else if (wait_result == WAIT_OBJECT_0 + 2) { // shutdown + break; + } else { + LOG("Unexpected result %lu", wait_result); + } + } // loop + } + + void create_thread() + { + output_changed = CreateEvent(nullptr, 0, 0, nullptr); + if (!output_changed) { + LOG("Failed to create output changed event."); + return; + } + + input_changed = CreateEvent(nullptr, 0, 0, nullptr); + if (!input_changed) { + LOG("Failed to create input changed event."); + return; + } + + begin_shutdown = CreateEvent(nullptr, 0, 0, nullptr); + if (!begin_shutdown) { + LOG("Failed to create begin_shutdown event."); + return; + } + + shutdown_complete = CreateEvent(nullptr, 0, 0, nullptr); + if (!shutdown_complete) { + LOG("Failed to create shutdown_complete event."); + return; + } + + thread = (HANDLE)_beginthreadex(nullptr, 256 * 1024, thread_proc, this, + STACK_SIZE_PARAM_IS_A_RESERVATION, nullptr); + if (!thread) { + LOG("Failed to create thread."); + return; + } + } + + HANDLE thread = INVALID_HANDLE_VALUE; + HANDLE output_changed = INVALID_HANDLE_VALUE; + HANDLE input_changed = INVALID_HANDLE_VALUE; + HANDLE begin_shutdown = INVALID_HANDLE_VALUE; + HANDLE shutdown_complete = INVALID_HANDLE_VALUE; + + cubeb * cubeb_context = nullptr; +}; + +class wasapi_collection_notification_client : public IMMNotificationClient { +public: + /* The implementation of MSCOM was copied from MSDN. */ + ULONG STDMETHODCALLTYPE AddRef() { return InterlockedIncrement(&ref_count); } + + ULONG STDMETHODCALLTYPE Release() + { + ULONG ulRef = InterlockedDecrement(&ref_count); + if (0 == ulRef) { + delete this; + } + return ulRef; + } + + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, VOID ** ppvInterface) + { + if (__uuidof(IUnknown) == riid) { + AddRef(); + *ppvInterface = (IUnknown *)this; + } else if (__uuidof(IMMNotificationClient) == riid) { + AddRef(); + *ppvInterface = (IMMNotificationClient *)this; + } else { + *ppvInterface = NULL; + return E_NOINTERFACE; + } + return S_OK; + } + + wasapi_collection_notification_client(cubeb * context) + : ref_count(1), cubeb_context(context), monitor_notifications(context) + { + XASSERT(cubeb_context); + } + + virtual ~wasapi_collection_notification_client() {} + + HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged(EDataFlow flow, ERole role, + LPCWSTR device_id) + { + LOG("collection: Audio device default changed, id = %S.", device_id); + return S_OK; + } + + /* The remaining methods are not implemented, they simply log when called (if + log is enabled), for debugging. */ + HRESULT STDMETHODCALLTYPE OnDeviceAdded(LPCWSTR device_id) + { + LOG("collection: Audio device added."); + return S_OK; + }; + + HRESULT STDMETHODCALLTYPE OnDeviceRemoved(LPCWSTR device_id) + { + LOG("collection: Audio device removed."); + return S_OK; + } + + HRESULT STDMETHODCALLTYPE OnDeviceStateChanged(LPCWSTR device_id, + DWORD new_state) + { + XASSERT(cubeb_context->output_collection_changed_callback || + cubeb_context->input_collection_changed_callback); + LOG("collection: Audio device state changed, id = %S, state = %lu.", + device_id, new_state); + EDataFlow flow; + HRESULT hr = GetDataFlow(device_id, &flow); + if (FAILED(hr)) { + return hr; + } + monitor_notifications.notify(flow); + return S_OK; + } + + HRESULT STDMETHODCALLTYPE OnPropertyValueChanged(LPCWSTR device_id, + const PROPERTYKEY key) + { + // Audio device property value changed. + return S_OK; + } + +private: + HRESULT GetDataFlow(LPCWSTR device_id, EDataFlow * flow) + { + com_ptr device; + com_ptr endpoint; + + HRESULT hr = cubeb_context->device_collection_enumerator->GetDevice( + device_id, device.receive()); + if (FAILED(hr)) { + LOG("collection: Could not get device: %lx", hr); + return hr; + } + + hr = device->QueryInterface(IID_PPV_ARGS(endpoint.receive())); + if (FAILED(hr)) { + LOG("collection: Could not get endpoint: %lx", hr); + return hr; + } + + return endpoint->GetDataFlow(flow); + } + + /* refcount for this instance, necessary to implement MSCOM semantics. */ + LONG ref_count; + + cubeb * cubeb_context = nullptr; + monitor_device_notifications monitor_notifications; +}; + +class wasapi_endpoint_notification_client : public IMMNotificationClient { +public: + /* The implementation of MSCOM was copied from MSDN. */ + ULONG STDMETHODCALLTYPE AddRef() { return InterlockedIncrement(&ref_count); } + + ULONG STDMETHODCALLTYPE Release() + { + ULONG ulRef = InterlockedDecrement(&ref_count); + if (0 == ulRef) { + delete this; + } + return ulRef; + } + + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, VOID ** ppvInterface) + { + if (__uuidof(IUnknown) == riid) { + AddRef(); + *ppvInterface = (IUnknown *)this; + } else if (__uuidof(IMMNotificationClient) == riid) { + AddRef(); + *ppvInterface = (IMMNotificationClient *)this; + } else { + *ppvInterface = NULL; + return E_NOINTERFACE; + } + return S_OK; + } + + wasapi_endpoint_notification_client(HANDLE event, ERole role) + : ref_count(1), reconfigure_event(event), role(role) + { + } + + virtual ~wasapi_endpoint_notification_client() {} + + HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged(EDataFlow flow, ERole role, + LPCWSTR device_id) + { + LOG("endpoint: Audio device default changed."); + + /* we only support a single stream type for now. */ + if (flow != eRender && role != this->role) { + return S_OK; + } + + BOOL ok = SetEvent(reconfigure_event); + if (!ok) { + LOG("endpoint: SetEvent on reconfigure_event failed: %lx", + GetLastError()); + } + + return S_OK; + } + + /* The remaining methods are not implemented, they simply log when called (if + log is enabled), for debugging. */ + HRESULT STDMETHODCALLTYPE OnDeviceAdded(LPCWSTR device_id) + { + LOG("endpoint: Audio device added."); + return S_OK; + }; + + HRESULT STDMETHODCALLTYPE OnDeviceRemoved(LPCWSTR device_id) + { + LOG("endpoint: Audio device removed."); + return S_OK; + } + + HRESULT STDMETHODCALLTYPE OnDeviceStateChanged(LPCWSTR device_id, + DWORD new_state) + { + LOG("endpoint: Audio device state changed."); + return S_OK; + } + + HRESULT STDMETHODCALLTYPE OnPropertyValueChanged(LPCWSTR device_id, + const PROPERTYKEY key) + { + // Audio device property value changed. + return S_OK; + } + +private: + /* refcount for this instance, necessary to implement MSCOM semantics. */ + LONG ref_count; + HANDLE reconfigure_event; + ERole role; +}; + +namespace { + +long +wasapi_data_callback(cubeb_stream * stm, void * user_ptr, + void const * input_buffer, void * output_buffer, + long nframes) +{ + if (stm->emergency_bailout) { + return CUBEB_ERROR; + } + return stm->data_callback(stm, user_ptr, input_buffer, output_buffer, + nframes); +} + +void +wasapi_state_callback(cubeb_stream * stm, void * user_ptr, cubeb_state state) +{ + if (stm->emergency_bailout) { + return; + } + return stm->state_callback(stm, user_ptr, state); +} + +char const * +intern_device_id(cubeb * ctx, wchar_t const * id) +{ + XASSERT(id); + + auto_lock lock(ctx->lock); + + char const * tmp = wstr_to_utf8(id); + if (!tmp) { + return nullptr; + } + + char const * interned = cubeb_strings_intern(ctx->device_ids, tmp); + + free((void *)tmp); + + return interned; +} + +bool +has_input(cubeb_stream * stm) +{ + return stm->input_stream_params.rate != 0; +} + +bool +has_output(cubeb_stream * stm) +{ + return stm->output_stream_params.rate != 0; +} + +double +stream_to_mix_samplerate_ratio(cubeb_stream_params & stream, + cubeb_stream_params & mixer) +{ + return double(stream.rate) / mixer.rate; +} + +/* Convert the channel layout into the corresponding KSAUDIO_CHANNEL_CONFIG. + See more: + https://msdn.microsoft.com/en-us/library/windows/hardware/ff537083(v=vs.85).aspx + */ + +cubeb_channel_layout +mask_to_channel_layout(WAVEFORMATEX const * fmt) +{ + cubeb_channel_layout mask = 0; + + if (fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { + WAVEFORMATEXTENSIBLE const * ext = + reinterpret_cast(fmt); + mask = ext->dwChannelMask; + } else if (fmt->wFormatTag == WAVE_FORMAT_PCM || + fmt->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) { + if (fmt->nChannels == 1) { + mask = CHANNEL_FRONT_CENTER; + } else if (fmt->nChannels == 2) { + mask = CHANNEL_FRONT_LEFT | CHANNEL_FRONT_RIGHT; + } + } + return mask; +} + +uint32_t +get_rate(cubeb_stream * stm) +{ + return has_input(stm) ? stm->input_stream_params.rate + : stm->output_stream_params.rate; +} + +uint32_t +hns_to_frames(uint32_t rate, REFERENCE_TIME hns) +{ + return std::ceil((hns - 1) / 10000000.0 * rate); +} + +uint32_t +hns_to_frames(cubeb_stream * stm, REFERENCE_TIME hns) +{ + return hns_to_frames(get_rate(stm), hns); +} + +REFERENCE_TIME +frames_to_hns(uint32_t rate, uint32_t frames) +{ + return std::ceil(frames * 10000000.0 / rate); +} + +/* This returns the size of a frame in the stream, before the eventual upmix + occurs. */ +static size_t +frames_to_bytes_before_mix(cubeb_stream * stm, size_t frames) +{ + // This is called only when we has a output client. + XASSERT(has_output(stm)); + return stm->output_stream_params.channels * stm->bytes_per_sample * frames; +} + +/* This function handles the processing of the input and output audio, + * converting it to rate and channel layout specified at initialization. + * It then calls the data callback, via the resampler. */ +long +refill(cubeb_stream * stm, void * input_buffer, long input_frames_count, + void * output_buffer, long output_frames_needed) +{ + XASSERT(!stm->draining); + /* If we need to upmix after resampling, resample into the mix buffer to + avoid a copy. Avoid exposing output if it is a dummy stream. */ + void * dest = nullptr; + if (has_output(stm) && !stm->has_dummy_output) { + if (stm->output_mixer) { + dest = stm->mix_buffer.data(); + } else { + dest = output_buffer; + } + } + + long out_frames = + cubeb_resampler_fill(stm->resampler.get(), input_buffer, + &input_frames_count, dest, output_frames_needed); + if (out_frames < 0) { + ALOGV("Callback refill error: %d", out_frames); + wasapi_state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + return out_frames; + } + + float volume = 1.0; + { + auto_lock lock(stm->stream_reset_lock); + stm->frames_written += out_frames; + volume = stm->volume; + } + + /* Go in draining mode if we got fewer frames than requested. If the stream + has no output we still expect the callback to return number of frames read + from input, otherwise we stop. */ + if ((out_frames < output_frames_needed) || + (!has_output(stm) && out_frames < input_frames_count)) { + LOG("start draining."); + stm->draining = true; + } + + /* If this is not true, there will be glitches. + It is alright to have produced less frames if we are draining, though. */ + XASSERT(out_frames == output_frames_needed || stm->draining || + !has_output(stm) || stm->has_dummy_output); + +#ifndef CUBEB_WASAPI_USE_IAUDIOSTREAMVOLUME + if (has_output(stm) && !stm->has_dummy_output && volume != 1.0) { + // Adjust the output volume. + // Note: This could be integrated with the remixing below. + long out_samples = out_frames * stm->output_stream_params.channels; + if (volume == 0.0) { + memset(dest, 0, out_samples * stm->bytes_per_sample); + } else { + switch (stm->output_stream_params.format) { + case CUBEB_SAMPLE_FLOAT32NE: { + float * buf = static_cast(dest); + for (long i = 0; i < out_samples; ++i) { + buf[i] *= volume; + } + break; + } + case CUBEB_SAMPLE_S16NE: { + short * buf = static_cast(dest); + for (long i = 0; i < out_samples; ++i) { + buf[i] = static_cast(static_cast(buf[i]) * volume); + } + break; + } + default: + XASSERT(false); + } + } + } +#endif + + // We don't bother mixing dummy output as it will be silenced, otherwise mix + // output if needed + if (!stm->has_dummy_output && has_output(stm) && stm->output_mixer) { + XASSERT(dest == stm->mix_buffer.data()); + size_t dest_size = + out_frames * stm->output_stream_params.channels * stm->bytes_per_sample; + XASSERT(dest_size <= stm->mix_buffer.size()); + size_t output_buffer_size = + out_frames * stm->output_mix_params.channels * stm->bytes_per_sample; + int ret = cubeb_mixer_mix(stm->output_mixer.get(), out_frames, dest, + dest_size, output_buffer, output_buffer_size); + if (ret < 0) { + LOG("Error remixing content (%d)", ret); + } + } + + return out_frames; +} + +bool +trigger_async_reconfigure(cubeb_stream * stm) +{ + XASSERT(stm && stm->reconfigure_event); + LOG("Try reconfiguring the stream"); + BOOL ok = SetEvent(stm->reconfigure_event); + if (!ok) { + LOG("SetEvent on reconfigure_event failed: %lx", GetLastError()); + } + return static_cast(ok); +} + +/* This helper grabs all the frames available from a capture client, put them in + * the linear_input_buffer. This helper does not work with exclusive mode + * streams. */ +bool +get_input_buffer(cubeb_stream * stm) +{ + XASSERT(has_input(stm)); + + HRESULT hr; + BYTE * input_packet = NULL; + DWORD flags; + UINT64 dev_pos; + UINT64 pc_position; + UINT32 next; + /* Get input packets until we have captured enough frames, and put them in a + * contiguous buffer. */ + uint32_t offset = 0; + // If the input stream is event driven we should only ever expect to read a + // single packet each time. However, if we're pulling from the stream we may + // need to grab multiple packets worth of frames that have accumulated (so + // need a loop). + for (hr = stm->capture_client->GetNextPacketSize(&next); next > 0; + hr = stm->capture_client->GetNextPacketSize(&next)) { + if (hr == AUDCLNT_E_DEVICE_INVALIDATED) { + // Application can recover from this error. More info + // https://msdn.microsoft.com/en-us/library/windows/desktop/dd316605(v=vs.85).aspx + LOG("Input device invalidated error"); + // No need to reset device if user asks to use particular device, or + // switching is disabled. + if (stm->input_device_id || + (stm->input_stream_params.prefs & + CUBEB_STREAM_PREF_DISABLE_DEVICE_SWITCHING) || + !trigger_async_reconfigure(stm)) { + wasapi_state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + return false; + } + return true; + } + + if (FAILED(hr)) { + LOG("cannot get next packet size: %lx", hr); + return false; + } + + UINT32 frames; + hr = stm->capture_client->GetBuffer(&input_packet, &frames, &flags, + &dev_pos, &pc_position); + + if (FAILED(hr)) { + LOG("GetBuffer failed for capture: %lx", hr); + return false; + } + XASSERT(frames == next); + + if (stm->context->performance_counter_frequency) { + LARGE_INTEGER now; + UINT64 now_hns; + // See + // https://docs.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudiocaptureclient-getbuffer, + // section "Remarks". + QueryPerformanceCounter(&now); + now_hns = + 10000000 * now.QuadPart / stm->context->performance_counter_frequency; + if (now_hns >= pc_position) { + stm->input_latency_hns = now_hns - pc_position; + } + } + + stm->total_input_frames += frames; + + UINT32 input_stream_samples = frames * stm->input_stream_params.channels; + // We do not explicitly handle the AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY + // flag. There a two primary (non exhaustive) scenarios we anticipate this + // flag being set in: + // - The first GetBuffer after Start has this flag undefined. In this + // case the flag may be set but is meaningless and can be ignored. + // - If a glitch is introduced into the input. This should not happen + // for event based inputs, and should be mitigated by using a dummy + // stream to drive input in the case of input only loopback. Without + // a dummy output, input only loopback would glitch on silence. However, + // the dummy input should push silence to the loopback and prevent + // discontinuities. See + // https://blogs.msdn.microsoft.com/matthew_van_eerde/2008/12/16/sample-wasapi-loopback-capture-record-what-you-hear/ + // As the first scenario can be ignored, and we anticipate the second + // scenario is mitigated, we ignore the flag. + // For more info: + // https://msdn.microsoft.com/en-us/library/windows/desktop/dd370859(v=vs.85).aspx, + // https://msdn.microsoft.com/en-us/library/windows/desktop/dd371458(v=vs.85).aspx + if (flags & AUDCLNT_BUFFERFLAGS_SILENT) { + LOG("insert silence: ps=%u", frames); + stm->linear_input_buffer->push_silence(input_stream_samples); + } else { + if (stm->input_mixer) { + bool ok = stm->linear_input_buffer->reserve( + stm->linear_input_buffer->length() + input_stream_samples); + XASSERT(ok); + size_t input_packet_size = + frames * stm->input_mix_params.channels * + cubeb_sample_size(stm->input_mix_params.format); + size_t linear_input_buffer_size = + input_stream_samples * + cubeb_sample_size(stm->input_stream_params.format); + cubeb_mixer_mix(stm->input_mixer.get(), frames, input_packet, + input_packet_size, stm->linear_input_buffer->end(), + linear_input_buffer_size); + stm->linear_input_buffer->set_length( + stm->linear_input_buffer->length() + input_stream_samples); + } else { + stm->linear_input_buffer->push(input_packet, input_stream_samples); + } + } + hr = stm->capture_client->ReleaseBuffer(frames); + if (FAILED(hr)) { + LOG("FAILED to release intput buffer"); + return false; + } + offset += input_stream_samples; + } + + ALOGV("get_input_buffer: got %d frames", offset); + + XASSERT(stm->linear_input_buffer->length() >= offset); + + return true; +} + +/* Get an output buffer from the render_client. It has to be released before + * exiting the callback. */ +bool +get_output_buffer(cubeb_stream * stm, void *& buffer, size_t & frame_count) +{ + UINT32 padding_out; + HRESULT hr; + + XASSERT(has_output(stm)); + + hr = stm->output_client->GetCurrentPadding(&padding_out); + if (hr == AUDCLNT_E_DEVICE_INVALIDATED) { + // Application can recover from this error. More info + // https://msdn.microsoft.com/en-us/library/windows/desktop/dd316605(v=vs.85).aspx + LOG("Output device invalidated error"); + // No need to reset device if user asks to use particular device, or + // switching is disabled. + if (stm->output_device_id || + (stm->output_stream_params.prefs & + CUBEB_STREAM_PREF_DISABLE_DEVICE_SWITCHING) || + !trigger_async_reconfigure(stm)) { + wasapi_state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + return false; + } + return true; + } + + if (FAILED(hr)) { + LOG("Failed to get padding: %lx", hr); + return false; + } + + XASSERT(padding_out <= stm->output_buffer_frame_count); + + if (stm->draining) { + if (padding_out == 0) { + LOG("Draining finished."); + wasapi_state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + return false; + } + LOG("Draining."); + return true; + } + + frame_count = stm->output_buffer_frame_count - padding_out; + BYTE * output_buffer; + + hr = stm->render_client->GetBuffer(frame_count, &output_buffer); + if (FAILED(hr)) { + LOG("cannot get render buffer"); + return false; + } + + buffer = output_buffer; + + return true; +} + +/** + * This function gets input data from a input device, and pass it along with an + * output buffer to the resamplers. */ +bool +refill_callback_duplex(cubeb_stream * stm) +{ + HRESULT hr; + void * output_buffer = nullptr; + size_t output_frames = 0; + size_t input_frames; + bool rv; + + XASSERT(has_input(stm) && has_output(stm)); + + if (stm->input_stream_params.prefs & CUBEB_STREAM_PREF_LOOPBACK) { + HRESULT rv = get_input_buffer(stm); + if (FAILED(rv)) { + return rv; + } + } + + input_frames = + stm->linear_input_buffer->length() / stm->input_stream_params.channels; + + rv = get_output_buffer(stm, output_buffer, output_frames); + if (!rv) { + hr = stm->render_client->ReleaseBuffer(output_frames, 0); + return rv; + } + + /* This can only happen when debugging, and having breakpoints set in the + * callback in a way that it makes the stream underrun. */ + if (output_frames == 0) { + return true; + } + + /* Wait for draining is not important on duplex. */ + if (stm->draining) { + return false; + } + + stm->total_output_frames += output_frames; + + ALOGV("in: %zu, out: %zu, missing: %ld, ratio: %f", stm->total_input_frames, + stm->total_output_frames, + static_cast(stm->total_output_frames) - stm->total_input_frames, + static_cast(stm->total_output_frames) / stm->total_input_frames); + + long got; + if (stm->has_dummy_output) { + ALOGV( + "Duplex callback (dummy output): input frames: %Iu, output frames: %Iu", + input_frames, output_frames); + + // We don't want to expose the dummy output to the callback so don't pass + // the output buffer (it will be released later with silence in it) + got = + refill(stm, stm->linear_input_buffer->data(), input_frames, nullptr, 0); + + } else { + ALOGV("Duplex callback: input frames: %Iu, output frames: %Iu", + input_frames, output_frames); + + got = refill(stm, stm->linear_input_buffer->data(), input_frames, + output_buffer, output_frames); + } + + stm->linear_input_buffer->clear(); + + if (stm->has_dummy_output) { + // If output is a dummy output, make sure it's silent + hr = stm->render_client->ReleaseBuffer(output_frames, + AUDCLNT_BUFFERFLAGS_SILENT); + } else { + hr = stm->render_client->ReleaseBuffer(output_frames, 0); + } + if (FAILED(hr)) { + LOG("failed to release buffer: %lx", hr); + return false; + } + if (got < 0) { + return false; + } + return true; +} + +bool +refill_callback_input(cubeb_stream * stm) +{ + bool rv; + size_t input_frames; + + XASSERT(has_input(stm) && !has_output(stm)); + + rv = get_input_buffer(stm); + if (!rv) { + return rv; + } + + input_frames = + stm->linear_input_buffer->length() / stm->input_stream_params.channels; + if (!input_frames) { + return true; + } + + ALOGV("Input callback: input frames: %Iu", input_frames); + + long read = + refill(stm, stm->linear_input_buffer->data(), input_frames, nullptr, 0); + if (read < 0) { + return false; + } + + stm->linear_input_buffer->clear(); + + return !stm->draining; +} + +bool +refill_callback_output(cubeb_stream * stm) +{ + bool rv; + HRESULT hr; + void * output_buffer = nullptr; + size_t output_frames = 0; + + XASSERT(!has_input(stm) && has_output(stm)); + + rv = get_output_buffer(stm, output_buffer, output_frames); + if (!rv) { + return rv; + } + + if (stm->draining || output_frames == 0) { + return true; + } + + long got = refill(stm, nullptr, 0, output_buffer, output_frames); + + if (got != output_frames) { + ALOGV("Output callback: output frames requested: %Iu, got %ld", output_frames, + got); + } + if (got < 0) { + return false; + } + XASSERT(size_t(got) == output_frames || stm->draining); + + hr = stm->render_client->ReleaseBuffer(got, 0); + if (FAILED(hr)) { + LOG("failed to release buffer: %lx", hr); + return false; + } + + return size_t(got) == output_frames || stm->draining; +} + +void +wasapi_stream_destroy(cubeb_stream * stm); + +static void +handle_emergency_bailout(cubeb_stream * stm) +{ + if (stm->emergency_bailout) { + CloseHandle(stm->thread); + stm->thread = NULL; + CloseHandle(stm->shutdown_event); + stm->shutdown_event = 0; + wasapi_stream_destroy(stm); + _endthreadex(0); + } +} + +static unsigned int __stdcall wasapi_stream_render_loop(LPVOID stream) +{ + AutoRegisterThread raii("cubeb rendering thread"); + + cubeb_stream * stm = static_cast(stream); + + bool is_playing = true; + HANDLE wait_array[4] = {stm->shutdown_event, stm->reconfigure_event, + stm->refill_event, stm->input_available_event}; + HANDLE mmcss_handle = NULL; + HRESULT hr = 0; + DWORD mmcss_task_index = 0; + struct auto_com { + auto_com() + { + HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); + XASSERT(SUCCEEDED(hr)); + } + ~auto_com() { CoUninitialize(); } + } com; + + /* We could consider using "Pro Audio" here for WebAudio and + maybe WebRTC. */ + mmcss_handle = AvSetMmThreadCharacteristicsA("Audio", &mmcss_task_index); + if (!mmcss_handle) { + /* This is not fatal, but we might glitch under heavy load. */ + LOG("Unable to use mmcss to bump the render thread priority: %lx", + GetLastError()); + } + + /* WaitForMultipleObjects timeout can trigger in cases where we don't want to + treat it as a timeout, such as across a system sleep/wake cycle. Trigger + the timeout error handling only when the timeout_limit is reached, which is + reset on each successful loop. */ + unsigned timeout_count = 0; + const unsigned timeout_limit = 3; + while (is_playing) { + handle_emergency_bailout(stm); + DWORD waitResult = WaitForMultipleObjects(ARRAY_LENGTH(wait_array), + wait_array, FALSE, 1000); + handle_emergency_bailout(stm); + if (waitResult != WAIT_TIMEOUT) { + timeout_count = 0; + } + switch (waitResult) { + case WAIT_OBJECT_0: { /* shutdown */ + is_playing = false; + /* We don't check if the drain is actually finished here, we just want to + shutdown. */ + if (stm->draining) { + wasapi_state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + } + continue; + } + case WAIT_OBJECT_0 + 1: { /* reconfigure */ + XASSERT(stm->output_client || stm->input_client); + LOG("Reconfiguring the stream"); + /* Close the stream */ + if (stm->output_client) { + stm->output_client->Stop(); + LOG("Output stopped."); + } + if (stm->input_client) { + stm->input_client->Stop(); + LOG("Input stopped."); + } + { + auto_lock lock(stm->stream_reset_lock); + close_wasapi_stream(stm); + LOG("Stream closed."); + /* Reopen a stream and start it immediately. This will automatically + pick the new default device for this role. */ + int r = setup_wasapi_stream(stm); + if (r != CUBEB_OK) { + LOG("Error setting up the stream during reconfigure."); + /* Don't destroy the stream here, since we expect the caller to do + so after the error has propagated via the state callback. */ + is_playing = false; + hr = E_FAIL; + continue; + } + LOG("Stream setup successfuly."); + } + XASSERT(stm->output_client || stm->input_client); + if (stm->output_client) { + hr = stm->output_client->Start(); + if (FAILED(hr)) { + LOG("Error starting output after reconfigure, error: %lx", hr); + is_playing = false; + continue; + } + LOG("Output started after reconfigure."); + } + if (stm->input_client) { + hr = stm->input_client->Start(); + if (FAILED(hr)) { + LOG("Error starting input after reconfiguring, error: %lx", hr); + is_playing = false; + continue; + } + LOG("Input started after reconfigure."); + } + break; + } + case WAIT_OBJECT_0 + 2: /* refill */ + XASSERT((has_input(stm) && has_output(stm)) || + (!has_input(stm) && has_output(stm))); + is_playing = stm->refill_callback(stm); + break; + case WAIT_OBJECT_0 + 3: { /* input available */ + HRESULT rv = get_input_buffer(stm); + if (FAILED(rv)) { + is_playing = false; + continue; + } + + if (!has_output(stm)) { + is_playing = stm->refill_callback(stm); + } + + break; + } + case WAIT_TIMEOUT: + XASSERT(stm->shutdown_event == wait_array[0]); + if (++timeout_count >= timeout_limit) { + LOG("Render loop reached the timeout limit."); + is_playing = false; + hr = E_FAIL; + } + break; + default: + LOG("case %lu not handled in render loop.", waitResult); + XASSERT(false); + } + } + + // Stop audio clients since this thread will no longer service + // the events. + if (stm->output_client) { + stm->output_client->Stop(); + } + if (stm->input_client) { + stm->input_client->Stop(); + } + + if (mmcss_handle) { + AvRevertMmThreadCharacteristics(mmcss_handle); + } + + handle_emergency_bailout(stm); + + if (FAILED(hr)) { + wasapi_state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + } + + return 0; +} + +void +wasapi_destroy(cubeb * context); + +HRESULT +register_notification_client(cubeb_stream * stm) +{ + XASSERT(stm->device_enumerator && !stm->notification_client); + + stm->notification_client.reset(new wasapi_endpoint_notification_client( + stm->reconfigure_event, stm->role)); + + HRESULT hr = stm->device_enumerator->RegisterEndpointNotificationCallback( + stm->notification_client.get()); + if (FAILED(hr)) { + LOG("Could not register endpoint notification callback: %lx", hr); + stm->notification_client = nullptr; + } + + return hr; +} + +HRESULT +unregister_notification_client(cubeb_stream * stm) +{ + XASSERT(stm->device_enumerator && stm->notification_client); + + HRESULT hr = stm->device_enumerator->UnregisterEndpointNotificationCallback( + stm->notification_client.get()); + if (FAILED(hr)) { + // We can't really do anything here, we'll probably leak the + // notification client. + return S_OK; + } + + stm->notification_client = nullptr; + + return S_OK; +} + +HRESULT +get_endpoint(com_ptr & device, LPCWSTR devid) +{ + com_ptr enumerator; + HRESULT hr = + CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(enumerator.receive())); + if (FAILED(hr)) { + LOG("Could not get device enumerator: %lx", hr); + return hr; + } + + hr = enumerator->GetDevice(devid, device.receive()); + if (FAILED(hr)) { + LOG("Could not get device: %lx", hr); + return hr; + } + + return S_OK; +} + +HRESULT +register_collection_notification_client(cubeb * context) +{ + context->lock.assert_current_thread_owns(); + XASSERT(!context->device_collection_enumerator && + !context->collection_notification_client); + HRESULT hr = CoCreateInstance( + __uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(context->device_collection_enumerator.receive())); + if (FAILED(hr)) { + LOG("Could not get device enumerator: %lx", hr); + return hr; + } + + context->collection_notification_client.reset( + new wasapi_collection_notification_client(context)); + + hr = context->device_collection_enumerator + ->RegisterEndpointNotificationCallback( + context->collection_notification_client.get()); + if (FAILED(hr)) { + LOG("Could not register endpoint notification callback: %lx", hr); + context->collection_notification_client.reset(); + context->device_collection_enumerator.reset(); + } + + return hr; +} + +HRESULT +unregister_collection_notification_client(cubeb * context) +{ + context->lock.assert_current_thread_owns(); + XASSERT(context->device_collection_enumerator && + context->collection_notification_client); + HRESULT hr = context->device_collection_enumerator + ->UnregisterEndpointNotificationCallback( + context->collection_notification_client.get()); + if (FAILED(hr)) { + return hr; + } + + context->collection_notification_client = nullptr; + context->device_collection_enumerator = nullptr; + + return hr; +} + +HRESULT +get_default_endpoint(com_ptr & device, EDataFlow direction, + ERole role) +{ + com_ptr enumerator; + HRESULT hr = + CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(enumerator.receive())); + if (FAILED(hr)) { + LOG("Could not get device enumerator: %lx", hr); + return hr; + } + hr = enumerator->GetDefaultAudioEndpoint(direction, role, device.receive()); + if (FAILED(hr)) { + LOG("Could not get default audio endpoint: %lx", hr); + return hr; + } + + return ERROR_SUCCESS; +} + +double +current_stream_delay(cubeb_stream * stm) +{ + stm->stream_reset_lock.assert_current_thread_owns(); + + /* If the default audio endpoint went away during playback and we weren't + able to configure a new one, it's possible the caller may call this + before the error callback has propogated back. */ + if (!stm->audio_clock) { + return 0; + } + + UINT64 freq; + HRESULT hr = stm->audio_clock->GetFrequency(&freq); + if (FAILED(hr)) { + LOG("GetFrequency failed: %lx", hr); + return 0; + } + + UINT64 pos; + hr = stm->audio_clock->GetPosition(&pos, NULL); + if (FAILED(hr)) { + LOG("GetPosition failed: %lx", hr); + return 0; + } + + double cur_pos = static_cast(pos) / freq; + double max_pos = + static_cast(stm->frames_written) / stm->output_mix_params.rate; + double delay = std::max(max_pos - cur_pos, 0.0); + + return delay; +} + +#ifdef CUBEB_WASAPI_USE_IAUDIOSTREAMVOLUME +int +stream_set_volume(cubeb_stream * stm, float volume) +{ + stm->stream_reset_lock.assert_current_thread_owns(); + + if (!stm->audio_stream_volume) { + return CUBEB_ERROR; + } + + uint32_t channels; + HRESULT hr = stm->audio_stream_volume->GetChannelCount(&channels); + if (FAILED(hr)) { + LOG("could not get the channel count: %lx", hr); + return CUBEB_ERROR; + } + + /* up to 9.1 for now */ + if (channels > 10) { + return CUBEB_ERROR_NOT_SUPPORTED; + } + + float volumes[10]; + for (uint32_t i = 0; i < channels; i++) { + volumes[i] = volume; + } + + hr = stm->audio_stream_volume->SetAllVolumes(channels, volumes); + if (FAILED(hr)) { + LOG("could not set the channels volume: %lx", hr); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} +#endif +} // namespace + +extern "C" { +int +wasapi_init(cubeb ** context, char const * context_name) +{ + /* We don't use the device yet, but need to make sure we can initialize one + so that this backend is not incorrectly enabled on platforms that don't + support WASAPI. */ + com_ptr device; + HRESULT hr = get_default_endpoint(device, eRender, eConsole); + if (FAILED(hr)) { + XASSERT(hr != CO_E_NOTINITIALIZED); + LOG("It wasn't able to find a default rendering device: %lx", hr); + hr = get_default_endpoint(device, eCapture, eConsole); + if (FAILED(hr)) { + LOG("It wasn't able to find a default capture device: %lx", hr); + return CUBEB_ERROR; + } + } + + cubeb * ctx = new cubeb(); + + ctx->ops = &wasapi_ops; + auto_lock lock(ctx->lock); + if (cubeb_strings_init(&ctx->device_ids) != CUBEB_OK) { + delete ctx; + return CUBEB_ERROR; + } + + LARGE_INTEGER frequency; + if (QueryPerformanceFrequency(&frequency)) { + ctx->performance_counter_frequency = frequency.QuadPart; + } else { + LOG("Failed getting performance counter frequency, latency reporting will " + "be inacurate"); + ctx->performance_counter_frequency = 0; + } + + *context = ctx; + + return CUBEB_OK; +} +} + +namespace { +enum ShutdownPhase { OnStop, OnDestroy }; + +bool +stop_and_join_render_thread(cubeb_stream * stm, ShutdownPhase phase) +{ + // Only safe to transfer `stm` ownership to the render thread when + // the stream is being destroyed by the caller. + bool bailout = phase == OnDestroy; + + LOG("%p: Stop and join render thread: %p (%d), phase=%d", stm, stm->thread, + stm->emergency_bailout.load(), static_cast(phase)); + if (!stm->thread) { + return true; + } + + XASSERT(!stm->emergency_bailout); + + BOOL ok = SetEvent(stm->shutdown_event); + if (!ok) { + LOG("stop_and_join_render_thread: SetEvent failed: %lx", GetLastError()); + stm->emergency_bailout = bailout; + return false; + } + + /* Wait five seconds for the rendering thread to return. It's supposed to + * check its event loop very often, five seconds is rather conservative. + * Note: 5*1s loop to work around timer sleep issues on pre-Windows 8. */ + DWORD r; + for (int i = 0; i < 5; ++i) { + r = WaitForSingleObject(stm->thread, 1000); + if (r == WAIT_OBJECT_0) { + break; + } + } + if (r != WAIT_OBJECT_0) { + LOG("stop_and_join_render_thread: WaitForSingleObject on thread failed: " + "%lx, %lx", + r, GetLastError()); + stm->emergency_bailout = bailout; + return false; + } + + // Only attempt to close and null out the thread and event if the + // WaitForSingleObject above succeeded. + LOG("stop_and_join_render_thread: Closing thread."); + CloseHandle(stm->thread); + stm->thread = NULL; + + CloseHandle(stm->shutdown_event); + stm->shutdown_event = 0; + + return true; +} + +void +wasapi_destroy(cubeb * context) +{ + auto_lock lock(context->lock); + XASSERT(!context->device_collection_enumerator && + !context->collection_notification_client); + + if (context->device_ids) { + cubeb_strings_destroy(context->device_ids); + } + + delete context; +} + +char const * +wasapi_get_backend_id(cubeb * context) +{ + return "wasapi"; +} + +int +wasapi_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + XASSERT(ctx && max_channels); + + com_ptr device; + HRESULT hr = get_default_endpoint(device, eRender, eConsole); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + + com_ptr client; + hr = device->Activate(__uuidof(IAudioClient), CLSCTX_INPROC_SERVER, NULL, + client.receive_vpp()); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + + WAVEFORMATEX * tmp = nullptr; + hr = client->GetMixFormat(&tmp); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + com_heap_ptr mix_format(tmp); + + *max_channels = mix_format->nChannels; + + return CUBEB_OK; +} + +int +wasapi_get_min_latency(cubeb * ctx, cubeb_stream_params params, + uint32_t * latency_frames) +{ + if (params.format != CUBEB_SAMPLE_FLOAT32NE && + params.format != CUBEB_SAMPLE_S16NE) { + return CUBEB_ERROR_INVALID_FORMAT; + } + + ERole role = pref_to_role(params.prefs); + + com_ptr device; + HRESULT hr = get_default_endpoint(device, eRender, role); + if (FAILED(hr)) { + LOG("Could not get default endpoint: %lx", hr); + return CUBEB_ERROR; + } + + com_ptr client; + hr = device->Activate(__uuidof(IAudioClient), CLSCTX_INPROC_SERVER, NULL, + client.receive_vpp()); + if (FAILED(hr)) { + LOG("Could not activate device for latency: %lx", hr); + return CUBEB_ERROR; + } + + REFERENCE_TIME minimum_period; + REFERENCE_TIME default_period; + hr = client->GetDevicePeriod(&default_period, &minimum_period); + if (FAILED(hr)) { + LOG("Could not get device period: %lx", hr); + return CUBEB_ERROR; + } + + LOG("default device period: %I64d, minimum device period: %I64d", + default_period, minimum_period); + + /* If we're on Windows 10, we can use IAudioClient3 to get minimal latency. + Otherwise, according to the docs, the best latency we can achieve is by + synchronizing the stream and the engine. + http://msdn.microsoft.com/en-us/library/windows/desktop/dd370871%28v=vs.85%29.aspx + */ + + // #ifdef _WIN32_WINNT_WIN10 +#if 0 + *latency_frames = hns_to_frames(params.rate, minimum_period); +#else + *latency_frames = hns_to_frames(params.rate, default_period); +#endif + + LOG("Minimum latency in frames: %u", *latency_frames); + + return CUBEB_OK; +} + +int +wasapi_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) +{ + com_ptr device; + HRESULT hr = get_default_endpoint(device, eRender, eConsole); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + + com_ptr client; + hr = device->Activate(__uuidof(IAudioClient), CLSCTX_INPROC_SERVER, NULL, + client.receive_vpp()); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + + WAVEFORMATEX * tmp = nullptr; + hr = client->GetMixFormat(&tmp); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + com_heap_ptr mix_format(tmp); + + *rate = mix_format->nSamplesPerSec; + + LOG("Preferred sample rate for output: %u", *rate); + + return CUBEB_OK; +} + +static void +waveformatex_update_derived_properties(WAVEFORMATEX * format) +{ + format->nBlockAlign = format->wBitsPerSample * format->nChannels / 8; + format->nAvgBytesPerSec = format->nSamplesPerSec * format->nBlockAlign; + if (format->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { + WAVEFORMATEXTENSIBLE * format_pcm = + reinterpret_cast(format); + format_pcm->Samples.wValidBitsPerSample = format->wBitsPerSample; + } +} + +/* Based on the mix format and the stream format, try to find a way to play + what the user requested. */ +static void +handle_channel_layout(cubeb_stream * stm, EDataFlow direction, + com_heap_ptr & mix_format, + const cubeb_stream_params * stream_params) +{ + com_ptr & audio_client = + (direction == eRender) ? stm->output_client : stm->input_client; + XASSERT(audio_client); + /* The docs say that GetMixFormat is always of type WAVEFORMATEXTENSIBLE [1], + so the reinterpret_cast below should be safe. In practice, this is not + true, and we just want to bail out and let the rest of the code find a good + conversion path instead of trying to make WASAPI do it by itself. + [1]: + http://msdn.microsoft.com/en-us/library/windows/desktop/dd370811%28v=vs.85%29.aspx*/ + if (mix_format->wFormatTag != WAVE_FORMAT_EXTENSIBLE) { + return; + } + + WAVEFORMATEXTENSIBLE * format_pcm = + reinterpret_cast(mix_format.get()); + + /* Stash a copy of the original mix format in case we need to restore it + * later. */ + WAVEFORMATEXTENSIBLE hw_mix_format = *format_pcm; + + /* Get the channel mask by the channel layout. + If the layout is not supported, we will get a closest settings below. */ + format_pcm->dwChannelMask = stream_params->layout; + mix_format->nChannels = stream_params->channels; + waveformatex_update_derived_properties(mix_format.get()); + + /* Check if wasapi will accept our channel layout request. */ + WAVEFORMATEX * tmp = nullptr; + HRESULT hr = audio_client->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, + mix_format.get(), &tmp); + com_heap_ptr closest(tmp); + if (hr == S_FALSE) { + /* Channel layout not supported, but WASAPI gives us a suggestion. Use it, + and handle the eventual upmix/downmix ourselves. Ignore the subformat of + the suggestion, since it seems to always be IEEE_FLOAT. */ + LOG("Using WASAPI suggested format: channels: %d", closest->nChannels); + XASSERT(closest->wFormatTag == WAVE_FORMAT_EXTENSIBLE); + WAVEFORMATEXTENSIBLE * closest_pcm = + reinterpret_cast(closest.get()); + format_pcm->dwChannelMask = closest_pcm->dwChannelMask; + mix_format->nChannels = closest->nChannels; + waveformatex_update_derived_properties(mix_format.get()); + } else if (hr == AUDCLNT_E_UNSUPPORTED_FORMAT) { + /* Not supported, no suggestion. This should not happen, but it does in the + field with some sound cards. We restore the mix format, and let the rest + of the code figure out the right conversion path. */ + XASSERT(mix_format->wFormatTag == WAVE_FORMAT_EXTENSIBLE); + *reinterpret_cast(mix_format.get()) = hw_mix_format; + } else if (hr == S_OK) { + LOG("Requested format accepted by WASAPI."); + } else { + LOG("IsFormatSupported unhandled error: %lx", hr); + } +} + +static int +initialize_iaudioclient2(com_ptr & audio_client) +{ + com_ptr audio_client2; + audio_client->QueryInterface(audio_client2.receive()); + if (!audio_client2) { + LOG("Could not get IAudioClient2 interface, not setting " + "AUDCLNT_STREAMOPTIONS_RAW."); + return CUBEB_OK; + } + AudioClientProperties properties = {0}; + properties.cbSize = sizeof(AudioClientProperties); +#ifndef __MINGW32__ + properties.Options |= AUDCLNT_STREAMOPTIONS_RAW; +#endif + HRESULT hr = audio_client2->SetClientProperties(&properties); + if (FAILED(hr)) { + LOG("IAudioClient2::SetClientProperties error: %lx", GetLastError()); + return CUBEB_ERROR; + } + return CUBEB_OK; +} + +#if 0 +bool +initialize_iaudioclient3(com_ptr & audio_client, + cubeb_stream * stm, + const com_heap_ptr & mix_format, + DWORD flags, EDataFlow direction) +{ + com_ptr audio_client3; + audio_client->QueryInterface(audio_client3.receive()); + if (!audio_client3) { + LOG("Could not get IAudioClient3 interface"); + return false; + } + + if (flags & AUDCLNT_STREAMFLAGS_LOOPBACK) { + // IAudioClient3 doesn't work with loopback streams, and will return error + // 88890021: AUDCLNT_E_INVALID_STREAM_FLAG + LOG("Audio stream is loopback, not using IAudioClient3"); + return false; + } + + // Some people have reported glitches with capture streams: + // http://blog.nirbheek.in/2018/03/low-latency-audio-on-windows-with.html + if (direction == eCapture) { + LOG("Audio stream is capture, not using IAudioClient3"); + return false; + } + + // Possibly initialize a shared-mode stream using IAudioClient3. Initializing + // a stream this way lets you request lower latencies, but also locks the + // global WASAPI engine at that latency. + // - If we request a shared-mode stream, streams created with IAudioClient + // will + // have their latency adjusted to match. When the shared-mode stream is + // closed, they'll go back to normal. + // - If there's already a shared-mode stream running, then we cannot request + // the engine change to a different latency - we have to match it. + // - It's antisocial to lock the WASAPI engine at its default latency. If we + // would do this, then stop and use IAudioClient instead. + + HRESULT hr; + uint32_t default_period = 0, fundamental_period = 0, min_period = 0, + max_period = 0; + hr = audio_client3->GetSharedModeEnginePeriod( + mix_format.get(), &default_period, &fundamental_period, &min_period, + &max_period); + if (FAILED(hr)) { + LOG("Could not get shared mode engine period: error: %lx", hr); + return false; + } + uint32_t requested_latency = stm->latency; + if (requested_latency >= default_period) { + LOG("Requested latency %i greater than default latency %i, not using " + "IAudioClient3", + requested_latency, default_period); + return false; + } + LOG("Got shared mode engine period: default=%i fundamental=%i min=%i max=%i", + default_period, fundamental_period, min_period, max_period); + // Snap requested latency to a valid value + uint32_t old_requested_latency = requested_latency; + if (requested_latency < min_period) { + requested_latency = min_period; + } + requested_latency -= (requested_latency - min_period) % fundamental_period; + if (requested_latency != old_requested_latency) { + LOG("Requested latency %i was adjusted to %i", old_requested_latency, + requested_latency); + } + + hr = audio_client3->InitializeSharedAudioStream(flags, requested_latency, + mix_format.get(), NULL); + if (SUCCEEDED(hr)) { + return true; + } else if (hr == AUDCLNT_E_ENGINE_PERIODICITY_LOCKED) { + LOG("Got AUDCLNT_E_ENGINE_PERIODICITY_LOCKED, adjusting latency request"); + } else { + LOG("Could not initialize shared stream with IAudioClient3: error: %lx", + hr); + return false; + } + + uint32_t current_period = 0; + WAVEFORMATEX * current_format = nullptr; + // We have to pass a valid WAVEFORMATEX** and not nullptr, otherwise + // GetCurrentSharedModeEnginePeriod will return E_POINTER + hr = audio_client3->GetCurrentSharedModeEnginePeriod(¤t_format, + ¤t_period); + CoTaskMemFree(current_format); + if (FAILED(hr)) { + LOG("Could not get current shared mode engine period: error: %lx", hr); + return false; + } + + if (current_period >= default_period) { + LOG("Current shared mode engine period %i too high, not using IAudioClient", + current_period); + return false; + } + + hr = audio_client3->InitializeSharedAudioStream(flags, current_period, + mix_format.get(), NULL); + if (SUCCEEDED(hr)) { + LOG("Current shared mode engine period is %i instead of requested %i", + current_period, requested_latency); + return true; + } + + LOG("Could not initialize shared stream with IAudioClient3: error: %lx", hr); + return false; +} +#endif + +#define DIRECTION_NAME (direction == eCapture ? "capture" : "render") + +template +int +setup_wasapi_stream_one_side(cubeb_stream * stm, + cubeb_stream_params * stream_params, + wchar_t const * devid, EDataFlow direction, + REFIID riid, com_ptr & audio_client, + uint32_t * buffer_frame_count, HANDLE & event, + T & render_or_capture_client, + cubeb_stream_params * mix_params, + com_ptr & device) +{ + XASSERT(direction == eCapture || direction == eRender); + + HRESULT hr; + bool is_loopback = stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK; + if (is_loopback && direction != eCapture) { + LOG("Loopback pref can only be used with capture streams!\n"); + return CUBEB_ERROR; + } + + stm->stream_reset_lock.assert_current_thread_owns(); + // If user doesn't specify a particular device, we can choose another one when + // the given devid is unavailable. + bool allow_fallback = + direction == eCapture ? !stm->input_device_id : !stm->output_device_id; + bool try_again = false; + // This loops until we find a device that works, or we've exhausted all + // possibilities. + do { + if (devid) { + hr = get_endpoint(device, devid); + if (FAILED(hr)) { + LOG("Could not get %s endpoint, error: %lx\n", DIRECTION_NAME, hr); + return CUBEB_ERROR; + } + } else { + // If caller has requested loopback but not specified a device, look for + // the default render device. Otherwise look for the default device + // appropriate to the direction. + hr = get_default_endpoint(device, is_loopback ? eRender : direction, + pref_to_role(stream_params->prefs)); + if (FAILED(hr)) { + if (is_loopback) { + LOG("Could not get default render endpoint for loopback, error: " + "%lx\n", + hr); + } else { + LOG("Could not get default %s endpoint, error: %lx\n", DIRECTION_NAME, + hr); + } + return CUBEB_ERROR; + } + } + + /* Get a client. We will get all other interfaces we need from + * this pointer. */ +#if 0 // See https://bugzilla.mozilla.org/show_bug.cgi?id=1590902 + hr = device->Activate(__uuidof(IAudioClient3), + CLSCTX_INPROC_SERVER, + NULL, audio_client.receive_vpp()); + if (hr == E_NOINTERFACE) { +#endif + hr = device->Activate(__uuidof(IAudioClient), CLSCTX_INPROC_SERVER, NULL, + audio_client.receive_vpp()); +#if 0 + } +#endif + + if (FAILED(hr)) { + LOG("Could not activate the device to get an audio" + " client for %s: error: %lx\n", + DIRECTION_NAME, hr); + // A particular device can't be activated because it has been + // unplugged, try fall back to the default audio device. + if (devid && hr == AUDCLNT_E_DEVICE_INVALIDATED && allow_fallback) { + LOG("Trying again with the default %s audio device.", DIRECTION_NAME); + devid = nullptr; + device = nullptr; + try_again = true; + } else { + return CUBEB_ERROR; + } + } else { + try_again = false; + } + } while (try_again); + + /* We have to distinguish between the format the mixer uses, + * and the format the stream we want to play uses. */ + WAVEFORMATEX * tmp = nullptr; + hr = audio_client->GetMixFormat(&tmp); + if (FAILED(hr)) { + LOG("Could not fetch current mix format from the audio" + " client for %s: error: %lx", + DIRECTION_NAME, hr); + return CUBEB_ERROR; + } + com_heap_ptr mix_format(tmp); + + mix_format->wBitsPerSample = stm->bytes_per_sample * 8; + if (mix_format->wFormatTag == WAVE_FORMAT_PCM || + mix_format->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) { + switch (mix_format->wBitsPerSample) { + case 8: + case 16: + mix_format->wFormatTag = WAVE_FORMAT_PCM; + break; + case 32: + mix_format->wFormatTag = WAVE_FORMAT_IEEE_FLOAT; + break; + default: + LOG("%u bits per sample is incompatible with PCM wave formats", + mix_format->wBitsPerSample); + return CUBEB_ERROR; + } + } + + if (mix_format->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { + WAVEFORMATEXTENSIBLE * format_pcm = + reinterpret_cast(mix_format.get()); + format_pcm->SubFormat = stm->waveformatextensible_sub_format; + } + waveformatex_update_derived_properties(mix_format.get()); + + /* Set channel layout only when there're more than two channels. Otherwise, + * use the default setting retrieved from the stream format of the audio + * engine's internal processing by GetMixFormat. */ + if (mix_format->nChannels > 2) { + handle_channel_layout(stm, direction, mix_format, stream_params); + } + + mix_params->format = stream_params->format; + mix_params->rate = mix_format->nSamplesPerSec; + mix_params->channels = mix_format->nChannels; + mix_params->layout = mask_to_channel_layout(mix_format.get()); + + LOG("Setup requested=[f=%d r=%u c=%u l=%u] mix=[f=%d r=%u c=%u l=%u]", + stream_params->format, stream_params->rate, stream_params->channels, + stream_params->layout, mix_params->format, mix_params->rate, + mix_params->channels, mix_params->layout); + + DWORD flags = 0; + + // Check if a loopback device should be requested. Note that event callbacks + // do not work with loopback devices, so only request these if not looping. + if (is_loopback) { + flags |= AUDCLNT_STREAMFLAGS_LOOPBACK; + } else { + flags |= AUDCLNT_STREAMFLAGS_EVENTCALLBACK; + } + + REFERENCE_TIME latency_hns = frames_to_hns(stream_params->rate, stm->latency); + + // Adjust input latency and check if input is using bluetooth handsfree + // protocol. + if (direction == eCapture) { + stm->input_bluetooth_handsfree = false; + + wasapi_default_devices default_devices(stm->device_enumerator.get()); + cubeb_device_info device_info; + if (wasapi_create_device(stm->context, device_info, + stm->device_enumerator.get(), device.get(), + &default_devices) == CUBEB_OK) { + if (device_info.latency_hi == 0) { + LOG("Input: could not query latency_hi to guess safe latency"); + wasapi_destroy_device(&device_info); + return CUBEB_ERROR; + } + // This multiplicator has been found empirically. + uint32_t latency_frames = device_info.latency_hi * 8; + LOG("Input: latency increased to %u frames from a default of %u", + latency_frames, device_info.latency_hi); + latency_hns = frames_to_hns(device_info.default_rate, latency_frames); + + const char * HANDSFREE_TAG = "BTHHFENUM"; + size_t len = sizeof(HANDSFREE_TAG); + if (strlen(device_info.group_id) >= len && + strncmp(device_info.group_id, HANDSFREE_TAG, len) == 0) { + LOG("Input device is using bluetooth handsfree protocol"); + stm->input_bluetooth_handsfree = true; + } + + wasapi_destroy_device(&device_info); + } else { + LOG("Could not get cubeb_device_info. Skip customizing input settings"); + } + } + + if (stream_params->prefs & CUBEB_STREAM_PREF_RAW) { + if (initialize_iaudioclient2(audio_client) != CUBEB_OK) { + LOG("Can't initialize an IAudioClient2, error: %lx", GetLastError()); + // This is not fatal. + } + } + +#if 0 // See https://bugzilla.mozilla.org/show_bug.cgi?id=1590902 + if (initialize_iaudioclient3(audio_client, stm, mix_format, flags, direction)) { + LOG("Initialized with IAudioClient3"); + } else { +#endif + hr = audio_client->Initialize(AUDCLNT_SHAREMODE_SHARED, flags, latency_hns, 0, + mix_format.get(), NULL); +#if 0 + } +#endif + if (FAILED(hr)) { + LOG("Unable to initialize audio client for %s: %lx.", DIRECTION_NAME, hr); + return CUBEB_ERROR; + } + + hr = audio_client->GetBufferSize(buffer_frame_count); + if (FAILED(hr)) { + LOG("Could not get the buffer size from the client" + " for %s %lx.", + DIRECTION_NAME, hr); + return CUBEB_ERROR; + } + + LOG("Buffer size is: %d for %s\n", *buffer_frame_count, DIRECTION_NAME); + + // Events are used if not looping back + if (!is_loopback) { + hr = audio_client->SetEventHandle(event); + if (FAILED(hr)) { + LOG("Could set the event handle for the %s client %lx.", DIRECTION_NAME, + hr); + return CUBEB_ERROR; + } + } + + hr = audio_client->GetService(riid, render_or_capture_client.receive_vpp()); + if (FAILED(hr)) { + LOG("Could not get the %s client %lx.", DIRECTION_NAME, hr); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +#undef DIRECTION_NAME + +// Returns a non-null cubeb_devid if we find a matched device, or nullptr +// otherwise. +cubeb_devid +wasapi_find_bt_handsfree_output_device(cubeb_stream * stm) +{ + HRESULT hr; + cubeb_device_info * input_device = nullptr; + cubeb_device_collection collection; + + // Only try to match to an output device if the input device is a bluetooth + // device that is using the handsfree protocol + if (!stm->input_bluetooth_handsfree) { + return nullptr; + } + + wchar_t * tmp = nullptr; + hr = stm->input_device->GetId(&tmp); + if (FAILED(hr)) { + LOG("Couldn't get input device id in " + "wasapi_find_bt_handsfree_output_device"); + return nullptr; + } + com_heap_ptr device_id(tmp); + cubeb_devid input_device_id = reinterpret_cast( + intern_device_id(stm->context, device_id.get())); + if (!input_device_id) { + return nullptr; + } + + int rv = wasapi_enumerate_devices_internal( + stm->context, + (cubeb_device_type)(CUBEB_DEVICE_TYPE_INPUT | CUBEB_DEVICE_TYPE_OUTPUT), + &collection, DEVICE_STATE_ACTIVE); + if (rv != CUBEB_OK) { + return nullptr; + } + + // Find the input device, and then find the output device with the same group + // id and the same rate. + for (uint32_t i = 0; i < collection.count; i++) { + if (collection.device[i].devid == input_device_id) { + input_device = &collection.device[i]; + break; + } + } + + cubeb_devid matched_output = nullptr; + + if (input_device) { + for (uint32_t i = 0; i < collection.count; i++) { + cubeb_device_info & dev = collection.device[i]; + if (dev.type == CUBEB_DEVICE_TYPE_OUTPUT && dev.group_id && + !strcmp(dev.group_id, input_device->group_id) && + dev.default_rate == input_device->default_rate) { + LOG("Found matching device for %s: %s", input_device->friendly_name, + dev.friendly_name); + matched_output = dev.devid; + break; + } + } + } + + wasapi_device_collection_destroy(stm->context, &collection); + return matched_output; +} + +std::unique_ptr +copy_wide_string(const wchar_t * src) +{ + XASSERT(src); + size_t len = wcslen(src); + std::unique_ptr copy(new wchar_t[len + 1]); + if (wcsncpy_s(copy.get(), len + 1, src, len) != 0) { + return nullptr; + } + return copy; +} + +int +setup_wasapi_stream(cubeb_stream * stm) +{ + int rv; + + stm->stream_reset_lock.assert_current_thread_owns(); + + XASSERT((!stm->output_client || !stm->input_client) && + "WASAPI stream already setup, close it first."); + + std::unique_ptr selected_output_device_id; + if (stm->output_device_id) { + if (std::unique_ptr tmp = + move(copy_wide_string(stm->output_device_id.get()))) { + selected_output_device_id = move(tmp); + } else { + LOG("Failed to copy output device identifier."); + return CUBEB_ERROR; + } + } + + if (has_input(stm)) { + LOG("(%p) Setup capture: device=%p", stm, stm->input_device_id.get()); + rv = setup_wasapi_stream_one_side( + stm, &stm->input_stream_params, stm->input_device_id.get(), eCapture, + __uuidof(IAudioCaptureClient), stm->input_client, + &stm->input_buffer_frame_count, stm->input_available_event, + stm->capture_client, &stm->input_mix_params, stm->input_device); + if (rv != CUBEB_OK) { + LOG("Failure to open the input side."); + return rv; + } + + // We initializing an input stream, buffer ahead two buffers worth of + // silence. This delays the input side slightly, but allow to not glitch + // when no input is available when calling into the resampler to call the + // callback: the input refill event will be set shortly after to compensate + // for this lack of data. In debug, four buffers are used, to avoid tripping + // up assertions down the line. +#if !defined(DEBUG) + const int silent_buffer_count = 2; +#else + const int silent_buffer_count = 6; +#endif + stm->linear_input_buffer->push_silence(stm->input_buffer_frame_count * + stm->input_stream_params.channels * + silent_buffer_count); + + // If this is a bluetooth device, and the output device is the default + // device, and the default device is the same bluetooth device, pick the + // right output device, running at the same rate and with the same protocol + // as the input. + if (!selected_output_device_id) { + cubeb_devid matched = wasapi_find_bt_handsfree_output_device(stm); + if (matched) { + selected_output_device_id = + move(utf8_to_wstr(reinterpret_cast(matched))); + } + } + } + + // If we don't have an output device but are requesting a loopback device, + // we attempt to open that same device in output mode in order to drive the + // loopback via the output events. + stm->has_dummy_output = false; + if (!has_output(stm) && + stm->input_stream_params.prefs & CUBEB_STREAM_PREF_LOOPBACK) { + stm->output_stream_params.rate = stm->input_stream_params.rate; + stm->output_stream_params.channels = stm->input_stream_params.channels; + stm->output_stream_params.layout = stm->input_stream_params.layout; + if (stm->input_device_id) { + if (std::unique_ptr tmp = + move(copy_wide_string(stm->input_device_id.get()))) { + XASSERT(!selected_output_device_id); + selected_output_device_id = move(tmp); + } else { + LOG("Failed to copy device identifier while copying input stream " + "configuration to output stream configuration to drive loopback."); + return CUBEB_ERROR; + } + } + stm->has_dummy_output = true; + } + + if (has_output(stm)) { + LOG("(%p) Setup render: device=%p", stm, selected_output_device_id.get()); + rv = setup_wasapi_stream_one_side( + stm, &stm->output_stream_params, selected_output_device_id.get(), + eRender, __uuidof(IAudioRenderClient), stm->output_client, + &stm->output_buffer_frame_count, stm->refill_event, stm->render_client, + &stm->output_mix_params, stm->output_device); + if (rv != CUBEB_OK) { + LOG("Failure to open the output side."); + return rv; + } + + HRESULT hr = 0; +#ifdef CUBEB_WASAPI_USE_IAUDIOSTREAMVOLUME + hr = stm->output_client->GetService(__uuidof(IAudioStreamVolume), + stm->audio_stream_volume.receive_vpp()); + if (FAILED(hr)) { + LOG("Could not get the IAudioStreamVolume: %lx", hr); + return CUBEB_ERROR; + } +#endif + + XASSERT(stm->frames_written == 0); + hr = stm->output_client->GetService(__uuidof(IAudioClock), + stm->audio_clock.receive_vpp()); + if (FAILED(hr)) { + LOG("Could not get the IAudioClock: %lx", hr); + return CUBEB_ERROR; + } + +#ifdef CUBEB_WASAPI_USE_IAUDIOSTREAMVOLUME + /* Restore the stream volume over a device change. */ + if (stream_set_volume(stm, stm->volume) != CUBEB_OK) { + LOG("Could not set the volume."); + return CUBEB_ERROR; + } +#endif + } + + /* If we have both input and output, we resample to + * the highest sample rate available. */ + int32_t target_sample_rate; + if (has_input(stm) && has_output(stm)) { + XASSERT(stm->input_stream_params.rate == stm->output_stream_params.rate); + target_sample_rate = stm->input_stream_params.rate; + } else if (has_input(stm)) { + target_sample_rate = stm->input_stream_params.rate; + } else { + XASSERT(has_output(stm)); + target_sample_rate = stm->output_stream_params.rate; + } + + LOG("Target sample rate: %d", target_sample_rate); + + /* If we are playing/capturing a mono stream, we only resample one channel, + and copy it over, so we are always resampling the number + of channels of the stream, not the number of channels + that WASAPI wants. */ + cubeb_stream_params input_params = stm->input_mix_params; + input_params.channels = stm->input_stream_params.channels; + cubeb_stream_params output_params = stm->output_mix_params; + output_params.channels = stm->output_stream_params.channels; + + stm->resampler.reset(cubeb_resampler_create( + stm, has_input(stm) ? &input_params : nullptr, + has_output(stm) && !stm->has_dummy_output ? &output_params : nullptr, + target_sample_rate, wasapi_data_callback, stm->user_ptr, + stm->voice ? CUBEB_RESAMPLER_QUALITY_VOIP + : CUBEB_RESAMPLER_QUALITY_DESKTOP, + CUBEB_RESAMPLER_RECLOCK_NONE)); + if (!stm->resampler) { + LOG("Could not get a resampler"); + return CUBEB_ERROR; + } + + XASSERT(has_input(stm) || has_output(stm)); + + if (has_input(stm) && has_output(stm)) { + stm->refill_callback = refill_callback_duplex; + } else if (has_input(stm)) { + stm->refill_callback = refill_callback_input; + } else if (has_output(stm)) { + stm->refill_callback = refill_callback_output; + } + + // Create input mixer. + if (has_input(stm) && + ((stm->input_mix_params.layout != CUBEB_LAYOUT_UNDEFINED && + stm->input_mix_params.layout != stm->input_stream_params.layout) || + (stm->input_mix_params.channels != stm->input_stream_params.channels))) { + if (stm->input_mix_params.layout == CUBEB_LAYOUT_UNDEFINED) { + LOG("Input stream using undefined layout! Any mixing may be " + "unpredictable!\n"); + } + stm->input_mixer.reset(cubeb_mixer_create( + stm->input_stream_params.format, stm->input_mix_params.channels, + stm->input_mix_params.layout, stm->input_stream_params.channels, + stm->input_stream_params.layout)); + assert(stm->input_mixer); + } + + // Create output mixer. + if (has_output(stm) && + stm->output_mix_params.layout != stm->output_stream_params.layout) { + if (stm->output_mix_params.layout == CUBEB_LAYOUT_UNDEFINED) { + LOG("Output stream using undefined layout! Any mixing may be " + "unpredictable!\n"); + } + stm->output_mixer.reset(cubeb_mixer_create( + stm->output_stream_params.format, stm->output_stream_params.channels, + stm->output_stream_params.layout, stm->output_mix_params.channels, + stm->output_mix_params.layout)); + assert(stm->output_mixer); + // Input is up/down mixed when depacketized in get_input_buffer. + stm->mix_buffer.resize( + frames_to_bytes_before_mix(stm, stm->output_buffer_frame_count)); + } + + return CUBEB_OK; +} + +ERole +pref_to_role(cubeb_stream_prefs prefs) +{ + if (prefs & CUBEB_STREAM_PREF_VOICE) { + return eCommunications; + } + + return eConsole; +} + +int +wasapi_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + int rv; + + XASSERT(context && stream && (input_stream_params || output_stream_params)); + + if (output_stream_params && input_stream_params && + output_stream_params->format != input_stream_params->format) { + return CUBEB_ERROR_INVALID_FORMAT; + } + + std::unique_ptr stm( + new cubeb_stream(), wasapi_stream_destroy); + + stm->context = context; + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->user_ptr = user_ptr; + stm->role = eConsole; + stm->input_bluetooth_handsfree = false; + + HRESULT hr = + CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(stm->device_enumerator.receive())); + if (FAILED(hr)) { + LOG("Could not get device enumerator: %lx", hr); + return hr; + } + + if (input_stream_params) { + stm->input_stream_params = *input_stream_params; + stm->input_device_id = + utf8_to_wstr(reinterpret_cast(input_device)); + } + if (output_stream_params) { + stm->output_stream_params = *output_stream_params; + stm->output_device_id = + utf8_to_wstr(reinterpret_cast(output_device)); + } + + if (stm->output_stream_params.prefs & CUBEB_STREAM_PREF_VOICE || + stm->input_stream_params.prefs & CUBEB_STREAM_PREF_VOICE) { + stm->voice = true; + } else { + stm->voice = false; + } + + switch (output_stream_params ? output_stream_params->format + : input_stream_params->format) { + case CUBEB_SAMPLE_S16NE: + stm->bytes_per_sample = sizeof(short); + stm->waveformatextensible_sub_format = KSDATAFORMAT_SUBTYPE_PCM; + stm->linear_input_buffer.reset(new auto_array_wrapper_impl); + break; + case CUBEB_SAMPLE_FLOAT32NE: + stm->bytes_per_sample = sizeof(float); + stm->waveformatextensible_sub_format = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + stm->linear_input_buffer.reset(new auto_array_wrapper_impl); + break; + default: + return CUBEB_ERROR_INVALID_FORMAT; + } + + stm->latency = latency_frames; + + stm->reconfigure_event = CreateEvent(NULL, 0, 0, NULL); + if (!stm->reconfigure_event) { + LOG("Can't create the reconfigure event, error: %lx", GetLastError()); + return CUBEB_ERROR; + } + + /* Unconditionally create the two events so that the wait logic is simpler. */ + stm->refill_event = CreateEvent(NULL, 0, 0, NULL); + if (!stm->refill_event) { + LOG("Can't create the refill event, error: %lx", GetLastError()); + return CUBEB_ERROR; + } + + stm->input_available_event = CreateEvent(NULL, 0, 0, NULL); + if (!stm->input_available_event) { + LOG("Can't create the input available event , error: %lx", GetLastError()); + return CUBEB_ERROR; + } + + { + /* Locking here is not strictly necessary, because we don't have a + notification client that can reset the stream yet, but it lets us + assert that the lock is held in the function. */ + auto_lock lock(stm->stream_reset_lock); + rv = setup_wasapi_stream(stm.get()); + } + if (rv != CUBEB_OK) { + return rv; + } + + // Follow the system default devices when not specifying devices explicitly + // and CUBEB_STREAM_PREF_DISABLE_DEVICE_SWITCHING is not set. + if ((!input_device && input_stream_params && + !(input_stream_params->prefs & + CUBEB_STREAM_PREF_DISABLE_DEVICE_SWITCHING)) || + (!output_device && output_stream_params && + !(output_stream_params->prefs & + CUBEB_STREAM_PREF_DISABLE_DEVICE_SWITCHING))) { + LOG("Follow the system default input or/and output devices"); + HRESULT hr = register_notification_client(stm.get()); + if (FAILED(hr)) { + /* this is not fatal, we can still play audio, but we won't be able + to keep using the default audio endpoint if it changes. */ + LOG("failed to register notification client, %lx", hr); + } + } + + *stream = stm.release(); + + LOG("Stream init succesfull (%p)", *stream); + return CUBEB_OK; +} + +void +close_wasapi_stream(cubeb_stream * stm) +{ + XASSERT(stm); + + stm->stream_reset_lock.assert_current_thread_owns(); + + stm->output_client = nullptr; + stm->render_client = nullptr; + + stm->input_client = nullptr; + stm->capture_client = nullptr; + + stm->output_device = nullptr; + stm->input_device = nullptr; + +#ifdef CUBEB_WASAPI_USE_IAUDIOSTREAMVOLUME + stm->audio_stream_volume = nullptr; +#endif + + stm->audio_clock = nullptr; + stm->total_frames_written += static_cast( + round(stm->frames_written * + stream_to_mix_samplerate_ratio(stm->output_stream_params, + stm->output_mix_params))); + stm->frames_written = 0; + + stm->resampler.reset(); + stm->output_mixer.reset(); + stm->input_mixer.reset(); + stm->mix_buffer.clear(); + if (stm->linear_input_buffer) { + stm->linear_input_buffer->clear(); + } +} + +void +wasapi_stream_destroy(cubeb_stream * stm) +{ + XASSERT(stm); + LOG("Stream destroy (%p)", stm); + + if (!stop_and_join_render_thread(stm, OnDestroy)) { + // Emergency bailout: render thread becomes responsible for calling + // wasapi_stream_destroy. + return; + } + + if (stm->notification_client) { + unregister_notification_client(stm); + } + + { + auto_lock lock(stm->stream_reset_lock); + close_wasapi_stream(stm); + } + + CloseHandle(stm->reconfigure_event); + CloseHandle(stm->refill_event); + CloseHandle(stm->input_available_event); + + delete stm; +} + +enum StreamDirection { OUTPUT, INPUT }; + +int +stream_start_one_side(cubeb_stream * stm, StreamDirection dir) +{ + XASSERT((dir == OUTPUT && stm->output_client) || + (dir == INPUT && stm->input_client)); + + HRESULT hr = + dir == OUTPUT ? stm->output_client->Start() : stm->input_client->Start(); + if (hr == AUDCLNT_E_DEVICE_INVALIDATED) { + LOG("audioclient invalidated for %s device, reconfiguring", + dir == OUTPUT ? "output" : "input"); + + BOOL ok = ResetEvent(stm->reconfigure_event); + if (!ok) { + LOG("resetting reconfig event failed for %s stream: %lx", + dir == OUTPUT ? "output" : "input", GetLastError()); + } + + close_wasapi_stream(stm); + int r = setup_wasapi_stream(stm); + if (r != CUBEB_OK) { + LOG("reconfigure failed"); + return r; + } + + HRESULT hr2 = dir == OUTPUT ? stm->output_client->Start() + : stm->input_client->Start(); + if (FAILED(hr2)) { + LOG("could not start the %s stream after reconfig: %lx", + dir == OUTPUT ? "output" : "input", hr); + return CUBEB_ERROR; + } + } else if (FAILED(hr)) { + LOG("could not start the %s stream: %lx.", + dir == OUTPUT ? "output" : "input", hr); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +int +wasapi_stream_start(cubeb_stream * stm) +{ + auto_lock lock(stm->stream_reset_lock); + + XASSERT(stm && !stm->thread && !stm->shutdown_event); + XASSERT(stm->output_client || stm->input_client); + + if (stm->output_client) { + int rv = stream_start_one_side(stm, OUTPUT); + if (rv != CUBEB_OK) { + return rv; + } + } + + if (stm->input_client) { + int rv = stream_start_one_side(stm, INPUT); + if (rv != CUBEB_OK) { + return rv; + } + } + + stm->shutdown_event = CreateEvent(NULL, 0, 0, NULL); + if (!stm->shutdown_event) { + LOG("Can't create the shutdown event, error: %lx", GetLastError()); + return CUBEB_ERROR; + } + + cubeb_async_log_reset_threads(); + stm->thread = + (HANDLE)_beginthreadex(NULL, 512 * 1024, wasapi_stream_render_loop, stm, + STACK_SIZE_PARAM_IS_A_RESERVATION, NULL); + if (stm->thread == NULL) { + LOG("could not create WASAPI render thread."); + CloseHandle(stm->shutdown_event); + stm->shutdown_event = 0; + return CUBEB_ERROR; + } + + wasapi_state_callback(stm, stm->user_ptr, CUBEB_STATE_STARTED); + + return CUBEB_OK; +} + +int +wasapi_stream_stop(cubeb_stream * stm) +{ + XASSERT(stm); + HRESULT hr; + + { + auto_lock lock(stm->stream_reset_lock); + + if (stm->output_client) { + hr = stm->output_client->Stop(); + if (FAILED(hr)) { + LOG("could not stop AudioClient (output)"); + return CUBEB_ERROR; + } + } + + if (stm->input_client) { + hr = stm->input_client->Stop(); + if (FAILED(hr)) { + LOG("could not stop AudioClient (input)"); + return CUBEB_ERROR; + } + } + + wasapi_state_callback(stm, stm->user_ptr, CUBEB_STATE_STOPPED); + } + + if (!stop_and_join_render_thread(stm, OnStop)) { + // If we could not join the thread, put the stream in error. + wasapi_state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + return CUBEB_ERROR; + } + + return CUBEB_OK; +} + +int +wasapi_stream_get_position(cubeb_stream * stm, uint64_t * position) +{ + XASSERT(stm && position); + auto_lock lock(stm->stream_reset_lock); + + if (!has_output(stm)) { + return CUBEB_ERROR; + } + + /* Calculate how far behind the current stream head the playback cursor is. */ + uint64_t stream_delay = static_cast(current_stream_delay(stm) * + stm->output_stream_params.rate); + + /* Calculate the logical stream head in frames at the stream sample rate. */ + uint64_t max_pos = + stm->total_frames_written + + static_cast( + round(stm->frames_written * + stream_to_mix_samplerate_ratio(stm->output_stream_params, + stm->output_mix_params))); + + *position = max_pos; + if (stream_delay <= *position) { + *position -= stream_delay; + } + + if (*position < stm->prev_position) { + *position = stm->prev_position; + } + stm->prev_position = *position; + + return CUBEB_OK; +} + +int +wasapi_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +{ + XASSERT(stm && latency); + + if (!has_output(stm)) { + return CUBEB_ERROR; + } + + auto_lock lock(stm->stream_reset_lock); + + /* The GetStreamLatency method only works if the + AudioClient has been initialized. */ + if (!stm->output_client) { + LOG("get_latency: No output_client."); + return CUBEB_ERROR; + } + + REFERENCE_TIME latency_hns; + HRESULT hr = stm->output_client->GetStreamLatency(&latency_hns); + if (FAILED(hr)) { + LOG("GetStreamLatency failed %lx.", hr); + return CUBEB_ERROR; + } + // This happens on windows 10: no error, but always 0 for latency. + if (latency_hns == 0) { + LOG("GetStreamLatency returned 0, using workaround."); + double delay_s = current_stream_delay(stm); + // convert to sample-frames + *latency = delay_s * stm->output_stream_params.rate; + } else { + *latency = hns_to_frames(stm, latency_hns); + } + + LOG("Output latency %u frames.", *latency); + + return CUBEB_OK; +} + +int +wasapi_stream_get_input_latency(cubeb_stream * stm, uint32_t * latency) +{ + XASSERT(stm && latency); + + if (!has_input(stm)) { + LOG("Input latency queried on an output-only stream."); + return CUBEB_ERROR; + } + + auto_lock lock(stm->stream_reset_lock); + + if (stm->input_latency_hns == LATENCY_NOT_AVAILABLE_YET) { + LOG("Input latency not available yet."); + return CUBEB_ERROR; + } + + *latency = hns_to_frames(stm, stm->input_latency_hns); + + return CUBEB_OK; +} + +int +wasapi_stream_set_volume(cubeb_stream * stm, float volume) +{ + auto_lock lock(stm->stream_reset_lock); + + if (!has_output(stm)) { + return CUBEB_ERROR; + } + +#ifdef CUBEB_WASAPI_USE_IAUDIOSTREAMVOLUME + if (stream_set_volume(stm, volume) != CUBEB_OK) { + return CUBEB_ERROR; + } +#endif + + stm->volume = volume; + + return CUBEB_OK; +} + +static char const * +wstr_to_utf8(LPCWSTR str) +{ + int size = ::WideCharToMultiByte(CP_UTF8, 0, str, -1, nullptr, 0, NULL, NULL); + if (size <= 0) { + return nullptr; + } + + char * ret = static_cast(malloc(size)); + ::WideCharToMultiByte(CP_UTF8, 0, str, -1, ret, size, NULL, NULL); + return ret; +} + +static std::unique_ptr +utf8_to_wstr(char const * str) { + int size = ::MultiByteToWideChar(CP_UTF8, 0, str, -1, nullptr, 0); + if (size <= 0) { + return nullptr; + } + + std::unique_ptr ret(new wchar_t[size]); + ::MultiByteToWideChar(CP_UTF8, 0, str, -1, ret.get(), size); + return ret; +} + +static com_ptr wasapi_get_device_node( + IMMDeviceEnumerator * enumerator, IMMDevice * dev) +{ + com_ptr ret; + com_ptr devtopo; + com_ptr connector; + + if (SUCCEEDED(dev->Activate(__uuidof(IDeviceTopology), CLSCTX_ALL, NULL, + devtopo.receive_vpp())) && + SUCCEEDED(devtopo->GetConnector(0, connector.receive()))) { + wchar_t * tmp = nullptr; + if (SUCCEEDED(connector->GetDeviceIdConnectedTo(&tmp))) { + com_heap_ptr filterid(tmp); + if (FAILED(enumerator->GetDevice(filterid.get(), ret.receive()))) + ret = NULL; + } + } + + return ret; +} + +static com_heap_ptr +wasapi_get_default_device_id(EDataFlow flow, ERole role, + IMMDeviceEnumerator * enumerator) +{ + com_ptr dev; + + HRESULT hr = enumerator->GetDefaultAudioEndpoint(flow, role, dev.receive()); + if (SUCCEEDED(hr)) { + wchar_t * tmp = nullptr; + if (SUCCEEDED(dev->GetId(&tmp))) { + com_heap_ptr devid(tmp); + return devid; + } + } + + return nullptr; +} + +/* `ret` must be deallocated with `wasapi_destroy_device`, iff the return value + * of this function is `CUBEB_OK`. */ +int +wasapi_create_device(cubeb * ctx, cubeb_device_info & ret, + IMMDeviceEnumerator * enumerator, IMMDevice * dev, + wasapi_default_devices * defaults) +{ + com_ptr endpoint; + com_ptr devnode; + com_ptr client; + EDataFlow flow; + DWORD state = DEVICE_STATE_NOTPRESENT; + com_ptr propstore; + REFERENCE_TIME def_period, min_period; + HRESULT hr; + + XASSERT(enumerator && dev && defaults); + + // zero-out to be able to safely delete the pointers to friendly_name and + // group_id at all time in this function. + PodZero(&ret, 1); + + struct prop_variant : public PROPVARIANT { + prop_variant() { PropVariantInit(this); } + ~prop_variant() { PropVariantClear(this); } + prop_variant(prop_variant const &) = delete; + prop_variant & operator=(prop_variant const &) = delete; + }; + + hr = dev->QueryInterface(IID_PPV_ARGS(endpoint.receive())); + if (FAILED(hr)) { + wasapi_destroy_device(&ret); + return CUBEB_ERROR; + } + + hr = endpoint->GetDataFlow(&flow); + if (FAILED(hr)) { + wasapi_destroy_device(&ret); + return CUBEB_ERROR; + } + + wchar_t * tmp = nullptr; + hr = dev->GetId(&tmp); + if (FAILED(hr)) { + wasapi_destroy_device(&ret); + return CUBEB_ERROR; + } + com_heap_ptr device_id(tmp); + + char const * device_id_intern = intern_device_id(ctx, device_id.get()); + if (!device_id_intern) { + wasapi_destroy_device(&ret); + return CUBEB_ERROR; + } + + hr = dev->OpenPropertyStore(STGM_READ, propstore.receive()); + if (FAILED(hr)) { + wasapi_destroy_device(&ret); + return CUBEB_ERROR; + } + + hr = dev->GetState(&state); + if (FAILED(hr)) { + wasapi_destroy_device(&ret); + return CUBEB_ERROR; + } + + ret.device_id = device_id_intern; + ret.devid = reinterpret_cast(ret.device_id); + prop_variant namevar; + hr = propstore->GetValue(PKEY_Device_FriendlyName, &namevar); + if (SUCCEEDED(hr) && namevar.vt == VT_LPWSTR) { + ret.friendly_name = wstr_to_utf8(namevar.pwszVal); + } + if (!ret.friendly_name) { + // This is not fatal, but a valid string is expected in all cases. + char * empty = new char[1]; + empty[0] = '\0'; + ret.friendly_name = empty; + } + + devnode = wasapi_get_device_node(enumerator, dev); + if (devnode) { + com_ptr ps; + hr = devnode->OpenPropertyStore(STGM_READ, ps.receive()); + if (FAILED(hr)) { + wasapi_destroy_device(&ret); + return CUBEB_ERROR; + } + + prop_variant instancevar; + hr = ps->GetValue(PKEY_Device_InstanceId, &instancevar); + if (SUCCEEDED(hr) && instancevar.vt == VT_LPWSTR) { + ret.group_id = wstr_to_utf8(instancevar.pwszVal); + } + } + + if (!ret.group_id) { + // This is not fatal, but a valid string is expected in all cases. + char * empty = new char[1]; + empty[0] = '\0'; + ret.group_id = empty; + } + + ret.preferred = CUBEB_DEVICE_PREF_NONE; + if (defaults->is_default(flow, eConsole, device_id.get())) { + ret.preferred = + (cubeb_device_pref)(ret.preferred | CUBEB_DEVICE_PREF_MULTIMEDIA | + CUBEB_DEVICE_PREF_NOTIFICATION); + } else if (defaults->is_default(flow, eCommunications, device_id.get())) { + ret.preferred = + (cubeb_device_pref)(ret.preferred | CUBEB_DEVICE_PREF_VOICE); + } + + if (flow == eRender) { + ret.type = CUBEB_DEVICE_TYPE_OUTPUT; + } else if (flow == eCapture) { + ret.type = CUBEB_DEVICE_TYPE_INPUT; + } + + switch (state) { + case DEVICE_STATE_ACTIVE: + ret.state = CUBEB_DEVICE_STATE_ENABLED; + break; + case DEVICE_STATE_UNPLUGGED: + ret.state = CUBEB_DEVICE_STATE_UNPLUGGED; + break; + default: + ret.state = CUBEB_DEVICE_STATE_DISABLED; + break; + }; + + ret.format = static_cast(CUBEB_DEVICE_FMT_F32NE | + CUBEB_DEVICE_FMT_S16NE); + ret.default_format = CUBEB_DEVICE_FMT_F32NE; + prop_variant fmtvar; + hr = propstore->GetValue(PKEY_AudioEngine_DeviceFormat, &fmtvar); + if (SUCCEEDED(hr) && fmtvar.vt == VT_BLOB) { + if (fmtvar.blob.cbSize == sizeof(PCMWAVEFORMAT)) { + const PCMWAVEFORMAT * pcm = + reinterpret_cast(fmtvar.blob.pBlobData); + + ret.max_rate = ret.min_rate = ret.default_rate = pcm->wf.nSamplesPerSec; + ret.max_channels = pcm->wf.nChannels; + } else if (fmtvar.blob.cbSize >= sizeof(WAVEFORMATEX)) { + WAVEFORMATEX * wfx = + reinterpret_cast(fmtvar.blob.pBlobData); + + if (fmtvar.blob.cbSize >= sizeof(WAVEFORMATEX) + wfx->cbSize || + wfx->wFormatTag == WAVE_FORMAT_PCM) { + ret.max_rate = ret.min_rate = ret.default_rate = wfx->nSamplesPerSec; + ret.max_channels = wfx->nChannels; + } + } + } + + if (SUCCEEDED(dev->Activate(__uuidof(IAudioClient), CLSCTX_INPROC_SERVER, + NULL, client.receive_vpp())) && + SUCCEEDED(client->GetDevicePeriod(&def_period, &min_period))) { + ret.latency_lo = hns_to_frames(ret.default_rate, min_period); + ret.latency_hi = hns_to_frames(ret.default_rate, def_period); + } else { + ret.latency_lo = 0; + ret.latency_hi = 0; + } + + XASSERT(ret.friendly_name && ret.group_id); + + return CUBEB_OK; +} + +void +wasapi_destroy_device(cubeb_device_info * device) +{ + delete[] device->friendly_name; + delete[] device->group_id; +} + +static int +wasapi_enumerate_devices_internal(cubeb * context, cubeb_device_type type, + cubeb_device_collection * out, + DWORD state_mask) +{ + com_ptr enumerator; + com_ptr collection; + HRESULT hr; + UINT cc, i; + EDataFlow flow; + + hr = + CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(enumerator.receive())); + if (FAILED(hr)) { + LOG("Could not get device enumerator: %lx", hr); + return CUBEB_ERROR; + } + + wasapi_default_devices default_devices(enumerator.get()); + + if (type == CUBEB_DEVICE_TYPE_OUTPUT) { + flow = eRender; + } else if (type == CUBEB_DEVICE_TYPE_INPUT) { + flow = eCapture; + } else if (type & (CUBEB_DEVICE_TYPE_INPUT | CUBEB_DEVICE_TYPE_OUTPUT)) { + flow = eAll; + } else { + return CUBEB_ERROR; + } + + hr = enumerator->EnumAudioEndpoints(flow, state_mask, collection.receive()); + if (FAILED(hr)) { + LOG("Could not enumerate audio endpoints: %lx", hr); + return CUBEB_ERROR; + } + + hr = collection->GetCount(&cc); + if (FAILED(hr)) { + LOG("IMMDeviceCollection::GetCount() failed: %lx", hr); + return CUBEB_ERROR; + } + cubeb_device_info * devices = new cubeb_device_info[cc]; + if (!devices) + return CUBEB_ERROR; + + PodZero(devices, cc); + out->count = 0; + for (i = 0; i < cc; i++) { + com_ptr dev; + hr = collection->Item(i, dev.receive()); + if (FAILED(hr)) { + LOG("IMMDeviceCollection::Item(%u) failed: %lx", i - 1, hr); + continue; + } + if (wasapi_create_device(context, devices[out->count], enumerator.get(), + dev.get(), &default_devices) == CUBEB_OK) { + out->count += 1; + } + } + + out->device = devices; + return CUBEB_OK; +} + +static int +wasapi_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * out) +{ + return wasapi_enumerate_devices_internal( + context, type, out, + DEVICE_STATE_ACTIVE | DEVICE_STATE_DISABLED | DEVICE_STATE_UNPLUGGED); +} + +static int +wasapi_device_collection_destroy(cubeb * /*ctx*/, + cubeb_device_collection * collection) +{ + XASSERT(collection); + + for (size_t n = 0; n < collection->count; n++) { + cubeb_device_info & dev = collection->device[n]; + wasapi_destroy_device(&dev); + } + + delete[] collection->device; + return CUBEB_OK; +} + +static int +wasapi_register_device_collection_changed( + cubeb * context, cubeb_device_type devtype, + cubeb_device_collection_changed_callback collection_changed_callback, + void * user_ptr) +{ + auto_lock lock(context->lock); + if (devtype == CUBEB_DEVICE_TYPE_UNKNOWN) { + return CUBEB_ERROR_INVALID_PARAMETER; + } + + if (collection_changed_callback) { + // Make sure it has been unregistered first. + XASSERT(((devtype & CUBEB_DEVICE_TYPE_INPUT) && + !context->input_collection_changed_callback) || + ((devtype & CUBEB_DEVICE_TYPE_OUTPUT) && + !context->output_collection_changed_callback)); + + // Stop the notification client. Notifications arrive on + // a separate thread. We stop them here to avoid + // synchronization issues during the update. + if (context->device_collection_enumerator.get()) { + HRESULT hr = unregister_collection_notification_client(context); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + } + + if (devtype & CUBEB_DEVICE_TYPE_INPUT) { + context->input_collection_changed_callback = collection_changed_callback; + context->input_collection_changed_user_ptr = user_ptr; + } + if (devtype & CUBEB_DEVICE_TYPE_OUTPUT) { + context->output_collection_changed_callback = collection_changed_callback; + context->output_collection_changed_user_ptr = user_ptr; + } + + HRESULT hr = register_collection_notification_client(context); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + } else { + if (!context->device_collection_enumerator.get()) { + // Already unregistered, ignore it. + return CUBEB_OK; + } + + HRESULT hr = unregister_collection_notification_client(context); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + if (devtype & CUBEB_DEVICE_TYPE_INPUT) { + context->input_collection_changed_callback = nullptr; + context->input_collection_changed_user_ptr = nullptr; + } + if (devtype & CUBEB_DEVICE_TYPE_OUTPUT) { + context->output_collection_changed_callback = nullptr; + context->output_collection_changed_user_ptr = nullptr; + } + + // If after the updates we still have registered + // callbacks restart the notification client. + if (context->input_collection_changed_callback || + context->output_collection_changed_callback) { + hr = register_collection_notification_client(context); + if (FAILED(hr)) { + return CUBEB_ERROR; + } + } + } + + return CUBEB_OK; +} + +cubeb_ops const wasapi_ops = { + /*.init =*/wasapi_init, + /*.get_backend_id =*/wasapi_get_backend_id, + /*.get_max_channel_count =*/wasapi_get_max_channel_count, + /*.get_min_latency =*/wasapi_get_min_latency, + /*.get_preferred_sample_rate =*/wasapi_get_preferred_sample_rate, + /*.enumerate_devices =*/wasapi_enumerate_devices, + /*.device_collection_destroy =*/wasapi_device_collection_destroy, + /*.destroy =*/wasapi_destroy, + /*.stream_init =*/wasapi_stream_init, + /*.stream_destroy =*/wasapi_stream_destroy, + /*.stream_start =*/wasapi_stream_start, + /*.stream_stop =*/wasapi_stream_stop, + /*.stream_get_position =*/wasapi_stream_get_position, + /*.stream_get_latency =*/wasapi_stream_get_latency, + /*.stream_get_input_latency =*/wasapi_stream_get_input_latency, + /*.stream_set_volume =*/wasapi_stream_set_volume, + /*.stream_set_name =*/NULL, + /*.stream_get_current_device =*/NULL, + /*.stream_device_destroy =*/NULL, + /*.stream_register_device_changed_callback =*/NULL, + /*.register_device_collection_changed =*/ + wasapi_register_device_collection_changed, +}; +} // namespace diff --git a/3rdparty/cubeb/src/cubeb_winmm.c b/3rdparty/cubeb/src/cubeb_winmm.c new file mode 100644 index 0000000000..44aec86d25 --- /dev/null +++ b/3rdparty/cubeb/src/cubeb_winmm.c @@ -0,0 +1,1171 @@ +/* + * Copyright © 2011 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#undef WINVER +#define WINVER 0x0501 +#undef WIN32_LEAN_AND_MEAN + +#include "cubeb-internal.h" +#include "cubeb/cubeb.h" +#include +#include +#include +#include +#include +#include + +/* clang-format off */ +/* These need to be included after windows.h */ +#include +#include +/* clang-format on */ + +/* This is missing from the MinGW headers. Use a safe fallback. */ +#if !defined(MEMORY_ALLOCATION_ALIGNMENT) +#define MEMORY_ALLOCATION_ALIGNMENT 16 +#endif + +/**This is also missing from the MinGW headers. It also appears to be + * undocumented by Microsoft.*/ +#ifndef WAVE_FORMAT_48M08 +#define WAVE_FORMAT_48M08 0x00001000 /* 48 kHz, Mono, 8-bit */ +#endif +#ifndef WAVE_FORMAT_48M16 +#define WAVE_FORMAT_48M16 0x00002000 /* 48 kHz, Mono, 16-bit */ +#endif +#ifndef WAVE_FORMAT_48S08 +#define WAVE_FORMAT_48S08 0x00004000 /* 48 kHz, Stereo, 8-bit */ +#endif +#ifndef WAVE_FORMAT_48S16 +#define WAVE_FORMAT_48S16 0x00008000 /* 48 kHz, Stereo, 16-bit */ +#endif +#ifndef WAVE_FORMAT_96M08 +#define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ +#endif +#ifndef WAVE_FORMAT_96M16 +#define WAVE_FORMAT_96M16 0x00020000 /* 96 kHz, Mono, 16-bit */ +#endif +#ifndef WAVE_FORMAT_96S08 +#define WAVE_FORMAT_96S08 0x00040000 /* 96 kHz, Stereo, 8-bit */ +#endif +#ifndef WAVE_FORMAT_96S16 +#define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */ +#endif + +/**Taken from winbase.h, also not in MinGW.*/ +#ifndef STACK_SIZE_PARAM_IS_A_RESERVATION +#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000 // Threads only +#endif + +#ifndef DRVM_MAPPER +#define DRVM_MAPPER (0x2000) +#endif +#ifndef DRVM_MAPPER_PREFERRED_GET +#define DRVM_MAPPER_PREFERRED_GET (DRVM_MAPPER + 21) +#endif +#ifndef DRVM_MAPPER_CONSOLEVOICECOM_GET +#define DRVM_MAPPER_CONSOLEVOICECOM_GET (DRVM_MAPPER + 23) +#endif + +#define CUBEB_STREAM_MAX 32 +#define NBUFS 4 + +struct cubeb_stream_item { + SLIST_ENTRY head; + cubeb_stream * stream; +}; + +static struct cubeb_ops const winmm_ops; + +struct cubeb { + struct cubeb_ops const * ops; + HANDLE event; + HANDLE thread; + int shutdown; + PSLIST_HEADER work; + CRITICAL_SECTION lock; + unsigned int active_streams; + unsigned int minimum_latency_ms; +}; + +struct cubeb_stream { + /* Note: Must match cubeb_stream layout in cubeb.c. */ + cubeb * context; + void * user_ptr; + /**/ + cubeb_stream_params params; + cubeb_data_callback data_callback; + cubeb_state_callback state_callback; + WAVEHDR buffers[NBUFS]; + size_t buffer_size; + int next_buffer; + int free_buffers; + int shutdown; + int draining; + HANDLE event; + HWAVEOUT waveout; + CRITICAL_SECTION lock; + uint64_t written; + float soft_volume; + /* For position wrap-around handling: */ + size_t frame_size; + DWORD prev_pos_lo_dword; + DWORD pos_hi_dword; +}; + +static size_t +bytes_per_frame(cubeb_stream_params params) +{ + size_t bytes; + + switch (params.format) { + case CUBEB_SAMPLE_S16LE: + bytes = sizeof(signed short); + break; + case CUBEB_SAMPLE_FLOAT32LE: + bytes = sizeof(float); + break; + default: + XASSERT(0); + } + + return bytes * params.channels; +} + +static WAVEHDR * +winmm_get_next_buffer(cubeb_stream * stm) +{ + WAVEHDR * hdr = NULL; + + XASSERT(stm->free_buffers > 0 && stm->free_buffers <= NBUFS); + hdr = &stm->buffers[stm->next_buffer]; + XASSERT(hdr->dwFlags & WHDR_PREPARED || + (hdr->dwFlags & WHDR_DONE && !(hdr->dwFlags & WHDR_INQUEUE))); + stm->next_buffer = (stm->next_buffer + 1) % NBUFS; + stm->free_buffers -= 1; + + return hdr; +} + +static void +winmm_refill_stream(cubeb_stream * stm) +{ + WAVEHDR * hdr; + long got; + long wanted; + MMRESULT r; + + EnterCriticalSection(&stm->lock); + stm->free_buffers += 1; + XASSERT(stm->free_buffers > 0 && stm->free_buffers <= NBUFS); + + if (stm->draining) { + LeaveCriticalSection(&stm->lock); + if (stm->free_buffers == NBUFS) { + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); + } + SetEvent(stm->event); + return; + } + + if (stm->shutdown) { + LeaveCriticalSection(&stm->lock); + SetEvent(stm->event); + return; + } + + hdr = winmm_get_next_buffer(stm); + + wanted = (DWORD)stm->buffer_size / bytes_per_frame(stm->params); + + /* It is assumed that the caller is holding this lock. It must be dropped + during the callback to avoid deadlocks. */ + LeaveCriticalSection(&stm->lock); + got = stm->data_callback(stm, stm->user_ptr, NULL, hdr->lpData, wanted); + EnterCriticalSection(&stm->lock); + if (got < 0) { + LeaveCriticalSection(&stm->lock); + /* XXX handle this case */ + XASSERT(0); + return; + } else if (got < wanted) { + stm->draining = 1; + } + stm->written += got; + + XASSERT(hdr->dwFlags & WHDR_PREPARED); + + hdr->dwBufferLength = got * bytes_per_frame(stm->params); + XASSERT(hdr->dwBufferLength <= stm->buffer_size); + + if (stm->soft_volume != -1.0) { + if (stm->params.format == CUBEB_SAMPLE_FLOAT32NE) { + float * b = (float *)hdr->lpData; + uint32_t i; + for (i = 0; i < got * stm->params.channels; i++) { + b[i] *= stm->soft_volume; + } + } else { + short * b = (short *)hdr->lpData; + uint32_t i; + for (i = 0; i < got * stm->params.channels; i++) { + b[i] = (short)(b[i] * stm->soft_volume); + } + } + } + + r = waveOutWrite(stm->waveout, hdr, sizeof(*hdr)); + if (r != MMSYSERR_NOERROR) { + LeaveCriticalSection(&stm->lock); + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); + return; + } + + LeaveCriticalSection(&stm->lock); +} + +static unsigned __stdcall winmm_buffer_thread(void * user_ptr) +{ + cubeb * ctx = (cubeb *)user_ptr; + XASSERT(ctx); + + for (;;) { + DWORD r; + PSLIST_ENTRY item; + + r = WaitForSingleObject(ctx->event, INFINITE); + XASSERT(r == WAIT_OBJECT_0); + + /* Process work items in batches so that a single stream can't + starve the others by continuously adding new work to the top of + the work item stack. */ + item = InterlockedFlushSList(ctx->work); + while (item != NULL) { + PSLIST_ENTRY tmp = item; + winmm_refill_stream(((struct cubeb_stream_item *)tmp)->stream); + item = item->Next; + _aligned_free(tmp); + } + + if (ctx->shutdown) { + break; + } + } + + return 0; +} + +static void CALLBACK +winmm_buffer_callback(HWAVEOUT waveout, UINT msg, DWORD_PTR user_ptr, + DWORD_PTR p1, DWORD_PTR p2) +{ + cubeb_stream * stm = (cubeb_stream *)user_ptr; + struct cubeb_stream_item * item; + + if (msg != WOM_DONE) { + return; + } + + item = _aligned_malloc(sizeof(struct cubeb_stream_item), + MEMORY_ALLOCATION_ALIGNMENT); + XASSERT(item); + item->stream = stm; + InterlockedPushEntrySList(stm->context->work, &item->head); + + SetEvent(stm->context->event); +} + +static unsigned int +calculate_minimum_latency(void) +{ + OSVERSIONINFOEX osvi; + DWORDLONG mask; + + /* Running under Terminal Services results in underruns with low latency. */ + if (GetSystemMetrics(SM_REMOTESESSION) == TRUE) { + return 500; + } + + /* Vista's WinMM implementation underruns when less than 200ms of audio is + * buffered. */ + memset(&osvi, 0, sizeof(OSVERSIONINFOEX)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + osvi.dwMajorVersion = 6; + osvi.dwMinorVersion = 0; + + mask = 0; + VER_SET_CONDITION(mask, VER_MAJORVERSION, VER_EQUAL); + VER_SET_CONDITION(mask, VER_MINORVERSION, VER_EQUAL); + + if (VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, mask) != + 0) { + return 200; + } + + return 100; +} + +static void +winmm_destroy(cubeb * ctx); + +/*static*/ int +winmm_init(cubeb ** context, char const * context_name) +{ + cubeb * ctx; + + XASSERT(context); + *context = NULL; + + /* Don't initialize a context if there are no devices available. */ + if (waveOutGetNumDevs() == 0) { + return CUBEB_ERROR; + } + + ctx = calloc(1, sizeof(*ctx)); + XASSERT(ctx); + + ctx->ops = &winmm_ops; + + ctx->work = _aligned_malloc(sizeof(*ctx->work), MEMORY_ALLOCATION_ALIGNMENT); + XASSERT(ctx->work); + InitializeSListHead(ctx->work); + + ctx->event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!ctx->event) { + winmm_destroy(ctx); + return CUBEB_ERROR; + } + + ctx->thread = + (HANDLE)_beginthreadex(NULL, 256 * 1024, winmm_buffer_thread, ctx, + STACK_SIZE_PARAM_IS_A_RESERVATION, NULL); + if (!ctx->thread) { + winmm_destroy(ctx); + return CUBEB_ERROR; + } + + SetThreadPriority(ctx->thread, THREAD_PRIORITY_TIME_CRITICAL); + + InitializeCriticalSection(&ctx->lock); + ctx->active_streams = 0; + + ctx->minimum_latency_ms = calculate_minimum_latency(); + + *context = ctx; + + return CUBEB_OK; +} + +static char const * +winmm_get_backend_id(cubeb * ctx) +{ + return "winmm"; +} + +static void +winmm_destroy(cubeb * ctx) +{ + DWORD r; + + XASSERT(ctx->active_streams == 0); + XASSERT(!InterlockedPopEntrySList(ctx->work)); + + DeleteCriticalSection(&ctx->lock); + + if (ctx->thread) { + ctx->shutdown = 1; + SetEvent(ctx->event); + r = WaitForSingleObject(ctx->thread, INFINITE); + XASSERT(r == WAIT_OBJECT_0); + CloseHandle(ctx->thread); + } + + if (ctx->event) { + CloseHandle(ctx->event); + } + + _aligned_free(ctx->work); + + free(ctx); +} + +static void +winmm_stream_destroy(cubeb_stream * stm); + +static int +winmm_stream_init(cubeb * context, cubeb_stream ** stream, + char const * stream_name, cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency_frames, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + MMRESULT r; + WAVEFORMATEXTENSIBLE wfx; + cubeb_stream * stm; + int i; + size_t bufsz; + + XASSERT(context); + XASSERT(stream); + XASSERT(output_stream_params); + + if (input_stream_params) { + /* Capture support not yet implemented. */ + return CUBEB_ERROR_NOT_SUPPORTED; + } + + if (input_device || output_device) { + /* Device selection not yet implemented. */ + return CUBEB_ERROR_DEVICE_UNAVAILABLE; + } + + if (output_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) { + /* Loopback is not supported */ + return CUBEB_ERROR_NOT_SUPPORTED; + } + + *stream = NULL; + + memset(&wfx, 0, sizeof(wfx)); + if (output_stream_params->channels > 2) { + wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + wfx.Format.cbSize = sizeof(wfx) - sizeof(wfx.Format); + } else { + wfx.Format.wFormatTag = WAVE_FORMAT_PCM; + if (output_stream_params->format == CUBEB_SAMPLE_FLOAT32LE) { + wfx.Format.wFormatTag = WAVE_FORMAT_IEEE_FLOAT; + } + wfx.Format.cbSize = 0; + } + wfx.Format.nChannels = output_stream_params->channels; + wfx.Format.nSamplesPerSec = output_stream_params->rate; + + /* XXX fix channel mappings */ + wfx.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; + + switch (output_stream_params->format) { + case CUBEB_SAMPLE_S16LE: + wfx.Format.wBitsPerSample = 16; + wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + break; + case CUBEB_SAMPLE_FLOAT32LE: + wfx.Format.wBitsPerSample = 32; + wfx.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + break; + default: + return CUBEB_ERROR_INVALID_FORMAT; + } + + wfx.Format.nBlockAlign = + (wfx.Format.wBitsPerSample * wfx.Format.nChannels) / 8; + wfx.Format.nAvgBytesPerSec = + wfx.Format.nSamplesPerSec * wfx.Format.nBlockAlign; + wfx.Samples.wValidBitsPerSample = wfx.Format.wBitsPerSample; + + EnterCriticalSection(&context->lock); + /* CUBEB_STREAM_MAX is a horrible hack to avoid a situation where, when + many streams are active at once, a subset of them will not consume (via + playback) or release (via waveOutReset) their buffers. */ + if (context->active_streams >= CUBEB_STREAM_MAX) { + LeaveCriticalSection(&context->lock); + return CUBEB_ERROR; + } + context->active_streams += 1; + LeaveCriticalSection(&context->lock); + + stm = calloc(1, sizeof(*stm)); + XASSERT(stm); + + stm->context = context; + + stm->params = *output_stream_params; + + stm->data_callback = data_callback; + stm->state_callback = state_callback; + stm->user_ptr = user_ptr; + stm->written = 0; + + uint32_t latency_ms = latency_frames * 1000 / output_stream_params->rate; + + if (latency_ms < context->minimum_latency_ms) { + latency_ms = context->minimum_latency_ms; + } + + bufsz = (size_t)(stm->params.rate / 1000.0 * latency_ms * + bytes_per_frame(stm->params) / NBUFS); + if (bufsz % bytes_per_frame(stm->params) != 0) { + bufsz += + bytes_per_frame(stm->params) - (bufsz % bytes_per_frame(stm->params)); + } + XASSERT(bufsz % bytes_per_frame(stm->params) == 0); + + stm->buffer_size = bufsz; + + InitializeCriticalSection(&stm->lock); + + stm->event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!stm->event) { + winmm_stream_destroy(stm); + return CUBEB_ERROR; + } + + stm->soft_volume = -1.0; + + /* winmm_buffer_callback will be called during waveOutOpen, so all + other initialization must be complete before calling it. */ + r = waveOutOpen(&stm->waveout, WAVE_MAPPER, &wfx.Format, + (DWORD_PTR)winmm_buffer_callback, (DWORD_PTR)stm, + CALLBACK_FUNCTION); + if (r != MMSYSERR_NOERROR) { + winmm_stream_destroy(stm); + return CUBEB_ERROR; + } + + r = waveOutPause(stm->waveout); + if (r != MMSYSERR_NOERROR) { + winmm_stream_destroy(stm); + return CUBEB_ERROR; + } + + for (i = 0; i < NBUFS; ++i) { + WAVEHDR * hdr = &stm->buffers[i]; + + hdr->lpData = calloc(1, bufsz); + XASSERT(hdr->lpData); + hdr->dwBufferLength = bufsz; + hdr->dwFlags = 0; + + r = waveOutPrepareHeader(stm->waveout, hdr, sizeof(*hdr)); + if (r != MMSYSERR_NOERROR) { + winmm_stream_destroy(stm); + return CUBEB_ERROR; + } + + winmm_refill_stream(stm); + } + + stm->frame_size = bytes_per_frame(stm->params); + stm->prev_pos_lo_dword = 0; + stm->pos_hi_dword = 0; + + *stream = stm; + + return CUBEB_OK; +} + +static void +winmm_stream_destroy(cubeb_stream * stm) +{ + int i; + + if (stm->waveout) { + MMTIME time; + MMRESULT r; + int device_valid; + int enqueued; + + EnterCriticalSection(&stm->lock); + stm->shutdown = 1; + + waveOutReset(stm->waveout); + + /* Don't need this value, we just want the result to detect invalid + handle/no device errors than waveOutReset doesn't seem to report. */ + time.wType = TIME_SAMPLES; + r = waveOutGetPosition(stm->waveout, &time, sizeof(time)); + device_valid = !(r == MMSYSERR_INVALHANDLE || r == MMSYSERR_NODRIVER); + + enqueued = NBUFS - stm->free_buffers; + LeaveCriticalSection(&stm->lock); + + /* Wait for all blocks to complete. */ + while (device_valid && enqueued > 0) { + DWORD rv = WaitForSingleObject(stm->event, INFINITE); + XASSERT(rv == WAIT_OBJECT_0); + + EnterCriticalSection(&stm->lock); + enqueued = NBUFS - stm->free_buffers; + LeaveCriticalSection(&stm->lock); + } + + EnterCriticalSection(&stm->lock); + + for (i = 0; i < NBUFS; ++i) { + if (stm->buffers[i].dwFlags & WHDR_PREPARED) { + waveOutUnprepareHeader(stm->waveout, &stm->buffers[i], + sizeof(stm->buffers[i])); + } + } + + waveOutClose(stm->waveout); + + LeaveCriticalSection(&stm->lock); + } + + if (stm->event) { + CloseHandle(stm->event); + } + + DeleteCriticalSection(&stm->lock); + + for (i = 0; i < NBUFS; ++i) { + free(stm->buffers[i].lpData); + } + + EnterCriticalSection(&stm->context->lock); + XASSERT(stm->context->active_streams >= 1); + stm->context->active_streams -= 1; + LeaveCriticalSection(&stm->context->lock); + + free(stm); +} + +static int +winmm_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + XASSERT(ctx && max_channels); + + /* We don't support more than two channels in this backend. */ + *max_channels = 2; + + return CUBEB_OK; +} + +static int +winmm_get_min_latency(cubeb * ctx, cubeb_stream_params params, + uint32_t * latency) +{ + // 100ms minimum, if we are not in a bizarre configuration. + *latency = ctx->minimum_latency_ms * params.rate / 1000; + + return CUBEB_OK; +} + +static int +winmm_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) +{ + WAVEOUTCAPS woc; + MMRESULT r; + + r = waveOutGetDevCaps(WAVE_MAPPER, &woc, sizeof(WAVEOUTCAPS)); + if (r != MMSYSERR_NOERROR) { + return CUBEB_ERROR; + } + + /* Check if we support 48kHz, but not 44.1kHz. */ + if (!(woc.dwFormats & WAVE_FORMAT_4S16) && + woc.dwFormats & WAVE_FORMAT_48S16) { + *rate = 48000; + return CUBEB_OK; + } + /* Prefer 44.1kHz between 44.1kHz and 48kHz. */ + *rate = 44100; + + return CUBEB_OK; +} + +static int +winmm_stream_start(cubeb_stream * stm) +{ + MMRESULT r; + + EnterCriticalSection(&stm->lock); + r = waveOutRestart(stm->waveout); + LeaveCriticalSection(&stm->lock); + + if (r != MMSYSERR_NOERROR) { + return CUBEB_ERROR; + } + + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STARTED); + + return CUBEB_OK; +} + +static int +winmm_stream_stop(cubeb_stream * stm) +{ + MMRESULT r; + + EnterCriticalSection(&stm->lock); + r = waveOutPause(stm->waveout); + LeaveCriticalSection(&stm->lock); + + if (r != MMSYSERR_NOERROR) { + return CUBEB_ERROR; + } + + stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_STOPPED); + + return CUBEB_OK; +} + +/* +Microsoft wave audio docs say "samples are the preferred time format in which +to represent the current position", but relying on this causes problems on +Windows XP, the only OS cubeb_winmm is used on. + +While the wdmaud.sys driver internally tracks a 64-bit position and ensures no +backward movement, the WinMM API limits the position returned from +waveOutGetPosition() to a 32-bit DWORD (this applies equally to XP x64). The +higher 32 bits are chopped off, and to an API consumer the position can appear +to move backward. + +In theory, even a 32-bit TIME_SAMPLES position should provide plenty of +playback time for typical use cases before this pseudo wrap-around, e.g: + (2^32 - 1)/48000 = ~24:51:18 for 48.0 kHz stereo; + (2^32 - 1)/44100 = ~27:03:12 for 44.1 kHz stereo. +In reality, wdmaud.sys doesn't provide a TIME_SAMPLES position at all, only a +32-bit TIME_BYTES position, from which wdmaud.drv derives TIME_SAMPLES: + SamplePos = (BytePos * 8) / BitsPerFrame, + where BitsPerFrame = Channels * BitsPerSample, +Per dom\media\AudioSampleFormat.h, desktop builds always use 32-bit FLOAT32 +samples, so the maximum for TIME_SAMPLES should be: + (2^29 - 1)/48000 = ~03:06:25; + (2^29 - 1)/44100 = ~03:22:54. +This might still be OK for typical browser usage, but there's also a bug in the +formula above: BytePos * 8 (BytePos << 3) is done on a 32-bit BytePos, without +first casting it to 64 bits, so the highest 3 bits, if set, would get shifted +out, and the maximum possible TIME_SAMPLES drops unacceptably low: + (2^26 - 1)/48000 = ~00:23:18; + (2^26 - 1)/44100 = ~00:25:22. + +To work around these limitations, we just get the position in TIME_BYTES, +recover the 64-bit value, and do our own conversion to samples. +*/ + +/* Convert chopped 32-bit waveOutGetPosition() into 64-bit true position. */ +static uint64_t +update_64bit_position(cubeb_stream * stm, DWORD pos_lo_dword) +{ + /* Caller should be holding stm->lock. */ + if (pos_lo_dword < stm->prev_pos_lo_dword) { + stm->pos_hi_dword++; + LOG("waveOutGetPosition() has wrapped around: %#lx -> %#lx", + stm->prev_pos_lo_dword, pos_lo_dword); + LOG("Wrap-around count = %#lx", stm->pos_hi_dword); + LOG("Current 64-bit position = %#llx", + (((uint64_t)stm->pos_hi_dword) << 32) | ((uint64_t)pos_lo_dword)); + } + stm->prev_pos_lo_dword = pos_lo_dword; + + return (((uint64_t)stm->pos_hi_dword) << 32) | ((uint64_t)pos_lo_dword); +} + +static int +winmm_stream_get_position(cubeb_stream * stm, uint64_t * position) +{ + MMRESULT r; + MMTIME time; + + EnterCriticalSection(&stm->lock); + /* See the long comment above for why not just use TIME_SAMPLES here. */ + time.wType = TIME_BYTES; + r = waveOutGetPosition(stm->waveout, &time, sizeof(time)); + + if (r != MMSYSERR_NOERROR || time.wType != TIME_BYTES) { + LeaveCriticalSection(&stm->lock); + return CUBEB_ERROR; + } + + *position = update_64bit_position(stm, time.u.cb) / stm->frame_size; + LeaveCriticalSection(&stm->lock); + + return CUBEB_OK; +} + +static int +winmm_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +{ + MMRESULT r; + MMTIME time; + uint64_t written, position; + + EnterCriticalSection(&stm->lock); + /* See the long comment above for why not just use TIME_SAMPLES here. */ + time.wType = TIME_BYTES; + r = waveOutGetPosition(stm->waveout, &time, sizeof(time)); + + if (r != MMSYSERR_NOERROR || time.wType != TIME_BYTES) { + LeaveCriticalSection(&stm->lock); + return CUBEB_ERROR; + } + + position = update_64bit_position(stm, time.u.cb); + written = stm->written; + LeaveCriticalSection(&stm->lock); + + XASSERT((written - (position / stm->frame_size)) <= UINT32_MAX); + *latency = (uint32_t)(written - (position / stm->frame_size)); + + return CUBEB_OK; +} + +static int +winmm_stream_set_volume(cubeb_stream * stm, float volume) +{ + EnterCriticalSection(&stm->lock); + stm->soft_volume = volume; + LeaveCriticalSection(&stm->lock); + return CUBEB_OK; +} + +#define MM_11025HZ_MASK \ + (WAVE_FORMAT_1M08 | WAVE_FORMAT_1M16 | WAVE_FORMAT_1S08 | WAVE_FORMAT_1S16) +#define MM_22050HZ_MASK \ + (WAVE_FORMAT_2M08 | WAVE_FORMAT_2M16 | WAVE_FORMAT_2S08 | WAVE_FORMAT_2S16) +#define MM_44100HZ_MASK \ + (WAVE_FORMAT_4M08 | WAVE_FORMAT_4M16 | WAVE_FORMAT_4S08 | WAVE_FORMAT_4S16) +#define MM_48000HZ_MASK \ + (WAVE_FORMAT_48M08 | WAVE_FORMAT_48M16 | WAVE_FORMAT_48S08 | \ + WAVE_FORMAT_48S16) +#define MM_96000HZ_MASK \ + (WAVE_FORMAT_96M08 | WAVE_FORMAT_96M16 | WAVE_FORMAT_96S08 | \ + WAVE_FORMAT_96S16) +static void +winmm_calculate_device_rate(cubeb_device_info * info, DWORD formats) +{ + if (formats & MM_11025HZ_MASK) { + info->min_rate = 11025; + info->default_rate = 11025; + info->max_rate = 11025; + } + if (formats & MM_22050HZ_MASK) { + if (info->min_rate == 0) + info->min_rate = 22050; + info->max_rate = 22050; + info->default_rate = 22050; + } + if (formats & MM_44100HZ_MASK) { + if (info->min_rate == 0) + info->min_rate = 44100; + info->max_rate = 44100; + info->default_rate = 44100; + } + if (formats & MM_48000HZ_MASK) { + if (info->min_rate == 0) + info->min_rate = 48000; + info->max_rate = 48000; + info->default_rate = 48000; + } + if (formats & MM_96000HZ_MASK) { + if (info->min_rate == 0) { + info->min_rate = 96000; + info->default_rate = 96000; + } + info->max_rate = 96000; + } +} + +#define MM_S16_MASK \ + (WAVE_FORMAT_1M16 | WAVE_FORMAT_1S16 | WAVE_FORMAT_2M16 | WAVE_FORMAT_2S16 | \ + WAVE_FORMAT_4M16 | WAVE_FORMAT_4S16 | WAVE_FORMAT_48M16 | \ + WAVE_FORMAT_48S16 | WAVE_FORMAT_96M16 | WAVE_FORMAT_96S16) +static int +winmm_query_supported_formats(UINT devid, DWORD formats, + cubeb_device_fmt * supfmt, + cubeb_device_fmt * deffmt) +{ + WAVEFORMATEXTENSIBLE wfx; + + if (formats & MM_S16_MASK) + *deffmt = *supfmt = CUBEB_DEVICE_FMT_S16LE; + else + *deffmt = *supfmt = 0; + + ZeroMemory(&wfx, sizeof(WAVEFORMATEXTENSIBLE)); + wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + wfx.Format.nChannels = 2; + wfx.Format.nSamplesPerSec = 44100; + wfx.Format.wBitsPerSample = 32; + wfx.Format.nBlockAlign = + (wfx.Format.wBitsPerSample * wfx.Format.nChannels) / 8; + wfx.Format.nAvgBytesPerSec = + wfx.Format.nSamplesPerSec * wfx.Format.nBlockAlign; + wfx.Format.cbSize = 22; + wfx.Samples.wValidBitsPerSample = wfx.Format.wBitsPerSample; + wfx.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; + wfx.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + if (waveOutOpen(NULL, devid, &wfx.Format, 0, 0, WAVE_FORMAT_QUERY) == + MMSYSERR_NOERROR) + *supfmt = (cubeb_device_fmt)(*supfmt | CUBEB_DEVICE_FMT_F32LE); + + return (*deffmt != 0) ? CUBEB_OK : CUBEB_ERROR; +} + +static char * +guid_to_cstr(LPGUID guid) +{ + char * ret = malloc(40); + if (!ret) { + return NULL; + } + _snprintf_s(ret, 40, _TRUNCATE, + "{%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 ret; +} + +static cubeb_device_pref +winmm_query_preferred_out_device(UINT devid) +{ + DWORD mmpref = WAVE_MAPPER, compref = WAVE_MAPPER, status; + cubeb_device_pref ret = CUBEB_DEVICE_PREF_NONE; + + if (waveOutMessage((HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, + (DWORD_PTR)&mmpref, + (DWORD_PTR)&status) == MMSYSERR_NOERROR && + devid == mmpref) + ret |= CUBEB_DEVICE_PREF_MULTIMEDIA | CUBEB_DEVICE_PREF_NOTIFICATION; + + if (waveOutMessage((HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, + (DWORD_PTR)&compref, + (DWORD_PTR)&status) == MMSYSERR_NOERROR && + devid == compref) + ret |= CUBEB_DEVICE_PREF_VOICE; + + return ret; +} + +static char * +device_id_idx(UINT devid) +{ + char * ret = malloc(16); + if (!ret) { + return NULL; + } + _snprintf_s(ret, 16, _TRUNCATE, "%u", devid); + return ret; +} + +static void +winmm_create_device_from_outcaps2(cubeb_device_info * ret, LPWAVEOUTCAPS2A caps, + UINT devid) +{ + XASSERT(ret); + ret->devid = (cubeb_devid)devid; + ret->device_id = device_id_idx(devid); + ret->friendly_name = _strdup(caps->szPname); + ret->group_id = guid_to_cstr(&caps->ProductGuid); + ret->vendor_name = guid_to_cstr(&caps->ManufacturerGuid); + + ret->type = CUBEB_DEVICE_TYPE_OUTPUT; + ret->state = CUBEB_DEVICE_STATE_ENABLED; + ret->preferred = winmm_query_preferred_out_device(devid); + + ret->max_channels = caps->wChannels; + winmm_calculate_device_rate(ret, caps->dwFormats); + winmm_query_supported_formats(devid, caps->dwFormats, &ret->format, + &ret->default_format); + + /* Hardcoded latency estimates... */ + ret->latency_lo = 100 * ret->default_rate / 1000; + ret->latency_hi = 200 * ret->default_rate / 1000; +} + +static void +winmm_create_device_from_outcaps(cubeb_device_info * ret, LPWAVEOUTCAPSA caps, + UINT devid) +{ + XASSERT(ret); + ret->devid = (cubeb_devid)devid; + ret->device_id = device_id_idx(devid); + ret->friendly_name = _strdup(caps->szPname); + ret->group_id = NULL; + ret->vendor_name = NULL; + + ret->type = CUBEB_DEVICE_TYPE_OUTPUT; + ret->state = CUBEB_DEVICE_STATE_ENABLED; + ret->preferred = winmm_query_preferred_out_device(devid); + + ret->max_channels = caps->wChannels; + winmm_calculate_device_rate(ret, caps->dwFormats); + winmm_query_supported_formats(devid, caps->dwFormats, &ret->format, + &ret->default_format); + + /* Hardcoded latency estimates... */ + ret->latency_lo = 100 * ret->default_rate / 1000; + ret->latency_hi = 200 * ret->default_rate / 1000; +} + +static cubeb_device_pref +winmm_query_preferred_in_device(UINT devid) +{ + DWORD mmpref = WAVE_MAPPER, compref = WAVE_MAPPER, status; + cubeb_device_pref ret = CUBEB_DEVICE_PREF_NONE; + + if (waveInMessage((HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, + (DWORD_PTR)&mmpref, + (DWORD_PTR)&status) == MMSYSERR_NOERROR && + devid == mmpref) + ret |= CUBEB_DEVICE_PREF_MULTIMEDIA | CUBEB_DEVICE_PREF_NOTIFICATION; + + if (waveInMessage((HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, + (DWORD_PTR)&compref, + (DWORD_PTR)&status) == MMSYSERR_NOERROR && + devid == compref) + ret |= CUBEB_DEVICE_PREF_VOICE; + + return ret; +} + +static void +winmm_create_device_from_incaps2(cubeb_device_info * ret, LPWAVEINCAPS2A caps, + UINT devid) +{ + XASSERT(ret); + ret->devid = (cubeb_devid)devid; + ret->device_id = device_id_idx(devid); + ret->friendly_name = _strdup(caps->szPname); + ret->group_id = guid_to_cstr(&caps->ProductGuid); + ret->vendor_name = guid_to_cstr(&caps->ManufacturerGuid); + + ret->type = CUBEB_DEVICE_TYPE_INPUT; + ret->state = CUBEB_DEVICE_STATE_ENABLED; + ret->preferred = winmm_query_preferred_in_device(devid); + + ret->max_channels = caps->wChannels; + winmm_calculate_device_rate(ret, caps->dwFormats); + winmm_query_supported_formats(devid, caps->dwFormats, &ret->format, + &ret->default_format); + + /* Hardcoded latency estimates... */ + ret->latency_lo = 100 * ret->default_rate / 1000; + ret->latency_hi = 200 * ret->default_rate / 1000; +} + +static void +winmm_create_device_from_incaps(cubeb_device_info * ret, LPWAVEINCAPSA caps, + UINT devid) +{ + XASSERT(ret); + ret->devid = (cubeb_devid)devid; + ret->device_id = device_id_idx(devid); + ret->friendly_name = _strdup(caps->szPname); + ret->group_id = NULL; + ret->vendor_name = NULL; + + ret->type = CUBEB_DEVICE_TYPE_INPUT; + ret->state = CUBEB_DEVICE_STATE_ENABLED; + ret->preferred = winmm_query_preferred_in_device(devid); + + ret->max_channels = caps->wChannels; + winmm_calculate_device_rate(ret, caps->dwFormats); + winmm_query_supported_formats(devid, caps->dwFormats, &ret->format, + &ret->default_format); + + /* Hardcoded latency estimates... */ + ret->latency_lo = 100 * ret->default_rate / 1000; + ret->latency_hi = 200 * ret->default_rate / 1000; +} + +static int +winmm_enumerate_devices(cubeb * context, cubeb_device_type type, + cubeb_device_collection * collection) +{ + UINT i, incount, outcount, total; + cubeb_device_info * devices; + cubeb_device_info * dev; + + outcount = waveOutGetNumDevs(); + incount = waveInGetNumDevs(); + total = outcount + incount; + + devices = calloc(total, sizeof(cubeb_device_info)); + collection->count = 0; + + if (type & CUBEB_DEVICE_TYPE_OUTPUT) { + WAVEOUTCAPSA woc; + WAVEOUTCAPS2A woc2; + + ZeroMemory(&woc, sizeof(woc)); + ZeroMemory(&woc2, sizeof(woc2)); + + for (i = 0; i < outcount; i++) { + dev = &devices[collection->count]; + if (waveOutGetDevCapsA(i, (LPWAVEOUTCAPSA)&woc2, sizeof(woc2)) == + MMSYSERR_NOERROR) { + winmm_create_device_from_outcaps2(dev, &woc2, i); + collection->count += 1; + } else if (waveOutGetDevCapsA(i, &woc, sizeof(woc)) == MMSYSERR_NOERROR) { + winmm_create_device_from_outcaps(dev, &woc, i); + collection->count += 1; + } + } + } + + if (type & CUBEB_DEVICE_TYPE_INPUT) { + WAVEINCAPSA wic; + WAVEINCAPS2A wic2; + + ZeroMemory(&wic, sizeof(wic)); + ZeroMemory(&wic2, sizeof(wic2)); + + for (i = 0; i < incount; i++) { + dev = &devices[collection->count]; + if (waveInGetDevCapsA(i, (LPWAVEINCAPSA)&wic2, sizeof(wic2)) == + MMSYSERR_NOERROR) { + winmm_create_device_from_incaps2(dev, &wic2, i); + collection->count += 1; + } else if (waveInGetDevCapsA(i, &wic, sizeof(wic)) == MMSYSERR_NOERROR) { + winmm_create_device_from_incaps(dev, &wic, i); + collection->count += 1; + } + } + } + + collection->device = devices; + + return CUBEB_OK; +} + +static int +winmm_device_collection_destroy(cubeb * ctx, + cubeb_device_collection * collection) +{ + uint32_t i; + XASSERT(collection); + + (void)ctx; + + for (i = 0; i < collection->count; i++) { + free((void *)collection->device[i].device_id); + free((void *)collection->device[i].friendly_name); + free((void *)collection->device[i].group_id); + free((void *)collection->device[i].vendor_name); + } + + free(collection->device); + return CUBEB_OK; +} + +static struct cubeb_ops const winmm_ops = { + /*.init =*/winmm_init, + /*.get_backend_id =*/winmm_get_backend_id, + /*.get_max_channel_count=*/winmm_get_max_channel_count, + /*.get_min_latency=*/winmm_get_min_latency, + /*.get_preferred_sample_rate =*/winmm_get_preferred_sample_rate, + /*.enumerate_devices =*/winmm_enumerate_devices, + /*.device_collection_destroy =*/winmm_device_collection_destroy, + /*.destroy =*/winmm_destroy, + /*.stream_init =*/winmm_stream_init, + /*.stream_destroy =*/winmm_stream_destroy, + /*.stream_start =*/winmm_stream_start, + /*.stream_stop =*/winmm_stream_stop, + /*.stream_get_position =*/winmm_stream_get_position, + /*.stream_get_latency = */ winmm_stream_get_latency, + /*.stream_get_input_latency = */ NULL, + /*.stream_set_volume =*/winmm_stream_set_volume, + /*.stream_set_name =*/NULL, + /*.stream_get_current_device =*/NULL, + /*.stream_device_destroy =*/NULL, + /*.stream_register_device_changed_callback=*/NULL, + /*.register_device_collection_changed =*/NULL}; diff --git a/3rdparty/cubeb/subprojects/speex/arch.h b/3rdparty/cubeb/subprojects/speex/arch.h new file mode 100644 index 0000000000..73a45a069f --- /dev/null +++ b/3rdparty/cubeb/subprojects/speex/arch.h @@ -0,0 +1,235 @@ +/* Copyright (C) 2003 Jean-Marc Valin */ +/** + @file arch.h + @brief Various architecture definitions Speex +*/ +/* + 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION 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 ARCH_H +#define ARCH_H + +/* A couple test to catch stupid option combinations */ +#ifdef FIXED_POINT + +#ifdef FLOATING_POINT +#error You cannot compile as floating point and fixed point at the same time +#endif +#ifdef _USE_SSE +#error SSE is only for floating-point +#endif +#if ((defined (ARM4_ASM)||defined (ARM4_ASM)) && defined(BFIN_ASM)) || (defined (ARM4_ASM)&&defined(ARM5E_ASM)) +#error Make up your mind. What CPU do you have? +#endif +#ifdef VORBIS_PSYCHO +#error Vorbis-psy model currently not implemented in fixed-point +#endif + +#else + +#ifndef FLOATING_POINT +#error You now need to define either FIXED_POINT or FLOATING_POINT +#endif +#if defined (ARM4_ASM) || defined(ARM5E_ASM) || defined(BFIN_ASM) +#error I suppose you can have a [ARM4/ARM5E/Blackfin] that has float instructions? +#endif +#ifdef FIXED_POINT_DEBUG +#error "Don't you think enabling fixed-point is a good thing to do if you want to debug that?" +#endif + + +#endif + +#ifndef OUTSIDE_SPEEX +#include "speex/speexdsp_types.h" +#endif + +#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ +#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ +#define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */ +#define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ +#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ +#define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */ +#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ + +#ifdef FIXED_POINT + +typedef spx_int16_t spx_word16_t; +typedef spx_int32_t spx_word32_t; +typedef spx_word32_t spx_mem_t; +typedef spx_word16_t spx_coef_t; +typedef spx_word16_t spx_lsp_t; +typedef spx_word32_t spx_sig_t; + +#define Q15ONE 32767 + +#define LPC_SCALING 8192 +#define SIG_SCALING 16384 +#define LSP_SCALING 8192. +#define GAMMA_SCALING 32768. +#define GAIN_SCALING 64 +#define GAIN_SCALING_1 0.015625 + +#define LPC_SHIFT 13 +#define LSP_SHIFT 13 +#define SIG_SHIFT 14 +#define GAIN_SHIFT 6 + +#define WORD2INT(x) ((x) < -32767 ? -32768 : ((x) > 32766 ? 32767 : (x))) + +#define VERY_SMALL 0 +#define VERY_LARGE32 ((spx_word32_t)2147483647) +#define VERY_LARGE16 ((spx_word16_t)32767) +#define Q15_ONE ((spx_word16_t)32767) + + +#ifdef FIXED_DEBUG +#include "fixed_debug.h" +#else + +#include "fixed_generic.h" + +#ifdef ARM5E_ASM +#include "fixed_arm5e.h" +#elif defined (ARM4_ASM) +#include "fixed_arm4.h" +#elif defined (BFIN_ASM) +#include "fixed_bfin.h" +#endif + +#endif + + +#else + +typedef float spx_mem_t; +typedef float spx_coef_t; +typedef float spx_lsp_t; +typedef float spx_sig_t; +typedef float spx_word16_t; +typedef float spx_word32_t; + +#define Q15ONE 1.0f +#define LPC_SCALING 1.f +#define SIG_SCALING 1.f +#define LSP_SCALING 1.f +#define GAMMA_SCALING 1.f +#define GAIN_SCALING 1.f +#define GAIN_SCALING_1 1.f + + +#define VERY_SMALL 1e-15f +#define VERY_LARGE32 1e15f +#define VERY_LARGE16 1e15f +#define Q15_ONE ((spx_word16_t)1.f) + +#define QCONST16(x,bits) (x) +#define QCONST32(x,bits) (x) + +#define NEG16(x) (-(x)) +#define NEG32(x) (-(x)) +#define EXTRACT16(x) (x) +#define EXTEND32(x) (x) +#define SHR16(a,shift) (a) +#define SHL16(a,shift) (a) +#define SHR32(a,shift) (a) +#define SHL32(a,shift) (a) +#define PSHR16(a,shift) (a) +#define PSHR32(a,shift) (a) +#define VSHR32(a,shift) (a) +#define SATURATE16(x,a) (x) +#define SATURATE32(x,a) (x) +#define SATURATE32PSHR(x,shift,a) (x) + +#define PSHR(a,shift) (a) +#define SHR(a,shift) (a) +#define SHL(a,shift) (a) +#define SATURATE(x,a) (x) + +#define ADD16(a,b) ((a)+(b)) +#define SUB16(a,b) ((a)-(b)) +#define ADD32(a,b) ((a)+(b)) +#define SUB32(a,b) ((a)-(b)) +#define MULT16_16_16(a,b) ((a)*(b)) +#define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b)) +#define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b)) + +#define MULT16_32_Q11(a,b) ((a)*(b)) +#define MULT16_32_Q13(a,b) ((a)*(b)) +#define MULT16_32_Q14(a,b) ((a)*(b)) +#define MULT16_32_Q15(a,b) ((a)*(b)) +#define MULT16_32_P15(a,b) ((a)*(b)) + +#define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) +#define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) + +#define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) +#define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) +#define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) +#define MULT16_16_Q11_32(a,b) ((a)*(b)) +#define MULT16_16_Q13(a,b) ((a)*(b)) +#define MULT16_16_Q14(a,b) ((a)*(b)) +#define MULT16_16_Q15(a,b) ((a)*(b)) +#define MULT16_16_P15(a,b) ((a)*(b)) +#define MULT16_16_P13(a,b) ((a)*(b)) +#define MULT16_16_P14(a,b) ((a)*(b)) + +#define DIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) +#define PDIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) +#define DIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) +#define PDIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) + +#define WORD2INT(x) ((x) < -32767.5f ? -32768 : \ + ((x) > 32766.5f ? 32767 : (spx_int16_t)floor(.5 + (x)))) +#endif + + +#if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) + +/* 2 on TI C5x DSP */ +#define BYTES_PER_CHAR 2 +#define BITS_PER_CHAR 16 +#define LOG2_BITS_PER_CHAR 4 + +#else + +#define BYTES_PER_CHAR 1 +#define BITS_PER_CHAR 8 +#define LOG2_BITS_PER_CHAR 3 + +#endif + + + +#ifdef FIXED_DEBUG +extern long long spx_mips; +#endif + + +#endif diff --git a/3rdparty/cubeb/subprojects/speex/fixed_generic.h b/3rdparty/cubeb/subprojects/speex/fixed_generic.h new file mode 100644 index 0000000000..12d27aac55 --- /dev/null +++ b/3rdparty/cubeb/subprojects/speex/fixed_generic.h @@ -0,0 +1,110 @@ +/* Copyright (C) 2003 Jean-Marc Valin */ +/** + @file fixed_generic.h + @brief Generic fixed-point operations +*/ +/* + 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION 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 FIXED_GENERIC_H +#define FIXED_GENERIC_H + +#define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) +#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) + +#define NEG16(x) (-(x)) +#define NEG32(x) (-(x)) +#define EXTRACT16(x) ((spx_word16_t)(x)) +#define EXTEND32(x) ((spx_word32_t)(x)) +#define SHR16(a,shift) ((a) >> (shift)) +#define SHL16(a,shift) ((a) << (shift)) +#define SHR32(a,shift) ((a) >> (shift)) +#define SHL32(a,shift) ((a) << (shift)) +#define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift)) +#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) +#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) +#define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) +#define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) + +#define SATURATE32PSHR(x,shift,a) (((x)>=(SHL32(a,shift))) ? (a) : \ + (x)<=-(SHL32(a,shift)) ? -(a) : \ + (PSHR32(x, shift))) + +#define SHR(a,shift) ((a) >> (shift)) +#define SHL(a,shift) ((spx_word32_t)(a) << (shift)) +#define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) +#define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) + + +#define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b))) +#define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b)) +#define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b)) +#define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b)) + + +/* result fits in 16 bits */ +#define MULT16_16_16(a,b) ((((spx_word16_t)(a))*((spx_word16_t)(b)))) + +/* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */ +#define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b))) + +#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) +#define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) +#define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) +#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14)) + +#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)) +#define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))) + +#define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) +#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)) +#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) + + +#define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) +#define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) +#define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13))) + +#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) +#define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) +#define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) +#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) + +#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) +#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) +#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) + +#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15)) + +#define DIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b)))) +#define PDIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word16_t)(b)))) +#define DIV32(a,b) (((spx_word32_t)(a))/((spx_word32_t)(b))) +#define PDIV32(a,b) (((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word32_t)(b))) + +#endif diff --git a/3rdparty/cubeb/subprojects/speex/resample.c b/3rdparty/cubeb/subprojects/speex/resample.c new file mode 100644 index 0000000000..10cb06593d --- /dev/null +++ b/3rdparty/cubeb/subprojects/speex/resample.c @@ -0,0 +1,1240 @@ +/* Copyright (C) 2007-2008 Jean-Marc Valin + Copyright (C) 2008 Thorvald Natvig + + File: resample.c + Arbitrary resampling code + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ + +/* + The design goals of this code are: + - Very fast algorithm + - SIMD-friendly algorithm + - Low memory requirement + - Good *perceptual* quality (and not best SNR) + + Warning: This resampler is relatively new. Although I think I got rid of + all the major bugs and I don't expect the API to change anymore, there + may be something I've missed. So use with caution. + + This algorithm is based on this original resampling algorithm: + Smith, Julius O. Digital Audio Resampling Home Page + Center for Computer Research in Music and Acoustics (CCRMA), + Stanford University, 2007. + Web published at http://ccrma.stanford.edu/~jos/resample/. + + There is one main difference, though. This resampler uses cubic + interpolation instead of linear interpolation in the above paper. This + makes the table much smaller and makes it possible to compute that table + on a per-stream basis. In turn, being able to tweak the table for each + stream makes it possible to both reduce complexity on simple ratios + (e.g. 2/3), and get rid of the rounding operations in the inner loop. + The latter both reduces CPU time and makes the algorithm more SIMD-friendly. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef OUTSIDE_SPEEX +#include +static void *speex_alloc (int size) {return calloc(size,1);} +static void *speex_realloc (void *ptr, int size) {return realloc(ptr, size);} +static void speex_free (void *ptr) {free(ptr);} +#include "speex_resampler.h" +#include "arch.h" +#else /* OUTSIDE_SPEEX */ + +#include "speex/speex_resampler.h" +#include "arch.h" +#include "os_support.h" +#endif /* OUTSIDE_SPEEX */ + +#include "stack_alloc.h" +#include +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#define IMAX(a,b) ((a) > (b) ? (a) : (b)) +#define IMIN(a,b) ((a) < (b) ? (a) : (b)) + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef UINT32_MAX +#define UINT32_MAX 4294967296U +#endif + +#ifdef _USE_SSE +#include "resample_sse.h" +#endif + +#ifdef _USE_NEON +#include "resample_neon.h" +#endif + +/* Numer of elements to allocate on the stack */ +#ifdef VAR_ARRAYS +#define FIXED_STACK_ALLOC 8192 +#else +#define FIXED_STACK_ALLOC 1024 +#endif + +typedef int (*resampler_basic_func)(SpeexResamplerState *, spx_uint32_t , const spx_word16_t *, spx_uint32_t *, spx_word16_t *, spx_uint32_t *); + +struct SpeexResamplerState_ { + spx_uint32_t in_rate; + spx_uint32_t out_rate; + spx_uint32_t num_rate; + spx_uint32_t den_rate; + + int quality; + spx_uint32_t nb_channels; + spx_uint32_t filt_len; + spx_uint32_t mem_alloc_size; + spx_uint32_t buffer_size; + int int_advance; + int frac_advance; + float cutoff; + spx_uint32_t oversample; + int initialised; + int started; + + /* These are per-channel */ + spx_int32_t *last_sample; + spx_uint32_t *samp_frac_num; + spx_uint32_t *magic_samples; + + spx_word16_t *mem; + spx_word16_t *sinc_table; + spx_uint32_t sinc_table_length; + resampler_basic_func resampler_ptr; + + int in_stride; + int out_stride; +} ; + +static const double kaiser12_table[68] = { + 0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076, + 0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014, + 0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601, + 0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014, + 0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490, + 0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546, + 0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178, + 0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947, + 0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058, + 0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438, + 0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734, + 0.00001000, 0.00000000}; +/* +static const double kaiser12_table[36] = { + 0.99440475, 1.00000000, 0.99440475, 0.97779076, 0.95066529, 0.91384741, + 0.86843014, 0.81573067, 0.75723148, 0.69451601, 0.62920216, 0.56287762, + 0.49704014, 0.43304576, 0.37206735, 0.31506490, 0.26276832, 0.21567274, + 0.17404546, 0.13794294, 0.10723616, 0.08164178, 0.06075685, 0.04409466, + 0.03111947, 0.02127838, 0.01402878, 0.00886058, 0.00531256, 0.00298291, + 0.00153438, 0.00069463, 0.00025272, 0.0000527734, 0.00000500, 0.00000000}; +*/ +static const double kaiser10_table[36] = { + 0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446, + 0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347, + 0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962, + 0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451, + 0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739, + 0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000}; + +static const double kaiser8_table[36] = { + 0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200, + 0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126, + 0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272, + 0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758, + 0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490, + 0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000}; + +static const double kaiser6_table[36] = { + 0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003, + 0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565, + 0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561, + 0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058, + 0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600, + 0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000}; + +struct FuncDef { + const double *table; + int oversample; +}; + +static const struct FuncDef _KAISER12 = {kaiser12_table, 64}; +#define KAISER12 (&_KAISER12) +/*static struct FuncDef _KAISER12 = {kaiser12_table, 32}; +#define KAISER12 (&_KAISER12)*/ +static const struct FuncDef _KAISER10 = {kaiser10_table, 32}; +#define KAISER10 (&_KAISER10) +static const struct FuncDef _KAISER8 = {kaiser8_table, 32}; +#define KAISER8 (&_KAISER8) +static const struct FuncDef _KAISER6 = {kaiser6_table, 32}; +#define KAISER6 (&_KAISER6) + +struct QualityMapping { + int base_length; + int oversample; + float downsample_bandwidth; + float upsample_bandwidth; + const struct FuncDef *window_func; +}; + + +/* This table maps conversion quality to internal parameters. There are two + reasons that explain why the up-sampling bandwidth is larger than the + down-sampling bandwidth: + 1) When up-sampling, we can assume that the spectrum is already attenuated + close to the Nyquist rate (from an A/D or a previous resampling filter) + 2) Any aliasing that occurs very close to the Nyquist rate will be masked + by the sinusoids/noise just below the Nyquist rate (guaranteed only for + up-sampling). +*/ +static const struct QualityMapping quality_map[11] = { + { 8, 4, 0.830f, 0.860f, KAISER6 }, /* Q0 */ + { 16, 4, 0.850f, 0.880f, KAISER6 }, /* Q1 */ + { 32, 4, 0.882f, 0.910f, KAISER6 }, /* Q2 */ /* 82.3% cutoff ( ~60 dB stop) 6 */ + { 48, 8, 0.895f, 0.917f, KAISER8 }, /* Q3 */ /* 84.9% cutoff ( ~80 dB stop) 8 */ + { 64, 8, 0.921f, 0.940f, KAISER8 }, /* Q4 */ /* 88.7% cutoff ( ~80 dB stop) 8 */ + { 80, 16, 0.922f, 0.940f, KAISER10}, /* Q5 */ /* 89.1% cutoff (~100 dB stop) 10 */ + { 96, 16, 0.940f, 0.945f, KAISER10}, /* Q6 */ /* 91.5% cutoff (~100 dB stop) 10 */ + {128, 16, 0.950f, 0.950f, KAISER10}, /* Q7 */ /* 93.1% cutoff (~100 dB stop) 10 */ + {160, 16, 0.960f, 0.960f, KAISER10}, /* Q8 */ /* 94.5% cutoff (~100 dB stop) 10 */ + {192, 32, 0.968f, 0.968f, KAISER12}, /* Q9 */ /* 95.5% cutoff (~100 dB stop) 10 */ + {256, 32, 0.975f, 0.975f, KAISER12}, /* Q10 */ /* 96.6% cutoff (~100 dB stop) 10 */ +}; +/*8,24,40,56,80,104,128,160,200,256,320*/ +static double compute_func(float x, const struct FuncDef *func) +{ + float y, frac; + double interp[4]; + int ind; + y = x*func->oversample; + ind = (int)floor(y); + frac = (y-ind); + /* CSE with handle the repeated powers */ + interp[3] = -0.1666666667*frac + 0.1666666667*(frac*frac*frac); + interp[2] = frac + 0.5*(frac*frac) - 0.5*(frac*frac*frac); + /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ + interp[0] = -0.3333333333*frac + 0.5*(frac*frac) - 0.1666666667*(frac*frac*frac); + /* Just to make sure we don't have rounding problems */ + interp[1] = 1.f-interp[3]-interp[2]-interp[0]; + + /*sum = frac*accum[1] + (1-frac)*accum[2];*/ + return interp[0]*func->table[ind] + interp[1]*func->table[ind+1] + interp[2]*func->table[ind+2] + interp[3]*func->table[ind+3]; +} + +#if 0 +#include +int main(int argc, char **argv) +{ + int i; + for (i=0;i<256;i++) + { + printf ("%f\n", compute_func(i/256., KAISER12)); + } + return 0; +} +#endif + +#ifdef FIXED_POINT +/* The slow way of computing a sinc for the table. Should improve that some day */ +static spx_word16_t sinc(float cutoff, float x, int N, const struct FuncDef *window_func) +{ + /*fprintf (stderr, "%f ", x);*/ + float xx = x * cutoff; + if (fabs(x)<1e-6f) + return WORD2INT(32768.*cutoff); + else if (fabs(x) > .5f*N) + return 0; + /*FIXME: Can it really be any slower than this? */ + return WORD2INT(32768.*cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func)); +} +#else +/* The slow way of computing a sinc for the table. Should improve that some day */ +static spx_word16_t sinc(float cutoff, float x, int N, const struct FuncDef *window_func) +{ + /*fprintf (stderr, "%f ", x);*/ + float xx = x * cutoff; + if (fabs(x)<1e-6) + return cutoff; + else if (fabs(x) > .5*N) + return 0; + /*FIXME: Can it really be any slower than this? */ + return cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func); +} +#endif + +#ifdef FIXED_POINT +static void cubic_coef(spx_word16_t x, spx_word16_t interp[4]) +{ + /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation + but I know it's MMSE-optimal on a sinc */ + spx_word16_t x2, x3; + x2 = MULT16_16_P15(x, x); + x3 = MULT16_16_P15(x, x2); + interp[0] = PSHR32(MULT16_16(QCONST16(-0.16667f, 15),x) + MULT16_16(QCONST16(0.16667f, 15),x3),15); + interp[1] = EXTRACT16(EXTEND32(x) + SHR32(SUB32(EXTEND32(x2),EXTEND32(x3)),1)); + interp[3] = PSHR32(MULT16_16(QCONST16(-0.33333f, 15),x) + MULT16_16(QCONST16(.5f,15),x2) - MULT16_16(QCONST16(0.16667f, 15),x3),15); + /* Just to make sure we don't have rounding problems */ + interp[2] = Q15_ONE-interp[0]-interp[1]-interp[3]; + if (interp[2]<32767) + interp[2]+=1; +} +#else +static void cubic_coef(spx_word16_t frac, spx_word16_t interp[4]) +{ + /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation + but I know it's MMSE-optimal on a sinc */ + interp[0] = -0.16667f*frac + 0.16667f*frac*frac*frac; + interp[1] = frac + 0.5f*frac*frac - 0.5f*frac*frac*frac; + /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ + interp[3] = -0.33333f*frac + 0.5f*frac*frac - 0.16667f*frac*frac*frac; + /* Just to make sure we don't have rounding problems */ + interp[2] = 1.-interp[0]-interp[1]-interp[3]; +} +#endif + +static int resampler_basic_direct_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + const int N = st->filt_len; + int out_sample = 0; + int last_sample = st->last_sample[channel_index]; + spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; + const spx_word16_t *sinc_table = st->sinc_table; + const int out_stride = st->out_stride; + const int int_advance = st->int_advance; + const int frac_advance = st->frac_advance; + const spx_uint32_t den_rate = st->den_rate; + spx_word32_t sum; + + while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) + { + const spx_word16_t *sinct = & sinc_table[samp_frac_num*N]; + const spx_word16_t *iptr = & in[last_sample]; + +#ifndef OVERRIDE_INNER_PRODUCT_SINGLE + int j; + sum = 0; + for(j=0;j= den_rate) + { + samp_frac_num -= den_rate; + last_sample++; + } + } + + st->last_sample[channel_index] = last_sample; + st->samp_frac_num[channel_index] = samp_frac_num; + return out_sample; +} + +#ifdef FIXED_POINT +#else +/* This is the same as the previous function, except with a double-precision accumulator */ +static int resampler_basic_direct_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + const int N = st->filt_len; + int out_sample = 0; + int last_sample = st->last_sample[channel_index]; + spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; + const spx_word16_t *sinc_table = st->sinc_table; + const int out_stride = st->out_stride; + const int int_advance = st->int_advance; + const int frac_advance = st->frac_advance; + const spx_uint32_t den_rate = st->den_rate; + double sum; + + while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) + { + const spx_word16_t *sinct = & sinc_table[samp_frac_num*N]; + const spx_word16_t *iptr = & in[last_sample]; + +#ifndef OVERRIDE_INNER_PRODUCT_DOUBLE + int j; + double accum[4] = {0,0,0,0}; + + for(j=0;j= den_rate) + { + samp_frac_num -= den_rate; + last_sample++; + } + } + + st->last_sample[channel_index] = last_sample; + st->samp_frac_num[channel_index] = samp_frac_num; + return out_sample; +} +#endif + +static int resampler_basic_interpolate_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + const int N = st->filt_len; + int out_sample = 0; + int last_sample = st->last_sample[channel_index]; + spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; + const int out_stride = st->out_stride; + const int int_advance = st->int_advance; + const int frac_advance = st->frac_advance; + const spx_uint32_t den_rate = st->den_rate; + spx_word32_t sum; + + while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) + { + const spx_word16_t *iptr = & in[last_sample]; + + const int offset = samp_frac_num*st->oversample/st->den_rate; +#ifdef FIXED_POINT + const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); +#else + const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; +#endif + spx_word16_t interp[4]; + + +#ifndef OVERRIDE_INTERPOLATE_PRODUCT_SINGLE + int j; + spx_word32_t accum[4] = {0,0,0,0}; + + for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); + accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); + accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); + accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); + } + + cubic_coef(frac, interp); + sum = MULT16_32_Q15(interp[0],SHR32(accum[0], 1)) + MULT16_32_Q15(interp[1],SHR32(accum[1], 1)) + MULT16_32_Q15(interp[2],SHR32(accum[2], 1)) + MULT16_32_Q15(interp[3],SHR32(accum[3], 1)); + sum = SATURATE32PSHR(sum, 15, 32767); +#else + cubic_coef(frac, interp); + sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); +#endif + + out[out_stride * out_sample++] = sum; + last_sample += int_advance; + samp_frac_num += frac_advance; + if (samp_frac_num >= den_rate) + { + samp_frac_num -= den_rate; + last_sample++; + } + } + + st->last_sample[channel_index] = last_sample; + st->samp_frac_num[channel_index] = samp_frac_num; + return out_sample; +} + +#ifdef FIXED_POINT +#else +/* This is the same as the previous function, except with a double-precision accumulator */ +static int resampler_basic_interpolate_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + const int N = st->filt_len; + int out_sample = 0; + int last_sample = st->last_sample[channel_index]; + spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; + const int out_stride = st->out_stride; + const int int_advance = st->int_advance; + const int frac_advance = st->frac_advance; + const spx_uint32_t den_rate = st->den_rate; + spx_word32_t sum; + + while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) + { + const spx_word16_t *iptr = & in[last_sample]; + + const int offset = samp_frac_num*st->oversample/st->den_rate; +#ifdef FIXED_POINT + const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); +#else + const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; +#endif + spx_word16_t interp[4]; + + +#ifndef OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE + int j; + double accum[4] = {0,0,0,0}; + + for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); + accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); + accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); + accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); + } + + cubic_coef(frac, interp); + sum = MULT16_32_Q15(interp[0],accum[0]) + MULT16_32_Q15(interp[1],accum[1]) + MULT16_32_Q15(interp[2],accum[2]) + MULT16_32_Q15(interp[3],accum[3]); +#else + cubic_coef(frac, interp); + sum = interpolate_product_double(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); +#endif + + out[out_stride * out_sample++] = PSHR32(sum,15); + last_sample += int_advance; + samp_frac_num += frac_advance; + if (samp_frac_num >= den_rate) + { + samp_frac_num -= den_rate; + last_sample++; + } + } + + st->last_sample[channel_index] = last_sample; + st->samp_frac_num[channel_index] = samp_frac_num; + return out_sample; +} +#endif + +/* This resampler is used to produce zero output in situations where memory + for the filter could not be allocated. The expected numbers of input and + output samples are still processed so that callers failing to check error + codes are not surprised, possibly getting into infinite loops. */ +static int resampler_basic_zero(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + int out_sample = 0; + int last_sample = st->last_sample[channel_index]; + spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; + const int out_stride = st->out_stride; + const int int_advance = st->int_advance; + const int frac_advance = st->frac_advance; + const spx_uint32_t den_rate = st->den_rate; + + while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) + { + out[out_stride * out_sample++] = 0; + last_sample += int_advance; + samp_frac_num += frac_advance; + if (samp_frac_num >= den_rate) + { + samp_frac_num -= den_rate; + last_sample++; + } + } + + st->last_sample[channel_index] = last_sample; + st->samp_frac_num[channel_index] = samp_frac_num; + return out_sample; +} + +static int _muldiv(spx_uint32_t *result, spx_uint32_t value, spx_uint32_t mul, spx_uint32_t div) +{ + speex_assert(result); + spx_uint32_t major = value / div; + spx_uint32_t remainder = value % div; + /* TODO: Could use 64 bits operation to check for overflow. But only guaranteed in C99+ */ + if (remainder > UINT32_MAX / mul || major > UINT32_MAX / mul + || major * mul > UINT32_MAX - remainder * mul / div) + return RESAMPLER_ERR_OVERFLOW; + *result = remainder * mul / div + major * mul; + return RESAMPLER_ERR_SUCCESS; +} + +static int update_filter(SpeexResamplerState *st) +{ + spx_uint32_t old_length = st->filt_len; + spx_uint32_t old_alloc_size = st->mem_alloc_size; + int use_direct; + spx_uint32_t min_sinc_table_length; + spx_uint32_t min_alloc_size; + + st->int_advance = st->num_rate/st->den_rate; + st->frac_advance = st->num_rate%st->den_rate; + st->oversample = quality_map[st->quality].oversample; + st->filt_len = quality_map[st->quality].base_length; + + if (st->num_rate > st->den_rate) + { + /* down-sampling */ + st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate; + if (_muldiv(&st->filt_len,st->filt_len,st->num_rate,st->den_rate) != RESAMPLER_ERR_SUCCESS) + goto fail; + /* Round up to make sure we have a multiple of 8 for SSE */ + st->filt_len = ((st->filt_len-1)&(~0x7))+8; + if (2*st->den_rate < st->num_rate) + st->oversample >>= 1; + if (4*st->den_rate < st->num_rate) + st->oversample >>= 1; + if (8*st->den_rate < st->num_rate) + st->oversample >>= 1; + if (16*st->den_rate < st->num_rate) + st->oversample >>= 1; + if (st->oversample < 1) + st->oversample = 1; + } else { + /* up-sampling */ + st->cutoff = quality_map[st->quality].upsample_bandwidth; + } + + /* Choose the resampling type that requires the least amount of memory */ +#ifdef RESAMPLE_FULL_SINC_TABLE + use_direct = 1; + if (INT_MAX/sizeof(spx_word16_t)/st->den_rate < st->filt_len) + goto fail; +#else + use_direct = st->filt_len*st->den_rate <= st->filt_len*st->oversample+8 + && INT_MAX/sizeof(spx_word16_t)/st->den_rate >= st->filt_len; +#endif + if (use_direct) + { + min_sinc_table_length = st->filt_len*st->den_rate; + } else { + if ((INT_MAX/sizeof(spx_word16_t)-8)/st->oversample < st->filt_len) + goto fail; + + min_sinc_table_length = st->filt_len*st->oversample+8; + } + if (st->sinc_table_length < min_sinc_table_length) + { + spx_word16_t *sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,min_sinc_table_length*sizeof(spx_word16_t)); + if (!sinc_table) + goto fail; + + st->sinc_table = sinc_table; + st->sinc_table_length = min_sinc_table_length; + } + if (use_direct) + { + spx_uint32_t i; + for (i=0;iden_rate;i++) + { + spx_int32_t j; + for (j=0;jfilt_len;j++) + { + st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-(spx_int32_t)st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func); + } + } +#ifdef FIXED_POINT + st->resampler_ptr = resampler_basic_direct_single; +#else + if (st->quality>8) + st->resampler_ptr = resampler_basic_direct_double; + else + st->resampler_ptr = resampler_basic_direct_single; +#endif + /*fprintf (stderr, "resampler uses direct sinc table and normalised cutoff %f\n", cutoff);*/ + } else { + spx_int32_t i; + for (i=-4;i<(spx_int32_t)(st->oversample*st->filt_len+4);i++) + st->sinc_table[i+4] = sinc(st->cutoff,(i/(float)st->oversample - st->filt_len/2), st->filt_len, quality_map[st->quality].window_func); +#ifdef FIXED_POINT + st->resampler_ptr = resampler_basic_interpolate_single; +#else + if (st->quality>8) + st->resampler_ptr = resampler_basic_interpolate_double; + else + st->resampler_ptr = resampler_basic_interpolate_single; +#endif + /*fprintf (stderr, "resampler uses interpolated sinc table and normalised cutoff %f\n", cutoff);*/ + } + + /* Here's the place where we update the filter memory to take into account + the change in filter length. It's probably the messiest part of the code + due to handling of lots of corner cases. */ + + /* Adding buffer_size to filt_len won't overflow here because filt_len + could be multiplied by sizeof(spx_word16_t) above. */ + min_alloc_size = st->filt_len-1 + st->buffer_size; + if (min_alloc_size > st->mem_alloc_size) + { + spx_word16_t *mem; + if (INT_MAX/sizeof(spx_word16_t)/st->nb_channels < min_alloc_size) + goto fail; + else if (!(mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*min_alloc_size * sizeof(*mem)))) + goto fail; + + st->mem = mem; + st->mem_alloc_size = min_alloc_size; + } + if (!st->started) + { + spx_uint32_t i; + for (i=0;inb_channels*st->mem_alloc_size;i++) + st->mem[i] = 0; + /*speex_warning("reinit filter");*/ + } else if (st->filt_len > old_length) + { + spx_uint32_t i; + /* Increase the filter length */ + /*speex_warning("increase filter size");*/ + for (i=st->nb_channels;i--;) + { + spx_uint32_t j; + spx_uint32_t olen = old_length; + /*if (st->magic_samples[i])*/ + { + /* Try and remove the magic samples as if nothing had happened */ + + /* FIXME: This is wrong but for now we need it to avoid going over the array bounds */ + olen = old_length + 2*st->magic_samples[i]; + for (j=old_length-1+st->magic_samples[i];j--;) + st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]] = st->mem[i*old_alloc_size+j]; + for (j=0;jmagic_samples[i];j++) + st->mem[i*st->mem_alloc_size+j] = 0; + st->magic_samples[i] = 0; + } + if (st->filt_len > olen) + { + /* If the new filter length is still bigger than the "augmented" length */ + /* Copy data going backward */ + for (j=0;jmem[i*st->mem_alloc_size+(st->filt_len-2-j)] = st->mem[i*st->mem_alloc_size+(olen-2-j)]; + /* Then put zeros for lack of anything better */ + for (;jfilt_len-1;j++) + st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = 0; + /* Adjust last_sample */ + st->last_sample[i] += (st->filt_len - olen)/2; + } else { + /* Put back some of the magic! */ + st->magic_samples[i] = (olen - st->filt_len)/2; + for (j=0;jfilt_len-1+st->magic_samples[i];j++) + st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; + } + } + } else if (st->filt_len < old_length) + { + spx_uint32_t i; + /* Reduce filter length, this a bit tricky. We need to store some of the memory as "magic" + samples so they can be used directly as input the next time(s) */ + for (i=0;inb_channels;i++) + { + spx_uint32_t j; + spx_uint32_t old_magic = st->magic_samples[i]; + st->magic_samples[i] = (old_length - st->filt_len)/2; + /* We must copy some of the memory that's no longer used */ + /* Copy data going backward */ + for (j=0;jfilt_len-1+st->magic_samples[i]+old_magic;j++) + st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; + st->magic_samples[i] += old_magic; + } + } + return RESAMPLER_ERR_SUCCESS; + +fail: + st->resampler_ptr = resampler_basic_zero; + /* st->mem may still contain consumed input samples for the filter. + Restore filt_len so that filt_len - 1 still points to the position after + the last of these samples. */ + st->filt_len = old_length; + return RESAMPLER_ERR_ALLOC_FAILED; +} + +EXPORT SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) +{ + return speex_resampler_init_frac(nb_channels, in_rate, out_rate, in_rate, out_rate, quality, err); +} + +EXPORT SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) +{ + SpeexResamplerState *st; + int filter_err; + + if (nb_channels == 0 || ratio_num == 0 || ratio_den == 0 || quality > 10 || quality < 0) + { + if (err) + *err = RESAMPLER_ERR_INVALID_ARG; + return NULL; + } + st = (SpeexResamplerState *)speex_alloc(sizeof(SpeexResamplerState)); + if (!st) + { + if (err) + *err = RESAMPLER_ERR_ALLOC_FAILED; + return NULL; + } + st->initialised = 0; + st->started = 0; + st->in_rate = 0; + st->out_rate = 0; + st->num_rate = 0; + st->den_rate = 0; + st->quality = -1; + st->sinc_table_length = 0; + st->mem_alloc_size = 0; + st->filt_len = 0; + st->mem = 0; + st->resampler_ptr = 0; + + st->cutoff = 1.f; + st->nb_channels = nb_channels; + st->in_stride = 1; + st->out_stride = 1; + + st->buffer_size = 160; + + /* Per channel data */ + if (!(st->last_sample = (spx_int32_t*)speex_alloc(nb_channels*sizeof(spx_int32_t)))) + goto fail; + if (!(st->magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(spx_uint32_t)))) + goto fail; + if (!(st->samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(spx_uint32_t)))) + goto fail; + + speex_resampler_set_quality(st, quality); + speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate); + + filter_err = update_filter(st); + if (filter_err == RESAMPLER_ERR_SUCCESS) + { + st->initialised = 1; + } else { + speex_resampler_destroy(st); + st = NULL; + } + if (err) + *err = filter_err; + + return st; + +fail: + if (err) + *err = RESAMPLER_ERR_ALLOC_FAILED; + speex_resampler_destroy(st); + return NULL; +} + +EXPORT void speex_resampler_destroy(SpeexResamplerState *st) +{ + speex_free(st->mem); + speex_free(st->sinc_table); + speex_free(st->last_sample); + speex_free(st->magic_samples); + speex_free(st->samp_frac_num); + speex_free(st); +} + +static int speex_resampler_process_native(SpeexResamplerState *st, spx_uint32_t channel_index, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + int j=0; + const int N = st->filt_len; + int out_sample = 0; + spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; + spx_uint32_t ilen; + + st->started = 1; + + /* Call the right resampler through the function ptr */ + out_sample = st->resampler_ptr(st, channel_index, mem, in_len, out, out_len); + + if (st->last_sample[channel_index] < (spx_int32_t)*in_len) + *in_len = st->last_sample[channel_index]; + *out_len = out_sample; + st->last_sample[channel_index] -= *in_len; + + ilen = *in_len; + + for(j=0;jmagic_samples[channel_index]; + spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; + const int N = st->filt_len; + + speex_resampler_process_native(st, channel_index, &tmp_in_len, *out, &out_len); + + st->magic_samples[channel_index] -= tmp_in_len; + + /* If we couldn't process all "magic" input samples, save the rest for next time */ + if (st->magic_samples[channel_index]) + { + spx_uint32_t i; + for (i=0;imagic_samples[channel_index];i++) + mem[N-1+i]=mem[N-1+i+tmp_in_len]; + } + *out += out_len*st->out_stride; + return out_len; +} + +#ifdef FIXED_POINT +EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) +#else +EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) +#endif +{ + int j; + spx_uint32_t ilen = *in_len; + spx_uint32_t olen = *out_len; + spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; + const int filt_offs = st->filt_len - 1; + const spx_uint32_t xlen = st->mem_alloc_size - filt_offs; + const int istride = st->in_stride; + + if (st->magic_samples[channel_index]) + olen -= speex_resampler_magic(st, channel_index, &out, olen); + if (! st->magic_samples[channel_index]) { + while (ilen && olen) { + spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; + spx_uint32_t ochunk = olen; + + if (in) { + for(j=0;jout_stride; + if (in) + in += ichunk * istride; + } + } + *in_len -= ilen; + *out_len -= olen; + return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; +} + +#ifdef FIXED_POINT +EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) +#else +EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) +#endif +{ + int j; + const int istride_save = st->in_stride; + const int ostride_save = st->out_stride; + spx_uint32_t ilen = *in_len; + spx_uint32_t olen = *out_len; + spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; + const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1); +#ifdef VAR_ARRAYS + const unsigned int ylen = (olen < FIXED_STACK_ALLOC) ? olen : FIXED_STACK_ALLOC; + VARDECL(spx_word16_t *ystack); + ALLOC(ystack, ylen, spx_word16_t); +#else + const unsigned int ylen = FIXED_STACK_ALLOC; + spx_word16_t ystack[FIXED_STACK_ALLOC]; +#endif + + st->out_stride = 1; + + while (ilen && olen) { + spx_word16_t *y = ystack; + spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; + spx_uint32_t ochunk = (olen > ylen) ? ylen : olen; + spx_uint32_t omagic = 0; + + if (st->magic_samples[channel_index]) { + omagic = speex_resampler_magic(st, channel_index, &y, ochunk); + ochunk -= omagic; + olen -= omagic; + } + if (! st->magic_samples[channel_index]) { + if (in) { + for(j=0;jfilt_len-1]=WORD2INT(in[j*istride_save]); +#else + x[j+st->filt_len-1]=in[j*istride_save]; +#endif + } else { + for(j=0;jfilt_len-1]=0; + } + + speex_resampler_process_native(st, channel_index, &ichunk, y, &ochunk); + } else { + ichunk = 0; + ochunk = 0; + } + + for (j=0;jout_stride = ostride_save; + *in_len -= ilen; + *out_len -= olen; + + return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; +} + +EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) +{ + spx_uint32_t i; + int istride_save, ostride_save; + spx_uint32_t bak_out_len = *out_len; + spx_uint32_t bak_in_len = *in_len; + istride_save = st->in_stride; + ostride_save = st->out_stride; + st->in_stride = st->out_stride = st->nb_channels; + for (i=0;inb_channels;i++) + { + *out_len = bak_out_len; + *in_len = bak_in_len; + if (in != NULL) + speex_resampler_process_float(st, i, in+i, in_len, out+i, out_len); + else + speex_resampler_process_float(st, i, NULL, in_len, out+i, out_len); + } + st->in_stride = istride_save; + st->out_stride = ostride_save; + return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; +} + +EXPORT int speex_resampler_process_interleaved_int(SpeexResamplerState *st, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) +{ + spx_uint32_t i; + int istride_save, ostride_save; + spx_uint32_t bak_out_len = *out_len; + spx_uint32_t bak_in_len = *in_len; + istride_save = st->in_stride; + ostride_save = st->out_stride; + st->in_stride = st->out_stride = st->nb_channels; + for (i=0;inb_channels;i++) + { + *out_len = bak_out_len; + *in_len = bak_in_len; + if (in != NULL) + speex_resampler_process_int(st, i, in+i, in_len, out+i, out_len); + else + speex_resampler_process_int(st, i, NULL, in_len, out+i, out_len); + } + st->in_stride = istride_save; + st->out_stride = ostride_save; + return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; +} + +EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate) +{ + return speex_resampler_set_rate_frac(st, in_rate, out_rate, in_rate, out_rate); +} + +EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate) +{ + *in_rate = st->in_rate; + *out_rate = st->out_rate; +} + +static inline spx_uint32_t _gcd(spx_uint32_t a, spx_uint32_t b) +{ + while (b != 0) + { + spx_uint32_t temp = a; + + a = b; + b = temp % b; + } + return a; +} + +EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate) +{ + spx_uint32_t fact; + spx_uint32_t old_den; + spx_uint32_t i; + + if (ratio_num == 0 || ratio_den == 0) + return RESAMPLER_ERR_INVALID_ARG; + + if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den) + return RESAMPLER_ERR_SUCCESS; + + old_den = st->den_rate; + st->in_rate = in_rate; + st->out_rate = out_rate; + st->num_rate = ratio_num; + st->den_rate = ratio_den; + + fact = _gcd (st->num_rate, st->den_rate); + + st->num_rate /= fact; + st->den_rate /= fact; + + if (old_den > 0) + { + for (i=0;inb_channels;i++) + { + if (_muldiv(&st->samp_frac_num[i],st->samp_frac_num[i],st->den_rate,old_den) != RESAMPLER_ERR_SUCCESS) + return RESAMPLER_ERR_OVERFLOW; + /* Safety net */ + if (st->samp_frac_num[i] >= st->den_rate) + st->samp_frac_num[i] = st->den_rate-1; + } + } + + if (st->initialised) + return update_filter(st); + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den) +{ + *ratio_num = st->num_rate; + *ratio_den = st->den_rate; +} + +EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int quality) +{ + if (quality > 10 || quality < 0) + return RESAMPLER_ERR_INVALID_ARG; + if (st->quality == quality) + return RESAMPLER_ERR_SUCCESS; + st->quality = quality; + if (st->initialised) + return update_filter(st); + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *quality) +{ + *quality = st->quality; +} + +EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride) +{ + st->in_stride = stride; +} + +EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride) +{ + *stride = st->in_stride; +} + +EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride) +{ + st->out_stride = stride; +} + +EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride) +{ + *stride = st->out_stride; +} + +EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st) +{ + return st->filt_len / 2; +} + +EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st) +{ + return ((st->filt_len / 2) * st->den_rate + (st->num_rate >> 1)) / st->num_rate; +} + +EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st) +{ + spx_uint32_t i; + for (i=0;inb_channels;i++) + st->last_sample[i] = st->filt_len/2; + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st) +{ + spx_uint32_t i; + for (i=0;inb_channels;i++) + { + st->last_sample[i] = 0; + st->magic_samples[i] = 0; + st->samp_frac_num[i] = 0; + } + for (i=0;inb_channels*(st->filt_len-1);i++) + st->mem[i] = 0; + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT const char *speex_resampler_strerror(int err) +{ + switch (err) + { + case RESAMPLER_ERR_SUCCESS: + return "Success."; + case RESAMPLER_ERR_ALLOC_FAILED: + return "Memory allocation failed."; + case RESAMPLER_ERR_BAD_STATE: + return "Bad resampler state."; + case RESAMPLER_ERR_INVALID_ARG: + return "Invalid argument."; + case RESAMPLER_ERR_PTR_OVERLAP: + return "Input and output buffers overlap."; + default: + return "Unknown error. Bad error code or strange version mismatch."; + } +} diff --git a/3rdparty/cubeb/subprojects/speex/resample_neon.h b/3rdparty/cubeb/subprojects/speex/resample_neon.h new file mode 100644 index 0000000000..0acbd27b9a --- /dev/null +++ b/3rdparty/cubeb/subprojects/speex/resample_neon.h @@ -0,0 +1,201 @@ +/* Copyright (C) 2007-2008 Jean-Marc Valin + * Copyright (C) 2008 Thorvald Natvig + * Copyright (C) 2011 Texas Instruments + * author Jyri Sarha + */ +/** + @file resample_neon.h + @brief Resampler functions (NEON version) +*/ +/* + 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION 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 + +#ifdef FIXED_POINT +#ifdef __thumb2__ +static inline int32_t saturate_32bit_to_16bit(int32_t a) { + int32_t ret; + asm ("ssat %[ret], #16, %[a]" + : [ret] "=&r" (ret) + : [a] "r" (a) + : ); + return ret; +} +#else +static inline int32_t saturate_32bit_to_16bit(int32_t a) { + int32_t ret; + asm ("vmov.s32 d0[0], %[a]\n" + "vqmovn.s32 d0, q0\n" + "vmov.s16 %[ret], d0[0]\n" + : [ret] "=&r" (ret) + : [a] "r" (a) + : "q0"); + return ret; +} +#endif +#undef WORD2INT +#define WORD2INT(x) (saturate_32bit_to_16bit(x)) + +#define OVERRIDE_INNER_PRODUCT_SINGLE +/* Only works when len % 4 == 0 */ +static inline int32_t inner_product_single(const int16_t *a, const int16_t *b, unsigned int len) +{ + int32_t ret; + uint32_t remainder = len % 16; + len = len - remainder; + + asm volatile (" cmp %[len], #0\n" + " bne 1f\n" + " vld1.16 {d16}, [%[b]]!\n" + " vld1.16 {d20}, [%[a]]!\n" + " subs %[remainder], %[remainder], #4\n" + " vmull.s16 q0, d16, d20\n" + " beq 5f\n" + " b 4f\n" + "1:" + " vld1.16 {d16, d17, d18, d19}, [%[b]]!\n" + " vld1.16 {d20, d21, d22, d23}, [%[a]]!\n" + " subs %[len], %[len], #16\n" + " vmull.s16 q0, d16, d20\n" + " vmlal.s16 q0, d17, d21\n" + " vmlal.s16 q0, d18, d22\n" + " vmlal.s16 q0, d19, d23\n" + " beq 3f\n" + "2:" + " vld1.16 {d16, d17, d18, d19}, [%[b]]!\n" + " vld1.16 {d20, d21, d22, d23}, [%[a]]!\n" + " subs %[len], %[len], #16\n" + " vmlal.s16 q0, d16, d20\n" + " vmlal.s16 q0, d17, d21\n" + " vmlal.s16 q0, d18, d22\n" + " vmlal.s16 q0, d19, d23\n" + " bne 2b\n" + "3:" + " cmp %[remainder], #0\n" + " beq 5f\n" + "4:" + " vld1.16 {d16}, [%[b]]!\n" + " vld1.16 {d20}, [%[a]]!\n" + " subs %[remainder], %[remainder], #4\n" + " vmlal.s16 q0, d16, d20\n" + " bne 4b\n" + "5:" + " vaddl.s32 q0, d0, d1\n" + " vadd.s64 d0, d0, d1\n" + " vqmovn.s64 d0, q0\n" + " vqrshrn.s32 d0, q0, #15\n" + " vmov.s16 %[ret], d0[0]\n" + : [ret] "=&r" (ret), [a] "+r" (a), [b] "+r" (b), + [len] "+r" (len), [remainder] "+r" (remainder) + : + : "cc", "q0", + "d16", "d17", "d18", "d19", + "d20", "d21", "d22", "d23"); + + return ret; +} +#elif defined(FLOATING_POINT) + +static inline int32_t saturate_float_to_16bit(float a) { + int32_t ret; + asm ("vmov.f32 d0[0], %[a]\n" + "vcvt.s32.f32 d0, d0, #15\n" + "vqrshrn.s32 d0, q0, #15\n" + "vmov.s16 %[ret], d0[0]\n" + : [ret] "=&r" (ret) + : [a] "r" (a) + : "q0"); + return ret; +} +#undef WORD2INT +#define WORD2INT(x) (saturate_float_to_16bit(x)) + +#define OVERRIDE_INNER_PRODUCT_SINGLE +/* Only works when len % 4 == 0 */ +static inline float inner_product_single(const float *a, const float *b, unsigned int len) +{ + float ret; + uint32_t remainder = len % 16; + len = len - remainder; + + asm volatile (" cmp %[len], #0\n" + " bne 1f\n" + " vld1.32 {q4}, [%[b]]!\n" + " vld1.32 {q8}, [%[a]]!\n" + " subs %[remainder], %[remainder], #4\n" + " vmul.f32 q0, q4, q8\n" + " bne 4f\n" + " b 5f\n" + "1:" + " vld1.32 {q4, q5}, [%[b]]!\n" + " vld1.32 {q8, q9}, [%[a]]!\n" + " vld1.32 {q6, q7}, [%[b]]!\n" + " vld1.32 {q10, q11}, [%[a]]!\n" + " subs %[len], %[len], #16\n" + " vmul.f32 q0, q4, q8\n" + " vmul.f32 q1, q5, q9\n" + " vmul.f32 q2, q6, q10\n" + " vmul.f32 q3, q7, q11\n" + " beq 3f\n" + "2:" + " vld1.32 {q4, q5}, [%[b]]!\n" + " vld1.32 {q8, q9}, [%[a]]!\n" + " vld1.32 {q6, q7}, [%[b]]!\n" + " vld1.32 {q10, q11}, [%[a]]!\n" + " subs %[len], %[len], #16\n" + " vmla.f32 q0, q4, q8\n" + " vmla.f32 q1, q5, q9\n" + " vmla.f32 q2, q6, q10\n" + " vmla.f32 q3, q7, q11\n" + " bne 2b\n" + "3:" + " vadd.f32 q4, q0, q1\n" + " vadd.f32 q5, q2, q3\n" + " cmp %[remainder], #0\n" + " vadd.f32 q0, q4, q5\n" + " beq 5f\n" + "4:" + " vld1.32 {q6}, [%[b]]!\n" + " vld1.32 {q10}, [%[a]]!\n" + " subs %[remainder], %[remainder], #4\n" + " vmla.f32 q0, q6, q10\n" + " bne 4b\n" + "5:" + " vadd.f32 d0, d0, d1\n" + " vpadd.f32 d0, d0, d0\n" + " vmov.f32 %[ret], d0[0]\n" + : [ret] "=&r" (ret), [a] "+r" (a), [b] "+r" (b), + [len] "+l" (len), [remainder] "+l" (remainder) + : + : "cc", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", + "q9", "q10", "q11"); + return ret; +} +#endif diff --git a/3rdparty/cubeb/subprojects/speex/resample_sse.h b/3rdparty/cubeb/subprojects/speex/resample_sse.h new file mode 100644 index 0000000000..fed5b8276f --- /dev/null +++ b/3rdparty/cubeb/subprojects/speex/resample_sse.h @@ -0,0 +1,128 @@ +/* Copyright (C) 2007-2008 Jean-Marc Valin + * Copyright (C) 2008 Thorvald Natvig + */ +/** + @file resample_sse.h + @brief Resampler functions (SSE version) +*/ +/* + 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. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION 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 + +#define OVERRIDE_INNER_PRODUCT_SINGLE +static inline float inner_product_single(const float *a, const float *b, unsigned int len) +{ + int i; + float ret; + __m128 sum = _mm_setzero_ps(); + for (i=0;i +#define OVERRIDE_INNER_PRODUCT_DOUBLE + +static inline double inner_product_double(const float *a, const float *b, unsigned int len) +{ + int i; + double ret; + __m128d sum = _mm_setzero_pd(); + __m128 t; + for (i=0;i +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# include +# endif +# endif +#endif + +/** + * @def ALIGN(stack, size) + * + * Aligns the stack to a 'size' boundary + * + * @param stack Stack + * @param size New size boundary + */ + +/** + * @def PUSH(stack, size, type) + * + * Allocates 'size' elements of type 'type' on the stack + * + * @param stack Stack + * @param size Number of elements + * @param type Type of element + */ + +/** + * @def VARDECL(var) + * + * Declare variable on stack + * + * @param var Variable to declare + */ + +/** + * @def ALLOC(var, size, type) + * + * Allocate 'size' elements of 'type' on stack + * + * @param var Name of variable to allocate + * @param size Number of elements + * @param type Type of element + */ + +#ifdef ENABLE_VALGRIND + +#include + +#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) + +#define PUSH(stack, size, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(type)),VALGRIND_MAKE_WRITABLE(stack, ((size)*sizeof(type))),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) + +#else + +#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) + +#define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) + +#endif + +#if defined(VAR_ARRAYS) +#define VARDECL(var) +#define ALLOC(var, size, type) type var[size] +#elif defined(USE_ALLOCA) +#define VARDECL(var) var +#define ALLOC(var, size, type) var = alloca(sizeof(type)*(size)) +#else +#define VARDECL(var) var +#define ALLOC(var, size, type) var = PUSH(stack, size, type) +#endif + + +#endif diff --git a/3rdparty/discord-rpc/CMakeLists.txt b/3rdparty/discord-rpc/CMakeLists.txt new file mode 100644 index 0000000000..607b60c231 --- /dev/null +++ b/3rdparty/discord-rpc/CMakeLists.txt @@ -0,0 +1,37 @@ +set(SRCS + include/discord_register.h + include/discord_rpc.h + src/backoff.h + src/connection.h + src/discord_rpc.cpp + src/msg_queue.h + src/rpc_connection.cpp + src/rpc_connection.h + src/serialization.cpp + src/serialization.h +) + +add_library(discord-rpc ${SRCS}) +target_include_directories(discord-rpc PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(discord-rpc rapidjson) + +# Needed for macOS compile. +set_property(TARGET discord-rpc PROPERTY CXX_STANDARD 17) +set_property(TARGET discord-rpc PROPERTY CXX_STANDARD_REQUIRED ON) + +if(WIN32) + target_sources(discord-rpc PRIVATE + src/connection_win.cpp + src/discord_register_win.cpp + ) +elseif(APPLE) + target_sources(discord-rpc PRIVATE + src/connection_unix.cpp + src/discord_register_osx.m + ) +elseif(UNIX) + target_sources(discord-rpc PRIVATE + src/connection_unix.cpp + src/discord_register_linux.cpp + ) +endif() diff --git a/3rdparty/discord-rpc/LICENSE b/3rdparty/discord-rpc/LICENSE new file mode 100644 index 0000000000..17fca3d50f --- /dev/null +++ b/3rdparty/discord-rpc/LICENSE @@ -0,0 +1,19 @@ +Copyright 2017 Discord, Inc. + +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/3rdparty/discord-rpc/discord-rpc.vcxproj b/3rdparty/discord-rpc/discord-rpc.vcxproj new file mode 100644 index 0000000000..c0d710ba29 --- /dev/null +++ b/3rdparty/discord-rpc/discord-rpc.vcxproj @@ -0,0 +1,55 @@ + + + + + + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09} + + + + StaticLibrary + $(DefaultPlatformToolset) + MultiByte + true + true + false + + + + + + + + + + + + + + AllRules.ruleset + + + + + + + + + + + + + + + + + + + + TurnOffAllWarnings + $(SolutionDir)3rdparty\rapidjson\include;$(ProjectDir)include;%(AdditionalIncludeDirectories) + + + + + \ No newline at end of file diff --git a/3rdparty/discord-rpc/discord-rpc.vcxproj.filters b/3rdparty/discord-rpc/discord-rpc.vcxproj.filters new file mode 100644 index 0000000000..2bd46495cd --- /dev/null +++ b/3rdparty/discord-rpc/discord-rpc.vcxproj.filters @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/3rdparty/discord-rpc/include/discord_register.h b/3rdparty/discord-rpc/include/discord_register.h new file mode 100644 index 0000000000..16fb42f328 --- /dev/null +++ b/3rdparty/discord-rpc/include/discord_register.h @@ -0,0 +1,26 @@ +#pragma once + +#if defined(DISCORD_DYNAMIC_LIB) +#if defined(_WIN32) +#if defined(DISCORD_BUILDING_SDK) +#define DISCORD_EXPORT __declspec(dllexport) +#else +#define DISCORD_EXPORT __declspec(dllimport) +#endif +#else +#define DISCORD_EXPORT __attribute__((visibility("default"))) +#endif +#else +#define DISCORD_EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +DISCORD_EXPORT void Discord_Register(const char* applicationId, const char* command); +DISCORD_EXPORT void Discord_RegisterSteamGame(const char* applicationId, const char* steamId); + +#ifdef __cplusplus +} +#endif diff --git a/3rdparty/discord-rpc/include/discord_rpc.h b/3rdparty/discord-rpc/include/discord_rpc.h new file mode 100644 index 0000000000..3e1441e058 --- /dev/null +++ b/3rdparty/discord-rpc/include/discord_rpc.h @@ -0,0 +1,87 @@ +#pragma once +#include + +// clang-format off + +#if defined(DISCORD_DYNAMIC_LIB) +# if defined(_WIN32) +# if defined(DISCORD_BUILDING_SDK) +# define DISCORD_EXPORT __declspec(dllexport) +# else +# define DISCORD_EXPORT __declspec(dllimport) +# endif +# else +# define DISCORD_EXPORT __attribute__((visibility("default"))) +# endif +#else +# define DISCORD_EXPORT +#endif + +// clang-format on + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct DiscordRichPresence { + const char* state; /* max 128 bytes */ + const char* details; /* max 128 bytes */ + int64_t startTimestamp; + int64_t endTimestamp; + const char* largeImageKey; /* max 32 bytes */ + const char* largeImageText; /* max 128 bytes */ + const char* smallImageKey; /* max 32 bytes */ + const char* smallImageText; /* max 128 bytes */ + const char* partyId; /* max 128 bytes */ + int partySize; + int partyMax; + const char* matchSecret; /* max 128 bytes */ + const char* joinSecret; /* max 128 bytes */ + const char* spectateSecret; /* max 128 bytes */ + int8_t instance; +} DiscordRichPresence; + +typedef struct DiscordUser { + const char* userId; + const char* username; + const char* discriminator; + const char* avatar; +} DiscordUser; + +typedef struct DiscordEventHandlers { + void (*ready)(const DiscordUser* request); + void (*disconnected)(int errorCode, const char* message); + void (*errored)(int errorCode, const char* message); + void (*joinGame)(const char* joinSecret); + void (*spectateGame)(const char* spectateSecret); + void (*joinRequest)(const DiscordUser* request); +} DiscordEventHandlers; + +#define DISCORD_REPLY_NO 0 +#define DISCORD_REPLY_YES 1 +#define DISCORD_REPLY_IGNORE 2 + +DISCORD_EXPORT void Discord_Initialize(const char* applicationId, + DiscordEventHandlers* handlers, + int autoRegister, + const char* optionalSteamId); +DISCORD_EXPORT void Discord_Shutdown(void); + +/* checks for incoming messages, dispatches callbacks */ +DISCORD_EXPORT void Discord_RunCallbacks(void); + +/* If you disable the lib starting its own io thread, you'll need to call this from your own */ +#ifdef DISCORD_DISABLE_IO_THREAD +DISCORD_EXPORT void Discord_UpdateConnection(void); +#endif + +DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence* presence); +DISCORD_EXPORT void Discord_ClearPresence(void); + +DISCORD_EXPORT void Discord_Respond(const char* userid, /* DISCORD_REPLY_ */ int reply); + +DISCORD_EXPORT void Discord_UpdateHandlers(DiscordEventHandlers* handlers); + +#ifdef __cplusplus +} /* extern "C" */ +#endif diff --git a/3rdparty/discord-rpc/src/backoff.h b/3rdparty/discord-rpc/src/backoff.h new file mode 100644 index 0000000000..a3e736fb7b --- /dev/null +++ b/3rdparty/discord-rpc/src/backoff.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include +#include + +struct Backoff { + int64_t minAmount; + int64_t maxAmount; + int64_t current; + int fails; + std::mt19937_64 randGenerator; + std::uniform_real_distribution<> randDistribution; + + double rand01() { return randDistribution(randGenerator); } + + Backoff(int64_t min, int64_t max) + : minAmount(min) + , maxAmount(max) + , current(min) + , fails(0) + , randGenerator((uint64_t)time(0)) + { + } + + void reset() + { + fails = 0; + current = minAmount; + } + + int64_t nextDelay() + { + ++fails; + int64_t delay = (int64_t)((double)current * 2.0 * rand01()); + current = std::min(current + delay, maxAmount); + return current; + } +}; diff --git a/3rdparty/discord-rpc/src/connection.h b/3rdparty/discord-rpc/src/connection.h new file mode 100644 index 0000000000..a8f99b9f10 --- /dev/null +++ b/3rdparty/discord-rpc/src/connection.h @@ -0,0 +1,19 @@ +#pragma once + +// This is to wrap the platform specific kinds of connect/read/write. + +#include +#include + +// not really connectiony, but need per-platform +int GetProcessId(); + +struct BaseConnection { + static BaseConnection* Create(); + static void Destroy(BaseConnection*&); + bool isOpen{false}; + bool Open(); + bool Close(); + bool Write(const void* data, size_t length); + bool Read(void* data, size_t length); +}; diff --git a/3rdparty/discord-rpc/src/connection_unix.cpp b/3rdparty/discord-rpc/src/connection_unix.cpp new file mode 100644 index 0000000000..85dace3ccc --- /dev/null +++ b/3rdparty/discord-rpc/src/connection_unix.cpp @@ -0,0 +1,125 @@ +#include "connection.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +int GetProcessId() +{ + return ::getpid(); +} + +struct BaseConnectionUnix : public BaseConnection { + int sock{-1}; +}; + +static BaseConnectionUnix Connection; +static sockaddr_un PipeAddr{}; +#ifdef MSG_NOSIGNAL +static int MsgFlags = MSG_NOSIGNAL; +#else +static int MsgFlags = 0; +#endif + +static const char* GetTempPath() +{ + const char* temp = getenv("XDG_RUNTIME_DIR"); + temp = temp ? temp : getenv("TMPDIR"); + temp = temp ? temp : getenv("TMP"); + temp = temp ? temp : getenv("TEMP"); + temp = temp ? temp : "/tmp"; + return temp; +} + +/*static*/ BaseConnection* BaseConnection::Create() +{ + PipeAddr.sun_family = AF_UNIX; + return &Connection; +} + +/*static*/ void BaseConnection::Destroy(BaseConnection*& c) +{ + auto self = reinterpret_cast(c); + self->Close(); + c = nullptr; +} + +bool BaseConnection::Open() +{ + const char* tempPath = GetTempPath(); + auto self = reinterpret_cast(this); + self->sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (self->sock == -1) { + return false; + } + fcntl(self->sock, F_SETFL, O_NONBLOCK); +#ifdef SO_NOSIGPIPE + int optval = 1; + setsockopt(self->sock, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)); +#endif + + for (int pipeNum = 0; pipeNum < 10; ++pipeNum) { + snprintf( + PipeAddr.sun_path, sizeof(PipeAddr.sun_path), "%s/discord-ipc-%d", tempPath, pipeNum); + int err = connect(self->sock, (const sockaddr*)&PipeAddr, sizeof(PipeAddr)); + if (err == 0) { + self->isOpen = true; + return true; + } + } + self->Close(); + return false; +} + +bool BaseConnection::Close() +{ + auto self = reinterpret_cast(this); + if (self->sock == -1) { + return false; + } + close(self->sock); + self->sock = -1; + self->isOpen = false; + return true; +} + +bool BaseConnection::Write(const void* data, size_t length) +{ + auto self = reinterpret_cast(this); + + if (self->sock == -1) { + return false; + } + + ssize_t sentBytes = send(self->sock, data, length, MsgFlags); + if (sentBytes < 0) { + Close(); + } + return sentBytes == (ssize_t)length; +} + +bool BaseConnection::Read(void* data, size_t length) +{ + auto self = reinterpret_cast(this); + + if (self->sock == -1) { + return false; + } + + int res = (int)recv(self->sock, data, length, MsgFlags); + if (res < 0) { + if (errno == EAGAIN) { + return false; + } + Close(); + } + else if (res == 0) { + Close(); + } + return res == (int)length; +} diff --git a/3rdparty/discord-rpc/src/connection_win.cpp b/3rdparty/discord-rpc/src/connection_win.cpp new file mode 100644 index 0000000000..2dd2750c06 --- /dev/null +++ b/3rdparty/discord-rpc/src/connection_win.cpp @@ -0,0 +1,128 @@ +#include "connection.h" + +#define WIN32_LEAN_AND_MEAN +#define NOMCX +#define NOSERVICE +#define NOIME +#include +#include + +int GetProcessId() +{ + return (int)::GetCurrentProcessId(); +} + +struct BaseConnectionWin : public BaseConnection { + HANDLE pipe{INVALID_HANDLE_VALUE}; +}; + +static BaseConnectionWin Connection; + +/*static*/ BaseConnection* BaseConnection::Create() +{ + return &Connection; +} + +/*static*/ void BaseConnection::Destroy(BaseConnection*& c) +{ + auto self = reinterpret_cast(c); + self->Close(); + c = nullptr; +} + +bool BaseConnection::Open() +{ + wchar_t pipeName[]{L"\\\\?\\pipe\\discord-ipc-0"}; + const size_t pipeDigit = sizeof(pipeName) / sizeof(wchar_t) - 2; + pipeName[pipeDigit] = L'0'; + auto self = reinterpret_cast(this); + for (;;) { + self->pipe = ::CreateFileW( + pipeName, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr); + if (self->pipe != INVALID_HANDLE_VALUE) { + self->isOpen = true; + return true; + } + + auto lastError = GetLastError(); + if (lastError == ERROR_FILE_NOT_FOUND) { + if (pipeName[pipeDigit] < L'9') { + pipeName[pipeDigit]++; + continue; + } + } + else if (lastError == ERROR_PIPE_BUSY) { + if (!WaitNamedPipeW(pipeName, 10000)) { + return false; + } + continue; + } + return false; + } +} + +bool BaseConnection::Close() +{ + auto self = reinterpret_cast(this); + ::CloseHandle(self->pipe); + self->pipe = INVALID_HANDLE_VALUE; + self->isOpen = false; + return true; +} + +bool BaseConnection::Write(const void* data, size_t length) +{ + if (length == 0) { + return true; + } + auto self = reinterpret_cast(this); + assert(self); + if (!self) { + return false; + } + if (self->pipe == INVALID_HANDLE_VALUE) { + return false; + } + assert(data); + if (!data) { + return false; + } + const DWORD bytesLength = (DWORD)length; + DWORD bytesWritten = 0; + return ::WriteFile(self->pipe, data, bytesLength, &bytesWritten, nullptr) == TRUE && + bytesWritten == bytesLength; +} + +bool BaseConnection::Read(void* data, size_t length) +{ + assert(data); + if (!data) { + return false; + } + auto self = reinterpret_cast(this); + assert(self); + if (!self) { + return false; + } + if (self->pipe == INVALID_HANDLE_VALUE) { + return false; + } + DWORD bytesAvailable = 0; + if (::PeekNamedPipe(self->pipe, nullptr, 0, nullptr, &bytesAvailable, nullptr)) { + if (bytesAvailable >= length) { + DWORD bytesToRead = (DWORD)length; + DWORD bytesRead = 0; + if (::ReadFile(self->pipe, data, bytesToRead, &bytesRead, nullptr) == TRUE) { + assert(bytesToRead == bytesRead); + return true; + } + else { + Close(); + } + } + } + else { + Close(); + } + return false; +} diff --git a/3rdparty/discord-rpc/src/discord_register_linux.cpp b/3rdparty/discord-rpc/src/discord_register_linux.cpp new file mode 100644 index 0000000000..dd92eea0d4 --- /dev/null +++ b/3rdparty/discord-rpc/src/discord_register_linux.cpp @@ -0,0 +1,102 @@ +#include "discord_rpc.h" +#include "discord_register.h" +#include + +#include +#include +#include +#include +#include +#include + +static bool Mkdir(const char* path) +{ + int result = mkdir(path, 0755); + if (result == 0) { + return true; + } + if (errno == EEXIST) { + return true; + } + return false; +} + +// we want to register games so we can run them from Discord client as discord-:// +extern "C" DISCORD_EXPORT void Discord_Register(const char* applicationId, const char* command) +{ + // Add a desktop file and update some mime handlers so that xdg-open does the right thing. + + const char* home = getenv("HOME"); + if (!home) { + return; + } + + char exePath[1024]; + if (!command || !command[0]) { + ssize_t size = readlink("/proc/self/exe", exePath, sizeof(exePath)); + if (size <= 0 || size >= (ssize_t)sizeof(exePath)) { + return; + } + exePath[size] = '\0'; + command = exePath; + } + + const char* desktopFileFormat = "[Desktop Entry]\n" + "Name=Game %s\n" + "Exec=%s %%u\n" // note: it really wants that %u in there + "Type=Application\n" + "NoDisplay=true\n" + "Categories=Discord;Games;\n" + "MimeType=x-scheme-handler/discord-%s;\n"; + char desktopFile[2048]; + int fileLen = snprintf( + desktopFile, sizeof(desktopFile), desktopFileFormat, applicationId, command, applicationId); + if (fileLen <= 0) { + return; + } + + char desktopFilename[256]; + snprintf(desktopFilename, sizeof(desktopFilename), "/discord-%s.desktop", applicationId); + + char desktopFilePath[1024]; + snprintf(desktopFilePath, sizeof(desktopFilePath), "%s/.local", home); + if (!Mkdir(desktopFilePath)) { + return; + } + strcat(desktopFilePath, "/share"); + if (!Mkdir(desktopFilePath)) { + return; + } + strcat(desktopFilePath, "/applications"); + if (!Mkdir(desktopFilePath)) { + return; + } + strcat(desktopFilePath, desktopFilename); + + FILE* fp = fopen(desktopFilePath, "w"); + if (fp) { + fwrite(desktopFile, 1, fileLen, fp); + fclose(fp); + } + else { + return; + } + + char xdgMimeCommand[1024]; + snprintf(xdgMimeCommand, + sizeof(xdgMimeCommand), + "xdg-mime default discord-%s.desktop x-scheme-handler/discord-%s", + applicationId, + applicationId); + if (system(xdgMimeCommand) < 0) { + fprintf(stderr, "Failed to register mime handler\n"); + } +} + +extern "C" DISCORD_EXPORT void Discord_RegisterSteamGame(const char* applicationId, + const char* steamId) +{ + char command[256]; + sprintf(command, "xdg-open steam://rungameid/%s", steamId); + Discord_Register(applicationId, command); +} diff --git a/3rdparty/discord-rpc/src/discord_register_osx.m b/3rdparty/discord-rpc/src/discord_register_osx.m new file mode 100644 index 0000000000..d710102865 --- /dev/null +++ b/3rdparty/discord-rpc/src/discord_register_osx.m @@ -0,0 +1,80 @@ +#include +#include + +#import + +#include "discord_register.h" + +static void RegisterCommand(const char* applicationId, const char* command) +{ + // There does not appear to be a way to register arbitrary commands on OSX, so instead we'll save the command + // to a file in the Discord config path, and when it is needed, Discord can try to load the file there, open + // the command therein (will pass to js's window.open, so requires a url-like thing) + + // Note: will not work for sandboxed apps + NSString *home = NSHomeDirectory(); + if (!home) { + return; + } + + NSString *path = [[[[[[home stringByAppendingPathComponent:@"Library"] + stringByAppendingPathComponent:@"Application Support"] + stringByAppendingPathComponent:@"discord"] + stringByAppendingPathComponent:@"games"] + stringByAppendingPathComponent:[NSString stringWithUTF8String:applicationId]] + stringByAppendingPathExtension:@"json"]; + [[NSFileManager defaultManager] createDirectoryAtPath:[path stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil]; + + NSString *jsonBuffer = [NSString stringWithFormat:@"{\"command\": \"%s\"}", command]; + [jsonBuffer writeToFile:path atomically:NO encoding:NSUTF8StringEncoding error:nil]; +} + +static void RegisterURL(const char* applicationId) +{ + char url[256]; + snprintf(url, sizeof(url), "discord-%s", applicationId); + CFStringRef cfURL = CFStringCreateWithCString(NULL, url, kCFStringEncodingUTF8); + + NSString* myBundleId = [[NSBundle mainBundle] bundleIdentifier]; + if (!myBundleId) { + fprintf(stderr, "No bundle id found\n"); + return; + } + + NSURL* myURL = [[NSBundle mainBundle] bundleURL]; + if (!myURL) { + fprintf(stderr, "No bundle url found\n"); + return; + } + + OSStatus status = LSSetDefaultHandlerForURLScheme(cfURL, (__bridge CFStringRef)myBundleId); + if (status != noErr) { + fprintf(stderr, "Error in LSSetDefaultHandlerForURLScheme: %d\n", (int)status); + return; + } + + status = LSRegisterURL((__bridge CFURLRef)myURL, true); + if (status != noErr) { + fprintf(stderr, "Error in LSRegisterURL: %d\n", (int)status); + } +} + +void Discord_Register(const char* applicationId, const char* command) +{ + if (command) { + RegisterCommand(applicationId, command); + } + else { + // raii lite + @autoreleasepool { + RegisterURL(applicationId); + } + } +} + +void Discord_RegisterSteamGame(const char* applicationId, const char* steamId) +{ + char command[256]; + snprintf(command, 256, "steam://rungameid/%s", steamId); + Discord_Register(applicationId, command); +} diff --git a/3rdparty/discord-rpc/src/discord_register_win.cpp b/3rdparty/discord-rpc/src/discord_register_win.cpp new file mode 100644 index 0000000000..0b1c4a13da --- /dev/null +++ b/3rdparty/discord-rpc/src/discord_register_win.cpp @@ -0,0 +1,186 @@ +#include "discord_rpc.h" +#include "discord_register.h" + +#define WIN32_LEAN_AND_MEAN +#define NOMCX +#define NOSERVICE +#define NOIME +#include +#include +#include + +/** + * Updated fixes for MinGW and WinXP + * This block is written the way it does not involve changing the rest of the code + * Checked to be compiling + * 1) strsafe.h belongs to Windows SDK and cannot be added to MinGW + * #include guarded, functions redirected to substitutes + * 2) RegSetKeyValueW and LSTATUS are not declared in + * The entire function is rewritten + */ +#ifdef __MINGW32__ +#include +/// strsafe.h fixes +static HRESULT StringCbPrintfW(LPWSTR pszDest, size_t cbDest, LPCWSTR pszFormat, ...) +{ + HRESULT ret; + va_list va; + va_start(va, pszFormat); + cbDest /= 2; // Size is divided by 2 to convert from bytes to wide characters - causes segfault + // othervise + ret = vsnwprintf(pszDest, cbDest, pszFormat, va); + pszDest[cbDest - 1] = 0; // Terminate the string in case a buffer overflow; -1 will be returned + va_end(va); + return ret; +} +#else +#include +#include +#endif // __MINGW32__ + +/// winreg.h fixes +#ifndef LSTATUS +#define LSTATUS LONG +#endif +#ifdef RegSetKeyValueW +#undefine RegSetKeyValueW +#endif +#define RegSetKeyValueW regset +static LSTATUS regset(HKEY hkey, + LPCWSTR subkey, + LPCWSTR name, + DWORD type, + const void* data, + DWORD len) +{ + HKEY htkey = hkey, hsubkey = nullptr; + LSTATUS ret; + if (subkey && subkey[0]) { + if ((ret = RegCreateKeyExW(hkey, subkey, 0, 0, 0, KEY_ALL_ACCESS, 0, &hsubkey, 0)) != + ERROR_SUCCESS) + return ret; + htkey = hsubkey; + } + ret = RegSetValueExW(htkey, name, 0, type, (const BYTE*)data, len); + if (hsubkey && hsubkey != hkey) + RegCloseKey(hsubkey); + return ret; +} + +static void Discord_RegisterW(const wchar_t* applicationId, const wchar_t* command) +{ + // https://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx + // we want to register games so we can run them as discord-:// + // Update the HKEY_CURRENT_USER, because it doesn't seem to require special permissions. + + wchar_t exeFilePath[MAX_PATH]; + DWORD exeLen = GetModuleFileNameW(nullptr, exeFilePath, MAX_PATH); + wchar_t openCommand[1024]; + + if (command && command[0]) { + StringCbPrintfW(openCommand, sizeof(openCommand), L"%s", command); + } + else { + // StringCbCopyW(openCommand, sizeof(openCommand), exeFilePath); + StringCbPrintfW(openCommand, sizeof(openCommand), L"%s", exeFilePath); + } + + wchar_t protocolName[64]; + StringCbPrintfW(protocolName, sizeof(protocolName), L"discord-%s", applicationId); + wchar_t protocolDescription[128]; + StringCbPrintfW( + protocolDescription, sizeof(protocolDescription), L"URL:Run game %s protocol", applicationId); + wchar_t urlProtocol = 0; + + wchar_t keyName[256]; + StringCbPrintfW(keyName, sizeof(keyName), L"Software\\Classes\\%s", protocolName); + HKEY key; + auto status = + RegCreateKeyExW(HKEY_CURRENT_USER, keyName, 0, nullptr, 0, KEY_WRITE, nullptr, &key, nullptr); + if (status != ERROR_SUCCESS) { + fprintf(stderr, "Error creating key\n"); + return; + } + DWORD len; + LSTATUS result; + len = (DWORD)lstrlenW(protocolDescription) + 1; + result = + RegSetKeyValueW(key, nullptr, nullptr, REG_SZ, protocolDescription, len * sizeof(wchar_t)); + if (FAILED(result)) { + fprintf(stderr, "Error writing description\n"); + } + + len = (DWORD)lstrlenW(protocolDescription) + 1; + result = RegSetKeyValueW(key, nullptr, L"URL Protocol", REG_SZ, &urlProtocol, sizeof(wchar_t)); + if (FAILED(result)) { + fprintf(stderr, "Error writing description\n"); + } + + result = RegSetKeyValueW( + key, L"DefaultIcon", nullptr, REG_SZ, exeFilePath, (exeLen + 1) * sizeof(wchar_t)); + if (FAILED(result)) { + fprintf(stderr, "Error writing icon\n"); + } + + len = (DWORD)lstrlenW(openCommand) + 1; + result = RegSetKeyValueW( + key, L"shell\\open\\command", nullptr, REG_SZ, openCommand, len * sizeof(wchar_t)); + if (FAILED(result)) { + fprintf(stderr, "Error writing command\n"); + } + RegCloseKey(key); +} + +extern "C" DISCORD_EXPORT void Discord_Register(const char* applicationId, const char* command) +{ + wchar_t appId[32]; + MultiByteToWideChar(CP_UTF8, 0, applicationId, -1, appId, 32); + + wchar_t openCommand[1024]; + const wchar_t* wcommand = nullptr; + if (command && command[0]) { + const auto commandBufferLen = sizeof(openCommand) / sizeof(*openCommand); + MultiByteToWideChar(CP_UTF8, 0, command, -1, openCommand, commandBufferLen); + wcommand = openCommand; + } + + Discord_RegisterW(appId, wcommand); +} + +extern "C" DISCORD_EXPORT void Discord_RegisterSteamGame(const char* applicationId, + const char* steamId) +{ + wchar_t appId[32]; + MultiByteToWideChar(CP_UTF8, 0, applicationId, -1, appId, 32); + + wchar_t wSteamId[32]; + MultiByteToWideChar(CP_UTF8, 0, steamId, -1, wSteamId, 32); + + HKEY key; + auto status = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Valve\\Steam", 0, KEY_READ, &key); + if (status != ERROR_SUCCESS) { + fprintf(stderr, "Error opening Steam key\n"); + return; + } + + wchar_t steamPath[MAX_PATH]; + DWORD pathBytes = sizeof(steamPath); + status = RegQueryValueExW(key, L"SteamExe", nullptr, nullptr, (BYTE*)steamPath, &pathBytes); + RegCloseKey(key); + if (status != ERROR_SUCCESS || pathBytes < 1) { + fprintf(stderr, "Error reading SteamExe key\n"); + return; + } + + DWORD pathChars = pathBytes / sizeof(wchar_t); + for (DWORD i = 0; i < pathChars; ++i) { + if (steamPath[i] == L'/') { + steamPath[i] = L'\\'; + } + } + + wchar_t command[1024]; + StringCbPrintfW(command, sizeof(command), L"\"%s\" steam://rungameid/%s", steamPath, wSteamId); + + Discord_RegisterW(appId, command); +} diff --git a/3rdparty/discord-rpc/src/discord_rpc.cpp b/3rdparty/discord-rpc/src/discord_rpc.cpp new file mode 100644 index 0000000000..3eb2ec614f --- /dev/null +++ b/3rdparty/discord-rpc/src/discord_rpc.cpp @@ -0,0 +1,511 @@ +#include "discord_rpc.h" + +#include "backoff.h" +#include "discord_register.h" +#include "msg_queue.h" +#include "rpc_connection.h" +#include "serialization.h" + +#include +#include +#include + +#ifndef DISCORD_DISABLE_IO_THREAD +#include +#include +#endif + +constexpr size_t MaxMessageSize{16 * 1024}; +constexpr size_t MessageQueueSize{8}; +constexpr size_t JoinQueueSize{8}; + +struct QueuedMessage { + size_t length; + char buffer[MaxMessageSize]; + + void Copy(const QueuedMessage& other) + { + length = other.length; + if (length) { + memcpy(buffer, other.buffer, length); + } + } +}; + +struct User { + // snowflake (64bit int), turned into a ascii decimal string, at most 20 chars +1 null + // terminator = 21 + char userId[32]; + // 32 unicode glyphs is max name size => 4 bytes per glyph in the worst case, +1 for null + // terminator = 129 + char username[344]; + // 4 decimal digits + 1 null terminator = 5 + char discriminator[8]; + // optional 'a_' + md5 hex digest (32 bytes) + null terminator = 35 + char avatar[128]; + // Rounded way up because I'm paranoid about games breaking from future changes in these sizes +}; + +static RpcConnection* Connection{nullptr}; +static DiscordEventHandlers QueuedHandlers{}; +static DiscordEventHandlers Handlers{}; +static std::atomic_bool WasJustConnected{false}; +static std::atomic_bool WasJustDisconnected{false}; +static std::atomic_bool GotErrorMessage{false}; +static std::atomic_bool WasJoinGame{false}; +static std::atomic_bool WasSpectateGame{false}; +static std::atomic_bool UpdatePresence{false}; +static char JoinGameSecret[256]; +static char SpectateGameSecret[256]; +static int LastErrorCode{0}; +static char LastErrorMessage[256]; +static int LastDisconnectErrorCode{0}; +static char LastDisconnectErrorMessage[256]; +static std::mutex PresenceMutex; +static std::mutex HandlerMutex; +static QueuedMessage QueuedPresence{}; +static MsgQueue SendQueue; +static MsgQueue JoinAskQueue; +static User connectedUser; + +// We want to auto connect, and retry on failure, but not as fast as possible. This does expoential +// backoff from 0.5 seconds to 1 minute +static Backoff ReconnectTimeMs(500, 60 * 1000); +static auto NextConnect = std::chrono::system_clock::now(); +static int Pid{0}; +static int Nonce{1}; + +#ifndef DISCORD_DISABLE_IO_THREAD +static void Discord_UpdateConnection(void); +class IoThreadHolder { +private: + std::atomic_bool keepRunning{true}; + std::mutex waitForIOMutex; + std::condition_variable waitForIOActivity; + std::thread ioThread; + +public: + void Start() + { + keepRunning.store(true); + ioThread = std::thread([&]() { + const std::chrono::duration maxWait{500LL}; + Discord_UpdateConnection(); + while (keepRunning.load()) { + std::unique_lock lock(waitForIOMutex); + waitForIOActivity.wait_for(lock, maxWait); + Discord_UpdateConnection(); + } + }); + } + + void Notify() { waitForIOActivity.notify_all(); } + + void Stop() + { + keepRunning.exchange(false); + Notify(); + if (ioThread.joinable()) { + ioThread.join(); + } + } + + ~IoThreadHolder() { Stop(); } +}; +#else +class IoThreadHolder { +public: + void Start() {} + void Stop() {} + void Notify() {} +}; +#endif // DISCORD_DISABLE_IO_THREAD +static IoThreadHolder* IoThread{nullptr}; + +static void UpdateReconnectTime() +{ + NextConnect = std::chrono::system_clock::now() + + std::chrono::duration{ReconnectTimeMs.nextDelay()}; +} + +#ifdef DISCORD_DISABLE_IO_THREAD +extern "C" DISCORD_EXPORT void Discord_UpdateConnection(void) +#else +static void Discord_UpdateConnection(void) +#endif +{ + if (!Connection) { + return; + } + + if (!Connection->IsOpen()) { + if (std::chrono::system_clock::now() >= NextConnect) { + UpdateReconnectTime(); + Connection->Open(); + } + } + else { + // reads + + for (;;) { + JsonDocument message; + + if (!Connection->Read(message)) { + break; + } + + const char* evtName = GetStrMember(&message, "evt"); + const char* nonce = GetStrMember(&message, "nonce"); + + if (nonce) { + // in responses only -- should use to match up response when needed. + + if (evtName && strcmp(evtName, "ERROR") == 0) { + auto data = GetObjMember(&message, "data"); + LastErrorCode = GetIntMember(data, "code"); + StringCopy(LastErrorMessage, GetStrMember(data, "message", "")); + GotErrorMessage.store(true); + } + } + else { + // should have evt == name of event, optional data + if (evtName == nullptr) { + continue; + } + + auto data = GetObjMember(&message, "data"); + + if (strcmp(evtName, "ACTIVITY_JOIN") == 0) { + auto secret = GetStrMember(data, "secret"); + if (secret) { + StringCopy(JoinGameSecret, secret); + WasJoinGame.store(true); + } + } + else if (strcmp(evtName, "ACTIVITY_SPECTATE") == 0) { + auto secret = GetStrMember(data, "secret"); + if (secret) { + StringCopy(SpectateGameSecret, secret); + WasSpectateGame.store(true); + } + } + else if (strcmp(evtName, "ACTIVITY_JOIN_REQUEST") == 0) { + auto user = GetObjMember(data, "user"); + auto userId = GetStrMember(user, "id"); + auto username = GetStrMember(user, "username"); + auto avatar = GetStrMember(user, "avatar"); + auto joinReq = JoinAskQueue.GetNextAddMessage(); + if (userId && username && joinReq) { + StringCopy(joinReq->userId, userId); + StringCopy(joinReq->username, username); + auto discriminator = GetStrMember(user, "discriminator"); + if (discriminator) { + StringCopy(joinReq->discriminator, discriminator); + } + if (avatar) { + StringCopy(joinReq->avatar, avatar); + } + else { + joinReq->avatar[0] = 0; + } + JoinAskQueue.CommitAdd(); + } + } + } + } + + // writes + if (UpdatePresence.exchange(false) && QueuedPresence.length) { + QueuedMessage local; + { + std::lock_guard guard(PresenceMutex); + local.Copy(QueuedPresence); + } + if (!Connection->Write(local.buffer, local.length)) { + // if we fail to send, requeue + std::lock_guard guard(PresenceMutex); + QueuedPresence.Copy(local); + UpdatePresence.exchange(true); + } + } + + while (SendQueue.HavePendingSends()) { + auto qmessage = SendQueue.GetNextSendMessage(); + Connection->Write(qmessage->buffer, qmessage->length); + SendQueue.CommitSend(); + } + } +} + +static void SignalIOActivity() +{ + if (IoThread != nullptr) { + IoThread->Notify(); + } +} + +static bool RegisterForEvent(const char* evtName) +{ + auto qmessage = SendQueue.GetNextAddMessage(); + if (qmessage) { + qmessage->length = + JsonWriteSubscribeCommand(qmessage->buffer, sizeof(qmessage->buffer), Nonce++, evtName); + SendQueue.CommitAdd(); + SignalIOActivity(); + return true; + } + return false; +} + +static bool DeregisterForEvent(const char* evtName) +{ + auto qmessage = SendQueue.GetNextAddMessage(); + if (qmessage) { + qmessage->length = + JsonWriteUnsubscribeCommand(qmessage->buffer, sizeof(qmessage->buffer), Nonce++, evtName); + SendQueue.CommitAdd(); + SignalIOActivity(); + return true; + } + return false; +} + +extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, + DiscordEventHandlers* handlers, + int autoRegister, + const char* optionalSteamId) +{ + IoThread = new (std::nothrow) IoThreadHolder(); + if (IoThread == nullptr) { + return; + } + + if (autoRegister) { + if (optionalSteamId && optionalSteamId[0]) { + Discord_RegisterSteamGame(applicationId, optionalSteamId); + } + else { + Discord_Register(applicationId, nullptr); + } + } + + Pid = GetProcessId(); + + { + std::lock_guard guard(HandlerMutex); + + if (handlers) { + QueuedHandlers = *handlers; + } + else { + QueuedHandlers = {}; + } + + Handlers = {}; + } + + if (Connection) { + return; + } + + Connection = RpcConnection::Create(applicationId); + Connection->onConnect = [](JsonDocument& readyMessage) { + Discord_UpdateHandlers(&QueuedHandlers); + if (QueuedPresence.length > 0) { + UpdatePresence.exchange(true); + SignalIOActivity(); + } + auto data = GetObjMember(&readyMessage, "data"); + auto user = GetObjMember(data, "user"); + auto userId = GetStrMember(user, "id"); + auto username = GetStrMember(user, "username"); + auto avatar = GetStrMember(user, "avatar"); + if (userId && username) { + StringCopy(connectedUser.userId, userId); + StringCopy(connectedUser.username, username); + auto discriminator = GetStrMember(user, "discriminator"); + if (discriminator) { + StringCopy(connectedUser.discriminator, discriminator); + } + if (avatar) { + StringCopy(connectedUser.avatar, avatar); + } + else { + connectedUser.avatar[0] = 0; + } + } + WasJustConnected.exchange(true); + ReconnectTimeMs.reset(); + }; + Connection->onDisconnect = [](int err, const char* message) { + LastDisconnectErrorCode = err; + StringCopy(LastDisconnectErrorMessage, message); + WasJustDisconnected.exchange(true); + UpdateReconnectTime(); + }; + + IoThread->Start(); +} + +extern "C" DISCORD_EXPORT void Discord_Shutdown(void) +{ + if (!Connection) { + return; + } + Connection->onConnect = nullptr; + Connection->onDisconnect = nullptr; + Handlers = {}; + if (IoThread != nullptr) { + IoThread->Stop(); + delete IoThread; + IoThread = nullptr; + } + + // HACK: We need to send the updated (cleared) presence, but we're shutting down. + // Force an update, wait 100ms for it to clear (hopefully this will be long enough), and get any responses. + Discord_UpdateConnection(); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + Discord_UpdateConnection(); + + QueuedPresence.length = 0; + UpdatePresence.exchange(false); + + RpcConnection::Destroy(Connection); +} + +extern "C" DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence* presence) +{ + { + std::lock_guard guard(PresenceMutex); + QueuedPresence.length = JsonWriteRichPresenceObj( + QueuedPresence.buffer, sizeof(QueuedPresence.buffer), Nonce++, Pid, presence); + UpdatePresence.exchange(true); + } + SignalIOActivity(); +} + +extern "C" DISCORD_EXPORT void Discord_ClearPresence(void) +{ + Discord_UpdatePresence(nullptr); +} + +extern "C" DISCORD_EXPORT void Discord_Respond(const char* userId, /* DISCORD_REPLY_ */ int reply) +{ + // if we are not connected, let's not batch up stale messages for later + if (!Connection || !Connection->IsOpen()) { + return; + } + auto qmessage = SendQueue.GetNextAddMessage(); + if (qmessage) { + qmessage->length = + JsonWriteJoinReply(qmessage->buffer, sizeof(qmessage->buffer), userId, reply, Nonce++); + SendQueue.CommitAdd(); + SignalIOActivity(); + } +} + +extern "C" DISCORD_EXPORT void Discord_RunCallbacks(void) +{ + // Note on some weirdness: internally we might connect, get other signals, disconnect any number + // of times inbetween calls here. Externally, we want the sequence to seem sane, so any other + // signals are book-ended by calls to ready and disconnect. + + if (!Connection) { + return; + } + + bool wasDisconnected = WasJustDisconnected.exchange(false); + bool isConnected = Connection->IsOpen(); + + if (isConnected) { + // if we are connected, disconnect cb first + std::lock_guard guard(HandlerMutex); + if (wasDisconnected && Handlers.disconnected) { + Handlers.disconnected(LastDisconnectErrorCode, LastDisconnectErrorMessage); + } + } + + if (WasJustConnected.exchange(false)) { + std::lock_guard guard(HandlerMutex); + if (Handlers.ready) { + DiscordUser du{connectedUser.userId, + connectedUser.username, + connectedUser.discriminator, + connectedUser.avatar}; + Handlers.ready(&du); + } + } + + if (GotErrorMessage.exchange(false)) { + std::lock_guard guard(HandlerMutex); + if (Handlers.errored) { + Handlers.errored(LastErrorCode, LastErrorMessage); + } + } + + if (WasJoinGame.exchange(false)) { + std::lock_guard guard(HandlerMutex); + if (Handlers.joinGame) { + Handlers.joinGame(JoinGameSecret); + } + } + + if (WasSpectateGame.exchange(false)) { + std::lock_guard guard(HandlerMutex); + if (Handlers.spectateGame) { + Handlers.spectateGame(SpectateGameSecret); + } + } + + // Right now this batches up any requests and sends them all in a burst; I could imagine a world + // where the implementer would rather sequentially accept/reject each one before the next invite + // is sent. I left it this way because I could also imagine wanting to process these all and + // maybe show them in one common dialog and/or start fetching the avatars in parallel, and if + // not it should be trivial for the implementer to make a queue themselves. + while (JoinAskQueue.HavePendingSends()) { + auto req = JoinAskQueue.GetNextSendMessage(); + { + std::lock_guard guard(HandlerMutex); + if (Handlers.joinRequest) { + DiscordUser du{req->userId, req->username, req->discriminator, req->avatar}; + Handlers.joinRequest(&du); + } + } + JoinAskQueue.CommitSend(); + } + + if (!isConnected) { + // if we are not connected, disconnect message last + std::lock_guard guard(HandlerMutex); + if (wasDisconnected && Handlers.disconnected) { + Handlers.disconnected(LastDisconnectErrorCode, LastDisconnectErrorMessage); + } + } +} + +extern "C" DISCORD_EXPORT void Discord_UpdateHandlers(DiscordEventHandlers* newHandlers) +{ + if (newHandlers) { +#define HANDLE_EVENT_REGISTRATION(handler_name, event) \ + if (!Handlers.handler_name && newHandlers->handler_name) { \ + RegisterForEvent(event); \ + } \ + else if (Handlers.handler_name && !newHandlers->handler_name) { \ + DeregisterForEvent(event); \ + } + + std::lock_guard guard(HandlerMutex); + HANDLE_EVENT_REGISTRATION(joinGame, "ACTIVITY_JOIN") + HANDLE_EVENT_REGISTRATION(spectateGame, "ACTIVITY_SPECTATE") + HANDLE_EVENT_REGISTRATION(joinRequest, "ACTIVITY_JOIN_REQUEST") + +#undef HANDLE_EVENT_REGISTRATION + + Handlers = *newHandlers; + } + else { + std::lock_guard guard(HandlerMutex); + Handlers = {}; + } + return; +} diff --git a/3rdparty/discord-rpc/src/dllmain.cpp b/3rdparty/discord-rpc/src/dllmain.cpp new file mode 100644 index 0000000000..fbfc2950d7 --- /dev/null +++ b/3rdparty/discord-rpc/src/dllmain.cpp @@ -0,0 +1,8 @@ +#include + +// outsmart GCC's missing-declarations warning +BOOL WINAPI DllMain(HMODULE, DWORD, LPVOID); +BOOL WINAPI DllMain(HMODULE, DWORD, LPVOID) +{ + return TRUE; +} diff --git a/3rdparty/discord-rpc/src/msg_queue.h b/3rdparty/discord-rpc/src/msg_queue.h new file mode 100644 index 0000000000..77f380e705 --- /dev/null +++ b/3rdparty/discord-rpc/src/msg_queue.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +// A simple queue. No locks, but only works with a single thread as producer and a single thread as +// a consumer. Mutex up as needed. + +template +class MsgQueue { + ElementType queue_[QueueSize]; + std::atomic_uint nextAdd_{0}; + std::atomic_uint nextSend_{0}; + std::atomic_uint pendingSends_{0}; + +public: + MsgQueue() {} + + ElementType* GetNextAddMessage() + { + // if we are falling behind, bail + if (pendingSends_.load() >= QueueSize) { + return nullptr; + } + auto index = (nextAdd_++) % QueueSize; + return &queue_[index]; + } + void CommitAdd() { ++pendingSends_; } + + bool HavePendingSends() const { return pendingSends_.load() != 0; } + ElementType* GetNextSendMessage() + { + auto index = (nextSend_++) % QueueSize; + return &queue_[index]; + } + void CommitSend() { --pendingSends_; } +}; diff --git a/3rdparty/discord-rpc/src/rpc_connection.cpp b/3rdparty/discord-rpc/src/rpc_connection.cpp new file mode 100644 index 0000000000..0933162169 --- /dev/null +++ b/3rdparty/discord-rpc/src/rpc_connection.cpp @@ -0,0 +1,137 @@ +#include "rpc_connection.h" +#include "serialization.h" + +#include + +static const int RpcVersion = 1; +static RpcConnection Instance; + +/*static*/ RpcConnection* RpcConnection::Create(const char* applicationId) +{ + Instance.connection = BaseConnection::Create(); + StringCopy(Instance.appId, applicationId); + return &Instance; +} + +/*static*/ void RpcConnection::Destroy(RpcConnection*& c) +{ + c->Close(); + BaseConnection::Destroy(c->connection); + c = nullptr; +} + +void RpcConnection::Open() +{ + if (state == State::Connected) { + return; + } + + if (state == State::Disconnected && !connection->Open()) { + return; + } + + if (state == State::SentHandshake) { + JsonDocument message; + if (Read(message)) { + auto cmd = GetStrMember(&message, "cmd"); + auto evt = GetStrMember(&message, "evt"); + if (cmd && evt && !strcmp(cmd, "DISPATCH") && !strcmp(evt, "READY")) { + state = State::Connected; + if (onConnect) { + onConnect(message); + } + } + } + } + else { + sendFrame.opcode = Opcode::Handshake; + sendFrame.length = (uint32_t)JsonWriteHandshakeObj( + sendFrame.message, sizeof(sendFrame.message), RpcVersion, appId); + + if (connection->Write(&sendFrame, sizeof(MessageFrameHeader) + sendFrame.length)) { + state = State::SentHandshake; + } + else { + Close(); + } + } +} + +void RpcConnection::Close() +{ + if (onDisconnect && (state == State::Connected || state == State::SentHandshake)) { + onDisconnect(lastErrorCode, lastErrorMessage); + } + connection->Close(); + state = State::Disconnected; +} + +bool RpcConnection::Write(const void* data, size_t length) +{ + sendFrame.opcode = Opcode::Frame; + memcpy(sendFrame.message, data, length); + sendFrame.length = (uint32_t)length; + if (!connection->Write(&sendFrame, sizeof(MessageFrameHeader) + length)) { + Close(); + return false; + } + return true; +} + +bool RpcConnection::Read(JsonDocument& message) +{ + if (state != State::Connected && state != State::SentHandshake) { + return false; + } + MessageFrame readFrame; + for (;;) { + bool didRead = connection->Read(&readFrame, sizeof(MessageFrameHeader)); + if (!didRead) { + if (!connection->isOpen) { + lastErrorCode = (int)ErrorCode::PipeClosed; + StringCopy(lastErrorMessage, "Pipe closed"); + Close(); + } + return false; + } + + if (readFrame.length > 0) { + didRead = connection->Read(readFrame.message, readFrame.length); + if (!didRead) { + lastErrorCode = (int)ErrorCode::ReadCorrupt; + StringCopy(lastErrorMessage, "Partial data in frame"); + Close(); + return false; + } + readFrame.message[readFrame.length] = 0; + } + + switch (readFrame.opcode) { + case Opcode::Close: { + message.ParseInsitu(readFrame.message); + lastErrorCode = GetIntMember(&message, "code"); + StringCopy(lastErrorMessage, GetStrMember(&message, "message", "")); + Close(); + return false; + } + case Opcode::Frame: + message.ParseInsitu(readFrame.message); + return true; + case Opcode::Ping: + readFrame.opcode = Opcode::Pong; + if (!connection->Write(&readFrame, sizeof(MessageFrameHeader) + readFrame.length)) { + Close(); + } + break; + case Opcode::Pong: + break; + case Opcode::Handshake: + default: + // something bad happened + lastErrorCode = (int)ErrorCode::ReadCorrupt; + StringCopy(lastErrorMessage, "Bad ipc frame"); + Close(); + return false; + } + } +} diff --git a/3rdparty/discord-rpc/src/rpc_connection.h b/3rdparty/discord-rpc/src/rpc_connection.h new file mode 100644 index 0000000000..bbdd05c792 --- /dev/null +++ b/3rdparty/discord-rpc/src/rpc_connection.h @@ -0,0 +1,59 @@ +#pragma once + +#include "connection.h" +#include "serialization.h" + +// I took this from the buffer size libuv uses for named pipes; I suspect ours would usually be much +// smaller. +constexpr size_t MaxRpcFrameSize = 64 * 1024; + +struct RpcConnection { + enum class ErrorCode : int { + Success = 0, + PipeClosed = 1, + ReadCorrupt = 2, + }; + + enum class Opcode : uint32_t { + Handshake = 0, + Frame = 1, + Close = 2, + Ping = 3, + Pong = 4, + }; + + struct MessageFrameHeader { + Opcode opcode; + uint32_t length; + }; + + struct MessageFrame : public MessageFrameHeader { + char message[MaxRpcFrameSize - sizeof(MessageFrameHeader)]; + }; + + enum class State : uint32_t { + Disconnected, + SentHandshake, + AwaitingResponse, + Connected, + }; + + BaseConnection* connection{nullptr}; + State state{State::Disconnected}; + void (*onConnect)(JsonDocument& message){nullptr}; + void (*onDisconnect)(int errorCode, const char* message){nullptr}; + char appId[64]{}; + int lastErrorCode{0}; + char lastErrorMessage[256]{}; + RpcConnection::MessageFrame sendFrame; + + static RpcConnection* Create(const char* applicationId); + static void Destroy(RpcConnection*&); + + inline bool IsOpen() const { return state == State::Connected; } + + void Open(); + void Close(); + bool Write(const void* data, size_t length); + bool Read(JsonDocument& message); +}; diff --git a/3rdparty/discord-rpc/src/serialization.cpp b/3rdparty/discord-rpc/src/serialization.cpp new file mode 100644 index 0000000000..6cc1e9013d --- /dev/null +++ b/3rdparty/discord-rpc/src/serialization.cpp @@ -0,0 +1,245 @@ +#include "serialization.h" +#include "connection.h" +#include "discord_rpc.h" + +template +void NumberToString(char* dest, T number) +{ + if (!number) { + *dest++ = '0'; + *dest++ = 0; + return; + } + if (number < 0) { + *dest++ = '-'; + number = -number; + } + char temp[32]; + int place = 0; + while (number) { + auto digit = number % 10; + number = number / 10; + temp[place++] = '0' + (char)digit; + } + for (--place; place >= 0; --place) { + *dest++ = temp[place]; + } + *dest = 0; +} + +// it's ever so slightly faster to not have to strlen the key +template +void WriteKey(JsonWriter& w, T& k) +{ + w.Key(k, sizeof(T) - 1); +} + +struct WriteObject { + JsonWriter& writer; + WriteObject(JsonWriter& w) + : writer(w) + { + writer.StartObject(); + } + template + WriteObject(JsonWriter& w, T& name) + : writer(w) + { + WriteKey(writer, name); + writer.StartObject(); + } + ~WriteObject() { writer.EndObject(); } +}; + +struct WriteArray { + JsonWriter& writer; + template + WriteArray(JsonWriter& w, T& name) + : writer(w) + { + WriteKey(writer, name); + writer.StartArray(); + } + ~WriteArray() { writer.EndArray(); } +}; + +template +void WriteOptionalString(JsonWriter& w, T& k, const char* value) +{ + if (value && value[0]) { + w.Key(k, sizeof(T) - 1); + w.String(value); + } +} + +static void JsonWriteNonce(JsonWriter& writer, int nonce) +{ + WriteKey(writer, "nonce"); + char nonceBuffer[32]; + NumberToString(nonceBuffer, nonce); + writer.String(nonceBuffer); +} + +size_t JsonWriteRichPresenceObj(char* dest, + size_t maxLen, + int nonce, + int pid, + const DiscordRichPresence* presence) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject top(writer); + + JsonWriteNonce(writer, nonce); + + WriteKey(writer, "cmd"); + writer.String("SET_ACTIVITY"); + + { + WriteObject args(writer, "args"); + + WriteKey(writer, "pid"); + writer.Int(pid); + + if (presence != nullptr) { + WriteObject activity(writer, "activity"); + + WriteOptionalString(writer, "state", presence->state); + WriteOptionalString(writer, "details", presence->details); + + if (presence->startTimestamp || presence->endTimestamp) { + WriteObject timestamps(writer, "timestamps"); + + if (presence->startTimestamp) { + WriteKey(writer, "start"); + writer.Int64(presence->startTimestamp); + } + + if (presence->endTimestamp) { + WriteKey(writer, "end"); + writer.Int64(presence->endTimestamp); + } + } + + if ((presence->largeImageKey && presence->largeImageKey[0]) || + (presence->largeImageText && presence->largeImageText[0]) || + (presence->smallImageKey && presence->smallImageKey[0]) || + (presence->smallImageText && presence->smallImageText[0])) { + WriteObject assets(writer, "assets"); + WriteOptionalString(writer, "large_image", presence->largeImageKey); + WriteOptionalString(writer, "large_text", presence->largeImageText); + WriteOptionalString(writer, "small_image", presence->smallImageKey); + WriteOptionalString(writer, "small_text", presence->smallImageText); + } + + if ((presence->partyId && presence->partyId[0]) || presence->partySize || + presence->partyMax) { + WriteObject party(writer, "party"); + WriteOptionalString(writer, "id", presence->partyId); + if (presence->partySize && presence->partyMax) { + WriteArray size(writer, "size"); + writer.Int(presence->partySize); + writer.Int(presence->partyMax); + } + } + + if ((presence->matchSecret && presence->matchSecret[0]) || + (presence->joinSecret && presence->joinSecret[0]) || + (presence->spectateSecret && presence->spectateSecret[0])) { + WriteObject secrets(writer, "secrets"); + WriteOptionalString(writer, "match", presence->matchSecret); + WriteOptionalString(writer, "join", presence->joinSecret); + WriteOptionalString(writer, "spectate", presence->spectateSecret); + } + + writer.Key("instance"); + writer.Bool(presence->instance != 0); + } + } + } + + return writer.Size(); +} + +size_t JsonWriteHandshakeObj(char* dest, size_t maxLen, int version, const char* applicationId) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject obj(writer); + WriteKey(writer, "v"); + writer.Int(version); + WriteKey(writer, "client_id"); + writer.String(applicationId); + } + + return writer.Size(); +} + +size_t JsonWriteSubscribeCommand(char* dest, size_t maxLen, int nonce, const char* evtName) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject obj(writer); + + JsonWriteNonce(writer, nonce); + + WriteKey(writer, "cmd"); + writer.String("SUBSCRIBE"); + + WriteKey(writer, "evt"); + writer.String(evtName); + } + + return writer.Size(); +} + +size_t JsonWriteUnsubscribeCommand(char* dest, size_t maxLen, int nonce, const char* evtName) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject obj(writer); + + JsonWriteNonce(writer, nonce); + + WriteKey(writer, "cmd"); + writer.String("UNSUBSCRIBE"); + + WriteKey(writer, "evt"); + writer.String(evtName); + } + + return writer.Size(); +} + +size_t JsonWriteJoinReply(char* dest, size_t maxLen, const char* userId, int reply, int nonce) +{ + JsonWriter writer(dest, maxLen); + + { + WriteObject obj(writer); + + WriteKey(writer, "cmd"); + if (reply == DISCORD_REPLY_YES) { + writer.String("SEND_ACTIVITY_JOIN_INVITE"); + } + else { + writer.String("CLOSE_ACTIVITY_JOIN_REQUEST"); + } + + WriteKey(writer, "args"); + { + WriteObject args(writer); + + WriteKey(writer, "user_id"); + writer.String(userId); + } + + JsonWriteNonce(writer, nonce); + } + + return writer.Size(); +} diff --git a/3rdparty/discord-rpc/src/serialization.h b/3rdparty/discord-rpc/src/serialization.h new file mode 100644 index 0000000000..9c462dc283 --- /dev/null +++ b/3rdparty/discord-rpc/src/serialization.h @@ -0,0 +1,215 @@ +#pragma once + +#include + +#ifndef __MINGW32__ +#pragma warning(push) + +#pragma warning(disable : 4061) // enum is not explicitly handled by a case label +#pragma warning(disable : 4365) // signed/unsigned mismatch +#pragma warning(disable : 4464) // relative include path contains +#pragma warning(disable : 4668) // is not defined as a preprocessor macro +#pragma warning(disable : 6313) // Incorrect operator +#endif // __MINGW32__ + +#include "rapidjson/document.h" +#include "rapidjson/stringbuffer.h" +#include "rapidjson/writer.h" + +#ifndef __MINGW32__ +#pragma warning(pop) +#endif // __MINGW32__ + +// if only there was a standard library function for this +template +inline size_t StringCopy(char (&dest)[Len], const char* src) +{ + if (!src || !Len) { + return 0; + } + size_t copied; + char* out = dest; + for (copied = 1; *src && copied < Len; ++copied) { + *out++ = *src++; + } + *out = 0; + return copied - 1; +} + +size_t JsonWriteHandshakeObj(char* dest, size_t maxLen, int version, const char* applicationId); + +// Commands +struct DiscordRichPresence; +size_t JsonWriteRichPresenceObj(char* dest, + size_t maxLen, + int nonce, + int pid, + const DiscordRichPresence* presence); +size_t JsonWriteSubscribeCommand(char* dest, size_t maxLen, int nonce, const char* evtName); + +size_t JsonWriteUnsubscribeCommand(char* dest, size_t maxLen, int nonce, const char* evtName); + +size_t JsonWriteJoinReply(char* dest, size_t maxLen, const char* userId, int reply, int nonce); + +// I want to use as few allocations as I can get away with, and to do that with RapidJson, you need +// to supply some of your own allocators for stuff rather than use the defaults + +class LinearAllocator { +public: + char* buffer_; + char* end_; + LinearAllocator() + { + assert(0); // needed for some default case in rapidjson, should not use + } + LinearAllocator(char* buffer, size_t size) + : buffer_(buffer) + , end_(buffer + size) + { + } + static const bool kNeedFree = false; + void* Malloc(size_t size) + { + char* res = buffer_; + buffer_ += size; + if (buffer_ > end_) { + buffer_ = res; + return nullptr; + } + return res; + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) + { + if (newSize == 0) { + return nullptr; + } + // allocate how much you need in the first place + assert(!originalPtr && !originalSize); + // unused parameter warning + (void)(originalPtr); + (void)(originalSize); + return Malloc(newSize); + } + static void Free(void* ptr) + { + /* shrug */ + (void)ptr; + } +}; + +template +class FixedLinearAllocator : public LinearAllocator { +public: + char fixedBuffer_[Size]; + FixedLinearAllocator() + : LinearAllocator(fixedBuffer_, Size) + { + } + static const bool kNeedFree = false; +}; + +// wonder why this isn't a thing already, maybe I missed it +class DirectStringBuffer { +public: + using Ch = char; + char* buffer_; + char* end_; + char* current_; + + DirectStringBuffer(char* buffer, size_t maxLen) + : buffer_(buffer) + , end_(buffer + maxLen) + , current_(buffer) + { + } + + void Put(char c) + { + if (current_ < end_) { + *current_++ = c; + } + } + void Flush() {} + size_t GetSize() const { return (size_t)(current_ - buffer_); } +}; + +using MallocAllocator = rapidjson::CrtAllocator; +using PoolAllocator = rapidjson::MemoryPoolAllocator; +using UTF8 = rapidjson::UTF8; +// Writer appears to need about 16 bytes per nested object level (with 64bit size_t) +using StackAllocator = FixedLinearAllocator<2048>; +constexpr size_t WriterNestingLevels = 2048 / (2 * sizeof(size_t)); +using JsonWriterBase = + rapidjson::Writer; +class JsonWriter : public JsonWriterBase { +public: + DirectStringBuffer stringBuffer_; + StackAllocator stackAlloc_; + + JsonWriter(char* dest, size_t maxLen) + : JsonWriterBase(stringBuffer_, &stackAlloc_, WriterNestingLevels) + , stringBuffer_(dest, maxLen) + , stackAlloc_() + { + } + + size_t Size() const { return stringBuffer_.GetSize(); } +}; + +using JsonDocumentBase = rapidjson::GenericDocument; +class JsonDocument : public JsonDocumentBase { +public: + static const int kDefaultChunkCapacity = 32 * 1024; + // json parser will use this buffer first, then allocate more if needed; I seriously doubt we + // send any messages that would use all of this, though. + char parseBuffer_[32 * 1024]; + MallocAllocator mallocAllocator_; + PoolAllocator poolAllocator_; + StackAllocator stackAllocator_; + JsonDocument() + : JsonDocumentBase(rapidjson::kObjectType, + &poolAllocator_, + sizeof(stackAllocator_.fixedBuffer_), + &stackAllocator_) + , poolAllocator_(parseBuffer_, sizeof(parseBuffer_), kDefaultChunkCapacity, &mallocAllocator_) + , stackAllocator_() + { + } +}; + +using JsonValue = rapidjson::GenericValue; + +inline JsonValue* GetObjMember(JsonValue* obj, const char* name) +{ + if (obj) { + auto member = obj->FindMember(name); + if (member != obj->MemberEnd() && member->value.IsObject()) { + return &member->value; + } + } + return nullptr; +} + +inline int GetIntMember(JsonValue* obj, const char* name, int notFoundDefault = 0) +{ + if (obj) { + auto member = obj->FindMember(name); + if (member != obj->MemberEnd() && member->value.IsInt()) { + return member->value.GetInt(); + } + } + return notFoundDefault; +} + +inline const char* GetStrMember(JsonValue* obj, + const char* name, + const char* notFoundDefault = nullptr) +{ + if (obj) { + auto member = obj->FindMember(name); + if (member != obj->MemberEnd() && member->value.IsString()) { + return member->value.GetString(); + } + } + return notFoundDefault; +} diff --git a/3rdparty/imgui/CMakeLists.txt b/3rdparty/imgui/CMakeLists.txt index 00099b2e9e..cb91058e51 100644 --- a/3rdparty/imgui/CMakeLists.txt +++ b/3rdparty/imgui/CMakeLists.txt @@ -1,18 +1,21 @@ add_library(imgui - imgui/imconfig.h - imgui/imgui.cpp - imgui/imgui.h - imgui/imgui_demo.cpp - imgui/imgui_draw.cpp - imgui/imgui_internal.h - imgui/imgui_tables.cpp - imgui/imgui_widgets.cpp - imgui/imstb_rectpack.h - imgui/imstb_textedit.h - imgui/imstb_truetype.h + include/imconfig.h + include/imgui.h + include/imgui_internal.h + include/imgui_stdlib.h + include/imstb_textedit.h + src/imgui.cpp + src/imgui_demo.cpp + src/imgui_draw.cpp + src/imgui_tables.cpp + src/imgui_widgets.cpp + src/imstb_rectpack.h + src/imstb_truetype.h + src/imgui_stdlib.cpp ) -target_include_directories(imgui PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/imgui" "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_include_directories(imgui PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_include_directories(imgui PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src") # Needed for macOS compile. set_property(TARGET imgui PROPERTY CXX_STANDARD 17) diff --git a/3rdparty/imgui/imgui b/3rdparty/imgui/imgui deleted file mode 160000 index 60bea052a9..0000000000 --- a/3rdparty/imgui/imgui +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 60bea052a92cbb4a93b221002fdf04f0da3698e1 diff --git a/3rdparty/imgui/imgui.vcxproj b/3rdparty/imgui/imgui.vcxproj index 0b7aa56aed..93dae833e7 100644 --- a/3rdparty/imgui/imgui.vcxproj +++ b/3rdparty/imgui/imgui.vcxproj @@ -32,7 +32,7 @@ %(PreprocessorDefinitions) TurnOffAllWarnings - $(SolutionDir)3rdparty\glad\include;$(ProjectDir)imgui;$(ProjectDir)include;$(ProjectDir)src;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\glad\include;$(ProjectDir)include;$(ProjectDir)src;%(AdditionalIncludeDirectories) @@ -41,19 +41,21 @@ - - - - - - + + + + + + + - - - - - + + + + + + diff --git a/3rdparty/imgui/imgui.vcxproj.filters b/3rdparty/imgui/imgui.vcxproj.filters index 76a5974718..7fc9569998 100644 --- a/3rdparty/imgui/imgui.vcxproj.filters +++ b/3rdparty/imgui/imgui.vcxproj.filters @@ -1,18 +1,20 @@  - - - - - - + + + + + + + - - - - - + + + + + + \ No newline at end of file diff --git a/3rdparty/imgui/include/imconfig.h b/3rdparty/imgui/include/imconfig.h new file mode 100644 index 0000000000..9a2aca4bba --- /dev/null +++ b/3rdparty/imgui/include/imconfig.h @@ -0,0 +1,125 @@ +//----------------------------------------------------------------------------- +// COMPILE-TIME OPTIONS FOR DEAR IMGUI +// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure. +// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions. +//----------------------------------------------------------------------------- +// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it) +// B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template. +//----------------------------------------------------------------------------- +// You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp +// files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures. +// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts. +// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using. +//----------------------------------------------------------------------------- + +#pragma once + +//---- Define assertion handler. Defaults to calling assert(). +// If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement. +//#define IM_ASSERT(_EXPR) MyAssert(_EXPR) +//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts + +//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows +// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility. +// DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() +// for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details. +//#define IMGUI_API __declspec( dllexport ) +//#define IMGUI_API __declspec( dllimport ) + +//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names. +//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS +//#define IMGUI_DISABLE_OBSOLETE_KEYIO // 1.87: disable legacy io.KeyMap[]+io.KeysDown[] in favor io.AddKeyEvent(). This will be folded into IMGUI_DISABLE_OBSOLETE_FUNCTIONS in a few versions. + +//---- Disable all of Dear ImGui or don't implement standard windows. +// It is very strongly recommended to NOT disable the demo windows during development. Please read comments in imgui_demo.cpp. +//#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty. +//#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. Not recommended. +//#define IMGUI_DISABLE_METRICS_WINDOW // Disable metrics/debugger and other debug tools: ShowMetricsWindow() and ShowStackToolWindow() will be empty. + +//---- Don't implement some functions to reduce linkage requirements. +//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a) +//#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW) +//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a) +//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime). +//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default). +//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf) +//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself. +//#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies) +//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function. +//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions(). +//#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available + +//---- Include imgui_user.h at the end of imgui.h as a convenience +//#define IMGUI_INCLUDE_IMGUI_USER_H + +//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another) +//#define IMGUI_USE_BGRA_PACKED_COLOR + +//---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...) +//#define IMGUI_USE_WCHAR32 + +//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version +// By default the embedded implementations are declared static and not available outside of Dear ImGui sources files. +//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" +//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" +//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if enabled +//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION +//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION + +//---- Use stb_sprintf.h for a faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined) +// Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by stb_sprintf.h. +//#define IMGUI_USE_STB_SPRINTF + +//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui) +// Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided). +// On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'. +//#define IMGUI_ENABLE_FREETYPE + +//---- Use stb_truetype to build and rasterize the font atlas (default) +// The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend. +//#define IMGUI_ENABLE_STB_TRUETYPE + +//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4. +// This will be inlined as part of ImVec2 and ImVec4 class declarations. +/* +#define IM_VEC2_CLASS_EXTRA \ + constexpr ImVec2(const MyVec2& f) : x(f.x), y(f.y) {} \ + operator MyVec2() const { return MyVec2(x,y); } + +#define IM_VEC4_CLASS_EXTRA \ + constexpr ImVec4(const MyVec4& f) : x(f.x), y(f.y), z(f.z), w(f.w) {} \ + operator MyVec4() const { return MyVec4(x,y,z,w); } +*/ + +//---- Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices. +// Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices). +// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer. +// Read about ImGuiBackendFlags_RendererHasVtxOffset for details. +//#define ImDrawIdx unsigned int + +//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly) +//struct ImDrawList; +//struct ImDrawCmd; +//typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data); +//#define ImDrawCallback MyImDrawCallback + +//---- Debug Tools: Macro to break in Debugger +// (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.) +//#define IM_DEBUG_BREAK IM_ASSERT(0) +//#define IM_DEBUG_BREAK __debugbreak() + +//---- Debug Tools: Have the Item Picker break in the ItemAdd() function instead of ItemHoverable(), +// (which comes earlier in the code, will catch a few extra items, allow picking items other than Hovered one.) +// This adds a small runtime cost which is why it is not enabled by default. +//#define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX + +//---- Debug Tools: Enable slower asserts +//#define IMGUI_DEBUG_PARANOID + +//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. +/* +namespace ImGui +{ + void MyFunction(const char* name, const MyMatrix44& v); +} +*/ diff --git a/3rdparty/imgui/include/imgui.h b/3rdparty/imgui/include/imgui.h new file mode 100644 index 0000000000..d599199ca8 --- /dev/null +++ b/3rdparty/imgui/include/imgui.h @@ -0,0 +1,3047 @@ +// dear imgui, v1.88 WIP +// (headers) + +// Help: +// - Read FAQ at http://dearimgui.org/faq +// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. +// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. +// Read imgui.cpp for details, links and comments. + +// Resources: +// - FAQ http://dearimgui.org/faq +// - Homepage & latest https://github.com/ocornut/imgui +// - Releases & changelog https://github.com/ocornut/imgui/releases +// - Gallery https://github.com/ocornut/imgui/issues/5243 (please post your screenshots/video there!) +// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Issues & support https://github.com/ocornut/imgui/issues + +// Getting Started? +// - For first-time users having issues compiling/linking/running or issues loading fonts: +// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. + +/* + +Index of this file: +// [SECTION] Header mess +// [SECTION] Forward declarations and basic types +// [SECTION] Dear ImGui end-user API functions +// [SECTION] Flags & Enumerations +// [SECTION] Helpers: Memory allocations macros, ImVector<> +// [SECTION] ImGuiStyle +// [SECTION] ImGuiIO +// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) +// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor) +// [SECTION] Drawing API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawFlags, ImDrawListFlags, ImDrawList, ImDrawData) +// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont) +// [SECTION] Viewports (ImGuiViewportFlags, ImGuiViewport) +// [SECTION] Platform Dependent Interfaces (ImGuiPlatformImeData) +// [SECTION] Obsolete functions and types + +*/ + +#pragma once + +// Configuration file with compile-time options (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system') +#ifdef IMGUI_USER_CONFIG +#include IMGUI_USER_CONFIG +#endif +#if !defined(IMGUI_DISABLE_INCLUDE_IMCONFIG_H) || defined(IMGUI_INCLUDE_IMCONFIG_H) +#include "imconfig.h" +#endif + +#ifndef IMGUI_DISABLE + +//----------------------------------------------------------------------------- +// [SECTION] Header mess +//----------------------------------------------------------------------------- + +// Includes +#include // FLT_MIN, FLT_MAX +#include // va_list, va_start, va_end +#include // ptrdiff_t, NULL +#include // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp + +// Version +// (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) +#define IMGUI_VERSION "1.88 WIP" +#define IMGUI_VERSION_NUM 18721 +#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) +#define IMGUI_HAS_TABLE + +// Define attributes of all API symbols declarations (e.g. for DLL under Windows) +// IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default backends files (imgui_impl_xxx.h) +// Using dear imgui via a shared library is not recommended, because we don't guarantee backward nor forward ABI compatibility (also function call overhead, as dear imgui is a call-heavy API) +#ifndef IMGUI_API +#define IMGUI_API +#endif +#ifndef IMGUI_IMPL_API +#define IMGUI_IMPL_API IMGUI_API +#endif + +// Helper Macros +#ifndef IM_ASSERT +#include +#define IM_ASSERT(_EXPR) assert(_EXPR) // You can override the default assert handler by editing imconfig.h +#endif +#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR) / sizeof(*(_ARR)))) // Size of a static C-style array. Don't use on pointers! +#define IM_UNUSED(_VAR) ((void)(_VAR)) // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds. +#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in C++11 + +// Helper Macros - IM_FMTARGS, IM_FMTLIST: Apply printf-style warnings to our formatting functions. +#if !defined(IMGUI_USE_STB_SPRINTF) && defined(__MINGW32__) && !defined(__clang__) +#define IM_FMTARGS(FMT) __attribute__((format(gnu_printf, FMT, FMT+1))) +#define IM_FMTLIST(FMT) __attribute__((format(gnu_printf, FMT, 0))) +#elif !defined(IMGUI_USE_STB_SPRINTF) && (defined(__clang__) || defined(__GNUC__)) +#define IM_FMTARGS(FMT) __attribute__((format(printf, FMT, FMT+1))) +#define IM_FMTLIST(FMT) __attribute__((format(printf, FMT, 0))) +#else +#define IM_FMTARGS(FMT) +#define IM_FMTLIST(FMT) +#endif + +// Disable some of MSVC most aggressive Debug runtime checks in function header/footer (used in some simple/low-level functions) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(__INTEL_COMPILER) && !defined(IMGUI_DEBUG_PARANOID) +#define IM_MSVC_RUNTIME_CHECKS_OFF __pragma(runtime_checks("",off)) __pragma(check_stack(off)) __pragma(strict_gs_check(push,off)) +#define IM_MSVC_RUNTIME_CHECKS_RESTORE __pragma(runtime_checks("",restore)) __pragma(check_stack()) __pragma(strict_gs_check(pop)) +#else +#define IM_MSVC_RUNTIME_CHECKS_OFF +#define IM_MSVC_RUNTIME_CHECKS_RESTORE +#endif + +// Warnings +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). +#endif +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wold-style-cast" +#if __has_warning("-Wzero-as-null-pointer-constant") +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#endif +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Forward declarations and basic types +//----------------------------------------------------------------------------- + +// Forward declarations +struct ImDrawChannel; // Temporary storage to output draw commands out of order, used by ImDrawListSplitter and ImDrawList::ChannelsSplit() +struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call, unless it is a callback) +struct ImDrawData; // All draw command lists required to render the frame + pos/size coordinates to use for the projection matrix. +struct ImDrawList; // A single draw command list (generally one per window, conceptually you may see this as a dynamic "mesh" builder) +struct ImDrawListSharedData; // Data shared among multiple draw lists (typically owned by parent ImGui context, but you may create one yourself) +struct ImDrawListSplitter; // Helper to split a draw list into different layers which can be drawn into out of order, then flattened back. +struct ImDrawVert; // A single vertex (pos + uv + col = 20 bytes by default. Override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT) +struct ImFont; // Runtime data for a single font within a parent ImFontAtlas +struct ImFontAtlas; // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader +struct ImFontBuilderIO; // Opaque interface to a font builder (stb_truetype or FreeType). +struct ImFontConfig; // Configuration data when adding a font or merging fonts +struct ImFontGlyph; // A single font glyph (code point + coordinates within in ImFontAtlas + offset) +struct ImFontGlyphRangesBuilder; // Helper to build glyph ranges from text/string data +struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4 (*OBSOLETE* please avoid using) +struct ImGuiContext; // Dear ImGui context (opaque structure, unless including imgui_internal.h) +struct ImGuiIO; // Main configuration and I/O between your application and ImGui +struct ImGuiInputTextCallbackData; // Shared state of InputText() when using custom ImGuiInputTextCallback (rare/advanced use) +struct ImGuiKeyData; // Storage for ImGuiIO and IsKeyDown(), IsKeyPressed() etc functions. +struct ImGuiListClipper; // Helper to manually clip large list of items +struct ImGuiOnceUponAFrame; // Helper for running a block of code not more than once a frame +struct ImGuiPayload; // User data payload for drag and drop operations +struct ImGuiPlatformImeData; // Platform IME data for io.SetPlatformImeDataFn() function. +struct ImGuiSizeCallbackData; // Callback data when using SetNextWindowSizeConstraints() (rare/advanced use) +struct ImGuiStorage; // Helper for key->value storage +struct ImGuiStyle; // Runtime data for styling/colors +struct ImGuiTableSortSpecs; // Sorting specifications for a table (often handling sort specs for a single column, occasionally more) +struct ImGuiTableColumnSortSpecs; // Sorting specification for one column of a table +struct ImGuiTextBuffer; // Helper to hold and append into a text buffer (~string builder) +struct ImGuiTextFilter; // Helper to parse and apply text filters (e.g. "aaaaa[,bbbbb][,ccccc]") +struct ImGuiViewport; // A Platform Window (always only one in 'master' branch), in the future may represent Platform Monitor + +// Enums/Flags (declared as int for compatibility with old C++, to allow using as flags without overhead, and to not pollute the top of this file) +// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists! +// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling +typedef int ImGuiCond; // -> enum ImGuiCond_ // Enum: A condition for many Set*() functions +typedef int ImGuiDataType; // -> enum ImGuiDataType_ // Enum: A primary data type +typedef int ImGuiDir; // -> enum ImGuiDir_ // Enum: A cardinal direction +typedef int ImGuiKey; // -> enum ImGuiKey_ // Enum: A key identifier +typedef int ImGuiNavInput; // -> enum ImGuiNavInput_ // Enum: An input identifier for navigation +typedef int ImGuiMouseButton; // -> enum ImGuiMouseButton_ // Enum: A mouse button identifier (0=left, 1=right, 2=middle) +typedef int ImGuiMouseCursor; // -> enum ImGuiMouseCursor_ // Enum: A mouse cursor identifier +typedef int ImGuiSortDirection; // -> enum ImGuiSortDirection_ // Enum: A sorting direction (ascending or descending) +typedef int ImGuiStyleVar; // -> enum ImGuiStyleVar_ // Enum: A variable identifier for styling +typedef int ImGuiTableBgTarget; // -> enum ImGuiTableBgTarget_ // Enum: A color target for TableSetBgColor() +typedef int ImDrawFlags; // -> enum ImDrawFlags_ // Flags: for ImDrawList functions +typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList instance +typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas build +typedef int ImGuiBackendFlags; // -> enum ImGuiBackendFlags_ // Flags: for io.BackendFlags +typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for InvisibleButton() +typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit4(), ColorPicker4() etc. +typedef int ImGuiConfigFlags; // -> enum ImGuiConfigFlags_ // Flags: for io.ConfigFlags +typedef int ImGuiComboFlags; // -> enum ImGuiComboFlags_ // Flags: for BeginCombo() +typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for BeginDragDropSource(), AcceptDragDropPayload() +typedef int ImGuiFocusedFlags; // -> enum ImGuiFocusedFlags_ // Flags: for IsWindowFocused() +typedef int ImGuiHoveredFlags; // -> enum ImGuiHoveredFlags_ // Flags: for IsItemHovered(), IsWindowHovered() etc. +typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText(), InputTextMultiline() +typedef int ImGuiModFlags; // -> enum ImGuiModFlags_ // Flags: for io.KeyMods (Ctrl/Shift/Alt/Super) +typedef int ImGuiPopupFlags; // -> enum ImGuiPopupFlags_ // Flags: for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() +typedef int ImGuiSelectableFlags; // -> enum ImGuiSelectableFlags_ // Flags: for Selectable() +typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. +typedef int ImGuiTabBarFlags; // -> enum ImGuiTabBarFlags_ // Flags: for BeginTabBar() +typedef int ImGuiTabItemFlags; // -> enum ImGuiTabItemFlags_ // Flags: for BeginTabItem() +typedef int ImGuiTableFlags; // -> enum ImGuiTableFlags_ // Flags: For BeginTable() +typedef int ImGuiTableColumnFlags; // -> enum ImGuiTableColumnFlags_// Flags: For TableSetupColumn() +typedef int ImGuiTableRowFlags; // -> enum ImGuiTableRowFlags_ // Flags: For TableNextRow() +typedef int ImGuiTreeNodeFlags; // -> enum ImGuiTreeNodeFlags_ // Flags: for TreeNode(), TreeNodeEx(), CollapsingHeader() +typedef int ImGuiViewportFlags; // -> enum ImGuiViewportFlags_ // Flags: for ImGuiViewport +typedef int ImGuiWindowFlags; // -> enum ImGuiWindowFlags_ // Flags: for Begin(), BeginChild() + +// ImTexture: user data for renderer backend to identify a texture [Compile-time configurable type] +// - To use something else than an opaque void* pointer: override with e.g. '#define ImTextureID MyTextureType*' in your imconfig.h file. +// - This can be whatever to you want it to be! read the FAQ about ImTextureID for details. +#ifndef ImTextureID +typedef void* ImTextureID; // Default: store a pointer or an integer fitting in a pointer (most renderer backends are ok with that) +#endif + +// ImDrawIdx: vertex index. [Compile-time configurable type] +// - To use 16-bit indices + allow large meshes: backend need to set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset' and handle ImDrawCmd::VtxOffset (recommended). +// - To use 32-bit indices: override with '#define ImDrawIdx unsigned int' in your imconfig.h file. +#ifndef ImDrawIdx +typedef unsigned short ImDrawIdx; // Default: 16-bit (for maximum compatibility with renderer backends) +#endif + +// Scalar data types +typedef unsigned int ImGuiID;// A unique ID used by widgets (typically the result of hashing a stack of string) +typedef signed char ImS8; // 8-bit signed integer +typedef unsigned char ImU8; // 8-bit unsigned integer +typedef signed short ImS16; // 16-bit signed integer +typedef unsigned short ImU16; // 16-bit unsigned integer +typedef signed int ImS32; // 32-bit signed integer == int +typedef unsigned int ImU32; // 32-bit unsigned integer (often used to store packed colors) +typedef signed long long ImS64; // 64-bit signed integer +typedef unsigned long long ImU64; // 64-bit unsigned integer + +// Character types +// (we generally use UTF-8 encoded string in the API. This is storage specifically for a decoded character used for keyboard input and display) +typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings. +typedef unsigned int ImWchar32; // A single decoded U32 character/code point. We encode them as multi bytes UTF-8 when used in strings. +#ifdef IMGUI_USE_WCHAR32 // ImWchar [configurable type: override in imconfig.h with '#define IMGUI_USE_WCHAR32' to support Unicode planes 1-16] +typedef ImWchar32 ImWchar; +#else +typedef ImWchar16 ImWchar; +#endif + +// Callback and functions types +typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData* data); // Callback function for ImGui::InputText() +typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data); // Callback function for ImGui::SetNextWindowSizeConstraints() +typedef void* (*ImGuiMemAllocFunc)(size_t sz, void* user_data); // Function signature for ImGui::SetAllocatorFunctions() +typedef void (*ImGuiMemFreeFunc)(void* ptr, void* user_data); // Function signature for ImGui::SetAllocatorFunctions() + +// ImVec2: 2D vector used to store positions, sizes etc. [Compile-time configurable type] +// This is a frequently used type in the API. Consider using IM_VEC2_CLASS_EXTRA to create implicit cast from/to our preferred type. +IM_MSVC_RUNTIME_CHECKS_OFF +struct ImVec2 +{ + float x, y; + constexpr ImVec2() : x(0.0f), y(0.0f) { } + constexpr ImVec2(float _x, float _y) : x(_x), y(_y) { } + float operator[] (size_t idx) const { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. + float& operator[] (size_t idx) { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. +#ifdef IM_VEC2_CLASS_EXTRA + IM_VEC2_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec2. +#endif +}; + +// ImVec4: 4D vector used to store clipping rectangles, colors etc. [Compile-time configurable type] +struct ImVec4 +{ + float x, y, z, w; + constexpr ImVec4() : x(0.0f), y(0.0f), z(0.0f), w(0.0f) { } + constexpr ImVec4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w) { } +#ifdef IM_VEC4_CLASS_EXTRA + IM_VEC4_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec4. +#endif +}; +IM_MSVC_RUNTIME_CHECKS_RESTORE + +//----------------------------------------------------------------------------- +// [SECTION] Dear ImGui end-user API functions +// (Note that ImGui:: being a namespace, you can add extra ImGui:: functions in your own separate file. Please don't modify imgui source files!) +//----------------------------------------------------------------------------- + +namespace ImGui +{ + // Context creation and access + // - Each context create its own ImFontAtlas by default. You may instance one yourself and pass it to CreateContext() to share a font atlas between contexts. + // - DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() + // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for details. + IMGUI_API ImGuiContext* CreateContext(ImFontAtlas* shared_font_atlas = NULL); + IMGUI_API void DestroyContext(ImGuiContext* ctx = NULL); // NULL = destroy current context + IMGUI_API ImGuiContext* GetCurrentContext(); + IMGUI_API void SetCurrentContext(ImGuiContext* ctx); + + // Main + IMGUI_API ImGuiIO& GetIO(); // access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags) + IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame! + IMGUI_API void NewFrame(); // start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame(). + IMGUI_API void EndFrame(); // ends the Dear ImGui frame. automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all! + IMGUI_API void Render(); // ends the Dear ImGui frame, finalize the draw data. You can then get call GetDrawData(). + IMGUI_API ImDrawData* GetDrawData(); // valid after Render() and until the next call to NewFrame(). this is what you have to render. + + // Demo, Debug, Information + IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create Demo window. demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application! + IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create Metrics/Debugger window. display Dear ImGui internals: windows, draw commands, various internal state, etc. + IMGUI_API void ShowStackToolWindow(bool* p_open = NULL); // create Stack Tool window. hover items with mouse to query information about the source of their unique ID. + IMGUI_API void ShowAboutWindow(bool* p_open = NULL); // create About window. display Dear ImGui version, credits and build/system information. + IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style) + IMGUI_API bool ShowStyleSelector(const char* label); // add style selector block (not a window), essentially a combo listing the default styles. + IMGUI_API void ShowFontSelector(const char* label); // add font selector block (not a window), essentially a combo listing the loaded fonts. + IMGUI_API void ShowUserGuide(); // add basic help/info block (not a window): how to manipulate ImGui as a end-user (mouse/keyboard controls). + IMGUI_API const char* GetVersion(); // get the compiled version string e.g. "1.80 WIP" (essentially the value for IMGUI_VERSION from the compiled version of imgui.cpp) + + // Styles + IMGUI_API void StyleColorsDark(ImGuiStyle* dst = NULL); // new, recommended style (default) + IMGUI_API void StyleColorsLight(ImGuiStyle* dst = NULL); // best used with borders and a custom, thicker font + IMGUI_API void StyleColorsClassic(ImGuiStyle* dst = NULL); // classic imgui style + + // Windows + // - Begin() = push window to the stack and start appending to it. End() = pop window from the stack. + // - Passing 'bool* p_open != NULL' shows a window-closing widget in the upper-right corner of the window, + // which clicking will set the boolean to false when clicked. + // - You may append multiple times to the same window during the same frame by calling Begin()/End() pairs multiple times. + // Some information such as 'flags' or 'p_open' will only be considered by the first call to Begin(). + // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting + // anything to the window. Always call a matching End() for each Begin() call, regardless of its return value! + // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, + // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function + // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] + // - Note that the bottom of window stack always contains a window called "Debug". + IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); + IMGUI_API void End(); + + // Child Windows + // - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child. + // - For each independent axis of 'size': ==0.0f: use remaining host window size / >0.0f: fixed size / <0.0f: use remaining window size minus abs(size) / Each axis can use a different mode, e.g. ImVec2(0,400). + // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window. + // Always call a matching EndChild() for each BeginChild() call, regardless of its return value. + // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, + // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function + // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] + IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); + IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); + IMGUI_API void EndChild(); + + // Windows Utilities + // - 'current window' = the window we are appending into while inside a Begin()/End() block. 'next window' = next window we will Begin() into. + IMGUI_API bool IsWindowAppearing(); + IMGUI_API bool IsWindowCollapsed(); + IMGUI_API bool IsWindowFocused(ImGuiFocusedFlags flags=0); // is current window focused? or its root/child, depending on flags. see flags for options. + IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. NB: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that! Please read the FAQ! + IMGUI_API ImDrawList* GetWindowDrawList(); // get draw list associated to the current window, to append your own drawing primitives + IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList API) + IMGUI_API ImVec2 GetWindowSize(); // get current window size + IMGUI_API float GetWindowWidth(); // get current window width (shortcut for GetWindowSize().x) + IMGUI_API float GetWindowHeight(); // get current window height (shortcut for GetWindowSize().y) + + // Window manipulation + // - Prefer using SetNextXXX functions (before Begin) rather that SetXXX functions (after Begin). + IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0, 0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc. + IMGUI_API void SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0); // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin() + IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Sizes will be rounded down. Use callback to apply non-trivial programmatic constraints. + IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ scrollable client area, which enforce the range of scrollbars). Not including window decorations (title bar, menu bar, etc.) nor WindowPadding. set an axis to 0.0f to leave it automatic. call before Begin() + IMGUI_API void SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // set next window collapsed state. call before Begin() + IMGUI_API void SetNextWindowFocus(); // set next window to be focused / top-most. call before Begin() + IMGUI_API void SetNextWindowBgAlpha(float alpha); // set next window background color alpha. helper to easily override the Alpha component of ImGuiCol_WindowBg/ChildBg/PopupBg. you may also use ImGuiWindowFlags_NoBackground. + IMGUI_API void SetWindowPos(const ImVec2& pos, ImGuiCond cond = 0); // (not recommended) set current window position - call within Begin()/End(). prefer using SetNextWindowPos(), as this may incur tearing and side-effects. + IMGUI_API void SetWindowSize(const ImVec2& size, ImGuiCond cond = 0); // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0, 0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects. + IMGUI_API void SetWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // (not recommended) set current window collapsed state. prefer using SetNextWindowCollapsed(). + IMGUI_API void SetWindowFocus(); // (not recommended) set current window to be focused / top-most. prefer using SetNextWindowFocus(). + IMGUI_API void SetWindowFontScale(float scale); // [OBSOLETE] set font scale. Adjust IO.FontGlobalScale if you want to scale all windows. This is an old API! For correct scaling, prefer to reload font + rebuild ImFontAtlas + call style.ScaleAllSizes(). + IMGUI_API void SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond = 0); // set named window position. + IMGUI_API void SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond = 0); // set named window size. set axis to 0.0f to force an auto-fit on this axis. + IMGUI_API void SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0); // set named window collapsed state + IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / top-most. use NULL to remove focus. + + // Content region + // - Retrieve available space from a given point. GetContentRegionAvail() is frequently useful. + // - Those functions are bound to be redesigned (they are confusing, incomplete and the Min/Max return values are in local window coordinates which increases confusion) + IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos() + IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates + IMGUI_API ImVec2 GetWindowContentRegionMin(); // content boundaries min for the full window (roughly (0,0)-Scroll), in window coordinates + IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max for the full window (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates + + // Windows Scrolling + IMGUI_API float GetScrollX(); // get scrolling amount [0 .. GetScrollMaxX()] + IMGUI_API float GetScrollY(); // get scrolling amount [0 .. GetScrollMaxY()] + IMGUI_API void SetScrollX(float scroll_x); // set scrolling amount [0 .. GetScrollMaxX()] + IMGUI_API void SetScrollY(float scroll_y); // set scrolling amount [0 .. GetScrollMaxY()] + IMGUI_API float GetScrollMaxX(); // get maximum scrolling amount ~~ ContentSize.x - WindowSize.x - DecorationsSize.x + IMGUI_API float GetScrollMaxY(); // get maximum scrolling amount ~~ ContentSize.y - WindowSize.y - DecorationsSize.y + IMGUI_API void SetScrollHereX(float center_x_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_x_ratio=0.0: left, 0.5: center, 1.0: right. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead. + IMGUI_API void SetScrollHereY(float center_y_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead. + IMGUI_API void SetScrollFromPosX(float local_x, float center_x_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position. + IMGUI_API void SetScrollFromPosY(float local_y, float center_y_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position. + + // Parameters stacks (shared) + IMGUI_API void PushFont(ImFont* font); // use NULL as a shortcut to push default font + IMGUI_API void PopFont(); + IMGUI_API void PushStyleColor(ImGuiCol idx, ImU32 col); // modify a style color. always use this if you modify the style after NewFrame(). + IMGUI_API void PushStyleColor(ImGuiCol idx, const ImVec4& col); + IMGUI_API void PopStyleColor(int count = 1); + IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val); // modify a style float variable. always use this if you modify the style after NewFrame(). + IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val); // modify a style ImVec2 variable. always use this if you modify the style after NewFrame(). + IMGUI_API void PopStyleVar(int count = 1); + IMGUI_API void PushAllowKeyboardFocus(bool allow_keyboard_focus); // == tab stop enable. Allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets + IMGUI_API void PopAllowKeyboardFocus(); + IMGUI_API void PushButtonRepeat(bool repeat); // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (using io.KeyRepeatDelay/io.KeyRepeatRate setting). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame. + IMGUI_API void PopButtonRepeat(); + + // Parameters stacks (current window) + IMGUI_API void PushItemWidth(float item_width); // push width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side). + IMGUI_API void PopItemWidth(); + IMGUI_API void SetNextItemWidth(float item_width); // set width of the _next_ common large "item+label" widget. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side) + IMGUI_API float CalcItemWidth(); // width of item given pushed settings and current cursor position. NOT necessarily the width of last item unlike most 'Item' functions. + IMGUI_API void PushTextWrapPos(float wrap_local_pos_x = 0.0f); // push word-wrapping position for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space + IMGUI_API void PopTextWrapPos(); + + // Style read access + // - Use the style editor (ShowStyleEditor() function) to interactively see what the colors are) + IMGUI_API ImFont* GetFont(); // get current font + IMGUI_API float GetFontSize(); // get current font size (= height in pixels) of current font with current scale applied + IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API + IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier, packed as a 32-bit value suitable for ImDrawList + IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList + IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList + IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx); // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in. + + // Cursor / Layout + // - By "cursor" we mean the current output position. + // - The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down. + // - You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceding widget. + // - Attention! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API: + // Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() + // Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions. + IMGUI_API void Separator(); // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator. + IMGUI_API void SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f); // call between widgets or groups to layout them horizontally. X position given in window coordinates. + IMGUI_API void NewLine(); // undo a SameLine() or force a new line when in an horizontal-layout context. + IMGUI_API void Spacing(); // add vertical spacing. + IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size. unlike InvisibleButton(), Dummy() won't take the mouse click or be navigable into. + IMGUI_API void Indent(float indent_w = 0.0f); // move content position toward the right, by indent_w, or style.IndentSpacing if indent_w <= 0 + IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by indent_w, or style.IndentSpacing if indent_w <= 0 + IMGUI_API void BeginGroup(); // lock horizontal starting position + IMGUI_API void EndGroup(); // unlock horizontal starting position + capture the whole group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) + IMGUI_API ImVec2 GetCursorPos(); // cursor position in window coordinates (relative to window position) + IMGUI_API float GetCursorPosX(); // (some functions are using window-relative coordinates, such as: GetCursorPos, GetCursorStartPos, GetContentRegionMax, GetWindowContentRegion* etc. + IMGUI_API float GetCursorPosY(); // other functions such as GetCursorScreenPos or everything in ImDrawList:: + IMGUI_API void SetCursorPos(const ImVec2& local_pos); // are using the main, absolute coordinate system. + IMGUI_API void SetCursorPosX(float local_x); // GetWindowPos() + GetCursorPos() == GetCursorScreenPos() etc.) + IMGUI_API void SetCursorPosY(float local_y); // + IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position in window coordinates + IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute coordinates (useful to work with ImDrawList API). generally top-left == GetMainViewport()->Pos == (0,0) in single viewport mode, and bottom-right == GetMainViewport()->Pos+Size == io.DisplaySize in single-viewport mode. + IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute coordinates + IMGUI_API void AlignTextToFramePadding(); // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item) + IMGUI_API float GetTextLineHeight(); // ~ FontSize + IMGUI_API float GetTextLineHeightWithSpacing(); // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text) + IMGUI_API float GetFrameHeight(); // ~ FontSize + style.FramePadding.y * 2 + IMGUI_API float GetFrameHeightWithSpacing(); // ~ FontSize + style.FramePadding.y * 2 + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of framed widgets) + + // ID stack/scopes + // Read the FAQ (docs/FAQ.md or http://dearimgui.org/faq) for more details about how ID are handled in dear imgui. + // - Those questions are answered and impacted by understanding of the ID stack system: + // - "Q: Why is my widget not reacting when I click on it?" + // - "Q: How can I have widgets with an empty label?" + // - "Q: How can I have multiple widgets with the same label?" + // - Short version: ID are hashes of the entire ID stack. If you are creating widgets in a loop you most likely + // want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them. + // - You can also use the "Label##foobar" syntax within widget label to distinguish them from each others. + // - In this header file we use the "label"/"name" terminology to denote a string that will be displayed + used as an ID, + // whereas "str_id" denote a string that is only used as an ID and not normally displayed. + IMGUI_API void PushID(const char* str_id); // push string into the ID stack (will hash string). + IMGUI_API void PushID(const char* str_id_begin, const char* str_id_end); // push string into the ID stack (will hash string). + IMGUI_API void PushID(const void* ptr_id); // push pointer into the ID stack (will hash pointer). + IMGUI_API void PushID(int int_id); // push integer into the ID stack (will hash integer). + IMGUI_API void PopID(); // pop from the ID stack. + IMGUI_API ImGuiID GetID(const char* str_id); // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself + IMGUI_API ImGuiID GetID(const char* str_id_begin, const char* str_id_end); + IMGUI_API ImGuiID GetID(const void* ptr_id); + + // Widgets: Text + IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text. + IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // formatted text + IMGUI_API void TextV(const char* fmt, va_list args) IM_FMTLIST(1); + IMGUI_API void TextColored(const ImVec4& col, const char* fmt, ...) IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor(); + IMGUI_API void TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2); + IMGUI_API void TextDisabled(const char* fmt, ...) IM_FMTARGS(1); // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor(); + IMGUI_API void TextDisabledV(const char* fmt, va_list args) IM_FMTLIST(1); + IMGUI_API void TextWrapped(const char* fmt, ...) IM_FMTARGS(1); // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize(). + IMGUI_API void TextWrappedV(const char* fmt, va_list args) IM_FMTLIST(1); + IMGUI_API void LabelText(const char* label, const char* fmt, ...) IM_FMTARGS(2); // display text+label aligned the same way as value+label widgets + IMGUI_API void LabelTextV(const char* label, const char* fmt, va_list args) IM_FMTLIST(2); + IMGUI_API void BulletText(const char* fmt, ...) IM_FMTARGS(1); // shortcut for Bullet()+Text() + IMGUI_API void BulletTextV(const char* fmt, va_list args) IM_FMTLIST(1); + + // Widgets: Main + // - Most widgets return true when the value has been changed or when pressed/selected + // - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state. + IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0, 0)); // button + IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text + IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) + IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape + IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0)); + IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no padding + IMGUI_API bool Checkbox(const char* label, bool* v); + IMGUI_API bool CheckboxFlags(const char* label, int* flags, int flags_value); + IMGUI_API bool CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value); + IMGUI_API bool RadioButton(const char* label, bool active); // use with e.g. if (RadioButton("one", my_value==1)) { my_value = 1; } + IMGUI_API bool RadioButton(const char* label, int* v, int v_button); // shortcut to handle the above pattern when value is an integer + IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-FLT_MIN, 0), const char* overlay = NULL); + IMGUI_API void Bullet(); // draw a small circle + keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses + + // Widgets: Combo Box + // - The BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items. + // - The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose. This is analogous to how ListBox are created. + IMGUI_API bool BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0); + IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true! + IMGUI_API bool Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1); + IMGUI_API bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1); // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0" + IMGUI_API bool Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1); + + // Widgets: Drag Sliders + // - CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped by default and can go off-bounds. Use ImGuiSliderFlags_AlwaysClamp to always clamp. + // - For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', + // the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x + // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc. + // - Format string may also be set to NULL or use the default format ("%f" or "%d"). + // - Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision). + // - Use v_min < v_max to clamp edits to given limits. Note that CTRL+Click manual input can override those limits if ImGuiSliderFlags_AlwaysClamp is not used. + // - Use v_max = FLT_MAX / INT_MAX etc to avoid clamping to a maximum, same with v_min = -FLT_MAX / INT_MIN to avoid clamping to a minimum. + // - We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them. + // - Legacy: Pre-1.78 there are DragXXX() function signatures that takes a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument. + // If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361 + IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); // If v_min >= v_max we have no bound + IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", const char* format_max = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); // If v_min >= v_max we have no bound + IMGUI_API bool DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", const char* format_max = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed = 1.0f, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed = 1.0f, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0); + + // Widgets: Regular Sliders + // - CTRL+Click on any slider to turn them into an input box. Manually input values aren't clamped by default and can go off-bounds. Use ImGuiSliderFlags_AlwaysClamp to always clamp. + // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc. + // - Format string may also be set to NULL or use the default format ("%f" or "%d"). + // - Legacy: Pre-1.78 there are SliderXXX() function signatures that takes a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument. + // If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361 + IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); // adjust format to decorate the value with a prefix or a suffix for in-slider labels or unit display. + IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f, const char* format = "%.0f deg", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt(const char* label, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); + + // Widgets: Input with Keyboard + // - If you want to use InputText() with std::string or any custom dynamic string type, see misc/cpp/imgui_stdlib.h and comments in imgui_demo.cpp. + // - Most of the ImGuiInputTextFlags flags are only useful for InputText() and not for InputFloatX, InputIntX, InputDouble etc. + IMGUI_API bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputFloat2(const char* label, float v[2], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputFloat3(const char* label, float v[3], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputFloat4(const char* label, float v[4], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputDouble(const char* label, double* v, double step = 0.0, double step_fast = 0.0, const char* format = "%.6f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); + + // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little color square that can be left-clicked to open a picker, and right-clicked to open an option menu.) + // - Note that in C++ a 'float v[X]' function argument is the _same_ as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. + // - You can pass the address of a first float element out of a contiguous structure, e.g. &myvector.x + IMGUI_API bool ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); + IMGUI_API bool ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0); + IMGUI_API bool ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); + IMGUI_API bool ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags = 0, const float* ref_col = NULL); + IMGUI_API bool ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // display a color square/button, hover for details, return true when pressed. + IMGUI_API void SetColorEditOptions(ImGuiColorEditFlags flags); // initialize current options (generally on application startup) if you want to select a default format, picker type, etc. User will be able to change many settings, unless you pass the _NoOptions flag to your calls. + + // Widgets: Trees + // - TreeNode functions return true when the node is open, in which case you need to also call TreePop() when you are finished displaying the tree node contents. + IMGUI_API bool TreeNode(const char* label); + IMGUI_API bool TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2); // helper variation to easily decorelate the id from the displayed string. Read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet(). + IMGUI_API bool TreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(2); // " + IMGUI_API bool TreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(2); + IMGUI_API bool TreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(2); + IMGUI_API bool TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0); + IMGUI_API bool TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); + IMGUI_API bool TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); + IMGUI_API bool TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); + IMGUI_API bool TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); + IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired. + IMGUI_API void TreePush(const void* ptr_id = NULL); // " + IMGUI_API void TreePop(); // ~ Unindent()+PopId() + IMGUI_API float GetTreeNodeToLabelSpacing(); // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode + IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop(). + IMGUI_API bool CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags = 0); // when 'p_visible != NULL': if '*p_visible==true' display an additional small close button on upper right of the header which will set the bool to false when clicked, if '*p_visible==false' don't display the header. + IMGUI_API void SetNextItemOpen(bool is_open, ImGuiCond cond = 0); // set next TreeNode/CollapsingHeader open state. + + // Widgets: Selectables + // - A selectable highlights when hovered, and can display another color when selected. + // - Neighbors selectable extend their highlight bounds in order to leave no gap between them. This is so a series of selected Selectable appear contiguous. + IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool selected" carry the selection state (read-only). Selectable() is clicked is returns true so you can modify your selection state. size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height + IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool* p_selected" point to the selection state (read-write), as a convenient helper. + + // Widgets: List Boxes + // - This is essentially a thin wrapper to using BeginChild/EndChild with some stylistic changes. + // - The BeginListBox()/EndListBox() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() or any items. + // - The simplified/old ListBox() api are helpers over BeginListBox()/EndListBox() which are kept available for convenience purpose. This is analoguous to how Combos are created. + // - Choose frame width: size.x > 0.0f: custom / size.x < 0.0f or -FLT_MIN: right-align / size.x = 0.0f (default): use current ItemWidth + // - Choose frame height: size.y > 0.0f: custom / size.y < 0.0f or -FLT_MIN: bottom-align / size.y = 0.0f (default): arbitrary default height which can fit ~7 items + IMGUI_API bool BeginListBox(const char* label, const ImVec2& size = ImVec2(0, 0)); // open a framed scrolling region + IMGUI_API void EndListBox(); // only call EndListBox() if BeginListBox() returned true! + IMGUI_API bool ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1); + IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1); + + // Widgets: Data Plotting + // - Consider using ImPlot (https://github.com/epezent/implot) which is much better! + IMGUI_API void PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); + IMGUI_API void PlotLines(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); + IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); + IMGUI_API void PlotHistogram(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); + + // Widgets: Value() Helpers. + // - Those are merely shortcut to calling Text() with a format string. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace) + IMGUI_API void Value(const char* prefix, bool b); + IMGUI_API void Value(const char* prefix, int v); + IMGUI_API void Value(const char* prefix, unsigned int v); + IMGUI_API void Value(const char* prefix, float v, const char* float_format = NULL); + + // Widgets: Menus + // - Use BeginMenuBar() on a window ImGuiWindowFlags_MenuBar to append to its menu bar. + // - Use BeginMainMenuBar() to create a menu bar at the top of the screen and append to it. + // - Use BeginMenu() to create a menu. You can call BeginMenu() multiple time with the same identifier to append more items to it. + // - Not that MenuItem() keyboardshortcuts are displayed as a convenience but _not processed_ by Dear ImGui at the moment. + IMGUI_API bool BeginMenuBar(); // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set on parent window). + IMGUI_API void EndMenuBar(); // only call EndMenuBar() if BeginMenuBar() returns true! + IMGUI_API bool BeginMainMenuBar(); // create and append to a full screen menu-bar. + IMGUI_API void EndMainMenuBar(); // only call EndMainMenuBar() if BeginMainMenuBar() returns true! + IMGUI_API bool BeginMenu(const char* label, bool enabled = true); // create a sub-menu entry. only call EndMenu() if this returns true! + IMGUI_API void EndMenu(); // only call EndMenu() if BeginMenu() returns true! + IMGUI_API bool MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true); // return true when activated. + IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL + + // Tooltips + // - Tooltip are windows following the mouse. They do not take focus away. + IMGUI_API void BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of items). + IMGUI_API void EndTooltip(); + IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip(). + IMGUI_API void SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); + + // Popups, Modals + // - They block normal mouse hovering detection (and therefore most mouse interactions) behind them. + // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. + // - Their visibility state (~bool) is held internally instead of being held by the programmer as we are used to with regular Begin*() calls. + // - The 3 properties above are related: we need to retain popup visibility state in the library because popups may be closed as any time. + // - You can bypass the hovering restriction by using ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered(). + // - IMPORTANT: Popup identifiers are relative to the current ID stack, so OpenPopup and BeginPopup generally needs to be at the same level of the stack. + // This is sometimes leading to confusing mistakes. May rework this in the future. + + // Popups: begin/end functions + // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards. ImGuiWindowFlags are forwarded to the window. + // - BeginPopupModal(): block every interactions behind the window, cannot be closed by user, add a dimming background, has a title bar. + IMGUI_API bool BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0); // return true if the popup is open, and you can start outputting to it. + IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // return true if the modal is open, and you can start outputting to it. + IMGUI_API void EndPopup(); // only call EndPopup() if BeginPopupXXX() returns true! + + // Popups: open/close functions + // - OpenPopup(): set popup state to open. ImGuiPopupFlags are available for opening options. + // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. + // - CloseCurrentPopup(): use inside the BeginPopup()/EndPopup() scope to close manually. + // - CloseCurrentPopup() is called by default by Selectable()/MenuItem() when activated (FIXME: need some options). + // - Use ImGuiPopupFlags_NoOpenOverExistingPopup to avoid opening a popup if there's already one at the same level. This is equivalent to e.g. testing for !IsAnyPopupOpen() prior to OpenPopup(). + // - Use IsWindowAppearing() after BeginPopup() to tell if a window just opened. + // - IMPORTANT: Notice that for OpenPopupOnItemClick() we exceptionally default flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter + IMGUI_API void OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags = 0); // call to mark popup as open (don't call every frame!). + IMGUI_API void OpenPopup(ImGuiID id, ImGuiPopupFlags popup_flags = 0); // id overload to facilitate calling from nested stacks + IMGUI_API void OpenPopupOnItemClick(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // helper to open popup when clicked on last item. Default to ImGuiPopupFlags_MouseButtonRight == 1. (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors) + IMGUI_API void CloseCurrentPopup(); // manually close the popup we have begin-ed into. + + // Popups: open+begin combined functions helpers + // - Helpers to do OpenPopup+BeginPopup where the Open action is triggered by e.g. hovering an item and right-clicking. + // - They are convenient to easily create context menus, hence the name. + // - IMPORTANT: Notice that BeginPopupContextXXX takes ImGuiPopupFlags just like OpenPopup() and unlike BeginPopup(). For full consistency, we may add ImGuiWindowFlags to the BeginPopupContextXXX functions in the future. + // - IMPORTANT: Notice that we exceptionally default their flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter, so if you add other flags remember to re-add the ImGuiPopupFlags_MouseButtonRight. + IMGUI_API bool BeginPopupContextItem(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // open+begin popup when clicked on last item. Use str_id==NULL to associate the popup to previous item. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp! + IMGUI_API bool BeginPopupContextWindow(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);// open+begin popup when clicked on current window. + IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // open+begin popup when clicked in void (where there are no windows). + + // Popups: query functions + // - IsPopupOpen(): return true if the popup is open at the current BeginPopup() level of the popup stack. + // - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId: return true if any popup is open at the current BeginPopup() level of the popup stack. + // - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId + ImGuiPopupFlags_AnyPopupLevel: return true if any popup is open. + IMGUI_API bool IsPopupOpen(const char* str_id, ImGuiPopupFlags flags = 0); // return true if the popup is open. + + // Tables + // - Full-featured replacement for old Columns API. + // - See Demo->Tables for demo code. See top of imgui_tables.cpp for general commentary. + // - See ImGuiTableFlags_ and ImGuiTableColumnFlags_ enums for a description of available flags. + // The typical call flow is: + // - 1. Call BeginTable(), early out if returning false. + // - 2. Optionally call TableSetupColumn() to submit column name/flags/defaults. + // - 3. Optionally call TableSetupScrollFreeze() to request scroll freezing of columns/rows. + // - 4. Optionally call TableHeadersRow() to submit a header row. Names are pulled from TableSetupColumn() data. + // - 5. Populate contents: + // - In most situations you can use TableNextRow() + TableSetColumnIndex(N) to start appending into a column. + // - If you are using tables as a sort of grid, where every columns is holding the same type of contents, + // you may prefer using TableNextColumn() instead of TableNextRow() + TableSetColumnIndex(). + // TableNextColumn() will automatically wrap-around into the next row if needed. + // - IMPORTANT: Comparatively to the old Columns() API, we need to call TableNextColumn() for the first column! + // - Summary of possible call flow: + // -------------------------------------------------------------------------------------------------------- + // TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK + // TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK + // TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row! + // TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear! + // -------------------------------------------------------------------------------------------------------- + // - 5. Call EndTable() + IMGUI_API bool BeginTable(const char* str_id, int column, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0.0f, 0.0f), float inner_width = 0.0f); + IMGUI_API void EndTable(); // only call EndTable() if BeginTable() returns true! + IMGUI_API void TableNextRow(ImGuiTableRowFlags row_flags = 0, float min_row_height = 0.0f); // append into the first cell of a new row. + IMGUI_API bool TableNextColumn(); // append into the next column (or first column of next row if currently in last column). Return true when column is visible. + IMGUI_API bool TableSetColumnIndex(int column_n); // append into the specified column. Return true when column is visible. + + // Tables: Headers & Columns declaration + // - Use TableSetupColumn() to specify label, resizing policy, default width/weight, id, various other flags etc. + // - Use TableHeadersRow() to create a header row and automatically submit a TableHeader() for each column. + // Headers are required to perform: reordering, sorting, and opening the context menu. + // The context menu can also be made available in columns body using ImGuiTableFlags_ContextMenuInBody. + // - You may manually submit headers using TableNextRow() + TableHeader() calls, but this is only useful in + // some advanced use cases (e.g. adding custom widgets in header row). + // - Use TableSetupScrollFreeze() to lock columns/rows so they stay visible when scrolled. + IMGUI_API void TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = 0.0f, ImGuiID user_id = 0); + IMGUI_API void TableSetupScrollFreeze(int cols, int rows); // lock columns/rows so they stay visible when scrolled. + IMGUI_API void TableHeadersRow(); // submit all headers cells based on data provided to TableSetupColumn() + submit context menu + IMGUI_API void TableHeader(const char* label); // submit one header cell manually (rarely used) + + // Tables: Sorting & Miscellaneous functions + // - Sorting: call TableGetSortSpecs() to retrieve latest sort specs for the table. NULL when not sorting. + // When 'sort_specs->SpecsDirty == true' you should sort your data. It will be true when sorting specs have + // changed since last call, or the first time. Make sure to set 'SpecsDirty = false' after sorting, + // else you may wastefully sort your data every frame! + // - Functions args 'int column_n' treat the default value of -1 as the same as passing the current column index. + IMGUI_API ImGuiTableSortSpecs* TableGetSortSpecs(); // get latest sort specs for the table (NULL if not sorting). Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable(). + IMGUI_API int TableGetColumnCount(); // return number of columns (value passed to BeginTable) + IMGUI_API int TableGetColumnIndex(); // return current column index. + IMGUI_API int TableGetRowIndex(); // return current row index. + IMGUI_API const char* TableGetColumnName(int column_n = -1); // return "" if column didn't have a name declared by TableSetupColumn(). Pass -1 to use current column. + IMGUI_API ImGuiTableColumnFlags TableGetColumnFlags(int column_n = -1); // return column flags so you can query their Enabled/Visible/Sorted/Hovered status flags. Pass -1 to use current column. + IMGUI_API void TableSetColumnEnabled(int column_n, bool v);// change user accessible enabled/disabled state of a column. Set to false to hide the column. User can use the context menu to change this themselves (right-click in headers, or right-click in columns body with ImGuiTableFlags_ContextMenuInBody) + IMGUI_API void TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n = -1); // change the color of a cell, row, or column. See ImGuiTableBgTarget_ flags for details. + + // Legacy Columns API (prefer using Tables!) + // - You can also use SameLine(pos_x) to mimic simplified columns. + IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true); + IMGUI_API void NextColumn(); // next column, defaults to current row or next row if the current row is finished + IMGUI_API int GetColumnIndex(); // get current column index + IMGUI_API float GetColumnWidth(int column_index = -1); // get column width (in pixels). pass -1 to use current column + IMGUI_API void SetColumnWidth(int column_index, float width); // set column width (in pixels). pass -1 to use current column + IMGUI_API float GetColumnOffset(int column_index = -1); // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetColumnsCount() inclusive. column 0 is typically 0.0f + IMGUI_API void SetColumnOffset(int column_index, float offset_x); // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column + IMGUI_API int GetColumnsCount(); + + // Tab Bars, Tabs + IMGUI_API bool BeginTabBar(const char* str_id, ImGuiTabBarFlags flags = 0); // create and append into a TabBar + IMGUI_API void EndTabBar(); // only call EndTabBar() if BeginTabBar() returns true! + IMGUI_API bool BeginTabItem(const char* label, bool* p_open = NULL, ImGuiTabItemFlags flags = 0); // create a Tab. Returns true if the Tab is selected. + IMGUI_API void EndTabItem(); // only call EndTabItem() if BeginTabItem() returns true! + IMGUI_API bool TabItemButton(const char* label, ImGuiTabItemFlags flags = 0); // create a Tab behaving like a button. return true when clicked. cannot be selected in the tab bar. + IMGUI_API void SetTabItemClosed(const char* tab_or_docked_window_label); // notify TabBar or Docking system of a closed tab/window ahead (useful to reduce visual flicker on reorderable tab bars). For tab-bar: call after BeginTabBar() and before Tab submissions. Otherwise call with a window name. + + // Logging/Capture + // - All text output from the interface can be captured into tty/file/clipboard. By default, tree nodes are automatically opened during logging. + IMGUI_API void LogToTTY(int auto_open_depth = -1); // start logging to tty (stdout) + IMGUI_API void LogToFile(int auto_open_depth = -1, const char* filename = NULL); // start logging to file + IMGUI_API void LogToClipboard(int auto_open_depth = -1); // start logging to OS clipboard + IMGUI_API void LogFinish(); // stop logging (close file, etc.) + IMGUI_API void LogButtons(); // helper to display buttons for logging to tty/file/clipboard + IMGUI_API void LogText(const char* fmt, ...) IM_FMTARGS(1); // pass text data straight to log (without being displayed) + IMGUI_API void LogTextV(const char* fmt, va_list args) IM_FMTLIST(1); + + // Drag and Drop + // - On source items, call BeginDragDropSource(), if it returns true also call SetDragDropPayload() + EndDragDropSource(). + // - On target candidates, call BeginDragDropTarget(), if it returns true also call AcceptDragDropPayload() + EndDragDropTarget(). + // - If you stop calling BeginDragDropSource() the payload is preserved however it won't have a preview tooltip (we currently display a fallback "..." tooltip, see #1725) + // - An item can be both drag source and drop target. + IMGUI_API bool BeginDragDropSource(ImGuiDragDropFlags flags = 0); // call after submitting an item which may be dragged. when this return true, you can call SetDragDropPayload() + EndDragDropSource() + IMGUI_API bool SetDragDropPayload(const char* type, const void* data, size_t sz, ImGuiCond cond = 0); // type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui. Return true when payload has been accepted. + IMGUI_API void EndDragDropSource(); // only call EndDragDropSource() if BeginDragDropSource() returns true! + IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget() + IMGUI_API const ImGuiPayload* AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0); // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released. + IMGUI_API void EndDragDropTarget(); // only call EndDragDropTarget() if BeginDragDropTarget() returns true! + IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. may return NULL. use ImGuiPayload::IsDataType() to test for the payload type. + + // Disabling [BETA API] + // - Disable all user interactions and dim items visuals (applying style.DisabledAlpha over current colors) + // - Those can be nested but it cannot be used to enable an already disabled section (a single BeginDisabled(true) in the stack is enough to keep everything disabled) + // - BeginDisabled(false) essentially does nothing useful but is provided to facilitate use of boolean expressions. If you can avoid calling BeginDisabled(False)/EndDisabled() best to avoid it. + IMGUI_API void BeginDisabled(bool disabled = true); + IMGUI_API void EndDisabled(); + + // Clipping + // - Mouse hovering is affected by ImGui::PushClipRect() calls, unlike direct calls to ImDrawList::PushClipRect() which are render only. + IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect); + IMGUI_API void PopClipRect(); + + // Focus, Activation + // - Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHereY()" when applicable to signify "this is the default item" + IMGUI_API void SetItemDefaultFocus(); // make last item the default focused item of a window. + IMGUI_API void SetKeyboardFocusHere(int offset = 0); // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget. + + // Item/Widgets Utilities and Query Functions + // - Most of the functions are referring to the previous Item that has been submitted. + // - See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions. + IMGUI_API bool IsItemHovered(ImGuiHoveredFlags flags = 0); // is the last item hovered? (and usable, aka not blocked by a popup, etc.). See ImGuiHoveredFlags for more options. + IMGUI_API bool IsItemActive(); // is the last item active? (e.g. button being held, text field being edited. This will continuously return true while holding mouse button on an item. Items that don't interact will always return false) + IMGUI_API bool IsItemFocused(); // is the last item focused for keyboard/gamepad navigation? + IMGUI_API bool IsItemClicked(ImGuiMouseButton mouse_button = 0); // is the last item hovered and mouse clicked on? (**) == IsMouseClicked(mouse_button) && IsItemHovered()Important. (**) this it NOT equivalent to the behavior of e.g. Button(). Read comments in function definition. + IMGUI_API bool IsItemVisible(); // is the last item visible? (items may be out of sight because of clipping/scrolling) + IMGUI_API bool IsItemEdited(); // did the last item modify its underlying value this frame? or was pressed? This is generally the same as the "bool" return value of many widgets. + IMGUI_API bool IsItemActivated(); // was the last item just made active (item was previously inactive). + IMGUI_API bool IsItemDeactivated(); // was the last item just made inactive (item was previously active). Useful for Undo/Redo patterns with widgets that requires continuous editing. + IMGUI_API bool IsItemDeactivatedAfterEdit(); // was the last item just made inactive and made a value change when it was active? (e.g. Slider/Drag moved). Useful for Undo/Redo patterns with widgets that requires continuous editing. Note that you may get false positives (some widgets such as Combo()/ListBox()/Selectable() will return true even when clicking an already selected item). + IMGUI_API bool IsItemToggledOpen(); // was the last item open state toggled? set by TreeNode(). + IMGUI_API bool IsAnyItemHovered(); // is any item hovered? + IMGUI_API bool IsAnyItemActive(); // is any item active? + IMGUI_API bool IsAnyItemFocused(); // is any item focused? + IMGUI_API ImVec2 GetItemRectMin(); // get upper-left bounding rectangle of the last item (screen space) + IMGUI_API ImVec2 GetItemRectMax(); // get lower-right bounding rectangle of the last item (screen space) + IMGUI_API ImVec2 GetItemRectSize(); // get size of last item + IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area. + + // Viewports + // - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. + // - In 'docking' branch with multi-viewport enabled, we extend this concept to have multiple active viewports. + // - In the future we will extend this concept further to also represent Platform Monitor and support a "no main platform window" operation mode. + IMGUI_API ImGuiViewport* GetMainViewport(); // return primary/default viewport. This can never be NULL. + + // Background/Foreground Draw Lists + IMGUI_API ImDrawList* GetBackgroundDrawList(); // this draw list will be the first rendered one. Useful to quickly draw shapes/text behind dear imgui contents. + IMGUI_API ImDrawList* GetForegroundDrawList(); // this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. + + // Miscellaneous Utilities + IMGUI_API bool IsRectVisible(const ImVec2& size); // test if rectangle (of given size, starting from cursor position) is visible / not clipped. + IMGUI_API bool IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max); // test if rectangle (in screen space) is visible / not clipped. to perform coarse clipping on user's side. + IMGUI_API double GetTime(); // get global imgui time. incremented by io.DeltaTime every frame. + IMGUI_API int GetFrameCount(); // get global imgui frame count. incremented by 1 every frame. + IMGUI_API ImDrawListSharedData* GetDrawListSharedData(); // you may use this when creating your own ImDrawList instances. + IMGUI_API const char* GetStyleColorName(ImGuiCol idx); // get a string corresponding to the enum value (for display, saving, etc.). + IMGUI_API void SetStateStorage(ImGuiStorage* storage); // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it) + IMGUI_API ImGuiStorage* GetStateStorage(); + IMGUI_API bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame + IMGUI_API void EndChildFrame(); // always call EndChildFrame() regardless of BeginChildFrame() return values (which indicates a collapsed/clipped window) + + // Text Utilities + IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); + + // Color Utilities + IMGUI_API ImVec4 ColorConvertU32ToFloat4(ImU32 in); + IMGUI_API ImU32 ColorConvertFloat4ToU32(const ImVec4& in); + IMGUI_API void ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v); + IMGUI_API void ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b); + + // Inputs Utilities: Keyboard + // Without IMGUI_DISABLE_OBSOLETE_KEYIO: (legacy support) + // - For 'ImGuiKey key' you can still use your legacy native/user indices according to how your backend/engine stored them in io.KeysDown[]. + // With IMGUI_DISABLE_OBSOLETE_KEYIO: (this is the way forward) + // - Any use of 'ImGuiKey' will assert when key < 512 will be passed, previously reserved as native/user keys indices + // - GetKeyIndex() is pass-through and therefore deprecated (gone if IMGUI_DISABLE_OBSOLETE_KEYIO is defined) + IMGUI_API bool IsKeyDown(ImGuiKey key); // is key being held. + IMGUI_API bool IsKeyPressed(ImGuiKey key, bool repeat = true); // was key pressed (went from !Down to Down)? if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate + IMGUI_API bool IsKeyReleased(ImGuiKey key); // was key released (went from Down to !Down)? + IMGUI_API int GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate + IMGUI_API const char* GetKeyName(ImGuiKey key); // [DEBUG] returns English name of the key. Those names a provided for debugging purpose and are not meant to be saved persistently not compared. + IMGUI_API void CaptureKeyboardFromApp(bool want_capture_keyboard_value = true); // attention: misleading name! manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application to handle). e.g. force capture keyboard when your widget is being hovered. This is equivalent to setting "io.WantCaptureKeyboard = want_capture_keyboard_value"; after the next NewFrame() call. + + // Inputs Utilities: Mouse + // - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right. + // - You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle. + // - Dragging operations are only reported after mouse has moved a certain distance away from the initial clicking position (see 'lock_threshold' and 'io.MouseDraggingThreshold') + IMGUI_API bool IsMouseDown(ImGuiMouseButton button); // is mouse button held? + IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, bool repeat = false); // did mouse button clicked? (went from !Down to Down). Same as GetMouseClickedCount() == 1. + IMGUI_API bool IsMouseReleased(ImGuiMouseButton button); // did mouse button released? (went from Down to !Down) + IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button); // did mouse button double-clicked? Same as GetMouseClickedCount() == 2. (note that a double-click will also report IsMouseClicked() == true) + IMGUI_API int GetMouseClickedCount(ImGuiMouseButton button); // return the number of successive mouse-clicks at the time where a click happen (otherwise 0). + IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);// is mouse hovering given bounding rect (in screen space). clipped by current clipping settings, but disregarding of other consideration of focus/window ordering/popup-block. + IMGUI_API bool IsMousePosValid(const ImVec2* mouse_pos = NULL); // by convention we use (-FLT_MAX,-FLT_MAX) to denote that there is no mouse available + IMGUI_API bool IsAnyMouseDown(); // [WILL OBSOLETE] is any mouse button held? This was designed for backends, but prefer having backend maintain a mask of held mouse buttons, because upcoming input queue system will make this invalid. + IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls + IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve mouse position at the time of opening popup we have BeginPopup() into (helper to avoid user backing that value themselves) + IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) + IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) + IMGUI_API void ResetMouseDragDelta(ImGuiMouseButton button = 0); // + IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired cursor type, reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you + IMGUI_API void SetMouseCursor(ImGuiMouseCursor cursor_type); // set desired cursor type + IMGUI_API void CaptureMouseFromApp(bool want_capture_mouse_value = true); // attention: misleading name! manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application to handle). This is equivalent to setting "io.WantCaptureMouse = want_capture_mouse_value;" after the next NewFrame() call. + + // Clipboard Utilities + // - Also see the LogToClipboard() function to capture GUI into clipboard, or easily output text data to the clipboard. + IMGUI_API const char* GetClipboardText(); + IMGUI_API void SetClipboardText(const char* text); + + // Settings/.Ini Utilities + // - The disk functions are automatically called if io.IniFilename != NULL (default is "imgui.ini"). + // - Set io.IniFilename to NULL to load/save manually. Read io.WantSaveIniSettings description about handling .ini saving manually. + // - Important: default value "imgui.ini" is relative to current working dir! Most apps will want to lock this to an absolute path (e.g. same path as executables). + IMGUI_API void LoadIniSettingsFromDisk(const char* ini_filename); // call after CreateContext() and before the first call to NewFrame(). NewFrame() automatically calls LoadIniSettingsFromDisk(io.IniFilename). + IMGUI_API void LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size=0); // call after CreateContext() and before the first call to NewFrame() to provide .ini data from your own data source. + IMGUI_API void SaveIniSettingsToDisk(const char* ini_filename); // this is automatically called (if io.IniFilename is not empty) a few seconds after any modification that should be reflected in the .ini file (and also by DestroyContext). + IMGUI_API const char* SaveIniSettingsToMemory(size_t* out_ini_size = NULL); // return a zero-terminated string with the .ini data which you can save by your own mean. call when io.WantSaveIniSettings is set, then save data by your own mean and clear io.WantSaveIniSettings. + + // Debug Utilities + IMGUI_API void DebugTextEncoding(const char* text); + IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx); // This is called by IMGUI_CHECKVERSION() macro. + + // Memory Allocators + // - Those functions are not reliant on the current context. + // - DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() + // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details. + IMGUI_API void SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data = NULL); + IMGUI_API void GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data); + IMGUI_API void* MemAlloc(size_t size); + IMGUI_API void MemFree(void* ptr); + +} // namespace ImGui + +//----------------------------------------------------------------------------- +// [SECTION] Flags & Enumerations +//----------------------------------------------------------------------------- + +// Flags for ImGui::Begin() +enum ImGuiWindowFlags_ +{ + ImGuiWindowFlags_None = 0, + ImGuiWindowFlags_NoTitleBar = 1 << 0, // Disable title-bar + ImGuiWindowFlags_NoResize = 1 << 1, // Disable user resizing with the lower-right grip + ImGuiWindowFlags_NoMove = 1 << 2, // Disable user moving the window + ImGuiWindowFlags_NoScrollbar = 1 << 3, // Disable scrollbars (window can still scroll with mouse or programmatically) + ImGuiWindowFlags_NoScrollWithMouse = 1 << 4, // Disable user vertically scrolling with mouse wheel. On child window, mouse wheel will be forwarded to the parent unless NoScrollbar is also set. + ImGuiWindowFlags_NoCollapse = 1 << 5, // Disable user collapsing window by double-clicking on it. Also referred to as Window Menu Button (e.g. within a docking node). + ImGuiWindowFlags_AlwaysAutoResize = 1 << 6, // Resize every window to its content every frame + ImGuiWindowFlags_NoBackground = 1 << 7, // Disable drawing background color (WindowBg, etc.) and outside border. Similar as using SetNextWindowBgAlpha(0.0f). + ImGuiWindowFlags_NoSavedSettings = 1 << 8, // Never load/save settings in .ini file + ImGuiWindowFlags_NoMouseInputs = 1 << 9, // Disable catching mouse, hovering test with pass through. + ImGuiWindowFlags_MenuBar = 1 << 10, // Has a menu-bar + ImGuiWindowFlags_HorizontalScrollbar = 1 << 11, // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section. + ImGuiWindowFlags_NoFocusOnAppearing = 1 << 12, // Disable taking focus when transitioning from hidden to visible state + ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programmatically giving it focus) + ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14, // Always show vertical scrollbar (even if ContentSize.y < Size.y) + ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15, // Always show horizontal scrollbar (even if ContentSize.x < Size.x) + ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16, // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient) + ImGuiWindowFlags_NoNavInputs = 1 << 18, // No gamepad/keyboard navigation within the window + ImGuiWindowFlags_NoNavFocus = 1 << 19, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB) + ImGuiWindowFlags_UnsavedDocument = 1 << 20, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + ImGuiWindowFlags_NoNav = ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, + ImGuiWindowFlags_NoDecoration = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse, + ImGuiWindowFlags_NoInputs = ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, + + // [Internal] + ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows. + ImGuiWindowFlags_ChildWindow = 1 << 24, // Don't use! For internal use by BeginChild() + ImGuiWindowFlags_Tooltip = 1 << 25, // Don't use! For internal use by BeginTooltip() + ImGuiWindowFlags_Popup = 1 << 26, // Don't use! For internal use by BeginPopup() + ImGuiWindowFlags_Modal = 1 << 27, // Don't use! For internal use by BeginPopupModal() + ImGuiWindowFlags_ChildMenu = 1 << 28 // Don't use! For internal use by BeginMenu() + //ImGuiWindowFlags_ResizeFromAnySide = 1 << 17, // [Obsolete] --> Set io.ConfigWindowsResizeFromEdges=true and make sure mouse cursors are supported by backend (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) +}; + +// Flags for ImGui::InputText() +enum ImGuiInputTextFlags_ +{ + ImGuiInputTextFlags_None = 0, + ImGuiInputTextFlags_CharsDecimal = 1 << 0, // Allow 0123456789.+-*/ + ImGuiInputTextFlags_CharsHexadecimal = 1 << 1, // Allow 0123456789ABCDEFabcdef + ImGuiInputTextFlags_CharsUppercase = 1 << 2, // Turn a..z into A..Z + ImGuiInputTextFlags_CharsNoBlank = 1 << 3, // Filter out spaces, tabs + ImGuiInputTextFlags_AutoSelectAll = 1 << 4, // Select entire text when first taking mouse focus + ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider looking at the IsItemDeactivatedAfterEdit() function. + ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Callback on pressing TAB (for completion handling) + ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Callback on pressing Up/Down arrows (for history handling) + ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Callback on each iteration. User code may query cursor position, modify text buffer. + ImGuiInputTextFlags_CallbackCharFilter = 1 << 9, // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. + ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field + ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter). + ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12, // Disable following the cursor horizontally + ImGuiInputTextFlags_AlwaysOverwrite = 1 << 13, // Overwrite mode + ImGuiInputTextFlags_ReadOnly = 1 << 14, // Read-only mode + ImGuiInputTextFlags_Password = 1 << 15, // Password mode, display all characters as '*' + ImGuiInputTextFlags_NoUndoRedo = 1 << 16, // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID(). + ImGuiInputTextFlags_CharsScientific = 1 << 17, // Allow 0123456789.+-*/eE (Scientific notation input) + ImGuiInputTextFlags_CallbackResize = 1 << 18, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this) + ImGuiInputTextFlags_CallbackEdit = 1 << 19 // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) + + // Obsolete names (will be removed soon) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + , ImGuiInputTextFlags_AlwaysInsertMode = ImGuiInputTextFlags_AlwaysOverwrite // [renamed in 1.82] name was not matching behavior +#endif +}; + +// Flags for ImGui::TreeNodeEx(), ImGui::CollapsingHeader*() +enum ImGuiTreeNodeFlags_ +{ + ImGuiTreeNodeFlags_None = 0, + ImGuiTreeNodeFlags_Selected = 1 << 0, // Draw as selected + ImGuiTreeNodeFlags_Framed = 1 << 1, // Draw frame with background (e.g. for CollapsingHeader) + ImGuiTreeNodeFlags_AllowItemOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one + ImGuiTreeNodeFlags_NoTreePushOnOpen = 1 << 3, // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack + ImGuiTreeNodeFlags_NoAutoOpenOnLog = 1 << 4, // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes) + ImGuiTreeNodeFlags_DefaultOpen = 1 << 5, // Default node to be open + ImGuiTreeNodeFlags_OpenOnDoubleClick = 1 << 6, // Need double-click to open node + ImGuiTreeNodeFlags_OpenOnArrow = 1 << 7, // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open. + ImGuiTreeNodeFlags_Leaf = 1 << 8, // No collapsing, no arrow (use as a convenience for leaf nodes). + ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow + ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding(). + ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line. In the future we may refactor the hit system to be front-to-back, allowing natural overlaps and then this can become the default. + ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (bypass the indented area). + ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop) + //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 14, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible + ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_NoAutoOpenOnLog +}; + +// Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions. +// - To be backward compatible with older API which took an 'int mouse_button = 1' argument, we need to treat +// small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags. +// It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags. +// - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0. +// IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter +// and want to another another flag, you need to pass in the ImGuiPopupFlags_MouseButtonRight flag. +// - Multiple buttons currently cannot be combined/or-ed in those functions (we could allow it later). +enum ImGuiPopupFlags_ +{ + ImGuiPopupFlags_None = 0, + ImGuiPopupFlags_MouseButtonLeft = 0, // For BeginPopupContext*(): open on Left Mouse release. Guaranteed to always be == 0 (same as ImGuiMouseButton_Left) + ImGuiPopupFlags_MouseButtonRight = 1, // For BeginPopupContext*(): open on Right Mouse release. Guaranteed to always be == 1 (same as ImGuiMouseButton_Right) + ImGuiPopupFlags_MouseButtonMiddle = 2, // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle) + ImGuiPopupFlags_MouseButtonMask_ = 0x1F, + ImGuiPopupFlags_MouseButtonDefault_ = 1, + ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack + ImGuiPopupFlags_NoOpenOverItems = 1 << 6, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space + ImGuiPopupFlags_AnyPopupId = 1 << 7, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. + ImGuiPopupFlags_AnyPopupLevel = 1 << 8, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) + ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel +}; + +// Flags for ImGui::Selectable() +enum ImGuiSelectableFlags_ +{ + ImGuiSelectableFlags_None = 0, + ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this don't close parent popup window + ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column) + ImGuiSelectableFlags_AllowDoubleClick = 1 << 2, // Generate press events on double clicks too + ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text + ImGuiSelectableFlags_AllowItemOverlap = 1 << 4 // (WIP) Hit testing to allow subsequent widgets to overlap this one +}; + +// Flags for ImGui::BeginCombo() +enum ImGuiComboFlags_ +{ + ImGuiComboFlags_None = 0, + ImGuiComboFlags_PopupAlignLeft = 1 << 0, // Align the popup toward the left by default + ImGuiComboFlags_HeightSmall = 1 << 1, // Max ~4 items visible. Tip: If you want your combo popup to be a specific size you can use SetNextWindowSizeConstraints() prior to calling BeginCombo() + ImGuiComboFlags_HeightRegular = 1 << 2, // Max ~8 items visible (default) + ImGuiComboFlags_HeightLarge = 1 << 3, // Max ~20 items visible + ImGuiComboFlags_HeightLargest = 1 << 4, // As many fitting items as possible + ImGuiComboFlags_NoArrowButton = 1 << 5, // Display on the preview box without the square arrow button + ImGuiComboFlags_NoPreview = 1 << 6, // Display only a square arrow button + ImGuiComboFlags_HeightMask_ = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest +}; + +// Flags for ImGui::BeginTabBar() +enum ImGuiTabBarFlags_ +{ + ImGuiTabBarFlags_None = 0, + ImGuiTabBarFlags_Reorderable = 1 << 0, // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list + ImGuiTabBarFlags_AutoSelectNewTabs = 1 << 1, // Automatically select new tabs when they appear + ImGuiTabBarFlags_TabListPopupButton = 1 << 2, // Disable buttons to open the tab list popup + ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. + ImGuiTabBarFlags_NoTabListScrollingButtons = 1 << 4, // Disable scrolling buttons (apply when fitting policy is ImGuiTabBarFlags_FittingPolicyScroll) + ImGuiTabBarFlags_NoTooltip = 1 << 5, // Disable tooltips when hovering a tab + ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 6, // Resize tabs when they don't fit + ImGuiTabBarFlags_FittingPolicyScroll = 1 << 7, // Add scroll buttons when tabs don't fit + ImGuiTabBarFlags_FittingPolicyMask_ = ImGuiTabBarFlags_FittingPolicyResizeDown | ImGuiTabBarFlags_FittingPolicyScroll, + ImGuiTabBarFlags_FittingPolicyDefault_ = ImGuiTabBarFlags_FittingPolicyResizeDown +}; + +// Flags for ImGui::BeginTabItem() +enum ImGuiTabItemFlags_ +{ + ImGuiTabItemFlags_None = 0, + ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Display a dot next to the title + tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + ImGuiTabItemFlags_SetSelected = 1 << 1, // Trigger flag to programmatically make the tab selected when calling BeginTabItem() + ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. + ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem() + ImGuiTabItemFlags_NoTooltip = 1 << 4, // Disable tooltip for the given tab + ImGuiTabItemFlags_NoReorder = 1 << 5, // Disable reordering this tab or having another tab cross over this tab + ImGuiTabItemFlags_Leading = 1 << 6, // Enforce the tab position to the left of the tab bar (after the tab list popup button) + ImGuiTabItemFlags_Trailing = 1 << 7 // Enforce the tab position to the right of the tab bar (before the scrolling buttons) +}; + +// Flags for ImGui::BeginTable() +// - Important! Sizing policies have complex and subtle side effects, much more so than you would expect. +// Read comments/demos carefully + experiment with live demos to get acquainted with them. +// - The DEFAULT sizing policies are: +// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize. +// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off. +// - When ScrollX is off: +// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight. +// - Columns sizing policy allowed: Stretch (default), Fixed/Auto. +// - Fixed Columns (if any) will generally obtain their requested width (unless the table cannot fit them all). +// - Stretch Columns will share the remaining width according to their respective weight. +// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors. +// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. +// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). +// - When ScrollX is on: +// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed +// - Columns sizing policy allowed: Fixed/Auto mostly. +// - Fixed Columns can be enlarged as needed. Table will show an horizontal scrollbar if needed. +// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop. +// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). +// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. +// - Read on documentation at the top of imgui_tables.cpp for details. +enum ImGuiTableFlags_ +{ + // Features + ImGuiTableFlags_None = 0, + ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns. + ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers) + ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu. + ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate. + ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file. + ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow(). + // Decorations + ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually) + ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows. + ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom. + ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns. + ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides. + ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders. + ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders. + ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders. + ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders. + ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders. + ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appears in Headers). -> May move to style + ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appears in Headers). -> May move to style + // Sizing Policy (read above for defaults) + ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width. + ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible. + ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths. + ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn(). + // Sizing Extra Options + ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. + ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible. + ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable. + ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. + // Clipping + ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze(). + // Padding + ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outer-most padding. Generally desirable if you have headers. + ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outer-most padding. + ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off). + // Scrolling + ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this create a child window, ScrollY is currently generally recommended when using ScrollX. + ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. + // Sorting + ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1). + ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0). + + // [Internal] Combinations and masks + ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame + + // Obsolete names (will be removed soon) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + //, ImGuiTableFlags_ColumnsWidthFixed = ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_ColumnsWidthStretch = ImGuiTableFlags_SizingStretchSame // WIP Tables 2020/12 + //, ImGuiTableFlags_SizingPolicyFixed = ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_SizingPolicyStretch = ImGuiTableFlags_SizingStretchSame // WIP Tables 2021/01 +#endif +}; + +// Flags for ImGui::TableSetupColumn() +enum ImGuiTableColumnFlags_ +{ + // Input configuration flags + ImGuiTableColumnFlags_None = 0, + ImGuiTableColumnFlags_Disabled = 1 << 0, // Overriding/master disable flag: hide column, won't show in context menu (unlike calling TableSetColumnEnabled() which manipulates the user accessible state) + ImGuiTableColumnFlags_DefaultHide = 1 << 1, // Default as a hidden/disabled column. + ImGuiTableColumnFlags_DefaultSort = 1 << 2, // Default as a sorting column. + ImGuiTableColumnFlags_WidthStretch = 1 << 3, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp). + ImGuiTableColumnFlags_WidthFixed = 1 << 4, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable). + ImGuiTableColumnFlags_NoResize = 1 << 5, // Disable manual resizing. + ImGuiTableColumnFlags_NoReorder = 1 << 6, // Disable manual reordering this column, this will also prevent other columns from crossing over this column. + ImGuiTableColumnFlags_NoHide = 1 << 7, // Disable ability to hide/disable this column. + ImGuiTableColumnFlags_NoClip = 1 << 8, // Disable clipping for this column (all NoClip columns will render in a same draw command). + ImGuiTableColumnFlags_NoSort = 1 << 9, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table). + ImGuiTableColumnFlags_NoSortAscending = 1 << 10, // Disable ability to sort in the ascending direction. + ImGuiTableColumnFlags_NoSortDescending = 1 << 11, // Disable ability to sort in the descending direction. + ImGuiTableColumnFlags_NoHeaderLabel = 1 << 12, // TableHeadersRow() will not submit label for this column. Convenient for some small columns. Name will still appear in context menu. + ImGuiTableColumnFlags_NoHeaderWidth = 1 << 13, // Disable header text width contribution to automatic column width. + ImGuiTableColumnFlags_PreferSortAscending = 1 << 14, // Make the initial sort direction Ascending when first sorting on this column (default). + ImGuiTableColumnFlags_PreferSortDescending = 1 << 15, // Make the initial sort direction Descending when first sorting on this column. + ImGuiTableColumnFlags_IndentEnable = 1 << 16, // Use current Indent value when entering cell (default for column 0). + ImGuiTableColumnFlags_IndentDisable = 1 << 17, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored. + + // Output status flags, read-only via TableGetColumnFlags() + ImGuiTableColumnFlags_IsEnabled = 1 << 24, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags. + ImGuiTableColumnFlags_IsVisible = 1 << 25, // Status: is visible == is enabled AND not clipped by scrolling. + ImGuiTableColumnFlags_IsSorted = 1 << 26, // Status: is currently part of the sort specs + ImGuiTableColumnFlags_IsHovered = 1 << 27, // Status: is hovered by mouse + + // [Internal] Combinations and masks + ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed, + ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable, + ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered, + ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30 // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge) + + // Obsolete names (will be removed soon) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + //ImGuiTableColumnFlags_WidthAuto = ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoResize, // Column will not stretch and keep resizing based on submitted contents. +#endif +}; + +// Flags for ImGui::TableNextRow() +enum ImGuiTableRowFlags_ +{ + ImGuiTableRowFlags_None = 0, + ImGuiTableRowFlags_Headers = 1 << 0 // Identify header row (set default background color + width of its contents accounted differently for auto column width) +}; + +// Enum for ImGui::TableSetBgColor() +// Background colors are rendering in 3 layers: +// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set. +// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set. +// - Layer 2: draw with CellBg color if set. +// The purpose of the two row/columns layers is to let you decide if a background color changes should override or blend with the existing color. +// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows. +// If you set the color of RowBg0 target, your color will override the existing RowBg0 color. +// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color. +enum ImGuiTableBgTarget_ +{ + ImGuiTableBgTarget_None = 0, + ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used) + ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking) + ImGuiTableBgTarget_CellBg = 3 // Set cell background color (top-most color) +}; + +// Flags for ImGui::IsWindowFocused() +enum ImGuiFocusedFlags_ +{ + ImGuiFocusedFlags_None = 0, + ImGuiFocusedFlags_ChildWindows = 1 << 0, // Return true if any children of the window is focused + ImGuiFocusedFlags_RootWindow = 1 << 1, // Test from root window (top most parent of the current hierarchy) + ImGuiFocusedFlags_AnyWindow = 1 << 2, // Return true if any window is focused. Important: If you are trying to tell how to dispatch your low-level inputs, do NOT use this. Use 'io.WantCaptureMouse' instead! Please read the FAQ! + ImGuiFocusedFlags_NoPopupHierarchy = 1 << 3, // Do not consider popup hierarchy (do not treat popup emitter as parent of popup) (when used with _ChildWindows or _RootWindow) + //ImGuiFocusedFlags_DockHierarchy = 1 << 4, // Consider docking hierarchy (treat dockspace host as parent of docked window) (when used with _ChildWindows or _RootWindow) + ImGuiFocusedFlags_RootAndChildWindows = ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows +}; + +// Flags for ImGui::IsItemHovered(), ImGui::IsWindowHovered() +// Note: if you are trying to check whether your mouse should be dispatched to Dear ImGui or to your app, you should use 'io.WantCaptureMouse' instead! Please read the FAQ! +// Note: windows with the ImGuiWindowFlags_NoInputs flag are ignored by IsWindowHovered() calls. +enum ImGuiHoveredFlags_ +{ + ImGuiHoveredFlags_None = 0, // Return true if directly over the item/window, not obstructed by another window, not obstructed by an active popup or modal blocking inputs under them. + ImGuiHoveredFlags_ChildWindows = 1 << 0, // IsWindowHovered() only: Return true if any children of the window is hovered + ImGuiHoveredFlags_RootWindow = 1 << 1, // IsWindowHovered() only: Test from root window (top most parent of the current hierarchy) + ImGuiHoveredFlags_AnyWindow = 1 << 2, // IsWindowHovered() only: Return true if any window is hovered + ImGuiHoveredFlags_NoPopupHierarchy = 1 << 3, // IsWindowHovered() only: Do not consider popup hierarchy (do not treat popup emitter as parent of popup) (when used with _ChildWindows or _RootWindow) + //ImGuiHoveredFlags_DockHierarchy = 1 << 4, // IsWindowHovered() only: Consider docking hierarchy (treat dockspace host as parent of docked window) (when used with _ChildWindows or _RootWindow) + ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 5, // Return true even if a popup window is normally blocking access to this item/window + //ImGuiHoveredFlags_AllowWhenBlockedByModal = 1 << 6, // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet. + ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 7, // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns. + ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 8, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window + ImGuiHoveredFlags_AllowWhenDisabled = 1 << 9, // IsItemHovered() only: Return true even if the item is disabled + ImGuiHoveredFlags_NoNavOverride = 1 << 10, // Disable using gamepad/keyboard navigation state when active, always query mouse. + ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped, + ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows +}; + +// Flags for ImGui::BeginDragDropSource(), ImGui::AcceptDragDropPayload() +enum ImGuiDragDropFlags_ +{ + ImGuiDragDropFlags_None = 0, + // BeginDragDropSource() flags + ImGuiDragDropFlags_SourceNoPreviewTooltip = 1 << 0, // By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the source contents. This flag disable this behavior. + ImGuiDragDropFlags_SourceNoDisableHover = 1 << 1, // By default, when dragging we clear data so that IsItemHovered() will return false, to avoid subsequent user code submitting tooltips. This flag disable this behavior so you can still call IsItemHovered() on the source item. + ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2, // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item. + ImGuiDragDropFlags_SourceAllowNullID = 1 << 3, // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit. + ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of dear imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously. + ImGuiDragDropFlags_SourceAutoExpirePayload = 1 << 5, // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged) + // AcceptDragDropPayload() flags + ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10, // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered. + ImGuiDragDropFlags_AcceptNoDrawDefaultRect = 1 << 11, // Do not draw the default highlight rectangle when hovering over target. + ImGuiDragDropFlags_AcceptNoPreviewTooltip = 1 << 12, // Request hiding the BeginDragDropSource tooltip from the BeginDragDropTarget site. + ImGuiDragDropFlags_AcceptPeekOnly = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoDrawDefaultRect // For peeking ahead and inspecting the payload before delivery. +}; + +// Standard Drag and Drop payload types. You can define you own payload types using short strings. Types starting with '_' are defined by Dear ImGui. +#define IMGUI_PAYLOAD_TYPE_COLOR_3F "_COL3F" // float[3]: Standard type for colors, without alpha. User code may use this type. +#define IMGUI_PAYLOAD_TYPE_COLOR_4F "_COL4F" // float[4]: Standard type for colors. User code may use this type. + +// A primary data type +enum ImGuiDataType_ +{ + ImGuiDataType_S8, // signed char / char (with sensible compilers) + ImGuiDataType_U8, // unsigned char + ImGuiDataType_S16, // short + ImGuiDataType_U16, // unsigned short + ImGuiDataType_S32, // int + ImGuiDataType_U32, // unsigned int + ImGuiDataType_S64, // long long / __int64 + ImGuiDataType_U64, // unsigned long long / unsigned __int64 + ImGuiDataType_Float, // float + ImGuiDataType_Double, // double + ImGuiDataType_COUNT +}; + +// A cardinal direction +enum ImGuiDir_ +{ + ImGuiDir_None = -1, + ImGuiDir_Left = 0, + ImGuiDir_Right = 1, + ImGuiDir_Up = 2, + ImGuiDir_Down = 3, + ImGuiDir_COUNT +}; + +// A sorting direction +enum ImGuiSortDirection_ +{ + ImGuiSortDirection_None = 0, + ImGuiSortDirection_Ascending = 1, // Ascending = 0->9, A->Z etc. + ImGuiSortDirection_Descending = 2 // Descending = 9->0, Z->A etc. +}; + +enum ImGuiKey_ +{ + // Keyboard + ImGuiKey_None = 0, + ImGuiKey_Tab = 512, // == ImGuiKey_NamedKey_BEGIN + ImGuiKey_LeftArrow, + ImGuiKey_RightArrow, + ImGuiKey_UpArrow, + ImGuiKey_DownArrow, + ImGuiKey_PageUp, + ImGuiKey_PageDown, + ImGuiKey_Home, + ImGuiKey_End, + ImGuiKey_Insert, + ImGuiKey_Delete, + ImGuiKey_Backspace, + ImGuiKey_Space, + ImGuiKey_Enter, + ImGuiKey_Escape, + ImGuiKey_LeftCtrl, ImGuiKey_LeftShift, ImGuiKey_LeftAlt, ImGuiKey_LeftSuper, + ImGuiKey_RightCtrl, ImGuiKey_RightShift, ImGuiKey_RightAlt, ImGuiKey_RightSuper, + ImGuiKey_Menu, + ImGuiKey_0, ImGuiKey_1, ImGuiKey_2, ImGuiKey_3, ImGuiKey_4, ImGuiKey_5, ImGuiKey_6, ImGuiKey_7, ImGuiKey_8, ImGuiKey_9, + ImGuiKey_A, ImGuiKey_B, ImGuiKey_C, ImGuiKey_D, ImGuiKey_E, ImGuiKey_F, ImGuiKey_G, ImGuiKey_H, ImGuiKey_I, ImGuiKey_J, + ImGuiKey_K, ImGuiKey_L, ImGuiKey_M, ImGuiKey_N, ImGuiKey_O, ImGuiKey_P, ImGuiKey_Q, ImGuiKey_R, ImGuiKey_S, ImGuiKey_T, + ImGuiKey_U, ImGuiKey_V, ImGuiKey_W, ImGuiKey_X, ImGuiKey_Y, ImGuiKey_Z, + ImGuiKey_F1, ImGuiKey_F2, ImGuiKey_F3, ImGuiKey_F4, ImGuiKey_F5, ImGuiKey_F6, + ImGuiKey_F7, ImGuiKey_F8, ImGuiKey_F9, ImGuiKey_F10, ImGuiKey_F11, ImGuiKey_F12, + ImGuiKey_Apostrophe, // ' + ImGuiKey_Comma, // , + ImGuiKey_Minus, // - + ImGuiKey_Period, // . + ImGuiKey_Slash, // / + ImGuiKey_Semicolon, // ; + ImGuiKey_Equal, // = + ImGuiKey_LeftBracket, // [ + ImGuiKey_Backslash, // \ (this text inhibit multiline comment caused by backslash) + ImGuiKey_RightBracket, // ] + ImGuiKey_GraveAccent, // ` + ImGuiKey_CapsLock, + ImGuiKey_ScrollLock, + ImGuiKey_NumLock, + ImGuiKey_PrintScreen, + ImGuiKey_Pause, + ImGuiKey_Keypad0, ImGuiKey_Keypad1, ImGuiKey_Keypad2, ImGuiKey_Keypad3, ImGuiKey_Keypad4, + ImGuiKey_Keypad5, ImGuiKey_Keypad6, ImGuiKey_Keypad7, ImGuiKey_Keypad8, ImGuiKey_Keypad9, + ImGuiKey_KeypadDecimal, + ImGuiKey_KeypadDivide, + ImGuiKey_KeypadMultiply, + ImGuiKey_KeypadSubtract, + ImGuiKey_KeypadAdd, + ImGuiKey_KeypadEnter, + ImGuiKey_KeypadEqual, + + // Gamepad (some of those are analog values, 0.0f to 1.0f) // NAVIGATION action + ImGuiKey_GamepadStart, // Menu (Xbox) + (Switch) Start/Options (PS) // -- + ImGuiKey_GamepadBack, // View (Xbox) - (Switch) Share (PS) // -- + ImGuiKey_GamepadFaceUp, // Y (Xbox) X (Switch) Triangle (PS) // -> ImGuiNavInput_Input + ImGuiKey_GamepadFaceDown, // A (Xbox) B (Switch) Cross (PS) // -> ImGuiNavInput_Activate + ImGuiKey_GamepadFaceLeft, // X (Xbox) Y (Switch) Square (PS) // -> ImGuiNavInput_Menu + ImGuiKey_GamepadFaceRight, // B (Xbox) A (Switch) Circle (PS) // -> ImGuiNavInput_Cancel + ImGuiKey_GamepadDpadUp, // D-pad Up // -> ImGuiNavInput_DpadUp + ImGuiKey_GamepadDpadDown, // D-pad Down // -> ImGuiNavInput_DpadDown + ImGuiKey_GamepadDpadLeft, // D-pad Left // -> ImGuiNavInput_DpadLeft + ImGuiKey_GamepadDpadRight, // D-pad Right // -> ImGuiNavInput_DpadRight + ImGuiKey_GamepadL1, // L Bumper (Xbox) L (Switch) L1 (PS) // -> ImGuiNavInput_FocusPrev + ImGuiNavInput_TweakSlow + ImGuiKey_GamepadR1, // R Bumper (Xbox) R (Switch) R1 (PS) // -> ImGuiNavInput_FocusNext + ImGuiNavInput_TweakFast + ImGuiKey_GamepadL2, // L Trigger (Xbox) ZL (Switch) L2 (PS) [Analog] + ImGuiKey_GamepadR2, // R Trigger (Xbox) ZR (Switch) R2 (PS) [Analog] + ImGuiKey_GamepadL3, // L Thumbstick (Xbox) L3 (Switch) L3 (PS) + ImGuiKey_GamepadR3, // R Thumbstick (Xbox) R3 (Switch) R3 (PS) + ImGuiKey_GamepadLStickUp, // [Analog] // -> ImGuiNavInput_LStickUp + ImGuiKey_GamepadLStickDown, // [Analog] // -> ImGuiNavInput_LStickDown + ImGuiKey_GamepadLStickLeft, // [Analog] // -> ImGuiNavInput_LStickLeft + ImGuiKey_GamepadLStickRight, // [Analog] // -> ImGuiNavInput_LStickRight + ImGuiKey_GamepadRStickUp, // [Analog] + ImGuiKey_GamepadRStickDown, // [Analog] + ImGuiKey_GamepadRStickLeft, // [Analog] + ImGuiKey_GamepadRStickRight, // [Analog] + + // Keyboard Modifiers (explicitly submitted by backend via AddKeyEvent() calls) + // - This is mirroring the data also written to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper, in a format allowing + // them to be accessed via standard key API, allowing calls such as IsKeyPressed(), IsKeyReleased(), querying duration etc. + // - Code polling every keys (e.g. an interface to detect a key press for input mapping) might want to ignore those + // and prefer using the real keys (e.g. ImGuiKey_LeftCtrl, ImGuiKey_RightCtrl instead of ImGuiKey_ModCtrl). + // - In theory the value of keyboard modifiers should be roughly equivalent to a logical or of the equivalent left/right keys. + // In practice: it's complicated; mods are often provided from different sources. Keyboard layout, IME, sticky keys and + // backends tend to interfere and break that equivalence. The safer decision is to relay that ambiguity down to the end-user... + ImGuiKey_ModCtrl, ImGuiKey_ModShift, ImGuiKey_ModAlt, ImGuiKey_ModSuper, + + // End of list + ImGuiKey_COUNT, // No valid ImGuiKey is ever greater than this value + + // [Internal] Prior to 1.87 we required user to fill io.KeysDown[512] using their own native index + a io.KeyMap[] array. + // We are ditching this method but keeping a legacy path for user code doing e.g. IsKeyPressed(MY_NATIVE_KEY_CODE) + ImGuiKey_NamedKey_BEGIN = 512, + ImGuiKey_NamedKey_END = ImGuiKey_COUNT, + ImGuiKey_NamedKey_COUNT = ImGuiKey_NamedKey_END - ImGuiKey_NamedKey_BEGIN, +#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO + ImGuiKey_KeysData_SIZE = ImGuiKey_NamedKey_COUNT, // Size of KeysData[]: only hold named keys + ImGuiKey_KeysData_OFFSET = ImGuiKey_NamedKey_BEGIN // First key stored in KeysData[0] +#else + ImGuiKey_KeysData_SIZE = ImGuiKey_COUNT, // Size of KeysData[]: hold legacy 0..512 keycodes + named keys + ImGuiKey_KeysData_OFFSET = 0 // First key stored in KeysData[0] +#endif + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + , ImGuiKey_KeyPadEnter = ImGuiKey_KeypadEnter // Renamed in 1.87 +#endif +}; + +// Helper "flags" version of key-mods to store and compare multiple key-mods easily. Sometimes used for storage (e.g. io.KeyMods) but otherwise not much used in public API. +enum ImGuiModFlags_ +{ + ImGuiModFlags_None = 0, + ImGuiModFlags_Ctrl = 1 << 0, + ImGuiModFlags_Shift = 1 << 1, + ImGuiModFlags_Alt = 1 << 2, // Menu + ImGuiModFlags_Super = 1 << 3 // Cmd/Super/Windows key +}; + +// Gamepad/Keyboard navigation +// Keyboard: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard to enable. NewFrame() will automatically fill io.NavInputs[] based on your io.AddKeyEvent() calls. +// Gamepad: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable. Backend: set ImGuiBackendFlags_HasGamepad and fill the io.NavInputs[] fields before calling NewFrame(). Note that io.NavInputs[] is cleared by EndFrame(). +// Read instructions in imgui.cpp for more details. Download PNG/PSD at http://dearimgui.org/controls_sheets. +enum ImGuiNavInput_ +{ + // Gamepad Mapping + ImGuiNavInput_Activate, // Activate / Open / Toggle / Tweak value // e.g. Cross (PS4), A (Xbox), A (Switch), Space (Keyboard) + ImGuiNavInput_Cancel, // Cancel / Close / Exit // e.g. Circle (PS4), B (Xbox), B (Switch), Escape (Keyboard) + ImGuiNavInput_Input, // Text input / On-Screen keyboard // e.g. Triang.(PS4), Y (Xbox), X (Switch), Return (Keyboard) + ImGuiNavInput_Menu, // Tap: Toggle menu / Hold: Focus, Move, Resize // e.g. Square (PS4), X (Xbox), Y (Switch), Alt (Keyboard) + ImGuiNavInput_DpadLeft, // Move / Tweak / Resize window (w/ PadMenu) // e.g. D-pad Left/Right/Up/Down (Gamepads), Arrow keys (Keyboard) + ImGuiNavInput_DpadRight, // + ImGuiNavInput_DpadUp, // + ImGuiNavInput_DpadDown, // + ImGuiNavInput_LStickLeft, // Scroll / Move window (w/ PadMenu) // e.g. Left Analog Stick Left/Right/Up/Down + ImGuiNavInput_LStickRight, // + ImGuiNavInput_LStickUp, // + ImGuiNavInput_LStickDown, // + ImGuiNavInput_FocusPrev, // Focus Next window (w/ PadMenu) // e.g. L1 or L2 (PS4), LB or LT (Xbox), L or ZL (Switch) + ImGuiNavInput_FocusNext, // Focus Prev window (w/ PadMenu) // e.g. R1 or R2 (PS4), RB or RT (Xbox), R or ZL (Switch) + ImGuiNavInput_TweakSlow, // Slower tweaks // e.g. L1 or L2 (PS4), LB or LT (Xbox), L or ZL (Switch) + ImGuiNavInput_TweakFast, // Faster tweaks // e.g. R1 or R2 (PS4), RB or RT (Xbox), R or ZL (Switch) + + // [Internal] Don't use directly! This is used internally to differentiate keyboard from gamepad inputs for behaviors that require to differentiate them. + // Keyboard behavior that have no corresponding gamepad mapping (e.g. CTRL+TAB) will be directly reading from keyboard keys instead of io.NavInputs[]. + ImGuiNavInput_KeyLeft_, // Move left // = Arrow keys + ImGuiNavInput_KeyRight_, // Move right + ImGuiNavInput_KeyUp_, // Move up + ImGuiNavInput_KeyDown_, // Move down + ImGuiNavInput_COUNT +}; + +// Configuration flags stored in io.ConfigFlags. Set by user/application. +enum ImGuiConfigFlags_ +{ + ImGuiConfigFlags_None = 0, + ImGuiConfigFlags_NavEnableKeyboard = 1 << 0, // Master keyboard navigation enable flag. NewFrame() will automatically fill io.NavInputs[] based on io.AddKeyEvent() calls + ImGuiConfigFlags_NavEnableGamepad = 1 << 1, // Master gamepad navigation enable flag. This is mostly to instruct your imgui backend to fill io.NavInputs[]. Backend also needs to set ImGuiBackendFlags_HasGamepad. + ImGuiConfigFlags_NavEnableSetMousePos = 1 << 2, // Instruct navigation to move the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is awkward. Will update io.MousePos and set io.WantSetMousePos=true. If enabled you MUST honor io.WantSetMousePos requests in your backend, otherwise ImGui will react as if the mouse is jumping around back and forth. + ImGuiConfigFlags_NavNoCaptureKeyboard = 1 << 3, // Instruct navigation to not set the io.WantCaptureKeyboard flag when io.NavActive is set. + ImGuiConfigFlags_NoMouse = 1 << 4, // Instruct imgui to clear mouse position/buttons in NewFrame(). This allows ignoring the mouse information set by the backend. + ImGuiConfigFlags_NoMouseCursorChange = 1 << 5, // Instruct backend to not alter mouse cursor shape and visibility. Use if the backend cursor changes are interfering with yours and you don't want to use SetMouseCursor() to change mouse cursor. You may want to honor requests from imgui by reading GetMouseCursor() yourself instead. + + // User storage (to allow your backend/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core Dear ImGui) + ImGuiConfigFlags_IsSRGB = 1 << 20, // Application is SRGB-aware. + ImGuiConfigFlags_IsTouchScreen = 1 << 21 // Application is using a touch screen instead of a mouse. +}; + +// Backend capabilities flags stored in io.BackendFlags. Set by imgui_impl_xxx or custom backend. +enum ImGuiBackendFlags_ +{ + ImGuiBackendFlags_None = 0, + ImGuiBackendFlags_HasGamepad = 1 << 0, // Backend Platform supports gamepad and currently has one connected. + ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Backend Platform supports honoring GetMouseCursor() value to change the OS cursor shape. + ImGuiBackendFlags_HasSetMousePos = 1 << 2, // Backend Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set). + ImGuiBackendFlags_RendererHasVtxOffset = 1 << 3 // Backend Renderer supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bit indices. +}; + +// Enumeration for PushStyleColor() / PopStyleColor() +enum ImGuiCol_ +{ + ImGuiCol_Text, + ImGuiCol_TextDisabled, + ImGuiCol_WindowBg, // Background of normal windows + ImGuiCol_ChildBg, // Background of child windows + ImGuiCol_PopupBg, // Background of popups, menus, tooltips windows + ImGuiCol_Border, + ImGuiCol_BorderShadow, + ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input + ImGuiCol_FrameBgHovered, + ImGuiCol_FrameBgActive, + ImGuiCol_TitleBg, + ImGuiCol_TitleBgActive, + ImGuiCol_TitleBgCollapsed, + ImGuiCol_MenuBarBg, + ImGuiCol_ScrollbarBg, + ImGuiCol_ScrollbarGrab, + ImGuiCol_ScrollbarGrabHovered, + ImGuiCol_ScrollbarGrabActive, + ImGuiCol_CheckMark, + ImGuiCol_SliderGrab, + ImGuiCol_SliderGrabActive, + ImGuiCol_Button, + ImGuiCol_ButtonHovered, + ImGuiCol_ButtonActive, + ImGuiCol_Header, // Header* colors are used for CollapsingHeader, TreeNode, Selectable, MenuItem + ImGuiCol_HeaderHovered, + ImGuiCol_HeaderActive, + ImGuiCol_Separator, + ImGuiCol_SeparatorHovered, + ImGuiCol_SeparatorActive, + ImGuiCol_ResizeGrip, + ImGuiCol_ResizeGripHovered, + ImGuiCol_ResizeGripActive, + ImGuiCol_Tab, + ImGuiCol_TabHovered, + ImGuiCol_TabActive, + ImGuiCol_TabUnfocused, + ImGuiCol_TabUnfocusedActive, + ImGuiCol_PlotLines, + ImGuiCol_PlotLinesHovered, + ImGuiCol_PlotHistogram, + ImGuiCol_PlotHistogramHovered, + ImGuiCol_TableHeaderBg, // Table header background + ImGuiCol_TableBorderStrong, // Table outer and header borders (prefer using Alpha=1.0 here) + ImGuiCol_TableBorderLight, // Table inner borders (prefer using Alpha=1.0 here) + ImGuiCol_TableRowBg, // Table row background (even rows) + ImGuiCol_TableRowBgAlt, // Table row background (odd rows) + ImGuiCol_TextSelectedBg, + ImGuiCol_DragDropTarget, + ImGuiCol_NavHighlight, // Gamepad/keyboard: current highlighted item + ImGuiCol_NavWindowingHighlight, // Highlight window when using CTRL+TAB + ImGuiCol_NavWindowingDimBg, // Darken/colorize entire screen behind the CTRL+TAB window list, when active + ImGuiCol_ModalWindowDimBg, // Darken/colorize entire screen behind a modal window, when one is active + ImGuiCol_COUNT +}; + +// Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure. +// - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. +// During initialization or between frames, feel free to just poke into ImGuiStyle directly. +// - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description. +// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. +enum ImGuiStyleVar_ +{ + // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) + ImGuiStyleVar_Alpha, // float Alpha + ImGuiStyleVar_DisabledAlpha, // float DisabledAlpha + ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding + ImGuiStyleVar_WindowRounding, // float WindowRounding + ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize + ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize + ImGuiStyleVar_WindowTitleAlign, // ImVec2 WindowTitleAlign + ImGuiStyleVar_ChildRounding, // float ChildRounding + ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize + ImGuiStyleVar_PopupRounding, // float PopupRounding + ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize + ImGuiStyleVar_FramePadding, // ImVec2 FramePadding + ImGuiStyleVar_FrameRounding, // float FrameRounding + ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize + ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing + ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing + ImGuiStyleVar_IndentSpacing, // float IndentSpacing + ImGuiStyleVar_CellPadding, // ImVec2 CellPadding + ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize + ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding + ImGuiStyleVar_GrabMinSize, // float GrabMinSize + ImGuiStyleVar_GrabRounding, // float GrabRounding + ImGuiStyleVar_TabRounding, // float TabRounding + ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign + ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign + ImGuiStyleVar_COUNT +}; + +// Flags for InvisibleButton() [extended in imgui_internal.h] +enum ImGuiButtonFlags_ +{ + ImGuiButtonFlags_None = 0, + ImGuiButtonFlags_MouseButtonLeft = 1 << 0, // React on left mouse button (default) + ImGuiButtonFlags_MouseButtonRight = 1 << 1, // React on right mouse button + ImGuiButtonFlags_MouseButtonMiddle = 1 << 2, // React on center mouse button + + // [Internal] + ImGuiButtonFlags_MouseButtonMask_ = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle, + ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft +}; + +// Flags for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton() +enum ImGuiColorEditFlags_ +{ + ImGuiColorEditFlags_None = 0, + ImGuiColorEditFlags_NoAlpha = 1 << 1, // // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (will only read 3 components from the input pointer). + ImGuiColorEditFlags_NoPicker = 1 << 2, // // ColorEdit: disable picker when clicking on color square. + ImGuiColorEditFlags_NoOptions = 1 << 3, // // ColorEdit: disable toggling options menu when right-clicking on inputs/small preview. + ImGuiColorEditFlags_NoSmallPreview = 1 << 4, // // ColorEdit, ColorPicker: disable color square preview next to the inputs. (e.g. to show only the inputs) + ImGuiColorEditFlags_NoInputs = 1 << 5, // // ColorEdit, ColorPicker: disable inputs sliders/text widgets (e.g. to show only the small preview color square). + ImGuiColorEditFlags_NoTooltip = 1 << 6, // // ColorEdit, ColorPicker, ColorButton: disable tooltip when hovering the preview. + ImGuiColorEditFlags_NoLabel = 1 << 7, // // ColorEdit, ColorPicker: disable display of inline text label (the label is still forwarded to the tooltip and picker). + ImGuiColorEditFlags_NoSidePreview = 1 << 8, // // ColorPicker: disable bigger color preview on right side of the picker, use small color square preview instead. + ImGuiColorEditFlags_NoDragDrop = 1 << 9, // // ColorEdit: disable drag and drop target. ColorButton: disable drag and drop source. + ImGuiColorEditFlags_NoBorder = 1 << 10, // // ColorButton: disable border (which is enforced by default) + + // User Options (right-click on widget to change some of them). + ImGuiColorEditFlags_AlphaBar = 1 << 16, // // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker. + ImGuiColorEditFlags_AlphaPreview = 1 << 17, // // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque. + ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 18, // // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque. + ImGuiColorEditFlags_HDR = 1 << 19, // // (WIP) ColorEdit: Currently only disable 0.0f..1.0f limits in RGBA edition (note: you probably want to use ImGuiColorEditFlags_Float flag as well). + ImGuiColorEditFlags_DisplayRGB = 1 << 20, // [Display] // ColorEdit: override _display_ type among RGB/HSV/Hex. ColorPicker: select any combination using one or more of RGB/HSV/Hex. + ImGuiColorEditFlags_DisplayHSV = 1 << 21, // [Display] // " + ImGuiColorEditFlags_DisplayHex = 1 << 22, // [Display] // " + ImGuiColorEditFlags_Uint8 = 1 << 23, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0..255. + ImGuiColorEditFlags_Float = 1 << 24, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0.0f..1.0f floats instead of 0..255 integers. No round-trip of value via integers. + ImGuiColorEditFlags_PickerHueBar = 1 << 25, // [Picker] // ColorPicker: bar for Hue, rectangle for Sat/Value. + ImGuiColorEditFlags_PickerHueWheel = 1 << 26, // [Picker] // ColorPicker: wheel for Hue, triangle for Sat/Value. + ImGuiColorEditFlags_InputRGB = 1 << 27, // [Input] // ColorEdit, ColorPicker: input and output data in RGB format. + ImGuiColorEditFlags_InputHSV = 1 << 28, // [Input] // ColorEdit, ColorPicker: input and output data in HSV format. + + // Defaults Options. You can set application defaults using SetColorEditOptions(). The intent is that you probably don't want to + // override them in most of your calls. Let the user choose via the option menu and/or call SetColorEditOptions() once during startup. + ImGuiColorEditFlags_DefaultOptions_ = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_PickerHueBar, + + // [Internal] Masks + ImGuiColorEditFlags_DisplayMask_ = ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_DisplayHex, + ImGuiColorEditFlags_DataTypeMask_ = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_Float, + ImGuiColorEditFlags_PickerMask_ = ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_PickerHueBar, + ImGuiColorEditFlags_InputMask_ = ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_InputHSV + + // Obsolete names (will be removed) + // ImGuiColorEditFlags_RGB = ImGuiColorEditFlags_DisplayRGB, ImGuiColorEditFlags_HSV = ImGuiColorEditFlags_DisplayHSV, ImGuiColorEditFlags_HEX = ImGuiColorEditFlags_DisplayHex // [renamed in 1.69] +}; + +// Flags for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. +// We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them. +enum ImGuiSliderFlags_ +{ + ImGuiSliderFlags_None = 0, + ImGuiSliderFlags_AlwaysClamp = 1 << 4, // Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds. + ImGuiSliderFlags_Logarithmic = 1 << 5, // Make the widget logarithmic (linear otherwise). Consider using ImGuiSliderFlags_NoRoundToFormat with this if using a format-string with small amount of digits. + ImGuiSliderFlags_NoRoundToFormat = 1 << 6, // Disable rounding underlying value to match precision of the display format string (e.g. %.3f values are rounded to those 3 digits) + ImGuiSliderFlags_NoInput = 1 << 7, // Disable CTRL+Click or Enter key allowing to input text directly into the widget + ImGuiSliderFlags_InvalidMask_ = 0x7000000F // [Internal] We treat using those bits as being potentially a 'float power' argument from the previous API that has got miscast to this enum, and will trigger an assert if needed. + + // Obsolete names (will be removed) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + , ImGuiSliderFlags_ClampOnInput = ImGuiSliderFlags_AlwaysClamp // [renamed in 1.79] +#endif +}; + +// Identify a mouse button. +// Those values are guaranteed to be stable and we frequently use 0/1 directly. Named enums provided for convenience. +enum ImGuiMouseButton_ +{ + ImGuiMouseButton_Left = 0, + ImGuiMouseButton_Right = 1, + ImGuiMouseButton_Middle = 2, + ImGuiMouseButton_COUNT = 5 +}; + +// Enumeration for GetMouseCursor() +// User code may request backend to display given cursor by calling SetMouseCursor(), which is why we have some cursors that are marked unused here +enum ImGuiMouseCursor_ +{ + ImGuiMouseCursor_None = -1, + ImGuiMouseCursor_Arrow = 0, + ImGuiMouseCursor_TextInput, // When hovering over InputText, etc. + ImGuiMouseCursor_ResizeAll, // (Unused by Dear ImGui functions) + ImGuiMouseCursor_ResizeNS, // When hovering over an horizontal border + ImGuiMouseCursor_ResizeEW, // When hovering over a vertical border or a column + ImGuiMouseCursor_ResizeNESW, // When hovering over the bottom-left corner of a window + ImGuiMouseCursor_ResizeNWSE, // When hovering over the bottom-right corner of a window + ImGuiMouseCursor_Hand, // (Unused by Dear ImGui functions. Use for e.g. hyperlinks) + ImGuiMouseCursor_NotAllowed, // When hovering something with disallowed interaction. Usually a crossed circle. + ImGuiMouseCursor_COUNT +}; + +// Enumeration for ImGui::SetWindow***(), SetNextWindow***(), SetNextItem***() functions +// Represent a condition. +// Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always. +enum ImGuiCond_ +{ + ImGuiCond_None = 0, // No condition (always set the variable), same as _Always + ImGuiCond_Always = 1 << 0, // No condition (always set the variable) + ImGuiCond_Once = 1 << 1, // Set the variable once per runtime session (only the first call will succeed) + ImGuiCond_FirstUseEver = 1 << 2, // Set the variable if the object/window has no persistently saved data (no entry in .ini file) + ImGuiCond_Appearing = 1 << 3 // Set the variable if the object/window is appearing after being hidden/inactive (or the first time) +}; + +//----------------------------------------------------------------------------- +// [SECTION] Helpers: Memory allocations macros, ImVector<> +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// IM_MALLOC(), IM_FREE(), IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE() +// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax. +// Defining a custom placement new() with a custom parameter allows us to bypass including which on some platforms complains when user has disabled exceptions. +//----------------------------------------------------------------------------- + +struct ImNewWrapper {}; +inline void* operator new(size_t, ImNewWrapper, void* ptr) { return ptr; } +inline void operator delete(void*, ImNewWrapper, void*) {} // This is only required so we can use the symmetrical new() +#define IM_ALLOC(_SIZE) ImGui::MemAlloc(_SIZE) +#define IM_FREE(_PTR) ImGui::MemFree(_PTR) +#define IM_PLACEMENT_NEW(_PTR) new(ImNewWrapper(), _PTR) +#define IM_NEW(_TYPE) new(ImNewWrapper(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE +template void IM_DELETE(T* p) { if (p) { p->~T(); ImGui::MemFree(p); } } + +//----------------------------------------------------------------------------- +// ImVector<> +// Lightweight std::vector<>-like class to avoid dragging dependencies (also, some implementations of STL with debug enabled are absurdly slow, we bypass it so our code runs fast in debug). +//----------------------------------------------------------------------------- +// - You generally do NOT need to care or use this ever. But we need to make it available in imgui.h because some of our public structures are relying on it. +// - We use std-like naming convention here, which is a little unusual for this codebase. +// - Important: clear() frees memory, resize(0) keep the allocated buffer. We use resize(0) a lot to intentionally recycle allocated buffers across frames and amortize our costs. +// - Important: our implementation does NOT call C++ constructors/destructors, we treat everything as raw data! This is intentional but be extra mindful of that, +// Do NOT use this class as a std::vector replacement in your own code! Many of the structures used by dear imgui can be safely initialized by a zero-memset. +//----------------------------------------------------------------------------- + +IM_MSVC_RUNTIME_CHECKS_OFF +template +struct ImVector +{ + int Size; + int Capacity; + T* Data; + + // Provide standard typedefs but we don't use them ourselves. + typedef T value_type; + typedef value_type* iterator; + typedef const value_type* const_iterator; + + // Constructors, destructor + inline ImVector() { Size = Capacity = 0; Data = NULL; } + inline ImVector(const ImVector& src) { Size = Capacity = 0; Data = NULL; operator=(src); } + inline ImVector& operator=(const ImVector& src) { clear(); resize(src.Size); memcpy(Data, src.Data, (size_t)Size * sizeof(T)); return *this; } + inline ~ImVector() { if (Data) IM_FREE(Data); } // Important: does not destruct anything + + inline void clear() { if (Data) { Size = Capacity = 0; IM_FREE(Data); Data = NULL; } } // Important: does not destruct anything + inline void clear_delete() { for (int n = 0; n < Size; n++) IM_DELETE(Data[n]); clear(); } // Important: never called automatically! always explicit. + inline void clear_destruct() { for (int n = 0; n < Size; n++) Data[n].~T(); clear(); } // Important: never called automatically! always explicit. + + inline bool empty() const { return Size == 0; } + inline int size() const { return Size; } + inline int size_in_bytes() const { return Size * (int)sizeof(T); } + inline int max_size() const { return 0x7FFFFFFF / (int)sizeof(T); } + inline int capacity() const { return Capacity; } + inline T& operator[](int i) { IM_ASSERT(i >= 0 && i < Size); return Data[i]; } + inline const T& operator[](int i) const { IM_ASSERT(i >= 0 && i < Size); return Data[i]; } + + inline T* begin() { return Data; } + inline const T* begin() const { return Data; } + inline T* end() { return Data + Size; } + inline const T* end() const { return Data + Size; } + inline T& front() { IM_ASSERT(Size > 0); return Data[0]; } + inline const T& front() const { IM_ASSERT(Size > 0); return Data[0]; } + inline T& back() { IM_ASSERT(Size > 0); return Data[Size - 1]; } + inline const T& back() const { IM_ASSERT(Size > 0); return Data[Size - 1]; } + inline void swap(ImVector& rhs) { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; T* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; } + + inline int _grow_capacity(int sz) const { int new_capacity = Capacity ? (Capacity + Capacity / 2) : 8; return new_capacity > sz ? new_capacity : sz; } + inline void resize(int new_size) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; } + inline void resize(int new_size, const T& v) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) memcpy(&Data[n], &v, sizeof(v)); Size = new_size; } + inline void shrink(int new_size) { IM_ASSERT(new_size <= Size); Size = new_size; } // Resize a vector to a smaller size, guaranteed not to cause a reallocation + inline void reserve(int new_capacity) { if (new_capacity <= Capacity) return; T* new_data = (T*)IM_ALLOC((size_t)new_capacity * sizeof(T)); if (Data) { memcpy(new_data, Data, (size_t)Size * sizeof(T)); IM_FREE(Data); } Data = new_data; Capacity = new_capacity; } + + // NB: It is illegal to call push_back/push_front/insert with a reference pointing inside the ImVector data itself! e.g. v.push_back(v[10]) is forbidden. + inline void push_back(const T& v) { if (Size == Capacity) reserve(_grow_capacity(Size + 1)); memcpy(&Data[Size], &v, sizeof(v)); Size++; } + inline void pop_back() { IM_ASSERT(Size > 0); Size--; } + inline void push_front(const T& v) { if (Size == 0) push_back(v); else insert(Data, v); } + inline T* erase(const T* it) { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(T)); Size--; return Data + off; } + inline T* erase(const T* it, const T* it_last){ IM_ASSERT(it >= Data && it < Data + Size && it_last >= it && it_last <= Data + Size); const ptrdiff_t count = it_last - it; const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + count, ((size_t)Size - (size_t)off - (size_t)count) * sizeof(T)); Size -= (int)count; return Data + off; } + inline T* erase_unsorted(const T* it) { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; if (it < Data + Size - 1) memcpy(Data + off, Data + Size - 1, sizeof(T)); Size--; return Data + off; } + inline T* insert(const T* it, const T& v) { IM_ASSERT(it >= Data && it <= Data + Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(T)); memcpy(&Data[off], &v, sizeof(v)); Size++; return Data + off; } + inline bool contains(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; } + inline T* find(const T& v) { T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } + inline const T* find(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } + inline bool find_erase(const T& v) { const T* it = find(v); if (it < Data + Size) { erase(it); return true; } return false; } + inline bool find_erase_unsorted(const T& v) { const T* it = find(v); if (it < Data + Size) { erase_unsorted(it); return true; } return false; } + inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; return (int)off; } +}; +IM_MSVC_RUNTIME_CHECKS_RESTORE + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiStyle +//----------------------------------------------------------------------------- +// You may modify the ImGui::GetStyle() main instance during initialization and before NewFrame(). +// During the frame, use ImGui::PushStyleVar(ImGuiStyleVar_XXXX)/PopStyleVar() to alter the main style values, +// and ImGui::PushStyleColor(ImGuiCol_XXX)/PopStyleColor() for colors. +//----------------------------------------------------------------------------- + +struct ImGuiStyle +{ + float Alpha; // Global alpha applies to everything in Dear ImGui. + float DisabledAlpha; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. + ImVec2 WindowPadding; // Padding within a window. + float WindowRounding; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. + float WindowBorderSize; // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). + ImVec2 WindowMinSize; // Minimum window size. This is a global setting. If you want to constraint individual windows, use SetNextWindowSizeConstraints(). + ImVec2 WindowTitleAlign; // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered. + ImGuiDir WindowMenuButtonPosition; // Side of the collapsing/docking button in the title bar (None/Left/Right). Defaults to ImGuiDir_Left. + float ChildRounding; // Radius of child window corners rounding. Set to 0.0f to have rectangular windows. + float ChildBorderSize; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). + float PopupRounding; // Radius of popup window corners rounding. (Note that tooltip windows use WindowRounding) + float PopupBorderSize; // Thickness of border around popup/tooltip windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). + ImVec2 FramePadding; // Padding within a framed rectangle (used by most widgets). + float FrameRounding; // Radius of frame corners rounding. Set to 0.0f to have rectangular frame (used by most widgets). + float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). + ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines. + ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label). + ImVec2 CellPadding; // Padding within a table cell + ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! + float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). + float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). + float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar. + float ScrollbarRounding; // Radius of grab corners for scrollbar. + float GrabMinSize; // Minimum width/height of a grab box for slider/scrollbar. + float GrabRounding; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. + float LogSliderDeadzone; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. + float TabRounding; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. + float TabBorderSize; // Thickness of border around tabs. + float TabMinWidthForCloseButton; // Minimum width for close button to appears on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + ImGuiDir ColorButtonPosition; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. + ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered). + ImVec2 SelectableTextAlign; // Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. + ImVec2 DisplayWindowPadding; // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. + ImVec2 DisplaySafeAreaPadding; // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly! + float MouseCursorScale; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. + bool AntiAliasedLines; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). + bool AntiAliasedLinesUseTex; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). Latched at the beginning of the frame (copied to ImDrawList). + bool AntiAliasedFill; // Enable anti-aliased edges around filled shapes (rounded rectangles, circles, etc.). Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). + float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. + float CircleTessellationMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. + ImVec4 Colors[ImGuiCol_COUNT]; + + IMGUI_API ImGuiStyle(); + IMGUI_API void ScaleAllSizes(float scale_factor); +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiIO +//----------------------------------------------------------------------------- +// Communicate most settings and inputs/outputs to Dear ImGui using this structure. +// Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage. +//----------------------------------------------------------------------------- + +// [Internal] Storage used by IsKeyDown(), IsKeyPressed() etc functions. +// If prior to 1.87 you used io.KeysDownDuration[] (which was marked as internal), you should use GetKeyData(key)->DownDuration and not io.KeysData[key]->DownDuration. +struct ImGuiKeyData +{ + bool Down; // True for if key is down + float DownDuration; // Duration the key has been down (<0.0f: not pressed, 0.0f: just pressed, >0.0f: time held) + float DownDurationPrev; // Last frame duration the key has been down + float AnalogValue; // 0.0f..1.0f for gamepad values +}; + +struct ImGuiIO +{ + //------------------------------------------------------------------ + // Configuration // Default value + //------------------------------------------------------------------ + + ImGuiConfigFlags ConfigFlags; // = 0 // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc. + ImGuiBackendFlags BackendFlags; // = 0 // See ImGuiBackendFlags_ enum. Set by backend (imgui_impl_xxx files or custom backend) to communicate features supported by the backend. + ImVec2 DisplaySize; // // Main display size, in pixels (generally == GetMainViewport()->Size). May change every frame. + float DeltaTime; // = 1.0f/60.0f // Time elapsed since last frame, in seconds. May change every frame. + float IniSavingRate; // = 5.0f // Minimum time between saving positions/sizes to .ini file, in seconds. + const char* IniFilename; // = "imgui.ini" // Path to .ini file (important: default "imgui.ini" is relative to current working dir!). Set NULL to disable automatic .ini loading/saving or if you want to manually call LoadIniSettingsXXX() / SaveIniSettingsXXX() functions. + const char* LogFilename; // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified). + float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds. + float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels. + float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging. + float KeyRepeatDelay; // = 0.250f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.). + float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds. + void* UserData; // = NULL // Store your own data for retrieval by callbacks. + + ImFontAtlas*Fonts; // // Font atlas: load, rasterize and pack one or more fonts into a single texture. + float FontGlobalScale; // = 1.0f // Global scale all fonts + bool FontAllowUserScaling; // = false // Allow user scaling text of individual window with CTRL+Wheel. + ImFont* FontDefault; // = NULL // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0]. + ImVec2 DisplayFramebufferScale; // = (1, 1) // For retina display or other situations where window coordinates are different from framebuffer coordinates. This generally ends up in ImDrawData::FramebufferScale. + + // Miscellaneous options + bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by backend implementations. + bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl. + bool ConfigInputTrickleEventQueue; // = true // Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates. + bool ConfigInputTextCursorBlink; // = true // Enable blinking cursor (optional as some users consider it to be distracting). + bool ConfigDragClickToInputText; // = false // [BETA] Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving). Not desirable on devices without a keyboard. + bool ConfigWindowsResizeFromEdges; // = true // Enable resizing of windows from their edges and from the lower-left corner. This requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback. (This used to be a per-window ImGuiWindowFlags_ResizeFromAnySide flag) + bool ConfigWindowsMoveFromTitleBarOnly; // = false // Enable allowing to move windows only when clicking on their title bar. Does not apply to windows without a title bar. + float ConfigMemoryCompactTimer; // = 60.0f // Timer (in seconds) to free transient windows/tables memory buffers when unused. Set to -1.0f to disable. + + //------------------------------------------------------------------ + // Platform Functions + // (the imgui_impl_xxxx backend files are setting those up for you) + //------------------------------------------------------------------ + + // Optional: Platform/Renderer backend name (informational only! will be displayed in About Window) + User data for backend/wrappers to store their own stuff. + const char* BackendPlatformName; // = NULL + const char* BackendRendererName; // = NULL + void* BackendPlatformUserData; // = NULL // User data for platform backend + void* BackendRendererUserData; // = NULL // User data for renderer backend + void* BackendLanguageUserData; // = NULL // User data for non C++ programming language backend + + // Optional: Access OS clipboard + // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures) + const char* (*GetClipboardTextFn)(void* user_data); + void (*SetClipboardTextFn)(void* user_data, const char* text); + void* ClipboardUserData; + + // Optional: Notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME on Windows) + // (default to use native imm32 api on Windows) + void (*SetPlatformImeDataFn)(ImGuiViewport* viewport, ImGuiPlatformImeData* data); +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + void* ImeWindowHandle; // = NULL // [Obsolete] Set ImGuiViewport::PlatformHandleRaw instead. Set this to your HWND to get automatic IME cursor positioning. +#else + void* _UnusedPadding; // Unused field to keep data structure the same size. +#endif + + //------------------------------------------------------------------ + // Input - Call before calling NewFrame() + //------------------------------------------------------------------ + + // Input Functions + IMGUI_API void AddKeyEvent(ImGuiKey key, bool down); // Queue a new key down/up event. Key should be "translated" (as in, generally ImGuiKey_A matches the key end-user would use to emit an 'A' character) + IMGUI_API void AddKeyAnalogEvent(ImGuiKey key, bool down, float v); // Queue a new key down/up event for analog values (e.g. ImGuiKey_Gamepad_ values). Dead-zones should be handled by the backend. + IMGUI_API void AddMousePosEvent(float x, float y); // Queue a mouse position update. Use -FLT_MAX,-FLT_MAX to signify no mouse (e.g. app not focused and not hovered) + IMGUI_API void AddMouseButtonEvent(int button, bool down); // Queue a mouse button change + IMGUI_API void AddMouseWheelEvent(float wh_x, float wh_y); // Queue a mouse wheel update + IMGUI_API void AddFocusEvent(bool focused); // Queue a gain/loss of focus for the application (generally based on OS/platform focus of your window) + IMGUI_API void AddInputCharacter(unsigned int c); // Queue a new character input + IMGUI_API void AddInputCharacterUTF16(ImWchar16 c); // Queue a new character input from an UTF-16 character, it can be a surrogate + IMGUI_API void AddInputCharactersUTF8(const char* str); // Queue a new characters input from an UTF-8 string + + IMGUI_API void ClearInputCharacters(); // [Internal] Clear the text input buffer manually + IMGUI_API void ClearInputKeys(); // [Internal] Release all keys + IMGUI_API void SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native_scancode, int native_legacy_index = -1); // [Optional] Specify index for legacy <1.87 IsKeyXXX() functions with native indices + specify native keycode, scancode. + + //------------------------------------------------------------------ + // Output - Updated by NewFrame() or EndFrame()/Render() + // (when reading from the io.WantCaptureMouse, io.WantCaptureKeyboard flags to dispatch your inputs, it is + // generally easier and more correct to use their state BEFORE calling NewFrame(). See FAQ for details!) + //------------------------------------------------------------------ + + bool WantCaptureMouse; // Set when Dear ImGui will use mouse inputs, in this case do not dispatch them to your main game/application (either way, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.). + bool WantCaptureKeyboard; // Set when Dear ImGui will use keyboard inputs, in this case do not dispatch them to your main game/application (either way, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.). + bool WantTextInput; // Mobile/console: when set, you may display an on-screen keyboard. This is set by Dear ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active). + bool WantSetMousePos; // MousePos has been altered, backend should reposition mouse on next frame. Rarely used! Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled. + bool WantSaveIniSettings; // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. Important: clear io.WantSaveIniSettings yourself after saving! + bool NavActive; // Keyboard/Gamepad navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag. + bool NavVisible; // Keyboard/Gamepad navigation is visible and allowed (will handle ImGuiKey_NavXXX events). + float Framerate; // Rough estimate of application framerate, in frame per second. Solely for convenience. Rolling average estimation based on io.DeltaTime over 120 frames. + int MetricsRenderVertices; // Vertices output during last call to Render() + int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3 + int MetricsRenderWindows; // Number of visible windows + int MetricsActiveWindows; // Number of active windows + int MetricsActiveAllocations; // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts. + ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta. + + // Legacy: before 1.87, we required backend to fill io.KeyMap[] (imgui->native map) during initialization and io.KeysDown[] (native indices) every frame. + // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent(). +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + int KeyMap[ImGuiKey_COUNT]; // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512. + bool KeysDown[ImGuiKey_COUNT]; // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow. +#endif + + //------------------------------------------------------------------ + // [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed! + //------------------------------------------------------------------ + + // Main Input State + // (this block used to be written by backend, since 1.87 it is best to NOT write to those directly, call the AddXXX functions above instead) + // (reading from those variables is fair game, as they are extremely unlikely to be moving anywhere) + ImVec2 MousePos; // Mouse position, in pixels. Set to ImVec2(-FLT_MAX, -FLT_MAX) if mouse is unavailable (on another screen, etc.) + bool MouseDown[5]; // Mouse buttons: 0=left, 1=right, 2=middle + extras (ImGuiMouseButton_COUNT == 5). Dear ImGui mostly uses left and right buttons. Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API. + float MouseWheel; // Mouse wheel Vertical: 1 unit scrolls about 5 lines text. + float MouseWheelH; // Mouse wheel Horizontal. Most users don't have a mouse with an horizontal wheel, may not be filled by all backends. + bool KeyCtrl; // Keyboard modifier down: Control + bool KeyShift; // Keyboard modifier down: Shift + bool KeyAlt; // Keyboard modifier down: Alt + bool KeySuper; // Keyboard modifier down: Cmd/Super/Windows + float NavInputs[ImGuiNavInput_COUNT]; // Gamepad inputs. Cleared back to zero by EndFrame(). Keyboard keys will be auto-mapped and be written here by NewFrame(). + + // Other state maintained from data above + IO function calls + ImGuiModFlags KeyMods; // Key mods flags (same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags), updated by NewFrame() + ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE]; // Key state for all known keys. Use IsKeyXXX() functions to access this. + bool WantCaptureMouseUnlessPopupClose; // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup. + ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid) + ImVec2 MouseClickedPos[5]; // Position at time of clicking + double MouseClickedTime[5]; // Time of last click (used to figure out double-click) + bool MouseClicked[5]; // Mouse button went from !Down to Down (same as MouseClickedCount[x] != 0) + bool MouseDoubleClicked[5]; // Has mouse button been double-clicked? (same as MouseClickedCount[x] == 2) + ImU16 MouseClickedCount[5]; // == 0 (not clicked), == 1 (same as MouseClicked[]), == 2 (double-clicked), == 3 (triple-clicked) etc. when going from !Down to Down + ImU16 MouseClickedLastCount[5]; // Count successive number of clicks. Stays valid after mouse release. Reset after another click is done. + bool MouseReleased[5]; // Mouse button went from Down to !Down + bool MouseDownOwned[5]; // Track if button was clicked inside a dear imgui window or over void blocked by a popup. We don't request mouse capture from the application if click started outside ImGui bounds. + bool MouseDownOwnedUnlessPopupClose[5]; // Track if button was clicked inside a dear imgui window. + float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked) + float MouseDownDurationPrev[5]; // Previous time the mouse button has been down + float MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point (used for moving thresholds) + float NavInputsDownDuration[ImGuiNavInput_COUNT]; + float NavInputsDownDurationPrev[ImGuiNavInput_COUNT]; + float PenPressure; // Touch/Pen pressure (0.0f to 1.0f, should be >0.0f only when MouseDown[0] == true). Helper storage currently unused by Dear ImGui. + bool AppFocusLost; + ImS8 BackendUsingLegacyKeyArrays; // -1: unknown, 0: using AddKeyEvent(), 1: using legacy io.KeysDown[] + bool BackendUsingLegacyNavInputArray; // 0: using AddKeyAnalogEvent(), 1: writing to legacy io.NavInputs[] directly + ImWchar16 InputQueueSurrogate; // For AddInputCharacterUTF16() + ImVector InputQueueCharacters; // Queue of _characters_ input (obtained by platform backend). Fill using AddInputCharacter() helper. + + IMGUI_API ImGuiIO(); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Misc data structures +//----------------------------------------------------------------------------- + +// Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used. +// The callback function should return 0 by default. +// Callbacks (follow a flag name and see comments in ImGuiInputTextFlags_ declarations for more details) +// - ImGuiInputTextFlags_CallbackEdit: Callback on buffer edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) +// - ImGuiInputTextFlags_CallbackAlways: Callback on each iteration +// - ImGuiInputTextFlags_CallbackCompletion: Callback on pressing TAB +// - ImGuiInputTextFlags_CallbackHistory: Callback on pressing Up/Down arrows +// - ImGuiInputTextFlags_CallbackCharFilter: Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. +// - ImGuiInputTextFlags_CallbackResize: Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. +struct ImGuiInputTextCallbackData +{ + ImGuiInputTextFlags EventFlag; // One ImGuiInputTextFlags_Callback* // Read-only + ImGuiInputTextFlags Flags; // What user passed to InputText() // Read-only + void* UserData; // What user passed to InputText() // Read-only + + // Arguments for the different callback events + // - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary. + // - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state. + ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0; + ImGuiKey EventKey; // Key pressed (Up/Down/TAB) // Read-only // [Completion,History] + char* Buf; // Text buffer // Read-write // [Resize] Can replace pointer / [Completion,History,Always] Only write to pointed data, don't replace the actual pointer! + int BufTextLen; // Text length (in bytes) // Read-write // [Resize,Completion,History,Always] Exclude zero-terminator storage. In C land: == strlen(some_text), in C++ land: string.length() + int BufSize; // Buffer size (in bytes) = capacity+1 // Read-only // [Resize,Completion,History,Always] Include zero-terminator storage. In C land == ARRAYSIZE(my_char_array), in C++ land: string.capacity()+1 + bool BufDirty; // Set if you modify Buf/BufTextLen! // Write // [Completion,History,Always] + int CursorPos; // // Read-write // [Completion,History,Always] + int SelectionStart; // // Read-write // [Completion,History,Always] == to SelectionEnd when no selection) + int SelectionEnd; // // Read-write // [Completion,History,Always] + + // Helper functions for text manipulation. + // Use those function to benefit from the CallbackResize behaviors. Calling those function reset the selection. + IMGUI_API ImGuiInputTextCallbackData(); + IMGUI_API void DeleteChars(int pos, int bytes_count); + IMGUI_API void InsertChars(int pos, const char* text, const char* text_end = NULL); + void SelectAll() { SelectionStart = 0; SelectionEnd = BufTextLen; } + void ClearSelection() { SelectionStart = SelectionEnd = BufTextLen; } + bool HasSelection() const { return SelectionStart != SelectionEnd; } +}; + +// Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin(). +// NB: For basic min/max size constraint on each axis you don't need to use the callback! The SetNextWindowSizeConstraints() parameters are enough. +struct ImGuiSizeCallbackData +{ + void* UserData; // Read-only. What user passed to SetNextWindowSizeConstraints() + ImVec2 Pos; // Read-only. Window position, for reference. + ImVec2 CurrentSize; // Read-only. Current window size. + ImVec2 DesiredSize; // Read-write. Desired size, based on user's mouse position. Write to this field to restrain resizing. +}; + +// Data payload for Drag and Drop operations: AcceptDragDropPayload(), GetDragDropPayload() +struct ImGuiPayload +{ + // Members + void* Data; // Data (copied and owned by dear imgui) + int DataSize; // Data size + + // [Internal] + ImGuiID SourceId; // Source item id + ImGuiID SourceParentId; // Source parent id (if available) + int DataFrameCount; // Data timestamp + char DataType[32 + 1]; // Data type tag (short user-supplied string, 32 characters max) + bool Preview; // Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets) + bool Delivery; // Set when AcceptDragDropPayload() was called and mouse button is released over the target item. + + ImGuiPayload() { Clear(); } + void Clear() { SourceId = SourceParentId = 0; Data = NULL; DataSize = 0; memset(DataType, 0, sizeof(DataType)); DataFrameCount = -1; Preview = Delivery = false; } + bool IsDataType(const char* type) const { return DataFrameCount != -1 && strcmp(type, DataType) == 0; } + bool IsPreview() const { return Preview; } + bool IsDelivery() const { return Delivery; } +}; + +// Sorting specification for one column of a table (sizeof == 12 bytes) +struct ImGuiTableColumnSortSpecs +{ + ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call) + ImS16 ColumnIndex; // Index of the column + ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) + ImGuiSortDirection SortDirection : 8; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending (you can use this or SortSign, whichever is more convenient for your sort function) + + ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); } +}; + +// Sorting specifications for a table (often handling sort specs for a single column, occasionally more) +// Obtained by calling TableGetSortSpecs(). +// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time. +// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame! +struct ImGuiTableSortSpecs +{ + const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array. + int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled. + bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag. + + ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor) +//----------------------------------------------------------------------------- + +// Helper: Unicode defines +#define IM_UNICODE_CODEPOINT_INVALID 0xFFFD // Invalid Unicode code point (standard value). +#ifdef IMGUI_USE_WCHAR32 +#define IM_UNICODE_CODEPOINT_MAX 0x10FFFF // Maximum Unicode code point supported by this build. +#else +#define IM_UNICODE_CODEPOINT_MAX 0xFFFF // Maximum Unicode code point supported by this build. +#endif + +// Helper: Execute a block of code at maximum once a frame. Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame. +// Usage: static ImGuiOnceUponAFrame oaf; if (oaf) ImGui::Text("This will be called only once per frame"); +struct ImGuiOnceUponAFrame +{ + ImGuiOnceUponAFrame() { RefFrame = -1; } + mutable int RefFrame; + operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; } +}; + +// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" +struct ImGuiTextFilter +{ + IMGUI_API ImGuiTextFilter(const char* default_filter = ""); + IMGUI_API bool Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f); // Helper calling InputText+Build + IMGUI_API bool PassFilter(const char* text, const char* text_end = NULL) const; + IMGUI_API void Build(); + void Clear() { InputBuf[0] = 0; Build(); } + bool IsActive() const { return !Filters.empty(); } + + // [Internal] + struct ImGuiTextRange + { + const char* b; + const char* e; + + ImGuiTextRange() { b = e = NULL; } + ImGuiTextRange(const char* _b, const char* _e) { b = _b; e = _e; } + bool empty() const { return b == e; } + IMGUI_API void split(char separator, ImVector* out) const; + }; + char InputBuf[256]; + ImVectorFilters; + int CountGrep; +}; + +// Helper: Growable text buffer for logging/accumulating text +// (this could be called 'ImGuiTextBuilder' / 'ImGuiStringBuilder') +struct ImGuiTextBuffer +{ + ImVector Buf; + IMGUI_API static char EmptyString[1]; + + ImGuiTextBuffer() { } + inline char operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; } + const char* begin() const { return Buf.Data ? &Buf.front() : EmptyString; } + const char* end() const { return Buf.Data ? &Buf.back() : EmptyString; } // Buf is zero-terminated, so end() will point on the zero-terminator + int size() const { return Buf.Size ? Buf.Size - 1 : 0; } + bool empty() const { return Buf.Size <= 1; } + void clear() { Buf.clear(); } + void reserve(int capacity) { Buf.reserve(capacity); } + const char* c_str() const { return Buf.Data ? Buf.Data : EmptyString; } + IMGUI_API void append(const char* str, const char* str_end = NULL); + IMGUI_API void appendf(const char* fmt, ...) IM_FMTARGS(2); + IMGUI_API void appendfv(const char* fmt, va_list args) IM_FMTLIST(2); +}; + +// Helper: Key->Value storage +// Typically you don't have to worry about this since a storage is held within each Window. +// We use it to e.g. store collapse state for a tree (Int 0/1) +// This is optimized for efficient lookup (dichotomy into a contiguous buffer) and rare insertion (typically tied to user interactions aka max once a frame) +// You can use it as custom user storage for temporary values. Declare your own storage if, for example: +// - You want to manipulate the open/close state of a particular sub-tree in your interface (tree node uses Int 0/1 to store their state). +// - You want to store custom debug data easily without adding or editing structures in your code (probably not efficient, but convenient) +// Types are NOT stored, so it is up to you to make sure your Key don't collide with different types. +struct ImGuiStorage +{ + // [Internal] + struct ImGuiStoragePair + { + ImGuiID key; + union { int val_i; float val_f; void* val_p; }; + ImGuiStoragePair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; } + ImGuiStoragePair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; } + ImGuiStoragePair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; } + }; + + ImVector Data; + + // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N) + // - Set***() functions find pair, insertion on demand if missing. + // - Sorted insertion is costly, paid once. A typical frame shouldn't need to insert any new pair. + void Clear() { Data.clear(); } + IMGUI_API int GetInt(ImGuiID key, int default_val = 0) const; + IMGUI_API void SetInt(ImGuiID key, int val); + IMGUI_API bool GetBool(ImGuiID key, bool default_val = false) const; + IMGUI_API void SetBool(ImGuiID key, bool val); + IMGUI_API float GetFloat(ImGuiID key, float default_val = 0.0f) const; + IMGUI_API void SetFloat(ImGuiID key, float val); + IMGUI_API void* GetVoidPtr(ImGuiID key) const; // default_val is NULL + IMGUI_API void SetVoidPtr(ImGuiID key, void* val); + + // - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set. + // - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. + // - A typical use case where this is convenient for quick hacking (e.g. add storage during a live Edit&Continue session if you can't modify existing struct) + // float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar; + IMGUI_API int* GetIntRef(ImGuiID key, int default_val = 0); + IMGUI_API bool* GetBoolRef(ImGuiID key, bool default_val = false); + IMGUI_API float* GetFloatRef(ImGuiID key, float default_val = 0.0f); + IMGUI_API void** GetVoidPtrRef(ImGuiID key, void* default_val = NULL); + + // Use on your own storage if you know only integer are being stored (open/close all tree nodes) + IMGUI_API void SetAllInt(int val); + + // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. + IMGUI_API void BuildSortByKey(); +}; + +// Helper: Manually clip large list of items. +// If you have lots evenly spaced items and you have a random access to the list, you can perform coarse +// clipping based on visibility to only submit items that are in view. +// The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped. +// (Dear ImGui already clip items based on their bounds but: it needs to first layout the item to do so, and generally +// fetching/submitting your own data incurs additional cost. Coarse clipping using ImGuiListClipper allows you to easily +// scale using lists with tens of thousands of items without a problem) +// Usage: +// ImGuiListClipper clipper; +// clipper.Begin(1000); // We have 1000 elements, evenly spaced. +// while (clipper.Step()) +// for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) +// ImGui::Text("line number %d", i); +// Generally what happens is: +// - Clipper lets you process the first element (DisplayStart = 0, DisplayEnd = 1) regardless of it being visible or not. +// - User code submit that one element. +// - Clipper can measure the height of the first element +// - Clipper calculate the actual range of elements to display based on the current clipping rectangle, position the cursor before the first visible element. +// - User code submit visible elements. +// - The clipper also handles various subtleties related to keyboard/gamepad navigation, wrapping etc. +struct ImGuiListClipper +{ + int DisplayStart; // First item to display, updated by each call to Step() + int DisplayEnd; // End of items to display (exclusive) + int ItemsCount; // [Internal] Number of items + float ItemsHeight; // [Internal] Height of item after a first step and item submission can calculate it + float StartPosY; // [Internal] Cursor position at the time of Begin() or after table frozen rows are all processed + void* TempData; // [Internal] Internal data + + // items_count: Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step) + // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing(). + IMGUI_API ImGuiListClipper(); + IMGUI_API ~ImGuiListClipper(); + IMGUI_API void Begin(int items_count, float items_height = -1.0f); + IMGUI_API void End(); // Automatically called on the last call of Step() that returns false. + IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items. + + // Call ForceDisplayRangeByIndices() before first call to Step() if you need a range of items to be displayed regardless of visibility. + IMGUI_API void ForceDisplayRangeByIndices(int item_min, int item_max); // item_max is exclusive e.g. use (42, 42+1) to make item 42 always visible BUT due to alignment/padding of certain items it is likely that an extra item may be included on either end of the display range. + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + inline ImGuiListClipper(int items_count, float items_height = -1.0f) { memset(this, 0, sizeof(*this)); ItemsCount = -1; Begin(items_count, items_height); } // [removed in 1.79] +#endif +}; + +// Helpers macros to generate 32-bit encoded colors +// User can declare their own format by #defining the 5 _SHIFT/_MASK macros in their imconfig file. +#ifndef IM_COL32_R_SHIFT +#ifdef IMGUI_USE_BGRA_PACKED_COLOR +#define IM_COL32_R_SHIFT 16 +#define IM_COL32_G_SHIFT 8 +#define IM_COL32_B_SHIFT 0 +#define IM_COL32_A_SHIFT 24 +#define IM_COL32_A_MASK 0xFF000000 +#else +#define IM_COL32_R_SHIFT 0 +#define IM_COL32_G_SHIFT 8 +#define IM_COL32_B_SHIFT 16 +#define IM_COL32_A_SHIFT 24 +#define IM_COL32_A_MASK 0xFF000000 +#endif +#endif +#define IM_COL32(R,G,B,A) (((ImU32)(A)<> IM_COL32_R_SHIFT) & 0xFF) * sc; Value.y = (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * sc; Value.z = (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * sc; Value.w = (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * sc; } + inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); } + inline operator ImVec4() const { return Value; } + + // FIXME-OBSOLETE: May need to obsolete/cleanup those helpers. + inline void SetHSV(float h, float s, float v, float a = 1.0f){ ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; } + static ImColor HSV(float h, float s, float v, float a = 1.0f) { float r, g, b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r, g, b, a); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Drawing API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData) +// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList. +//----------------------------------------------------------------------------- + +// The maximum line width to bake anti-aliased textures for. Build atlas with ImFontAtlasFlags_NoBakedLines to disable baking. +#ifndef IM_DRAWLIST_TEX_LINES_WIDTH_MAX +#define IM_DRAWLIST_TEX_LINES_WIDTH_MAX (63) +#endif + +// ImDrawCallback: Draw callbacks for advanced uses [configurable type: override in imconfig.h] +// NB: You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering, +// you can poke into the draw list for that! Draw callback may be useful for example to: +// A) Change your GPU render state, +// B) render a complex 3D scene inside a UI element without an intermediate texture/render target, etc. +// The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) { cmd.UserCallback(parent_list, cmd); } else { RenderTriangles() }' +// If you want to override the signature of ImDrawCallback, you can simply use e.g. '#define ImDrawCallback MyDrawCallback' (in imconfig.h) + update rendering backend accordingly. +#ifndef ImDrawCallback +typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd); +#endif + +// Special Draw callback value to request renderer backend to reset the graphics/render state. +// The renderer backend needs to handle this special value, otherwise it will crash trying to call a function at this address. +// This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored. +// It is not done by default because they are many perfectly useful way of altering render state for imgui contents (e.g. changing shader/blending settings before an Image call). +#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-1) + +// Typically, 1 command = 1 GPU draw call (unless command is a callback) +// - VtxOffset: When 'io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset' is enabled, +// this fields allow us to render meshes larger than 64K vertices while keeping 16-bit indices. +// Backends made for <1.71. will typically ignore the VtxOffset fields. +// - The ClipRect/TextureId/VtxOffset fields must be contiguous as we memcmp() them together (this is asserted for). +struct ImDrawCmd +{ + ImVec4 ClipRect; // 4*4 // Clipping rectangle (x1, y1, x2, y2). Subtract ImDrawData->DisplayPos to get clipping rectangle in "viewport" coordinates + ImTextureID TextureId; // 4-8 // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas. + unsigned int VtxOffset; // 4 // Start offset in vertex buffer. ImGuiBackendFlags_RendererHasVtxOffset: always 0, otherwise may be >0 to support meshes larger than 64K vertices with 16-bit indices. + unsigned int IdxOffset; // 4 // Start offset in index buffer. + unsigned int ElemCount; // 4 // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[]. + ImDrawCallback UserCallback; // 4-8 // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally. + void* UserCallbackData; // 4-8 // The draw callback code can access this. + + ImDrawCmd() { memset(this, 0, sizeof(*this)); } // Also ensure our padding fields are zeroed + + // Since 1.83: returns ImTextureID associated with this draw call. Warning: DO NOT assume this is always same as 'TextureId' (we will change this function for an upcoming feature) + inline ImTextureID GetTexID() const { return TextureId; } +}; + +// Vertex layout +#ifndef IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT +struct ImDrawVert +{ + ImVec2 pos; + ImVec2 uv; + ImU32 col; +}; +#else +// You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h +// The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine. +// The type has to be described within the macro (you can either declare the struct or use a typedef). This is because ImVec2/ImU32 are likely not declared a the time you'd want to set your type up. +// NOTE: IMGUI DOESN'T CLEAR THE STRUCTURE AND DOESN'T CALL A CONSTRUCTOR SO ANY CUSTOM FIELD WILL BE UNINITIALIZED. IF YOU ADD EXTRA FIELDS (SUCH AS A 'Z' COORDINATES) YOU WILL NEED TO CLEAR THEM DURING RENDER OR TO IGNORE THEM. +IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT; +#endif + +// [Internal] For use by ImDrawList +struct ImDrawCmdHeader +{ + ImVec4 ClipRect; + ImTextureID TextureId; + unsigned int VtxOffset; +}; + +// [Internal] For use by ImDrawListSplitter +struct ImDrawChannel +{ + ImVector _CmdBuffer; + ImVector _IdxBuffer; +}; + + +// Split/Merge functions are used to split the draw list into different layers which can be drawn into out of order. +// This is used by the Columns/Tables API, so items of each column can be batched together in a same draw call. +struct ImDrawListSplitter +{ + int _Current; // Current channel number (0) + int _Count; // Number of active channels (1+) + ImVector _Channels; // Draw channels (not resized down so _Count might be < Channels.Size) + + inline ImDrawListSplitter() { memset(this, 0, sizeof(*this)); } + inline ~ImDrawListSplitter() { ClearFreeMemory(); } + inline void Clear() { _Current = 0; _Count = 1; } // Do not clear Channels[] so our allocations are reused next frame + IMGUI_API void ClearFreeMemory(); + IMGUI_API void Split(ImDrawList* draw_list, int count); + IMGUI_API void Merge(ImDrawList* draw_list); + IMGUI_API void SetCurrentChannel(ImDrawList* draw_list, int channel_idx); +}; + +// Flags for ImDrawList functions +// (Legacy: bit 0 must always correspond to ImDrawFlags_Closed to be backward compatible with old API using a bool. Bits 1..3 must be unused) +enum ImDrawFlags_ +{ + ImDrawFlags_None = 0, + ImDrawFlags_Closed = 1 << 0, // PathStroke(), AddPolyline(): specify that shape should be closed (Important: this is always == 1 for legacy reason) + ImDrawFlags_RoundCornersTopLeft = 1 << 4, // AddRect(), AddRectFilled(), PathRect(): enable rounding top-left corner only (when rounding > 0.0f, we default to all corners). Was 0x01. + ImDrawFlags_RoundCornersTopRight = 1 << 5, // AddRect(), AddRectFilled(), PathRect(): enable rounding top-right corner only (when rounding > 0.0f, we default to all corners). Was 0x02. + ImDrawFlags_RoundCornersBottomLeft = 1 << 6, // AddRect(), AddRectFilled(), PathRect(): enable rounding bottom-left corner only (when rounding > 0.0f, we default to all corners). Was 0x04. + ImDrawFlags_RoundCornersBottomRight = 1 << 7, // AddRect(), AddRectFilled(), PathRect(): enable rounding bottom-right corner only (when rounding > 0.0f, we default to all corners). Wax 0x08. + ImDrawFlags_RoundCornersNone = 1 << 8, // AddRect(), AddRectFilled(), PathRect(): disable rounding on all corners (when rounding > 0.0f). This is NOT zero, NOT an implicit flag! + ImDrawFlags_RoundCornersTop = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight, + ImDrawFlags_RoundCornersBottom = ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight, + ImDrawFlags_RoundCornersLeft = ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersTopLeft, + ImDrawFlags_RoundCornersRight = ImDrawFlags_RoundCornersBottomRight | ImDrawFlags_RoundCornersTopRight, + ImDrawFlags_RoundCornersAll = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight | ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight, + ImDrawFlags_RoundCornersDefault_ = ImDrawFlags_RoundCornersAll, // Default to ALL corners if none of the _RoundCornersXX flags are specified. + ImDrawFlags_RoundCornersMask_ = ImDrawFlags_RoundCornersAll | ImDrawFlags_RoundCornersNone +}; + +// Flags for ImDrawList instance. Those are set automatically by ImGui:: functions from ImGuiIO settings, and generally not manipulated directly. +// It is however possible to temporarily alter flags between calls to ImDrawList:: functions. +enum ImDrawListFlags_ +{ + ImDrawListFlags_None = 0, + ImDrawListFlags_AntiAliasedLines = 1 << 0, // Enable anti-aliased lines/borders (*2 the number of triangles for 1.0f wide line or lines thin enough to be drawn using textures, otherwise *3 the number of triangles) + ImDrawListFlags_AntiAliasedLinesUseTex = 1 << 1, // Enable anti-aliased lines/borders using textures when possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). + ImDrawListFlags_AntiAliasedFill = 1 << 2, // Enable anti-aliased edge around filled shapes (rounded rectangles, circles). + ImDrawListFlags_AllowVtxOffset = 1 << 3 // Can emit 'VtxOffset > 0' to allow large meshes. Set when 'ImGuiBackendFlags_RendererHasVtxOffset' is enabled. +}; + +// Draw command list +// This is the low-level list of polygons that ImGui:: functions are filling. At the end of the frame, +// all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering. +// Each dear imgui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to +// access the current window draw list and draw custom primitives. +// You can interleave normal ImGui:: calls and adding primitives to the current draw list. +// In single viewport mode, top-left is == GetMainViewport()->Pos (generally 0,0), bottom-right is == GetMainViewport()->Pos+Size (generally io.DisplaySize). +// You are totally free to apply whatever transformation matrix to want to the data (depending on the use of the transformation you may want to apply it to ClipRect as well!) +// Important: Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions), if you use this API a lot consider coarse culling your drawn objects. +struct ImDrawList +{ + // This is what you have to render + ImVector CmdBuffer; // Draw commands. Typically 1 command = 1 GPU draw call, unless the command is a callback. + ImVector IdxBuffer; // Index buffer. Each command consume ImDrawCmd::ElemCount of those + ImVector VtxBuffer; // Vertex buffer. + ImDrawListFlags Flags; // Flags, you may poke into these to adjust anti-aliasing settings per-primitive. + + // [Internal, used while building lists] + unsigned int _VtxCurrentIdx; // [Internal] generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0. + const ImDrawListSharedData* _Data; // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context) + const char* _OwnerName; // Pointer to owner window's name for debugging + ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) + ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) + ImVector _ClipRectStack; // [Internal] + ImVector _TextureIdStack; // [Internal] + ImVector _Path; // [Internal] current path building + ImDrawCmdHeader _CmdHeader; // [Internal] template of active commands. Fields should match those of CmdBuffer.back(). + ImDrawListSplitter _Splitter; // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!) + float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content + + // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui) + ImDrawList(const ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; } + + ~ImDrawList() { _ClearFreeMemory(); } + IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect = false); // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) + IMGUI_API void PushClipRectFullScreen(); + IMGUI_API void PopClipRect(); + IMGUI_API void PushTextureID(ImTextureID texture_id); + IMGUI_API void PopTextureID(); + inline ImVec2 GetClipRectMin() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.x, cr.y); } + inline ImVec2 GetClipRectMax() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.z, cr.w); } + + // Primitives + // - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. + // - For rectangular primitives, "p_min" and "p_max" represent the upper-left and lower-right corners. + // - For circle primitives, use "num_segments == 0" to automatically calculate tessellation (preferred). + // In older versions (until Dear ImGui 1.77) the AddCircle functions defaulted to num_segments == 12. + // In future versions we will use textures to provide cheaper and higher-quality circles. + // Use AddNgon() and AddNgonFilled() functions if you need to guaranteed a specific number of sides. + IMGUI_API void AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawFlags flags = 0, float thickness = 1.0f); // a: upper-left, b: lower-right (== upper-left + size) + IMGUI_API void AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawFlags flags = 0); // a: upper-left, b: lower-right (== upper-left + size) + IMGUI_API void AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left); + IMGUI_API void AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col); + IMGUI_API void AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col); + IMGUI_API void AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments = 0, float thickness = 1.0f); + IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0); + IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f); + IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments); + IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL); + IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL); + IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness); + IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); + IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points) + IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points) + + // Image primitives + // - Read FAQ to understand what ImTextureID is. + // - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle. + // - "uv_min" and "uv_max" represent the normalized texture coordinates to use for those corners. Using (0,0)->(1,1) texture coordinates will generally display the entire texture. + IMGUI_API void AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min = ImVec2(0, 0), const ImVec2& uv_max = ImVec2(1, 1), ImU32 col = IM_COL32_WHITE); + IMGUI_API void AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1 = ImVec2(0, 0), const ImVec2& uv2 = ImVec2(1, 0), const ImVec2& uv3 = ImVec2(1, 1), const ImVec2& uv4 = ImVec2(0, 1), ImU32 col = IM_COL32_WHITE); + IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags = 0); + + // Stateful path API, add points then finish with PathFillConvex() or PathStroke() + // - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. + inline void PathClear() { _Path.Size = 0; } + inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); } + inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); } + inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; } + inline void PathStroke(ImU32 col, ImDrawFlags flags = 0, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, flags, thickness); _Path.Size = 0; } + IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 0); + IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle + IMGUI_API void PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0); // Cubic Bezier (4 control points) + IMGUI_API void PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments = 0); // Quadratic Bezier (3 control points) + IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawFlags flags = 0); + + // Advanced + IMGUI_API void AddCallback(ImDrawCallback callback, void* callback_data); // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles. + IMGUI_API void AddDrawCmd(); // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible + IMGUI_API ImDrawList* CloneOutput() const; // Create a clone of the CmdBuffer/IdxBuffer/VtxBuffer. + + // Advanced: Channels + // - Use to split render into layers. By switching channels to can render out-of-order (e.g. submit FG primitives before BG primitives) + // - Use to minimize draw calls (e.g. if going back-and-forth between multiple clipping rectangles, prefer to append into separate channels then merge at the end) + // - FIXME-OBSOLETE: This API shouldn't have been in ImDrawList in the first place! + // Prefer using your own persistent instance of ImDrawListSplitter as you can stack them. + // Using the ImDrawList::ChannelsXXXX you cannot stack a split over another. + inline void ChannelsSplit(int count) { _Splitter.Split(this, count); } + inline void ChannelsMerge() { _Splitter.Merge(this); } + inline void ChannelsSetCurrent(int n) { _Splitter.SetCurrentChannel(this, n); } + + // Advanced: Primitives allocations + // - We render triangles (three vertices) + // - All primitives needs to be reserved via PrimReserve() beforehand. + IMGUI_API void PrimReserve(int idx_count, int vtx_count); + IMGUI_API void PrimUnreserve(int idx_count, int vtx_count); + IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col); // Axis aligned rectangle (composed of two triangles) + IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col); + IMGUI_API void PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col); + inline void PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; } + inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; } + inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } // OBSOLETED in 1.80 (Jan 2021) + inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021) +#endif + + // [Internal helpers] + IMGUI_API void _ResetForNewFrame(); + IMGUI_API void _ClearFreeMemory(); + IMGUI_API void _PopUnusedDrawCmd(); + IMGUI_API void _TryMergeDrawCmds(); + IMGUI_API void _OnChangedClipRect(); + IMGUI_API void _OnChangedTextureID(); + IMGUI_API void _OnChangedVtxOffset(); + IMGUI_API int _CalcCircleAutoSegmentCount(float radius) const; + IMGUI_API void _PathArcToFastEx(const ImVec2& center, float radius, int a_min_sample, int a_max_sample, int a_step); + IMGUI_API void _PathArcToN(const ImVec2& center, float radius, float a_min, float a_max, int num_segments); +}; + +// All draw data to render a Dear ImGui frame +// (NB: the style and the naming convention here is a little inconsistent, we currently preserve them for backward compatibility purpose, +// as this is one of the oldest structure exposed by the library! Basically, ImDrawList == CmdList) +struct ImDrawData +{ + bool Valid; // Only valid after Render() is called and before the next NewFrame() is called. + int CmdListsCount; // Number of ImDrawList* to render + int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size + int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size + ImDrawList** CmdLists; // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here. + ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications) + ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications) + ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display. + + // Functions + ImDrawData() { Clear(); } + void Clear() { memset(this, 0, sizeof(*this)); } // The ImDrawList are owned by ImGuiContext! + IMGUI_API void DeIndexAllBuffers(); // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! + IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution. +}; + +//----------------------------------------------------------------------------- +// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont) +//----------------------------------------------------------------------------- + +struct ImFontConfig +{ + void* FontData; // // TTF/OTF data + int FontDataSize; // // TTF/OTF data size + bool FontDataOwnedByAtlas; // true // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself). + int FontNo; // 0 // Index of font within TTF/OTF file + float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height). + int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal so you can reduce this to 2 to save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details. + int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. This is not really useful as we don't use sub-pixel positions on the Y axis. + bool PixelSnapH; // false // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1. + ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs. Only X axis is supported for now. + ImVec2 GlyphOffset; // 0, 0 // Offset all glyphs from this font input. + const ImWchar* GlyphRanges; // NULL // Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE. + float GlyphMinAdvanceX; // 0 // Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font + float GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs + bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights. + unsigned int FontBuilderFlags; // 0 // Settings for custom font builder. THIS IS BUILDER IMPLEMENTATION DEPENDENT. Leave as zero if unsure. + float RasterizerMultiply; // 1.0f // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. + ImWchar EllipsisChar; // -1 // Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used. + + // [Internal] + char Name[40]; // Name (strictly to ease debugging) + ImFont* DstFont; + + IMGUI_API ImFontConfig(); +}; + +// Hold rendering data for one glyph. +// (Note: some language parsers may fail to convert the 31+1 bitfield members, in this case maybe drop store a single u32 or we can rework this) +struct ImFontGlyph +{ + unsigned int Colored : 1; // Flag to indicate glyph is colored and should generally ignore tinting (make it usable with no shift on little-endian as this is used in loops) + unsigned int Visible : 1; // Flag to indicate glyph has no visible pixels (e.g. space). Allow early out when rendering. + unsigned int Codepoint : 30; // 0x0000..0x10FFFF + float AdvanceX; // Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in) + float X0, Y0, X1, Y1; // Glyph corners + float U0, V0, U1, V1; // Texture coordinates +}; + +// Helper to build glyph ranges from text/string data. Feed your application strings/characters to it then call BuildRanges(). +// This is essentially a tightly packed of vector of 64k booleans = 8KB storage. +struct ImFontGlyphRangesBuilder +{ + ImVector UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used) + + ImFontGlyphRangesBuilder() { Clear(); } + inline void Clear() { int size_in_bytes = (IM_UNICODE_CODEPOINT_MAX + 1) / 8; UsedChars.resize(size_in_bytes / (int)sizeof(ImU32)); memset(UsedChars.Data, 0, (size_t)size_in_bytes); } + inline bool GetBit(size_t n) const { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); return (UsedChars[off] & mask) != 0; } // Get bit n in the array + inline void SetBit(size_t n) { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); UsedChars[off] |= mask; } // Set bit n in the array + inline void AddChar(ImWchar c) { SetBit(c); } // Add character + IMGUI_API void AddText(const char* text, const char* text_end = NULL); // Add string (each character of the UTF-8 string are added) + IMGUI_API void AddRanges(const ImWchar* ranges); // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault()) to force add all of ASCII/Latin+Ext + IMGUI_API void BuildRanges(ImVector* out_ranges); // Output new ranges +}; + +// See ImFontAtlas::AddCustomRectXXX functions. +struct ImFontAtlasCustomRect +{ + unsigned short Width, Height; // Input // Desired rectangle dimension + unsigned short X, Y; // Output // Packed position in Atlas + unsigned int GlyphID; // Input // For custom font glyphs only (ID < 0x110000) + float GlyphAdvanceX; // Input // For custom font glyphs only: glyph xadvance + ImVec2 GlyphOffset; // Input // For custom font glyphs only: glyph display offset + ImFont* Font; // Input // For custom font glyphs only: target font + ImFontAtlasCustomRect() { Width = Height = 0; X = Y = 0xFFFF; GlyphID = 0; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; } + bool IsPacked() const { return X != 0xFFFF; } +}; + +// Flags for ImFontAtlas build +enum ImFontAtlasFlags_ +{ + ImFontAtlasFlags_None = 0, + ImFontAtlasFlags_NoPowerOfTwoHeight = 1 << 0, // Don't round the height to next power of two + ImFontAtlasFlags_NoMouseCursors = 1 << 1, // Don't build software mouse cursors into the atlas (save a little texture memory) + ImFontAtlasFlags_NoBakedLines = 1 << 2 // Don't build thick line textures into the atlas (save a little texture memory, allow support for point/nearest filtering). The AntiAliasedLinesUseTex features uses them, otherwise they will be rendered using polygons (more expensive for CPU/GPU). +}; + +// Load and rasterize multiple TTF/OTF fonts into a same texture. The font atlas will build a single texture holding: +// - One or more fonts. +// - Custom graphics data needed to render the shapes needed by Dear ImGui. +// - Mouse cursor shapes for software cursor rendering (unless setting 'Flags |= ImFontAtlasFlags_NoMouseCursors' in the font atlas). +// It is the user-code responsibility to setup/build the atlas, then upload the pixel data into a texture accessible by your graphics api. +// - Optionally, call any of the AddFont*** functions. If you don't call any, the default font embedded in the code will be loaded for you. +// - Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data. +// - Upload the pixels data into a texture within your graphics system (see imgui_impl_xxxx.cpp examples) +// - Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture in a format natural to your graphics API. +// This value will be passed back to you during rendering to identify the texture. Read FAQ entry about ImTextureID for more details. +// Common pitfalls: +// - If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the +// atlas is build (when calling GetTexData*** or Build()). We only copy the pointer, not the data. +// - Important: By default, AddFontFromMemoryTTF() takes ownership of the data. Even though we are not writing to it, we will free the pointer on destruction. +// You can set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed, +// - Even though many functions are suffixed with "TTF", OTF data is supported just as well. +// - This is an old API and it is currently awkward for those and and various other reasons! We will address them in the future! +struct ImFontAtlas +{ + IMGUI_API ImFontAtlas(); + IMGUI_API ~ImFontAtlas(); + IMGUI_API ImFont* AddFont(const ImFontConfig* font_cfg); + IMGUI_API ImFont* AddFontDefault(const ImFontConfig* font_cfg = NULL); + IMGUI_API ImFont* AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); + IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed. + IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp. + IMGUI_API ImFont* AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter. + IMGUI_API void ClearInputData(); // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts. + IMGUI_API void ClearTexData(); // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory. + IMGUI_API void ClearFonts(); // Clear output font data (glyphs storage, UV coordinates). + IMGUI_API void Clear(); // Clear all input and output. + + // Build atlas, retrieve pixel data. + // User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID(). + // The pitch is always = Width * BytesPerPixels (1 or 4) + // Building in RGBA32 format is provided for convenience and compatibility, but note that unless you manually manipulate or copy color data into + // the texture (e.g. when using the AddCustomRect*** api), then the RGB pixels emitted will always be white (~75% of memory/bandwidth waste. + IMGUI_API bool Build(); // Build pixels data. This is called automatically for you by the GetTexData*** functions. + IMGUI_API void GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 1 byte per-pixel + IMGUI_API void GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 4 bytes-per-pixel + bool IsBuilt() const { return Fonts.Size > 0 && TexReady; } // Bit ambiguous: used to detect when user didn't built texture but effectively we should check TexID != 0 except that would be backend dependent... + void SetTexID(ImTextureID id) { TexID = id; } + + //------------------------------------------- + // Glyph Ranges + //------------------------------------------- + + // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list) + // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details. + // NB: Consider using ImFontGlyphRangesBuilder to build glyph ranges from textual data. + IMGUI_API const ImWchar* GetGlyphRangesDefault(); // Basic Latin, Extended Latin + IMGUI_API const ImWchar* GetGlyphRangesKorean(); // Default + Korean characters + IMGUI_API const ImWchar* GetGlyphRangesJapanese(); // Default + Hiragana, Katakana, Half-Width, Selection of 2999 Ideographs + IMGUI_API const ImWchar* GetGlyphRangesChineseFull(); // Default + Half-Width + Japanese Hiragana/Katakana + full set of about 21000 CJK Unified Ideographs + IMGUI_API const ImWchar* GetGlyphRangesChineseSimplifiedCommon();// Default + Half-Width + Japanese Hiragana/Katakana + set of 2500 CJK Unified Ideographs for common simplified Chinese + IMGUI_API const ImWchar* GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters + IMGUI_API const ImWchar* GetGlyphRangesThai(); // Default + Thai characters + IMGUI_API const ImWchar* GetGlyphRangesVietnamese(); // Default + Vietnamese characters + + //------------------------------------------- + // [BETA] Custom Rectangles/Glyphs API + //------------------------------------------- + + // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. + // - After calling Build(), you can query the rectangle position and render your pixels. + // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of prefered texture format. + // - You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), + // so you can render e.g. custom colorful icons and use them as regular glyphs. + // - Read docs/FONTS.md for more details about using colorful icons. + // - Note: this API may be redesigned later in order to support multi-monitor varying DPI settings. + IMGUI_API int AddCustomRectRegular(int width, int height); + IMGUI_API int AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0, 0)); + ImFontAtlasCustomRect* GetCustomRectByIndex(int index) { IM_ASSERT(index >= 0); return &CustomRects[index]; } + + // [Internal] + IMGUI_API void CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const; + IMGUI_API bool GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]); + + //------------------------------------------- + // Members + //------------------------------------------- + + ImFontAtlasFlags Flags; // Build flags (see ImFontAtlasFlags_) + ImTextureID TexID; // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure. + int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height. + int TexGlyphPadding; // Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0 (will also need to set AntiAliasedLinesUseTex = false). + bool Locked; // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert. + + // [Internal] + // NB: Access texture data via GetTexData*() calls! Which will setup a default font for you. + bool TexReady; // Set when texture was built matching current font input + bool TexPixelsUseColors; // Tell whether our texture data is known to use colors (rather than just alpha channel), in order to help backend select a format. + unsigned char* TexPixelsAlpha8; // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight + unsigned int* TexPixelsRGBA32; // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4 + int TexWidth; // Texture width calculated during Build(). + int TexHeight; // Texture height calculated during Build(). + ImVec2 TexUvScale; // = (1.0f/TexWidth, 1.0f/TexHeight) + ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel + ImVector Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font. + ImVector CustomRects; // Rectangles for packing custom texture data into the atlas. + ImVector ConfigData; // Configuration data + ImVec4 TexUvLines[IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1]; // UVs for baked anti-aliased lines + + // [Internal] Font builder + const ImFontBuilderIO* FontBuilderIO; // Opaque interface to a font builder (default to stb_truetype, can be changed to use FreeType by defining IMGUI_ENABLE_FREETYPE). + unsigned int FontBuilderFlags; // Shared flags (for all fonts) for custom font builder. THIS IS BUILD IMPLEMENTATION DEPENDENT. Per-font override is also available in ImFontConfig. + + // [Internal] Packing data + int PackIdMouseCursors; // Custom texture rectangle ID for white pixel and mouse cursors + int PackIdLines; // Custom texture rectangle ID for baked anti-aliased lines + + // [Obsolete] + //typedef ImFontAtlasCustomRect CustomRect; // OBSOLETED in 1.72+ + //typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+ +}; + +// Font runtime data and rendering +// ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32(). +struct ImFont +{ + // Members: Hot ~20/24 bytes (for CalcTextSize) + ImVector IndexAdvanceX; // 12-16 // out // // Sparse. Glyphs->AdvanceX in a directly indexable way (cache-friendly for CalcTextSize functions which only this this info, and are often bottleneck in large UI). + float FallbackAdvanceX; // 4 // out // = FallbackGlyph->AdvanceX + float FontSize; // 4 // in // // Height of characters/line, set during loading (don't change after loading) + + // Members: Hot ~28/40 bytes (for CalcTextSize + render loop) + ImVector IndexLookup; // 12-16 // out // // Sparse. Index glyphs by Unicode code-point. + ImVector Glyphs; // 12-16 // out // // All glyphs. + const ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar) + + // Members: Cold ~32/40 bytes + ImFontAtlas* ContainerAtlas; // 4-8 // out // // What we has been loaded into + const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData + short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont. + ImWchar FallbackChar; // 2 // out // = FFFD/'?' // Character used if a glyph isn't found. + ImWchar EllipsisChar; // 2 // out // = '...' // Character used for ellipsis rendering. + ImWchar DotChar; // 2 // out // = '.' // Character used for ellipsis rendering (if a single '...' character isn't found) + bool DirtyLookupTables; // 1 // out // + float Scale; // 4 // in // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale() + float Ascent, Descent; // 4+4 // out // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] + int MetricsTotalSurface;// 4 // out // // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs) + ImU8 Used4kPagesMap[(IM_UNICODE_CODEPOINT_MAX+1)/4096/8]; // 2 bytes if ImWchar=ImWchar16, 34 bytes if ImWchar==ImWchar32. Store 1-bit for each block of 4K codepoints that has one active glyph. This is mainly used to facilitate iterations across all used codepoints. + + // Methods + IMGUI_API ImFont(); + IMGUI_API ~ImFont(); + IMGUI_API const ImFontGlyph*FindGlyph(ImWchar c) const; + IMGUI_API const ImFontGlyph*FindGlyphNoFallback(ImWchar c) const; + float GetCharAdvance(ImWchar c) const { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; } + bool IsLoaded() const { return ContainerAtlas != NULL; } + const char* GetDebugName() const { return ConfigData ? ConfigData->Name : ""; } + + // 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable. + // 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable. + IMGUI_API ImVec2 CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8 + IMGUI_API const char* CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const; + IMGUI_API void RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c) const; + IMGUI_API void RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const; + + // [Internal] Don't use! + IMGUI_API void BuildLookupTable(); + IMGUI_API void ClearOutputData(); + IMGUI_API void GrowIndex(int new_size); + IMGUI_API void AddGlyph(const ImFontConfig* src_cfg, ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x); + IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built. + IMGUI_API void SetGlyphVisible(ImWchar c, bool visible); + IMGUI_API bool IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Viewports +//----------------------------------------------------------------------------- + +// Flags stored in ImGuiViewport::Flags, giving indications to the platform backends. +enum ImGuiViewportFlags_ +{ + ImGuiViewportFlags_None = 0, + ImGuiViewportFlags_IsPlatformWindow = 1 << 0, // Represent a Platform Window + ImGuiViewportFlags_IsPlatformMonitor = 1 << 1, // Represent a Platform Monitor (unused yet) + ImGuiViewportFlags_OwnedByApp = 1 << 2 // Platform Window: is created/managed by the application (rather than a dear imgui backend) +}; + +// - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. +// - In 'docking' branch with multi-viewport enabled, we extend this concept to have multiple active viewports. +// - In the future we will extend this concept further to also represent Platform Monitor and support a "no main platform window" operation mode. +// - About Main Area vs Work Area: +// - Main Area = entire viewport. +// - Work Area = entire viewport minus sections used by main menu bars (for platform windows), or by task bar (for platform monitor). +// - Windows are generally trying to stay within the Work Area of their host viewport. +struct ImGuiViewport +{ + ImGuiViewportFlags Flags; // See ImGuiViewportFlags_ + ImVec2 Pos; // Main Area: Position of the viewport (Dear ImGui coordinates are the same as OS desktop/native coordinates) + ImVec2 Size; // Main Area: Size of the viewport. + ImVec2 WorkPos; // Work Area: Position of the viewport minus task bars, menus bars, status bars (>= Pos) + ImVec2 WorkSize; // Work Area: Size of the viewport minus task bars, menu bars, status bars (<= Size) + + // Platform/Backend Dependent Data + void* PlatformHandleRaw; // void* to hold lower-level, platform-native window handle (under Win32 this is expected to be a HWND, unused for other platforms) + + ImGuiViewport() { memset(this, 0, sizeof(*this)); } + + // Helpers + ImVec2 GetCenter() const { return ImVec2(Pos.x + Size.x * 0.5f, Pos.y + Size.y * 0.5f); } + ImVec2 GetWorkCenter() const { return ImVec2(WorkPos.x + WorkSize.x * 0.5f, WorkPos.y + WorkSize.y * 0.5f); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Platform Dependent Interfaces +//----------------------------------------------------------------------------- + +// (Optional) Support for IME (Input Method Editor) via the io.SetPlatformImeDataFn() function. +struct ImGuiPlatformImeData +{ + bool WantVisible; // A widget wants the IME to be visible + ImVec2 InputPos; // Position of the input cursor + float InputLineHeight; // Line height + + ImGuiPlatformImeData() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Obsolete functions and types +// (Will be removed! Read 'API BREAKING CHANGES' section in imgui.cpp for details) +// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead. +//----------------------------------------------------------------------------- + +namespace ImGui +{ +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + IMGUI_API int GetKeyIndex(ImGuiKey key); // map ImGuiKey_* values into legacy native key index. == io.KeyMap[key] +#else + static inline int GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END && "ImGuiKey and native_index was merged together and native_index is disabled by IMGUI_DISABLE_OBSOLETE_KEYIO. Please switch to ImGuiKey."); return key; } +#endif +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +namespace ImGui +{ + // OBSOLETED in 1.86 (from November 2021) + IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // Calculate coarse clipping for large list of evenly sized items. Prefer using ImGuiListClipper. + // OBSOLETED in 1.85 (from August 2021) + static inline float GetWindowContentRegionWidth() { return GetWindowContentRegionMax().x - GetWindowContentRegionMin().x; } + // OBSOLETED in 1.81 (from February 2021) + IMGUI_API bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // Helper to calculate size from items_count and height_in_items + static inline bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)) { return BeginListBox(label, size); } + static inline void ListBoxFooter() { EndListBox(); } + // OBSOLETED in 1.79 (from August 2020) + static inline void OpenPopupContextItem(const char* str_id = NULL, ImGuiMouseButton mb = 1) { OpenPopupOnItemClick(str_id, mb); } // Bool return value removed. Use IsWindowAppearing() in BeginPopup() instead. Renamed in 1.77, renamed back in 1.79. Sorry! + // OBSOLETED in 1.78 (from June 2020) + // Old drag/sliders functions that took a 'float power = 1.0' argument instead of flags. + // For shared code, you can version check at compile-time with `#if IMGUI_VERSION_NUM >= 17704`. + IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power); + IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power); + static inline bool DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, power); } + static inline bool DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, power); } + static inline bool DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, power); } + static inline bool DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, float power) { return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, power); } + IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power); + IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format, float power); + static inline bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, float power) { return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, power); } + static inline bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, float power) { return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, power); } + static inline bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, float power) { return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, power); } + static inline bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, float power) { return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, power); } + // OBSOLETED in 1.77 (from June 2020) + static inline bool BeginPopupContextWindow(const char* str_id, ImGuiMouseButton mb, bool over_items) { return BeginPopupContextWindow(str_id, mb | (over_items ? 0 : ImGuiPopupFlags_NoOpenOverItems)); } + + // Some of the older obsolete names along with their replacement (commented out so they are not reported in IDE) + //static inline void TreeAdvanceToLabelPos() { SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()); } // OBSOLETED in 1.72 (from July 2019) + //static inline void SetNextTreeNodeOpen(bool open, ImGuiCond cond = 0) { SetNextItemOpen(open, cond); } // OBSOLETED in 1.71 (from June 2019) + //static inline float GetContentRegionAvailWidth() { return GetContentRegionAvail().x; } // OBSOLETED in 1.70 (from May 2019) + //static inline ImDrawList* GetOverlayDrawList() { return GetForegroundDrawList(); } // OBSOLETED in 1.69 (from Mar 2019) + //static inline void SetScrollHere(float ratio = 0.5f) { SetScrollHereY(ratio); } // OBSOLETED in 1.66 (from Nov 2018) + //static inline bool IsItemDeactivatedAfterChange() { return IsItemDeactivatedAfterEdit(); } // OBSOLETED in 1.63 (from Aug 2018) + //static inline bool IsAnyWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_AnyWindow); } // OBSOLETED in 1.60 (from Apr 2018) + //static inline bool IsAnyWindowHovered() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); } // OBSOLETED in 1.60 (between Dec 2017 and Apr 2018) + //static inline void ShowTestWindow() { return ShowDemoWindow(); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) + //static inline bool IsRootWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootWindow); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) + //static inline bool IsRootWindowOrAnyChildFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) + //static inline void SetNextWindowContentWidth(float w) { SetNextWindowContentSize(ImVec2(w, 0.0f)); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) + //static inline float GetItemsLineHeightWithSpacing() { return GetFrameHeightWithSpacing(); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) +} + +// OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect() +typedef ImDrawFlags ImDrawCornerFlags; +enum ImDrawCornerFlags_ +{ + ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit + ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally). + ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82. + ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82. + ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82. + ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82 + ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, + ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, + ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, + ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight +}; + +// RENAMED ImGuiKeyModFlags -> ImGuiModFlags in 1.88 (from April 2022) +typedef int ImGuiKeyModFlags; +enum ImGuiKeyModFlags_ { ImGuiKeyModFlags_None = ImGuiModFlags_None, ImGuiKeyModFlags_Ctrl = ImGuiModFlags_Ctrl, ImGuiKeyModFlags_Shift = ImGuiModFlags_Shift, ImGuiKeyModFlags_Alt = ImGuiModFlags_Alt, ImGuiKeyModFlags_Super = ImGuiModFlags_Super }; + +#endif // #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +//----------------------------------------------------------------------------- + +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#ifdef _MSC_VER +#pragma warning (pop) +#endif + +// Include imgui_user.h at the end of imgui.h (convenient for user to only explicitly include vanilla imgui.h) +#ifdef IMGUI_INCLUDE_IMGUI_USER_H +#include "imgui_user.h" +#endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/3rdparty/imgui/include/imgui_internal.h b/3rdparty/imgui/include/imgui_internal.h new file mode 100644 index 0000000000..ba1d9a0625 --- /dev/null +++ b/3rdparty/imgui/include/imgui_internal.h @@ -0,0 +1,2944 @@ +// dear imgui, v1.88 WIP +// (internal structures/api) + +// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility! +// Set: +// #define IMGUI_DEFINE_MATH_OPERATORS +// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators) + +/* + +Index of this file: + +// [SECTION] Header mess +// [SECTION] Forward declarations +// [SECTION] Context pointer +// [SECTION] STB libraries includes +// [SECTION] Macros +// [SECTION] Generic helpers +// [SECTION] ImDrawList support +// [SECTION] Widgets support: flags, enums, data structures +// [SECTION] Inputs support +// [SECTION] Clipper support +// [SECTION] Navigation support +// [SECTION] Columns support +// [SECTION] Multi-select support +// [SECTION] Docking support +// [SECTION] Viewport support +// [SECTION] Settings support +// [SECTION] Metrics, Debug tools +// [SECTION] Generic context hooks +// [SECTION] ImGuiContext (main imgui context) +// [SECTION] ImGuiWindowTempData, ImGuiWindow +// [SECTION] Tab bar, Tab item support +// [SECTION] Table support +// [SECTION] ImGui internal API +// [SECTION] ImFontAtlas internal API +// [SECTION] Test Engine specific hooks (imgui_test_engine) + +*/ + +#pragma once +#ifndef IMGUI_DISABLE + +//----------------------------------------------------------------------------- +// [SECTION] Header mess +//----------------------------------------------------------------------------- + +#ifndef IMGUI_VERSION +#include "imgui.h" +#endif + +#include // FILE*, sscanf +#include // NULL, malloc, free, qsort, atoi, atof +#include // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf +#include // INT_MIN, INT_MAX + +// Enable SSE intrinsics if available +#if (defined __SSE__ || defined __x86_64__ || defined _M_X64) && !defined(IMGUI_DISABLE_SSE) +#define IMGUI_ENABLE_SSE +#include +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport) +#pragma warning (disable: 26812) // The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer) +#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#pragma clang diagnostic push +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloorSigned() +#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h +#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h +#pragma clang diagnostic ignored "-Wold-style-cast" +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#pragma clang diagnostic ignored "-Wdouble-promotion" +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn' +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +// Legacy defines +#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74 +#error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS +#endif +#ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74 +#error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS +#endif + +// Enable stb_truetype by default unless FreeType is enabled. +// You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together. +#ifndef IMGUI_ENABLE_FREETYPE +#define IMGUI_ENABLE_STB_TRUETYPE +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Forward declarations +//----------------------------------------------------------------------------- + +struct ImBitVector; // Store 1-bit per value +struct ImRect; // An axis-aligned rectangle (2 points) +struct ImDrawDataBuilder; // Helper to build a ImDrawData instance +struct ImDrawListSharedData; // Data shared between all ImDrawList instances +struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it +struct ImGuiContext; // Main Dear ImGui context +struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine +struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum +struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup() +struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box +struct ImGuiLastItemData; // Status storage for last submitted items +struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only +struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result +struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions +struct ImGuiNextWindowData; // Storage for SetNextWindow** functions +struct ImGuiNextItemData; // Storage for SetNextItem** functions +struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api +struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api +struct ImGuiPopupData; // Storage for current popup stack +struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file +struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting +struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it +struct ImGuiTabBar; // Storage for a tab bar +struct ImGuiTabItem; // Storage for a tab item (within a tab bar) +struct ImGuiTable; // Storage for a table +struct ImGuiTableColumn; // Storage for one column of a table +struct ImGuiTableInstanceData; // Storage for one instance of a same table +struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables. +struct ImGuiTableSettings; // Storage for a table .ini settings +struct ImGuiTableColumnsSettings; // Storage for a column .ini settings +struct ImGuiWindow; // Storage for one window +struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window) +struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session) + +// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists. +typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical +typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later) +typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag() +typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags +typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns() +typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight() +typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d() +typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests +typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions +typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions +typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // Flags: for ScrollToItem() and navigation requests +typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx() +typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx() +typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx() + +typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...); + +//----------------------------------------------------------------------------- +// [SECTION] Context pointer +// See implementation of this variable in imgui.cpp for comments and details. +//----------------------------------------------------------------------------- + +#ifndef GImGui +extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer +#endif + +//------------------------------------------------------------------------- +// [SECTION] STB libraries includes +//------------------------------------------------------------------------- + +namespace ImStb +{ + +#undef STB_TEXTEDIT_STRING +#undef STB_TEXTEDIT_CHARTYPE +#define STB_TEXTEDIT_STRING ImGuiInputTextState +#define STB_TEXTEDIT_CHARTYPE ImWchar +#define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) +#define STB_TEXTEDIT_UNDOSTATECOUNT 99 +#define STB_TEXTEDIT_UNDOCHARCOUNT 999 +#include "imstb_textedit.h" + +} // namespace ImStb + +//----------------------------------------------------------------------------- +// [SECTION] Macros +//----------------------------------------------------------------------------- + +// Debug Logging +#ifndef IMGUI_DEBUG_LOG +#define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__) +#endif + +// Debug Logging for selected systems. Remove the '((void)0) //' to enable. +//#define IMGUI_DEBUG_LOG_POPUP IMGUI_DEBUG_LOG // Enable log +//#define IMGUI_DEBUG_LOG_NAV IMGUI_DEBUG_LOG // Enable log +//#define IMGUI_DEBUG_LOG_IO IMGUI_DEBUG_LOG // Enable log +#define IMGUI_DEBUG_LOG_POPUP(...) ((void)0) // Disable log +#define IMGUI_DEBUG_LOG_NAV(...) ((void)0) // Disable log +#define IMGUI_DEBUG_LOG_IO(...) ((void)0) // Disable log + +// Static Asserts +#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "") + +// "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much. +// We currently don't have many of those so the effect is currently negligible, but onward intent to add more aggressive ones in the code. +//#define IMGUI_DEBUG_PARANOID +#ifdef IMGUI_DEBUG_PARANOID +#define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR) +#else +#define IM_ASSERT_PARANOID(_EXPR) +#endif + +// Error handling +// Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults. +#ifndef IM_ASSERT_USER_ERROR +#define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error +#endif + +// Misc Macros +#define IM_PI 3.14159265358979323846f +#ifdef _WIN32 +#define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!) +#else +#define IM_NEWLINE "\n" +#endif +#define IM_TABSIZE (4) +#define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + ((_ALIGN) - 1)) & ~((_ALIGN) - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8 +#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose +#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 +#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds +#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // + +// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall +#ifdef _MSC_VER +#define IMGUI_CDECL __cdecl +#else +#define IMGUI_CDECL +#endif + +// Warnings +#if defined(_MSC_VER) && !defined(__clang__) +#define IM_MSVC_WARNING_SUPPRESS(XXXX) __pragma(warning(suppress: XXXX)) +#else +#define IM_MSVC_WARNING_SUPPRESS(XXXX) +#endif + +// Debug Tools +// Use 'Metrics/Debugger->Tools->Item Picker' to break into the call-stack of a specific item. +// This will call IM_DEBUG_BREAK() which you may redefine yourself. See https://github.com/scottt/debugbreak for more reference. +#ifndef IM_DEBUG_BREAK +#if defined (_MSC_VER) +#define IM_DEBUG_BREAK() __debugbreak() +#elif defined(__clang__) +#define IM_DEBUG_BREAK() __builtin_debugtrap() +#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#define IM_DEBUG_BREAK() __asm__ volatile("int $0x03") +#elif defined(__GNUC__) && defined(__thumb__) +#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01") +#elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__) +#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0"); +#else +#define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger! +#endif +#endif // #ifndef IM_DEBUG_BREAK + +//----------------------------------------------------------------------------- +// [SECTION] Generic helpers +// Note that the ImXXX helpers functions are lower-level than ImGui functions. +// ImGui functions or the ImGui context are never called/used from other ImXXX functions. +//----------------------------------------------------------------------------- +// - Helpers: Hashing +// - Helpers: Sorting +// - Helpers: Bit manipulation +// - Helpers: String +// - Helpers: Formatting +// - Helpers: UTF-8 <> wchar conversions +// - Helpers: ImVec2/ImVec4 operators +// - Helpers: Maths +// - Helpers: Geometry +// - Helper: ImVec1 +// - Helper: ImVec2ih +// - Helper: ImRect +// - Helper: ImBitArray +// - Helper: ImBitVector +// - Helper: ImSpan<>, ImSpanAllocator<> +// - Helper: ImPool<> +// - Helper: ImChunkStream<> +//----------------------------------------------------------------------------- + +// Helpers: Hashing +IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImU32 seed = 0); +IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0); + +// Helpers: Sorting +#ifndef ImQsort +static inline void ImQsort(void* base, size_t count, size_t size_of_element, int(IMGUI_CDECL *compare_func)(void const*, void const*)) { if (count > 1) qsort(base, count, size_of_element, compare_func); } +#endif + +// Helpers: Color Blending +IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b); + +// Helpers: Bit manipulation +static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; } +static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; } +static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; } + +// Helpers: String +IMGUI_API int ImStricmp(const char* str1, const char* str2); +IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); +IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); +IMGUI_API char* ImStrdup(const char* str); +IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); +IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); +IMGUI_API int ImStrlenW(const ImWchar* str); +IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line +IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line +IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); +IMGUI_API void ImStrTrimBlanks(char* str); +IMGUI_API const char* ImStrSkipBlank(const char* str); +static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; } +static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; } + +// Helpers: Formatting +IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3); +IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3); +IMGUI_API const char* ImParseFormatFindStart(const char* format); +IMGUI_API const char* ImParseFormatFindEnd(const char* format); +IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size); +IMGUI_API void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size); +IMGUI_API const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size); +IMGUI_API int ImParseFormatPrecision(const char* format, int default_value); + +// Helpers: UTF-8 <> wchar conversions +IMGUI_API const char* ImTextCharToUtf8(char out_buf[5], unsigned int c); // return out_buf +IMGUI_API int ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count +IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count +IMGUI_API int ImTextStrFromUtf8(ImWchar* out_buf, int out_buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count +IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count) +IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8 +IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8 + +// Helpers: ImVec2/ImVec4 operators +// We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.) +// We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself. +#ifdef IMGUI_DEFINE_MATH_OPERATORS +IM_MSVC_RUNTIME_CHECKS_OFF +static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x * rhs, lhs.y * rhs); } +static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); } +static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); } +static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); } +static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } +static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); } +static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; } +static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; } +static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; } +static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; } +static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; } +static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; } +static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); } +static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); } +static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); } +IM_MSVC_RUNTIME_CHECKS_RESTORE +#endif + +// Helpers: File System +#ifdef IMGUI_DISABLE_FILE_FUNCTIONS +#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS +typedef void* ImFileHandle; +static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; } +static inline bool ImFileClose(ImFileHandle) { return false; } +static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; } +static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; } +static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; } +#endif +#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS +typedef FILE* ImFileHandle; +IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode); +IMGUI_API bool ImFileClose(ImFileHandle file); +IMGUI_API ImU64 ImFileGetSize(ImFileHandle file); +IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file); +IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file); +#else +#define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions +#endif +IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0); + +// Helpers: Maths +IM_MSVC_RUNTIME_CHECKS_OFF +// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy) +#ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS +#define ImFabs(X) fabsf(X) +#define ImSqrt(X) sqrtf(X) +#define ImFmod(X, Y) fmodf((X), (Y)) +#define ImCos(X) cosf(X) +#define ImSin(X) sinf(X) +#define ImAcos(X) acosf(X) +#define ImAtan2(Y, X) atan2f((Y), (X)) +#define ImAtof(STR) atof(STR) +//#define ImFloorStd(X) floorf(X) // We use our own, see ImFloor() and ImFloorSigned() +#define ImCeil(X) ceilf(X) +static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision +static inline double ImPow(double x, double y) { return pow(x, y); } +static inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision +static inline double ImLog(double x) { return log(x); } +static inline int ImAbs(int x) { return x < 0 ? -x : x; } +static inline float ImAbs(float x) { return fabsf(x); } +static inline double ImAbs(double x) { return fabs(x); } +static inline float ImSign(float x) { return (x < 0.0f) ? -1.0f : (x > 0.0f) ? 1.0f : 0.0f; } // Sign operator - returns -1, 0 or 1 based on sign of argument +static inline double ImSign(double x) { return (x < 0.0) ? -1.0 : (x > 0.0) ? 1.0 : 0.0; } +#ifdef IMGUI_ENABLE_SSE +static inline float ImRsqrt(float x) { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); } +#else +static inline float ImRsqrt(float x) { return 1.0f / sqrtf(x); } +#endif +static inline double ImRsqrt(double x) { return 1.0 / sqrt(x); } +#endif +// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double +// (Exceptionally using templates here but we could also redefine them for those types) +template static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; } +template static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; } +template static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } +template static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); } +template static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; } +template static inline T ImAddClampOverflow(T a, T b, T mn, T mx) { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; } +template static inline T ImSubClampOverflow(T a, T b, T mn, T mx) { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; } +// - Misc maths helpers +static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); } +static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); } +static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); } +static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); } +static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); } +static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); } +static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; } +static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); } +static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); } +static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return ImRsqrt(d); return fail_value; } +static inline float ImFloor(float f) { return (float)(int)(f); } +static inline float ImFloorSigned(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf() +static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } +static inline ImVec2 ImFloorSigned(const ImVec2& v) { return ImVec2(ImFloorSigned(v.x), ImFloorSigned(v.y)); } +static inline int ImModPositive(int a, int b) { return (a + b) % b; } +static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; } +static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } +static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; } +static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } +static inline bool ImIsFloatAboveGuaranteedIntegerPrecision(float f) { return f <= -16777216 || f >= 16777216; } +IM_MSVC_RUNTIME_CHECKS_RESTORE + +// Helpers: Geometry +IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t); +IMGUI_API ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments); // For curves with explicit number of segments +IMGUI_API ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol);// For auto-tessellated curves you can use tess_tol = style.CurveTessellationTol +IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t); +IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p); +IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); +IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); +IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w); +inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; } +IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy); + +// Helper: ImVec1 (1D vector) +// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches) +IM_MSVC_RUNTIME_CHECKS_OFF +struct ImVec1 +{ + float x; + constexpr ImVec1() : x(0.0f) { } + constexpr ImVec1(float _x) : x(_x) { } +}; + +// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage) +struct ImVec2ih +{ + short x, y; + constexpr ImVec2ih() : x(0), y(0) {} + constexpr ImVec2ih(short _x, short _y) : x(_x), y(_y) {} + constexpr explicit ImVec2ih(const ImVec2& rhs) : x((short)rhs.x), y((short)rhs.y) {} +}; + +// Helper: ImRect (2D axis aligned bounding-box) +// NB: we can't rely on ImVec2 math operators being available here! +struct IMGUI_API ImRect +{ + ImVec2 Min; // Upper-left + ImVec2 Max; // Lower-right + + constexpr ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {} + constexpr ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {} + constexpr ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {} + constexpr ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {} + + ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); } + ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); } + float GetWidth() const { return Max.x - Min.x; } + float GetHeight() const { return Max.y - Min.y; } + float GetArea() const { return (Max.x - Min.x) * (Max.y - Min.y); } + ImVec2 GetTL() const { return Min; } // Top-left + ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right + ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left + ImVec2 GetBR() const { return Max; } // Bottom-right + bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; } + bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; } + bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; } + void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; } + void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; } + void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; } + void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; } + void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; } + void TranslateX(float dx) { Min.x += dx; Max.x += dx; } + void TranslateY(float dy) { Min.y += dy; Max.y += dy; } + void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display. + void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped. + void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); } + bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; } + ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); } +}; +IM_MSVC_RUNTIME_CHECKS_RESTORE + +// Helper: ImBitArray +inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; } +inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; } +inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; } +inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2) +{ + n2--; + while (n <= n2) + { + int a_mod = (n & 31); + int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1; + ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1); + arr[n >> 5] |= mask; + n = (n + 32) & ~31; + } +} + +// Helper: ImBitArray class (wrapper over ImBitArray functions) +// Store 1-bit per value. +template +struct ImBitArray +{ + ImU32 Storage[(BITCOUNT + 31) >> 5]; + ImBitArray() { ClearAllBits(); } + void ClearAllBits() { memset(Storage, 0, sizeof(Storage)); } + void SetAllBits() { memset(Storage, 255, sizeof(Storage)); } + bool TestBit(int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); } + void SetBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Storage, n); } + void ClearBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Storage, n); } + void SetBitRange(int n, int n2) { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2) + bool operator[](int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return ImBitArrayTestBit(Storage, n); } +}; + +// Helper: ImBitVector +// Store 1-bit per value. +struct IMGUI_API ImBitVector +{ + ImVector Storage; + void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); } + void Clear() { Storage.clear(); } + bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return ImBitArrayTestBit(Storage.Data, n); } + void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); } + void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); } +}; + +// Helper: ImSpan<> +// Pointing to a span of data we don't own. +template +struct ImSpan +{ + T* Data; + T* DataEnd; + + // Constructors, destructor + inline ImSpan() { Data = DataEnd = NULL; } + inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; } + inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; } + + inline void set(T* data, int size) { Data = data; DataEnd = data + size; } + inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; } + inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); } + inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); } + inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } + inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } + + inline T* begin() { return Data; } + inline const T* begin() const { return Data; } + inline T* end() { return DataEnd; } + inline const T* end() const { return DataEnd; } + + // Utilities + inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; } +}; + +// Helper: ImSpanAllocator<> +// Facilitate storing multiple chunks into a single large block (the "arena") +// - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges. +template +struct ImSpanAllocator +{ + char* BasePtr; + int CurrOff; + int CurrIdx; + int Offsets[CHUNKS]; + int Sizes[CHUNKS]; + + ImSpanAllocator() { memset(this, 0, sizeof(*this)); } + inline void Reserve(int n, size_t sz, int a=4) { IM_ASSERT(n == CurrIdx && n < CHUNKS); CurrOff = IM_MEMALIGN(CurrOff, a); Offsets[n] = CurrOff; Sizes[n] = (int)sz; CurrIdx++; CurrOff += (int)sz; } + inline int GetArenaSizeInBytes() { return CurrOff; } + inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; } + inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); } + inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); } + template + inline void GetSpan(int n, ImSpan* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); } +}; + +// Helper: ImPool<> +// Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer, +// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object. +typedef int ImPoolIdx; +template +struct ImPool +{ + ImVector Buf; // Contiguous data + ImGuiStorage Map; // ID->Index + ImPoolIdx FreeIdx; // Next free idx to use + ImPoolIdx AliveCount; // Number of active/alive items (for display purpose) + + ImPool() { FreeIdx = AliveCount = 0; } + ~ImPool() { Clear(); } + T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; } + T* GetByIndex(ImPoolIdx n) { return &Buf[n]; } + ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); } + T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); } + bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); } + void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = AliveCount = 0; } + T* Add() { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); AliveCount++; return &Buf[idx]; } + void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); } + void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); AliveCount--; } + void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); } + + // To iterate a ImPool: for (int n = 0; n < pool.GetMapSize(); n++) if (T* t = pool.TryGetMapData(n)) { ... } + // Can be avoided if you know .Remove() has never been called on the pool, or AliveCount == GetMapSize() + int GetAliveCount() const { return AliveCount; } // Number of active/alive items in the pool (for display purpose) + int GetBufSize() const { return Buf.Size; } + int GetMapSize() const { return Map.Data.Size; } // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere + T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); } +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + int GetSize() { return GetMapSize(); } // For ImPlot: should use GetMapSize() from (IMGUI_VERSION_NUM >= 18304) +#endif +}; + +// Helper: ImChunkStream<> +// Build and iterate a contiguous stream of variable-sized structures. +// This is used by Settings to store persistent data while reducing allocation count. +// We store the chunk size first, and align the final size on 4 bytes boundaries. +// The tedious/zealous amount of casting is to avoid -Wcast-align warnings. +template +struct ImChunkStream +{ + ImVector Buf; + + void clear() { Buf.clear(); } + bool empty() const { return Buf.Size == 0; } + int size() const { return Buf.Size; } + T* alloc_chunk(size_t sz) { size_t HDR_SZ = 4; sz = IM_MEMALIGN(HDR_SZ + sz, 4u); int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); } + T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); } + T* next_chunk(T* p) { size_t HDR_SZ = 4; IM_ASSERT(p >= begin() && p < end()); p = (T*)(void*)((char*)(void*)p + chunk_size(p)); if (p == (T*)(void*)((char*)end() + HDR_SZ)) return (T*)0; IM_ASSERT(p < end()); return p; } + int chunk_size(const T* p) { return ((const int*)p)[-1]; } + T* end() { return (T*)(void*)(Buf.Data + Buf.Size); } + int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; } + T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); } + void swap(ImChunkStream& rhs) { rhs.Buf.swap(Buf); } + +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawList support +//----------------------------------------------------------------------------- + +// ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value. +// Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693 +// Number of segments (N) is calculated using equation: +// N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r +// Our equation is significantly simpler that one in the post thanks for choosing segment that is +// perpendicular to X axis. Follow steps in the article from this starting condition and you will +// will get this result. +// +// Rendering circles with an odd number of segments, while mathematically correct will produce +// asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.) +#define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2) +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4 +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512 +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp(IM_ROUNDUP_TO_EVEN((int)ImCeil(IM_PI / ImAcos(1 - ImMin((_MAXERROR), (_RAD)) / (_RAD)))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX) + +// Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'. +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI)))) +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD)) + +// ImDrawList: Lookup table size for adaptive arc drawing, cover full circle. +#ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE +#define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table. +#endif +#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle. + +// Data shared between all ImDrawList instances +// You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure. +struct IMGUI_API ImDrawListSharedData +{ + ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas + ImFont* Font; // Current/default font (optional, for simplified AddText overload) + float FontSize; // Current/default font size (optional, for simplified AddText overload) + float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() + float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc + ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen() + ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards) + + // [Internal] Lookup tables + ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle. + float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo() + ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead) + const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas + + ImDrawListSharedData(); + void SetCircleTessellationMaxError(float max_error); +}; + +struct ImDrawDataBuilder +{ + ImVector Layers[2]; // Global layers for: regular, tooltip + + void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); } + void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); } + int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; } + IMGUI_API void FlattenIntoSingleLayer(); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Widgets support: flags, enums, data structures +//----------------------------------------------------------------------------- + +// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin(). +// This is going to be exposed in imgui.h when stabilized enough. +enum ImGuiItemFlags_ +{ + ImGuiItemFlags_None = 0, + ImGuiItemFlags_NoTabStop = 1 << 0, // false // Disable keyboard tabbing (FIXME: should merge with _NoNav) + ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings. + ImGuiItemFlags_Disabled = 1 << 2, // false // Disable interactions but doesn't affect visuals. See BeginDisabled()/EndDisabled(). See github.com/ocornut/imgui/issues/211 + ImGuiItemFlags_NoNav = 1 << 3, // false // Disable keyboard/gamepad directional navigation (FIXME: should merge with _NoTabStop) + ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false // Disable item being a candidate for default focus (e.g. used by title bar items) + ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // Disable MenuItem/Selectable() automatically closing their popup window + ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets) + ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed. + ImGuiItemFlags_Inputable = 1 << 8 // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature. +}; + +// Storage for LastItem data +enum ImGuiItemStatusFlags_ +{ + ImGuiItemStatusFlags_None = 0, + ImGuiItemStatusFlags_HoveredRect = 1 << 0, // Mouse position is within item rectangle (does NOT mean that the window is in correct z-order and can be hovered!, this is only one part of the most-common IsItemHovered test) + ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // g.LastItemData.DisplayRect is valid + ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets) + ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected", only state changes, in order to easily handle clipping with less issues. + ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state. + ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag. + ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set. + ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing. + ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8 // Set when the Focusable item just got focused by Tabbing (FIXME: to be removed soon) + +#ifdef IMGUI_ENABLE_TEST_ENGINE + , // [imgui_tests only] + ImGuiItemStatusFlags_Openable = 1 << 20, // Item is an openable (e.g. TreeNode) + ImGuiItemStatusFlags_Opened = 1 << 21, // + ImGuiItemStatusFlags_Checkable = 1 << 22, // Item is a checkable (e.g. CheckBox, MenuItem) + ImGuiItemStatusFlags_Checked = 1 << 23 // +#endif +}; + +// Extend ImGuiInputTextFlags_ +enum ImGuiInputTextFlagsPrivate_ +{ + // [Internal] + ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline() + ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data + ImGuiInputTextFlags_MergedItem = 1 << 28 // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match. +}; + +// Extend ImGuiButtonFlags_ +enum ImGuiButtonFlagsPrivate_ +{ + ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event) + ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using + ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item + ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release) + ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release) + ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) + ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat + ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping + ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() + ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED] + //ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled + ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine + ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held + ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) + ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated + ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item + ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold, + ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease +}; + +// Extend ImGuiComboFlags_ +enum ImGuiComboFlagsPrivate_ +{ + ImGuiComboFlags_CustomPreview = 1 << 20 // enable BeginComboPreview() +}; + +// Extend ImGuiSliderFlags_ +enum ImGuiSliderFlagsPrivate_ +{ + ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically? + ImGuiSliderFlags_ReadOnly = 1 << 21 +}; + +// Extend ImGuiSelectableFlags_ +enum ImGuiSelectableFlagsPrivate_ +{ + // NB: need to be in sync with last value of ImGuiSelectableFlags_ + ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20, + ImGuiSelectableFlags_SelectOnNav = 1 << 21, // (WIP) Auto-select when moved into. This is not exposed in public API as to handle multi-select and modifiers we will need user to explicitly control focus scope. May be replaced with a BeginSelection() API. + ImGuiSelectableFlags_SelectOnClick = 1 << 22, // Override button behavior to react on Click (default is Click+Release) + ImGuiSelectableFlags_SelectOnRelease = 1 << 23, // Override button behavior to react on Release (default is Click+Release) + ImGuiSelectableFlags_SpanAvailWidth = 1 << 24, // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus) + ImGuiSelectableFlags_DrawHoveredWhenHeld = 1 << 25, // Always show active when held, even is not hovered. This concept could probably be renamed/formalized somehow. + ImGuiSelectableFlags_SetNavIdOnHover = 1 << 26, // Set Nav/Focus ID on mouse hover (used by MenuItem) + ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 27 // Disable padding each side with ItemSpacing * 0.5f +}; + +// Extend ImGuiTreeNodeFlags_ +enum ImGuiTreeNodeFlagsPrivate_ +{ + ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20 +}; + +enum ImGuiSeparatorFlags_ +{ + ImGuiSeparatorFlags_None = 0, + ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar + ImGuiSeparatorFlags_Vertical = 1 << 1, + ImGuiSeparatorFlags_SpanAllColumns = 1 << 2 +}; + +enum ImGuiTextFlags_ +{ + ImGuiTextFlags_None = 0, + ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0 +}; + +enum ImGuiTooltipFlags_ +{ + ImGuiTooltipFlags_None = 0, + ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0 // Override will clear/ignore previously submitted tooltip (defaults to append) +}; + +// FIXME: this is in development, not exposed/functional as a generic feature yet. +// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2 +enum ImGuiLayoutType_ +{ + ImGuiLayoutType_Horizontal = 0, + ImGuiLayoutType_Vertical = 1 +}; + +enum ImGuiLogType +{ + ImGuiLogType_None = 0, + ImGuiLogType_TTY, + ImGuiLogType_File, + ImGuiLogType_Buffer, + ImGuiLogType_Clipboard +}; + +// X/Y enums are fixed to 0/1 so they may be used to index ImVec2 +enum ImGuiAxis +{ + ImGuiAxis_None = -1, + ImGuiAxis_X = 0, + ImGuiAxis_Y = 1 +}; + +enum ImGuiPlotType +{ + ImGuiPlotType_Lines, + ImGuiPlotType_Histogram +}; + +enum ImGuiPopupPositionPolicy +{ + ImGuiPopupPositionPolicy_Default, + ImGuiPopupPositionPolicy_ComboBox, + ImGuiPopupPositionPolicy_Tooltip +}; + +struct ImGuiDataTypeTempStorage +{ + ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT +}; + +// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). +struct ImGuiDataTypeInfo +{ + size_t Size; // Size in bytes + const char* Name; // Short descriptive name for the type, for debugging + const char* PrintFmt; // Default printf format for the type + const char* ScanFmt; // Default scanf format for the type +}; + +// Extend ImGuiDataType_ +enum ImGuiDataTypePrivate_ +{ + ImGuiDataType_String = ImGuiDataType_COUNT + 1, + ImGuiDataType_Pointer, + ImGuiDataType_ID +}; + +// Stacked color modifier, backup of modified data so we can restore it +struct ImGuiColorMod +{ + ImGuiCol Col; + ImVec4 BackupValue; +}; + +// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable. +struct ImGuiStyleMod +{ + ImGuiStyleVar VarIdx; + union { int BackupInt[2]; float BackupFloat[2]; }; + ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; } + ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; } + ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; } +}; + +// Storage data for BeginComboPreview()/EndComboPreview() +struct IMGUI_API ImGuiComboPreviewData +{ + ImRect PreviewRect; + ImVec2 BackupCursorPos; + ImVec2 BackupCursorMaxPos; + ImVec2 BackupCursorPosPrevLine; + float BackupPrevLineTextBaseOffset; + ImGuiLayoutType BackupLayout; + + ImGuiComboPreviewData() { memset(this, 0, sizeof(*this)); } +}; + +// Stacked storage data for BeginGroup()/EndGroup() +struct IMGUI_API ImGuiGroupData +{ + ImGuiID WindowID; + ImVec2 BackupCursorPos; + ImVec2 BackupCursorMaxPos; + ImVec1 BackupIndent; + ImVec1 BackupGroupOffset; + ImVec2 BackupCurrLineSize; + float BackupCurrLineTextBaseOffset; + ImGuiID BackupActiveIdIsAlive; + bool BackupActiveIdPreviousFrameIsAlive; + bool BackupHoveredIdIsAlive; + bool EmitItem; +}; + +// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper. +struct IMGUI_API ImGuiMenuColumns +{ + ImU32 TotalWidth; + ImU32 NextTotalWidth; + ImU16 Spacing; + ImU16 OffsetIcon; // Always zero for now + ImU16 OffsetLabel; // Offsets are locked in Update() + ImU16 OffsetShortcut; + ImU16 OffsetMark; + ImU16 Widths[4]; // Width of: Icon, Label, Shortcut, Mark (accumulators for current frame) + + ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); } + void Update(float spacing, bool window_reappearing); + float DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark); + void CalcNextTotalWidth(bool update_offsets); +}; + +// Internal state of the currently focused/edited text input box +// For a given item ID, access with ImGui::GetInputTextState() +struct IMGUI_API ImGuiInputTextState +{ + ImGuiID ID; // widget id owning the text state + int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not. + ImVector TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer. + ImVector TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. + ImVector InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) + bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument) + int BufCapacityA; // end-user buffer capacity + float ScrollX; // horizontal scrolling/offset + ImStb::STB_TexteditState Stb; // state for stb_textedit.h + float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately + bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!) + bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection + bool Edited; // edited this frame + ImGuiInputTextFlags Flags; // copy of InputText() flags + + ImGuiInputTextState() { memset(this, 0, sizeof(*this)); } + void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); } + void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); } + int GetUndoAvailCount() const { return Stb.undostate.undo_point; } + int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } + void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation + + // Cursor & Selection + void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking + void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); } + bool HasSelection() const { return Stb.select_start != Stb.select_end; } + void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; } + int GetCursorPos() const { return Stb.cursor; } + int GetSelectionStart() const { return Stb.select_start; } + int GetSelectionEnd() const { return Stb.select_end; } + void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; } +}; + +// Storage for current popup stack +struct ImGuiPopupData +{ + ImGuiID PopupId; // Set on OpenPopup() + ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() + ImGuiWindow* SourceWindow; // Set on OpenPopup() copy of NavWindow at the time of opening the popup + int OpenFrameCount; // Set on OpenPopup() + ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) + ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) + ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup + + ImGuiPopupData() { memset(this, 0, sizeof(*this)); OpenFrameCount = -1; } +}; + +enum ImGuiNextWindowDataFlags_ +{ + ImGuiNextWindowDataFlags_None = 0, + ImGuiNextWindowDataFlags_HasPos = 1 << 0, + ImGuiNextWindowDataFlags_HasSize = 1 << 1, + ImGuiNextWindowDataFlags_HasContentSize = 1 << 2, + ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3, + ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4, + ImGuiNextWindowDataFlags_HasFocus = 1 << 5, + ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6, + ImGuiNextWindowDataFlags_HasScroll = 1 << 7 +}; + +// Storage for SetNexWindow** functions +struct ImGuiNextWindowData +{ + ImGuiNextWindowDataFlags Flags; + ImGuiCond PosCond; + ImGuiCond SizeCond; + ImGuiCond CollapsedCond; + ImVec2 PosVal; + ImVec2 PosPivotVal; + ImVec2 SizeVal; + ImVec2 ContentSizeVal; + ImVec2 ScrollVal; + bool CollapsedVal; + ImRect SizeConstraintRect; + ImGuiSizeCallback SizeCallback; + void* SizeCallbackUserData; + float BgAlphaVal; // Override background alpha + ImVec2 MenuBarOffsetMinVal; // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?) + + ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); } + inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; } +}; + +enum ImGuiNextItemDataFlags_ +{ + ImGuiNextItemDataFlags_None = 0, + ImGuiNextItemDataFlags_HasWidth = 1 << 0, + ImGuiNextItemDataFlags_HasOpen = 1 << 1 +}; + +struct ImGuiNextItemData +{ + ImGuiNextItemDataFlags Flags; + float Width; // Set by SetNextItemWidth() + ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging) + ImGuiCond OpenCond; + bool OpenVal; // Set by SetNextItemOpen() + + ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } + inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()! +}; + +// Status storage for the last submitted item +struct ImGuiLastItemData +{ + ImGuiID ID; + ImGuiItemFlags InFlags; // See ImGuiItemFlags_ + ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_ + ImRect Rect; // Full rectangle + ImRect NavRect; // Navigation scoring rectangle (not displayed) + ImRect DisplayRect; // Display rectangle (only if ImGuiItemStatusFlags_HasDisplayRect is set) + + ImGuiLastItemData() { memset(this, 0, sizeof(*this)); } +}; + +struct IMGUI_API ImGuiStackSizes +{ + short SizeOfIDStack; + short SizeOfColorStack; + short SizeOfStyleVarStack; + short SizeOfFontStack; + short SizeOfFocusScopeStack; + short SizeOfGroupStack; + short SizeOfItemFlagsStack; + short SizeOfBeginPopupStack; + short SizeOfDisabledStack; + + ImGuiStackSizes() { memset(this, 0, sizeof(*this)); } + void SetToCurrentState(); + void CompareWithCurrentState(); +}; + +// Data saved for each window pushed into the stack +struct ImGuiWindowStackData +{ + ImGuiWindow* Window; + ImGuiLastItemData ParentLastItemDataBackup; + ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting +}; + +struct ImGuiShrinkWidthItem +{ + int Index; + float Width; +}; + +struct ImGuiPtrOrIndex +{ + void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool. + int Index; // Usually index in a main pool. + + ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; } + ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Inputs support +//----------------------------------------------------------------------------- + +typedef ImBitArray ImBitArrayForNamedKeys; + +enum ImGuiKeyPrivate_ +{ + ImGuiKey_LegacyNativeKey_BEGIN = 0, + ImGuiKey_LegacyNativeKey_END = 512, + ImGuiKey_Gamepad_BEGIN = ImGuiKey_GamepadStart, + ImGuiKey_Gamepad_END = ImGuiKey_GamepadRStickRight + 1 +}; + +enum ImGuiInputEventType +{ + ImGuiInputEventType_None = 0, + ImGuiInputEventType_MousePos, + ImGuiInputEventType_MouseWheel, + ImGuiInputEventType_MouseButton, + ImGuiInputEventType_Key, + ImGuiInputEventType_Text, + ImGuiInputEventType_Focus, + ImGuiInputEventType_COUNT +}; + +enum ImGuiInputSource +{ + ImGuiInputSource_None = 0, + ImGuiInputSource_Mouse, + ImGuiInputSource_Keyboard, + ImGuiInputSource_Gamepad, + ImGuiInputSource_Clipboard, // Currently only used by InputText() + ImGuiInputSource_Nav, // Stored in g.ActiveIdSource only + ImGuiInputSource_COUNT +}; + +// FIXME: Structures in the union below need to be declared as anonymous unions appears to be an extension? +// Using ImVec2() would fail on Clang 'union member 'MousePos' has a non-trivial default constructor' +struct ImGuiInputEventMousePos { float PosX, PosY; }; +struct ImGuiInputEventMouseWheel { float WheelX, WheelY; }; +struct ImGuiInputEventMouseButton { int Button; bool Down; }; +struct ImGuiInputEventKey { ImGuiKey Key; bool Down; float AnalogValue; }; +struct ImGuiInputEventText { unsigned int Char; }; +struct ImGuiInputEventAppFocused { bool Focused; }; + +struct ImGuiInputEvent +{ + ImGuiInputEventType Type; + ImGuiInputSource Source; + union + { + ImGuiInputEventMousePos MousePos; // if Type == ImGuiInputEventType_MousePos + ImGuiInputEventMouseWheel MouseWheel; // if Type == ImGuiInputEventType_MouseWheel + ImGuiInputEventMouseButton MouseButton; // if Type == ImGuiInputEventType_MouseButton + ImGuiInputEventKey Key; // if Type == ImGuiInputEventType_Key + ImGuiInputEventText Text; // if Type == ImGuiInputEventType_Text + ImGuiInputEventAppFocused AppFocused; // if Type == ImGuiInputEventType_Focus + }; + bool AddedByTestEngine; + + ImGuiInputEvent() { memset(this, 0, sizeof(*this)); } +}; + +// FIXME-NAV: Clarify/expose various repeat delay/rate +enum ImGuiNavReadMode +{ + ImGuiNavReadMode_Down, + ImGuiNavReadMode_Pressed, + ImGuiNavReadMode_Released, + ImGuiNavReadMode_Repeat, + ImGuiNavReadMode_RepeatSlow, + ImGuiNavReadMode_RepeatFast +}; + +//----------------------------------------------------------------------------- +// [SECTION] Clipper support +//----------------------------------------------------------------------------- + +struct ImGuiListClipperRange +{ + int Min; + int Max; + bool PosToIndexConvert; // Begin/End are absolute position (will be converted to indices later) + ImS8 PosToIndexOffsetMin; // Add to Min after converting to indices + ImS8 PosToIndexOffsetMax; // Add to Min after converting to indices + + static ImGuiListClipperRange FromIndices(int min, int max) { ImGuiListClipperRange r = { min, max, false, 0, 0 }; return r; } + static ImGuiListClipperRange FromPositions(float y1, float y2, int off_min, int off_max) { ImGuiListClipperRange r = { (int)y1, (int)y2, true, (ImS8)off_min, (ImS8)off_max }; return r; } +}; + +// Temporary clipper data, buffers shared/reused between instances +struct ImGuiListClipperData +{ + ImGuiListClipper* ListClipper; + float LossynessOffset; + int StepNo; + int ItemsFrozen; + ImVector Ranges; + + ImGuiListClipperData() { memset(this, 0, sizeof(*this)); } + void Reset(ImGuiListClipper* clipper) { ListClipper = clipper; StepNo = ItemsFrozen = 0; Ranges.resize(0); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Navigation support +//----------------------------------------------------------------------------- + +enum ImGuiActivateFlags_ +{ + ImGuiActivateFlags_None = 0, + ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default if keyboard is available. + ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default if keyboard is not available. + ImGuiActivateFlags_TryToPreserveState = 1 << 2 // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection) +}; + +// Early work-in-progress API for ScrollToItem() +enum ImGuiScrollFlags_ +{ + ImGuiScrollFlags_None = 0, + ImGuiScrollFlags_KeepVisibleEdgeX = 1 << 0, // If item is not visible: scroll as little as possible on X axis to bring item back into view [default for X axis] + ImGuiScrollFlags_KeepVisibleEdgeY = 1 << 1, // If item is not visible: scroll as little as possible on Y axis to bring item back into view [default for Y axis for windows that are already visible] + ImGuiScrollFlags_KeepVisibleCenterX = 1 << 2, // If item is not visible: scroll to make the item centered on X axis [rarely used] + ImGuiScrollFlags_KeepVisibleCenterY = 1 << 3, // If item is not visible: scroll to make the item centered on Y axis + ImGuiScrollFlags_AlwaysCenterX = 1 << 4, // Always center the result item on X axis [rarely used] + ImGuiScrollFlags_AlwaysCenterY = 1 << 5, // Always center the result item on Y axis [default for Y axis for appearing window) + ImGuiScrollFlags_NoScrollParent = 1 << 6, // Disable forwarding scrolling to parent window if required to keep item/rect visible (only scroll window the function was applied to). + ImGuiScrollFlags_MaskX_ = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX, + ImGuiScrollFlags_MaskY_ = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY +}; + +enum ImGuiNavHighlightFlags_ +{ + ImGuiNavHighlightFlags_None = 0, + ImGuiNavHighlightFlags_TypeDefault = 1 << 0, + ImGuiNavHighlightFlags_TypeThin = 1 << 1, + ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. + ImGuiNavHighlightFlags_NoRounding = 1 << 3 +}; + +enum ImGuiNavDirSourceFlags_ +{ + ImGuiNavDirSourceFlags_None = 0, + ImGuiNavDirSourceFlags_RawKeyboard = 1 << 0, // Raw keyboard (not pulled from nav), facilitate use of some functions before we can unify nav and keys + ImGuiNavDirSourceFlags_Keyboard = 1 << 1, + ImGuiNavDirSourceFlags_PadDPad = 1 << 2, + ImGuiNavDirSourceFlags_PadLStick = 1 << 3 +}; + +enum ImGuiNavMoveFlags_ +{ + ImGuiNavMoveFlags_None = 0, + ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side + ImGuiNavMoveFlags_LoopY = 1 << 1, + ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left) + ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful but provided for completeness + ImGuiNavMoveFlags_AllowCurrentNavId = 1 << 4, // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place) + ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown) + ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary + ImGuiNavMoveFlags_Forwarded = 1 << 7, + ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result + ImGuiNavMoveFlags_FocusApi = 1 << 9, + ImGuiNavMoveFlags_Tabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight + ImGuiNavMoveFlags_Activate = 1 << 11, + ImGuiNavMoveFlags_DontSetNavHighlight = 1 << 12 // Do not alter the visible state of keyboard vs mouse nav highlight +}; + +enum ImGuiNavLayer +{ + ImGuiNavLayer_Main = 0, // Main scrolling layer + ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt/ImGuiNavInput_Menu) + ImGuiNavLayer_COUNT +}; + +struct ImGuiNavItemData +{ + ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window) + ImGuiID ID; // Init,Move // Best candidate item ID + ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID + ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space + ImGuiItemFlags InFlags; // ????,Move // Best candidate item flags + float DistBox; // Move // Best candidate box distance to current NavId + float DistCenter; // Move // Best candidate center distance to current NavId + float DistAxial; // Move // Best candidate axial distance to current NavId + + ImGuiNavItemData() { Clear(); } + void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; DistBox = DistCenter = DistAxial = FLT_MAX; } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Columns support +//----------------------------------------------------------------------------- + +// Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays! +enum ImGuiOldColumnFlags_ +{ + ImGuiOldColumnFlags_None = 0, + ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers + ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers + ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns + ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window + ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4 // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. + + // Obsolete names (will be removed) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + , ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, + ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, + ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, + ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, + ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, + ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize +#endif +}; + +struct ImGuiOldColumnData +{ + float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right) + float OffsetNormBeforeResize; + ImGuiOldColumnFlags Flags; // Not exposed + ImRect ClipRect; + + ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); } +}; + +struct ImGuiOldColumns +{ + ImGuiID ID; + ImGuiOldColumnFlags Flags; + bool IsFirstFrame; + bool IsBeingResized; + int Current; + int Count; + float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x + float LineMinY, LineMaxY; + float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns() + float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns() + ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns() + ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground() + ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns() + ImVector Columns; + ImDrawListSplitter Splitter; + + ImGuiOldColumns() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Multi-select support +//----------------------------------------------------------------------------- + +#ifdef IMGUI_HAS_MULTI_SELECT +// +#endif // #ifdef IMGUI_HAS_MULTI_SELECT + +//----------------------------------------------------------------------------- +// [SECTION] Docking support +//----------------------------------------------------------------------------- + +#ifdef IMGUI_HAS_DOCK +// +#endif // #ifdef IMGUI_HAS_DOCK + +//----------------------------------------------------------------------------- +// [SECTION] Viewport support +//----------------------------------------------------------------------------- + +// ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!) +// Every instance of ImGuiViewport is in fact a ImGuiViewportP. +struct ImGuiViewportP : public ImGuiViewport +{ + int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used + ImDrawList* DrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays. + ImDrawData DrawDataP; + ImDrawDataBuilder DrawDataBuilder; + + ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!) + ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height). + ImVec2 BuildWorkOffsetMin; // Work Area: Offset being built during current frame. Generally >= 0.0f. + ImVec2 BuildWorkOffsetMax; // Work Area: Offset being built during current frame. Generally <= 0.0f. + + ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; } + ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); } + + // Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect) + ImVec2 CalcWorkRectPos(const ImVec2& off_min) const { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); } + ImVec2 CalcWorkRectSize(const ImVec2& off_min, const ImVec2& off_max) const { return ImVec2(ImMax(0.0f, Size.x - off_min.x + off_max.x), ImMax(0.0f, Size.y - off_min.y + off_max.y)); } + void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkOffsetMin); WorkSize = CalcWorkRectSize(WorkOffsetMin, WorkOffsetMax); } // Update public fields + + // Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry) + ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } + ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); } + ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkOffsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkOffsetMin, BuildWorkOffsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Settings support +//----------------------------------------------------------------------------- + +// Windows data saved in imgui.ini file +// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily. +// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure) +struct ImGuiWindowSettings +{ + ImGuiID ID; + ImVec2ih Pos; + ImVec2ih Size; + bool Collapsed; + bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) + + ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); } + char* GetName() { return (char*)(this + 1); } +}; + +struct ImGuiSettingsHandler +{ + const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']' + ImGuiID TypeHash; // == ImHashStr(TypeName) + void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data + void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order) + void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]" + void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry + void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order) + void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf' + void* UserData; + + ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Metrics, Debug Tools +//----------------------------------------------------------------------------- + +struct ImGuiMetricsConfig +{ + bool ShowStackTool; + bool ShowWindowsRects; + bool ShowWindowsBeginOrder; + bool ShowTablesRects; + bool ShowDrawCmdMesh; + bool ShowDrawCmdBoundingBoxes; + int ShowWindowsRectsType; + int ShowTablesRectsType; + + ImGuiMetricsConfig() + { + ShowStackTool = false; + ShowWindowsRects = false; + ShowWindowsBeginOrder = false; + ShowTablesRects = false; + ShowDrawCmdMesh = true; + ShowDrawCmdBoundingBoxes = true; + ShowWindowsRectsType = -1; + ShowTablesRectsType = -1; + } +}; + +struct ImGuiStackLevelInfo +{ + ImGuiID ID; + ImS8 QueryFrameCount; // >= 1: Query in progress + bool QuerySuccess; // Obtained result from DebugHookIdInfo() + ImGuiDataType DataType : 8; + char Desc[57]; // Arbitrarily sized buffer to hold a result (FIXME: could replace Results[] with a chunk stream?) FIXME: Now that we added CTRL+C this should be fixed. + + ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); } +}; + +// State for Stack tool queries +struct ImGuiStackTool +{ + int LastActiveFrame; + int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level + ImGuiID QueryId; // ID to query details for + ImVector Results; + bool CopyToClipboardOnCtrlC; + float CopyToClipboardLastTime; + + ImGuiStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Generic context hooks +//----------------------------------------------------------------------------- + +typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook); +enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ }; + +struct ImGuiContextHook +{ + ImGuiID HookId; // A unique ID assigned by AddContextHook() + ImGuiContextHookType Type; + ImGuiID Owner; + ImGuiContextHookCallback Callback; + void* UserData; + + ImGuiContextHook() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiContext (main Dear ImGui context) +//----------------------------------------------------------------------------- + +struct ImGuiContext +{ + bool Initialized; + bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it. + ImGuiIO IO; + ImVector InputEventsQueue; // Input events which will be tricked/written into IO structure. + ImVector InputEventsTrail; // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail. + ImGuiStyle Style; + ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back() + float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window. + float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height. + ImDrawListSharedData DrawListSharedData; + double Time; + int FrameCount; + int FrameCountEnded; + int FrameCountRendered; + bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame() + bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed + bool WithinEndChild; // Set within EndChild() + bool GcCompactAll; // Request full GC + bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log() + void* TestEngine; // Test engine user data + + // Windows state + ImVector Windows; // Windows, sorted in display order, back to front + ImVector WindowsFocusOrder; // Root windows, sorted in focus order, back to front. + ImVector WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child + ImVector CurrentWindowStack; + ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow* + int WindowsActiveCount; // Number of unique windows submitted by frame + ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING) + ImGuiWindow* CurrentWindow; // Window being drawn into + ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs. + ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set. + ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow. + ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window. + ImVec2 WheelingWindowRefMousePos; + float WheelingWindowTimer; + + // Item/widgets state and tracking information + ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line] + ImGuiID HoveredId; // Hovered widget, filled during the frame + ImGuiID HoveredIdPreviousFrame; + bool HoveredIdAllowOverlap; + bool HoveredIdUsingMouseWheel; // Hovered widget will use mouse wheel. Blocks scrolling the underlying window. + bool HoveredIdPreviousFrameUsingMouseWheel; + bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0. + float HoveredIdTimer; // Measure contiguous hovering time + float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active + ImGuiID ActiveId; // Active widget + ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame) + float ActiveIdTimer; + bool ActiveIdIsJustActivated; // Set at the time of activation for one frame + bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always) + bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused. + bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch. + bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state. + bool ActiveIdHasBeenEditedThisFrame; + ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) + ImGuiWindow* ActiveIdWindow; + ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard) + int ActiveIdMouseButton; + ImGuiID ActiveIdPreviousFrame; + bool ActiveIdPreviousFrameIsAlive; + bool ActiveIdPreviousFrameHasBeenEditedBefore; + ImGuiWindow* ActiveIdPreviousFrameWindow; + ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation. + float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation. + + // Input Ownership + bool ActiveIdUsingMouseWheel; // Active widget will want to read mouse wheel. Blocks scrolling the underlying window. + ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it) + ImU32 ActiveIdUsingNavInputMask; // Active widget will want to read those nav inputs. + ImBitArrayForNamedKeys ActiveIdUsingKeyInputMask; // Active widget will want to read those key inputs. When we grow the ImGuiKey enum we'll need to either to order the enum to make useful keys come first, either redesign this into e.g. a small array. + + // Next window/item data + ImGuiItemFlags CurrentItemFlags; // == g.ItemFlagsStack.back() + ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions + ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd) + ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions + + // Shared stacks + ImVector ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() + ImVector StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() + ImVector FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() + ImVector FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - not inherited by Begin(), unless child window + ImVectorItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() + ImVectorGroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() + ImVectorOpenPopupStack; // Which popups are open (persistent) + ImVectorBeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) + int BeginMenuCount; + + // Viewports + ImVector Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData. + + // Gamepad/keyboard Navigation + ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow' + ImGuiID NavId; // Focused item for navigation + ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set) + ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem() + ImGuiID NavActivateDownId; // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0 + ImGuiID NavActivatePressedId; // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0 + ImGuiID NavActivateInputId; // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0; ImGuiActivateFlags_PreferInput will be set and NavActivateId will be 0. + ImGuiActivateFlags NavActivateFlags; + ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest). + ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest). + ImGuiModFlags NavJustMovedToKeyMods; + ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame. + ImGuiActivateFlags NavNextActivateFlags; + ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard. + ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later. + bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid + bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default) + bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover) + bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again. + + // Navigation: Init & Move Requests + bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd() + bool NavInitRequest; // Init request for appearing window to select first item + bool NavInitRequestFromMove; + ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called) + ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window) + bool NavMoveSubmitted; // Move request submitted, will process result on next NewFrame() + bool NavMoveScoringItems; // Move request submitted, still scoring incoming items + bool NavMoveForwardToNextFrame; + ImGuiNavMoveFlags NavMoveFlags; + ImGuiScrollFlags NavMoveScrollFlags; + ImGuiModFlags NavMoveKeyMods; + ImGuiDir NavMoveDir; // Direction of the move request (left/right/up/down) + ImGuiDir NavMoveDirForDebug; + ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename? + ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring. + ImRect NavScoringNoClipRect; // Some nav operations (such as PageUp/PageDown) enforce a region which clipper will attempt to always keep submitted + int NavScoringDebugCount; // Metrics for debugging + int NavTabbingDir; // Generally -1 or +1, 0 when tabbing without a nav id + int NavTabbingCounter; // >0 when counting items for tabbing + ImGuiNavItemData NavMoveResultLocal; // Best move request candidate within NavWindow + ImGuiNavItemData NavMoveResultLocalVisible; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag) + ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag) + ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy + + // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize) + ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most! + ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it. + ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents + float NavWindowingTimer; + float NavWindowingHighlightAlpha; + bool NavWindowingToggleLayer; + + // Render + float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list) + ImGuiMouseCursor MouseCursor; + + // Drag and Drop + bool DragDropActive; + bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source. + bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target. + ImGuiDragDropFlags DragDropSourceFlags; + int DragDropSourceFrameCount; + int DragDropMouseButton; + ImGuiPayload DragDropPayload; + ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping) + ImGuiID DragDropTargetId; + ImGuiDragDropFlags DragDropAcceptFlags; + float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface) + ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload) + ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets) + int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source + ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press. + ImVector DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size + unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads + + // Clipper + int ClipperTempDataStacked; + ImVector ClipperTempData; + + // Tables + ImGuiTable* CurrentTable; + int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size) + ImVector TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting) + ImPool Tables; // Persistent table data + ImVector TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC) + ImVector DrawChannelsTempMergeBuffer; + + // Tab bars + ImGuiTabBar* CurrentTabBar; + ImPool TabBars; + ImVector CurrentTabBarStack; + ImVector ShrinkWidthBuffer; + + // Widget state + ImVec2 MouseLastValidPos; + ImGuiInputTextState InputTextState; + ImFont InputTextPasswordFont; + ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc. + ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets + float ColorEditLastHue; // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips + float ColorEditLastSat; // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips + ImU32 ColorEditLastColor; // RGB value with alpha set to 0. + ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker. + ImGuiComboPreviewData ComboPreviewData; + float SliderCurrentAccum; // Accumulated slider delta when using navigation controls. + bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it? + bool DragCurrentAccumDirty; + float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings + float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio + float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? + float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled() + short DisabledStackSize; + short TooltipOverrideCount; + float TooltipSlowDelay; // Time before slow tooltips appears (FIXME: This is temporary until we merge in tooltip timer+priority work) + ImVector ClipboardHandlerData; // If no custom clipboard handler is defined + ImVector MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once + + // Platform support + ImGuiPlatformImeData PlatformImeData; // Data updated by current frame + ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data (when changing we will call io.SetPlatformImeDataFn + char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point + + // Settings + bool SettingsLoaded; + float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero + ImGuiTextBuffer SettingsIniData; // In memory .ini settings + ImVector SettingsHandlers; // List of .ini settings handlers + ImChunkStream SettingsWindows; // ImGuiWindow .ini settings entries + ImChunkStream SettingsTables; // ImGuiTable .ini settings entries + ImVector Hooks; // Hooks for extensions (e.g. test engine) + ImGuiID HookIdNext; // Next available HookId + + // Capture/Logging + bool LogEnabled; // Currently capturing + ImGuiLogType LogType; // Capture target + ImFileHandle LogFile; // If != NULL log to stdout/ file + ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators. + const char* LogNextPrefix; + const char* LogNextSuffix; + float LogLinePosY; + bool LogLineFirstItem; + int LogDepthRef; + int LogDepthToExpand; + int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. + + // Debug Tools + bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker()) + ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID + ImGuiMetricsConfig DebugMetricsConfig; + ImGuiStackTool DebugStackTool; + + // Misc + float FramerateSecPerFrame[120]; // Calculate estimate of framerate for user over the last 2 seconds. + int FramerateSecPerFrameIdx; + int FramerateSecPerFrameCount; + float FramerateSecPerFrameAccum; + int WantCaptureMouseNextFrame; // Explicit capture via CaptureKeyboardFromApp()/CaptureMouseFromApp() sets those flags + int WantCaptureKeyboardNextFrame; + int WantTextInputNextFrame; + char TempBuffer[1024 * 3 + 1]; // Temporary text buffer + + ImGuiContext(ImFontAtlas* shared_font_atlas) + { + Initialized = false; + FontAtlasOwnedByContext = shared_font_atlas ? false : true; + Font = NULL; + FontSize = FontBaseSize = 0.0f; + IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)(); + Time = 0.0f; + FrameCount = 0; + FrameCountEnded = FrameCountRendered = -1; + WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false; + GcCompactAll = false; + TestEngineHookItems = false; + TestEngine = NULL; + + WindowsActiveCount = 0; + CurrentWindow = NULL; + HoveredWindow = NULL; + HoveredWindowUnderMovingWindow = NULL; + MovingWindow = NULL; + WheelingWindow = NULL; + WheelingWindowTimer = 0.0f; + + DebugHookIdInfo = 0; + HoveredId = HoveredIdPreviousFrame = 0; + HoveredIdAllowOverlap = false; + HoveredIdUsingMouseWheel = HoveredIdPreviousFrameUsingMouseWheel = false; + HoveredIdDisabled = false; + HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f; + ActiveId = 0; + ActiveIdIsAlive = 0; + ActiveIdTimer = 0.0f; + ActiveIdIsJustActivated = false; + ActiveIdAllowOverlap = false; + ActiveIdNoClearOnFocusLoss = false; + ActiveIdHasBeenPressedBefore = false; + ActiveIdHasBeenEditedBefore = false; + ActiveIdHasBeenEditedThisFrame = false; + ActiveIdClickOffset = ImVec2(-1, -1); + ActiveIdWindow = NULL; + ActiveIdSource = ImGuiInputSource_None; + ActiveIdMouseButton = -1; + ActiveIdPreviousFrame = 0; + ActiveIdPreviousFrameIsAlive = false; + ActiveIdPreviousFrameHasBeenEditedBefore = false; + ActiveIdPreviousFrameWindow = NULL; + LastActiveId = 0; + LastActiveIdTimer = 0.0f; + + ActiveIdUsingMouseWheel = false; + ActiveIdUsingNavDirMask = 0x00; + ActiveIdUsingNavInputMask = 0x00; + ActiveIdUsingKeyInputMask.ClearAllBits(); + + CurrentItemFlags = ImGuiItemFlags_None; + BeginMenuCount = 0; + + NavWindow = NULL; + NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavActivateInputId = 0; + NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0; + NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None; + NavJustMovedToKeyMods = ImGuiModFlags_None; + NavInputSource = ImGuiInputSource_None; + NavLayer = ImGuiNavLayer_Main; + NavIdIsAlive = false; + NavMousePosDirty = false; + NavDisableHighlight = true; + NavDisableMouseHover = false; + NavAnyRequest = false; + NavInitRequest = false; + NavInitRequestFromMove = false; + NavInitResultId = 0; + NavMoveSubmitted = false; + NavMoveScoringItems = false; + NavMoveForwardToNextFrame = false; + NavMoveFlags = ImGuiNavMoveFlags_None; + NavMoveScrollFlags = ImGuiScrollFlags_None; + NavMoveKeyMods = ImGuiModFlags_None; + NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None; + NavScoringDebugCount = 0; + NavTabbingDir = 0; + NavTabbingCounter = 0; + + NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL; + NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f; + NavWindowingToggleLayer = false; + + DimBgRatio = 0.0f; + MouseCursor = ImGuiMouseCursor_Arrow; + + DragDropActive = DragDropWithinSource = DragDropWithinTarget = false; + DragDropSourceFlags = ImGuiDragDropFlags_None; + DragDropSourceFrameCount = -1; + DragDropMouseButton = -1; + DragDropTargetId = 0; + DragDropAcceptFlags = ImGuiDragDropFlags_None; + DragDropAcceptIdCurrRectSurface = 0.0f; + DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0; + DragDropAcceptFrameCount = -1; + DragDropHoldJustPressedId = 0; + memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal)); + + ClipperTempDataStacked = 0; + + CurrentTable = NULL; + TablesTempDataStacked = 0; + CurrentTabBar = NULL; + + TempInputId = 0; + ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_; + ColorEditLastHue = ColorEditLastSat = 0.0f; + ColorEditLastColor = 0; + SliderCurrentAccum = 0.0f; + SliderCurrentAccumDirty = false; + DragCurrentAccumDirty = false; + DragCurrentAccum = 0.0f; + DragSpeedDefaultRatio = 1.0f / 100.0f; + DisabledAlphaBackup = 0.0f; + DisabledStackSize = 0; + ScrollbarClickDeltaToGrabCenter = 0.0f; + TooltipOverrideCount = 0; + TooltipSlowDelay = 0.50f; + + PlatformImeData.InputPos = ImVec2(0.0f, 0.0f); + PlatformImeDataPrev.InputPos = ImVec2(-1.0f, -1.0f); // Different to ensure initial submission + PlatformLocaleDecimalPoint = '.'; + + SettingsLoaded = false; + SettingsDirtyTimer = 0.0f; + HookIdNext = 0; + + LogEnabled = false; + LogType = ImGuiLogType_None; + LogNextPrefix = LogNextSuffix = NULL; + LogFile = NULL; + LogLinePosY = FLT_MAX; + LogLineFirstItem = false; + LogDepthRef = 0; + LogDepthToExpand = LogDepthToExpandDefault = 2; + + DebugItemPickerActive = false; + DebugItemPickerBreakId = 0; + + memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); + FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0; + FramerateSecPerFrameAccum = 0.0f; + WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; + memset(TempBuffer, 0, sizeof(TempBuffer)); + } +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiWindowTempData, ImGuiWindow +//----------------------------------------------------------------------------- + +// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow. +// (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..) +// (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin) +struct IMGUI_API ImGuiWindowTempData +{ + // Layout + ImVec2 CursorPos; // Current emitting position, in absolute coordinates. + ImVec2 CursorPosPrevLine; + ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding. + ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame. + ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame. + ImVec2 CurrLineSize; + ImVec2 PrevLineSize; + float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added). + float PrevLineTextBaseOffset; + bool IsSameLine; + ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.) + ImVec1 ColumnsOffset; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API. + ImVec1 GroupOffset; + ImVec2 CursorStartPosLossyness;// Record the loss of precision of CursorStartPos due to really large scrolling amount. This is used by clipper to compensentate and fix the most common use case of large scroll area. + + // Keyboard/Gamepad navigation + ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1) + short NavLayersActiveMask; // Which layers have been written to (result from previous frame) + short NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame) + ImGuiID NavFocusScopeIdCurrent; // Current focus scope ID while appending + bool NavHideHighlightOneFrame; + bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f) + + // Miscellaneous + bool MenuBarAppending; // FIXME: Remove this + ImVec2 MenuBarOffset; // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs. + ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement + int TreeDepth; // Current tree depth. + ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary. + ImVector ChildWindows; + ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state) + ImGuiOldColumns* CurrentColumns; // Current columns set + int CurrentTableIdx; // Current table index (into g.Tables) + ImGuiLayoutType LayoutType; + ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin() + + // Local parameters stacks + // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings. + float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window). + float TextWrapPos; // Current text wrap pos. + ImVector ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth) + ImVector TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos) +}; + +// Storage for one window +struct IMGUI_API ImGuiWindow +{ + char* Name; // Window name, owned by the window. + ImGuiID ID; // == ImHashStr(Name) + ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ + ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded. + ImVec2 Pos; // Position (always rounded-up to nearest pixel) + ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) + ImVec2 SizeFull; // Size when non collapsed + ImVec2 ContentSize; // Size of contents/scrollable client area (calculated from the extents reach of the cursor) from previous frame. Does not include window decoration or window padding. + ImVec2 ContentSizeIdeal; + ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize(). + ImVec2 WindowPadding; // Window padding at the time of Begin(). + float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc. + float WindowBorderSize; // Window border size at the time of Begin(). + int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)! + ImGuiID MoveId; // == window->GetID("#MOVE") + ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window) + ImVec2 Scroll; + ImVec2 ScrollMax; + ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change) + ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered + ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold + ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar. + bool ScrollbarX, ScrollbarY; // Are scrollbars visible? + bool Active; // Set to true on Begin(), unless Collapsed + bool WasActive; + bool WriteAccessed; // Set to true when any widget access the current window + bool Collapsed; // Set when collapsing window to become only title-bar + bool WantCollapseToggle; + bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed) + bool Appearing; // Set during the frame where the window is appearing (or re-appearing) + bool Hidden; // Do not display (== HiddenFrames*** > 0) + bool IsFallbackWindow; // Set on the "Debug##Default" window. + bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked() + bool HasCloseButton; // Set when the window has a close button (p_open != NULL) + signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) + short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) + short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0. + short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues. + short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused. + ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) + ImS8 AutoFitFramesX, AutoFitFramesY; + ImS8 AutoFitChildAxises; + bool AutoFitOnlyGrows; + ImGuiDir AutoPosLastDirection; + ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames + ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size + ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only + ImS8 DisableInputsFrames; // Disable window interactions for N frames + ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use. + ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use. + ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use. + ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size) + ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0, 0) when positioning from top-left corner; ImVec2(0.5f, 0.5f) for centering; ImVec2(1, 1) for bottom right. + + ImVector IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack. (In theory this should be in the TempData structure) + ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name. + + // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer. + // The main 'OuterRect', omitted as a field, is window->Rect(). + ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window. + ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar) + ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect. + ImRect WorkRect; // Initially covers the whole scrolling region. Reduced by containers e.g columns/tables when active. Shrunk by WindowPadding*1.0f on each side. This is meant to replace ContentRegionRect over time (from 1.71+ onward). + ImRect ParentWorkRect; // Backup of WorkRect before entering a container such as columns/tables. Used by e.g. SpanAllColumns functions to easily access. Stacked containers are responsible for maintaining this. // FIXME-WORKRECT: Could be a stack? + ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back(). + ImRect ContentRegionRect; // FIXME: This is currently confusing/misleading. It is essentially WorkRect but not handling of scrolling. We currently rely on it as right/bottom aligned sizing operation need some size to rely on. + ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window. + ImVec2ih HitTestHoleOffset; + + int LastFrameActive; // Last frame number the window was Active. + float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there) + float ItemWidthDefault; + ImGuiStorage StateStorage; + ImVector ColumnsStorage; + float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale() + int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back) + + ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer) + ImDrawList DrawListInst; + ImGuiWindow* ParentWindow; // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL. + ImGuiWindow* ParentWindowInBeginStack; + ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes. + ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child. + ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. + ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag. + + ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.) + ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) + ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space + + int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy + int MemoryDrawListVtxCapacity; + bool MemoryCompacted; // Set when window extraneous data have been garbage collected + +public: + ImGuiWindow(ImGuiContext* context, const char* name); + ~ImGuiWindow(); + + ImGuiID GetID(const char* str, const char* str_end = NULL); + ImGuiID GetID(const void* ptr); + ImGuiID GetID(int n); + ImGuiID GetIDFromRectangle(const ImRect& r_abs); + + // We don't use g.FontSize because the window may be != g.CurrentWidow. + ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } + float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; } + float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; } + ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); } + float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; } + ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Tab bar, Tab item support +//----------------------------------------------------------------------------- + +// Extend ImGuiTabBarFlags_ +enum ImGuiTabBarFlagsPrivate_ +{ + ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around] + ImGuiTabBarFlags_IsFocused = 1 << 21, + ImGuiTabBarFlags_SaveSettings = 1 << 22 // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs +}; + +// Extend ImGuiTabItemFlags_ +enum ImGuiTabItemFlagsPrivate_ +{ + ImGuiTabItemFlags_SectionMask_ = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing, + ImGuiTabItemFlags_NoCloseButton = 1 << 20, // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout) + ImGuiTabItemFlags_Button = 1 << 21 // Used by TabItemButton, change the tab item behavior to mimic a button +}; + +// Storage for one active tab item (sizeof() 40 bytes) +struct ImGuiTabItem +{ + ImGuiID ID; + ImGuiTabItemFlags Flags; + int LastFrameVisible; + int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance + float Offset; // Position relative to beginning of tab + float Width; // Width currently displayed + float ContentWidth; // Width of label, stored during BeginTabItem() call + ImS32 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames + ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable + ImS16 IndexDuringLayout; // Index only used during TabBarLayout() + bool WantClose; // Marked as closed by SetTabItemClosed() + + ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; } +}; + +// Storage for a tab bar (sizeof() 152 bytes) +struct IMGUI_API ImGuiTabBar +{ + ImVector Tabs; + ImGuiTabBarFlags Flags; + ImGuiID ID; // Zero for tab-bars used by docking + ImGuiID SelectedTabId; // Selected tab/window + ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation + ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview) + int CurrFrameVisible; + int PrevFrameVisible; + ImRect BarRect; + float CurrTabsContentsHeight; + float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar + float WidthAllTabs; // Actual width of all tabs (locked during layout) + float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped + float ScrollingAnim; + float ScrollingTarget; + float ScrollingTargetDistToVisibility; + float ScrollingSpeed; + float ScrollingRectMinX; + float ScrollingRectMaxX; + ImGuiID ReorderRequestTabId; + ImS16 ReorderRequestOffset; + ImS8 BeginCount; + bool WantLayout; + bool VisibleTabWasSubmitted; + bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame + ImS16 TabsActiveCount; // Number of tabs submitted this frame. + ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem() + float ItemSpacingY; + ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar() + ImVec2 BackupCursorPos; + ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer. + + ImGuiTabBar(); + int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); } + const char* GetTabName(const ImGuiTabItem* tab) const + { + IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size); + return TabsNames.Buf.Data + tab->NameOffset; + } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Table support +//----------------------------------------------------------------------------- + +#define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color. +#define IMGUI_TABLE_MAX_COLUMNS 64 // sizeof(ImU64) * 8. This is solely because we frequently encode columns set in a ImU64. +#define IMGUI_TABLE_MAX_DRAW_CHANNELS (4 + 64 * 2) // See TableSetupDrawChannels() + +// Our current column maximum is 64 but we may raise that in the future. +typedef ImS8 ImGuiTableColumnIdx; +typedef ImU8 ImGuiTableDrawChannelIdx; + +// [Internal] sizeof() ~ 104 +// We use the terminology "Enabled" to refer to a column that is not Hidden by user/api. +// We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping. +// This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped". +struct ImGuiTableColumn +{ + ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_ + float WidthGiven; // Final/actual width visible == (MaxX - MinX), locked in TableUpdateLayout(). May be > WidthRequest to honor minimum width, may be < WidthRequest to honor shrinking columns down in tight space. + float MinX; // Absolute positions + float MaxX; + float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout() + float WidthAuto; // Automatic width + float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially. + float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_). + ImRect ClipRect; // Clipping rectangle for the column + ImGuiID UserID; // Optional, value passed to TableSetupColumn() + float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column + float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2) + float ItemWidth; // Current item width for the column, preserved across rows + float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width. + float ContentMaxXUnfrozen; + float ContentMaxXHeadersUsed; // Contents maximum position for headers rows (regardless of freezing). TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls + float ContentMaxXHeadersIdeal; + ImS16 NameOffset; // Offset into parent ColumnsNames[] + ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users) + ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder) + ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column + ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column + ImGuiTableColumnIdx SortOrder; // Index of this column within sort specs, -1 if not sorting on this column, 0 for single-sort, may be >0 on multi-sort + ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[] + ImGuiTableDrawChannelIdx DrawChannelFrozen; // Draw channels for frozen rows (often headers) + ImGuiTableDrawChannelIdx DrawChannelUnfrozen; // Draw channels for unfrozen rows + bool IsEnabled; // IsUserEnabled && (Flags & ImGuiTableColumnFlags_Disabled) == 0 + bool IsUserEnabled; // Is the column not marked Hidden by the user? (unrelated to being off view, e.g. clipped by scrolling). + bool IsUserEnabledNextFrame; + bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled). + bool IsVisibleY; + bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not. + bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen). + bool IsPreserveWidthAuto; + ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte + ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit + ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem + ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending + ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3) + ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each) + ImU8 SortDirectionsAvailList; // Ordered of available sort directions (2-bits each) + + ImGuiTableColumn() + { + memset(this, 0, sizeof(*this)); + StretchWeight = WidthRequest = -1.0f; + NameOffset = -1; + DisplayOrder = IndexWithinEnabledSet = -1; + PrevEnabledColumn = NextEnabledColumn = -1; + SortOrder = -1; + SortDirection = ImGuiSortDirection_None; + DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1; + } +}; + +// Transient cell data stored per row. +// sizeof() ~ 6 +struct ImGuiTableCellData +{ + ImU32 BgColor; // Actual color + ImGuiTableColumnIdx Column; // Column number +}; + +// Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs, does that needs they could be moved to ImGuiTableTempData ?) +struct ImGuiTableInstanceData +{ + float LastOuterHeight; // Outer height from last frame // FIXME: multi-instance issue (#3955) + float LastFirstRowHeight; // Height of first row from last frame // FIXME: possible multi-instance issue? + + ImGuiTableInstanceData() { LastOuterHeight = LastFirstRowHeight = 0.0f; } +}; + +// FIXME-TABLE: more transient data could be stored in a per-stacked table structure: DrawSplitter, SortSpecs, incoming RowData +struct IMGUI_API ImGuiTable +{ + ImGuiID ID; + ImGuiTableFlags Flags; + void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[] + ImGuiTableTempData* TempData; // Transient data while table is active. Point within g.CurrentTableStack[] + ImSpan Columns; // Point within RawData[] + ImSpan DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1) + ImSpan RowCellData; // Point within RawData[]. Store cells background requests for current row. + ImU64 EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map + ImU64 EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data + ImU64 VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect) + ImU64 RequestOutputMaskByIndex; // Column Index -> IsVisible || AutoFit (== expect user to submit items) + ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order) + int SettingsOffset; // Offset in g.SettingsTables + int LastFrameActive; + int ColumnsCount; // Number of columns declared in BeginTable() + int CurrentRow; + int CurrentColumn; + ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple table with same ID look are multiple tables, they are just synched. + ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with + float RowPosY1; + float RowPosY2; + float RowMinHeight; // Height submitted to TableNextRow() + float RowTextBaseline; + float RowIndentOffsetX; + ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_ + ImGuiTableRowFlags LastRowFlags : 16; + int RowBgColorCounter; // Counter for alternating background colors (can be fast-forwarded by e.g clipper), not same as CurrentRow because header rows typically don't increase this. + ImU32 RowBgColor[2]; // Background color override for current row. + ImU32 BorderColorStrong; + ImU32 BorderColorLight; + float BorderX1; + float BorderX2; + float HostIndentX; + float MinColumnWidth; + float OuterPaddingX; + float CellPaddingX; // Padding from each borders + float CellPaddingY; + float CellSpacingX1; // Spacing between non-bordered cells + float CellSpacingX2; + float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details. + float ColumnsGivenWidth; // Sum of current column width + float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window + float ColumnsStretchSumWeights; // Sum of weight of all enabled stretching columns + float ResizedColumnNextWidth; + float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. + float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. + ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). + ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is + ImRect WorkRect; + ImRect InnerClipRect; + ImRect BgClipRect; // We use this to cpu-clip cell background color fill, evolve during the frame as we cross frozen rows boundaries + ImRect Bg0ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG0/1 channel. This tends to be == OuterWindow->ClipRect at BeginTable() because output in BG0/BG1 is cpu-clipped + ImRect Bg2ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG2 channel. This tends to be a correct, tight-fit, because output to BG2 are done by widgets relying on regular ClipRect. + ImRect HostClipRect; // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window. + ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground() + ImGuiWindow* OuterWindow; // Parent window for the table + ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window) + ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names + ImDrawListSplitter* DrawSplitter; // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly + ImGuiTableInstanceData InstanceDataFirst; + ImVector InstanceDataExtra; // FIXME-OPT: Using a small-vector pattern would be good. + ImGuiTableColumnSortSpecs SortSpecsSingle; + ImVector SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would be good. + ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs() + ImGuiTableColumnIdx SortSpecsCount; + ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount) + ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount) + ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn() + ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column! + ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing). + ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit. + ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0. + ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame. + ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held. + ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared) + ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1 + ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column. + ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column. + ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column. + ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column. + ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot + ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count + ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset) + ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count + ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset) + ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row + ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here. + ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[] + ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen; + bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row. + bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow(). + bool IsInitializing; + bool IsSortSpecsDirty; + bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag. + bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted). + bool IsSettingsRequestLoad; + bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data. + bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1) + bool IsResetAllRequest; + bool IsResetDisplayOrderRequest; + bool IsUnfrozenRows; // Set when we got past the frozen row. + bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable() + bool MemoryCompacted; + bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis + + ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; } + ~ImGuiTable() { IM_FREE(RawData); } +}; + +// Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table). +// - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure. +// - We also leave out of this structure data that tend to be particularly useful for debugging/metrics. +struct IMGUI_API ImGuiTableTempData +{ + int TableIndex; // Index in g.Tables.Buf[] pool + float LastTimeActive; // Last timestamp this structure was used + + ImVec2 UserOuterSize; // outer_size.x passed to BeginTable() + ImDrawListSplitter DrawSplitter; + + ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable() + ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable() + ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable() + ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable() + ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable() + ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable() + float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable() + int HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable() + + ImGuiTableTempData() { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; } +}; + +// sizeof() ~ 12 +struct ImGuiTableColumnSettings +{ + float WidthOrWeight; + ImGuiID UserID; + ImGuiTableColumnIdx Index; + ImGuiTableColumnIdx DisplayOrder; + ImGuiTableColumnIdx SortOrder; + ImU8 SortDirection : 2; + ImU8 IsEnabled : 1; // "Visible" in ini file + ImU8 IsStretch : 1; + + ImGuiTableColumnSettings() + { + WidthOrWeight = 0.0f; + UserID = 0; + Index = -1; + DisplayOrder = SortOrder = -1; + SortDirection = ImGuiSortDirection_None; + IsEnabled = 1; + IsStretch = 0; + } +}; + +// This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.) +struct ImGuiTableSettings +{ + ImGuiID ID; // Set to 0 to invalidate/delete the setting + ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..) + float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. + ImGuiTableColumnIdx ColumnsCount; + ImGuiTableColumnIdx ColumnsCountMax; // Maximum number of columns this settings instance can store, we can recycle a settings instance with lower number of columns but not higher + bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) + + ImGuiTableSettings() { memset(this, 0, sizeof(*this)); } + ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGui internal API +// No guarantee of forward compatibility here! +//----------------------------------------------------------------------------- + +namespace ImGui +{ + // Windows + // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window) + // If this ever crash because g.CurrentWindow is NULL it means that either + // - ImGui::NewFrame() has never been called, which is illegal. + // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal. + inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; } + inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; } + IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id); + IMGUI_API ImGuiWindow* FindWindowByName(const char* name); + IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); + IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window); + IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy); + IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent); + IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below); + IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window); + IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0); + IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0); + IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0); + IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size); + inline ImRect WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); } + inline ImRect WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); } + + // Windows: Display Order and Focus Order + IMGUI_API void FocusWindow(ImGuiWindow* window); + IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window); + IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window); + IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window); + IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window); + IMGUI_API void BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* above_window); + IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window); + IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window); + + // Fonts, drawing + IMGUI_API void SetCurrentFont(ImFont* font); + inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; } + inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches. + IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. + IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. + + // Init + IMGUI_API void Initialize(); + IMGUI_API void Shutdown(); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext(). + + // NewFrame + IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs); + IMGUI_API void UpdateHoveredWindowAndCaptureFlags(); + IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window); + IMGUI_API void UpdateMouseMovingWindowNewFrame(); + IMGUI_API void UpdateMouseMovingWindowEndFrame(); + + // Generic context hooks + IMGUI_API ImGuiID AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook); + IMGUI_API void RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove); + IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type); + + // Viewports + IMGUI_API void SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport); + + // Settings + IMGUI_API void MarkIniSettingsDirty(); + IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window); + IMGUI_API void ClearIniSettings(); + IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name); + IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id); + IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name); + IMGUI_API void AddSettingsHandler(const ImGuiSettingsHandler* handler); + IMGUI_API void RemoveSettingsHandler(const char* type_name); + IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name); + + // Scrolling + IMGUI_API void SetNextWindowScroll(const ImVec2& scroll); // Use -1.0f on one axis to leave as-is + IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x); + IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y); + IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio); + IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio); + + // Early work-in-progress API (ScrollToItem() will become public) + IMGUI_API void ScrollToItem(ImGuiScrollFlags flags = 0); + IMGUI_API void ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0); + IMGUI_API ImVec2 ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0); +//#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + inline void ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); } +//#endif + + // Basic Accessors + inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.LastItemData.ID; } // Get ID of last item (~~ often same ImGui::GetID(label) beforehand) + inline ImGuiItemStatusFlags GetItemStatusFlags(){ ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; } + inline ImGuiItemFlags GetItemFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.InFlags; } + inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; } + inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; } + IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window); + IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window); + IMGUI_API void ClearActiveID(); + IMGUI_API ImGuiID GetHoveredID(); + IMGUI_API void SetHoveredID(ImGuiID id); + IMGUI_API void KeepAliveID(ImGuiID id); + IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function. + IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes) + IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed); + + // Basic Helpers for widget code + IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f); + inline void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f) { ItemSize(bb.GetSize(), text_baseline_y); } // FIXME: This is a misleading API since we expect CursorPos to be bb.Min. + IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0); + IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); + IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id); + IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect); + IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h); + IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x); + IMGUI_API void PushMultiItemsWidths(int components, float width_full); + IMGUI_API bool IsItemToggledSelection(); // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly) + IMGUI_API ImVec2 GetContentRegionMaxAbs(); + IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess); + + // Parameter stacks + IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled); + IMGUI_API void PopItemFlag(); + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + // Currently refactoring focus/nav/tabbing system + // If you have old/custom copy-and-pasted widgets that used FocusableItemRegister(): + // (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)' + // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_Focused) != 0' + // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedTabbing) != 0 || g.NavActivateInputId == id' (WIP) + // Widget code are simplified as there's no need to call FocusableItemUnregister() while managing the transition from regular widget to TempInputText() + inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) { IM_ASSERT(0); IM_UNUSED(window); IM_UNUSED(id); return false; } // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd() + inline void FocusableItemUnregister(ImGuiWindow* window) { IM_ASSERT(0); IM_UNUSED(window); } // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem +#endif + + // Logging/Capture + IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name. + IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer + IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL); + IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix); + + // Popups, Modals, Tooltips + IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags); + IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None); + IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup); + IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup); + IMGUI_API void ClosePopupsExceptModals(); + IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags); + IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); + IMGUI_API void BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags); + IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window); + IMGUI_API ImGuiWindow* GetTopMostPopupModal(); + IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal(); + IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window); + IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy); + + // Menus + IMGUI_API bool BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags); + IMGUI_API bool BeginMenuEx(const char* label, const char* icon, bool enabled = true); + IMGUI_API bool MenuItemEx(const char* label, const char* icon, const char* shortcut = NULL, bool selected = false, bool enabled = true); + + // Combos + IMGUI_API bool BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags); + IMGUI_API bool BeginComboPreview(); + IMGUI_API void EndComboPreview(); + + // Gamepad/Keyboard Navigation + IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit); + IMGUI_API void NavInitRequestApplyResult(); + IMGUI_API bool NavMoveRequestButNoResultYet(); + IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); + IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); + IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result); + IMGUI_API void NavMoveRequestCancel(); + IMGUI_API void NavMoveRequestApplyResult(); + IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); + IMGUI_API const char* GetNavInputName(ImGuiNavInput n); + IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiNavReadMode mode); + IMGUI_API ImVec2 GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiNavReadMode mode, float slow_factor = 0.0f, float fast_factor = 0.0f); + IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate); + IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again. + IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel); + + // Focus Scope (WIP) + // This is generally used to identify a selection set (multiple of which may be in the same window), as selection + // patterns generally need to react (e.g. clear selection) when landing on an item of the set. + IMGUI_API void PushFocusScope(ImGuiID id); + IMGUI_API void PopFocusScope(); + inline ImGuiID GetFocusedFocusScope() { ImGuiContext& g = *GImGui; return g.NavFocusScopeId; } // Focus scope which is actually active + inline ImGuiID GetFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.NavFocusScopeIdCurrent; } // Focus scope we are outputting into, set by PushFocusScope() + + // Inputs + // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions. + inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; } + inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; } + inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; } + IMGUI_API ImGuiKeyData* GetKeyData(ImGuiKey key); + IMGUI_API void SetItemUsingMouseWheel(); + IMGUI_API void SetActiveIdUsingNavAndKeys(); + inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; } + inline bool IsActiveIdUsingNavInput(ImGuiNavInput input) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavInputMask & (1 << input)) != 0; } + inline bool IsActiveIdUsingKey(ImGuiKey key) { ImGuiContext& g = *GImGui; return g.ActiveIdUsingKeyInputMask[key]; } + inline void SetActiveIdUsingKey(ImGuiKey key) { ImGuiContext& g = *GImGui; g.ActiveIdUsingKeyInputMask.SetBit(key); } + IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f); + inline bool IsNavInputDown(ImGuiNavInput n) { ImGuiContext& g = *GImGui; return g.IO.NavInputs[n] > 0.0f; } + inline bool IsNavInputTest(ImGuiNavInput n, ImGuiNavReadMode rm) { return (GetNavInputAmount(n, rm) > 0.0f); } + IMGUI_API ImGuiModFlags GetMergedModFlags(); +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // [removed in 1.87] +#endif + + // Drag and Drop + IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id); + IMGUI_API void ClearDragDrop(); + IMGUI_API bool IsDragDropPayloadBeingAccepted(); + + // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API) + IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect); + IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiOldColumnFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns(). + IMGUI_API void EndColumns(); // close columns + IMGUI_API void PushColumnClipRect(int column_index); + IMGUI_API void PushColumnsBackground(); + IMGUI_API void PopColumnsBackground(); + IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count); + IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id); + IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm); + IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset); + + // Tables: Candidates for public API + IMGUI_API void TableOpenContextMenu(int column_n = -1); + IMGUI_API void TableSetColumnWidth(int column_n, float width); + IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs); + IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. + IMGUI_API float TableGetHeaderRowHeight(); + IMGUI_API void TablePushBackgroundChannel(); + IMGUI_API void TablePopBackgroundChannel(); + + // Tables: Internals + inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; } + IMGUI_API ImGuiTable* TableFindByID(ImGuiID id); + IMGUI_API bool BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f); + IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count); + IMGUI_API void TableBeginApplyRequests(ImGuiTable* table); + IMGUI_API void TableSetupDrawChannels(ImGuiTable* table); + IMGUI_API void TableUpdateLayout(ImGuiTable* table); + IMGUI_API void TableUpdateBorders(ImGuiTable* table); + IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table); + IMGUI_API void TableDrawBorders(ImGuiTable* table); + IMGUI_API void TableDrawContextMenu(ImGuiTable* table); + IMGUI_API void TableMergeDrawChannels(ImGuiTable* table); + inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; } + IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table); + IMGUI_API void TableSortSpecsBuild(ImGuiTable* table); + IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column); + IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column); + IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column); + IMGUI_API void TableBeginRow(ImGuiTable* table); + IMGUI_API void TableEndRow(ImGuiTable* table); + IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n); + IMGUI_API void TableEndCell(ImGuiTable* table); + IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n); + IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n); + IMGUI_API ImGuiID TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no = 0); + IMGUI_API float TableGetMaxColumnWidth(const ImGuiTable* table, int column_n); + IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n); + IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table); + IMGUI_API void TableRemove(ImGuiTable* table); + IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table); + IMGUI_API void TableGcCompactTransientBuffers(ImGuiTableTempData* table); + IMGUI_API void TableGcCompactSettings(); + + // Tables: Settings + IMGUI_API void TableLoadSettings(ImGuiTable* table); + IMGUI_API void TableSaveSettings(ImGuiTable* table); + IMGUI_API void TableResetSettings(ImGuiTable* table); + IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table); + IMGUI_API void TableSettingsAddSettingsHandler(); + IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count); + IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id); + + // Tab Bars + IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags); + IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id); + IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id); + IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); + IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int offset); + IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, ImVec2 mouse_pos); + IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar); + IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags); + IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button); + IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col); + IMGUI_API void TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped); + + // Render helpers + // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT. + // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally) + IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true); + IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width); + IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL); + IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL); + IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known); + IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f); + IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f); + IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0); + IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight + IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. + IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow); + + // Render helpers (those functions don't access any ImGui state!) + IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f); + IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col); + IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz); + IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col); + IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding); + IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding); + + // Widgets + IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0); + IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0); + IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos); + IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos); + IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0); + IMGUI_API void Scrollbar(ImGuiAxis axis); + IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 avail_v, ImS64 contents_v, ImDrawFlags flags); + IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col); + IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis); + IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis); + IMGUI_API ImGuiID GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners + IMGUI_API ImGuiID GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir); + IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags); + IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value); + IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value); + + // Widgets low-level behaviors + IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); + IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags); + IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); + IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f); + IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL); + IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextItemOpen() data, if any. May return true when logging + IMGUI_API void TreePushOverrideID(ImGuiID id); + + // Template functions are instantiated in imgui_widgets.cpp for a finite number of types. + // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036). + // e.g. " extern template IMGUI_API float RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, float v); " + template IMGUI_API float ScaleRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); + template IMGUI_API T ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); + template IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags); + template IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); + template IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v); + template IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value); + + // Data type helpers + IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type); + IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format); + IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2); + IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format); + IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2); + IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max); + + // InputText + IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags); + IMGUI_API bool TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL); + inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); } + inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active + + // Color + IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags); + IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags); + IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags); + + // Plot + IMGUI_API int PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size); + + // Shade functions (write over already created vertices) + IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); + IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); + + // Garbage collection + IMGUI_API void GcCompactTransientMiscBuffers(); + IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window); + IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window); + + // Debug Tools + IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); + IMGUI_API void ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); + inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); } + inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; } + + IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas); + IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end); + IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns); + IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label); + IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb); + IMGUI_API void DebugNodeFont(ImFont* font); + IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph); + IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label); + IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label); + IMGUI_API void DebugNodeTable(ImGuiTable* table); + IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings); + IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label); + IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings); + IMGUI_API void DebugNodeWindowsList(ImVector* windows, const char* label); + IMGUI_API void DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack); + IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport); + IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb); + +} // namespace ImGui + + +//----------------------------------------------------------------------------- +// [SECTION] ImFontAtlas internal API +//----------------------------------------------------------------------------- + +// This structure is likely to evolve as we add support for incremental atlas updates +struct ImFontBuilderIO +{ + bool (*FontBuilder_Build)(ImFontAtlas* atlas); +}; + +// Helper for font builder +#ifdef IMGUI_ENABLE_STB_TRUETYPE +IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype(); +#endif +IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas); +IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); +IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque); +IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas); +IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value); +IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value); +IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor); +IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride); + +//----------------------------------------------------------------------------- +// [SECTION] Test Engine specific hooks (imgui_test_engine) +//----------------------------------------------------------------------------- + +#ifdef IMGUI_ENABLE_TEST_ENGINE +extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id); +extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags); +extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...); +extern const char* ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id); + +#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID) // Register item bounding box +#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional) +#define IMGUI_TEST_ENGINE_LOG(_FMT,...) if (g.TestEngineHookItems) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log +#else +#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) ((void)0) +#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) ((void)g) +#endif + +//----------------------------------------------------------------------------- + +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#ifdef _MSC_VER +#pragma warning (pop) +#endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/3rdparty/imgui/include/imgui_stdlib.h b/3rdparty/imgui/include/imgui_stdlib.h new file mode 100644 index 0000000000..61afc098e5 --- /dev/null +++ b/3rdparty/imgui/include/imgui_stdlib.h @@ -0,0 +1,18 @@ +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) +// This is also an example of how you may wrap your own similar types. + +// Changelog: +// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string + +#pragma once + +#include + +namespace ImGui +{ + // ImGui::InputText() with std::string + // Because text input needs dynamic resizing, we need to setup a callback to grow the capacity + IMGUI_API bool InputText(const char* label, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextMultiline(const char* label, std::string* str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); +} diff --git a/3rdparty/imgui/include/imstb_textedit.h b/3rdparty/imgui/include/imstb_textedit.h new file mode 100644 index 0000000000..75a159dac7 --- /dev/null +++ b/3rdparty/imgui/include/imstb_textedit.h @@ -0,0 +1,1447 @@ +// [DEAR IMGUI] +// This is a slightly modified version of stb_textedit.h 1.14. +// Those changes would need to be pushed into nothings/stb: +// - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321) +// Grep for [DEAR IMGUI] to find the changes. + +// stb_textedit.h - v1.14 - public domain - Sean Barrett +// Development of this library was sponsored by RAD Game Tools +// +// This C header file implements the guts of a multi-line text-editing +// widget; you implement display, word-wrapping, and low-level string +// insertion/deletion, and stb_textedit will map user inputs into +// insertions & deletions, plus updates to the cursor position, +// selection state, and undo state. +// +// It is intended for use in games and other systems that need to build +// their own custom widgets and which do not have heavy text-editing +// requirements (this library is not recommended for use for editing large +// texts, as its performance does not scale and it has limited undo). +// +// Non-trivial behaviors are modelled after Windows text controls. +// +// +// LICENSE +// +// See end of file for license information. +// +// +// DEPENDENCIES +// +// Uses the C runtime function 'memmove', which you can override +// by defining STB_TEXTEDIT_memmove before the implementation. +// Uses no other functions. Performs no runtime allocations. +// +// +// VERSION HISTORY +// +// 1.14 (2021-07-11) page up/down, various fixes +// 1.13 (2019-02-07) fix bug in undo size management +// 1.12 (2018-01-29) user can change STB_TEXTEDIT_KEYTYPE, fix redo to avoid crash +// 1.11 (2017-03-03) fix HOME on last line, dragging off single-line textfield +// 1.10 (2016-10-25) supress warnings about casting away const with -Wcast-qual +// 1.9 (2016-08-27) customizable move-by-word +// 1.8 (2016-04-02) better keyboard handling when mouse button is down +// 1.7 (2015-09-13) change y range handling in case baseline is non-0 +// 1.6 (2015-04-15) allow STB_TEXTEDIT_memmove +// 1.5 (2014-09-10) add support for secondary keys for OS X +// 1.4 (2014-08-17) fix signed/unsigned warnings +// 1.3 (2014-06-19) fix mouse clicking to round to nearest char boundary +// 1.2 (2014-05-27) fix some RAD types that had crept into the new code +// 1.1 (2013-12-15) move-by-word (requires STB_TEXTEDIT_IS_SPACE ) +// 1.0 (2012-07-26) improve documentation, initial public release +// 0.3 (2012-02-24) bugfixes, single-line mode; insert mode +// 0.2 (2011-11-28) fixes to undo/redo +// 0.1 (2010-07-08) initial version +// +// ADDITIONAL CONTRIBUTORS +// +// Ulf Winklemann: move-by-word in 1.1 +// Fabian Giesen: secondary key inputs in 1.5 +// Martins Mozeiko: STB_TEXTEDIT_memmove in 1.6 +// Louis Schnellbach: page up/down in 1.14 +// +// Bugfixes: +// Scott Graham +// Daniel Keller +// Omar Cornut +// Dan Thompson +// +// USAGE +// +// This file behaves differently depending on what symbols you define +// before including it. +// +// +// Header-file mode: +// +// If you do not define STB_TEXTEDIT_IMPLEMENTATION before including this, +// it will operate in "header file" mode. In this mode, it declares a +// single public symbol, STB_TexteditState, which encapsulates the current +// state of a text widget (except for the string, which you will store +// separately). +// +// To compile in this mode, you must define STB_TEXTEDIT_CHARTYPE to a +// primitive type that defines a single character (e.g. char, wchar_t, etc). +// +// To save space or increase undo-ability, you can optionally define the +// following things that are used by the undo system: +// +// STB_TEXTEDIT_POSITIONTYPE small int type encoding a valid cursor position +// STB_TEXTEDIT_UNDOSTATECOUNT the number of undo states to allow +// STB_TEXTEDIT_UNDOCHARCOUNT the number of characters to store in the undo buffer +// +// If you don't define these, they are set to permissive types and +// moderate sizes. The undo system does no memory allocations, so +// it grows STB_TexteditState by the worst-case storage which is (in bytes): +// +// [4 + 3 * sizeof(STB_TEXTEDIT_POSITIONTYPE)] * STB_TEXTEDIT_UNDOSTATECOUNT +// + sizeof(STB_TEXTEDIT_CHARTYPE) * STB_TEXTEDIT_UNDOCHARCOUNT +// +// +// Implementation mode: +// +// If you define STB_TEXTEDIT_IMPLEMENTATION before including this, it +// will compile the implementation of the text edit widget, depending +// on a large number of symbols which must be defined before the include. +// +// The implementation is defined only as static functions. You will then +// need to provide your own APIs in the same file which will access the +// static functions. +// +// The basic concept is that you provide a "string" object which +// behaves like an array of characters. stb_textedit uses indices to +// refer to positions in the string, implicitly representing positions +// in the displayed textedit. This is true for both plain text and +// rich text; even with rich text stb_truetype interacts with your +// code as if there was an array of all the displayed characters. +// +// Symbols that must be the same in header-file and implementation mode: +// +// STB_TEXTEDIT_CHARTYPE the character type +// STB_TEXTEDIT_POSITIONTYPE small type that is a valid cursor position +// STB_TEXTEDIT_UNDOSTATECOUNT the number of undo states to allow +// STB_TEXTEDIT_UNDOCHARCOUNT the number of characters to store in the undo buffer +// +// Symbols you must define for implementation mode: +// +// STB_TEXTEDIT_STRING the type of object representing a string being edited, +// typically this is a wrapper object with other data you need +// +// STB_TEXTEDIT_STRINGLEN(obj) the length of the string (ideally O(1)) +// STB_TEXTEDIT_LAYOUTROW(&r,obj,n) returns the results of laying out a line of characters +// starting from character #n (see discussion below) +// STB_TEXTEDIT_GETWIDTH(obj,n,i) returns the pixel delta from the xpos of the i'th character +// to the xpos of the i+1'th char for a line of characters +// starting at character #n (i.e. accounts for kerning +// with previous char) +// STB_TEXTEDIT_KEYTOTEXT(k) maps a keyboard input to an insertable character +// (return type is int, -1 means not valid to insert) +// STB_TEXTEDIT_GETCHAR(obj,i) returns the i'th character of obj, 0-based +// STB_TEXTEDIT_NEWLINE the character returned by _GETCHAR() we recognize +// as manually wordwrapping for end-of-line positioning +// +// STB_TEXTEDIT_DELETECHARS(obj,i,n) delete n characters starting at i +// STB_TEXTEDIT_INSERTCHARS(obj,i,c*,n) insert n characters at i (pointed to by STB_TEXTEDIT_CHARTYPE*) +// +// STB_TEXTEDIT_K_SHIFT a power of two that is or'd in to a keyboard input to represent the shift key +// +// STB_TEXTEDIT_K_LEFT keyboard input to move cursor left +// STB_TEXTEDIT_K_RIGHT keyboard input to move cursor right +// STB_TEXTEDIT_K_UP keyboard input to move cursor up +// STB_TEXTEDIT_K_DOWN keyboard input to move cursor down +// STB_TEXTEDIT_K_PGUP keyboard input to move cursor up a page +// STB_TEXTEDIT_K_PGDOWN keyboard input to move cursor down a page +// STB_TEXTEDIT_K_LINESTART keyboard input to move cursor to start of line // e.g. HOME +// STB_TEXTEDIT_K_LINEEND keyboard input to move cursor to end of line // e.g. END +// STB_TEXTEDIT_K_TEXTSTART keyboard input to move cursor to start of text // e.g. ctrl-HOME +// STB_TEXTEDIT_K_TEXTEND keyboard input to move cursor to end of text // e.g. ctrl-END +// STB_TEXTEDIT_K_DELETE keyboard input to delete selection or character under cursor +// STB_TEXTEDIT_K_BACKSPACE keyboard input to delete selection or character left of cursor +// STB_TEXTEDIT_K_UNDO keyboard input to perform undo +// STB_TEXTEDIT_K_REDO keyboard input to perform redo +// +// Optional: +// STB_TEXTEDIT_K_INSERT keyboard input to toggle insert mode +// STB_TEXTEDIT_IS_SPACE(ch) true if character is whitespace (e.g. 'isspace'), +// required for default WORDLEFT/WORDRIGHT handlers +// STB_TEXTEDIT_MOVEWORDLEFT(obj,i) custom handler for WORDLEFT, returns index to move cursor to +// STB_TEXTEDIT_MOVEWORDRIGHT(obj,i) custom handler for WORDRIGHT, returns index to move cursor to +// STB_TEXTEDIT_K_WORDLEFT keyboard input to move cursor left one word // e.g. ctrl-LEFT +// STB_TEXTEDIT_K_WORDRIGHT keyboard input to move cursor right one word // e.g. ctrl-RIGHT +// STB_TEXTEDIT_K_LINESTART2 secondary keyboard input to move cursor to start of line +// STB_TEXTEDIT_K_LINEEND2 secondary keyboard input to move cursor to end of line +// STB_TEXTEDIT_K_TEXTSTART2 secondary keyboard input to move cursor to start of text +// STB_TEXTEDIT_K_TEXTEND2 secondary keyboard input to move cursor to end of text +// +// Keyboard input must be encoded as a single integer value; e.g. a character code +// and some bitflags that represent shift states. to simplify the interface, SHIFT must +// be a bitflag, so we can test the shifted state of cursor movements to allow selection, +// i.e. (STB_TEXTEDIT_K_RIGHT|STB_TEXTEDIT_K_SHIFT) should be shifted right-arrow. +// +// You can encode other things, such as CONTROL or ALT, in additional bits, and +// then test for their presence in e.g. STB_TEXTEDIT_K_WORDLEFT. For example, +// my Windows implementations add an additional CONTROL bit, and an additional KEYDOWN +// bit. Then all of the STB_TEXTEDIT_K_ values bitwise-or in the KEYDOWN bit, +// and I pass both WM_KEYDOWN and WM_CHAR events to the "key" function in the +// API below. The control keys will only match WM_KEYDOWN events because of the +// keydown bit I add, and STB_TEXTEDIT_KEYTOTEXT only tests for the KEYDOWN +// bit so it only decodes WM_CHAR events. +// +// STB_TEXTEDIT_LAYOUTROW returns information about the shape of one displayed +// row of characters assuming they start on the i'th character--the width and +// the height and the number of characters consumed. This allows this library +// to traverse the entire layout incrementally. You need to compute word-wrapping +// here. +// +// Each textfield keeps its own insert mode state, which is not how normal +// applications work. To keep an app-wide insert mode, update/copy the +// "insert_mode" field of STB_TexteditState before/after calling API functions. +// +// API +// +// void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line) +// +// void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +// void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +// int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +// int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len) +// void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXEDIT_KEYTYPE key) +// +// Each of these functions potentially updates the string and updates the +// state. +// +// initialize_state: +// set the textedit state to a known good default state when initially +// constructing the textedit. +// +// click: +// call this with the mouse x,y on a mouse down; it will update the cursor +// and reset the selection start/end to the cursor point. the x,y must +// be relative to the text widget, with (0,0) being the top left. +// +// drag: +// call this with the mouse x,y on a mouse drag/up; it will update the +// cursor and the selection end point +// +// cut: +// call this to delete the current selection; returns true if there was +// one. you should FIRST copy the current selection to the system paste buffer. +// (To copy, just copy the current selection out of the string yourself.) +// +// paste: +// call this to paste text at the current cursor point or over the current +// selection if there is one. +// +// key: +// call this for keyboard inputs sent to the textfield. you can use it +// for "key down" events or for "translated" key events. if you need to +// do both (as in Win32), or distinguish Unicode characters from control +// inputs, set a high bit to distinguish the two; then you can define the +// various definitions like STB_TEXTEDIT_K_LEFT have the is-key-event bit +// set, and make STB_TEXTEDIT_KEYTOCHAR check that the is-key-event bit is +// clear. STB_TEXTEDIT_KEYTYPE defaults to int, but you can #define it to +// anything other type you wante before including. +// +// +// When rendering, you can read the cursor position and selection state from +// the STB_TexteditState. +// +// +// Notes: +// +// This is designed to be usable in IMGUI, so it allows for the possibility of +// running in an IMGUI that has NOT cached the multi-line layout. For this +// reason, it provides an interface that is compatible with computing the +// layout incrementally--we try to make sure we make as few passes through +// as possible. (For example, to locate the mouse pointer in the text, we +// could define functions that return the X and Y positions of characters +// and binary search Y and then X, but if we're doing dynamic layout this +// will run the layout algorithm many times, so instead we manually search +// forward in one pass. Similar logic applies to e.g. up-arrow and +// down-arrow movement.) +// +// If it's run in a widget that *has* cached the layout, then this is less +// efficient, but it's not horrible on modern computers. But you wouldn't +// want to edit million-line files with it. + + +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//// +//// Header-file mode +//// +//// + +#ifndef INCLUDE_STB_TEXTEDIT_H +#define INCLUDE_STB_TEXTEDIT_H + +//////////////////////////////////////////////////////////////////////// +// +// STB_TexteditState +// +// Definition of STB_TexteditState which you should store +// per-textfield; it includes cursor position, selection state, +// and undo state. +// + +#ifndef STB_TEXTEDIT_UNDOSTATECOUNT +#define STB_TEXTEDIT_UNDOSTATECOUNT 99 +#endif +#ifndef STB_TEXTEDIT_UNDOCHARCOUNT +#define STB_TEXTEDIT_UNDOCHARCOUNT 999 +#endif +#ifndef STB_TEXTEDIT_CHARTYPE +#define STB_TEXTEDIT_CHARTYPE int +#endif +#ifndef STB_TEXTEDIT_POSITIONTYPE +#define STB_TEXTEDIT_POSITIONTYPE int +#endif + +typedef struct +{ + // private data + STB_TEXTEDIT_POSITIONTYPE where; + STB_TEXTEDIT_POSITIONTYPE insert_length; + STB_TEXTEDIT_POSITIONTYPE delete_length; + int char_storage; +} StbUndoRecord; + +typedef struct +{ + // private data + StbUndoRecord undo_rec [STB_TEXTEDIT_UNDOSTATECOUNT]; + STB_TEXTEDIT_CHARTYPE undo_char[STB_TEXTEDIT_UNDOCHARCOUNT]; + short undo_point, redo_point; + int undo_char_point, redo_char_point; +} StbUndoState; + +typedef struct +{ + ///////////////////// + // + // public data + // + + int cursor; + // position of the text cursor within the string + + int select_start; // selection start point + int select_end; + // selection start and end point in characters; if equal, no selection. + // note that start may be less than or greater than end (e.g. when + // dragging the mouse, start is where the initial click was, and you + // can drag in either direction) + + unsigned char insert_mode; + // each textfield keeps its own insert mode state. to keep an app-wide + // insert mode, copy this value in/out of the app state + + int row_count_per_page; + // page size in number of row. + // this value MUST be set to >0 for pageup or pagedown in multilines documents. + + ///////////////////// + // + // private data + // + unsigned char cursor_at_end_of_line; // not implemented yet + unsigned char initialized; + unsigned char has_preferred_x; + unsigned char single_line; + unsigned char padding1, padding2, padding3; + float preferred_x; // this determines where the cursor up/down tries to seek to along x + StbUndoState undostate; +} STB_TexteditState; + + +//////////////////////////////////////////////////////////////////////// +// +// StbTexteditRow +// +// Result of layout query, used by stb_textedit to determine where +// the text in each row is. + +// result of layout query +typedef struct +{ + float x0,x1; // starting x location, end x location (allows for align=right, etc) + float baseline_y_delta; // position of baseline relative to previous row's baseline + float ymin,ymax; // height of row above and below baseline + int num_chars; +} StbTexteditRow; +#endif //INCLUDE_STB_TEXTEDIT_H + + +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//// +//// Implementation mode +//// +//// + + +// implementation isn't include-guarded, since it might have indirectly +// included just the "header" portion +#ifdef STB_TEXTEDIT_IMPLEMENTATION + +#ifndef STB_TEXTEDIT_memmove +#include +#define STB_TEXTEDIT_memmove memmove +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Mouse input handling +// + +// traverse the layout to locate the nearest character to a display position +static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) +{ + StbTexteditRow r; + int n = STB_TEXTEDIT_STRINGLEN(str); + float base_y = 0, prev_x; + int i=0, k; + + r.x0 = r.x1 = 0; + r.ymin = r.ymax = 0; + r.num_chars = 0; + + // search rows to find one that straddles 'y' + while (i < n) { + STB_TEXTEDIT_LAYOUTROW(&r, str, i); + if (r.num_chars <= 0) + return n; + + if (i==0 && y < base_y + r.ymin) + return 0; + + if (y < base_y + r.ymax) + break; + + i += r.num_chars; + base_y += r.baseline_y_delta; + } + + // below all text, return 'after' last character + if (i >= n) + return n; + + // check if it's before the beginning of the line + if (x < r.x0) + return i; + + // check if it's before the end of the line + if (x < r.x1) { + // search characters in row for one that straddles 'x' + prev_x = r.x0; + for (k=0; k < r.num_chars; ++k) { + float w = STB_TEXTEDIT_GETWIDTH(str, i, k); + if (x < prev_x+w) { + if (x < prev_x+w/2) + return k+i; + else + return k+i+1; + } + prev_x += w; + } + // shouldn't happen, but if it does, fall through to end-of-line case + } + + // if the last character is a newline, return that. otherwise return 'after' the last character + if (STB_TEXTEDIT_GETCHAR(str, i+r.num_chars-1) == STB_TEXTEDIT_NEWLINE) + return i+r.num_chars-1; + else + return i+r.num_chars; +} + +// API click: on mouse down, move the cursor to the clicked location, and reset the selection +static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +{ + // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse + // goes off the top or bottom of the text + if( state->single_line ) + { + StbTexteditRow r; + STB_TEXTEDIT_LAYOUTROW(&r, str, 0); + y = r.ymin; + } + + state->cursor = stb_text_locate_coord(str, x, y); + state->select_start = state->cursor; + state->select_end = state->cursor; + state->has_preferred_x = 0; +} + +// API drag: on mouse drag, move the cursor and selection endpoint to the clicked location +static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +{ + int p = 0; + + // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse + // goes off the top or bottom of the text + if( state->single_line ) + { + StbTexteditRow r; + STB_TEXTEDIT_LAYOUTROW(&r, str, 0); + y = r.ymin; + } + + if (state->select_start == state->select_end) + state->select_start = state->cursor; + + p = stb_text_locate_coord(str, x, y); + state->cursor = state->select_end = p; +} + +///////////////////////////////////////////////////////////////////////////// +// +// Keyboard input handling +// + +// forward declarations +static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); +static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); +static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length); +static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length); +static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length); + +typedef struct +{ + float x,y; // position of n'th character + float height; // height of line + int first_char, length; // first char of row, and length + int prev_first; // first char of previous row +} StbFindState; + +// find the x/y location of a character, and remember info about the previous row in +// case we get a move-up event (for page up, we'll have to rescan) +static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *str, int n, int single_line) +{ + StbTexteditRow r; + int prev_start = 0; + int z = STB_TEXTEDIT_STRINGLEN(str); + int i=0, first; + + if (n == z) { + // if it's at the end, then find the last line -- simpler than trying to + // explicitly handle this case in the regular code + if (single_line) { + STB_TEXTEDIT_LAYOUTROW(&r, str, 0); + find->y = 0; + find->first_char = 0; + find->length = z; + find->height = r.ymax - r.ymin; + find->x = r.x1; + } else { + find->y = 0; + find->x = 0; + find->height = 1; + while (i < z) { + STB_TEXTEDIT_LAYOUTROW(&r, str, i); + prev_start = i; + i += r.num_chars; + } + find->first_char = i; + find->length = 0; + find->prev_first = prev_start; + } + return; + } + + // search rows to find the one that straddles character n + find->y = 0; + + for(;;) { + STB_TEXTEDIT_LAYOUTROW(&r, str, i); + if (n < i + r.num_chars) + break; + prev_start = i; + i += r.num_chars; + find->y += r.baseline_y_delta; + } + + find->first_char = first = i; + find->length = r.num_chars; + find->height = r.ymax - r.ymin; + find->prev_first = prev_start; + + // now scan to find xpos + find->x = r.x0; + for (i=0; first+i < n; ++i) + find->x += STB_TEXTEDIT_GETWIDTH(str, first, i); +} + +#define STB_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end) + +// make the selection/cursor state valid if client altered the string +static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + int n = STB_TEXTEDIT_STRINGLEN(str); + if (STB_TEXT_HAS_SELECTION(state)) { + if (state->select_start > n) state->select_start = n; + if (state->select_end > n) state->select_end = n; + // if clamping forced them to be equal, move the cursor to match + if (state->select_start == state->select_end) + state->cursor = state->select_start; + } + if (state->cursor > n) state->cursor = n; +} + +// delete characters while updating undo +static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len) +{ + stb_text_makeundo_delete(str, state, where, len); + STB_TEXTEDIT_DELETECHARS(str, where, len); + state->has_preferred_x = 0; +} + +// delete the section +static void stb_textedit_delete_selection(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + stb_textedit_clamp(str, state); + if (STB_TEXT_HAS_SELECTION(state)) { + if (state->select_start < state->select_end) { + stb_textedit_delete(str, state, state->select_start, state->select_end - state->select_start); + state->select_end = state->cursor = state->select_start; + } else { + stb_textedit_delete(str, state, state->select_end, state->select_start - state->select_end); + state->select_start = state->cursor = state->select_end; + } + state->has_preferred_x = 0; + } +} + +// canoncialize the selection so start <= end +static void stb_textedit_sortselection(STB_TexteditState *state) +{ + if (state->select_end < state->select_start) { + int temp = state->select_end; + state->select_end = state->select_start; + state->select_start = temp; + } +} + +// move cursor to first character of selection +static void stb_textedit_move_to_first(STB_TexteditState *state) +{ + if (STB_TEXT_HAS_SELECTION(state)) { + stb_textedit_sortselection(state); + state->cursor = state->select_start; + state->select_end = state->select_start; + state->has_preferred_x = 0; + } +} + +// move cursor to last character of selection +static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + if (STB_TEXT_HAS_SELECTION(state)) { + stb_textedit_sortselection(state); + stb_textedit_clamp(str, state); + state->cursor = state->select_end; + state->select_start = state->select_end; + state->has_preferred_x = 0; + } +} + +#ifdef STB_TEXTEDIT_IS_SPACE +static int is_word_boundary( STB_TEXTEDIT_STRING *str, int idx ) +{ + return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1; +} + +#ifndef STB_TEXTEDIT_MOVEWORDLEFT +static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c ) +{ + --c; // always move at least one character + while( c >= 0 && !is_word_boundary( str, c ) ) + --c; + + if( c < 0 ) + c = 0; + + return c; +} +#define STB_TEXTEDIT_MOVEWORDLEFT stb_textedit_move_to_word_previous +#endif + +#ifndef STB_TEXTEDIT_MOVEWORDRIGHT +static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *str, int c ) +{ + const int len = STB_TEXTEDIT_STRINGLEN(str); + ++c; // always move at least one character + while( c < len && !is_word_boundary( str, c ) ) + ++c; + + if( c > len ) + c = len; + + return c; +} +#define STB_TEXTEDIT_MOVEWORDRIGHT stb_textedit_move_to_word_next +#endif + +#endif + +// update selection and cursor to match each other +static void stb_textedit_prep_selection_at_cursor(STB_TexteditState *state) +{ + if (!STB_TEXT_HAS_SELECTION(state)) + state->select_start = state->select_end = state->cursor; + else + state->cursor = state->select_end; +} + +// API cut: delete selection +static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + if (STB_TEXT_HAS_SELECTION(state)) { + stb_textedit_delete_selection(str,state); // implicitly clamps + state->has_preferred_x = 0; + return 1; + } + return 0; +} + +// API paste: replace existing selection with passed-in text +static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len) +{ + // if there's a selection, the paste should delete it + stb_textedit_clamp(str, state); + stb_textedit_delete_selection(str,state); + // try to insert the characters + if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, text, len)) { + stb_text_makeundo_insert(state, state->cursor, len); + state->cursor += len; + state->has_preferred_x = 0; + return 1; + } + // note: paste failure will leave deleted selection, may be restored with an undo (see https://github.com/nothings/stb/issues/734 for details) + return 0; +} + +#ifndef STB_TEXTEDIT_KEYTYPE +#define STB_TEXTEDIT_KEYTYPE int +#endif + +// API key: process a keyboard input +static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_KEYTYPE key) +{ +retry: + switch (key) { + default: { + int c = STB_TEXTEDIT_KEYTOTEXT(key); + if (c > 0) { + STB_TEXTEDIT_CHARTYPE ch = (STB_TEXTEDIT_CHARTYPE) c; + + // can't add newline in single-line mode + if (c == '\n' && state->single_line) + break; + + if (state->insert_mode && !STB_TEXT_HAS_SELECTION(state) && state->cursor < STB_TEXTEDIT_STRINGLEN(str)) { + stb_text_makeundo_replace(str, state, state->cursor, 1, 1); + STB_TEXTEDIT_DELETECHARS(str, state->cursor, 1); + if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) { + ++state->cursor; + state->has_preferred_x = 0; + } + } else { + stb_textedit_delete_selection(str,state); // implicitly clamps + if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) { + stb_text_makeundo_insert(state, state->cursor, 1); + ++state->cursor; + state->has_preferred_x = 0; + } + } + } + break; + } + +#ifdef STB_TEXTEDIT_K_INSERT + case STB_TEXTEDIT_K_INSERT: + state->insert_mode = !state->insert_mode; + break; +#endif + + case STB_TEXTEDIT_K_UNDO: + stb_text_undo(str, state); + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_REDO: + stb_text_redo(str, state); + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_LEFT: + // if currently there's a selection, move cursor to start of selection + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_first(state); + else + if (state->cursor > 0) + --state->cursor; + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_RIGHT: + // if currently there's a selection, move cursor to end of selection + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_last(str, state); + else + ++state->cursor; + stb_textedit_clamp(str, state); + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_LEFT | STB_TEXTEDIT_K_SHIFT: + stb_textedit_clamp(str, state); + stb_textedit_prep_selection_at_cursor(state); + // move selection left + if (state->select_end > 0) + --state->select_end; + state->cursor = state->select_end; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_MOVEWORDLEFT + case STB_TEXTEDIT_K_WORDLEFT: + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_first(state); + else { + state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); + stb_textedit_clamp( str, state ); + } + break; + + case STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT: + if( !STB_TEXT_HAS_SELECTION( state ) ) + stb_textedit_prep_selection_at_cursor(state); + + state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); + state->select_end = state->cursor; + + stb_textedit_clamp( str, state ); + break; +#endif + +#ifdef STB_TEXTEDIT_MOVEWORDRIGHT + case STB_TEXTEDIT_K_WORDRIGHT: + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_last(str, state); + else { + state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); + stb_textedit_clamp( str, state ); + } + break; + + case STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT: + if( !STB_TEXT_HAS_SELECTION( state ) ) + stb_textedit_prep_selection_at_cursor(state); + + state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); + state->select_end = state->cursor; + + stb_textedit_clamp( str, state ); + break; +#endif + + case STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT: + stb_textedit_prep_selection_at_cursor(state); + // move selection right + ++state->select_end; + stb_textedit_clamp(str, state); + state->cursor = state->select_end; + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_DOWN: + case STB_TEXTEDIT_K_DOWN | STB_TEXTEDIT_K_SHIFT: + case STB_TEXTEDIT_K_PGDOWN: + case STB_TEXTEDIT_K_PGDOWN | STB_TEXTEDIT_K_SHIFT: { + StbFindState find; + StbTexteditRow row; + int i, j, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; + int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGDOWN; + int row_count = is_page ? state->row_count_per_page : 1; + + if (!is_page && state->single_line) { + // on windows, up&down in single-line behave like left&right + key = STB_TEXTEDIT_K_RIGHT | (key & STB_TEXTEDIT_K_SHIFT); + goto retry; + } + + if (sel) + stb_textedit_prep_selection_at_cursor(state); + else if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_last(str, state); + + // compute current position of cursor point + stb_textedit_clamp(str, state); + stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); + + for (j = 0; j < row_count; ++j) { + float x, goal_x = state->has_preferred_x ? state->preferred_x : find.x; + int start = find.first_char + find.length; + + if (find.length == 0) + break; + + // [DEAR IMGUI] + // going down while being on the last line shouldn't bring us to that line end + if (STB_TEXTEDIT_GETCHAR(str, find.first_char + find.length - 1) != STB_TEXTEDIT_NEWLINE) + break; + + // now find character position down a row + state->cursor = start; + STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); + x = row.x0; + for (i=0; i < row.num_chars; ++i) { + float dx = STB_TEXTEDIT_GETWIDTH(str, start, i); + #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE + if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) + break; + #endif + x += dx; + if (x > goal_x) + break; + ++state->cursor; + } + stb_textedit_clamp(str, state); + + state->has_preferred_x = 1; + state->preferred_x = goal_x; + + if (sel) + state->select_end = state->cursor; + + // go to next line + find.first_char = find.first_char + find.length; + find.length = row.num_chars; + } + break; + } + + case STB_TEXTEDIT_K_UP: + case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT: + case STB_TEXTEDIT_K_PGUP: + case STB_TEXTEDIT_K_PGUP | STB_TEXTEDIT_K_SHIFT: { + StbFindState find; + StbTexteditRow row; + int i, j, prev_scan, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; + int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGUP; + int row_count = is_page ? state->row_count_per_page : 1; + + if (!is_page && state->single_line) { + // on windows, up&down become left&right + key = STB_TEXTEDIT_K_LEFT | (key & STB_TEXTEDIT_K_SHIFT); + goto retry; + } + + if (sel) + stb_textedit_prep_selection_at_cursor(state); + else if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_first(state); + + // compute current position of cursor point + stb_textedit_clamp(str, state); + stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); + + for (j = 0; j < row_count; ++j) { + float x, goal_x = state->has_preferred_x ? state->preferred_x : find.x; + + // can only go up if there's a previous row + if (find.prev_first == find.first_char) + break; + + // now find character position up a row + state->cursor = find.prev_first; + STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); + x = row.x0; + for (i=0; i < row.num_chars; ++i) { + float dx = STB_TEXTEDIT_GETWIDTH(str, find.prev_first, i); + #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE + if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) + break; + #endif + x += dx; + if (x > goal_x) + break; + ++state->cursor; + } + stb_textedit_clamp(str, state); + + state->has_preferred_x = 1; + state->preferred_x = goal_x; + + if (sel) + state->select_end = state->cursor; + + // go to previous line + // (we need to scan previous line the hard way. maybe we could expose this as a new API function?) + prev_scan = find.prev_first > 0 ? find.prev_first - 1 : 0; + while (prev_scan > 0 && STB_TEXTEDIT_GETCHAR(str, prev_scan - 1) != STB_TEXTEDIT_NEWLINE) + --prev_scan; + find.first_char = find.prev_first; + find.prev_first = prev_scan; + } + break; + } + + case STB_TEXTEDIT_K_DELETE: + case STB_TEXTEDIT_K_DELETE | STB_TEXTEDIT_K_SHIFT: + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_delete_selection(str, state); + else { + int n = STB_TEXTEDIT_STRINGLEN(str); + if (state->cursor < n) + stb_textedit_delete(str, state, state->cursor, 1); + } + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_BACKSPACE: + case STB_TEXTEDIT_K_BACKSPACE | STB_TEXTEDIT_K_SHIFT: + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_delete_selection(str, state); + else { + stb_textedit_clamp(str, state); + if (state->cursor > 0) { + stb_textedit_delete(str, state, state->cursor-1, 1); + --state->cursor; + } + } + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_TEXTSTART2 + case STB_TEXTEDIT_K_TEXTSTART2: +#endif + case STB_TEXTEDIT_K_TEXTSTART: + state->cursor = state->select_start = state->select_end = 0; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_TEXTEND2 + case STB_TEXTEDIT_K_TEXTEND2: +#endif + case STB_TEXTEDIT_K_TEXTEND: + state->cursor = STB_TEXTEDIT_STRINGLEN(str); + state->select_start = state->select_end = 0; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_TEXTSTART2 + case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT: +#endif + case STB_TEXTEDIT_K_TEXTSTART | STB_TEXTEDIT_K_SHIFT: + stb_textedit_prep_selection_at_cursor(state); + state->cursor = state->select_end = 0; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_TEXTEND2 + case STB_TEXTEDIT_K_TEXTEND2 | STB_TEXTEDIT_K_SHIFT: +#endif + case STB_TEXTEDIT_K_TEXTEND | STB_TEXTEDIT_K_SHIFT: + stb_textedit_prep_selection_at_cursor(state); + state->cursor = state->select_end = STB_TEXTEDIT_STRINGLEN(str); + state->has_preferred_x = 0; + break; + + +#ifdef STB_TEXTEDIT_K_LINESTART2 + case STB_TEXTEDIT_K_LINESTART2: +#endif + case STB_TEXTEDIT_K_LINESTART: + stb_textedit_clamp(str, state); + stb_textedit_move_to_first(state); + if (state->single_line) + state->cursor = 0; + else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE) + --state->cursor; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_LINEEND2 + case STB_TEXTEDIT_K_LINEEND2: +#endif + case STB_TEXTEDIT_K_LINEEND: { + int n = STB_TEXTEDIT_STRINGLEN(str); + stb_textedit_clamp(str, state); + stb_textedit_move_to_first(state); + if (state->single_line) + state->cursor = n; + else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE) + ++state->cursor; + state->has_preferred_x = 0; + break; + } + +#ifdef STB_TEXTEDIT_K_LINESTART2 + case STB_TEXTEDIT_K_LINESTART2 | STB_TEXTEDIT_K_SHIFT: +#endif + case STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT: + stb_textedit_clamp(str, state); + stb_textedit_prep_selection_at_cursor(state); + if (state->single_line) + state->cursor = 0; + else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE) + --state->cursor; + state->select_end = state->cursor; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_LINEEND2 + case STB_TEXTEDIT_K_LINEEND2 | STB_TEXTEDIT_K_SHIFT: +#endif + case STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT: { + int n = STB_TEXTEDIT_STRINGLEN(str); + stb_textedit_clamp(str, state); + stb_textedit_prep_selection_at_cursor(state); + if (state->single_line) + state->cursor = n; + else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE) + ++state->cursor; + state->select_end = state->cursor; + state->has_preferred_x = 0; + break; + } + } +} + +///////////////////////////////////////////////////////////////////////////// +// +// Undo processing +// +// @OPTIMIZE: the undo/redo buffer should be circular + +static void stb_textedit_flush_redo(StbUndoState *state) +{ + state->redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; + state->redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; +} + +// discard the oldest entry in the undo list +static void stb_textedit_discard_undo(StbUndoState *state) +{ + if (state->undo_point > 0) { + // if the 0th undo state has characters, clean those up + if (state->undo_rec[0].char_storage >= 0) { + int n = state->undo_rec[0].insert_length, i; + // delete n characters from all other records + state->undo_char_point -= n; + STB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) (state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE))); + for (i=0; i < state->undo_point; ++i) + if (state->undo_rec[i].char_storage >= 0) + state->undo_rec[i].char_storage -= n; // @OPTIMIZE: get rid of char_storage and infer it + } + --state->undo_point; + STB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) (state->undo_point*sizeof(state->undo_rec[0]))); + } +} + +// discard the oldest entry in the redo list--it's bad if this +// ever happens, but because undo & redo have to store the actual +// characters in different cases, the redo character buffer can +// fill up even though the undo buffer didn't +static void stb_textedit_discard_redo(StbUndoState *state) +{ + int k = STB_TEXTEDIT_UNDOSTATECOUNT-1; + + if (state->redo_point <= k) { + // if the k'th undo state has characters, clean those up + if (state->undo_rec[k].char_storage >= 0) { + int n = state->undo_rec[k].insert_length, i; + // move the remaining redo character data to the end of the buffer + state->redo_char_point += n; + STB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((STB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE))); + // adjust the position of all the other records to account for above memmove + for (i=state->redo_point; i < k; ++i) + if (state->undo_rec[i].char_storage >= 0) + state->undo_rec[i].char_storage += n; + } + // now move all the redo records towards the end of the buffer; the first one is at 'redo_point' + // [DEAR IMGUI] + size_t move_size = (size_t)((STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0])); + const char* buf_begin = (char*)state->undo_rec; (void)buf_begin; + const char* buf_end = (char*)state->undo_rec + sizeof(state->undo_rec); (void)buf_end; + IM_ASSERT(((char*)(state->undo_rec + state->redo_point)) >= buf_begin); + IM_ASSERT(((char*)(state->undo_rec + state->redo_point + 1) + move_size) <= buf_end); + STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size); + + // now move redo_point to point to the new one + ++state->redo_point; + } +} + +static StbUndoRecord *stb_text_create_undo_record(StbUndoState *state, int numchars) +{ + // any time we create a new undo record, we discard redo + stb_textedit_flush_redo(state); + + // if we have no free records, we have to make room, by sliding the + // existing records down + if (state->undo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + stb_textedit_discard_undo(state); + + // if the characters to store won't possibly fit in the buffer, we can't undo + if (numchars > STB_TEXTEDIT_UNDOCHARCOUNT) { + state->undo_point = 0; + state->undo_char_point = 0; + return NULL; + } + + // if we don't have enough free characters in the buffer, we have to make room + while (state->undo_char_point + numchars > STB_TEXTEDIT_UNDOCHARCOUNT) + stb_textedit_discard_undo(state); + + return &state->undo_rec[state->undo_point++]; +} + +static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len) +{ + StbUndoRecord *r = stb_text_create_undo_record(state, insert_len); + if (r == NULL) + return NULL; + + r->where = pos; + r->insert_length = (STB_TEXTEDIT_POSITIONTYPE) insert_len; + r->delete_length = (STB_TEXTEDIT_POSITIONTYPE) delete_len; + + if (insert_len == 0) { + r->char_storage = -1; + return NULL; + } else { + r->char_storage = state->undo_char_point; + state->undo_char_point += insert_len; + return &state->undo_char[r->char_storage]; + } +} + +static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + StbUndoState *s = &state->undostate; + StbUndoRecord u, *r; + if (s->undo_point == 0) + return; + + // we need to do two things: apply the undo record, and create a redo record + u = s->undo_rec[s->undo_point-1]; + r = &s->undo_rec[s->redo_point-1]; + r->char_storage = -1; + + r->insert_length = u.delete_length; + r->delete_length = u.insert_length; + r->where = u.where; + + if (u.delete_length) { + // if the undo record says to delete characters, then the redo record will + // need to re-insert the characters that get deleted, so we need to store + // them. + + // there are three cases: + // there's enough room to store the characters + // characters stored for *redoing* don't leave room for redo + // characters stored for *undoing* don't leave room for redo + // if the last is true, we have to bail + + if (s->undo_char_point + u.delete_length >= STB_TEXTEDIT_UNDOCHARCOUNT) { + // the undo records take up too much character space; there's no space to store the redo characters + r->insert_length = 0; + } else { + int i; + + // there's definitely room to store the characters eventually + while (s->undo_char_point + u.delete_length > s->redo_char_point) { + // should never happen: + if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + return; + // there's currently not enough room, so discard a redo record + stb_textedit_discard_redo(s); + } + r = &s->undo_rec[s->redo_point-1]; + + r->char_storage = s->redo_char_point - u.delete_length; + s->redo_char_point = s->redo_char_point - u.delete_length; + + // now save the characters + for (i=0; i < u.delete_length; ++i) + s->undo_char[r->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u.where + i); + } + + // now we can carry out the deletion + STB_TEXTEDIT_DELETECHARS(str, u.where, u.delete_length); + } + + // check type of recorded action: + if (u.insert_length) { + // easy case: was a deletion, so we need to insert n characters + STB_TEXTEDIT_INSERTCHARS(str, u.where, &s->undo_char[u.char_storage], u.insert_length); + s->undo_char_point -= u.insert_length; + } + + state->cursor = u.where + u.insert_length; + + s->undo_point--; + s->redo_point--; +} + +static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + StbUndoState *s = &state->undostate; + StbUndoRecord *u, r; + if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + return; + + // we need to do two things: apply the redo record, and create an undo record + u = &s->undo_rec[s->undo_point]; + r = s->undo_rec[s->redo_point]; + + // we KNOW there must be room for the undo record, because the redo record + // was derived from an undo record + + u->delete_length = r.insert_length; + u->insert_length = r.delete_length; + u->where = r.where; + u->char_storage = -1; + + if (r.delete_length) { + // the redo record requires us to delete characters, so the undo record + // needs to store the characters + + if (s->undo_char_point + u->insert_length > s->redo_char_point) { + u->insert_length = 0; + u->delete_length = 0; + } else { + int i; + u->char_storage = s->undo_char_point; + s->undo_char_point = s->undo_char_point + u->insert_length; + + // now save the characters + for (i=0; i < u->insert_length; ++i) + s->undo_char[u->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u->where + i); + } + + STB_TEXTEDIT_DELETECHARS(str, r.where, r.delete_length); + } + + if (r.insert_length) { + // easy case: need to insert n characters + STB_TEXTEDIT_INSERTCHARS(str, r.where, &s->undo_char[r.char_storage], r.insert_length); + s->redo_char_point += r.insert_length; + } + + state->cursor = r.where + r.insert_length; + + s->undo_point++; + s->redo_point++; +} + +static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length) +{ + stb_text_createundo(&state->undostate, where, 0, length); +} + +static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length) +{ + int i; + STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0); + if (p) { + for (i=0; i < length; ++i) + p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); + } +} + +static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length) +{ + int i; + STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length); + if (p) { + for (i=0; i < old_length; ++i) + p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); + } +} + +// reset the state to default +static void stb_textedit_clear_state(STB_TexteditState *state, int is_single_line) +{ + state->undostate.undo_point = 0; + state->undostate.undo_char_point = 0; + state->undostate.redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; + state->undostate.redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; + state->select_end = state->select_start = 0; + state->cursor = 0; + state->has_preferred_x = 0; + state->preferred_x = 0; + state->cursor_at_end_of_line = 0; + state->initialized = 1; + state->single_line = (unsigned char) is_single_line; + state->insert_mode = 0; + state->row_count_per_page = 0; +} + +// API initialize +static void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line) +{ + stb_textedit_clear_state(state, is_single_line); +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +static int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE const *ctext, int len) +{ + return stb_textedit_paste_internal(str, state, (STB_TEXTEDIT_CHARTYPE *) ctext, len); +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + +#endif//STB_TEXTEDIT_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/3rdparty/imgui/src/imgui.cpp b/3rdparty/imgui/src/imgui.cpp new file mode 100644 index 0000000000..0e2a860851 --- /dev/null +++ b/3rdparty/imgui/src/imgui.cpp @@ -0,0 +1,13277 @@ +// dear imgui, 1.88 WIP +// (main code and documentation) + +// Help: +// - Read FAQ at http://dearimgui.org/faq +// - Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase. +// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. +// Read imgui.cpp for details, links and comments. + +// Resources: +// - FAQ http://dearimgui.org/faq +// - Homepage & latest https://github.com/ocornut/imgui +// - Releases & changelog https://github.com/ocornut/imgui/releases +// - Gallery https://github.com/ocornut/imgui/issues/5243 (please post your screenshots/video there!) +// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Issues & support https://github.com/ocornut/imgui/issues + +// Getting Started? +// - For first-time users having issues compiling/linking/running or issues loading fonts: +// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. + +// Developed by Omar Cornut and every direct or indirect contributors to the GitHub. +// See LICENSE.txt for copyright and licensing details (standard MIT License). +// This library is free but needs your support to sustain development and maintenance. +// Businesses: you can support continued development via invoiced technical support, maintenance and sponsoring contracts. Please reach out to "contact AT dearimgui.com". +// Individuals: you can support continued development via donations. See docs/README or web page. + +// It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library. +// Note that 'ImGui::' being a namespace, you can add functions into the namespace from your own source files, without +// modifying imgui.h or imgui.cpp. You may include imgui_internal.h to access internal data structures, but it doesn't +// come with any guarantee of forward compatibility. Discussing your changes on the GitHub Issue Tracker may lead you +// to a better solution or official support for them. + +/* + +Index of this file: + +DOCUMENTATION + +- MISSION STATEMENT +- END-USER GUIDE +- PROGRAMMER GUIDE + - READ FIRST + - HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI + - GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE + - HOW A SIMPLE APPLICATION MAY LOOK LIKE + - HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE + - USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS +- API BREAKING CHANGES (read me when you update!) +- FREQUENTLY ASKED QUESTIONS (FAQ) + - Read all answers online: https://www.dearimgui.org/faq, or in docs/FAQ.md (with a Markdown viewer) + +CODE +(search for "[SECTION]" in the code to find them) + +// [SECTION] INCLUDES +// [SECTION] FORWARD DECLARATIONS +// [SECTION] CONTEXT AND MEMORY ALLOCATORS +// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) +// [SECTION] MISC HELPERS/UTILITIES (Geometry functions) +// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions) +// [SECTION] MISC HELPERS/UTILITIES (File functions) +// [SECTION] MISC HELPERS/UTILITIES (ImText* functions) +// [SECTION] MISC HELPERS/UTILITIES (Color functions) +// [SECTION] ImGuiStorage +// [SECTION] ImGuiTextFilter +// [SECTION] ImGuiTextBuffer +// [SECTION] ImGuiListClipper +// [SECTION] STYLING +// [SECTION] RENDER HELPERS +// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!) +// [SECTION] INPUTS +// [SECTION] ERROR CHECKING +// [SECTION] LAYOUT +// [SECTION] SCROLLING +// [SECTION] TOOLTIPS +// [SECTION] POPUPS +// [SECTION] KEYBOARD/GAMEPAD NAVIGATION +// [SECTION] DRAG AND DROP +// [SECTION] LOGGING/CAPTURING +// [SECTION] SETTINGS +// [SECTION] VIEWPORTS +// [SECTION] PLATFORM DEPENDENT HELPERS +// [SECTION] METRICS/DEBUGGER WINDOW +// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) + +*/ + +//----------------------------------------------------------------------------- +// DOCUMENTATION +//----------------------------------------------------------------------------- + +/* + + MISSION STATEMENT + ================= + + - Easy to use to create code-driven and data-driven tools. + - Easy to use to create ad hoc short-lived tools and long-lived, more elaborate tools. + - Easy to hack and improve. + - Minimize setup and maintenance. + - Minimize state storage on user side. + - Minimize state synchronization. + - Portable, minimize dependencies, run on target (consoles, phones, etc.). + - Efficient runtime and memory consumption. + + Designed for developers and content-creators, not the typical end-user! Some of the current weaknesses includes: + + - Doesn't look fancy, doesn't animate. + - Limited layout features, intricate layouts are typically crafted in code. + + + END-USER GUIDE + ============== + + - Double-click on title bar to collapse window. + - Click upper right corner to close a window, available when 'bool* p_open' is passed to ImGui::Begin(). + - Click and drag on lower right corner to resize window (double-click to auto fit window to its contents). + - Click and drag on any empty space to move window. + - TAB/SHIFT+TAB to cycle through keyboard editable fields. + - CTRL+Click on a slider or drag box to input value as text. + - Use mouse wheel to scroll. + - Text editor: + - Hold SHIFT or use mouse to select text. + - CTRL+Left/Right to word jump. + - CTRL+Shift+Left/Right to select words. + - CTRL+A our Double-Click to select all. + - CTRL+X,CTRL+C,CTRL+V to use OS clipboard/ + - CTRL+Z,CTRL+Y to undo/redo. + - ESCAPE to revert text to its original value. + - Controls are automatically adjusted for OSX to match standard OSX text editing operations. + - General Keyboard controls: enable with ImGuiConfigFlags_NavEnableKeyboard. + - General Gamepad controls: enable with ImGuiConfigFlags_NavEnableGamepad. See suggested mappings in imgui.h ImGuiNavInput_ + download PNG/PSD at http://dearimgui.org/controls_sheets + + + PROGRAMMER GUIDE + ================ + + READ FIRST + ---------- + - Remember to check the wonderful Wiki (https://github.com/ocornut/imgui/wiki) + - Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction or + destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, fewer bugs. + - Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features. + - The library is designed to be built from sources. Avoid pre-compiled binaries and packaged versions. See imconfig.h to configure your build. + - Dear ImGui is an implementation of the IMGUI paradigm (immediate-mode graphical user interface, a term coined by Casey Muratori). + You can learn about IMGUI principles at http://www.johno.se/book/imgui.html, http://mollyrocket.com/861 & more links in Wiki. + - Dear ImGui is a "single pass" rasterizing implementation of the IMGUI paradigm, aimed at ease of use and high-performances. + For every application frame, your UI code will be called only once. This is in contrast to e.g. Unity's implementation of an IMGUI, + where the UI code is called multiple times ("multiple passes") from a single entry point. There are pros and cons to both approaches. + - Our origin is on the top-left. In axis aligned bounding boxes, Min = top-left, Max = bottom-right. + - This codebase is also optimized to yield decent performances with typical "Debug" builds settings. + - Please make sure you have asserts enabled (IM_ASSERT redirects to assert() by default, but can be redirected). + If you get an assert, read the messages and comments around the assert. + - C++: this is a very C-ish codebase: we don't rely on C++11, we don't include any C++ headers, and ImGui:: is a namespace. + - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types. + See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that. + However, imgui_internal.h can optionally export math operators for ImVec2/ImVec4, which we use in this codebase. + - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction (avoid using it in your code!). + + + HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI + ---------------------------------------------- + - Overwrite all the sources files except for imconfig.h (if you have modified your copy of imconfig.h) + - Or maintain your own branch where you have imconfig.h modified as a top-most commit which you can regularly rebase over "master". + - You can also use '#define IMGUI_USER_CONFIG "my_config_file.h" to redirect configuration to your own file. + - Read the "API BREAKING CHANGES" section (below). This is where we list occasional API breaking changes. + If a function/type has been renamed / or marked obsolete, try to fix the name in your code before it is permanently removed + from the public API. If you have a problem with a missing function/symbols, search for its name in the code, there will + likely be a comment about it. Please report any issue to the GitHub page! + - To find out usage of old API, you can add '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in your configuration file. + - Try to keep your copy of Dear ImGui reasonably up to date. + + + GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE + --------------------------------------------------------------- + - Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library. + - In the majority of cases you should be able to use unmodified backends files available in the backends/ folder. + - Add the Dear ImGui source files + selected backend source files to your projects or using your preferred build system. + It is recommended you build and statically link the .cpp files as part of your project and NOT as a shared library (DLL). + - You can later customize the imconfig.h file to tweak some compile-time behavior, such as integrating Dear ImGui types with your own maths types. + - When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them. + - Dear ImGui never touches or knows about your GPU state. The only function that knows about GPU is the draw function that you provide. + Effectively it means you can create widgets at any time in your code, regardless of considerations of being in "update" vs "render" + phases of your own application. All rendering information is stored into command-lists that you will retrieve after calling ImGui::Render(). + - Refer to the backends and demo applications in the examples/ folder for instruction on how to setup your code. + - If you are running over a standard OS with a common graphics API, you should be able to use unmodified imgui_impl_*** files from the examples/ folder. + + + HOW A SIMPLE APPLICATION MAY LOOK LIKE + -------------------------------------- + EXHIBIT 1: USING THE EXAMPLE BACKENDS (= imgui_impl_XXX.cpp files from the backends/ folder). + The sub-folders in examples/ contain examples applications following this structure. + + // Application init: create a dear imgui context, setup some options, load fonts + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls. + // TODO: Fill optional fields of the io structure later. + // TODO: Load TTF/OTF fonts if you don't want to use the default font. + + // Initialize helper Platform and Renderer backends (here we are using imgui_impl_win32.cpp and imgui_impl_dx11.cpp) + ImGui_ImplWin32_Init(hwnd); + ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); + + // Application main loop + while (true) + { + // Feed inputs to dear imgui, start new frame + ImGui_ImplDX11_NewFrame(); + ImGui_ImplWin32_NewFrame(); + ImGui::NewFrame(); + + // Any application code here + ImGui::Text("Hello, world!"); + + // Render dear imgui into screen + ImGui::Render(); + ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); + g_pSwapChain->Present(1, 0); + } + + // Shutdown + ImGui_ImplDX11_Shutdown(); + ImGui_ImplWin32_Shutdown(); + ImGui::DestroyContext(); + + EXHIBIT 2: IMPLEMENTING CUSTOM BACKEND / CUSTOM ENGINE + + // Application init: create a dear imgui context, setup some options, load fonts + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls. + // TODO: Fill optional fields of the io structure later. + // TODO: Load TTF/OTF fonts if you don't want to use the default font. + + // Build and load the texture atlas into a texture + // (In the examples/ app this is usually done within the ImGui_ImplXXX_Init() function from one of the demo Renderer) + int width, height; + unsigned char* pixels = NULL; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + + // At this point you've got the texture data and you need to upload that to your graphic system: + // After we have created the texture, store its pointer/identifier (_in whichever format your engine uses_) in 'io.Fonts->TexID'. + // This will be passed back to your via the renderer. Basically ImTextureID == void*. Read FAQ for details about ImTextureID. + MyTexture* texture = MyEngine::CreateTextureFromMemoryPixels(pixels, width, height, TEXTURE_TYPE_RGBA32) + io.Fonts->SetTexID((void*)texture); + + // Application main loop + while (true) + { + // Setup low-level inputs, e.g. on Win32: calling GetKeyboardState(), or write to those fields from your Windows message handlers, etc. + // (In the examples/ app this is usually done within the ImGui_ImplXXX_NewFrame() function from one of the demo Platform Backends) + io.DeltaTime = 1.0f/60.0f; // set the time elapsed since the previous frame (in seconds) + io.DisplaySize.x = 1920.0f; // set the current display width + io.DisplaySize.y = 1280.0f; // set the current display height here + io.AddMousePosEvent(mouse_x, mouse_y); // update mouse position + io.AddMouseButtonEvent(0, mouse_b[0]); // update mouse button states + io.AddMouseButtonEvent(1, mouse_b[1]); // update mouse button states + + // Call NewFrame(), after this point you can use ImGui::* functions anytime + // (So you want to try calling NewFrame() as early as you can in your main loop to be able to use Dear ImGui everywhere) + ImGui::NewFrame(); + + // Most of your application code here + ImGui::Text("Hello, world!"); + MyGameUpdate(); // may use any Dear ImGui functions, e.g. ImGui::Begin("My window"); ImGui::Text("Hello, world!"); ImGui::End(); + MyGameRender(); // may use any Dear ImGui functions as well! + + // Render dear imgui, swap buffers + // (You want to try calling EndFrame/Render as late as you can, to be able to use Dear ImGui in your own game rendering code) + ImGui::EndFrame(); + ImGui::Render(); + ImDrawData* draw_data = ImGui::GetDrawData(); + MyImGuiRenderFunction(draw_data); + SwapBuffers(); + } + + // Shutdown + ImGui::DestroyContext(); + + To decide whether to dispatch mouse/keyboard inputs to Dear ImGui to the rest of your application, + you should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! + Please read the FAQ and example applications for details about this! + + + HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE + --------------------------------------------- + The backends in impl_impl_XXX.cpp files contain many working implementations of a rendering function. + + void void MyImGuiRenderFunction(ImDrawData* draw_data) + { + // TODO: Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled + // TODO: Setup texture sampling state: sample with bilinear filtering (NOT point/nearest filtering). Use 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines;' to allow point/nearest filtering. + // TODO: Setup viewport covering draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize + // TODO: Setup orthographic projection matrix cover draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize + // TODO: Setup shader: vertex { float2 pos, float2 uv, u32 color }, fragment shader sample color from 1 texture, multiply by vertex color. + ImVec2 clip_off = draw_data->DisplayPos; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; // vertex buffer generated by Dear ImGui + const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; // index buffer generated by Dear ImGui + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback) + { + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); + ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // We are using scissoring to clip some objects. All low-level graphics API should support it. + // - If your engine doesn't support scissoring yet, you may ignore this at first. You will get some small glitches + // (some elements visible outside their bounds) but you can fix that once everything else works! + // - Clipping coordinates are provided in imgui coordinates space: + // - For a given viewport, draw_data->DisplayPos == viewport->Pos and draw_data->DisplaySize == viewport->Size + // - In a single viewport application, draw_data->DisplayPos == (0,0) and draw_data->DisplaySize == io.DisplaySize, but always use GetMainViewport()->Pos/Size instead of hardcoding those values. + // - In the interest of supporting multi-viewport applications (see 'docking' branch on github), + // always subtract draw_data->DisplayPos from clipping bounds to convert them to your viewport space. + // - Note that pcmd->ClipRect contains Min+Max bounds. Some graphics API may use Min+Max, other may use Min+Size (size being Max-Min) + MyEngineSetScissor(clip_min.x, clip_min.y, clip_max.x, clip_max.y); + + // The texture for the draw call is specified by pcmd->GetTexID(). + // The vast majority of draw calls will use the Dear ImGui texture atlas, which value you have set yourself during initialization. + MyEngineBindTexture((MyTexture*)pcmd->GetTexID()); + + // Render 'pcmd->ElemCount/3' indexed triangles. + // By default the indices ImDrawIdx are 16-bit, you can change them to 32-bit in imconfig.h if your engine doesn't support 16-bit indices. + MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer + pcmd->IdxOffset, vtx_buffer, pcmd->VtxOffset); + } + } + } + } + + + USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS + ------------------------------------------ + - The gamepad/keyboard navigation is fairly functional and keeps being improved. + - Gamepad support is particularly useful to use Dear ImGui on a console system (e.g. PS4, Switch, XB1) without a mouse! + - You can ask questions and report issues at https://github.com/ocornut/imgui/issues/787 + - The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable. + - Keyboard: + - Application: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard to enable. + - Internally: NewFrame() will automatically fill io.NavInputs[] based on backend's io.AddKeyEvent() calls. + - When keyboard navigation is active (io.NavActive + ImGuiConfigFlags_NavEnableKeyboard), + the io.WantCaptureKeyboard flag will be set. For more advanced uses, you may want to read from: + - io.NavActive: true when a window is focused and it doesn't have the ImGuiWindowFlags_NoNavInputs flag set. + - io.NavVisible: true when the navigation cursor is visible (and usually goes false when mouse is used). + - or query focus information with e.g. IsWindowFocused(ImGuiFocusedFlags_AnyWindow), IsItemFocused() etc. functions. + Please reach out if you think the game vs navigation input sharing could be improved. + - Gamepad: + - Application: Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable. + - Backend: Set io.BackendFlags |= ImGuiBackendFlags_HasGamepad + call io.AddKeyEvent/AddKeyAnalogEvent() with ImGuiKey_Gamepad_XXX keys. + For analog values (0.0f to 1.0f), backend is responsible to handling a dead-zone and rescaling inputs accordingly. + Backend code will probably need to transform your raw inputs (such as e.g. remapping your 0.2..0.9 raw input range to 0.0..1.0 imgui range, etc.). + - Internally: NewFrame() will automatically fill io.NavInputs[] based on backend's io.AddKeyEvent() + io.AddKeyAnalogEvent() calls. + - BEFORE 1.87, BACKENDS USED TO WRITE DIRECTLY TO io.NavInputs[]. This is going to be obsoleted in the future. Please call io functions instead! + - You can download PNG/PSD files depicting the gamepad controls for common controllers at: http://dearimgui.org/controls_sheets + - If you need to share inputs between your game and the Dear ImGui interface, the easiest approach is to go all-or-nothing, + with a buttons combo to toggle the target. Please reach out if you think the game vs navigation input sharing could be improved. + - Mouse: + - PS4/PS5 users: Consider emulating a mouse cursor with DualShock4 touch pad or a spare analog stick as a mouse-emulation fallback. + - Consoles/Tablet/Phone users: Consider using a Synergy 1.x server (on your PC) + uSynergy.c (on your console/tablet/phone app) to share your PC mouse/keyboard. + - On a TV/console system where readability may be lower or mouse inputs may be awkward, you may want to set the ImGuiConfigFlags_NavEnableSetMousePos flag. + Enabling ImGuiConfigFlags_NavEnableSetMousePos + ImGuiBackendFlags_HasSetMousePos instructs dear imgui to move your mouse cursor along with navigation movements. + When enabled, the NewFrame() function may alter 'io.MousePos' and set 'io.WantSetMousePos' to notify you that it wants the mouse cursor to be moved. + When that happens your backend NEEDS to move the OS or underlying mouse cursor on the next frame. Some of the backends in examples/ do that. + (If you set the NavEnableSetMousePos flag but don't honor 'io.WantSetMousePos' properly, imgui will misbehave as it will see your mouse moving back and forth!) + (In a setup when you may not have easy control over the mouse cursor, e.g. uSynergy.c doesn't expose moving remote mouse cursor, you may want + to set a boolean to ignore your other external mouse positions until the external source is moved again.) + + + API BREAKING CHANGES + ==================== + + Occasionally introducing changes that are breaking the API. We try to make the breakage minor and easy to fix. + Below is a change-log of API breaking changes only. If you are using one of the functions listed, expect to have to fix some code. + When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files. + You can read releases logs https://github.com/ocornut/imgui/releases for more details. + + - 2022/05/03 (1.88) - backends: osx: removed ImGui_ImplOSX_HandleEvent() from backend API in favor of backend automatically handling event capture. All ImGui_ImplOSX_HandleEvent() calls should be removed as they are now unnecessary. + - 2022/04/05 (1.88) - inputs: renamed ImGuiKeyModFlags to ImGuiModFlags. Kept inline redirection enums (will obsolete). This was never used in public API functions but technically present in imgui.h and ImGuiIO. + - 2022/01/20 (1.87) - inputs: reworded gamepad IO. + - Backend writing to io.NavInputs[] -> backend should call io.AddKeyEvent()/io.AddKeyAnalogEvent() with ImGuiKey_GamepadXXX values. + - 2022/01/19 (1.87) - sliders, drags: removed support for legacy arithmetic operators (+,+-,*,/) when inputing text. This doesn't break any api/code but a feature that used to be accessible by end-users (which seemingly no one used). + - 2022/01/17 (1.87) - inputs: reworked mouse IO. + - Backend writing to io.MousePos -> backend should call io.AddMousePosEvent() + - Backend writing to io.MouseDown[] -> backend should call io.AddMouseButtonEvent() + - Backend writing to io.MouseWheel -> backend should call io.AddMouseWheelEvent() + - Backend writing to io.MouseHoveredViewport -> backend should call io.AddMouseViewportEvent() [Docking branch w/ multi-viewports only] + note: for all calls to IO new functions, the Dear ImGui context should be bound/current. + - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details. + - IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX) + - IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX) + - Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() + - Backend writing to io.KeyCtrl, io.KeyShift.. -> backend should call io.AddKeyEvent() with ImGuiKey_ModXXX values. *IF YOU PULLED CODE BETWEEN 2021/01/10 and 2021/01/27: We used to have a io.AddKeyModsEvent() function which was now replaced by io.AddKeyEvent() with ImGuiKey_ModXXX values.* + - one case won't work with backward compatibility: if your custom backend used ImGuiKey as mock native indices (e.g. "io.KeyMap[ImGuiKey_A] = ImGuiKey_A") because those values are now larger than the legacy KeyDown[] array. Will assert. + - inputs: added ImGuiKey_ModCtrl/ImGuiKey_ModShift/ImGuiKey_ModAlt/ImGuiKey_ModSuper values to submit keyboard modifiers using io.AddKeyEvent(), instead of writing directly to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper. + - 2022/01/05 (1.87) - inputs: renamed ImGuiKey_KeyPadEnter to ImGuiKey_KeypadEnter to align with new symbols. Kept redirection enum. + - 2022/01/05 (1.87) - removed io.ImeSetInputScreenPosFn() in favor of more flexible io.SetPlatformImeDataFn(). Removed 'void* io.ImeWindowHandle' in favor of writing to 'void* ImGuiViewport::PlatformHandleRaw'. + - 2022/01/01 (1.87) - commented out redirecting functions/enums names that were marked obsolete in 1.69, 1.70, 1.71, 1.72 (March-July 2019) + - ImGui::SetNextTreeNodeOpen() -> use ImGui::SetNextItemOpen() + - ImGui::GetContentRegionAvailWidth() -> use ImGui::GetContentRegionAvail().x + - ImGui::TreeAdvanceToLabelPos() -> use ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetTreeNodeToLabelSpacing()); + - ImFontAtlas::CustomRect -> use ImFontAtlasCustomRect + - ImGuiColorEditFlags_RGB/HSV/HEX -> use ImGuiColorEditFlags_DisplayRGB/HSV/Hex + - 2021/12/20 (1.86) - backends: removed obsolete Marmalade backend (imgui_impl_marmalade.cpp) + example. Find last supported version at https://github.com/ocornut/imgui/wiki/Bindings + - 2021/11/04 (1.86) - removed CalcListClipping() function. Prefer using ImGuiListClipper which can return non-contiguous ranges. Please open an issue if you think you really need this function. + - 2021/08/23 (1.85) - removed GetWindowContentRegionWidth() function. keep inline redirection helper. can use 'GetWindowContentRegionMax().x - GetWindowContentRegionMin().x' instead for generally 'GetContentRegionAvail().x' is more useful. + - 2021/07/26 (1.84) - commented out redirecting functions/enums names that were marked obsolete in 1.67 and 1.69 (March 2019): + - ImGui::GetOverlayDrawList() -> use ImGui::GetForegroundDrawList() + - ImFont::GlyphRangesBuilder -> use ImFontGlyphRangesBuilder + - 2021/05/19 (1.83) - backends: obsoleted direct access to ImDrawCmd::TextureId in favor of calling ImDrawCmd::GetTexID(). + - if you are using official backends from the source tree: you have nothing to do. + - if you have copied old backend code or using your own: change access to draw_cmd->TextureId to draw_cmd->GetTexID(). + - 2021/03/12 (1.82) - upgraded ImDrawList::AddRect(), AddRectFilled(), PathRect() to use ImDrawFlags instead of ImDrawCornersFlags. + - ImDrawCornerFlags_TopLeft -> use ImDrawFlags_RoundCornersTopLeft + - ImDrawCornerFlags_BotRight -> use ImDrawFlags_RoundCornersBottomRight + - ImDrawCornerFlags_None -> use ImDrawFlags_RoundCornersNone etc. + flags now sanely defaults to 0 instead of 0x0F, consistent with all other flags in the API. + breaking: the default with rounding > 0.0f is now "round all corners" vs old implicit "round no corners": + - rounding == 0.0f + flags == 0 --> meant no rounding --> unchanged (common use) + - rounding > 0.0f + flags != 0 --> meant rounding --> unchanged (common use) + - rounding == 0.0f + flags != 0 --> meant no rounding --> unchanged (unlikely use) + - rounding > 0.0f + flags == 0 --> meant no rounding --> BREAKING (unlikely use): will now round all corners --> use ImDrawFlags_RoundCornersNone or rounding == 0.0f. + this ONLY matters for hard coded use of 0 + rounding > 0.0f. Use of named ImDrawFlags_RoundCornersNone (new) or ImDrawCornerFlags_None (old) are ok. + the old ImDrawCornersFlags used awkward default values of ~0 or 0xF (4 lower bits set) to signify "round all corners" and we sometimes encouraged using them as shortcuts. + legacy path still support use of hard coded ~0 or any value from 0x1 or 0xF. They will behave the same with legacy paths enabled (will assert otherwise). + - 2021/03/11 (1.82) - removed redirecting functions/enums names that were marked obsolete in 1.66 (September 2018): + - ImGui::SetScrollHere() -> use ImGui::SetScrollHereY() + - 2021/03/11 (1.82) - clarified that ImDrawList::PathArcTo(), ImDrawList::PathArcToFast() won't render with radius < 0.0f. Previously it sorts of accidentally worked but would generally lead to counter-clockwise paths and have an effect on anti-aliasing. + - 2021/03/10 (1.82) - upgraded ImDrawList::AddPolyline() and PathStroke() "bool closed" parameter to "ImDrawFlags flags". The matching ImDrawFlags_Closed value is guaranteed to always stay == 1 in the future. + - 2021/02/22 (1.82) - (*undone in 1.84*) win32+mingw: Re-enabled IME functions by default even under MinGW. In July 2016, issue #738 had me incorrectly disable those default functions for MinGW. MinGW users should: either link with -limm32, either set their imconfig file with '#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS'. + - 2021/02/17 (1.82) - renamed rarely used style.CircleSegmentMaxError (old default = 1.60f) to style.CircleTessellationMaxError (new default = 0.30f) as the meaning of the value changed. + - 2021/02/03 (1.81) - renamed ListBoxHeader(const char* label, ImVec2 size) to BeginListBox(). Kept inline redirection function (will obsolete). + - removed ListBoxHeader(const char* label, int items_count, int height_in_items = -1) in favor of specifying size. Kept inline redirection function (will obsolete). + - renamed ListBoxFooter() to EndListBox(). Kept inline redirection function (will obsolete). + - 2021/01/26 (1.81) - removed ImGuiFreeType::BuildFontAtlas(). Kept inline redirection function. Prefer using '#define IMGUI_ENABLE_FREETYPE', but there's a runtime selection path available too. The shared extra flags parameters (very rarely used) are now stored in ImFontAtlas::FontBuilderFlags. + - renamed ImFontConfig::RasterizerFlags (used by FreeType) to ImFontConfig::FontBuilderFlags. + - renamed ImGuiFreeType::XXX flags to ImGuiFreeTypeBuilderFlags_XXX for consistency with other API. + - 2020/10/12 (1.80) - removed redirecting functions/enums that were marked obsolete in 1.63 (August 2018): + - ImGui::IsItemDeactivatedAfterChange() -> use ImGui::IsItemDeactivatedAfterEdit(). + - ImGuiCol_ModalWindowDarkening -> use ImGuiCol_ModalWindowDimBg + - ImGuiInputTextCallback -> use ImGuiTextEditCallback + - ImGuiInputTextCallbackData -> use ImGuiTextEditCallbackData + - 2020/12/21 (1.80) - renamed ImDrawList::AddBezierCurve() to AddBezierCubic(), and PathBezierCurveTo() to PathBezierCubicCurveTo(). Kept inline redirection function (will obsolete). + - 2020/12/04 (1.80) - added imgui_tables.cpp file! Manually constructed project files will need the new file added! + - 2020/11/18 (1.80) - renamed undocumented/internals ImGuiColumnsFlags_* to ImGuiOldColumnFlags_* in prevision of incoming Tables API. + - 2020/11/03 (1.80) - renamed io.ConfigWindowsMemoryCompactTimer to io.ConfigMemoryCompactTimer as the feature will apply to other data structures + - 2020/10/14 (1.80) - backends: moved all backends files (imgui_impl_XXXX.cpp, imgui_impl_XXXX.h) from examples/ to backends/. + - 2020/10/12 (1.80) - removed redirecting functions/enums that were marked obsolete in 1.60 (April 2018): + - io.RenderDrawListsFn pointer -> use ImGui::GetDrawData() value and call the render function of your backend + - ImGui::IsAnyWindowFocused() -> use ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow) + - ImGui::IsAnyWindowHovered() -> use ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow) + - ImGuiStyleVar_Count_ -> use ImGuiStyleVar_COUNT + - ImGuiMouseCursor_Count_ -> use ImGuiMouseCursor_COUNT + - removed redirecting functions names that were marked obsolete in 1.61 (May 2018): + - InputFloat (... int decimal_precision ...) -> use InputFloat (... const char* format ...) with format = "%.Xf" where X is your value for decimal_precision. + - same for InputFloat2()/InputFloat3()/InputFloat4() variants taking a `int decimal_precision` parameter. + - 2020/10/05 (1.79) - removed ImGuiListClipper: Renamed constructor parameters which created an ambiguous alternative to using the ImGuiListClipper::Begin() function, with misleading edge cases (note: imgui_memory_editor <0.40 from imgui_club/ used this old clipper API. Update your copy if needed). + - 2020/09/25 (1.79) - renamed ImGuiSliderFlags_ClampOnInput to ImGuiSliderFlags_AlwaysClamp. Kept redirection enum (will obsolete sooner because previous name was added recently). + - 2020/09/25 (1.79) - renamed style.TabMinWidthForUnselectedCloseButton to style.TabMinWidthForCloseButton. + - 2020/09/21 (1.79) - renamed OpenPopupContextItem() back to OpenPopupOnItemClick(), reverting the change from 1.77. For varieties of reason this is more self-explanatory. + - 2020/09/21 (1.79) - removed return value from OpenPopupOnItemClick() - returned true on mouse release on an item - because it is inconsistent with other popup APIs and makes others misleading. It's also and unnecessary: you can use IsWindowAppearing() after BeginPopup() for a similar result. + - 2020/09/17 (1.79) - removed ImFont::DisplayOffset in favor of ImFontConfig::GlyphOffset. DisplayOffset was applied after scaling and not very meaningful/useful outside of being needed by the default ProggyClean font. If you scaled this value after calling AddFontDefault(), this is now done automatically. It was also getting in the way of better font scaling, so let's get rid of it now! + - 2020/08/17 (1.78) - obsoleted use of the trailing 'float power=1.0f' parameter for DragFloat(), DragFloat2(), DragFloat3(), DragFloat4(), DragFloatRange2(), DragScalar(), DragScalarN(), SliderFloat(), SliderFloat2(), SliderFloat3(), SliderFloat4(), SliderScalar(), SliderScalarN(), VSliderFloat() and VSliderScalar(). + replaced the 'float power=1.0f' argument with integer-based flags defaulting to 0 (as with all our flags). + worked out a backward-compatibility scheme so hopefully most C++ codebase should not be affected. in short, when calling those functions: + - if you omitted the 'power' parameter (likely!), you are not affected. + - if you set the 'power' parameter to 1.0f (same as previous default value): 1/ your compiler may warn on float>int conversion, 2/ everything else will work. 3/ you can replace the 1.0f value with 0 to fix the warning, and be technically correct. + - if you set the 'power' parameter to >1.0f (to enable non-linear editing): 1/ your compiler may warn on float>int conversion, 2/ code will assert at runtime, 3/ in case asserts are disabled, the code will not crash and enable the _Logarithmic flag. 4/ you can replace the >1.0f value with ImGuiSliderFlags_Logarithmic to fix the warning/assert and get a _similar_ effect as previous uses of power >1.0f. + see https://github.com/ocornut/imgui/issues/3361 for all details. + kept inline redirection functions (will obsolete) apart for: DragFloatRange2(), VSliderFloat(), VSliderScalar(). For those three the 'float power=1.0f' version was removed directly as they were most unlikely ever used. + for shared code, you can version check at compile-time with `#if IMGUI_VERSION_NUM >= 17704`. + - obsoleted use of v_min > v_max in DragInt, DragFloat, DragScalar to lock edits (introduced in 1.73, was not demoed nor documented very), will be replaced by a more generic ReadOnly feature. You may use the ImGuiSliderFlags_ReadOnly internal flag in the meantime. + - 2020/06/23 (1.77) - removed BeginPopupContextWindow(const char*, int mouse_button, bool also_over_items) in favor of BeginPopupContextWindow(const char*, ImGuiPopupFlags flags) with ImGuiPopupFlags_NoOverItems. + - 2020/06/15 (1.77) - renamed OpenPopupOnItemClick() to OpenPopupContextItem(). Kept inline redirection function (will obsolete). [NOTE: THIS WAS REVERTED IN 1.79] + - 2020/06/15 (1.77) - removed CalcItemRectClosestPoint() entry point which was made obsolete and asserting in December 2017. + - 2020/04/23 (1.77) - removed unnecessary ID (first arg) of ImFontAtlas::AddCustomRectRegular(). + - 2020/01/22 (1.75) - ImDrawList::AddCircle()/AddCircleFilled() functions don't accept negative radius any more. + - 2019/12/17 (1.75) - [undid this change in 1.76] made Columns() limited to 64 columns by asserting above that limit. While the current code technically supports it, future code may not so we're putting the restriction ahead. + - 2019/12/13 (1.75) - [imgui_internal.h] changed ImRect() default constructor initializes all fields to 0.0f instead of (FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX). If you used ImRect::Add() to create bounding boxes by adding multiple points into it, you may need to fix your initial value. + - 2019/12/08 (1.75) - removed redirecting functions/enums that were marked obsolete in 1.53 (December 2017): + - ShowTestWindow() -> use ShowDemoWindow() + - IsRootWindowFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootWindow) + - IsRootWindowOrAnyChildFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) + - SetNextWindowContentWidth(w) -> use SetNextWindowContentSize(ImVec2(w, 0.0f) + - GetItemsLineHeightWithSpacing() -> use GetFrameHeightWithSpacing() + - ImGuiCol_ChildWindowBg -> use ImGuiCol_ChildBg + - ImGuiStyleVar_ChildWindowRounding -> use ImGuiStyleVar_ChildRounding + - ImGuiTreeNodeFlags_AllowOverlapMode -> use ImGuiTreeNodeFlags_AllowItemOverlap + - IMGUI_DISABLE_TEST_WINDOWS -> use IMGUI_DISABLE_DEMO_WINDOWS + - 2019/12/08 (1.75) - obsoleted calling ImDrawList::PrimReserve() with a negative count (which was vaguely documented and rarely if ever used). Instead, we added an explicit PrimUnreserve() API. + - 2019/12/06 (1.75) - removed implicit default parameter to IsMouseDragging(int button = 0) to be consistent with other mouse functions (none of the other functions have it). + - 2019/11/21 (1.74) - ImFontAtlas::AddCustomRectRegular() now requires an ID larger than 0x110000 (instead of 0x10000) to conform with supporting Unicode planes 1-16 in a future update. ID below 0x110000 will now assert. + - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS to IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS for consistency. + - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_MATH_FUNCTIONS to IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS for consistency. + - 2019/10/22 (1.74) - removed redirecting functions/enums that were marked obsolete in 1.52 (October 2017): + - Begin() [old 5 args version] -> use Begin() [3 args], use SetNextWindowSize() SetNextWindowBgAlpha() if needed + - IsRootWindowOrAnyChildHovered() -> use IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows) + - AlignFirstTextHeightToWidgets() -> use AlignTextToFramePadding() + - SetNextWindowPosCenter() -> use SetNextWindowPos() with a pivot of (0.5f, 0.5f) + - ImFont::Glyph -> use ImFontGlyph + - 2019/10/14 (1.74) - inputs: Fixed a miscalculation in the keyboard/mouse "typematic" repeat delay/rate calculation, used by keys and e.g. repeating mouse buttons as well as the GetKeyPressedAmount() function. + if you were using a non-default value for io.KeyRepeatRate (previous default was 0.250), you can add +io.KeyRepeatDelay to it to compensate for the fix. + The function was triggering on: 0.0 and (delay+rate*N) where (N>=1). Fixed formula responds to (N>=0). Effectively it made io.KeyRepeatRate behave like it was set to (io.KeyRepeatRate + io.KeyRepeatDelay). + If you never altered io.KeyRepeatRate nor used GetKeyPressedAmount() this won't affect you. + - 2019/07/15 (1.72) - removed TreeAdvanceToLabelPos() which is rarely used and only does SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()). Kept redirection function (will obsolete). + - 2019/07/12 (1.72) - renamed ImFontAtlas::CustomRect to ImFontAtlasCustomRect. Kept redirection typedef (will obsolete). + - 2019/06/14 (1.72) - removed redirecting functions/enums names that were marked obsolete in 1.51 (June 2017): ImGuiCol_Column*, ImGuiSetCond_*, IsItemHoveredRect(), IsPosHoveringAnyWindow(), IsMouseHoveringAnyWindow(), IsMouseHoveringWindow(), IMGUI_ONCE_UPON_A_FRAME. Grep this log for details and new names, or see how they were implemented until 1.71. + - 2019/06/07 (1.71) - rendering of child window outer decorations (bg color, border, scrollbars) is now performed as part of the parent window. If you have + overlapping child windows in a same parent, and relied on their relative z-order to be mapped to their submission order, this will affect your rendering. + This optimization is disabled if the parent window has no visual output, because it appears to be the most common situation leading to the creation of overlapping child windows. + Please reach out if you are affected. + - 2019/05/13 (1.71) - renamed SetNextTreeNodeOpen() to SetNextItemOpen(). Kept inline redirection function (will obsolete). + - 2019/05/11 (1.71) - changed io.AddInputCharacter(unsigned short c) signature to io.AddInputCharacter(unsigned int c). + - 2019/04/29 (1.70) - improved ImDrawList thick strokes (>1.0f) preserving correct thickness up to 90 degrees angles (e.g. rectangles). If you have custom rendering using thick lines, they will appear thicker now. + - 2019/04/29 (1.70) - removed GetContentRegionAvailWidth(), use GetContentRegionAvail().x instead. Kept inline redirection function (will obsolete). + - 2019/03/04 (1.69) - renamed GetOverlayDrawList() to GetForegroundDrawList(). Kept redirection function (will obsolete). + - 2019/02/26 (1.69) - renamed ImGuiColorEditFlags_RGB/ImGuiColorEditFlags_HSV/ImGuiColorEditFlags_HEX to ImGuiColorEditFlags_DisplayRGB/ImGuiColorEditFlags_DisplayHSV/ImGuiColorEditFlags_DisplayHex. Kept redirection enums (will obsolete). + - 2019/02/14 (1.68) - made it illegal/assert when io.DisplayTime == 0.0f (with an exception for the first frame). If for some reason your time step calculation gives you a zero value, replace it with an arbitrarily small value! + - 2019/02/01 (1.68) - removed io.DisplayVisibleMin/DisplayVisibleMax (which were marked obsolete and removed from viewport/docking branch already). + - 2019/01/06 (1.67) - renamed io.InputCharacters[], marked internal as was always intended. Please don't access directly, and use AddInputCharacter() instead! + - 2019/01/06 (1.67) - renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Kept redirection typedef (will obsolete). + - 2018/12/20 (1.67) - made it illegal to call Begin("") with an empty string. This somehow half-worked before but had various undesirable side-effects. + - 2018/12/10 (1.67) - renamed io.ConfigResizeWindowsFromEdges to io.ConfigWindowsResizeFromEdges as we are doing a large pass on configuration flags. + - 2018/10/12 (1.66) - renamed misc/stl/imgui_stl.* to misc/cpp/imgui_stdlib.* in prevision for other C++ helper files. + - 2018/09/28 (1.66) - renamed SetScrollHere() to SetScrollHereY(). Kept redirection function (will obsolete). + - 2018/09/06 (1.65) - renamed stb_truetype.h to imstb_truetype.h, stb_textedit.h to imstb_textedit.h, and stb_rect_pack.h to imstb_rectpack.h. + If you were conveniently using the imgui copy of those STB headers in your project you will have to update your include paths. + - 2018/09/05 (1.65) - renamed io.OptCursorBlink/io.ConfigCursorBlink to io.ConfigInputTextCursorBlink. (#1427) + - 2018/08/31 (1.64) - added imgui_widgets.cpp file, extracted and moved widgets code out of imgui.cpp into imgui_widgets.cpp. Re-ordered some of the code remaining in imgui.cpp. + NONE OF THE FUNCTIONS HAVE CHANGED. THE CODE IS SEMANTICALLY 100% IDENTICAL, BUT _EVERY_ FUNCTION HAS BEEN MOVED. + Because of this, any local modifications to imgui.cpp will likely conflict when you update. Read docs/CHANGELOG.txt for suggestions. + - 2018/08/22 (1.63) - renamed IsItemDeactivatedAfterChange() to IsItemDeactivatedAfterEdit() for consistency with new IsItemEdited() API. Kept redirection function (will obsolete soonish as IsItemDeactivatedAfterChange() is very recent). + - 2018/08/21 (1.63) - renamed ImGuiTextEditCallback to ImGuiInputTextCallback, ImGuiTextEditCallbackData to ImGuiInputTextCallbackData for consistency. Kept redirection types (will obsolete). + - 2018/08/21 (1.63) - removed ImGuiInputTextCallbackData::ReadOnly since it is a duplication of (ImGuiInputTextCallbackData::Flags & ImGuiInputTextFlags_ReadOnly). + - 2018/08/01 (1.63) - removed per-window ImGuiWindowFlags_ResizeFromAnySide beta flag in favor of a global io.ConfigResizeWindowsFromEdges [update 1.67 renamed to ConfigWindowsResizeFromEdges] to enable the feature. + - 2018/08/01 (1.63) - renamed io.OptCursorBlink to io.ConfigCursorBlink [-> io.ConfigInputTextCursorBlink in 1.65], io.OptMacOSXBehaviors to ConfigMacOSXBehaviors for consistency. + - 2018/07/22 (1.63) - changed ImGui::GetTime() return value from float to double to avoid accumulating floating point imprecisions over time. + - 2018/07/08 (1.63) - style: renamed ImGuiCol_ModalWindowDarkening to ImGuiCol_ModalWindowDimBg for consistency with other features. Kept redirection enum (will obsolete). + - 2018/06/08 (1.62) - examples: the imgui_impl_XXX files have been split to separate platform (Win32, GLFW, SDL2, etc.) from renderer (DX11, OpenGL, Vulkan, etc.). + old backends will still work as is, however prefer using the separated backends as they will be updated to support multi-viewports. + when adopting new backends follow the main.cpp code of your preferred examples/ folder to know which functions to call. + in particular, note that old backends called ImGui::NewFrame() at the end of their ImGui_ImplXXXX_NewFrame() function. + - 2018/06/06 (1.62) - renamed GetGlyphRangesChinese() to GetGlyphRangesChineseFull() to distinguish other variants and discourage using the full set. + - 2018/06/06 (1.62) - TreeNodeEx()/TreeNodeBehavior(): the ImGuiTreeNodeFlags_CollapsingHeader helper now include the ImGuiTreeNodeFlags_NoTreePushOnOpen flag. See Changelog for details. + - 2018/05/03 (1.61) - DragInt(): the default compile-time format string has been changed from "%.0f" to "%d", as we are not using integers internally any more. + If you used DragInt() with custom format strings, make sure you change them to use %d or an integer-compatible format. + To honor backward-compatibility, the DragInt() code will currently parse and modify format strings to replace %*f with %d, giving time to users to upgrade their code. + If you have IMGUI_DISABLE_OBSOLETE_FUNCTIONS enabled, the code will instead assert! You may run a reg-exp search on your codebase for e.g. "DragInt.*%f" to help you find them. + - 2018/04/28 (1.61) - obsoleted InputFloat() functions taking an optional "int decimal_precision" in favor of an equivalent and more flexible "const char* format", + consistent with other functions. Kept redirection functions (will obsolete). + - 2018/04/09 (1.61) - IM_DELETE() helper function added in 1.60 doesn't clear the input _pointer_ reference, more consistent with expectation and allows passing r-value. + - 2018/03/20 (1.60) - renamed io.WantMoveMouse to io.WantSetMousePos for consistency and ease of understanding (was added in 1.52, _not_ used by core and only honored by some backend ahead of merging the Nav branch). + - 2018/03/12 (1.60) - removed ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered as the closing cross uses regular button colors now. + - 2018/03/08 (1.60) - changed ImFont::DisplayOffset.y to default to 0 instead of +1. Fixed rounding of Ascent/Descent to match TrueType renderer. If you were adding or subtracting to ImFont::DisplayOffset check if your fonts are correctly aligned vertically. + - 2018/03/03 (1.60) - renamed ImGuiStyleVar_Count_ to ImGuiStyleVar_COUNT and ImGuiMouseCursor_Count_ to ImGuiMouseCursor_COUNT for consistency with other public enums. + - 2018/02/18 (1.60) - BeginDragDropSource(): temporarily removed the optional mouse_button=0 parameter because it is not really usable in many situations at the moment. + - 2018/02/16 (1.60) - obsoleted the io.RenderDrawListsFn callback, you can call your graphics engine render function after ImGui::Render(). Use ImGui::GetDrawData() to retrieve the ImDrawData* to display. + - 2018/02/07 (1.60) - reorganized context handling to be more explicit, + - YOU NOW NEED TO CALL ImGui::CreateContext() AT THE BEGINNING OF YOUR APP, AND CALL ImGui::DestroyContext() AT THE END. + - removed Shutdown() function, as DestroyContext() serve this purpose. + - you may pass a ImFontAtlas* pointer to CreateContext() to share a font atlas between contexts. Otherwise CreateContext() will create its own font atlas instance. + - removed allocator parameters from CreateContext(), they are now setup with SetAllocatorFunctions(), and shared by all contexts. + - removed the default global context and font atlas instance, which were confusing for users of DLL reloading and users of multiple contexts. + - 2018/01/31 (1.60) - moved sample TTF files from extra_fonts/ to misc/fonts/. If you loaded files directly from the imgui repo you may need to update your paths. + - 2018/01/11 (1.60) - obsoleted IsAnyWindowHovered() in favor of IsWindowHovered(ImGuiHoveredFlags_AnyWindow). Kept redirection function (will obsolete). + - 2018/01/11 (1.60) - obsoleted IsAnyWindowFocused() in favor of IsWindowFocused(ImGuiFocusedFlags_AnyWindow). Kept redirection function (will obsolete). + - 2018/01/03 (1.60) - renamed ImGuiSizeConstraintCallback to ImGuiSizeCallback, ImGuiSizeConstraintCallbackData to ImGuiSizeCallbackData. + - 2017/12/29 (1.60) - removed CalcItemRectClosestPoint() which was weird and not really used by anyone except demo code. If you need it it's easy to replicate on your side. + - 2017/12/24 (1.53) - renamed the emblematic ShowTestWindow() function to ShowDemoWindow(). Kept redirection function (will obsolete). + - 2017/12/21 (1.53) - ImDrawList: renamed style.AntiAliasedShapes to style.AntiAliasedFill for consistency and as a way to explicitly break code that manipulate those flag at runtime. You can now manipulate ImDrawList::Flags + - 2017/12/21 (1.53) - ImDrawList: removed 'bool anti_aliased = true' final parameter of ImDrawList::AddPolyline() and ImDrawList::AddConvexPolyFilled(). Prefer manipulating ImDrawList::Flags if you need to toggle them during the frame. + - 2017/12/14 (1.53) - using the ImGuiWindowFlags_NoScrollWithMouse flag on a child window forwards the mouse wheel event to the parent window, unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set. + - 2017/12/13 (1.53) - renamed GetItemsLineHeightWithSpacing() to GetFrameHeightWithSpacing(). Kept redirection function (will obsolete). + - 2017/12/13 (1.53) - obsoleted IsRootWindowFocused() in favor of using IsWindowFocused(ImGuiFocusedFlags_RootWindow). Kept redirection function (will obsolete). + - obsoleted IsRootWindowOrAnyChildFocused() in favor of using IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows). Kept redirection function (will obsolete). + - 2017/12/12 (1.53) - renamed ImGuiTreeNodeFlags_AllowOverlapMode to ImGuiTreeNodeFlags_AllowItemOverlap. Kept redirection enum (will obsolete). + - 2017/12/10 (1.53) - removed SetNextWindowContentWidth(), prefer using SetNextWindowContentSize(). Kept redirection function (will obsolete). + - 2017/11/27 (1.53) - renamed ImGuiTextBuffer::append() helper to appendf(), appendv() to appendfv(). If you copied the 'Log' demo in your code, it uses appendv() so that needs to be renamed. + - 2017/11/18 (1.53) - Style, Begin: removed ImGuiWindowFlags_ShowBorders window flag. Borders are now fully set up in the ImGuiStyle structure (see e.g. style.FrameBorderSize, style.WindowBorderSize). Use ImGui::ShowStyleEditor() to look them up. + Please note that the style system will keep evolving (hopefully stabilizing in Q1 2018), and so custom styles will probably subtly break over time. It is recommended you use the StyleColorsClassic(), StyleColorsDark(), StyleColorsLight() functions. + - 2017/11/18 (1.53) - Style: removed ImGuiCol_ComboBg in favor of combo boxes using ImGuiCol_PopupBg for consistency. + - 2017/11/18 (1.53) - Style: renamed ImGuiCol_ChildWindowBg to ImGuiCol_ChildBg. + - 2017/11/18 (1.53) - Style: renamed style.ChildWindowRounding to style.ChildRounding, ImGuiStyleVar_ChildWindowRounding to ImGuiStyleVar_ChildRounding. + - 2017/11/02 (1.53) - obsoleted IsRootWindowOrAnyChildHovered() in favor of using IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); + - 2017/10/24 (1.52) - renamed IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS to IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS for consistency. + - 2017/10/20 (1.52) - changed IsWindowHovered() default parameters behavior to return false if an item is active in another window (e.g. click-dragging item from another window to this window). You can use the newly introduced IsWindowHovered() flags to requests this specific behavior if you need it. + - 2017/10/20 (1.52) - marked IsItemHoveredRect()/IsMouseHoveringWindow() as obsolete, in favor of using the newly introduced flags for IsItemHovered() and IsWindowHovered(). See https://github.com/ocornut/imgui/issues/1382 for details. + removed the IsItemRectHovered()/IsWindowRectHovered() names introduced in 1.51 since they were merely more consistent names for the two functions we are now obsoleting. + IsItemHoveredRect() --> IsItemHovered(ImGuiHoveredFlags_RectOnly) + IsMouseHoveringAnyWindow() --> IsWindowHovered(ImGuiHoveredFlags_AnyWindow) + IsMouseHoveringWindow() --> IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) [weird, old behavior] + - 2017/10/17 (1.52) - marked the old 5-parameters version of Begin() as obsolete (still available). Use SetNextWindowSize()+Begin() instead! + - 2017/10/11 (1.52) - renamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete). + - 2017/09/26 (1.52) - renamed ImFont::Glyph to ImFontGlyph. Kept redirection typedef (will obsolete). + - 2017/09/25 (1.52) - removed SetNextWindowPosCenter() because SetNextWindowPos() now has the optional pivot information to do the same and more. Kept redirection function (will obsolete). + - 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your backend if you need to support unavailable mouse, make sure to replace "io.MousePos = ImVec2(-1,-1)" with "io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)". + - 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete). -> (1.52) use IsItemHovered(ImGuiHoveredFlags_RectOnly)! + - renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete). + - renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete). + - 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency. + - 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix. + - 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame type. + - 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely. + - 2017/08/13 (1.51) - renamed ImGuiCol_Column to ImGuiCol_Separator, ImGuiCol_ColumnHovered to ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive to ImGuiCol_SeparatorActive. Kept redirection enums (will obsolete). + - 2017/08/11 (1.51) - renamed ImGuiSetCond_Always to ImGuiCond_Always, ImGuiSetCond_Once to ImGuiCond_Once, ImGuiSetCond_FirstUseEver to ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing to ImGuiCond_Appearing. Kept redirection enums (will obsolete). + - 2017/08/09 (1.51) - removed ValueColor() helpers, they are equivalent to calling Text(label) + SameLine() + ColorButton(). + - 2017/08/08 (1.51) - removed ColorEditMode() and ImGuiColorEditMode in favor of ImGuiColorEditFlags and parameters to the various Color*() functions. The SetColorEditOptions() allows to initialize default but the user can still change them with right-click context menu. + - changed prototype of 'ColorEdit4(const char* label, float col[4], bool show_alpha = true)' to 'ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0)', where passing flags = 0x01 is a safe no-op (hello dodgy backward compatibility!). - check and run the demo window, under "Color/Picker Widgets", to understand the various new options. + - changed prototype of rarely used 'ColorButton(ImVec4 col, bool small_height = false, bool outline_border = true)' to 'ColorButton(const char* desc_id, ImVec4 col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0, 0))' + - 2017/07/20 (1.51) - removed IsPosHoveringAnyWindow(ImVec2), which was partly broken and misleading. ASSERT + redirect user to io.WantCaptureMouse + - 2017/05/26 (1.50) - removed ImFontConfig::MergeGlyphCenterV in favor of a more multipurpose ImFontConfig::GlyphOffset. + - 2017/05/01 (1.50) - renamed ImDrawList::PathFill() (rarely used directly) to ImDrawList::PathFillConvex() for clarity. + - 2016/11/06 (1.50) - BeginChild(const char*) now applies the stack id to the provided label, consistently with other functions as it should always have been. It shouldn't affect you unless (extremely unlikely) you were appending multiple times to a same child from different locations of the stack id. If that's the case, generate an id with GetID() and use it instead of passing string to BeginChild(). + - 2016/10/15 (1.50) - avoid 'void* user_data' parameter to io.SetClipboardTextFn/io.GetClipboardTextFn pointers. We pass io.ClipboardUserData to it. + - 2016/09/25 (1.50) - style.WindowTitleAlign is now a ImVec2 (ImGuiAlign enum was removed). set to (0.5f,0.5f) for horizontal+vertical centering, (0.0f,0.0f) for upper-left, etc. + - 2016/07/30 (1.50) - SameLine(x) with x>0.0f is now relative to left of column/group if any, and not always to left of window. This was sort of always the intent and hopefully, breakage should be minimal. + - 2016/05/12 (1.49) - title bar (using ImGuiCol_TitleBg/ImGuiCol_TitleBgActive colors) isn't rendered over a window background (ImGuiCol_WindowBg color) anymore. + If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you, otherwise if <1.0f you need to tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar. + This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color: + ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col) { float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a; return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a); } + If this is confusing, pick the RGB value from title bar from an old screenshot and apply this as TitleBg/TitleBgActive. Or you may just create TitleBgActive from a tweaked TitleBg color. + - 2016/05/07 (1.49) - removed confusing set of GetInternalState(), GetInternalStateSize(), SetInternalState() functions. Now using CreateContext(), DestroyContext(), GetCurrentContext(), SetCurrentContext(). + - 2016/05/02 (1.49) - renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(), no redirection. + - 2016/05/01 (1.49) - obsoleted old signature of CollapsingHeader(const char* label, const char* str_id = NULL, bool display_frame = true, bool default_open = false) as extra parameters were badly designed and rarely used. You can replace the "default_open = true" flag in new API with CollapsingHeader(label, ImGuiTreeNodeFlags_DefaultOpen). + - 2016/04/26 (1.49) - changed ImDrawList::PushClipRect(ImVec4 rect) to ImDrawList::PushClipRect(Imvec2 min,ImVec2 max,bool intersect_with_current_clip_rect=false). Note that higher-level ImGui::PushClipRect() is preferable because it will clip at logic/widget level, whereas ImDrawList::PushClipRect() only affect your renderer. + - 2016/04/03 (1.48) - removed style.WindowFillAlphaDefault setting which was redundant. Bake default BG alpha inside style.Colors[ImGuiCol_WindowBg] and all other Bg color values. (ref GitHub issue #337). + - 2016/04/03 (1.48) - renamed ImGuiCol_TooltipBg to ImGuiCol_PopupBg, used by popups/menus and tooltips. popups/menus were previously using ImGuiCol_WindowBg. (ref github issue #337) + - 2016/03/21 (1.48) - renamed GetWindowFont() to GetFont(), GetWindowFontSize() to GetFontSize(). Kept inline redirection function (will obsolete). + - 2016/03/02 (1.48) - InputText() completion/history/always callbacks: if you modify the text buffer manually (without using DeleteChars()/InsertChars() helper) you need to maintain the BufTextLen field. added an assert. + - 2016/01/23 (1.48) - fixed not honoring exact width passed to PushItemWidth(), previously it would add extra FramePadding.x*2 over that width. if you had manual pixel-perfect alignment in place it might affect you. + - 2015/12/27 (1.48) - fixed ImDrawList::AddRect() which used to render a rectangle 1 px too large on each axis. + - 2015/12/04 (1.47) - renamed Color() helpers to ValueColor() - dangerously named, rarely used and probably to be made obsolete. + - 2015/08/29 (1.45) - with the addition of horizontal scrollbar we made various fixes to inconsistencies with dealing with cursor position. + GetCursorPos()/SetCursorPos() functions now include the scrolled amount. It shouldn't affect the majority of users, but take note that SetCursorPosX(100.0f) puts you at +100 from the starting x position which may include scrolling, not at +100 from the window left side. + GetContentRegionMax()/GetWindowContentRegionMin()/GetWindowContentRegionMax() functions allow include the scrolled amount. Typically those were used in cases where no scrolling would happen so it may not be a problem, but watch out! + - 2015/08/29 (1.45) - renamed style.ScrollbarWidth to style.ScrollbarSize + - 2015/08/05 (1.44) - split imgui.cpp into extra files: imgui_demo.cpp imgui_draw.cpp imgui_internal.h that you need to add to your project. + - 2015/07/18 (1.44) - fixed angles in ImDrawList::PathArcTo(), PathArcToFast() (introduced in 1.43) being off by an extra PI for no justifiable reason + - 2015/07/14 (1.43) - add new ImFontAtlas::AddFont() API. For the old AddFont***, moved the 'font_no' parameter of ImFontAtlas::AddFont** functions to the ImFontConfig structure. + you need to render your textured triangles with bilinear filtering to benefit from sub-pixel positioning of text. + - 2015/07/08 (1.43) - switched rendering data to use indexed rendering. this is saving a fair amount of CPU/GPU and enables us to get anti-aliasing for a marginal cost. + this necessary change will break your rendering function! the fix should be very easy. sorry for that :( + - if you are using a vanilla copy of one of the imgui_impl_XXX.cpp provided in the example, you just need to update your copy and you can ignore the rest. + - the signature of the io.RenderDrawListsFn handler has changed! + old: ImGui_XXXX_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count) + new: ImGui_XXXX_RenderDrawLists(ImDrawData* draw_data). + parameters: 'cmd_lists' becomes 'draw_data->CmdLists', 'cmd_lists_count' becomes 'draw_data->CmdListsCount' + ImDrawList: 'commands' becomes 'CmdBuffer', 'vtx_buffer' becomes 'VtxBuffer', 'IdxBuffer' is new. + ImDrawCmd: 'vtx_count' becomes 'ElemCount', 'clip_rect' becomes 'ClipRect', 'user_callback' becomes 'UserCallback', 'texture_id' becomes 'TextureId'. + - each ImDrawList now contains both a vertex buffer and an index buffer. For each command, render ElemCount/3 triangles using indices from the index buffer. + - if you REALLY cannot render indexed primitives, you can call the draw_data->DeIndexAllBuffers() method to de-index the buffers. This is slow and a waste of CPU/GPU. Prefer using indexed rendering! + - refer to code in the examples/ folder or ask on the GitHub if you are unsure of how to upgrade. please upgrade! + - 2015/07/10 (1.43) - changed SameLine() parameters from int to float. + - 2015/07/02 (1.42) - renamed SetScrollPosHere() to SetScrollFromCursorPos(). Kept inline redirection function (will obsolete). + - 2015/07/02 (1.42) - renamed GetScrollPosY() to GetScrollY(). Necessary to reduce confusion along with other scrolling functions, because positions (e.g. cursor position) are not equivalent to scrolling amount. + - 2015/06/14 (1.41) - changed ImageButton() default bg_col parameter from (0,0,0,1) (black) to (0,0,0,0) (transparent) - makes a difference when texture have transparence + - 2015/06/14 (1.41) - changed Selectable() API from (label, selected, size) to (label, selected, flags, size). Size override should have been rarely used. Sorry! + - 2015/05/31 (1.40) - renamed GetWindowCollapsed() to IsWindowCollapsed() for consistency. Kept inline redirection function (will obsolete). + - 2015/05/31 (1.40) - renamed IsRectClipped() to IsRectVisible() for consistency. Note that return value is opposite! Kept inline redirection function (will obsolete). + - 2015/05/27 (1.40) - removed the third 'repeat_if_held' parameter from Button() - sorry! it was rarely used and inconsistent. Use PushButtonRepeat(true) / PopButtonRepeat() to enable repeat on desired buttons. + - 2015/05/11 (1.40) - changed BeginPopup() API, takes a string identifier instead of a bool. ImGui needs to manage the open/closed state of popups. Call OpenPopup() to actually set the "open" state of a popup. BeginPopup() returns true if the popup is opened. + - 2015/05/03 (1.40) - removed style.AutoFitPadding, using style.WindowPadding makes more sense (the default values were already the same). + - 2015/04/13 (1.38) - renamed IsClipped() to IsRectClipped(). Kept inline redirection function until 1.50. + - 2015/04/09 (1.38) - renamed ImDrawList::AddArc() to ImDrawList::AddArcFast() for compatibility with future API + - 2015/04/03 (1.38) - removed ImGuiCol_CheckHovered, ImGuiCol_CheckActive, replaced with the more general ImGuiCol_FrameBgHovered, ImGuiCol_FrameBgActive. + - 2014/04/03 (1.38) - removed support for passing -FLT_MAX..+FLT_MAX as the range for a SliderFloat(). Use DragFloat() or Inputfloat() instead. + - 2015/03/17 (1.36) - renamed GetItemBoxMin()/GetItemBoxMax()/IsMouseHoveringBox() to GetItemRectMin()/GetItemRectMax()/IsMouseHoveringRect(). Kept inline redirection function until 1.50. + - 2015/03/15 (1.36) - renamed style.TreeNodeSpacing to style.IndentSpacing, ImGuiStyleVar_TreeNodeSpacing to ImGuiStyleVar_IndentSpacing + - 2015/03/13 (1.36) - renamed GetWindowIsFocused() to IsWindowFocused(). Kept inline redirection function until 1.50. + - 2015/03/08 (1.35) - renamed style.ScrollBarWidth to style.ScrollbarWidth (casing) + - 2015/02/27 (1.34) - renamed OpenNextNode(bool) to SetNextTreeNodeOpened(bool, ImGuiSetCond). Kept inline redirection function until 1.50. + - 2015/02/27 (1.34) - renamed ImGuiSetCondition_*** to ImGuiSetCond_***, and _FirstUseThisSession becomes _Once. + - 2015/02/11 (1.32) - changed text input callback ImGuiTextEditCallback return type from void-->int. reserved for future use, return 0 for now. + - 2015/02/10 (1.32) - renamed GetItemWidth() to CalcItemWidth() to clarify its evolving behavior + - 2015/02/08 (1.31) - renamed GetTextLineSpacing() to GetTextLineHeightWithSpacing() + - 2015/02/01 (1.31) - removed IO.MemReallocFn (unused) + - 2015/01/19 (1.30) - renamed ImGuiStorage::GetIntPtr()/GetFloatPtr() to GetIntRef()/GetIntRef() because Ptr was conflicting with actual pointer storage functions. + - 2015/01/11 (1.30) - big font/image API change! now loads TTF file. allow for multiple fonts. no need for a PNG loader. + - 2015/01/11 (1.30) - removed GetDefaultFontData(). uses io.Fonts->GetTextureData*() API to retrieve uncompressed pixels. + - old: const void* png_data; unsigned int png_size; ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); [..Upload texture to GPU..]; + - new: unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); [..Upload texture to GPU..]; io.Fonts->SetTexID(YourTexIdentifier); + you now have more flexibility to load multiple TTF fonts and manage the texture buffer for internal needs. It is now recommended that you sample the font texture with bilinear interpolation. + - 2015/01/11 (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to call io.Fonts->SetTexID() + - 2015/01/11 (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix) + - 2015/01/11 (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets + - 2014/12/10 (1.18) - removed SetNewWindowDefaultPos() in favor of new generic API SetNextWindowPos(pos, ImGuiSetCondition_FirstUseEver) + - 2014/11/28 (1.17) - moved IO.Font*** options to inside the IO.Font-> structure (FontYOffset, FontTexUvForWhite, FontBaseScale, FontFallbackGlyph) + - 2014/11/26 (1.17) - reworked syntax of IMGUI_ONCE_UPON_A_FRAME helper macro to increase compiler compatibility + - 2014/11/07 (1.15) - renamed IsHovered() to IsItemHovered() + - 2014/10/02 (1.14) - renamed IMGUI_INCLUDE_IMGUI_USER_CPP to IMGUI_INCLUDE_IMGUI_USER_INL and imgui_user.cpp to imgui_user.inl (more IDE friendly) + - 2014/09/25 (1.13) - removed 'text_end' parameter from IO.SetClipboardTextFn (the string is now always zero-terminated for simplicity) + - 2014/09/24 (1.12) - renamed SetFontScale() to SetWindowFontScale() + - 2014/09/24 (1.12) - moved IM_MALLOC/IM_REALLOC/IM_FREE preprocessor defines to IO.MemAllocFn/IO.MemReallocFn/IO.MemFreeFn + - 2014/08/30 (1.09) - removed IO.FontHeight (now computed automatically) + - 2014/08/30 (1.09) - moved IMGUI_FONT_TEX_UV_FOR_WHITE preprocessor define to IO.FontTexUvForWhite + - 2014/08/28 (1.09) - changed the behavior of IO.PixelCenterOffset following various rendering fixes + + + FREQUENTLY ASKED QUESTIONS (FAQ) + ================================ + + Read all answers online: + https://www.dearimgui.org/faq or https://github.com/ocornut/imgui/blob/master/docs/FAQ.md (same url) + Read all answers locally (with a text editor or ideally a Markdown viewer): + docs/FAQ.md + Some answers are copied down here to facilitate searching in code. + + Q&A: Basics + =========== + + Q: Where is the documentation? + A: This library is poorly documented at the moment and expects the user to be acquainted with C/C++. + - Run the examples/ and explore them. + - See demo code in imgui_demo.cpp and particularly the ImGui::ShowDemoWindow() function. + - The demo covers most features of Dear ImGui, so you can read the code and see its output. + - See documentation and comments at the top of imgui.cpp + effectively imgui.h. + - Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the + examples/ folder to explain how to integrate Dear ImGui with your own engine/application. + - The Wiki (https://github.com/ocornut/imgui/wiki) has many resources and links. + - The Glossary (https://github.com/ocornut/imgui/wiki/Glossary) page also may be useful. + - Your programming IDE is your friend, find the type or function declaration to find comments + associated with it. + + Q: What is this library called? + Q: Which version should I get? + >> This library is called "Dear ImGui", please don't call it "ImGui" :) + >> See https://www.dearimgui.org/faq for details. + + Q&A: Integration + ================ + + Q: How to get started? + A: Read 'PROGRAMMER GUIDE' above. Read examples/README.txt. + + Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application? + A: You should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! + >> See https://www.dearimgui.org/faq for a fully detailed answer. You really want to read this. + + Q. How can I enable keyboard controls? + Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display) + Q: I integrated Dear ImGui in my engine and little squares are showing instead of text... + Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around... + Q: I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries... + >> See https://www.dearimgui.org/faq + + Q&A: Usage + ---------- + + Q: About the ID Stack system.. + - Why is my widget not reacting when I click on it? + - How can I have widgets with an empty label? + - How can I have multiple widgets with the same label? + - How can I have multiple windows with the same label? + Q: How can I display an image? What is ImTextureID, how does it works? + Q: How can I use my own math types instead of ImVec2/ImVec4? + Q: How can I interact with standard C++ types (such as std::string and std::vector)? + Q: How can I display custom shapes? (using low-level ImDrawList API) + >> See https://www.dearimgui.org/faq + + Q&A: Fonts, Text + ================ + + Q: How should I handle DPI in my application? + Q: How can I load a different font than the default? + Q: How can I easily use icons in my application? + Q: How can I load multiple fonts? + Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic? + >> See https://www.dearimgui.org/faq and https://github.com/ocornut/imgui/edit/master/docs/FONTS.md + + Q&A: Concerns + ============= + + Q: Who uses Dear ImGui? + Q: Can you create elaborate/serious tools with Dear ImGui? + Q: Can you reskin the look of Dear ImGui? + Q: Why using C++ (as opposed to C)? + >> See https://www.dearimgui.org/faq + + Q&A: Community + ============== + + Q: How can I help? + A: - Businesses: please reach out to "contact AT dearimgui.com" if you work in a place using Dear ImGui! + We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts. + This is among the most useful thing you can do for Dear ImGui. With increased funding, we can hire more people working on this project. + - Individuals: you can support continued development via PayPal donations. See README. + - If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, read docs/TODO.txt + and see how you want to help and can help! + - Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc. + You may post screenshot or links in the gallery threads. Visuals are ideal as they inspire other programmers. + But even without visuals, disclosing your use of dear imgui helps the library grow credibility, and help other teams and programmers with taking decisions. + - If you have issues or if you need to hack into the library, even if you don't expect any support it is useful that you share your issues (on GitHub or privately). + +*/ + +//------------------------------------------------------------------------- +// [SECTION] INCLUDES +//------------------------------------------------------------------------- + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif +#include "imgui_internal.h" + +// System includes +#include // toupper +#include // vsnprintf, sscanf, printf +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +// [Windows] On non-Visual Studio compilers, we default to IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS unless explicitly enabled +#if defined(_WIN32) && !defined(_MSC_VER) && !defined(IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) +#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS +#endif + +// [Windows] OS specific includes (optional) +#if defined(_WIN32) && defined(IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#define IMGUI_DISABLE_WIN32_FUNCTIONS +#endif +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif +#ifndef __MINGW32__ +#include // _wfopen, OpenClipboard +#else +#include +#endif +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have all Win32 functions +#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS +#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS +#endif +#endif + +// [Apple] OS specific includes +#if defined(__APPLE__) +#include +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). +#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. +#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. +#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. +#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wformat-pedantic" // warning: format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic. +#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type 'int' +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +// We disable -Wpragmas because GCC doesn't provide an has_warning equivalent and some forks/patches may not following the warning/version association. +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used +#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size +#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'void*', but argument 6 has type 'ImGuiWindow*' +#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function +#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value +#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked +#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +// Debug options +#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Display last moving direction matches when holding CTRL +#define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window +#define IMGUI_DEBUG_INI_SETTINGS 0 // Save additional comments in .ini file (particularly helps for Docking, but makes saving slower) + +// When using CTRL+TAB (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch. +static const float NAV_WINDOWING_HIGHLIGHT_DELAY = 0.20f; // Time before the highlight and screen dimming starts fading in +static const float NAV_WINDOWING_LIST_APPEAR_DELAY = 0.15f; // Time before the window list starts to appear + +// Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by backend) +static const float WINDOWS_HOVER_PADDING = 4.0f; // Extend outside window for hovering/resizing (maxxed with TouchPadding) and inside windows for borders. Affect FindHoveredWindow(). +static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time. +static const float WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER = 2.00f; // Lock scrolled window (so it doesn't pick child windows that are scrolling through) for a certain time, unless mouse moved. + +//------------------------------------------------------------------------- +// [SECTION] FORWARD DECLARATIONS +//------------------------------------------------------------------------- + +static void SetCurrentWindow(ImGuiWindow* window); +static void FindHoveredWindow(); +static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags); +static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window); + +static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list); +static void AddWindowToSortBuffer(ImVector* out_sorted_windows, ImGuiWindow* window); + +// Settings +static void WindowSettingsHandler_ClearAll(ImGuiContext*, ImGuiSettingsHandler*); +static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name); +static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line); +static void WindowSettingsHandler_ApplyAll(ImGuiContext*, ImGuiSettingsHandler*); +static void WindowSettingsHandler_WriteAll(ImGuiContext*, ImGuiSettingsHandler*, ImGuiTextBuffer* buf); + +// Platform Dependents default implementation for IO functions +static const char* GetClipboardTextFn_DefaultImpl(void* user_data); +static void SetClipboardTextFn_DefaultImpl(void* user_data, const char* text); +static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport, ImGuiPlatformImeData* data); + +namespace ImGui +{ +// Navigation +static void NavUpdate(); +static void NavUpdateWindowing(); +static void NavUpdateWindowingOverlay(); +static void NavUpdateCancelRequest(); +static void NavUpdateCreateMoveRequest(); +static void NavUpdateCreateTabbingRequest(); +static float NavUpdatePageUpPageDown(); +static inline void NavUpdateAnyRequestFlag(); +static void NavUpdateCreateWrappingRequest(); +static void NavEndFrame(); +static bool NavScoreItem(ImGuiNavItemData* result); +static void NavApplyItemToResult(ImGuiNavItemData* result); +static void NavProcessItem(); +static void NavProcessItemForTabbingRequest(ImGuiID id); +static ImVec2 NavCalcPreferredRefPos(); +static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window); +static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window); +static void NavRestoreLayer(ImGuiNavLayer layer); +static void NavRestoreHighlightAfterMove(); +static int FindWindowFocusIndex(ImGuiWindow* window); + +// Error Checking and Debug Tools +static void ErrorCheckNewFrameSanityChecks(); +static void ErrorCheckEndFrameSanityChecks(); +static void UpdateDebugToolItemPicker(); +static void UpdateDebugToolStackQueries(); + +// Misc +static void UpdateSettings(); +static void UpdateKeyboardInputs(); +static void UpdateMouseInputs(); +static void UpdateMouseWheel(); +static bool UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect); +static void RenderWindowOuterBorders(ImGuiWindow* window); +static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size); +static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open); +static void RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col); +static void RenderDimmedBackgrounds(); +static ImGuiWindow* FindBlockingModal(ImGuiWindow* window); + +// Viewports +static void UpdateViewportsNewFrame(); + +} + +//----------------------------------------------------------------------------- +// [SECTION] CONTEXT AND MEMORY ALLOCATORS +//----------------------------------------------------------------------------- + +// DLL users: +// - Heaps and globals are not shared across DLL boundaries! +// - You will need to call SetCurrentContext() + SetAllocatorFunctions() for each static/DLL boundary you are calling from. +// - Same applies for hot-reloading mechanisms that are reliant on reloading DLL (note that many hot-reloading mechanisms work without DLL). +// - Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility. +// - Confused? In a debugger: add GImGui to your watch window and notice how its value changes depending on your current location (which DLL boundary you are in). + +// Current context pointer. Implicitly used by all Dear ImGui functions. Always assumed to be != NULL. +// - ImGui::CreateContext() will automatically set this pointer if it is NULL. +// Change to a different context by calling ImGui::SetCurrentContext(). +// - Important: Dear ImGui functions are not thread-safe because of this pointer. +// If you want thread-safety to allow N threads to access N different contexts: +// - Change this variable to use thread local storage so each thread can refer to a different context, in your imconfig.h: +// struct ImGuiContext; +// extern thread_local ImGuiContext* MyImGuiTLS; +// #define GImGui MyImGuiTLS +// And then define MyImGuiTLS in one of your cpp files. Note that thread_local is a C++11 keyword, earlier C++ uses compiler-specific keyword. +// - Future development aims to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586 +// - If you need a finite number of contexts, you may compile and use multiple instances of the ImGui code from a different namespace. +// - DLL users: read comments above. +#ifndef GImGui +ImGuiContext* GImGui = NULL; +#endif + +// Memory Allocator functions. Use SetAllocatorFunctions() to change them. +// - You probably don't want to modify that mid-program, and if you use global/static e.g. ImVector<> instances you may need to keep them accessible during program destruction. +// - DLL users: read comments above. +#ifndef IMGUI_DISABLE_DEFAULT_ALLOCATORS +static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); return malloc(size); } +static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); free(ptr); } +#else +static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(size); IM_ASSERT(0); return NULL; } +static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(ptr); IM_ASSERT(0); } +#endif +static ImGuiMemAllocFunc GImAllocatorAllocFunc = MallocWrapper; +static ImGuiMemFreeFunc GImAllocatorFreeFunc = FreeWrapper; +static void* GImAllocatorUserData = NULL; + +//----------------------------------------------------------------------------- +// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) +//----------------------------------------------------------------------------- + +ImGuiStyle::ImGuiStyle() +{ + Alpha = 1.0f; // Global alpha applies to everything in Dear ImGui. + DisabledAlpha = 0.60f; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. + WindowPadding = ImVec2(8,8); // Padding within a window + WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. + WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. + WindowMinSize = ImVec2(32,32); // Minimum window size + WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text + WindowMenuButtonPosition= ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left. + ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows + ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. + PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows + PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested. + FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets) + FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets). + FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. + ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines + ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) + CellPadding = ImVec2(4,2); // Padding within a table cell + TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! + IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). + ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). + ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar + ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar + GrabMinSize = 10.0f; // Minimum width/height of a grab box for slider/scrollbar + GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. + LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. + TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. + TabBorderSize = 0.0f; // Thickness of border around tabs. + TabMinWidthForCloseButton = 0.0f; // Minimum width for close button to appears on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. + ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. + SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. + DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. + DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. + MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. + AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. + AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). + AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). + CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. + CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. + + // Default theme + ImGui::StyleColorsDark(this); +} + +// To scale your entire UI (e.g. if you want your app to use High DPI or generally be DPI aware) you may use this helper function. Scaling the fonts is done separately and is up to you. +// Important: This operation is lossy because we round all sizes to integer. If you need to change your scale multiples, call this over a freshly initialized ImGuiStyle structure rather than scaling multiple times. +void ImGuiStyle::ScaleAllSizes(float scale_factor) +{ + WindowPadding = ImFloor(WindowPadding * scale_factor + ImVec2(0.5f, 0.5f)); + WindowRounding = ImFloor(WindowRounding * scale_factor + 0.5f); + WindowMinSize = ImFloor(WindowMinSize * scale_factor + ImVec2(0.5f, 0.5f)); + ChildRounding = ImFloor(ChildRounding * scale_factor + 0.5f); + PopupRounding = ImFloor(PopupRounding * scale_factor + 0.5f); + FramePadding = ImFloor(FramePadding * scale_factor + ImVec2(0.5f, 0.5f)); + FrameRounding = ImFloor(FrameRounding * scale_factor + 0.5f); + ItemSpacing = ImFloor(ItemSpacing * scale_factor + ImVec2(0.5f, 0.5f)); + ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor + ImVec2(0.5f, 0.5f)); + CellPadding = ImFloor(CellPadding * scale_factor + ImVec2(0.5f, 0.5f)); + TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor + ImVec2(0.5f, 0.5f)); + IndentSpacing = ImFloor(IndentSpacing * scale_factor + 0.5f); + ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor + 0.5f); + ScrollbarSize = ImFloor(ScrollbarSize * scale_factor + 0.5f); + ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor + 0.5f); + GrabMinSize = ImFloor(GrabMinSize * scale_factor + 0.5f); + GrabRounding = ImFloor(GrabRounding * scale_factor + 0.5f); + LogSliderDeadzone = ImFloor(LogSliderDeadzone * scale_factor + 0.5f); + TabRounding = ImFloor(TabRounding * scale_factor + 0.5f); + TabMinWidthForCloseButton = (TabMinWidthForCloseButton != FLT_MAX) ? ImFloor(TabMinWidthForCloseButton * scale_factor + 0.5f) : FLT_MAX; + DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor + ImVec2(0.5f, 0.5f)); + DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor + ImVec2(0.5f, 0.5f)); + MouseCursorScale = ImFloor(MouseCursorScale * scale_factor + 0.5f); +} + +ImGuiIO::ImGuiIO() +{ + // Most fields are initialized with zero + memset(this, 0, sizeof(*this)); + IM_STATIC_ASSERT(IM_ARRAYSIZE(ImGuiIO::MouseDown) == ImGuiMouseButton_COUNT && IM_ARRAYSIZE(ImGuiIO::MouseClicked) == ImGuiMouseButton_COUNT); + + // Settings + ConfigFlags = ImGuiConfigFlags_None; + BackendFlags = ImGuiBackendFlags_None; + DisplaySize = ImVec2(-1.0f, -1.0f); + DeltaTime = 1.0f / 60.0f; + IniSavingRate = 5.0f; + IniFilename = "imgui.ini"; // Important: "imgui.ini" is relative to current working dir, most apps will want to lock this to an absolute path (e.g. same path as executables). + LogFilename = "imgui_log.txt"; + MouseDoubleClickTime = 0.30f; + MouseDoubleClickMaxDist = 6.0f; +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + for (int i = 0; i < ImGuiKey_COUNT; i++) + KeyMap[i] = -1; +#endif + KeyRepeatDelay = 0.275f; + KeyRepeatRate = 0.050f; + UserData = NULL; + + Fonts = NULL; + FontGlobalScale = 1.0f; + FontDefault = NULL; + FontAllowUserScaling = false; + DisplayFramebufferScale = ImVec2(1.0f, 1.0f); + + // Miscellaneous options + MouseDrawCursor = false; +#ifdef __APPLE__ + ConfigMacOSXBehaviors = true; // Set Mac OS X style defaults based on __APPLE__ compile time flag +#else + ConfigMacOSXBehaviors = false; +#endif + ConfigInputTrickleEventQueue = true; + ConfigInputTextCursorBlink = true; + ConfigWindowsResizeFromEdges = true; + ConfigWindowsMoveFromTitleBarOnly = false; + ConfigMemoryCompactTimer = 60.0f; + + // Platform Functions + BackendPlatformName = BackendRendererName = NULL; + BackendPlatformUserData = BackendRendererUserData = BackendLanguageUserData = NULL; + GetClipboardTextFn = GetClipboardTextFn_DefaultImpl; // Platform dependent default implementations + SetClipboardTextFn = SetClipboardTextFn_DefaultImpl; + ClipboardUserData = NULL; + SetPlatformImeDataFn = SetPlatformImeDataFn_DefaultImpl; + + // Input (NB: we already have memset zero the entire structure!) + MousePos = ImVec2(-FLT_MAX, -FLT_MAX); + MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX); + MouseDragThreshold = 6.0f; + for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f; + for (int i = 0; i < IM_ARRAYSIZE(KeysData); i++) { KeysData[i].DownDuration = KeysData[i].DownDurationPrev = -1.0f; } + for (int i = 0; i < IM_ARRAYSIZE(NavInputsDownDuration); i++) NavInputsDownDuration[i] = -1.0f; + BackendUsingLegacyKeyArrays = (ImS8)-1; + BackendUsingLegacyNavInputArray = true; // assume using legacy array until proven wrong +} + +// Pass in translated ASCII characters for text input. +// - with glfw you can get those from the callback set in glfwSetCharCallback() +// - on Windows you can get those using ToAscii+keyboard state, or via the WM_CHAR message +// FIXME: Should in theory be called "AddCharacterEvent()" to be consistent with new API +void ImGuiIO::AddInputCharacter(unsigned int c) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(&g.IO == this && "Can only add events to current context."); + if (c == 0) + return; + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_Text; + e.Source = ImGuiInputSource_Keyboard; + e.Text.Char = c; + g.InputEventsQueue.push_back(e); +} + +// UTF16 strings use surrogate pairs to encode codepoints >= 0x10000, so +// we should save the high surrogate. +void ImGuiIO::AddInputCharacterUTF16(ImWchar16 c) +{ + if (c == 0 && InputQueueSurrogate == 0) + return; + + if ((c & 0xFC00) == 0xD800) // High surrogate, must save + { + if (InputQueueSurrogate != 0) + AddInputCharacter(IM_UNICODE_CODEPOINT_INVALID); + InputQueueSurrogate = c; + return; + } + + ImWchar cp = c; + if (InputQueueSurrogate != 0) + { + if ((c & 0xFC00) != 0xDC00) // Invalid low surrogate + { + AddInputCharacter(IM_UNICODE_CODEPOINT_INVALID); + } + else + { +#if IM_UNICODE_CODEPOINT_MAX == 0xFFFF + cp = IM_UNICODE_CODEPOINT_INVALID; // Codepoint will not fit in ImWchar +#else + cp = (ImWchar)(((InputQueueSurrogate - 0xD800) << 10) + (c - 0xDC00) + 0x10000); +#endif + } + + InputQueueSurrogate = 0; + } + AddInputCharacter((unsigned)cp); +} + +void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars) +{ + while (*utf8_chars != 0) + { + unsigned int c = 0; + utf8_chars += ImTextCharFromUtf8(&c, utf8_chars, NULL); + if (c != 0) + AddInputCharacter(c); + } +} + +void ImGuiIO::ClearInputCharacters() +{ + InputQueueCharacters.resize(0); +} + +void ImGuiIO::ClearInputKeys() +{ +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + memset(KeysDown, 0, sizeof(KeysDown)); +#endif + for (int n = 0; n < IM_ARRAYSIZE(KeysData); n++) + { + KeysData[n].Down = false; + KeysData[n].DownDuration = -1.0f; + KeysData[n].DownDurationPrev = -1.0f; + } + KeyCtrl = KeyShift = KeyAlt = KeySuper = false; + KeyMods = ImGuiModFlags_None; + for (int n = 0; n < IM_ARRAYSIZE(NavInputsDownDuration); n++) + NavInputsDownDuration[n] = NavInputsDownDurationPrev[n] = -1.0f; +} + +// Queue a new key down/up event. +// - ImGuiKey key: Translated key (as in, generally ImGuiKey_A matches the key end-user would use to emit an 'A' character) +// - bool down: Is the key down? use false to signify a key release. +// - float analog_value: 0.0f..1.0f +void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value) +{ + //if (e->Down) { IMGUI_DEBUG_LOG("AddKeyEvent() Key='%s' %d, NativeKeycode = %d, NativeScancode = %d\n", ImGui::GetKeyName(e->Key), e->Down, e->NativeKeycode, e->NativeScancode); } + if (key == ImGuiKey_None) + return; + ImGuiContext& g = *GImGui; + IM_ASSERT(&g.IO == this && "Can only add events to current context."); + IM_ASSERT(ImGui::IsNamedKey(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API. + + // Verify that backend isn't mixing up using new io.AddKeyEvent() api and old io.KeysDown[] + io.KeyMap[] data. +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + IM_ASSERT((BackendUsingLegacyKeyArrays == -1 || BackendUsingLegacyKeyArrays == 0) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!"); + if (BackendUsingLegacyKeyArrays == -1) + for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++) + IM_ASSERT(KeyMap[n] == -1 && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!"); + BackendUsingLegacyKeyArrays = 0; +#endif + if (ImGui::IsGamepadKey(key)) + BackendUsingLegacyNavInputArray = false; + + // Partial filter of duplicates (not strictly needed, but makes data neater in particular for key mods and gamepad values which are most commonly spmamed) + ImGuiKeyData* key_data = ImGui::GetKeyData(key); + if (key_data->Down == down && key_data->AnalogValue == analog_value) + { + bool found = false; + for (int n = g.InputEventsQueue.Size - 1; n >= 0 && !found; n--) + if (g.InputEventsQueue[n].Type == ImGuiInputEventType_Key && g.InputEventsQueue[n].Key.Key == key) + found = true; + if (!found) + return; + } + + // Add event + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_Key; + e.Source = ImGui::IsGamepadKey(key) ? ImGuiInputSource_Gamepad : ImGuiInputSource_Keyboard; + e.Key.Key = key; + e.Key.Down = down; + e.Key.AnalogValue = analog_value; + g.InputEventsQueue.push_back(e); +} + +void ImGuiIO::AddKeyEvent(ImGuiKey key, bool down) +{ + AddKeyAnalogEvent(key, down, down ? 1.0f : 0.0f); +} + +// [Optional] Call after AddKeyEvent(). +// Specify native keycode, scancode + Specify index for legacy <1.87 IsKeyXXX() functions with native indices. +// If you are writing a backend in 2022 or don't use IsKeyXXX() with native values that are not ImGuiKey values, you can avoid calling this. +void ImGuiIO::SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native_scancode, int native_legacy_index) +{ + if (key == ImGuiKey_None) + return; + IM_ASSERT(ImGui::IsNamedKey(key)); // >= 512 + IM_ASSERT(native_legacy_index == -1 || ImGui::IsLegacyKey(native_legacy_index)); // >= 0 && <= 511 + IM_UNUSED(native_keycode); // Yet unused + IM_UNUSED(native_scancode); // Yet unused + + // Build native->imgui map so old user code can still call key functions with native 0..511 values. +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + const int legacy_key = (native_legacy_index != -1) ? native_legacy_index : native_keycode; + if (!ImGui::IsLegacyKey(legacy_key)) + return; + KeyMap[legacy_key] = key; + KeyMap[key] = legacy_key; +#else + IM_UNUSED(key); + IM_UNUSED(native_legacy_index); +#endif +} + +// Queue a mouse move event +void ImGuiIO::AddMousePosEvent(float x, float y) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(&g.IO == this && "Can only add events to current context."); + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_MousePos; + e.Source = ImGuiInputSource_Mouse; + e.MousePos.PosX = x; + e.MousePos.PosY = y; + g.InputEventsQueue.push_back(e); +} + +void ImGuiIO::AddMouseButtonEvent(int mouse_button, bool down) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(&g.IO == this && "Can only add events to current context."); + IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT); + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_MouseButton; + e.Source = ImGuiInputSource_Mouse; + e.MouseButton.Button = mouse_button; + e.MouseButton.Down = down; + g.InputEventsQueue.push_back(e); +} + +// Queue a mouse wheel event (most mouse/API will only have a Y component) +void ImGuiIO::AddMouseWheelEvent(float wheel_x, float wheel_y) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(&g.IO == this && "Can only add events to current context."); + if (wheel_x == 0.0f && wheel_y == 0.0f) + return; + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_MouseWheel; + e.Source = ImGuiInputSource_Mouse; + e.MouseWheel.WheelX = wheel_x; + e.MouseWheel.WheelY = wheel_y; + g.InputEventsQueue.push_back(e); +} + +void ImGuiIO::AddFocusEvent(bool focused) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(&g.IO == this && "Can only add events to current context."); + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_Focus; + e.AppFocused.Focused = focused; + g.InputEventsQueue.push_back(e); +} + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (Geometry functions) +//----------------------------------------------------------------------------- + +ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments) +{ + IM_ASSERT(num_segments > 0); // Use ImBezierCubicClosestPointCasteljau() + ImVec2 p_last = p1; + ImVec2 p_closest; + float p_closest_dist2 = FLT_MAX; + float t_step = 1.0f / (float)num_segments; + for (int i_step = 1; i_step <= num_segments; i_step++) + { + ImVec2 p_current = ImBezierCubicCalc(p1, p2, p3, p4, t_step * i_step); + ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p); + float dist2 = ImLengthSqr(p - p_line); + if (dist2 < p_closest_dist2) + { + p_closest = p_line; + p_closest_dist2 = dist2; + } + p_last = p_current; + } + return p_closest; +} + +// Closely mimics PathBezierToCasteljau() in imgui_draw.cpp +static void ImBezierCubicClosestPointCasteljauStep(const ImVec2& p, ImVec2& p_closest, ImVec2& p_last, float& p_closest_dist2, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) +{ + float dx = x4 - x1; + float dy = y4 - y1; + float d2 = ((x2 - x4) * dy - (y2 - y4) * dx); + float d3 = ((x3 - x4) * dy - (y3 - y4) * dx); + d2 = (d2 >= 0) ? d2 : -d2; + d3 = (d3 >= 0) ? d3 : -d3; + if ((d2 + d3) * (d2 + d3) < tess_tol * (dx * dx + dy * dy)) + { + ImVec2 p_current(x4, y4); + ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p); + float dist2 = ImLengthSqr(p - p_line); + if (dist2 < p_closest_dist2) + { + p_closest = p_line; + p_closest_dist2 = dist2; + } + p_last = p_current; + } + else if (level < 10) + { + float x12 = (x1 + x2)*0.5f, y12 = (y1 + y2)*0.5f; + float x23 = (x2 + x3)*0.5f, y23 = (y2 + y3)*0.5f; + float x34 = (x3 + x4)*0.5f, y34 = (y3 + y4)*0.5f; + float x123 = (x12 + x23)*0.5f, y123 = (y12 + y23)*0.5f; + float x234 = (x23 + x34)*0.5f, y234 = (y23 + y34)*0.5f; + float x1234 = (x123 + x234)*0.5f, y1234 = (y123 + y234)*0.5f; + ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1); + ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1); + } +} + +// tess_tol is generally the same value you would find in ImGui::GetStyle().CurveTessellationTol +// Because those ImXXX functions are lower-level than ImGui:: we cannot access this value automatically. +ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol) +{ + IM_ASSERT(tess_tol > 0.0f); + ImVec2 p_last = p1; + ImVec2 p_closest; + float p_closest_dist2 = FLT_MAX; + ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, tess_tol, 0); + return p_closest; +} + +ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p) +{ + ImVec2 ap = p - a; + ImVec2 ab_dir = b - a; + float dot = ap.x * ab_dir.x + ap.y * ab_dir.y; + if (dot < 0.0f) + return a; + float ab_len_sqr = ab_dir.x * ab_dir.x + ab_dir.y * ab_dir.y; + if (dot > ab_len_sqr) + return b; + return a + ab_dir * dot / ab_len_sqr; +} + +bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p) +{ + bool b1 = ((p.x - b.x) * (a.y - b.y) - (p.y - b.y) * (a.x - b.x)) < 0.0f; + bool b2 = ((p.x - c.x) * (b.y - c.y) - (p.y - c.y) * (b.x - c.x)) < 0.0f; + bool b3 = ((p.x - a.x) * (c.y - a.y) - (p.y - a.y) * (c.x - a.x)) < 0.0f; + return ((b1 == b2) && (b2 == b3)); +} + +void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w) +{ + ImVec2 v0 = b - a; + ImVec2 v1 = c - a; + ImVec2 v2 = p - a; + const float denom = v0.x * v1.y - v1.x * v0.y; + out_v = (v2.x * v1.y - v1.x * v2.y) / denom; + out_w = (v0.x * v2.y - v2.x * v0.y) / denom; + out_u = 1.0f - out_v - out_w; +} + +ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p) +{ + ImVec2 proj_ab = ImLineClosestPoint(a, b, p); + ImVec2 proj_bc = ImLineClosestPoint(b, c, p); + ImVec2 proj_ca = ImLineClosestPoint(c, a, p); + float dist2_ab = ImLengthSqr(p - proj_ab); + float dist2_bc = ImLengthSqr(p - proj_bc); + float dist2_ca = ImLengthSqr(p - proj_ca); + float m = ImMin(dist2_ab, ImMin(dist2_bc, dist2_ca)); + if (m == dist2_ab) + return proj_ab; + if (m == dist2_bc) + return proj_bc; + return proj_ca; +} + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions) +//----------------------------------------------------------------------------- + +// Consider using _stricmp/_strnicmp under Windows or strcasecmp/strncasecmp. We don't actually use either ImStricmp/ImStrnicmp in the codebase any more. +int ImStricmp(const char* str1, const char* str2) +{ + int d; + while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } + return d; +} + +int ImStrnicmp(const char* str1, const char* str2, size_t count) +{ + int d = 0; + while (count > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; count--; } + return d; +} + +void ImStrncpy(char* dst, const char* src, size_t count) +{ + if (count < 1) + return; + if (count > 1) + strncpy(dst, src, count - 1); + dst[count - 1] = 0; +} + +char* ImStrdup(const char* str) +{ + size_t len = strlen(str); + void* buf = IM_ALLOC(len + 1); + return (char*)memcpy(buf, (const void*)str, len + 1); +} + +char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* src) +{ + size_t dst_buf_size = p_dst_size ? *p_dst_size : strlen(dst) + 1; + size_t src_size = strlen(src) + 1; + if (dst_buf_size < src_size) + { + IM_FREE(dst); + dst = (char*)IM_ALLOC(src_size); + if (p_dst_size) + *p_dst_size = src_size; + } + return (char*)memcpy(dst, (const void*)src, src_size); +} + +const char* ImStrchrRange(const char* str, const char* str_end, char c) +{ + const char* p = (const char*)memchr(str, (int)c, str_end - str); + return p; +} + +int ImStrlenW(const ImWchar* str) +{ + //return (int)wcslen((const wchar_t*)str); // FIXME-OPT: Could use this when wchar_t are 16-bit + int n = 0; + while (*str++) n++; + return n; +} + +// Find end-of-line. Return pointer will point to either first \n, either str_end. +const char* ImStreolRange(const char* str, const char* str_end) +{ + const char* p = (const char*)memchr(str, '\n', str_end - str); + return p ? p : str_end; +} + +const ImWchar* ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin) // find beginning-of-line +{ + while (buf_mid_line > buf_begin && buf_mid_line[-1] != '\n') + buf_mid_line--; + return buf_mid_line; +} + +const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end) +{ + if (!needle_end) + needle_end = needle + strlen(needle); + + const char un0 = (char)toupper(*needle); + while ((!haystack_end && *haystack) || (haystack_end && haystack < haystack_end)) + { + if (toupper(*haystack) == un0) + { + const char* b = needle + 1; + for (const char* a = haystack + 1; b < needle_end; a++, b++) + if (toupper(*a) != toupper(*b)) + break; + if (b == needle_end) + return haystack; + } + haystack++; + } + return NULL; +} + +// Trim str by offsetting contents when there's leading data + writing a \0 at the trailing position. We use this in situation where the cost is negligible. +void ImStrTrimBlanks(char* buf) +{ + char* p = buf; + while (p[0] == ' ' || p[0] == '\t') // Leading blanks + p++; + char* p_start = p; + while (*p != 0) // Find end of string + p++; + while (p > p_start && (p[-1] == ' ' || p[-1] == '\t')) // Trailing blanks + p--; + if (p_start != buf) // Copy memory if we had leading blanks + memmove(buf, p_start, p - p_start); + buf[p - p_start] = 0; // Zero terminate +} + +const char* ImStrSkipBlank(const char* str) +{ + while (str[0] == ' ' || str[0] == '\t') + str++; + return str; +} + +// A) MSVC version appears to return -1 on overflow, whereas glibc appears to return total count (which may be >= buf_size). +// Ideally we would test for only one of those limits at runtime depending on the behavior the vsnprintf(), but trying to deduct it at compile time sounds like a pandora can of worm. +// B) When buf==NULL vsnprintf() will return the output size. +#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS + +// We support stb_sprintf which is much faster (see: https://github.com/nothings/stb/blob/master/stb_sprintf.h) +// You may set IMGUI_USE_STB_SPRINTF to use our default wrapper, or set IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS +// and setup the wrapper yourself. (FIXME-OPT: Some of our high-level operations such as ImGuiTextBuffer::appendfv() are +// designed using two-passes worst case, which probably could be improved using the stbsp_vsprintfcb() function.) +#ifdef IMGUI_USE_STB_SPRINTF +#define STB_SPRINTF_IMPLEMENTATION +#ifdef IMGUI_STB_SPRINTF_FILENAME +#include IMGUI_STB_SPRINTF_FILENAME +#else +#include "stb_sprintf.h" +#endif +#endif + +#if defined(_MSC_VER) && !defined(vsnprintf) +#define vsnprintf _vsnprintf +#endif + +int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); +#ifdef IMGUI_USE_STB_SPRINTF + int w = stbsp_vsnprintf(buf, (int)buf_size, fmt, args); +#else + int w = vsnprintf(buf, buf_size, fmt, args); +#endif + va_end(args); + if (buf == NULL) + return w; + if (w == -1 || w >= (int)buf_size) + w = (int)buf_size - 1; + buf[w] = 0; + return w; +} + +int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) +{ +#ifdef IMGUI_USE_STB_SPRINTF + int w = stbsp_vsnprintf(buf, (int)buf_size, fmt, args); +#else + int w = vsnprintf(buf, buf_size, fmt, args); +#endif + if (buf == NULL) + return w; + if (w == -1 || w >= (int)buf_size) + w = (int)buf_size - 1; + buf[w] = 0; + return w; +} +#endif // #ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS + +// CRC32 needs a 1KB lookup table (not cache friendly) +// Although the code to generate the table is simple and shorter than the table itself, using a const table allows us to easily: +// - avoid an unnecessary branch/memory tap, - keep the ImHashXXX functions usable by static constructors, - make it thread-safe. +static const ImU32 GCrc32LookupTable[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, +}; + +// Known size hash +// It is ok to call ImHashData on a string with known length but the ### operator won't be supported. +// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements. +ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed) +{ + ImU32 crc = ~seed; + const unsigned char* data = (const unsigned char*)data_p; + const ImU32* crc32_lut = GCrc32LookupTable; + while (data_size-- != 0) + crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *data++]; + return ~crc; +} + +// Zero-terminated string hash, with support for ### to reset back to seed value +// We support a syntax of "label###id" where only "###id" is included in the hash, and only "label" gets displayed. +// Because this syntax is rarely used we are optimizing for the common case. +// - If we reach ### in the string we discard the hash so far and reset to the seed. +// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller/faster (measured ~10% diff in Debug build) +// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements. +ImGuiID ImHashStr(const char* data_p, size_t data_size, ImU32 seed) +{ + seed = ~seed; + ImU32 crc = seed; + const unsigned char* data = (const unsigned char*)data_p; + const ImU32* crc32_lut = GCrc32LookupTable; + if (data_size != 0) + { + while (data_size-- != 0) + { + unsigned char c = *data++; + if (c == '#' && data_size >= 2 && data[0] == '#' && data[1] == '#') + crc = seed; + crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c]; + } + } + else + { + while (unsigned char c = *data++) + { + if (c == '#' && data[0] == '#' && data[1] == '#') + crc = seed; + crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c]; + } + } + return ~crc; +} + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (File functions) +//----------------------------------------------------------------------------- + +// Default file functions +#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS + +ImFileHandle ImFileOpen(const char* filename, const char* mode) +{ +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(__CYGWIN__) && !defined(__GNUC__) + // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. + // Previously we used ImTextCountCharsFromUtf8/ImTextStrFromUtf8 here but we now need to support ImWchar16 and ImWchar32! + const int filename_wsize = ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0); + const int mode_wsize = ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0); + ImVector buf; + buf.resize(filename_wsize + mode_wsize); + ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, (wchar_t*)&buf[0], filename_wsize); + ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, (wchar_t*)&buf[filename_wsize], mode_wsize); + return ::_wfopen((const wchar_t*)&buf[0], (const wchar_t*)&buf[filename_wsize]); +#else + return fopen(filename, mode); +#endif +} + +// We should in theory be using fseeko()/ftello() with off_t and _fseeki64()/_ftelli64() with __int64, waiting for the PR that does that in a very portable pre-C++11 zero-warnings way. +bool ImFileClose(ImFileHandle f) { return fclose(f) == 0; } +ImU64 ImFileGetSize(ImFileHandle f) { long off = 0, sz = 0; return ((off = ftell(f)) != -1 && !fseek(f, 0, SEEK_END) && (sz = ftell(f)) != -1 && !fseek(f, off, SEEK_SET)) ? (ImU64)sz : (ImU64)-1; } +ImU64 ImFileRead(void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fread(data, (size_t)sz, (size_t)count, f); } +ImU64 ImFileWrite(const void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fwrite(data, (size_t)sz, (size_t)count, f); } +#endif // #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS + +// Helper: Load file content into memory +// Memory allocated with IM_ALLOC(), must be freed by user using IM_FREE() == ImGui::MemFree() +// This can't really be used with "rt" because fseek size won't match read size. +void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size, int padding_bytes) +{ + IM_ASSERT(filename && mode); + if (out_file_size) + *out_file_size = 0; + + ImFileHandle f; + if ((f = ImFileOpen(filename, mode)) == NULL) + return NULL; + + size_t file_size = (size_t)ImFileGetSize(f); + if (file_size == (size_t)-1) + { + ImFileClose(f); + return NULL; + } + + void* file_data = IM_ALLOC(file_size + padding_bytes); + if (file_data == NULL) + { + ImFileClose(f); + return NULL; + } + if (ImFileRead(file_data, 1, file_size, f) != file_size) + { + ImFileClose(f); + IM_FREE(file_data); + return NULL; + } + if (padding_bytes > 0) + memset((void*)(((char*)file_data) + file_size), 0, (size_t)padding_bytes); + + ImFileClose(f); + if (out_file_size) + *out_file_size = file_size; + + return file_data; +} + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (ImText* functions) +//----------------------------------------------------------------------------- + +// Convert UTF-8 to 32-bit character, process single character input. +// A nearly-branchless UTF-8 decoder, based on work of Christopher Wellons (https://github.com/skeeto/branchless-utf8). +// We handle UTF-8 decoding error by skipping forward. +int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end) +{ + static const char lengths[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, 0 }; + static const int masks[] = { 0x00, 0x7f, 0x1f, 0x0f, 0x07 }; + static const uint32_t mins[] = { 0x400000, 0, 0x80, 0x800, 0x10000 }; + static const int shiftc[] = { 0, 18, 12, 6, 0 }; + static const int shifte[] = { 0, 6, 4, 2, 0 }; + int len = lengths[*(const unsigned char*)in_text >> 3]; + int wanted = len + !len; + + if (in_text_end == NULL) + in_text_end = in_text + wanted; // Max length, nulls will be taken into account. + + // Copy at most 'len' bytes, stop copying at 0 or past in_text_end. Branch predictor does a good job here, + // so it is fast even with excessive branching. + unsigned char s[4]; + s[0] = in_text + 0 < in_text_end ? in_text[0] : 0; + s[1] = in_text + 1 < in_text_end ? in_text[1] : 0; + s[2] = in_text + 2 < in_text_end ? in_text[2] : 0; + s[3] = in_text + 3 < in_text_end ? in_text[3] : 0; + + // Assume a four-byte character and load four bytes. Unused bits are shifted out. + *out_char = (uint32_t)(s[0] & masks[len]) << 18; + *out_char |= (uint32_t)(s[1] & 0x3f) << 12; + *out_char |= (uint32_t)(s[2] & 0x3f) << 6; + *out_char |= (uint32_t)(s[3] & 0x3f) << 0; + *out_char >>= shiftc[len]; + + // Accumulate the various error conditions. + int e = 0; + e = (*out_char < mins[len]) << 6; // non-canonical encoding + e |= ((*out_char >> 11) == 0x1b) << 7; // surrogate half? + e |= (*out_char > IM_UNICODE_CODEPOINT_MAX) << 8; // out of range? + e |= (s[1] & 0xc0) >> 2; + e |= (s[2] & 0xc0) >> 4; + e |= (s[3] ) >> 6; + e ^= 0x2a; // top two bits of each tail byte correct? + e >>= shifte[len]; + + if (e) + { + // No bytes are consumed when *in_text == 0 || in_text == in_text_end. + // One byte is consumed in case of invalid first byte of in_text. + // All available bytes (at most `len` bytes) are consumed on incomplete/invalid second to last bytes. + // Invalid or incomplete input may consume less bytes than wanted, therefore every byte has to be inspected in s. + wanted = ImMin(wanted, !!s[0] + !!s[1] + !!s[2] + !!s[3]); + *out_char = IM_UNICODE_CODEPOINT_INVALID; + } + + return wanted; +} + +int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_text_remaining) +{ + ImWchar* buf_out = buf; + ImWchar* buf_end = buf + buf_size; + while (buf_out < buf_end - 1 && (!in_text_end || in_text < in_text_end) && *in_text) + { + unsigned int c; + in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); + if (c == 0) + break; + *buf_out++ = (ImWchar)c; + } + *buf_out = 0; + if (in_text_remaining) + *in_text_remaining = in_text; + return (int)(buf_out - buf); +} + +int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end) +{ + int char_count = 0; + while ((!in_text_end || in_text < in_text_end) && *in_text) + { + unsigned int c; + in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); + if (c == 0) + break; + char_count++; + } + return char_count; +} + +// Based on stb_to_utf8() from github.com/nothings/stb/ +static inline int ImTextCharToUtf8_inline(char* buf, int buf_size, unsigned int c) +{ + if (c < 0x80) + { + buf[0] = (char)c; + return 1; + } + if (c < 0x800) + { + if (buf_size < 2) return 0; + buf[0] = (char)(0xc0 + (c >> 6)); + buf[1] = (char)(0x80 + (c & 0x3f)); + return 2; + } + if (c < 0x10000) + { + if (buf_size < 3) return 0; + buf[0] = (char)(0xe0 + (c >> 12)); + buf[1] = (char)(0x80 + ((c >> 6) & 0x3f)); + buf[2] = (char)(0x80 + ((c ) & 0x3f)); + return 3; + } + if (c <= 0x10FFFF) + { + if (buf_size < 4) return 0; + buf[0] = (char)(0xf0 + (c >> 18)); + buf[1] = (char)(0x80 + ((c >> 12) & 0x3f)); + buf[2] = (char)(0x80 + ((c >> 6) & 0x3f)); + buf[3] = (char)(0x80 + ((c ) & 0x3f)); + return 4; + } + // Invalid code point, the max unicode is 0x10FFFF + return 0; +} + +const char* ImTextCharToUtf8(char out_buf[5], unsigned int c) +{ + int count = ImTextCharToUtf8_inline(out_buf, 5, c); + out_buf[count] = 0; + return out_buf; +} + +// Not optimal but we very rarely use this function. +int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end) +{ + unsigned int unused = 0; + return ImTextCharFromUtf8(&unused, in_text, in_text_end); +} + +static inline int ImTextCountUtf8BytesFromChar(unsigned int c) +{ + if (c < 0x80) return 1; + if (c < 0x800) return 2; + if (c < 0x10000) return 3; + if (c <= 0x10FFFF) return 4; + return 3; +} + +int ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end) +{ + char* buf_p = out_buf; + const char* buf_end = out_buf + out_buf_size; + while (buf_p < buf_end - 1 && (!in_text_end || in_text < in_text_end) && *in_text) + { + unsigned int c = (unsigned int)(*in_text++); + if (c < 0x80) + *buf_p++ = (char)c; + else + buf_p += ImTextCharToUtf8_inline(buf_p, (int)(buf_end - buf_p - 1), c); + } + *buf_p = 0; + return (int)(buf_p - out_buf); +} + +int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end) +{ + int bytes_count = 0; + while ((!in_text_end || in_text < in_text_end) && *in_text) + { + unsigned int c = (unsigned int)(*in_text++); + if (c < 0x80) + bytes_count++; + else + bytes_count += ImTextCountUtf8BytesFromChar(c); + } + return bytes_count; +} + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (Color functions) +// Note: The Convert functions are early design which are not consistent with other API. +//----------------------------------------------------------------------------- + +IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b) +{ + float t = ((col_b >> IM_COL32_A_SHIFT) & 0xFF) / 255.f; + int r = ImLerp((int)(col_a >> IM_COL32_R_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_R_SHIFT) & 0xFF, t); + int g = ImLerp((int)(col_a >> IM_COL32_G_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_G_SHIFT) & 0xFF, t); + int b = ImLerp((int)(col_a >> IM_COL32_B_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_B_SHIFT) & 0xFF, t); + return IM_COL32(r, g, b, 0xFF); +} + +ImVec4 ImGui::ColorConvertU32ToFloat4(ImU32 in) +{ + float s = 1.0f / 255.0f; + return ImVec4( + ((in >> IM_COL32_R_SHIFT) & 0xFF) * s, + ((in >> IM_COL32_G_SHIFT) & 0xFF) * s, + ((in >> IM_COL32_B_SHIFT) & 0xFF) * s, + ((in >> IM_COL32_A_SHIFT) & 0xFF) * s); +} + +ImU32 ImGui::ColorConvertFloat4ToU32(const ImVec4& in) +{ + ImU32 out; + out = ((ImU32)IM_F32_TO_INT8_SAT(in.x)) << IM_COL32_R_SHIFT; + out |= ((ImU32)IM_F32_TO_INT8_SAT(in.y)) << IM_COL32_G_SHIFT; + out |= ((ImU32)IM_F32_TO_INT8_SAT(in.z)) << IM_COL32_B_SHIFT; + out |= ((ImU32)IM_F32_TO_INT8_SAT(in.w)) << IM_COL32_A_SHIFT; + return out; +} + +// Convert rgb floats ([0-1],[0-1],[0-1]) to hsv floats ([0-1],[0-1],[0-1]), from Foley & van Dam p592 +// Optimized http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv +void ImGui::ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v) +{ + float K = 0.f; + if (g < b) + { + ImSwap(g, b); + K = -1.f; + } + if (r < g) + { + ImSwap(r, g); + K = -2.f / 6.f - K; + } + + const float chroma = r - (g < b ? g : b); + out_h = ImFabs(K + (g - b) / (6.f * chroma + 1e-20f)); + out_s = chroma / (r + 1e-20f); + out_v = r; +} + +// Convert hsv floats ([0-1],[0-1],[0-1]) to rgb floats ([0-1],[0-1],[0-1]), from Foley & van Dam p593 +// also http://en.wikipedia.org/wiki/HSL_and_HSV +void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b) +{ + if (s == 0.0f) + { + // gray + out_r = out_g = out_b = v; + return; + } + + h = ImFmod(h, 1.0f) / (60.0f / 360.0f); + int i = (int)h; + float f = h - (float)i; + float p = v * (1.0f - s); + float q = v * (1.0f - s * f); + float t = v * (1.0f - s * (1.0f - f)); + + switch (i) + { + case 0: out_r = v; out_g = t; out_b = p; break; + case 1: out_r = q; out_g = v; out_b = p; break; + case 2: out_r = p; out_g = v; out_b = t; break; + case 3: out_r = p; out_g = q; out_b = v; break; + case 4: out_r = t; out_g = p; out_b = v; break; + case 5: default: out_r = v; out_g = p; out_b = q; break; + } +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiStorage +// Helper: Key->value storage +//----------------------------------------------------------------------------- + +// std::lower_bound but without the bullshit +static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector& data, ImGuiID key) +{ + ImGuiStorage::ImGuiStoragePair* first = data.Data; + ImGuiStorage::ImGuiStoragePair* last = data.Data + data.Size; + size_t count = (size_t)(last - first); + while (count > 0) + { + size_t count2 = count >> 1; + ImGuiStorage::ImGuiStoragePair* mid = first + count2; + if (mid->key < key) + { + first = ++mid; + count -= count2 + 1; + } + else + { + count = count2; + } + } + return first; +} + +// For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. +void ImGuiStorage::BuildSortByKey() +{ + struct StaticFunc + { + static int IMGUI_CDECL PairComparerByID(const void* lhs, const void* rhs) + { + // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that. + if (((const ImGuiStoragePair*)lhs)->key > ((const ImGuiStoragePair*)rhs)->key) return +1; + if (((const ImGuiStoragePair*)lhs)->key < ((const ImGuiStoragePair*)rhs)->key) return -1; + return 0; + } + }; + ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairComparerByID); +} + +int ImGuiStorage::GetInt(ImGuiID key, int default_val) const +{ + ImGuiStoragePair* it = LowerBound(const_cast&>(Data), key); + if (it == Data.end() || it->key != key) + return default_val; + return it->val_i; +} + +bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const +{ + return GetInt(key, default_val ? 1 : 0) != 0; +} + +float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const +{ + ImGuiStoragePair* it = LowerBound(const_cast&>(Data), key); + if (it == Data.end() || it->key != key) + return default_val; + return it->val_f; +} + +void* ImGuiStorage::GetVoidPtr(ImGuiID key) const +{ + ImGuiStoragePair* it = LowerBound(const_cast&>(Data), key); + if (it == Data.end() || it->key != key) + return NULL; + return it->val_p; +} + +// References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. +int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + it = Data.insert(it, ImGuiStoragePair(key, default_val)); + return &it->val_i; +} + +bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val) +{ + return (bool*)GetIntRef(key, default_val ? 1 : 0); +} + +float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + it = Data.insert(it, ImGuiStoragePair(key, default_val)); + return &it->val_f; +} + +void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + it = Data.insert(it, ImGuiStoragePair(key, default_val)); + return &it->val_p; +} + +// FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame) +void ImGuiStorage::SetInt(ImGuiID key, int val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + { + Data.insert(it, ImGuiStoragePair(key, val)); + return; + } + it->val_i = val; +} + +void ImGuiStorage::SetBool(ImGuiID key, bool val) +{ + SetInt(key, val ? 1 : 0); +} + +void ImGuiStorage::SetFloat(ImGuiID key, float val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + { + Data.insert(it, ImGuiStoragePair(key, val)); + return; + } + it->val_f = val; +} + +void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + { + Data.insert(it, ImGuiStoragePair(key, val)); + return; + } + it->val_p = val; +} + +void ImGuiStorage::SetAllInt(int v) +{ + for (int i = 0; i < Data.Size; i++) + Data[i].val_i = v; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiTextFilter +//----------------------------------------------------------------------------- + +// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" +ImGuiTextFilter::ImGuiTextFilter(const char* default_filter) //-V1077 +{ + InputBuf[0] = 0; + CountGrep = 0; + if (default_filter) + { + ImStrncpy(InputBuf, default_filter, IM_ARRAYSIZE(InputBuf)); + Build(); + } +} + +bool ImGuiTextFilter::Draw(const char* label, float width) +{ + if (width != 0.0f) + ImGui::SetNextItemWidth(width); + bool value_changed = ImGui::InputText(label, InputBuf, IM_ARRAYSIZE(InputBuf)); + if (value_changed) + Build(); + return value_changed; +} + +void ImGuiTextFilter::ImGuiTextRange::split(char separator, ImVector* out) const +{ + out->resize(0); + const char* wb = b; + const char* we = wb; + while (we < e) + { + if (*we == separator) + { + out->push_back(ImGuiTextRange(wb, we)); + wb = we + 1; + } + we++; + } + if (wb != we) + out->push_back(ImGuiTextRange(wb, we)); +} + +void ImGuiTextFilter::Build() +{ + Filters.resize(0); + ImGuiTextRange input_range(InputBuf, InputBuf + strlen(InputBuf)); + input_range.split(',', &Filters); + + CountGrep = 0; + for (int i = 0; i != Filters.Size; i++) + { + ImGuiTextRange& f = Filters[i]; + while (f.b < f.e && ImCharIsBlankA(f.b[0])) + f.b++; + while (f.e > f.b && ImCharIsBlankA(f.e[-1])) + f.e--; + if (f.empty()) + continue; + if (Filters[i].b[0] != '-') + CountGrep += 1; + } +} + +bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const +{ + if (Filters.empty()) + return true; + + if (text == NULL) + text = ""; + + for (int i = 0; i != Filters.Size; i++) + { + const ImGuiTextRange& f = Filters[i]; + if (f.empty()) + continue; + if (f.b[0] == '-') + { + // Subtract + if (ImStristr(text, text_end, f.b + 1, f.e) != NULL) + return false; + } + else + { + // Grep + if (ImStristr(text, text_end, f.b, f.e) != NULL) + return true; + } + } + + // Implicit * grep + if (CountGrep == 0) + return true; + + return false; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiTextBuffer +//----------------------------------------------------------------------------- + +// On some platform vsnprintf() takes va_list by reference and modifies it. +// va_copy is the 'correct' way to copy a va_list but Visual Studio prior to 2013 doesn't have it. +#ifndef va_copy +#if defined(__GNUC__) || defined(__clang__) +#define va_copy(dest, src) __builtin_va_copy(dest, src) +#else +#define va_copy(dest, src) (dest = src) +#endif +#endif + +char ImGuiTextBuffer::EmptyString[1] = { 0 }; + +void ImGuiTextBuffer::append(const char* str, const char* str_end) +{ + int len = str_end ? (int)(str_end - str) : (int)strlen(str); + + // Add zero-terminator the first time + const int write_off = (Buf.Size != 0) ? Buf.Size : 1; + const int needed_sz = write_off + len; + if (write_off + len >= Buf.Capacity) + { + int new_capacity = Buf.Capacity * 2; + Buf.reserve(needed_sz > new_capacity ? needed_sz : new_capacity); + } + + Buf.resize(needed_sz); + memcpy(&Buf[write_off - 1], str, (size_t)len); + Buf[write_off - 1 + len] = 0; +} + +void ImGuiTextBuffer::appendf(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + appendfv(fmt, args); + va_end(args); +} + +// Helper: Text buffer for logging/accumulating text +void ImGuiTextBuffer::appendfv(const char* fmt, va_list args) +{ + va_list args_copy; + va_copy(args_copy, args); + + int len = ImFormatStringV(NULL, 0, fmt, args); // FIXME-OPT: could do a first pass write attempt, likely successful on first pass. + if (len <= 0) + { + va_end(args_copy); + return; + } + + // Add zero-terminator the first time + const int write_off = (Buf.Size != 0) ? Buf.Size : 1; + const int needed_sz = write_off + len; + if (write_off + len >= Buf.Capacity) + { + int new_capacity = Buf.Capacity * 2; + Buf.reserve(needed_sz > new_capacity ? needed_sz : new_capacity); + } + + Buf.resize(needed_sz); + ImFormatStringV(&Buf[write_off - 1], (size_t)len + 1, fmt, args_copy); + va_end(args_copy); +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiListClipper +// This is currently not as flexible/powerful as it should be and really confusing/spaghetti, mostly because we changed +// the API mid-way through development and support two ways to using the clipper, needs some rework (see TODO) +//----------------------------------------------------------------------------- + +// FIXME-TABLE: This prevents us from using ImGuiListClipper _inside_ a table cell. +// The problem we have is that without a Begin/End scheme for rows using the clipper is ambiguous. +static bool GetSkipItemForListClipping() +{ + ImGuiContext& g = *GImGui; + return (g.CurrentTable ? g.CurrentTable->HostSkipItems : g.CurrentWindow->SkipItems); +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +// Legacy helper to calculate coarse clipping of large list of evenly sized items. +// This legacy API is not ideal because it assume we will return a single contiguous rectangle. +// Prefer using ImGuiListClipper which can returns non-contiguous ranges. +void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.LogEnabled) + { + // If logging is active, do not perform any clipping + *out_items_display_start = 0; + *out_items_display_end = items_count; + return; + } + if (GetSkipItemForListClipping()) + { + *out_items_display_start = *out_items_display_end = 0; + return; + } + + // We create the union of the ClipRect and the scoring rect which at worst should be 1 page away from ClipRect + // We don't include g.NavId's rectangle in there (unless g.NavJustMovedToId is set) because the rectangle enlargement can get costly. + ImRect rect = window->ClipRect; + if (g.NavMoveScoringItems) + rect.Add(g.NavScoringNoClipRect); + if (g.NavJustMovedToId && window->NavLastIds[0] == g.NavJustMovedToId) + rect.Add(WindowRectRelToAbs(window, window->NavRectRel[0])); // Could store and use NavJustMovedToRectRel + + const ImVec2 pos = window->DC.CursorPos; + int start = (int)((rect.Min.y - pos.y) / items_height); + int end = (int)((rect.Max.y - pos.y) / items_height); + + // When performing a navigation request, ensure we have one item extra in the direction we are moving to + // FIXME: Verify this works with tabbing + const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); + if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up) + start--; + if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down) + end++; + + start = ImClamp(start, 0, items_count); + end = ImClamp(end + 1, start, items_count); + *out_items_display_start = start; + *out_items_display_end = end; +} +#endif + +static void ImGuiListClipper_SortAndFuseRanges(ImVector& ranges, int offset = 0) +{ + if (ranges.Size - offset <= 1) + return; + + // Helper to order ranges and fuse them together if possible (bubble sort is fine as we are only sorting 2-3 entries) + for (int sort_end = ranges.Size - offset - 1; sort_end > 0; --sort_end) + for (int i = offset; i < sort_end + offset; ++i) + if (ranges[i].Min > ranges[i + 1].Min) + ImSwap(ranges[i], ranges[i + 1]); + + // Now fuse ranges together as much as possible. + for (int i = 1 + offset; i < ranges.Size; i++) + { + IM_ASSERT(!ranges[i].PosToIndexConvert && !ranges[i - 1].PosToIndexConvert); + if (ranges[i - 1].Max < ranges[i].Min) + continue; + ranges[i - 1].Min = ImMin(ranges[i - 1].Min, ranges[i].Min); + ranges[i - 1].Max = ImMax(ranges[i - 1].Max, ranges[i].Max); + ranges.erase(ranges.Data + i); + i--; + } +} + +static void ImGuiListClipper_SeekCursorAndSetupPrevLine(float pos_y, float line_height) +{ + // Set cursor position and a few other things so that SetScrollHereY() and Columns() can work when seeking cursor. + // FIXME: It is problematic that we have to do that here, because custom/equivalent end-user code would stumble on the same issue. + // The clipper should probably have a final step to display the last item in a regular manner, maybe with an opt-out flag for data sets which may have costly seek? + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float off_y = pos_y - window->DC.CursorPos.y; + window->DC.CursorPos.y = pos_y; + window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, pos_y - g.Style.ItemSpacing.y); + window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage. + window->DC.PrevLineSize.y = (line_height - g.Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list. + if (ImGuiOldColumns* columns = window->DC.CurrentColumns) + columns->LineMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly + if (ImGuiTable* table = g.CurrentTable) + { + if (table->IsInsideRow) + ImGui::TableEndRow(table); + table->RowPosY2 = window->DC.CursorPos.y; + const int row_increase = (int)((off_y / line_height) + 0.5f); + //table->CurrentRow += row_increase; // Can't do without fixing TableEndRow() + table->RowBgColorCounter += row_increase; + } +} + +static void ImGuiListClipper_SeekCursorForItem(ImGuiListClipper* clipper, int item_n) +{ + // StartPosY starts from ItemsFrozen hence the subtraction + // Perform the add and multiply with double to allow seeking through larger ranges + ImGuiListClipperData* data = (ImGuiListClipperData*)clipper->TempData; + float pos_y = (float)((double)clipper->StartPosY + data->LossynessOffset + (double)(item_n - data->ItemsFrozen) * clipper->ItemsHeight); + ImGuiListClipper_SeekCursorAndSetupPrevLine(pos_y, clipper->ItemsHeight); +} + +ImGuiListClipper::ImGuiListClipper() +{ + memset(this, 0, sizeof(*this)); + ItemsCount = -1; +} + +ImGuiListClipper::~ImGuiListClipper() +{ + End(); +} + +// Use case A: Begin() called from constructor with items_height<0, then called again from Step() in StepNo 1 +// Use case B: Begin() called from constructor with items_height>0 +// FIXME-LEGACY: Ideally we should remove the Begin/End functions but they are part of the legacy API we still support. This is why some of the code in Step() calling Begin() and reassign some fields, spaghetti style. +void ImGuiListClipper::Begin(int items_count, float items_height) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + if (ImGuiTable* table = g.CurrentTable) + if (table->IsInsideRow) + ImGui::TableEndRow(table); + + StartPosY = window->DC.CursorPos.y; + ItemsHeight = items_height; + ItemsCount = items_count; + DisplayStart = -1; + DisplayEnd = 0; + + // Acquire temporary buffer + if (++g.ClipperTempDataStacked > g.ClipperTempData.Size) + g.ClipperTempData.resize(g.ClipperTempDataStacked, ImGuiListClipperData()); + ImGuiListClipperData* data = &g.ClipperTempData[g.ClipperTempDataStacked - 1]; + data->Reset(this); + data->LossynessOffset = window->DC.CursorStartPosLossyness.y; + TempData = data; +} + +void ImGuiListClipper::End() +{ + ImGuiContext& g = *GImGui; + if (ImGuiListClipperData* data = (ImGuiListClipperData*)TempData) + { + // In theory here we should assert that we are already at the right position, but it seems saner to just seek at the end and not assert/crash the user. + if (ItemsCount >= 0 && ItemsCount < INT_MAX && DisplayStart >= 0) + ImGuiListClipper_SeekCursorForItem(this, ItemsCount); + + // Restore temporary buffer and fix back pointers which may be invalidated when nesting + IM_ASSERT(data->ListClipper == this); + data->StepNo = data->Ranges.Size; + if (--g.ClipperTempDataStacked > 0) + { + data = &g.ClipperTempData[g.ClipperTempDataStacked - 1]; + data->ListClipper->TempData = data; + } + TempData = NULL; + } + ItemsCount = -1; +} + +void ImGuiListClipper::ForceDisplayRangeByIndices(int item_min, int item_max) +{ + ImGuiListClipperData* data = (ImGuiListClipperData*)TempData; + IM_ASSERT(DisplayStart < 0); // Only allowed after Begin() and if there has not been a specified range yet. + IM_ASSERT(item_min <= item_max); + if (item_min < item_max) + data->Ranges.push_back(ImGuiListClipperRange::FromIndices(item_min, item_max)); +} + +bool ImGuiListClipper::Step() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiListClipperData* data = (ImGuiListClipperData*)TempData; + IM_ASSERT(data != NULL && "Called ImGuiListClipper::Step() too many times, or before ImGuiListClipper::Begin() ?"); + + ImGuiTable* table = g.CurrentTable; + if (table && table->IsInsideRow) + ImGui::TableEndRow(table); + + // No items + if (ItemsCount == 0 || GetSkipItemForListClipping()) + return (void)End(), false; + + // While we are in frozen row state, keep displaying items one by one, unclipped + // FIXME: Could be stored as a table-agnostic state. + if (data->StepNo == 0 && table != NULL && !table->IsUnfrozenRows) + { + DisplayStart = data->ItemsFrozen; + DisplayEnd = data->ItemsFrozen + 1; + if (DisplayStart >= ItemsCount) + return (void)End(), false; + data->ItemsFrozen++; + return true; + } + + // Step 0: Let you process the first element (regardless of it being visible or not, so we can measure the element height) + bool calc_clipping = false; + if (data->StepNo == 0) + { + StartPosY = window->DC.CursorPos.y; + if (ItemsHeight <= 0.0f) + { + // Submit the first item (or range) so we can measure its height (generally the first range is 0..1) + data->Ranges.push_front(ImGuiListClipperRange::FromIndices(data->ItemsFrozen, data->ItemsFrozen + 1)); + DisplayStart = ImMax(data->Ranges[0].Min, data->ItemsFrozen); + DisplayEnd = ImMin(data->Ranges[0].Max, ItemsCount); + if (DisplayStart == DisplayEnd) + return (void)End(), false; + data->StepNo = 1; + return true; + } + calc_clipping = true; // If on the first step with known item height, calculate clipping. + } + + // Step 1: Let the clipper infer height from first range + if (ItemsHeight <= 0.0f) + { + IM_ASSERT(data->StepNo == 1); + if (table) + IM_ASSERT(table->RowPosY1 == StartPosY && table->RowPosY2 == window->DC.CursorPos.y); + + ItemsHeight = (window->DC.CursorPos.y - StartPosY) / (float)(DisplayEnd - DisplayStart); + bool affected_by_floating_point_precision = ImIsFloatAboveGuaranteedIntegerPrecision(StartPosY) || ImIsFloatAboveGuaranteedIntegerPrecision(window->DC.CursorPos.y); + if (affected_by_floating_point_precision) + ItemsHeight = window->DC.PrevLineSize.y + g.Style.ItemSpacing.y; // FIXME: Technically wouldn't allow multi-line entries. + + IM_ASSERT(ItemsHeight > 0.0f && "Unable to calculate item height! First item hasn't moved the cursor vertically!"); + calc_clipping = true; // If item height had to be calculated, calculate clipping afterwards. + } + + // Step 0 or 1: Calculate the actual ranges of visible elements. + const int already_submitted = DisplayEnd; + if (calc_clipping) + { + if (g.LogEnabled) + { + // If logging is active, do not perform any clipping + data->Ranges.push_back(ImGuiListClipperRange::FromIndices(0, ItemsCount)); + } + else + { + // Add range selected to be included for navigation + const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); + if (is_nav_request) + data->Ranges.push_back(ImGuiListClipperRange::FromPositions(g.NavScoringNoClipRect.Min.y, g.NavScoringNoClipRect.Max.y, 0, 0)); + if (is_nav_request && (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && g.NavTabbingDir == -1) + data->Ranges.push_back(ImGuiListClipperRange::FromIndices(ItemsCount - 1, ItemsCount)); + + // Add focused/active item + ImRect nav_rect_abs = ImGui::WindowRectRelToAbs(window, window->NavRectRel[0]); + if (g.NavId != 0 && window->NavLastIds[0] == g.NavId) + data->Ranges.push_back(ImGuiListClipperRange::FromPositions(nav_rect_abs.Min.y, nav_rect_abs.Max.y, 0, 0)); + + // Add visible range + const int off_min = (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up) ? -1 : 0; + const int off_max = (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down) ? 1 : 0; + data->Ranges.push_back(ImGuiListClipperRange::FromPositions(window->ClipRect.Min.y, window->ClipRect.Max.y, off_min, off_max)); + } + + // Convert position ranges to item index ranges + // - Very important: when a starting position is after our maximum item, we set Min to (ItemsCount - 1). This allows us to handle most forms of wrapping. + // - Due to how Selectable extra padding they tend to be "unaligned" with exact unit in the item list, + // which with the flooring/ceiling tend to lead to 2 items instead of one being submitted. + for (int i = 0; i < data->Ranges.Size; i++) + if (data->Ranges[i].PosToIndexConvert) + { + int m1 = (int)(((double)data->Ranges[i].Min - window->DC.CursorPos.y - data->LossynessOffset) / ItemsHeight); + int m2 = (int)((((double)data->Ranges[i].Max - window->DC.CursorPos.y - data->LossynessOffset) / ItemsHeight) + 0.999999f); + data->Ranges[i].Min = ImClamp(already_submitted + m1 + data->Ranges[i].PosToIndexOffsetMin, already_submitted, ItemsCount - 1); + data->Ranges[i].Max = ImClamp(already_submitted + m2 + data->Ranges[i].PosToIndexOffsetMax, data->Ranges[i].Min + 1, ItemsCount); + data->Ranges[i].PosToIndexConvert = false; + } + ImGuiListClipper_SortAndFuseRanges(data->Ranges, data->StepNo); + } + + // Step 0+ (if item height is given in advance) or 1+: Display the next range in line. + if (data->StepNo < data->Ranges.Size) + { + DisplayStart = ImMax(data->Ranges[data->StepNo].Min, already_submitted); + DisplayEnd = ImMin(data->Ranges[data->StepNo].Max, ItemsCount); + if (DisplayStart > already_submitted) //-V1051 + ImGuiListClipper_SeekCursorForItem(this, DisplayStart); + data->StepNo++; + return true; + } + + // After the last step: Let the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), + // Advance the cursor to the end of the list and then returns 'false' to end the loop. + if (ItemsCount < INT_MAX) + ImGuiListClipper_SeekCursorForItem(this, ItemsCount); + + End(); + return false; +} + +//----------------------------------------------------------------------------- +// [SECTION] STYLING +//----------------------------------------------------------------------------- + +ImGuiStyle& ImGui::GetStyle() +{ + IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); + return GImGui->Style; +} + +ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul) +{ + ImGuiStyle& style = GImGui->Style; + ImVec4 c = style.Colors[idx]; + c.w *= style.Alpha * alpha_mul; + return ColorConvertFloat4ToU32(c); +} + +ImU32 ImGui::GetColorU32(const ImVec4& col) +{ + ImGuiStyle& style = GImGui->Style; + ImVec4 c = col; + c.w *= style.Alpha; + return ColorConvertFloat4ToU32(c); +} + +const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx) +{ + ImGuiStyle& style = GImGui->Style; + return style.Colors[idx]; +} + +ImU32 ImGui::GetColorU32(ImU32 col) +{ + ImGuiStyle& style = GImGui->Style; + if (style.Alpha >= 1.0f) + return col; + ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT; + a = (ImU32)(a * style.Alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range. + return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT); +} + +// FIXME: This may incur a round-trip (if the end user got their data from a float4) but eventually we aim to store the in-flight colors as ImU32 +void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col) +{ + ImGuiContext& g = *GImGui; + ImGuiColorMod backup; + backup.Col = idx; + backup.BackupValue = g.Style.Colors[idx]; + g.ColorStack.push_back(backup); + g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); +} + +void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) +{ + ImGuiContext& g = *GImGui; + ImGuiColorMod backup; + backup.Col = idx; + backup.BackupValue = g.Style.Colors[idx]; + g.ColorStack.push_back(backup); + g.Style.Colors[idx] = col; +} + +void ImGui::PopStyleColor(int count) +{ + ImGuiContext& g = *GImGui; + while (count > 0) + { + ImGuiColorMod& backup = g.ColorStack.back(); + g.Style.Colors[backup.Col] = backup.BackupValue; + g.ColorStack.pop_back(); + count--; + } +} + +struct ImGuiStyleVarInfo +{ + ImGuiDataType Type; + ImU32 Count; + ImU32 Offset; + void* GetVarPtr(ImGuiStyle* style) const { return (void*)((unsigned char*)style + Offset); } +}; + +static const ImGuiStyleVarInfo GStyleVarInfo[] = +{ + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, DisabledAlpha) }, // ImGuiStyleVar_DisabledAlpha + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign +}; + +static const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx) +{ + IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_COUNT); + IM_ASSERT(IM_ARRAYSIZE(GStyleVarInfo) == ImGuiStyleVar_COUNT); + return &GStyleVarInfo[idx]; +} + +void ImGui::PushStyleVar(ImGuiStyleVar idx, float val) +{ + const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); + if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1) + { + ImGuiContext& g = *GImGui; + float* pvar = (float*)var_info->GetVarPtr(&g.Style); + g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar)); + *pvar = val; + return; + } + IM_ASSERT(0 && "Called PushStyleVar() float variant but variable is not a float!"); +} + +void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) +{ + const ImGuiStyleVarInfo* var_info = GetStyleVarInfo(idx); + if (var_info->Type == ImGuiDataType_Float && var_info->Count == 2) + { + ImGuiContext& g = *GImGui; + ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style); + g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar)); + *pvar = val; + return; + } + IM_ASSERT(0 && "Called PushStyleVar() ImVec2 variant but variable is not a ImVec2!"); +} + +void ImGui::PopStyleVar(int count) +{ + ImGuiContext& g = *GImGui; + while (count > 0) + { + // We avoid a generic memcpy(data, &backup.Backup.., GDataTypeSize[info->Type] * info->Count), the overhead in Debug is not worth it. + ImGuiStyleMod& backup = g.StyleVarStack.back(); + const ImGuiStyleVarInfo* info = GetStyleVarInfo(backup.VarIdx); + void* data = info->GetVarPtr(&g.Style); + if (info->Type == ImGuiDataType_Float && info->Count == 1) { ((float*)data)[0] = backup.BackupFloat[0]; } + else if (info->Type == ImGuiDataType_Float && info->Count == 2) { ((float*)data)[0] = backup.BackupFloat[0]; ((float*)data)[1] = backup.BackupFloat[1]; } + g.StyleVarStack.pop_back(); + count--; + } +} + +const char* ImGui::GetStyleColorName(ImGuiCol idx) +{ + // Create switch-case from enum with regexp: ImGuiCol_{.*}, --> case ImGuiCol_\1: return "\1"; + switch (idx) + { + case ImGuiCol_Text: return "Text"; + case ImGuiCol_TextDisabled: return "TextDisabled"; + case ImGuiCol_WindowBg: return "WindowBg"; + case ImGuiCol_ChildBg: return "ChildBg"; + case ImGuiCol_PopupBg: return "PopupBg"; + case ImGuiCol_Border: return "Border"; + case ImGuiCol_BorderShadow: return "BorderShadow"; + case ImGuiCol_FrameBg: return "FrameBg"; + case ImGuiCol_FrameBgHovered: return "FrameBgHovered"; + case ImGuiCol_FrameBgActive: return "FrameBgActive"; + case ImGuiCol_TitleBg: return "TitleBg"; + case ImGuiCol_TitleBgActive: return "TitleBgActive"; + case ImGuiCol_TitleBgCollapsed: return "TitleBgCollapsed"; + case ImGuiCol_MenuBarBg: return "MenuBarBg"; + case ImGuiCol_ScrollbarBg: return "ScrollbarBg"; + case ImGuiCol_ScrollbarGrab: return "ScrollbarGrab"; + case ImGuiCol_ScrollbarGrabHovered: return "ScrollbarGrabHovered"; + case ImGuiCol_ScrollbarGrabActive: return "ScrollbarGrabActive"; + case ImGuiCol_CheckMark: return "CheckMark"; + case ImGuiCol_SliderGrab: return "SliderGrab"; + case ImGuiCol_SliderGrabActive: return "SliderGrabActive"; + case ImGuiCol_Button: return "Button"; + case ImGuiCol_ButtonHovered: return "ButtonHovered"; + case ImGuiCol_ButtonActive: return "ButtonActive"; + case ImGuiCol_Header: return "Header"; + case ImGuiCol_HeaderHovered: return "HeaderHovered"; + case ImGuiCol_HeaderActive: return "HeaderActive"; + case ImGuiCol_Separator: return "Separator"; + case ImGuiCol_SeparatorHovered: return "SeparatorHovered"; + case ImGuiCol_SeparatorActive: return "SeparatorActive"; + case ImGuiCol_ResizeGrip: return "ResizeGrip"; + case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered"; + case ImGuiCol_ResizeGripActive: return "ResizeGripActive"; + case ImGuiCol_Tab: return "Tab"; + case ImGuiCol_TabHovered: return "TabHovered"; + case ImGuiCol_TabActive: return "TabActive"; + case ImGuiCol_TabUnfocused: return "TabUnfocused"; + case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive"; + case ImGuiCol_PlotLines: return "PlotLines"; + case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered"; + case ImGuiCol_PlotHistogram: return "PlotHistogram"; + case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered"; + case ImGuiCol_TableHeaderBg: return "TableHeaderBg"; + case ImGuiCol_TableBorderStrong: return "TableBorderStrong"; + case ImGuiCol_TableBorderLight: return "TableBorderLight"; + case ImGuiCol_TableRowBg: return "TableRowBg"; + case ImGuiCol_TableRowBgAlt: return "TableRowBgAlt"; + case ImGuiCol_TextSelectedBg: return "TextSelectedBg"; + case ImGuiCol_DragDropTarget: return "DragDropTarget"; + case ImGuiCol_NavHighlight: return "NavHighlight"; + case ImGuiCol_NavWindowingHighlight: return "NavWindowingHighlight"; + case ImGuiCol_NavWindowingDimBg: return "NavWindowingDimBg"; + case ImGuiCol_ModalWindowDimBg: return "ModalWindowDimBg"; + } + IM_ASSERT(0); + return "Unknown"; +} + + +//----------------------------------------------------------------------------- +// [SECTION] RENDER HELPERS +// Some of those (internal) functions are currently quite a legacy mess - their signature and behavior will change, +// we need a nicer separation between low-level functions and high-level functions relying on the ImGui context. +// Also see imgui_draw.cpp for some more which have been reworked to not rely on ImGui:: context. +//----------------------------------------------------------------------------- + +const char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end) +{ + const char* text_display_end = text; + if (!text_end) + text_end = (const char*)-1; + + while (text_display_end < text_end && *text_display_end != '\0' && (text_display_end[0] != '#' || text_display_end[1] != '#')) + text_display_end++; + return text_display_end; +} + +// Internal ImGui functions to render text +// RenderText***() functions calls ImDrawList::AddText() calls ImBitmapFont::RenderText() +void ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Hide anything after a '##' string + const char* text_display_end; + if (hide_text_after_hash) + { + text_display_end = FindRenderedTextEnd(text, text_end); + } + else + { + if (!text_end) + text_end = text + strlen(text); // FIXME-OPT + text_display_end = text_end; + } + + if (text != text_display_end) + { + window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end); + if (g.LogEnabled) + LogRenderedText(&pos, text, text_display_end); + } +} + +void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + if (!text_end) + text_end = text + strlen(text); // FIXME-OPT + + if (text != text_end) + { + window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_end, wrap_width); + if (g.LogEnabled) + LogRenderedText(&pos, text, text_end); + } +} + +// Default clip_rect uses (pos_min,pos_max) +// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges) +void ImGui::RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_display_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect) +{ + // Perform CPU side clipping for single clipped element to avoid using scissor state + ImVec2 pos = pos_min; + const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_display_end, false, 0.0f); + + const ImVec2* clip_min = clip_rect ? &clip_rect->Min : &pos_min; + const ImVec2* clip_max = clip_rect ? &clip_rect->Max : &pos_max; + bool need_clipping = (pos.x + text_size.x >= clip_max->x) || (pos.y + text_size.y >= clip_max->y); + if (clip_rect) // If we had no explicit clipping rectangle then pos==clip_min + need_clipping |= (pos.x < clip_min->x) || (pos.y < clip_min->y); + + // Align whole block. We should defer that to the better rendering function when we'll have support for individual line alignment. + if (align.x > 0.0f) pos.x = ImMax(pos.x, pos.x + (pos_max.x - pos.x - text_size.x) * align.x); + if (align.y > 0.0f) pos.y = ImMax(pos.y, pos.y + (pos_max.y - pos.y - text_size.y) * align.y); + + // Render + if (need_clipping) + { + ImVec4 fine_clip_rect(clip_min->x, clip_min->y, clip_max->x, clip_max->y); + draw_list->AddText(NULL, 0.0f, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, &fine_clip_rect); + } + else + { + draw_list->AddText(NULL, 0.0f, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, NULL); + } +} + +void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect) +{ + // Hide anything after a '##' string + const char* text_display_end = FindRenderedTextEnd(text, text_end); + const int text_len = (int)(text_display_end - text); + if (text_len == 0) + return; + + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + RenderTextClippedEx(window->DrawList, pos_min, pos_max, text, text_display_end, text_size_if_known, align, clip_rect); + if (g.LogEnabled) + LogRenderedText(&pos_min, text, text_display_end); +} + + +// Another overly complex function until we reorganize everything into a nice all-in-one helper. +// This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display. +// This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but we don't want the ellipsis to move. +void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end_full, const ImVec2* text_size_if_known) +{ + ImGuiContext& g = *GImGui; + if (text_end_full == NULL) + text_end_full = FindRenderedTextEnd(text); + const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_end_full, false, 0.0f); + + //draw_list->AddLine(ImVec2(pos_max.x, pos_min.y - 4), ImVec2(pos_max.x, pos_max.y + 4), IM_COL32(0, 0, 255, 255)); + //draw_list->AddLine(ImVec2(ellipsis_max_x, pos_min.y-2), ImVec2(ellipsis_max_x, pos_max.y+2), IM_COL32(0, 255, 0, 255)); + //draw_list->AddLine(ImVec2(clip_max_x, pos_min.y), ImVec2(clip_max_x, pos_max.y), IM_COL32(255, 0, 0, 255)); + // FIXME: We could technically remove (last_glyph->AdvanceX - last_glyph->X1) from text_size.x here and save a few pixels. + if (text_size.x > pos_max.x - pos_min.x) + { + // Hello wo... + // | | | + // min max ellipsis_max + // <-> this is generally some padding value + + const ImFont* font = draw_list->_Data->Font; + const float font_size = draw_list->_Data->FontSize; + const char* text_end_ellipsis = NULL; + + ImWchar ellipsis_char = font->EllipsisChar; + int ellipsis_char_count = 1; + if (ellipsis_char == (ImWchar)-1) + { + ellipsis_char = font->DotChar; + ellipsis_char_count = 3; + } + const ImFontGlyph* glyph = font->FindGlyph(ellipsis_char); + + float ellipsis_glyph_width = glyph->X1; // Width of the glyph with no padding on either side + float ellipsis_total_width = ellipsis_glyph_width; // Full width of entire ellipsis + + if (ellipsis_char_count > 1) + { + // Full ellipsis size without free spacing after it. + const float spacing_between_dots = 1.0f * (draw_list->_Data->FontSize / font->FontSize); + ellipsis_glyph_width = glyph->X1 - glyph->X0 + spacing_between_dots; + ellipsis_total_width = ellipsis_glyph_width * (float)ellipsis_char_count - spacing_between_dots; + } + + // We can now claim the space between pos_max.x and ellipsis_max.x + const float text_avail_width = ImMax((ImMax(pos_max.x, ellipsis_max_x) - ellipsis_total_width) - pos_min.x, 1.0f); + float text_size_clipped_x = font->CalcTextSizeA(font_size, text_avail_width, 0.0f, text, text_end_full, &text_end_ellipsis).x; + if (text == text_end_ellipsis && text_end_ellipsis < text_end_full) + { + // Always display at least 1 character if there's no room for character + ellipsis + text_end_ellipsis = text + ImTextCountUtf8BytesFromChar(text, text_end_full); + text_size_clipped_x = font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text, text_end_ellipsis).x; + } + while (text_end_ellipsis > text && ImCharIsBlankA(text_end_ellipsis[-1])) + { + // Trim trailing space before ellipsis (FIXME: Supporting non-ascii blanks would be nice, for this we need a function to backtrack in UTF-8 text) + text_end_ellipsis--; + text_size_clipped_x -= font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text_end_ellipsis, text_end_ellipsis + 1).x; // Ascii blanks are always 1 byte + } + + // Render text, render ellipsis + RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f)); + float ellipsis_x = pos_min.x + text_size_clipped_x; + if (ellipsis_x + ellipsis_total_width <= ellipsis_max_x) + for (int i = 0; i < ellipsis_char_count; i++) + { + font->RenderChar(draw_list, font_size, ImVec2(ellipsis_x, pos_min.y), GetColorU32(ImGuiCol_Text), ellipsis_char); + ellipsis_x += ellipsis_glyph_width; + } + } + else + { + RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_full, &text_size, ImVec2(0.0f, 0.0f)); + } + + if (g.LogEnabled) + LogRenderedText(&pos_min, text, text_end_full); +} + +// Render a rectangle shaped with optional rounding and borders +void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border, float rounding) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + window->DrawList->AddRectFilled(p_min, p_max, fill_col, rounding); + const float border_size = g.Style.FrameBorderSize; + if (border && border_size > 0.0f) + { + window->DrawList->AddRect(p_min + ImVec2(1, 1), p_max + ImVec2(1, 1), GetColorU32(ImGuiCol_BorderShadow), rounding, 0, border_size); + window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); + } +} + +void ImGui::RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const float border_size = g.Style.FrameBorderSize; + if (border_size > 0.0f) + { + window->DrawList->AddRect(p_min + ImVec2(1, 1), p_max + ImVec2(1, 1), GetColorU32(ImGuiCol_BorderShadow), rounding, 0, border_size); + window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); + } +} + +void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags) +{ + ImGuiContext& g = *GImGui; + if (id != g.NavId) + return; + if (g.NavDisableHighlight && !(flags & ImGuiNavHighlightFlags_AlwaysDraw)) + return; + ImGuiWindow* window = g.CurrentWindow; + if (window->DC.NavHideHighlightOneFrame) + return; + + float rounding = (flags & ImGuiNavHighlightFlags_NoRounding) ? 0.0f : g.Style.FrameRounding; + ImRect display_rect = bb; + display_rect.ClipWith(window->ClipRect); + if (flags & ImGuiNavHighlightFlags_TypeDefault) + { + const float THICKNESS = 2.0f; + const float DISTANCE = 3.0f + THICKNESS * 0.5f; + display_rect.Expand(ImVec2(DISTANCE, DISTANCE)); + bool fully_visible = window->ClipRect.Contains(display_rect); + if (!fully_visible) + window->DrawList->PushClipRect(display_rect.Min, display_rect.Max); + window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), display_rect.Max - ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), GetColorU32(ImGuiCol_NavHighlight), rounding, 0, THICKNESS); + if (!fully_visible) + window->DrawList->PopClipRect(); + } + if (flags & ImGuiNavHighlightFlags_TypeThin) + { + window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, 1.0f); + } +} + +void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT); + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + ImDrawList* draw_list = GetForegroundDrawList(viewport); + ImFontAtlas* font_atlas = draw_list->_Data->Font->ContainerAtlas; + ImVec2 offset, size, uv[4]; + if (font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2])) + { + const ImVec2 pos = base_pos - offset; + const float scale = base_scale; + ImTextureID tex_id = font_atlas->TexID; + draw_list->PushTextureID(tex_id); + draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow); + draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow); + draw_list->AddImage(tex_id, pos, pos + size * scale, uv[2], uv[3], col_border); + draw_list->AddImage(tex_id, pos, pos + size * scale, uv[0], uv[1], col_fill); + draw_list->PopTextureID(); + } + } +} + + +//----------------------------------------------------------------------------- +// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!) +//----------------------------------------------------------------------------- + +// ImGuiWindow is mostly a dumb struct. It merely has a constructor and a few helper methods +ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name) : DrawListInst(NULL) +{ + memset(this, 0, sizeof(*this)); + Name = ImStrdup(name); + NameBufLen = (int)strlen(name) + 1; + ID = ImHashStr(name); + IDStack.push_back(ID); + MoveId = GetID("#MOVE"); + ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); + ScrollTargetCenterRatio = ImVec2(0.5f, 0.5f); + AutoFitFramesX = AutoFitFramesY = -1; + AutoPosLastDirection = ImGuiDir_None; + SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing; + SetWindowPosVal = SetWindowPosPivot = ImVec2(FLT_MAX, FLT_MAX); + LastFrameActive = -1; + LastTimeActive = -1.0f; + FontWindowScale = 1.0f; + SettingsOffset = -1; + DrawList = &DrawListInst; + DrawList->_Data = &context->DrawListSharedData; + DrawList->_OwnerName = Name; +} + +ImGuiWindow::~ImGuiWindow() +{ + IM_ASSERT(DrawList == &DrawListInst); + IM_DELETE(Name); + ColumnsStorage.clear_destruct(); +} + +ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); + ImGuiContext& g = *GImGui; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); + return id; +} + +ImGuiID ImGuiWindow::GetID(const void* ptr) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&ptr, sizeof(void*), seed); + ImGuiContext& g = *GImGui; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL); + return id; +} + +ImGuiID ImGuiWindow::GetID(int n) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&n, sizeof(n), seed); + ImGuiContext& g = *GImGui; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); + return id; +} + +// This is only used in rare/specific situations to manufacture an ID out of nowhere. +ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs) +{ + ImGuiID seed = IDStack.back(); + ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs); + ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed); + return id; +} + +static void SetCurrentWindow(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + g.CurrentWindow = window; + g.CurrentTable = window && window->DC.CurrentTableIdx != -1 ? g.Tables.GetByIndex(window->DC.CurrentTableIdx) : NULL; + if (window) + g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); +} + +void ImGui::GcCompactTransientMiscBuffers() +{ + ImGuiContext& g = *GImGui; + g.ItemFlagsStack.clear(); + g.GroupStack.clear(); + TableGcCompactSettings(); +} + +// Free up/compact internal window buffers, we can use this when a window becomes unused. +// Not freed: +// - ImGuiWindow, ImGuiWindowSettings, Name, StateStorage, ColumnsStorage (may hold useful data) +// This should have no noticeable visual effect. When the window reappear however, expect new allocation/buffer growth/copy cost. +void ImGui::GcCompactTransientWindowBuffers(ImGuiWindow* window) +{ + window->MemoryCompacted = true; + window->MemoryDrawListIdxCapacity = window->DrawList->IdxBuffer.Capacity; + window->MemoryDrawListVtxCapacity = window->DrawList->VtxBuffer.Capacity; + window->IDStack.clear(); + window->DrawList->_ClearFreeMemory(); + window->DC.ChildWindows.clear(); + window->DC.ItemWidthStack.clear(); + window->DC.TextWrapPosStack.clear(); +} + +void ImGui::GcAwakeTransientWindowBuffers(ImGuiWindow* window) +{ + // We stored capacity of the ImDrawList buffer to reduce growth-caused allocation/copy when awakening. + // The other buffers tends to amortize much faster. + window->MemoryCompacted = false; + window->DrawList->IdxBuffer.reserve(window->MemoryDrawListIdxCapacity); + window->DrawList->VtxBuffer.reserve(window->MemoryDrawListVtxCapacity); + window->MemoryDrawListIdxCapacity = window->MemoryDrawListVtxCapacity = 0; +} + +void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + g.ActiveIdIsJustActivated = (g.ActiveId != id); + if (g.ActiveIdIsJustActivated) + { + g.ActiveIdTimer = 0.0f; + g.ActiveIdHasBeenPressedBefore = false; + g.ActiveIdHasBeenEditedBefore = false; + g.ActiveIdMouseButton = -1; + if (id != 0) + { + g.LastActiveId = id; + g.LastActiveIdTimer = 0.0f; + } + } + g.ActiveId = id; + g.ActiveIdAllowOverlap = false; + g.ActiveIdNoClearOnFocusLoss = false; + g.ActiveIdWindow = window; + g.ActiveIdHasBeenEditedThisFrame = false; + if (id) + { + g.ActiveIdIsAlive = id; + g.ActiveIdSource = (g.NavActivateId == id || g.NavActivateInputId == id || g.NavJustMovedToId == id) ? (ImGuiInputSource)ImGuiInputSource_Nav : ImGuiInputSource_Mouse; + } + + // Clear declaration of inputs claimed by the widget + // (Please note that this is WIP and not all keys/inputs are thoroughly declared by all widgets yet) + g.ActiveIdUsingMouseWheel = false; + g.ActiveIdUsingNavDirMask = 0x00; + g.ActiveIdUsingNavInputMask = 0x00; + g.ActiveIdUsingKeyInputMask.ClearAllBits(); +} + +void ImGui::ClearActiveID() +{ + SetActiveID(0, NULL); // g.ActiveId = 0; +} + +void ImGui::SetHoveredID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.HoveredId = id; + g.HoveredIdAllowOverlap = false; + g.HoveredIdUsingMouseWheel = false; + if (id != 0 && g.HoveredIdPreviousFrame != id) + g.HoveredIdTimer = g.HoveredIdNotActiveTimer = 0.0f; +} + +ImGuiID ImGui::GetHoveredID() +{ + ImGuiContext& g = *GImGui; + return g.HoveredId ? g.HoveredId : g.HoveredIdPreviousFrame; +} + +// This is called by ItemAdd(). +// Code not using ItemAdd() may need to call this manually otherwise ActiveId will be cleared. In IMGUI_VERSION_NUM < 18717 this was called by GetID(). +void ImGui::KeepAliveID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + if (g.ActiveId == id) + g.ActiveIdIsAlive = id; + if (g.ActiveIdPreviousFrame == id) + g.ActiveIdPreviousFrameIsAlive = true; +} + +void ImGui::MarkItemEdited(ImGuiID id) +{ + // This marking is solely to be able to provide info for IsItemDeactivatedAfterEdit(). + // ActiveId might have been released by the time we call this (as in the typical press/release button behavior) but still need need to fill the data. + ImGuiContext& g = *GImGui; + IM_ASSERT(g.ActiveId == id || g.ActiveId == 0 || g.DragDropActive); + IM_UNUSED(id); // Avoid unused variable warnings when asserts are compiled out. + //IM_ASSERT(g.CurrentWindow->DC.LastItemId == id); + g.ActiveIdHasBeenEditedThisFrame = true; + g.ActiveIdHasBeenEditedBefore = true; + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Edited; +} + +static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags) +{ + // An active popup disable hovering on other windows (apart from its own children) + // FIXME-OPT: This could be cached/stored within the window. + ImGuiContext& g = *GImGui; + if (g.NavWindow) + if (ImGuiWindow* focused_root_window = g.NavWindow->RootWindow) + if (focused_root_window->WasActive && focused_root_window != window->RootWindow) + { + // For the purpose of those flags we differentiate "standard popup" from "modal popup" + // NB: The order of those two tests is important because Modal windows are also Popups. + if (focused_root_window->Flags & ImGuiWindowFlags_Modal) + return false; + if ((focused_root_window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + return false; + } + return true; +} + +// This is roughly matching the behavior of internal-facing ItemHoverable() +// - we allow hovering to be true when ActiveId==window->MoveID, so that clicking on non-interactive items such as a Text() item still returns true with IsItemHovered() +// - this should work even for non-interactive items that have no ID, so we cannot use LastItemId +bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.NavDisableMouseHover && !g.NavDisableHighlight && !(flags & ImGuiHoveredFlags_NoNavOverride)) + { + if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled)) + return false; + if (!IsItemFocused()) + return false; + } + else + { + // Test for bounding box overlap, as updated as ItemAdd() + ImGuiItemStatusFlags status_flags = g.LastItemData.StatusFlags; + if (!(status_flags & ImGuiItemStatusFlags_HoveredRect)) + return false; + IM_ASSERT((flags & (ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy)) == 0); // Flags not supported by this function + + // Test if we are hovering the right window (our window could be behind another window) + // [2021/03/02] Reworked / reverted the revert, finally. Note we want e.g. BeginGroup/ItemAdd/EndGroup to work as well. (#3851) + // [2017/10/16] Reverted commit 344d48be3 and testing RootWindow instead. I believe it is correct to NOT test for RootWindow but this leaves us unable + // to use IsItemHovered() after EndChild() itself. Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was + // the test that has been running for a long while. + if (g.HoveredWindow != window && (status_flags & ImGuiItemStatusFlags_HoveredWindow) == 0) + if ((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0) + return false; + + // Test if another item is active (e.g. being dragged) + if ((flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) == 0) + if (g.ActiveId != 0 && g.ActiveId != g.LastItemData.ID && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId) + return false; + + // Test if interactions on this window are blocked by an active popup or modal. + // The ImGuiHoveredFlags_AllowWhenBlockedByPopup flag will be tested here. + if (!IsWindowContentHoverable(window, flags)) + return false; + + // Test if the item is disabled + if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled)) + return false; + + // Special handling for calling after Begin() which represent the title bar or tab. + // When the window is collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case. + if (g.LastItemData.ID == window->MoveId && window->WriteAccessed) + return false; + } + + return true; +} + +// Internal facing ItemHoverable() used when submitting widgets. Differs slightly from IsItemHovered(). +bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) +{ + ImGuiContext& g = *GImGui; + if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap) + return false; + + ImGuiWindow* window = g.CurrentWindow; + if (g.HoveredWindow != window) + return false; + if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap) + return false; + if (!IsMouseHoveringRect(bb.Min, bb.Max)) + return false; + if (!IsWindowContentHoverable(window, ImGuiHoveredFlags_None)) + { + g.HoveredIdDisabled = true; + return false; + } + + // We exceptionally allow this function to be called with id==0 to allow using it for easy high-level + // hover test in widgets code. We could also decide to split this function is two. + if (id != 0) + SetHoveredID(id); + + // When disabled we'll return false but still set HoveredId + ImGuiItemFlags item_flags = (g.LastItemData.ID == id ? g.LastItemData.InFlags : g.CurrentItemFlags); + if (item_flags & ImGuiItemFlags_Disabled) + { + // Release active id if turning disabled + if (g.ActiveId == id) + ClearActiveID(); + g.HoveredIdDisabled = true; + return false; + } + + if (id != 0) + { + // [DEBUG] Item Picker tool! + // We perform the check here because SetHoveredID() is not frequently called (1~ time a frame), making + // the cost of this tool near-zero. We can get slightly better call-stack and support picking non-hovered + // items if we perform the test in ItemAdd(), but that would incur a small runtime cost. + // #define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX in imconfig.h if you want this check to also be performed in ItemAdd(). + if (g.DebugItemPickerActive && g.HoveredIdPreviousFrame == id) + GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255)); + if (g.DebugItemPickerBreakId == id) + IM_DEBUG_BREAK(); + } + + if (g.NavDisableMouseHover) + return false; + + return true; +} + +bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (!bb.Overlaps(window->ClipRect)) + if (id == 0 || (id != g.ActiveId && id != g.NavId)) + if (!g.LogEnabled) + return true; + return false; +} + +// This is also inlined in ItemAdd() +// Note: if ImGuiItemStatusFlags_HasDisplayRect is set, user needs to set window->DC.LastItemDisplayRect! +void ImGui::SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags item_flags, const ImRect& item_rect) +{ + ImGuiContext& g = *GImGui; + g.LastItemData.ID = item_id; + g.LastItemData.InFlags = in_flags; + g.LastItemData.StatusFlags = item_flags; + g.LastItemData.Rect = item_rect; +} + +float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x) +{ + if (wrap_pos_x < 0.0f) + return 0.0f; + + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (wrap_pos_x == 0.0f) + { + // We could decide to setup a default wrapping max point for auto-resizing windows, + // or have auto-wrap (with unspecified wrapping pos) behave as a ContentSize extending function? + //if (window->Hidden && (window->Flags & ImGuiWindowFlags_AlwaysAutoResize)) + // wrap_pos_x = ImMax(window->WorkRect.Min.x + g.FontSize * 10.0f, window->WorkRect.Max.x); + //else + wrap_pos_x = window->WorkRect.Max.x; + } + else if (wrap_pos_x > 0.0f) + { + wrap_pos_x += window->Pos.x - window->Scroll.x; // wrap_pos_x is provided is window local space + } + + return ImMax(wrap_pos_x - pos.x, 1.0f); +} + +// IM_ALLOC() == ImGui::MemAlloc() +void* ImGui::MemAlloc(size_t size) +{ + if (ImGuiContext* ctx = GImGui) + ctx->IO.MetricsActiveAllocations++; + return (*GImAllocatorAllocFunc)(size, GImAllocatorUserData); +} + +// IM_FREE() == ImGui::MemFree() +void ImGui::MemFree(void* ptr) +{ + if (ptr) + if (ImGuiContext* ctx = GImGui) + ctx->IO.MetricsActiveAllocations--; + return (*GImAllocatorFreeFunc)(ptr, GImAllocatorUserData); +} + +const char* ImGui::GetClipboardText() +{ + ImGuiContext& g = *GImGui; + return g.IO.GetClipboardTextFn ? g.IO.GetClipboardTextFn(g.IO.ClipboardUserData) : ""; +} + +void ImGui::SetClipboardText(const char* text) +{ + ImGuiContext& g = *GImGui; + if (g.IO.SetClipboardTextFn) + g.IO.SetClipboardTextFn(g.IO.ClipboardUserData, text); +} + +const char* ImGui::GetVersion() +{ + return IMGUI_VERSION; +} + +// Internal state access - if you want to share Dear ImGui state between modules (e.g. DLL) or allocate it yourself +// Note that we still point to some static data and members (such as GFontAtlas), so the state instance you end up using will point to the static data within its module +ImGuiContext* ImGui::GetCurrentContext() +{ + return GImGui; +} + +void ImGui::SetCurrentContext(ImGuiContext* ctx) +{ +#ifdef IMGUI_SET_CURRENT_CONTEXT_FUNC + IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx); // For custom thread-based hackery you may want to have control over this. +#else + GImGui = ctx; +#endif +} + +void ImGui::SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data) +{ + GImAllocatorAllocFunc = alloc_func; + GImAllocatorFreeFunc = free_func; + GImAllocatorUserData = user_data; +} + +// This is provided to facilitate copying allocators from one static/DLL boundary to another (e.g. retrieve default allocator of your executable address space) +void ImGui::GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data) +{ + *p_alloc_func = GImAllocatorAllocFunc; + *p_free_func = GImAllocatorFreeFunc; + *p_user_data = GImAllocatorUserData; +} + +ImGuiContext* ImGui::CreateContext(ImFontAtlas* shared_font_atlas) +{ + ImGuiContext* prev_ctx = GetCurrentContext(); + ImGuiContext* ctx = IM_NEW(ImGuiContext)(shared_font_atlas); + SetCurrentContext(ctx); + Initialize(); + if (prev_ctx != NULL) + SetCurrentContext(prev_ctx); // Restore previous context if any, else keep new one. + return ctx; +} + +void ImGui::DestroyContext(ImGuiContext* ctx) +{ + ImGuiContext* prev_ctx = GetCurrentContext(); + if (ctx == NULL) //-V1051 + ctx = prev_ctx; + SetCurrentContext(ctx); + Shutdown(); + SetCurrentContext((prev_ctx != ctx) ? prev_ctx : NULL); + IM_DELETE(ctx); +} + +// No specific ordering/dependency support, will see as needed +ImGuiID ImGui::AddContextHook(ImGuiContext* ctx, const ImGuiContextHook* hook) +{ + ImGuiContext& g = *ctx; + IM_ASSERT(hook->Callback != NULL && hook->HookId == 0 && hook->Type != ImGuiContextHookType_PendingRemoval_); + g.Hooks.push_back(*hook); + g.Hooks.back().HookId = ++g.HookIdNext; + return g.HookIdNext; +} + +// Deferred removal, avoiding issue with changing vector while iterating it +void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id) +{ + ImGuiContext& g = *ctx; + IM_ASSERT(hook_id != 0); + for (int n = 0; n < g.Hooks.Size; n++) + if (g.Hooks[n].HookId == hook_id) + g.Hooks[n].Type = ImGuiContextHookType_PendingRemoval_; +} + +// Call context hooks (used by e.g. test engine) +// We assume a small number of hooks so all stored in same array +void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type) +{ + ImGuiContext& g = *ctx; + for (int n = 0; n < g.Hooks.Size; n++) + if (g.Hooks[n].Type == hook_type) + g.Hooks[n].Callback(&g, &g.Hooks[n]); +} + +ImGuiIO& ImGui::GetIO() +{ + IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); + return GImGui->IO; +} + +// Pass this to your backend rendering function! Valid after Render() and until the next call to NewFrame() +ImDrawData* ImGui::GetDrawData() +{ + ImGuiContext& g = *GImGui; + ImGuiViewportP* viewport = g.Viewports[0]; + return viewport->DrawDataP.Valid ? &viewport->DrawDataP : NULL; +} + +double ImGui::GetTime() +{ + return GImGui->Time; +} + +int ImGui::GetFrameCount() +{ + return GImGui->FrameCount; +} + +static ImDrawList* GetViewportDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name) +{ + // Create the draw list on demand, because they are not frequently used for all viewports + ImGuiContext& g = *GImGui; + IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->DrawLists)); + ImDrawList* draw_list = viewport->DrawLists[drawlist_no]; + if (draw_list == NULL) + { + draw_list = IM_NEW(ImDrawList)(&g.DrawListSharedData); + draw_list->_OwnerName = drawlist_name; + viewport->DrawLists[drawlist_no] = draw_list; + } + + // Our ImDrawList system requires that there is always a command + if (viewport->DrawListsLastFrame[drawlist_no] != g.FrameCount) + { + draw_list->_ResetForNewFrame(); + draw_list->PushTextureID(g.IO.Fonts->TexID); + draw_list->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size, false); + viewport->DrawListsLastFrame[drawlist_no] = g.FrameCount; + } + return draw_list; +} + +ImDrawList* ImGui::GetBackgroundDrawList(ImGuiViewport* viewport) +{ + return GetViewportDrawList((ImGuiViewportP*)viewport, 0, "##Background"); +} + +ImDrawList* ImGui::GetBackgroundDrawList() +{ + ImGuiContext& g = *GImGui; + return GetBackgroundDrawList(g.Viewports[0]); +} + +ImDrawList* ImGui::GetForegroundDrawList(ImGuiViewport* viewport) +{ + return GetViewportDrawList((ImGuiViewportP*)viewport, 1, "##Foreground"); +} + +ImDrawList* ImGui::GetForegroundDrawList() +{ + ImGuiContext& g = *GImGui; + return GetForegroundDrawList(g.Viewports[0]); +} + +ImDrawListSharedData* ImGui::GetDrawListSharedData() +{ + return &GImGui->DrawListSharedData; +} + +void ImGui::StartMouseMovingWindow(ImGuiWindow* window) +{ + // Set ActiveId even if the _NoMove flag is set. Without it, dragging away from a window with _NoMove would activate hover on other windows. + // We _also_ call this when clicking in a window empty space when io.ConfigWindowsMoveFromTitleBarOnly is set, but clear g.MovingWindow afterward. + // This is because we want ActiveId to be set even when the window is not permitted to move. + ImGuiContext& g = *GImGui; + FocusWindow(window); + SetActiveID(window->MoveId, window); + g.NavDisableHighlight = true; + g.ActiveIdClickOffset = g.IO.MouseClickedPos[0] - window->RootWindow->Pos; + g.ActiveIdNoClearOnFocusLoss = true; + SetActiveIdUsingNavAndKeys(); + + bool can_move_window = true; + if ((window->Flags & ImGuiWindowFlags_NoMove) || (window->RootWindow->Flags & ImGuiWindowFlags_NoMove)) + can_move_window = false; + if (can_move_window) + g.MovingWindow = window; +} + +// Handle mouse moving window +// Note: moving window with the navigation keys (Square + d-pad / CTRL+TAB + Arrows) are processed in NavUpdateWindowing() +// FIXME: We don't have strong guarantee that g.MovingWindow stay synched with g.ActiveId == g.MovingWindow->MoveId. +// This is currently enforced by the fact that BeginDragDropSource() is setting all g.ActiveIdUsingXXXX flags to inhibit navigation inputs, +// but if we should more thoroughly test cases where g.ActiveId or g.MovingWindow gets changed and not the other. +void ImGui::UpdateMouseMovingWindowNewFrame() +{ + ImGuiContext& g = *GImGui; + if (g.MovingWindow != NULL) + { + // We actually want to move the root window. g.MovingWindow == window we clicked on (could be a child window). + // We track it to preserve Focus and so that generally ActiveIdWindow == MovingWindow and ActiveId == MovingWindow->MoveId for consistency. + KeepAliveID(g.ActiveId); + IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindow); + ImGuiWindow* moving_window = g.MovingWindow->RootWindow; + if (g.IO.MouseDown[0] && IsMousePosValid(&g.IO.MousePos)) + { + ImVec2 pos = g.IO.MousePos - g.ActiveIdClickOffset; + if (moving_window->Pos.x != pos.x || moving_window->Pos.y != pos.y) + { + MarkIniSettingsDirty(moving_window); + SetWindowPos(moving_window, pos, ImGuiCond_Always); + } + FocusWindow(g.MovingWindow); + } + else + { + g.MovingWindow = NULL; + ClearActiveID(); + } + } + else + { + // When clicking/dragging from a window that has the _NoMove flag, we still set the ActiveId in order to prevent hovering others. + if (g.ActiveIdWindow && g.ActiveIdWindow->MoveId == g.ActiveId) + { + KeepAliveID(g.ActiveId); + if (!g.IO.MouseDown[0]) + ClearActiveID(); + } + } +} + +// Initiate moving window when clicking on empty space or title bar. +// Handle left-click and right-click focus. +void ImGui::UpdateMouseMovingWindowEndFrame() +{ + ImGuiContext& g = *GImGui; + if (g.ActiveId != 0 || g.HoveredId != 0) + return; + + // Unless we just made a window/popup appear + if (g.NavWindow && g.NavWindow->Appearing) + return; + + // Click on empty space to focus window and start moving + // (after we're done with all our widgets) + if (g.IO.MouseClicked[0]) + { + // Handle the edge case of a popup being closed while clicking in its empty space. + // If we try to focus it, FocusWindow() > ClosePopupsOverWindow() will accidentally close any parent popups because they are not linked together any more. + ImGuiWindow* root_window = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL; + const bool is_closed_popup = root_window && (root_window->Flags & ImGuiWindowFlags_Popup) && !IsPopupOpen(root_window->PopupId, ImGuiPopupFlags_AnyPopupLevel); + + if (root_window != NULL && !is_closed_popup) + { + StartMouseMovingWindow(g.HoveredWindow); //-V595 + + // Cancel moving if clicked outside of title bar + if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(root_window->Flags & ImGuiWindowFlags_NoTitleBar)) + if (!root_window->TitleBarRect().Contains(g.IO.MouseClickedPos[0])) + g.MovingWindow = NULL; + + // Cancel moving if clicked over an item which was disabled or inhibited by popups (note that we know HoveredId == 0 already) + if (g.HoveredIdDisabled) + g.MovingWindow = NULL; + } + else if (root_window == NULL && g.NavWindow != NULL && GetTopMostPopupModal() == NULL) + { + // Clicking on void disable focus + FocusWindow(NULL); + } + } + + // With right mouse button we close popups without changing focus based on where the mouse is aimed + // Instead, focus will be restored to the window under the bottom-most closed popup. + // (The left mouse button path calls FocusWindow on the hovered window, which will lead NewFrame->ClosePopupsOverWindow to trigger) + if (g.IO.MouseClicked[1]) + { + // Find the top-most window between HoveredWindow and the top-most Modal Window. + // This is where we can trim the popup stack. + ImGuiWindow* modal = GetTopMostPopupModal(); + bool hovered_window_above_modal = g.HoveredWindow && (modal == NULL || IsWindowAbove(g.HoveredWindow, modal)); + ClosePopupsOverWindow(hovered_window_above_modal ? g.HoveredWindow : modal, true); + } +} + +static bool IsWindowActiveAndVisible(ImGuiWindow* window) +{ + return (window->Active) && (!window->Hidden); +} + +static void ImGui::UpdateKeyboardInputs() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + // Import legacy keys or verify they are not used +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + if (io.BackendUsingLegacyKeyArrays == 0) + { + // Backend used new io.AddKeyEvent() API: Good! Verify that old arrays are never written to externally. + for (int n = 0; n < ImGuiKey_LegacyNativeKey_END; n++) + IM_ASSERT((io.KeysDown[n] == false || IsKeyDown(n)) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!"); + } + else + { + if (g.FrameCount == 0) + for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++) + IM_ASSERT(g.IO.KeyMap[n] == -1 && "Backend is not allowed to write to io.KeyMap[0..511]!"); + + // Build reverse KeyMap (Named -> Legacy) + for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++) + if (io.KeyMap[n] != -1) + { + IM_ASSERT(IsLegacyKey((ImGuiKey)io.KeyMap[n])); + io.KeyMap[io.KeyMap[n]] = n; + } + + // Import legacy keys into new ones + for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++) + if (io.KeysDown[n] || io.BackendUsingLegacyKeyArrays == 1) + { + const ImGuiKey key = (ImGuiKey)(io.KeyMap[n] != -1 ? io.KeyMap[n] : n); + IM_ASSERT(io.KeyMap[n] == -1 || IsNamedKey(key)); + io.KeysData[key].Down = io.KeysDown[n]; + if (key != n) + io.KeysDown[key] = io.KeysDown[n]; // Allow legacy code using io.KeysDown[GetKeyIndex()] with old backends + io.BackendUsingLegacyKeyArrays = 1; + } + if (io.BackendUsingLegacyKeyArrays == 1) + { + io.KeysData[ImGuiKey_ModCtrl].Down = io.KeyCtrl; + io.KeysData[ImGuiKey_ModShift].Down = io.KeyShift; + io.KeysData[ImGuiKey_ModAlt].Down = io.KeyAlt; + io.KeysData[ImGuiKey_ModSuper].Down = io.KeySuper; + } + } +#endif + + // Synchronize io.KeyMods with individual modifiers io.KeyXXX bools + io.KeyMods = GetMergedModFlags(); + + // Clear gamepad data if disabled + if ((io.BackendFlags & ImGuiBackendFlags_HasGamepad) == 0) + for (int i = ImGuiKey_Gamepad_BEGIN; i < ImGuiKey_Gamepad_END; i++) + { + io.KeysData[i - ImGuiKey_KeysData_OFFSET].Down = false; + io.KeysData[i - ImGuiKey_KeysData_OFFSET].AnalogValue = 0.0f; + } + + // Update keys + for (int i = 0; i < IM_ARRAYSIZE(io.KeysData); i++) + { + ImGuiKeyData* key_data = &io.KeysData[i]; + key_data->DownDurationPrev = key_data->DownDuration; + key_data->DownDuration = key_data->Down ? (key_data->DownDuration < 0.0f ? 0.0f : key_data->DownDuration + io.DeltaTime) : -1.0f; + } +} + +static void ImGui::UpdateMouseInputs() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + // Round mouse position to avoid spreading non-rounded position (e.g. UpdateManualResize doesn't support them well) + if (IsMousePosValid(&io.MousePos)) + io.MousePos = g.MouseLastValidPos = ImFloorSigned(io.MousePos); + + // If mouse just appeared or disappeared (usually denoted by -FLT_MAX components) we cancel out movement in MouseDelta + if (IsMousePosValid(&io.MousePos) && IsMousePosValid(&io.MousePosPrev)) + io.MouseDelta = io.MousePos - io.MousePosPrev; + else + io.MouseDelta = ImVec2(0.0f, 0.0f); + + // If mouse moved we re-enable mouse hovering in case it was disabled by gamepad/keyboard. In theory should use a >0.0f threshold but would need to reset in everywhere we set this to true. + if (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f) + g.NavDisableMouseHover = false; + + io.MousePosPrev = io.MousePos; + for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) + { + io.MouseClicked[i] = io.MouseDown[i] && io.MouseDownDuration[i] < 0.0f; + io.MouseClickedCount[i] = 0; // Will be filled below + io.MouseReleased[i] = !io.MouseDown[i] && io.MouseDownDuration[i] >= 0.0f; + io.MouseDownDurationPrev[i] = io.MouseDownDuration[i]; + io.MouseDownDuration[i] = io.MouseDown[i] ? (io.MouseDownDuration[i] < 0.0f ? 0.0f : io.MouseDownDuration[i] + io.DeltaTime) : -1.0f; + if (io.MouseClicked[i]) + { + bool is_repeated_click = false; + if ((float)(g.Time - io.MouseClickedTime[i]) < io.MouseDoubleClickTime) + { + ImVec2 delta_from_click_pos = IsMousePosValid(&io.MousePos) ? (io.MousePos - io.MouseClickedPos[i]) : ImVec2(0.0f, 0.0f); + if (ImLengthSqr(delta_from_click_pos) < io.MouseDoubleClickMaxDist * io.MouseDoubleClickMaxDist) + is_repeated_click = true; + } + if (is_repeated_click) + io.MouseClickedLastCount[i]++; + else + io.MouseClickedLastCount[i] = 1; + io.MouseClickedTime[i] = g.Time; + io.MouseClickedPos[i] = io.MousePos; + io.MouseClickedCount[i] = io.MouseClickedLastCount[i]; + io.MouseDragMaxDistanceSqr[i] = 0.0f; + } + else if (io.MouseDown[i]) + { + // Maintain the maximum distance we reaching from the initial click position, which is used with dragging threshold + float delta_sqr_click_pos = IsMousePosValid(&io.MousePos) ? ImLengthSqr(io.MousePos - io.MouseClickedPos[i]) : 0.0f; + io.MouseDragMaxDistanceSqr[i] = ImMax(io.MouseDragMaxDistanceSqr[i], delta_sqr_click_pos); + } + + // We provide io.MouseDoubleClicked[] as a legacy service + io.MouseDoubleClicked[i] = (io.MouseClickedCount[i] == 2); + + // Clicking any mouse button reactivate mouse hovering which may have been deactivated by gamepad/keyboard navigation + if (io.MouseClicked[i]) + g.NavDisableMouseHover = false; + } +} + +static void StartLockWheelingWindow(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (g.WheelingWindow == window) + return; + g.WheelingWindow = window; + g.WheelingWindowRefMousePos = g.IO.MousePos; + g.WheelingWindowTimer = WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER; +} + +void ImGui::UpdateMouseWheel() +{ + ImGuiContext& g = *GImGui; + + // Reset the locked window if we move the mouse or after the timer elapses + if (g.WheelingWindow != NULL) + { + g.WheelingWindowTimer -= g.IO.DeltaTime; + if (IsMousePosValid() && ImLengthSqr(g.IO.MousePos - g.WheelingWindowRefMousePos) > g.IO.MouseDragThreshold * g.IO.MouseDragThreshold) + g.WheelingWindowTimer = 0.0f; + if (g.WheelingWindowTimer <= 0.0f) + { + g.WheelingWindow = NULL; + g.WheelingWindowTimer = 0.0f; + } + } + + float wheel_x = g.IO.MouseWheelH; + float wheel_y = g.IO.MouseWheel; + if (wheel_x == 0.0f && wheel_y == 0.0f) + return; + + if ((g.ActiveId != 0 && g.ActiveIdUsingMouseWheel) || (g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrameUsingMouseWheel)) + return; + + ImGuiWindow* window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow; + if (!window || window->Collapsed) + return; + + // Zoom / Scale window + // FIXME-OBSOLETE: This is an old feature, it still works but pretty much nobody is using it and may be best redesigned. + if (wheel_y != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling) + { + StartLockWheelingWindow(window); + const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f); + const float scale = new_font_scale / window->FontWindowScale; + window->FontWindowScale = new_font_scale; + if (window == window->RootWindow) + { + const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size; + SetWindowPos(window, window->Pos + offset, 0); + window->Size = ImFloor(window->Size * scale); + window->SizeFull = ImFloor(window->SizeFull * scale); + } + return; + } + + // Mouse wheel scrolling + // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent + if (g.IO.KeyCtrl) + return; + + // As a standard behavior holding SHIFT while using Vertical Mouse Wheel triggers Horizontal scroll instead + // (we avoid doing it on OSX as it the OS input layer handles this already) + const bool swap_axis = g.IO.KeyShift && !g.IO.ConfigMacOSXBehaviors; + if (swap_axis) + { + wheel_x = wheel_y; + wheel_y = 0.0f; + } + + // Vertical Mouse Wheel scrolling + if (wheel_y != 0.0f) + { + StartLockWheelingWindow(window); + while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)))) + window = window->ParentWindow; + if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)) + { + float max_step = window->InnerRect.GetHeight() * 0.67f; + float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step)); + SetScrollY(window, window->Scroll.y - wheel_y * scroll_step); + } + } + + // Horizontal Mouse Wheel scrolling, or Vertical Mouse Wheel w/ Shift held + if (wheel_x != 0.0f) + { + StartLockWheelingWindow(window); + while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.x == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)))) + window = window->ParentWindow; + if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)) + { + float max_step = window->InnerRect.GetWidth() * 0.67f; + float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step)); + SetScrollX(window, window->Scroll.x - wheel_x * scroll_step); + } + } +} + +// The reason this is exposed in imgui_internal.h is: on touch-based system that don't have hovering, we want to dispatch inputs to the right target (imgui vs imgui+app) +void ImGui::UpdateHoveredWindowAndCaptureFlags() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + g.WindowsHoverPadding = ImMax(g.Style.TouchExtraPadding, ImVec2(WINDOWS_HOVER_PADDING, WINDOWS_HOVER_PADDING)); + + // Find the window hovered by mouse: + // - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow. + // - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame. + // - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms. + bool clear_hovered_windows = false; + FindHoveredWindow(); + + // Modal windows prevents mouse from hovering behind them. + ImGuiWindow* modal_window = GetTopMostPopupModal(); + if (modal_window && g.HoveredWindow && !IsWindowWithinBeginStackOf(g.HoveredWindow->RootWindow, modal_window)) + clear_hovered_windows = true; + + // Disabled mouse? + if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) + clear_hovered_windows = true; + + // We track click ownership. When clicked outside of a window the click is owned by the application and + // won't report hovering nor request capture even while dragging over our windows afterward. + const bool has_open_popup = (g.OpenPopupStack.Size > 0); + const bool has_open_modal = (modal_window != NULL); + int mouse_earliest_down = -1; + bool mouse_any_down = false; + for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) + { + if (io.MouseClicked[i]) + { + io.MouseDownOwned[i] = (g.HoveredWindow != NULL) || has_open_popup; + io.MouseDownOwnedUnlessPopupClose[i] = (g.HoveredWindow != NULL) || has_open_modal; + } + mouse_any_down |= io.MouseDown[i]; + if (io.MouseDown[i]) + if (mouse_earliest_down == -1 || io.MouseClickedTime[i] < io.MouseClickedTime[mouse_earliest_down]) + mouse_earliest_down = i; + } + const bool mouse_avail = (mouse_earliest_down == -1) || io.MouseDownOwned[mouse_earliest_down]; + const bool mouse_avail_unless_popup_close = (mouse_earliest_down == -1) || io.MouseDownOwnedUnlessPopupClose[mouse_earliest_down]; + + // If mouse was first clicked outside of ImGui bounds we also cancel out hovering. + // FIXME: For patterns of drag and drop across OS windows, we may need to rework/remove this test (first committed 311c0ca9 on 2015/02) + const bool mouse_dragging_extern_payload = g.DragDropActive && (g.DragDropSourceFlags & ImGuiDragDropFlags_SourceExtern) != 0; + if (!mouse_avail && !mouse_dragging_extern_payload) + clear_hovered_windows = true; + + if (clear_hovered_windows) + g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL; + + // Update io.WantCaptureMouse for the user application (true = dispatch mouse info to Dear ImGui only, false = dispatch mouse to Dear ImGui + underlying app) + // Update io.WantCaptureMouseAllowPopupClose (experimental) to give a chance for app to react to popup closure with a drag + if (g.WantCaptureMouseNextFrame != -1) + { + io.WantCaptureMouse = io.WantCaptureMouseUnlessPopupClose = (g.WantCaptureMouseNextFrame != 0); + } + else + { + io.WantCaptureMouse = (mouse_avail && (g.HoveredWindow != NULL || mouse_any_down)) || has_open_popup; + io.WantCaptureMouseUnlessPopupClose = (mouse_avail_unless_popup_close && (g.HoveredWindow != NULL || mouse_any_down)) || has_open_modal; + } + + // Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to Dear ImGui only, false = dispatch keyboard info to Dear ImGui + underlying app) + if (g.WantCaptureKeyboardNextFrame != -1) + io.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0); + else + io.WantCaptureKeyboard = (g.ActiveId != 0) || (modal_window != NULL); + if (io.NavActive && (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && !(io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard)) + io.WantCaptureKeyboard = true; + + // Update io.WantTextInput flag, this is to allow systems without a keyboard (e.g. mobile, hand-held) to show a software keyboard if possible + io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false; +} + +// [Internal] Do not use directly (can read io.KeyMods instead) +ImGuiModFlags ImGui::GetMergedModFlags() +{ + ImGuiContext& g = *GImGui; + ImGuiModFlags key_mods = ImGuiModFlags_None; + if (g.IO.KeyCtrl) { key_mods |= ImGuiModFlags_Ctrl; } + if (g.IO.KeyShift) { key_mods |= ImGuiModFlags_Shift; } + if (g.IO.KeyAlt) { key_mods |= ImGuiModFlags_Alt; } + if (g.IO.KeySuper) { key_mods |= ImGuiModFlags_Super; } + return key_mods; +} + +void ImGui::NewFrame() +{ + IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); + ImGuiContext& g = *GImGui; + + // Remove pending delete hooks before frame start. + // This deferred removal avoid issues of removal while iterating the hook vector + for (int n = g.Hooks.Size - 1; n >= 0; n--) + if (g.Hooks[n].Type == ImGuiContextHookType_PendingRemoval_) + g.Hooks.erase(&g.Hooks[n]); + + CallContextHooks(&g, ImGuiContextHookType_NewFramePre); + + // Check and assert for various common IO and Configuration mistakes + ErrorCheckNewFrameSanityChecks(); + + // Load settings on first frame, save settings when modified (after a delay) + UpdateSettings(); + + g.Time += g.IO.DeltaTime; + g.WithinFrameScope = true; + g.FrameCount += 1; + g.TooltipOverrideCount = 0; + g.WindowsActiveCount = 0; + g.MenusIdSubmittedThisFrame.resize(0); + + // Calculate frame-rate for the user, as a purely luxurious feature + g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx]; + g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx] = g.IO.DeltaTime; + g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame); + g.FramerateSecPerFrameCount = ImMin(g.FramerateSecPerFrameCount + 1, IM_ARRAYSIZE(g.FramerateSecPerFrame)); + g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)g.FramerateSecPerFrameCount)) : FLT_MAX; + + UpdateViewportsNewFrame(); + + // Setup current font and draw list shared data + g.IO.Fonts->Locked = true; + SetCurrentFont(GetDefaultFont()); + IM_ASSERT(g.Font->IsLoaded()); + ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + for (int n = 0; n < g.Viewports.Size; n++) + virtual_space.Add(g.Viewports[n]->GetMainRect()); + g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4(); + g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; + g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError); + g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; + if (g.Style.AntiAliasedLines) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; + if (g.Style.AntiAliasedLinesUseTex && !(g.Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; + if (g.Style.AntiAliasedFill) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; + if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset; + + // Mark rendering data as invalid to prevent user who may have a handle on it to use it. + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + viewport->DrawDataP.Clear(); + } + + // Drag and drop keep the source ID alive so even if the source disappear our state is consistent + if (g.DragDropActive && g.DragDropPayload.SourceId == g.ActiveId) + KeepAliveID(g.DragDropPayload.SourceId); + + // Update HoveredId data + if (!g.HoveredIdPreviousFrame) + g.HoveredIdTimer = 0.0f; + if (!g.HoveredIdPreviousFrame || (g.HoveredId && g.ActiveId == g.HoveredId)) + g.HoveredIdNotActiveTimer = 0.0f; + if (g.HoveredId) + g.HoveredIdTimer += g.IO.DeltaTime; + if (g.HoveredId && g.ActiveId != g.HoveredId) + g.HoveredIdNotActiveTimer += g.IO.DeltaTime; + g.HoveredIdPreviousFrame = g.HoveredId; + g.HoveredIdPreviousFrameUsingMouseWheel = g.HoveredIdUsingMouseWheel; + g.HoveredId = 0; + g.HoveredIdAllowOverlap = false; + g.HoveredIdUsingMouseWheel = false; + g.HoveredIdDisabled = false; + + // Update ActiveId data (clear reference to active widget if the widget isn't alive anymore) + if (g.ActiveIdIsAlive != g.ActiveId && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0) + ClearActiveID(); + if (g.ActiveId) + g.ActiveIdTimer += g.IO.DeltaTime; + g.LastActiveIdTimer += g.IO.DeltaTime; + g.ActiveIdPreviousFrame = g.ActiveId; + g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow; + g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore; + g.ActiveIdIsAlive = 0; + g.ActiveIdHasBeenEditedThisFrame = false; + g.ActiveIdPreviousFrameIsAlive = false; + g.ActiveIdIsJustActivated = false; + if (g.TempInputId != 0 && g.ActiveId != g.TempInputId) + g.TempInputId = 0; + if (g.ActiveId == 0) + { + g.ActiveIdUsingNavDirMask = 0x00; + g.ActiveIdUsingNavInputMask = 0x00; + g.ActiveIdUsingKeyInputMask.ClearAllBits(); + } + + // Drag and drop + g.DragDropAcceptIdPrev = g.DragDropAcceptIdCurr; + g.DragDropAcceptIdCurr = 0; + g.DragDropAcceptIdCurrRectSurface = FLT_MAX; + g.DragDropWithinSource = false; + g.DragDropWithinTarget = false; + g.DragDropHoldJustPressedId = 0; + + // Close popups on focus lost (currently wip/opt-in) + //if (g.IO.AppFocusLost) + // ClosePopupsExceptModals(); + + // Process input queue (trickle as many events as possible) + g.InputEventsTrail.resize(0); + UpdateInputEvents(g.IO.ConfigInputTrickleEventQueue); + + // Update keyboard input state + UpdateKeyboardInputs(); + + //IM_ASSERT(g.IO.KeyCtrl == IsKeyDown(ImGuiKey_LeftCtrl) || IsKeyDown(ImGuiKey_RightCtrl)); + //IM_ASSERT(g.IO.KeyShift == IsKeyDown(ImGuiKey_LeftShift) || IsKeyDown(ImGuiKey_RightShift)); + //IM_ASSERT(g.IO.KeyAlt == IsKeyDown(ImGuiKey_LeftAlt) || IsKeyDown(ImGuiKey_RightAlt)); + //IM_ASSERT(g.IO.KeySuper == IsKeyDown(ImGuiKey_LeftSuper) || IsKeyDown(ImGuiKey_RightSuper)); + + // Update gamepad/keyboard navigation + NavUpdate(); + + // Update mouse input state + UpdateMouseInputs(); + + // Find hovered window + // (needs to be before UpdateMouseMovingWindowNewFrame so we fill g.HoveredWindowUnderMovingWindow on the mouse release frame) + UpdateHoveredWindowAndCaptureFlags(); + + // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering) + UpdateMouseMovingWindowNewFrame(); + + // Background darkening/whitening + if (GetTopMostPopupModal() != NULL || (g.NavWindowingTarget != NULL && g.NavWindowingHighlightAlpha > 0.0f)) + g.DimBgRatio = ImMin(g.DimBgRatio + g.IO.DeltaTime * 6.0f, 1.0f); + else + g.DimBgRatio = ImMax(g.DimBgRatio - g.IO.DeltaTime * 10.0f, 0.0f); + + g.MouseCursor = ImGuiMouseCursor_Arrow; + g.WantCaptureMouseNextFrame = g.WantCaptureKeyboardNextFrame = g.WantTextInputNextFrame = -1; + + // Platform IME data: reset for the frame + g.PlatformImeDataPrev = g.PlatformImeData; + g.PlatformImeData.WantVisible = false; + + // Mouse wheel scrolling, scale + UpdateMouseWheel(); + + // Mark all windows as not visible and compact unused memory. + IM_ASSERT(g.WindowsFocusOrder.Size <= g.Windows.Size); + const float memory_compact_start_time = (g.GcCompactAll || g.IO.ConfigMemoryCompactTimer < 0.0f) ? FLT_MAX : (float)g.Time - g.IO.ConfigMemoryCompactTimer; + for (int i = 0; i != g.Windows.Size; i++) + { + ImGuiWindow* window = g.Windows[i]; + window->WasActive = window->Active; + window->BeginCount = 0; + window->Active = false; + window->WriteAccessed = false; + + // Garbage collect transient buffers of recently unused windows + if (!window->WasActive && !window->MemoryCompacted && window->LastTimeActive < memory_compact_start_time) + GcCompactTransientWindowBuffers(window); + } + + // Garbage collect transient buffers of recently unused tables + for (int i = 0; i < g.TablesLastTimeActive.Size; i++) + if (g.TablesLastTimeActive[i] >= 0.0f && g.TablesLastTimeActive[i] < memory_compact_start_time) + TableGcCompactTransientBuffers(g.Tables.GetByIndex(i)); + for (int i = 0; i < g.TablesTempData.Size; i++) + if (g.TablesTempData[i].LastTimeActive >= 0.0f && g.TablesTempData[i].LastTimeActive < memory_compact_start_time) + TableGcCompactTransientBuffers(&g.TablesTempData[i]); + if (g.GcCompactAll) + GcCompactTransientMiscBuffers(); + g.GcCompactAll = false; + + // Closing the focused window restore focus to the first active root window in descending z-order + if (g.NavWindow && !g.NavWindow->WasActive) + FocusTopMostWindowUnderOne(NULL, NULL); + + // No window should be open at the beginning of the frame. + // But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear. + g.CurrentWindowStack.resize(0); + g.BeginPopupStack.resize(0); + g.ItemFlagsStack.resize(0); + g.ItemFlagsStack.push_back(ImGuiItemFlags_None); + g.GroupStack.resize(0); + + // [DEBUG] Update debug features + UpdateDebugToolItemPicker(); + UpdateDebugToolStackQueries(); + + // Create implicit/fallback window - which we will only render it if the user has added something to it. + // We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags. + // This fallback is particularly important as it avoid ImGui:: calls from crashing. + g.WithinFrameScopeWithImplicitWindow = true; + SetNextWindowSize(ImVec2(400, 400), ImGuiCond_FirstUseEver); + Begin("Debug##Default"); + IM_ASSERT(g.CurrentWindow->IsFallbackWindow == true); + + CallContextHooks(&g, ImGuiContextHookType_NewFramePost); +} + +void ImGui::Initialize() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(!g.Initialized && !g.SettingsLoaded); + + // Add .ini handle for ImGuiWindow type + { + ImGuiSettingsHandler ini_handler; + ini_handler.TypeName = "Window"; + ini_handler.TypeHash = ImHashStr("Window"); + ini_handler.ClearAllFn = WindowSettingsHandler_ClearAll; + ini_handler.ReadOpenFn = WindowSettingsHandler_ReadOpen; + ini_handler.ReadLineFn = WindowSettingsHandler_ReadLine; + ini_handler.ApplyAllFn = WindowSettingsHandler_ApplyAll; + ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll; + AddSettingsHandler(&ini_handler); + } + + // Add .ini handle for ImGuiTable type + TableSettingsAddSettingsHandler(); + + // Create default viewport + ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)(); + g.Viewports.push_back(viewport); + +#ifdef IMGUI_HAS_DOCK +#endif + + g.Initialized = true; +} + +// This function is merely here to free heap allocations. +void ImGui::Shutdown() +{ + // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame) + ImGuiContext& g = *GImGui; + if (g.IO.Fonts && g.FontAtlasOwnedByContext) + { + g.IO.Fonts->Locked = false; + IM_DELETE(g.IO.Fonts); + } + g.IO.Fonts = NULL; + + // Cleanup of other data are conditional on actually having initialized Dear ImGui. + if (!g.Initialized) + return; + + // Save settings (unless we haven't attempted to load them: CreateContext/DestroyContext without a call to NewFrame shouldn't save an empty file) + if (g.SettingsLoaded && g.IO.IniFilename != NULL) + SaveIniSettingsToDisk(g.IO.IniFilename); + + CallContextHooks(&g, ImGuiContextHookType_Shutdown); + + // Clear everything else + g.Windows.clear_delete(); + g.WindowsFocusOrder.clear(); + g.WindowsTempSortBuffer.clear(); + g.CurrentWindow = NULL; + g.CurrentWindowStack.clear(); + g.WindowsById.Clear(); + g.NavWindow = NULL; + g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL; + g.ActiveIdWindow = g.ActiveIdPreviousFrameWindow = NULL; + g.MovingWindow = NULL; + g.ColorStack.clear(); + g.StyleVarStack.clear(); + g.FontStack.clear(); + g.OpenPopupStack.clear(); + g.BeginPopupStack.clear(); + + g.Viewports.clear_delete(); + + g.TabBars.Clear(); + g.CurrentTabBarStack.clear(); + g.ShrinkWidthBuffer.clear(); + + g.ClipperTempData.clear_destruct(); + + g.Tables.Clear(); + g.TablesTempData.clear_destruct(); + g.DrawChannelsTempMergeBuffer.clear(); + + g.ClipboardHandlerData.clear(); + g.MenusIdSubmittedThisFrame.clear(); + g.InputTextState.ClearFreeMemory(); + + g.SettingsWindows.clear(); + g.SettingsHandlers.clear(); + + if (g.LogFile) + { +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + if (g.LogFile != stdout) +#endif + ImFileClose(g.LogFile); + g.LogFile = NULL; + } + g.LogBuffer.clear(); + + g.Initialized = false; +} + +// FIXME: Add a more explicit sort order in the window structure. +static int IMGUI_CDECL ChildWindowComparer(const void* lhs, const void* rhs) +{ + const ImGuiWindow* const a = *(const ImGuiWindow* const *)lhs; + const ImGuiWindow* const b = *(const ImGuiWindow* const *)rhs; + if (int d = (a->Flags & ImGuiWindowFlags_Popup) - (b->Flags & ImGuiWindowFlags_Popup)) + return d; + if (int d = (a->Flags & ImGuiWindowFlags_Tooltip) - (b->Flags & ImGuiWindowFlags_Tooltip)) + return d; + return (a->BeginOrderWithinParent - b->BeginOrderWithinParent); +} + +static void AddWindowToSortBuffer(ImVector* out_sorted_windows, ImGuiWindow* window) +{ + out_sorted_windows->push_back(window); + if (window->Active) + { + int count = window->DC.ChildWindows.Size; + ImQsort(window->DC.ChildWindows.Data, (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer); + for (int i = 0; i < count; i++) + { + ImGuiWindow* child = window->DC.ChildWindows[i]; + if (child->Active) + AddWindowToSortBuffer(out_sorted_windows, child); + } + } +} + +static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list) +{ + if (draw_list->CmdBuffer.Size == 0) + return; + if (draw_list->CmdBuffer.Size == 1 && draw_list->CmdBuffer[0].ElemCount == 0 && draw_list->CmdBuffer[0].UserCallback == NULL) + return; + + // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. + // May trigger for you if you are using PrimXXX functions incorrectly. + IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); + IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); + if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset)) + IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); + + // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) + // If this assert triggers because you are drawing lots of stuff manually: + // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds. + // Be mindful that the ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents. + // - If you want large meshes with more than 64K vertices, you can either: + // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'. + // Most example backends already support this from 1.71. Pre-1.71 backends won't. + // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them. + // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h. + // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time: + // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); + // Your own engine or render API may use different parameters or function calls to specify index sizes. + // 2 and 4 bytes indices are generally supported by most graphics API. + // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching + // the 64K limit to split your draw commands in multiple draw lists. + if (sizeof(ImDrawIdx) == 2) + IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); + + out_list->push_back(draw_list); +} + +static void AddWindowToDrawData(ImGuiWindow* window, int layer) +{ + ImGuiContext& g = *GImGui; + ImGuiViewportP* viewport = g.Viewports[0]; + g.IO.MetricsRenderWindows++; + AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[layer], window->DrawList); + for (int i = 0; i < window->DC.ChildWindows.Size; i++) + { + ImGuiWindow* child = window->DC.ChildWindows[i]; + if (IsWindowActiveAndVisible(child)) // Clipped children may have been marked not active + AddWindowToDrawData(child, layer); + } +} + +static inline int GetWindowDisplayLayer(ImGuiWindow* window) +{ + return (window->Flags & ImGuiWindowFlags_Tooltip) ? 1 : 0; +} + +// Layer is locked for the root window, however child windows may use a different viewport (e.g. extruding menu) +static inline void AddRootWindowToDrawData(ImGuiWindow* window) +{ + AddWindowToDrawData(window, GetWindowDisplayLayer(window)); +} + +void ImDrawDataBuilder::FlattenIntoSingleLayer() +{ + int n = Layers[0].Size; + int size = n; + for (int i = 1; i < IM_ARRAYSIZE(Layers); i++) + size += Layers[i].Size; + Layers[0].resize(size); + for (int layer_n = 1; layer_n < IM_ARRAYSIZE(Layers); layer_n++) + { + ImVector& layer = Layers[layer_n]; + if (layer.empty()) + continue; + memcpy(&Layers[0][n], &layer[0], layer.Size * sizeof(ImDrawList*)); + n += layer.Size; + layer.resize(0); + } +} + +static void SetupViewportDrawData(ImGuiViewportP* viewport, ImVector* draw_lists) +{ + ImGuiIO& io = ImGui::GetIO(); + ImDrawData* draw_data = &viewport->DrawDataP; + draw_data->Valid = true; + draw_data->CmdLists = (draw_lists->Size > 0) ? draw_lists->Data : NULL; + draw_data->CmdListsCount = draw_lists->Size; + draw_data->TotalVtxCount = draw_data->TotalIdxCount = 0; + draw_data->DisplayPos = viewport->Pos; + draw_data->DisplaySize = viewport->Size; + draw_data->FramebufferScale = io.DisplayFramebufferScale; + for (int n = 0; n < draw_lists->Size; n++) + { + ImDrawList* draw_list = draw_lists->Data[n]; + draw_list->_PopUnusedDrawCmd(); + draw_data->TotalVtxCount += draw_list->VtxBuffer.Size; + draw_data->TotalIdxCount += draw_list->IdxBuffer.Size; + } +} + +// Push a clipping rectangle for both ImGui logic (hit-testing etc.) and low-level ImDrawList rendering. +// - When using this function it is sane to ensure that float are perfectly rounded to integer values, +// so that e.g. (int)(max.x-min.x) in user's render produce correct result. +// - If the code here changes, may need to update code of functions like NextColumn() and PushColumnClipRect(): +// some frequently called functions which to modify both channels and clipping simultaneously tend to use the +// more specialized SetWindowClipRectBeforeSetChannel() to avoid extraneous updates of underlying ImDrawCmds. +void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DrawList->PushClipRect(clip_rect_min, clip_rect_max, intersect_with_current_clip_rect); + window->ClipRect = window->DrawList->_ClipRectStack.back(); +} + +void ImGui::PopClipRect() +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DrawList->PopClipRect(); + window->ClipRect = window->DrawList->_ClipRectStack.back(); +} + +static void ImGui::RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + ImGuiViewportP* viewport = (ImGuiViewportP*)GetMainViewport(); + ImRect viewport_rect = viewport->GetMainRect(); + + // Draw behind window by moving the draw command at the FRONT of the draw list + { + // We've already called AddWindowToDrawData() which called DrawList->ChannelsMerge() on DockNodeHost windows, + // and draw list have been trimmed already, hence the explicit recreation of a draw command if missing. + // FIXME: This is creating complication, might be simpler if we could inject a drawlist in drawdata at a given position and not attempt to manipulate ImDrawCmd order. + ImDrawList* draw_list = window->RootWindow->DrawList; + if (draw_list->CmdBuffer.Size == 0) + draw_list->AddDrawCmd(); + draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // Ensure ImDrawCmd are not merged + draw_list->AddRectFilled(viewport_rect.Min, viewport_rect.Max, col); + ImDrawCmd cmd = draw_list->CmdBuffer.back(); + IM_ASSERT(cmd.ElemCount == 6); + draw_list->CmdBuffer.pop_back(); + draw_list->CmdBuffer.push_front(cmd); + draw_list->PopClipRect(); + draw_list->AddDrawCmd(); // We need to create a command as CmdBuffer.back().IdxOffset won't be correct if we append to same command. + } +} + +ImGuiWindow* ImGui::FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* parent_window) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* bottom_most_visible_window = parent_window; + for (int i = FindWindowDisplayIndex(parent_window); i >= 0; i--) + { + ImGuiWindow* window = g.Windows[i]; + if (window->Flags & ImGuiWindowFlags_ChildWindow) + continue; + if (!IsWindowWithinBeginStackOf(window, parent_window)) + break; + if (IsWindowActiveAndVisible(window) && GetWindowDisplayLayer(window) <= GetWindowDisplayLayer(parent_window)) + bottom_most_visible_window = window; + } + return bottom_most_visible_window; +} + +static void ImGui::RenderDimmedBackgrounds() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* modal_window = GetTopMostAndVisiblePopupModal(); + if (g.DimBgRatio <= 0.0f && g.NavWindowingHighlightAlpha <= 0.0f) + return; + const bool dim_bg_for_modal = (modal_window != NULL); + const bool dim_bg_for_window_list = (g.NavWindowingTargetAnim != NULL && g.NavWindowingTargetAnim->Active); + if (!dim_bg_for_modal && !dim_bg_for_window_list) + return; + + if (dim_bg_for_modal) + { + // Draw dimming behind modal or a begin stack child, whichever comes first in draw order. + ImGuiWindow* dim_behind_window = FindBottomMostVisibleWindowWithinBeginStack(modal_window); + RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(ImGuiCol_ModalWindowDimBg, g.DimBgRatio)); + } + else if (dim_bg_for_window_list) + { + // Draw dimming behind CTRL+Tab target window + RenderDimmedBackgroundBehindWindow(g.NavWindowingTargetAnim, GetColorU32(ImGuiCol_NavWindowingDimBg, g.DimBgRatio)); + + // Draw border around CTRL+Tab target window + ImGuiWindow* window = g.NavWindowingTargetAnim; + ImGuiViewport* viewport = GetMainViewport(); + float distance = g.FontSize; + ImRect bb = window->Rect(); + bb.Expand(distance); + if (bb.GetWidth() >= viewport->Size.x && bb.GetHeight() >= viewport->Size.y) + bb.Expand(-distance - 1.0f); // If a window fits the entire viewport, adjust its highlight inward + if (window->DrawList->CmdBuffer.Size == 0) + window->DrawList->AddDrawCmd(); + window->DrawList->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size); + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), window->WindowRounding, 0, 3.0f); + window->DrawList->PopClipRect(); + } +} + +// This is normally called by Render(). You may want to call it directly if you want to avoid calling Render() but the gain will be very minimal. +void ImGui::EndFrame() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.Initialized); + + // Don't process EndFrame() multiple times. + if (g.FrameCountEnded == g.FrameCount) + return; + IM_ASSERT(g.WithinFrameScope && "Forgot to call ImGui::NewFrame()?"); + + CallContextHooks(&g, ImGuiContextHookType_EndFramePre); + + ErrorCheckEndFrameSanityChecks(); + + // Notify Platform/OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME) + if (g.IO.SetPlatformImeDataFn && memcmp(&g.PlatformImeData, &g.PlatformImeDataPrev, sizeof(ImGuiPlatformImeData)) != 0) + g.IO.SetPlatformImeDataFn(GetMainViewport(), &g.PlatformImeData); + + // Hide implicit/fallback "Debug" window if it hasn't been used + g.WithinFrameScopeWithImplicitWindow = false; + if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed) + g.CurrentWindow->Active = false; + End(); + + // Update navigation: CTRL+Tab, wrap-around requests + NavEndFrame(); + + // Drag and Drop: Elapse payload (if delivered, or if source stops being submitted) + if (g.DragDropActive) + { + bool is_delivered = g.DragDropPayload.Delivery; + bool is_elapsed = (g.DragDropPayload.DataFrameCount + 1 < g.FrameCount) && ((g.DragDropSourceFlags & ImGuiDragDropFlags_SourceAutoExpirePayload) || !IsMouseDown(g.DragDropMouseButton)); + if (is_delivered || is_elapsed) + ClearDragDrop(); + } + + // Drag and Drop: Fallback for source tooltip. This is not ideal but better than nothing. + if (g.DragDropActive && g.DragDropSourceFrameCount < g.FrameCount && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) + { + g.DragDropWithinSource = true; + SetTooltip("..."); + g.DragDropWithinSource = false; + } + + // End frame + g.WithinFrameScope = false; + g.FrameCountEnded = g.FrameCount; + + // Initiate moving window + handle left-click and right-click focus + UpdateMouseMovingWindowEndFrame(); + + // Sort the window list so that all child windows are after their parent + // We cannot do that on FocusWindow() because children may not exist yet + g.WindowsTempSortBuffer.resize(0); + g.WindowsTempSortBuffer.reserve(g.Windows.Size); + for (int i = 0; i != g.Windows.Size; i++) + { + ImGuiWindow* window = g.Windows[i]; + if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it + continue; + AddWindowToSortBuffer(&g.WindowsTempSortBuffer, window); + } + + // This usually assert if there is a mismatch between the ImGuiWindowFlags_ChildWindow / ParentWindow values and DC.ChildWindows[] in parents, aka we've done something wrong. + IM_ASSERT(g.Windows.Size == g.WindowsTempSortBuffer.Size); + g.Windows.swap(g.WindowsTempSortBuffer); + g.IO.MetricsActiveWindows = g.WindowsActiveCount; + + // Unlock font atlas + g.IO.Fonts->Locked = false; + + // Clear Input data for next frame + g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f; + g.IO.InputQueueCharacters.resize(0); + memset(g.IO.NavInputs, 0, sizeof(g.IO.NavInputs)); + + CallContextHooks(&g, ImGuiContextHookType_EndFramePost); +} + +// Prepare the data for rendering so you can call GetDrawData() +// (As with anything within the ImGui:: namspace this doesn't touch your GPU or graphics API at all: +// it is the role of the ImGui_ImplXXXX_RenderDrawData() function provided by the renderer backend) +void ImGui::Render() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.Initialized); + + if (g.FrameCountEnded != g.FrameCount) + EndFrame(); + const bool first_render_of_frame = (g.FrameCountRendered != g.FrameCount); + g.FrameCountRendered = g.FrameCount; + g.IO.MetricsRenderWindows = 0; + + CallContextHooks(&g, ImGuiContextHookType_RenderPre); + + // Add background ImDrawList (for each active viewport) + for (int n = 0; n != g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + viewport->DrawDataBuilder.Clear(); + if (viewport->DrawLists[0] != NULL) + AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); + } + + // Draw modal/window whitening backgrounds + if (first_render_of_frame) + RenderDimmedBackgrounds(); + + // Add ImDrawList to render + ImGuiWindow* windows_to_render_top_most[2]; + windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL; + windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingListWindow : NULL); + for (int n = 0; n != g.Windows.Size; n++) + { + ImGuiWindow* window = g.Windows[n]; + IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'" + if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_top_most[0] && window != windows_to_render_top_most[1]) + AddRootWindowToDrawData(window); + } + for (int n = 0; n < IM_ARRAYSIZE(windows_to_render_top_most); n++) + if (windows_to_render_top_most[n] && IsWindowActiveAndVisible(windows_to_render_top_most[n])) // NavWindowingTarget is always temporarily displayed as the top-most window + AddRootWindowToDrawData(windows_to_render_top_most[n]); + + // Draw software mouse cursor if requested by io.MouseDrawCursor flag + if (g.IO.MouseDrawCursor && first_render_of_frame && g.MouseCursor != ImGuiMouseCursor_None) + RenderMouseCursor(g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48)); + + // Setup ImDrawData structures for end-user + g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = 0; + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + viewport->DrawDataBuilder.FlattenIntoSingleLayer(); + + // Add foreground ImDrawList (for each active viewport) + if (viewport->DrawLists[1] != NULL) + AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); + + SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]); + ImDrawData* draw_data = &viewport->DrawDataP; + g.IO.MetricsRenderVertices += draw_data->TotalVtxCount; + g.IO.MetricsRenderIndices += draw_data->TotalIdxCount; + } + + CallContextHooks(&g, ImGuiContextHookType_RenderPost); +} + +// Calculate text size. Text can be multi-line. Optionally ignore text after a ## marker. +// CalcTextSize("") should return ImVec2(0.0f, g.FontSize) +ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_text_after_double_hash, float wrap_width) +{ + ImGuiContext& g = *GImGui; + + const char* text_display_end; + if (hide_text_after_double_hash) + text_display_end = FindRenderedTextEnd(text, text_end); // Hide anything after a '##' string + else + text_display_end = text_end; + + ImFont* font = g.Font; + const float font_size = g.FontSize; + if (text == text_display_end) + return ImVec2(0.0f, font_size); + ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL); + + // Round + // FIXME: This has been here since Dec 2015 (7b0bf230) but down the line we want this out. + // FIXME: Investigate using ceilf or e.g. + // - https://git.musl-libc.org/cgit/musl/tree/src/math/ceilf.c + // - https://embarkstudios.github.io/rust-gpu/api/src/libm/math/ceilf.rs.html + text_size.x = IM_FLOOR(text_size.x + 0.99999f); + + return text_size; +} + +// Find window given position, search front-to-back +// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically +// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is +// called, aka before the next Begin(). Moving window isn't affected. +static void FindHoveredWindow() +{ + ImGuiContext& g = *GImGui; + + ImGuiWindow* hovered_window = NULL; + ImGuiWindow* hovered_window_ignoring_moving_window = NULL; + if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) + hovered_window = g.MovingWindow; + + ImVec2 padding_regular = g.Style.TouchExtraPadding; + ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular; + for (int i = g.Windows.Size - 1; i >= 0; i--) + { + ImGuiWindow* window = g.Windows[i]; + IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. + if (!window->Active || window->Hidden) + continue; + if (window->Flags & ImGuiWindowFlags_NoMouseInputs) + continue; + + // Using the clipped AABB, a child window will typically be clipped by its parent (not always) + ImRect bb(window->OuterRectClipped); + if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) + bb.Expand(padding_regular); + else + bb.Expand(padding_for_resize); + if (!bb.Contains(g.IO.MousePos)) + continue; + + // Support for one rectangular hole in any given window + // FIXME: Consider generalizing hit-testing override (with more generic data, callback, etc.) (#1512) + if (window->HitTestHoleSize.x != 0) + { + ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); + ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); + if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) + continue; + } + + if (hovered_window == NULL) + hovered_window = window; + IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. + if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) + hovered_window_ignoring_moving_window = window; + if (hovered_window && hovered_window_ignoring_moving_window) + break; + } + + g.HoveredWindow = hovered_window; + g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; +} + +bool ImGui::IsItemActive() +{ + ImGuiContext& g = *GImGui; + if (g.ActiveId) + return g.ActiveId == g.LastItemData.ID; + return false; +} + +bool ImGui::IsItemActivated() +{ + ImGuiContext& g = *GImGui; + if (g.ActiveId) + if (g.ActiveId == g.LastItemData.ID && g.ActiveIdPreviousFrame != g.LastItemData.ID) + return true; + return false; +} + +bool ImGui::IsItemDeactivated() +{ + ImGuiContext& g = *GImGui; + if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasDeactivated) + return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Deactivated) != 0; + return (g.ActiveIdPreviousFrame == g.LastItemData.ID && g.ActiveIdPreviousFrame != 0 && g.ActiveId != g.LastItemData.ID); +} + +bool ImGui::IsItemDeactivatedAfterEdit() +{ + ImGuiContext& g = *GImGui; + return IsItemDeactivated() && (g.ActiveIdPreviousFrameHasBeenEditedBefore || (g.ActiveId == 0 && g.ActiveIdHasBeenEditedBefore)); +} + +// == GetItemID() == GetFocusID() +bool ImGui::IsItemFocused() +{ + ImGuiContext& g = *GImGui; + if (g.NavId != g.LastItemData.ID || g.NavId == 0) + return false; + return true; +} + +// Important: this can be useful but it is NOT equivalent to the behavior of e.g.Button()! +// Most widgets have specific reactions based on mouse-up/down state, mouse position etc. +bool ImGui::IsItemClicked(ImGuiMouseButton mouse_button) +{ + return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_None); +} + +bool ImGui::IsItemToggledOpen() +{ + ImGuiContext& g = *GImGui; + return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledOpen) ? true : false; +} + +bool ImGui::IsItemToggledSelection() +{ + ImGuiContext& g = *GImGui; + return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledSelection) ? true : false; +} + +bool ImGui::IsAnyItemHovered() +{ + ImGuiContext& g = *GImGui; + return g.HoveredId != 0 || g.HoveredIdPreviousFrame != 0; +} + +bool ImGui::IsAnyItemActive() +{ + ImGuiContext& g = *GImGui; + return g.ActiveId != 0; +} + +bool ImGui::IsAnyItemFocused() +{ + ImGuiContext& g = *GImGui; + return g.NavId != 0 && !g.NavDisableHighlight; +} + +bool ImGui::IsItemVisible() +{ + ImGuiContext& g = *GImGui; + return g.CurrentWindow->ClipRect.Overlaps(g.LastItemData.Rect); +} + +bool ImGui::IsItemEdited() +{ + ImGuiContext& g = *GImGui; + return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Edited) != 0; +} + +// Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority. +// FIXME: Although this is exposed, its interaction and ideal idiom with using ImGuiButtonFlags_AllowItemOverlap flag are extremely confusing, need rework. +void ImGui::SetItemAllowOverlap() +{ + ImGuiContext& g = *GImGui; + ImGuiID id = g.LastItemData.ID; + if (g.HoveredId == id) + g.HoveredIdAllowOverlap = true; + if (g.ActiveId == id) + g.ActiveIdAllowOverlap = true; +} + +void ImGui::SetItemUsingMouseWheel() +{ + ImGuiContext& g = *GImGui; + ImGuiID id = g.LastItemData.ID; + if (g.HoveredId == id) + g.HoveredIdUsingMouseWheel = true; + if (g.ActiveId == id) + g.ActiveIdUsingMouseWheel = true; +} + +void ImGui::SetActiveIdUsingNavAndKeys() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.ActiveId != 0); + g.ActiveIdUsingNavDirMask = ~(ImU32)0; + g.ActiveIdUsingNavInputMask = ~(ImU32)0; + g.ActiveIdUsingKeyInputMask.SetAllBits(); + NavMoveRequestCancel(); +} + +ImVec2 ImGui::GetItemRectMin() +{ + ImGuiContext& g = *GImGui; + return g.LastItemData.Rect.Min; +} + +ImVec2 ImGui::GetItemRectMax() +{ + ImGuiContext& g = *GImGui; + return g.LastItemData.Rect.Max; +} + +ImVec2 ImGui::GetItemRectSize() +{ + ImGuiContext& g = *GImGui; + return g.LastItemData.Rect.GetSize(); +} + +bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* parent_window = g.CurrentWindow; + + flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_ChildWindow; + flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag + + // Size + const ImVec2 content_avail = GetContentRegionAvail(); + ImVec2 size = ImFloor(size_arg); + const int auto_fit_axises = ((size.x == 0.0f) ? (1 << ImGuiAxis_X) : 0x00) | ((size.y == 0.0f) ? (1 << ImGuiAxis_Y) : 0x00); + if (size.x <= 0.0f) + size.x = ImMax(content_avail.x + size.x, 4.0f); // Arbitrary minimum child size (0.0f causing too much issues) + if (size.y <= 0.0f) + size.y = ImMax(content_avail.y + size.y, 4.0f); + SetNextWindowSize(size); + + // Build up name. If you need to append to a same child from multiple location in the ID stack, use BeginChild(ImGuiID id) with a stable value. + if (name) + ImFormatString(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), "%s/%s_%08X", parent_window->Name, name, id); + else + ImFormatString(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), "%s/%08X", parent_window->Name, id); + + const float backup_border_size = g.Style.ChildBorderSize; + if (!border) + g.Style.ChildBorderSize = 0.0f; + bool ret = Begin(g.TempBuffer, NULL, flags); + g.Style.ChildBorderSize = backup_border_size; + + ImGuiWindow* child_window = g.CurrentWindow; + child_window->ChildId = id; + child_window->AutoFitChildAxises = (ImS8)auto_fit_axises; + + // Set the cursor to handle case where the user called SetNextWindowPos()+BeginChild() manually. + // While this is not really documented/defined, it seems that the expected thing to do. + if (child_window->BeginCount == 1) + parent_window->DC.CursorPos = child_window->Pos; + + // Process navigation-in immediately so NavInit can run on first frame + if (g.NavActivateId == id && !(flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavHasScroll)) + { + FocusWindow(child_window); + NavInitWindow(child_window, false); + SetActiveID(id + 1, child_window); // Steal ActiveId with another arbitrary id so that key-press won't activate child item + g.ActiveIdSource = ImGuiInputSource_Nav; + } + return ret; +} + +bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + return BeginChildEx(str_id, window->GetID(str_id), size_arg, border, extra_flags); +} + +bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) +{ + IM_ASSERT(id != 0); + return BeginChildEx(NULL, id, size_arg, border, extra_flags); +} + +void ImGui::EndChild() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + IM_ASSERT(g.WithinEndChild == false); + IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls + + g.WithinEndChild = true; + if (window->BeginCount > 1) + { + End(); + } + else + { + ImVec2 sz = window->Size; + if (window->AutoFitChildAxises & (1 << ImGuiAxis_X)) // Arbitrary minimum zero-ish child size of 4.0f causes less trouble than a 0.0f + sz.x = ImMax(4.0f, sz.x); + if (window->AutoFitChildAxises & (1 << ImGuiAxis_Y)) + sz.y = ImMax(4.0f, sz.y); + End(); + + ImGuiWindow* parent_window = g.CurrentWindow; + ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + sz); + ItemSize(sz); + if ((window->DC.NavLayersActiveMask != 0 || window->DC.NavHasScroll) && !(window->Flags & ImGuiWindowFlags_NavFlattened)) + { + ItemAdd(bb, window->ChildId); + RenderNavHighlight(bb, window->ChildId); + + // When browsing a window that has no activable items (scroll only) we keep a highlight on the child (pass g.NavId to trick into always displaying) + if (window->DC.NavLayersActiveMask == 0 && window == g.NavWindow) + RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_TypeThin); + } + else + { + // Not navigable into + ItemAdd(bb, 0); + } + if (g.HoveredWindow == window) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow; + } + g.WithinEndChild = false; + g.LogLinePosY = -FLT_MAX; // To enforce a carriage return +} + +// Helper to create a child window / scrolling region that looks like a normal widget frame. +bool ImGui::BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags) +{ + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); + PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); + PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); + PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding); + bool ret = BeginChild(id, size, true, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysUseWindowPadding | extra_flags); + PopStyleVar(3); + PopStyleColor(); + return ret; +} + +void ImGui::EndChildFrame() +{ + EndChild(); +} + +static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled) +{ + window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags); + window->SetWindowSizeAllowFlags = enabled ? (window->SetWindowSizeAllowFlags | flags) : (window->SetWindowSizeAllowFlags & ~flags); + window->SetWindowCollapsedAllowFlags = enabled ? (window->SetWindowCollapsedAllowFlags | flags) : (window->SetWindowCollapsedAllowFlags & ~flags); +} + +ImGuiWindow* ImGui::FindWindowByID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + return (ImGuiWindow*)g.WindowsById.GetVoidPtr(id); +} + +ImGuiWindow* ImGui::FindWindowByName(const char* name) +{ + ImGuiID id = ImHashStr(name); + return FindWindowByID(id); +} + +static void ApplyWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings) +{ + window->Pos = ImFloor(ImVec2(settings->Pos.x, settings->Pos.y)); + if (settings->Size.x > 0 && settings->Size.y > 0) + window->Size = window->SizeFull = ImFloor(ImVec2(settings->Size.x, settings->Size.y)); + window->Collapsed = settings->Collapsed; +} + +static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, ImGuiWindowFlags new_flags) +{ + ImGuiContext& g = *GImGui; + + const bool new_is_explicit_child = (new_flags & ImGuiWindowFlags_ChildWindow) != 0; + const bool child_flag_changed = new_is_explicit_child != window->IsExplicitChild; + if ((just_created || child_flag_changed) && !new_is_explicit_child) + { + IM_ASSERT(!g.WindowsFocusOrder.contains(window)); + g.WindowsFocusOrder.push_back(window); + window->FocusOrder = (short)(g.WindowsFocusOrder.Size - 1); + } + else if (!just_created && child_flag_changed && new_is_explicit_child) + { + IM_ASSERT(g.WindowsFocusOrder[window->FocusOrder] == window); + for (int n = window->FocusOrder + 1; n < g.WindowsFocusOrder.Size; n++) + g.WindowsFocusOrder[n]->FocusOrder--; + g.WindowsFocusOrder.erase(g.WindowsFocusOrder.Data + window->FocusOrder); + window->FocusOrder = -1; + } + window->IsExplicitChild = new_is_explicit_child; +} + +static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + //IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags); + + // Create window the first time + ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name); + window->Flags = flags; + g.WindowsById.SetVoidPtr(window->ID, window); + + // Default/arbitrary window position. Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window. + const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); + window->Pos = main_viewport->Pos + ImVec2(60, 60); + + // User can disable loading and saving of settings. Tooltip and child windows also don't store settings. + if (!(flags & ImGuiWindowFlags_NoSavedSettings)) + if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID)) + { + // Retrieve settings from .ini file + window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings); + SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false); + ApplyWindowSettings(window, settings); + } + window->DC.CursorStartPos = window->DC.CursorMaxPos = window->DC.IdealMaxPos = window->Pos; // So first call to CalcWindowContentSizes() doesn't return crazy values + + if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0) + { + window->AutoFitFramesX = window->AutoFitFramesY = 2; + window->AutoFitOnlyGrows = false; + } + else + { + if (window->Size.x <= 0.0f) + window->AutoFitFramesX = 2; + if (window->Size.y <= 0.0f) + window->AutoFitFramesY = 2; + window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0); + } + + if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus) + g.Windows.push_front(window); // Quite slow but rare and only once + else + g.Windows.push_back(window); + UpdateWindowInFocusOrderList(window, true, window->Flags); + + return window; +} + +static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& size_desired) +{ + ImGuiContext& g = *GImGui; + ImVec2 new_size = size_desired; + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) + { + // Using -1,-1 on either X/Y axis to preserve the current size. + ImRect cr = g.NextWindowData.SizeConstraintRect; + new_size.x = (cr.Min.x >= 0 && cr.Max.x >= 0) ? ImClamp(new_size.x, cr.Min.x, cr.Max.x) : window->SizeFull.x; + new_size.y = (cr.Min.y >= 0 && cr.Max.y >= 0) ? ImClamp(new_size.y, cr.Min.y, cr.Max.y) : window->SizeFull.y; + if (g.NextWindowData.SizeCallback) + { + ImGuiSizeCallbackData data; + data.UserData = g.NextWindowData.SizeCallbackUserData; + data.Pos = window->Pos; + data.CurrentSize = window->SizeFull; + data.DesiredSize = new_size; + g.NextWindowData.SizeCallback(&data); + new_size = data.DesiredSize; + } + new_size.x = IM_FLOOR(new_size.x); + new_size.y = IM_FLOOR(new_size.y); + } + + // Minimum size + if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize))) + { + ImGuiWindow* window_for_height = window; + const float decoration_up_height = window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight(); + new_size = ImMax(new_size, g.Style.WindowMinSize); + new_size.y = ImMax(new_size.y, decoration_up_height + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows + } + return new_size; +} + +static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_current, ImVec2* content_size_ideal) +{ + bool preserve_old_content_sizes = false; + if (window->Collapsed && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) + preserve_old_content_sizes = true; + else if (window->Hidden && window->HiddenFramesCannotSkipItems == 0 && window->HiddenFramesCanSkipItems > 0) + preserve_old_content_sizes = true; + if (preserve_old_content_sizes) + { + *content_size_current = window->ContentSize; + *content_size_ideal = window->ContentSizeIdeal; + return; + } + + content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x); + content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y); + content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x); + content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y); +} + +static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_contents) +{ + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); + ImVec2 size_pad = window->WindowPadding * 2.0f; + ImVec2 size_desired = size_contents + size_pad + ImVec2(0.0f, decoration_up_height); + if (window->Flags & ImGuiWindowFlags_Tooltip) + { + // Tooltip always resize + return size_desired; + } + else + { + // Maximum window size is determined by the viewport size or monitor size + const bool is_popup = (window->Flags & ImGuiWindowFlags_Popup) != 0; + const bool is_menu = (window->Flags & ImGuiWindowFlags_ChildMenu) != 0; + ImVec2 size_min = style.WindowMinSize; + if (is_popup || is_menu) // Popups and menus bypass style.WindowMinSize by default, but we give then a non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups) + size_min = ImMin(size_min, ImVec2(4.0f, 4.0f)); + + // FIXME-VIEWPORT-WORKAREA: May want to use GetWorkSize() instead of Size depending on the type of windows? + ImVec2 avail_size = ImGui::GetMainViewport()->Size; + ImVec2 size_auto_fit = ImClamp(size_desired, size_min, ImMax(size_min, avail_size - style.DisplaySafeAreaPadding * 2.0f)); + + // When the window cannot fit all contents (either because of constraints, either because screen is too small), + // we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding. + ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit); + bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - 0.0f < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar); + bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_up_height < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar); + if (will_have_scrollbar_x) + size_auto_fit.y += style.ScrollbarSize; + if (will_have_scrollbar_y) + size_auto_fit.x += style.ScrollbarSize; + return size_auto_fit; + } +} + +ImVec2 ImGui::CalcWindowNextAutoFitSize(ImGuiWindow* window) +{ + ImVec2 size_contents_current; + ImVec2 size_contents_ideal; + CalcWindowContentSizes(window, &size_contents_current, &size_contents_ideal); + ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, size_contents_ideal); + ImVec2 size_final = CalcWindowSizeAfterConstraint(window, size_auto_fit); + return size_final; +} + +static ImGuiCol GetWindowBgColorIdx(ImGuiWindow* window) +{ + if (window->Flags & (ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) + return ImGuiCol_PopupBg; + if (window->Flags & ImGuiWindowFlags_ChildWindow) + return ImGuiCol_ChildBg; + return ImGuiCol_WindowBg; +} + +static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& corner_target, const ImVec2& corner_norm, ImVec2* out_pos, ImVec2* out_size) +{ + ImVec2 pos_min = ImLerp(corner_target, window->Pos, corner_norm); // Expected window upper-left + ImVec2 pos_max = ImLerp(window->Pos + window->Size, corner_target, corner_norm); // Expected window lower-right + ImVec2 size_expected = pos_max - pos_min; + ImVec2 size_constrained = CalcWindowSizeAfterConstraint(window, size_expected); + *out_pos = pos_min; + if (corner_norm.x == 0.0f) + out_pos->x -= (size_constrained.x - size_expected.x); + if (corner_norm.y == 0.0f) + out_pos->y -= (size_constrained.y - size_expected.y); + *out_size = size_constrained; +} + +// Data for resizing from corner +struct ImGuiResizeGripDef +{ + ImVec2 CornerPosN; + ImVec2 InnerDir; + int AngleMin12, AngleMax12; +}; +static const ImGuiResizeGripDef resize_grip_def[4] = +{ + { ImVec2(1, 1), ImVec2(-1, -1), 0, 3 }, // Lower-right + { ImVec2(0, 1), ImVec2(+1, -1), 3, 6 }, // Lower-left + { ImVec2(0, 0), ImVec2(+1, +1), 6, 9 }, // Upper-left (Unused) + { ImVec2(1, 0), ImVec2(-1, +1), 9, 12 } // Upper-right (Unused) +}; + +// Data for resizing from borders +struct ImGuiResizeBorderDef +{ + ImVec2 InnerDir; + ImVec2 SegmentN1, SegmentN2; + float OuterAngle; +}; +static const ImGuiResizeBorderDef resize_border_def[4] = +{ + { ImVec2(+1, 0), ImVec2(0, 1), ImVec2(0, 0), IM_PI * 1.00f }, // Left + { ImVec2(-1, 0), ImVec2(1, 0), ImVec2(1, 1), IM_PI * 0.00f }, // Right + { ImVec2(0, +1), ImVec2(0, 0), ImVec2(1, 0), IM_PI * 1.50f }, // Up + { ImVec2(0, -1), ImVec2(1, 1), ImVec2(0, 1), IM_PI * 0.50f } // Down +}; + +static ImRect GetResizeBorderRect(ImGuiWindow* window, int border_n, float perp_padding, float thickness) +{ + ImRect rect = window->Rect(); + if (thickness == 0.0f) + rect.Max -= ImVec2(1, 1); + if (border_n == ImGuiDir_Left) { return ImRect(rect.Min.x - thickness, rect.Min.y + perp_padding, rect.Min.x + thickness, rect.Max.y - perp_padding); } + if (border_n == ImGuiDir_Right) { return ImRect(rect.Max.x - thickness, rect.Min.y + perp_padding, rect.Max.x + thickness, rect.Max.y - perp_padding); } + if (border_n == ImGuiDir_Up) { return ImRect(rect.Min.x + perp_padding, rect.Min.y - thickness, rect.Max.x - perp_padding, rect.Min.y + thickness); } + if (border_n == ImGuiDir_Down) { return ImRect(rect.Min.x + perp_padding, rect.Max.y - thickness, rect.Max.x - perp_padding, rect.Max.y + thickness); } + IM_ASSERT(0); + return ImRect(); +} + +// 0..3: corners (Lower-right, Lower-left, Unused, Unused) +ImGuiID ImGui::GetWindowResizeCornerID(ImGuiWindow* window, int n) +{ + IM_ASSERT(n >= 0 && n < 4); + ImGuiID id = window->ID; + id = ImHashStr("#RESIZE", 0, id); + id = ImHashData(&n, sizeof(int), id); + return id; +} + +// Borders (Left, Right, Up, Down) +ImGuiID ImGui::GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir) +{ + IM_ASSERT(dir >= 0 && dir < 4); + int n = (int)dir + 4; + ImGuiID id = window->ID; + id = ImHashStr("#RESIZE", 0, id); + id = ImHashData(&n, sizeof(int), id); + return id; +} + +// Handle resize for: Resize Grips, Borders, Gamepad +// Return true when using auto-fit (double click on resize grip) +static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect) +{ + ImGuiContext& g = *GImGui; + ImGuiWindowFlags flags = window->Flags; + + if ((flags & ImGuiWindowFlags_NoResize) || (flags & ImGuiWindowFlags_AlwaysAutoResize) || window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) + return false; + if (window->WasActive == false) // Early out to avoid running this code for e.g. an hidden implicit/fallback Debug window. + return false; + + bool ret_auto_fit = false; + const int resize_border_count = g.IO.ConfigWindowsResizeFromEdges ? 4 : 0; + const float grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); + const float grip_hover_inner_size = IM_FLOOR(grip_draw_size * 0.75f); + const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_HOVER_PADDING : 0.0f; + + ImVec2 pos_target(FLT_MAX, FLT_MAX); + ImVec2 size_target(FLT_MAX, FLT_MAX); + + // Resize grips and borders are on layer 1 + window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; + + // Manual resize grips + PushID("#RESIZE"); + for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) + { + const ImGuiResizeGripDef& def = resize_grip_def[resize_grip_n]; + const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, def.CornerPosN); + + // Using the FlattenChilds button flag we make the resize button accessible even if we are hovering over a child window + bool hovered, held; + ImRect resize_rect(corner - def.InnerDir * grip_hover_outer_size, corner + def.InnerDir * grip_hover_inner_size); + if (resize_rect.Min.x > resize_rect.Max.x) ImSwap(resize_rect.Min.x, resize_rect.Max.x); + if (resize_rect.Min.y > resize_rect.Max.y) ImSwap(resize_rect.Min.y, resize_rect.Max.y); + ImGuiID resize_grip_id = window->GetID(resize_grip_n); // == GetWindowResizeCornerID() + KeepAliveID(resize_grip_id); + ButtonBehavior(resize_rect, resize_grip_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); + //GetForegroundDrawList(window)->AddRect(resize_rect.Min, resize_rect.Max, IM_COL32(255, 255, 0, 255)); + if (hovered || held) + g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE; + + if (held && g.IO.MouseClickedCount[0] == 2 && resize_grip_n == 0) + { + // Manual auto-fit when double-clicking + size_target = CalcWindowSizeAfterConstraint(window, size_auto_fit); + ret_auto_fit = true; + ClearActiveID(); + } + else if (held) + { + // Resize from any of the four corners + // We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position + ImVec2 clamp_min = ImVec2(def.CornerPosN.x == 1.0f ? visibility_rect.Min.x : -FLT_MAX, def.CornerPosN.y == 1.0f ? visibility_rect.Min.y : -FLT_MAX); + ImVec2 clamp_max = ImVec2(def.CornerPosN.x == 0.0f ? visibility_rect.Max.x : +FLT_MAX, def.CornerPosN.y == 0.0f ? visibility_rect.Max.y : +FLT_MAX); + ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + ImLerp(def.InnerDir * grip_hover_outer_size, def.InnerDir * -grip_hover_inner_size, def.CornerPosN); // Corner of the window corresponding to our corner grip + corner_target = ImClamp(corner_target, clamp_min, clamp_max); + CalcResizePosSizeFromAnyCorner(window, corner_target, def.CornerPosN, &pos_target, &size_target); + } + + // Only lower-left grip is visible before hovering/activating + if (resize_grip_n == 0 || held || hovered) + resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip); + } + for (int border_n = 0; border_n < resize_border_count; border_n++) + { + const ImGuiResizeBorderDef& def = resize_border_def[border_n]; + const ImGuiAxis axis = (border_n == ImGuiDir_Left || border_n == ImGuiDir_Right) ? ImGuiAxis_X : ImGuiAxis_Y; + + bool hovered, held; + ImRect border_rect = GetResizeBorderRect(window, border_n, grip_hover_inner_size, WINDOWS_HOVER_PADDING); + ImGuiID border_id = window->GetID(border_n + 4); // == GetWindowResizeBorderID() + KeepAliveID(border_id); + ButtonBehavior(border_rect, border_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); + //GetForegroundDrawLists(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255)); + if ((hovered && g.HoveredIdTimer > WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) || held) + { + g.MouseCursor = (axis == ImGuiAxis_X) ? ImGuiMouseCursor_ResizeEW : ImGuiMouseCursor_ResizeNS; + if (held) + *border_held = border_n; + } + if (held) + { + ImVec2 clamp_min(border_n == ImGuiDir_Right ? visibility_rect.Min.x : -FLT_MAX, border_n == ImGuiDir_Down ? visibility_rect.Min.y : -FLT_MAX); + ImVec2 clamp_max(border_n == ImGuiDir_Left ? visibility_rect.Max.x : +FLT_MAX, border_n == ImGuiDir_Up ? visibility_rect.Max.y : +FLT_MAX); + ImVec2 border_target = window->Pos; + border_target[axis] = g.IO.MousePos[axis] - g.ActiveIdClickOffset[axis] + WINDOWS_HOVER_PADDING; + border_target = ImClamp(border_target, clamp_min, clamp_max); + CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target); + } + } + PopID(); + + // Restore nav layer + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + + // Navigation resize (keyboard/gamepad) + if (g.NavWindowingTarget && g.NavWindowingTarget->RootWindow == window) + { + ImVec2 nav_resize_delta; + if (g.NavInputSource == ImGuiInputSource_Keyboard && g.IO.KeyShift) + nav_resize_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_RawKeyboard, ImGuiNavReadMode_Down); + if (g.NavInputSource == ImGuiInputSource_Gamepad) + nav_resize_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadDPad, ImGuiNavReadMode_Down); + if (nav_resize_delta.x != 0.0f || nav_resize_delta.y != 0.0f) + { + const float NAV_RESIZE_SPEED = 600.0f; + nav_resize_delta *= ImFloor(NAV_RESIZE_SPEED * g.IO.DeltaTime * ImMin(g.IO.DisplayFramebufferScale.x, g.IO.DisplayFramebufferScale.y)); + nav_resize_delta = ImMax(nav_resize_delta, visibility_rect.Min - window->Pos - window->Size); + g.NavWindowingToggleLayer = false; + g.NavDisableMouseHover = true; + resize_grip_col[0] = GetColorU32(ImGuiCol_ResizeGripActive); + // FIXME-NAV: Should store and accumulate into a separate size buffer to handle sizing constraints properly, right now a constraint will make us stuck. + size_target = CalcWindowSizeAfterConstraint(window, window->SizeFull + nav_resize_delta); + } + } + + // Apply back modified position/size to window + if (size_target.x != FLT_MAX) + { + window->SizeFull = size_target; + MarkIniSettingsDirty(window); + } + if (pos_target.x != FLT_MAX) + { + window->Pos = ImFloor(pos_target); + MarkIniSettingsDirty(window); + } + + window->Size = window->SizeFull; + return ret_auto_fit; +} + +static inline void ClampWindowRect(ImGuiWindow* window, const ImRect& visibility_rect) +{ + ImGuiContext& g = *GImGui; + ImVec2 size_for_clamping = window->Size; + if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) + size_for_clamping.y = window->TitleBarHeight(); + window->Pos = ImClamp(window->Pos, visibility_rect.Min - size_for_clamping, visibility_rect.Max); +} + +static void ImGui::RenderWindowOuterBorders(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + float rounding = window->WindowRounding; + float border_size = window->WindowBorderSize; + if (border_size > 0.0f && !(window->Flags & ImGuiWindowFlags_NoBackground)) + window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); + + int border_held = window->ResizeBorderHeld; + if (border_held != -1) + { + const ImGuiResizeBorderDef& def = resize_border_def[border_held]; + ImRect border_r = GetResizeBorderRect(window, border_held, rounding, 0.0f); + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle); + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f); + window->DrawList->PathStroke(GetColorU32(ImGuiCol_SeparatorActive), 0, ImMax(2.0f, border_size)); // Thicker than usual + } + if (g.Style.FrameBorderSize > 0 && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) + { + float y = window->Pos.y + window->TitleBarHeight() - 1; + window->DrawList->AddLine(ImVec2(window->Pos.x + border_size, y), ImVec2(window->Pos.x + window->Size.x - border_size, y), GetColorU32(ImGuiCol_Border), g.Style.FrameBorderSize); + } +} + +// Draw background and borders +// Draw and handle scrollbars +void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size) +{ + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + ImGuiWindowFlags flags = window->Flags; + + // Ensure that ScrollBar doesn't read last frame's SkipItems + IM_ASSERT(window->BeginCount == 0); + window->SkipItems = false; + + // Draw window + handle manual resize + // As we highlight the title bar when want_focus is set, multiple reappearing windows will have have their title bar highlighted on their reappearing frame. + const float window_rounding = window->WindowRounding; + const float window_border_size = window->WindowBorderSize; + if (window->Collapsed) + { + // Title bar only + float backup_border_size = style.FrameBorderSize; + g.Style.FrameBorderSize = window->WindowBorderSize; + ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed); + RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding); + g.Style.FrameBorderSize = backup_border_size; + } + else + { + // Window background + if (!(flags & ImGuiWindowFlags_NoBackground)) + { + ImU32 bg_col = GetColorU32(GetWindowBgColorIdx(window)); + bool override_alpha = false; + float alpha = 1.0f; + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasBgAlpha) + { + alpha = g.NextWindowData.BgAlphaVal; + override_alpha = true; + } + if (override_alpha) + bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT); + window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? 0 : ImDrawFlags_RoundCornersBottom); + } + + // Title bar + if (!(flags & ImGuiWindowFlags_NoTitleBar)) + { + ImU32 title_bar_col = GetColorU32(title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg); + window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, window_rounding, ImDrawFlags_RoundCornersTop); + } + + // Menu bar + if (flags & ImGuiWindowFlags_MenuBar) + { + ImRect menu_bar_rect = window->MenuBarRect(); + menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them. + window->DrawList->AddRectFilled(menu_bar_rect.Min + ImVec2(window_border_size, 0), menu_bar_rect.Max - ImVec2(window_border_size, 0), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawFlags_RoundCornersTop); + if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y) + window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize); + } + + // Scrollbars + if (window->ScrollbarX) + Scrollbar(ImGuiAxis_X); + if (window->ScrollbarY) + Scrollbar(ImGuiAxis_Y); + + // Render resize grips (after their input handling so we don't have a frame of latency) + if (!(flags & ImGuiWindowFlags_NoResize)) + { + for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) + { + const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n]; + const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN); + window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, resize_grip_draw_size) : ImVec2(resize_grip_draw_size, window_border_size))); + window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(resize_grip_draw_size, window_border_size) : ImVec2(window_border_size, resize_grip_draw_size))); + window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12); + window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]); + } + } + + // Borders + RenderWindowOuterBorders(window); + } +} + +// Render title text, collapse button, close button +void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open) +{ + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + ImGuiWindowFlags flags = window->Flags; + + const bool has_close_button = (p_open != NULL); + const bool has_collapse_button = !(flags & ImGuiWindowFlags_NoCollapse) && (style.WindowMenuButtonPosition != ImGuiDir_None); + + // Close & Collapse button are on the Menu NavLayer and don't default focus (unless there's nothing else on that layer) + // FIXME-NAV: Might want (or not?) to set the equivalent of ImGuiButtonFlags_NoNavFocus so that mouse clicks on standard title bar items don't necessarily set nav/keyboard ref? + const ImGuiItemFlags item_flags_backup = g.CurrentItemFlags; + g.CurrentItemFlags |= ImGuiItemFlags_NoNavDefaultFocus; + window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; + + // Layout buttons + // FIXME: Would be nice to generalize the subtleties expressed here into reusable code. + float pad_l = style.FramePadding.x; + float pad_r = style.FramePadding.x; + float button_sz = g.FontSize; + ImVec2 close_button_pos; + ImVec2 collapse_button_pos; + if (has_close_button) + { + pad_r += button_sz; + close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + } + if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Right) + { + pad_r += button_sz; + collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + } + if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Left) + { + collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l - style.FramePadding.x, title_bar_rect.Min.y); + pad_l += button_sz; + } + + // Collapse button (submitting first so it gets priority when choosing a navigation init fallback) + if (has_collapse_button) + if (CollapseButton(window->GetID("#COLLAPSE"), collapse_button_pos)) + window->WantCollapseToggle = true; // Defer actual collapsing to next frame as we are too far in the Begin() function + + // Close button + if (has_close_button) + if (CloseButton(window->GetID("#CLOSE"), close_button_pos)) + *p_open = false; + + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + g.CurrentItemFlags = item_flags_backup; + + // Title bar text (with: horizontal alignment, avoiding collapse/close button, optional "unsaved document" marker) + // FIXME: Refactor text alignment facilities along with RenderText helpers, this is WAY too much messy code.. + const float marker_size_x = (flags & ImGuiWindowFlags_UnsavedDocument) ? button_sz * 0.80f : 0.0f; + const ImVec2 text_size = CalcTextSize(name, NULL, true) + ImVec2(marker_size_x, 0.0f); + + // As a nice touch we try to ensure that centered title text doesn't get affected by visibility of Close/Collapse button, + // while uncentered title text will still reach edges correctly. + if (pad_l > style.FramePadding.x) + pad_l += g.Style.ItemInnerSpacing.x; + if (pad_r > style.FramePadding.x) + pad_r += g.Style.ItemInnerSpacing.x; + if (style.WindowTitleAlign.x > 0.0f && style.WindowTitleAlign.x < 1.0f) + { + float centerness = ImSaturate(1.0f - ImFabs(style.WindowTitleAlign.x - 0.5f) * 2.0f); // 0.0f on either edges, 1.0f on center + float pad_extend = ImMin(ImMax(pad_l, pad_r), title_bar_rect.GetWidth() - pad_l - pad_r - text_size.x); + pad_l = ImMax(pad_l, pad_extend * centerness); + pad_r = ImMax(pad_r, pad_extend * centerness); + } + + ImRect layout_r(title_bar_rect.Min.x + pad_l, title_bar_rect.Min.y, title_bar_rect.Max.x - pad_r, title_bar_rect.Max.y); + ImRect clip_r(layout_r.Min.x, layout_r.Min.y, ImMin(layout_r.Max.x + g.Style.ItemInnerSpacing.x, title_bar_rect.Max.x), layout_r.Max.y); + if (flags & ImGuiWindowFlags_UnsavedDocument) + { + ImVec2 marker_pos; + marker_pos.x = ImClamp(layout_r.Min.x + (layout_r.GetWidth() - text_size.x) * style.WindowTitleAlign.x + text_size.x, layout_r.Min.x, layout_r.Max.x); + marker_pos.y = (layout_r.Min.y + layout_r.Max.y) * 0.5f; + if (marker_pos.x > layout_r.Min.x) + { + RenderBullet(window->DrawList, marker_pos, GetColorU32(ImGuiCol_Text)); + clip_r.Max.x = ImMin(clip_r.Max.x, marker_pos.x - (int)(marker_size_x * 0.5f)); + } + } + //if (g.IO.KeyShift) window->DrawList->AddRect(layout_r.Min, layout_r.Max, IM_COL32(255, 128, 0, 255)); // [DEBUG] + //if (g.IO.KeyCtrl) window->DrawList->AddRect(clip_r.Min, clip_r.Max, IM_COL32(255, 128, 0, 255)); // [DEBUG] + RenderTextClipped(layout_r.Min, layout_r.Max, name, NULL, &text_size, style.WindowTitleAlign, &clip_r); +} + +void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window) +{ + window->ParentWindow = parent_window; + window->RootWindow = window->RootWindowPopupTree = window->RootWindowForTitleBarHighlight = window->RootWindowForNav = window; + if (parent_window && (flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Tooltip)) + window->RootWindow = parent_window->RootWindow; + if (parent_window && (flags & ImGuiWindowFlags_Popup)) + window->RootWindowPopupTree = parent_window->RootWindowPopupTree; + if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup))) + window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight; + while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened) + { + IM_ASSERT(window->RootWindowForNav->ParentWindow != NULL); + window->RootWindowForNav = window->RootWindowForNav->ParentWindow; + } +} + +// When a modal popup is open, newly created windows that want focus (i.e. are not popups and do not specify ImGuiWindowFlags_NoFocusOnAppearing) +// should be positioned behind that modal window, unless the window was created inside the modal begin-stack. +// In case of multiple stacked modals newly created window honors begin stack order and does not go below its own modal parent. +// - Window // FindBlockingModal() returns Modal1 +// - Window // .. returns Modal1 +// - Modal1 // .. returns Modal2 +// - Window // .. returns Modal2 +// - Window // .. returns Modal2 +// - Modal2 // .. returns Modal2 +static ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (g.OpenPopupStack.Size <= 0) + return NULL; + + // Find a modal that has common parent with specified window. Specified window should be positioned behind that modal. + for (int i = g.OpenPopupStack.Size - 1; i >= 0; i--) + { + ImGuiWindow* popup_window = g.OpenPopupStack.Data[i].Window; + if (popup_window == NULL || !(popup_window->Flags & ImGuiWindowFlags_Modal)) + continue; + if (!popup_window->Active && !popup_window->WasActive) // Check WasActive, because this code may run before popup renders on current frame, also check Active to handle newly created windows. + continue; + if (IsWindowWithinBeginStackOf(window, popup_window)) // Window is rendered over last modal, no render order change needed. + break; + for (ImGuiWindow* parent = popup_window->ParentWindowInBeginStack->RootWindow; parent != NULL; parent = parent->ParentWindowInBeginStack->RootWindow) + if (IsWindowWithinBeginStackOf(window, parent)) + return popup_window; // Place window above its begin stack parent. + } + return NULL; +} + +// Push a new Dear ImGui window to add widgets to. +// - A default window called "Debug" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair. +// - Begin/End can be called multiple times during the frame with the same window name to append content. +// - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file). +// You can use the "##" or "###" markers to use the same label with different id, or same id with different label. See documentation at the top of this file. +// - Return false when window is collapsed, so you can early out in your code. You always need to call ImGui::End() even if false is returned. +// - Passing 'bool* p_open' displays a Close button on the upper-right corner of the window, the pointed value will be set to false when the button is pressed. +bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + IM_ASSERT(name != NULL && name[0] != '\0'); // Window name required + IM_ASSERT(g.WithinFrameScope); // Forgot to call ImGui::NewFrame() + IM_ASSERT(g.FrameCountEnded != g.FrameCount); // Called ImGui::Render() or ImGui::EndFrame() and haven't called ImGui::NewFrame() again yet + + // Find or create + ImGuiWindow* window = FindWindowByName(name); + const bool window_just_created = (window == NULL); + if (window_just_created) + window = CreateNewWindow(name, flags); + else + UpdateWindowInFocusOrderList(window, window_just_created, flags); + + // Automatically disable manual moving/resizing when NoInputs is set + if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs) + flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize; + + if (flags & ImGuiWindowFlags_NavFlattened) + IM_ASSERT(flags & ImGuiWindowFlags_ChildWindow); + + const int current_frame = g.FrameCount; + const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame); + window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.WithinFrameScopeWithImplicitWindow); + + // Update the Appearing flag + bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on + if (flags & ImGuiWindowFlags_Popup) + { + ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size]; + window_just_activated_by_user |= (window->PopupId != popup_ref.PopupId); // We recycle popups so treat window as activated if popup id changed + window_just_activated_by_user |= (window != popup_ref.Window); + } + window->Appearing = window_just_activated_by_user; + if (window->Appearing) + SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, true); + + // Update Flags, LastFrameActive, BeginOrderXXX fields + if (first_begin_of_the_frame) + { + window->Flags = (ImGuiWindowFlags)flags; + window->LastFrameActive = current_frame; + window->LastTimeActive = (float)g.Time; + window->BeginOrderWithinParent = 0; + window->BeginOrderWithinContext = (short)(g.WindowsActiveCount++); + } + else + { + flags = window->Flags; + } + + // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack + ImGuiWindow* parent_window_in_stack = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back().Window; + ImGuiWindow* parent_window = first_begin_of_the_frame ? ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) ? parent_window_in_stack : NULL) : window->ParentWindow; + IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow)); + + // We allow window memory to be compacted so recreate the base stack when needed. + if (window->IDStack.Size == 0) + window->IDStack.push_back(window->ID); + + // Add to stack + // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow() + g.CurrentWindow = window; + ImGuiWindowStackData window_stack_data; + window_stack_data.Window = window; + window_stack_data.ParentLastItemDataBackup = g.LastItemData; + window_stack_data.StackSizesOnBegin.SetToCurrentState(); + g.CurrentWindowStack.push_back(window_stack_data); + g.CurrentWindow = NULL; + if (flags & ImGuiWindowFlags_ChildMenu) + g.BeginMenuCount++; + + if (flags & ImGuiWindowFlags_Popup) + { + ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size]; + popup_ref.Window = window; + g.BeginPopupStack.push_back(popup_ref); + window->PopupId = popup_ref.PopupId; + } + + // Update ->RootWindow and others pointers (before any possible call to FocusWindow) + if (first_begin_of_the_frame) + { + UpdateWindowParentAndRootLinks(window, flags, parent_window); + window->ParentWindowInBeginStack = parent_window_in_stack; + } + + // Process SetNextWindow***() calls + // (FIXME: Consider splitting the HasXXX flags into X/Y components + bool window_pos_set_by_api = false; + bool window_size_x_set_by_api = false, window_size_y_set_by_api = false; + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) + { + window_pos_set_by_api = (window->SetWindowPosAllowFlags & g.NextWindowData.PosCond) != 0; + if (window_pos_set_by_api && ImLengthSqr(g.NextWindowData.PosPivotVal) > 0.00001f) + { + // May be processed on the next frame if this is our first frame and we are measuring size + // FIXME: Look into removing the branch so everything can go through this same code path for consistency. + window->SetWindowPosVal = g.NextWindowData.PosVal; + window->SetWindowPosPivot = g.NextWindowData.PosPivotVal; + window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + } + else + { + SetWindowPos(window, g.NextWindowData.PosVal, g.NextWindowData.PosCond); + } + } + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize) + { + window_size_x_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.x > 0.0f); + window_size_y_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.y > 0.0f); + SetWindowSize(window, g.NextWindowData.SizeVal, g.NextWindowData.SizeCond); + } + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasScroll) + { + if (g.NextWindowData.ScrollVal.x >= 0.0f) + { + window->ScrollTarget.x = g.NextWindowData.ScrollVal.x; + window->ScrollTargetCenterRatio.x = 0.0f; + } + if (g.NextWindowData.ScrollVal.y >= 0.0f) + { + window->ScrollTarget.y = g.NextWindowData.ScrollVal.y; + window->ScrollTargetCenterRatio.y = 0.0f; + } + } + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasContentSize) + window->ContentSizeExplicit = g.NextWindowData.ContentSizeVal; + else if (first_begin_of_the_frame) + window->ContentSizeExplicit = ImVec2(0.0f, 0.0f); + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasCollapsed) + SetWindowCollapsed(window, g.NextWindowData.CollapsedVal, g.NextWindowData.CollapsedCond); + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasFocus) + FocusWindow(window); + if (window->Appearing) + SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false); + + // When reusing window again multiple times a frame, just append content (don't need to setup again) + if (first_begin_of_the_frame) + { + // Initialize + const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345) + const bool window_just_appearing_after_hidden_for_resize = (window->HiddenFramesCannotSkipItems > 0); + window->Active = true; + window->HasCloseButton = (p_open != NULL); + window->ClipRect = ImVec4(-FLT_MAX, -FLT_MAX, +FLT_MAX, +FLT_MAX); + window->IDStack.resize(1); + window->DrawList->_ResetForNewFrame(); + window->DC.CurrentTableIdx = -1; + + // Restore buffer capacity when woken from a compacted state, to avoid + if (window->MemoryCompacted) + GcAwakeTransientWindowBuffers(window); + + // Update stored window name when it changes (which can _only_ happen with the "###" operator, so the ID would stay unchanged). + // The title bar always display the 'name' parameter, so we only update the string storage if it needs to be visible to the end-user elsewhere. + bool window_title_visible_elsewhere = false; + if (g.NavWindowingListWindow != NULL && (window->Flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB + window_title_visible_elsewhere = true; + if (window_title_visible_elsewhere && !window_just_created && strcmp(name, window->Name) != 0) + { + size_t buf_len = (size_t)window->NameBufLen; + window->Name = ImStrdupcpy(window->Name, &buf_len, name); + window->NameBufLen = (int)buf_len; + } + + // UPDATE CONTENTS SIZE, UPDATE HIDDEN STATUS + + // Update contents size from last frame for auto-fitting (or use explicit size) + CalcWindowContentSizes(window, &window->ContentSize, &window->ContentSizeIdeal); + if (window->HiddenFramesCanSkipItems > 0) + window->HiddenFramesCanSkipItems--; + if (window->HiddenFramesCannotSkipItems > 0) + window->HiddenFramesCannotSkipItems--; + if (window->HiddenFramesForRenderOnly > 0) + window->HiddenFramesForRenderOnly--; + + // Hide new windows for one frame until they calculate their size + if (window_just_created && (!window_size_x_set_by_api || !window_size_y_set_by_api)) + window->HiddenFramesCannotSkipItems = 1; + + // Hide popup/tooltip window when re-opening while we measure size (because we recycle the windows) + // We reset Size/ContentSize for reappearing popups/tooltips early in this function, so further code won't be tempted to use the old size. + if (window_just_activated_by_user && (flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) != 0) + { + window->HiddenFramesCannotSkipItems = 1; + if (flags & ImGuiWindowFlags_AlwaysAutoResize) + { + if (!window_size_x_set_by_api) + window->Size.x = window->SizeFull.x = 0.f; + if (!window_size_y_set_by_api) + window->Size.y = window->SizeFull.y = 0.f; + window->ContentSize = window->ContentSizeIdeal = ImVec2(0.f, 0.f); + } + } + + // SELECT VIEWPORT + // FIXME-VIEWPORT: In the docking/viewport branch, this is the point where we select the current viewport (which may affect the style) + + ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)GetMainViewport(); + SetWindowViewport(window, viewport); + SetCurrentWindow(window); + + // LOCK BORDER SIZE AND PADDING FOR THE FRAME (so that altering them doesn't cause inconsistencies) + + if (flags & ImGuiWindowFlags_ChildWindow) + window->WindowBorderSize = style.ChildBorderSize; + else + window->WindowBorderSize = ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize; + window->WindowPadding = style.WindowPadding; + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f) + window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f); + + // Lock menu offset so size calculation can use it as menu-bar windows need a minimum size. + window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x); + window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y; + + // Collapse window by double-clicking on title bar + // At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing + if (!(flags & ImGuiWindowFlags_NoTitleBar) && !(flags & ImGuiWindowFlags_NoCollapse)) + { + // We don't use a regular button+id to test for double-click on title bar (mostly due to legacy reason, could be fixed), so verify that we don't have items over the title bar. + ImRect title_bar_rect = window->TitleBarRect(); + if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseClickedCount[0] == 2) + window->WantCollapseToggle = true; + if (window->WantCollapseToggle) + { + window->Collapsed = !window->Collapsed; + MarkIniSettingsDirty(window); + } + } + else + { + window->Collapsed = false; + } + window->WantCollapseToggle = false; + + // SIZE + + // Calculate auto-fit size, handle automatic resize + const ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, window->ContentSizeIdeal); + bool use_current_size_for_scrollbar_x = window_just_created; + bool use_current_size_for_scrollbar_y = window_just_created; + if ((flags & ImGuiWindowFlags_AlwaysAutoResize) && !window->Collapsed) + { + // Using SetNextWindowSize() overrides ImGuiWindowFlags_AlwaysAutoResize, so it can be used on tooltips/popups, etc. + if (!window_size_x_set_by_api) + { + window->SizeFull.x = size_auto_fit.x; + use_current_size_for_scrollbar_x = true; + } + if (!window_size_y_set_by_api) + { + window->SizeFull.y = size_auto_fit.y; + use_current_size_for_scrollbar_y = true; + } + } + else if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) + { + // Auto-fit may only grow window during the first few frames + // We still process initial auto-fit on collapsed windows to get a window width, but otherwise don't honor ImGuiWindowFlags_AlwaysAutoResize when collapsed. + if (!window_size_x_set_by_api && window->AutoFitFramesX > 0) + { + window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x; + use_current_size_for_scrollbar_x = true; + } + if (!window_size_y_set_by_api && window->AutoFitFramesY > 0) + { + window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y; + use_current_size_for_scrollbar_y = true; + } + if (!window->Collapsed) + MarkIniSettingsDirty(window); + } + + // Apply minimum/maximum window size constraints and final size + window->SizeFull = CalcWindowSizeAfterConstraint(window, window->SizeFull); + window->Size = window->Collapsed && !(flags & ImGuiWindowFlags_ChildWindow) ? window->TitleBarRect().GetSize() : window->SizeFull; + + // Decoration size + const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); + + // POSITION + + // Popup latch its initial position, will position itself when it appears next frame + if (window_just_activated_by_user) + { + window->AutoPosLastDirection = ImGuiDir_None; + if ((flags & ImGuiWindowFlags_Popup) != 0 && !(flags & ImGuiWindowFlags_Modal) && !window_pos_set_by_api) // FIXME: BeginPopup() could use SetNextWindowPos() + window->Pos = g.BeginPopupStack.back().OpenPopupPos; + } + + // Position child window + if (flags & ImGuiWindowFlags_ChildWindow) + { + IM_ASSERT(parent_window && parent_window->Active); + window->BeginOrderWithinParent = (short)parent_window->DC.ChildWindows.Size; + parent_window->DC.ChildWindows.push_back(window); + if (!(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api && !window_is_child_tooltip) + window->Pos = parent_window->DC.CursorPos; + } + + const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFramesCannotSkipItems == 0); + if (window_pos_with_pivot) + SetWindowPos(window, window->SetWindowPosVal - window->Size * window->SetWindowPosPivot, 0); // Position given a pivot (e.g. for centering) + else if ((flags & ImGuiWindowFlags_ChildMenu) != 0) + window->Pos = FindBestWindowPosForPopup(window); + else if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api && window_just_appearing_after_hidden_for_resize) + window->Pos = FindBestWindowPosForPopup(window); + else if ((flags & ImGuiWindowFlags_Tooltip) != 0 && !window_pos_set_by_api && !window_is_child_tooltip) + window->Pos = FindBestWindowPosForPopup(window); + + // Calculate the range of allowed position for that window (to be movable and visible past safe area padding) + // When clamping to stay visible, we will enforce that window->Pos stays inside of visibility_rect. + ImRect viewport_rect(viewport->GetMainRect()); + ImRect viewport_work_rect(viewport->GetWorkRect()); + ImVec2 visibility_padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding); + ImRect visibility_rect(viewport_work_rect.Min + visibility_padding, viewport_work_rect.Max - visibility_padding); + + // Clamp position/size so window stays visible within its viewport or monitor + // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing. + if (!window_pos_set_by_api && !(flags & ImGuiWindowFlags_ChildWindow) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) + if (viewport_rect.GetWidth() > 0.0f && viewport_rect.GetHeight() > 0.0f) + ClampWindowRect(window, visibility_rect); + window->Pos = ImFloor(window->Pos); + + // Lock window rounding for the frame (so that altering them doesn't cause inconsistencies) + // Large values tend to lead to variety of artifacts and are not recommended. + window->WindowRounding = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildRounding : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupRounding : style.WindowRounding; + + // For windows with title bar or menu bar, we clamp to FrameHeight(FontSize + FramePadding.y * 2.0f) to completely hide artifacts. + //if ((window->Flags & ImGuiWindowFlags_MenuBar) || !(window->Flags & ImGuiWindowFlags_NoTitleBar)) + // window->WindowRounding = ImMin(window->WindowRounding, g.FontSize + style.FramePadding.y * 2.0f); + + // Apply window focus (new and reactivated windows are moved to front) + bool want_focus = false; + if (window_just_activated_by_user && !(flags & ImGuiWindowFlags_NoFocusOnAppearing)) + { + if (flags & ImGuiWindowFlags_Popup) + want_focus = true; + else if ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) == 0) + want_focus = true; + + ImGuiWindow* modal = GetTopMostPopupModal(); + if (modal != NULL && !IsWindowWithinBeginStackOf(window, modal)) + { + // Avoid focusing a window that is created outside of active modal. This will prevent active modal from being closed. + // Since window is not focused it would reappear at the same display position like the last time it was visible. + // In case of completely new windows it would go to the top (over current modal), but input to such window would still be blocked by modal. + // Position window behind a modal that is not a begin-parent of this window. + want_focus = false; + if (window == window->RootWindow) + { + ImGuiWindow* blocking_modal = FindBlockingModal(window); + IM_ASSERT(blocking_modal != NULL); + BringWindowToDisplayBehind(window, blocking_modal); + } + } + } + + // [Test Engine] Register whole window in the item system +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (g.TestEngineHookItems) + { + IM_ASSERT(window->IDStack.Size == 1); + window->IDStack.Size = 0; + IMGUI_TEST_ENGINE_ITEM_ADD(window->Rect(), window->ID); + IMGUI_TEST_ENGINE_ITEM_INFO(window->ID, window->Name, (g.HoveredWindow == window) ? ImGuiItemStatusFlags_HoveredRect : 0); + window->IDStack.Size = 1; + } +#endif + + // Handle manual resize: Resize Grips, Borders, Gamepad + int border_held = -1; + ImU32 resize_grip_col[4] = {}; + const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it. + const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); + if (!window->Collapsed) + if (UpdateWindowManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect)) + use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true; + window->ResizeBorderHeld = (signed char)border_held; + + // SCROLLBAR VISIBILITY + + // Update scrollbar visibility (based on the Size that was effective during last frame or the auto-resized Size). + if (!window->Collapsed) + { + // When reading the current size we need to read it after size constraints have been applied. + // When we use InnerRect here we are intentionally reading last frame size, same for ScrollbarSizes values before we set them again. + ImVec2 avail_size_from_current_frame = ImVec2(window->SizeFull.x, window->SizeFull.y - decoration_up_height); + ImVec2 avail_size_from_last_frame = window->InnerRect.GetSize() + window->ScrollbarSizes; + ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2(0, 0) : window->ContentSize + window->WindowPadding * 2.0f; + float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame.x : avail_size_from_last_frame.x; + float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y; + //bool scrollbar_y_from_last_frame = window->ScrollbarY; // FIXME: May want to use that in the ScrollbarX expression? How many pros vs cons? + window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar)); + window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); + if (window->ScrollbarX && !window->ScrollbarY) + window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar); + window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); + } + + // UPDATE RECTANGLES (1- THOSE NOT AFFECTED BY SCROLLING) + // Update various regions. Variables they depends on should be set above in this function. + // We set this up after processing the resize grip so that our rectangles doesn't lag by a frame. + + // Outer rectangle + // Not affected by window border size. Used by: + // - FindHoveredWindow() (w/ extra padding when border resize is enabled) + // - Begin() initial clipping rect for drawing window background and borders. + // - Begin() clipping whole child + const ImRect host_rect = ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) ? parent_window->ClipRect : viewport_rect; + const ImRect outer_rect = window->Rect(); + const ImRect title_bar_rect = window->TitleBarRect(); + window->OuterRectClipped = outer_rect; + window->OuterRectClipped.ClipWith(host_rect); + + // Inner rectangle + // Not affected by window border size. Used by: + // - InnerClipRect + // - ScrollToRectEx() + // - NavUpdatePageUpPageDown() + // - Scrollbar() + window->InnerRect.Min.x = window->Pos.x; + window->InnerRect.Min.y = window->Pos.y + decoration_up_height; + window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x; + window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y; + + // Inner clipping rectangle. + // Will extend a little bit outside the normal work region. + // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. + // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. + // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. + // Affected by window/frame border size. Used by: + // - Begin() initial clip rect + float top_border_size = (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); + window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + top_border_size); + window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - window->WindowBorderSize); + window->InnerClipRect.ClipWithFull(host_rect); + + // Default item width. Make it proportional to window size if window manually resizes + if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize)) + window->ItemWidthDefault = ImFloor(window->Size.x * 0.65f); + else + window->ItemWidthDefault = ImFloor(g.FontSize * 16.0f); + + // SCROLLING + + // Lock down maximum scrolling + // The value of ScrollMax are ahead from ScrollbarX/ScrollbarY which is intentionally using InnerRect from previous rect in order to accommodate + // for right/bottom aligned items without creating a scrollbar. + window->ScrollMax.x = ImMax(0.0f, window->ContentSize.x + window->WindowPadding.x * 2.0f - window->InnerRect.GetWidth()); + window->ScrollMax.y = ImMax(0.0f, window->ContentSize.y + window->WindowPadding.y * 2.0f - window->InnerRect.GetHeight()); + + // Apply scrolling + window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window); + window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); + + // DRAWING + + // Setup draw list and outer clipping rectangle + IM_ASSERT(window->DrawList->CmdBuffer.Size == 1 && window->DrawList->CmdBuffer[0].ElemCount == 0); + window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID); + PushClipRect(host_rect.Min, host_rect.Max, false); + + // Child windows can render their decoration (bg color, border, scrollbars, etc.) within their parent to save a draw call (since 1.71) + // When using overlapping child windows, this will break the assumption that child z-order is mapped to submission order. + // FIXME: User code may rely on explicit sorting of overlapping child window and would need to disable this somehow. Please get in contact if you are affected (github #4493) + { + bool render_decorations_in_parent = false; + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) + { + // - We test overlap with the previous child window only (testing all would end up being O(log N) not a good investment here) + // - We disable this when the parent window has zero vertices, which is a common pattern leading to laying out multiple overlapping childs + ImGuiWindow* previous_child = parent_window->DC.ChildWindows.Size >= 2 ? parent_window->DC.ChildWindows[parent_window->DC.ChildWindows.Size - 2] : NULL; + bool previous_child_overlapping = previous_child ? previous_child->Rect().Overlaps(window->Rect()) : false; + bool parent_is_empty = parent_window->DrawList->VtxBuffer.Size > 0; + if (window->DrawList->CmdBuffer.back().ElemCount == 0 && parent_is_empty && !previous_child_overlapping) + render_decorations_in_parent = true; + } + if (render_decorations_in_parent) + window->DrawList = parent_window->DrawList; + + // Handle title bar, scrollbar, resize grips and resize borders + const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow; + const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight); + RenderWindowDecorations(window, title_bar_rect, title_bar_is_highlight, resize_grip_count, resize_grip_col, resize_grip_draw_size); + + if (render_decorations_in_parent) + window->DrawList = &window->DrawListInst; + } + + // UPDATE RECTANGLES (2- THOSE AFFECTED BY SCROLLING) + + // Work rectangle. + // Affected by window padding and border size. Used by: + // - Columns() for right-most edge + // - TreeNode(), CollapsingHeader() for right-most edge + // - BeginTabBar() for right-most edge + const bool allow_scrollbar_x = !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar); + const bool allow_scrollbar_y = !(flags & ImGuiWindowFlags_NoScrollbar); + const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x)); + const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y)); + window->WorkRect.Min.x = ImFloor(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize)); + window->WorkRect.Min.y = ImFloor(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize)); + window->WorkRect.Max.x = window->WorkRect.Min.x + work_rect_size_x; + window->WorkRect.Max.y = window->WorkRect.Min.y + work_rect_size_y; + window->ParentWorkRect = window->WorkRect; + + // [LEGACY] Content Region + // FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. + // Used by: + // - Mouse wheel scrolling + many other things + window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x; + window->ContentRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + decoration_up_height; + window->ContentRegionRect.Max.x = window->ContentRegionRect.Min.x + (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : (window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x)); + window->ContentRegionRect.Max.y = window->ContentRegionRect.Min.y + (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : (window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y)); + + // Setup drawing context + // (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.) + window->DC.Indent.x = 0.0f + window->WindowPadding.x - window->Scroll.x; + window->DC.GroupOffset.x = 0.0f; + window->DC.ColumnsOffset.x = 0.0f; + + // Record the loss of precision of CursorStartPos which can happen due to really large scrolling amount. + // This is used by clipper to compensate and fix the most common use case of large scroll area. Easy and cheap, next best thing compared to switching everything to double or ImU64. + double start_pos_highp_x = (double)window->Pos.x + window->WindowPadding.x - (double)window->Scroll.x + window->DC.ColumnsOffset.x; + double start_pos_highp_y = (double)window->Pos.y + window->WindowPadding.y - (double)window->Scroll.y + decoration_up_height; + window->DC.CursorStartPos = ImVec2((float)start_pos_highp_x, (float)start_pos_highp_y); + window->DC.CursorStartPosLossyness = ImVec2((float)(start_pos_highp_x - window->DC.CursorStartPos.x), (float)(start_pos_highp_y - window->DC.CursorStartPos.y)); + window->DC.CursorPos = window->DC.CursorStartPos; + window->DC.CursorPosPrevLine = window->DC.CursorPos; + window->DC.CursorMaxPos = window->DC.CursorStartPos; + window->DC.IdealMaxPos = window->DC.CursorStartPos; + window->DC.CurrLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f); + window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f; + window->DC.IsSameLine = false; + + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + window->DC.NavLayersActiveMask = window->DC.NavLayersActiveMaskNext; + window->DC.NavLayersActiveMaskNext = 0x00; + window->DC.NavHideHighlightOneFrame = false; + window->DC.NavHasScroll = (window->ScrollMax.y > 0.0f); + + window->DC.MenuBarAppending = false; + window->DC.MenuColumns.Update(style.ItemSpacing.x, window_just_activated_by_user); + window->DC.TreeDepth = 0; + window->DC.TreeJumpToParentOnPopMask = 0x00; + window->DC.ChildWindows.resize(0); + window->DC.StateStorage = &window->StateStorage; + window->DC.CurrentColumns = NULL; + window->DC.LayoutType = ImGuiLayoutType_Vertical; + window->DC.ParentLayoutType = parent_window ? parent_window->DC.LayoutType : ImGuiLayoutType_Vertical; + + window->DC.ItemWidth = window->ItemWidthDefault; + window->DC.TextWrapPos = -1.0f; // disabled + window->DC.ItemWidthStack.resize(0); + window->DC.TextWrapPosStack.resize(0); + + if (window->AutoFitFramesX > 0) + window->AutoFitFramesX--; + if (window->AutoFitFramesY > 0) + window->AutoFitFramesY--; + + // Apply focus (we need to call FocusWindow() AFTER setting DC.CursorStartPos so our initial navigation reference rectangle can start around there) + if (want_focus) + { + FocusWindow(window); + NavInitWindow(window, false); // <-- this is in the way for us to be able to defer and sort reappearing FocusWindow() calls + } + + // Title bar + if (!(flags & ImGuiWindowFlags_NoTitleBar)) + RenderWindowTitleBarContents(window, ImRect(title_bar_rect.Min.x + window->WindowBorderSize, title_bar_rect.Min.y, title_bar_rect.Max.x - window->WindowBorderSize, title_bar_rect.Max.y), name, p_open); + + // Clear hit test shape every frame + window->HitTestHoleSize.x = window->HitTestHoleSize.y = 0; + + // Pressing CTRL+C while holding on a window copy its content to the clipboard + // This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope. + // Maybe we can support CTRL+C on every element? + /* + //if (g.NavWindow == window && g.ActiveId == 0) + if (g.ActiveId == window->MoveId) + if (g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_C)) + LogToClipboard(); + */ + + // We fill last item data based on Title Bar/Tab, in order for IsItemHovered() and IsItemActive() to be usable after Begin(). + // This is useful to allow creating context menus on title bar only, etc. + SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, title_bar_rect); + + // [Test Engine] Register title bar / tab + if (!(window->Flags & ImGuiWindowFlags_NoTitleBar)) + IMGUI_TEST_ENGINE_ITEM_ADD(g.LastItemData.Rect, g.LastItemData.ID); + } + else + { + // Append + SetCurrentWindow(window); + } + + // Pull/inherit current state + window->DC.NavFocusScopeIdCurrent = (flags & ImGuiWindowFlags_ChildWindow) ? parent_window->DC.NavFocusScopeIdCurrent : window->GetID("#FOCUSSCOPE"); // Inherit from parent only // -V595 + + PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true); + + // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused) + window->WriteAccessed = false; + window->BeginCount++; + g.NextWindowData.ClearFlags(); + + // Update visibility + if (first_begin_of_the_frame) + { + if (flags & ImGuiWindowFlags_ChildWindow) + { + // Child window can be out of sight and have "negative" clip windows. + // Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar). + IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); + if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) // FIXME: Doesn't make sense for ChildWindow?? + { + const bool nav_request = (flags & ImGuiWindowFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); + if (!g.LogEnabled && !nav_request) + if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y) + window->HiddenFramesCanSkipItems = 1; + } + + // Hide along with parent or if parent is collapsed + if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCanSkipItems > 0)) + window->HiddenFramesCanSkipItems = 1; + if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCannotSkipItems > 0)) + window->HiddenFramesCannotSkipItems = 1; + } + + // Don't render if style alpha is 0.0 at the time of Begin(). This is arbitrary and inconsistent but has been there for a long while (may remove at some point) + if (style.Alpha <= 0.0f) + window->HiddenFramesCanSkipItems = 1; + + // Update the Hidden flag + bool hidden_regular = (window->HiddenFramesCanSkipItems > 0) || (window->HiddenFramesCannotSkipItems > 0); + window->Hidden = hidden_regular || (window->HiddenFramesForRenderOnly > 0); + + // Disable inputs for requested number of frames + if (window->DisableInputsFrames > 0) + { + window->DisableInputsFrames--; + window->Flags |= ImGuiWindowFlags_NoInputs; + } + + // Update the SkipItems flag, used to early out of all items functions (no layout required) + bool skip_items = false; + if (window->Collapsed || !window->Active || hidden_regular) + if (window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && window->HiddenFramesCannotSkipItems <= 0) + skip_items = true; + window->SkipItems = skip_items; + } + + return !window->SkipItems; +} + +void ImGui::End() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Error checking: verify that user hasn't called End() too many times! + if (g.CurrentWindowStack.Size <= 1 && g.WithinFrameScopeWithImplicitWindow) + { + IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size > 1, "Calling End() too many times!"); + return; + } + IM_ASSERT(g.CurrentWindowStack.Size > 0); + + // Error checking: verify that user doesn't directly call End() on a child window. + if (window->Flags & ImGuiWindowFlags_ChildWindow) + IM_ASSERT_USER_ERROR(g.WithinEndChild, "Must call EndChild() and not End()!"); + + // Close anything that is open + if (window->DC.CurrentColumns) + EndColumns(); + PopClipRect(); // Inner window clip rectangle + + // Stop logging + if (!(window->Flags & ImGuiWindowFlags_ChildWindow)) // FIXME: add more options for scope of logging + LogFinish(); + + // Pop from window stack + g.LastItemData = g.CurrentWindowStack.back().ParentLastItemDataBackup; + if (window->Flags & ImGuiWindowFlags_ChildMenu) + g.BeginMenuCount--; + if (window->Flags & ImGuiWindowFlags_Popup) + g.BeginPopupStack.pop_back(); + g.CurrentWindowStack.back().StackSizesOnBegin.CompareWithCurrentState(); + g.CurrentWindowStack.pop_back(); + SetCurrentWindow(g.CurrentWindowStack.Size == 0 ? NULL : g.CurrentWindowStack.back().Window); +} + +void ImGui::BringWindowToFocusFront(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(window == window->RootWindow); + + const int cur_order = window->FocusOrder; + IM_ASSERT(g.WindowsFocusOrder[cur_order] == window); + if (g.WindowsFocusOrder.back() == window) + return; + + const int new_order = g.WindowsFocusOrder.Size - 1; + for (int n = cur_order; n < new_order; n++) + { + g.WindowsFocusOrder[n] = g.WindowsFocusOrder[n + 1]; + g.WindowsFocusOrder[n]->FocusOrder--; + IM_ASSERT(g.WindowsFocusOrder[n]->FocusOrder == n); + } + g.WindowsFocusOrder[new_order] = window; + window->FocusOrder = (short)new_order; +} + +void ImGui::BringWindowToDisplayFront(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* current_front_window = g.Windows.back(); + if (current_front_window == window || current_front_window->RootWindow == window) // Cheap early out (could be better) + return; + for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the top-most window + if (g.Windows[i] == window) + { + memmove(&g.Windows[i], &g.Windows[i + 1], (size_t)(g.Windows.Size - i - 1) * sizeof(ImGuiWindow*)); + g.Windows[g.Windows.Size - 1] = window; + break; + } +} + +void ImGui::BringWindowToDisplayBack(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (g.Windows[0] == window) + return; + for (int i = 0; i < g.Windows.Size; i++) + if (g.Windows[i] == window) + { + memmove(&g.Windows[1], &g.Windows[0], (size_t)i * sizeof(ImGuiWindow*)); + g.Windows[0] = window; + break; + } +} + +void ImGui::BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* behind_window) +{ + IM_ASSERT(window != NULL && behind_window != NULL); + ImGuiContext& g = *GImGui; + window = window->RootWindow; + behind_window = behind_window->RootWindow; + int pos_wnd = FindWindowDisplayIndex(window); + int pos_beh = FindWindowDisplayIndex(behind_window); + if (pos_wnd < pos_beh) + { + size_t copy_bytes = (pos_beh - pos_wnd - 1) * sizeof(ImGuiWindow*); + memmove(&g.Windows.Data[pos_wnd], &g.Windows.Data[pos_wnd + 1], copy_bytes); + g.Windows[pos_beh - 1] = window; + } + else + { + size_t copy_bytes = (pos_wnd - pos_beh) * sizeof(ImGuiWindow*); + memmove(&g.Windows.Data[pos_beh + 1], &g.Windows.Data[pos_beh], copy_bytes); + g.Windows[pos_beh] = window; + } +} + +int ImGui::FindWindowDisplayIndex(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + return g.Windows.index_from_ptr(g.Windows.find(window)); +} + +// Moving window to front of display and set focus (which happens to be back of our sorted list) +void ImGui::FocusWindow(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + + if (g.NavWindow != window) + { + g.NavWindow = window; + if (window && g.NavDisableMouseHover) + g.NavMousePosDirty = true; + g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId + g.NavFocusScopeId = 0; + g.NavIdIsAlive = false; + g.NavLayer = ImGuiNavLayer_Main; + g.NavInitRequest = g.NavMoveSubmitted = g.NavMoveScoringItems = false; + NavUpdateAnyRequestFlag(); + //IMGUI_DEBUG_LOG("FocusWindow(\"%s\")\n", window ? window->Name : NULL); + } + + // Close popups if any + ClosePopupsOverWindow(window, false); + + // Move the root window to the top of the pile + IM_ASSERT(window == NULL || window->RootWindow != NULL); + ImGuiWindow* focus_front_window = window ? window->RootWindow : NULL; // NB: In docking branch this is window->RootWindowDockStop + ImGuiWindow* display_front_window = window ? window->RootWindow : NULL; + + // Steal active widgets. Some of the cases it triggers includes: + // - Focus a window while an InputText in another window is active, if focus happens before the old InputText can run. + // - When using Nav to activate menu items (due to timing of activating on press->new window appears->losing ActiveId) + if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != focus_front_window) + if (!g.ActiveIdNoClearOnFocusLoss) + ClearActiveID(); + + // Passing NULL allow to disable keyboard focus + if (!window) + return; + + // Bring to front + BringWindowToFocusFront(focus_front_window); + if (((window->Flags | display_front_window->Flags) & ImGuiWindowFlags_NoBringToFrontOnFocus) == 0) + BringWindowToDisplayFront(display_front_window); +} + +void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window) +{ + ImGuiContext& g = *GImGui; + int start_idx = g.WindowsFocusOrder.Size - 1; + if (under_this_window != NULL) + { + // Aim at root window behind us, if we are in a child window that's our own root (see #4640) + int offset = -1; + while (under_this_window->Flags & ImGuiWindowFlags_ChildWindow) + { + under_this_window = under_this_window->ParentWindow; + offset = 0; + } + start_idx = FindWindowFocusIndex(under_this_window) + offset; + } + for (int i = start_idx; i >= 0; i--) + { + // We may later decide to test for different NoXXXInputs based on the active navigation input (mouse vs nav) but that may feel more confusing to the user. + ImGuiWindow* window = g.WindowsFocusOrder[i]; + IM_ASSERT(window == window->RootWindow); + if (window != ignore_window && window->WasActive) + if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) + { + ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window); + FocusWindow(focus_window); + return; + } + } + FocusWindow(NULL); +} + +// Important: this alone doesn't alter current ImDrawList state. This is called by PushFont/PopFont only. +void ImGui::SetCurrentFont(ImFont* font) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(font && font->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ? + IM_ASSERT(font->Scale > 0.0f); + g.Font = font; + g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale); + g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f; + + ImFontAtlas* atlas = g.Font->ContainerAtlas; + g.DrawListSharedData.TexUvWhitePixel = atlas->TexUvWhitePixel; + g.DrawListSharedData.TexUvLines = atlas->TexUvLines; + g.DrawListSharedData.Font = g.Font; + g.DrawListSharedData.FontSize = g.FontSize; +} + +void ImGui::PushFont(ImFont* font) +{ + ImGuiContext& g = *GImGui; + if (!font) + font = GetDefaultFont(); + SetCurrentFont(font); + g.FontStack.push_back(font); + g.CurrentWindow->DrawList->PushTextureID(font->ContainerAtlas->TexID); +} + +void ImGui::PopFont() +{ + ImGuiContext& g = *GImGui; + g.CurrentWindow->DrawList->PopTextureID(); + g.FontStack.pop_back(); + SetCurrentFont(g.FontStack.empty() ? GetDefaultFont() : g.FontStack.back()); +} + +void ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled) +{ + ImGuiContext& g = *GImGui; + ImGuiItemFlags item_flags = g.CurrentItemFlags; + IM_ASSERT(item_flags == g.ItemFlagsStack.back()); + if (enabled) + item_flags |= option; + else + item_flags &= ~option; + g.CurrentItemFlags = item_flags; + g.ItemFlagsStack.push_back(item_flags); +} + +void ImGui::PopItemFlag() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.ItemFlagsStack.Size > 1); // Too many calls to PopItemFlag() - we always leave a 0 at the bottom of the stack. + g.ItemFlagsStack.pop_back(); + g.CurrentItemFlags = g.ItemFlagsStack.back(); +} + +// BeginDisabled()/EndDisabled() +// - Those can be nested but it cannot be used to enable an already disabled section (a single BeginDisabled(true) in the stack is enough to keep everything disabled) +// - Visually this is currently altering alpha, but it is expected that in a future styling system this would work differently. +// - Feedback welcome at https://github.com/ocornut/imgui/issues/211 +// - BeginDisabled(false) essentially does nothing useful but is provided to facilitate use of boolean expressions. If you can avoid calling BeginDisabled(False)/EndDisabled() best to avoid it. +// - Optimized shortcuts instead of PushStyleVar() + PushItemFlag() +void ImGui::BeginDisabled(bool disabled) +{ + ImGuiContext& g = *GImGui; + bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; + if (!was_disabled && disabled) + { + g.DisabledAlphaBackup = g.Style.Alpha; + g.Style.Alpha *= g.Style.DisabledAlpha; // PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * g.Style.DisabledAlpha); + } + if (was_disabled || disabled) + g.CurrentItemFlags |= ImGuiItemFlags_Disabled; + g.ItemFlagsStack.push_back(g.CurrentItemFlags); + g.DisabledStackSize++; +} + +void ImGui::EndDisabled() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.DisabledStackSize > 0); + g.DisabledStackSize--; + bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; + //PopItemFlag(); + g.ItemFlagsStack.pop_back(); + g.CurrentItemFlags = g.ItemFlagsStack.back(); + if (was_disabled && (g.CurrentItemFlags & ImGuiItemFlags_Disabled) == 0) + g.Style.Alpha = g.DisabledAlphaBackup; //PopStyleVar(); +} + +// FIXME: Look into renaming this once we have settled the new Focus/Activation/TabStop system. +void ImGui::PushAllowKeyboardFocus(bool allow_keyboard_focus) +{ + PushItemFlag(ImGuiItemFlags_NoTabStop, !allow_keyboard_focus); +} + +void ImGui::PopAllowKeyboardFocus() +{ + PopItemFlag(); +} + +void ImGui::PushButtonRepeat(bool repeat) +{ + PushItemFlag(ImGuiItemFlags_ButtonRepeat, repeat); +} + +void ImGui::PopButtonRepeat() +{ + PopItemFlag(); +} + +void ImGui::PushTextWrapPos(float wrap_pos_x) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.TextWrapPosStack.push_back(window->DC.TextWrapPos); + window->DC.TextWrapPos = wrap_pos_x; +} + +void ImGui::PopTextWrapPos() +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.TextWrapPos = window->DC.TextWrapPosStack.back(); + window->DC.TextWrapPosStack.pop_back(); +} + +static ImGuiWindow* GetCombinedRootWindow(ImGuiWindow* window, bool popup_hierarchy) +{ + ImGuiWindow* last_window = NULL; + while (last_window != window) + { + last_window = window; + window = window->RootWindow; + if (popup_hierarchy) + window = window->RootWindowPopupTree; + } + return window; +} + +bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy) +{ + ImGuiWindow* window_root = GetCombinedRootWindow(window, popup_hierarchy); + if (window_root == potential_parent) + return true; + while (window != NULL) + { + if (window == potential_parent) + return true; + if (window == window_root) // end of chain + return false; + window = window->ParentWindow; + } + return false; +} + +bool ImGui::IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent) +{ + if (window->RootWindow == potential_parent) + return true; + while (window != NULL) + { + if (window == potential_parent) + return true; + window = window->ParentWindowInBeginStack; + } + return false; +} + +bool ImGui::IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below) +{ + ImGuiContext& g = *GImGui; + + // It would be saner to ensure that display layer is always reflected in the g.Windows[] order, which would likely requires altering all manipulations of that array + const int display_layer_delta = GetWindowDisplayLayer(potential_above) - GetWindowDisplayLayer(potential_below); + if (display_layer_delta != 0) + return display_layer_delta > 0; + + for (int i = g.Windows.Size - 1; i >= 0; i--) + { + ImGuiWindow* candidate_window = g.Windows[i]; + if (candidate_window == potential_above) + return true; + if (candidate_window == potential_below) + return false; + } + return false; +} + +bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags) +{ + IM_ASSERT((flags & (ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled)) == 0); // Flags not supported by this function + ImGuiContext& g = *GImGui; + ImGuiWindow* ref_window = g.HoveredWindow; + ImGuiWindow* cur_window = g.CurrentWindow; + if (ref_window == NULL) + return false; + + if ((flags & ImGuiHoveredFlags_AnyWindow) == 0) + { + IM_ASSERT(cur_window); // Not inside a Begin()/End() + const bool popup_hierarchy = (flags & ImGuiHoveredFlags_NoPopupHierarchy) == 0; + if (flags & ImGuiHoveredFlags_RootWindow) + cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy); + + bool result; + if (flags & ImGuiHoveredFlags_ChildWindows) + result = IsWindowChildOf(ref_window, cur_window, popup_hierarchy); + else + result = (ref_window == cur_window); + if (!result) + return false; + } + + if (!IsWindowContentHoverable(ref_window, flags)) + return false; + if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) + if (g.ActiveId != 0 && !g.ActiveIdAllowOverlap && g.ActiveId != ref_window->MoveId) + return false; + return true; +} + +bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* ref_window = g.NavWindow; + ImGuiWindow* cur_window = g.CurrentWindow; + + if (ref_window == NULL) + return false; + if (flags & ImGuiFocusedFlags_AnyWindow) + return true; + + IM_ASSERT(cur_window); // Not inside a Begin()/End() + const bool popup_hierarchy = (flags & ImGuiFocusedFlags_NoPopupHierarchy) == 0; + if (flags & ImGuiHoveredFlags_RootWindow) + cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy); + + if (flags & ImGuiHoveredFlags_ChildWindows) + return IsWindowChildOf(ref_window, cur_window, popup_hierarchy); + else + return (ref_window == cur_window); +} + +// Can we focus this window with CTRL+TAB (or PadMenu + PadFocusPrev/PadFocusNext) +// Note that NoNavFocus makes the window not reachable with CTRL+TAB but it can still be focused with mouse or programmatically. +// If you want a window to never be focused, you may use the e.g. NoInputs flag. +bool ImGui::IsWindowNavFocusable(ImGuiWindow* window) +{ + return window->WasActive && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus); +} + +float ImGui::GetWindowWidth() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Size.x; +} + +float ImGui::GetWindowHeight() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Size.y; +} + +ImVec2 ImGui::GetWindowPos() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + return window->Pos; +} + +void ImGui::SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond) +{ + // Test condition (NB: bit 0 is always true) and clear flags for next time + if (cond && (window->SetWindowPosAllowFlags & cond) == 0) + return; + + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + window->SetWindowPosVal = ImVec2(FLT_MAX, FLT_MAX); + + // Set + const ImVec2 old_pos = window->Pos; + window->Pos = ImFloor(pos); + ImVec2 offset = window->Pos - old_pos; + window->DC.CursorPos += offset; // As we happen to move the window while it is being appended to (which is a bad idea - will smear) let's at least offset the cursor + window->DC.CursorMaxPos += offset; // And more importantly we need to offset CursorMaxPos/CursorStartPos this so ContentSize calculation doesn't get affected. + window->DC.IdealMaxPos += offset; + window->DC.CursorStartPos += offset; +} + +void ImGui::SetWindowPos(const ImVec2& pos, ImGuiCond cond) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + SetWindowPos(window, pos, cond); +} + +void ImGui::SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond) +{ + if (ImGuiWindow* window = FindWindowByName(name)) + SetWindowPos(window, pos, cond); +} + +ImVec2 ImGui::GetWindowSize() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->Size; +} + +void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond) +{ + // Test condition (NB: bit 0 is always true) and clear flags for next time + if (cond && (window->SetWindowSizeAllowFlags & cond) == 0) + return; + + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + window->SetWindowSizeAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + + // Set + if (size.x > 0.0f) + { + window->AutoFitFramesX = 0; + window->SizeFull.x = IM_FLOOR(size.x); + } + else + { + window->AutoFitFramesX = 2; + window->AutoFitOnlyGrows = false; + } + if (size.y > 0.0f) + { + window->AutoFitFramesY = 0; + window->SizeFull.y = IM_FLOOR(size.y); + } + else + { + window->AutoFitFramesY = 2; + window->AutoFitOnlyGrows = false; + } +} + +void ImGui::SetWindowSize(const ImVec2& size, ImGuiCond cond) +{ + SetWindowSize(GImGui->CurrentWindow, size, cond); +} + +void ImGui::SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond) +{ + if (ImGuiWindow* window = FindWindowByName(name)) + SetWindowSize(window, size, cond); +} + +void ImGui::SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond) +{ + // Test condition (NB: bit 0 is always true) and clear flags for next time + if (cond && (window->SetWindowCollapsedAllowFlags & cond) == 0) + return; + window->SetWindowCollapsedAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + + // Set + window->Collapsed = collapsed; +} + +void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size) +{ + IM_ASSERT(window->HitTestHoleSize.x == 0); // We don't support multiple holes/hit test filters + window->HitTestHoleSize = ImVec2ih(size); + window->HitTestHoleOffset = ImVec2ih(pos - window->Pos); +} + +void ImGui::SetWindowCollapsed(bool collapsed, ImGuiCond cond) +{ + SetWindowCollapsed(GImGui->CurrentWindow, collapsed, cond); +} + +bool ImGui::IsWindowCollapsed() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->Collapsed; +} + +bool ImGui::IsWindowAppearing() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->Appearing; +} + +void ImGui::SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond) +{ + if (ImGuiWindow* window = FindWindowByName(name)) + SetWindowCollapsed(window, collapsed, cond); +} + +void ImGui::SetWindowFocus() +{ + FocusWindow(GImGui->CurrentWindow); +} + +void ImGui::SetWindowFocus(const char* name) +{ + if (name) + { + if (ImGuiWindow* window = FindWindowByName(name)) + FocusWindow(window); + } + else + { + FocusWindow(NULL); + } +} + +void ImGui::SetNextWindowPos(const ImVec2& pos, ImGuiCond cond, const ImVec2& pivot) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasPos; + g.NextWindowData.PosVal = pos; + g.NextWindowData.PosPivotVal = pivot; + g.NextWindowData.PosCond = cond ? cond : ImGuiCond_Always; +} + +void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSize; + g.NextWindowData.SizeVal = size; + g.NextWindowData.SizeCond = cond ? cond : ImGuiCond_Always; +} + +void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback, void* custom_callback_user_data) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSizeConstraint; + g.NextWindowData.SizeConstraintRect = ImRect(size_min, size_max); + g.NextWindowData.SizeCallback = custom_callback; + g.NextWindowData.SizeCallbackUserData = custom_callback_user_data; +} + +// Content size = inner scrollable rectangle, padded with WindowPadding. +// SetNextWindowContentSize(ImVec2(100,100) + ImGuiWindowFlags_AlwaysAutoResize will always allow submitting a 100x100 item. +void ImGui::SetNextWindowContentSize(const ImVec2& size) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasContentSize; + g.NextWindowData.ContentSizeVal = ImFloor(size); +} + +void ImGui::SetNextWindowScroll(const ImVec2& scroll) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasScroll; + g.NextWindowData.ScrollVal = scroll; +} + +void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasCollapsed; + g.NextWindowData.CollapsedVal = collapsed; + g.NextWindowData.CollapsedCond = cond ? cond : ImGuiCond_Always; +} + +void ImGui::SetNextWindowFocus() +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasFocus; +} + +void ImGui::SetNextWindowBgAlpha(float alpha) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasBgAlpha; + g.NextWindowData.BgAlphaVal = alpha; +} + +ImDrawList* ImGui::GetWindowDrawList() +{ + ImGuiWindow* window = GetCurrentWindow(); + return window->DrawList; +} + +ImFont* ImGui::GetFont() +{ + return GImGui->Font; +} + +float ImGui::GetFontSize() +{ + return GImGui->FontSize; +} + +ImVec2 ImGui::GetFontTexUvWhitePixel() +{ + return GImGui->DrawListSharedData.TexUvWhitePixel; +} + +void ImGui::SetWindowFontScale(float scale) +{ + IM_ASSERT(scale > 0.0f); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + window->FontWindowScale = scale; + g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); +} + +void ImGui::ActivateItem(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.NavNextActivateId = id; + g.NavNextActivateFlags = ImGuiActivateFlags_None; +} + +void ImGui::PushFocusScope(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + g.FocusScopeStack.push_back(window->DC.NavFocusScopeIdCurrent); + window->DC.NavFocusScopeIdCurrent = id; +} + +void ImGui::PopFocusScope() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(g.FocusScopeStack.Size > 0); // Too many PopFocusScope() ? + window->DC.NavFocusScopeIdCurrent = g.FocusScopeStack.back(); + g.FocusScopeStack.pop_back(); +} + +void ImGui::SetKeyboardFocusHere(int offset) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(offset >= -1); // -1 is allowed but not below + g.NavWindow = window; + ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; + NavMoveRequestSubmit(ImGuiDir_None, offset < 0 ? ImGuiDir_Up : ImGuiDir_Down, ImGuiNavMoveFlags_Tabbing | ImGuiNavMoveFlags_FocusApi, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. + if (offset == -1) + { + NavMoveRequestResolveWithLastItem(&g.NavMoveResultLocal); + } + else + { + g.NavTabbingDir = 1; + g.NavTabbingCounter = offset + 1; + } +} + +void ImGui::SetItemDefaultFocus() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (!window->Appearing) + return; + if (g.NavWindow != window->RootWindowForNav || (!g.NavInitRequest && g.NavInitResultId == 0) || g.NavLayer != window->DC.NavLayerCurrent) + return; + + g.NavInitRequest = false; + g.NavInitResultId = g.LastItemData.ID; + g.NavInitResultRectRel = WindowRectAbsToRel(window, g.LastItemData.Rect); + NavUpdateAnyRequestFlag(); + + // Scroll could be done in NavInitRequestApplyResult() via a opt-in flag (we however don't want regular init requests to scroll) + if (!IsItemVisible()) + ScrollToRectEx(window, g.LastItemData.Rect, ImGuiScrollFlags_None); +} + +void ImGui::SetStateStorage(ImGuiStorage* tree) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + window->DC.StateStorage = tree ? tree : &window->StateStorage; +} + +ImGuiStorage* ImGui::GetStateStorage() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->DC.StateStorage; +} + +void ImGui::PushID(const char* str_id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetID(str_id); + window->IDStack.push_back(id); +} + +void ImGui::PushID(const char* str_id_begin, const char* str_id_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetID(str_id_begin, str_id_end); + window->IDStack.push_back(id); +} + +void ImGui::PushID(const void* ptr_id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetID(ptr_id); + window->IDStack.push_back(id); +} + +void ImGui::PushID(int int_id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetID(int_id); + window->IDStack.push_back(id); +} + +// Push a given id value ignoring the ID stack as a seed. +void ImGui::PushOverrideID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.DebugHookIdInfo == id) + DebugHookIdInfo(id, ImGuiDataType_ID, NULL, NULL); + window->IDStack.push_back(id); +} + +// Helper to avoid a common series of PushOverrideID -> GetID() -> PopID() call +// (note that when using this pattern, TestEngine's "Stack Tool" will tend to not display the intermediate stack level. +// for that to work we would need to do PushOverrideID() -> ItemAdd() -> PopID() which would alter widget code a little more) +ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed) +{ + ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); + KeepAliveID(id); + ImGuiContext& g = *GImGui; + if (g.DebugHookIdInfo == id) + DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); + return id; +} + +void ImGui::PopID() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + IM_ASSERT(window->IDStack.Size > 1); // Too many PopID(), or could be popping in a wrong/different window? + window->IDStack.pop_back(); +} + +ImGuiID ImGui::GetID(const char* str_id) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(str_id); +} + +ImGuiID ImGui::GetID(const char* str_id_begin, const char* str_id_end) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(str_id_begin, str_id_end); +} + +ImGuiID ImGui::GetID(const void* ptr_id) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(ptr_id); +} + +bool ImGui::IsRectVisible(const ImVec2& size) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); +} + +bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); +} + + +//----------------------------------------------------------------------------- +// [SECTION] INPUTS +//----------------------------------------------------------------------------- + +// Test if mouse cursor is hovering given rectangle +// NB- Rectangle is clipped by our current clip setting +// NB- Expand the rectangle to be generous on imprecise inputs systems (g.Style.TouchExtraPadding) +bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip) +{ + ImGuiContext& g = *GImGui; + + // Clip + ImRect rect_clipped(r_min, r_max); + if (clip) + rect_clipped.ClipWith(g.CurrentWindow->ClipRect); + + // Expand for touch input + const ImRect rect_for_touch(rect_clipped.Min - g.Style.TouchExtraPadding, rect_clipped.Max + g.Style.TouchExtraPadding); + if (!rect_for_touch.Contains(g.IO.MousePos)) + return false; + return true; +} + +ImGuiKeyData* ImGui::GetKeyData(ImGuiKey key) +{ + ImGuiContext& g = *GImGui; + int index; +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + IM_ASSERT(key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_NamedKey_END); + if (IsLegacyKey(key)) + index = (g.IO.KeyMap[key] != -1) ? g.IO.KeyMap[key] : key; // Remap native->imgui or imgui->native + else + index = key; +#else + IM_ASSERT(IsNamedKey(key) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend & user code."); + index = key - ImGuiKey_NamedKey_BEGIN; +#endif + return &g.IO.KeysData[index]; +} + +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO +int ImGui::GetKeyIndex(ImGuiKey key) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(IsNamedKey(key)); + const ImGuiKeyData* key_data = GetKeyData(key); + return (int)(key_data - g.IO.KeysData); +} +#endif + +// Those names a provided for debugging purpose and are not meant to be saved persistently not compared. +static const char* const GKeyNames[] = +{ + "Tab", "LeftArrow", "RightArrow", "UpArrow", "DownArrow", "PageUp", "PageDown", + "Home", "End", "Insert", "Delete", "Backspace", "Space", "Enter", "Escape", + "LeftCtrl", "LeftShift", "LeftAlt", "LeftSuper", "RightCtrl", "RightShift", "RightAlt", "RightSuper", "Menu", + "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", + "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", + "Apostrophe", "Comma", "Minus", "Period", "Slash", "Semicolon", "Equal", "LeftBracket", + "Backslash", "RightBracket", "GraveAccent", "CapsLock", "ScrollLock", "NumLock", "PrintScreen", + "Pause", "Keypad0", "Keypad1", "Keypad2", "Keypad3", "Keypad4", "Keypad5", "Keypad6", + "Keypad7", "Keypad8", "Keypad9", "KeypadDecimal", "KeypadDivide", "KeypadMultiply", + "KeypadSubtract", "KeypadAdd", "KeypadEnter", "KeypadEqual", + "GamepadStart", "GamepadBack", "GamepadFaceUp", "GamepadFaceDown", "GamepadFaceLeft", "GamepadFaceRight", + "GamepadDpadUp", "GamepadDpadDown", "GamepadDpadLeft", "GamepadDpadRight", + "GamepadL1", "GamepadR1", "GamepadL2", "GamepadR2", "GamepadL3", "GamepadR3", + "GamepadLStickUp", "GamepadLStickDown", "GamepadLStickLeft", "GamepadLStickRight", + "GamepadRStickUp", "GamepadRStickDown", "GamepadRStickLeft", "GamepadRStickRight", + "ModCtrl", "ModShift", "ModAlt", "ModSuper" +}; +IM_STATIC_ASSERT(ImGuiKey_NamedKey_COUNT == IM_ARRAYSIZE(GKeyNames)); + +const char* ImGui::GetKeyName(ImGuiKey key) +{ +#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO + IM_ASSERT((IsNamedKey(key) || key == ImGuiKey_None) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code."); +#else + if (IsLegacyKey(key)) + { + ImGuiIO& io = GetIO(); + if (io.KeyMap[key] == -1) + return "N/A"; + IM_ASSERT(IsNamedKey((ImGuiKey)io.KeyMap[key])); + key = (ImGuiKey)io.KeyMap[key]; + } +#endif + if (key == ImGuiKey_None) + return "None"; + if (!IsNamedKey(key)) + return "Unknown"; + + return GKeyNames[key - ImGuiKey_NamedKey_BEGIN]; +} + +// t0 = previous time (e.g.: g.Time - g.IO.DeltaTime) +// t1 = current time (e.g.: g.Time) +// An event is triggered at: +// t = 0.0f t = repeat_delay, t = repeat_delay + repeat_rate*N +int ImGui::CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate) +{ + if (t1 == 0.0f) + return 1; + if (t0 >= t1) + return 0; + if (repeat_rate <= 0.0f) + return (t0 < repeat_delay) && (t1 >= repeat_delay); + const int count_t0 = (t0 < repeat_delay) ? -1 : (int)((t0 - repeat_delay) / repeat_rate); + const int count_t1 = (t1 < repeat_delay) ? -1 : (int)((t1 - repeat_delay) / repeat_rate); + const int count = count_t1 - count_t0; + return count; +} + +int ImGui::GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float repeat_rate) +{ + ImGuiContext& g = *GImGui; + const ImGuiKeyData* key_data = GetKeyData(key); + const float t = key_data->DownDuration; + return CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, repeat_delay, repeat_rate); +} + +// Note that Dear ImGui doesn't know the meaning/semantic of ImGuiKey from 0..511: they are legacy native keycodes. +// Consider transitioning from 'IsKeyDown(MY_ENGINE_KEY_A)' (<1.87) to IsKeyDown(ImGuiKey_A) (>= 1.87) +bool ImGui::IsKeyDown(ImGuiKey key) +{ + const ImGuiKeyData* key_data = GetKeyData(key); + if (!key_data->Down) + return false; + return true; +} + +bool ImGui::IsKeyPressed(ImGuiKey key, bool repeat) +{ + ImGuiContext& g = *GImGui; + const ImGuiKeyData* key_data = GetKeyData(key); + const float t = key_data->DownDuration; + if (t < 0.0f) + return false; + const bool pressed = (t == 0.0f) || (repeat && t > g.IO.KeyRepeatDelay && GetKeyPressedAmount(key, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0); + if (!pressed) + return false; + return true; +} + +bool ImGui::IsKeyReleased(ImGuiKey key) +{ + const ImGuiKeyData* key_data = GetKeyData(key); + if (key_data->DownDurationPrev < 0.0f || key_data->Down) + return false; + return true; +} + +bool ImGui::IsMouseDown(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseDown[button]; +} + +bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + const float t = g.IO.MouseDownDuration[button]; + if (t == 0.0f) + return true; + if (repeat && t > g.IO.KeyRepeatDelay) + return CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0; + return false; +} + +bool ImGui::IsMouseReleased(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseReleased[button]; +} + +bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseClickedCount[button] == 2; +} + +int ImGui::GetMouseClickedCount(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseClickedCount[button]; +} + +// Return if a mouse click/drag went past the given threshold. Valid to call during the MouseReleased frame. +// [Internal] This doesn't test if the button is pressed +bool ImGui::IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + if (lock_threshold < 0.0f) + lock_threshold = g.IO.MouseDragThreshold; + return g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold; +} + +bool ImGui::IsMouseDragging(ImGuiMouseButton button, float lock_threshold) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + if (!g.IO.MouseDown[button]) + return false; + return IsMouseDragPastThreshold(button, lock_threshold); +} + +ImVec2 ImGui::GetMousePos() +{ + ImGuiContext& g = *GImGui; + return g.IO.MousePos; +} + +// NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed! +ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup() +{ + ImGuiContext& g = *GImGui; + if (g.BeginPopupStack.Size > 0) + return g.OpenPopupStack[g.BeginPopupStack.Size - 1].OpenMousePos; + return g.IO.MousePos; +} + +// We typically use ImVec2(-FLT_MAX,-FLT_MAX) to denote an invalid mouse position. +bool ImGui::IsMousePosValid(const ImVec2* mouse_pos) +{ + // The assert is only to silence a false-positive in XCode Static Analysis. + // Because GImGui is not dereferenced in every code path, the static analyzer assume that it may be NULL (which it doesn't for other functions). + IM_ASSERT(GImGui != NULL); + const float MOUSE_INVALID = -256000.0f; + ImVec2 p = mouse_pos ? *mouse_pos : GImGui->IO.MousePos; + return p.x >= MOUSE_INVALID && p.y >= MOUSE_INVALID; +} + +// [WILL OBSOLETE] This was designed for backends, but prefer having backend maintain a mask of held mouse buttons, because upcoming input queue system will make this invalid. +bool ImGui::IsAnyMouseDown() +{ + ImGuiContext& g = *GImGui; + for (int n = 0; n < IM_ARRAYSIZE(g.IO.MouseDown); n++) + if (g.IO.MouseDown[n]) + return true; + return false; +} + +// Return the delta from the initial clicking position while the mouse button is clicked or was just released. +// This is locked and return 0.0f until the mouse moves past a distance threshold at least once. +// NB: This is only valid if IsMousePosValid(). backends in theory should always keep mouse position valid when dragging even outside the client window. +ImVec2 ImGui::GetMouseDragDelta(ImGuiMouseButton button, float lock_threshold) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + if (lock_threshold < 0.0f) + lock_threshold = g.IO.MouseDragThreshold; + if (g.IO.MouseDown[button] || g.IO.MouseReleased[button]) + if (g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold) + if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MouseClickedPos[button])) + return g.IO.MousePos - g.IO.MouseClickedPos[button]; + return ImVec2(0.0f, 0.0f); +} + +void ImGui::ResetMouseDragDelta(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + // NB: We don't need to reset g.IO.MouseDragMaxDistanceSqr + g.IO.MouseClickedPos[button] = g.IO.MousePos; +} + +ImGuiMouseCursor ImGui::GetMouseCursor() +{ + ImGuiContext& g = *GImGui; + return g.MouseCursor; +} + +void ImGui::SetMouseCursor(ImGuiMouseCursor cursor_type) +{ + ImGuiContext& g = *GImGui; + g.MouseCursor = cursor_type; +} + +void ImGui::CaptureKeyboardFromApp(bool capture) +{ + ImGuiContext& g = *GImGui; + g.WantCaptureKeyboardNextFrame = capture ? 1 : 0; +} + +void ImGui::CaptureMouseFromApp(bool capture) +{ + ImGuiContext& g = *GImGui; + g.WantCaptureMouseNextFrame = capture ? 1 : 0; +} + +static const char* GetInputSourceName(ImGuiInputSource source) +{ + const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad", "Nav", "Clipboard" }; + IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT && source >= 0 && source < ImGuiInputSource_COUNT); + return input_source_names[source]; +} + +/*static void DebugLogInputEvent(const char* prefix, const ImGuiInputEvent* e) +{ + if (e->Type == ImGuiInputEventType_MousePos) { IMGUI_DEBUG_LOG("%s: MousePos (%.1f %.1f)\n", prefix, e->MousePos.PosX, e->MousePos.PosY); return; } + if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG("%s: MouseButton %d %s\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up"); return; } + if (e->Type == ImGuiInputEventType_MouseWheel) { IMGUI_DEBUG_LOG("%s: MouseWheel (%.1f %.1f)\n", prefix, e->MouseWheel.WheelX, e->MouseWheel.WheelY); return; } + if (e->Type == ImGuiInputEventType_Key) { IMGUI_DEBUG_LOG("%s: Key \"%s\" %s\n", prefix, ImGui::GetKeyName(e->Key.Key), e->Key.Down ? "Down" : "Up"); return; } + if (e->Type == ImGuiInputEventType_Text) { IMGUI_DEBUG_LOG("%s: Text: %c (U+%08X)\n", prefix, e->Text.Char, e->Text.Char); return; } + if (e->Type == ImGuiInputEventType_Focus) { IMGUI_DEBUG_LOG("%s: AppFocused %d\n", prefix, e->AppFocused.Focused); return; } +}*/ + +// Process input queue +// We always call this with the value of 'bool g.IO.ConfigInputTrickleEventQueue'. +// - trickle_fast_inputs = false : process all events, turn into flattened input state (e.g. successive down/up/down/up will be lost) +// - trickle_fast_inputs = true : process as many events as possible (successive down/up/down/up will be trickled over several frames so nothing is lost) (new feature in 1.87) +void ImGui::UpdateInputEvents(bool trickle_fast_inputs) +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + // Only trickle chars<>key when working with InputText() + // FIXME: InputText() could parse event trail? + // FIXME: Could specialize chars<>keys trickling rules for control keys (those not typically associated to characters) + const bool trickle_interleaved_keys_and_text = (trickle_fast_inputs && g.WantTextInputNextFrame == 1); + + bool mouse_moved = false, mouse_wheeled = false, key_changed = false, text_inputted = false; + int mouse_button_changed = 0x00; + ImBitArray key_changed_mask; + + int event_n = 0; + for (; event_n < g.InputEventsQueue.Size; event_n++) + { + const ImGuiInputEvent* e = &g.InputEventsQueue[event_n]; + if (e->Type == ImGuiInputEventType_MousePos) + { + ImVec2 event_pos(e->MousePos.PosX, e->MousePos.PosY); + if (IsMousePosValid(&event_pos)) + event_pos = ImVec2(ImFloorSigned(event_pos.x), ImFloorSigned(event_pos.y)); // Apply same flooring as UpdateMouseInputs() + if (io.MousePos.x != event_pos.x || io.MousePos.y != event_pos.y) + { + // Trickling Rule: Stop processing queued events if we already handled a mouse button change + if (trickle_fast_inputs && (mouse_button_changed != 0 || mouse_wheeled || key_changed || text_inputted)) + break; + io.MousePos = event_pos; + mouse_moved = true; + } + } + else if (e->Type == ImGuiInputEventType_MouseButton) + { + const ImGuiMouseButton button = e->MouseButton.Button; + IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); + if (io.MouseDown[button] != e->MouseButton.Down) + { + // Trickling Rule: Stop processing queued events if we got multiple action on the same button + if (trickle_fast_inputs && ((mouse_button_changed & (1 << button)) || mouse_wheeled)) + break; + io.MouseDown[button] = e->MouseButton.Down; + mouse_button_changed |= (1 << button); + } + } + else if (e->Type == ImGuiInputEventType_MouseWheel) + { + if (e->MouseWheel.WheelX != 0.0f || e->MouseWheel.WheelY != 0.0f) + { + // Trickling Rule: Stop processing queued events if we got multiple action on the event + if (trickle_fast_inputs && (mouse_wheeled || mouse_button_changed != 0)) + break; + io.MouseWheelH += e->MouseWheel.WheelX; + io.MouseWheel += e->MouseWheel.WheelY; + mouse_wheeled = true; + } + } + else if (e->Type == ImGuiInputEventType_Key) + { + ImGuiKey key = e->Key.Key; + IM_ASSERT(key != ImGuiKey_None); + const int keydata_index = (key - ImGuiKey_KeysData_OFFSET); + ImGuiKeyData* keydata = &io.KeysData[keydata_index]; + if (keydata->Down != e->Key.Down || keydata->AnalogValue != e->Key.AnalogValue) + { + // Trickling Rule: Stop processing queued events if we got multiple action on the same button + if (trickle_fast_inputs && keydata->Down != e->Key.Down && (key_changed_mask.TestBit(keydata_index) || text_inputted || mouse_button_changed != 0)) + break; + keydata->Down = e->Key.Down; + keydata->AnalogValue = e->Key.AnalogValue; + key_changed = true; + key_changed_mask.SetBit(keydata_index); + + if (key == ImGuiKey_ModCtrl || key == ImGuiKey_ModShift || key == ImGuiKey_ModAlt || key == ImGuiKey_ModSuper) + { + if (key == ImGuiKey_ModCtrl) { io.KeyCtrl = keydata->Down; } + if (key == ImGuiKey_ModShift) { io.KeyShift = keydata->Down; } + if (key == ImGuiKey_ModAlt) { io.KeyAlt = keydata->Down; } + if (key == ImGuiKey_ModSuper) { io.KeySuper = keydata->Down; } + io.KeyMods = GetMergedModFlags(); + } + + // Allow legacy code using io.KeysDown[GetKeyIndex()] with new backends +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + io.KeysDown[key] = keydata->Down; + if (io.KeyMap[key] != -1) + io.KeysDown[io.KeyMap[key]] = keydata->Down; +#endif + } + } + else if (e->Type == ImGuiInputEventType_Text) + { + // Trickling Rule: Stop processing queued events if keys/mouse have been interacted with + if (trickle_fast_inputs && ((key_changed && trickle_interleaved_keys_and_text) || mouse_button_changed != 0 || mouse_moved || mouse_wheeled)) + break; + unsigned int c = e->Text.Char; + io.InputQueueCharacters.push_back(c <= IM_UNICODE_CODEPOINT_MAX ? (ImWchar)c : IM_UNICODE_CODEPOINT_INVALID); + if (trickle_interleaved_keys_and_text) + text_inputted = true; + } + else if (e->Type == ImGuiInputEventType_Focus) + { + // We intentionally overwrite this and process lower, in order to give a chance + // to multi-viewports backends to queue AddFocusEvent(false) + AddFocusEvent(true) in same frame. + io.AppFocusLost = !e->AppFocused.Focused; + } + else + { + IM_ASSERT(0 && "Unknown event!"); + } + } + + // Record trail (for domain-specific applications wanting to access a precise trail) + //if (event_n != 0) IMGUI_DEBUG_LOG("Processed: %d / Remaining: %d\n", event_n, g.InputEventsQueue.Size - event_n); + for (int n = 0; n < event_n; n++) + g.InputEventsTrail.push_back(g.InputEventsQueue[n]); + + // [DEBUG] + /*if (event_n != 0) + for (int n = 0; n < g.InputEventsQueue.Size; n++) + DebugLogInputEvent(n < event_n ? "Processed" : "Remaining", &g.InputEventsQueue[n]);*/ + + // Remaining events will be processed on the next frame + if (event_n == g.InputEventsQueue.Size) + g.InputEventsQueue.resize(0); + else + g.InputEventsQueue.erase(g.InputEventsQueue.Data, g.InputEventsQueue.Data + event_n); + + // Clear buttons state when focus is lost + // (this is useful so e.g. releasing Alt after focus loss on Alt-Tab doesn't trigger the Alt menu toggle) + if (g.IO.AppFocusLost) + { + g.IO.ClearInputKeys(); + g.IO.AppFocusLost = false; + } +} + + +//----------------------------------------------------------------------------- +// [SECTION] ERROR CHECKING +//----------------------------------------------------------------------------- + +// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui. +// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit +// If this triggers you have an issue: +// - Most commonly: mismatched headers and compiled code version. +// - Or: mismatched configuration #define, compilation settings, packing pragma etc. +// The configuration settings mentioned in imconfig.h must be set for all compilation units involved with Dear ImGui, +// which is way it is required you put them in your imconfig file (and not just before including imgui.h). +// Otherwise it is possible that different compilation units would see different structure layout +bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx) +{ + bool error = false; + if (strcmp(version, IMGUI_VERSION) != 0) { error = true; IM_ASSERT(strcmp(version, IMGUI_VERSION) == 0 && "Mismatched version string!"); } + if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); } + if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); } + if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); } + if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); } + if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); } + if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); } + return !error; +} + +static void ImGui::ErrorCheckNewFrameSanityChecks() +{ + ImGuiContext& g = *GImGui; + + // Check user IM_ASSERT macro + // (IF YOU GET A WARNING OR COMPILE ERROR HERE: it means your assert macro is incorrectly defined! + // If your macro uses multiple statements, it NEEDS to be surrounded by a 'do { ... } while (0)' block. + // This is a common C/C++ idiom to allow multiple statements macros to be used in control flow blocks.) + // #define IM_ASSERT(EXPR) if (SomeCode(EXPR)) SomeMoreCode(); // Wrong! + // #define IM_ASSERT(EXPR) do { if (SomeCode(EXPR)) SomeMoreCode(); } while (0) // Correct! + if (true) IM_ASSERT(1); else IM_ASSERT(0); + + // Check user data + // (We pass an error message in the assert expression to make it visible to programmers who are not using a debugger, as most assert handlers display their argument) + IM_ASSERT(g.Initialized); + IM_ASSERT((g.IO.DeltaTime > 0.0f || g.FrameCount == 0) && "Need a positive DeltaTime!"); + IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?"); + IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value!"); + IM_ASSERT(g.IO.Fonts->IsBuilt() && "Font Atlas not built! Make sure you called ImGui_ImplXXXX_NewFrame() function for renderer backend, which should call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8()"); + IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting!"); + IM_ASSERT(g.Style.CircleTessellationMaxError > 0.0f && "Invalid style setting!"); + IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting!"); // Allows us to avoid a few clamps in color computations + IM_ASSERT(g.Style.WindowMinSize.x >= 1.0f && g.Style.WindowMinSize.y >= 1.0f && "Invalid style setting."); + IM_ASSERT(g.Style.WindowMenuButtonPosition == ImGuiDir_None || g.Style.WindowMenuButtonPosition == ImGuiDir_Left || g.Style.WindowMenuButtonPosition == ImGuiDir_Right); + IM_ASSERT(g.Style.ColorButtonPosition == ImGuiDir_Left || g.Style.ColorButtonPosition == ImGuiDir_Right); +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_COUNT; n++) + IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < ImGuiKey_LegacyNativeKey_END && "io.KeyMap[] contains an out of bound value (need to be 0..511, or -1 for unmapped key)"); + + // Check: required key mapping (we intentionally do NOT check all keys to not pressure user into setting up everything, but Space is required and was only added in 1.60 WIP) + if ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && g.IO.BackendUsingLegacyKeyArrays == 1) + IM_ASSERT(g.IO.KeyMap[ImGuiKey_Space] != -1 && "ImGuiKey_Space is not mapped, required for keyboard navigation."); +#endif + + // Check: the io.ConfigWindowsResizeFromEdges option requires backend to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly. + if (g.IO.ConfigWindowsResizeFromEdges && !(g.IO.BackendFlags & ImGuiBackendFlags_HasMouseCursors)) + g.IO.ConfigWindowsResizeFromEdges = false; +} + +static void ImGui::ErrorCheckEndFrameSanityChecks() +{ + ImGuiContext& g = *GImGui; + + // Verify that io.KeyXXX fields haven't been tampered with. Key mods should not be modified between NewFrame() and EndFrame() + // One possible reason leading to this assert is that your backends update inputs _AFTER_ NewFrame(). + // It is known that when some modal native windows called mid-frame takes focus away, some backends such as GLFW will + // send key release events mid-frame. This would normally trigger this assertion and lead to sheared inputs. + // We silently accommodate for this case by ignoring/ the case where all io.KeyXXX modifiers were released (aka key_mod_flags == 0), + // while still correctly asserting on mid-frame key press events. + const ImGuiModFlags key_mods = GetMergedModFlags(); + IM_ASSERT((key_mods == 0 || g.IO.KeyMods == key_mods) && "Mismatching io.KeyCtrl/io.KeyShift/io.KeyAlt/io.KeySuper vs io.KeyMods"); + IM_UNUSED(key_mods); + + // [EXPERIMENTAL] Recover from errors: You may call this yourself before EndFrame(). + //ErrorCheckEndFrameRecover(); + + // Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you + // to always call End/EndChild even if Begin/BeginChild returns false! (this is unfortunately inconsistent with most other Begin* API). + if (g.CurrentWindowStack.Size != 1) + { + if (g.CurrentWindowStack.Size > 1) + { + IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you forget to call End/EndChild?"); + while (g.CurrentWindowStack.Size > 1) + End(); + } + else + { + IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you call End/EndChild too much?"); + } + } + + IM_ASSERT_USER_ERROR(g.GroupStack.Size == 0, "Missing EndGroup call!"); +} + +// Experimental recovery from incorrect usage of BeginXXX/EndXXX/PushXXX/PopXXX calls. +// Must be called during or before EndFrame(). +// This is generally flawed as we are not necessarily End/Popping things in the right order. +// FIXME: Can't recover from inside BeginTabItem/EndTabItem yet. +// FIXME: Can't recover from interleaved BeginTabBar/Begin +void ImGui::ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data) +{ + // PVS-Studio V1044 is "Loop break conditions do not depend on the number of iterations" + ImGuiContext& g = *GImGui; + while (g.CurrentWindowStack.Size > 0) //-V1044 + { + ErrorCheckEndWindowRecover(log_callback, user_data); + ImGuiWindow* window = g.CurrentWindow; + if (g.CurrentWindowStack.Size == 1) + { + IM_ASSERT(window->IsFallbackWindow); + break; + } + if (window->Flags & ImGuiWindowFlags_ChildWindow) + { + if (log_callback) log_callback(user_data, "Recovered from missing EndChild() for '%s'", window->Name); + EndChild(); + } + else + { + if (log_callback) log_callback(user_data, "Recovered from missing End() for '%s'", window->Name); + End(); + } + } +} + +// Must be called before End()/EndChild() +void ImGui::ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data) +{ + ImGuiContext& g = *GImGui; + while (g.CurrentTable && (g.CurrentTable->OuterWindow == g.CurrentWindow || g.CurrentTable->InnerWindow == g.CurrentWindow)) + { + if (log_callback) log_callback(user_data, "Recovered from missing EndTable() in '%s'", g.CurrentTable->OuterWindow->Name); + EndTable(); + } + + ImGuiWindow* window = g.CurrentWindow; + ImGuiStackSizes* stack_sizes = &g.CurrentWindowStack.back().StackSizesOnBegin; + IM_ASSERT(window != NULL); + while (g.CurrentTabBar != NULL) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing EndTabBar() in '%s'", window->Name); + EndTabBar(); + } + while (window->DC.TreeDepth > 0) + { + if (log_callback) log_callback(user_data, "Recovered from missing TreePop() in '%s'", window->Name); + TreePop(); + } + while (g.GroupStack.Size > stack_sizes->SizeOfGroupStack) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing EndGroup() in '%s'", window->Name); + EndGroup(); + } + while (window->IDStack.Size > 1) + { + if (log_callback) log_callback(user_data, "Recovered from missing PopID() in '%s'", window->Name); + PopID(); + } + while (g.DisabledStackSize > stack_sizes->SizeOfDisabledStack) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing EndDisabled() in '%s'", window->Name); + EndDisabled(); + } + while (g.ColorStack.Size > stack_sizes->SizeOfColorStack) + { + if (log_callback) log_callback(user_data, "Recovered from missing PopStyleColor() in '%s' for ImGuiCol_%s", window->Name, GetStyleColorName(g.ColorStack.back().Col)); + PopStyleColor(); + } + while (g.ItemFlagsStack.Size > stack_sizes->SizeOfItemFlagsStack) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing PopItemFlag() in '%s'", window->Name); + PopItemFlag(); + } + while (g.StyleVarStack.Size > stack_sizes->SizeOfStyleVarStack) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing PopStyleVar() in '%s'", window->Name); + PopStyleVar(); + } + while (g.FocusScopeStack.Size > stack_sizes->SizeOfFocusScopeStack) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing PopFocusScope() in '%s'", window->Name); + PopFocusScope(); + } +} + +// Save current stack sizes for later compare +void ImGuiStackSizes::SetToCurrentState() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + SizeOfIDStack = (short)window->IDStack.Size; + SizeOfColorStack = (short)g.ColorStack.Size; + SizeOfStyleVarStack = (short)g.StyleVarStack.Size; + SizeOfFontStack = (short)g.FontStack.Size; + SizeOfFocusScopeStack = (short)g.FocusScopeStack.Size; + SizeOfGroupStack = (short)g.GroupStack.Size; + SizeOfItemFlagsStack = (short)g.ItemFlagsStack.Size; + SizeOfBeginPopupStack = (short)g.BeginPopupStack.Size; + SizeOfDisabledStack = (short)g.DisabledStackSize; +} + +// Compare to detect usage errors +void ImGuiStackSizes::CompareWithCurrentState() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_UNUSED(window); + + // Window stacks + // NOT checking: DC.ItemWidth, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin) + IM_ASSERT(SizeOfIDStack == window->IDStack.Size && "PushID/PopID or TreeNode/TreePop Mismatch!"); + + // Global stacks + // For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them. + IM_ASSERT(SizeOfGroupStack == g.GroupStack.Size && "BeginGroup/EndGroup Mismatch!"); + IM_ASSERT(SizeOfBeginPopupStack == g.BeginPopupStack.Size && "BeginPopup/EndPopup or BeginMenu/EndMenu Mismatch!"); + IM_ASSERT(SizeOfDisabledStack == g.DisabledStackSize && "BeginDisabled/EndDisabled Mismatch!"); + IM_ASSERT(SizeOfItemFlagsStack >= g.ItemFlagsStack.Size && "PushItemFlag/PopItemFlag Mismatch!"); + IM_ASSERT(SizeOfColorStack >= g.ColorStack.Size && "PushStyleColor/PopStyleColor Mismatch!"); + IM_ASSERT(SizeOfStyleVarStack >= g.StyleVarStack.Size && "PushStyleVar/PopStyleVar Mismatch!"); + IM_ASSERT(SizeOfFontStack >= g.FontStack.Size && "PushFont/PopFont Mismatch!"); + IM_ASSERT(SizeOfFocusScopeStack == g.FocusScopeStack.Size && "PushFocusScope/PopFocusScope Mismatch!"); +} + + +//----------------------------------------------------------------------------- +// [SECTION] LAYOUT +//----------------------------------------------------------------------------- +// - ItemSize() +// - ItemAdd() +// - SameLine() +// - GetCursorScreenPos() +// - SetCursorScreenPos() +// - GetCursorPos(), GetCursorPosX(), GetCursorPosY() +// - SetCursorPos(), SetCursorPosX(), SetCursorPosY() +// - GetCursorStartPos() +// - Indent() +// - Unindent() +// - SetNextItemWidth() +// - PushItemWidth() +// - PushMultiItemsWidths() +// - PopItemWidth() +// - CalcItemWidth() +// - CalcItemSize() +// - GetTextLineHeight() +// - GetTextLineHeightWithSpacing() +// - GetFrameHeight() +// - GetFrameHeightWithSpacing() +// - GetContentRegionMax() +// - GetContentRegionMaxAbs() [Internal] +// - GetContentRegionAvail(), +// - GetWindowContentRegionMin(), GetWindowContentRegionMax() +// - BeginGroup() +// - EndGroup() +// Also see in imgui_widgets: tab bars, and in imgui_tables: tables, columns. +//----------------------------------------------------------------------------- + +// Advance cursor given item size for layout. +// Register minimum needed size so it can extend the bounding box used for auto-fit calculation. +// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different. +void ImGui::ItemSize(const ImVec2& size, float text_baseline_y) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + // We increase the height in this function to accommodate for baseline offset. + // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor, + // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect. + const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f; + + const float line_y1 = window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y; + const float line_height = ImMax(window->DC.CurrLineSize.y, /*ImMax(*/window->DC.CursorPos.y - line_y1/*, 0.0f)*/ + size.y + offset_to_match_baseline_y); + + // Always align ourselves on pixel boundaries + //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG] + window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x; + window->DC.CursorPosPrevLine.y = line_y1; + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line + window->DC.CursorPos.y = IM_FLOOR(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line + window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x); + window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y); + //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG] + + window->DC.PrevLineSize.y = line_height; + window->DC.CurrLineSize.y = 0.0f; + window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y); + window->DC.CurrLineTextBaseOffset = 0.0f; + window->DC.IsSameLine = false; + + // Horizontal layout mode + if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) + SameLine(); +} + +// Declare item bounding box for clipping and interaction. +// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface +// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction. +bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGuiItemFlags extra_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Set item data + // (DisplayRect is left untouched, made valid when ImGuiItemStatusFlags_HasDisplayRect is set) + g.LastItemData.ID = id; + g.LastItemData.Rect = bb; + g.LastItemData.NavRect = nav_bb_arg ? *nav_bb_arg : bb; + g.LastItemData.InFlags = g.CurrentItemFlags | extra_flags; + g.LastItemData.StatusFlags = ImGuiItemStatusFlags_None; + + // Directional navigation processing + if (id != 0) + { + KeepAliveID(id); + + // Runs prior to clipping early-out + // (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget + // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests + // unfortunately, but it is still limited to one window. It may not scale very well for windows with ten of + // thousands of item, but at least NavMoveRequest is only set on user interaction, aka maximum once a frame. + // We could early out with "if (is_clipped && !g.NavInitRequest) return false;" but when we wouldn't be able + // to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick). + // We intentionally don't check if g.NavWindow != NULL because g.NavAnyRequest should only be set when it is non null. + // If we crash on a NULL g.NavWindow we need to fix the bug elsewhere. + window->DC.NavLayersActiveMaskNext |= (1 << window->DC.NavLayerCurrent); + if (g.NavId == id || g.NavAnyRequest) + if (g.NavWindow->RootWindowForNav == window->RootWindowForNav) + if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened)) + NavProcessItem(); + + // [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something". + // Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something". + // READ THE FAQ: https://dearimgui.org/faq + IM_ASSERT(id != window->ID && "Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works!"); + + // [DEBUG] Item Picker tool, when enabling the "extended" version we perform the check in ItemAdd() +#ifdef IMGUI_DEBUG_TOOL_ITEM_PICKER_EX + if (id == g.DebugItemPickerBreakId) + { + IM_DEBUG_BREAK(); + g.DebugItemPickerBreakId = 0; + } +#endif + } + g.NextItemData.Flags = ImGuiNextItemDataFlags_None; + +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (id != 0) + IMGUI_TEST_ENGINE_ITEM_ADD(nav_bb_arg ? *nav_bb_arg : bb, id); +#endif + + // Clipping test + const bool is_clipped = IsClippedEx(bb, id); + if (is_clipped) + return false; + //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG] + + // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them) + if (IsMouseHoveringRect(bb.Min, bb.Max)) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; + return true; +} + +// Gets back to previous line and continue with horizontal layout +// offset_from_start_x == 0 : follow right after previous item +// offset_from_start_x != 0 : align to specified x position (relative to window/group left) +// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0 +// spacing_w >= 0 : enforce spacing amount +void ImGui::SameLine(float offset_from_start_x, float spacing_w) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + if (offset_from_start_x != 0.0f) + { + if (spacing_w < 0.0f) + spacing_w = 0.0f; + window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + offset_from_start_x + spacing_w + window->DC.GroupOffset.x + window->DC.ColumnsOffset.x; + window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; + } + else + { + if (spacing_w < 0.0f) + spacing_w = g.Style.ItemSpacing.x; + window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w; + window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; + } + window->DC.CurrLineSize = window->DC.PrevLineSize; + window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset; + window->DC.IsSameLine = true; +} + +ImVec2 ImGui::GetCursorScreenPos() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorPos; +} + +void ImGui::SetCursorScreenPos(const ImVec2& pos) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.CursorPos = pos; + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); +} + +// User generally sees positions in window coordinates. Internally we store CursorPos in absolute screen coordinates because it is more convenient. +// Conversion happens as we pass the value to user, but it makes our naming convention confusing because GetCursorPos() == (DC.CursorPos - window.Pos). May want to rename 'DC.CursorPos'. +ImVec2 ImGui::GetCursorPos() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorPos - window->Pos + window->Scroll; +} + +float ImGui::GetCursorPosX() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorPos.x - window->Pos.x + window->Scroll.x; +} + +float ImGui::GetCursorPosY() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorPos.y - window->Pos.y + window->Scroll.y; +} + +void ImGui::SetCursorPos(const ImVec2& local_pos) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.CursorPos = window->Pos - window->Scroll + local_pos; + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); +} + +void ImGui::SetCursorPosX(float x) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + x; + window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPos.x); +} + +void ImGui::SetCursorPosY(float y) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.CursorPos.y = window->Pos.y - window->Scroll.y + y; + window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y); +} + +ImVec2 ImGui::GetCursorStartPos() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorStartPos - window->Pos; +} + +void ImGui::Indent(float indent_w) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + window->DC.Indent.x += (indent_w != 0.0f) ? indent_w : g.Style.IndentSpacing; + window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x; +} + +void ImGui::Unindent(float indent_w) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + window->DC.Indent.x -= (indent_w != 0.0f) ? indent_w : g.Style.IndentSpacing; + window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x; +} + +// Affect large frame+labels widgets only. +void ImGui::SetNextItemWidth(float item_width) +{ + ImGuiContext& g = *GImGui; + g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasWidth; + g.NextItemData.Width = item_width; +} + +// FIXME: Remove the == 0.0f behavior? +void ImGui::PushItemWidth(float item_width) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width + window->DC.ItemWidth = (item_width == 0.0f ? window->ItemWidthDefault : item_width); + g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; +} + +void ImGui::PushMultiItemsWidths(int components, float w_full) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const ImGuiStyle& style = g.Style; + const float w_item_one = ImMax(1.0f, IM_FLOOR((w_full - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); + const float w_item_last = ImMax(1.0f, IM_FLOOR(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); + window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width + window->DC.ItemWidthStack.push_back(w_item_last); + for (int i = 0; i < components - 2; i++) + window->DC.ItemWidthStack.push_back(w_item_one); + window->DC.ItemWidth = (components == 1) ? w_item_last : w_item_one; + g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; +} + +void ImGui::PopItemWidth() +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.ItemWidth = window->DC.ItemWidthStack.back(); + window->DC.ItemWidthStack.pop_back(); +} + +// Calculate default item width given value passed to PushItemWidth() or SetNextItemWidth(). +// The SetNextItemWidth() data is generally cleared/consumed by ItemAdd() or NextItemData.ClearFlags() +float ImGui::CalcItemWidth() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float w; + if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasWidth) + w = g.NextItemData.Width; + else + w = window->DC.ItemWidth; + if (w < 0.0f) + { + float region_max_x = GetContentRegionMaxAbs().x; + w = ImMax(1.0f, region_max_x - window->DC.CursorPos.x + w); + } + w = IM_FLOOR(w); + return w; +} + +// [Internal] Calculate full item size given user provided 'size' parameter and default width/height. Default width is often == CalcItemWidth(). +// Those two functions CalcItemWidth vs CalcItemSize are awkwardly named because they are not fully symmetrical. +// Note that only CalcItemWidth() is publicly exposed. +// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable) +ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_w, float default_h) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + ImVec2 region_max; + if (size.x < 0.0f || size.y < 0.0f) + region_max = GetContentRegionMaxAbs(); + + if (size.x == 0.0f) + size.x = default_w; + else if (size.x < 0.0f) + size.x = ImMax(4.0f, region_max.x - window->DC.CursorPos.x + size.x); + + if (size.y == 0.0f) + size.y = default_h; + else if (size.y < 0.0f) + size.y = ImMax(4.0f, region_max.y - window->DC.CursorPos.y + size.y); + + return size; +} + +float ImGui::GetTextLineHeight() +{ + ImGuiContext& g = *GImGui; + return g.FontSize; +} + +float ImGui::GetTextLineHeightWithSpacing() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + g.Style.ItemSpacing.y; +} + +float ImGui::GetFrameHeight() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + g.Style.FramePadding.y * 2.0f; +} + +float ImGui::GetFrameHeightWithSpacing() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + g.Style.FramePadding.y * 2.0f + g.Style.ItemSpacing.y; +} + +// FIXME: All the Contents Region function are messy or misleading. WE WILL AIM TO OBSOLETE ALL OF THEM WITH A NEW "WORK RECT" API. Thanks for your patience! + +// FIXME: This is in window space (not screen space!). +ImVec2 ImGui::GetContentRegionMax() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 mx = window->ContentRegionRect.Max - window->Pos; + if (window->DC.CurrentColumns || g.CurrentTable) + mx.x = window->WorkRect.Max.x - window->Pos.x; + return mx; +} + +// [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features. +ImVec2 ImGui::GetContentRegionMaxAbs() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 mx = window->ContentRegionRect.Max; + if (window->DC.CurrentColumns || g.CurrentTable) + mx.x = window->WorkRect.Max.x; + return mx; +} + +ImVec2 ImGui::GetContentRegionAvail() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return GetContentRegionMaxAbs() - window->DC.CursorPos; +} + +// In window space (not screen space!) +ImVec2 ImGui::GetWindowContentRegionMin() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ContentRegionRect.Min - window->Pos; +} + +ImVec2 ImGui::GetWindowContentRegionMax() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ContentRegionRect.Max - window->Pos; +} + +// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) +// Groups are currently a mishmash of functionalities which should perhaps be clarified and separated. +// FIXME-OPT: Could we safely early out on ->SkipItems? +void ImGui::BeginGroup() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + g.GroupStack.resize(g.GroupStack.Size + 1); + ImGuiGroupData& group_data = g.GroupStack.back(); + group_data.WindowID = window->ID; + group_data.BackupCursorPos = window->DC.CursorPos; + group_data.BackupCursorMaxPos = window->DC.CursorMaxPos; + group_data.BackupIndent = window->DC.Indent; + group_data.BackupGroupOffset = window->DC.GroupOffset; + group_data.BackupCurrLineSize = window->DC.CurrLineSize; + group_data.BackupCurrLineTextBaseOffset = window->DC.CurrLineTextBaseOffset; + group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive; + group_data.BackupHoveredIdIsAlive = g.HoveredId != 0; + group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive; + group_data.EmitItem = true; + + window->DC.GroupOffset.x = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffset.x; + window->DC.Indent = window->DC.GroupOffset; + window->DC.CursorMaxPos = window->DC.CursorPos; + window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + if (g.LogEnabled) + g.LogLinePosY = -FLT_MAX; // To enforce a carriage return +} + +void ImGui::EndGroup() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(g.GroupStack.Size > 0); // Mismatched BeginGroup()/EndGroup() calls + + ImGuiGroupData& group_data = g.GroupStack.back(); + IM_ASSERT(group_data.WindowID == window->ID); // EndGroup() in wrong window? + + ImRect group_bb(group_data.BackupCursorPos, ImMax(window->DC.CursorMaxPos, group_data.BackupCursorPos)); + + window->DC.CursorPos = group_data.BackupCursorPos; + window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos); + window->DC.Indent = group_data.BackupIndent; + window->DC.GroupOffset = group_data.BackupGroupOffset; + window->DC.CurrLineSize = group_data.BackupCurrLineSize; + window->DC.CurrLineTextBaseOffset = group_data.BackupCurrLineTextBaseOffset; + if (g.LogEnabled) + g.LogLinePosY = -FLT_MAX; // To enforce a carriage return + + if (!group_data.EmitItem) + { + g.GroupStack.pop_back(); + return; + } + + window->DC.CurrLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now. + ItemSize(group_bb.GetSize()); + ItemAdd(group_bb, 0, NULL, ImGuiItemFlags_NoTabStop); + + // If the current ActiveId was declared within the boundary of our group, we copy it to LastItemId so IsItemActive(), IsItemDeactivated() etc. will be functional on the entire group. + // It would be be neater if we replaced window.DC.LastItemId by e.g. 'bool LastItemIsActive', but would put a little more burden on individual widgets. + // Also if you grep for LastItemId you'll notice it is only used in that context. + // (The two tests not the same because ActiveIdIsAlive is an ID itself, in order to be able to handle ActiveId being overwritten during the frame.) + const bool group_contains_curr_active_id = (group_data.BackupActiveIdIsAlive != g.ActiveId) && (g.ActiveIdIsAlive == g.ActiveId) && g.ActiveId; + const bool group_contains_prev_active_id = (group_data.BackupActiveIdPreviousFrameIsAlive == false) && (g.ActiveIdPreviousFrameIsAlive == true); + if (group_contains_curr_active_id) + g.LastItemData.ID = g.ActiveId; + else if (group_contains_prev_active_id) + g.LastItemData.ID = g.ActiveIdPreviousFrame; + g.LastItemData.Rect = group_bb; + + // Forward Hovered flag + const bool group_contains_curr_hovered_id = (group_data.BackupHoveredIdIsAlive == false) && g.HoveredId != 0; + if (group_contains_curr_hovered_id) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow; + + // Forward Edited flag + if (group_contains_curr_active_id && g.ActiveIdHasBeenEditedThisFrame) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Edited; + + // Forward Deactivated flag + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDeactivated; + if (group_contains_prev_active_id && g.ActiveId != g.ActiveIdPreviousFrame) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Deactivated; + + g.GroupStack.pop_back(); + //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] +} + + +//----------------------------------------------------------------------------- +// [SECTION] SCROLLING +//----------------------------------------------------------------------------- + +// Helper to snap on edges when aiming at an item very close to the edge, +// So the difference between WindowPadding and ItemSpacing will be in the visible area after scrolling. +// When we refactor the scrolling API this may be configurable with a flag? +// Note that the effect for this won't be visible on X axis with default Style settings as WindowPadding.x == ItemSpacing.x by default. +static float CalcScrollEdgeSnap(float target, float snap_min, float snap_max, float snap_threshold, float center_ratio) +{ + if (target <= snap_min + snap_threshold) + return ImLerp(snap_min, target, center_ratio); + if (target >= snap_max - snap_threshold) + return ImLerp(target, snap_max, center_ratio); + return target; +} + +static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window) +{ + ImVec2 scroll = window->Scroll; + if (window->ScrollTarget.x < FLT_MAX) + { + float decoration_total_width = window->ScrollbarSizes.x; + float center_x_ratio = window->ScrollTargetCenterRatio.x; + float scroll_target_x = window->ScrollTarget.x; + if (window->ScrollTargetEdgeSnapDist.x > 0.0f) + { + float snap_x_min = 0.0f; + float snap_x_max = window->ScrollMax.x + window->SizeFull.x - decoration_total_width; + scroll_target_x = CalcScrollEdgeSnap(scroll_target_x, snap_x_min, snap_x_max, window->ScrollTargetEdgeSnapDist.x, center_x_ratio); + } + scroll.x = scroll_target_x - center_x_ratio * (window->SizeFull.x - decoration_total_width); + } + if (window->ScrollTarget.y < FLT_MAX) + { + float decoration_total_height = window->TitleBarHeight() + window->MenuBarHeight() + window->ScrollbarSizes.y; + float center_y_ratio = window->ScrollTargetCenterRatio.y; + float scroll_target_y = window->ScrollTarget.y; + if (window->ScrollTargetEdgeSnapDist.y > 0.0f) + { + float snap_y_min = 0.0f; + float snap_y_max = window->ScrollMax.y + window->SizeFull.y - decoration_total_height; + scroll_target_y = CalcScrollEdgeSnap(scroll_target_y, snap_y_min, snap_y_max, window->ScrollTargetEdgeSnapDist.y, center_y_ratio); + } + scroll.y = scroll_target_y - center_y_ratio * (window->SizeFull.y - decoration_total_height); + } + scroll.x = IM_FLOOR(ImMax(scroll.x, 0.0f)); + scroll.y = IM_FLOOR(ImMax(scroll.y, 0.0f)); + if (!window->Collapsed && !window->SkipItems) + { + scroll.x = ImMin(scroll.x, window->ScrollMax.x); + scroll.y = ImMin(scroll.y, window->ScrollMax.y); + } + return scroll; +} + +void ImGui::ScrollToItem(ImGuiScrollFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ScrollToRectEx(window, g.LastItemData.NavRect, flags); +} + +void ImGui::ScrollToRect(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags) +{ + ScrollToRectEx(window, item_rect, flags); +} + +// Scroll to keep newly navigated item fully into view +ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags) +{ + ImGuiContext& g = *GImGui; + ImRect window_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1)); + //GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG] + + // Check that only one behavior is selected per axis + IM_ASSERT((flags & ImGuiScrollFlags_MaskX_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskX_)); + IM_ASSERT((flags & ImGuiScrollFlags_MaskY_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskY_)); + + // Defaults + ImGuiScrollFlags in_flags = flags; + if ((flags & ImGuiScrollFlags_MaskX_) == 0 && window->ScrollbarX) + flags |= ImGuiScrollFlags_KeepVisibleEdgeX; + if ((flags & ImGuiScrollFlags_MaskY_) == 0) + flags |= window->Appearing ? ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeY; + + const bool fully_visible_x = item_rect.Min.x >= window_rect.Min.x && item_rect.Max.x <= window_rect.Max.x; + const bool fully_visible_y = item_rect.Min.y >= window_rect.Min.y && item_rect.Max.y <= window_rect.Max.y; + const bool can_be_fully_visible_x = (item_rect.GetWidth() + g.Style.ItemSpacing.x * 2.0f) <= window_rect.GetWidth(); + const bool can_be_fully_visible_y = (item_rect.GetHeight() + g.Style.ItemSpacing.y * 2.0f) <= window_rect.GetHeight(); + + if ((flags & ImGuiScrollFlags_KeepVisibleEdgeX) && !fully_visible_x) + { + if (item_rect.Min.x < window_rect.Min.x || !can_be_fully_visible_x) + SetScrollFromPosX(window, item_rect.Min.x - g.Style.ItemSpacing.x - window->Pos.x, 0.0f); + else if (item_rect.Max.x >= window_rect.Max.x) + SetScrollFromPosX(window, item_rect.Max.x + g.Style.ItemSpacing.x - window->Pos.x, 1.0f); + } + else if (((flags & ImGuiScrollFlags_KeepVisibleCenterX) && !fully_visible_x) || (flags & ImGuiScrollFlags_AlwaysCenterX)) + { + float target_x = can_be_fully_visible_x ? ImFloor((item_rect.Min.x + item_rect.Max.x - window->InnerRect.GetWidth()) * 0.5f) : item_rect.Min.x; + SetScrollFromPosX(window, target_x - window->Pos.x, 0.0f); + } + + if ((flags & ImGuiScrollFlags_KeepVisibleEdgeY) && !fully_visible_y) + { + if (item_rect.Min.y < window_rect.Min.y || !can_be_fully_visible_y) + SetScrollFromPosY(window, item_rect.Min.y - g.Style.ItemSpacing.y - window->Pos.y, 0.0f); + else if (item_rect.Max.y >= window_rect.Max.y) + SetScrollFromPosY(window, item_rect.Max.y + g.Style.ItemSpacing.y - window->Pos.y, 1.0f); + } + else if (((flags & ImGuiScrollFlags_KeepVisibleCenterY) && !fully_visible_y) || (flags & ImGuiScrollFlags_AlwaysCenterY)) + { + float target_y = can_be_fully_visible_y ? ImFloor((item_rect.Min.y + item_rect.Max.y - window->InnerRect.GetHeight()) * 0.5f) : item_rect.Min.y; + SetScrollFromPosY(window, target_y - window->Pos.y, 0.0f); + } + + ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); + ImVec2 delta_scroll = next_scroll - window->Scroll; + + // Also scroll parent window to keep us into view if necessary + if (!(flags & ImGuiScrollFlags_NoScrollParent) && (window->Flags & ImGuiWindowFlags_ChildWindow)) + { + // FIXME-SCROLL: May be an option? + if ((in_flags & (ImGuiScrollFlags_AlwaysCenterX | ImGuiScrollFlags_KeepVisibleCenterX)) != 0) + in_flags = (in_flags & ~ImGuiScrollFlags_MaskX_) | ImGuiScrollFlags_KeepVisibleEdgeX; + if ((in_flags & (ImGuiScrollFlags_AlwaysCenterY | ImGuiScrollFlags_KeepVisibleCenterY)) != 0) + in_flags = (in_flags & ~ImGuiScrollFlags_MaskY_) | ImGuiScrollFlags_KeepVisibleEdgeY; + delta_scroll += ScrollToRectEx(window->ParentWindow, ImRect(item_rect.Min - delta_scroll, item_rect.Max - delta_scroll), in_flags); + } + + return delta_scroll; +} + +float ImGui::GetScrollX() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Scroll.x; +} + +float ImGui::GetScrollY() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Scroll.y; +} + +float ImGui::GetScrollMaxX() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ScrollMax.x; +} + +float ImGui::GetScrollMaxY() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ScrollMax.y; +} + +void ImGui::SetScrollX(ImGuiWindow* window, float scroll_x) +{ + window->ScrollTarget.x = scroll_x; + window->ScrollTargetCenterRatio.x = 0.0f; + window->ScrollTargetEdgeSnapDist.x = 0.0f; +} + +void ImGui::SetScrollY(ImGuiWindow* window, float scroll_y) +{ + window->ScrollTarget.y = scroll_y; + window->ScrollTargetCenterRatio.y = 0.0f; + window->ScrollTargetEdgeSnapDist.y = 0.0f; +} + +void ImGui::SetScrollX(float scroll_x) +{ + ImGuiContext& g = *GImGui; + SetScrollX(g.CurrentWindow, scroll_x); +} + +void ImGui::SetScrollY(float scroll_y) +{ + ImGuiContext& g = *GImGui; + SetScrollY(g.CurrentWindow, scroll_y); +} + +// Note that a local position will vary depending on initial scroll value, +// This is a little bit confusing so bear with us: +// - local_pos = (absolution_pos - window->Pos) +// - So local_x/local_y are 0.0f for a position at the upper-left corner of a window, +// and generally local_x/local_y are >(padding+decoration) && <(size-padding-decoration) when in the visible area. +// - They mostly exists because of legacy API. +// Following the rules above, when trying to work with scrolling code, consider that: +// - SetScrollFromPosY(0.0f) == SetScrollY(0.0f + scroll.y) == has no effect! +// - SetScrollFromPosY(-scroll.y) == SetScrollY(-scroll.y + scroll.y) == SetScrollY(0.0f) == reset scroll. Of course writing SetScrollY(0.0f) directly then makes more sense +// We store a target position so centering and clamping can occur on the next frame when we are guaranteed to have a known window size +void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio) +{ + IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f); + window->ScrollTarget.x = IM_FLOOR(local_x + window->Scroll.x); // Convert local position to scroll offset + window->ScrollTargetCenterRatio.x = center_x_ratio; + window->ScrollTargetEdgeSnapDist.x = 0.0f; +} + +void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio) +{ + IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f); + const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight(); // FIXME: Would be nice to have a more standardized access to our scrollable/client rect; + local_y -= decoration_up_height; + window->ScrollTarget.y = IM_FLOOR(local_y + window->Scroll.y); // Convert local position to scroll offset + window->ScrollTargetCenterRatio.y = center_y_ratio; + window->ScrollTargetEdgeSnapDist.y = 0.0f; +} + +void ImGui::SetScrollFromPosX(float local_x, float center_x_ratio) +{ + ImGuiContext& g = *GImGui; + SetScrollFromPosX(g.CurrentWindow, local_x, center_x_ratio); +} + +void ImGui::SetScrollFromPosY(float local_y, float center_y_ratio) +{ + ImGuiContext& g = *GImGui; + SetScrollFromPosY(g.CurrentWindow, local_y, center_y_ratio); +} + +// center_x_ratio: 0.0f left of last item, 0.5f horizontal center of last item, 1.0f right of last item. +void ImGui::SetScrollHereX(float center_x_ratio) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float spacing_x = ImMax(window->WindowPadding.x, g.Style.ItemSpacing.x); + float target_pos_x = ImLerp(g.LastItemData.Rect.Min.x - spacing_x, g.LastItemData.Rect.Max.x + spacing_x, center_x_ratio); + SetScrollFromPosX(window, target_pos_x - window->Pos.x, center_x_ratio); // Convert from absolute to local pos + + // Tweak: snap on edges when aiming at an item very close to the edge + window->ScrollTargetEdgeSnapDist.x = ImMax(0.0f, window->WindowPadding.x - spacing_x); +} + +// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item. +void ImGui::SetScrollHereY(float center_y_ratio) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float spacing_y = ImMax(window->WindowPadding.y, g.Style.ItemSpacing.y); + float target_pos_y = ImLerp(window->DC.CursorPosPrevLine.y - spacing_y, window->DC.CursorPosPrevLine.y + window->DC.PrevLineSize.y + spacing_y, center_y_ratio); + SetScrollFromPosY(window, target_pos_y - window->Pos.y, center_y_ratio); // Convert from absolute to local pos + + // Tweak: snap on edges when aiming at an item very close to the edge + window->ScrollTargetEdgeSnapDist.y = ImMax(0.0f, window->WindowPadding.y - spacing_y); +} + +//----------------------------------------------------------------------------- +// [SECTION] TOOLTIPS +//----------------------------------------------------------------------------- + +void ImGui::BeginTooltip() +{ + BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None); +} + +void ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags) +{ + ImGuiContext& g = *GImGui; + + if (g.DragDropWithinSource || g.DragDropWithinTarget) + { + // The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor) + // In the context of a dragging tooltip we try to reduce that offset and we enforce following the cursor. + // Whatever we do we want to call SetNextWindowPos() to enforce a tooltip position and disable clipping the tooltip without our display area, like regular tooltip do. + //ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding; + ImVec2 tooltip_pos = g.IO.MousePos + ImVec2(16 * g.Style.MouseCursorScale, 8 * g.Style.MouseCursorScale); + SetNextWindowPos(tooltip_pos); + SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f); + //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :( + tooltip_flags |= ImGuiTooltipFlags_OverridePreviousTooltip; + } + + char window_name[16]; + ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount); + if (tooltip_flags & ImGuiTooltipFlags_OverridePreviousTooltip) + if (ImGuiWindow* window = FindWindowByName(window_name)) + if (window->Active) + { + // Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one. + window->Hidden = true; + window->HiddenFramesCanSkipItems = 1; // FIXME: This may not be necessary? + ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount); + } + ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize; + Begin(window_name, NULL, flags | extra_window_flags); +} + +void ImGui::EndTooltip() +{ + IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip); // Mismatched BeginTooltip()/EndTooltip() calls + End(); +} + +void ImGui::SetTooltipV(const char* fmt, va_list args) +{ + BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None); + TextV(fmt, args); + EndTooltip(); +} + +void ImGui::SetTooltip(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + SetTooltipV(fmt, args); + va_end(args); +} + +//----------------------------------------------------------------------------- +// [SECTION] POPUPS +//----------------------------------------------------------------------------- + +// Supported flags: ImGuiPopupFlags_AnyPopupId, ImGuiPopupFlags_AnyPopupLevel +bool ImGui::IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + if (popup_flags & ImGuiPopupFlags_AnyPopupId) + { + // Return true if any popup is open at the current BeginPopup() level of the popup stack + // This may be used to e.g. test for another popups already opened to handle popups priorities at the same level. + IM_ASSERT(id == 0); + if (popup_flags & ImGuiPopupFlags_AnyPopupLevel) + return g.OpenPopupStack.Size > 0; + else + return g.OpenPopupStack.Size > g.BeginPopupStack.Size; + } + else + { + if (popup_flags & ImGuiPopupFlags_AnyPopupLevel) + { + // Return true if the popup is open anywhere in the popup stack + for (int n = 0; n < g.OpenPopupStack.Size; n++) + if (g.OpenPopupStack[n].PopupId == id) + return true; + return false; + } + else + { + // Return true if the popup is open at the current BeginPopup() level of the popup stack (this is the most-common query) + return g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].PopupId == id; + } + } +} + +bool ImGui::IsPopupOpen(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiID id = (popup_flags & ImGuiPopupFlags_AnyPopupId) ? 0 : g.CurrentWindow->GetID(str_id); + if ((popup_flags & ImGuiPopupFlags_AnyPopupLevel) && id != 0) + IM_ASSERT(0 && "Cannot use IsPopupOpen() with a string id and ImGuiPopupFlags_AnyPopupLevel."); // But non-string version is legal and used internally + return IsPopupOpen(id, popup_flags); +} + +ImGuiWindow* ImGui::GetTopMostPopupModal() +{ + ImGuiContext& g = *GImGui; + for (int n = g.OpenPopupStack.Size - 1; n >= 0; n--) + if (ImGuiWindow* popup = g.OpenPopupStack.Data[n].Window) + if (popup->Flags & ImGuiWindowFlags_Modal) + return popup; + return NULL; +} + +ImGuiWindow* ImGui::GetTopMostAndVisiblePopupModal() +{ + ImGuiContext& g = *GImGui; + for (int n = g.OpenPopupStack.Size - 1; n >= 0; n--) + if (ImGuiWindow* popup = g.OpenPopupStack.Data[n].Window) + if ((popup->Flags & ImGuiWindowFlags_Modal) && IsWindowActiveAndVisible(popup)) + return popup; + return NULL; +} + +void ImGui::OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + OpenPopupEx(g.CurrentWindow->GetID(str_id), popup_flags); +} + +void ImGui::OpenPopup(ImGuiID id, ImGuiPopupFlags popup_flags) +{ + OpenPopupEx(id, popup_flags); +} + +// Mark popup as open (toggle toward open state). +// Popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. +// Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level). +// One open popup per level of the popup hierarchy (NB: when assigning we reset the Window member of ImGuiPopupRef to NULL) +void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* parent_window = g.CurrentWindow; + const int current_stack_size = g.BeginPopupStack.Size; + + if (popup_flags & ImGuiPopupFlags_NoOpenOverExistingPopup) + if (IsPopupOpen(0u, ImGuiPopupFlags_AnyPopupId)) + return; + + ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack. + popup_ref.PopupId = id; + popup_ref.Window = NULL; + popup_ref.SourceWindow = g.NavWindow; + popup_ref.OpenFrameCount = g.FrameCount; + popup_ref.OpenParentId = parent_window->IDStack.back(); + popup_ref.OpenPopupPos = NavCalcPreferredRefPos(); + popup_ref.OpenMousePos = IsMousePosValid(&g.IO.MousePos) ? g.IO.MousePos : popup_ref.OpenPopupPos; + + IMGUI_DEBUG_LOG_POPUP("OpenPopupEx(0x%08X)\n", id); + if (g.OpenPopupStack.Size < current_stack_size + 1) + { + g.OpenPopupStack.push_back(popup_ref); + } + else + { + // Gently handle the user mistakenly calling OpenPopup() every frame. It is a programming mistake! However, if we were to run the regular code path, the ui + // would become completely unusable because the popup will always be in hidden-while-calculating-size state _while_ claiming focus. Which would be a very confusing + // situation for the programmer. Instead, we silently allow the popup to proceed, it will keep reappearing and the programming error will be more obvious to understand. + if (g.OpenPopupStack[current_stack_size].PopupId == id && g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1) + { + g.OpenPopupStack[current_stack_size].OpenFrameCount = popup_ref.OpenFrameCount; + } + else + { + // Close child popups if any, then flag popup for open/reopen + ClosePopupToLevel(current_stack_size, false); + g.OpenPopupStack.push_back(popup_ref); + } + + // When reopening a popup we first refocus its parent, otherwise if its parent is itself a popup it would get closed by ClosePopupsOverWindow(). + // This is equivalent to what ClosePopupToLevel() does. + //if (g.OpenPopupStack[current_stack_size].PopupId == id) + // FocusWindow(parent_window); + } +} + +// When popups are stacked, clicking on a lower level popups puts focus back to it and close popups above it. +// This function closes any popups that are over 'ref_window'. +void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup) +{ + ImGuiContext& g = *GImGui; + if (g.OpenPopupStack.Size == 0) + return; + + // Don't close our own child popup windows. + int popup_count_to_keep = 0; + if (ref_window) + { + // Find the highest popup which is a descendant of the reference window (generally reference window = NavWindow) + for (; popup_count_to_keep < g.OpenPopupStack.Size; popup_count_to_keep++) + { + ImGuiPopupData& popup = g.OpenPopupStack[popup_count_to_keep]; + if (!popup.Window) + continue; + IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0); + if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow) + continue; + + // Trim the stack unless the popup is a direct parent of the reference window (the reference window is often the NavWindow) + // - With this stack of window, clicking/focusing Popup1 will close Popup2 and Popup3: + // Window -> Popup1 -> Popup2 -> Popup3 + // - Each popups may contain child windows, which is why we compare ->RootWindow! + // Window -> Popup1 -> Popup1_Child -> Popup2 -> Popup2_Child + bool ref_window_is_descendent_of_popup = false; + for (int n = popup_count_to_keep; n < g.OpenPopupStack.Size; n++) + if (ImGuiWindow* popup_window = g.OpenPopupStack[n].Window) + if (IsWindowWithinBeginStackOf(ref_window, popup_window)) + { + ref_window_is_descendent_of_popup = true; + break; + } + if (!ref_window_is_descendent_of_popup) + break; + } + } + if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below + { + IMGUI_DEBUG_LOG_POPUP("ClosePopupsOverWindow(\"%s\") -> ClosePopupToLevel(%d)\n", ref_window->Name, popup_count_to_keep); + ClosePopupToLevel(popup_count_to_keep, restore_focus_to_window_under_popup); + } +} + +void ImGui::ClosePopupsExceptModals() +{ + ImGuiContext& g = *GImGui; + + int popup_count_to_keep; + for (popup_count_to_keep = g.OpenPopupStack.Size; popup_count_to_keep > 0; popup_count_to_keep--) + { + ImGuiWindow* window = g.OpenPopupStack[popup_count_to_keep - 1].Window; + if (!window || window->Flags & ImGuiWindowFlags_Modal) + break; + } + if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below + ClosePopupToLevel(popup_count_to_keep, true); +} + +void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup) +{ + ImGuiContext& g = *GImGui; + IMGUI_DEBUG_LOG_POPUP("ClosePopupToLevel(%d), restore_focus_to_window_under_popup=%d\n", remaining, restore_focus_to_window_under_popup); + IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size); + + // Trim open popup stack + ImGuiWindow* focus_window = g.OpenPopupStack[remaining].SourceWindow; + ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window; + g.OpenPopupStack.resize(remaining); + + if (restore_focus_to_window_under_popup) + { + if (focus_window && !focus_window->WasActive && popup_window) + { + // Fallback + FocusTopMostWindowUnderOne(popup_window, NULL); + } + else + { + if (g.NavLayer == ImGuiNavLayer_Main && focus_window) + focus_window = NavRestoreLastChildNavWindow(focus_window); + FocusWindow(focus_window); + } + } +} + +// Close the popup we have begin-ed into. +void ImGui::CloseCurrentPopup() +{ + ImGuiContext& g = *GImGui; + int popup_idx = g.BeginPopupStack.Size - 1; + if (popup_idx < 0 || popup_idx >= g.OpenPopupStack.Size || g.BeginPopupStack[popup_idx].PopupId != g.OpenPopupStack[popup_idx].PopupId) + return; + + // Closing a menu closes its top-most parent popup (unless a modal) + while (popup_idx > 0) + { + ImGuiWindow* popup_window = g.OpenPopupStack[popup_idx].Window; + ImGuiWindow* parent_popup_window = g.OpenPopupStack[popup_idx - 1].Window; + bool close_parent = false; + if (popup_window && (popup_window->Flags & ImGuiWindowFlags_ChildMenu)) + if (parent_popup_window && !(parent_popup_window->Flags & ImGuiWindowFlags_MenuBar)) + close_parent = true; + if (!close_parent) + break; + popup_idx--; + } + IMGUI_DEBUG_LOG_POPUP("CloseCurrentPopup %d -> %d\n", g.BeginPopupStack.Size - 1, popup_idx); + ClosePopupToLevel(popup_idx, true); + + // A common pattern is to close a popup when selecting a menu item/selectable that will open another window. + // To improve this usage pattern, we avoid nav highlight for a single frame in the parent window. + // Similarly, we could avoid mouse hover highlight in this window but it is less visually problematic. + if (ImGuiWindow* window = g.NavWindow) + window->DC.NavHideHighlightOneFrame = true; +} + +// Attention! BeginPopup() adds default flags which BeginPopupEx()! +bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + if (!IsPopupOpen(id, ImGuiPopupFlags_None)) + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + return false; + } + + char name[20]; + if (flags & ImGuiWindowFlags_ChildMenu) + ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuCount); // Recycle windows based on depth + else + ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame + + flags |= ImGuiWindowFlags_Popup; + bool is_open = Begin(name, NULL, flags); + if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display) + EndPopup(); + + return is_open; +} + +bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + if (g.OpenPopupStack.Size <= g.BeginPopupStack.Size) // Early out for performance + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + return false; + } + flags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings; + ImGuiID id = g.CurrentWindow->GetID(str_id); + return BeginPopupEx(id, flags); +} + +// If 'p_open' is specified for a modal popup window, the popup will have a regular close button which will close the popup. +// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here. +bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const ImGuiID id = window->GetID(name); + if (!IsPopupOpen(id, ImGuiPopupFlags_None)) + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + return false; + } + + // Center modal windows by default for increased visibility + // (this won't really last as settings will kick in, and is mostly for backward compatibility. user may do the same themselves) + // FIXME: Should test for (PosCond & window->SetWindowPosAllowFlags) with the upcoming window. + if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) == 0) + { + const ImGuiViewport* viewport = GetMainViewport(); + SetNextWindowPos(viewport->GetCenter(), ImGuiCond_FirstUseEver, ImVec2(0.5f, 0.5f)); + } + + flags |= ImGuiWindowFlags_Popup | ImGuiWindowFlags_Modal | ImGuiWindowFlags_NoCollapse; + const bool is_open = Begin(name, p_open, flags); + if (!is_open || (p_open && !*p_open)) // NB: is_open can be 'false' when the popup is completely clipped (e.g. zero size display) + { + EndPopup(); + if (is_open) + ClosePopupToLevel(g.BeginPopupStack.Size, true); + return false; + } + return is_open; +} + +void ImGui::EndPopup() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls + IM_ASSERT(g.BeginPopupStack.Size > 0); + + // Make all menus and popups wrap around for now, may need to expose that policy (e.g. focus scope could include wrap/loop policy flags used by new move requests) + if (g.NavWindow == window) + NavMoveRequestTryWrapping(window, ImGuiNavMoveFlags_LoopY); + + // Child-popups don't need to be laid out + IM_ASSERT(g.WithinEndChild == false); + if (window->Flags & ImGuiWindowFlags_ChildWindow) + g.WithinEndChild = true; + End(); + g.WithinEndChild = false; +} + +// Helper to open a popup if mouse button is released over the item +// - This is essentially the same as BeginPopupContextItem() but without the trailing BeginPopup() +void ImGui::OpenPopupOnItemClick(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); + if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + { + ImGuiID id = str_id ? window->GetID(str_id) : g.LastItemData.ID; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! + IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) + OpenPopupEx(id, popup_flags); + } +} + +// This is a helper to handle the simplest case of associating one named popup to one given widget. +// - To create a popup associated to the last item, you generally want to pass a NULL value to str_id. +// - To create a popup with a specific identifier, pass it in str_id. +// - This is useful when using using BeginPopupContextItem() on an item which doesn't have an identifier, e.g. a Text() call. +// - This is useful when multiple code locations may want to manipulate/open the same popup, given an explicit id. +// - You may want to handle the whole on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters). +// This is essentially the same as: +// id = str_id ? GetID(str_id) : GetItemID(); +// OpenPopupOnItemClick(str_id, ImGuiPopupFlags_MouseButtonRight); +// return BeginPopup(id); +// Which is essentially the same as: +// id = str_id ? GetID(str_id) : GetItemID(); +// if (IsItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) +// OpenPopup(id); +// return BeginPopup(id); +// The main difference being that this is tweaked to avoid computing the ID twice. +bool ImGui::BeginPopupContextItem(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + ImGuiID id = str_id ? window->GetID(str_id) : g.LastItemData.ID; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! + IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); + if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + OpenPopupEx(id, popup_flags); + return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); +} + +bool ImGui::BeginPopupContextWindow(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (!str_id) + str_id = "window_context"; + ImGuiID id = window->GetID(str_id); + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); + if (IsMouseReleased(mouse_button) && IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + if (!(popup_flags & ImGuiPopupFlags_NoOpenOverItems) || !IsAnyItemHovered()) + OpenPopupEx(id, popup_flags); + return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); +} + +bool ImGui::BeginPopupContextVoid(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (!str_id) + str_id = "void_context"; + ImGuiID id = window->GetID(str_id); + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); + if (IsMouseReleased(mouse_button) && !IsWindowHovered(ImGuiHoveredFlags_AnyWindow)) + if (GetTopMostPopupModal() == NULL) + OpenPopupEx(id, popup_flags); + return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); +} + +// r_avoid = the rectangle to avoid (e.g. for tooltip it is a rectangle around the mouse cursor which we want to avoid. for popups it's a small point around the cursor.) +// r_outer = the visible area rectangle, minus safe area padding. If our popup size won't fit because of safe area padding we ignore it. +// (r_outer is usually equivalent to the viewport rectangle minus padding, but when multi-viewports are enabled and monitor +// information are available, it may represent the entire platform monitor from the frame of reference of the current viewport. +// this allows us to have tooltips/popups displayed out of the parent viewport.) +ImVec2 ImGui::FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy) +{ + ImVec2 base_pos_clamped = ImClamp(ref_pos, r_outer.Min, r_outer.Max - size); + //GetForegroundDrawList()->AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255,0,0,255)); + //GetForegroundDrawList()->AddRect(r_outer.Min, r_outer.Max, IM_COL32(0,255,0,255)); + + // Combo Box policy (we want a connecting edge) + if (policy == ImGuiPopupPositionPolicy_ComboBox) + { + const ImGuiDir dir_prefered_order[ImGuiDir_COUNT] = { ImGuiDir_Down, ImGuiDir_Right, ImGuiDir_Left, ImGuiDir_Up }; + for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_COUNT; n++) + { + const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; + if (n != -1 && dir == *last_dir) // Already tried this direction? + continue; + ImVec2 pos; + if (dir == ImGuiDir_Down) pos = ImVec2(r_avoid.Min.x, r_avoid.Max.y); // Below, Toward Right (default) + if (dir == ImGuiDir_Right) pos = ImVec2(r_avoid.Min.x, r_avoid.Min.y - size.y); // Above, Toward Right + if (dir == ImGuiDir_Left) pos = ImVec2(r_avoid.Max.x - size.x, r_avoid.Max.y); // Below, Toward Left + if (dir == ImGuiDir_Up) pos = ImVec2(r_avoid.Max.x - size.x, r_avoid.Min.y - size.y); // Above, Toward Left + if (!r_outer.Contains(ImRect(pos, pos + size))) + continue; + *last_dir = dir; + return pos; + } + } + + // Tooltip and Default popup policy + // (Always first try the direction we used on the last frame, if any) + if (policy == ImGuiPopupPositionPolicy_Tooltip || policy == ImGuiPopupPositionPolicy_Default) + { + const ImGuiDir dir_prefered_order[ImGuiDir_COUNT] = { ImGuiDir_Right, ImGuiDir_Down, ImGuiDir_Up, ImGuiDir_Left }; + for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_COUNT; n++) + { + const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; + if (n != -1 && dir == *last_dir) // Already tried this direction? + continue; + + const float avail_w = (dir == ImGuiDir_Left ? r_avoid.Min.x : r_outer.Max.x) - (dir == ImGuiDir_Right ? r_avoid.Max.x : r_outer.Min.x); + const float avail_h = (dir == ImGuiDir_Up ? r_avoid.Min.y : r_outer.Max.y) - (dir == ImGuiDir_Down ? r_avoid.Max.y : r_outer.Min.y); + + // If there not enough room on one axis, there's no point in positioning on a side on this axis (e.g. when not enough width, use a top/bottom position to maximize available width) + if (avail_w < size.x && (dir == ImGuiDir_Left || dir == ImGuiDir_Right)) + continue; + if (avail_h < size.y && (dir == ImGuiDir_Up || dir == ImGuiDir_Down)) + continue; + + ImVec2 pos; + pos.x = (dir == ImGuiDir_Left) ? r_avoid.Min.x - size.x : (dir == ImGuiDir_Right) ? r_avoid.Max.x : base_pos_clamped.x; + pos.y = (dir == ImGuiDir_Up) ? r_avoid.Min.y - size.y : (dir == ImGuiDir_Down) ? r_avoid.Max.y : base_pos_clamped.y; + + // Clamp top-left corner of popup + pos.x = ImMax(pos.x, r_outer.Min.x); + pos.y = ImMax(pos.y, r_outer.Min.y); + + *last_dir = dir; + return pos; + } + } + + // Fallback when not enough room: + *last_dir = ImGuiDir_None; + + // For tooltip we prefer avoiding the cursor at all cost even if it means that part of the tooltip won't be visible. + if (policy == ImGuiPopupPositionPolicy_Tooltip) + return ref_pos + ImVec2(2, 2); + + // Otherwise try to keep within display + ImVec2 pos = ref_pos; + pos.x = ImMax(ImMin(pos.x + size.x, r_outer.Max.x) - size.x, r_outer.Min.x); + pos.y = ImMax(ImMin(pos.y + size.y, r_outer.Max.y) - size.y, r_outer.Min.y); + return pos; +} + +// Note that this is used for popups, which can overlap the non work-area of individual viewports. +ImRect ImGui::GetPopupAllowedExtentRect(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + IM_UNUSED(window); + ImRect r_screen = ((ImGuiViewportP*)(void*)GetMainViewport())->GetMainRect(); + ImVec2 padding = g.Style.DisplaySafeAreaPadding; + r_screen.Expand(ImVec2((r_screen.GetWidth() > padding.x * 2) ? -padding.x : 0.0f, (r_screen.GetHeight() > padding.y * 2) ? -padding.y : 0.0f)); + return r_screen; +} + +ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + + ImRect r_outer = GetPopupAllowedExtentRect(window); + if (window->Flags & ImGuiWindowFlags_ChildMenu) + { + // Child menus typically request _any_ position within the parent menu item, and then we move the new menu outside the parent bounds. + // This is how we end up with child menus appearing (most-commonly) on the right of the parent menu. + IM_ASSERT(g.CurrentWindow == window); + ImGuiWindow* parent_window = g.CurrentWindowStack[g.CurrentWindowStack.Size - 2].Window; + float horizontal_overlap = g.Style.ItemInnerSpacing.x; // We want some overlap to convey the relative depth of each menu (currently the amount of overlap is hard-coded to style.ItemSpacing.x). + ImRect r_avoid; + if (parent_window->DC.MenuBarAppending) + r_avoid = ImRect(-FLT_MAX, parent_window->ClipRect.Min.y, FLT_MAX, parent_window->ClipRect.Max.y); // Avoid parent menu-bar. If we wanted multi-line menu-bar, we may instead want to have the calling window setup e.g. a NextWindowData.PosConstraintAvoidRect field + else + r_avoid = ImRect(parent_window->Pos.x + horizontal_overlap, -FLT_MAX, parent_window->Pos.x + parent_window->Size.x - horizontal_overlap - parent_window->ScrollbarSizes.x, FLT_MAX); + return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Default); + } + if (window->Flags & ImGuiWindowFlags_Popup) + { + return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, ImRect(window->Pos, window->Pos), ImGuiPopupPositionPolicy_Default); // Ideally we'd disable r_avoid here + } + if (window->Flags & ImGuiWindowFlags_Tooltip) + { + // Position tooltip (always follows mouse) + float sc = g.Style.MouseCursorScale; + ImVec2 ref_pos = NavCalcPreferredRefPos(); + ImRect r_avoid; + if (!g.NavDisableHighlight && g.NavDisableMouseHover && !(g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos)) + r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 16, ref_pos.y + 8); + else + r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * sc, ref_pos.y + 24 * sc); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important. + return FindBestWindowPosForPopupEx(ref_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip); + } + IM_ASSERT(0); + return window->Pos; +} + +//----------------------------------------------------------------------------- +// [SECTION] KEYBOARD/GAMEPAD NAVIGATION +//----------------------------------------------------------------------------- + +// FIXME-NAV: The existence of SetNavID vs SetFocusID properly needs to be clarified/reworked. +// In our terminology those should be interchangeable. Those two functions are merely a legacy artifact, so at minimum naming should be clarified. +void ImGui::SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavWindow != NULL); + IM_ASSERT(nav_layer == ImGuiNavLayer_Main || nav_layer == ImGuiNavLayer_Menu); + g.NavId = id; + g.NavLayer = nav_layer; + g.NavFocusScopeId = focus_scope_id; + g.NavWindow->NavLastIds[nav_layer] = id; + g.NavWindow->NavRectRel[nav_layer] = rect_rel; +} + +void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(id != 0); + + // Assume that SetFocusID() is called in the context where its window->DC.NavLayerCurrent and window->DC.NavFocusScopeIdCurrent are valid. + // Note that window may be != g.CurrentWindow (e.g. SetFocusID call in InputTextEx for multi-line text) + const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent; + if (g.NavWindow != window) + g.NavInitRequest = false; + g.NavWindow = window; + g.NavId = id; + g.NavLayer = nav_layer; + g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent; + window->NavLastIds[nav_layer] = id; + if (g.LastItemData.ID == id) + window->NavRectRel[nav_layer] = WindowRectAbsToRel(window, g.LastItemData.NavRect); + + if (g.ActiveIdSource == ImGuiInputSource_Nav) + g.NavDisableMouseHover = true; + else + g.NavDisableHighlight = true; +} + +ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy) +{ + if (ImFabs(dx) > ImFabs(dy)) + return (dx > 0.0f) ? ImGuiDir_Right : ImGuiDir_Left; + return (dy > 0.0f) ? ImGuiDir_Down : ImGuiDir_Up; +} + +static float inline NavScoreItemDistInterval(float a0, float a1, float b0, float b1) +{ + if (a1 < b0) + return a1 - b0; + if (b1 < a0) + return a0 - b1; + return 0.0f; +} + +static void inline NavClampRectToVisibleAreaForMoveDir(ImGuiDir move_dir, ImRect& r, const ImRect& clip_rect) +{ + if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right) + { + r.Min.y = ImClamp(r.Min.y, clip_rect.Min.y, clip_rect.Max.y); + r.Max.y = ImClamp(r.Max.y, clip_rect.Min.y, clip_rect.Max.y); + } + else // FIXME: PageUp/PageDown are leaving move_dir == None + { + r.Min.x = ImClamp(r.Min.x, clip_rect.Min.x, clip_rect.Max.x); + r.Max.x = ImClamp(r.Max.x, clip_rect.Min.x, clip_rect.Max.x); + } +} + +// Scoring function for gamepad/keyboard directional navigation. Based on https://gist.github.com/rygorous/6981057 +static bool ImGui::NavScoreItem(ImGuiNavItemData* result) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.NavLayer != window->DC.NavLayerCurrent) + return false; + + // FIXME: Those are not good variables names + ImRect cand = g.LastItemData.NavRect; // Current item nav rectangle + const ImRect curr = g.NavScoringRect; // Current modified source rect (NB: we've applied Max.x = Min.x in NavUpdate() to inhibit the effect of having varied item width) + g.NavScoringDebugCount++; + + // When entering through a NavFlattened border, we consider child window items as fully clipped for scoring + if (window->ParentWindow == g.NavWindow) + { + IM_ASSERT((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened); + if (!window->ClipRect.Overlaps(cand)) + return false; + cand.ClipWithFull(window->ClipRect); // This allows the scored item to not overlap other candidates in the parent window + } + + // We perform scoring on items bounding box clipped by the current clipping rectangle on the other axis (clipping on our movement axis would give us equal scores for all clipped items) + // For example, this ensure that items in one column are not reached when moving vertically from items in another column. + NavClampRectToVisibleAreaForMoveDir(g.NavMoveClipDir, cand, window->ClipRect); + + // Compute distance between boxes + // FIXME-NAV: Introducing biases for vertical navigation, needs to be removed. + float dbx = NavScoreItemDistInterval(cand.Min.x, cand.Max.x, curr.Min.x, curr.Max.x); + float dby = NavScoreItemDistInterval(ImLerp(cand.Min.y, cand.Max.y, 0.2f), ImLerp(cand.Min.y, cand.Max.y, 0.8f), ImLerp(curr.Min.y, curr.Max.y, 0.2f), ImLerp(curr.Min.y, curr.Max.y, 0.8f)); // Scale down on Y to keep using box-distance for vertically touching items + if (dby != 0.0f && dbx != 0.0f) + dbx = (dbx / 1000.0f) + ((dbx > 0.0f) ? +1.0f : -1.0f); + float dist_box = ImFabs(dbx) + ImFabs(dby); + + // Compute distance between centers (this is off by a factor of 2, but we only compare center distances with each other so it doesn't matter) + float dcx = (cand.Min.x + cand.Max.x) - (curr.Min.x + curr.Max.x); + float dcy = (cand.Min.y + cand.Max.y) - (curr.Min.y + curr.Max.y); + float dist_center = ImFabs(dcx) + ImFabs(dcy); // L1 metric (need this for our connectedness guarantee) + + // Determine which quadrant of 'curr' our candidate item 'cand' lies in based on distance + ImGuiDir quadrant; + float dax = 0.0f, day = 0.0f, dist_axial = 0.0f; + if (dbx != 0.0f || dby != 0.0f) + { + // For non-overlapping boxes, use distance between boxes + dax = dbx; + day = dby; + dist_axial = dist_box; + quadrant = ImGetDirQuadrantFromDelta(dbx, dby); + } + else if (dcx != 0.0f || dcy != 0.0f) + { + // For overlapping boxes with different centers, use distance between centers + dax = dcx; + day = dcy; + dist_axial = dist_center; + quadrant = ImGetDirQuadrantFromDelta(dcx, dcy); + } + else + { + // Degenerate case: two overlapping buttons with same center, break ties arbitrarily (note that LastItemId here is really the _previous_ item order, but it doesn't matter) + quadrant = (g.LastItemData.ID < g.NavId) ? ImGuiDir_Left : ImGuiDir_Right; + } + +#if IMGUI_DEBUG_NAV_SCORING + char buf[128]; + if (IsMouseHoveringRect(cand.Min, cand.Max)) + { + ImFormatString(buf, IM_ARRAYSIZE(buf), "dbox (%.2f,%.2f->%.4f)\ndcen (%.2f,%.2f->%.4f)\nd (%.2f,%.2f->%.4f)\nnav %c, quadrant %c", dbx, dby, dist_box, dcx, dcy, dist_center, dax, day, dist_axial, "WENS"[g.NavMoveDir], "WENS"[quadrant]); + ImDrawList* draw_list = GetForegroundDrawList(window); + draw_list->AddRect(curr.Min, curr.Max, IM_COL32(255,200,0,100)); + draw_list->AddRect(cand.Min, cand.Max, IM_COL32(255,255,0,200)); + draw_list->AddRectFilled(cand.Max - ImVec2(4, 4), cand.Max + CalcTextSize(buf) + ImVec2(4, 4), IM_COL32(40,0,0,150)); + draw_list->AddText(cand.Max, ~0U, buf); + } + else if (g.IO.KeyCtrl) // Hold to preview score in matching quadrant. Press C to rotate. + { + if (quadrant == g.NavMoveDir) + { + ImFormatString(buf, IM_ARRAYSIZE(buf), "%.0f/%.0f", dist_box, dist_center); + ImDrawList* draw_list = GetForegroundDrawList(window); + draw_list->AddRectFilled(cand.Min, cand.Max, IM_COL32(255, 0, 0, 200)); + draw_list->AddText(cand.Min, IM_COL32(255, 255, 255, 255), buf); + } + } +#endif + + // Is it in the quadrant we're interesting in moving to? + bool new_best = false; + const ImGuiDir move_dir = g.NavMoveDir; + if (quadrant == move_dir) + { + // Does it beat the current best candidate? + if (dist_box < result->DistBox) + { + result->DistBox = dist_box; + result->DistCenter = dist_center; + return true; + } + if (dist_box == result->DistBox) + { + // Try using distance between center points to break ties + if (dist_center < result->DistCenter) + { + result->DistCenter = dist_center; + new_best = true; + } + else if (dist_center == result->DistCenter) + { + // Still tied! we need to be extra-careful to make sure everything gets linked properly. We consistently break ties by symbolically moving "later" items + // (with higher index) to the right/downwards by an infinitesimal amount since we the current "best" button already (so it must have a lower index), + // this is fairly easy. This rule ensures that all buttons with dx==dy==0 will end up being linked in order of appearance along the x axis. + if (((move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down) ? dby : dbx) < 0.0f) // moving bj to the right/down decreases distance + new_best = true; + } + } + } + + // Axial check: if 'curr' has no link at all in some direction and 'cand' lies roughly in that direction, add a tentative link. This will only be kept if no "real" matches + // are found, so it only augments the graph produced by the above method using extra links. (important, since it doesn't guarantee strong connectedness) + // This is just to avoid buttons having no links in a particular direction when there's a suitable neighbor. you get good graphs without this too. + // 2017/09/29: FIXME: This now currently only enabled inside menu bars, ideally we'd disable it everywhere. Menus in particular need to catch failure. For general navigation it feels awkward. + // Disabling it may lead to disconnected graphs when nodes are very spaced out on different axis. Perhaps consider offering this as an option? + if (result->DistBox == FLT_MAX && dist_axial < result->DistAxial) // Check axial match + if (g.NavLayer == ImGuiNavLayer_Menu && !(g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu)) + if ((move_dir == ImGuiDir_Left && dax < 0.0f) || (move_dir == ImGuiDir_Right && dax > 0.0f) || (move_dir == ImGuiDir_Up && day < 0.0f) || (move_dir == ImGuiDir_Down && day > 0.0f)) + { + result->DistAxial = dist_axial; + new_best = true; + } + + return new_best; +} + +static void ImGui::NavApplyItemToResult(ImGuiNavItemData* result) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + result->Window = window; + result->ID = g.LastItemData.ID; + result->FocusScopeId = window->DC.NavFocusScopeIdCurrent; + result->InFlags = g.LastItemData.InFlags; + result->RectRel = WindowRectAbsToRel(window, g.LastItemData.NavRect); +} + +// We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above) +// This is called after LastItemData is set. +static void ImGui::NavProcessItem() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const ImGuiID id = g.LastItemData.ID; + const ImRect nav_bb = g.LastItemData.NavRect; + const ImGuiItemFlags item_flags = g.LastItemData.InFlags; + + // Process Init Request + if (g.NavInitRequest && g.NavLayer == window->DC.NavLayerCurrent && (item_flags & ImGuiItemFlags_Disabled) == 0) + { + // Even if 'ImGuiItemFlags_NoNavDefaultFocus' is on (typically collapse/close button) we record the first ResultId so they can be used as a fallback + const bool candidate_for_nav_default_focus = (item_flags & ImGuiItemFlags_NoNavDefaultFocus) == 0; + if (candidate_for_nav_default_focus || g.NavInitResultId == 0) + { + g.NavInitResultId = id; + g.NavInitResultRectRel = WindowRectAbsToRel(window, nav_bb); + } + if (candidate_for_nav_default_focus) + { + g.NavInitRequest = false; // Found a match, clear request + NavUpdateAnyRequestFlag(); + } + } + + // Process Move Request (scoring for navigation) + // FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRect + scoring from a rect wrapped according to current wrapping policy) + if (g.NavMoveScoringItems) + { + const bool is_tab_stop = (item_flags & ImGuiItemFlags_Inputable) && (item_flags & (ImGuiItemFlags_NoTabStop | ImGuiItemFlags_Disabled)) == 0; + const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) != 0; + if (is_tabbing) + { + if (is_tab_stop || (g.NavMoveFlags & ImGuiNavMoveFlags_FocusApi)) + NavProcessItemForTabbingRequest(id); + } + else if ((g.NavId != id || (g.NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) && !(item_flags & (ImGuiItemFlags_Disabled | ImGuiItemFlags_NoNav))) + { + ImGuiNavItemData* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther; + if (!is_tabbing) + { + if (NavScoreItem(result)) + NavApplyItemToResult(result); + + // Features like PageUp/PageDown need to maintain a separate score for the visible set of items. + const float VISIBLE_RATIO = 0.70f; + if ((g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb)) + if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO) + if (NavScoreItem(&g.NavMoveResultLocalVisible)) + NavApplyItemToResult(&g.NavMoveResultLocalVisible); + } + } + } + + // Update window-relative bounding box of navigated item + if (g.NavId == id) + { + g.NavWindow = window; // Always refresh g.NavWindow, because some operations such as FocusItem() don't have a window. + g.NavLayer = window->DC.NavLayerCurrent; + g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent; + g.NavIdIsAlive = true; + window->NavRectRel[window->DC.NavLayerCurrent] = WindowRectAbsToRel(window, nav_bb); // Store item bounding box (relative to window position) + } +} + +// Handle "scoring" of an item for a tabbing/focusing request initiated by NavUpdateCreateTabbingRequest(). +// Note that SetKeyboardFocusHere() API calls are considered tabbing requests! +// - Case 1: no nav/active id: set result to first eligible item, stop storing. +// - Case 2: tab forward: on ref id set counter, on counter elapse store result +// - Case 3: tab forward wrap: set result to first eligible item (preemptively), on ref id set counter, on next frame if counter hasn't elapsed store result. // FIXME-TABBING: Could be done as a next-frame forwarded request +// - Case 4: tab backward: store all results, on ref id pick prev, stop storing +// - Case 5: tab backward wrap: store all results, on ref id if no result keep storing until last // FIXME-TABBING: Could be done as next-frame forwarded requested +void ImGui::NavProcessItemForTabbingRequest(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + + // Always store in NavMoveResultLocal (unlike directional request which uses NavMoveResultOther on sibling/flattened windows) + ImGuiNavItemData* result = &g.NavMoveResultLocal; + if (g.NavTabbingDir == +1) + { + // Tab Forward or SetKeyboardFocusHere() with >= 0 + if (g.NavTabbingResultFirst.ID == 0) + NavApplyItemToResult(&g.NavTabbingResultFirst); + if (--g.NavTabbingCounter == 0) + NavMoveRequestResolveWithLastItem(result); + else if (g.NavId == id) + g.NavTabbingCounter = 1; + } + else if (g.NavTabbingDir == -1) + { + // Tab Backward + if (g.NavId == id) + { + if (result->ID) + { + g.NavMoveScoringItems = false; + NavUpdateAnyRequestFlag(); + } + } + else + { + NavApplyItemToResult(result); + } + } + else if (g.NavTabbingDir == 0) + { + // Tab Init + if (g.NavTabbingResultFirst.ID == 0) + NavMoveRequestResolveWithLastItem(&g.NavTabbingResultFirst); + } +} + +bool ImGui::NavMoveRequestButNoResultYet() +{ + ImGuiContext& g = *GImGui; + return g.NavMoveScoringItems && g.NavMoveResultLocal.ID == 0 && g.NavMoveResultOther.ID == 0; +} + +// FIXME: ScoringRect is not set +void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavWindow != NULL); + + if (move_flags & ImGuiNavMoveFlags_Tabbing) + move_flags |= ImGuiNavMoveFlags_AllowCurrentNavId; + + g.NavMoveSubmitted = g.NavMoveScoringItems = true; + g.NavMoveDir = move_dir; + g.NavMoveDirForDebug = move_dir; + g.NavMoveClipDir = clip_dir; + g.NavMoveFlags = move_flags; + g.NavMoveScrollFlags = scroll_flags; + g.NavMoveForwardToNextFrame = false; + g.NavMoveKeyMods = g.IO.KeyMods; + g.NavTabbingCounter = 0; + g.NavMoveResultLocal.Clear(); + g.NavMoveResultLocalVisible.Clear(); + g.NavMoveResultOther.Clear(); + NavUpdateAnyRequestFlag(); +} + +void ImGui::NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result) +{ + ImGuiContext& g = *GImGui; + g.NavMoveScoringItems = false; // Ensure request doesn't need more processing + NavApplyItemToResult(result); + NavUpdateAnyRequestFlag(); +} + +void ImGui::NavMoveRequestCancel() +{ + ImGuiContext& g = *GImGui; + g.NavMoveSubmitted = g.NavMoveScoringItems = false; + NavUpdateAnyRequestFlag(); +} + +// Forward will reuse the move request again on the next frame (generally with modifications done to it) +void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavMoveForwardToNextFrame == false); + NavMoveRequestCancel(); + g.NavMoveForwardToNextFrame = true; + g.NavMoveDir = move_dir; + g.NavMoveClipDir = clip_dir; + g.NavMoveFlags = move_flags | ImGuiNavMoveFlags_Forwarded; + g.NavMoveScrollFlags = scroll_flags; +} + +// Navigation wrap-around logic is delayed to the end of the frame because this operation is only valid after entire +// popup is assembled and in case of appended popups it is not clear which EndPopup() call is final. +void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags wrap_flags) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(wrap_flags != 0); // Call with _WrapX, _WrapY, _LoopX, _LoopY + // In theory we should test for NavMoveRequestButNoResultYet() but there's no point doing it, NavEndFrame() will do the same test + if (g.NavWindow == window && g.NavMoveScoringItems && g.NavLayer == ImGuiNavLayer_Main) + g.NavMoveFlags |= wrap_flags; +} + +// FIXME: This could be replaced by updating a frame number in each window when (window == NavWindow) and (NavLayer == 0). +// This way we could find the last focused window among our children. It would be much less confusing this way? +static void ImGui::NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window) +{ + ImGuiWindow* parent = nav_window; + while (parent && parent->RootWindow != parent && (parent->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0) + parent = parent->ParentWindow; + if (parent && parent != nav_window) + parent->NavLastChildNavWindow = nav_window; +} + +// Restore the last focused child. +// Call when we are expected to land on the Main Layer (0) after FocusWindow() +static ImGuiWindow* ImGui::NavRestoreLastChildNavWindow(ImGuiWindow* window) +{ + if (window->NavLastChildNavWindow && window->NavLastChildNavWindow->WasActive) + return window->NavLastChildNavWindow; + return window; +} + +void ImGui::NavRestoreLayer(ImGuiNavLayer layer) +{ + ImGuiContext& g = *GImGui; + if (layer == ImGuiNavLayer_Main) + g.NavWindow = NavRestoreLastChildNavWindow(g.NavWindow); + ImGuiWindow* window = g.NavWindow; + if (window->NavLastIds[layer] != 0) + { + SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); + } + else + { + g.NavLayer = layer; + NavInitWindow(window, true); + } +} + +void ImGui::NavRestoreHighlightAfterMove() +{ + ImGuiContext& g = *GImGui; + g.NavDisableHighlight = false; + g.NavDisableMouseHover = g.NavMousePosDirty = true; +} + +static inline void ImGui::NavUpdateAnyRequestFlag() +{ + ImGuiContext& g = *GImGui; + g.NavAnyRequest = g.NavMoveScoringItems || g.NavInitRequest || (IMGUI_DEBUG_NAV_SCORING && g.NavWindow != NULL); + if (g.NavAnyRequest) + IM_ASSERT(g.NavWindow != NULL); +} + +// This needs to be called before we submit any widget (aka in or before Begin) +void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(window == g.NavWindow); + + if (window->Flags & ImGuiWindowFlags_NoNavInputs) + { + g.NavId = g.NavFocusScopeId = 0; + return; + } + + bool init_for_nav = false; + if (window == window->RootWindow || (window->Flags & ImGuiWindowFlags_Popup) || (window->NavLastIds[0] == 0) || force_reinit) + init_for_nav = true; + IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from NavInitWindow(), init_for_nav=%d, window=\"%s\", layer=%d\n", init_for_nav, window->Name, g.NavLayer); + if (init_for_nav) + { + SetNavID(0, g.NavLayer, 0, ImRect()); + g.NavInitRequest = true; + g.NavInitRequestFromMove = false; + g.NavInitResultId = 0; + g.NavInitResultRectRel = ImRect(); + NavUpdateAnyRequestFlag(); + } + else + { + g.NavId = window->NavLastIds[0]; + g.NavFocusScopeId = 0; + } +} + +static ImVec2 ImGui::NavCalcPreferredRefPos() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.NavWindow; + if (g.NavDisableHighlight || !g.NavDisableMouseHover || !window) + { + // Mouse (we need a fallback in case the mouse becomes invalid after being used) + // The +1.0f offset when stored by OpenPopupEx() allows reopening this or another popup (same or another mouse button) while not moving the mouse, it is pretty standard. + // In theory we could move that +1.0f offset in OpenPopupEx() + ImVec2 p = IsMousePosValid(&g.IO.MousePos) ? g.IO.MousePos : g.MouseLastValidPos; + return ImVec2(p.x + 1.0f, p.y); + } + else + { + // When navigation is active and mouse is disabled, pick a position around the bottom left of the currently navigated item + // Take account of upcoming scrolling (maybe set mouse pos should be done in EndFrame?) + ImRect rect_rel = WindowRectRelToAbs(window, window->NavRectRel[g.NavLayer]); + if (window->LastFrameActive != g.FrameCount && (window->ScrollTarget.x != FLT_MAX || window->ScrollTarget.y != FLT_MAX)) + { + ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); + rect_rel.Translate(window->Scroll - next_scroll); + } + ImVec2 pos = ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x * 4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight())); + ImGuiViewport* viewport = GetMainViewport(); + return ImFloor(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImFloor() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta. + } +} + +const char* ImGui::GetNavInputName(ImGuiNavInput n) +{ + static const char* names[] = + { + "Activate", "Cancel", "Input", "Menu", "DpadLeft", "DpadRight", "DpadUp", "DpadDown", "LStickLeft", "LStickRight", "LStickUp", "LStickDown", + "FocusPrev", "FocusNext", "TweakSlow", "TweakFast", "KeyLeft", "KeyRight", "KeyUp", "KeyDown" + }; + IM_ASSERT(IM_ARRAYSIZE(names) == ImGuiNavInput_COUNT); + IM_ASSERT(n >= 0 && n < ImGuiNavInput_COUNT); + return names[n]; +} + +float ImGui::GetNavInputAmount(ImGuiNavInput n, ImGuiNavReadMode mode) +{ + ImGuiContext& g = *GImGui; + if (mode == ImGuiNavReadMode_Down) + return g.IO.NavInputs[n]; // Instant, read analog input (0.0f..1.0f, as provided by user) + + const float t = g.IO.NavInputsDownDuration[n]; + if (t < 0.0f && mode == ImGuiNavReadMode_Released) // Return 1.0f when just released, no repeat, ignore analog input. + return (g.IO.NavInputsDownDurationPrev[n] >= 0.0f ? 1.0f : 0.0f); + if (t < 0.0f) + return 0.0f; + if (mode == ImGuiNavReadMode_Pressed) // Return 1.0f when just pressed, no repeat, ignore analog input. + return (t == 0.0f) ? 1.0f : 0.0f; + if (mode == ImGuiNavReadMode_Repeat) + return (float)CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay * 0.72f, g.IO.KeyRepeatRate * 0.80f); + if (mode == ImGuiNavReadMode_RepeatSlow) + return (float)CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay * 1.25f, g.IO.KeyRepeatRate * 2.00f); + if (mode == ImGuiNavReadMode_RepeatFast) + return (float)CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay * 0.72f, g.IO.KeyRepeatRate * 0.30f); + return 0.0f; +} + +ImVec2 ImGui::GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiNavReadMode mode, float slow_factor, float fast_factor) +{ + ImVec2 delta(0.0f, 0.0f); + if (dir_sources & ImGuiNavDirSourceFlags_RawKeyboard) + delta += ImVec2((float)IsKeyDown(ImGuiKey_RightArrow) - (float)IsKeyDown(ImGuiKey_LeftArrow), (float)IsKeyDown(ImGuiKey_DownArrow) - (float)IsKeyDown(ImGuiKey_UpArrow)); + if (dir_sources & ImGuiNavDirSourceFlags_Keyboard) + delta += ImVec2(GetNavInputAmount(ImGuiNavInput_KeyRight_, mode) - GetNavInputAmount(ImGuiNavInput_KeyLeft_, mode), GetNavInputAmount(ImGuiNavInput_KeyDown_, mode) - GetNavInputAmount(ImGuiNavInput_KeyUp_, mode)); + if (dir_sources & ImGuiNavDirSourceFlags_PadDPad) + delta += ImVec2(GetNavInputAmount(ImGuiNavInput_DpadRight, mode) - GetNavInputAmount(ImGuiNavInput_DpadLeft, mode), GetNavInputAmount(ImGuiNavInput_DpadDown, mode) - GetNavInputAmount(ImGuiNavInput_DpadUp, mode)); + if (dir_sources & ImGuiNavDirSourceFlags_PadLStick) + delta += ImVec2(GetNavInputAmount(ImGuiNavInput_LStickRight, mode) - GetNavInputAmount(ImGuiNavInput_LStickLeft, mode), GetNavInputAmount(ImGuiNavInput_LStickDown, mode) - GetNavInputAmount(ImGuiNavInput_LStickUp, mode)); + if (slow_factor != 0.0f && IsNavInputDown(ImGuiNavInput_TweakSlow)) + delta *= slow_factor; + if (fast_factor != 0.0f && IsNavInputDown(ImGuiNavInput_TweakFast)) + delta *= fast_factor; + return delta; +} + +static void ImGui::NavUpdate() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + io.WantSetMousePos = false; + //if (g.NavScoringDebugCount > 0) IMGUI_DEBUG_LOG("NavScoringDebugCount %d for '%s' layer %d (Init:%d, Move:%d)\n", g.NavScoringDebugCount, g.NavWindow ? g.NavWindow->Name : "NULL", g.NavLayer, g.NavInitRequest || g.NavInitResultId != 0, g.NavMoveRequest); + + // Update Gamepad->Nav inputs mapping + // Set input source as Gamepad when buttons are pressed (as some features differs when used with Gamepad vs Keyboard) + const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; + if (nav_gamepad_active && g.IO.BackendUsingLegacyNavInputArray == false) + { + for (int n = 0; n < ImGuiNavInput_COUNT; n++) + IM_ASSERT(io.NavInputs[n] == 0.0f && "Backend needs to either only use io.AddKeyEvent()/io.AddKeyAnalogEvent(), either only fill legacy io.NavInputs[]. Not both!"); + #define NAV_MAP_KEY(_KEY, _NAV_INPUT, _ACTIVATE_NAV) do { io.NavInputs[_NAV_INPUT] = io.KeysData[_KEY - ImGuiKey_KeysData_OFFSET].AnalogValue; if (_ACTIVATE_NAV && io.NavInputs[_NAV_INPUT] > 0.0f) { g.NavInputSource = ImGuiInputSource_Gamepad; } } while (0) + NAV_MAP_KEY(ImGuiKey_GamepadFaceDown, ImGuiNavInput_Activate, true); + NAV_MAP_KEY(ImGuiKey_GamepadFaceRight, ImGuiNavInput_Cancel, true); + NAV_MAP_KEY(ImGuiKey_GamepadFaceLeft, ImGuiNavInput_Menu, true); + NAV_MAP_KEY(ImGuiKey_GamepadFaceUp, ImGuiNavInput_Input, true); + NAV_MAP_KEY(ImGuiKey_GamepadDpadLeft, ImGuiNavInput_DpadLeft, true); + NAV_MAP_KEY(ImGuiKey_GamepadDpadRight, ImGuiNavInput_DpadRight, true); + NAV_MAP_KEY(ImGuiKey_GamepadDpadUp, ImGuiNavInput_DpadUp, true); + NAV_MAP_KEY(ImGuiKey_GamepadDpadDown, ImGuiNavInput_DpadDown, true); + NAV_MAP_KEY(ImGuiKey_GamepadL1, ImGuiNavInput_FocusPrev, false); + NAV_MAP_KEY(ImGuiKey_GamepadR1, ImGuiNavInput_FocusNext, false); + NAV_MAP_KEY(ImGuiKey_GamepadL1, ImGuiNavInput_TweakSlow, false); + NAV_MAP_KEY(ImGuiKey_GamepadR1, ImGuiNavInput_TweakFast, false); + NAV_MAP_KEY(ImGuiKey_GamepadLStickLeft, ImGuiNavInput_LStickLeft, false); + NAV_MAP_KEY(ImGuiKey_GamepadLStickRight, ImGuiNavInput_LStickRight, false); + NAV_MAP_KEY(ImGuiKey_GamepadLStickUp, ImGuiNavInput_LStickUp, false); + NAV_MAP_KEY(ImGuiKey_GamepadLStickDown, ImGuiNavInput_LStickDown, false); + #undef NAV_MAP_KEY + } + + // Update Keyboard->Nav inputs mapping + const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; + if (nav_keyboard_active) + { + #define NAV_MAP_KEY(_KEY, _NAV_INPUT) do { if (IsKeyDown(_KEY)) { io.NavInputs[_NAV_INPUT] = 1.0f; g.NavInputSource = ImGuiInputSource_Keyboard; } } while (0) + NAV_MAP_KEY(ImGuiKey_Space, ImGuiNavInput_Activate ); + NAV_MAP_KEY(ImGuiKey_Enter, ImGuiNavInput_Input ); + NAV_MAP_KEY(ImGuiKey_Escape, ImGuiNavInput_Cancel ); + NAV_MAP_KEY(ImGuiKey_LeftArrow, ImGuiNavInput_KeyLeft_ ); + NAV_MAP_KEY(ImGuiKey_RightArrow,ImGuiNavInput_KeyRight_); + NAV_MAP_KEY(ImGuiKey_UpArrow, ImGuiNavInput_KeyUp_ ); + NAV_MAP_KEY(ImGuiKey_DownArrow, ImGuiNavInput_KeyDown_ ); + if (io.KeyCtrl) + io.NavInputs[ImGuiNavInput_TweakSlow] = 1.0f; + if (io.KeyShift) + io.NavInputs[ImGuiNavInput_TweakFast] = 1.0f; + #undef NAV_MAP_KEY + } + memcpy(io.NavInputsDownDurationPrev, io.NavInputsDownDuration, sizeof(io.NavInputsDownDuration)); + for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) + io.NavInputsDownDuration[i] = (io.NavInputs[i] > 0.0f) ? (io.NavInputsDownDuration[i] < 0.0f ? 0.0f : io.NavInputsDownDuration[i] + io.DeltaTime) : -1.0f; + + // Process navigation init request (select first/default focus) + if (g.NavInitResultId != 0) + NavInitRequestApplyResult(); + g.NavInitRequest = false; + g.NavInitRequestFromMove = false; + g.NavInitResultId = 0; + g.NavJustMovedToId = 0; + + // Process navigation move request + if (g.NavMoveSubmitted) + NavMoveRequestApplyResult(); + g.NavTabbingCounter = 0; + g.NavMoveSubmitted = g.NavMoveScoringItems = false; + + // Schedule mouse position update (will be done at the bottom of this function, after 1) processing all move requests and 2) updating scrolling) + bool set_mouse_pos = false; + if (g.NavMousePosDirty && g.NavIdIsAlive) + if (!g.NavDisableHighlight && g.NavDisableMouseHover && g.NavWindow) + set_mouse_pos = true; + g.NavMousePosDirty = false; + IM_ASSERT(g.NavLayer == ImGuiNavLayer_Main || g.NavLayer == ImGuiNavLayer_Menu); + + // Store our return window (for returning from Menu Layer to Main Layer) and clear it as soon as we step back in our own Layer 0 + if (g.NavWindow) + NavSaveLastChildNavWindowIntoParent(g.NavWindow); + if (g.NavWindow && g.NavWindow->NavLastChildNavWindow != NULL && g.NavLayer == ImGuiNavLayer_Main) + g.NavWindow->NavLastChildNavWindow = NULL; + + // Update CTRL+TAB and Windowing features (hold Square to move/resize/etc.) + NavUpdateWindowing(); + + // Set output flags for user application + io.NavActive = (nav_keyboard_active || nav_gamepad_active) && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs); + io.NavVisible = (io.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL); + + // Process NavCancel input (to close a popup, get back to parent, clear focus) + NavUpdateCancelRequest(); + + // Process manual activation request + g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavActivateInputId = 0; + g.NavActivateFlags = ImGuiActivateFlags_None; + if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) + { + bool activate_down = IsNavInputDown(ImGuiNavInput_Activate); + bool input_down = IsNavInputDown(ImGuiNavInput_Input); + bool activate_pressed = activate_down && IsNavInputTest(ImGuiNavInput_Activate, ImGuiNavReadMode_Pressed); + bool input_pressed = input_down && IsNavInputTest(ImGuiNavInput_Input, ImGuiNavReadMode_Pressed); + if (g.ActiveId == 0 && activate_pressed) + { + g.NavActivateId = g.NavId; + g.NavActivateFlags = ImGuiActivateFlags_PreferTweak; + } + if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && input_pressed) + { + g.NavActivateInputId = g.NavId; + g.NavActivateFlags = ImGuiActivateFlags_PreferInput; + } + if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_down) + g.NavActivateDownId = g.NavId; + if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_pressed) + g.NavActivatePressedId = g.NavId; + } + if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) + g.NavDisableHighlight = true; + if (g.NavActivateId != 0) + IM_ASSERT(g.NavActivateDownId == g.NavActivateId); + + // Process programmatic activation request + // FIXME-NAV: Those should eventually be queued (unlike focus they don't cancel each others) + if (g.NavNextActivateId != 0) + { + if (g.NavNextActivateFlags & ImGuiActivateFlags_PreferInput) + g.NavActivateInputId = g.NavNextActivateId; + else + g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavNextActivateId; + g.NavActivateFlags = g.NavNextActivateFlags; + } + g.NavNextActivateId = 0; + + // Process move requests + NavUpdateCreateMoveRequest(); + if (g.NavMoveDir == ImGuiDir_None) + NavUpdateCreateTabbingRequest(); + NavUpdateAnyRequestFlag(); + g.NavIdIsAlive = false; + + // Scrolling + if (g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.NavWindowingTarget) + { + // *Fallback* manual-scroll with Nav directional keys when window has no navigable item + ImGuiWindow* window = g.NavWindow; + const float scroll_speed = IM_ROUND(window->CalcFontSize() * 100 * io.DeltaTime); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported. + const ImGuiDir move_dir = g.NavMoveDir; + if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavHasScroll && move_dir != ImGuiDir_None) + { + if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right) + SetScrollX(window, ImFloor(window->Scroll.x + ((move_dir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed)); + if (move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down) + SetScrollY(window, ImFloor(window->Scroll.y + ((move_dir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed)); + } + + // *Normal* Manual scroll with NavScrollXXX keys + // Next movement request will clamp the NavId reference rectangle to the visible area, so navigation will resume within those bounds. + ImVec2 scroll_dir = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadLStick, ImGuiNavReadMode_Down, 1.0f / 10.0f, 10.0f); + if (scroll_dir.x != 0.0f && window->ScrollbarX) + SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed)); + if (scroll_dir.y != 0.0f) + SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed)); + } + + // Always prioritize mouse highlight if navigation is disabled + if (!nav_keyboard_active && !nav_gamepad_active) + { + g.NavDisableHighlight = true; + g.NavDisableMouseHover = set_mouse_pos = false; + } + + // Update mouse position if requested + // (This will take into account the possibility that a Scroll was queued in the window to offset our absolute mouse position before scroll has been applied) + if (set_mouse_pos && (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) && (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos)) + { + io.MousePos = io.MousePosPrev = NavCalcPreferredRefPos(); + io.WantSetMousePos = true; + //IMGUI_DEBUG_LOG("SetMousePos: (%.1f,%.1f)\n", io.MousePos.x, io.MousePos.y); + } + + // [DEBUG] + g.NavScoringDebugCount = 0; +#if IMGUI_DEBUG_NAV_RECTS + if (g.NavWindow) + { + ImDrawList* draw_list = GetForegroundDrawList(g.NavWindow); + if (1) { for (int layer = 0; layer < 2; layer++) { ImRect r = WindowRectRelToAbs(g.NavWindow, g.NavWindow->NavRectRel[layer]); draw_list->AddRect(r.Min, r.Max, IM_COL32(255,200,0,255)); } } // [DEBUG] + if (1) { ImU32 col = (!g.NavWindow->Hidden) ? IM_COL32(255,0,255,255) : IM_COL32(255,0,0,255); ImVec2 p = NavCalcPreferredRefPos(); char buf[32]; ImFormatString(buf, 32, "%d", g.NavLayer); draw_list->AddCircleFilled(p, 3.0f, col); draw_list->AddText(NULL, 13.0f, p + ImVec2(8,-4), col, buf); } + } +#endif +} + +void ImGui::NavInitRequestApplyResult() +{ + // In very rare cases g.NavWindow may be null (e.g. clearing focus after requesting an init request, which does happen when releasing Alt while clicking on void) + ImGuiContext& g = *GImGui; + if (!g.NavWindow) + return; + + // Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called) + // FIXME-NAV: On _NavFlattened windows, g.NavWindow will only be updated during subsequent frame. Not a problem currently. + IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: result NavID 0x%08X in Layer %d Window \"%s\"\n", g.NavInitResultId, g.NavLayer, g.NavWindow->Name); + SetNavID(g.NavInitResultId, g.NavLayer, 0, g.NavInitResultRectRel); + g.NavIdIsAlive = true; // Mark as alive from previous frame as we got a result + if (g.NavInitRequestFromMove) + NavRestoreHighlightAfterMove(); +} + +void ImGui::NavUpdateCreateMoveRequest() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + ImGuiWindow* window = g.NavWindow; + + if (g.NavMoveForwardToNextFrame && window != NULL) + { + // Forwarding previous request (which has been modified, e.g. wrap around menus rewrite the requests with a starting rectangle at the other side of the window) + // (preserve most state, which were already set by the NavMoveRequestForward() function) + IM_ASSERT(g.NavMoveDir != ImGuiDir_None && g.NavMoveClipDir != ImGuiDir_None); + IM_ASSERT(g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded); + IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequestForward %d\n", g.NavMoveDir); + } + else + { + // Initiate directional inputs request + g.NavMoveDir = ImGuiDir_None; + g.NavMoveFlags = ImGuiNavMoveFlags_None; + g.NavMoveScrollFlags = ImGuiScrollFlags_None; + if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs)) + { + const ImGuiNavReadMode read_mode = ImGuiNavReadMode_Repeat; + if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && (IsNavInputTest(ImGuiNavInput_DpadLeft, read_mode) || IsNavInputTest(ImGuiNavInput_KeyLeft_, read_mode))) { g.NavMoveDir = ImGuiDir_Left; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && (IsNavInputTest(ImGuiNavInput_DpadRight, read_mode) || IsNavInputTest(ImGuiNavInput_KeyRight_, read_mode))) { g.NavMoveDir = ImGuiDir_Right; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && (IsNavInputTest(ImGuiNavInput_DpadUp, read_mode) || IsNavInputTest(ImGuiNavInput_KeyUp_, read_mode))) { g.NavMoveDir = ImGuiDir_Up; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && (IsNavInputTest(ImGuiNavInput_DpadDown, read_mode) || IsNavInputTest(ImGuiNavInput_KeyDown_, read_mode))) { g.NavMoveDir = ImGuiDir_Down; } + } + g.NavMoveClipDir = g.NavMoveDir; + g.NavScoringNoClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); + } + + // Update PageUp/PageDown/Home/End scroll + // FIXME-NAV: Consider enabling those keys even without the master ImGuiConfigFlags_NavEnableKeyboard flag? + const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; + float scoring_rect_offset_y = 0.0f; + if (window && g.NavMoveDir == ImGuiDir_None && nav_keyboard_active) + scoring_rect_offset_y = NavUpdatePageUpPageDown(); + if (scoring_rect_offset_y != 0.0f) + { + g.NavScoringNoClipRect = window->InnerRect; + g.NavScoringNoClipRect.TranslateY(scoring_rect_offset_y); + } + + // [DEBUG] Always send a request +#if IMGUI_DEBUG_NAV_SCORING + if (io.KeyCtrl && IsKeyPressed(ImGuiKey_C)) + g.NavMoveDirForDebug = (ImGuiDir)((g.NavMoveDirForDebug + 1) & 3); + if (io.KeyCtrl && g.NavMoveDir == ImGuiDir_None) + { + g.NavMoveDir = g.NavMoveDirForDebug; + g.NavMoveFlags |= ImGuiNavMoveFlags_DebugNoResult; + } +#endif + + // Submit + g.NavMoveForwardToNextFrame = false; + if (g.NavMoveDir != ImGuiDir_None) + NavMoveRequestSubmit(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags, g.NavMoveScrollFlags); + + // Moving with no reference triggers a init request (will be used as a fallback if the direction fails to find a match) + if (g.NavMoveSubmitted && g.NavId == 0) + { + IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from move, window \"%s\", layer=%d\n", g.NavWindow->Name, g.NavLayer); + g.NavInitRequest = g.NavInitRequestFromMove = true; + g.NavInitResultId = 0; + g.NavDisableHighlight = false; + } + + // When using gamepad, we project the reference nav bounding box into window visible area. + // This is to allow resuming navigation inside the visible area after doing a large amount of scrolling, since with gamepad every movements are relative + // (can't focus a visible object like we can with the mouse). + if (g.NavMoveSubmitted && g.NavInputSource == ImGuiInputSource_Gamepad && g.NavLayer == ImGuiNavLayer_Main && window != NULL)// && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded)) + { + bool clamp_x = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapX)) == 0; + bool clamp_y = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapY)) == 0; + ImRect inner_rect_rel = WindowRectAbsToRel(window, ImRect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1))); + if ((clamp_x || clamp_y) && !inner_rect_rel.Contains(window->NavRectRel[g.NavLayer])) + { + IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: clamp NavRectRel for gamepad move\n"); + float pad_x = ImMin(inner_rect_rel.GetWidth(), window->CalcFontSize() * 0.5f); + float pad_y = ImMin(inner_rect_rel.GetHeight(), window->CalcFontSize() * 0.5f); // Terrible approximation for the intent of starting navigation from first fully visible item + inner_rect_rel.Min.x = clamp_x ? (inner_rect_rel.Min.x + pad_x) : -FLT_MAX; + inner_rect_rel.Max.x = clamp_x ? (inner_rect_rel.Max.x - pad_x) : +FLT_MAX; + inner_rect_rel.Min.y = clamp_y ? (inner_rect_rel.Min.y + pad_y) : -FLT_MAX; + inner_rect_rel.Max.y = clamp_y ? (inner_rect_rel.Max.y - pad_y) : +FLT_MAX; + window->NavRectRel[g.NavLayer].ClipWithFull(inner_rect_rel); + g.NavId = g.NavFocusScopeId = 0; + } + } + + // For scoring we use a single segment on the left side our current item bounding box (not touching the edge to avoid box overlap with zero-spaced items) + ImRect scoring_rect; + if (window != NULL) + { + ImRect nav_rect_rel = !window->NavRectRel[g.NavLayer].IsInverted() ? window->NavRectRel[g.NavLayer] : ImRect(0, 0, 0, 0); + scoring_rect = WindowRectRelToAbs(window, nav_rect_rel); + scoring_rect.TranslateY(scoring_rect_offset_y); + scoring_rect.Min.x = ImMin(scoring_rect.Min.x + 1.0f, scoring_rect.Max.x); + scoring_rect.Max.x = scoring_rect.Min.x; + IM_ASSERT(!scoring_rect.IsInverted()); // Ensure if we have a finite, non-inverted bounding box here will allows us to remove extraneous ImFabs() calls in NavScoreItem(). + //GetForegroundDrawList()->AddRect(scoring_rect.Min, scoring_rect.Max, IM_COL32(255,200,0,255)); // [DEBUG] + //if (!g.NavScoringNoClipRect.IsInverted()) { GetForegroundDrawList()->AddRect(g.NavScoringNoClipRect.Min, g.NavScoringNoClipRect.Max, IM_COL32(255, 200, 0, 255)); } // [DEBUG] + } + g.NavScoringRect = scoring_rect; + g.NavScoringNoClipRect.Add(scoring_rect); +} + +void ImGui::NavUpdateCreateTabbingRequest() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.NavWindow; + IM_ASSERT(g.NavMoveDir == ImGuiDir_None); + if (window == NULL || g.NavWindowingTarget != NULL || (window->Flags & ImGuiWindowFlags_NoNavInputs)) + return; + + const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, true) && !IsActiveIdUsingKey(ImGuiKey_Tab) && !g.IO.KeyCtrl && !g.IO.KeyAlt; + if (!tab_pressed) + return; + + // Initiate tabbing request + // (this is ALWAYS ENABLED, regardless of ImGuiConfigFlags_NavEnableKeyboard flag!) + // Initially this was designed to use counters and modulo arithmetic, but that could not work with unsubmitted items (list clipper). Instead we use a strategy close to other move requests. + // See NavProcessItemForTabbingRequest() for a description of the various forward/backward tabbing cases with and without wrapping. + //// FIXME: We use (g.ActiveId == 0) but (g.NavDisableHighlight == false) might be righter once we can tab through anything + g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.ActiveId == 0) ? 0 : +1; + ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; + ImGuiDir clip_dir = (g.NavTabbingDir < 0) ? ImGuiDir_Up : ImGuiDir_Down; + NavMoveRequestSubmit(ImGuiDir_None, clip_dir, ImGuiNavMoveFlags_Tabbing, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. + g.NavTabbingResultFirst.Clear(); + g.NavTabbingCounter = -1; +} + +// Apply result from previous frame navigation directional move request. Always called from NavUpdate() +void ImGui::NavMoveRequestApplyResult() +{ + ImGuiContext& g = *GImGui; +#if IMGUI_DEBUG_NAV_SCORING + if (g.NavMoveFlags & ImGuiNavMoveFlags_DebugNoResult) // [DEBUG] Scoring all items in NavWindow at all times + return; +#endif + + // Select which result to use + ImGuiNavItemData* result = (g.NavMoveResultLocal.ID != 0) ? &g.NavMoveResultLocal : (g.NavMoveResultOther.ID != 0) ? &g.NavMoveResultOther : NULL; + + // Tabbing forward wrap + if (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) + if ((g.NavTabbingCounter == 1 || g.NavTabbingDir == 0) && g.NavTabbingResultFirst.ID) + result = &g.NavTabbingResultFirst; + + // In a situation when there is no results but NavId != 0, re-enable the Navigation highlight (because g.NavId is not considered as a possible result) + if (result == NULL) + { + if (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) + g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; + if (g.NavId != 0 && (g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) + NavRestoreHighlightAfterMove(); + return; + } + + // PageUp/PageDown behavior first jumps to the bottom/top mostly visible item, _otherwise_ use the result from the previous/next page. + if (g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) + if (g.NavMoveResultLocalVisible.ID != 0 && g.NavMoveResultLocalVisible.ID != g.NavId) + result = &g.NavMoveResultLocalVisible; + + // Maybe entering a flattened child from the outside? In this case solve the tie using the regular scoring rules. + if (result != &g.NavMoveResultOther && g.NavMoveResultOther.ID != 0 && g.NavMoveResultOther.Window->ParentWindow == g.NavWindow) + if ((g.NavMoveResultOther.DistBox < result->DistBox) || (g.NavMoveResultOther.DistBox == result->DistBox && g.NavMoveResultOther.DistCenter < result->DistCenter)) + result = &g.NavMoveResultOther; + IM_ASSERT(g.NavWindow && result->Window); + + // Scroll to keep newly navigated item fully into view. + if (g.NavLayer == ImGuiNavLayer_Main) + { + if (g.NavMoveFlags & ImGuiNavMoveFlags_ScrollToEdgeY) + { + // FIXME: Should remove this + float scroll_target = (g.NavMoveDir == ImGuiDir_Up) ? result->Window->ScrollMax.y : 0.0f; + SetScrollY(result->Window, scroll_target); + } + else + { + ImRect rect_abs = WindowRectRelToAbs(result->Window, result->RectRel); + ScrollToRectEx(result->Window, rect_abs, g.NavMoveScrollFlags); + } + } + + g.NavWindow = result->Window; + if (g.ActiveId != result->ID) + ClearActiveID(); + if (g.NavId != result->ID) + { + // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) + g.NavJustMovedToId = result->ID; + g.NavJustMovedToFocusScopeId = result->FocusScopeId; + g.NavJustMovedToKeyMods = g.NavMoveKeyMods; + } + + // Focus + IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: result NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name); + SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel); + + // Tabbing: Activates Inputable or Focus non-Inputable + if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && (result->InFlags & ImGuiItemFlags_Inputable)) + { + g.NavNextActivateId = result->ID; + g.NavNextActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_TryToPreserveState; + g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; + } + + // Activate + if (g.NavMoveFlags & ImGuiNavMoveFlags_Activate) + { + g.NavNextActivateId = result->ID; + g.NavNextActivateFlags = ImGuiActivateFlags_None; + } + + // Enable nav highlight + if ((g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) + NavRestoreHighlightAfterMove(); +} + +// Process NavCancel input (to close a popup, get back to parent, clear focus) +// FIXME: In order to support e.g. Escape to clear a selection we'll need: +// - either to store the equivalent of ActiveIdUsingKeyInputMask for a FocusScope and test for it. +// - either to move most/all of those tests to the epilogue/end functions of the scope they are dealing with (e.g. exit child window in EndChild()) or in EndFrame(), to allow an earlier intercept +static void ImGui::NavUpdateCancelRequest() +{ + ImGuiContext& g = *GImGui; + if (!IsNavInputTest(ImGuiNavInput_Cancel, ImGuiNavReadMode_Pressed)) + return; + + IMGUI_DEBUG_LOG_NAV("[nav] ImGuiNavInput_Cancel\n"); + if (g.ActiveId != 0) + { + if (!IsActiveIdUsingNavInput(ImGuiNavInput_Cancel)) + ClearActiveID(); + } + else if (g.NavLayer != ImGuiNavLayer_Main) + { + // Leave the "menu" layer + NavRestoreLayer(ImGuiNavLayer_Main); + NavRestoreHighlightAfterMove(); + } + else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow) + { + // Exit child window + ImGuiWindow* child_window = g.NavWindow; + ImGuiWindow* parent_window = g.NavWindow->ParentWindow; + IM_ASSERT(child_window->ChildId != 0); + ImRect child_rect = child_window->Rect(); + FocusWindow(parent_window); + SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, WindowRectAbsToRel(parent_window, child_rect)); + NavRestoreHighlightAfterMove(); + } + else if (g.OpenPopupStack.Size > 0) + { + // Close open popup/menu + if (!(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal)) + ClosePopupToLevel(g.OpenPopupStack.Size - 1, true); + } + else + { + // Clear NavLastId for popups but keep it for regular child window so we can leave one and come back where we were + if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup) || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow))) + g.NavWindow->NavLastIds[0] = 0; + g.NavId = g.NavFocusScopeId = 0; + } +} + +// Handle PageUp/PageDown/Home/End keys +// Called from NavUpdateCreateMoveRequest() which will use our output to create a move request +// FIXME-NAV: This doesn't work properly with NavFlattened siblings as we use NavWindow rectangle for reference +// FIXME-NAV: how to get Home/End to aim at the beginning/end of a 2D grid? +static float ImGui::NavUpdatePageUpPageDown() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.NavWindow; + if ((window->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL) + return 0.0f; + + const bool page_up_held = IsKeyDown(ImGuiKey_PageUp) && !IsActiveIdUsingKey(ImGuiKey_PageUp); + const bool page_down_held = IsKeyDown(ImGuiKey_PageDown) && !IsActiveIdUsingKey(ImGuiKey_PageDown); + const bool home_pressed = IsKeyPressed(ImGuiKey_Home) && !IsActiveIdUsingKey(ImGuiKey_Home); + const bool end_pressed = IsKeyPressed(ImGuiKey_End) && !IsActiveIdUsingKey(ImGuiKey_End); + if (page_up_held == page_down_held && home_pressed == end_pressed) // Proceed if either (not both) are pressed, otherwise early out + return 0.0f; + + if (g.NavLayer != ImGuiNavLayer_Main) + NavRestoreLayer(ImGuiNavLayer_Main); + + if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavHasScroll) + { + // Fallback manual-scroll when window has no navigable item + if (IsKeyPressed(ImGuiKey_PageUp, true)) + SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight()); + else if (IsKeyPressed(ImGuiKey_PageDown, true)) + SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight()); + else if (home_pressed) + SetScrollY(window, 0.0f); + else if (end_pressed) + SetScrollY(window, window->ScrollMax.y); + } + else + { + ImRect& nav_rect_rel = window->NavRectRel[g.NavLayer]; + const float page_offset_y = ImMax(0.0f, window->InnerRect.GetHeight() - window->CalcFontSize() * 1.0f + nav_rect_rel.GetHeight()); + float nav_scoring_rect_offset_y = 0.0f; + if (IsKeyPressed(ImGuiKey_PageUp, true)) + { + nav_scoring_rect_offset_y = -page_offset_y; + g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset up, we request the down direction (so we can always land on the last item) + g.NavMoveClipDir = ImGuiDir_Up; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; + } + else if (IsKeyPressed(ImGuiKey_PageDown, true)) + { + nav_scoring_rect_offset_y = +page_offset_y; + g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset down, we request the up direction (so we can always land on the last item) + g.NavMoveClipDir = ImGuiDir_Down; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; + } + else if (home_pressed) + { + // FIXME-NAV: handling of Home/End is assuming that the top/bottom most item will be visible with Scroll.y == 0/ScrollMax.y + // Scrolling will be handled via the ImGuiNavMoveFlags_ScrollToEdgeY flag, we don't scroll immediately to avoid scrolling happening before nav result. + // Preserve current horizontal position if we have any. + nav_rect_rel.Min.y = nav_rect_rel.Max.y = 0.0f; + if (nav_rect_rel.IsInverted()) + nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; + g.NavMoveDir = ImGuiDir_Down; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdgeY; + // FIXME-NAV: MoveClipDir left to _None, intentional? + } + else if (end_pressed) + { + nav_rect_rel.Min.y = nav_rect_rel.Max.y = window->ContentSize.y; + if (nav_rect_rel.IsInverted()) + nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; + g.NavMoveDir = ImGuiDir_Up; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdgeY; + // FIXME-NAV: MoveClipDir left to _None, intentional? + } + return nav_scoring_rect_offset_y; + } + return 0.0f; +} + +static void ImGui::NavEndFrame() +{ + ImGuiContext& g = *GImGui; + + // Show CTRL+TAB list window + if (g.NavWindowingTarget != NULL) + NavUpdateWindowingOverlay(); + + // Perform wrap-around in menus + // FIXME-NAV: Wrap may need to apply a weight bias on the other axis. e.g. 4x4 grid with 2 last items missing on last item won't handle LoopY/WrapY correctly. + // FIXME-NAV: Wrap (not Loop) support could be handled by the scoring function and then WrapX would function without an extra frame. + const ImGuiNavMoveFlags wanted_flags = ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY; + if (g.NavWindow && NavMoveRequestButNoResultYet() && (g.NavMoveFlags & wanted_flags) && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded) == 0) + NavUpdateCreateWrappingRequest(); +} + +static void ImGui::NavUpdateCreateWrappingRequest() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.NavWindow; + + bool do_forward = false; + ImRect bb_rel = window->NavRectRel[g.NavLayer]; + ImGuiDir clip_dir = g.NavMoveDir; + const ImGuiNavMoveFlags move_flags = g.NavMoveFlags; + if (g.NavMoveDir == ImGuiDir_Left && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) + { + bb_rel.Min.x = bb_rel.Max.x = window->ContentSize.x + window->WindowPadding.x; + if (move_flags & ImGuiNavMoveFlags_WrapX) + { + bb_rel.TranslateY(-bb_rel.GetHeight()); // Previous row + clip_dir = ImGuiDir_Up; + } + do_forward = true; + } + if (g.NavMoveDir == ImGuiDir_Right && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) + { + bb_rel.Min.x = bb_rel.Max.x = -window->WindowPadding.x; + if (move_flags & ImGuiNavMoveFlags_WrapX) + { + bb_rel.TranslateY(+bb_rel.GetHeight()); // Next row + clip_dir = ImGuiDir_Down; + } + do_forward = true; + } + if (g.NavMoveDir == ImGuiDir_Up && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) + { + bb_rel.Min.y = bb_rel.Max.y = window->ContentSize.y + window->WindowPadding.y; + if (move_flags & ImGuiNavMoveFlags_WrapY) + { + bb_rel.TranslateX(-bb_rel.GetWidth()); // Previous column + clip_dir = ImGuiDir_Left; + } + do_forward = true; + } + if (g.NavMoveDir == ImGuiDir_Down && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) + { + bb_rel.Min.y = bb_rel.Max.y = -window->WindowPadding.y; + if (move_flags & ImGuiNavMoveFlags_WrapY) + { + bb_rel.TranslateX(+bb_rel.GetWidth()); // Next column + clip_dir = ImGuiDir_Right; + } + do_forward = true; + } + if (!do_forward) + return; + window->NavRectRel[g.NavLayer] = bb_rel; + NavMoveRequestForward(g.NavMoveDir, clip_dir, move_flags, g.NavMoveScrollFlags); +} + +static int ImGui::FindWindowFocusIndex(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + IM_UNUSED(g); + int order = window->FocusOrder; + IM_ASSERT(window->RootWindow == window); // No child window (not testing _ChildWindow because of docking) + IM_ASSERT(g.WindowsFocusOrder[order] == window); + return order; +} + +static ImGuiWindow* FindWindowNavFocusable(int i_start, int i_stop, int dir) // FIXME-OPT O(N) +{ + ImGuiContext& g = *GImGui; + for (int i = i_start; i >= 0 && i < g.WindowsFocusOrder.Size && i != i_stop; i += dir) + if (ImGui::IsWindowNavFocusable(g.WindowsFocusOrder[i])) + return g.WindowsFocusOrder[i]; + return NULL; +} + +static void NavUpdateWindowingHighlightWindow(int focus_change_dir) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavWindowingTarget); + if (g.NavWindowingTarget->Flags & ImGuiWindowFlags_Modal) + return; + + const int i_current = ImGui::FindWindowFocusIndex(g.NavWindowingTarget); + ImGuiWindow* window_target = FindWindowNavFocusable(i_current + focus_change_dir, -INT_MAX, focus_change_dir); + if (!window_target) + window_target = FindWindowNavFocusable((focus_change_dir < 0) ? (g.WindowsFocusOrder.Size - 1) : 0, i_current, focus_change_dir); + if (window_target) // Don't reset windowing target if there's a single window in the list + g.NavWindowingTarget = g.NavWindowingTargetAnim = window_target; + g.NavWindowingToggleLayer = false; +} + +// Windowing management mode +// Keyboard: CTRL+Tab (change focus/move/resize), Alt (toggle menu layer) +// Gamepad: Hold Menu/Square (change focus/move/resize), Tap Menu/Square (toggle menu layer) +static void ImGui::NavUpdateWindowing() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + ImGuiWindow* apply_focus_window = NULL; + bool apply_toggle_layer = false; + + ImGuiWindow* modal_window = GetTopMostPopupModal(); + bool allow_windowing = (modal_window == NULL); + if (!allow_windowing) + g.NavWindowingTarget = NULL; + + // Fade out + if (g.NavWindowingTargetAnim && g.NavWindowingTarget == NULL) + { + g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha - io.DeltaTime * 10.0f, 0.0f); + if (g.DimBgRatio <= 0.0f && g.NavWindowingHighlightAlpha <= 0.0f) + g.NavWindowingTargetAnim = NULL; + } + + // Start CTRL+Tab or Square+L/R window selection + const bool start_windowing_with_gamepad = allow_windowing && !g.NavWindowingTarget && IsNavInputTest(ImGuiNavInput_Menu, ImGuiNavReadMode_Pressed); + const bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && io.KeyCtrl && IsKeyPressed(ImGuiKey_Tab); + if (start_windowing_with_gamepad || start_windowing_with_keyboard) + if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1)) + { + g.NavWindowingTarget = g.NavWindowingTargetAnim = window->RootWindow; + g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f; + g.NavWindowingToggleLayer = start_windowing_with_gamepad ? true : false; // Gamepad starts toggling layer + g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad; + } + + // Gamepad update + g.NavWindowingTimer += io.DeltaTime; + if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Gamepad) + { + // Highlight only appears after a brief time holding the button, so that a fast tap on PadMenu (to toggle NavLayer) doesn't add visual noise + g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); + + // Select window to focus + const int focus_change_dir = (int)IsNavInputTest(ImGuiNavInput_FocusPrev, ImGuiNavReadMode_RepeatSlow) - (int)IsNavInputTest(ImGuiNavInput_FocusNext, ImGuiNavReadMode_RepeatSlow); + if (focus_change_dir != 0) + { + NavUpdateWindowingHighlightWindow(focus_change_dir); + g.NavWindowingHighlightAlpha = 1.0f; + } + + // Single press toggles NavLayer, long press with L/R apply actual focus on release (until then the window was merely rendered top-most) + if (!IsNavInputDown(ImGuiNavInput_Menu)) + { + g.NavWindowingToggleLayer &= (g.NavWindowingHighlightAlpha < 1.0f); // Once button was held long enough we don't consider it a tap-to-toggle-layer press anymore. + if (g.NavWindowingToggleLayer && g.NavWindow) + apply_toggle_layer = true; + else if (!g.NavWindowingToggleLayer) + apply_focus_window = g.NavWindowingTarget; + g.NavWindowingTarget = NULL; + } + } + + // Keyboard: Focus + if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Keyboard) + { + // Visuals only appears after a brief time after pressing TAB the first time, so that a fast CTRL+TAB doesn't add visual noise + g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); // 1.0f + if (IsKeyPressed(ImGuiKey_Tab, true)) + NavUpdateWindowingHighlightWindow(io.KeyShift ? +1 : -1); + if (!io.KeyCtrl) + apply_focus_window = g.NavWindowingTarget; + } + + // Keyboard: Press and Release ALT to toggle menu layer + // - Testing that only Alt is tested prevents Alt+Shift or AltGR from toggling menu layer. + // - AltGR is normally Alt+Ctrl but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). But even on keyboards without AltGR we don't want Alt+Ctrl to open menu anyway. + const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; + if (nav_keyboard_active && IsKeyPressed(ImGuiKey_ModAlt)) + { + g.NavWindowingToggleLayer = true; + g.NavInputSource = ImGuiInputSource_Keyboard; + } + if (g.NavWindowingToggleLayer && g.NavInputSource == ImGuiInputSource_Keyboard) + { + // We cancel toggling nav layer when any text has been typed (generally while holding Alt). (See #370) + // We cancel toggling nav layer when other modifiers are pressed. (See #4439) + if (io.InputQueueCharacters.Size > 0 || io.KeyCtrl || io.KeyShift || io.KeySuper) + g.NavWindowingToggleLayer = false; + + // Apply layer toggle on release + // Important: as before version <18314 we lacked an explicit IO event for focus gain/loss, we also compare mouse validity to detect old backends clearing mouse pos on focus loss. + if (IsKeyReleased(ImGuiKey_ModAlt) && g.NavWindowingToggleLayer) + if (g.ActiveId == 0 || g.ActiveIdAllowOverlap) + if (IsMousePosValid(&io.MousePos) == IsMousePosValid(&io.MousePosPrev)) + apply_toggle_layer = true; + if (!IsKeyDown(ImGuiKey_ModAlt)) + g.NavWindowingToggleLayer = false; + } + + // Move window + if (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoMove)) + { + ImVec2 move_delta; + if (g.NavInputSource == ImGuiInputSource_Keyboard && !io.KeyShift) + move_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_RawKeyboard, ImGuiNavReadMode_Down); + if (g.NavInputSource == ImGuiInputSource_Gamepad) + move_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadLStick, ImGuiNavReadMode_Down); + if (move_delta.x != 0.0f || move_delta.y != 0.0f) + { + const float NAV_MOVE_SPEED = 800.0f; + const float move_speed = ImFloor(NAV_MOVE_SPEED * io.DeltaTime * ImMin(io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y)); // FIXME: Doesn't handle variable framerate very well + ImGuiWindow* moving_window = g.NavWindowingTarget->RootWindow; + SetWindowPos(moving_window, moving_window->Pos + move_delta * move_speed, ImGuiCond_Always); + MarkIniSettingsDirty(moving_window); + g.NavDisableMouseHover = true; + } + } + + // Apply final focus + if (apply_focus_window && (g.NavWindow == NULL || apply_focus_window != g.NavWindow->RootWindow)) + { + ClearActiveID(); + NavRestoreHighlightAfterMove(); + apply_focus_window = NavRestoreLastChildNavWindow(apply_focus_window); + ClosePopupsOverWindow(apply_focus_window, false); + FocusWindow(apply_focus_window); + if (apply_focus_window->NavLastIds[0] == 0) + NavInitWindow(apply_focus_window, false); + + // If the window has ONLY a menu layer (no main layer), select it directly + // Use NavLayersActiveMaskNext since windows didn't have a chance to be Begin()-ed on this frame, + // so CTRL+Tab where the keys are only held for 1 frame will be able to use correct layers mask since + // the target window as already been previewed once. + // FIXME-NAV: This should be done in NavInit.. or in FocusWindow... However in both of those cases, + // we won't have a guarantee that windows has been visible before and therefore NavLayersActiveMask* + // won't be valid. + if (apply_focus_window->DC.NavLayersActiveMaskNext == (1 << ImGuiNavLayer_Menu)) + g.NavLayer = ImGuiNavLayer_Menu; + } + if (apply_focus_window) + g.NavWindowingTarget = NULL; + + // Apply menu/layer toggle + if (apply_toggle_layer && g.NavWindow) + { + ClearActiveID(); + + // Move to parent menu if necessary + ImGuiWindow* new_nav_window = g.NavWindow; + while (new_nav_window->ParentWindow + && (new_nav_window->DC.NavLayersActiveMask & (1 << ImGuiNavLayer_Menu)) == 0 + && (new_nav_window->Flags & ImGuiWindowFlags_ChildWindow) != 0 + && (new_nav_window->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0) + new_nav_window = new_nav_window->ParentWindow; + if (new_nav_window != g.NavWindow) + { + ImGuiWindow* old_nav_window = g.NavWindow; + FocusWindow(new_nav_window); + new_nav_window->NavLastChildNavWindow = old_nav_window; + } + + // Toggle layer + const ImGuiNavLayer new_nav_layer = (g.NavWindow->DC.NavLayersActiveMask & (1 << ImGuiNavLayer_Menu)) ? (ImGuiNavLayer)((int)g.NavLayer ^ 1) : ImGuiNavLayer_Main; + if (new_nav_layer != g.NavLayer) + { + // Reinitialize navigation when entering menu bar with the Alt key (FIXME: could be a properly of the layer?) + if (new_nav_layer == ImGuiNavLayer_Menu) + g.NavWindow->NavLastIds[new_nav_layer] = 0; + NavRestoreLayer(new_nav_layer); + NavRestoreHighlightAfterMove(); + } + } +} + +// Window has already passed the IsWindowNavFocusable() +static const char* GetFallbackWindowNameForWindowingList(ImGuiWindow* window) +{ + if (window->Flags & ImGuiWindowFlags_Popup) + return "(Popup)"; + if ((window->Flags & ImGuiWindowFlags_MenuBar) && strcmp(window->Name, "##MainMenuBar") == 0) + return "(Main menu bar)"; + return "(Untitled)"; +} + +// Overlay displayed when using CTRL+TAB. Called by EndFrame(). +void ImGui::NavUpdateWindowingOverlay() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavWindowingTarget != NULL); + + if (g.NavWindowingTimer < NAV_WINDOWING_LIST_APPEAR_DELAY) + return; + + if (g.NavWindowingListWindow == NULL) + g.NavWindowingListWindow = FindWindowByName("###NavWindowingList"); + const ImGuiViewport* viewport = GetMainViewport(); + SetNextWindowSizeConstraints(ImVec2(viewport->Size.x * 0.20f, viewport->Size.y * 0.20f), ImVec2(FLT_MAX, FLT_MAX)); + SetNextWindowPos(viewport->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f); + Begin("###NavWindowingList", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings); + for (int n = g.WindowsFocusOrder.Size - 1; n >= 0; n--) + { + ImGuiWindow* window = g.WindowsFocusOrder[n]; + IM_ASSERT(window != NULL); // Fix static analyzers + if (!IsWindowNavFocusable(window)) + continue; + const char* label = window->Name; + if (label == FindRenderedTextEnd(label)) + label = GetFallbackWindowNameForWindowingList(window); + Selectable(label, g.NavWindowingTarget == window); + } + End(); + PopStyleVar(); +} + + +//----------------------------------------------------------------------------- +// [SECTION] DRAG AND DROP +//----------------------------------------------------------------------------- + +void ImGui::ClearDragDrop() +{ + ImGuiContext& g = *GImGui; + g.DragDropActive = false; + g.DragDropPayload.Clear(); + g.DragDropAcceptFlags = ImGuiDragDropFlags_None; + g.DragDropAcceptIdCurr = g.DragDropAcceptIdPrev = 0; + g.DragDropAcceptIdCurrRectSurface = FLT_MAX; + g.DragDropAcceptFrameCount = -1; + + g.DragDropPayloadBufHeap.clear(); + memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); +} + +// When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource() +// If the item has an identifier: +// - This assume/require the item to be activated (typically via ButtonBehavior). +// - Therefore if you want to use this with a mouse button other than left mouse button, it is up to the item itself to activate with another button. +// - We then pull and use the mouse button that was used to activate the item and use it to carry on the drag. +// If the item has no identifier: +// - Currently always assume left mouse button. +bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // FIXME-DRAGDROP: While in the common-most "drag from non-zero active id" case we can tell the mouse button, + // in both SourceExtern and id==0 cases we may requires something else (explicit flags or some heuristic). + ImGuiMouseButton mouse_button = ImGuiMouseButton_Left; + + bool source_drag_active = false; + ImGuiID source_id = 0; + ImGuiID source_parent_id = 0; + if (!(flags & ImGuiDragDropFlags_SourceExtern)) + { + source_id = g.LastItemData.ID; + if (source_id != 0) + { + // Common path: items with ID + if (g.ActiveId != source_id) + return false; + if (g.ActiveIdMouseButton != -1) + mouse_button = g.ActiveIdMouseButton; + if (g.IO.MouseDown[mouse_button] == false || window->SkipItems) + return false; + g.ActiveIdAllowOverlap = false; + } + else + { + // Uncommon path: items without ID + if (g.IO.MouseDown[mouse_button] == false || window->SkipItems) + return false; + if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) == 0 && (g.ActiveId == 0 || g.ActiveIdWindow != window)) + return false; + + // If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to: + // A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag. + if (!(flags & ImGuiDragDropFlags_SourceAllowNullID)) + { + IM_ASSERT(0); + return false; + } + + // Magic fallback to handle items with no assigned ID, e.g. Text(), Image() + // We build a throwaway ID based on current ID stack + relative AABB of items in window. + // THE IDENTIFIER WON'T SURVIVE ANY REPOSITIONING/RESIZINGG OF THE WIDGET, so if your widget moves your dragging operation will be canceled. + // We don't need to maintain/call ClearActiveID() as releasing the button will early out this function and trigger !ActiveIdIsAlive. + // Rely on keeping other window->LastItemXXX fields intact. + source_id = g.LastItemData.ID = window->GetIDFromRectangle(g.LastItemData.Rect); + KeepAliveID(source_id); + bool is_hovered = ItemHoverable(g.LastItemData.Rect, source_id); + if (is_hovered && g.IO.MouseClicked[mouse_button]) + { + SetActiveID(source_id, window); + FocusWindow(window); + } + if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker. + g.ActiveIdAllowOverlap = is_hovered; + } + if (g.ActiveId != source_id) + return false; + source_parent_id = window->IDStack.back(); + source_drag_active = IsMouseDragging(mouse_button); + + // Disable navigation and key inputs while dragging + cancel existing request if any + SetActiveIdUsingNavAndKeys(); + } + else + { + window = NULL; + source_id = ImHashStr("#SourceExtern"); + source_drag_active = true; + } + + if (source_drag_active) + { + if (!g.DragDropActive) + { + IM_ASSERT(source_id != 0); + ClearDragDrop(); + ImGuiPayload& payload = g.DragDropPayload; + payload.SourceId = source_id; + payload.SourceParentId = source_parent_id; + g.DragDropActive = true; + g.DragDropSourceFlags = flags; + g.DragDropMouseButton = mouse_button; + if (payload.SourceId == g.ActiveId) + g.ActiveIdNoClearOnFocusLoss = true; + } + g.DragDropSourceFrameCount = g.FrameCount; + g.DragDropWithinSource = true; + + if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) + { + // Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit) + // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents. + BeginTooltip(); + if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip)) + { + ImGuiWindow* tooltip_window = g.CurrentWindow; + tooltip_window->Hidden = tooltip_window->SkipItems = true; + tooltip_window->HiddenFramesCanSkipItems = 1; + } + } + + if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern)) + g.LastItemData.StatusFlags &= ~ImGuiItemStatusFlags_HoveredRect; + + return true; + } + return false; +} + +void ImGui::EndDragDropSource() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.DragDropActive); + IM_ASSERT(g.DragDropWithinSource && "Not after a BeginDragDropSource()?"); + + if (!(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) + EndTooltip(); + + // Discard the drag if have not called SetDragDropPayload() + if (g.DragDropPayload.DataFrameCount == -1) + ClearDragDrop(); + g.DragDropWithinSource = false; +} + +// Use 'cond' to choose to submit payload on drag start or every frame +bool ImGui::SetDragDropPayload(const char* type, const void* data, size_t data_size, ImGuiCond cond) +{ + ImGuiContext& g = *GImGui; + ImGuiPayload& payload = g.DragDropPayload; + if (cond == 0) + cond = ImGuiCond_Always; + + IM_ASSERT(type != NULL); + IM_ASSERT(strlen(type) < IM_ARRAYSIZE(payload.DataType) && "Payload type can be at most 32 characters long"); + IM_ASSERT((data != NULL && data_size > 0) || (data == NULL && data_size == 0)); + IM_ASSERT(cond == ImGuiCond_Always || cond == ImGuiCond_Once); + IM_ASSERT(payload.SourceId != 0); // Not called between BeginDragDropSource() and EndDragDropSource() + + if (cond == ImGuiCond_Always || payload.DataFrameCount == -1) + { + // Copy payload + ImStrncpy(payload.DataType, type, IM_ARRAYSIZE(payload.DataType)); + g.DragDropPayloadBufHeap.resize(0); + if (data_size > sizeof(g.DragDropPayloadBufLocal)) + { + // Store in heap + g.DragDropPayloadBufHeap.resize((int)data_size); + payload.Data = g.DragDropPayloadBufHeap.Data; + memcpy(payload.Data, data, data_size); + } + else if (data_size > 0) + { + // Store locally + memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); + payload.Data = g.DragDropPayloadBufLocal; + memcpy(payload.Data, data, data_size); + } + else + { + payload.Data = NULL; + } + payload.DataSize = (int)data_size; + } + payload.DataFrameCount = g.FrameCount; + + // Return whether the payload has been accepted + return (g.DragDropAcceptFrameCount == g.FrameCount) || (g.DragDropAcceptFrameCount == g.FrameCount - 1); +} + +bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id) +{ + ImGuiContext& g = *GImGui; + if (!g.DragDropActive) + return false; + + ImGuiWindow* window = g.CurrentWindow; + ImGuiWindow* hovered_window = g.HoveredWindowUnderMovingWindow; + if (hovered_window == NULL || window->RootWindow != hovered_window->RootWindow) + return false; + IM_ASSERT(id != 0); + if (!IsMouseHoveringRect(bb.Min, bb.Max) || (id == g.DragDropPayload.SourceId)) + return false; + if (window->SkipItems) + return false; + + IM_ASSERT(g.DragDropWithinTarget == false); + g.DragDropTargetRect = bb; + g.DragDropTargetId = id; + g.DragDropWithinTarget = true; + return true; +} + +// We don't use BeginDragDropTargetCustom() and duplicate its code because: +// 1) we use LastItemRectHoveredRect which handles items that pushes a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them. +// 2) and it's faster. as this code may be very frequently called, we want to early out as fast as we can. +// Also note how the HoveredWindow test is positioned differently in both functions (in both functions we optimize for the cheapest early out case) +bool ImGui::BeginDragDropTarget() +{ + ImGuiContext& g = *GImGui; + if (!g.DragDropActive) + return false; + + ImGuiWindow* window = g.CurrentWindow; + if (!(g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect)) + return false; + ImGuiWindow* hovered_window = g.HoveredWindowUnderMovingWindow; + if (hovered_window == NULL || window->RootWindow != hovered_window->RootWindow || window->SkipItems) + return false; + + const ImRect& display_rect = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) ? g.LastItemData.DisplayRect : g.LastItemData.Rect; + ImGuiID id = g.LastItemData.ID; + if (id == 0) + { + id = window->GetIDFromRectangle(display_rect); + KeepAliveID(id); + } + if (g.DragDropPayload.SourceId == id) + return false; + + IM_ASSERT(g.DragDropWithinTarget == false); + g.DragDropTargetRect = display_rect; + g.DragDropTargetId = id; + g.DragDropWithinTarget = true; + return true; +} + +bool ImGui::IsDragDropPayloadBeingAccepted() +{ + ImGuiContext& g = *GImGui; + return g.DragDropActive && g.DragDropAcceptIdPrev != 0; +} + +const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiPayload& payload = g.DragDropPayload; + IM_ASSERT(g.DragDropActive); // Not called between BeginDragDropTarget() and EndDragDropTarget() ? + IM_ASSERT(payload.DataFrameCount != -1); // Forgot to call EndDragDropTarget() ? + if (type != NULL && !payload.IsDataType(type)) + return NULL; + + // Accept smallest drag target bounding box, this allows us to nest drag targets conveniently without ordering constraints. + // NB: We currently accept NULL id as target. However, overlapping targets requires a unique ID to function! + const bool was_accepted_previously = (g.DragDropAcceptIdPrev == g.DragDropTargetId); + ImRect r = g.DragDropTargetRect; + float r_surface = r.GetWidth() * r.GetHeight(); + if (r_surface <= g.DragDropAcceptIdCurrRectSurface) + { + g.DragDropAcceptFlags = flags; + g.DragDropAcceptIdCurr = g.DragDropTargetId; + g.DragDropAcceptIdCurrRectSurface = r_surface; + } + + // Render default drop visuals + // FIXME-DRAGDROP: Settle on a proper default visuals for drop target. + payload.Preview = was_accepted_previously; + flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that lives for 1 frame) + if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview) + window->DrawList->AddRect(r.Min - ImVec2(3.5f,3.5f), r.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); + + g.DragDropAcceptFrameCount = g.FrameCount; + payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting os window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased() + if (!payload.Delivery && !(flags & ImGuiDragDropFlags_AcceptBeforeDelivery)) + return NULL; + + return &payload; +} + +const ImGuiPayload* ImGui::GetDragDropPayload() +{ + ImGuiContext& g = *GImGui; + return g.DragDropActive ? &g.DragDropPayload : NULL; +} + +// We don't really use/need this now, but added it for the sake of consistency and because we might need it later. +void ImGui::EndDragDropTarget() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.DragDropActive); + IM_ASSERT(g.DragDropWithinTarget); + g.DragDropWithinTarget = false; +} + +//----------------------------------------------------------------------------- +// [SECTION] LOGGING/CAPTURING +//----------------------------------------------------------------------------- +// All text output from the interface can be captured into tty/file/clipboard. +// By default, tree nodes are automatically opened during logging. +//----------------------------------------------------------------------------- + +// Pass text data straight to log (without being displayed) +static inline void LogTextV(ImGuiContext& g, const char* fmt, va_list args) +{ + if (g.LogFile) + { + g.LogBuffer.Buf.resize(0); + g.LogBuffer.appendfv(fmt, args); + ImFileWrite(g.LogBuffer.c_str(), sizeof(char), (ImU64)g.LogBuffer.size(), g.LogFile); + } + else + { + g.LogBuffer.appendfv(fmt, args); + } +} + +void ImGui::LogText(const char* fmt, ...) +{ + ImGuiContext& g = *GImGui; + if (!g.LogEnabled) + return; + + va_list args; + va_start(args, fmt); + LogTextV(g, fmt, args); + va_end(args); +} + +void ImGui::LogTextV(const char* fmt, va_list args) +{ + ImGuiContext& g = *GImGui; + if (!g.LogEnabled) + return; + + LogTextV(g, fmt, args); +} + +// Internal version that takes a position to decide on newline placement and pad items according to their depth. +// We split text into individual lines to add current tree level padding +// FIXME: This code is a little complicated perhaps, considering simplifying the whole system. +void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + const char* prefix = g.LogNextPrefix; + const char* suffix = g.LogNextSuffix; + g.LogNextPrefix = g.LogNextSuffix = NULL; + + if (!text_end) + text_end = FindRenderedTextEnd(text, text_end); + + const bool log_new_line = ref_pos && (ref_pos->y > g.LogLinePosY + g.Style.FramePadding.y + 1); + if (ref_pos) + g.LogLinePosY = ref_pos->y; + if (log_new_line) + { + LogText(IM_NEWLINE); + g.LogLineFirstItem = true; + } + + if (prefix) + LogRenderedText(ref_pos, prefix, prefix + strlen(prefix)); // Calculate end ourself to ensure "##" are included here. + + // Re-adjust padding if we have popped out of our starting depth + if (g.LogDepthRef > window->DC.TreeDepth) + g.LogDepthRef = window->DC.TreeDepth; + const int tree_depth = (window->DC.TreeDepth - g.LogDepthRef); + + const char* text_remaining = text; + for (;;) + { + // Split the string. Each new line (after a '\n') is followed by indentation corresponding to the current depth of our log entry. + // We don't add a trailing \n yet to allow a subsequent item on the same line to be captured. + const char* line_start = text_remaining; + const char* line_end = ImStreolRange(line_start, text_end); + const bool is_last_line = (line_end == text_end); + if (line_start != line_end || !is_last_line) + { + const int line_length = (int)(line_end - line_start); + const int indentation = g.LogLineFirstItem ? tree_depth * 4 : 1; + LogText("%*s%.*s", indentation, "", line_length, line_start); + g.LogLineFirstItem = false; + if (*line_end == '\n') + { + LogText(IM_NEWLINE); + g.LogLineFirstItem = true; + } + } + if (is_last_line) + break; + text_remaining = line_end + 1; + } + + if (suffix) + LogRenderedText(ref_pos, suffix, suffix + strlen(suffix)); +} + +// Start logging/capturing text output +void ImGui::LogBegin(ImGuiLogType type, int auto_open_depth) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(g.LogEnabled == false); + IM_ASSERT(g.LogFile == NULL); + IM_ASSERT(g.LogBuffer.empty()); + g.LogEnabled = true; + g.LogType = type; + g.LogNextPrefix = g.LogNextSuffix = NULL; + g.LogDepthRef = window->DC.TreeDepth; + g.LogDepthToExpand = ((auto_open_depth >= 0) ? auto_open_depth : g.LogDepthToExpandDefault); + g.LogLinePosY = FLT_MAX; + g.LogLineFirstItem = true; +} + +// Important: doesn't copy underlying data, use carefully (prefix/suffix must be in scope at the time of the next LogRenderedText) +void ImGui::LogSetNextTextDecoration(const char* prefix, const char* suffix) +{ + ImGuiContext& g = *GImGui; + g.LogNextPrefix = prefix; + g.LogNextSuffix = suffix; +} + +void ImGui::LogToTTY(int auto_open_depth) +{ + ImGuiContext& g = *GImGui; + if (g.LogEnabled) + return; + IM_UNUSED(auto_open_depth); +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + LogBegin(ImGuiLogType_TTY, auto_open_depth); + g.LogFile = stdout; +#endif +} + +// Start logging/capturing text output to given file +void ImGui::LogToFile(int auto_open_depth, const char* filename) +{ + ImGuiContext& g = *GImGui; + if (g.LogEnabled) + return; + + // FIXME: We could probably open the file in text mode "at", however note that clipboard/buffer logging will still + // be subject to outputting OS-incompatible carriage return if within strings the user doesn't use IM_NEWLINE. + // By opening the file in binary mode "ab" we have consistent output everywhere. + if (!filename) + filename = g.IO.LogFilename; + if (!filename || !filename[0]) + return; + ImFileHandle f = ImFileOpen(filename, "ab"); + if (!f) + { + IM_ASSERT(0); + return; + } + + LogBegin(ImGuiLogType_File, auto_open_depth); + g.LogFile = f; +} + +// Start logging/capturing text output to clipboard +void ImGui::LogToClipboard(int auto_open_depth) +{ + ImGuiContext& g = *GImGui; + if (g.LogEnabled) + return; + LogBegin(ImGuiLogType_Clipboard, auto_open_depth); +} + +void ImGui::LogToBuffer(int auto_open_depth) +{ + ImGuiContext& g = *GImGui; + if (g.LogEnabled) + return; + LogBegin(ImGuiLogType_Buffer, auto_open_depth); +} + +void ImGui::LogFinish() +{ + ImGuiContext& g = *GImGui; + if (!g.LogEnabled) + return; + + LogText(IM_NEWLINE); + switch (g.LogType) + { + case ImGuiLogType_TTY: +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + fflush(g.LogFile); +#endif + break; + case ImGuiLogType_File: + ImFileClose(g.LogFile); + break; + case ImGuiLogType_Buffer: + break; + case ImGuiLogType_Clipboard: + if (!g.LogBuffer.empty()) + SetClipboardText(g.LogBuffer.begin()); + break; + case ImGuiLogType_None: + IM_ASSERT(0); + break; + } + + g.LogEnabled = false; + g.LogType = ImGuiLogType_None; + g.LogFile = NULL; + g.LogBuffer.clear(); +} + +// Helper to display logging buttons +// FIXME-OBSOLETE: We should probably obsolete this and let the user have their own helper (this is one of the oldest function alive!) +void ImGui::LogButtons() +{ + ImGuiContext& g = *GImGui; + + PushID("LogButtons"); +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + const bool log_to_tty = Button("Log To TTY"); SameLine(); +#else + const bool log_to_tty = false; +#endif + const bool log_to_file = Button("Log To File"); SameLine(); + const bool log_to_clipboard = Button("Log To Clipboard"); SameLine(); + PushAllowKeyboardFocus(false); + SetNextItemWidth(80.0f); + SliderInt("Default Depth", &g.LogDepthToExpandDefault, 0, 9, NULL); + PopAllowKeyboardFocus(); + PopID(); + + // Start logging at the end of the function so that the buttons don't appear in the log + if (log_to_tty) + LogToTTY(); + if (log_to_file) + LogToFile(); + if (log_to_clipboard) + LogToClipboard(); +} + + +//----------------------------------------------------------------------------- +// [SECTION] SETTINGS +//----------------------------------------------------------------------------- +// - UpdateSettings() [Internal] +// - MarkIniSettingsDirty() [Internal] +// - CreateNewWindowSettings() [Internal] +// - FindWindowSettings() [Internal] +// - FindOrCreateWindowSettings() [Internal] +// - FindSettingsHandler() [Internal] +// - ClearIniSettings() [Internal] +// - LoadIniSettingsFromDisk() +// - LoadIniSettingsFromMemory() +// - SaveIniSettingsToDisk() +// - SaveIniSettingsToMemory() +// - WindowSettingsHandler_***() [Internal] +//----------------------------------------------------------------------------- + +// Called by NewFrame() +void ImGui::UpdateSettings() +{ + // Load settings on first frame (if not explicitly loaded manually before) + ImGuiContext& g = *GImGui; + if (!g.SettingsLoaded) + { + IM_ASSERT(g.SettingsWindows.empty()); + if (g.IO.IniFilename) + LoadIniSettingsFromDisk(g.IO.IniFilename); + g.SettingsLoaded = true; + } + + // Save settings (with a delay after the last modification, so we don't spam disk too much) + if (g.SettingsDirtyTimer > 0.0f) + { + g.SettingsDirtyTimer -= g.IO.DeltaTime; + if (g.SettingsDirtyTimer <= 0.0f) + { + if (g.IO.IniFilename != NULL) + SaveIniSettingsToDisk(g.IO.IniFilename); + else + g.IO.WantSaveIniSettings = true; // Let user know they can call SaveIniSettingsToMemory(). user will need to clear io.WantSaveIniSettings themselves. + g.SettingsDirtyTimer = 0.0f; + } + } +} + +void ImGui::MarkIniSettingsDirty() +{ + ImGuiContext& g = *GImGui; + if (g.SettingsDirtyTimer <= 0.0f) + g.SettingsDirtyTimer = g.IO.IniSavingRate; +} + +void ImGui::MarkIniSettingsDirty(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) + if (g.SettingsDirtyTimer <= 0.0f) + g.SettingsDirtyTimer = g.IO.IniSavingRate; +} + +ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name) +{ + ImGuiContext& g = *GImGui; + +#if !IMGUI_DEBUG_INI_SETTINGS + // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() + // Preserve the full string when IMGUI_DEBUG_INI_SETTINGS is set to make .ini inspection easier. + if (const char* p = strstr(name, "###")) + name = p; +#endif + const size_t name_len = strlen(name); + + // Allocate chunk + const size_t chunk_size = sizeof(ImGuiWindowSettings) + name_len + 1; + ImGuiWindowSettings* settings = g.SettingsWindows.alloc_chunk(chunk_size); + IM_PLACEMENT_NEW(settings) ImGuiWindowSettings(); + settings->ID = ImHashStr(name, name_len); + memcpy(settings->GetName(), name, name_len + 1); // Store with zero terminator + + return settings; +} + +ImGuiWindowSettings* ImGui::FindWindowSettings(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + if (settings->ID == id) + return settings; + return NULL; +} + +ImGuiWindowSettings* ImGui::FindOrCreateWindowSettings(const char* name) +{ + if (ImGuiWindowSettings* settings = FindWindowSettings(ImHashStr(name))) + return settings; + return CreateNewWindowSettings(name); +} + +void ImGui::AddSettingsHandler(const ImGuiSettingsHandler* handler) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(FindSettingsHandler(handler->TypeName) == NULL); + g.SettingsHandlers.push_back(*handler); +} + +void ImGui::RemoveSettingsHandler(const char* type_name) +{ + ImGuiContext& g = *GImGui; + if (ImGuiSettingsHandler* handler = FindSettingsHandler(type_name)) + g.SettingsHandlers.erase(handler); +} + +ImGuiSettingsHandler* ImGui::FindSettingsHandler(const char* type_name) +{ + ImGuiContext& g = *GImGui; + const ImGuiID type_hash = ImHashStr(type_name); + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].TypeHash == type_hash) + return &g.SettingsHandlers[handler_n]; + return NULL; +} + +void ImGui::ClearIniSettings() +{ + ImGuiContext& g = *GImGui; + g.SettingsIniData.clear(); + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].ClearAllFn) + g.SettingsHandlers[handler_n].ClearAllFn(&g, &g.SettingsHandlers[handler_n]); +} + +void ImGui::LoadIniSettingsFromDisk(const char* ini_filename) +{ + size_t file_data_size = 0; + char* file_data = (char*)ImFileLoadToMemory(ini_filename, "rb", &file_data_size); + if (!file_data) + return; + LoadIniSettingsFromMemory(file_data, (size_t)file_data_size); + IM_FREE(file_data); +} + +// Zero-tolerance, no error reporting, cheap .ini parsing +void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.Initialized); + //IM_ASSERT(!g.WithinFrameScope && "Cannot be called between NewFrame() and EndFrame()"); + //IM_ASSERT(g.SettingsLoaded == false && g.FrameCount == 0); + + // For user convenience, we allow passing a non zero-terminated string (hence the ini_size parameter). + // For our convenience and to make the code simpler, we'll also write zero-terminators within the buffer. So let's create a writable copy.. + if (ini_size == 0) + ini_size = strlen(ini_data); + g.SettingsIniData.Buf.resize((int)ini_size + 1); + char* const buf = g.SettingsIniData.Buf.Data; + char* const buf_end = buf + ini_size; + memcpy(buf, ini_data, ini_size); + buf_end[0] = 0; + + // Call pre-read handlers + // Some types will clear their data (e.g. dock information) some types will allow merge/override (window) + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].ReadInitFn) + g.SettingsHandlers[handler_n].ReadInitFn(&g, &g.SettingsHandlers[handler_n]); + + void* entry_data = NULL; + ImGuiSettingsHandler* entry_handler = NULL; + + char* line_end = NULL; + for (char* line = buf; line < buf_end; line = line_end + 1) + { + // Skip new lines markers, then find end of the line + while (*line == '\n' || *line == '\r') + line++; + line_end = line; + while (line_end < buf_end && *line_end != '\n' && *line_end != '\r') + line_end++; + line_end[0] = 0; + if (line[0] == ';') + continue; + if (line[0] == '[' && line_end > line && line_end[-1] == ']') + { + // Parse "[Type][Name]". Note that 'Name' can itself contains [] characters, which is acceptable with the current format and parsing code. + line_end[-1] = 0; + const char* name_end = line_end - 1; + const char* type_start = line + 1; + char* type_end = (char*)(void*)ImStrchrRange(type_start, name_end, ']'); + const char* name_start = type_end ? ImStrchrRange(type_end + 1, name_end, '[') : NULL; + if (!type_end || !name_start) + continue; + *type_end = 0; // Overwrite first ']' + name_start++; // Skip second '[' + entry_handler = FindSettingsHandler(type_start); + entry_data = entry_handler ? entry_handler->ReadOpenFn(&g, entry_handler, name_start) : NULL; + } + else if (entry_handler != NULL && entry_data != NULL) + { + // Let type handler parse the line + entry_handler->ReadLineFn(&g, entry_handler, entry_data, line); + } + } + g.SettingsLoaded = true; + + // [DEBUG] Restore untouched copy so it can be browsed in Metrics (not strictly necessary) + memcpy(buf, ini_data, ini_size); + + // Call post-read handlers + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].ApplyAllFn) + g.SettingsHandlers[handler_n].ApplyAllFn(&g, &g.SettingsHandlers[handler_n]); +} + +void ImGui::SaveIniSettingsToDisk(const char* ini_filename) +{ + ImGuiContext& g = *GImGui; + g.SettingsDirtyTimer = 0.0f; + if (!ini_filename) + return; + + size_t ini_data_size = 0; + const char* ini_data = SaveIniSettingsToMemory(&ini_data_size); + ImFileHandle f = ImFileOpen(ini_filename, "wt"); + if (!f) + return; + ImFileWrite(ini_data, sizeof(char), ini_data_size, f); + ImFileClose(f); +} + +// Call registered handlers (e.g. SettingsHandlerWindow_WriteAll() + custom handlers) to write their stuff into a text buffer +const char* ImGui::SaveIniSettingsToMemory(size_t* out_size) +{ + ImGuiContext& g = *GImGui; + g.SettingsDirtyTimer = 0.0f; + g.SettingsIniData.Buf.resize(0); + g.SettingsIniData.Buf.push_back(0); + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + { + ImGuiSettingsHandler* handler = &g.SettingsHandlers[handler_n]; + handler->WriteAllFn(&g, handler, &g.SettingsIniData); + } + if (out_size) + *out_size = (size_t)g.SettingsIniData.size(); + return g.SettingsIniData.c_str(); +} + +static void WindowSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Windows.Size; i++) + g.Windows[i]->SettingsOffset = -1; + g.SettingsWindows.clear(); +} + +static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name) +{ + ImGuiWindowSettings* settings = ImGui::FindOrCreateWindowSettings(name); + ImGuiID id = settings->ID; + *settings = ImGuiWindowSettings(); // Clear existing if recycling previous entry + settings->ID = id; + settings->WantApply = true; + return (void*)settings; +} + +static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line) +{ + ImGuiWindowSettings* settings = (ImGuiWindowSettings*)entry; + int x, y; + int i; + if (sscanf(line, "Pos=%i,%i", &x, &y) == 2) { settings->Pos = ImVec2ih((short)x, (short)y); } + else if (sscanf(line, "Size=%i,%i", &x, &y) == 2) { settings->Size = ImVec2ih((short)x, (short)y); } + else if (sscanf(line, "Collapsed=%d", &i) == 1) { settings->Collapsed = (i != 0); } +} + +// Apply to existing windows (if any) +static void WindowSettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + if (settings->WantApply) + { + if (ImGuiWindow* window = ImGui::FindWindowByID(settings->ID)) + ApplyWindowSettings(window, settings); + settings->WantApply = false; + } +} + +static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) +{ + // Gather data from windows that were active during this session + // (if a window wasn't opened in this session we preserve its settings) + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Windows.Size; i++) + { + ImGuiWindow* window = g.Windows[i]; + if (window->Flags & ImGuiWindowFlags_NoSavedSettings) + continue; + + ImGuiWindowSettings* settings = (window->SettingsOffset != -1) ? g.SettingsWindows.ptr_from_offset(window->SettingsOffset) : ImGui::FindWindowSettings(window->ID); + if (!settings) + { + settings = ImGui::CreateNewWindowSettings(window->Name); + window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings); + } + IM_ASSERT(settings->ID == window->ID); + settings->Pos = ImVec2ih(window->Pos); + settings->Size = ImVec2ih(window->SizeFull); + + settings->Collapsed = window->Collapsed; + } + + // Write to text buffer + buf->reserve(buf->size() + g.SettingsWindows.size() * 6); // ballpark reserve + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + { + const char* settings_name = settings->GetName(); + buf->appendf("[%s][%s]\n", handler->TypeName, settings_name); + buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y); + buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); + buf->appendf("Collapsed=%d\n", settings->Collapsed); + buf->append("\n"); + } +} + + +//----------------------------------------------------------------------------- +// [SECTION] VIEWPORTS, PLATFORM WINDOWS +//----------------------------------------------------------------------------- +// - GetMainViewport() +// - SetWindowViewport() [Internal] +// - UpdateViewportsNewFrame() [Internal] +// (this section is more complete in the 'docking' branch) +//----------------------------------------------------------------------------- + +ImGuiViewport* ImGui::GetMainViewport() +{ + ImGuiContext& g = *GImGui; + return g.Viewports[0]; +} + +void ImGui::SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport) +{ + window->Viewport = viewport; +} + +// Update viewports and monitor infos +static void ImGui::UpdateViewportsNewFrame() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.Viewports.Size == 1); + + // Update main viewport with current platform position. + // FIXME-VIEWPORT: Size is driven by backend/user code for backward-compatibility but we should aim to make this more consistent. + ImGuiViewportP* main_viewport = g.Viewports[0]; + main_viewport->Flags = ImGuiViewportFlags_IsPlatformWindow | ImGuiViewportFlags_OwnedByApp; + main_viewport->Pos = ImVec2(0.0f, 0.0f); + main_viewport->Size = g.IO.DisplaySize; + + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + + // Lock down space taken by menu bars and status bars, reset the offset for fucntions like BeginMainMenuBar() to alter them again. + viewport->WorkOffsetMin = viewport->BuildWorkOffsetMin; + viewport->WorkOffsetMax = viewport->BuildWorkOffsetMax; + viewport->BuildWorkOffsetMin = viewport->BuildWorkOffsetMax = ImVec2(0.0f, 0.0f); + viewport->UpdateWorkRect(); + } +} + +//----------------------------------------------------------------------------- +// [SECTION] DOCKING +//----------------------------------------------------------------------------- + +// (this section is filled in the 'docking' branch) + + +//----------------------------------------------------------------------------- +// [SECTION] PLATFORM DEPENDENT HELPERS +//----------------------------------------------------------------------------- + +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) + +#ifdef _MSC_VER +#pragma comment(lib, "user32") +#pragma comment(lib, "kernel32") +#endif + +// Win32 clipboard implementation +// We use g.ClipboardHandlerData for temporary storage to ensure it is freed on Shutdown() +static const char* GetClipboardTextFn_DefaultImpl(void*) +{ + ImGuiContext& g = *GImGui; + g.ClipboardHandlerData.clear(); + if (!::OpenClipboard(NULL)) + return NULL; + HANDLE wbuf_handle = ::GetClipboardData(CF_UNICODETEXT); + if (wbuf_handle == NULL) + { + ::CloseClipboard(); + return NULL; + } + if (const WCHAR* wbuf_global = (const WCHAR*)::GlobalLock(wbuf_handle)) + { + int buf_len = ::WideCharToMultiByte(CP_UTF8, 0, wbuf_global, -1, NULL, 0, NULL, NULL); + g.ClipboardHandlerData.resize(buf_len); + ::WideCharToMultiByte(CP_UTF8, 0, wbuf_global, -1, g.ClipboardHandlerData.Data, buf_len, NULL, NULL); + } + ::GlobalUnlock(wbuf_handle); + ::CloseClipboard(); + return g.ClipboardHandlerData.Data; +} + +static void SetClipboardTextFn_DefaultImpl(void*, const char* text) +{ + if (!::OpenClipboard(NULL)) + return; + const int wbuf_length = ::MultiByteToWideChar(CP_UTF8, 0, text, -1, NULL, 0); + HGLOBAL wbuf_handle = ::GlobalAlloc(GMEM_MOVEABLE, (SIZE_T)wbuf_length * sizeof(WCHAR)); + if (wbuf_handle == NULL) + { + ::CloseClipboard(); + return; + } + WCHAR* wbuf_global = (WCHAR*)::GlobalLock(wbuf_handle); + ::MultiByteToWideChar(CP_UTF8, 0, text, -1, wbuf_global, wbuf_length); + ::GlobalUnlock(wbuf_handle); + ::EmptyClipboard(); + if (::SetClipboardData(CF_UNICODETEXT, wbuf_handle) == NULL) + ::GlobalFree(wbuf_handle); + ::CloseClipboard(); +} + +#elif defined(__APPLE__) && TARGET_OS_OSX && defined(IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS) + +#include // Use old API to avoid need for separate .mm file +static PasteboardRef main_clipboard = 0; + +// OSX clipboard implementation +// If you enable this you will need to add '-framework ApplicationServices' to your linker command-line! +static void SetClipboardTextFn_DefaultImpl(void*, const char* text) +{ + if (!main_clipboard) + PasteboardCreate(kPasteboardClipboard, &main_clipboard); + PasteboardClear(main_clipboard); + CFDataRef cf_data = CFDataCreate(kCFAllocatorDefault, (const UInt8*)text, strlen(text)); + if (cf_data) + { + PasteboardPutItemFlavor(main_clipboard, (PasteboardItemID)1, CFSTR("public.utf8-plain-text"), cf_data, 0); + CFRelease(cf_data); + } +} + +static const char* GetClipboardTextFn_DefaultImpl(void*) +{ + if (!main_clipboard) + PasteboardCreate(kPasteboardClipboard, &main_clipboard); + PasteboardSynchronize(main_clipboard); + + ItemCount item_count = 0; + PasteboardGetItemCount(main_clipboard, &item_count); + for (ItemCount i = 0; i < item_count; i++) + { + PasteboardItemID item_id = 0; + PasteboardGetItemIdentifier(main_clipboard, i + 1, &item_id); + CFArrayRef flavor_type_array = 0; + PasteboardCopyItemFlavors(main_clipboard, item_id, &flavor_type_array); + for (CFIndex j = 0, nj = CFArrayGetCount(flavor_type_array); j < nj; j++) + { + CFDataRef cf_data; + if (PasteboardCopyItemFlavorData(main_clipboard, item_id, CFSTR("public.utf8-plain-text"), &cf_data) == noErr) + { + ImGuiContext& g = *GImGui; + g.ClipboardHandlerData.clear(); + int length = (int)CFDataGetLength(cf_data); + g.ClipboardHandlerData.resize(length + 1); + CFDataGetBytes(cf_data, CFRangeMake(0, length), (UInt8*)g.ClipboardHandlerData.Data); + g.ClipboardHandlerData[length] = 0; + CFRelease(cf_data); + return g.ClipboardHandlerData.Data; + } + } + } + return NULL; +} + +#else + +// Local Dear ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers. +static const char* GetClipboardTextFn_DefaultImpl(void*) +{ + ImGuiContext& g = *GImGui; + return g.ClipboardHandlerData.empty() ? NULL : g.ClipboardHandlerData.begin(); +} + +static void SetClipboardTextFn_DefaultImpl(void*, const char* text) +{ + ImGuiContext& g = *GImGui; + g.ClipboardHandlerData.clear(); + const char* text_end = text + strlen(text); + g.ClipboardHandlerData.resize((int)(text_end - text) + 1); + memcpy(&g.ClipboardHandlerData[0], text, (size_t)(text_end - text)); + g.ClipboardHandlerData[(int)(text_end - text)] = 0; +} + +#endif + +// Win32 API IME support (for Asian languages, etc.) +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) + +#include +#ifdef _MSC_VER +#pragma comment(lib, "imm32") +#endif + +static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport, ImGuiPlatformImeData* data) +{ + // Notify OS Input Method Editor of text input position + HWND hwnd = (HWND)viewport->PlatformHandleRaw; +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + if (hwnd == 0) + hwnd = (HWND)ImGui::GetIO().ImeWindowHandle; +#endif + if (hwnd == 0) + return; + + ::ImmAssociateContextEx(hwnd, NULL, data->WantVisible ? IACE_DEFAULT : 0); + + if (HIMC himc = ::ImmGetContext(hwnd)) + { + COMPOSITIONFORM composition_form = {}; + composition_form.ptCurrentPos.x = (LONG)data->InputPos.x; + composition_form.ptCurrentPos.y = (LONG)data->InputPos.y; + composition_form.dwStyle = CFS_FORCE_POSITION; + ::ImmSetCompositionWindow(himc, &composition_form); + CANDIDATEFORM candidate_form = {}; + candidate_form.dwStyle = CFS_CANDIDATEPOS; + candidate_form.ptCurrentPos.x = (LONG)data->InputPos.x; + candidate_form.ptCurrentPos.y = (LONG)data->InputPos.y; + ::ImmSetCandidateWindow(himc, &candidate_form); + ::ImmReleaseContext(hwnd, himc); + } +} + +#else + +static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport*, ImGuiPlatformImeData*) {} + +#endif + +//----------------------------------------------------------------------------- +// [SECTION] METRICS/DEBUGGER WINDOW +//----------------------------------------------------------------------------- +// - RenderViewportThumbnail() [Internal] +// - RenderViewportsThumbnails() [Internal] +// - DebugTextEncoding() +// - MetricsHelpMarker() [Internal] +// - ShowFontAtlas() [Internal] +// - ShowMetricsWindow() +// - DebugNodeColumns() [Internal] +// - DebugNodeDrawList() [Internal] +// - DebugNodeDrawCmdShowMeshAndBoundingBox() [Internal] +// - DebugNodeFont() [Internal] +// - DebugNodeFontGlyph() [Internal] +// - DebugNodeStorage() [Internal] +// - DebugNodeTabBar() [Internal] +// - DebugNodeViewport() [Internal] +// - DebugNodeWindow() [Internal] +// - DebugNodeWindowSettings() [Internal] +// - DebugNodeWindowsList() [Internal] +// - DebugNodeWindowsListByBeginStackParent() [Internal] +//----------------------------------------------------------------------------- + +#ifndef IMGUI_DISABLE_METRICS_WINDOW + +void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + ImVec2 scale = bb.GetSize() / viewport->Size; + ImVec2 off = bb.Min - viewport->Pos * scale; + float alpha_mul = 1.0f; + window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul * 0.40f)); + for (int i = 0; i != g.Windows.Size; i++) + { + ImGuiWindow* thumb_window = g.Windows[i]; + if (!thumb_window->WasActive || (thumb_window->Flags & ImGuiWindowFlags_ChildWindow)) + continue; + + ImRect thumb_r = thumb_window->Rect(); + ImRect title_r = thumb_window->TitleBarRect(); + thumb_r = ImRect(ImFloor(off + thumb_r.Min * scale), ImFloor(off + thumb_r.Max * scale)); + title_r = ImRect(ImFloor(off + title_r.Min * scale), ImFloor(off + ImVec2(title_r.Max.x, title_r.Min.y) * scale) + ImVec2(0,5)); // Exaggerate title bar height + thumb_r.ClipWithFull(bb); + title_r.ClipWithFull(bb); + const bool window_is_focused = (g.NavWindow && thumb_window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight); + window->DrawList->AddRectFilled(thumb_r.Min, thumb_r.Max, GetColorU32(ImGuiCol_WindowBg, alpha_mul)); + window->DrawList->AddRectFilled(title_r.Min, title_r.Max, GetColorU32(window_is_focused ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg, alpha_mul)); + window->DrawList->AddRect(thumb_r.Min, thumb_r.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); + window->DrawList->AddText(g.Font, g.FontSize * 1.0f, title_r.Min, GetColorU32(ImGuiCol_Text, alpha_mul), thumb_window->Name, FindRenderedTextEnd(thumb_window->Name)); + } + draw_list->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); +} + +static void RenderViewportsThumbnails() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // We don't display full monitor bounds (we could, but it often looks awkward), instead we display just enough to cover all of our viewports. + float SCALE = 1.0f / 8.0f; + ImRect bb_full(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + for (int n = 0; n < g.Viewports.Size; n++) + bb_full.Add(g.Viewports[n]->GetMainRect()); + ImVec2 p = window->DC.CursorPos; + ImVec2 off = p - bb_full.Min * SCALE; + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + ImRect viewport_draw_bb(off + (viewport->Pos) * SCALE, off + (viewport->Pos + viewport->Size) * SCALE); + ImGui::DebugRenderViewportThumbnail(window->DrawList, viewport, viewport_draw_bb); + } + ImGui::Dummy(bb_full.GetSize() * SCALE); +} + +// Helper tool to diagnose between text encoding issues and font loading issues. Pass your UTF-8 string and verify that there are correct. +void ImGui::DebugTextEncoding(const char* str) +{ + Text("Text: \"%s\"", str); + if (!BeginTable("list", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit)) + return; + TableSetupColumn("Offset"); + TableSetupColumn("UTF-8"); + TableSetupColumn("Glyph"); + TableSetupColumn("Codepoint"); + TableHeadersRow(); + for (const char* p = str; *p != 0; ) + { + unsigned int c; + const int c_utf8_len = ImTextCharFromUtf8(&c, p, NULL); + TableNextColumn(); + Text("%d", (int)(p - str)); + TableNextColumn(); + for (int byte_index = 0; byte_index < c_utf8_len; byte_index++) + { + if (byte_index > 0) + SameLine(); + Text("0x%02X", (int)(unsigned char)p[byte_index]); + } + TableNextColumn(); + if (GetFont()->FindGlyphNoFallback((ImWchar)c)) + TextUnformatted(p, p + c_utf8_len); + else + TextUnformatted((c == IM_UNICODE_CODEPOINT_INVALID) ? "[invalid]" : "[missing]"); + TableNextColumn(); + Text("U+%04X", (int)c); + p += c_utf8_len; + } + EndTable(); +} + +// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds. +static void MetricsHelpMarker(const char* desc) +{ + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); + ImGui::TextUnformatted(desc); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +// [DEBUG] List fonts in a font atlas and display its texture +void ImGui::ShowFontAtlas(ImFontAtlas* atlas) +{ + for (int i = 0; i < atlas->Fonts.Size; i++) + { + ImFont* font = atlas->Fonts[i]; + PushID(font); + DebugNodeFont(font); + PopID(); + } + if (TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight)) + { + ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f); + Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), tint_col, border_col); + TreePop(); + } +} + +void ImGui::ShowMetricsWindow(bool* p_open) +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; + if (cfg->ShowStackTool) + ShowStackToolWindow(&cfg->ShowStackTool); + + if (!Begin("Dear ImGui Metrics/Debugger", p_open) || GetCurrentWindow()->BeginCount > 1) + { + End(); + return; + } + + // Basic info + Text("Dear ImGui %s", GetVersion()); + Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3); + Text("%d visible windows, %d active allocations", io.MetricsRenderWindows, io.MetricsActiveAllocations); + //SameLine(); if (SmallButton("GC")) { g.GcCompactAll = true; } + + Separator(); + + // Debugging enums + enum { WRT_OuterRect, WRT_OuterRectClipped, WRT_InnerRect, WRT_InnerClipRect, WRT_WorkRect, WRT_Content, WRT_ContentIdeal, WRT_ContentRegionRect, WRT_Count }; // Windows Rect Type + const char* wrt_rects_names[WRT_Count] = { "OuterRect", "OuterRectClipped", "InnerRect", "InnerClipRect", "WorkRect", "Content", "ContentIdeal", "ContentRegionRect" }; + enum { TRT_OuterRect, TRT_InnerRect, TRT_WorkRect, TRT_HostClipRect, TRT_InnerClipRect, TRT_BackgroundClipRect, TRT_ColumnsRect, TRT_ColumnsWorkRect, TRT_ColumnsClipRect, TRT_ColumnsContentHeadersUsed, TRT_ColumnsContentHeadersIdeal, TRT_ColumnsContentFrozen, TRT_ColumnsContentUnfrozen, TRT_Count }; // Tables Rect Type + const char* trt_rects_names[TRT_Count] = { "OuterRect", "InnerRect", "WorkRect", "HostClipRect", "InnerClipRect", "BackgroundClipRect", "ColumnsRect", "ColumnsWorkRect", "ColumnsClipRect", "ColumnsContentHeadersUsed", "ColumnsContentHeadersIdeal", "ColumnsContentFrozen", "ColumnsContentUnfrozen" }; + if (cfg->ShowWindowsRectsType < 0) + cfg->ShowWindowsRectsType = WRT_WorkRect; + if (cfg->ShowTablesRectsType < 0) + cfg->ShowTablesRectsType = TRT_WorkRect; + + struct Funcs + { + static ImRect GetTableRect(ImGuiTable* table, int rect_type, int n) + { + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); // Always using last submitted instance + if (rect_type == TRT_OuterRect) { return table->OuterRect; } + else if (rect_type == TRT_InnerRect) { return table->InnerRect; } + else if (rect_type == TRT_WorkRect) { return table->WorkRect; } + else if (rect_type == TRT_HostClipRect) { return table->HostClipRect; } + else if (rect_type == TRT_InnerClipRect) { return table->InnerClipRect; } + else if (rect_type == TRT_BackgroundClipRect) { return table->BgClipRect; } + else if (rect_type == TRT_ColumnsRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MaxX, table->InnerClipRect.Min.y + table_instance->LastOuterHeight); } + else if (rect_type == TRT_ColumnsWorkRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->WorkRect.Min.y, c->WorkMaxX, table->WorkRect.Max.y); } + else if (rect_type == TRT_ColumnsClipRect) { ImGuiTableColumn* c = &table->Columns[n]; return c->ClipRect; } + else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } // Note: y1/y2 not always accurate + else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } + else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } + else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); } + IM_ASSERT(0); + return ImRect(); + } + + static ImRect GetWindowRect(ImGuiWindow* window, int rect_type) + { + if (rect_type == WRT_OuterRect) { return window->Rect(); } + else if (rect_type == WRT_OuterRectClipped) { return window->OuterRectClipped; } + else if (rect_type == WRT_InnerRect) { return window->InnerRect; } + else if (rect_type == WRT_InnerClipRect) { return window->InnerClipRect; } + else if (rect_type == WRT_WorkRect) { return window->WorkRect; } + else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); } + else if (rect_type == WRT_ContentIdeal) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSizeIdeal); } + else if (rect_type == WRT_ContentRegionRect) { return window->ContentRegionRect; } + IM_ASSERT(0); + return ImRect(); + } + }; + + // Tools + if (TreeNode("Tools")) + { + bool show_encoding_viewer = TreeNode("UTF-8 Encoding viewer"); + SameLine(); + MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct."); + if (show_encoding_viewer) + { + static char buf[100] = ""; + SetNextItemWidth(-FLT_MIN); + InputText("##Text", buf, IM_ARRAYSIZE(buf)); + if (buf[0] != 0) + DebugTextEncoding(buf); + TreePop(); + } + + // Stack Tool is your best friend! + Checkbox("Show stack tool", &cfg->ShowStackTool); + SameLine(); + MetricsHelpMarker("You can also call ImGui::ShowStackToolWindow() from your code."); + + Checkbox("Show windows begin order", &cfg->ShowWindowsBeginOrder); + Checkbox("Show windows rectangles", &cfg->ShowWindowsRects); + SameLine(); + SetNextItemWidth(GetFontSize() * 12); + cfg->ShowWindowsRects |= Combo("##show_windows_rect_type", &cfg->ShowWindowsRectsType, wrt_rects_names, WRT_Count, WRT_Count); + if (cfg->ShowWindowsRects && g.NavWindow != NULL) + { + BulletText("'%s':", g.NavWindow->Name); + Indent(); + for (int rect_n = 0; rect_n < WRT_Count; rect_n++) + { + ImRect r = Funcs::GetWindowRect(g.NavWindow, rect_n); + Text("(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), wrt_rects_names[rect_n]); + } + Unindent(); + } + + Checkbox("Show tables rectangles", &cfg->ShowTablesRects); + SameLine(); + SetNextItemWidth(GetFontSize() * 12); + cfg->ShowTablesRects |= Combo("##show_table_rects_type", &cfg->ShowTablesRectsType, trt_rects_names, TRT_Count, TRT_Count); + if (cfg->ShowTablesRects && g.NavWindow != NULL) + { + for (int table_n = 0; table_n < g.Tables.GetMapSize(); table_n++) + { + ImGuiTable* table = g.Tables.TryGetMapData(table_n); + if (table == NULL || table->LastFrameActive < g.FrameCount - 1 || (table->OuterWindow != g.NavWindow && table->InnerWindow != g.NavWindow)) + continue; + + BulletText("Table 0x%08X (%d columns, in '%s')", table->ID, table->ColumnsCount, table->OuterWindow->Name); + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(table->OuterRect.Min - ImVec2(1, 1), table->OuterRect.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); + Indent(); + char buf[128]; + for (int rect_n = 0; rect_n < TRT_Count; rect_n++) + { + if (rect_n >= TRT_ColumnsRect) + { + if (rect_n != TRT_ColumnsRect && rect_n != TRT_ColumnsClipRect) + continue; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImRect r = Funcs::GetTableRect(table, rect_n, column_n); + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) Col %d %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), column_n, trt_rects_names[rect_n]); + Selectable(buf); + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); + } + } + else + { + ImRect r = Funcs::GetTableRect(table, rect_n, -1); + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), trt_rects_names[rect_n]); + Selectable(buf); + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); + } + } + Unindent(); + } + } + + // The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted. + if (Button("Item Picker..")) + DebugStartItemPicker(); + SameLine(); + MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash."); + + TreePop(); + } + + // Windows + if (TreeNode("Windows", "Windows (%d)", g.Windows.Size)) + { + //SetNextItemOpen(true, ImGuiCond_Once); + DebugNodeWindowsList(&g.Windows, "By display order"); + DebugNodeWindowsList(&g.WindowsFocusOrder, "By focus order (root windows)"); + if (TreeNode("By submission order (begin stack)")) + { + // Here we display windows in their submitted order/hierarchy, however note that the Begin stack doesn't constitute a Parent<>Child relationship! + ImVector& temp_buffer = g.WindowsTempSortBuffer; + temp_buffer.resize(0); + for (int i = 0; i < g.Windows.Size; i++) + if (g.Windows[i]->LastFrameActive + 1 >= g.FrameCount) + temp_buffer.push_back(g.Windows[i]); + struct Func { static int IMGUI_CDECL WindowComparerByBeginOrder(const void* lhs, const void* rhs) { return ((int)(*(const ImGuiWindow* const *)lhs)->BeginOrderWithinContext - (*(const ImGuiWindow* const*)rhs)->BeginOrderWithinContext); } }; + ImQsort(temp_buffer.Data, (size_t)temp_buffer.Size, sizeof(ImGuiWindow*), Func::WindowComparerByBeginOrder); + DebugNodeWindowsListByBeginStackParent(temp_buffer.Data, temp_buffer.Size, NULL); + TreePop(); + } + + TreePop(); + } + + // DrawLists + int drawlist_count = 0; + for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) + drawlist_count += g.Viewports[viewport_i]->DrawDataBuilder.GetDrawListCount(); + if (TreeNode("DrawLists", "DrawLists (%d)", drawlist_count)) + { + Checkbox("Show ImDrawCmd mesh when hovering", &cfg->ShowDrawCmdMesh); + Checkbox("Show ImDrawCmd bounding boxes when hovering", &cfg->ShowDrawCmdBoundingBoxes); + for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) + { + ImGuiViewportP* viewport = g.Viewports[viewport_i]; + for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) + for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) + DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); + } + TreePop(); + } + + // Viewports + if (TreeNode("Viewports", "Viewports (%d)", g.Viewports.Size)) + { + Indent(GetTreeNodeToLabelSpacing()); + RenderViewportsThumbnails(); + Unindent(GetTreeNodeToLabelSpacing()); + for (int i = 0; i < g.Viewports.Size; i++) + DebugNodeViewport(g.Viewports[i]); + TreePop(); + } + + // Details for Popups + if (TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size)) + { + for (int i = 0; i < g.OpenPopupStack.Size; i++) + { + ImGuiWindow* window = g.OpenPopupStack[i].Window; + BulletText("PopupID: %08x, Window: '%s'%s%s", g.OpenPopupStack[i].PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? " ChildWindow" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? " ChildMenu" : ""); + } + TreePop(); + } + + // Details for TabBars + if (TreeNode("TabBars", "Tab Bars (%d)", g.TabBars.GetAliveCount())) + { + for (int n = 0; n < g.TabBars.GetMapSize(); n++) + if (ImGuiTabBar* tab_bar = g.TabBars.TryGetMapData(n)) + { + PushID(tab_bar); + DebugNodeTabBar(tab_bar, "TabBar"); + PopID(); + } + TreePop(); + } + + // Details for Tables + if (TreeNode("Tables", "Tables (%d)", g.Tables.GetAliveCount())) + { + for (int n = 0; n < g.Tables.GetMapSize(); n++) + if (ImGuiTable* table = g.Tables.TryGetMapData(n)) + DebugNodeTable(table); + TreePop(); + } + + // Details for Fonts + ImFontAtlas* atlas = g.IO.Fonts; + if (TreeNode("Fonts", "Fonts (%d)", atlas->Fonts.Size)) + { + ShowFontAtlas(atlas); + TreePop(); + } + + // Details for Docking +#ifdef IMGUI_HAS_DOCK + if (TreeNode("Docking")) + { + TreePop(); + } +#endif // #ifdef IMGUI_HAS_DOCK + + // Settings + if (TreeNode("Settings")) + { + if (SmallButton("Clear")) + ClearIniSettings(); + SameLine(); + if (SmallButton("Save to memory")) + SaveIniSettingsToMemory(); + SameLine(); + if (SmallButton("Save to disk")) + SaveIniSettingsToDisk(g.IO.IniFilename); + SameLine(); + if (g.IO.IniFilename) + Text("\"%s\"", g.IO.IniFilename); + else + TextUnformatted(""); + Text("SettingsDirtyTimer %.2f", g.SettingsDirtyTimer); + if (TreeNode("SettingsHandlers", "Settings handlers: (%d)", g.SettingsHandlers.Size)) + { + for (int n = 0; n < g.SettingsHandlers.Size; n++) + BulletText("%s", g.SettingsHandlers[n].TypeName); + TreePop(); + } + if (TreeNode("SettingsWindows", "Settings packed data: Windows: %d bytes", g.SettingsWindows.size())) + { + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + DebugNodeWindowSettings(settings); + TreePop(); + } + + if (TreeNode("SettingsTables", "Settings packed data: Tables: %d bytes", g.SettingsTables.size())) + { + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + DebugNodeTableSettings(settings); + TreePop(); + } + +#ifdef IMGUI_HAS_DOCK +#endif // #ifdef IMGUI_HAS_DOCK + + if (TreeNode("SettingsIniData", "Settings unpacked data (.ini): %d bytes", g.SettingsIniData.size())) + { + InputTextMultiline("##Ini", (char*)(void*)g.SettingsIniData.c_str(), g.SettingsIniData.Buf.Size, ImVec2(-FLT_MIN, GetTextLineHeight() * 20), ImGuiInputTextFlags_ReadOnly); + TreePop(); + } + TreePop(); + } + + // Misc Details + if (TreeNode("Internal state")) + { + Text("WINDOWING"); + Indent(); + Text("HoveredWindow: '%s'", g.HoveredWindow ? g.HoveredWindow->Name : "NULL"); + Text("HoveredWindow->Root: '%s'", g.HoveredWindow ? g.HoveredWindow->RootWindow->Name : "NULL"); + Text("HoveredWindowUnderMovingWindow: '%s'", g.HoveredWindowUnderMovingWindow ? g.HoveredWindowUnderMovingWindow->Name : "NULL"); + Text("MovingWindow: '%s'", g.MovingWindow ? g.MovingWindow->Name : "NULL"); + Unindent(); + + Text("ITEMS"); + Indent(); + Text("ActiveId: 0x%08X/0x%08X (%.2f sec), AllowOverlap: %d, Source: %s", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdTimer, g.ActiveIdAllowOverlap, GetInputSourceName(g.ActiveIdSource)); + Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL"); + + int active_id_using_key_input_count = 0; + for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++) + active_id_using_key_input_count += g.ActiveIdUsingKeyInputMask[n] ? 1 : 0; + Text("ActiveIdUsing: Wheel: %d, NavDirMask: %X, NavInputMask: %X, KeyInputMask: %d key(s)", g.ActiveIdUsingMouseWheel, g.ActiveIdUsingNavDirMask, g.ActiveIdUsingNavInputMask, active_id_using_key_input_count); + Text("HoveredId: 0x%08X (%.2f sec), AllowOverlap: %d", g.HoveredIdPreviousFrame, g.HoveredIdTimer, g.HoveredIdAllowOverlap); // Not displaying g.HoveredId as it is update mid-frame + Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize); + Unindent(); + + Text("NAV,FOCUS"); + Indent(); + Text("NavWindow: '%s'", g.NavWindow ? g.NavWindow->Name : "NULL"); + Text("NavId: 0x%08X, NavLayer: %d", g.NavId, g.NavLayer); + Text("NavInputSource: %s", GetInputSourceName(g.NavInputSource)); + Text("NavActive: %d, NavVisible: %d", g.IO.NavActive, g.IO.NavVisible); + Text("NavActivateId/DownId/PressedId/InputId: %08X/%08X/%08X/%08X", g.NavActivateId, g.NavActivateDownId, g.NavActivatePressedId, g.NavActivateInputId); + Text("NavActivateFlags: %04X", g.NavActivateFlags); + Text("NavDisableHighlight: %d, NavDisableMouseHover: %d", g.NavDisableHighlight, g.NavDisableMouseHover); + Text("NavFocusScopeId = 0x%08X", g.NavFocusScopeId); + Text("NavWindowingTarget: '%s'", g.NavWindowingTarget ? g.NavWindowingTarget->Name : "NULL"); + Unindent(); + + TreePop(); + } + + // Overlay: Display windows Rectangles and Begin Order + if (cfg->ShowWindowsRects || cfg->ShowWindowsBeginOrder) + { + for (int n = 0; n < g.Windows.Size; n++) + { + ImGuiWindow* window = g.Windows[n]; + if (!window->WasActive) + continue; + ImDrawList* draw_list = GetForegroundDrawList(window); + if (cfg->ShowWindowsRects) + { + ImRect r = Funcs::GetWindowRect(window, cfg->ShowWindowsRectsType); + draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255)); + } + if (cfg->ShowWindowsBeginOrder && !(window->Flags & ImGuiWindowFlags_ChildWindow)) + { + char buf[32]; + ImFormatString(buf, IM_ARRAYSIZE(buf), "%d", window->BeginOrderWithinContext); + float font_size = GetFontSize(); + draw_list->AddRectFilled(window->Pos, window->Pos + ImVec2(font_size, font_size), IM_COL32(200, 100, 100, 255)); + draw_list->AddText(window->Pos, IM_COL32(255, 255, 255, 255), buf); + } + } + } + + // Overlay: Display Tables Rectangles + if (cfg->ShowTablesRects) + { + for (int table_n = 0; table_n < g.Tables.GetMapSize(); table_n++) + { + ImGuiTable* table = g.Tables.TryGetMapData(table_n); + if (table == NULL || table->LastFrameActive < g.FrameCount - 1) + continue; + ImDrawList* draw_list = GetForegroundDrawList(table->OuterWindow); + if (cfg->ShowTablesRectsType >= TRT_ColumnsRect) + { + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, column_n); + ImU32 col = (table->HoveredColumnBody == column_n) ? IM_COL32(255, 255, 128, 255) : IM_COL32(255, 0, 128, 255); + float thickness = (table->HoveredColumnBody == column_n) ? 3.0f : 1.0f; + draw_list->AddRect(r.Min, r.Max, col, 0.0f, 0, thickness); + } + } + else + { + ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, -1); + draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255)); + } + } + } + +#ifdef IMGUI_HAS_DOCK + // Overlay: Display Docking info + if (show_docking_nodes && g.IO.KeyCtrl) + { + } +#endif // #ifdef IMGUI_HAS_DOCK + + End(); +} + +// [DEBUG] Display contents of Columns +void ImGui::DebugNodeColumns(ImGuiOldColumns* columns) +{ + if (!TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags)) + return; + BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->OffMaxX - columns->OffMinX, columns->OffMinX, columns->OffMaxX); + for (int column_n = 0; column_n < columns->Columns.Size; column_n++) + BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, GetColumnOffsetFromNorm(columns, columns->Columns[column_n].OffsetNorm)); + TreePop(); +} + +// [DEBUG] Display contents of ImDrawList +void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label) +{ + ImGuiContext& g = *GImGui; + ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; + int cmd_count = draw_list->CmdBuffer.Size; + if (cmd_count > 0 && draw_list->CmdBuffer.back().ElemCount == 0 && draw_list->CmdBuffer.back().UserCallback == NULL) + cmd_count--; + bool node_open = TreeNode(draw_list, "%s: '%s' %d vtx, %d indices, %d cmds", label, draw_list->_OwnerName ? draw_list->_OwnerName : "", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, cmd_count); + if (draw_list == GetWindowDrawList()) + { + SameLine(); + TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered) + if (node_open) + TreePop(); + return; + } + + ImDrawList* fg_draw_list = GetForegroundDrawList(window); // Render additional visuals into the top-most draw list + if (window && IsItemHovered() && fg_draw_list) + fg_draw_list->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255)); + if (!node_open) + return; + + if (window && !window->WasActive) + TextDisabled("Warning: owning Window is inactive. This DrawList is not being rendered!"); + + for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.Data; pcmd < draw_list->CmdBuffer.Data + cmd_count; pcmd++) + { + if (pcmd->UserCallback) + { + BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData); + continue; + } + + char buf[300]; + ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex 0x%p, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)", + pcmd->ElemCount / 3, (void*)(intptr_t)pcmd->TextureId, + pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); + bool pcmd_node_open = TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "%s", buf); + if (IsItemHovered() && (cfg->ShowDrawCmdMesh || cfg->ShowDrawCmdBoundingBoxes) && fg_draw_list) + DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, cfg->ShowDrawCmdMesh, cfg->ShowDrawCmdBoundingBoxes); + if (!pcmd_node_open) + continue; + + // Calculate approximate coverage area (touched pixel count) + // This will be in pixels squared as long there's no post-scaling happening to the renderer output. + const ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; + const ImDrawVert* vtx_buffer = draw_list->VtxBuffer.Data + pcmd->VtxOffset; + float total_area = 0.0f; + for (unsigned int idx_n = pcmd->IdxOffset; idx_n < pcmd->IdxOffset + pcmd->ElemCount; ) + { + ImVec2 triangle[3]; + for (int n = 0; n < 3; n++, idx_n++) + triangle[n] = vtx_buffer[idx_buffer ? idx_buffer[idx_n] : idx_n].pos; + total_area += ImTriangleArea(triangle[0], triangle[1], triangle[2]); + } + + // Display vertex information summary. Hover to get all triangles drawn in wire-frame + ImFormatString(buf, IM_ARRAYSIZE(buf), "Mesh: ElemCount: %d, VtxOffset: +%d, IdxOffset: +%d, Area: ~%0.f px", pcmd->ElemCount, pcmd->VtxOffset, pcmd->IdxOffset, total_area); + Selectable(buf); + if (IsItemHovered() && fg_draw_list) + DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, true, false); + + // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted. + ImGuiListClipper clipper; + clipper.Begin(pcmd->ElemCount / 3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible. + while (clipper.Step()) + for (int prim = clipper.DisplayStart, idx_i = pcmd->IdxOffset + clipper.DisplayStart * 3; prim < clipper.DisplayEnd; prim++) + { + char* buf_p = buf, * buf_end = buf + IM_ARRAYSIZE(buf); + ImVec2 triangle[3]; + for (int n = 0; n < 3; n++, idx_i++) + { + const ImDrawVert& v = vtx_buffer[idx_buffer ? idx_buffer[idx_i] : idx_i]; + triangle[n] = v.pos; + buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", + (n == 0) ? "Vert:" : " ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); + } + + Selectable(buf, false); + if (fg_draw_list && IsItemHovered()) + { + ImDrawListFlags backup_flags = fg_draw_list->Flags; + fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles. + fg_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), ImDrawFlags_Closed, 1.0f); + fg_draw_list->Flags = backup_flags; + } + } + TreePop(); + } + TreePop(); +} + +// [DEBUG] Display mesh/aabb of a ImDrawCmd +void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb) +{ + IM_ASSERT(show_mesh || show_aabb); + + // Draw wire-frame version of all triangles + ImRect clip_rect = draw_cmd->ClipRect; + ImRect vtxs_rect(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + ImDrawListFlags backup_flags = out_draw_list->Flags; + out_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles. + for (unsigned int idx_n = draw_cmd->IdxOffset, idx_end = draw_cmd->IdxOffset + draw_cmd->ElemCount; idx_n < idx_end; ) + { + ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; // We don't hold on those pointers past iterations as ->AddPolyline() may invalidate them if out_draw_list==draw_list + ImDrawVert* vtx_buffer = draw_list->VtxBuffer.Data + draw_cmd->VtxOffset; + + ImVec2 triangle[3]; + for (int n = 0; n < 3; n++, idx_n++) + vtxs_rect.Add((triangle[n] = vtx_buffer[idx_buffer ? idx_buffer[idx_n] : idx_n].pos)); + if (show_mesh) + out_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), ImDrawFlags_Closed, 1.0f); // In yellow: mesh triangles + } + // Draw bounding boxes + if (show_aabb) + { + out_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU + out_draw_list->AddRect(ImFloor(vtxs_rect.Min), ImFloor(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles + } + out_draw_list->Flags = backup_flags; +} + +// [DEBUG] Display details for a single font, called by ShowStyleEditor(). +void ImGui::DebugNodeFont(ImFont* font) +{ + bool opened = TreeNode(font, "Font: \"%s\"\n%.2f px, %d glyphs, %d file(s)", + font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size, font->ConfigDataCount); + SameLine(); + if (SmallButton("Set as default")) + GetIO().FontDefault = font; + if (!opened) + return; + + // Display preview text + PushFont(font); + Text("The quick brown fox jumps over the lazy dog"); + PopFont(); + + // Display details + SetNextItemWidth(GetFontSize() * 8); + DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); + SameLine(); MetricsHelpMarker( + "Note than the default embedded font is NOT meant to be scaled.\n\n" + "Font are currently rendered into bitmaps at a given size at the time of building the atlas. " + "You may oversample them to get some flexibility with scaling. " + "You can also render at multiple sizes and select which one to use at runtime.\n\n" + "(Glimmer of hope: the atlas system will be rewritten in the future to make scaling more flexible.)"); + Text("Ascent: %f, Descent: %f, Height: %f", font->Ascent, font->Descent, font->Ascent - font->Descent); + char c_str[5]; + Text("Fallback character: '%s' (U+%04X)", ImTextCharToUtf8(c_str, font->FallbackChar), font->FallbackChar); + Text("Ellipsis character: '%s' (U+%04X)", ImTextCharToUtf8(c_str, font->EllipsisChar), font->EllipsisChar); + const int surface_sqrt = (int)ImSqrt((float)font->MetricsTotalSurface); + Text("Texture Area: about %d px ~%dx%d px", font->MetricsTotalSurface, surface_sqrt, surface_sqrt); + for (int config_i = 0; config_i < font->ConfigDataCount; config_i++) + if (font->ConfigData) + if (const ImFontConfig* cfg = &font->ConfigData[config_i]) + BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d, Offset: (%.1f,%.1f)", + config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH, cfg->GlyphOffset.x, cfg->GlyphOffset.y); + + // Display all glyphs of the fonts in separate pages of 256 characters + if (TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size)) + { + ImDrawList* draw_list = GetWindowDrawList(); + const ImU32 glyph_col = GetColorU32(ImGuiCol_Text); + const float cell_size = font->FontSize * 1; + const float cell_spacing = GetStyle().ItemSpacing.y; + for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base += 256) + { + // Skip ahead if a large bunch of glyphs are not present in the font (test in chunks of 4k) + // This is only a small optimization to reduce the number of iterations when IM_UNICODE_MAX_CODEPOINT + // is large // (if ImWchar==ImWchar32 we will do at least about 272 queries here) + if (!(base & 4095) && font->IsGlyphRangeUnused(base, base + 4095)) + { + base += 4096 - 256; + continue; + } + + int count = 0; + for (unsigned int n = 0; n < 256; n++) + if (font->FindGlyphNoFallback((ImWchar)(base + n))) + count++; + if (count <= 0) + continue; + if (!TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph")) + continue; + + // Draw a 16x16 grid of glyphs + ImVec2 base_pos = GetCursorScreenPos(); + for (unsigned int n = 0; n < 256; n++) + { + // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions + // available here and thus cannot easily generate a zero-terminated UTF-8 encoded string. + ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing)); + ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size); + const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base + n)); + draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50)); + if (!glyph) + continue; + font->RenderChar(draw_list, cell_size, cell_p1, glyph_col, (ImWchar)(base + n)); + if (IsMouseHoveringRect(cell_p1, cell_p2)) + { + BeginTooltip(); + DebugNodeFontGlyph(font, glyph); + EndTooltip(); + } + } + Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16)); + TreePop(); + } + TreePop(); + } + TreePop(); +} + +void ImGui::DebugNodeFontGlyph(ImFont*, const ImFontGlyph* glyph) +{ + Text("Codepoint: U+%04X", glyph->Codepoint); + Separator(); + Text("Visible: %d", glyph->Visible); + Text("AdvanceX: %.1f", glyph->AdvanceX); + Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1); + Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1); +} + +// [DEBUG] Display contents of ImGuiStorage +void ImGui::DebugNodeStorage(ImGuiStorage* storage, const char* label) +{ + if (!TreeNode(label, "%s: %d entries, %d bytes", label, storage->Data.Size, storage->Data.size_in_bytes())) + return; + for (int n = 0; n < storage->Data.Size; n++) + { + const ImGuiStorage::ImGuiStoragePair& p = storage->Data[n]; + BulletText("Key 0x%08X Value { i: %d }", p.key, p.val_i); // Important: we currently don't store a type, real value may not be integer. + } + TreePop(); +} + +// [DEBUG] Display contents of ImGuiTabBar +void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label) +{ + // Standalone tab bars (not associated to docking/windows functionality) currently hold no discernible strings. + char buf[256]; + char* p = buf; + const char* buf_end = buf + IM_ARRAYSIZE(buf); + const bool is_active = (tab_bar->PrevFrameVisible >= GetFrameCount() - 2); + p += ImFormatString(p, buf_end - p, "%s 0x%08X (%d tabs)%s", label, tab_bar->ID, tab_bar->Tabs.Size, is_active ? "" : " *Inactive*"); + p += ImFormatString(p, buf_end - p, " { "); + for (int tab_n = 0; tab_n < ImMin(tab_bar->Tabs.Size, 3); tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + p += ImFormatString(p, buf_end - p, "%s'%s'", + tab_n > 0 ? ", " : "", (tab->NameOffset != -1) ? tab_bar->GetTabName(tab) : "???"); + } + p += ImFormatString(p, buf_end - p, (tab_bar->Tabs.Size > 3) ? " ... }" : " } "); + if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } + bool open = TreeNode(label, "%s", buf); + if (!is_active) { PopStyleColor(); } + if (is_active && IsItemHovered()) + { + ImDrawList* draw_list = GetForegroundDrawList(); + draw_list->AddRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max, IM_COL32(255, 255, 0, 255)); + draw_list->AddLine(ImVec2(tab_bar->ScrollingRectMinX, tab_bar->BarRect.Min.y), ImVec2(tab_bar->ScrollingRectMinX, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255)); + draw_list->AddLine(ImVec2(tab_bar->ScrollingRectMaxX, tab_bar->BarRect.Min.y), ImVec2(tab_bar->ScrollingRectMaxX, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255)); + } + if (open) + { + for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) + { + const ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + PushID(tab); + if (SmallButton("<")) { TabBarQueueReorder(tab_bar, tab, -1); } SameLine(0, 2); + if (SmallButton(">")) { TabBarQueueReorder(tab_bar, tab, +1); } SameLine(); + Text("%02d%c Tab 0x%08X '%s' Offset: %.1f, Width: %.1f/%.1f", + tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID, (tab->NameOffset != -1) ? tab_bar->GetTabName(tab) : "???", tab->Offset, tab->Width, tab->ContentWidth); + PopID(); + } + TreePop(); + } +} + +void ImGui::DebugNodeViewport(ImGuiViewportP* viewport) +{ + SetNextItemOpen(true, ImGuiCond_Once); + if (TreeNode("viewport0", "Viewport #%d", 0)) + { + ImGuiWindowFlags flags = viewport->Flags; + BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Offset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f", + viewport->Pos.x, viewport->Pos.y, viewport->Size.x, viewport->Size.y, + viewport->WorkOffsetMin.x, viewport->WorkOffsetMin.y, viewport->WorkOffsetMax.x, viewport->WorkOffsetMax.y); + BulletText("Flags: 0x%04X =%s%s%s", viewport->Flags, + (flags & ImGuiViewportFlags_IsPlatformWindow) ? " IsPlatformWindow" : "", + (flags & ImGuiViewportFlags_IsPlatformMonitor) ? " IsPlatformMonitor" : "", + (flags & ImGuiViewportFlags_OwnedByApp) ? " OwnedByApp" : ""); + for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) + for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) + DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); + TreePop(); + } +} + +void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label) +{ + if (window == NULL) + { + BulletText("%s: NULL", label); + return; + } + + ImGuiContext& g = *GImGui; + const bool is_active = window->WasActive; + ImGuiTreeNodeFlags tree_node_flags = (window == g.NavWindow) ? ImGuiTreeNodeFlags_Selected : ImGuiTreeNodeFlags_None; + if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } + const bool open = TreeNodeEx(label, tree_node_flags, "%s '%s'%s", label, window->Name, is_active ? "" : " *Inactive*"); + if (!is_active) { PopStyleColor(); } + if (IsItemHovered() && is_active) + GetForegroundDrawList(window)->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255)); + if (!open) + return; + + if (window->MemoryCompacted) + TextDisabled("Note: some memory buffers have been compacted/freed."); + + ImGuiWindowFlags flags = window->Flags; + DebugNodeDrawList(window, window->DrawList, "DrawList"); + BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f) Ideal (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y, window->ContentSizeIdeal.x, window->ContentSizeIdeal.y); + BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags, + (flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "", + (flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "", + (flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : ""); + BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f) Scrollbar:%s%s", window->Scroll.x, window->ScrollMax.x, window->Scroll.y, window->ScrollMax.y, window->ScrollbarX ? "X" : "", window->ScrollbarY ? "Y" : ""); + BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1); + BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems); + for (int layer = 0; layer < ImGuiNavLayer_COUNT; layer++) + { + ImRect r = window->NavRectRel[layer]; + if (r.Min.x >= r.Max.y && r.Min.y >= r.Max.y) + { + BulletText("NavLastIds[%d]: 0x%08X", layer, window->NavLastIds[layer]); + continue; + } + BulletText("NavLastIds[%d]: 0x%08X at +(%.1f,%.1f)(%.1f,%.1f)", layer, window->NavLastIds[layer], r.Min.x, r.Min.y, r.Max.x, r.Max.y); + if (IsItemHovered()) + GetForegroundDrawList(window)->AddRect(r.Min + window->Pos, r.Max + window->Pos, IM_COL32(255, 255, 0, 255)); + } + BulletText("NavLayersActiveMask: %X, NavLastChildNavWindow: %s", window->DC.NavLayersActiveMask, window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL"); + if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); } + if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); } + if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); } + if (window->ColumnsStorage.Size > 0 && TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size)) + { + for (int n = 0; n < window->ColumnsStorage.Size; n++) + DebugNodeColumns(&window->ColumnsStorage[n]); + TreePop(); + } + DebugNodeStorage(&window->StateStorage, "Storage"); + TreePop(); +} + +void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings* settings) +{ + Text("0x%08X \"%s\" Pos (%d,%d) Size (%d,%d) Collapsed=%d", + settings->ID, settings->GetName(), settings->Pos.x, settings->Pos.y, settings->Size.x, settings->Size.y, settings->Collapsed); +} + +void ImGui::DebugNodeWindowsList(ImVector* windows, const char* label) +{ + if (!TreeNode(label, "%s (%d)", label, windows->Size)) + return; + for (int i = windows->Size - 1; i >= 0; i--) // Iterate front to back + { + PushID((*windows)[i]); + DebugNodeWindow((*windows)[i], "Window"); + PopID(); + } + TreePop(); +} + +// FIXME-OPT: This is technically suboptimal, but it is simpler this way. +void ImGui::DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack) +{ + for (int i = 0; i < windows_size; i++) + { + ImGuiWindow* window = windows[i]; + if (window->ParentWindowInBeginStack != parent_in_begin_stack) + continue; + char buf[20]; + ImFormatString(buf, IM_ARRAYSIZE(buf), "[%04d] Window", window->BeginOrderWithinContext); + //BulletText("[%04d] Window '%s'", window->BeginOrderWithinContext, window->Name); + DebugNodeWindow(window, buf); + Indent(); + DebugNodeWindowsListByBeginStackParent(windows + i + 1, windows_size - i - 1, window); + Unindent(); + } +} + +//----------------------------------------------------------------------------- +// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) +//----------------------------------------------------------------------------- + +// [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack. +void ImGui::UpdateDebugToolItemPicker() +{ + ImGuiContext& g = *GImGui; + g.DebugItemPickerBreakId = 0; + if (!g.DebugItemPickerActive) + return; + + const ImGuiID hovered_id = g.HoveredIdPreviousFrame; + SetMouseCursor(ImGuiMouseCursor_Hand); + if (IsKeyPressed(ImGuiKey_Escape)) + g.DebugItemPickerActive = false; + if (IsMouseClicked(0) && hovered_id) + { + g.DebugItemPickerBreakId = hovered_id; + g.DebugItemPickerActive = false; + } + SetNextWindowBgAlpha(0.60f); + BeginTooltip(); + Text("HoveredId: 0x%08X", hovered_id); + Text("Press ESC to abort picking."); + TextColored(GetStyleColorVec4(hovered_id ? ImGuiCol_Text : ImGuiCol_TextDisabled), "Click to break in debugger!"); + EndTooltip(); +} + +// [DEBUG] Stack Tool: update queries. Called by NewFrame() +void ImGui::UpdateDebugToolStackQueries() +{ + ImGuiContext& g = *GImGui; + ImGuiStackTool* tool = &g.DebugStackTool; + + // Clear hook when stack tool is not visible + g.DebugHookIdInfo = 0; + if (g.FrameCount != tool->LastActiveFrame + 1) + return; + + // Update queries. The steps are: -1: query Stack, >= 0: query each stack item + // We can only perform 1 ID Info query every frame. This is designed so the GetID() tests are cheap and constant-time + const ImGuiID query_id = g.HoveredIdPreviousFrame ? g.HoveredIdPreviousFrame : g.ActiveId; + if (tool->QueryId != query_id) + { + tool->QueryId = query_id; + tool->StackLevel = -1; + tool->Results.resize(0); + } + if (query_id == 0) + return; + + // Advance to next stack level when we got our result, or after 2 frames (in case we never get a result) + int stack_level = tool->StackLevel; + if (stack_level >= 0 && stack_level < tool->Results.Size) + if (tool->Results[stack_level].QuerySuccess || tool->Results[stack_level].QueryFrameCount > 2) + tool->StackLevel++; + + // Update hook + stack_level = tool->StackLevel; + if (stack_level == -1) + g.DebugHookIdInfo = query_id; + if (stack_level >= 0 && stack_level < tool->Results.Size) + { + g.DebugHookIdInfo = tool->Results[stack_level].ID; + tool->Results[stack_level].QueryFrameCount++; + } +} + +// [DEBUG] Stack tool: hooks called by GetID() family functions +void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiStackTool* tool = &g.DebugStackTool; + + // Step 0: stack query + // This assume that the ID was computed with the current ID stack, which tends to be the case for our widget. + if (tool->StackLevel == -1) + { + tool->StackLevel++; + tool->Results.resize(window->IDStack.Size + 1, ImGuiStackLevelInfo()); + for (int n = 0; n < window->IDStack.Size + 1; n++) + tool->Results[n].ID = (n < window->IDStack.Size) ? window->IDStack[n] : id; + return; + } + + // Step 1+: query for individual level + IM_ASSERT(tool->StackLevel >= 0); + if (tool->StackLevel != window->IDStack.Size) + return; + ImGuiStackLevelInfo* info = &tool->Results[tool->StackLevel]; + IM_ASSERT(info->ID == id && info->QueryFrameCount > 0); + + switch (data_type) + { + case ImGuiDataType_S32: + ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%d", (int)(intptr_t)data_id); + break; + case ImGuiDataType_String: + ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%.*s", data_id_end ? (int)((const char*)data_id_end - (const char*)data_id) : (int)strlen((const char*)data_id), (const char*)data_id); + break; + case ImGuiDataType_Pointer: + ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "(void*)0x%p", data_id); + break; + case ImGuiDataType_ID: + if (info->Desc[0] != 0) // PushOverrideID() is often used to avoid hashing twice, which would lead to 2 calls to DebugHookIdInfo(). We prioritize the first one. + return; + ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "0x%08X [override]", id); + break; + default: + IM_ASSERT(0); + } + info->QuerySuccess = true; + info->DataType = data_type; +} + +static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size) +{ + ImGuiStackLevelInfo* info = &tool->Results[n]; + ImGuiWindow* window = (info->Desc[0] == 0 && n == 0) ? ImGui::FindWindowByID(info->ID) : NULL; + if (window) // Source: window name (because the root ID don't call GetID() and so doesn't get hooked) + return ImFormatString(buf, buf_size, format_for_ui ? "\"%s\" [window]" : "%s", window->Name); + if (info->QuerySuccess) // Source: GetID() hooks (prioritize over ItemInfo() because we frequently use patterns like: PushID(str), Button("") where they both have same id) + return ImFormatString(buf, buf_size, (format_for_ui && info->DataType == ImGuiDataType_String) ? "\"%s\"" : "%s", info->Desc); + if (tool->StackLevel < tool->Results.Size) // Only start using fallback below when all queries are done, so during queries we don't flickering ??? markers. + return (*buf = 0); +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (const char* label = ImGuiTestEngine_FindItemDebugLabel(GImGui, info->ID)) // Source: ImGuiTestEngine's ItemInfo() + return ImFormatString(buf, buf_size, format_for_ui ? "??? \"%s\"" : "%s", label); +#endif + return ImFormatString(buf, buf_size, "???"); +} + +// Stack Tool: Display UI +void ImGui::ShowStackToolWindow(bool* p_open) +{ + ImGuiContext& g = *GImGui; + if (!(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize)) + SetNextWindowSize(ImVec2(0.0f, GetFontSize() * 8.0f), ImGuiCond_FirstUseEver); + if (!Begin("Dear ImGui Stack Tool", p_open) || GetCurrentWindow()->BeginCount > 1) + { + End(); + return; + } + + // Display hovered/active status + ImGuiStackTool* tool = &g.DebugStackTool; + const ImGuiID hovered_id = g.HoveredIdPreviousFrame; + const ImGuiID active_id = g.ActiveId; +#ifdef IMGUI_ENABLE_TEST_ENGINE + Text("HoveredId: 0x%08X (\"%s\"), ActiveId: 0x%08X (\"%s\")", hovered_id, hovered_id ? ImGuiTestEngine_FindItemDebugLabel(&g, hovered_id) : "", active_id, active_id ? ImGuiTestEngine_FindItemDebugLabel(&g, active_id) : ""); +#else + Text("HoveredId: 0x%08X, ActiveId: 0x%08X", hovered_id, active_id); +#endif + SameLine(); + MetricsHelpMarker("Hover an item with the mouse to display elements of the ID Stack leading to the item's final ID.\nEach level of the stack correspond to a PushID() call.\nAll levels of the stack are hashed together to make the final ID of a widget (ID displayed at the bottom level of the stack).\nRead FAQ entry about the ID stack for details."); + + // CTRL+C to copy path + const float time_since_copy = (float)g.Time - tool->CopyToClipboardLastTime; + Checkbox("Ctrl+C: copy path to clipboard", &tool->CopyToClipboardOnCtrlC); + SameLine(); + TextColored((time_since_copy >= 0.0f && time_since_copy < 0.75f && ImFmod(time_since_copy, 0.25f) < 0.25f * 0.5f) ? ImVec4(1.f, 1.f, 0.3f, 1.f) : ImVec4(), "*COPIED*"); + if (tool->CopyToClipboardOnCtrlC && IsKeyDown(ImGuiKey_ModCtrl) && IsKeyPressed(ImGuiKey_C)) + { + tool->CopyToClipboardLastTime = (float)g.Time; + char* p = g.TempBuffer; + char* p_end = p + IM_ARRAYSIZE(g.TempBuffer); + for (int stack_n = 0; stack_n < tool->Results.Size && p + 3 < p_end; stack_n++) + { + *p++ = '/'; + char level_desc[256]; + StackToolFormatLevelInfo(tool, stack_n, false, level_desc, IM_ARRAYSIZE(level_desc)); + for (int n = 0; level_desc[n] && p + 2 < p_end; n++) + { + if (level_desc[n] == '/') + *p++ = '\\'; + *p++ = level_desc[n]; + } + } + *p = '\0'; + SetClipboardText(g.TempBuffer); + } + + // Display decorated stack + tool->LastActiveFrame = g.FrameCount; + if (tool->Results.Size > 0 && BeginTable("##table", 3, ImGuiTableFlags_Borders)) + { + const float id_width = CalcTextSize("0xDDDDDDDD").x; + TableSetupColumn("Seed", ImGuiTableColumnFlags_WidthFixed, id_width); + TableSetupColumn("PushID", ImGuiTableColumnFlags_WidthStretch); + TableSetupColumn("Result", ImGuiTableColumnFlags_WidthFixed, id_width); + TableHeadersRow(); + for (int n = 0; n < tool->Results.Size; n++) + { + ImGuiStackLevelInfo* info = &tool->Results[n]; + TableNextColumn(); + Text("0x%08X", (n > 0) ? tool->Results[n - 1].ID : 0); + TableNextColumn(); + StackToolFormatLevelInfo(tool, n, true, g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer)); + TextUnformatted(g.TempBuffer); + TableNextColumn(); + Text("0x%08X", info->ID); + if (n == tool->Results.Size - 1) + TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_Header)); + } + EndTable(); + } + End(); +} + +#else + +void ImGui::ShowMetricsWindow(bool*) {} +void ImGui::ShowFontAtlas(ImFontAtlas*) {} +void ImGui::DebugNodeColumns(ImGuiOldColumns*) {} +void ImGui::DebugNodeDrawList(ImGuiWindow*, const ImDrawList*, const char*) {} +void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList*, const ImDrawList*, const ImDrawCmd*, bool, bool) {} +void ImGui::DebugNodeFont(ImFont*) {} +void ImGui::DebugNodeStorage(ImGuiStorage*, const char*) {} +void ImGui::DebugNodeTabBar(ImGuiTabBar*, const char*) {} +void ImGui::DebugNodeWindow(ImGuiWindow*, const char*) {} +void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings*) {} +void ImGui::DebugNodeWindowsList(ImVector*, const char*) {} +void ImGui::DebugNodeViewport(ImGuiViewportP*) {} + +void ImGui::ShowStackToolWindow(bool*) {} +void ImGui::DebugHookIdInfo(ImGuiID, ImGuiDataType, const void*, const void*) {} +void ImGui::UpdateDebugToolItemPicker() {} +void ImGui::UpdateDebugToolStackQueries() {} + +#endif // #ifndef IMGUI_DISABLE_METRICS_WINDOW + +//----------------------------------------------------------------------------- + +// Include imgui_user.inl at the end of imgui.cpp to access private data/functions that aren't exposed. +// Prefer just including imgui_internal.h from your code rather than using this define. If a declaration is missing from imgui_internal.h add it or request it on the github. +#ifdef IMGUI_INCLUDE_IMGUI_USER_INL +#include "imgui_user.inl" +#endif + +//----------------------------------------------------------------------------- + +#endif // #ifndef IMGUI_DISABLE diff --git a/3rdparty/imgui/src/imgui_demo.cpp b/3rdparty/imgui/src/imgui_demo.cpp new file mode 100644 index 0000000000..eb1e58ae11 --- /dev/null +++ b/3rdparty/imgui/src/imgui_demo.cpp @@ -0,0 +1,7940 @@ +// dear imgui, v1.88 WIP +// (demo code) + +// Help: +// - Read FAQ at http://dearimgui.org/faq +// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. +// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. +// Read imgui.cpp for more details, documentation and comments. +// Get the latest version at https://github.com/ocornut/imgui + +// Message to the person tempted to delete this file when integrating Dear ImGui into their codebase: +// Do NOT remove this file from your project! Think again! It is the most useful reference code that you and other +// coders will want to refer to and call. Have the ImGui::ShowDemoWindow() function wired in an always-available +// debug menu of your game/app! Removing this file from your project is hindering access to documentation for everyone +// in your team, likely leading you to poorer usage of the library. +// Everything in this file will be stripped out by the linker if you don't call ImGui::ShowDemoWindow(). +// If you want to link core Dear ImGui in your shipped builds but want a thorough guarantee that the demo will not be +// linked, you can setup your imconfig.h with #define IMGUI_DISABLE_DEMO_WINDOWS and those functions will be empty. +// In another situation, whenever you have Dear ImGui available you probably want this to be available for reference. +// Thank you, +// -Your beloved friend, imgui_demo.cpp (which you won't delete) + +// Message to beginner C/C++ programmers about the meaning of the 'static' keyword: +// In this demo code, we frequently use 'static' variables inside functions. A static variable persists across calls, +// so it is essentially like a global variable but declared inside the scope of the function. We do this as a way to +// gather code and data in the same place, to make the demo source code faster to read, faster to write, and smaller +// in size. It also happens to be a convenient way of storing simple UI related information as long as your function +// doesn't need to be reentrant or used in multiple threads. This might be a pattern you will want to use in your code, +// but most of the real data you would be editing is likely going to be stored outside your functions. + +// The Demo code in this file is designed to be easy to copy-and-paste into your application! +// Because of this: +// - We never omit the ImGui:: prefix when calling functions, even though most code here is in the same namespace. +// - We try to declare static variables in the local scope, as close as possible to the code using them. +// - We never use any of the helpers/facilities used internally by Dear ImGui, unless available in the public API. +// - We never use maths operators on ImVec2/ImVec4. For our other sources files we use them, and they are provided +// by imgui_internal.h using the IMGUI_DEFINE_MATH_OPERATORS define. For your own sources file they are optional +// and require you either enable those, either provide your own via IM_VEC2_CLASS_EXTRA in imconfig.h. +// Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp. + +// Navigating this file: +// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. + +/* + +Index of this file: + +// [SECTION] Forward Declarations, Helpers +// [SECTION] Demo Window / ShowDemoWindow() +// - sub section: ShowDemoWindowWidgets() +// - sub section: ShowDemoWindowLayout() +// - sub section: ShowDemoWindowPopups() +// - sub section: ShowDemoWindowTables() +// - sub section: ShowDemoWindowMisc() +// [SECTION] About Window / ShowAboutWindow() +// [SECTION] Style Editor / ShowStyleEditor() +// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() +// [SECTION] Example App: Debug Console / ShowExampleAppConsole() +// [SECTION] Example App: Debug Log / ShowExampleAppLog() +// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() +// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() +// [SECTION] Example App: Long Text / ShowExampleAppLongText() +// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() +// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() +// [SECTION] Example App: Simple overlay / ShowExampleAppSimpleOverlay() +// [SECTION] Example App: Fullscreen window / ShowExampleAppFullscreen() +// [SECTION] Example App: Manipulating window titles / ShowExampleAppWindowTitles() +// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() +// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() + +*/ + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE + +// System includes +#include // toupper +#include // INT_MIN, INT_MAX +#include // sqrtf, powf, cosf, sinf, floorf, ceilf +#include // vsnprintf, sscanf, printf +#include // NULL, malloc, free, atoi +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wdeprecated-declarations" // warning: 'xx' is deprecated: The POSIX name for this.. // for strdup used in demo code (so user can copy & paste the code) +#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type +#pragma clang diagnostic ignored "-Wformat-security" // warning: format string is not a string literal +#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. +#pragma clang diagnostic ignored "-Wunused-macros" // warning: macro is not used // we define snprintf/vsnprintf on Windows so they are available, but not always used. +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size +#pragma GCC diagnostic ignored "-Wformat-security" // warning: format string is not a string literal (potentially insecure) +#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function +#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value +#pragma GCC diagnostic ignored "-Wmisleading-indentation" // [__GNUC__ >= 6] warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub. +#endif + +// Play it nice with Windows users (Update: May 2018, Notepad now supports Unix-style carriage returns!) +#ifdef _WIN32 +#define IM_NEWLINE "\r\n" +#else +#define IM_NEWLINE "\n" +#endif + +// Helpers +#if defined(_MSC_VER) && !defined(snprintf) +#define snprintf _snprintf +#endif +#if defined(_MSC_VER) && !defined(vsnprintf) +#define vsnprintf _vsnprintf +#endif + +// Format specifiers, printing 64-bit hasn't been decently standardized... +// In a real application you should be using PRId64 and PRIu64 from (non-windows) and on Windows define them yourself. +#ifdef _MSC_VER +#define IM_PRId64 "I64d" +#define IM_PRIu64 "I64u" +#else +#define IM_PRId64 "lld" +#define IM_PRIu64 "llu" +#endif + +// Helpers macros +// We normally try to not use many helpers in imgui_demo.cpp in order to make code easier to copy and paste, +// but making an exception here as those are largely simplifying code... +// In other imgui sources we can use nicer internal functions from imgui_internal.h (ImMin/ImMax) but not in the demo. +#define IM_MIN(A, B) (((A) < (B)) ? (A) : (B)) +#define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B)) +#define IM_CLAMP(V, MN, MX) ((V) < (MN) ? (MN) : (V) > (MX) ? (MX) : (V)) + +// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall +#ifndef IMGUI_CDECL +#ifdef _MSC_VER +#define IMGUI_CDECL __cdecl +#else +#define IMGUI_CDECL +#endif +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Forward Declarations, Helpers +//----------------------------------------------------------------------------- + +#if !defined(IMGUI_DISABLE_DEMO_WINDOWS) + +// Forward Declarations +static void ShowExampleAppDocuments(bool* p_open); +static void ShowExampleAppMainMenuBar(); +static void ShowExampleAppConsole(bool* p_open); +static void ShowExampleAppLog(bool* p_open); +static void ShowExampleAppLayout(bool* p_open); +static void ShowExampleAppPropertyEditor(bool* p_open); +static void ShowExampleAppLongText(bool* p_open); +static void ShowExampleAppAutoResize(bool* p_open); +static void ShowExampleAppConstrainedResize(bool* p_open); +static void ShowExampleAppSimpleOverlay(bool* p_open); +static void ShowExampleAppFullscreen(bool* p_open); +static void ShowExampleAppWindowTitles(bool* p_open); +static void ShowExampleAppCustomRendering(bool* p_open); +static void ShowExampleMenuFile(); + +// Helper to display a little (?) mark which shows a tooltip when hovered. +// In your own code you may want to display an actual icon if you are using a merged icon fonts (see docs/FONTS.md) +static void HelpMarker(const char* desc) +{ + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); + ImGui::TextUnformatted(desc); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +// Helper to wire demo markers located in code to a interactive browser +typedef void (*ImGuiDemoMarkerCallback)(const char* file, int line, const char* section, void* user_data); +extern ImGuiDemoMarkerCallback GImGuiDemoMarkerCallback; +extern void* GImGuiDemoMarkerCallbackUserData; +ImGuiDemoMarkerCallback GImGuiDemoMarkerCallback = NULL; +void* GImGuiDemoMarkerCallbackUserData = NULL; +#define IMGUI_DEMO_MARKER(section) do { if (GImGuiDemoMarkerCallback != NULL) GImGuiDemoMarkerCallback(__FILE__, __LINE__, section, GImGuiDemoMarkerCallbackUserData); } while (0) + +// Helper to display basic user controls. +void ImGui::ShowUserGuide() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui::BulletText("Double-click on title bar to collapse window."); + ImGui::BulletText( + "Click and drag on lower corner to resize window\n" + "(double-click to auto fit window to its contents)."); + ImGui::BulletText("CTRL+Click on a slider or drag box to input value as text."); + ImGui::BulletText("TAB/SHIFT+TAB to cycle through keyboard editable fields."); + ImGui::BulletText("CTRL+Tab to select a window."); + if (io.FontAllowUserScaling) + ImGui::BulletText("CTRL+Mouse Wheel to zoom window contents."); + ImGui::BulletText("While inputing text:\n"); + ImGui::Indent(); + ImGui::BulletText("CTRL+Left/Right to word jump."); + ImGui::BulletText("CTRL+A or double-click to select all."); + ImGui::BulletText("CTRL+X/C/V to use clipboard cut/copy/paste."); + ImGui::BulletText("CTRL+Z,CTRL+Y to undo/redo."); + ImGui::BulletText("ESCAPE to revert."); + ImGui::Unindent(); + ImGui::BulletText("With keyboard navigation enabled:"); + ImGui::Indent(); + ImGui::BulletText("Arrow keys to navigate."); + ImGui::BulletText("Space to activate a widget."); + ImGui::BulletText("Return to input text into a widget."); + ImGui::BulletText("Escape to deactivate a widget, close popup, exit child window."); + ImGui::BulletText("Alt to jump to the menu layer of a window."); + ImGui::Unindent(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Demo Window / ShowDemoWindow() +//----------------------------------------------------------------------------- +// - ShowDemoWindowWidgets() +// - ShowDemoWindowLayout() +// - ShowDemoWindowPopups() +// - ShowDemoWindowTables() +// - ShowDemoWindowColumns() +// - ShowDemoWindowMisc() +//----------------------------------------------------------------------------- + +// We split the contents of the big ShowDemoWindow() function into smaller functions +// (because the link time of very large functions grow non-linearly) +static void ShowDemoWindowWidgets(); +static void ShowDemoWindowLayout(); +static void ShowDemoWindowPopups(); +static void ShowDemoWindowTables(); +static void ShowDemoWindowColumns(); +static void ShowDemoWindowMisc(); + +// Demonstrate most Dear ImGui features (this is big function!) +// You may execute this function to experiment with the UI and understand what it does. +// You may then search for keywords in the code when you are interested by a specific feature. +void ImGui::ShowDemoWindow(bool* p_open) +{ + // Exceptionally add an extra assert here for people confused about initial Dear ImGui setup + // Most ImGui functions would normally just crash if the context is missing. + IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing dear imgui context. Refer to examples app!"); + + // Examples Apps (accessible from the "Examples" menu) + static bool show_app_main_menu_bar = false; + static bool show_app_documents = false; + + static bool show_app_console = false; + static bool show_app_log = false; + static bool show_app_layout = false; + static bool show_app_property_editor = false; + static bool show_app_long_text = false; + static bool show_app_auto_resize = false; + static bool show_app_constrained_resize = false; + static bool show_app_simple_overlay = false; + static bool show_app_fullscreen = false; + static bool show_app_window_titles = false; + static bool show_app_custom_rendering = false; + + if (show_app_main_menu_bar) ShowExampleAppMainMenuBar(); + if (show_app_documents) ShowExampleAppDocuments(&show_app_documents); + + if (show_app_console) ShowExampleAppConsole(&show_app_console); + if (show_app_log) ShowExampleAppLog(&show_app_log); + if (show_app_layout) ShowExampleAppLayout(&show_app_layout); + if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor); + if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text); + if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize); + if (show_app_constrained_resize) ShowExampleAppConstrainedResize(&show_app_constrained_resize); + if (show_app_simple_overlay) ShowExampleAppSimpleOverlay(&show_app_simple_overlay); + if (show_app_fullscreen) ShowExampleAppFullscreen(&show_app_fullscreen); + if (show_app_window_titles) ShowExampleAppWindowTitles(&show_app_window_titles); + if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering); + + // Dear ImGui Apps (accessible from the "Tools" menu) + static bool show_app_metrics = false; + static bool show_app_stack_tool = false; + static bool show_app_style_editor = false; + static bool show_app_about = false; + + if (show_app_metrics) { ImGui::ShowMetricsWindow(&show_app_metrics); } + if (show_app_stack_tool) { ImGui::ShowStackToolWindow(&show_app_stack_tool); } + if (show_app_about) { ImGui::ShowAboutWindow(&show_app_about); } + if (show_app_style_editor) + { + ImGui::Begin("Dear ImGui Style Editor", &show_app_style_editor); + ImGui::ShowStyleEditor(); + ImGui::End(); + } + + // Demonstrate the various window flags. Typically you would just use the default! + static bool no_titlebar = false; + static bool no_scrollbar = false; + static bool no_menu = false; + static bool no_move = false; + static bool no_resize = false; + static bool no_collapse = false; + static bool no_close = false; + static bool no_nav = false; + static bool no_background = false; + static bool no_bring_to_front = false; + static bool unsaved_document = false; + + ImGuiWindowFlags window_flags = 0; + if (no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar; + if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar; + if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar; + if (no_move) window_flags |= ImGuiWindowFlags_NoMove; + if (no_resize) window_flags |= ImGuiWindowFlags_NoResize; + if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse; + if (no_nav) window_flags |= ImGuiWindowFlags_NoNav; + if (no_background) window_flags |= ImGuiWindowFlags_NoBackground; + if (no_bring_to_front) window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus; + if (unsaved_document) window_flags |= ImGuiWindowFlags_UnsavedDocument; + if (no_close) p_open = NULL; // Don't pass our bool* to Begin + + // We specify a default position/size in case there's no data in the .ini file. + // We only do it to make the demo applications a little more welcoming, but typically this isn't required. + const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(ImVec2(main_viewport->WorkPos.x + 650, main_viewport->WorkPos.y + 20), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver); + + // Main body of the Demo window starts here. + if (!ImGui::Begin("Dear ImGui Demo", p_open, window_flags)) + { + // Early out if the window is collapsed, as an optimization. + ImGui::End(); + return; + } + + // Most "big" widgets share a common width settings by default. See 'Demo->Layout->Widgets Width' for details. + + // e.g. Use 2/3 of the space for widgets and 1/3 for labels (right align) + //ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f); + + // e.g. Leave a fixed amount of width for labels (by passing a negative value), the rest goes to widgets. + ImGui::PushItemWidth(ImGui::GetFontSize() * -12); + + // Menu Bar + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("Menu")) + { + IMGUI_DEMO_MARKER("Menu/File"); + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Examples")) + { + IMGUI_DEMO_MARKER("Menu/Examples"); + ImGui::MenuItem("Main menu bar", NULL, &show_app_main_menu_bar); + ImGui::MenuItem("Console", NULL, &show_app_console); + ImGui::MenuItem("Log", NULL, &show_app_log); + ImGui::MenuItem("Simple layout", NULL, &show_app_layout); + ImGui::MenuItem("Property editor", NULL, &show_app_property_editor); + ImGui::MenuItem("Long text display", NULL, &show_app_long_text); + ImGui::MenuItem("Auto-resizing window", NULL, &show_app_auto_resize); + ImGui::MenuItem("Constrained-resizing window", NULL, &show_app_constrained_resize); + ImGui::MenuItem("Simple overlay", NULL, &show_app_simple_overlay); + ImGui::MenuItem("Fullscreen window", NULL, &show_app_fullscreen); + ImGui::MenuItem("Manipulating window titles", NULL, &show_app_window_titles); + ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering); + ImGui::MenuItem("Documents", NULL, &show_app_documents); + ImGui::EndMenu(); + } + //if (ImGui::MenuItem("MenuItem")) {} // You can also use MenuItem() inside a menu bar! + if (ImGui::BeginMenu("Tools")) + { + IMGUI_DEMO_MARKER("Menu/Tools"); +#ifndef IMGUI_DISABLE_METRICS_WINDOW + ImGui::MenuItem("Metrics/Debugger", NULL, &show_app_metrics); + ImGui::MenuItem("Stack Tool", NULL, &show_app_stack_tool); +#endif + ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor); + ImGui::MenuItem("About Dear ImGui", NULL, &show_app_about); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + ImGui::Text("dear imgui says hello. (%s)", IMGUI_VERSION); + ImGui::Spacing(); + + IMGUI_DEMO_MARKER("Help"); + if (ImGui::CollapsingHeader("Help")) + { + ImGui::Text("ABOUT THIS DEMO:"); + ImGui::BulletText("Sections below are demonstrating many aspects of the library."); + ImGui::BulletText("The \"Examples\" menu above leads to more demo contents."); + ImGui::BulletText("The \"Tools\" menu above gives access to: About Box, Style Editor,\n" + "and Metrics/Debugger (general purpose Dear ImGui debugging tool)."); + ImGui::Separator(); + + ImGui::Text("PROGRAMMER GUIDE:"); + ImGui::BulletText("See the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!"); + ImGui::BulletText("See comments in imgui.cpp."); + ImGui::BulletText("See example applications in the examples/ folder."); + ImGui::BulletText("Read the FAQ at http://www.dearimgui.org/faq/"); + ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls."); + ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls."); + ImGui::Separator(); + + ImGui::Text("USER GUIDE:"); + ImGui::ShowUserGuide(); + } + + IMGUI_DEMO_MARKER("Configuration"); + if (ImGui::CollapsingHeader("Configuration")) + { + ImGuiIO& io = ImGui::GetIO(); + + if (ImGui::TreeNode("Configuration##2")) + { + ImGui::CheckboxFlags("io.ConfigFlags: NavEnableKeyboard", &io.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard); + ImGui::SameLine(); HelpMarker("Enable keyboard controls."); + ImGui::CheckboxFlags("io.ConfigFlags: NavEnableGamepad", &io.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad); + ImGui::SameLine(); HelpMarker("Enable gamepad controls. Require backend to set io.BackendFlags |= ImGuiBackendFlags_HasGamepad.\n\nRead instructions in imgui.cpp for details."); + ImGui::CheckboxFlags("io.ConfigFlags: NavEnableSetMousePos", &io.ConfigFlags, ImGuiConfigFlags_NavEnableSetMousePos); + ImGui::SameLine(); HelpMarker("Instruct navigation to move the mouse cursor. See comment for ImGuiConfigFlags_NavEnableSetMousePos."); + ImGui::CheckboxFlags("io.ConfigFlags: NoMouse", &io.ConfigFlags, ImGuiConfigFlags_NoMouse); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) + { + // The "NoMouse" option can get us stuck with a disabled mouse! Let's provide an alternative way to fix it: + if (fmodf((float)ImGui::GetTime(), 0.40f) < 0.20f) + { + ImGui::SameLine(); + ImGui::Text("<>"); + } + if (ImGui::IsKeyPressed(ImGuiKey_Space)) + io.ConfigFlags &= ~ImGuiConfigFlags_NoMouse; + } + ImGui::CheckboxFlags("io.ConfigFlags: NoMouseCursorChange", &io.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange); + ImGui::SameLine(); HelpMarker("Instruct backend to not alter mouse cursor shape and visibility."); + ImGui::Checkbox("io.ConfigInputTrickleEventQueue", &io.ConfigInputTrickleEventQueue); + ImGui::SameLine(); HelpMarker("Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates."); + ImGui::Checkbox("io.ConfigInputTextCursorBlink", &io.ConfigInputTextCursorBlink); + ImGui::SameLine(); HelpMarker("Enable blinking cursor (optional as some users consider it to be distracting)."); + ImGui::Checkbox("io.ConfigDragClickToInputText", &io.ConfigDragClickToInputText); + ImGui::SameLine(); HelpMarker("Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving)."); + ImGui::Checkbox("io.ConfigWindowsResizeFromEdges", &io.ConfigWindowsResizeFromEdges); + ImGui::SameLine(); HelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback."); + ImGui::Checkbox("io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly); + ImGui::Checkbox("io.MouseDrawCursor", &io.MouseDrawCursor); + ImGui::SameLine(); HelpMarker("Instruct Dear ImGui to render a mouse cursor itself. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something)."); + ImGui::Text("Also see Style->Rendering for rendering options."); + ImGui::TreePop(); + ImGui::Separator(); + } + + IMGUI_DEMO_MARKER("Configuration/Backend Flags"); + if (ImGui::TreeNode("Backend Flags")) + { + HelpMarker( + "Those flags are set by the backends (imgui_impl_xxx files) to specify their capabilities.\n" + "Here we expose them as read-only fields to avoid breaking interactions with your backend."); + + // Make a local copy to avoid modifying actual backend flags. + // FIXME: We don't use BeginDisabled() to keep label bright, maybe we need a BeginReadonly() equivalent.. + ImGuiBackendFlags backend_flags = io.BackendFlags; + ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", &backend_flags, ImGuiBackendFlags_HasGamepad); + ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &backend_flags, ImGuiBackendFlags_HasMouseCursors); + ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", &backend_flags, ImGuiBackendFlags_HasSetMousePos); + ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", &backend_flags, ImGuiBackendFlags_RendererHasVtxOffset); + ImGui::TreePop(); + ImGui::Separator(); + } + + IMGUI_DEMO_MARKER("Configuration/Style"); + if (ImGui::TreeNode("Style")) + { + HelpMarker("The same contents can be accessed in 'Tools->Style Editor' or by calling the ShowStyleEditor() function."); + ImGui::ShowStyleEditor(); + ImGui::TreePop(); + ImGui::Separator(); + } + + IMGUI_DEMO_MARKER("Configuration/Capture, Logging"); + if (ImGui::TreeNode("Capture/Logging")) + { + HelpMarker( + "The logging API redirects all text output so you can easily capture the content of " + "a window or a block. Tree nodes can be automatically expanded.\n" + "Try opening any of the contents below in this window and then click one of the \"Log To\" button."); + ImGui::LogButtons(); + + HelpMarker("You can also call ImGui::LogText() to output directly to the log without a visual output."); + if (ImGui::Button("Copy \"Hello, world!\" to clipboard")) + { + ImGui::LogToClipboard(); + ImGui::LogText("Hello, world!"); + ImGui::LogFinish(); + } + ImGui::TreePop(); + } + } + + IMGUI_DEMO_MARKER("Window options"); + if (ImGui::CollapsingHeader("Window options")) + { + if (ImGui::BeginTable("split", 3)) + { + ImGui::TableNextColumn(); ImGui::Checkbox("No titlebar", &no_titlebar); + ImGui::TableNextColumn(); ImGui::Checkbox("No scrollbar", &no_scrollbar); + ImGui::TableNextColumn(); ImGui::Checkbox("No menu", &no_menu); + ImGui::TableNextColumn(); ImGui::Checkbox("No move", &no_move); + ImGui::TableNextColumn(); ImGui::Checkbox("No resize", &no_resize); + ImGui::TableNextColumn(); ImGui::Checkbox("No collapse", &no_collapse); + ImGui::TableNextColumn(); ImGui::Checkbox("No close", &no_close); + ImGui::TableNextColumn(); ImGui::Checkbox("No nav", &no_nav); + ImGui::TableNextColumn(); ImGui::Checkbox("No background", &no_background); + ImGui::TableNextColumn(); ImGui::Checkbox("No bring to front", &no_bring_to_front); + ImGui::TableNextColumn(); ImGui::Checkbox("Unsaved document", &unsaved_document); + ImGui::EndTable(); + } + } + + // All demo contents + ShowDemoWindowWidgets(); + ShowDemoWindowLayout(); + ShowDemoWindowPopups(); + ShowDemoWindowTables(); + ShowDemoWindowMisc(); + + // End of ShowDemoWindow() + ImGui::PopItemWidth(); + ImGui::End(); +} + +static void ShowDemoWindowWidgets() +{ + IMGUI_DEMO_MARKER("Widgets"); + if (!ImGui::CollapsingHeader("Widgets")) + return; + + static bool disable_all = false; // The Checkbox for that is inside the "Disabled" section at the bottom + if (disable_all) + ImGui::BeginDisabled(); + + IMGUI_DEMO_MARKER("Widgets/Basic"); + if (ImGui::TreeNode("Basic")) + { + IMGUI_DEMO_MARKER("Widgets/Basic/Button"); + static int clicked = 0; + if (ImGui::Button("Button")) + clicked++; + if (clicked & 1) + { + ImGui::SameLine(); + ImGui::Text("Thanks for clicking me!"); + } + + IMGUI_DEMO_MARKER("Widgets/Basic/Checkbox"); + static bool check = true; + ImGui::Checkbox("checkbox", &check); + + IMGUI_DEMO_MARKER("Widgets/Basic/RadioButton"); + static int e = 0; + ImGui::RadioButton("radio a", &e, 0); ImGui::SameLine(); + ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine(); + ImGui::RadioButton("radio c", &e, 2); + + // Color buttons, demonstrate using PushID() to add unique identifier in the ID stack, and changing style. + IMGUI_DEMO_MARKER("Widgets/Basic/Buttons (Colored)"); + for (int i = 0; i < 7; i++) + { + if (i > 0) + ImGui::SameLine(); + ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); + ImGui::Button("Click"); + ImGui::PopStyleColor(3); + ImGui::PopID(); + } + + // Use AlignTextToFramePadding() to align text baseline to the baseline of framed widgets elements + // (otherwise a Text+SameLine+Button sequence will have the text a little too high by default!) + // See 'Demo->Layout->Text Baseline Alignment' for details. + ImGui::AlignTextToFramePadding(); + ImGui::Text("Hold to repeat:"); + ImGui::SameLine(); + + // Arrow buttons with Repeater + IMGUI_DEMO_MARKER("Widgets/Basic/Buttons (Repeating)"); + static int counter = 0; + float spacing = ImGui::GetStyle().ItemInnerSpacing.x; + ImGui::PushButtonRepeat(true); + if (ImGui::ArrowButton("##left", ImGuiDir_Left)) { counter--; } + ImGui::SameLine(0.0f, spacing); + if (ImGui::ArrowButton("##right", ImGuiDir_Right)) { counter++; } + ImGui::PopButtonRepeat(); + ImGui::SameLine(); + ImGui::Text("%d", counter); + + IMGUI_DEMO_MARKER("Widgets/Basic/Tooltips"); + ImGui::Text("Hover over me"); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("I am a tooltip"); + + ImGui::SameLine(); + ImGui::Text("- or me"); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::Text("I am a fancy tooltip"); + static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; + ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr)); + ImGui::EndTooltip(); + } + + ImGui::Separator(); + ImGui::LabelText("label", "Value"); + + { + // Using the _simplified_ one-liner Combo() api here + // See "Combo" section for examples of how to use the more flexible BeginCombo()/EndCombo() api. + IMGUI_DEMO_MARKER("Widgets/Basic/Combo"); + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIIIIII", "JJJJ", "KKKKKKK" }; + static int item_current = 0; + ImGui::Combo("combo", &item_current, items, IM_ARRAYSIZE(items)); + ImGui::SameLine(); HelpMarker( + "Using the simplified one-liner Combo API here.\nRefer to the \"Combo\" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API."); + } + + { + // To wire InputText() with std::string or any other custom string type, + // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file. + IMGUI_DEMO_MARKER("Widgets/Basic/InputText"); + static char str0[128] = "Hello, world!"; + ImGui::InputText("input text", str0, IM_ARRAYSIZE(str0)); + ImGui::SameLine(); HelpMarker( + "USER:\n" + "Hold SHIFT or use mouse to select text.\n" + "CTRL+Left/Right to word jump.\n" + "CTRL+A or double-click to select all.\n" + "CTRL+X,CTRL+C,CTRL+V clipboard.\n" + "CTRL+Z,CTRL+Y undo/redo.\n" + "ESCAPE to revert.\n\n" + "PROGRAMMER:\n" + "You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() " + "to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example (this is not demonstrated " + "in imgui_demo.cpp)."); + + static char str1[128] = ""; + ImGui::InputTextWithHint("input text (w/ hint)", "enter text here", str1, IM_ARRAYSIZE(str1)); + + IMGUI_DEMO_MARKER("Widgets/Basic/InputInt, InputFloat"); + static int i0 = 123; + ImGui::InputInt("input int", &i0); + + static float f0 = 0.001f; + ImGui::InputFloat("input float", &f0, 0.01f, 1.0f, "%.3f"); + + static double d0 = 999999.00000001; + ImGui::InputDouble("input double", &d0, 0.01f, 1.0f, "%.8f"); + + static float f1 = 1.e10f; + ImGui::InputFloat("input scientific", &f1, 0.0f, 0.0f, "%e"); + ImGui::SameLine(); HelpMarker( + "You can input value using the scientific notation,\n" + " e.g. \"1e+8\" becomes \"100000000\"."); + + static float vec4a[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; + ImGui::InputFloat3("input float3", vec4a); + } + + { + IMGUI_DEMO_MARKER("Widgets/Basic/DragInt, DragFloat"); + static int i1 = 50, i2 = 42; + ImGui::DragInt("drag int", &i1, 1); + ImGui::SameLine(); HelpMarker( + "Click and drag to edit value.\n" + "Hold SHIFT/ALT for faster/slower edit.\n" + "Double-click or CTRL+click to input value."); + + ImGui::DragInt("drag int 0..100", &i2, 1, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp); + + static float f1 = 1.00f, f2 = 0.0067f; + ImGui::DragFloat("drag float", &f1, 0.005f); + ImGui::DragFloat("drag small float", &f2, 0.0001f, 0.0f, 0.0f, "%.06f ns"); + } + + { + IMGUI_DEMO_MARKER("Widgets/Basic/SliderInt, SliderFloat"); + static int i1 = 0; + ImGui::SliderInt("slider int", &i1, -1, 3); + ImGui::SameLine(); HelpMarker("CTRL+click to input value."); + + static float f1 = 0.123f, f2 = 0.0f; + ImGui::SliderFloat("slider float", &f1, 0.0f, 1.0f, "ratio = %.3f"); + ImGui::SliderFloat("slider float (log)", &f2, -10.0f, 10.0f, "%.4f", ImGuiSliderFlags_Logarithmic); + + IMGUI_DEMO_MARKER("Widgets/Basic/SliderAngle"); + static float angle = 0.0f; + ImGui::SliderAngle("slider angle", &angle); + + // Using the format string to display a name instead of an integer. + // Here we completely omit '%d' from the format string, so it'll only display a name. + // This technique can also be used with DragInt(). + IMGUI_DEMO_MARKER("Widgets/Basic/Slider (enum)"); + enum Element { Element_Fire, Element_Earth, Element_Air, Element_Water, Element_COUNT }; + static int elem = Element_Fire; + const char* elems_names[Element_COUNT] = { "Fire", "Earth", "Air", "Water" }; + const char* elem_name = (elem >= 0 && elem < Element_COUNT) ? elems_names[elem] : "Unknown"; + ImGui::SliderInt("slider enum", &elem, 0, Element_COUNT - 1, elem_name); + ImGui::SameLine(); HelpMarker("Using the format string parameter to display a name instead of the underlying integer."); + } + + { + IMGUI_DEMO_MARKER("Widgets/Basic/ColorEdit3, ColorEdit4"); + static float col1[3] = { 1.0f, 0.0f, 0.2f }; + static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; + ImGui::ColorEdit3("color 1", col1); + ImGui::SameLine(); HelpMarker( + "Click on the color square to open a color picker.\n" + "Click and hold to use drag and drop.\n" + "Right-click on the color square to show options.\n" + "CTRL+click on individual component to input value.\n"); + + ImGui::ColorEdit4("color 2", col2); + } + + { + // Using the _simplified_ one-liner ListBox() api here + // See "List boxes" section for examples of how to use the more flexible BeginListBox()/EndListBox() api. + IMGUI_DEMO_MARKER("Widgets/Basic/ListBox"); + const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pineapple", "Strawberry", "Watermelon" }; + static int item_current = 1; + ImGui::ListBox("listbox", &item_current, items, IM_ARRAYSIZE(items), 4); + ImGui::SameLine(); HelpMarker( + "Using the simplified one-liner ListBox API here.\nRefer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API."); + } + + ImGui::TreePop(); + } + + // Testing ImGuiOnceUponAFrame helper. + //static ImGuiOnceUponAFrame once; + //for (int i = 0; i < 5; i++) + // if (once) + // ImGui::Text("This will be displayed only once."); + + IMGUI_DEMO_MARKER("Widgets/Trees"); + if (ImGui::TreeNode("Trees")) + { + IMGUI_DEMO_MARKER("Widgets/Trees/Basic trees"); + if (ImGui::TreeNode("Basic trees")) + { + for (int i = 0; i < 5; i++) + { + // Use SetNextItemOpen() so set the default state of a node to be open. We could + // also use TreeNodeEx() with the ImGuiTreeNodeFlags_DefaultOpen flag to achieve the same thing! + if (i == 0) + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + + if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i)) + { + ImGui::Text("blah blah"); + ImGui::SameLine(); + if (ImGui::SmallButton("button")) {} + ImGui::TreePop(); + } + } + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Trees/Advanced, with Selectable nodes"); + if (ImGui::TreeNode("Advanced, with Selectable nodes")) + { + HelpMarker( + "This is a more typical looking tree with selectable nodes.\n" + "Click to select, CTRL+Click to toggle, click on arrows or double-click to open."); + static ImGuiTreeNodeFlags base_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanAvailWidth; + static bool align_label_with_current_x_position = false; + static bool test_drag_and_drop = false; + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", &base_flags, ImGuiTreeNodeFlags_OpenOnArrow); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", &base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", &base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); ImGui::SameLine(); HelpMarker("Extend hit area to all available width instead of allowing more items to be laid out after the node."); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", &base_flags, ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::Checkbox("Align label with current X position", &align_label_with_current_x_position); + ImGui::Checkbox("Test tree node as drag source", &test_drag_and_drop); + ImGui::Text("Hello!"); + if (align_label_with_current_x_position) + ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing()); + + // 'selection_mask' is dumb representation of what may be user-side selection state. + // You may retain selection state inside or outside your objects in whatever format you see fit. + // 'node_clicked' is temporary storage of what node we have clicked to process selection at the end + /// of the loop. May be a pointer to your own node type, etc. + static int selection_mask = (1 << 2); + int node_clicked = -1; + for (int i = 0; i < 6; i++) + { + // Disable the default "open on single-click behavior" + set Selected flag according to our selection. + // To alter selection we use IsItemClicked() && !IsItemToggledOpen(), so clicking on an arrow doesn't alter selection. + ImGuiTreeNodeFlags node_flags = base_flags; + const bool is_selected = (selection_mask & (1 << i)) != 0; + if (is_selected) + node_flags |= ImGuiTreeNodeFlags_Selected; + if (i < 3) + { + // Items 0..2 are Tree Node + bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Node %d", i); + if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen()) + node_clicked = i; + if (test_drag_and_drop && ImGui::BeginDragDropSource()) + { + ImGui::SetDragDropPayload("_TREENODE", NULL, 0); + ImGui::Text("This is a drag and drop source"); + ImGui::EndDragDropSource(); + } + if (node_open) + { + ImGui::BulletText("Blah blah\nBlah Blah"); + ImGui::TreePop(); + } + } + else + { + // Items 3..5 are Tree Leaves + // The only reason we use TreeNode at all is to allow selection of the leaf. Otherwise we can + // use BulletText() or advance the cursor by GetTreeNodeToLabelSpacing() and call Text(). + node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet + ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i); + if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen()) + node_clicked = i; + if (test_drag_and_drop && ImGui::BeginDragDropSource()) + { + ImGui::SetDragDropPayload("_TREENODE", NULL, 0); + ImGui::Text("This is a drag and drop source"); + ImGui::EndDragDropSource(); + } + } + } + if (node_clicked != -1) + { + // Update selection state + // (process outside of tree loop to avoid visual inconsistencies during the clicking frame) + if (ImGui::GetIO().KeyCtrl) + selection_mask ^= (1 << node_clicked); // CTRL+click to toggle + else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, may want to preserve selection when clicking on item that is part of the selection + selection_mask = (1 << node_clicked); // Click to single-select + } + if (align_label_with_current_x_position) + ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing()); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Collapsing Headers"); + if (ImGui::TreeNode("Collapsing Headers")) + { + static bool closable_group = true; + ImGui::Checkbox("Show 2nd header", &closable_group); + if (ImGui::CollapsingHeader("Header", ImGuiTreeNodeFlags_None)) + { + ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); + for (int i = 0; i < 5; i++) + ImGui::Text("Some content %d", i); + } + if (ImGui::CollapsingHeader("Header with a close button", &closable_group)) + { + ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); + for (int i = 0; i < 5; i++) + ImGui::Text("More content %d", i); + } + /* + if (ImGui::CollapsingHeader("Header with a bullet", ImGuiTreeNodeFlags_Bullet)) + ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); + */ + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Bullets"); + if (ImGui::TreeNode("Bullets")) + { + ImGui::BulletText("Bullet point 1"); + ImGui::BulletText("Bullet point 2\nOn multiple lines"); + if (ImGui::TreeNode("Tree node")) + { + ImGui::BulletText("Another bullet point"); + ImGui::TreePop(); + } + ImGui::Bullet(); ImGui::Text("Bullet point 3 (two calls)"); + ImGui::Bullet(); ImGui::SmallButton("Button"); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text"); + if (ImGui::TreeNode("Text")) + { + IMGUI_DEMO_MARKER("Widgets/Text/Colored Text"); + if (ImGui::TreeNode("Colorful Text")) + { + // Using shortcut. You can use PushStyleColor()/PopStyleColor() for more flexibility. + ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), "Pink"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "Yellow"); + ImGui::TextDisabled("Disabled"); + ImGui::SameLine(); HelpMarker("The TextDisabled color is stored in ImGuiStyle."); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text/Word Wrapping"); + if (ImGui::TreeNode("Word Wrapping")) + { + // Using shortcut. You can use PushTextWrapPos()/PopTextWrapPos() for more flexibility. + ImGui::TextWrapped( + "This text should automatically wrap on the edge of the window. The current implementation " + "for text wrapping follows simple rules suitable for English and possibly other languages."); + ImGui::Spacing(); + + static float wrap_width = 200.0f; + ImGui::SliderFloat("Wrap width", &wrap_width, -20, 600, "%.0f"); + + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + for (int n = 0; n < 2; n++) + { + ImGui::Text("Test paragraph %d:", n); + ImVec2 pos = ImGui::GetCursorScreenPos(); + ImVec2 marker_min = ImVec2(pos.x + wrap_width, pos.y); + ImVec2 marker_max = ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()); + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width); + if (n == 0) + ImGui::Text("The lazy dog is a good dog. This paragraph should fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width); + else + ImGui::Text("aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh"); + + // Draw actual text bounding box, following by marker of our expected limit (should not overlap!) + draw_list->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255, 255, 0, 255)); + draw_list->AddRectFilled(marker_min, marker_max, IM_COL32(255, 0, 255, 255)); + ImGui::PopTextWrapPos(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text/UTF-8 Text"); + if (ImGui::TreeNode("UTF-8 Text")) + { + // UTF-8 test with Japanese characters + // (Needs a suitable font? Try "Google Noto" or "Arial Unicode". See docs/FONTS.md for details.) + // - From C++11 you can use the u8"my text" syntax to encode literal strings as UTF-8 + // - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. in Visual Studio, you + // can save your source files as 'UTF-8 without signature'). + // - FOR THIS DEMO FILE ONLY, BECAUSE WE WANT TO SUPPORT OLD COMPILERS, WE ARE *NOT* INCLUDING RAW UTF-8 + // CHARACTERS IN THIS SOURCE FILE. Instead we are encoding a few strings with hexadecimal constants. + // Don't do this in your application! Please use u8"text in any language" in your application! + // Note that characters values are preserved even by InputText() if the font cannot be displayed, + // so you can safely copy & paste garbled characters into another application. + ImGui::TextWrapped( + "CJK text will only appears if the font was loaded with the appropriate CJK character ranges. " + "Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. " + "Read docs/FONTS.md for details."); + ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); // Normally we would use u8"blah blah" with the proper characters directly in the string. + ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)"); + static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"; + //static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis + ImGui::InputText("UTF-8 input", buf, IM_ARRAYSIZE(buf)); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Images"); + if (ImGui::TreeNode("Images")) + { + ImGuiIO& io = ImGui::GetIO(); + ImGui::TextWrapped( + "Below we are displaying the font texture (which is the only texture we have access to in this demo). " + "Use the 'ImTextureID' type as storage to pass pointers or identifier to your own texture data. " + "Hover the texture for a zoomed view!"); + + // Below we are displaying the font texture because it is the only texture we have access to inside the demo! + // Remember that ImTextureID is just storage for whatever you want it to be. It is essentially a value that + // will be passed to the rendering backend via the ImDrawCmd structure. + // If you use one of the default imgui_impl_XXXX.cpp rendering backend, they all have comments at the top + // of their respective source file to specify what they expect to be stored in ImTextureID, for example: + // - The imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer + // - The imgui_impl_opengl3.cpp renderer expect a GLuint OpenGL texture identifier, etc. + // More: + // - If you decided that ImTextureID = MyEngineTexture*, then you can pass your MyEngineTexture* pointers + // to ImGui::Image(), and gather width/height through your own functions, etc. + // - You can use ShowMetricsWindow() to inspect the draw data that are being passed to your renderer, + // it will help you debug issues if you are confused about it. + // - Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage(). + // - Read https://github.com/ocornut/imgui/blob/master/docs/FAQ.md + // - Read https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples + ImTextureID my_tex_id = io.Fonts->TexID; + float my_tex_w = (float)io.Fonts->TexWidth; + float my_tex_h = (float)io.Fonts->TexHeight; + { + ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h); + ImVec2 pos = ImGui::GetCursorScreenPos(); + ImVec2 uv_min = ImVec2(0.0f, 0.0f); // Top-left + ImVec2 uv_max = ImVec2(1.0f, 1.0f); // Lower-right + ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint + ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f); // 50% opaque white + ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, tint_col, border_col); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + float region_sz = 32.0f; + float region_x = io.MousePos.x - pos.x - region_sz * 0.5f; + float region_y = io.MousePos.y - pos.y - region_sz * 0.5f; + float zoom = 4.0f; + if (region_x < 0.0f) { region_x = 0.0f; } + else if (region_x > my_tex_w - region_sz) { region_x = my_tex_w - region_sz; } + if (region_y < 0.0f) { region_y = 0.0f; } + else if (region_y > my_tex_h - region_sz) { region_y = my_tex_h - region_sz; } + ImGui::Text("Min: (%.2f, %.2f)", region_x, region_y); + ImGui::Text("Max: (%.2f, %.2f)", region_x + region_sz, region_y + region_sz); + ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h); + ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h); + ImGui::Image(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, tint_col, border_col); + ImGui::EndTooltip(); + } + } + + IMGUI_DEMO_MARKER("Widgets/Images/Textured buttons"); + ImGui::TextWrapped("And now some textured buttons.."); + static int pressed_count = 0; + for (int i = 0; i < 8; i++) + { + ImGui::PushID(i); + int frame_padding = -1 + i; // -1 == uses default padding (style.FramePadding) + ImVec2 size = ImVec2(32.0f, 32.0f); // Size of the image we want to make visible + ImVec2 uv0 = ImVec2(0.0f, 0.0f); // UV coordinates for lower-left + ImVec2 uv1 = ImVec2(32.0f / my_tex_w, 32.0f / my_tex_h);// UV coordinates for (32,32) in our texture + ImVec4 bg_col = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); // Black background + ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint + if (ImGui::ImageButton(my_tex_id, size, uv0, uv1, frame_padding, bg_col, tint_col)) + pressed_count += 1; + ImGui::PopID(); + ImGui::SameLine(); + } + ImGui::NewLine(); + ImGui::Text("Pressed %d times.", pressed_count); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Combo"); + if (ImGui::TreeNode("Combo")) + { + // Expose flags as checkbox for the demo + static ImGuiComboFlags flags = 0; + ImGui::CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", &flags, ImGuiComboFlags_PopupAlignLeft); + ImGui::SameLine(); HelpMarker("Only makes a difference if the popup is larger than the combo"); + if (ImGui::CheckboxFlags("ImGuiComboFlags_NoArrowButton", &flags, ImGuiComboFlags_NoArrowButton)) + flags &= ~ImGuiComboFlags_NoPreview; // Clear the other flag, as we cannot combine both + if (ImGui::CheckboxFlags("ImGuiComboFlags_NoPreview", &flags, ImGuiComboFlags_NoPreview)) + flags &= ~ImGuiComboFlags_NoArrowButton; // Clear the other flag, as we cannot combine both + + // Using the generic BeginCombo() API, you have full control over how to display the combo contents. + // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively + // stored in the object itself, etc.) + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; + static int item_current_idx = 0; // Here we store our selection data as an index. + const char* combo_preview_value = items[item_current_idx]; // Pass in the preview value visible before opening the combo (it could be anything) + if (ImGui::BeginCombo("combo 1", combo_preview_value, flags)) + { + for (int n = 0; n < IM_ARRAYSIZE(items); n++) + { + const bool is_selected = (item_current_idx == n); + if (ImGui::Selectable(items[n], is_selected)) + item_current_idx = n; + + // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + + // Simplified one-liner Combo() API, using values packed in a single constant string + // This is a convenience for when the selection set is small and known at compile-time. + static int item_current_2 = 0; + ImGui::Combo("combo 2 (one-liner)", &item_current_2, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); + + // Simplified one-liner Combo() using an array of const char* + // This is not very useful (may obsolete): prefer using BeginCombo()/EndCombo() for full control. + static int item_current_3 = -1; // If the selection isn't within 0..count, Combo won't display a preview + ImGui::Combo("combo 3 (array)", &item_current_3, items, IM_ARRAYSIZE(items)); + + // Simplified one-liner Combo() using an accessor function + struct Funcs { static bool ItemGetter(void* data, int n, const char** out_str) { *out_str = ((const char**)data)[n]; return true; } }; + static int item_current_4 = 0; + ImGui::Combo("combo 4 (function)", &item_current_4, &Funcs::ItemGetter, items, IM_ARRAYSIZE(items)); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/List Boxes"); + if (ImGui::TreeNode("List boxes")) + { + // Using the generic BeginListBox() API, you have full control over how to display the combo contents. + // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively + // stored in the object itself, etc.) + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; + static int item_current_idx = 0; // Here we store our selection data as an index. + if (ImGui::BeginListBox("listbox 1")) + { + for (int n = 0; n < IM_ARRAYSIZE(items); n++) + { + const bool is_selected = (item_current_idx == n); + if (ImGui::Selectable(items[n], is_selected)) + item_current_idx = n; + + // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndListBox(); + } + + // Custom size: use all width, 5 items tall + ImGui::Text("Full-width:"); + if (ImGui::BeginListBox("##listbox 2", ImVec2(-FLT_MIN, 5 * ImGui::GetTextLineHeightWithSpacing()))) + { + for (int n = 0; n < IM_ARRAYSIZE(items); n++) + { + const bool is_selected = (item_current_idx == n); + if (ImGui::Selectable(items[n], is_selected)) + item_current_idx = n; + + // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndListBox(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Selectables"); + if (ImGui::TreeNode("Selectables")) + { + // Selectable() has 2 overloads: + // - The one taking "bool selected" as a read-only selection information. + // When Selectable() has been clicked it returns true and you can alter selection state accordingly. + // - The one taking "bool* p_selected" as a read-write selection information (convenient in some cases) + // The earlier is more flexible, as in real application your selection may be stored in many different ways + // and not necessarily inside a bool value (e.g. in flags within objects, as an external list, etc). + IMGUI_DEMO_MARKER("Widgets/Selectables/Basic"); + if (ImGui::TreeNode("Basic")) + { + static bool selection[5] = { false, true, false, false, false }; + ImGui::Selectable("1. I am selectable", &selection[0]); + ImGui::Selectable("2. I am selectable", &selection[1]); + ImGui::Text("(I am not selectable)"); + ImGui::Selectable("4. I am selectable", &selection[3]); + if (ImGui::Selectable("5. I am double clickable", selection[4], ImGuiSelectableFlags_AllowDoubleClick)) + if (ImGui::IsMouseDoubleClicked(0)) + selection[4] = !selection[4]; + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Single Selection"); + if (ImGui::TreeNode("Selection State: Single Selection")) + { + static int selected = -1; + for (int n = 0; n < 5; n++) + { + char buf[32]; + sprintf(buf, "Object %d", n); + if (ImGui::Selectable(buf, selected == n)) + selected = n; + } + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Multiple Selection"); + if (ImGui::TreeNode("Selection State: Multiple Selection")) + { + HelpMarker("Hold CTRL and click to select multiple items."); + static bool selection[5] = { false, false, false, false, false }; + for (int n = 0; n < 5; n++) + { + char buf[32]; + sprintf(buf, "Object %d", n); + if (ImGui::Selectable(buf, selection[n])) + { + if (!ImGui::GetIO().KeyCtrl) // Clear selection when CTRL is not held + memset(selection, 0, sizeof(selection)); + selection[n] ^= 1; + } + } + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Rendering more text into the same line"); + if (ImGui::TreeNode("Rendering more text into the same line")) + { + // Using the Selectable() override that takes "bool* p_selected" parameter, + // this function toggle your bool value automatically. + static bool selected[3] = { false, false, false }; + ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); + ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(300); ImGui::Text("12,345 bytes"); + ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/In columns"); + if (ImGui::TreeNode("In columns")) + { + static bool selected[10] = {}; + + if (ImGui::BeginTable("split1", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders)) + { + for (int i = 0; i < 10; i++) + { + char label[32]; + sprintf(label, "Item %d", i); + ImGui::TableNextColumn(); + ImGui::Selectable(label, &selected[i]); // FIXME-TABLE: Selection overlap + } + ImGui::EndTable(); + } + ImGui::Spacing(); + if (ImGui::BeginTable("split2", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders)) + { + for (int i = 0; i < 10; i++) + { + char label[32]; + sprintf(label, "Item %d", i); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Selectable(label, &selected[i], ImGuiSelectableFlags_SpanAllColumns); + ImGui::TableNextColumn(); + ImGui::Text("Some other contents"); + ImGui::TableNextColumn(); + ImGui::Text("123456"); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Grid"); + if (ImGui::TreeNode("Grid")) + { + static char selected[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; + + // Add in a bit of silly fun... + const float time = (float)ImGui::GetTime(); + const bool winning_state = memchr(selected, 0, sizeof(selected)) == NULL; // If all cells are selected... + if (winning_state) + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f + 0.5f * cosf(time * 2.0f), 0.5f + 0.5f * sinf(time * 3.0f))); + + for (int y = 0; y < 4; y++) + for (int x = 0; x < 4; x++) + { + if (x > 0) + ImGui::SameLine(); + ImGui::PushID(y * 4 + x); + if (ImGui::Selectable("Sailor", selected[y][x] != 0, 0, ImVec2(50, 50))) + { + // Toggle clicked cell + toggle neighbors + selected[y][x] ^= 1; + if (x > 0) { selected[y][x - 1] ^= 1; } + if (x < 3) { selected[y][x + 1] ^= 1; } + if (y > 0) { selected[y - 1][x] ^= 1; } + if (y < 3) { selected[y + 1][x] ^= 1; } + } + ImGui::PopID(); + } + + if (winning_state) + ImGui::PopStyleVar(); + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Alignment"); + if (ImGui::TreeNode("Alignment")) + { + HelpMarker( + "By default, Selectables uses style.SelectableTextAlign but it can be overridden on a per-item " + "basis using PushStyleVar(). You'll probably want to always keep your default situation to " + "left-align otherwise it becomes difficult to layout multiple items on a same line"); + static bool selected[3 * 3] = { true, false, true, false, true, false, true, false, true }; + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 3; x++) + { + ImVec2 alignment = ImVec2((float)x / 2.0f, (float)y / 2.0f); + char name[32]; + sprintf(name, "(%.1f,%.1f)", alignment.x, alignment.y); + if (x > 0) ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, alignment); + ImGui::Selectable(name, &selected[3 * y + x], ImGuiSelectableFlags_None, ImVec2(80, 80)); + ImGui::PopStyleVar(); + } + } + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + // To wire InputText() with std::string or any other custom string type, + // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file. + IMGUI_DEMO_MARKER("Widgets/Text Input"); + if (ImGui::TreeNode("Text Input")) + { + IMGUI_DEMO_MARKER("Widgets/Text Input/Multi-line Text Input"); + if (ImGui::TreeNode("Multi-line Text Input")) + { + // Note: we are using a fixed-sized buffer for simplicity here. See ImGuiInputTextFlags_CallbackResize + // and the code in misc/cpp/imgui_stdlib.h for how to setup InputText() for dynamically resizing strings. + static char text[1024 * 16] = + "/*\n" + " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n" + " the hexadecimal encoding of one offending instruction,\n" + " more formally, the invalid operand with locked CMPXCHG8B\n" + " instruction bug, is a design flaw in the majority of\n" + " Intel Pentium, Pentium MMX, and Pentium OverDrive\n" + " processors (all in the P5 microarchitecture).\n" + "*/\n\n" + "label:\n" + "\tlock cmpxchg8b eax\n"; + + static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput; + HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include in here)"); + ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly); + ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", &flags, ImGuiInputTextFlags_AllowTabInput); + ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", &flags, ImGuiInputTextFlags_CtrlEnterForNewLine); + ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text Input/Filtered Text Input"); + if (ImGui::TreeNode("Filtered Text Input")) + { + struct TextFilters + { + // Return 0 (pass) if the character is 'i' or 'm' or 'g' or 'u' or 'i' + static int FilterImGuiLetters(ImGuiInputTextCallbackData* data) + { + if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar)) + return 0; + return 1; + } + }; + + static char buf1[64] = ""; ImGui::InputText("default", buf1, 64); + static char buf2[64] = ""; ImGui::InputText("decimal", buf2, 64, ImGuiInputTextFlags_CharsDecimal); + static char buf3[64] = ""; ImGui::InputText("hexadecimal", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase); + static char buf4[64] = ""; ImGui::InputText("uppercase", buf4, 64, ImGuiInputTextFlags_CharsUppercase); + static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank); + static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text Input/Password input"); + if (ImGui::TreeNode("Password Input")) + { + static char password[64] = "password123"; + ImGui::InputText("password", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password); + ImGui::SameLine(); HelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n"); + ImGui::InputTextWithHint("password (w/ hint)", "", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password); + ImGui::InputText("password (clear)", password, IM_ARRAYSIZE(password)); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Completion, History, Edit Callbacks")) + { + struct Funcs + { + static int MyCallback(ImGuiInputTextCallbackData* data) + { + if (data->EventFlag == ImGuiInputTextFlags_CallbackCompletion) + { + data->InsertChars(data->CursorPos, ".."); + } + else if (data->EventFlag == ImGuiInputTextFlags_CallbackHistory) + { + if (data->EventKey == ImGuiKey_UpArrow) + { + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, "Pressed Up!"); + data->SelectAll(); + } + else if (data->EventKey == ImGuiKey_DownArrow) + { + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, "Pressed Down!"); + data->SelectAll(); + } + } + else if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit) + { + // Toggle casing of first character + char c = data->Buf[0]; + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) data->Buf[0] ^= 32; + data->BufDirty = true; + + // Increment a counter + int* p_int = (int*)data->UserData; + *p_int = *p_int + 1; + } + return 0; + } + }; + static char buf1[64]; + ImGui::InputText("Completion", buf1, 64, ImGuiInputTextFlags_CallbackCompletion, Funcs::MyCallback); + ImGui::SameLine(); HelpMarker("Here we append \"..\" each time Tab is pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); + + static char buf2[64]; + ImGui::InputText("History", buf2, 64, ImGuiInputTextFlags_CallbackHistory, Funcs::MyCallback); + ImGui::SameLine(); HelpMarker("Here we replace and select text each time Up/Down are pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); + + static char buf3[64]; + static int edit_count = 0; + ImGui::InputText("Edit", buf3, 64, ImGuiInputTextFlags_CallbackEdit, Funcs::MyCallback, (void*)&edit_count); + ImGui::SameLine(); HelpMarker("Here we toggle the casing of the first character on every edits + count edits."); + ImGui::SameLine(); ImGui::Text("(%d)", edit_count); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text Input/Resize Callback"); + if (ImGui::TreeNode("Resize Callback")) + { + // To wire InputText() with std::string or any other custom string type, + // you can use the ImGuiInputTextFlags_CallbackResize flag + create a custom ImGui::InputText() wrapper + // using your preferred type. See misc/cpp/imgui_stdlib.h for an implementation of this using std::string. + HelpMarker( + "Using ImGuiInputTextFlags_CallbackResize to wire your custom string type to InputText().\n\n" + "See misc/cpp/imgui_stdlib.h for an implementation of this for std::string."); + struct Funcs + { + static int MyResizeCallback(ImGuiInputTextCallbackData* data) + { + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) + { + ImVector* my_str = (ImVector*)data->UserData; + IM_ASSERT(my_str->begin() == data->Buf); + my_str->resize(data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1 + data->Buf = my_str->begin(); + } + return 0; + } + + // Note: Because ImGui:: is a namespace you would typically add your own function into the namespace. + // For example, you code may declare a function 'ImGui::InputText(const char* label, MyString* my_str)' + static bool MyInputTextMultiline(const char* label, ImVector* my_str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0) + { + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + return ImGui::InputTextMultiline(label, my_str->begin(), (size_t)my_str->size(), size, flags | ImGuiInputTextFlags_CallbackResize, Funcs::MyResizeCallback, (void*)my_str); + } + }; + + // For this demo we are using ImVector as a string container. + // Note that because we need to store a terminating zero character, our size/capacity are 1 more + // than usually reported by a typical string class. + static ImVector my_str; + if (my_str.empty()) + my_str.push_back(0); + Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16)); + ImGui::Text("Data: %p\nSize: %d\nCapacity: %d", (void*)my_str.begin(), my_str.size(), my_str.capacity()); + ImGui::TreePop(); + } + + ImGui::TreePop(); + } + + // Tabs + IMGUI_DEMO_MARKER("Widgets/Tabs"); + if (ImGui::TreeNode("Tabs")) + { + IMGUI_DEMO_MARKER("Widgets/Tabs/Basic"); + if (ImGui::TreeNode("Basic")) + { + ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None; + if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) + { + if (ImGui::BeginTabItem("Avocado")) + { + ImGui::Text("This is the Avocado tab!\nblah blah blah blah blah"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Broccoli")) + { + ImGui::Text("This is the Broccoli tab!\nblah blah blah blah blah"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Cucumber")) + { + ImGui::Text("This is the Cucumber tab!\nblah blah blah blah blah"); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::Separator(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Tabs/Advanced & Close Button"); + if (ImGui::TreeNode("Advanced & Close Button")) + { + // Expose a couple of the available flags. In most cases you may just call BeginTabBar() with no flags (0). + static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable; + ImGui::CheckboxFlags("ImGuiTabBarFlags_Reorderable", &tab_bar_flags, ImGuiTabBarFlags_Reorderable); + ImGui::CheckboxFlags("ImGuiTabBarFlags_AutoSelectNewTabs", &tab_bar_flags, ImGuiTabBarFlags_AutoSelectNewTabs); + ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); + ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", &tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton); + if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) + tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_; + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown); + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll); + + // Tab Bar + const char* names[4] = { "Artichoke", "Beetroot", "Celery", "Daikon" }; + static bool opened[4] = { true, true, true, true }; // Persistent user state + for (int n = 0; n < IM_ARRAYSIZE(opened); n++) + { + if (n > 0) { ImGui::SameLine(); } + ImGui::Checkbox(names[n], &opened[n]); + } + + // Passing a bool* to BeginTabItem() is similar to passing one to Begin(): + // the underlying bool will be set to false when the tab is closed. + if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) + { + for (int n = 0; n < IM_ARRAYSIZE(opened); n++) + if (opened[n] && ImGui::BeginTabItem(names[n], &opened[n], ImGuiTabItemFlags_None)) + { + ImGui::Text("This is the %s tab!", names[n]); + if (n & 1) + ImGui::Text("I am an odd tab."); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::Separator(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Tabs/TabItemButton & Leading-Trailing flags"); + if (ImGui::TreeNode("TabItemButton & Leading/Trailing flags")) + { + static ImVector active_tabs; + static int next_tab_id = 0; + if (next_tab_id == 0) // Initialize with some default tabs + for (int i = 0; i < 3; i++) + active_tabs.push_back(next_tab_id++); + + // TabItemButton() and Leading/Trailing flags are distinct features which we will demo together. + // (It is possible to submit regular tabs with Leading/Trailing flags, or TabItemButton tabs without Leading/Trailing flags... + // but they tend to make more sense together) + static bool show_leading_button = true; + static bool show_trailing_button = true; + ImGui::Checkbox("Show Leading TabItemButton()", &show_leading_button); + ImGui::Checkbox("Show Trailing TabItemButton()", &show_trailing_button); + + // Expose some other flags which are useful to showcase how they interact with Leading/Trailing tabs + static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_FittingPolicyResizeDown; + ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown); + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll); + + if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) + { + // Demo a Leading TabItemButton(): click the "?" button to open a menu + if (show_leading_button) + if (ImGui::TabItemButton("?", ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_NoTooltip)) + ImGui::OpenPopup("MyHelpMenu"); + if (ImGui::BeginPopup("MyHelpMenu")) + { + ImGui::Selectable("Hello!"); + ImGui::EndPopup(); + } + + // Demo Trailing Tabs: click the "+" button to add a new tab (in your app you may want to use a font icon instead of the "+") + // Note that we submit it before the regular tabs, but because of the ImGuiTabItemFlags_Trailing flag it will always appear at the end. + if (show_trailing_button) + if (ImGui::TabItemButton("+", ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip)) + active_tabs.push_back(next_tab_id++); // Add new tab + + // Submit our regular tabs + for (int n = 0; n < active_tabs.Size; ) + { + bool open = true; + char name[16]; + snprintf(name, IM_ARRAYSIZE(name), "%04d", active_tabs[n]); + if (ImGui::BeginTabItem(name, &open, ImGuiTabItemFlags_None)) + { + ImGui::Text("This is the %s tab!", name); + ImGui::EndTabItem(); + } + + if (!open) + active_tabs.erase(active_tabs.Data + n); + else + n++; + } + + ImGui::EndTabBar(); + } + ImGui::Separator(); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + // Plot/Graph widgets are not very good. + // Consider using a third-party library such as ImPlot: https://github.com/epezent/implot + // (see others https://github.com/ocornut/imgui/wiki/Useful-Extensions) + IMGUI_DEMO_MARKER("Widgets/Plotting"); + if (ImGui::TreeNode("Plotting")) + { + static bool animate = true; + ImGui::Checkbox("Animate", &animate); + + // Plot as lines and plot as histogram + IMGUI_DEMO_MARKER("Widgets/Plotting/PlotLines, PlotHistogram"); + static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; + ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr)); + ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f)); + + // Fill an array of contiguous float values to plot + // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float + // and the sizeof() of your structure in the "stride" parameter. + static float values[90] = {}; + static int values_offset = 0; + static double refresh_time = 0.0; + if (!animate || refresh_time == 0.0) + refresh_time = ImGui::GetTime(); + while (refresh_time < ImGui::GetTime()) // Create data at fixed 60 Hz rate for the demo + { + static float phase = 0.0f; + values[values_offset] = cosf(phase); + values_offset = (values_offset + 1) % IM_ARRAYSIZE(values); + phase += 0.10f * values_offset; + refresh_time += 1.0f / 60.0f; + } + + // Plots can display overlay texts + // (in this example, we will display an average value) + { + float average = 0.0f; + for (int n = 0; n < IM_ARRAYSIZE(values); n++) + average += values[n]; + average /= (float)IM_ARRAYSIZE(values); + char overlay[32]; + sprintf(overlay, "avg %f", average); + ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, overlay, -1.0f, 1.0f, ImVec2(0, 80.0f)); + } + + // Use functions to generate output + // FIXME: This is rather awkward because current plot API only pass in indices. + // We probably want an API passing floats and user provide sample rate/count. + struct Funcs + { + static float Sin(void*, int i) { return sinf(i * 0.1f); } + static float Saw(void*, int i) { return (i & 1) ? 1.0f : -1.0f; } + }; + static int func_type = 0, display_count = 70; + ImGui::Separator(); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::Combo("func", &func_type, "Sin\0Saw\0"); + ImGui::SameLine(); + ImGui::SliderInt("Sample count", &display_count, 1, 400); + float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw; + ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80)); + ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80)); + ImGui::Separator(); + + // Animate a simple progress bar + IMGUI_DEMO_MARKER("Widgets/Plotting/ProgressBar"); + static float progress = 0.0f, progress_dir = 1.0f; + if (animate) + { + progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime; + if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; } + if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; } + } + + // Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width, + // or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth. + ImGui::ProgressBar(progress, ImVec2(0.0f, 0.0f)); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::Text("Progress Bar"); + + float progress_saturated = IM_CLAMP(progress, 0.0f, 1.0f); + char buf[32]; + sprintf(buf, "%d/%d", (int)(progress_saturated * 1753), 1753); + ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Color"); + if (ImGui::TreeNode("Color/Picker Widgets")) + { + static ImVec4 color = ImVec4(114.0f / 255.0f, 144.0f / 255.0f, 154.0f / 255.0f, 200.0f / 255.0f); + + static bool alpha_preview = true; + static bool alpha_half_preview = false; + static bool drag_and_drop = true; + static bool options_menu = true; + static bool hdr = false; + ImGui::Checkbox("With Alpha Preview", &alpha_preview); + ImGui::Checkbox("With Half Alpha Preview", &alpha_half_preview); + ImGui::Checkbox("With Drag and Drop", &drag_and_drop); + ImGui::Checkbox("With Options Menu", &options_menu); ImGui::SameLine(); HelpMarker("Right-click on the individual color widget to show options."); + ImGui::Checkbox("With HDR", &hdr); ImGui::SameLine(); HelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets."); + ImGuiColorEditFlags misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags_NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit"); + ImGui::Text("Color widget:"); + ImGui::SameLine(); HelpMarker( + "Click on the color square to open a color picker.\n" + "CTRL+click on individual component to input value.\n"); + ImGui::ColorEdit3("MyColor##1", (float*)&color, misc_flags); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (HSV, with Alpha)"); + ImGui::Text("Color widget HSV with Alpha:"); + ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_DisplayHSV | misc_flags); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (float display)"); + ImGui::Text("Color widget with Float Display:"); + ImGui::ColorEdit4("MyColor##2f", (float*)&color, ImGuiColorEditFlags_Float | misc_flags); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with Picker)"); + ImGui::Text("Color button with Picker:"); + ImGui::SameLine(); HelpMarker( + "With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\n" + "With the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only " + "be used for the tooltip and picker popup."); + ImGui::ColorEdit4("MyColor##3", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with custom Picker popup)"); + ImGui::Text("Color button with Custom Picker Popup:"); + + // Generate a default palette. The palette will persist and can be edited. + static bool saved_palette_init = true; + static ImVec4 saved_palette[32] = {}; + if (saved_palette_init) + { + for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) + { + ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f, + saved_palette[n].x, saved_palette[n].y, saved_palette[n].z); + saved_palette[n].w = 1.0f; // Alpha + } + saved_palette_init = false; + } + + static ImVec4 backup_color; + bool open_popup = ImGui::ColorButton("MyColor##3b", color, misc_flags); + ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x); + open_popup |= ImGui::Button("Palette"); + if (open_popup) + { + ImGui::OpenPopup("mypicker"); + backup_color = color; + } + if (ImGui::BeginPopup("mypicker")) + { + ImGui::Text("MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!"); + ImGui::Separator(); + ImGui::ColorPicker4("##picker", (float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview); + ImGui::SameLine(); + + ImGui::BeginGroup(); // Lock X position + ImGui::Text("Current"); + ImGui::ColorButton("##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40)); + ImGui::Text("Previous"); + if (ImGui::ColorButton("##previous", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40))) + color = backup_color; + ImGui::Separator(); + ImGui::Text("Palette"); + for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) + { + ImGui::PushID(n); + if ((n % 8) != 0) + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y); + + ImGuiColorEditFlags palette_button_flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip; + if (ImGui::ColorButton("##palette", saved_palette[n], palette_button_flags, ImVec2(20, 20))) + color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha! + + // Allow user to drop colors into each palette entry. Note that ColorButton() is already a + // drag source by default, unless specifying the ImGuiColorEditFlags_NoDragDrop flag. + if (ImGui::BeginDragDropTarget()) + { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) + memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 3); + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) + memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 4); + ImGui::EndDragDropTarget(); + } + + ImGui::PopID(); + } + ImGui::EndGroup(); + ImGui::EndPopup(); + } + + IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (simple)"); + ImGui::Text("Color button only:"); + static bool no_border = false; + ImGui::Checkbox("ImGuiColorEditFlags_NoBorder", &no_border); + ImGui::ColorButton("MyColor##3c", *(ImVec4*)&color, misc_flags | (no_border ? ImGuiColorEditFlags_NoBorder : 0), ImVec2(80, 80)); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorPicker"); + ImGui::Text("Color picker:"); + static bool alpha = true; + static bool alpha_bar = true; + static bool side_preview = true; + static bool ref_color = false; + static ImVec4 ref_color_v(1.0f, 0.0f, 1.0f, 0.5f); + static int display_mode = 0; + static int picker_mode = 0; + ImGui::Checkbox("With Alpha", &alpha); + ImGui::Checkbox("With Alpha Bar", &alpha_bar); + ImGui::Checkbox("With Side Preview", &side_preview); + if (side_preview) + { + ImGui::SameLine(); + ImGui::Checkbox("With Ref Color", &ref_color); + if (ref_color) + { + ImGui::SameLine(); + ImGui::ColorEdit4("##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags); + } + } + ImGui::Combo("Display Mode", &display_mode, "Auto/Current\0None\0RGB Only\0HSV Only\0Hex Only\0"); + ImGui::SameLine(); HelpMarker( + "ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, " + "but the user can change it with a right-click on those inputs.\n\nColorPicker defaults to displaying RGB+HSV+Hex " + "if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions()."); + ImGui::SameLine(); HelpMarker("When not specified explicitly (Auto/Current mode), user can right-click the picker to change mode."); + ImGuiColorEditFlags flags = misc_flags; + if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4() + if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar; + if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview; + if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar; + if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel; + if (display_mode == 1) flags |= ImGuiColorEditFlags_NoInputs; // Disable all RGB/HSV/Hex displays + if (display_mode == 2) flags |= ImGuiColorEditFlags_DisplayRGB; // Override display mode + if (display_mode == 3) flags |= ImGuiColorEditFlags_DisplayHSV; + if (display_mode == 4) flags |= ImGuiColorEditFlags_DisplayHex; + ImGui::ColorPicker4("MyColor##4", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL); + + ImGui::Text("Set defaults in code:"); + ImGui::SameLine(); HelpMarker( + "SetColorEditOptions() is designed to allow you to set boot-time default.\n" + "We don't have Push/Pop functions because you can force options on a per-widget basis if needed," + "and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid" + "encouraging you to persistently save values that aren't forward-compatible."); + if (ImGui::Button("Default: Uint8 + HSV + Hue Bar")) + ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_PickerHueBar); + if (ImGui::Button("Default: Float + HDR + Hue Wheel")) + ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel); + + // Always both a small version of both types of pickers (to make it more visible in the demo to people who are skimming quickly through it) + ImGui::Text("Both types:"); + float w = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.y) * 0.40f; + ImGui::SetNextItemWidth(w); + ImGui::ColorPicker3("##MyColor##5", (float*)&color, ImGuiColorEditFlags_PickerHueBar | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha); + ImGui::SameLine(); + ImGui::SetNextItemWidth(w); + ImGui::ColorPicker3("##MyColor##6", (float*)&color, ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha); + + // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0) + static ImVec4 color_hsv(0.23f, 1.0f, 1.0f, 1.0f); // Stored as HSV! + ImGui::Spacing(); + ImGui::Text("HSV encoded colors"); + ImGui::SameLine(); HelpMarker( + "By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV" + "allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the" + "added benefit that you can manipulate hue values with the picker even when saturation or value are zero."); + ImGui::Text("Color widget with InputHSV:"); + ImGui::ColorEdit4("HSV shown as RGB##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); + ImGui::ColorEdit4("HSV shown as HSV##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); + ImGui::DragFloat4("Raw HSV values", (float*)&color_hsv, 0.01f, 0.0f, 1.0f); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Drag and Slider Flags"); + if (ImGui::TreeNode("Drag/Slider Flags")) + { + // Demonstrate using advanced flags for DragXXX and SliderXXX functions. Note that the flags are the same! + static ImGuiSliderFlags flags = ImGuiSliderFlags_None; + ImGui::CheckboxFlags("ImGuiSliderFlags_AlwaysClamp", &flags, ImGuiSliderFlags_AlwaysClamp); + ImGui::SameLine(); HelpMarker("Always clamp value to min/max bounds (if any) when input manually with CTRL+Click."); + ImGui::CheckboxFlags("ImGuiSliderFlags_Logarithmic", &flags, ImGuiSliderFlags_Logarithmic); + ImGui::SameLine(); HelpMarker("Enable logarithmic editing (more precision for small values)."); + ImGui::CheckboxFlags("ImGuiSliderFlags_NoRoundToFormat", &flags, ImGuiSliderFlags_NoRoundToFormat); + ImGui::SameLine(); HelpMarker("Disable rounding underlying value to match precision of the format string (e.g. %.3f values are rounded to those 3 digits)."); + ImGui::CheckboxFlags("ImGuiSliderFlags_NoInput", &flags, ImGuiSliderFlags_NoInput); + ImGui::SameLine(); HelpMarker("Disable CTRL+Click or Enter key allowing to input text directly into the widget."); + + // Drags + static float drag_f = 0.5f; + static int drag_i = 50; + ImGui::Text("Underlying float value: %f", drag_f); + ImGui::DragFloat("DragFloat (0 -> 1)", &drag_f, 0.005f, 0.0f, 1.0f, "%.3f", flags); + ImGui::DragFloat("DragFloat (0 -> +inf)", &drag_f, 0.005f, 0.0f, FLT_MAX, "%.3f", flags); + ImGui::DragFloat("DragFloat (-inf -> 1)", &drag_f, 0.005f, -FLT_MAX, 1.0f, "%.3f", flags); + ImGui::DragFloat("DragFloat (-inf -> +inf)", &drag_f, 0.005f, -FLT_MAX, +FLT_MAX, "%.3f", flags); + ImGui::DragInt("DragInt (0 -> 100)", &drag_i, 0.5f, 0, 100, "%d", flags); + + // Sliders + static float slider_f = 0.5f; + static int slider_i = 50; + ImGui::Text("Underlying float value: %f", slider_f); + ImGui::SliderFloat("SliderFloat (0 -> 1)", &slider_f, 0.0f, 1.0f, "%.3f", flags); + ImGui::SliderInt("SliderInt (0 -> 100)", &slider_i, 0, 100, "%d", flags); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Range Widgets"); + if (ImGui::TreeNode("Range Widgets")) + { + static float begin = 10, end = 90; + static int begin_i = 100, end_i = 1000; + ImGui::DragFloatRange2("range float", &begin, &end, 0.25f, 0.0f, 100.0f, "Min: %.1f %%", "Max: %.1f %%", ImGuiSliderFlags_AlwaysClamp); + ImGui::DragIntRange2("range int", &begin_i, &end_i, 5, 0, 1000, "Min: %d units", "Max: %d units"); + ImGui::DragIntRange2("range int (no bounds)", &begin_i, &end_i, 5, 0, 0, "Min: %d units", "Max: %d units"); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Data Types"); + if (ImGui::TreeNode("Data Types")) + { + // DragScalar/InputScalar/SliderScalar functions allow various data types + // - signed/unsigned + // - 8/16/32/64-bits + // - integer/float/double + // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum + // to pass the type, and passing all arguments by pointer. + // This is the reason the test code below creates local variables to hold "zero" "one" etc. for each types. + // In practice, if you frequently use a given type that is not covered by the normal API entry points, + // you can wrap it yourself inside a 1 line function which can take typed argument as value instead of void*, + // and then pass their address to the generic function. For example: + // bool MySliderU64(const char *label, u64* value, u64 min = 0, u64 max = 0, const char* format = "%lld") + // { + // return SliderScalar(label, ImGuiDataType_U64, value, &min, &max, format); + // } + + // Setup limits (as helper variables so we can take their address, as explained above) + // Note: SliderScalar() functions have a maximum usable range of half the natural type maximum, hence the /2. + #ifndef LLONG_MIN + ImS64 LLONG_MIN = -9223372036854775807LL - 1; + ImS64 LLONG_MAX = 9223372036854775807LL; + ImU64 ULLONG_MAX = (2ULL * 9223372036854775807LL + 1); + #endif + const char s8_zero = 0, s8_one = 1, s8_fifty = 50, s8_min = -128, s8_max = 127; + const ImU8 u8_zero = 0, u8_one = 1, u8_fifty = 50, u8_min = 0, u8_max = 255; + const short s16_zero = 0, s16_one = 1, s16_fifty = 50, s16_min = -32768, s16_max = 32767; + const ImU16 u16_zero = 0, u16_one = 1, u16_fifty = 50, u16_min = 0, u16_max = 65535; + const ImS32 s32_zero = 0, s32_one = 1, s32_fifty = 50, s32_min = INT_MIN/2, s32_max = INT_MAX/2, s32_hi_a = INT_MAX/2 - 100, s32_hi_b = INT_MAX/2; + const ImU32 u32_zero = 0, u32_one = 1, u32_fifty = 50, u32_min = 0, u32_max = UINT_MAX/2, u32_hi_a = UINT_MAX/2 - 100, u32_hi_b = UINT_MAX/2; + const ImS64 s64_zero = 0, s64_one = 1, s64_fifty = 50, s64_min = LLONG_MIN/2, s64_max = LLONG_MAX/2, s64_hi_a = LLONG_MAX/2 - 100, s64_hi_b = LLONG_MAX/2; + const ImU64 u64_zero = 0, u64_one = 1, u64_fifty = 50, u64_min = 0, u64_max = ULLONG_MAX/2, u64_hi_a = ULLONG_MAX/2 - 100, u64_hi_b = ULLONG_MAX/2; + const float f32_zero = 0.f, f32_one = 1.f, f32_lo_a = -10000000000.0f, f32_hi_a = +10000000000.0f; + const double f64_zero = 0., f64_one = 1., f64_lo_a = -1000000000000000.0, f64_hi_a = +1000000000000000.0; + + // State + static char s8_v = 127; + static ImU8 u8_v = 255; + static short s16_v = 32767; + static ImU16 u16_v = 65535; + static ImS32 s32_v = -1; + static ImU32 u32_v = (ImU32)-1; + static ImS64 s64_v = -1; + static ImU64 u64_v = (ImU64)-1; + static float f32_v = 0.123f; + static double f64_v = 90000.01234567890123456789; + + const float drag_speed = 0.2f; + static bool drag_clamp = false; + IMGUI_DEMO_MARKER("Widgets/Data Types/Drags"); + ImGui::Text("Drags:"); + ImGui::Checkbox("Clamp integers to 0..50", &drag_clamp); + ImGui::SameLine(); HelpMarker( + "As with every widgets in dear imgui, we never modify values unless there is a user interaction.\n" + "You can override the clamping limits by using CTRL+Click to input a value."); + ImGui::DragScalar("drag s8", ImGuiDataType_S8, &s8_v, drag_speed, drag_clamp ? &s8_zero : NULL, drag_clamp ? &s8_fifty : NULL); + ImGui::DragScalar("drag u8", ImGuiDataType_U8, &u8_v, drag_speed, drag_clamp ? &u8_zero : NULL, drag_clamp ? &u8_fifty : NULL, "%u ms"); + ImGui::DragScalar("drag s16", ImGuiDataType_S16, &s16_v, drag_speed, drag_clamp ? &s16_zero : NULL, drag_clamp ? &s16_fifty : NULL); + ImGui::DragScalar("drag u16", ImGuiDataType_U16, &u16_v, drag_speed, drag_clamp ? &u16_zero : NULL, drag_clamp ? &u16_fifty : NULL, "%u ms"); + ImGui::DragScalar("drag s32", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL); + ImGui::DragScalar("drag s32 hex", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL, "0x%08X"); + ImGui::DragScalar("drag u32", ImGuiDataType_U32, &u32_v, drag_speed, drag_clamp ? &u32_zero : NULL, drag_clamp ? &u32_fifty : NULL, "%u ms"); + ImGui::DragScalar("drag s64", ImGuiDataType_S64, &s64_v, drag_speed, drag_clamp ? &s64_zero : NULL, drag_clamp ? &s64_fifty : NULL); + ImGui::DragScalar("drag u64", ImGuiDataType_U64, &u64_v, drag_speed, drag_clamp ? &u64_zero : NULL, drag_clamp ? &u64_fifty : NULL); + ImGui::DragScalar("drag float", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f"); + ImGui::DragScalar("drag float log", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", ImGuiSliderFlags_Logarithmic); + ImGui::DragScalar("drag double", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, NULL, "%.10f grams"); + ImGui::DragScalar("drag double log",ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, &f64_one, "0 < %.10f < 1", ImGuiSliderFlags_Logarithmic); + + IMGUI_DEMO_MARKER("Widgets/Data Types/Sliders"); + ImGui::Text("Sliders"); + ImGui::SliderScalar("slider s8 full", ImGuiDataType_S8, &s8_v, &s8_min, &s8_max, "%d"); + ImGui::SliderScalar("slider u8 full", ImGuiDataType_U8, &u8_v, &u8_min, &u8_max, "%u"); + ImGui::SliderScalar("slider s16 full", ImGuiDataType_S16, &s16_v, &s16_min, &s16_max, "%d"); + ImGui::SliderScalar("slider u16 full", ImGuiDataType_U16, &u16_v, &u16_min, &u16_max, "%u"); + ImGui::SliderScalar("slider s32 low", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,"%d"); + ImGui::SliderScalar("slider s32 high", ImGuiDataType_S32, &s32_v, &s32_hi_a, &s32_hi_b, "%d"); + ImGui::SliderScalar("slider s32 full", ImGuiDataType_S32, &s32_v, &s32_min, &s32_max, "%d"); + ImGui::SliderScalar("slider s32 hex", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty, "0x%04X"); + ImGui::SliderScalar("slider u32 low", ImGuiDataType_U32, &u32_v, &u32_zero, &u32_fifty,"%u"); + ImGui::SliderScalar("slider u32 high", ImGuiDataType_U32, &u32_v, &u32_hi_a, &u32_hi_b, "%u"); + ImGui::SliderScalar("slider u32 full", ImGuiDataType_U32, &u32_v, &u32_min, &u32_max, "%u"); + ImGui::SliderScalar("slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,"%" IM_PRId64); + ImGui::SliderScalar("slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b, "%" IM_PRId64); + ImGui::SliderScalar("slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max, "%" IM_PRId64); + ImGui::SliderScalar("slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,"%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b, "%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max, "%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider float low", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one); + ImGui::SliderScalar("slider float low log", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one, "%.10f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderScalar("slider float high", ImGuiDataType_Float, &f32_v, &f32_lo_a, &f32_hi_a, "%e"); + ImGui::SliderScalar("slider double low", ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f grams"); + ImGui::SliderScalar("slider double low log",ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderScalar("slider double high", ImGuiDataType_Double, &f64_v, &f64_lo_a, &f64_hi_a, "%e grams"); + + ImGui::Text("Sliders (reverse)"); + ImGui::SliderScalar("slider s8 reverse", ImGuiDataType_S8, &s8_v, &s8_max, &s8_min, "%d"); + ImGui::SliderScalar("slider u8 reverse", ImGuiDataType_U8, &u8_v, &u8_max, &u8_min, "%u"); + ImGui::SliderScalar("slider s32 reverse", ImGuiDataType_S32, &s32_v, &s32_fifty, &s32_zero, "%d"); + ImGui::SliderScalar("slider u32 reverse", ImGuiDataType_U32, &u32_v, &u32_fifty, &u32_zero, "%u"); + ImGui::SliderScalar("slider s64 reverse", ImGuiDataType_S64, &s64_v, &s64_fifty, &s64_zero, "%" IM_PRId64); + ImGui::SliderScalar("slider u64 reverse", ImGuiDataType_U64, &u64_v, &u64_fifty, &u64_zero, "%" IM_PRIu64 " ms"); + + IMGUI_DEMO_MARKER("Widgets/Data Types/Inputs"); + static bool inputs_step = true; + ImGui::Text("Inputs"); + ImGui::Checkbox("Show step buttons", &inputs_step); + ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d"); + ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u"); + ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d"); + ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u"); + ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d"); + ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%04X"); + ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u"); + ImGui::InputScalar("input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%08X"); + ImGui::InputScalar("input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL); + ImGui::InputScalar("input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL); + ImGui::InputScalar("input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL); + ImGui::InputScalar("input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Multi-component Widgets"); + if (ImGui::TreeNode("Multi-component Widgets")) + { + static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; + static int vec4i[4] = { 1, 5, 100, 255 }; + + ImGui::InputFloat2("input float2", vec4f); + ImGui::DragFloat2("drag float2", vec4f, 0.01f, 0.0f, 1.0f); + ImGui::SliderFloat2("slider float2", vec4f, 0.0f, 1.0f); + ImGui::InputInt2("input int2", vec4i); + ImGui::DragInt2("drag int2", vec4i, 1, 0, 255); + ImGui::SliderInt2("slider int2", vec4i, 0, 255); + ImGui::Spacing(); + + ImGui::InputFloat3("input float3", vec4f); + ImGui::DragFloat3("drag float3", vec4f, 0.01f, 0.0f, 1.0f); + ImGui::SliderFloat3("slider float3", vec4f, 0.0f, 1.0f); + ImGui::InputInt3("input int3", vec4i); + ImGui::DragInt3("drag int3", vec4i, 1, 0, 255); + ImGui::SliderInt3("slider int3", vec4i, 0, 255); + ImGui::Spacing(); + + ImGui::InputFloat4("input float4", vec4f); + ImGui::DragFloat4("drag float4", vec4f, 0.01f, 0.0f, 1.0f); + ImGui::SliderFloat4("slider float4", vec4f, 0.0f, 1.0f); + ImGui::InputInt4("input int4", vec4i); + ImGui::DragInt4("drag int4", vec4i, 1, 0, 255); + ImGui::SliderInt4("slider int4", vec4i, 0, 255); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Vertical Sliders"); + if (ImGui::TreeNode("Vertical Sliders")) + { + const float spacing = 4; + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(spacing, spacing)); + + static int int_value = 0; + ImGui::VSliderInt("##int", ImVec2(18, 160), &int_value, 0, 5); + ImGui::SameLine(); + + static float values[7] = { 0.0f, 0.60f, 0.35f, 0.9f, 0.70f, 0.20f, 0.0f }; + ImGui::PushID("set1"); + for (int i = 0; i < 7; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_FrameBg, (ImVec4)ImColor::HSV(i / 7.0f, 0.5f, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_SliderGrab, (ImVec4)ImColor::HSV(i / 7.0f, 0.9f, 0.9f)); + ImGui::VSliderFloat("##v", ImVec2(18, 160), &values[i], 0.0f, 1.0f, ""); + if (ImGui::IsItemActive() || ImGui::IsItemHovered()) + ImGui::SetTooltip("%.3f", values[i]); + ImGui::PopStyleColor(4); + ImGui::PopID(); + } + ImGui::PopID(); + + ImGui::SameLine(); + ImGui::PushID("set2"); + static float values2[4] = { 0.20f, 0.80f, 0.40f, 0.25f }; + const int rows = 3; + const ImVec2 small_slider_size(18, (float)(int)((160.0f - (rows - 1) * spacing) / rows)); + for (int nx = 0; nx < 4; nx++) + { + if (nx > 0) ImGui::SameLine(); + ImGui::BeginGroup(); + for (int ny = 0; ny < rows; ny++) + { + ImGui::PushID(nx * rows + ny); + ImGui::VSliderFloat("##v", small_slider_size, &values2[nx], 0.0f, 1.0f, ""); + if (ImGui::IsItemActive() || ImGui::IsItemHovered()) + ImGui::SetTooltip("%.3f", values2[nx]); + ImGui::PopID(); + } + ImGui::EndGroup(); + } + ImGui::PopID(); + + ImGui::SameLine(); + ImGui::PushID("set3"); + for (int i = 0; i < 4; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::PushID(i); + ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize, 40); + ImGui::VSliderFloat("##v", ImVec2(40, 160), &values[i], 0.0f, 1.0f, "%.2f\nsec"); + ImGui::PopStyleVar(); + ImGui::PopID(); + } + ImGui::PopID(); + ImGui::PopStyleVar(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Drag and drop"); + if (ImGui::TreeNode("Drag and Drop")) + { + IMGUI_DEMO_MARKER("Widgets/Drag and drop/Standard widgets"); + if (ImGui::TreeNode("Drag and drop in standard widgets")) + { + // ColorEdit widgets automatically act as drag source and drag target. + // They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F + // to allow your own widgets to use colors in their drag and drop interaction. + // Also see 'Demo->Widgets->Color/Picker Widgets->Palette' demo. + HelpMarker("You can drag from the color squares."); + static float col1[3] = { 1.0f, 0.0f, 0.2f }; + static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; + ImGui::ColorEdit3("color 1", col1); + ImGui::ColorEdit4("color 2", col2); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Drag and drop/Copy-swap items"); + if (ImGui::TreeNode("Drag and drop to copy/swap items")) + { + enum Mode + { + Mode_Copy, + Mode_Move, + Mode_Swap + }; + static int mode = 0; + if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine(); + if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine(); + if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; } + static const char* names[9] = + { + "Bobby", "Beatrice", "Betty", + "Brianna", "Barry", "Bernard", + "Bibi", "Blaine", "Bryn" + }; + for (int n = 0; n < IM_ARRAYSIZE(names); n++) + { + ImGui::PushID(n); + if ((n % 3) != 0) + ImGui::SameLine(); + ImGui::Button(names[n], ImVec2(60, 60)); + + // Our buttons are both drag sources and drag targets here! + if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) + { + // Set payload to carry the index of our item (could be anything) + ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int)); + + // Display preview (could be anything, e.g. when dragging an image we could decide to display + // the filename and a small preview of the image, etc.) + if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); } + if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); } + if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); } + ImGui::EndDragDropSource(); + } + if (ImGui::BeginDragDropTarget()) + { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_DEMO_CELL")) + { + IM_ASSERT(payload->DataSize == sizeof(int)); + int payload_n = *(const int*)payload->Data; + if (mode == Mode_Copy) + { + names[n] = names[payload_n]; + } + if (mode == Mode_Move) + { + names[n] = names[payload_n]; + names[payload_n] = ""; + } + if (mode == Mode_Swap) + { + const char* tmp = names[n]; + names[n] = names[payload_n]; + names[payload_n] = tmp; + } + } + ImGui::EndDragDropTarget(); + } + ImGui::PopID(); + } + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Drag to reorder items (simple)"); + if (ImGui::TreeNode("Drag to reorder items (simple)")) + { + // Simple reordering + HelpMarker( + "We don't use the drag and drop api at all here! " + "Instead we query when the item is held but not hovered, and order items accordingly."); + static const char* item_names[] = { "Item One", "Item Two", "Item Three", "Item Four", "Item Five" }; + for (int n = 0; n < IM_ARRAYSIZE(item_names); n++) + { + const char* item = item_names[n]; + ImGui::Selectable(item); + + if (ImGui::IsItemActive() && !ImGui::IsItemHovered()) + { + int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1); + if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names)) + { + item_names[n] = item_names[n_next]; + item_names[n_next] = item; + ImGui::ResetMouseDragDelta(); + } + } + } + ImGui::TreePop(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Querying Item Status (Edited,Active,Hovered etc.)"); + if (ImGui::TreeNode("Querying Item Status (Edited/Active/Hovered etc.)")) + { + // Select an item type + const char* item_names[] = + { + "Text", "Button", "Button (w/ repeat)", "Checkbox", "SliderFloat", "InputText", "InputTextMultiline", "InputFloat", + "InputFloat3", "ColorEdit4", "Selectable", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "Combo", "ListBox" + }; + static int item_type = 4; + static bool item_disabled = false; + ImGui::Combo("Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names)); + ImGui::SameLine(); + HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions. Note that the bool return value of most ImGui function is generally equivalent to calling ImGui::IsItemHovered()."); + ImGui::Checkbox("Item Disabled", &item_disabled); + + // Submit selected item item so we can query their status in the code following it. + bool ret = false; + static bool b = false; + static float col4f[4] = { 1.0f, 0.5, 0.0f, 1.0f }; + static char str[16] = {}; + if (item_disabled) + ImGui::BeginDisabled(true); + if (item_type == 0) { ImGui::Text("ITEM: Text"); } // Testing text items with no identifier/interaction + if (item_type == 1) { ret = ImGui::Button("ITEM: Button"); } // Testing button + if (item_type == 2) { ImGui::PushButtonRepeat(true); ret = ImGui::Button("ITEM: Button"); ImGui::PopButtonRepeat(); } // Testing button (with repeater) + if (item_type == 3) { ret = ImGui::Checkbox("ITEM: Checkbox", &b); } // Testing checkbox + if (item_type == 4) { ret = ImGui::SliderFloat("ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); } // Testing basic item + if (item_type == 5) { ret = ImGui::InputText("ITEM: InputText", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which handles tabbing) + if (item_type == 6) { ret = ImGui::InputTextMultiline("ITEM: InputTextMultiline", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which uses a child window) + if (item_type == 7) { ret = ImGui::InputFloat("ITEM: InputFloat", col4f, 1.0f); } // Testing +/- buttons on scalar input + if (item_type == 8) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged) + if (item_type == 9) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged) + if (item_type == 10){ ret = ImGui::Selectable("ITEM: Selectable"); } // Testing selectable item + if (item_type == 11){ ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy) + if (item_type == 12){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node + if (item_type == 13){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy. + if (item_type == 14){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::Combo("ITEM: Combo", ¤t, items, IM_ARRAYSIZE(items)); } + if (item_type == 15){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); } + + // Display the values of IsItemHovered() and other common item state functions. + // Note that the ImGuiHoveredFlags_XXX flags can be combined. + // Because BulletText is an item itself and that would affect the output of IsItemXXX functions, + // we query every state in a single call to avoid storing them and to simplify the code. + ImGui::BulletText( + "Return value = %d\n" + "IsItemFocused() = %d\n" + "IsItemHovered() = %d\n" + "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n" + "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n" + "IsItemHovered(_AllowWhenOverlapped) = %d\n" + "IsItemHovered(_AllowWhenDisabled) = %d\n" + "IsItemHovered(_RectOnly) = %d\n" + "IsItemActive() = %d\n" + "IsItemEdited() = %d\n" + "IsItemActivated() = %d\n" + "IsItemDeactivated() = %d\n" + "IsItemDeactivatedAfterEdit() = %d\n" + "IsItemVisible() = %d\n" + "IsItemClicked() = %d\n" + "IsItemToggledOpen() = %d\n" + "GetItemRectMin() = (%.1f, %.1f)\n" + "GetItemRectMax() = (%.1f, %.1f)\n" + "GetItemRectSize() = (%.1f, %.1f)", + ret, + ImGui::IsItemFocused(), + ImGui::IsItemHovered(), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlapped), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled), + ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly), + ImGui::IsItemActive(), + ImGui::IsItemEdited(), + ImGui::IsItemActivated(), + ImGui::IsItemDeactivated(), + ImGui::IsItemDeactivatedAfterEdit(), + ImGui::IsItemVisible(), + ImGui::IsItemClicked(), + ImGui::IsItemToggledOpen(), + ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y, + ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y, + ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y + ); + + if (item_disabled) + ImGui::EndDisabled(); + + char buf[1] = ""; + ImGui::InputText("unused", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_ReadOnly); + ImGui::SameLine(); + HelpMarker("This widget is only here to be able to tab-out of the widgets above and see e.g. Deactivated() status."); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Querying Window Status (Focused,Hovered etc.)"); + if (ImGui::TreeNode("Querying Window Status (Focused/Hovered etc.)")) + { + static bool embed_all_inside_a_child_window = false; + ImGui::Checkbox("Embed everything inside a child window for testing _RootWindow flag.", &embed_all_inside_a_child_window); + if (embed_all_inside_a_child_window) + ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20.0f), true); + + // Testing IsWindowFocused() function with its various flags. + ImGui::BulletText( + "IsWindowFocused() = %d\n" + "IsWindowFocused(_ChildWindows) = %d\n" + "IsWindowFocused(_ChildWindows|_NoPopupHierarchy) = %d\n" + "IsWindowFocused(_ChildWindows|_RootWindow) = %d\n" + "IsWindowFocused(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n" + "IsWindowFocused(_RootWindow) = %d\n" + "IsWindowFocused(_RootWindow|_NoPopupHierarchy) = %d\n" + "IsWindowFocused(_AnyWindow) = %d\n", + ImGui::IsWindowFocused(), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_NoPopupHierarchy), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy), + ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow), + ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy), + ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow)); + + // Testing IsWindowHovered() function with its various flags. + ImGui::BulletText( + "IsWindowHovered() = %d\n" + "IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n" + "IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n" + "IsWindowHovered(_ChildWindows) = %d\n" + "IsWindowHovered(_ChildWindows|_NoPopupHierarchy) = %d\n" + "IsWindowHovered(_ChildWindows|_RootWindow) = %d\n" + "IsWindowHovered(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n" + "IsWindowHovered(_RootWindow) = %d\n" + "IsWindowHovered(_RootWindow|_NoPopupHierarchy) = %d\n" + "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n" + "IsWindowHovered(_AnyWindow) = %d\n", + ImGui::IsWindowHovered(), + ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), + ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy), + ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow), + ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup), + ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow)); + + ImGui::BeginChild("child", ImVec2(0, 50), true); + ImGui::Text("This is another child window for testing the _ChildWindows flag."); + ImGui::EndChild(); + if (embed_all_inside_a_child_window) + ImGui::EndChild(); + + // Calling IsItemHovered() after begin returns the hovered status of the title bar. + // This is useful in particular if you want to create a context menu associated to the title bar of a window. + static bool test_window = false; + ImGui::Checkbox("Hovered/Active tests after Begin() for title bar testing", &test_window); + if (test_window) + { + ImGui::Begin("Title bar Hovered/Active tests", &test_window); + if (ImGui::BeginPopupContextItem()) // <-- This is using IsItemHovered() + { + if (ImGui::MenuItem("Close")) { test_window = false; } + ImGui::EndPopup(); + } + ImGui::Text( + "IsItemHovered() after begin = %d (== is title bar hovered)\n" + "IsItemActive() after begin = %d (== is window being clicked/moved)\n", + ImGui::IsItemHovered(), ImGui::IsItemActive()); + ImGui::End(); + } + + ImGui::TreePop(); + } + + // Demonstrate BeginDisabled/EndDisabled using a checkbox located at the bottom of the section (which is a bit odd: + // logically we'd have this checkbox at the top of the section, but we don't want this feature to steal that space) + if (disable_all) + ImGui::EndDisabled(); + + IMGUI_DEMO_MARKER("Widgets/Disable Block"); + if (ImGui::TreeNode("Disable block")) + { + ImGui::Checkbox("Disable entire section above", &disable_all); + ImGui::SameLine(); HelpMarker("Demonstrate using BeginDisabled()/EndDisabled() across this section."); + ImGui::TreePop(); + } +} + +static void ShowDemoWindowLayout() +{ + IMGUI_DEMO_MARKER("Layout"); + if (!ImGui::CollapsingHeader("Layout & Scrolling")) + return; + + IMGUI_DEMO_MARKER("Layout/Child windows"); + if (ImGui::TreeNode("Child windows")) + { + HelpMarker("Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window."); + static bool disable_mouse_wheel = false; + static bool disable_menu = false; + ImGui::Checkbox("Disable Mouse Wheel", &disable_mouse_wheel); + ImGui::Checkbox("Disable Menu", &disable_menu); + + // Child 1: no border, enable horizontal scrollbar + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; + if (disable_mouse_wheel) + window_flags |= ImGuiWindowFlags_NoScrollWithMouse; + ImGui::BeginChild("ChildL", ImVec2(ImGui::GetContentRegionAvail().x * 0.5f, 260), false, window_flags); + for (int i = 0; i < 100; i++) + ImGui::Text("%04d: scrollable region", i); + ImGui::EndChild(); + } + + ImGui::SameLine(); + + // Child 2: rounded border + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_None; + if (disable_mouse_wheel) + window_flags |= ImGuiWindowFlags_NoScrollWithMouse; + if (!disable_menu) + window_flags |= ImGuiWindowFlags_MenuBar; + ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); + ImGui::BeginChild("ChildR", ImVec2(0, 260), true, window_flags); + if (!disable_menu && ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("Menu")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + if (ImGui::BeginTable("split", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings)) + { + for (int i = 0; i < 100; i++) + { + char buf[32]; + sprintf(buf, "%03d", i); + ImGui::TableNextColumn(); + ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); + } + ImGui::EndTable(); + } + ImGui::EndChild(); + ImGui::PopStyleVar(); + } + + ImGui::Separator(); + + // Demonstrate a few extra things + // - Changing ImGuiCol_ChildBg (which is transparent black in default styles) + // - Using SetCursorPos() to position child window (the child window is an item from the POV of parent window) + // You can also call SetNextWindowPos() to position the child window. The parent window will effectively + // layout from this position. + // - Using ImGui::GetItemRectMin/Max() to query the "item" state (because the child window is an item from + // the POV of the parent window). See 'Demo->Querying Status (Edited/Active/Hovered etc.)' for details. + { + static int offset_x = 0; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::DragInt("Offset X", &offset_x, 1.0f, -1000, 1000); + + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (float)offset_x); + ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100)); + ImGui::BeginChild("Red", ImVec2(200, 100), true, ImGuiWindowFlags_None); + for (int n = 0; n < 50; n++) + ImGui::Text("Some test %d", n); + ImGui::EndChild(); + bool child_is_hovered = ImGui::IsItemHovered(); + ImVec2 child_rect_min = ImGui::GetItemRectMin(); + ImVec2 child_rect_max = ImGui::GetItemRectMax(); + ImGui::PopStyleColor(); + ImGui::Text("Hovered: %d", child_is_hovered); + ImGui::Text("Rect of child window is: (%.0f,%.0f) (%.0f,%.0f)", child_rect_min.x, child_rect_min.y, child_rect_max.x, child_rect_max.y); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Widgets Width"); + if (ImGui::TreeNode("Widgets Width")) + { + static float f = 0.0f; + static bool show_indented_items = true; + ImGui::Checkbox("Show indented items", &show_indented_items); + + // Use SetNextItemWidth() to set the width of a single upcoming item. + // Use PushItemWidth()/PopItemWidth() to set the width of a group of items. + // In real code use you'll probably want to choose width values that are proportional to your font size + // e.g. Using '20.0f * GetFontSize()' as width instead of '200.0f', etc. + + ImGui::Text("SetNextItemWidth/PushItemWidth(100)"); + ImGui::SameLine(); HelpMarker("Fixed width."); + ImGui::PushItemWidth(100); + ImGui::DragFloat("float##1b", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##1b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::Text("SetNextItemWidth/PushItemWidth(-100)"); + ImGui::SameLine(); HelpMarker("Align to right edge minus 100"); + ImGui::PushItemWidth(-100); + ImGui::DragFloat("float##2a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##2b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::Text("SetNextItemWidth/PushItemWidth(GetContentRegionAvail().x * 0.5f)"); + ImGui::SameLine(); HelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)"); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x * 0.5f); + ImGui::DragFloat("float##3a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##3b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::Text("SetNextItemWidth/PushItemWidth(-GetContentRegionAvail().x * 0.5f)"); + ImGui::SameLine(); HelpMarker("Align to right edge minus half"); + ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f); + ImGui::DragFloat("float##4a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##4b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + // Demonstrate using PushItemWidth to surround three items. + // Calling SetNextItemWidth() before each of them would have the same effect. + ImGui::Text("SetNextItemWidth/PushItemWidth(-FLT_MIN)"); + ImGui::SameLine(); HelpMarker("Align to right edge"); + ImGui::PushItemWidth(-FLT_MIN); + ImGui::DragFloat("##float5a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##5b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout"); + if (ImGui::TreeNode("Basic Horizontal Layout")) + { + ImGui::TextWrapped("(Use ImGui::SameLine() to keep adding items to the right of the preceding item)"); + + // Text + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine"); + ImGui::Text("Two items: Hello"); ImGui::SameLine(); + ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); + + // Adjust spacing + ImGui::Text("More spacing: Hello"); ImGui::SameLine(0, 20); + ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); + + // Button + ImGui::AlignTextToFramePadding(); + ImGui::Text("Normal buttons"); ImGui::SameLine(); + ImGui::Button("Banana"); ImGui::SameLine(); + ImGui::Button("Apple"); ImGui::SameLine(); + ImGui::Button("Corniflower"); + + // Button + ImGui::Text("Small buttons"); ImGui::SameLine(); + ImGui::SmallButton("Like this one"); ImGui::SameLine(); + ImGui::Text("can fit within a text block."); + + // Aligned to arbitrary position. Easy/cheap column. + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine (with offset)"); + ImGui::Text("Aligned"); + ImGui::SameLine(150); ImGui::Text("x=150"); + ImGui::SameLine(300); ImGui::Text("x=300"); + ImGui::Text("Aligned"); + ImGui::SameLine(150); ImGui::SmallButton("x=150"); + ImGui::SameLine(300); ImGui::SmallButton("x=300"); + + // Checkbox + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine (more)"); + static bool c1 = false, c2 = false, c3 = false, c4 = false; + ImGui::Checkbox("My", &c1); ImGui::SameLine(); + ImGui::Checkbox("Tailor", &c2); ImGui::SameLine(); + ImGui::Checkbox("Is", &c3); ImGui::SameLine(); + ImGui::Checkbox("Rich", &c4); + + // Various + static float f0 = 1.0f, f1 = 2.0f, f2 = 3.0f; + ImGui::PushItemWidth(80); + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD" }; + static int item = -1; + ImGui::Combo("Combo", &item, items, IM_ARRAYSIZE(items)); ImGui::SameLine(); + ImGui::SliderFloat("X", &f0, 0.0f, 5.0f); ImGui::SameLine(); + ImGui::SliderFloat("Y", &f1, 0.0f, 5.0f); ImGui::SameLine(); + ImGui::SliderFloat("Z", &f2, 0.0f, 5.0f); + ImGui::PopItemWidth(); + + ImGui::PushItemWidth(80); + ImGui::Text("Lists:"); + static int selection[4] = { 0, 1, 2, 3 }; + for (int i = 0; i < 4; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::PushID(i); + ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items)); + ImGui::PopID(); + //if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i); + } + ImGui::PopItemWidth(); + + // Dummy + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/Dummy"); + ImVec2 button_sz(40, 40); + ImGui::Button("A", button_sz); ImGui::SameLine(); + ImGui::Dummy(button_sz); ImGui::SameLine(); + ImGui::Button("B", button_sz); + + // Manually wrapping + // (we should eventually provide this as an automatic layout feature, but for now you can do it manually) + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/Manual wrapping"); + ImGui::Text("Manual wrapping:"); + ImGuiStyle& style = ImGui::GetStyle(); + int buttons_count = 20; + float window_visible_x2 = ImGui::GetWindowPos().x + ImGui::GetWindowContentRegionMax().x; + for (int n = 0; n < buttons_count; n++) + { + ImGui::PushID(n); + ImGui::Button("Box", button_sz); + float last_button_x2 = ImGui::GetItemRectMax().x; + float next_button_x2 = last_button_x2 + style.ItemSpacing.x + button_sz.x; // Expected position if next button was on same line + if (n + 1 < buttons_count && next_button_x2 < window_visible_x2) + ImGui::SameLine(); + ImGui::PopID(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Groups"); + if (ImGui::TreeNode("Groups")) + { + HelpMarker( + "BeginGroup() basically locks the horizontal position for new line. " + "EndGroup() bundles the whole group so that you can use \"item\" functions such as " + "IsItemHovered()/IsItemActive() or SameLine() etc. on the whole group."); + ImGui::BeginGroup(); + { + ImGui::BeginGroup(); + ImGui::Button("AAA"); + ImGui::SameLine(); + ImGui::Button("BBB"); + ImGui::SameLine(); + ImGui::BeginGroup(); + ImGui::Button("CCC"); + ImGui::Button("DDD"); + ImGui::EndGroup(); + ImGui::SameLine(); + ImGui::Button("EEE"); + ImGui::EndGroup(); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("First group hovered"); + } + // Capture the group size and create widgets using the same size + ImVec2 size = ImGui::GetItemRectSize(); + const float values[5] = { 0.5f, 0.20f, 0.80f, 0.60f, 0.25f }; + ImGui::PlotHistogram("##values", values, IM_ARRAYSIZE(values), 0, NULL, 0.0f, 1.0f, size); + + ImGui::Button("ACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f, size.y)); + ImGui::SameLine(); + ImGui::Button("REACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f, size.y)); + ImGui::EndGroup(); + ImGui::SameLine(); + + ImGui::Button("LEVERAGE\nBUZZWORD", size); + ImGui::SameLine(); + + if (ImGui::BeginListBox("List", size)) + { + ImGui::Selectable("Selected", true); + ImGui::Selectable("Not Selected", false); + ImGui::EndListBox(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Text Baseline Alignment"); + if (ImGui::TreeNode("Text Baseline Alignment")) + { + { + ImGui::BulletText("Text baseline:"); + ImGui::SameLine(); HelpMarker( + "This is testing the vertical alignment that gets applied on text to keep it aligned with widgets. " + "Lines only composed of text or \"small\" widgets use less vertical space than lines with framed widgets."); + ImGui::Indent(); + + ImGui::Text("KO Blahblah"); ImGui::SameLine(); + ImGui::Button("Some framed item"); ImGui::SameLine(); + HelpMarker("Baseline of button will look misaligned with text.."); + + // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets. + // (because we don't know what's coming after the Text() statement, we need to move the text baseline + // down by FramePadding.y ahead of time) + ImGui::AlignTextToFramePadding(); + ImGui::Text("OK Blahblah"); ImGui::SameLine(); + ImGui::Button("Some framed item"); ImGui::SameLine(); + HelpMarker("We call AlignTextToFramePadding() to vertically align the text baseline by +FramePadding.y"); + + // SmallButton() uses the same vertical padding as Text + ImGui::Button("TEST##1"); ImGui::SameLine(); + ImGui::Text("TEST"); ImGui::SameLine(); + ImGui::SmallButton("TEST##2"); + + // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets. + ImGui::AlignTextToFramePadding(); + ImGui::Text("Text aligned to framed item"); ImGui::SameLine(); + ImGui::Button("Item##1"); ImGui::SameLine(); + ImGui::Text("Item"); ImGui::SameLine(); + ImGui::SmallButton("Item##2"); ImGui::SameLine(); + ImGui::Button("Item##3"); + + ImGui::Unindent(); + } + + ImGui::Spacing(); + + { + ImGui::BulletText("Multi-line text:"); + ImGui::Indent(); + ImGui::Text("One\nTwo\nThree"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + + ImGui::Text("Banana"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("One\nTwo\nThree"); + + ImGui::Button("HOP##1"); ImGui::SameLine(); + ImGui::Text("Banana"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + + ImGui::Button("HOP##2"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + ImGui::Unindent(); + } + + ImGui::Spacing(); + + { + ImGui::BulletText("Misc items:"); + ImGui::Indent(); + + // SmallButton() sets FramePadding to zero. Text baseline is aligned to match baseline of previous Button. + ImGui::Button("80x80", ImVec2(80, 80)); + ImGui::SameLine(); + ImGui::Button("50x50", ImVec2(50, 50)); + ImGui::SameLine(); + ImGui::Button("Button()"); + ImGui::SameLine(); + ImGui::SmallButton("SmallButton()"); + + // Tree + const float spacing = ImGui::GetStyle().ItemInnerSpacing.x; + ImGui::Button("Button##1"); + ImGui::SameLine(0.0f, spacing); + if (ImGui::TreeNode("Node##1")) + { + // Placeholder tree data + for (int i = 0; i < 6; i++) + ImGui::BulletText("Item %d..", i); + ImGui::TreePop(); + } + + // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. + // Otherwise you can use SmallButton() (smaller fit). + ImGui::AlignTextToFramePadding(); + + // Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add + // other contents below the node. + bool node_open = ImGui::TreeNode("Node##2"); + ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##2"); + if (node_open) + { + // Placeholder tree data + for (int i = 0; i < 6; i++) + ImGui::BulletText("Item %d..", i); + ImGui::TreePop(); + } + + // Bullet + ImGui::Button("Button##3"); + ImGui::SameLine(0.0f, spacing); + ImGui::BulletText("Bullet text"); + + ImGui::AlignTextToFramePadding(); + ImGui::BulletText("Node"); + ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4"); + ImGui::Unindent(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Scrolling"); + if (ImGui::TreeNode("Scrolling")) + { + // Vertical scroll functions + IMGUI_DEMO_MARKER("Layout/Scrolling/Vertical"); + HelpMarker("Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given vertical position."); + + static int track_item = 50; + static bool enable_track = true; + static bool enable_extra_decorations = false; + static float scroll_to_off_px = 0.0f; + static float scroll_to_pos_px = 200.0f; + + ImGui::Checkbox("Decoration", &enable_extra_decorations); + + ImGui::Checkbox("Track", &enable_track); + ImGui::PushItemWidth(100); + ImGui::SameLine(140); enable_track |= ImGui::DragInt("##item", &track_item, 0.25f, 0, 99, "Item = %d"); + + bool scroll_to_off = ImGui::Button("Scroll Offset"); + ImGui::SameLine(140); scroll_to_off |= ImGui::DragFloat("##off", &scroll_to_off_px, 1.00f, 0, FLT_MAX, "+%.0f px"); + + bool scroll_to_pos = ImGui::Button("Scroll To Pos"); + ImGui::SameLine(140); scroll_to_pos |= ImGui::DragFloat("##pos", &scroll_to_pos_px, 1.00f, -10, FLT_MAX, "X/Y = %.0f px"); + ImGui::PopItemWidth(); + + if (scroll_to_off || scroll_to_pos) + enable_track = false; + + ImGuiStyle& style = ImGui::GetStyle(); + float child_w = (ImGui::GetContentRegionAvail().x - 4 * style.ItemSpacing.x) / 5; + if (child_w < 1.0f) + child_w = 1.0f; + ImGui::PushID("##VerticalScrolling"); + for (int i = 0; i < 5; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::BeginGroup(); + const char* names[] = { "Top", "25%", "Center", "75%", "Bottom" }; + ImGui::TextUnformatted(names[i]); + + const ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0; + const ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); + const bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(child_w, 200.0f), true, child_flags); + if (ImGui::BeginMenuBar()) + { + ImGui::TextUnformatted("abc"); + ImGui::EndMenuBar(); + } + if (scroll_to_off) + ImGui::SetScrollY(scroll_to_off_px); + if (scroll_to_pos) + ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f); + if (child_is_visible) // Avoid calling SetScrollHereY when running with culled items + { + for (int item = 0; item < 100; item++) + { + if (enable_track && item == track_item) + { + ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item); + ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom + } + else + { + ImGui::Text("Item %d", item); + } + } + } + float scroll_y = ImGui::GetScrollY(); + float scroll_max_y = ImGui::GetScrollMaxY(); + ImGui::EndChild(); + ImGui::Text("%.0f/%.0f", scroll_y, scroll_max_y); + ImGui::EndGroup(); + } + ImGui::PopID(); + + // Horizontal scroll functions + IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal"); + ImGui::Spacing(); + HelpMarker( + "Use SetScrollHereX() or SetScrollFromPosX() to scroll to a given horizontal position.\n\n" + "Because the clipping rectangle of most window hides half worth of WindowPadding on the " + "left/right, using SetScrollFromPosX(+1) will usually result in clipped text whereas the " + "equivalent SetScrollFromPosY(+1) wouldn't."); + ImGui::PushID("##HorizontalScrolling"); + for (int i = 0; i < 5; i++) + { + float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f; + ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0); + ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); + bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(-100, child_height), true, child_flags); + if (scroll_to_off) + ImGui::SetScrollX(scroll_to_off_px); + if (scroll_to_pos) + ImGui::SetScrollFromPosX(ImGui::GetCursorStartPos().x + scroll_to_pos_px, i * 0.25f); + if (child_is_visible) // Avoid calling SetScrollHereY when running with culled items + { + for (int item = 0; item < 100; item++) + { + if (item > 0) + ImGui::SameLine(); + if (enable_track && item == track_item) + { + ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item); + ImGui::SetScrollHereX(i * 0.25f); // 0.0f:left, 0.5f:center, 1.0f:right + } + else + { + ImGui::Text("Item %d", item); + } + } + } + float scroll_x = ImGui::GetScrollX(); + float scroll_max_x = ImGui::GetScrollMaxX(); + ImGui::EndChild(); + ImGui::SameLine(); + const char* names[] = { "Left", "25%", "Center", "75%", "Right" }; + ImGui::Text("%s\n%.0f/%.0f", names[i], scroll_x, scroll_max_x); + ImGui::Spacing(); + } + ImGui::PopID(); + + // Miscellaneous Horizontal Scrolling Demo + IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal (more)"); + HelpMarker( + "Horizontal scrolling for a window is enabled via the ImGuiWindowFlags_HorizontalScrollbar flag.\n\n" + "You may want to also explicitly specify content width by using SetNextWindowContentWidth() before Begin()."); + static int lines = 7; + ImGui::SliderInt("Lines", &lines, 1, 15); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f)); + ImVec2 scrolling_child_size = ImVec2(0, ImGui::GetFrameHeightWithSpacing() * 7 + 30); + ImGui::BeginChild("scrolling", scrolling_child_size, true, ImGuiWindowFlags_HorizontalScrollbar); + for (int line = 0; line < lines; line++) + { + // Display random stuff. For the sake of this trivial demo we are using basic Button() + SameLine() + // If you want to create your own time line for a real application you may be better off manipulating + // the cursor position yourself, aka using SetCursorPos/SetCursorScreenPos to position the widgets + // yourself. You may also want to use the lower-level ImDrawList API. + int num_buttons = 10 + ((line & 1) ? line * 9 : line * 3); + for (int n = 0; n < num_buttons; n++) + { + if (n > 0) ImGui::SameLine(); + ImGui::PushID(n + line * 1000); + char num_buf[16]; + sprintf(num_buf, "%d", n); + const char* label = (!(n % 15)) ? "FizzBuzz" : (!(n % 3)) ? "Fizz" : (!(n % 5)) ? "Buzz" : num_buf; + float hue = n * 0.05f; + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue, 0.8f, 0.8f)); + ImGui::Button(label, ImVec2(40.0f + sinf((float)(line + n)) * 20.0f, 0.0f)); + ImGui::PopStyleColor(3); + ImGui::PopID(); + } + } + float scroll_x = ImGui::GetScrollX(); + float scroll_max_x = ImGui::GetScrollMaxX(); + ImGui::EndChild(); + ImGui::PopStyleVar(2); + float scroll_x_delta = 0.0f; + ImGui::SmallButton("<<"); + if (ImGui::IsItemActive()) + scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f; + ImGui::SameLine(); + ImGui::Text("Scroll from code"); ImGui::SameLine(); + ImGui::SmallButton(">>"); + if (ImGui::IsItemActive()) + scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f; + ImGui::SameLine(); + ImGui::Text("%.0f/%.0f", scroll_x, scroll_max_x); + if (scroll_x_delta != 0.0f) + { + // Demonstrate a trick: you can use Begin to set yourself in the context of another window + // (here we are already out of your child window) + ImGui::BeginChild("scrolling"); + ImGui::SetScrollX(ImGui::GetScrollX() + scroll_x_delta); + ImGui::EndChild(); + } + ImGui::Spacing(); + + static bool show_horizontal_contents_size_demo_window = false; + ImGui::Checkbox("Show Horizontal contents size demo window", &show_horizontal_contents_size_demo_window); + + if (show_horizontal_contents_size_demo_window) + { + static bool show_h_scrollbar = true; + static bool show_button = true; + static bool show_tree_nodes = true; + static bool show_text_wrapped = false; + static bool show_columns = true; + static bool show_tab_bar = true; + static bool show_child = false; + static bool explicit_content_size = false; + static float contents_size_x = 300.0f; + if (explicit_content_size) + ImGui::SetNextWindowContentSize(ImVec2(contents_size_x, 0.0f)); + ImGui::Begin("Horizontal contents size demo window", &show_horizontal_contents_size_demo_window, show_h_scrollbar ? ImGuiWindowFlags_HorizontalScrollbar : 0); + IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal contents size demo window"); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(2, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 0)); + HelpMarker("Test of different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\nUse 'Metrics->Tools->Show windows rectangles' to visualize rectangles."); + ImGui::Checkbox("H-scrollbar", &show_h_scrollbar); + ImGui::Checkbox("Button", &show_button); // Will grow contents size (unless explicitly overwritten) + ImGui::Checkbox("Tree nodes", &show_tree_nodes); // Will grow contents size and display highlight over full width + ImGui::Checkbox("Text wrapped", &show_text_wrapped);// Will grow and use contents size + ImGui::Checkbox("Columns", &show_columns); // Will use contents size + ImGui::Checkbox("Tab bar", &show_tab_bar); // Will use contents size + ImGui::Checkbox("Child", &show_child); // Will grow and use contents size + ImGui::Checkbox("Explicit content size", &explicit_content_size); + ImGui::Text("Scroll %.1f/%.1f %.1f/%.1f", ImGui::GetScrollX(), ImGui::GetScrollMaxX(), ImGui::GetScrollY(), ImGui::GetScrollMaxY()); + if (explicit_content_size) + { + ImGui::SameLine(); + ImGui::SetNextItemWidth(100); + ImGui::DragFloat("##csx", &contents_size_x); + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + 10, p.y + 10), IM_COL32_WHITE); + ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(p.x + contents_size_x - 10, p.y), ImVec2(p.x + contents_size_x, p.y + 10), IM_COL32_WHITE); + ImGui::Dummy(ImVec2(0, 10)); + } + ImGui::PopStyleVar(2); + ImGui::Separator(); + if (show_button) + { + ImGui::Button("this is a 300-wide button", ImVec2(300, 0)); + } + if (show_tree_nodes) + { + bool open = true; + if (ImGui::TreeNode("this is a tree node")) + { + if (ImGui::TreeNode("another one of those tree node...")) + { + ImGui::Text("Some tree contents"); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + ImGui::CollapsingHeader("CollapsingHeader", &open); + } + if (show_text_wrapped) + { + ImGui::TextWrapped("This text should automatically wrap on the edge of the work rectangle."); + } + if (show_columns) + { + ImGui::Text("Tables:"); + if (ImGui::BeginTable("table", 4, ImGuiTableFlags_Borders)) + { + for (int n = 0; n < 4; n++) + { + ImGui::TableNextColumn(); + ImGui::Text("Width %.2f", ImGui::GetContentRegionAvail().x); + } + ImGui::EndTable(); + } + ImGui::Text("Columns:"); + ImGui::Columns(4); + for (int n = 0; n < 4; n++) + { + ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); + ImGui::NextColumn(); + } + ImGui::Columns(1); + } + if (show_tab_bar && ImGui::BeginTabBar("Hello")) + { + if (ImGui::BeginTabItem("OneOneOne")) { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("TwoTwoTwo")) { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("ThreeThreeThree")) { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("FourFourFour")) { ImGui::EndTabItem(); } + ImGui::EndTabBar(); + } + if (show_child) + { + ImGui::BeginChild("child", ImVec2(0, 0), true); + ImGui::EndChild(); + } + ImGui::End(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Clipping"); + if (ImGui::TreeNode("Clipping")) + { + static ImVec2 size(100.0f, 100.0f); + static ImVec2 offset(30.0f, 30.0f); + ImGui::DragFloat2("size", (float*)&size, 0.5f, 1.0f, 200.0f, "%.0f"); + ImGui::TextWrapped("(Click and drag to scroll)"); + + for (int n = 0; n < 3; n++) + { + if (n > 0) + ImGui::SameLine(); + ImGui::PushID(n); + ImGui::BeginGroup(); // Lock X position + + ImGui::InvisibleButton("##empty", size); + if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) + { + offset.x += ImGui::GetIO().MouseDelta.x; + offset.y += ImGui::GetIO().MouseDelta.y; + } + const ImVec2 p0 = ImGui::GetItemRectMin(); + const ImVec2 p1 = ImGui::GetItemRectMax(); + const char* text_str = "Line 1 hello\nLine 2 clip me!"; + const ImVec2 text_pos = ImVec2(p0.x + offset.x, p0.y + offset.y); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + + switch (n) + { + case 0: + HelpMarker( + "Using ImGui::PushClipRect():\n" + "Will alter ImGui hit-testing logic + ImDrawList rendering.\n" + "(use this if you want your clipping rectangle to affect interactions)"); + ImGui::PushClipRect(p0, p1, true); + draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); + draw_list->AddText(text_pos, IM_COL32_WHITE, text_str); + ImGui::PopClipRect(); + break; + case 1: + HelpMarker( + "Using ImDrawList::PushClipRect():\n" + "Will alter ImDrawList rendering only.\n" + "(use this as a shortcut if you are only using ImDrawList calls)"); + draw_list->PushClipRect(p0, p1, true); + draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); + draw_list->AddText(text_pos, IM_COL32_WHITE, text_str); + draw_list->PopClipRect(); + break; + case 2: + HelpMarker( + "Using ImDrawList::AddText() with a fine ClipRect:\n" + "Will alter only this specific ImDrawList::AddText() rendering.\n" + "(this is often used internally to avoid altering the clipping rectangle and minimize draw calls)"); + ImVec4 clip_rect(p0.x, p0.y, p1.x, p1.y); // AddText() takes a ImVec4* here so let's convert. + draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); + draw_list->AddText(ImGui::GetFont(), ImGui::GetFontSize(), text_pos, IM_COL32_WHITE, text_str, NULL, 0.0f, &clip_rect); + break; + } + ImGui::EndGroup(); + ImGui::PopID(); + } + + ImGui::TreePop(); + } +} + +static void ShowDemoWindowPopups() +{ + IMGUI_DEMO_MARKER("Popups"); + if (!ImGui::CollapsingHeader("Popups & Modal windows")) + return; + + // The properties of popups windows are: + // - They block normal mouse hovering detection outside them. (*) + // - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE. + // - Their visibility state (~bool) is held internally by Dear ImGui instead of being held by the programmer as + // we are used to with regular Begin() calls. User can manipulate the visibility state by calling OpenPopup(). + // (*) One can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even + // when normally blocked by a popup. + // Those three properties are connected. The library needs to hold their visibility state BECAUSE it can close + // popups at any time. + + // Typical use for regular windows: + // bool my_tool_is_active = false; if (ImGui::Button("Open")) my_tool_is_active = true; [...] if (my_tool_is_active) Begin("My Tool", &my_tool_is_active) { [...] } End(); + // Typical use for popups: + // if (ImGui::Button("Open")) ImGui::OpenPopup("MyPopup"); if (ImGui::BeginPopup("MyPopup") { [...] EndPopup(); } + + // With popups we have to go through a library call (here OpenPopup) to manipulate the visibility state. + // This may be a bit confusing at first but it should quickly make sense. Follow on the examples below. + + IMGUI_DEMO_MARKER("Popups/Popups"); + if (ImGui::TreeNode("Popups")) + { + ImGui::TextWrapped( + "When a popup is active, it inhibits interacting with windows that are behind the popup. " + "Clicking outside the popup closes it."); + + static int selected_fish = -1; + const char* names[] = { "Bream", "Haddock", "Mackerel", "Pollock", "Tilefish" }; + static bool toggles[] = { true, false, false, false, false }; + + // Simple selection popup (if you want to show the current selection inside the Button itself, + // you may want to build a string using the "###" operator to preserve a constant ID with a variable label) + if (ImGui::Button("Select..")) + ImGui::OpenPopup("my_select_popup"); + ImGui::SameLine(); + ImGui::TextUnformatted(selected_fish == -1 ? "" : names[selected_fish]); + if (ImGui::BeginPopup("my_select_popup")) + { + ImGui::Text("Aquarium"); + ImGui::Separator(); + for (int i = 0; i < IM_ARRAYSIZE(names); i++) + if (ImGui::Selectable(names[i])) + selected_fish = i; + ImGui::EndPopup(); + } + + // Showing a menu with toggles + if (ImGui::Button("Toggle..")) + ImGui::OpenPopup("my_toggle_popup"); + if (ImGui::BeginPopup("my_toggle_popup")) + { + for (int i = 0; i < IM_ARRAYSIZE(names); i++) + ImGui::MenuItem(names[i], "", &toggles[i]); + if (ImGui::BeginMenu("Sub-menu")) + { + ImGui::MenuItem("Click me"); + ImGui::EndMenu(); + } + + ImGui::Separator(); + ImGui::Text("Tooltip here"); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("I am a tooltip over a popup"); + + if (ImGui::Button("Stacked Popup")) + ImGui::OpenPopup("another popup"); + if (ImGui::BeginPopup("another popup")) + { + for (int i = 0; i < IM_ARRAYSIZE(names); i++) + ImGui::MenuItem(names[i], "", &toggles[i]); + if (ImGui::BeginMenu("Sub-menu")) + { + ImGui::MenuItem("Click me"); + if (ImGui::Button("Stacked Popup")) + ImGui::OpenPopup("another popup"); + if (ImGui::BeginPopup("another popup")) + { + ImGui::Text("I am the last one here."); + ImGui::EndPopup(); + } + ImGui::EndMenu(); + } + ImGui::EndPopup(); + } + ImGui::EndPopup(); + } + + // Call the more complete ShowExampleMenuFile which we use in various places of this demo + if (ImGui::Button("With a menu..")) + ImGui::OpenPopup("my_file_popup"); + if (ImGui::BeginPopup("my_file_popup", ImGuiWindowFlags_MenuBar)) + { + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Edit")) + { + ImGui::MenuItem("Dummy"); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + ImGui::Text("Hello from popup!"); + ImGui::Button("This is a dummy button.."); + ImGui::EndPopup(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Popups/Context menus"); + if (ImGui::TreeNode("Context menus")) + { + HelpMarker("\"Context\" functions are simple helpers to associate a Popup to a given Item or Window identifier."); + + // BeginPopupContextItem() is a helper to provide common/simple popup behavior of essentially doing: + // if (id == 0) + // id = GetItemID(); // Use last item id + // if (IsItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) + // OpenPopup(id); + // return BeginPopup(id); + // For advanced advanced uses you may want to replicate and customize this code. + // See more details in BeginPopupContextItem(). + + // Example 1 + // When used after an item that has an ID (e.g. Button), we can skip providing an ID to BeginPopupContextItem(), + // and BeginPopupContextItem() will use the last item ID as the popup ID. + { + const char* names[5] = { "Label1", "Label2", "Label3", "Label4", "Label5" }; + for (int n = 0; n < 5; n++) + { + ImGui::Selectable(names[n]); + if (ImGui::BeginPopupContextItem()) // <-- use last item id as popup id + { + ImGui::Text("This a popup for \"%s\"!", names[n]); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("Right-click to open popup"); + } + } + + // Example 2 + // Popup on a Text() element which doesn't have an identifier: we need to provide an identifier to BeginPopupContextItem(). + // Using an explicit identifier is also convenient if you want to activate the popups from different locations. + { + HelpMarker("Text() elements don't have stable identifiers so we need to provide one."); + static float value = 0.5f; + ImGui::Text("Value = %.3f <-- (1) right-click this text", value); + if (ImGui::BeginPopupContextItem("my popup")) + { + if (ImGui::Selectable("Set to zero")) value = 0.0f; + if (ImGui::Selectable("Set to PI")) value = 3.1415f; + ImGui::SetNextItemWidth(-FLT_MIN); + ImGui::DragFloat("##Value", &value, 0.1f, 0.0f, 0.0f); + ImGui::EndPopup(); + } + + // We can also use OpenPopupOnItemClick() to toggle the visibility of a given popup. + // Here we make it that right-clicking this other text element opens the same popup as above. + // The popup itself will be submitted by the code above. + ImGui::Text("(2) Or right-click this text"); + ImGui::OpenPopupOnItemClick("my popup", ImGuiPopupFlags_MouseButtonRight); + + // Back to square one: manually open the same popup. + if (ImGui::Button("(3) Or click this button")) + ImGui::OpenPopup("my popup"); + } + + // Example 3 + // When using BeginPopupContextItem() with an implicit identifier (NULL == use last item ID), + // we need to make sure your item identifier is stable. + // In this example we showcase altering the item label while preserving its identifier, using the ### operator (see FAQ). + { + HelpMarker("Showcase using a popup ID linked to item ID, with the item having a changing label + stable ID using the ### operator."); + static char name[32] = "Label1"; + char buf[64]; + sprintf(buf, "Button: %s###Button", name); // ### operator override ID ignoring the preceding label + ImGui::Button(buf); + if (ImGui::BeginPopupContextItem()) + { + ImGui::Text("Edit name:"); + ImGui::InputText("##edit", name, IM_ARRAYSIZE(name)); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + ImGui::SameLine(); ImGui::Text("(<-- right-click here)"); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Popups/Modals"); + if (ImGui::TreeNode("Modals")) + { + ImGui::TextWrapped("Modal windows are like popups but the user cannot close them by clicking outside."); + + if (ImGui::Button("Delete..")) + ImGui::OpenPopup("Delete?"); + + // Always center this window when appearing + ImVec2 center = ImGui::GetMainViewport()->GetCenter(); + ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); + + if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n"); + ImGui::Separator(); + + //static int unused_i = 0; + //ImGui::Combo("Combo", &unused_i, "Delete\0Delete harder\0"); + + static bool dont_ask_me_next_time = false; + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + ImGui::Checkbox("Don't ask me next time", &dont_ask_me_next_time); + ImGui::PopStyleVar(); + + if (ImGui::Button("OK", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } + ImGui::SetItemDefaultFocus(); + ImGui::SameLine(); + if (ImGui::Button("Cancel", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } + ImGui::EndPopup(); + } + + if (ImGui::Button("Stacked modals..")) + ImGui::OpenPopup("Stacked 1"); + if (ImGui::BeginPopupModal("Stacked 1", NULL, ImGuiWindowFlags_MenuBar)) + { + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + if (ImGui::MenuItem("Some menu item")) {} + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + ImGui::Text("Hello from Stacked The First\nUsing style.Colors[ImGuiCol_ModalWindowDimBg] behind it."); + + // Testing behavior of widgets stacking their own regular popups over the modal. + static int item = 1; + static float color[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; + ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); + ImGui::ColorEdit4("color", color); + + if (ImGui::Button("Add another modal..")) + ImGui::OpenPopup("Stacked 2"); + + // Also demonstrate passing a bool* to BeginPopupModal(), this will create a regular close button which + // will close the popup. Note that the visibility state of popups is owned by imgui, so the input value + // of the bool actually doesn't matter here. + bool unused_open = true; + if (ImGui::BeginPopupModal("Stacked 2", &unused_open)) + { + ImGui::Text("Hello from Stacked The Second!"); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Popups/Menus inside a regular window"); + if (ImGui::TreeNode("Menus inside a regular window")) + { + ImGui::TextWrapped("Below we are testing adding menu items to a regular window. It's rather unusual but should work!"); + ImGui::Separator(); + + // Note: As a quirk in this very specific example, we want to differentiate the parent of this menu from the + // parent of the various popup menus above. To do so we are encloding the items in a PushID()/PopID() block + // to make them two different menusets. If we don't, opening any popup above and hovering our menu here would + // open it. This is because once a menu is active, we allow to switch to a sibling menu by just hovering on it, + // which is the desired behavior for regular menus. + ImGui::PushID("foo"); + ImGui::MenuItem("Menu item", "CTRL+M"); + if (ImGui::BeginMenu("Menu inside a regular window")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + ImGui::PopID(); + ImGui::Separator(); + ImGui::TreePop(); + } +} + +// Dummy data structure that we use for the Table demo. +// (pre-C++11 doesn't allow us to instantiate ImVector template if this structure if defined inside the demo function) +namespace +{ +// We are passing our own identifier to TableSetupColumn() to facilitate identifying columns in the sorting code. +// This identifier will be passed down into ImGuiTableSortSpec::ColumnUserID. +// But it is possible to omit the user id parameter of TableSetupColumn() and just use the column index instead! (ImGuiTableSortSpec::ColumnIndex) +// If you don't use sorting, you will generally never care about giving column an ID! +enum MyItemColumnID +{ + MyItemColumnID_ID, + MyItemColumnID_Name, + MyItemColumnID_Action, + MyItemColumnID_Quantity, + MyItemColumnID_Description +}; + +struct MyItem +{ + int ID; + const char* Name; + int Quantity; + + // We have a problem which is affecting _only this demo_ and should not affect your code: + // As we don't rely on std:: or other third-party library to compile dear imgui, we only have reliable access to qsort(), + // however qsort doesn't allow passing user data to comparing function. + // As a workaround, we are storing the sort specs in a static/global for the comparing function to access. + // In your own use case you would probably pass the sort specs to your sorting/comparing functions directly and not use a global. + // We could technically call ImGui::TableGetSortSpecs() in CompareWithSortSpecs(), but considering that this function is called + // very often by the sorting algorithm it would be a little wasteful. + static const ImGuiTableSortSpecs* s_current_sort_specs; + + // Compare function to be used by qsort() + static int IMGUI_CDECL CompareWithSortSpecs(const void* lhs, const void* rhs) + { + const MyItem* a = (const MyItem*)lhs; + const MyItem* b = (const MyItem*)rhs; + for (int n = 0; n < s_current_sort_specs->SpecsCount; n++) + { + // Here we identify columns using the ColumnUserID value that we ourselves passed to TableSetupColumn() + // We could also choose to identify columns based on their index (sort_spec->ColumnIndex), which is simpler! + const ImGuiTableColumnSortSpecs* sort_spec = &s_current_sort_specs->Specs[n]; + int delta = 0; + switch (sort_spec->ColumnUserID) + { + case MyItemColumnID_ID: delta = (a->ID - b->ID); break; + case MyItemColumnID_Name: delta = (strcmp(a->Name, b->Name)); break; + case MyItemColumnID_Quantity: delta = (a->Quantity - b->Quantity); break; + case MyItemColumnID_Description: delta = (strcmp(a->Name, b->Name)); break; + default: IM_ASSERT(0); break; + } + if (delta > 0) + return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? +1 : -1; + if (delta < 0) + return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? -1 : +1; + } + + // qsort() is instable so always return a way to differenciate items. + // Your own compare function may want to avoid fallback on implicit sort specs e.g. a Name compare if it wasn't already part of the sort specs. + return (a->ID - b->ID); + } +}; +const ImGuiTableSortSpecs* MyItem::s_current_sort_specs = NULL; +} + +// Make the UI compact because there are so many fields +static void PushStyleCompact() +{ + ImGuiStyle& style = ImGui::GetStyle(); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(style.FramePadding.x, (float)(int)(style.FramePadding.y * 0.60f))); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x, (float)(int)(style.ItemSpacing.y * 0.60f))); +} + +static void PopStyleCompact() +{ + ImGui::PopStyleVar(2); +} + +// Show a combo box with a choice of sizing policies +static void EditTableSizingFlags(ImGuiTableFlags* p_flags) +{ + struct EnumDesc { ImGuiTableFlags Value; const char* Name; const char* Tooltip; }; + static const EnumDesc policies[] = + { + { ImGuiTableFlags_None, "Default", "Use default sizing policy:\n- ImGuiTableFlags_SizingFixedFit if ScrollX is on or if host window has ImGuiWindowFlags_AlwaysAutoResize.\n- ImGuiTableFlags_SizingStretchSame otherwise." }, + { ImGuiTableFlags_SizingFixedFit, "ImGuiTableFlags_SizingFixedFit", "Columns default to _WidthFixed (if resizable) or _WidthAuto (if not resizable), matching contents width." }, + { ImGuiTableFlags_SizingFixedSame, "ImGuiTableFlags_SizingFixedSame", "Columns are all the same width, matching the maximum contents width.\nImplicitly disable ImGuiTableFlags_Resizable and enable ImGuiTableFlags_NoKeepColumnsVisible." }, + { ImGuiTableFlags_SizingStretchProp, "ImGuiTableFlags_SizingStretchProp", "Columns default to _WidthStretch with weights proportional to their widths." }, + { ImGuiTableFlags_SizingStretchSame, "ImGuiTableFlags_SizingStretchSame", "Columns default to _WidthStretch with same weights." } + }; + int idx; + for (idx = 0; idx < IM_ARRAYSIZE(policies); idx++) + if (policies[idx].Value == (*p_flags & ImGuiTableFlags_SizingMask_)) + break; + const char* preview_text = (idx < IM_ARRAYSIZE(policies)) ? policies[idx].Name + (idx > 0 ? strlen("ImGuiTableFlags") : 0) : ""; + if (ImGui::BeginCombo("Sizing Policy", preview_text)) + { + for (int n = 0; n < IM_ARRAYSIZE(policies); n++) + if (ImGui::Selectable(policies[n].Name, idx == n)) + *p_flags = (*p_flags & ~ImGuiTableFlags_SizingMask_) | policies[n].Value; + ImGui::EndCombo(); + } + ImGui::SameLine(); + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 50.0f); + for (int m = 0; m < IM_ARRAYSIZE(policies); m++) + { + ImGui::Separator(); + ImGui::Text("%s:", policies[m].Name); + ImGui::Separator(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetStyle().IndentSpacing * 0.5f); + ImGui::TextUnformatted(policies[m].Tooltip); + } + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +static void EditTableColumnsFlags(ImGuiTableColumnFlags* p_flags) +{ + ImGui::CheckboxFlags("_Disabled", p_flags, ImGuiTableColumnFlags_Disabled); ImGui::SameLine(); HelpMarker("Master disable flag (also hide from context menu)"); + ImGui::CheckboxFlags("_DefaultHide", p_flags, ImGuiTableColumnFlags_DefaultHide); + ImGui::CheckboxFlags("_DefaultSort", p_flags, ImGuiTableColumnFlags_DefaultSort); + if (ImGui::CheckboxFlags("_WidthStretch", p_flags, ImGuiTableColumnFlags_WidthStretch)) + *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthStretch); + if (ImGui::CheckboxFlags("_WidthFixed", p_flags, ImGuiTableColumnFlags_WidthFixed)) + *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthFixed); + ImGui::CheckboxFlags("_NoResize", p_flags, ImGuiTableColumnFlags_NoResize); + ImGui::CheckboxFlags("_NoReorder", p_flags, ImGuiTableColumnFlags_NoReorder); + ImGui::CheckboxFlags("_NoHide", p_flags, ImGuiTableColumnFlags_NoHide); + ImGui::CheckboxFlags("_NoClip", p_flags, ImGuiTableColumnFlags_NoClip); + ImGui::CheckboxFlags("_NoSort", p_flags, ImGuiTableColumnFlags_NoSort); + ImGui::CheckboxFlags("_NoSortAscending", p_flags, ImGuiTableColumnFlags_NoSortAscending); + ImGui::CheckboxFlags("_NoSortDescending", p_flags, ImGuiTableColumnFlags_NoSortDescending); + ImGui::CheckboxFlags("_NoHeaderLabel", p_flags, ImGuiTableColumnFlags_NoHeaderLabel); + ImGui::CheckboxFlags("_NoHeaderWidth", p_flags, ImGuiTableColumnFlags_NoHeaderWidth); + ImGui::CheckboxFlags("_PreferSortAscending", p_flags, ImGuiTableColumnFlags_PreferSortAscending); + ImGui::CheckboxFlags("_PreferSortDescending", p_flags, ImGuiTableColumnFlags_PreferSortDescending); + ImGui::CheckboxFlags("_IndentEnable", p_flags, ImGuiTableColumnFlags_IndentEnable); ImGui::SameLine(); HelpMarker("Default for column 0"); + ImGui::CheckboxFlags("_IndentDisable", p_flags, ImGuiTableColumnFlags_IndentDisable); ImGui::SameLine(); HelpMarker("Default for column >0"); +} + +static void ShowTableColumnsStatusFlags(ImGuiTableColumnFlags flags) +{ + ImGui::CheckboxFlags("_IsEnabled", &flags, ImGuiTableColumnFlags_IsEnabled); + ImGui::CheckboxFlags("_IsVisible", &flags, ImGuiTableColumnFlags_IsVisible); + ImGui::CheckboxFlags("_IsSorted", &flags, ImGuiTableColumnFlags_IsSorted); + ImGui::CheckboxFlags("_IsHovered", &flags, ImGuiTableColumnFlags_IsHovered); +} + +static void ShowDemoWindowTables() +{ + //ImGui::SetNextItemOpen(true, ImGuiCond_Once); + IMGUI_DEMO_MARKER("Tables"); + if (!ImGui::CollapsingHeader("Tables & Columns")) + return; + + // Using those as a base value to create width/height that are factor of the size of our font + const float TEXT_BASE_WIDTH = ImGui::CalcTextSize("A").x; + const float TEXT_BASE_HEIGHT = ImGui::GetTextLineHeightWithSpacing(); + + ImGui::PushID("Tables"); + + int open_action = -1; + if (ImGui::Button("Open all")) + open_action = 1; + ImGui::SameLine(); + if (ImGui::Button("Close all")) + open_action = 0; + ImGui::SameLine(); + + // Options + static bool disable_indent = false; + ImGui::Checkbox("Disable tree indentation", &disable_indent); + ImGui::SameLine(); + HelpMarker("Disable the indenting of tree nodes so demo tables can use the full window width."); + ImGui::Separator(); + if (disable_indent) + ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0.0f); + + // About Styling of tables + // Most settings are configured on a per-table basis via the flags passed to BeginTable() and TableSetupColumns APIs. + // There are however a few settings that a shared and part of the ImGuiStyle structure: + // style.CellPadding // Padding within each cell + // style.Colors[ImGuiCol_TableHeaderBg] // Table header background + // style.Colors[ImGuiCol_TableBorderStrong] // Table outer and header borders + // style.Colors[ImGuiCol_TableBorderLight] // Table inner borders + // style.Colors[ImGuiCol_TableRowBg] // Table row background when ImGuiTableFlags_RowBg is enabled (even rows) + // style.Colors[ImGuiCol_TableRowBgAlt] // Table row background when ImGuiTableFlags_RowBg is enabled (odds rows) + + // Demos + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Basic"); + if (ImGui::TreeNode("Basic")) + { + // Here we will showcase three different ways to output a table. + // They are very simple variations of a same thing! + + // [Method 1] Using TableNextRow() to create a new row, and TableSetColumnIndex() to select the column. + // In many situations, this is the most flexible and easy to use pattern. + HelpMarker("Using TableNextRow() + calling TableSetColumnIndex() _before_ each cell, in a loop."); + if (ImGui::BeginTable("table1", 3)) + { + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Row %d Column %d", row, column); + } + } + ImGui::EndTable(); + } + + // [Method 2] Using TableNextColumn() called multiple times, instead of using a for loop + TableSetColumnIndex(). + // This is generally more convenient when you have code manually submitting the contents of each columns. + HelpMarker("Using TableNextRow() + calling TableNextColumn() _before_ each cell, manually."); + if (ImGui::BeginTable("table2", 3)) + { + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Row %d", row); + ImGui::TableNextColumn(); + ImGui::Text("Some contents"); + ImGui::TableNextColumn(); + ImGui::Text("123.456"); + } + ImGui::EndTable(); + } + + // [Method 3] We call TableNextColumn() _before_ each cell. We never call TableNextRow(), + // as TableNextColumn() will automatically wrap around and create new roes as needed. + // This is generally more convenient when your cells all contains the same type of data. + HelpMarker( + "Only using TableNextColumn(), which tends to be convenient for tables where every cells contains the same type of contents.\n" + "This is also more similar to the old NextColumn() function of the Columns API, and provided to facilitate the Columns->Tables API transition."); + if (ImGui::BeginTable("table3", 3)) + { + for (int item = 0; item < 14; item++) + { + ImGui::TableNextColumn(); + ImGui::Text("Item %d", item); + } + ImGui::EndTable(); + } + + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Borders, background"); + if (ImGui::TreeNode("Borders, background")) + { + // Expose a few Borders related flags interactively + enum ContentsType { CT_Text, CT_FillButton }; + static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg; + static bool display_headers = false; + static int contents_type = CT_Text; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); + ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders); + ImGui::SameLine(); HelpMarker("ImGuiTableFlags_Borders\n = ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterV\n | ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterH"); + ImGui::Indent(); + + ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH); + ImGui::Indent(); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH); + ImGui::Unindent(); + + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); + ImGui::Indent(); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV); + ImGui::Unindent(); + + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuter", &flags, ImGuiTableFlags_BordersOuter); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInner", &flags, ImGuiTableFlags_BordersInner); + ImGui::Unindent(); + + ImGui::AlignTextToFramePadding(); ImGui::Text("Cell contents:"); + ImGui::SameLine(); ImGui::RadioButton("Text", &contents_type, CT_Text); + ImGui::SameLine(); ImGui::RadioButton("FillButton", &contents_type, CT_FillButton); + ImGui::Checkbox("Display headers", &display_headers); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appears in Headers"); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + // Display headers so we can inspect their interaction with borders. + // (Headers are not the main purpose of this section of the demo, so we are not elaborating on them too much. See other sections for details) + if (display_headers) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + } + + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + char buf[32]; + sprintf(buf, "Hello %d,%d", column, row); + if (contents_type == CT_Text) + ImGui::TextUnformatted(buf); + else if (contents_type == CT_FillButton) + ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Resizable, stretch"); + if (ImGui::TreeNode("Resizable, stretch")) + { + // By default, if we don't enable ScrollX the sizing policy for each columns is "Stretch" + // Each columns maintain a sizing weight, and they will occupy all available width. + static ImGuiTableFlags flags = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); + ImGui::SameLine(); HelpMarker("Using the _Resizable flag automatically enables the _BordersInnerV flag as well, this is why the resize borders are still showing when unchecking this."); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Resizable, fixed"); + if (ImGui::TreeNode("Resizable, fixed")) + { + // Here we use ImGuiTableFlags_SizingFixedFit (even though _ScrollX is not set) + // So columns will adopt the "Fixed" policy and will maintain a fixed width regardless of the whole available width (unless table is small) + // If there is not enough available width to fit all columns, they will however be resized down. + // FIXME-TABLE: Providing a stretch-on-init would make sense especially for tables which don't have saved settings + HelpMarker( + "Using _Resizable + _SizingFixedFit flags.\n" + "Fixed-width columns generally makes more sense if you want to use horizontal scrolling.\n\n" + "Double-click a column border to auto-fit the column to its contents."); + PushStyleCompact(); + static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Resizable, mixed"); + if (ImGui::TreeNode("Resizable, mixed")) + { + HelpMarker( + "Using TableSetupColumn() to alter resizing policy on a per-column basis.\n\n" + "When combining Fixed and Stretch columns, generally you only want one, maybe two trailing columns to use _WidthStretch."); + static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; + + if (ImGui::BeginTable("table1", 3, flags)) + { + ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableHeadersRow(); + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%s %d,%d", (column == 2) ? "Stretch" : "Fixed", column, row); + } + } + ImGui::EndTable(); + } + if (ImGui::BeginTable("table2", 6, flags)) + { + ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_DefaultHide); + ImGui::TableSetupColumn("DDD", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("EEE", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("FFF", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_DefaultHide); + ImGui::TableHeadersRow(); + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 6; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%s %d,%d", (column >= 3) ? "Stretch" : "Fixed", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Reorderable, hideable, with headers"); + if (ImGui::TreeNode("Reorderable, hideable, with headers")) + { + HelpMarker( + "Click and drag column headers to reorder columns.\n\n" + "Right-click on a header to open a context menu."); + static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable); + ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appears in Headers)"); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + // Submit columns name with TableSetupColumn() and call TableHeadersRow() to create a row with a header in each column. + // (Later we will show how TableSetupColumn() has other uses, optional flags, sizing weight etc.) + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + for (int row = 0; row < 6; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + // Use outer_size.x == 0.0f instead of default to make the table as tight as possible (only valid when no scrolling and no stretch column) + if (ImGui::BeginTable("table2", 3, flags | ImGuiTableFlags_SizingFixedFit, ImVec2(0.0f, 0.0f))) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + for (int row = 0; row < 6; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Fixed %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Padding"); + if (ImGui::TreeNode("Padding")) + { + // First example: showcase use of padding flags and effect of BorderOuterV/BorderInnerV on X padding. + // We don't expose BorderOuterH/BorderInnerH here because they have no effect on X padding. + HelpMarker( + "We often want outer padding activated when any using features which makes the edges of a column visible:\n" + "e.g.:\n" + "- BorderOuterV\n" + "- any form of row selection\n" + "Because of this, activating BorderOuterV sets the default to PadOuterX. Using PadOuterX or NoPadOuterX you can override the default.\n\n" + "Actual padding values are using style.CellPadding.\n\n" + "In this demo we don't show horizontal borders to emphasis how they don't affect default horizontal padding."); + + static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_PadOuterX", &flags1, ImGuiTableFlags_PadOuterX); + ImGui::SameLine(); HelpMarker("Enable outer-most padding (default if ImGuiTableFlags_BordersOuterV is set)"); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadOuterX", &flags1, ImGuiTableFlags_NoPadOuterX); + ImGui::SameLine(); HelpMarker("Disable outer-most padding (default if ImGuiTableFlags_BordersOuterV is not set)"); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadInnerX", &flags1, ImGuiTableFlags_NoPadInnerX); + ImGui::SameLine(); HelpMarker("Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off)"); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags1, ImGuiTableFlags_BordersOuterV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags1, ImGuiTableFlags_BordersInnerV); + static bool show_headers = false; + ImGui::Checkbox("show_headers", &show_headers); + PopStyleCompact(); + + if (ImGui::BeginTable("table_padding", 3, flags1)) + { + if (show_headers) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + } + + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + if (row == 0) + { + ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x); + } + else + { + char buf[32]; + sprintf(buf, "Hello %d,%d", column, row); + ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); + } + //if (ImGui::TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) + // ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, IM_COL32(0, 100, 0, 255)); + } + } + ImGui::EndTable(); + } + + // Second example: set style.CellPadding to (0.0) or a custom value. + // FIXME-TABLE: Vertical border effectively not displayed the same way as horizontal one... + HelpMarker("Setting style.CellPadding to (0,0) or a custom value."); + static ImGuiTableFlags flags2 = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg; + static ImVec2 cell_padding(0.0f, 0.0f); + static bool show_widget_frame_bg = true; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags2, ImGuiTableFlags_Borders); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags2, ImGuiTableFlags_BordersH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags2, ImGuiTableFlags_BordersV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInner", &flags2, ImGuiTableFlags_BordersInner); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuter", &flags2, ImGuiTableFlags_BordersOuter); + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags2, ImGuiTableFlags_RowBg); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags2, ImGuiTableFlags_Resizable); + ImGui::Checkbox("show_widget_frame_bg", &show_widget_frame_bg); + ImGui::SliderFloat2("CellPadding", &cell_padding.x, 0.0f, 10.0f, "%.0f"); + PopStyleCompact(); + + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cell_padding); + if (ImGui::BeginTable("table_padding_2", 3, flags2)) + { + static char text_bufs[3 * 5][16]; // Mini text storage for 3x5 cells + static bool init = true; + if (!show_widget_frame_bg) + ImGui::PushStyleColor(ImGuiCol_FrameBg, 0); + for (int cell = 0; cell < 3 * 5; cell++) + { + ImGui::TableNextColumn(); + if (init) + strcpy(text_bufs[cell], "edit me"); + ImGui::SetNextItemWidth(-FLT_MIN); + ImGui::PushID(cell); + ImGui::InputText("##cell", text_bufs[cell], IM_ARRAYSIZE(text_bufs[cell])); + ImGui::PopID(); + } + if (!show_widget_frame_bg) + ImGui::PopStyleColor(); + init = false; + ImGui::EndTable(); + } + ImGui::PopStyleVar(); + + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Explicit widths"); + if (ImGui::TreeNode("Sizing policies")) + { + static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags1, ImGuiTableFlags_NoHostExtendX); + PopStyleCompact(); + + static ImGuiTableFlags sizing_policy_flags[4] = { ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_SizingFixedSame, ImGuiTableFlags_SizingStretchProp, ImGuiTableFlags_SizingStretchSame }; + for (int table_n = 0; table_n < 4; table_n++) + { + ImGui::PushID(table_n); + ImGui::SetNextItemWidth(TEXT_BASE_WIDTH * 30); + EditTableSizingFlags(&sizing_policy_flags[table_n]); + + // To make it easier to understand the different sizing policy, + // For each policy: we display one table where the columns have equal contents width, and one where the columns have different contents width. + if (ImGui::BeginTable("table1", 3, sizing_policy_flags[table_n] | flags1)) + { + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); ImGui::Text("Oh dear"); + ImGui::TableNextColumn(); ImGui::Text("Oh dear"); + ImGui::TableNextColumn(); ImGui::Text("Oh dear"); + } + ImGui::EndTable(); + } + if (ImGui::BeginTable("table2", 3, sizing_policy_flags[table_n] | flags1)) + { + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); ImGui::Text("AAAA"); + ImGui::TableNextColumn(); ImGui::Text("BBBBBBBB"); + ImGui::TableNextColumn(); ImGui::Text("CCCCCCCCCCCC"); + } + ImGui::EndTable(); + } + ImGui::PopID(); + } + + ImGui::Spacing(); + ImGui::TextUnformatted("Advanced"); + ImGui::SameLine(); + HelpMarker("This section allows you to interact and see the effect of various sizing policies depending on whether Scroll is enabled and the contents of your columns."); + + enum ContentsType { CT_ShowWidth, CT_ShortText, CT_LongText, CT_Button, CT_FillButton, CT_InputText }; + static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable; + static int contents_type = CT_ShowWidth; + static int column_count = 3; + + PushStyleCompact(); + ImGui::PushID("Advanced"); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30); + EditTableSizingFlags(&flags); + ImGui::Combo("Contents", &contents_type, "Show width\0Short Text\0Long Text\0Button\0Fill Button\0InputText\0"); + if (contents_type == CT_FillButton) + { + ImGui::SameLine(); + HelpMarker("Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop where contents width can feed into auto-column width can feed into contents width."); + } + ImGui::DragInt("Columns", &column_count, 0.1f, 1, 64, "%d", ImGuiSliderFlags_AlwaysClamp); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths); + ImGui::SameLine(); HelpMarker("Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth."); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::CheckboxFlags("ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip); + ImGui::PopItemWidth(); + ImGui::PopID(); + PopStyleCompact(); + + if (ImGui::BeginTable("table2", column_count, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 7))) + { + for (int cell = 0; cell < 10 * column_count; cell++) + { + ImGui::TableNextColumn(); + int column = ImGui::TableGetColumnIndex(); + int row = ImGui::TableGetRowIndex(); + + ImGui::PushID(cell); + char label[32]; + static char text_buf[32] = ""; + sprintf(label, "Hello %d,%d", column, row); + switch (contents_type) + { + case CT_ShortText: ImGui::TextUnformatted(label); break; + case CT_LongText: ImGui::Text("Some %s text %d,%d\nOver two lines..", column == 0 ? "long" : "longeeer", column, row); break; + case CT_ShowWidth: ImGui::Text("W: %.1f", ImGui::GetContentRegionAvail().x); break; + case CT_Button: ImGui::Button(label); break; + case CT_FillButton: ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f)); break; + case CT_InputText: ImGui::SetNextItemWidth(-FLT_MIN); ImGui::InputText("##", text_buf, IM_ARRAYSIZE(text_buf)); break; + } + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Vertical scrolling, with clipping"); + if (ImGui::TreeNode("Vertical scrolling, with clipping")) + { + HelpMarker("Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents.\n\nWe also demonstrate using ImGuiListClipper to virtualize the submission of many items."); + static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + PopStyleCompact(); + + // When using ScrollX or ScrollY we need to specify a size for our table container! + // Otherwise by default the table will fit all available space, like a BeginChild() call. + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8); + if (ImGui::BeginTable("table_scrolly", 3, flags, outer_size)) + { + ImGui::TableSetupScrollFreeze(0, 1); // Make top row always visible + ImGui::TableSetupColumn("One", ImGuiTableColumnFlags_None); + ImGui::TableSetupColumn("Two", ImGuiTableColumnFlags_None); + ImGui::TableSetupColumn("Three", ImGuiTableColumnFlags_None); + ImGui::TableHeadersRow(); + + // Demonstrate using clipper for large vertical lists + ImGuiListClipper clipper; + clipper.Begin(1000); + while (clipper.Step()) + { + for (int row = clipper.DisplayStart; row < clipper.DisplayEnd; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Horizontal scrolling"); + if (ImGui::TreeNode("Horizontal scrolling")) + { + HelpMarker( + "When ScrollX is enabled, the default sizing policy becomes ImGuiTableFlags_SizingFixedFit, " + "as automatically stretching columns doesn't make much sense with horizontal scrolling.\n\n" + "Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX," + "because the container window won't automatically extend vertically to fix contents (this may be improved in future versions)."); + static ImGuiTableFlags flags = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; + static int freeze_cols = 1; + static int freeze_rows = 1; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + PopStyleCompact(); + + // When using ScrollX or ScrollY we need to specify a size for our table container! + // Otherwise by default the table will fit all available space, like a BeginChild() call. + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8); + if (ImGui::BeginTable("table_scrollx", 7, flags, outer_size)) + { + ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows); + ImGui::TableSetupColumn("Line #", ImGuiTableColumnFlags_NoHide); // Make the first column not hideable to match our use of TableSetupScrollFreeze() + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableSetupColumn("Four"); + ImGui::TableSetupColumn("Five"); + ImGui::TableSetupColumn("Six"); + ImGui::TableHeadersRow(); + for (int row = 0; row < 20; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 7; column++) + { + // Both TableNextColumn() and TableSetColumnIndex() return true when a column is visible or performing width measurement. + // Because here we know that: + // - A) all our columns are contributing the same to row height + // - B) column 0 is always visible, + // We only always submit this one column and can skip others. + // More advanced per-column clipping behaviors may benefit from polling the status flags via TableGetColumnFlags(). + if (!ImGui::TableSetColumnIndex(column) && column > 0) + continue; + if (column == 0) + ImGui::Text("Line %d", row); + else + ImGui::Text("Hello world %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + ImGui::Spacing(); + ImGui::TextUnformatted("Stretch + ScrollX"); + ImGui::SameLine(); + HelpMarker( + "Showcase using Stretch columns + ScrollX together: " + "this is rather unusual and only makes sense when specifying an 'inner_width' for the table!\n" + "Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns + ScrollX together doesn't make sense."); + static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody; + static float inner_width = 1000.0f; + PushStyleCompact(); + ImGui::PushID("flags3"); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags2, ImGuiTableFlags_ScrollX); + ImGui::DragFloat("inner_width", &inner_width, 1.0f, 0.0f, FLT_MAX, "%.1f"); + ImGui::PopItemWidth(); + ImGui::PopID(); + PopStyleCompact(); + if (ImGui::BeginTable("table2", 7, flags2, outer_size, inner_width)) + { + for (int cell = 0; cell < 20 * 7; cell++) + { + ImGui::TableNextColumn(); + ImGui::Text("Hello world %d,%d", ImGui::TableGetColumnIndex(), ImGui::TableGetRowIndex()); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Columns flags"); + if (ImGui::TreeNode("Columns flags")) + { + // Create a first table just to show all the options/flags we want to make visible in our example! + const int column_count = 3; + const char* column_names[column_count] = { "One", "Two", "Three" }; + static ImGuiTableColumnFlags column_flags[column_count] = { ImGuiTableColumnFlags_DefaultSort, ImGuiTableColumnFlags_None, ImGuiTableColumnFlags_DefaultHide }; + static ImGuiTableColumnFlags column_flags_out[column_count] = { 0, 0, 0 }; // Output from TableGetColumnFlags() + + if (ImGui::BeginTable("table_columns_flags_checkboxes", column_count, ImGuiTableFlags_None)) + { + PushStyleCompact(); + for (int column = 0; column < column_count; column++) + { + ImGui::TableNextColumn(); + ImGui::PushID(column); + ImGui::AlignTextToFramePadding(); // FIXME-TABLE: Workaround for wrong text baseline propagation across columns + ImGui::Text("'%s'", column_names[column]); + ImGui::Spacing(); + ImGui::Text("Input flags:"); + EditTableColumnsFlags(&column_flags[column]); + ImGui::Spacing(); + ImGui::Text("Output flags:"); + ImGui::BeginDisabled(); + ShowTableColumnsStatusFlags(column_flags_out[column]); + ImGui::EndDisabled(); + ImGui::PopID(); + } + PopStyleCompact(); + ImGui::EndTable(); + } + + // Create the real table we care about for the example! + // We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above, otherwise in + // a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible + resizing the parent window down) + const ImGuiTableFlags flags + = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY + | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV + | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable; + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 9); + if (ImGui::BeginTable("table_columns_flags", column_count, flags, outer_size)) + { + for (int column = 0; column < column_count; column++) + ImGui::TableSetupColumn(column_names[column], column_flags[column]); + ImGui::TableHeadersRow(); + for (int column = 0; column < column_count; column++) + column_flags_out[column] = ImGui::TableGetColumnFlags(column); + float indent_step = (float)((int)TEXT_BASE_WIDTH / 2); + for (int row = 0; row < 8; row++) + { + ImGui::Indent(indent_step); // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags. + ImGui::TableNextRow(); + for (int column = 0; column < column_count; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%s %s", (column == 0) ? "Indented" : "Hello", ImGui::TableGetColumnName(column)); + } + } + ImGui::Unindent(indent_step * 8.0f); + + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Columns widths"); + if (ImGui::TreeNode("Columns widths")) + { + HelpMarker("Using TableSetupColumn() to setup default width."); + + static ImGuiTableFlags flags1 = ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBodyUntilResize; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags1, ImGuiTableFlags_NoBordersInBodyUntilResize); + PopStyleCompact(); + if (ImGui::BeginTable("table1", 3, flags1)) + { + // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed. + ImGui::TableSetupColumn("one", ImGuiTableColumnFlags_WidthFixed, 100.0f); // Default to 100.0f + ImGui::TableSetupColumn("two", ImGuiTableColumnFlags_WidthFixed, 200.0f); // Default to 200.0f + ImGui::TableSetupColumn("three", ImGuiTableColumnFlags_WidthFixed); // Default to auto + ImGui::TableHeadersRow(); + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + if (row == 0) + ImGui::Text("(w: %5.1f)", ImGui::GetContentRegionAvail().x); + else + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + HelpMarker("Using TableSetupColumn() to setup explicit width.\n\nUnless _NoKeepColumnsVisible is set, fixed columns with set width may still be shrunk down if there's not enough space in the host."); + + static ImGuiTableFlags flags2 = ImGuiTableFlags_None; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_NoKeepColumnsVisible", &flags2, ImGuiTableFlags_NoKeepColumnsVisible); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags2, ImGuiTableFlags_BordersInnerV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags2, ImGuiTableFlags_BordersOuterV); + PopStyleCompact(); + if (ImGui::BeginTable("table2", 4, flags2)) + { + // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed. + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 100.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 30.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f); + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 4; column++) + { + ImGui::TableSetColumnIndex(column); + if (row == 0) + ImGui::Text("(w: %5.1f)", ImGui::GetContentRegionAvail().x); + else + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Nested tables"); + if (ImGui::TreeNode("Nested tables")) + { + HelpMarker("This demonstrate embedding a table into another table cell."); + + if (ImGui::BeginTable("table_nested1", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + ImGui::TableSetupColumn("A0"); + ImGui::TableSetupColumn("A1"); + ImGui::TableHeadersRow(); + + ImGui::TableNextColumn(); + ImGui::Text("A0 Row 0"); + { + float rows_height = TEXT_BASE_HEIGHT * 2; + if (ImGui::BeginTable("table_nested2", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + ImGui::TableSetupColumn("B0"); + ImGui::TableSetupColumn("B1"); + ImGui::TableHeadersRow(); + + ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height); + ImGui::TableNextColumn(); + ImGui::Text("B0 Row 0"); + ImGui::TableNextColumn(); + ImGui::Text("B1 Row 0"); + ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height); + ImGui::TableNextColumn(); + ImGui::Text("B0 Row 1"); + ImGui::TableNextColumn(); + ImGui::Text("B1 Row 1"); + + ImGui::EndTable(); + } + } + ImGui::TableNextColumn(); ImGui::Text("A1 Row 0"); + ImGui::TableNextColumn(); ImGui::Text("A0 Row 1"); + ImGui::TableNextColumn(); ImGui::Text("A1 Row 1"); + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Row height"); + if (ImGui::TreeNode("Row height")) + { + HelpMarker("You can pass a 'min_row_height' to TableNextRow().\n\nRows are padded with 'style.CellPadding.y' on top and bottom, so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'.\n\nWe cannot honor a _maximum_ row height as that would requires a unique clipping rectangle per row."); + if (ImGui::BeginTable("table_row_height", 1, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerV)) + { + for (int row = 0; row < 10; row++) + { + float min_row_height = (float)(int)(TEXT_BASE_HEIGHT * 0.30f * row); + ImGui::TableNextRow(ImGuiTableRowFlags_None, min_row_height); + ImGui::TableNextColumn(); + ImGui::Text("min_row_height = %.2f", min_row_height); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Outer size"); + if (ImGui::TreeNode("Outer size")) + { + // Showcasing use of ImGuiTableFlags_NoHostExtendX and ImGuiTableFlags_NoHostExtendY + // Important to that note how the two flags have slightly different behaviors! + ImGui::Text("Using NoHostExtendX and NoHostExtendY:"); + PushStyleCompact(); + static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_ContextMenuInBody | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX; + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); + ImGui::SameLine(); HelpMarker("Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY); + ImGui::SameLine(); HelpMarker("Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible."); + PopStyleCompact(); + + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 5.5f); + if (ImGui::BeginTable("table1", 3, flags, outer_size)) + { + for (int row = 0; row < 10; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableNextColumn(); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::SameLine(); + ImGui::Text("Hello!"); + + ImGui::Spacing(); + + ImGui::Text("Using explicit size:"); + if (ImGui::BeginTable("table2", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f))) + { + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableNextColumn(); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::SameLine(); + if (ImGui::BeginTable("table3", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f))) + { + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(0, TEXT_BASE_HEIGHT * 1.5f); + for (int column = 0; column < 3; column++) + { + ImGui::TableNextColumn(); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Background color"); + if (ImGui::TreeNode("Background color")) + { + static ImGuiTableFlags flags = ImGuiTableFlags_RowBg; + static int row_bg_type = 1; + static int row_bg_target = 1; + static int cell_bg_type = 1; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders); + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); + ImGui::SameLine(); HelpMarker("ImGuiTableFlags_RowBg automatically sets RowBg0 to alternative colors pulled from the Style."); + ImGui::Combo("row bg type", (int*)&row_bg_type, "None\0Red\0Gradient\0"); + ImGui::Combo("row bg target", (int*)&row_bg_target, "RowBg0\0RowBg1\0"); ImGui::SameLine(); HelpMarker("Target RowBg0 to override the alternating odd/even colors,\nTarget RowBg1 to blend with them."); + ImGui::Combo("cell bg type", (int*)&cell_bg_type, "None\0Blue\0"); ImGui::SameLine(); HelpMarker("We are colorizing cells to B1->C2 here."); + IM_ASSERT(row_bg_type >= 0 && row_bg_type <= 2); + IM_ASSERT(row_bg_target >= 0 && row_bg_target <= 1); + IM_ASSERT(cell_bg_type >= 0 && cell_bg_type <= 1); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 5, flags)) + { + for (int row = 0; row < 6; row++) + { + ImGui::TableNextRow(); + + // Demonstrate setting a row background color with 'ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBgX, ...)' + // We use a transparent color so we can see the one behind in case our target is RowBg1 and RowBg0 was already targeted by the ImGuiTableFlags_RowBg flag. + if (row_bg_type != 0) + { + ImU32 row_bg_color = ImGui::GetColorU32(row_bg_type == 1 ? ImVec4(0.7f, 0.3f, 0.3f, 0.65f) : ImVec4(0.2f + row * 0.1f, 0.2f, 0.2f, 0.65f)); // Flat or Gradient? + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0 + row_bg_target, row_bg_color); + } + + // Fill cells + for (int column = 0; column < 5; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%c%c", 'A' + row, '0' + column); + + // Change background of Cells B1->C2 + // Demonstrate setting a cell background color with 'ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ...)' + // (the CellBg color will be blended over the RowBg and ColumnBg colors) + // We can also pass a column number as a third parameter to TableSetBgColor() and do this outside the column loop. + if (row >= 1 && row <= 2 && column >= 1 && column <= 2 && cell_bg_type == 1) + { + ImU32 cell_bg_color = ImGui::GetColorU32(ImVec4(0.3f, 0.3f, 0.7f, 0.65f)); + ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color); + } + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Tree view"); + if (ImGui::TreeNode("Tree view")) + { + static ImGuiTableFlags flags = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody; + + if (ImGui::BeginTable("3ways", 3, flags)) + { + // The first column will use the default _WidthStretch when ScrollX is Off and _WidthFixed when ScrollX is On + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide); + ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); + ImGui::TableHeadersRow(); + + // Simple storage to output a dummy file-system. + struct MyTreeNode + { + const char* Name; + const char* Type; + int Size; + int ChildIdx; + int ChildCount; + static void DisplayNode(const MyTreeNode* node, const MyTreeNode* all_nodes) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + const bool is_folder = (node->ChildCount > 0); + if (is_folder) + { + bool open = ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::TableNextColumn(); + ImGui::TextDisabled("--"); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(node->Type); + if (open) + { + for (int child_n = 0; child_n < node->ChildCount; child_n++) + DisplayNode(&all_nodes[node->ChildIdx + child_n], all_nodes); + ImGui::TreePop(); + } + } + else + { + ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::TableNextColumn(); + ImGui::Text("%d", node->Size); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(node->Type); + } + } + }; + static const MyTreeNode nodes[] = + { + { "Root", "Folder", -1, 1, 3 }, // 0 + { "Music", "Folder", -1, 4, 2 }, // 1 + { "Textures", "Folder", -1, 6, 3 }, // 2 + { "desktop.ini", "System file", 1024, -1,-1 }, // 3 + { "File1_a.wav", "Audio file", 123000, -1,-1 }, // 4 + { "File1_b.wav", "Audio file", 456000, -1,-1 }, // 5 + { "Image001.png", "Image file", 203128, -1,-1 }, // 6 + { "Copy of Image001.png", "Image file", 203256, -1,-1 }, // 7 + { "Copy of Image001 (Final2).png","Image file", 203512, -1,-1 }, // 8 + }; + + MyTreeNode::DisplayNode(&nodes[0], nodes); + + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Item width"); + if (ImGui::TreeNode("Item width")) + { + HelpMarker( + "Showcase using PushItemWidth() and how it is preserved on a per-column basis.\n\n" + "Note that on auto-resizing non-resizable fixed columns, querying the content width for e.g. right-alignment doesn't make sense."); + if (ImGui::BeginTable("table_item_width", 3, ImGuiTableFlags_Borders)) + { + ImGui::TableSetupColumn("small"); + ImGui::TableSetupColumn("half"); + ImGui::TableSetupColumn("right-align"); + ImGui::TableHeadersRow(); + + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(); + if (row == 0) + { + // Setup ItemWidth once (instead of setting up every time, which is also possible but less efficient) + ImGui::TableSetColumnIndex(0); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 3.0f); // Small + ImGui::TableSetColumnIndex(1); + ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f); + ImGui::TableSetColumnIndex(2); + ImGui::PushItemWidth(-FLT_MIN); // Right-aligned + } + + // Draw our contents + static float dummy_f = 0.0f; + ImGui::PushID(row); + ImGui::TableSetColumnIndex(0); + ImGui::SliderFloat("float0", &dummy_f, 0.0f, 1.0f); + ImGui::TableSetColumnIndex(1); + ImGui::SliderFloat("float1", &dummy_f, 0.0f, 1.0f); + ImGui::TableSetColumnIndex(2); + ImGui::SliderFloat("float2", &dummy_f, 0.0f, 1.0f); + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // Demonstrate using TableHeader() calls instead of TableHeadersRow() + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Custom headers"); + if (ImGui::TreeNode("Custom headers")) + { + const int COLUMNS_COUNT = 3; + if (ImGui::BeginTable("table_custom_headers", COLUMNS_COUNT, ImGuiTableFlags_Borders | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + ImGui::TableSetupColumn("Apricot"); + ImGui::TableSetupColumn("Banana"); + ImGui::TableSetupColumn("Cherry"); + + // Dummy entire-column selection storage + // FIXME: It would be nice to actually demonstrate full-featured selection using those checkbox. + static bool column_selected[3] = {}; + + // Instead of calling TableHeadersRow() we'll submit custom headers ourselves + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + for (int column = 0; column < COLUMNS_COUNT; column++) + { + ImGui::TableSetColumnIndex(column); + const char* column_name = ImGui::TableGetColumnName(column); // Retrieve name passed to TableSetupColumn() + ImGui::PushID(column); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + ImGui::Checkbox("##checkall", &column_selected[column]); + ImGui::PopStyleVar(); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::TableHeader(column_name); + ImGui::PopID(); + } + + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + char buf[32]; + sprintf(buf, "Cell %d,%d", column, row); + ImGui::TableSetColumnIndex(column); + ImGui::Selectable(buf, column_selected[column]); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // Demonstrate creating custom context menus inside columns, while playing it nice with context menus provided by TableHeadersRow()/TableHeader() + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Context menus"); + if (ImGui::TreeNode("Context menus")) + { + HelpMarker("By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu.\nUsing ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body."); + static ImGuiTableFlags flags1 = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_ContextMenuInBody; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_ContextMenuInBody", &flags1, ImGuiTableFlags_ContextMenuInBody); + PopStyleCompact(); + + // Context Menus: first example + // [1.1] Right-click on the TableHeadersRow() line to open the default table context menu. + // [1.2] Right-click in columns also open the default table context menu (if ImGuiTableFlags_ContextMenuInBody is set) + const int COLUMNS_COUNT = 3; + if (ImGui::BeginTable("table_context_menu", COLUMNS_COUNT, flags1)) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + + // [1.1]] Right-click on the TableHeadersRow() line to open the default table context menu. + ImGui::TableHeadersRow(); + + // Submit dummy contents + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < COLUMNS_COUNT; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + // Context Menus: second example + // [2.1] Right-click on the TableHeadersRow() line to open the default table context menu. + // [2.2] Right-click on the ".." to open a custom popup + // [2.3] Right-click in columns to open another custom popup + HelpMarker("Demonstrate mixing table context menu (over header), item context button (over button) and custom per-colum context menu (over column body)."); + ImGuiTableFlags flags2 = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders; + if (ImGui::BeginTable("table_context_menu_2", COLUMNS_COUNT, flags2)) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + + // [2.1] Right-click on the TableHeadersRow() line to open the default table context menu. + ImGui::TableHeadersRow(); + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < COLUMNS_COUNT; column++) + { + // Submit dummy contents + ImGui::TableSetColumnIndex(column); + ImGui::Text("Cell %d,%d", column, row); + ImGui::SameLine(); + + // [2.2] Right-click on the ".." to open a custom popup + ImGui::PushID(row * COLUMNS_COUNT + column); + ImGui::SmallButton(".."); + if (ImGui::BeginPopupContextItem()) + { + ImGui::Text("This is the popup for Button(\"..\") in Cell %d,%d", column, row); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + ImGui::PopID(); + } + } + + // [2.3] Right-click anywhere in columns to open another custom popup + // (instead of testing for !IsAnyItemHovered() we could also call OpenPopup() with ImGuiPopupFlags_NoOpenOverExistingPopup + // to manage popup priority as the popups triggers, here "are we hovering a column" are overlapping) + int hovered_column = -1; + for (int column = 0; column < COLUMNS_COUNT + 1; column++) + { + ImGui::PushID(column); + if (ImGui::TableGetColumnFlags(column) & ImGuiTableColumnFlags_IsHovered) + hovered_column = column; + if (hovered_column == column && !ImGui::IsAnyItemHovered() && ImGui::IsMouseReleased(1)) + ImGui::OpenPopup("MyPopup"); + if (ImGui::BeginPopup("MyPopup")) + { + if (column == COLUMNS_COUNT) + ImGui::Text("This is a custom popup for unused space after the last column."); + else + ImGui::Text("This is a custom popup for Column %d", column); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + ImGui::PopID(); + } + + ImGui::EndTable(); + ImGui::Text("Hovered column: %d", hovered_column); + } + ImGui::TreePop(); + } + + // Demonstrate creating multiple tables with the same ID + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Synced instances"); + if (ImGui::TreeNode("Synced instances")) + { + HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc."); + for (int n = 0; n < 3; n++) + { + char buf[32]; + sprintf(buf, "Synced Table %d", n); + bool open = ImGui::CollapsingHeader(buf, ImGuiTreeNodeFlags_DefaultOpen); + if (open && ImGui::BeginTable("Table", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings)) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + for (int cell = 0; cell < 9; cell++) + { + ImGui::TableNextColumn(); + ImGui::Text("this cell %d", cell); + } + ImGui::EndTable(); + } + } + ImGui::TreePop(); + } + + // Demonstrate using Sorting facilities + // This is a simplified version of the "Advanced" example, where we mostly focus on the code necessary to handle sorting. + // Note that the "Advanced" example also showcase manually triggering a sort (e.g. if item quantities have been modified) + static const char* template_items_names[] = + { + "Banana", "Apple", "Cherry", "Watermelon", "Grapefruit", "Strawberry", "Mango", + "Kiwi", "Orange", "Pineapple", "Blueberry", "Plum", "Coconut", "Pear", "Apricot" + }; + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Sorting"); + if (ImGui::TreeNode("Sorting")) + { + // Create item list + static ImVector items; + if (items.Size == 0) + { + items.resize(50, MyItem()); + for (int n = 0; n < items.Size; n++) + { + const int template_n = n % IM_ARRAYSIZE(template_items_names); + MyItem& item = items[n]; + item.ID = n; + item.Name = template_items_names[template_n]; + item.Quantity = (n * n - n) % 20; // Assign default quantities + } + } + + // Options + static ImGuiTableFlags flags = + ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti + | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_NoBordersInBody + | ImGuiTableFlags_ScrollY; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti); + ImGui::SameLine(); HelpMarker("When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1)."); + ImGui::CheckboxFlags("ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate); + ImGui::SameLine(); HelpMarker("When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0)."); + PopStyleCompact(); + + if (ImGui::BeginTable("table_sorting", 4, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 15), 0.0f)) + { + // Declare columns + // We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications. + // This is so our sort function can identify a column given our own identifier. We could also identify them based on their index! + // Demonstrate using a mixture of flags among available sort-related flags: + // - ImGuiTableColumnFlags_DefaultSort + // - ImGuiTableColumnFlags_NoSort / ImGuiTableColumnFlags_NoSortAscending / ImGuiTableColumnFlags_NoSortDescending + // - ImGuiTableColumnFlags_PreferSortAscending / ImGuiTableColumnFlags_PreferSortDescending + ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_ID); + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); + ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); + ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending | ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Quantity); + ImGui::TableSetupScrollFreeze(0, 1); // Make row always visible + ImGui::TableHeadersRow(); + + // Sort our data if sort specs have been changed! + if (ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs()) + if (sorts_specs->SpecsDirty) + { + MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. + if (items.Size > 1) + qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); + MyItem::s_current_sort_specs = NULL; + sorts_specs->SpecsDirty = false; + } + + // Demonstrate using clipper for large vertical lists + ImGuiListClipper clipper; + clipper.Begin(items.Size); + while (clipper.Step()) + for (int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++) + { + // Display a data item + MyItem* item = &items[row_n]; + ImGui::PushID(item->ID); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("%04d", item->ID); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(item->Name); + ImGui::TableNextColumn(); + ImGui::SmallButton("None"); + ImGui::TableNextColumn(); + ImGui::Text("%d", item->Quantity); + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // In this example we'll expose most table flags and settings. + // For specific flags and settings refer to the corresponding section for more detailed explanation. + // This section is mostly useful to experiment with combining certain flags or settings with each others. + //ImGui::SetNextItemOpen(true, ImGuiCond_Once); // [DEBUG] + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Advanced"); + if (ImGui::TreeNode("Advanced")) + { + static ImGuiTableFlags flags = + ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable + | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti + | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBody + | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY + | ImGuiTableFlags_SizingFixedFit; + + enum ContentsType { CT_Text, CT_Button, CT_SmallButton, CT_FillButton, CT_Selectable, CT_SelectableSpanRow }; + static int contents_type = CT_SelectableSpanRow; + const char* contents_type_names[] = { "Text", "Button", "SmallButton", "FillButton", "Selectable", "Selectable (span row)" }; + static int freeze_cols = 1; + static int freeze_rows = 1; + static int items_count = IM_ARRAYSIZE(template_items_names) * 2; + static ImVec2 outer_size_value = ImVec2(0.0f, TEXT_BASE_HEIGHT * 12); + static float row_min_height = 0.0f; // Auto + static float inner_width_with_scroll = 0.0f; // Auto-extend + static bool outer_size_enabled = true; + static bool show_headers = true; + static bool show_wrapped_text = false; + //static ImGuiTextFilter filter; + //ImGui::SetNextItemOpen(true, ImGuiCond_Once); // FIXME-TABLE: Enabling this results in initial clipped first pass on table which tend to affects column sizing + if (ImGui::TreeNode("Options")) + { + // Make the UI compact because there are so many fields + PushStyleCompact(); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 28.0f); + + if (ImGui::TreeNodeEx("Features:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable); + ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable); + ImGui::CheckboxFlags("ImGuiTableFlags_Sortable", &flags, ImGuiTableFlags_Sortable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoSavedSettings", &flags, ImGuiTableFlags_NoSavedSettings); + ImGui::CheckboxFlags("ImGuiTableFlags_ContextMenuInBody", &flags, ImGuiTableFlags_ContextMenuInBody); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Decorations:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appears in Headers"); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appears in Headers)"); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Sizing:", ImGuiTreeNodeFlags_DefaultOpen)) + { + EditTableSizingFlags(&flags); + ImGui::SameLine(); HelpMarker("In the Advanced demo we override the policy of each column so those table-wide settings have less effect that typical."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); + ImGui::SameLine(); HelpMarker("Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY); + ImGui::SameLine(); HelpMarker("Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoKeepColumnsVisible", &flags, ImGuiTableFlags_NoKeepColumnsVisible); + ImGui::SameLine(); HelpMarker("Only available if ScrollX is disabled."); + ImGui::CheckboxFlags("ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths); + ImGui::SameLine(); HelpMarker("Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip); + ImGui::SameLine(); HelpMarker("Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with ScrollFreeze options."); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Padding:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_PadOuterX", &flags, ImGuiTableFlags_PadOuterX); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadOuterX", &flags, ImGuiTableFlags_NoPadOuterX); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadInnerX", &flags, ImGuiTableFlags_NoPadInnerX); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Scrolling:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); + ImGui::SameLine(); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::SameLine(); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Sorting:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti); + ImGui::SameLine(); HelpMarker("When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1)."); + ImGui::CheckboxFlags("ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate); + ImGui::SameLine(); HelpMarker("When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0)."); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Other:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::Checkbox("show_headers", &show_headers); + ImGui::Checkbox("show_wrapped_text", &show_wrapped_text); + + ImGui::DragFloat2("##OuterSize", &outer_size_value.x); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::Checkbox("outer_size", &outer_size_enabled); + ImGui::SameLine(); + HelpMarker("If scrolling is disabled (ScrollX and ScrollY not set):\n" + "- The table is output directly in the parent window.\n" + "- OuterSize.x < 0.0f will right-align the table.\n" + "- OuterSize.x = 0.0f will narrow fit the table unless there are any Stretch column.\n" + "- OuterSize.y then becomes the minimum size for the table, which will extend vertically if there are more rows (unless NoHostExtendY is set)."); + + // From a user point of view we will tend to use 'inner_width' differently depending on whether our table is embedding scrolling. + // To facilitate toying with this demo we will actually pass 0.0f to the BeginTable() when ScrollX is disabled. + ImGui::DragFloat("inner_width (when ScrollX active)", &inner_width_with_scroll, 1.0f, 0.0f, FLT_MAX); + + ImGui::DragFloat("row_min_height", &row_min_height, 1.0f, 0.0f, FLT_MAX); + ImGui::SameLine(); HelpMarker("Specify height of the Selectable item."); + + ImGui::DragInt("items_count", &items_count, 0.1f, 0, 9999); + ImGui::Combo("items_type (first column)", &contents_type, contents_type_names, IM_ARRAYSIZE(contents_type_names)); + //filter.Draw("filter"); + ImGui::TreePop(); + } + + ImGui::PopItemWidth(); + PopStyleCompact(); + ImGui::Spacing(); + ImGui::TreePop(); + } + + // Update item list if we changed the number of items + static ImVector items; + static ImVector selection; + static bool items_need_sort = false; + if (items.Size != items_count) + { + items.resize(items_count, MyItem()); + for (int n = 0; n < items_count; n++) + { + const int template_n = n % IM_ARRAYSIZE(template_items_names); + MyItem& item = items[n]; + item.ID = n; + item.Name = template_items_names[template_n]; + item.Quantity = (template_n == 3) ? 10 : (template_n == 4) ? 20 : 0; // Assign default quantities + } + } + + const ImDrawList* parent_draw_list = ImGui::GetWindowDrawList(); + const int parent_draw_list_draw_cmd_count = parent_draw_list->CmdBuffer.Size; + ImVec2 table_scroll_cur, table_scroll_max; // For debug display + const ImDrawList* table_draw_list = NULL; // " + + // Submit table + const float inner_width_to_use = (flags & ImGuiTableFlags_ScrollX) ? inner_width_with_scroll : 0.0f; + if (ImGui::BeginTable("table_advanced", 6, flags, outer_size_enabled ? outer_size_value : ImVec2(0, 0), inner_width_to_use)) + { + // Declare columns + // We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications. + // This is so our sort function can identify a column given our own identifier. We could also identify them based on their index! + ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHide, 0.0f, MyItemColumnID_ID); + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); + ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); + ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending, 0.0f, MyItemColumnID_Quantity); + ImGui::TableSetupColumn("Description", (flags & ImGuiTableFlags_NoHostExtendX) ? 0 : ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Description); + ImGui::TableSetupColumn("Hidden", ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort); + ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows); + + // Sort our data if sort specs have been changed! + ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs(); + if (sorts_specs && sorts_specs->SpecsDirty) + items_need_sort = true; + if (sorts_specs && items_need_sort && items.Size > 1) + { + MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. + qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); + MyItem::s_current_sort_specs = NULL; + sorts_specs->SpecsDirty = false; + } + items_need_sort = false; + + // Take note of whether we are currently sorting based on the Quantity field, + // we will use this to trigger sorting when we know the data of this column has been modified. + const bool sorts_specs_using_quantity = (ImGui::TableGetColumnFlags(3) & ImGuiTableColumnFlags_IsSorted) != 0; + + // Show headers + if (show_headers) + ImGui::TableHeadersRow(); + + // Show data + // FIXME-TABLE FIXME-NAV: How we can get decent up/down even though we have the buttons here? + ImGui::PushButtonRepeat(true); +#if 1 + // Demonstrate using clipper for large vertical lists + ImGuiListClipper clipper; + clipper.Begin(items.Size); + while (clipper.Step()) + { + for (int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++) +#else + // Without clipper + { + for (int row_n = 0; row_n < items.Size; row_n++) +#endif + { + MyItem* item = &items[row_n]; + //if (!filter.PassFilter(item->Name)) + // continue; + + const bool item_is_selected = selection.contains(item->ID); + ImGui::PushID(item->ID); + ImGui::TableNextRow(ImGuiTableRowFlags_None, row_min_height); + + // For the demo purpose we can select among different type of items submitted in the first column + ImGui::TableSetColumnIndex(0); + char label[32]; + sprintf(label, "%04d", item->ID); + if (contents_type == CT_Text) + ImGui::TextUnformatted(label); + else if (contents_type == CT_Button) + ImGui::Button(label); + else if (contents_type == CT_SmallButton) + ImGui::SmallButton(label); + else if (contents_type == CT_FillButton) + ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f)); + else if (contents_type == CT_Selectable || contents_type == CT_SelectableSpanRow) + { + ImGuiSelectableFlags selectable_flags = (contents_type == CT_SelectableSpanRow) ? ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap : ImGuiSelectableFlags_None; + if (ImGui::Selectable(label, item_is_selected, selectable_flags, ImVec2(0, row_min_height))) + { + if (ImGui::GetIO().KeyCtrl) + { + if (item_is_selected) + selection.find_erase_unsorted(item->ID); + else + selection.push_back(item->ID); + } + else + { + selection.clear(); + selection.push_back(item->ID); + } + } + } + + if (ImGui::TableSetColumnIndex(1)) + ImGui::TextUnformatted(item->Name); + + // Here we demonstrate marking our data set as needing to be sorted again if we modified a quantity, + // and we are currently sorting on the column showing the Quantity. + // To avoid triggering a sort while holding the button, we only trigger it when the button has been released. + // You will probably need a more advanced system in your code if you want to automatically sort when a specific entry changes. + if (ImGui::TableSetColumnIndex(2)) + { + if (ImGui::SmallButton("Chop")) { item->Quantity += 1; } + if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort = true; } + ImGui::SameLine(); + if (ImGui::SmallButton("Eat")) { item->Quantity -= 1; } + if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort = true; } + } + + if (ImGui::TableSetColumnIndex(3)) + ImGui::Text("%d", item->Quantity); + + ImGui::TableSetColumnIndex(4); + if (show_wrapped_text) + ImGui::TextWrapped("Lorem ipsum dolor sit amet"); + else + ImGui::Text("Lorem ipsum dolor sit amet"); + + if (ImGui::TableSetColumnIndex(5)) + ImGui::Text("1234"); + + ImGui::PopID(); + } + } + ImGui::PopButtonRepeat(); + + // Store some info to display debug details below + table_scroll_cur = ImVec2(ImGui::GetScrollX(), ImGui::GetScrollY()); + table_scroll_max = ImVec2(ImGui::GetScrollMaxX(), ImGui::GetScrollMaxY()); + table_draw_list = ImGui::GetWindowDrawList(); + ImGui::EndTable(); + } + static bool show_debug_details = false; + ImGui::Checkbox("Debug details", &show_debug_details); + if (show_debug_details && table_draw_list) + { + ImGui::SameLine(0.0f, 0.0f); + const int table_draw_list_draw_cmd_count = table_draw_list->CmdBuffer.Size; + if (table_draw_list == parent_draw_list) + ImGui::Text(": DrawCmd: +%d (in same window)", + table_draw_list_draw_cmd_count - parent_draw_list_draw_cmd_count); + else + ImGui::Text(": DrawCmd: +%d (in child window), Scroll: (%.f/%.f) (%.f/%.f)", + table_draw_list_draw_cmd_count - 1, table_scroll_cur.x, table_scroll_max.x, table_scroll_cur.y, table_scroll_max.y); + } + ImGui::TreePop(); + } + + ImGui::PopID(); + + ShowDemoWindowColumns(); + + if (disable_indent) + ImGui::PopStyleVar(); +} + +// Demonstrate old/legacy Columns API! +// [2020: Columns are under-featured and not maintained. Prefer using the more flexible and powerful BeginTable() API!] +static void ShowDemoWindowColumns() +{ + IMGUI_DEMO_MARKER("Columns (legacy API)"); + bool open = ImGui::TreeNode("Legacy Columns API"); + ImGui::SameLine(); + HelpMarker("Columns() is an old API! Prefer using the more flexible and powerful BeginTable() API!"); + if (!open) + return; + + // Basic columns + IMGUI_DEMO_MARKER("Columns (legacy API)/Basic"); + if (ImGui::TreeNode("Basic")) + { + ImGui::Text("Without border:"); + ImGui::Columns(3, "mycolumns3", false); // 3-ways, no border + ImGui::Separator(); + for (int n = 0; n < 14; n++) + { + char label[32]; + sprintf(label, "Item %d", n); + if (ImGui::Selectable(label)) {} + //if (ImGui::Button(label, ImVec2(-FLT_MIN,0.0f))) {} + ImGui::NextColumn(); + } + ImGui::Columns(1); + ImGui::Separator(); + + ImGui::Text("With border:"); + ImGui::Columns(4, "mycolumns"); // 4-ways, with border + ImGui::Separator(); + ImGui::Text("ID"); ImGui::NextColumn(); + ImGui::Text("Name"); ImGui::NextColumn(); + ImGui::Text("Path"); ImGui::NextColumn(); + ImGui::Text("Hovered"); ImGui::NextColumn(); + ImGui::Separator(); + const char* names[3] = { "One", "Two", "Three" }; + const char* paths[3] = { "/path/one", "/path/two", "/path/three" }; + static int selected = -1; + for (int i = 0; i < 3; i++) + { + char label[32]; + sprintf(label, "%04d", i); + if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns)) + selected = i; + bool hovered = ImGui::IsItemHovered(); + ImGui::NextColumn(); + ImGui::Text(names[i]); ImGui::NextColumn(); + ImGui::Text(paths[i]); ImGui::NextColumn(); + ImGui::Text("%d", hovered); ImGui::NextColumn(); + } + ImGui::Columns(1); + ImGui::Separator(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Columns (legacy API)/Borders"); + if (ImGui::TreeNode("Borders")) + { + // NB: Future columns API should allow automatic horizontal borders. + static bool h_borders = true; + static bool v_borders = true; + static int columns_count = 4; + const int lines_count = 3; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::DragInt("##columns_count", &columns_count, 0.1f, 2, 10, "%d columns"); + if (columns_count < 2) + columns_count = 2; + ImGui::SameLine(); + ImGui::Checkbox("horizontal", &h_borders); + ImGui::SameLine(); + ImGui::Checkbox("vertical", &v_borders); + ImGui::Columns(columns_count, NULL, v_borders); + for (int i = 0; i < columns_count * lines_count; i++) + { + if (h_borders && ImGui::GetColumnIndex() == 0) + ImGui::Separator(); + ImGui::Text("%c%c%c", 'a' + i, 'a' + i, 'a' + i); + ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); + ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x); + ImGui::Text("Offset %.2f", ImGui::GetColumnOffset()); + ImGui::Text("Long text that is likely to clip"); + ImGui::Button("Button", ImVec2(-FLT_MIN, 0.0f)); + ImGui::NextColumn(); + } + ImGui::Columns(1); + if (h_borders) + ImGui::Separator(); + ImGui::TreePop(); + } + + // Create multiple items in a same cell before switching to next column + IMGUI_DEMO_MARKER("Columns (legacy API)/Mixed items"); + if (ImGui::TreeNode("Mixed items")) + { + ImGui::Columns(3, "mixed"); + ImGui::Separator(); + + ImGui::Text("Hello"); + ImGui::Button("Banana"); + ImGui::NextColumn(); + + ImGui::Text("ImGui"); + ImGui::Button("Apple"); + static float foo = 1.0f; + ImGui::InputFloat("red", &foo, 0.05f, 0, "%.3f"); + ImGui::Text("An extra line here."); + ImGui::NextColumn(); + + ImGui::Text("Sailor"); + ImGui::Button("Corniflower"); + static float bar = 1.0f; + ImGui::InputFloat("blue", &bar, 0.05f, 0, "%.3f"); + ImGui::NextColumn(); + + if (ImGui::CollapsingHeader("Category A")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); + if (ImGui::CollapsingHeader("Category B")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); + if (ImGui::CollapsingHeader("Category C")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); + ImGui::Columns(1); + ImGui::Separator(); + ImGui::TreePop(); + } + + // Word wrapping + IMGUI_DEMO_MARKER("Columns (legacy API)/Word-wrapping"); + if (ImGui::TreeNode("Word-wrapping")) + { + ImGui::Columns(2, "word-wrapping"); + ImGui::Separator(); + ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); + ImGui::TextWrapped("Hello Left"); + ImGui::NextColumn(); + ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); + ImGui::TextWrapped("Hello Right"); + ImGui::Columns(1); + ImGui::Separator(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Columns (legacy API)/Horizontal Scrolling"); + if (ImGui::TreeNode("Horizontal Scrolling")) + { + ImGui::SetNextWindowContentSize(ImVec2(1500.0f, 0.0f)); + ImVec2 child_size = ImVec2(0, ImGui::GetFontSize() * 20.0f); + ImGui::BeginChild("##ScrollingRegion", child_size, false, ImGuiWindowFlags_HorizontalScrollbar); + ImGui::Columns(10); + + // Also demonstrate using clipper for large vertical lists + int ITEMS_COUNT = 2000; + ImGuiListClipper clipper; + clipper.Begin(ITEMS_COUNT); + while (clipper.Step()) + { + for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + for (int j = 0; j < 10; j++) + { + ImGui::Text("Line %d Column %d...", i, j); + ImGui::NextColumn(); + } + } + ImGui::Columns(1); + ImGui::EndChild(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Columns (legacy API)/Tree"); + if (ImGui::TreeNode("Tree")) + { + ImGui::Columns(2, "tree", true); + for (int x = 0; x < 3; x++) + { + bool open1 = ImGui::TreeNode((void*)(intptr_t)x, "Node%d", x); + ImGui::NextColumn(); + ImGui::Text("Node contents"); + ImGui::NextColumn(); + if (open1) + { + for (int y = 0; y < 3; y++) + { + bool open2 = ImGui::TreeNode((void*)(intptr_t)y, "Node%d.%d", x, y); + ImGui::NextColumn(); + ImGui::Text("Node contents"); + if (open2) + { + ImGui::Text("Even more contents"); + if (ImGui::TreeNode("Tree in column")) + { + ImGui::Text("The quick brown fox jumps over the lazy dog"); + ImGui::TreePop(); + } + } + ImGui::NextColumn(); + if (open2) + ImGui::TreePop(); + } + ImGui::TreePop(); + } + } + ImGui::Columns(1); + ImGui::TreePop(); + } + + ImGui::TreePop(); +} + +namespace ImGui { extern ImGuiKeyData* GetKeyData(ImGuiKey key); } + +static void ShowDemoWindowMisc() +{ + IMGUI_DEMO_MARKER("Filtering"); + if (ImGui::CollapsingHeader("Filtering")) + { + // Helper class to easy setup a text filter. + // You may want to implement a more feature-full filtering scheme in your own application. + static ImGuiTextFilter filter; + ImGui::Text("Filter usage:\n" + " \"\" display all lines\n" + " \"xxx\" display lines containing \"xxx\"\n" + " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n" + " \"-xxx\" hide lines containing \"xxx\""); + filter.Draw(); + const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }; + for (int i = 0; i < IM_ARRAYSIZE(lines); i++) + if (filter.PassFilter(lines[i])) + ImGui::BulletText("%s", lines[i]); + } + + IMGUI_DEMO_MARKER("Inputs, Navigation & Focus"); + if (ImGui::CollapsingHeader("Inputs, Navigation & Focus")) + { + ImGuiIO& io = ImGui::GetIO(); + + // Display ImGuiIO output flags + IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Output"); + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode("Output")) + { + ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse); + ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose); + ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard); + ImGui::Text("io.WantTextInput: %d", io.WantTextInput); + ImGui::Text("io.WantSetMousePos: %d", io.WantSetMousePos); + ImGui::Text("io.NavActive: %d, io.NavVisible: %d", io.NavActive, io.NavVisible); + ImGui::TreePop(); + } + + // Display Mouse state + IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Mouse State"); + if (ImGui::TreeNode("Mouse State")) + { + if (ImGui::IsMousePosValid()) + ImGui::Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y); + else + ImGui::Text("Mouse pos: "); + ImGui::Text("Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y); + + int count = IM_ARRAYSIZE(io.MouseDown); + ImGui::Text("Mouse down:"); for (int i = 0; i < count; i++) if (ImGui::IsMouseDown(i)) { ImGui::SameLine(); ImGui::Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); } + ImGui::Text("Mouse clicked:"); for (int i = 0; i < count; i++) if (ImGui::IsMouseClicked(i)) { ImGui::SameLine(); ImGui::Text("b%d (%d)", i, ImGui::GetMouseClickedCount(i)); } + ImGui::Text("Mouse released:"); for (int i = 0; i < count; i++) if (ImGui::IsMouseReleased(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); } + ImGui::Text("Mouse wheel: %.1f", io.MouseWheel); + ImGui::Text("Pen Pressure: %.1f", io.PenPressure); // Note: currently unused + ImGui::TreePop(); + } + + // Display Keyboard/Mouse state + IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Keyboard, Gamepad & Navigation State"); + if (ImGui::TreeNode("Keyboard, Gamepad & Navigation State")) + { + // We iterate both legacy native range and named ImGuiKey ranges, which is a little odd but this allow displaying the data for old/new backends. + // User code should never have to go through such hoops: old code may use native keycodes, new code may use ImGuiKey codes. +#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO + struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } }; + const ImGuiKey key_first = ImGuiKey_NamedKey_BEGIN; +#else + struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && ImGui::GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array + const ImGuiKey key_first = 0; + //ImGui::Text("Legacy raw:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (io.KeysDown[key]) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } } +#endif + ImGui::Text("Keys down:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyDown(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d (%.02f secs)", ImGui::GetKeyName(key), key, ImGui::GetKeyData(key)->DownDuration); } } + ImGui::Text("Keys pressed:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyPressed(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } } + ImGui::Text("Keys released:"); for (ImGuiKey key = key_first; key < ImGuiKey_COUNT; key++) { if (funcs::IsLegacyNativeDupe(key)) continue; if (ImGui::IsKeyReleased(key)) { ImGui::SameLine(); ImGui::Text("\"%s\" %d", ImGui::GetKeyName(key), key); } } + ImGui::Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : ""); + ImGui::Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; ImGui::SameLine(); ImGui::Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public. + ImGui::Text("NavInputs down:"); for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) if (io.NavInputs[i] > 0.0f) { ImGui::SameLine(); ImGui::Text("[%d] %.2f (%.02f secs)", i, io.NavInputs[i], io.NavInputsDownDuration[i]); } + ImGui::Text("NavInputs pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) if (io.NavInputsDownDuration[i] == 0.0f) { ImGui::SameLine(); ImGui::Text("[%d]", i); } + + // Draw an arbitrary US keyboard layout to visualize translated keys + { + const ImVec2 key_size = ImVec2(35.0f, 35.0f); + const float key_rounding = 3.0f; + const ImVec2 key_face_size = ImVec2(25.0f, 25.0f); + const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f); + const float key_face_rounding = 2.0f; + const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f); + const ImVec2 key_step = ImVec2(key_size.x - 1.0f, key_size.y - 1.0f); + const float key_row_offset = 9.0f; + + ImVec2 board_min = ImGui::GetCursorScreenPos(); + ImVec2 board_max = ImVec2(board_min.x + 3 * key_step.x + 2 * key_row_offset + 10.0f, board_min.y + 3 * key_step.y + 10.0f); + ImVec2 start_pos = ImVec2(board_min.x + 5.0f - key_step.x, board_min.y); + + struct KeyLayoutData { int Row, Col; const char* Label; ImGuiKey Key; }; + const KeyLayoutData keys_to_display[] = + { + { 0, 0, "", ImGuiKey_Tab }, { 0, 1, "Q", ImGuiKey_Q }, { 0, 2, "W", ImGuiKey_W }, { 0, 3, "E", ImGuiKey_E }, { 0, 4, "R", ImGuiKey_R }, + { 1, 0, "", ImGuiKey_CapsLock }, { 1, 1, "A", ImGuiKey_A }, { 1, 2, "S", ImGuiKey_S }, { 1, 3, "D", ImGuiKey_D }, { 1, 4, "F", ImGuiKey_F }, + { 2, 0, "", ImGuiKey_LeftShift },{ 2, 1, "Z", ImGuiKey_Z }, { 2, 2, "X", ImGuiKey_X }, { 2, 3, "C", ImGuiKey_C }, { 2, 4, "V", ImGuiKey_V } + }; + + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + draw_list->PushClipRect(board_min, board_max, true); + for (int n = 0; n < IM_ARRAYSIZE(keys_to_display); n++) + { + const KeyLayoutData* key_data = &keys_to_display[n]; + ImVec2 key_min = ImVec2(start_pos.x + key_data->Col * key_step.x + key_data->Row * key_row_offset, start_pos.y + key_data->Row * key_step.y); + ImVec2 key_max = ImVec2(key_min.x + key_size.x, key_min.y + key_size.y); + draw_list->AddRectFilled(key_min, key_max, IM_COL32(204, 204, 204, 255), key_rounding); + draw_list->AddRect(key_min, key_max, IM_COL32(24, 24, 24, 255), key_rounding); + ImVec2 face_min = ImVec2(key_min.x + key_face_pos.x, key_min.y + key_face_pos.y); + ImVec2 face_max = ImVec2(face_min.x + key_face_size.x, face_min.y + key_face_size.y); + draw_list->AddRect(face_min, face_max, IM_COL32(193, 193, 193, 255), key_face_rounding, ImDrawFlags_None, 2.0f); + draw_list->AddRectFilled(face_min, face_max, IM_COL32(252, 252, 252, 255), key_face_rounding); + ImVec2 label_min = ImVec2(key_min.x + key_label_pos.x, key_min.y + key_label_pos.y); + draw_list->AddText(label_min, IM_COL32(64, 64, 64, 255), key_data->Label); + if (ImGui::IsKeyDown(key_data->Key)) + draw_list->AddRectFilled(key_min, key_max, IM_COL32(255, 0, 0, 128), key_rounding); + } + draw_list->PopClipRect(); + ImGui::Dummy(ImVec2(board_max.x - board_min.x, board_max.y - board_min.y)); + } + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Capture override")) + { + ImGui::Button("Hovering me sets the\nkeyboard capture flag"); + if (ImGui::IsItemHovered()) + ImGui::CaptureKeyboardFromApp(true); + ImGui::SameLine(); + ImGui::Button("Holding me clears the\nthe keyboard capture flag"); + if (ImGui::IsItemActive()) + ImGui::CaptureKeyboardFromApp(false); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Tabbing"); + if (ImGui::TreeNode("Tabbing")) + { + ImGui::Text("Use TAB/SHIFT+TAB to cycle through keyboard editable fields."); + static char buf[32] = "hello"; + ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); + ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); + ImGui::InputText("3", buf, IM_ARRAYSIZE(buf)); + ImGui::PushAllowKeyboardFocus(false); + ImGui::InputText("4 (tab skip)", buf, IM_ARRAYSIZE(buf)); + ImGui::SameLine(); HelpMarker("Item won't be cycled through when using TAB or Shift+Tab."); + ImGui::PopAllowKeyboardFocus(); + ImGui::InputText("5", buf, IM_ARRAYSIZE(buf)); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Focus from code"); + if (ImGui::TreeNode("Focus from code")) + { + bool focus_1 = ImGui::Button("Focus on 1"); ImGui::SameLine(); + bool focus_2 = ImGui::Button("Focus on 2"); ImGui::SameLine(); + bool focus_3 = ImGui::Button("Focus on 3"); + int has_focus = 0; + static char buf[128] = "click on a button to set focus"; + + if (focus_1) ImGui::SetKeyboardFocusHere(); + ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); + if (ImGui::IsItemActive()) has_focus = 1; + + if (focus_2) ImGui::SetKeyboardFocusHere(); + ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); + if (ImGui::IsItemActive()) has_focus = 2; + + ImGui::PushAllowKeyboardFocus(false); + if (focus_3) ImGui::SetKeyboardFocusHere(); + ImGui::InputText("3 (tab skip)", buf, IM_ARRAYSIZE(buf)); + if (ImGui::IsItemActive()) has_focus = 3; + ImGui::SameLine(); HelpMarker("Item won't be cycled through when using TAB or Shift+Tab."); + ImGui::PopAllowKeyboardFocus(); + + if (has_focus) + ImGui::Text("Item with focus: %d", has_focus); + else + ImGui::Text("Item with focus: "); + + // Use >= 0 parameter to SetKeyboardFocusHere() to focus an upcoming item + static float f3[3] = { 0.0f, 0.0f, 0.0f }; + int focus_ahead = -1; + if (ImGui::Button("Focus on X")) { focus_ahead = 0; } ImGui::SameLine(); + if (ImGui::Button("Focus on Y")) { focus_ahead = 1; } ImGui::SameLine(); + if (ImGui::Button("Focus on Z")) { focus_ahead = 2; } + if (focus_ahead != -1) ImGui::SetKeyboardFocusHere(focus_ahead); + ImGui::SliderFloat3("Float3", &f3[0], 0.0f, 1.0f); + + ImGui::TextWrapped("NB: Cursor & selection are preserved when refocusing last used item in code."); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Dragging"); + if (ImGui::TreeNode("Dragging")) + { + ImGui::TextWrapped("You can use ImGui::GetMouseDragDelta(0) to query for the dragged amount on any widget."); + for (int button = 0; button < 3; button++) + { + ImGui::Text("IsMouseDragging(%d):", button); + ImGui::Text(" w/ default threshold: %d,", ImGui::IsMouseDragging(button)); + ImGui::Text(" w/ zero threshold: %d,", ImGui::IsMouseDragging(button, 0.0f)); + ImGui::Text(" w/ large threshold: %d,", ImGui::IsMouseDragging(button, 20.0f)); + } + + ImGui::Button("Drag Me"); + if (ImGui::IsItemActive()) + ImGui::GetForegroundDrawList()->AddLine(io.MouseClickedPos[0], io.MousePos, ImGui::GetColorU32(ImGuiCol_Button), 4.0f); // Draw a line between the button and the mouse cursor + + // Drag operations gets "unlocked" when the mouse has moved past a certain threshold + // (the default threshold is stored in io.MouseDragThreshold). You can request a lower or higher + // threshold using the second parameter of IsMouseDragging() and GetMouseDragDelta(). + ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f); + ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0); + ImVec2 mouse_delta = io.MouseDelta; + ImGui::Text("GetMouseDragDelta(0):"); + ImGui::Text(" w/ default threshold: (%.1f, %.1f)", value_with_lock_threshold.x, value_with_lock_threshold.y); + ImGui::Text(" w/ zero threshold: (%.1f, %.1f)", value_raw.x, value_raw.y); + ImGui::Text("io.MouseDelta: (%.1f, %.1f)", mouse_delta.x, mouse_delta.y); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Inputs, Navigation & Focus/Mouse cursors"); + if (ImGui::TreeNode("Mouse cursors")) + { + const char* mouse_cursors_names[] = { "Arrow", "TextInput", "ResizeAll", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE", "Hand", "NotAllowed" }; + IM_ASSERT(IM_ARRAYSIZE(mouse_cursors_names) == ImGuiMouseCursor_COUNT); + + ImGuiMouseCursor current = ImGui::GetMouseCursor(); + ImGui::Text("Current mouse cursor = %d: %s", current, mouse_cursors_names[current]); + ImGui::Text("Hover to see mouse cursors:"); + ImGui::SameLine(); HelpMarker( + "Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. " + "If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, " + "otherwise your backend needs to handle it."); + for (int i = 0; i < ImGuiMouseCursor_COUNT; i++) + { + char label[32]; + sprintf(label, "Mouse cursor %d: %s", i, mouse_cursors_names[i]); + ImGui::Bullet(); ImGui::Selectable(label, false); + if (ImGui::IsItemHovered()) + ImGui::SetMouseCursor(i); + } + ImGui::TreePop(); + } + } +} + +//----------------------------------------------------------------------------- +// [SECTION] About Window / ShowAboutWindow() +// Access from Dear ImGui Demo -> Tools -> About +//----------------------------------------------------------------------------- + +void ImGui::ShowAboutWindow(bool* p_open) +{ + if (!ImGui::Begin("About Dear ImGui", p_open, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Tools/About Dear ImGui"); + ImGui::Text("Dear ImGui %s", ImGui::GetVersion()); + ImGui::Separator(); + ImGui::Text("By Omar Cornut and all Dear ImGui contributors."); + ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information."); + + static bool show_config_info = false; + ImGui::Checkbox("Config/Build Information", &show_config_info); + if (show_config_info) + { + ImGuiIO& io = ImGui::GetIO(); + ImGuiStyle& style = ImGui::GetStyle(); + + bool copy_to_clipboard = ImGui::Button("Copy to clipboard"); + ImVec2 child_size = ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 18); + ImGui::BeginChildFrame(ImGui::GetID("cfg_infos"), child_size, ImGuiWindowFlags_NoMove); + if (copy_to_clipboard) + { + ImGui::LogToClipboard(); + ImGui::LogText("```\n"); // Back quotes will make text appears without formatting when pasting on GitHub + } + + ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM); + ImGui::Separator(); + ImGui::Text("sizeof(size_t): %d, sizeof(ImDrawIdx): %d, sizeof(ImDrawVert): %d", (int)sizeof(size_t), (int)sizeof(ImDrawIdx), (int)sizeof(ImDrawVert)); + ImGui::Text("define: __cplusplus=%d", (int)__cplusplus); +#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO + ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_KEYIO"); +#endif +#ifdef IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_WIN32_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_WIN32_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_FILE_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_FILE_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_ALLOCATORS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_ALLOCATORS"); +#endif +#ifdef IMGUI_USE_BGRA_PACKED_COLOR + ImGui::Text("define: IMGUI_USE_BGRA_PACKED_COLOR"); +#endif +#ifdef _WIN32 + ImGui::Text("define: _WIN32"); +#endif +#ifdef _WIN64 + ImGui::Text("define: _WIN64"); +#endif +#ifdef __linux__ + ImGui::Text("define: __linux__"); +#endif +#ifdef __APPLE__ + ImGui::Text("define: __APPLE__"); +#endif +#ifdef _MSC_VER + ImGui::Text("define: _MSC_VER=%d", _MSC_VER); +#endif +#ifdef _MSVC_LANG + ImGui::Text("define: _MSVC_LANG=%d", (int)_MSVC_LANG); +#endif +#ifdef __MINGW32__ + ImGui::Text("define: __MINGW32__"); +#endif +#ifdef __MINGW64__ + ImGui::Text("define: __MINGW64__"); +#endif +#ifdef __GNUC__ + ImGui::Text("define: __GNUC__=%d", (int)__GNUC__); +#endif +#ifdef __clang_version__ + ImGui::Text("define: __clang_version__=%s", __clang_version__); +#endif + ImGui::Separator(); + ImGui::Text("io.BackendPlatformName: %s", io.BackendPlatformName ? io.BackendPlatformName : "NULL"); + ImGui::Text("io.BackendRendererName: %s", io.BackendRendererName ? io.BackendRendererName : "NULL"); + ImGui::Text("io.ConfigFlags: 0x%08X", io.ConfigFlags); + if (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) ImGui::Text(" NavEnableKeyboard"); + if (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) ImGui::Text(" NavEnableGamepad"); + if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) ImGui::Text(" NavEnableSetMousePos"); + if (io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard) ImGui::Text(" NavNoCaptureKeyboard"); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) ImGui::Text(" NoMouse"); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) ImGui::Text(" NoMouseCursorChange"); + if (io.MouseDrawCursor) ImGui::Text("io.MouseDrawCursor"); + if (io.ConfigMacOSXBehaviors) ImGui::Text("io.ConfigMacOSXBehaviors"); + if (io.ConfigInputTextCursorBlink) ImGui::Text("io.ConfigInputTextCursorBlink"); + if (io.ConfigWindowsResizeFromEdges) ImGui::Text("io.ConfigWindowsResizeFromEdges"); + if (io.ConfigWindowsMoveFromTitleBarOnly) ImGui::Text("io.ConfigWindowsMoveFromTitleBarOnly"); + if (io.ConfigMemoryCompactTimer >= 0.0f) ImGui::Text("io.ConfigMemoryCompactTimer = %.1f", io.ConfigMemoryCompactTimer); + ImGui::Text("io.BackendFlags: 0x%08X", io.BackendFlags); + if (io.BackendFlags & ImGuiBackendFlags_HasGamepad) ImGui::Text(" HasGamepad"); + if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(" HasMouseCursors"); + if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(" HasSetMousePos"); + if (io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) ImGui::Text(" RendererHasVtxOffset"); + ImGui::Separator(); + ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight); + ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y); + ImGui::Text("io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + ImGui::Separator(); + ImGui::Text("style.WindowPadding: %.2f,%.2f", style.WindowPadding.x, style.WindowPadding.y); + ImGui::Text("style.WindowBorderSize: %.2f", style.WindowBorderSize); + ImGui::Text("style.FramePadding: %.2f,%.2f", style.FramePadding.x, style.FramePadding.y); + ImGui::Text("style.FrameRounding: %.2f", style.FrameRounding); + ImGui::Text("style.FrameBorderSize: %.2f", style.FrameBorderSize); + ImGui::Text("style.ItemSpacing: %.2f,%.2f", style.ItemSpacing.x, style.ItemSpacing.y); + ImGui::Text("style.ItemInnerSpacing: %.2f,%.2f", style.ItemInnerSpacing.x, style.ItemInnerSpacing.y); + + if (copy_to_clipboard) + { + ImGui::LogText("\n```\n"); + ImGui::LogFinish(); + } + ImGui::EndChildFrame(); + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Style Editor / ShowStyleEditor() +//----------------------------------------------------------------------------- +// - ShowFontSelector() +// - ShowStyleSelector() +// - ShowStyleEditor() +//----------------------------------------------------------------------------- + +// Forward declare ShowFontAtlas() which isn't worth putting in public API yet +namespace ImGui { IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas); } + +// Demo helper function to select among loaded fonts. +// Here we use the regular BeginCombo()/EndCombo() api which is the more flexible one. +void ImGui::ShowFontSelector(const char* label) +{ + ImGuiIO& io = ImGui::GetIO(); + ImFont* font_current = ImGui::GetFont(); + if (ImGui::BeginCombo(label, font_current->GetDebugName())) + { + for (int n = 0; n < io.Fonts->Fonts.Size; n++) + { + ImFont* font = io.Fonts->Fonts[n]; + ImGui::PushID((void*)font); + if (ImGui::Selectable(font->GetDebugName(), font == font_current)) + io.FontDefault = font; + ImGui::PopID(); + } + ImGui::EndCombo(); + } + ImGui::SameLine(); + HelpMarker( + "- Load additional fonts with io.Fonts->AddFontFromFileTTF().\n" + "- The font atlas is built when calling io.Fonts->GetTexDataAsXXXX() or io.Fonts->Build().\n" + "- Read FAQ and docs/FONTS.md for more details.\n" + "- If you need to add/remove fonts at runtime (e.g. for DPI change), do it before calling NewFrame()."); +} + +// Demo helper function to select among default colors. See ShowStyleEditor() for more advanced options. +// Here we use the simplified Combo() api that packs items into a single literal string. +// Useful for quick combo boxes where the choices are known locally. +bool ImGui::ShowStyleSelector(const char* label) +{ + static int style_idx = -1; + if (ImGui::Combo(label, &style_idx, "Dark\0Light\0Classic\0")) + { + switch (style_idx) + { + case 0: ImGui::StyleColorsDark(); break; + case 1: ImGui::StyleColorsLight(); break; + case 2: ImGui::StyleColorsClassic(); break; + } + return true; + } + return false; +} + +void ImGui::ShowStyleEditor(ImGuiStyle* ref) +{ + IMGUI_DEMO_MARKER("Tools/Style Editor"); + // You can pass in a reference ImGuiStyle structure to compare to, revert to and save to + // (without a reference style pointer, we will use one compared locally as a reference) + ImGuiStyle& style = ImGui::GetStyle(); + static ImGuiStyle ref_saved_style; + + // Default to using internal storage as reference + static bool init = true; + if (init && ref == NULL) + ref_saved_style = style; + init = false; + if (ref == NULL) + ref = &ref_saved_style; + + ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.50f); + + if (ImGui::ShowStyleSelector("Colors##Selector")) + ref_saved_style = style; + ImGui::ShowFontSelector("Fonts##Selector"); + + // Simplified Settings (expose floating-pointer border sizes as boolean representing 0.0f or 1.0f) + if (ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f")) + style.GrabRounding = style.FrameRounding; // Make GrabRounding always the same value as FrameRounding + { bool border = (style.WindowBorderSize > 0.0f); if (ImGui::Checkbox("WindowBorder", &border)) { style.WindowBorderSize = border ? 1.0f : 0.0f; } } + ImGui::SameLine(); + { bool border = (style.FrameBorderSize > 0.0f); if (ImGui::Checkbox("FrameBorder", &border)) { style.FrameBorderSize = border ? 1.0f : 0.0f; } } + ImGui::SameLine(); + { bool border = (style.PopupBorderSize > 0.0f); if (ImGui::Checkbox("PopupBorder", &border)) { style.PopupBorderSize = border ? 1.0f : 0.0f; } } + + // Save/Revert button + if (ImGui::Button("Save Ref")) + *ref = ref_saved_style = style; + ImGui::SameLine(); + if (ImGui::Button("Revert Ref")) + style = *ref; + ImGui::SameLine(); + HelpMarker( + "Save/Revert in local non-persistent storage. Default Colors definition are not affected. " + "Use \"Export\" below to save them somewhere."); + + ImGui::Separator(); + + if (ImGui::BeginTabBar("##tabs", ImGuiTabBarFlags_None)) + { + if (ImGui::BeginTabItem("Sizes")) + { + ImGui::Text("Main"); + ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("CellPadding", (float*)&style.CellPadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f"); + ImGui::SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f"); + ImGui::SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f"); + ImGui::SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f"); + ImGui::Text("Borders"); + ImGui::SliderFloat("WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::Text("Rounding"); + ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("LogSliderDeadzone", &style.LogSliderDeadzone, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f"); + ImGui::Text("Alignment"); + ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f"); + int window_menu_button_position = style.WindowMenuButtonPosition + 1; + if (ImGui::Combo("WindowMenuButtonPosition", (int*)&window_menu_button_position, "None\0Left\0Right\0")) + style.WindowMenuButtonPosition = window_menu_button_position - 1; + ImGui::Combo("ColorButtonPosition", (int*)&style.ColorButtonPosition, "Left\0Right\0"); + ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); + ImGui::SameLine(); HelpMarker("Alignment applies when a button is larger than its text content."); + ImGui::SliderFloat2("SelectableTextAlign", (float*)&style.SelectableTextAlign, 0.0f, 1.0f, "%.2f"); + ImGui::SameLine(); HelpMarker("Alignment applies when a selectable is larger than its text content."); + ImGui::Text("Safe Area Padding"); + ImGui::SameLine(); HelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured)."); + ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f"); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Colors")) + { + static int output_dest = 0; + static bool output_only_modified = true; + if (ImGui::Button("Export")) + { + if (output_dest == 0) + ImGui::LogToClipboard(); + else + ImGui::LogToTTY(); + ImGui::LogText("ImVec4* colors = ImGui::GetStyle().Colors;" IM_NEWLINE); + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + const ImVec4& col = style.Colors[i]; + const char* name = ImGui::GetStyleColorName(i); + if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0) + ImGui::LogText("colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);" IM_NEWLINE, + name, 23 - (int)strlen(name), "", col.x, col.y, col.z, col.w); + } + ImGui::LogFinish(); + } + ImGui::SameLine(); ImGui::SetNextItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0"); + ImGui::SameLine(); ImGui::Checkbox("Only Modified Colors", &output_only_modified); + + static ImGuiTextFilter filter; + filter.Draw("Filter colors", ImGui::GetFontSize() * 16); + + static ImGuiColorEditFlags alpha_flags = 0; + if (ImGui::RadioButton("Opaque", alpha_flags == ImGuiColorEditFlags_None)) { alpha_flags = ImGuiColorEditFlags_None; } ImGui::SameLine(); + if (ImGui::RadioButton("Alpha", alpha_flags == ImGuiColorEditFlags_AlphaPreview)) { alpha_flags = ImGuiColorEditFlags_AlphaPreview; } ImGui::SameLine(); + if (ImGui::RadioButton("Both", alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine(); + HelpMarker( + "In the color list:\n" + "Left-click on color square to open color picker,\n" + "Right-click to open edit options menu."); + + ImGui::BeginChild("##colors", ImVec2(0, 0), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened); + ImGui::PushItemWidth(-160); + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + const char* name = ImGui::GetStyleColorName(i); + if (!filter.PassFilter(name)) + continue; + ImGui::PushID(i); + ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags); + if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0) + { + // Tips: in a real user application, you may want to merge and use an icon font into the main font, + // so instead of "Save"/"Revert" you'd use icons! + // Read the FAQ and docs/FONTS.md about using icon fonts. It's really easy and super convenient! + ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Save")) { ref->Colors[i] = style.Colors[i]; } + ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Revert")) { style.Colors[i] = ref->Colors[i]; } + } + ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); + ImGui::TextUnformatted(name); + ImGui::PopID(); + } + ImGui::PopItemWidth(); + ImGui::EndChild(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Fonts")) + { + ImGuiIO& io = ImGui::GetIO(); + ImFontAtlas* atlas = io.Fonts; + HelpMarker("Read FAQ and docs/FONTS.md for details on font loading."); + ImGui::ShowFontAtlas(atlas); + + // Post-baking font scaling. Note that this is NOT the nice way of scaling fonts, read below. + // (we enforce hard clamping manually as by default DragFloat/SliderFloat allows CTRL+Click text to get out of bounds). + const float MIN_SCALE = 0.3f; + const float MAX_SCALE = 2.0f; + HelpMarker( + "Those are old settings provided for convenience.\n" + "However, the _correct_ way of scaling your UI is currently to reload your font at the designed size, " + "rebuild the font atlas, and call style.ScaleAllSizes() on a reference ImGuiStyle structure.\n" + "Using those settings here will give you poor quality results."); + static float window_scale = 1.0f; + ImGui::PushItemWidth(ImGui::GetFontSize() * 8); + if (ImGui::DragFloat("window scale", &window_scale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp)) // Scale only this window + ImGui::SetWindowFontScale(window_scale); + ImGui::DragFloat("global scale", &io.FontGlobalScale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp); // Scale everything + ImGui::PopItemWidth(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Rendering")) + { + ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); + ImGui::SameLine(); + HelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well."); + + ImGui::Checkbox("Anti-aliased lines use texture", &style.AntiAliasedLinesUseTex); + ImGui::SameLine(); + HelpMarker("Faster lines using texture data. Require backend to render with bilinear filtering (not point/nearest filtering)."); + + ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill); + ImGui::PushItemWidth(ImGui::GetFontSize() * 8); + ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, 10.0f, "%.2f"); + if (style.CurveTessellationTol < 0.10f) style.CurveTessellationTol = 0.10f; + + // When editing the "Circle Segment Max Error" value, draw a preview of its effect on auto-tessellated circles. + ImGui::DragFloat("Circle Tessellation Max Error", &style.CircleTessellationMaxError , 0.005f, 0.10f, 5.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp); + if (ImGui::IsItemActive()) + { + ImGui::SetNextWindowPos(ImGui::GetCursorScreenPos()); + ImGui::BeginTooltip(); + ImGui::TextUnformatted("(R = radius, N = number of segments)"); + ImGui::Spacing(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + const float min_widget_width = ImGui::CalcTextSize("N: MMM\nR: MMM").x; + for (int n = 0; n < 8; n++) + { + const float RAD_MIN = 5.0f; + const float RAD_MAX = 70.0f; + const float rad = RAD_MIN + (RAD_MAX - RAD_MIN) * (float)n / (8.0f - 1.0f); + + ImGui::BeginGroup(); + + ImGui::Text("R: %.f\nN: %d", rad, draw_list->_CalcCircleAutoSegmentCount(rad)); + + const float canvas_width = IM_MAX(min_widget_width, rad * 2.0f); + const float offset_x = floorf(canvas_width * 0.5f); + const float offset_y = floorf(RAD_MAX); + + const ImVec2 p1 = ImGui::GetCursorScreenPos(); + draw_list->AddCircle(ImVec2(p1.x + offset_x, p1.y + offset_y), rad, ImGui::GetColorU32(ImGuiCol_Text)); + ImGui::Dummy(ImVec2(canvas_width, RAD_MAX * 2)); + + /* + const ImVec2 p2 = ImGui::GetCursorScreenPos(); + draw_list->AddCircleFilled(ImVec2(p2.x + offset_x, p2.y + offset_y), rad, ImGui::GetColorU32(ImGuiCol_Text)); + ImGui::Dummy(ImVec2(canvas_width, RAD_MAX * 2)); + */ + + ImGui::EndGroup(); + ImGui::SameLine(); + } + ImGui::EndTooltip(); + } + ImGui::SameLine(); + HelpMarker("When drawing circle primitives with \"num_segments == 0\" tesselation will be calculated automatically."); + + ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero. + ImGui::DragFloat("Disabled Alpha", &style.DisabledAlpha, 0.005f, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Additional alpha multiplier for disabled items (multiply over current value of Alpha)."); + ImGui::PopItemWidth(); + + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } + + ImGui::PopItemWidth(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() +//----------------------------------------------------------------------------- +// - ShowExampleAppMainMenuBar() +// - ShowExampleMenuFile() +//----------------------------------------------------------------------------- + +// Demonstrate creating a "main" fullscreen menu bar and populating it. +// Note the difference between BeginMainMenuBar() and BeginMenuBar(): +// - BeginMenuBar() = menu-bar inside current window (which needs the ImGuiWindowFlags_MenuBar flag!) +// - BeginMainMenuBar() = helper to create menu-bar-sized window at the top of the main viewport + call BeginMenuBar() into it. +static void ShowExampleAppMainMenuBar() +{ + if (ImGui::BeginMainMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Edit")) + { + if (ImGui::MenuItem("Undo", "CTRL+Z")) {} + if (ImGui::MenuItem("Redo", "CTRL+Y", false, false)) {} // Disabled item + ImGui::Separator(); + if (ImGui::MenuItem("Cut", "CTRL+X")) {} + if (ImGui::MenuItem("Copy", "CTRL+C")) {} + if (ImGui::MenuItem("Paste", "CTRL+V")) {} + ImGui::EndMenu(); + } + ImGui::EndMainMenuBar(); + } +} + +// Note that shortcuts are currently provided for display only +// (future version will add explicit flags to BeginMenu() to request processing shortcuts) +static void ShowExampleMenuFile() +{ + IMGUI_DEMO_MARKER("Examples/Menu"); + ImGui::MenuItem("(demo menu)", NULL, false, false); + if (ImGui::MenuItem("New")) {} + if (ImGui::MenuItem("Open", "Ctrl+O")) {} + if (ImGui::BeginMenu("Open Recent")) + { + ImGui::MenuItem("fish_hat.c"); + ImGui::MenuItem("fish_hat.inl"); + ImGui::MenuItem("fish_hat.h"); + if (ImGui::BeginMenu("More..")) + { + ImGui::MenuItem("Hello"); + ImGui::MenuItem("Sailor"); + if (ImGui::BeginMenu("Recurse..")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + ImGui::EndMenu(); + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Save", "Ctrl+S")) {} + if (ImGui::MenuItem("Save As..")) {} + + ImGui::Separator(); + IMGUI_DEMO_MARKER("Examples/Menu/Options"); + if (ImGui::BeginMenu("Options")) + { + static bool enabled = true; + ImGui::MenuItem("Enabled", "", &enabled); + ImGui::BeginChild("child", ImVec2(0, 60), true); + for (int i = 0; i < 10; i++) + ImGui::Text("Scrolling Text %d", i); + ImGui::EndChild(); + static float f = 0.5f; + static int n = 0; + ImGui::SliderFloat("Value", &f, 0.0f, 1.0f); + ImGui::InputFloat("Input", &f, 0.1f); + ImGui::Combo("Combo", &n, "Yes\0No\0Maybe\0\0"); + ImGui::EndMenu(); + } + + IMGUI_DEMO_MARKER("Examples/Menu/Colors"); + if (ImGui::BeginMenu("Colors")) + { + float sz = ImGui::GetTextLineHeight(); + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + const char* name = ImGui::GetStyleColorName((ImGuiCol)i); + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + sz, p.y + sz), ImGui::GetColorU32((ImGuiCol)i)); + ImGui::Dummy(ImVec2(sz, sz)); + ImGui::SameLine(); + ImGui::MenuItem(name); + } + ImGui::EndMenu(); + } + + // Here we demonstrate appending again to the "Options" menu (which we already created above) + // Of course in this demo it is a little bit silly that this function calls BeginMenu("Options") twice. + // In a real code-base using it would make senses to use this feature from very different code locations. + if (ImGui::BeginMenu("Options")) // <-- Append! + { + IMGUI_DEMO_MARKER("Examples/Menu/Append to an existing menu"); + static bool b = true; + ImGui::Checkbox("SomeOption", &b); + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Disabled", false)) // Disabled + { + IM_ASSERT(0); + } + if (ImGui::MenuItem("Checked", NULL, true)) {} + if (ImGui::MenuItem("Quit", "Alt+F4")) {} +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Debug Console / ShowExampleAppConsole() +//----------------------------------------------------------------------------- + +// Demonstrate creating a simple console window, with scrolling, filtering, completion and history. +// For the console example, we are using a more C++ like approach of declaring a class to hold both data and functions. +struct ExampleAppConsole +{ + char InputBuf[256]; + ImVector Items; + ImVector Commands; + ImVector History; + int HistoryPos; // -1: new line, 0..History.Size-1 browsing history. + ImGuiTextFilter Filter; + bool AutoScroll; + bool ScrollToBottom; + + ExampleAppConsole() + { + IMGUI_DEMO_MARKER("Examples/Console"); + ClearLog(); + memset(InputBuf, 0, sizeof(InputBuf)); + HistoryPos = -1; + + // "CLASSIFY" is here to provide the test case where "C"+[tab] completes to "CL" and display multiple matches. + Commands.push_back("HELP"); + Commands.push_back("HISTORY"); + Commands.push_back("CLEAR"); + Commands.push_back("CLASSIFY"); + AutoScroll = true; + ScrollToBottom = false; + AddLog("Welcome to Dear ImGui!"); + } + ~ExampleAppConsole() + { + ClearLog(); + for (int i = 0; i < History.Size; i++) + free(History[i]); + } + + // Portable helpers + static int Stricmp(const char* s1, const char* s2) { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; } + static int Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; } + static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); } + static void Strtrim(char* s) { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; } + + void ClearLog() + { + for (int i = 0; i < Items.Size; i++) + free(Items[i]); + Items.clear(); + } + + void AddLog(const char* fmt, ...) IM_FMTARGS(2) + { + // FIXME-OPT + char buf[1024]; + va_list args; + va_start(args, fmt); + vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); + buf[IM_ARRAYSIZE(buf)-1] = 0; + va_end(args); + Items.push_back(Strdup(buf)); + } + + void Draw(const char* title, bool* p_open) + { + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin(title, p_open)) + { + ImGui::End(); + return; + } + + // As a specific feature guaranteed by the library, after calling Begin() the last Item represent the title bar. + // So e.g. IsItemHovered() will return true when hovering the title bar. + // Here we create a context menu only available from the title bar. + if (ImGui::BeginPopupContextItem()) + { + if (ImGui::MenuItem("Close Console")) + *p_open = false; + ImGui::EndPopup(); + } + + ImGui::TextWrapped( + "This example implements a console with basic coloring, completion (TAB key) and history (Up/Down keys). A more elaborate " + "implementation may want to store entries along with extra data such as timestamp, emitter, etc."); + ImGui::TextWrapped("Enter 'HELP' for help."); + + // TODO: display items starting from the bottom + + if (ImGui::SmallButton("Add Debug Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } + ImGui::SameLine(); + if (ImGui::SmallButton("Add Debug Error")) { AddLog("[error] something went wrong"); } + ImGui::SameLine(); + if (ImGui::SmallButton("Clear")) { ClearLog(); } + ImGui::SameLine(); + bool copy_to_clipboard = ImGui::SmallButton("Copy"); + //static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); } + + ImGui::Separator(); + + // Options menu + if (ImGui::BeginPopup("Options")) + { + ImGui::Checkbox("Auto-scroll", &AutoScroll); + ImGui::EndPopup(); + } + + // Options, Filter + if (ImGui::Button("Options")) + ImGui::OpenPopup("Options"); + ImGui::SameLine(); + Filter.Draw("Filter (\"incl,-excl\") (\"error\")", 180); + ImGui::Separator(); + + // Reserve enough left-over height for 1 separator + 1 input text + const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); + ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), false, ImGuiWindowFlags_HorizontalScrollbar); + if (ImGui::BeginPopupContextWindow()) + { + if (ImGui::Selectable("Clear")) ClearLog(); + ImGui::EndPopup(); + } + + // Display every line as a separate entry so we can change their color or add custom widgets. + // If you only want raw text you can use ImGui::TextUnformatted(log.begin(), log.end()); + // NB- if you have thousands of entries this approach may be too inefficient and may require user-side clipping + // to only process visible items. The clipper will automatically measure the height of your first item and then + // "seek" to display only items in the visible area. + // To use the clipper we can replace your standard loop: + // for (int i = 0; i < Items.Size; i++) + // With: + // ImGuiListClipper clipper; + // clipper.Begin(Items.Size); + // while (clipper.Step()) + // for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + // - That your items are evenly spaced (same height) + // - That you have cheap random access to your elements (you can access them given their index, + // without processing all the ones before) + // You cannot this code as-is if a filter is active because it breaks the 'cheap random-access' property. + // We would need random-access on the post-filtered list. + // A typical application wanting coarse clipping and filtering may want to pre-compute an array of indices + // or offsets of items that passed the filtering test, recomputing this array when user changes the filter, + // and appending newly elements as they are inserted. This is left as a task to the user until we can manage + // to improve this example code! + // If your items are of variable height: + // - Split them into same height items would be simpler and facilitate random-seeking into your list. + // - Consider using manual call to IsRectVisible() and skipping extraneous decoration from your items. + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4, 1)); // Tighten spacing + if (copy_to_clipboard) + ImGui::LogToClipboard(); + for (int i = 0; i < Items.Size; i++) + { + const char* item = Items[i]; + if (!Filter.PassFilter(item)) + continue; + + // Normally you would store more information in your item than just a string. + // (e.g. make Items[] an array of structure, store color/type etc.) + ImVec4 color; + bool has_color = false; + if (strstr(item, "[error]")) { color = ImVec4(1.0f, 0.4f, 0.4f, 1.0f); has_color = true; } + else if (strncmp(item, "# ", 2) == 0) { color = ImVec4(1.0f, 0.8f, 0.6f, 1.0f); has_color = true; } + if (has_color) + ImGui::PushStyleColor(ImGuiCol_Text, color); + ImGui::TextUnformatted(item); + if (has_color) + ImGui::PopStyleColor(); + } + if (copy_to_clipboard) + ImGui::LogFinish(); + + if (ScrollToBottom || (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())) + ImGui::SetScrollHereY(1.0f); + ScrollToBottom = false; + + ImGui::PopStyleVar(); + ImGui::EndChild(); + ImGui::Separator(); + + // Command-line + bool reclaim_focus = false; + ImGuiInputTextFlags input_text_flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory; + if (ImGui::InputText("Input", InputBuf, IM_ARRAYSIZE(InputBuf), input_text_flags, &TextEditCallbackStub, (void*)this)) + { + char* s = InputBuf; + Strtrim(s); + if (s[0]) + ExecCommand(s); + strcpy(s, ""); + reclaim_focus = true; + } + + // Auto-focus on window apparition + ImGui::SetItemDefaultFocus(); + if (reclaim_focus) + ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget + + ImGui::End(); + } + + void ExecCommand(const char* command_line) + { + AddLog("# %s\n", command_line); + + // Insert into history. First find match and delete it so it can be pushed to the back. + // This isn't trying to be smart or optimal. + HistoryPos = -1; + for (int i = History.Size - 1; i >= 0; i--) + if (Stricmp(History[i], command_line) == 0) + { + free(History[i]); + History.erase(History.begin() + i); + break; + } + History.push_back(Strdup(command_line)); + + // Process command + if (Stricmp(command_line, "CLEAR") == 0) + { + ClearLog(); + } + else if (Stricmp(command_line, "HELP") == 0) + { + AddLog("Commands:"); + for (int i = 0; i < Commands.Size; i++) + AddLog("- %s", Commands[i]); + } + else if (Stricmp(command_line, "HISTORY") == 0) + { + int first = History.Size - 10; + for (int i = first > 0 ? first : 0; i < History.Size; i++) + AddLog("%3d: %s\n", i, History[i]); + } + else + { + AddLog("Unknown command: '%s'\n", command_line); + } + + // On command input, we scroll to bottom even if AutoScroll==false + ScrollToBottom = true; + } + + // In C++11 you'd be better off using lambdas for this sort of forwarding callbacks + static int TextEditCallbackStub(ImGuiInputTextCallbackData* data) + { + ExampleAppConsole* console = (ExampleAppConsole*)data->UserData; + return console->TextEditCallback(data); + } + + int TextEditCallback(ImGuiInputTextCallbackData* data) + { + //AddLog("cursor: %d, selection: %d-%d", data->CursorPos, data->SelectionStart, data->SelectionEnd); + switch (data->EventFlag) + { + case ImGuiInputTextFlags_CallbackCompletion: + { + // Example of TEXT COMPLETION + + // Locate beginning of current word + const char* word_end = data->Buf + data->CursorPos; + const char* word_start = word_end; + while (word_start > data->Buf) + { + const char c = word_start[-1]; + if (c == ' ' || c == '\t' || c == ',' || c == ';') + break; + word_start--; + } + + // Build a list of candidates + ImVector candidates; + for (int i = 0; i < Commands.Size; i++) + if (Strnicmp(Commands[i], word_start, (int)(word_end - word_start)) == 0) + candidates.push_back(Commands[i]); + + if (candidates.Size == 0) + { + // No match + AddLog("No match for \"%.*s\"!\n", (int)(word_end - word_start), word_start); + } + else if (candidates.Size == 1) + { + // Single match. Delete the beginning of the word and replace it entirely so we've got nice casing. + data->DeleteChars((int)(word_start - data->Buf), (int)(word_end - word_start)); + data->InsertChars(data->CursorPos, candidates[0]); + data->InsertChars(data->CursorPos, " "); + } + else + { + // Multiple matches. Complete as much as we can.. + // So inputing "C"+Tab will complete to "CL" then display "CLEAR" and "CLASSIFY" as matches. + int match_len = (int)(word_end - word_start); + for (;;) + { + int c = 0; + bool all_candidates_matches = true; + for (int i = 0; i < candidates.Size && all_candidates_matches; i++) + if (i == 0) + c = toupper(candidates[i][match_len]); + else if (c == 0 || c != toupper(candidates[i][match_len])) + all_candidates_matches = false; + if (!all_candidates_matches) + break; + match_len++; + } + + if (match_len > 0) + { + data->DeleteChars((int)(word_start - data->Buf), (int)(word_end - word_start)); + data->InsertChars(data->CursorPos, candidates[0], candidates[0] + match_len); + } + + // List matches + AddLog("Possible matches:\n"); + for (int i = 0; i < candidates.Size; i++) + AddLog("- %s\n", candidates[i]); + } + + break; + } + case ImGuiInputTextFlags_CallbackHistory: + { + // Example of HISTORY + const int prev_history_pos = HistoryPos; + if (data->EventKey == ImGuiKey_UpArrow) + { + if (HistoryPos == -1) + HistoryPos = History.Size - 1; + else if (HistoryPos > 0) + HistoryPos--; + } + else if (data->EventKey == ImGuiKey_DownArrow) + { + if (HistoryPos != -1) + if (++HistoryPos >= History.Size) + HistoryPos = -1; + } + + // A better implementation would preserve the data on the current input line along with cursor position. + if (prev_history_pos != HistoryPos) + { + const char* history_str = (HistoryPos >= 0) ? History[HistoryPos] : ""; + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, history_str); + } + } + } + return 0; + } +}; + +static void ShowExampleAppConsole(bool* p_open) +{ + static ExampleAppConsole console; + console.Draw("Example: Console", p_open); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Debug Log / ShowExampleAppLog() +//----------------------------------------------------------------------------- + +// Usage: +// static ExampleAppLog my_log; +// my_log.AddLog("Hello %d world\n", 123); +// my_log.Draw("title"); +struct ExampleAppLog +{ + ImGuiTextBuffer Buf; + ImGuiTextFilter Filter; + ImVector LineOffsets; // Index to lines offset. We maintain this with AddLog() calls. + bool AutoScroll; // Keep scrolling if already at the bottom. + + ExampleAppLog() + { + AutoScroll = true; + Clear(); + } + + void Clear() + { + Buf.clear(); + LineOffsets.clear(); + LineOffsets.push_back(0); + } + + void AddLog(const char* fmt, ...) IM_FMTARGS(2) + { + int old_size = Buf.size(); + va_list args; + va_start(args, fmt); + Buf.appendfv(fmt, args); + va_end(args); + for (int new_size = Buf.size(); old_size < new_size; old_size++) + if (Buf[old_size] == '\n') + LineOffsets.push_back(old_size + 1); + } + + void Draw(const char* title, bool* p_open = NULL) + { + if (!ImGui::Begin(title, p_open)) + { + ImGui::End(); + return; + } + + // Options menu + if (ImGui::BeginPopup("Options")) + { + ImGui::Checkbox("Auto-scroll", &AutoScroll); + ImGui::EndPopup(); + } + + // Main window + if (ImGui::Button("Options")) + ImGui::OpenPopup("Options"); + ImGui::SameLine(); + bool clear = ImGui::Button("Clear"); + ImGui::SameLine(); + bool copy = ImGui::Button("Copy"); + ImGui::SameLine(); + Filter.Draw("Filter", -100.0f); + + ImGui::Separator(); + ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar); + + if (clear) + Clear(); + if (copy) + ImGui::LogToClipboard(); + + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + const char* buf = Buf.begin(); + const char* buf_end = Buf.end(); + if (Filter.IsActive()) + { + // In this example we don't use the clipper when Filter is enabled. + // This is because we don't have a random access on the result on our filter. + // A real application processing logs with ten of thousands of entries may want to store the result of + // search/filter.. especially if the filtering function is not trivial (e.g. reg-exp). + for (int line_no = 0; line_no < LineOffsets.Size; line_no++) + { + const char* line_start = buf + LineOffsets[line_no]; + const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; + if (Filter.PassFilter(line_start, line_end)) + ImGui::TextUnformatted(line_start, line_end); + } + } + else + { + // The simplest and easy way to display the entire buffer: + // ImGui::TextUnformatted(buf_begin, buf_end); + // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward + // to skip non-visible lines. Here we instead demonstrate using the clipper to only process lines that are + // within the visible area. + // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them + // on your side is recommended. Using ImGuiListClipper requires + // - A) random access into your data + // - B) items all being the same height, + // both of which we can handle since we an array pointing to the beginning of each line of text. + // When using the filter (in the block of code above) we don't have random access into the data to display + // anymore, which is why we don't use the clipper. Storing or skimming through the search result would make + // it possible (and would be recommended if you want to search through tens of thousands of entries). + ImGuiListClipper clipper; + clipper.Begin(LineOffsets.Size); + while (clipper.Step()) + { + for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++) + { + const char* line_start = buf + LineOffsets[line_no]; + const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; + ImGui::TextUnformatted(line_start, line_end); + } + } + clipper.End(); + } + ImGui::PopStyleVar(); + + if (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) + ImGui::SetScrollHereY(1.0f); + + ImGui::EndChild(); + ImGui::End(); + } +}; + +// Demonstrate creating a simple log window with basic filtering. +static void ShowExampleAppLog(bool* p_open) +{ + static ExampleAppLog log; + + // For the demo: add a debug button _BEFORE_ the normal log window contents + // We take advantage of a rarely used feature: multiple calls to Begin()/End() are appending to the _same_ window. + // Most of the contents of the window will be added by the log.Draw() call. + ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver); + ImGui::Begin("Example: Log", p_open); + IMGUI_DEMO_MARKER("Examples/Log"); + if (ImGui::SmallButton("[Debug] Add 5 entries")) + { + static int counter = 0; + const char* categories[3] = { "info", "warn", "error" }; + const char* words[] = { "Bumfuzzled", "Cattywampus", "Snickersnee", "Abibliophobia", "Absquatulate", "Nincompoop", "Pauciloquent" }; + for (int n = 0; n < 5; n++) + { + const char* category = categories[counter % IM_ARRAYSIZE(categories)]; + const char* word = words[counter % IM_ARRAYSIZE(words)]; + log.AddLog("[%05d] [%s] Hello, current time is %.1f, here's a word: '%s'\n", + ImGui::GetFrameCount(), category, ImGui::GetTime(), word); + counter++; + } + } + ImGui::End(); + + // Actually call in the regular Log helper (which will Begin() into the same window as we just did) + log.Draw("Example: Log", p_open); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() +//----------------------------------------------------------------------------- + +// Demonstrate create a window with multiple child windows. +static void ShowExampleAppLayout(bool* p_open) +{ + ImGui::SetNextWindowSize(ImVec2(500, 440), ImGuiCond_FirstUseEver); + if (ImGui::Begin("Example: Simple layout", p_open, ImGuiWindowFlags_MenuBar)) + { + IMGUI_DEMO_MARKER("Examples/Simple layout"); + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + if (ImGui::MenuItem("Close")) *p_open = false; + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + // Left + static int selected = 0; + { + ImGui::BeginChild("left pane", ImVec2(150, 0), true); + for (int i = 0; i < 100; i++) + { + // FIXME: Good candidate to use ImGuiSelectableFlags_SelectOnNav + char label[128]; + sprintf(label, "MyObject %d", i); + if (ImGui::Selectable(label, selected == i)) + selected = i; + } + ImGui::EndChild(); + } + ImGui::SameLine(); + + // Right + { + ImGui::BeginGroup(); + ImGui::BeginChild("item view", ImVec2(0, -ImGui::GetFrameHeightWithSpacing())); // Leave room for 1 line below us + ImGui::Text("MyObject: %d", selected); + ImGui::Separator(); + if (ImGui::BeginTabBar("##Tabs", ImGuiTabBarFlags_None)) + { + if (ImGui::BeginTabItem("Description")) + { + ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Details")) + { + ImGui::Text("ID: 0123456789"); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::EndChild(); + if (ImGui::Button("Revert")) {} + ImGui::SameLine(); + if (ImGui::Button("Save")) {} + ImGui::EndGroup(); + } + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() +//----------------------------------------------------------------------------- + +static void ShowPlaceholderObject(const char* prefix, int uid) +{ + // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID. + ImGui::PushID(uid); + + // Text and Tree nodes are less high than framed widgets, using AlignTextToFramePadding() we add vertical spacing to make the tree lines equal high. + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::AlignTextToFramePadding(); + bool node_open = ImGui::TreeNode("Object", "%s_%u", prefix, uid); + ImGui::TableSetColumnIndex(1); + ImGui::Text("my sailor is rich"); + + if (node_open) + { + static float placeholder_members[8] = { 0.0f, 0.0f, 1.0f, 3.1416f, 100.0f, 999.0f }; + for (int i = 0; i < 8; i++) + { + ImGui::PushID(i); // Use field index as identifier. + if (i < 2) + { + ShowPlaceholderObject("Child", 424242); + } + else + { + // Here we use a TreeNode to highlight on hover (we could use e.g. Selectable as well) + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::AlignTextToFramePadding(); + ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_Bullet; + ImGui::TreeNodeEx("Field", flags, "Field_%d", i); + + ImGui::TableSetColumnIndex(1); + ImGui::SetNextItemWidth(-FLT_MIN); + if (i >= 5) + ImGui::InputFloat("##value", &placeholder_members[i], 1.0f); + else + ImGui::DragFloat("##value", &placeholder_members[i], 0.01f); + ImGui::NextColumn(); + } + ImGui::PopID(); + } + ImGui::TreePop(); + } + ImGui::PopID(); +} + +// Demonstrate create a simple property editor. +static void ShowExampleAppPropertyEditor(bool* p_open) +{ + ImGui::SetNextWindowSize(ImVec2(430, 450), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Example: Property editor", p_open)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Examples/Property Editor"); + + HelpMarker( + "This example shows how you may implement a property editor using two columns.\n" + "All objects/fields data are dummies here.\n" + "Remember that in many simple cases, you can use ImGui::SameLine(xxx) to position\n" + "your cursor horizontally instead of using the Columns() API."); + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 2)); + if (ImGui::BeginTable("split", 2, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_Resizable)) + { + // Iterate placeholder objects (all the same data) + for (int obj_i = 0; obj_i < 4; obj_i++) + { + ShowPlaceholderObject("Object", obj_i); + //ImGui::Separator(); + } + ImGui::EndTable(); + } + ImGui::PopStyleVar(); + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Long Text / ShowExampleAppLongText() +//----------------------------------------------------------------------------- + +// Demonstrate/test rendering huge amount of text, and the incidence of clipping. +static void ShowExampleAppLongText(bool* p_open) +{ + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Example: Long text display", p_open)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Examples/Long text display"); + + static int test_type = 0; + static ImGuiTextBuffer log; + static int lines = 0; + ImGui::Text("Printing unusually long amount of text."); + ImGui::Combo("Test type", &test_type, + "Single call to TextUnformatted()\0" + "Multiple calls to Text(), clipped\0" + "Multiple calls to Text(), not clipped (slow)\0"); + ImGui::Text("Buffer contents: %d lines, %d bytes", lines, log.size()); + if (ImGui::Button("Clear")) { log.clear(); lines = 0; } + ImGui::SameLine(); + if (ImGui::Button("Add 1000 lines")) + { + for (int i = 0; i < 1000; i++) + log.appendf("%i The quick brown fox jumps over the lazy dog\n", lines + i); + lines += 1000; + } + ImGui::BeginChild("Log"); + switch (test_type) + { + case 0: + // Single call to TextUnformatted() with a big buffer + ImGui::TextUnformatted(log.begin(), log.end()); + break; + case 1: + { + // Multiple calls to Text(), manually coarsely clipped - demonstrate how to use the ImGuiListClipper helper. + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + ImGuiListClipper clipper; + clipper.Begin(lines); + while (clipper.Step()) + for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); + ImGui::PopStyleVar(); + break; + } + case 2: + // Multiple calls to Text(), not clipped (slow) + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + for (int i = 0; i < lines; i++) + ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); + ImGui::PopStyleVar(); + break; + } + ImGui::EndChild(); + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() +//----------------------------------------------------------------------------- + +// Demonstrate creating a window which gets auto-resized according to its content. +static void ShowExampleAppAutoResize(bool* p_open) +{ + if (!ImGui::Begin("Example: Auto-resizing window", p_open, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Examples/Auto-resizing window"); + + static int lines = 10; + ImGui::TextUnformatted( + "Window will resize every-frame to the size of its content.\n" + "Note that you probably don't want to query the window size to\n" + "output your content because that would create a feedback loop."); + ImGui::SliderInt("Number of lines", &lines, 1, 20); + for (int i = 0; i < lines; i++) + ImGui::Text("%*sThis is line %d", i * 4, "", i); // Pad with space to extend size horizontally + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() +//----------------------------------------------------------------------------- + +// Demonstrate creating a window with custom resize constraints. +static void ShowExampleAppConstrainedResize(bool* p_open) +{ + struct CustomConstraints + { + // Helper functions to demonstrate programmatic constraints + static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->DesiredSize.x, data->DesiredSize.y); } + static void Step(ImGuiSizeCallbackData* data) { float step = (float)(int)(intptr_t)data->UserData; data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step); } + }; + + const char* test_desc[] = + { + "Resize vertical only", + "Resize horizontal only", + "Width > 100, Height > 100", + "Width 400-500", + "Height 400-500", + "Custom: Always Square", + "Custom: Fixed Steps (100)", + }; + + static bool auto_resize = false; + static int type = 0; + static int display_lines = 10; + if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only + if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only + if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100 + if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width 400-500 + if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, 500)); // Height 400-500 + if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square + if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)(intptr_t)100); // Fixed Step + + ImGuiWindowFlags flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0; + if (ImGui::Begin("Example: Constrained Resize", p_open, flags)) + { + IMGUI_DEMO_MARKER("Examples/Constrained Resizing window"); + if (ImGui::Button("200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine(); + if (ImGui::Button("500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine(); + if (ImGui::Button("800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); } + ImGui::SetNextItemWidth(200); + ImGui::Combo("Constraint", &type, test_desc, IM_ARRAYSIZE(test_desc)); + ImGui::SetNextItemWidth(200); + ImGui::DragInt("Lines", &display_lines, 0.2f, 1, 100); + ImGui::Checkbox("Auto-resize", &auto_resize); + for (int i = 0; i < display_lines; i++) + ImGui::Text("%*sHello, sailor! Making this line long enough for the example.", i * 4, ""); + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Simple overlay / ShowExampleAppSimpleOverlay() +//----------------------------------------------------------------------------- + +// Demonstrate creating a simple static window with no decoration +// + a context-menu to choose which corner of the screen to use. +static void ShowExampleAppSimpleOverlay(bool* p_open) +{ + static int corner = 0; + ImGuiIO& io = ImGui::GetIO(); + ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav; + if (corner != -1) + { + const float PAD = 10.0f; + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + ImVec2 work_pos = viewport->WorkPos; // Use work area to avoid menu-bar/task-bar, if any! + ImVec2 work_size = viewport->WorkSize; + ImVec2 window_pos, window_pos_pivot; + window_pos.x = (corner & 1) ? (work_pos.x + work_size.x - PAD) : (work_pos.x + PAD); + window_pos.y = (corner & 2) ? (work_pos.y + work_size.y - PAD) : (work_pos.y + PAD); + window_pos_pivot.x = (corner & 1) ? 1.0f : 0.0f; + window_pos_pivot.y = (corner & 2) ? 1.0f : 0.0f; + ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); + window_flags |= ImGuiWindowFlags_NoMove; + } + ImGui::SetNextWindowBgAlpha(0.35f); // Transparent background + if (ImGui::Begin("Example: Simple overlay", p_open, window_flags)) + { + IMGUI_DEMO_MARKER("Examples/Simple Overlay"); + ImGui::Text("Simple overlay\n" "in the corner of the screen.\n" "(right-click to change position)"); + ImGui::Separator(); + if (ImGui::IsMousePosValid()) + ImGui::Text("Mouse Position: (%.1f,%.1f)", io.MousePos.x, io.MousePos.y); + else + ImGui::Text("Mouse Position: "); + if (ImGui::BeginPopupContextWindow()) + { + if (ImGui::MenuItem("Custom", NULL, corner == -1)) corner = -1; + if (ImGui::MenuItem("Top-left", NULL, corner == 0)) corner = 0; + if (ImGui::MenuItem("Top-right", NULL, corner == 1)) corner = 1; + if (ImGui::MenuItem("Bottom-left", NULL, corner == 2)) corner = 2; + if (ImGui::MenuItem("Bottom-right", NULL, corner == 3)) corner = 3; + if (p_open && ImGui::MenuItem("Close")) *p_open = false; + ImGui::EndPopup(); + } + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Fullscreen window / ShowExampleAppFullscreen() +//----------------------------------------------------------------------------- + +// Demonstrate creating a window covering the entire screen/viewport +static void ShowExampleAppFullscreen(bool* p_open) +{ + static bool use_work_area = true; + static ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings; + + // We demonstrate using the full viewport area or the work area (without menu-bars, task-bars etc.) + // Based on your use case you may want one of the other. + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(use_work_area ? viewport->WorkPos : viewport->Pos); + ImGui::SetNextWindowSize(use_work_area ? viewport->WorkSize : viewport->Size); + + if (ImGui::Begin("Example: Fullscreen window", p_open, flags)) + { + ImGui::Checkbox("Use work area instead of main area", &use_work_area); + ImGui::SameLine(); + HelpMarker("Main Area = entire viewport,\nWork Area = entire viewport minus sections used by the main menu bars, task bars etc.\n\nEnable the main-menu bar in Examples menu to see the difference."); + + ImGui::CheckboxFlags("ImGuiWindowFlags_NoBackground", &flags, ImGuiWindowFlags_NoBackground); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoDecoration", &flags, ImGuiWindowFlags_NoDecoration); + ImGui::Indent(); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoTitleBar", &flags, ImGuiWindowFlags_NoTitleBar); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoCollapse", &flags, ImGuiWindowFlags_NoCollapse); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoScrollbar", &flags, ImGuiWindowFlags_NoScrollbar); + ImGui::Unindent(); + + if (p_open && ImGui::Button("Close this window")) + *p_open = false; + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Manipulating Window Titles / ShowExampleAppWindowTitles() +//----------------------------------------------------------------------------- + +// Demonstrate using "##" and "###" in identifiers to manipulate ID generation. +// This apply to all regular items as well. +// Read FAQ section "How can I have multiple widgets with the same label?" for details. +static void ShowExampleAppWindowTitles(bool*) +{ + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + const ImVec2 base_pos = viewport->Pos; + + // By default, Windows are uniquely identified by their title. + // You can use the "##" and "###" markers to manipulate the display/ID. + + // Using "##" to display same title but have unique identifier. + ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 100), ImGuiCond_FirstUseEver); + ImGui::Begin("Same title as another window##1"); + IMGUI_DEMO_MARKER("Examples/Manipulating window titles"); + ImGui::Text("This is window 1.\nMy title is the same as window 2, but my identifier is unique."); + ImGui::End(); + + ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 200), ImGuiCond_FirstUseEver); + ImGui::Begin("Same title as another window##2"); + ImGui::Text("This is window 2.\nMy title is the same as window 1, but my identifier is unique."); + ImGui::End(); + + // Using "###" to display a changing title but keep a static identifier "AnimatedTitle" + char buf[128]; + sprintf(buf, "Animated title %c %d###AnimatedTitle", "|/-\\"[(int)(ImGui::GetTime() / 0.25f) & 3], ImGui::GetFrameCount()); + ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 300), ImGuiCond_FirstUseEver); + ImGui::Begin(buf); + ImGui::Text("This window has a changing title."); + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() +//----------------------------------------------------------------------------- + +// Demonstrate using the low-level ImDrawList to draw custom shapes. +static void ShowExampleAppCustomRendering(bool* p_open) +{ + if (!ImGui::Begin("Example: Custom rendering", p_open)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Examples/Custom Rendering"); + + // Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of + // overloaded operators, etc. Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your + // types and ImVec2/ImVec4. Dear ImGui defines overloaded operators but they are internal to imgui.cpp and not + // exposed outside (to avoid messing with your types) In this example we are not using the maths operators! + + if (ImGui::BeginTabBar("##TabBar")) + { + if (ImGui::BeginTabItem("Primitives")) + { + ImGui::PushItemWidth(-ImGui::GetFontSize() * 15); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + + // Draw gradients + // (note that those are currently exacerbating our sRGB/Linear issues) + // Calling ImGui::GetColorU32() multiplies the given colors by the current Style Alpha, but you may pass the IM_COL32() directly as well.. + ImGui::Text("Gradients"); + ImVec2 gradient_size = ImVec2(ImGui::CalcItemWidth(), ImGui::GetFrameHeight()); + { + ImVec2 p0 = ImGui::GetCursorScreenPos(); + ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y); + ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 0, 0, 255)); + ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 255, 255, 255)); + draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a); + ImGui::InvisibleButton("##gradient1", gradient_size); + } + { + ImVec2 p0 = ImGui::GetCursorScreenPos(); + ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y); + ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 255, 0, 255)); + ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 0, 0, 255)); + draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a); + ImGui::InvisibleButton("##gradient2", gradient_size); + } + + // Draw a bunch of primitives + ImGui::Text("All primitives"); + static float sz = 36.0f; + static float thickness = 3.0f; + static int ngon_sides = 6; + static bool circle_segments_override = false; + static int circle_segments_override_v = 12; + static bool curve_segments_override = false; + static int curve_segments_override_v = 8; + static ImVec4 colf = ImVec4(1.0f, 1.0f, 0.4f, 1.0f); + ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 100.0f, "%.0f"); + ImGui::DragFloat("Thickness", &thickness, 0.05f, 1.0f, 8.0f, "%.02f"); + ImGui::SliderInt("N-gon sides", &ngon_sides, 3, 12); + ImGui::Checkbox("##circlesegmentoverride", &circle_segments_override); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + circle_segments_override |= ImGui::SliderInt("Circle segments override", &circle_segments_override_v, 3, 40); + ImGui::Checkbox("##curvessegmentoverride", &curve_segments_override); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + curve_segments_override |= ImGui::SliderInt("Curves segments override", &curve_segments_override_v, 3, 40); + ImGui::ColorEdit4("Color", &colf.x); + + const ImVec2 p = ImGui::GetCursorScreenPos(); + const ImU32 col = ImColor(colf); + const float spacing = 10.0f; + const ImDrawFlags corners_tl_br = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBottomRight; + const float rounding = sz / 5.0f; + const int circle_segments = circle_segments_override ? circle_segments_override_v : 0; + const int curve_segments = curve_segments_override ? curve_segments_override_v : 0; + float x = p.x + 4.0f; + float y = p.y + 4.0f; + for (int n = 0; n < 2; n++) + { + // First line uses a thickness of 1.0f, second line uses the configurable thickness + float th = (n == 0) ? 1.0f : thickness; + draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing; // N-gon + draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing; // Circle + draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, ImDrawFlags_None, th); x += sz + spacing; // Square + draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, ImDrawFlags_None, th); x += sz + spacing; // Square with all rounded corners + draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners + draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th);x += sz + spacing; // Triangle + //draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th);x+= sz*0.4f + spacing; // Thin triangle + draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!) + draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!) + draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line + + // Quadratic Bezier Curve (3 control points) + ImVec2 cp3[3] = { ImVec2(x, y + sz * 0.6f), ImVec2(x + sz * 0.5f, y - sz * 0.4f), ImVec2(x + sz, y + sz) }; + draw_list->AddBezierQuadratic(cp3[0], cp3[1], cp3[2], col, th, curve_segments); x += sz + spacing; + + // Cubic Bezier Curve (4 control points) + ImVec2 cp4[4] = { ImVec2(x, y), ImVec2(x + sz * 1.3f, y + sz * 0.3f), ImVec2(x + sz - sz * 1.3f, y + sz - sz * 0.3f), ImVec2(x + sz, y + sz) }; + draw_list->AddBezierCubic(cp4[0], cp4[1], cp4[2], cp4[3], col, th, curve_segments); + + x = p.x + 4; + y += sz + spacing; + } + draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz*0.5f, col, ngon_sides); x += sz + spacing; // N-gon + draw_list->AddCircleFilled(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments); x += sz + spacing; // Circle + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners + draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle + //draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness) + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing * 2.0f;// Vertical line (faster than AddLine, but only handle integer thickness) + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine) + draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255)); + + ImGui::Dummy(ImVec2((sz + spacing) * 10.2f, (sz + spacing) * 3.0f)); + ImGui::PopItemWidth(); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Canvas")) + { + static ImVector points; + static ImVec2 scrolling(0.0f, 0.0f); + static bool opt_enable_grid = true; + static bool opt_enable_context_menu = true; + static bool adding_line = false; + + ImGui::Checkbox("Enable grid", &opt_enable_grid); + ImGui::Checkbox("Enable context menu", &opt_enable_context_menu); + ImGui::Text("Mouse Left: drag to add lines,\nMouse Right: drag to scroll, click for context menu."); + + // Typically you would use a BeginChild()/EndChild() pair to benefit from a clipping region + own scrolling. + // Here we demonstrate that this can be replaced by simple offsetting + custom drawing + PushClipRect/PopClipRect() calls. + // To use a child window instead we could use, e.g: + // ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Disable padding + // ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(50, 50, 50, 255)); // Set a background color + // ImGui::BeginChild("canvas", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_NoMove); + // ImGui::PopStyleColor(); + // ImGui::PopStyleVar(); + // [...] + // ImGui::EndChild(); + + // Using InvisibleButton() as a convenience 1) it will advance the layout cursor and 2) allows us to use IsItemHovered()/IsItemActive() + ImVec2 canvas_p0 = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates! + ImVec2 canvas_sz = ImGui::GetContentRegionAvail(); // Resize canvas to what's available + if (canvas_sz.x < 50.0f) canvas_sz.x = 50.0f; + if (canvas_sz.y < 50.0f) canvas_sz.y = 50.0f; + ImVec2 canvas_p1 = ImVec2(canvas_p0.x + canvas_sz.x, canvas_p0.y + canvas_sz.y); + + // Draw border and background color + ImGuiIO& io = ImGui::GetIO(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + draw_list->AddRectFilled(canvas_p0, canvas_p1, IM_COL32(50, 50, 50, 255)); + draw_list->AddRect(canvas_p0, canvas_p1, IM_COL32(255, 255, 255, 255)); + + // This will catch our interactions + ImGui::InvisibleButton("canvas", canvas_sz, ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); + const bool is_hovered = ImGui::IsItemHovered(); // Hovered + const bool is_active = ImGui::IsItemActive(); // Held + const ImVec2 origin(canvas_p0.x + scrolling.x, canvas_p0.y + scrolling.y); // Lock scrolled origin + const ImVec2 mouse_pos_in_canvas(io.MousePos.x - origin.x, io.MousePos.y - origin.y); + + // Add first and second point + if (is_hovered && !adding_line && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) + { + points.push_back(mouse_pos_in_canvas); + points.push_back(mouse_pos_in_canvas); + adding_line = true; + } + if (adding_line) + { + points.back() = mouse_pos_in_canvas; + if (!ImGui::IsMouseDown(ImGuiMouseButton_Left)) + adding_line = false; + } + + // Pan (we use a zero mouse threshold when there's no context menu) + // You may decide to make that threshold dynamic based on whether the mouse is hovering something etc. + const float mouse_threshold_for_pan = opt_enable_context_menu ? -1.0f : 0.0f; + if (is_active && ImGui::IsMouseDragging(ImGuiMouseButton_Right, mouse_threshold_for_pan)) + { + scrolling.x += io.MouseDelta.x; + scrolling.y += io.MouseDelta.y; + } + + // Context menu (under default mouse threshold) + ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right); + if (opt_enable_context_menu && drag_delta.x == 0.0f && drag_delta.y == 0.0f) + ImGui::OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + if (ImGui::BeginPopup("context")) + { + if (adding_line) + points.resize(points.size() - 2); + adding_line = false; + if (ImGui::MenuItem("Remove one", NULL, false, points.Size > 0)) { points.resize(points.size() - 2); } + if (ImGui::MenuItem("Remove all", NULL, false, points.Size > 0)) { points.clear(); } + ImGui::EndPopup(); + } + + // Draw grid + all lines in the canvas + draw_list->PushClipRect(canvas_p0, canvas_p1, true); + if (opt_enable_grid) + { + const float GRID_STEP = 64.0f; + for (float x = fmodf(scrolling.x, GRID_STEP); x < canvas_sz.x; x += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x + x, canvas_p0.y), ImVec2(canvas_p0.x + x, canvas_p1.y), IM_COL32(200, 200, 200, 40)); + for (float y = fmodf(scrolling.y, GRID_STEP); y < canvas_sz.y; y += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x, canvas_p0.y + y), ImVec2(canvas_p1.x, canvas_p0.y + y), IM_COL32(200, 200, 200, 40)); + } + for (int n = 0; n < points.Size; n += 2) + draw_list->AddLine(ImVec2(origin.x + points[n].x, origin.y + points[n].y), ImVec2(origin.x + points[n + 1].x, origin.y + points[n + 1].y), IM_COL32(255, 255, 0, 255), 2.0f); + draw_list->PopClipRect(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("BG/FG draw lists")) + { + static bool draw_bg = true; + static bool draw_fg = true; + ImGui::Checkbox("Draw in Background draw list", &draw_bg); + ImGui::SameLine(); HelpMarker("The Background draw list will be rendered below every Dear ImGui windows."); + ImGui::Checkbox("Draw in Foreground draw list", &draw_fg); + ImGui::SameLine(); HelpMarker("The Foreground draw list will be rendered over every Dear ImGui windows."); + ImVec2 window_pos = ImGui::GetWindowPos(); + ImVec2 window_size = ImGui::GetWindowSize(); + ImVec2 window_center = ImVec2(window_pos.x + window_size.x * 0.5f, window_pos.y + window_size.y * 0.5f); + if (draw_bg) + ImGui::GetBackgroundDrawList()->AddCircle(window_center, window_size.x * 0.6f, IM_COL32(255, 0, 0, 200), 0, 10 + 4); + if (draw_fg) + ImGui::GetForegroundDrawList()->AddCircle(window_center, window_size.y * 0.6f, IM_COL32(0, 255, 0, 200), 0, 10); + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } + + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() +//----------------------------------------------------------------------------- + +// Simplified structure to mimic a Document model +struct MyDocument +{ + const char* Name; // Document title + bool Open; // Set when open (we keep an array of all available documents to simplify demo code!) + bool OpenPrev; // Copy of Open from last update. + bool Dirty; // Set when the document has been modified + bool WantClose; // Set when the document + ImVec4 Color; // An arbitrary variable associated to the document + + MyDocument(const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f)) + { + Name = name; + Open = OpenPrev = open; + Dirty = false; + WantClose = false; + Color = color; + } + void DoOpen() { Open = true; } + void DoQueueClose() { WantClose = true; } + void DoForceClose() { Open = false; Dirty = false; } + void DoSave() { Dirty = false; } + + // Display placeholder contents for the Document + static void DisplayContents(MyDocument* doc) + { + ImGui::PushID(doc); + ImGui::Text("Document \"%s\"", doc->Name); + ImGui::PushStyleColor(ImGuiCol_Text, doc->Color); + ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."); + ImGui::PopStyleColor(); + if (ImGui::Button("Modify", ImVec2(100, 0))) + doc->Dirty = true; + ImGui::SameLine(); + if (ImGui::Button("Save", ImVec2(100, 0))) + doc->DoSave(); + ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior. + ImGui::PopID(); + } + + // Display context menu for the Document + static void DisplayContextMenu(MyDocument* doc) + { + if (!ImGui::BeginPopupContextItem()) + return; + + char buf[256]; + sprintf(buf, "Save %s", doc->Name); + if (ImGui::MenuItem(buf, "CTRL+S", false, doc->Open)) + doc->DoSave(); + if (ImGui::MenuItem("Close", "CTRL+W", false, doc->Open)) + doc->DoQueueClose(); + ImGui::EndPopup(); + } +}; + +struct ExampleAppDocuments +{ + ImVector Documents; + + ExampleAppDocuments() + { + Documents.push_back(MyDocument("Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f))); + Documents.push_back(MyDocument("Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f))); + Documents.push_back(MyDocument("Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f))); + Documents.push_back(MyDocument("Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f))); + Documents.push_back(MyDocument("A Rather Long Title", false)); + Documents.push_back(MyDocument("Some Document", false)); + } +}; + +// [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface. +// If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo, +// as opposed to clicking on the regular tab closing button) and stops being submitted, it will take a frame for +// the tab bar to notice its absence. During this frame there will be a gap in the tab bar, and if the tab that has +// disappeared was the selected one, the tab bar will report no selected tab during the frame. This will effectively +// give the impression of a flicker for one frame. +// We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch. +// Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag. +static void NotifyOfDocumentsClosedElsewhere(ExampleAppDocuments& app) +{ + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (!doc->Open && doc->OpenPrev) + ImGui::SetTabItemClosed(doc->Name); + doc->OpenPrev = doc->Open; + } +} + +void ShowExampleAppDocuments(bool* p_open) +{ + static ExampleAppDocuments app; + + // Options + static bool opt_reorderable = true; + static ImGuiTabBarFlags opt_fitting_flags = ImGuiTabBarFlags_FittingPolicyDefault_; + + bool window_contents_visible = ImGui::Begin("Example: Documents", p_open, ImGuiWindowFlags_MenuBar); + if (!window_contents_visible) + { + ImGui::End(); + return; + } + + // Menu + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + int open_count = 0; + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + open_count += app.Documents[doc_n].Open ? 1 : 0; + + if (ImGui::BeginMenu("Open", open_count < app.Documents.Size)) + { + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (!doc->Open) + if (ImGui::MenuItem(doc->Name)) + doc->DoOpen(); + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0)) + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + app.Documents[doc_n].DoQueueClose(); + if (ImGui::MenuItem("Exit", "Alt+F4")) {} + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + // [Debug] List documents with one checkbox for each + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (doc_n > 0) + ImGui::SameLine(); + ImGui::PushID(doc); + if (ImGui::Checkbox(doc->Name, &doc->Open)) + if (!doc->Open) + doc->DoForceClose(); + ImGui::PopID(); + } + + ImGui::Separator(); + + // About the ImGuiWindowFlags_UnsavedDocument / ImGuiTabItemFlags_UnsavedDocument flags. + // They have multiple effects: + // - Display a dot next to the title. + // - Tab is selected when clicking the X close button. + // - Closure is not assumed (will wait for user to stop submitting the tab). + // Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + // We need to assume closure by default otherwise waiting for "lack of submission" on the next frame would leave an empty + // hole for one-frame, both in the tab-bar and in tab-contents when closing a tab/window. + // The rarely used SetTabItemClosed() function is a way to notify of programmatic closure to avoid the one-frame hole. + + // Submit Tab Bar and Tabs + { + ImGuiTabBarFlags tab_bar_flags = (opt_fitting_flags) | (opt_reorderable ? ImGuiTabBarFlags_Reorderable : 0); + if (ImGui::BeginTabBar("##tabs", tab_bar_flags)) + { + if (opt_reorderable) + NotifyOfDocumentsClosedElsewhere(app); + + // [DEBUG] Stress tests + //if ((ImGui::GetFrameCount() % 30) == 0) docs[1].Open ^= 1; // [DEBUG] Automatically show/hide a tab. Test various interactions e.g. dragging with this on. + //if (ImGui::GetIO().KeyCtrl) ImGui::SetTabItemSelected(docs[1].Name); // [DEBUG] Test SetTabItemSelected(), probably not very useful as-is anyway.. + + // Submit Tabs + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (!doc->Open) + continue; + + ImGuiTabItemFlags tab_flags = (doc->Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0); + bool visible = ImGui::BeginTabItem(doc->Name, &doc->Open, tab_flags); + + // Cancel attempt to close when unsaved add to save queue so we can display a popup. + if (!doc->Open && doc->Dirty) + { + doc->Open = true; + doc->DoQueueClose(); + } + + MyDocument::DisplayContextMenu(doc); + if (visible) + { + MyDocument::DisplayContents(doc); + ImGui::EndTabItem(); + } + } + + ImGui::EndTabBar(); + } + } + + // Update closing queue + static ImVector close_queue; + if (close_queue.empty()) + { + // Close queue is locked once we started a popup + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (doc->WantClose) + { + doc->WantClose = false; + close_queue.push_back(doc); + } + } + } + + // Display closing confirmation UI + if (!close_queue.empty()) + { + int close_queue_unsaved_documents = 0; + for (int n = 0; n < close_queue.Size; n++) + if (close_queue[n]->Dirty) + close_queue_unsaved_documents++; + + if (close_queue_unsaved_documents == 0) + { + // Close documents when all are unsaved + for (int n = 0; n < close_queue.Size; n++) + close_queue[n]->DoForceClose(); + close_queue.clear(); + } + else + { + if (!ImGui::IsPopupOpen("Save?")) + ImGui::OpenPopup("Save?"); + if (ImGui::BeginPopupModal("Save?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::Text("Save change to the following items?"); + float item_height = ImGui::GetTextLineHeightWithSpacing(); + if (ImGui::BeginChildFrame(ImGui::GetID("frame"), ImVec2(-FLT_MIN, 6.25f * item_height))) + { + for (int n = 0; n < close_queue.Size; n++) + if (close_queue[n]->Dirty) + ImGui::Text("%s", close_queue[n]->Name); + ImGui::EndChildFrame(); + } + + ImVec2 button_size(ImGui::GetFontSize() * 7.0f, 0.0f); + if (ImGui::Button("Yes", button_size)) + { + for (int n = 0; n < close_queue.Size; n++) + { + if (close_queue[n]->Dirty) + close_queue[n]->DoSave(); + close_queue[n]->DoForceClose(); + } + close_queue.clear(); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("No", button_size)) + { + for (int n = 0; n < close_queue.Size; n++) + close_queue[n]->DoForceClose(); + close_queue.clear(); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("Cancel", button_size)) + { + close_queue.clear(); + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + } + } + + ImGui::End(); +} + +// End of Demo code +#else + +void ImGui::ShowAboutWindow(bool*) {} +void ImGui::ShowDemoWindow(bool*) {} +void ImGui::ShowUserGuide() {} +void ImGui::ShowStyleEditor(ImGuiStyle*) {} + +#endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/3rdparty/imgui/src/imgui_draw.cpp b/3rdparty/imgui/src/imgui_draw.cpp new file mode 100644 index 0000000000..0823b01e0e --- /dev/null +++ b/3rdparty/imgui/src/imgui_draw.cpp @@ -0,0 +1,4162 @@ +// dear imgui, v1.88 WIP +// (drawing and font code) + +/* + +Index of this file: + +// [SECTION] STB libraries implementation +// [SECTION] Style functions +// [SECTION] ImDrawList +// [SECTION] ImDrawListSplitter +// [SECTION] ImDrawData +// [SECTION] Helpers ShadeVertsXXX functions +// [SECTION] ImFontConfig +// [SECTION] ImFontAtlas +// [SECTION] ImFontAtlas glyph ranges helpers +// [SECTION] ImFontGlyphRangesBuilder +// [SECTION] ImFont +// [SECTION] ImGui Internal Render Helpers +// [SECTION] Decompression code +// [SECTION] Default font data (ProggyClean.ttf) + +*/ + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif + +#include "imgui_internal.h" +#ifdef IMGUI_ENABLE_FREETYPE +#include "misc/freetype/imgui_freetype.h" +#endif + +#include // vsnprintf, sscanf, printf +#if !defined(alloca) +#if defined(__GLIBC__) || defined(__sun) || defined(__APPLE__) || defined(__NEWLIB__) +#include // alloca (glibc uses . Note that Cygwin may have _WIN32 defined, so the order matters here) +#elif defined(_WIN32) +#include // alloca +#if !defined(alloca) +#define alloca _alloca // for clang with MS Codegen +#endif +#else +#include // alloca +#endif +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff) +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#pragma warning (disable: 6255) // [Static Analyzer] _alloca indicates failure by raising a stack overflow exception. Consider using _malloca instead. +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer) +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#if __has_warning("-Walloca") +#pragma clang diagnostic ignored "-Walloca" // warning: use of function '__builtin_alloca' is discouraged +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok. +#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wcomma" // warning: possible misuse of comma operator here +#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used +#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function +#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value +#pragma GCC diagnostic ignored "-Wstack-protector" // warning: stack protector not protecting local variables: variable length buffer +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +//------------------------------------------------------------------------- +// [SECTION] STB libraries implementation (for stb_truetype and stb_rect_pack) +//------------------------------------------------------------------------- + +// Compile time options: +//#define IMGUI_STB_NAMESPACE ImStb +//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" +//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" +//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION +//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION + +#ifdef IMGUI_STB_NAMESPACE +namespace IMGUI_STB_NAMESPACE +{ +#endif + +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable: 4456) // declaration of 'xx' hides previous local declaration +#pragma warning (disable: 6011) // (stb_rectpack) Dereferencing NULL pointer 'cur->next'. +#pragma warning (disable: 6385) // (stb_truetype) Reading invalid data from 'buffer': the readable size is '_Old_3`kernel_width' bytes, but '3' bytes may be read. +#pragma warning (disable: 28182) // (stb_rectpack) Dereferencing NULL pointer. 'cur' contains the same NULL value as 'cur->next' did. +#endif + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wimplicit-fallthrough" +#pragma clang diagnostic ignored "-Wcast-qual" // warning: cast from 'const xxxx *' to 'xxx *' drops const qualifier +#endif + +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type [-Wtype-limits] +#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers +#endif + +#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) +#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in another compilation unit +#define STBRP_STATIC +#define STBRP_ASSERT(x) do { IM_ASSERT(x); } while (0) +#define STBRP_SORT ImQsort +#define STB_RECT_PACK_IMPLEMENTATION +#endif +#ifdef IMGUI_STB_RECT_PACK_FILENAME +#include IMGUI_STB_RECT_PACK_FILENAME +#else +#include "imstb_rectpack.h" +#endif +#endif + +#ifdef IMGUI_ENABLE_STB_TRUETYPE +#ifndef STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) +#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in another compilation unit +#define STBTT_malloc(x,u) ((void)(u), IM_ALLOC(x)) +#define STBTT_free(x,u) ((void)(u), IM_FREE(x)) +#define STBTT_assert(x) do { IM_ASSERT(x); } while(0) +#define STBTT_fmod(x,y) ImFmod(x,y) +#define STBTT_sqrt(x) ImSqrt(x) +#define STBTT_pow(x,y) ImPow(x,y) +#define STBTT_fabs(x) ImFabs(x) +#define STBTT_ifloor(x) ((int)ImFloorSigned(x)) +#define STBTT_iceil(x) ((int)ImCeil(x)) +#define STBTT_STATIC +#define STB_TRUETYPE_IMPLEMENTATION +#else +#define STBTT_DEF extern +#endif +#ifdef IMGUI_STB_TRUETYPE_FILENAME +#include IMGUI_STB_TRUETYPE_FILENAME +#else +#include "imstb_truetype.h" +#endif +#endif +#endif // IMGUI_ENABLE_STB_TRUETYPE + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif + +#ifdef IMGUI_STB_NAMESPACE +} // namespace ImStb +using namespace IMGUI_STB_NAMESPACE; +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Style functions +//----------------------------------------------------------------------------- + +void ImGui::StyleColorsDark(ImGuiStyle* dst) +{ + ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); + ImVec4* colors = style->Colors; + + colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); + colors[ImGuiCol_WindowBg] = ImVec4(0.06f, 0.06f, 0.06f, 0.94f); + colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f); + colors[ImGuiCol_Border] = ImVec4(0.43f, 0.43f, 0.50f, 0.50f); + colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_FrameBg] = ImVec4(0.16f, 0.29f, 0.48f, 0.54f); + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); + colors[ImGuiCol_TitleBg] = ImVec4(0.04f, 0.04f, 0.04f, 1.00f); + colors[ImGuiCol_TitleBgActive] = ImVec4(0.16f, 0.29f, 0.48f, 1.00f); + colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 0.51f); + colors[ImGuiCol_MenuBarBg] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.02f, 0.02f, 0.02f, 0.53f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.31f, 0.31f, 0.31f, 1.00f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.51f, 0.51f, 0.51f, 1.00f); + colors[ImGuiCol_CheckMark] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_SliderGrab] = ImVec4(0.24f, 0.52f, 0.88f, 1.00f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_Button] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_ButtonActive] = ImVec4(0.06f, 0.53f, 0.98f, 1.00f); + colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f); + colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f); + colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_Separator] = colors[ImGuiCol_Border]; + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.10f, 0.40f, 0.75f, 0.78f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.10f, 0.40f, 0.75f, 1.00f); + colors[ImGuiCol_ResizeGrip] = ImVec4(0.26f, 0.59f, 0.98f, 0.20f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); + colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f); + colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f); + colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); + colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); + colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); + colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.19f, 0.19f, 0.20f, 1.00f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.35f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableBorderLight] = ImVec4(0.23f, 0.23f, 0.25f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); + colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); + colors[ImGuiCol_NavHighlight] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); + colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); + colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.35f); +} + +void ImGui::StyleColorsClassic(ImGuiStyle* dst) +{ + ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); + ImVec4* colors = style->Colors; + + colors[ImGuiCol_Text] = ImVec4(0.90f, 0.90f, 0.90f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); + colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.85f); + colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_PopupBg] = ImVec4(0.11f, 0.11f, 0.14f, 0.92f); + colors[ImGuiCol_Border] = ImVec4(0.50f, 0.50f, 0.50f, 0.50f); + colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_FrameBg] = ImVec4(0.43f, 0.43f, 0.43f, 0.39f); + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.47f, 0.47f, 0.69f, 0.40f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.42f, 0.41f, 0.64f, 0.69f); + colors[ImGuiCol_TitleBg] = ImVec4(0.27f, 0.27f, 0.54f, 0.83f); + colors[ImGuiCol_TitleBgActive] = ImVec4(0.32f, 0.32f, 0.63f, 0.87f); + colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.40f, 0.40f, 0.80f, 0.20f); + colors[ImGuiCol_MenuBarBg] = ImVec4(0.40f, 0.40f, 0.55f, 0.80f); + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.20f, 0.25f, 0.30f, 0.60f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.40f, 0.40f, 0.80f, 0.30f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.40f, 0.40f, 0.80f, 0.40f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.41f, 0.39f, 0.80f, 0.60f); + colors[ImGuiCol_CheckMark] = ImVec4(0.90f, 0.90f, 0.90f, 0.50f); + colors[ImGuiCol_SliderGrab] = ImVec4(1.00f, 1.00f, 1.00f, 0.30f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.41f, 0.39f, 0.80f, 0.60f); + colors[ImGuiCol_Button] = ImVec4(0.35f, 0.40f, 0.61f, 0.62f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.40f, 0.48f, 0.71f, 0.79f); + colors[ImGuiCol_ButtonActive] = ImVec4(0.46f, 0.54f, 0.80f, 1.00f); + colors[ImGuiCol_Header] = ImVec4(0.40f, 0.40f, 0.90f, 0.45f); + colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.90f, 0.80f); + colors[ImGuiCol_HeaderActive] = ImVec4(0.53f, 0.53f, 0.87f, 0.80f); + colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 0.60f); + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.60f, 0.60f, 0.70f, 1.00f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.70f, 0.70f, 0.90f, 1.00f); + colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.10f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.78f, 0.82f, 1.00f, 0.60f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.78f, 0.82f, 1.00f, 0.90f); + colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f); + colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f); + colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); + colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); + colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.27f, 0.27f, 0.38f, 1.00f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.45f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableBorderLight] = ImVec4(0.26f, 0.26f, 0.28f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.07f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 0.00f, 1.00f, 0.35f); + colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); + colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); + colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); + colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); +} + +// Those light colors are better suited with a thicker font than the default one + FrameBorder +void ImGui::StyleColorsLight(ImGuiStyle* dst) +{ + ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); + ImVec4* colors = style->Colors; + + colors[ImGuiCol_Text] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); + colors[ImGuiCol_WindowBg] = ImVec4(0.94f, 0.94f, 0.94f, 1.00f); + colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_PopupBg] = ImVec4(1.00f, 1.00f, 1.00f, 0.98f); + colors[ImGuiCol_Border] = ImVec4(0.00f, 0.00f, 0.00f, 0.30f); + colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_FrameBg] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); + colors[ImGuiCol_TitleBg] = ImVec4(0.96f, 0.96f, 0.96f, 1.00f); + colors[ImGuiCol_TitleBgActive] = ImVec4(0.82f, 0.82f, 0.82f, 1.00f); + colors[ImGuiCol_TitleBgCollapsed] = ImVec4(1.00f, 1.00f, 1.00f, 0.51f); + colors[ImGuiCol_MenuBarBg] = ImVec4(0.86f, 0.86f, 0.86f, 1.00f); + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.98f, 0.98f, 0.98f, 0.53f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.69f, 0.69f, 0.69f, 0.80f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.49f, 0.49f, 0.49f, 0.80f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.49f, 0.49f, 0.49f, 1.00f); + colors[ImGuiCol_CheckMark] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_SliderGrab] = ImVec4(0.26f, 0.59f, 0.98f, 0.78f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.46f, 0.54f, 0.80f, 0.60f); + colors[ImGuiCol_Button] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_ButtonActive] = ImVec4(0.06f, 0.53f, 0.98f, 1.00f); + colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f); + colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f); + colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 0.62f); + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.14f, 0.44f, 0.80f, 0.78f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.14f, 0.44f, 0.80f, 1.00f); + colors[ImGuiCol_ResizeGrip] = ImVec4(0.35f, 0.35f, 0.35f, 0.17f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); + colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.90f); + colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f); + colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); + colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); + colors[ImGuiCol_PlotLines] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); + colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.45f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.78f, 0.87f, 0.98f, 1.00f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.57f, 0.57f, 0.64f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableBorderLight] = ImVec4(0.68f, 0.68f, 0.74f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(0.30f, 0.30f, 0.30f, 0.09f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); + colors[ImGuiCol_DragDropTarget] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); + colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(0.70f, 0.70f, 0.70f, 0.70f); + colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.20f); + colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); +} + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawList +//----------------------------------------------------------------------------- + +ImDrawListSharedData::ImDrawListSharedData() +{ + memset(this, 0, sizeof(*this)); + for (int i = 0; i < IM_ARRAYSIZE(ArcFastVtx); i++) + { + const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(ArcFastVtx); + ArcFastVtx[i] = ImVec2(ImCos(a), ImSin(a)); + } + ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError); +} + +void ImDrawListSharedData::SetCircleTessellationMaxError(float max_error) +{ + if (CircleSegmentMaxError == max_error) + return; + + IM_ASSERT(max_error > 0.0f); + CircleSegmentMaxError = max_error; + for (int i = 0; i < IM_ARRAYSIZE(CircleSegmentCounts); i++) + { + const float radius = (float)i; + CircleSegmentCounts[i] = (ImU8)((i > 0) ? IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, CircleSegmentMaxError) : IM_DRAWLIST_ARCFAST_SAMPLE_MAX); + } + ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError); +} + +// Initialize before use in a new frame. We always have a command ready in the buffer. +void ImDrawList::_ResetForNewFrame() +{ + // Verify that the ImDrawCmd fields we want to memcmp() are contiguous in memory. + IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, ClipRect) == 0); + IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, TextureId) == sizeof(ImVec4)); + IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID)); + + CmdBuffer.resize(0); + IdxBuffer.resize(0); + VtxBuffer.resize(0); + Flags = _Data->InitialFlags; + memset(&_CmdHeader, 0, sizeof(_CmdHeader)); + _VtxCurrentIdx = 0; + _VtxWritePtr = NULL; + _IdxWritePtr = NULL; + _ClipRectStack.resize(0); + _TextureIdStack.resize(0); + _Path.resize(0); + _Splitter.Clear(); + CmdBuffer.push_back(ImDrawCmd()); + _FringeScale = 1.0f; +} + +void ImDrawList::_ClearFreeMemory() +{ + CmdBuffer.clear(); + IdxBuffer.clear(); + VtxBuffer.clear(); + Flags = ImDrawListFlags_None; + _VtxCurrentIdx = 0; + _VtxWritePtr = NULL; + _IdxWritePtr = NULL; + _ClipRectStack.clear(); + _TextureIdStack.clear(); + _Path.clear(); + _Splitter.ClearFreeMemory(); +} + +ImDrawList* ImDrawList::CloneOutput() const +{ + ImDrawList* dst = IM_NEW(ImDrawList(_Data)); + dst->CmdBuffer = CmdBuffer; + dst->IdxBuffer = IdxBuffer; + dst->VtxBuffer = VtxBuffer; + dst->Flags = Flags; + return dst; +} + +void ImDrawList::AddDrawCmd() +{ + ImDrawCmd draw_cmd; + draw_cmd.ClipRect = _CmdHeader.ClipRect; // Same as calling ImDrawCmd_HeaderCopy() + draw_cmd.TextureId = _CmdHeader.TextureId; + draw_cmd.VtxOffset = _CmdHeader.VtxOffset; + draw_cmd.IdxOffset = IdxBuffer.Size; + + IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w); + CmdBuffer.push_back(draw_cmd); +} + +// Pop trailing draw command (used before merging or presenting to user) +// Note that this leaves the ImDrawList in a state unfit for further commands, as most code assume that CmdBuffer.Size > 0 && CmdBuffer.back().UserCallback == NULL +void ImDrawList::_PopUnusedDrawCmd() +{ + if (CmdBuffer.Size == 0) + return; + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount == 0 && curr_cmd->UserCallback == NULL) + CmdBuffer.pop_back(); +} + +void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data) +{ + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + IM_ASSERT(curr_cmd->UserCallback == NULL); + if (curr_cmd->ElemCount != 0) + { + AddDrawCmd(); + curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + } + curr_cmd->UserCallback = callback; + curr_cmd->UserCallbackData = callback_data; + + AddDrawCmd(); // Force a new command after us (see comment below) +} + +// Compare ClipRect, TextureId and VtxOffset with a single memcmp() +#define ImDrawCmd_HeaderSize (IM_OFFSETOF(ImDrawCmd, VtxOffset) + sizeof(unsigned int)) +#define ImDrawCmd_HeaderCompare(CMD_LHS, CMD_RHS) (memcmp(CMD_LHS, CMD_RHS, ImDrawCmd_HeaderSize)) // Compare ClipRect, TextureId, VtxOffset +#define ImDrawCmd_HeaderCopy(CMD_DST, CMD_SRC) (memcpy(CMD_DST, CMD_SRC, ImDrawCmd_HeaderSize)) // Copy ClipRect, TextureId, VtxOffset +#define ImDrawCmd_AreSequentialIdxOffset(CMD_0, CMD_1) (CMD_0->IdxOffset + CMD_0->ElemCount == CMD_1->IdxOffset) + +// Try to merge two last draw commands +void ImDrawList::_TryMergeDrawCmds() +{ + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + ImDrawCmd* prev_cmd = curr_cmd - 1; + if (ImDrawCmd_HeaderCompare(curr_cmd, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && curr_cmd->UserCallback == NULL && prev_cmd->UserCallback == NULL) + { + prev_cmd->ElemCount += curr_cmd->ElemCount; + CmdBuffer.pop_back(); + } +} + +// Our scheme may appears a bit unusual, basically we want the most-common calls AddLine AddRect etc. to not have to perform any check so we always have a command ready in the stack. +// The cost of figuring out if a new command has to be added or if we can merge is paid in those Update** functions only. +void ImDrawList::_OnChangedClipRect() +{ + // If current command is used with different settings we need to add a new command + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount != 0 && memcmp(&curr_cmd->ClipRect, &_CmdHeader.ClipRect, sizeof(ImVec4)) != 0) + { + AddDrawCmd(); + return; + } + IM_ASSERT(curr_cmd->UserCallback == NULL); + + // Try to merge with previous command if it matches, else use current command + ImDrawCmd* prev_cmd = curr_cmd - 1; + if (curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && prev_cmd->UserCallback == NULL) + { + CmdBuffer.pop_back(); + return; + } + + curr_cmd->ClipRect = _CmdHeader.ClipRect; +} + +void ImDrawList::_OnChangedTextureID() +{ + // If current command is used with different settings we need to add a new command + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount != 0 && curr_cmd->TextureId != _CmdHeader.TextureId) + { + AddDrawCmd(); + return; + } + IM_ASSERT(curr_cmd->UserCallback == NULL); + + // Try to merge with previous command if it matches, else use current command + ImDrawCmd* prev_cmd = curr_cmd - 1; + if (curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && prev_cmd->UserCallback == NULL) + { + CmdBuffer.pop_back(); + return; + } + + curr_cmd->TextureId = _CmdHeader.TextureId; +} + +void ImDrawList::_OnChangedVtxOffset() +{ + // We don't need to compare curr_cmd->VtxOffset != _CmdHeader.VtxOffset because we know it'll be different at the time we call this. + _VtxCurrentIdx = 0; + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + //IM_ASSERT(curr_cmd->VtxOffset != _CmdHeader.VtxOffset); // See #3349 + if (curr_cmd->ElemCount != 0) + { + AddDrawCmd(); + return; + } + IM_ASSERT(curr_cmd->UserCallback == NULL); + curr_cmd->VtxOffset = _CmdHeader.VtxOffset; +} + +int ImDrawList::_CalcCircleAutoSegmentCount(float radius) const +{ + // Automatic segment count + const int radius_idx = (int)(radius + 0.999999f); // ceil to never reduce accuracy + if (radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts)) + return _Data->CircleSegmentCounts[radius_idx]; // Use cached value + else + return IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, _Data->CircleSegmentMaxError); +} + +// Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) +void ImDrawList::PushClipRect(const ImVec2& cr_min, const ImVec2& cr_max, bool intersect_with_current_clip_rect) +{ + ImVec4 cr(cr_min.x, cr_min.y, cr_max.x, cr_max.y); + if (intersect_with_current_clip_rect) + { + ImVec4 current = _CmdHeader.ClipRect; + if (cr.x < current.x) cr.x = current.x; + if (cr.y < current.y) cr.y = current.y; + if (cr.z > current.z) cr.z = current.z; + if (cr.w > current.w) cr.w = current.w; + } + cr.z = ImMax(cr.x, cr.z); + cr.w = ImMax(cr.y, cr.w); + + _ClipRectStack.push_back(cr); + _CmdHeader.ClipRect = cr; + _OnChangedClipRect(); +} + +void ImDrawList::PushClipRectFullScreen() +{ + PushClipRect(ImVec2(_Data->ClipRectFullscreen.x, _Data->ClipRectFullscreen.y), ImVec2(_Data->ClipRectFullscreen.z, _Data->ClipRectFullscreen.w)); +} + +void ImDrawList::PopClipRect() +{ + _ClipRectStack.pop_back(); + _CmdHeader.ClipRect = (_ClipRectStack.Size == 0) ? _Data->ClipRectFullscreen : _ClipRectStack.Data[_ClipRectStack.Size - 1]; + _OnChangedClipRect(); +} + +void ImDrawList::PushTextureID(ImTextureID texture_id) +{ + _TextureIdStack.push_back(texture_id); + _CmdHeader.TextureId = texture_id; + _OnChangedTextureID(); +} + +void ImDrawList::PopTextureID() +{ + _TextureIdStack.pop_back(); + _CmdHeader.TextureId = (_TextureIdStack.Size == 0) ? (ImTextureID)NULL : _TextureIdStack.Data[_TextureIdStack.Size - 1]; + _OnChangedTextureID(); +} + +// Reserve space for a number of vertices and indices. +// You must finish filling your reserved data before calling PrimReserve() again, as it may reallocate or +// submit the intermediate results. PrimUnreserve() can be used to release unused allocations. +void ImDrawList::PrimReserve(int idx_count, int vtx_count) +{ + // Large mesh support (when enabled) + IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); + if (sizeof(ImDrawIdx) == 2 && (_VtxCurrentIdx + vtx_count >= (1 << 16)) && (Flags & ImDrawListFlags_AllowVtxOffset)) + { + // FIXME: In theory we should be testing that vtx_count <64k here. + // In practice, RenderText() relies on reserving ahead for a worst case scenario so it is currently useful for us + // to not make that check until we rework the text functions to handle clipping and large horizontal lines better. + _CmdHeader.VtxOffset = VtxBuffer.Size; + _OnChangedVtxOffset(); + } + + ImDrawCmd* draw_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + draw_cmd->ElemCount += idx_count; + + int vtx_buffer_old_size = VtxBuffer.Size; + VtxBuffer.resize(vtx_buffer_old_size + vtx_count); + _VtxWritePtr = VtxBuffer.Data + vtx_buffer_old_size; + + int idx_buffer_old_size = IdxBuffer.Size; + IdxBuffer.resize(idx_buffer_old_size + idx_count); + _IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size; +} + +// Release the a number of reserved vertices/indices from the end of the last reservation made with PrimReserve(). +void ImDrawList::PrimUnreserve(int idx_count, int vtx_count) +{ + IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); + + ImDrawCmd* draw_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + draw_cmd->ElemCount -= idx_count; + VtxBuffer.shrink(VtxBuffer.Size - vtx_count); + IdxBuffer.shrink(IdxBuffer.Size - idx_count); +} + +// Fully unrolled with inline call to keep our debug builds decently fast. +void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col) +{ + ImVec2 b(c.x, a.y), d(a.x, c.y), uv(_Data->TexUvWhitePixel); + ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; + _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); + _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); + _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; + _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col; + _VtxWritePtr += 4; + _VtxCurrentIdx += 4; + _IdxWritePtr += 6; +} + +void ImDrawList::PrimRectUV(const ImVec2& a, const ImVec2& c, const ImVec2& uv_a, const ImVec2& uv_c, ImU32 col) +{ + ImVec2 b(c.x, a.y), d(a.x, c.y), uv_b(uv_c.x, uv_a.y), uv_d(uv_a.x, uv_c.y); + ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; + _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); + _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); + _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col; + _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col; + _VtxWritePtr += 4; + _VtxCurrentIdx += 4; + _IdxWritePtr += 6; +} + +void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col) +{ + ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; + _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); + _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); + _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col; + _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col; + _VtxWritePtr += 4; + _VtxCurrentIdx += 4; + _IdxWritePtr += 6; +} + +// On AddPolyline() and AddConvexPolyFilled() we intentionally avoid using ImVec2 and superfluous function calls to optimize debug/non-inlined builds. +// - Those macros expects l-values and need to be used as their own statement. +// - Those macros are intentionally not surrounded by the 'do {} while (0)' idiom because even that translates to runtime with debug compilers. +#define IM_NORMALIZE2F_OVER_ZERO(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 > 0.0f) { float inv_len = ImRsqrt(d2); VX *= inv_len; VY *= inv_len; } } (void)0 +#define IM_FIXNORMAL2F_MAX_INVLEN2 100.0f // 500.0f (see #4053, #3366) +#define IM_FIXNORMAL2F(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 > 0.000001f) { float inv_len2 = 1.0f / d2; if (inv_len2 > IM_FIXNORMAL2F_MAX_INVLEN2) inv_len2 = IM_FIXNORMAL2F_MAX_INVLEN2; VX *= inv_len2; VY *= inv_len2; } } (void)0 + +// TODO: Thickness anti-aliased lines cap are missing their AA fringe. +// We avoid using the ImVec2 math operators here to reduce cost to a minimum for debug/non-inlined builds. +void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 col, ImDrawFlags flags, float thickness) +{ + if (points_count < 2) + return; + + const bool closed = (flags & ImDrawFlags_Closed) != 0; + const ImVec2 opaque_uv = _Data->TexUvWhitePixel; + const int count = closed ? points_count : points_count - 1; // The number of line segments we need to draw + const bool thick_line = (thickness > _FringeScale); + + if (Flags & ImDrawListFlags_AntiAliasedLines) + { + // Anti-aliased stroke + const float AA_SIZE = _FringeScale; + const ImU32 col_trans = col & ~IM_COL32_A_MASK; + + // Thicknesses <1.0 should behave like thickness 1.0 + thickness = ImMax(thickness, 1.0f); + const int integer_thickness = (int)thickness; + const float fractional_thickness = thickness - integer_thickness; + + // Do we want to draw this line using a texture? + // - For now, only draw integer-width lines using textures to avoid issues with the way scaling occurs, could be improved. + // - If AA_SIZE is not 1.0f we cannot use the texture path. + const bool use_texture = (Flags & ImDrawListFlags_AntiAliasedLinesUseTex) && (integer_thickness < IM_DRAWLIST_TEX_LINES_WIDTH_MAX) && (fractional_thickness <= 0.00001f) && (AA_SIZE == 1.0f); + + // We should never hit this, because NewFrame() doesn't set ImDrawListFlags_AntiAliasedLinesUseTex unless ImFontAtlasFlags_NoBakedLines is off + IM_ASSERT_PARANOID(!use_texture || !(_Data->Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)); + + const int idx_count = use_texture ? (count * 6) : (thick_line ? count * 18 : count * 12); + const int vtx_count = use_texture ? (points_count * 2) : (thick_line ? points_count * 4 : points_count * 3); + PrimReserve(idx_count, vtx_count); + + // Temporary buffer + // The first items are normals at each line point, then after that there are either 2 or 4 temp points for each line point + ImVec2* temp_normals = (ImVec2*)alloca(points_count * ((use_texture || !thick_line) ? 3 : 5) * sizeof(ImVec2)); //-V630 + ImVec2* temp_points = temp_normals + points_count; + + // Calculate normals (tangents) for each line segment + for (int i1 = 0; i1 < count; i1++) + { + const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; + float dx = points[i2].x - points[i1].x; + float dy = points[i2].y - points[i1].y; + IM_NORMALIZE2F_OVER_ZERO(dx, dy); + temp_normals[i1].x = dy; + temp_normals[i1].y = -dx; + } + if (!closed) + temp_normals[points_count - 1] = temp_normals[points_count - 2]; + + // If we are drawing a one-pixel-wide line without a texture, or a textured line of any width, we only need 2 or 3 vertices per point + if (use_texture || !thick_line) + { + // [PATH 1] Texture-based lines (thick or non-thick) + // [PATH 2] Non texture-based lines (non-thick) + + // The width of the geometry we need to draw - this is essentially pixels for the line itself, plus "one pixel" for AA. + // - In the texture-based path, we don't use AA_SIZE here because the +1 is tied to the generated texture + // (see ImFontAtlasBuildRenderLinesTexData() function), and so alternate values won't work without changes to that code. + // - In the non texture-based paths, we would allow AA_SIZE to potentially be != 1.0f with a patch (e.g. fringe_scale patch to + // allow scaling geometry while preserving one-screen-pixel AA fringe). + const float half_draw_size = use_texture ? ((thickness * 0.5f) + 1) : AA_SIZE; + + // If line is not closed, the first and last points need to be generated differently as there are no normals to blend + if (!closed) + { + temp_points[0] = points[0] + temp_normals[0] * half_draw_size; + temp_points[1] = points[0] - temp_normals[0] * half_draw_size; + temp_points[(points_count-1)*2+0] = points[points_count-1] + temp_normals[points_count-1] * half_draw_size; + temp_points[(points_count-1)*2+1] = points[points_count-1] - temp_normals[points_count-1] * half_draw_size; + } + + // Generate the indices to form a number of triangles for each line segment, and the vertices for the line edges + // This takes points n and n+1 and writes into n+1, with the first point in a closed line being generated from the final one (as n+1 wraps) + // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. + unsigned int idx1 = _VtxCurrentIdx; // Vertex index for start of line segment + for (int i1 = 0; i1 < count; i1++) // i1 is the first point of the line segment + { + const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; // i2 is the second point of the line segment + const unsigned int idx2 = ((i1 + 1) == points_count) ? _VtxCurrentIdx : (idx1 + (use_texture ? 2 : 3)); // Vertex index for end of segment + + // Average normals + float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f; + float dm_y = (temp_normals[i1].y + temp_normals[i2].y) * 0.5f; + IM_FIXNORMAL2F(dm_x, dm_y); + dm_x *= half_draw_size; // dm_x, dm_y are offset to the outer edge of the AA area + dm_y *= half_draw_size; + + // Add temporary vertexes for the outer edges + ImVec2* out_vtx = &temp_points[i2 * 2]; + out_vtx[0].x = points[i2].x + dm_x; + out_vtx[0].y = points[i2].y + dm_y; + out_vtx[1].x = points[i2].x - dm_x; + out_vtx[1].y = points[i2].y - dm_y; + + if (use_texture) + { + // Add indices for two triangles + _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 1); // Right tri + _IdxWritePtr[3] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[4] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 0); // Left tri + _IdxWritePtr += 6; + } + else + { + // Add indexes for four triangles + _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 2); // Right tri 1 + _IdxWritePtr[3] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[4] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 0); // Right tri 2 + _IdxWritePtr[6] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[7] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[8] = (ImDrawIdx)(idx1 + 0); // Left tri 1 + _IdxWritePtr[9] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[10] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[11] = (ImDrawIdx)(idx2 + 1); // Left tri 2 + _IdxWritePtr += 12; + } + + idx1 = idx2; + } + + // Add vertexes for each point on the line + if (use_texture) + { + // If we're using textures we only need to emit the left/right edge vertices + ImVec4 tex_uvs = _Data->TexUvLines[integer_thickness]; + /*if (fractional_thickness != 0.0f) // Currently always zero when use_texture==false! + { + const ImVec4 tex_uvs_1 = _Data->TexUvLines[integer_thickness + 1]; + tex_uvs.x = tex_uvs.x + (tex_uvs_1.x - tex_uvs.x) * fractional_thickness; // inlined ImLerp() + tex_uvs.y = tex_uvs.y + (tex_uvs_1.y - tex_uvs.y) * fractional_thickness; + tex_uvs.z = tex_uvs.z + (tex_uvs_1.z - tex_uvs.z) * fractional_thickness; + tex_uvs.w = tex_uvs.w + (tex_uvs_1.w - tex_uvs.w) * fractional_thickness; + }*/ + ImVec2 tex_uv0(tex_uvs.x, tex_uvs.y); + ImVec2 tex_uv1(tex_uvs.z, tex_uvs.w); + for (int i = 0; i < points_count; i++) + { + _VtxWritePtr[0].pos = temp_points[i * 2 + 0]; _VtxWritePtr[0].uv = tex_uv0; _VtxWritePtr[0].col = col; // Left-side outer edge + _VtxWritePtr[1].pos = temp_points[i * 2 + 1]; _VtxWritePtr[1].uv = tex_uv1; _VtxWritePtr[1].col = col; // Right-side outer edge + _VtxWritePtr += 2; + } + } + else + { + // If we're not using a texture, we need the center vertex as well + for (int i = 0; i < points_count; i++) + { + _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col; // Center of line + _VtxWritePtr[1].pos = temp_points[i * 2 + 0]; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col_trans; // Left-side outer edge + _VtxWritePtr[2].pos = temp_points[i * 2 + 1]; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col_trans; // Right-side outer edge + _VtxWritePtr += 3; + } + } + } + else + { + // [PATH 2] Non texture-based lines (thick): we need to draw the solid line core and thus require four vertices per point + const float half_inner_thickness = (thickness - AA_SIZE) * 0.5f; + + // If line is not closed, the first and last points need to be generated differently as there are no normals to blend + if (!closed) + { + const int points_last = points_count - 1; + temp_points[0] = points[0] + temp_normals[0] * (half_inner_thickness + AA_SIZE); + temp_points[1] = points[0] + temp_normals[0] * (half_inner_thickness); + temp_points[2] = points[0] - temp_normals[0] * (half_inner_thickness); + temp_points[3] = points[0] - temp_normals[0] * (half_inner_thickness + AA_SIZE); + temp_points[points_last * 4 + 0] = points[points_last] + temp_normals[points_last] * (half_inner_thickness + AA_SIZE); + temp_points[points_last * 4 + 1] = points[points_last] + temp_normals[points_last] * (half_inner_thickness); + temp_points[points_last * 4 + 2] = points[points_last] - temp_normals[points_last] * (half_inner_thickness); + temp_points[points_last * 4 + 3] = points[points_last] - temp_normals[points_last] * (half_inner_thickness + AA_SIZE); + } + + // Generate the indices to form a number of triangles for each line segment, and the vertices for the line edges + // This takes points n and n+1 and writes into n+1, with the first point in a closed line being generated from the final one (as n+1 wraps) + // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. + unsigned int idx1 = _VtxCurrentIdx; // Vertex index for start of line segment + for (int i1 = 0; i1 < count; i1++) // i1 is the first point of the line segment + { + const int i2 = (i1 + 1) == points_count ? 0 : (i1 + 1); // i2 is the second point of the line segment + const unsigned int idx2 = (i1 + 1) == points_count ? _VtxCurrentIdx : (idx1 + 4); // Vertex index for end of segment + + // Average normals + float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f; + float dm_y = (temp_normals[i1].y + temp_normals[i2].y) * 0.5f; + IM_FIXNORMAL2F(dm_x, dm_y); + float dm_out_x = dm_x * (half_inner_thickness + AA_SIZE); + float dm_out_y = dm_y * (half_inner_thickness + AA_SIZE); + float dm_in_x = dm_x * half_inner_thickness; + float dm_in_y = dm_y * half_inner_thickness; + + // Add temporary vertices + ImVec2* out_vtx = &temp_points[i2 * 4]; + out_vtx[0].x = points[i2].x + dm_out_x; + out_vtx[0].y = points[i2].y + dm_out_y; + out_vtx[1].x = points[i2].x + dm_in_x; + out_vtx[1].y = points[i2].y + dm_in_y; + out_vtx[2].x = points[i2].x - dm_in_x; + out_vtx[2].y = points[i2].y - dm_in_y; + out_vtx[3].x = points[i2].x - dm_out_x; + out_vtx[3].y = points[i2].y - dm_out_y; + + // Add indexes + _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 2); + _IdxWritePtr[3] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[4] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 1); + _IdxWritePtr[6] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[7] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[8] = (ImDrawIdx)(idx1 + 0); + _IdxWritePtr[9] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[10] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[11] = (ImDrawIdx)(idx2 + 1); + _IdxWritePtr[12] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[13] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[14] = (ImDrawIdx)(idx1 + 3); + _IdxWritePtr[15] = (ImDrawIdx)(idx1 + 3); _IdxWritePtr[16] = (ImDrawIdx)(idx2 + 3); _IdxWritePtr[17] = (ImDrawIdx)(idx2 + 2); + _IdxWritePtr += 18; + + idx1 = idx2; + } + + // Add vertices + for (int i = 0; i < points_count; i++) + { + _VtxWritePtr[0].pos = temp_points[i * 4 + 0]; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col_trans; + _VtxWritePtr[1].pos = temp_points[i * 4 + 1]; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos = temp_points[i * 4 + 2]; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos = temp_points[i * 4 + 3]; _VtxWritePtr[3].uv = opaque_uv; _VtxWritePtr[3].col = col_trans; + _VtxWritePtr += 4; + } + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } + else + { + // [PATH 4] Non texture-based, Non anti-aliased lines + const int idx_count = count * 6; + const int vtx_count = count * 4; // FIXME-OPT: Not sharing edges + PrimReserve(idx_count, vtx_count); + + for (int i1 = 0; i1 < count; i1++) + { + const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; + const ImVec2& p1 = points[i1]; + const ImVec2& p2 = points[i2]; + + float dx = p2.x - p1.x; + float dy = p2.y - p1.y; + IM_NORMALIZE2F_OVER_ZERO(dx, dy); + dx *= (thickness * 0.5f); + dy *= (thickness * 0.5f); + + _VtxWritePtr[0].pos.x = p1.x + dy; _VtxWritePtr[0].pos.y = p1.y - dx; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col; + _VtxWritePtr[1].pos.x = p2.x + dy; _VtxWritePtr[1].pos.y = p2.y - dx; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos.x = p2.x - dy; _VtxWritePtr[2].pos.y = p2.y + dx; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos.x = p1.x - dy; _VtxWritePtr[3].pos.y = p1.y + dx; _VtxWritePtr[3].uv = opaque_uv; _VtxWritePtr[3].col = col; + _VtxWritePtr += 4; + + _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + 1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + 2); + _IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx + 2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx + 3); + _IdxWritePtr += 6; + _VtxCurrentIdx += 4; + } + } +} + +// - We intentionally avoid using ImVec2 and its math operators here to reduce cost to a minimum for debug/non-inlined builds. +// - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. +void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_count, ImU32 col) +{ + if (points_count < 3) + return; + + const ImVec2 uv = _Data->TexUvWhitePixel; + + if (Flags & ImDrawListFlags_AntiAliasedFill) + { + // Anti-aliased Fill + const float AA_SIZE = _FringeScale; + const ImU32 col_trans = col & ~IM_COL32_A_MASK; + const int idx_count = (points_count - 2)*3 + points_count * 6; + const int vtx_count = (points_count * 2); + PrimReserve(idx_count, vtx_count); + + // Add indexes for fill + unsigned int vtx_inner_idx = _VtxCurrentIdx; + unsigned int vtx_outer_idx = _VtxCurrentIdx + 1; + for (int i = 2; i < points_count; i++) + { + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + ((i - 1) << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx + (i << 1)); + _IdxWritePtr += 3; + } + + // Compute normals + ImVec2* temp_normals = (ImVec2*)alloca(points_count * sizeof(ImVec2)); //-V630 + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) + { + const ImVec2& p0 = points[i0]; + const ImVec2& p1 = points[i1]; + float dx = p1.x - p0.x; + float dy = p1.y - p0.y; + IM_NORMALIZE2F_OVER_ZERO(dx, dy); + temp_normals[i0].x = dy; + temp_normals[i0].y = -dx; + } + + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) + { + // Average normals + const ImVec2& n0 = temp_normals[i0]; + const ImVec2& n1 = temp_normals[i1]; + float dm_x = (n0.x + n1.x) * 0.5f; + float dm_y = (n0.y + n1.y) * 0.5f; + IM_FIXNORMAL2F(dm_x, dm_y); + dm_x *= AA_SIZE * 0.5f; + dm_y *= AA_SIZE * 0.5f; + + // Add vertices + _VtxWritePtr[0].pos.x = (points[i1].x - dm_x); _VtxWritePtr[0].pos.y = (points[i1].y - dm_y); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner + _VtxWritePtr[1].pos.x = (points[i1].x + dm_x); _VtxWritePtr[1].pos.y = (points[i1].y + dm_y); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer + _VtxWritePtr += 2; + + // Add indexes for fringes + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (i0 << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); + _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx + (i1 << 1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); + _IdxWritePtr += 6; + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } + else + { + // Non Anti-aliased Fill + const int idx_count = (points_count - 2)*3; + const int vtx_count = points_count; + PrimReserve(idx_count, vtx_count); + for (int i = 0; i < vtx_count; i++) + { + _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; + _VtxWritePtr++; + } + for (int i = 2; i < points_count; i++) + { + _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + i - 1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + i); + _IdxWritePtr += 3; + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } +} + +void ImDrawList::_PathArcToFastEx(const ImVec2& center, float radius, int a_min_sample, int a_max_sample, int a_step) +{ + if (radius < 0.5f) + { + _Path.push_back(center); + return; + } + + // Calculate arc auto segment step size + if (a_step <= 0) + a_step = IM_DRAWLIST_ARCFAST_SAMPLE_MAX / _CalcCircleAutoSegmentCount(radius); + + // Make sure we never do steps larger than one quarter of the circle + a_step = ImClamp(a_step, 1, IM_DRAWLIST_ARCFAST_TABLE_SIZE / 4); + + const int sample_range = ImAbs(a_max_sample - a_min_sample); + const int a_next_step = a_step; + + int samples = sample_range + 1; + bool extra_max_sample = false; + if (a_step > 1) + { + samples = sample_range / a_step + 1; + const int overstep = sample_range % a_step; + + if (overstep > 0) + { + extra_max_sample = true; + samples++; + + // When we have overstep to avoid awkwardly looking one long line and one tiny one at the end, + // distribute first step range evenly between them by reducing first step size. + if (sample_range > 0) + a_step -= (a_step - overstep) / 2; + } + } + + _Path.resize(_Path.Size + samples); + ImVec2* out_ptr = _Path.Data + (_Path.Size - samples); + + int sample_index = a_min_sample; + if (sample_index < 0 || sample_index >= IM_DRAWLIST_ARCFAST_SAMPLE_MAX) + { + sample_index = sample_index % IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + if (sample_index < 0) + sample_index += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + } + + if (a_max_sample >= a_min_sample) + { + for (int a = a_min_sample; a <= a_max_sample; a += a_step, sample_index += a_step, a_step = a_next_step) + { + // a_step is clamped to IM_DRAWLIST_ARCFAST_SAMPLE_MAX, so we have guaranteed that it will not wrap over range twice or more + if (sample_index >= IM_DRAWLIST_ARCFAST_SAMPLE_MAX) + sample_index -= IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + + const ImVec2 s = _Data->ArcFastVtx[sample_index]; + out_ptr->x = center.x + s.x * radius; + out_ptr->y = center.y + s.y * radius; + out_ptr++; + } + } + else + { + for (int a = a_min_sample; a >= a_max_sample; a -= a_step, sample_index -= a_step, a_step = a_next_step) + { + // a_step is clamped to IM_DRAWLIST_ARCFAST_SAMPLE_MAX, so we have guaranteed that it will not wrap over range twice or more + if (sample_index < 0) + sample_index += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + + const ImVec2 s = _Data->ArcFastVtx[sample_index]; + out_ptr->x = center.x + s.x * radius; + out_ptr->y = center.y + s.y * radius; + out_ptr++; + } + } + + if (extra_max_sample) + { + int normalized_max_sample = a_max_sample % IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + if (normalized_max_sample < 0) + normalized_max_sample += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + + const ImVec2 s = _Data->ArcFastVtx[normalized_max_sample]; + out_ptr->x = center.x + s.x * radius; + out_ptr->y = center.y + s.y * radius; + out_ptr++; + } + + IM_ASSERT_PARANOID(_Path.Data + _Path.Size == out_ptr); +} + +void ImDrawList::_PathArcToN(const ImVec2& center, float radius, float a_min, float a_max, int num_segments) +{ + if (radius < 0.5f) + { + _Path.push_back(center); + return; + } + + // Note that we are adding a point at both a_min and a_max. + // If you are trying to draw a full closed circle you don't want the overlapping points! + _Path.reserve(_Path.Size + (num_segments + 1)); + for (int i = 0; i <= num_segments; i++) + { + const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min); + _Path.push_back(ImVec2(center.x + ImCos(a) * radius, center.y + ImSin(a) * radius)); + } +} + +// 0: East, 3: South, 6: West, 9: North, 12: East +void ImDrawList::PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12) +{ + if (radius < 0.5f) + { + _Path.push_back(center); + return; + } + _PathArcToFastEx(center, radius, a_min_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12, a_max_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12, 0); +} + +void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments) +{ + if (radius < 0.5f) + { + _Path.push_back(center); + return; + } + + if (num_segments > 0) + { + _PathArcToN(center, radius, a_min, a_max, num_segments); + return; + } + + // Automatic segment count + if (radius <= _Data->ArcFastRadiusCutoff) + { + const bool a_is_reverse = a_max < a_min; + + // We are going to use precomputed values for mid samples. + // Determine first and last sample in lookup table that belong to the arc. + const float a_min_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_min / (IM_PI * 2.0f); + const float a_max_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_max / (IM_PI * 2.0f); + + const int a_min_sample = a_is_reverse ? (int)ImFloorSigned(a_min_sample_f) : (int)ImCeil(a_min_sample_f); + const int a_max_sample = a_is_reverse ? (int)ImCeil(a_max_sample_f) : (int)ImFloorSigned(a_max_sample_f); + const int a_mid_samples = a_is_reverse ? ImMax(a_min_sample - a_max_sample, 0) : ImMax(a_max_sample - a_min_sample, 0); + + const float a_min_segment_angle = a_min_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + const float a_max_segment_angle = a_max_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + const bool a_emit_start = ImAbs(a_min_segment_angle - a_min) >= 1e-5f; + const bool a_emit_end = ImAbs(a_max - a_max_segment_angle) >= 1e-5f; + + _Path.reserve(_Path.Size + (a_mid_samples + 1 + (a_emit_start ? 1 : 0) + (a_emit_end ? 1 : 0))); + if (a_emit_start) + _Path.push_back(ImVec2(center.x + ImCos(a_min) * radius, center.y + ImSin(a_min) * radius)); + if (a_mid_samples > 0) + _PathArcToFastEx(center, radius, a_min_sample, a_max_sample, 0); + if (a_emit_end) + _Path.push_back(ImVec2(center.x + ImCos(a_max) * radius, center.y + ImSin(a_max) * radius)); + } + else + { + const float arc_length = ImAbs(a_max - a_min); + const int circle_segment_count = _CalcCircleAutoSegmentCount(radius); + const int arc_segment_count = ImMax((int)ImCeil(circle_segment_count * arc_length / (IM_PI * 2.0f)), (int)(2.0f * IM_PI / arc_length)); + _PathArcToN(center, radius, a_min, a_max, arc_segment_count); + } +} + +ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t) +{ + float u = 1.0f - t; + float w1 = u * u * u; + float w2 = 3 * u * u * t; + float w3 = 3 * u * t * t; + float w4 = t * t * t; + return ImVec2(w1 * p1.x + w2 * p2.x + w3 * p3.x + w4 * p4.x, w1 * p1.y + w2 * p2.y + w3 * p3.y + w4 * p4.y); +} + +ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t) +{ + float u = 1.0f - t; + float w1 = u * u; + float w2 = 2 * u * t; + float w3 = t * t; + return ImVec2(w1 * p1.x + w2 * p2.x + w3 * p3.x, w1 * p1.y + w2 * p2.y + w3 * p3.y); +} + +// Closely mimics ImBezierCubicClosestPointCasteljau() in imgui.cpp +static void PathBezierCubicCurveToCasteljau(ImVector* path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) +{ + float dx = x4 - x1; + float dy = y4 - y1; + float d2 = (x2 - x4) * dy - (y2 - y4) * dx; + float d3 = (x3 - x4) * dy - (y3 - y4) * dx; + d2 = (d2 >= 0) ? d2 : -d2; + d3 = (d3 >= 0) ? d3 : -d3; + if ((d2 + d3) * (d2 + d3) < tess_tol * (dx * dx + dy * dy)) + { + path->push_back(ImVec2(x4, y4)); + } + else if (level < 10) + { + float x12 = (x1 + x2) * 0.5f, y12 = (y1 + y2) * 0.5f; + float x23 = (x2 + x3) * 0.5f, y23 = (y2 + y3) * 0.5f; + float x34 = (x3 + x4) * 0.5f, y34 = (y3 + y4) * 0.5f; + float x123 = (x12 + x23) * 0.5f, y123 = (y12 + y23) * 0.5f; + float x234 = (x23 + x34) * 0.5f, y234 = (y23 + y34) * 0.5f; + float x1234 = (x123 + x234) * 0.5f, y1234 = (y123 + y234) * 0.5f; + PathBezierCubicCurveToCasteljau(path, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1); + PathBezierCubicCurveToCasteljau(path, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1); + } +} + +static void PathBezierQuadraticCurveToCasteljau(ImVector* path, float x1, float y1, float x2, float y2, float x3, float y3, float tess_tol, int level) +{ + float dx = x3 - x1, dy = y3 - y1; + float det = (x2 - x3) * dy - (y2 - y3) * dx; + if (det * det * 4.0f < tess_tol * (dx * dx + dy * dy)) + { + path->push_back(ImVec2(x3, y3)); + } + else if (level < 10) + { + float x12 = (x1 + x2) * 0.5f, y12 = (y1 + y2) * 0.5f; + float x23 = (x2 + x3) * 0.5f, y23 = (y2 + y3) * 0.5f; + float x123 = (x12 + x23) * 0.5f, y123 = (y12 + y23) * 0.5f; + PathBezierQuadraticCurveToCasteljau(path, x1, y1, x12, y12, x123, y123, tess_tol, level + 1); + PathBezierQuadraticCurveToCasteljau(path, x123, y123, x23, y23, x3, y3, tess_tol, level + 1); + } +} + +void ImDrawList::PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments) +{ + ImVec2 p1 = _Path.back(); + if (num_segments == 0) + { + PathBezierCubicCurveToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, _Data->CurveTessellationTol, 0); // Auto-tessellated + } + else + { + float t_step = 1.0f / (float)num_segments; + for (int i_step = 1; i_step <= num_segments; i_step++) + _Path.push_back(ImBezierCubicCalc(p1, p2, p3, p4, t_step * i_step)); + } +} + +void ImDrawList::PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments) +{ + ImVec2 p1 = _Path.back(); + if (num_segments == 0) + { + PathBezierQuadraticCurveToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, _Data->CurveTessellationTol, 0);// Auto-tessellated + } + else + { + float t_step = 1.0f / (float)num_segments; + for (int i_step = 1; i_step <= num_segments; i_step++) + _Path.push_back(ImBezierQuadraticCalc(p1, p2, p3, t_step * i_step)); + } +} + +IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4)); +static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags) +{ +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + // Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All) + // ~0 --> ImDrawFlags_RoundCornersAll or 0 + if (flags == ~0) + return ImDrawFlags_RoundCornersAll; + + // Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations) + // 0x01 --> ImDrawFlags_RoundCornersTopLeft (VALUE 0x01 OVERLAPS ImDrawFlags_Closed but ImDrawFlags_Closed is never valid in this path!) + // 0x02 --> ImDrawFlags_RoundCornersTopRight + // 0x03 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight + // 0x04 --> ImDrawFlags_RoundCornersBotLeft + // 0x05 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBotLeft + // ... + // 0x0F --> ImDrawFlags_RoundCornersAll or 0 + // (See all values in ImDrawCornerFlags_) + if (flags >= 0x01 && flags <= 0x0F) + return (flags << 4); + + // We cannot support hard coded 0x00 with 'float rounding > 0.0f' --> replace with ImDrawFlags_RoundCornersNone or use 'float rounding = 0.0f' +#endif + + // If this triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values. + // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc... + IM_ASSERT((flags & 0x0F) == 0 && "Misuse of legacy hardcoded ImDrawCornerFlags values!"); + + if ((flags & ImDrawFlags_RoundCornersMask_) == 0) + flags |= ImDrawFlags_RoundCornersAll; + + return flags; +} + +void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, ImDrawFlags flags) +{ + flags = FixRectCornerFlags(flags); + rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f ) - 1.0f); + rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f ) - 1.0f); + + if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) + { + PathLineTo(a); + PathLineTo(ImVec2(b.x, a.y)); + PathLineTo(b); + PathLineTo(ImVec2(a.x, b.y)); + } + else + { + const float rounding_tl = (flags & ImDrawFlags_RoundCornersTopLeft) ? rounding : 0.0f; + const float rounding_tr = (flags & ImDrawFlags_RoundCornersTopRight) ? rounding : 0.0f; + const float rounding_br = (flags & ImDrawFlags_RoundCornersBottomRight) ? rounding : 0.0f; + const float rounding_bl = (flags & ImDrawFlags_RoundCornersBottomLeft) ? rounding : 0.0f; + PathArcToFast(ImVec2(a.x + rounding_tl, a.y + rounding_tl), rounding_tl, 6, 9); + PathArcToFast(ImVec2(b.x - rounding_tr, a.y + rounding_tr), rounding_tr, 9, 12); + PathArcToFast(ImVec2(b.x - rounding_br, b.y - rounding_br), rounding_br, 0, 3); + PathArcToFast(ImVec2(a.x + rounding_bl, b.y - rounding_bl), rounding_bl, 3, 6); + } +} + +void ImDrawList::AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + PathLineTo(p1 + ImVec2(0.5f, 0.5f)); + PathLineTo(p2 + ImVec2(0.5f, 0.5f)); + PathStroke(col, 0, thickness); +} + +// p_min = upper-left, p_max = lower-right +// Note we don't render 1 pixels sized rectangles properly. +void ImDrawList::AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawFlags flags, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + if (Flags & ImDrawListFlags_AntiAliasedLines) + PathRect(p_min + ImVec2(0.50f, 0.50f), p_max - ImVec2(0.50f, 0.50f), rounding, flags); + else + PathRect(p_min + ImVec2(0.50f, 0.50f), p_max - ImVec2(0.49f, 0.49f), rounding, flags); // Better looking lower-right corner and rounded non-AA shapes. + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +void ImDrawList::AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawFlags flags) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) + { + PrimReserve(6, 4); + PrimRect(p_min, p_max, col); + } + else + { + PathRect(p_min, p_max, rounding, flags); + PathFillConvex(col); + } +} + +// p_min = upper-left, p_max = lower-right +void ImDrawList::AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left) +{ + if (((col_upr_left | col_upr_right | col_bot_right | col_bot_left) & IM_COL32_A_MASK) == 0) + return; + + const ImVec2 uv = _Data->TexUvWhitePixel; + PrimReserve(6, 4); + PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 1)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 2)); + PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 2)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 3)); + PrimWriteVtx(p_min, uv, col_upr_left); + PrimWriteVtx(ImVec2(p_max.x, p_min.y), uv, col_upr_right); + PrimWriteVtx(p_max, uv, col_bot_right); + PrimWriteVtx(ImVec2(p_min.x, p_max.y), uv, col_bot_left); +} + +void ImDrawList::AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathLineTo(p4); + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +void ImDrawList::AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathLineTo(p4); + PathFillConvex(col); +} + +void ImDrawList::AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +void ImDrawList::AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathFillConvex(col); +} + +void ImDrawList::AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0 || radius < 0.5f) + return; + + if (num_segments <= 0) + { + // Use arc with automatic segment count + _PathArcToFastEx(center, radius - 0.5f, 0, IM_DRAWLIST_ARCFAST_SAMPLE_MAX, 0); + _Path.Size--; + } + else + { + // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes) + num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX); + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1); + } + + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +void ImDrawList::AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0 || radius < 0.5f) + return; + + if (num_segments <= 0) + { + // Use arc with automatic segment count + _PathArcToFastEx(center, radius, 0, IM_DRAWLIST_ARCFAST_SAMPLE_MAX, 0); + _Path.Size--; + } + else + { + // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes) + num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX); + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius, 0.0f, a_max, num_segments - 1); + } + + PathFillConvex(col); +} + +// Guaranteed to honor 'num_segments' +void ImDrawList::AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2) + return; + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1); + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +// Guaranteed to honor 'num_segments' +void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2) + return; + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius, 0.0f, a_max, num_segments - 1); + PathFillConvex(col); +} + +// Cubic Bezier takes 4 controls points +void ImDrawList::AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathBezierCubicCurveTo(p2, p3, p4, num_segments); + PathStroke(col, 0, thickness); +} + +// Quadratic Bezier takes 3 controls points +void ImDrawList::AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathBezierQuadraticCurveTo(p2, p3, num_segments); + PathStroke(col, 0, thickness); +} + +void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + if (text_end == NULL) + text_end = text_begin + strlen(text_begin); + if (text_begin == text_end) + return; + + // Pull default font/size from the shared ImDrawListSharedData instance + if (font == NULL) + font = _Data->Font; + if (font_size == 0.0f) + font_size = _Data->FontSize; + + IM_ASSERT(font->ContainerAtlas->TexID == _CmdHeader.TextureId); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font. + + ImVec4 clip_rect = _CmdHeader.ClipRect; + if (cpu_fine_clip_rect) + { + clip_rect.x = ImMax(clip_rect.x, cpu_fine_clip_rect->x); + clip_rect.y = ImMax(clip_rect.y, cpu_fine_clip_rect->y); + clip_rect.z = ImMin(clip_rect.z, cpu_fine_clip_rect->z); + clip_rect.w = ImMin(clip_rect.w, cpu_fine_clip_rect->w); + } + font->RenderText(this, font_size, pos, col, clip_rect, text_begin, text_end, wrap_width, cpu_fine_clip_rect != NULL); +} + +void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end) +{ + AddText(NULL, 0.0f, pos, col, text_begin, text_end); +} + +void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; + if (push_texture_id) + PushTextureID(user_texture_id); + + PrimReserve(6, 4); + PrimRectUV(p_min, p_max, uv_min, uv_max, col); + + if (push_texture_id) + PopTextureID(); +} + +void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1, const ImVec2& uv2, const ImVec2& uv3, const ImVec2& uv4, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; + if (push_texture_id) + PushTextureID(user_texture_id); + + PrimReserve(6, 4); + PrimQuadUV(p1, p2, p3, p4, uv1, uv2, uv3, uv4, col); + + if (push_texture_id) + PopTextureID(); +} + +void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + flags = FixRectCornerFlags(flags); + if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) + { + AddImage(user_texture_id, p_min, p_max, uv_min, uv_max, col); + return; + } + + const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; + if (push_texture_id) + PushTextureID(user_texture_id); + + int vert_start_idx = VtxBuffer.Size; + PathRect(p_min, p_max, rounding, flags); + PathFillConvex(col); + int vert_end_idx = VtxBuffer.Size; + ImGui::ShadeVertsLinearUV(this, vert_start_idx, vert_end_idx, p_min, p_max, uv_min, uv_max, true); + + if (push_texture_id) + PopTextureID(); +} + + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawListSplitter +//----------------------------------------------------------------------------- +// FIXME: This may be a little confusing, trying to be a little too low-level/optimal instead of just doing vector swap.. +//----------------------------------------------------------------------------- + +void ImDrawListSplitter::ClearFreeMemory() +{ + for (int i = 0; i < _Channels.Size; i++) + { + if (i == _Current) + memset(&_Channels[i], 0, sizeof(_Channels[i])); // Current channel is a copy of CmdBuffer/IdxBuffer, don't destruct again + _Channels[i]._CmdBuffer.clear(); + _Channels[i]._IdxBuffer.clear(); + } + _Current = 0; + _Count = 1; + _Channels.clear(); +} + +void ImDrawListSplitter::Split(ImDrawList* draw_list, int channels_count) +{ + IM_UNUSED(draw_list); + IM_ASSERT(_Current == 0 && _Count <= 1 && "Nested channel splitting is not supported. Please use separate instances of ImDrawListSplitter."); + int old_channels_count = _Channels.Size; + if (old_channels_count < channels_count) + { + _Channels.reserve(channels_count); // Avoid over reserving since this is likely to stay stable + _Channels.resize(channels_count); + } + _Count = channels_count; + + // Channels[] (24/32 bytes each) hold storage that we'll swap with draw_list->_CmdBuffer/_IdxBuffer + // The content of Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to. + // When we switch to the next channel, we'll copy draw_list->_CmdBuffer/_IdxBuffer into Channels[0] and then Channels[1] into draw_list->CmdBuffer/_IdxBuffer + memset(&_Channels[0], 0, sizeof(ImDrawChannel)); + for (int i = 1; i < channels_count; i++) + { + if (i >= old_channels_count) + { + IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel(); + } + else + { + _Channels[i]._CmdBuffer.resize(0); + _Channels[i]._IdxBuffer.resize(0); + } + } +} + +void ImDrawListSplitter::Merge(ImDrawList* draw_list) +{ + // Note that we never use or rely on _Channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use. + if (_Count <= 1) + return; + + SetCurrentChannel(draw_list, 0); + draw_list->_PopUnusedDrawCmd(); + + // Calculate our final buffer sizes. Also fix the incorrect IdxOffset values in each command. + int new_cmd_buffer_count = 0; + int new_idx_buffer_count = 0; + ImDrawCmd* last_cmd = (_Count > 0 && draw_list->CmdBuffer.Size > 0) ? &draw_list->CmdBuffer.back() : NULL; + int idx_offset = last_cmd ? last_cmd->IdxOffset + last_cmd->ElemCount : 0; + for (int i = 1; i < _Count; i++) + { + ImDrawChannel& ch = _Channels[i]; + if (ch._CmdBuffer.Size > 0 && ch._CmdBuffer.back().ElemCount == 0 && ch._CmdBuffer.back().UserCallback == NULL) // Equivalent of PopUnusedDrawCmd() + ch._CmdBuffer.pop_back(); + + if (ch._CmdBuffer.Size > 0 && last_cmd != NULL) + { + // Do not include ImDrawCmd_AreSequentialIdxOffset() in the compare as we rebuild IdxOffset values ourselves. + // Manipulating IdxOffset (e.g. by reordering draw commands like done by RenderDimmedBackgroundBehindWindow()) is not supported within a splitter. + ImDrawCmd* next_cmd = &ch._CmdBuffer[0]; + if (ImDrawCmd_HeaderCompare(last_cmd, next_cmd) == 0 && last_cmd->UserCallback == NULL && next_cmd->UserCallback == NULL) + { + // Merge previous channel last draw command with current channel first draw command if matching. + last_cmd->ElemCount += next_cmd->ElemCount; + idx_offset += next_cmd->ElemCount; + ch._CmdBuffer.erase(ch._CmdBuffer.Data); // FIXME-OPT: Improve for multiple merges. + } + } + if (ch._CmdBuffer.Size > 0) + last_cmd = &ch._CmdBuffer.back(); + new_cmd_buffer_count += ch._CmdBuffer.Size; + new_idx_buffer_count += ch._IdxBuffer.Size; + for (int cmd_n = 0; cmd_n < ch._CmdBuffer.Size; cmd_n++) + { + ch._CmdBuffer.Data[cmd_n].IdxOffset = idx_offset; + idx_offset += ch._CmdBuffer.Data[cmd_n].ElemCount; + } + } + draw_list->CmdBuffer.resize(draw_list->CmdBuffer.Size + new_cmd_buffer_count); + draw_list->IdxBuffer.resize(draw_list->IdxBuffer.Size + new_idx_buffer_count); + + // Write commands and indices in order (they are fairly small structures, we don't copy vertices only indices) + ImDrawCmd* cmd_write = draw_list->CmdBuffer.Data + draw_list->CmdBuffer.Size - new_cmd_buffer_count; + ImDrawIdx* idx_write = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size - new_idx_buffer_count; + for (int i = 1; i < _Count; i++) + { + ImDrawChannel& ch = _Channels[i]; + if (int sz = ch._CmdBuffer.Size) { memcpy(cmd_write, ch._CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; } + if (int sz = ch._IdxBuffer.Size) { memcpy(idx_write, ch._IdxBuffer.Data, sz * sizeof(ImDrawIdx)); idx_write += sz; } + } + draw_list->_IdxWritePtr = idx_write; + + // Ensure there's always a non-callback draw command trailing the command-buffer + if (draw_list->CmdBuffer.Size == 0 || draw_list->CmdBuffer.back().UserCallback != NULL) + draw_list->AddDrawCmd(); + + // If current command is used with different settings we need to add a new command + ImDrawCmd* curr_cmd = &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount == 0) + ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset + else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0) + draw_list->AddDrawCmd(); + + _Count = 1; +} + +void ImDrawListSplitter::SetCurrentChannel(ImDrawList* draw_list, int idx) +{ + IM_ASSERT(idx >= 0 && idx < _Count); + if (_Current == idx) + return; + + // Overwrite ImVector (12/16 bytes), four times. This is merely a silly optimization instead of doing .swap() + memcpy(&_Channels.Data[_Current]._CmdBuffer, &draw_list->CmdBuffer, sizeof(draw_list->CmdBuffer)); + memcpy(&_Channels.Data[_Current]._IdxBuffer, &draw_list->IdxBuffer, sizeof(draw_list->IdxBuffer)); + _Current = idx; + memcpy(&draw_list->CmdBuffer, &_Channels.Data[idx]._CmdBuffer, sizeof(draw_list->CmdBuffer)); + memcpy(&draw_list->IdxBuffer, &_Channels.Data[idx]._IdxBuffer, sizeof(draw_list->IdxBuffer)); + draw_list->_IdxWritePtr = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size; + + // If current command is used with different settings we need to add a new command + ImDrawCmd* curr_cmd = (draw_list->CmdBuffer.Size == 0) ? NULL : &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1]; + if (curr_cmd == NULL) + draw_list->AddDrawCmd(); + else if (curr_cmd->ElemCount == 0) + ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset + else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0) + draw_list->AddDrawCmd(); +} + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawData +//----------------------------------------------------------------------------- + +// For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! +void ImDrawData::DeIndexAllBuffers() +{ + ImVector new_vtx_buffer; + TotalVtxCount = TotalIdxCount = 0; + for (int i = 0; i < CmdListsCount; i++) + { + ImDrawList* cmd_list = CmdLists[i]; + if (cmd_list->IdxBuffer.empty()) + continue; + new_vtx_buffer.resize(cmd_list->IdxBuffer.Size); + for (int j = 0; j < cmd_list->IdxBuffer.Size; j++) + new_vtx_buffer[j] = cmd_list->VtxBuffer[cmd_list->IdxBuffer[j]]; + cmd_list->VtxBuffer.swap(new_vtx_buffer); + cmd_list->IdxBuffer.resize(0); + TotalVtxCount += cmd_list->VtxBuffer.Size; + } +} + +// Helper to scale the ClipRect field of each ImDrawCmd. +// Use if your final output buffer is at a different scale than draw_data->DisplaySize, +// or if there is a difference between your window resolution and framebuffer resolution. +void ImDrawData::ScaleClipRects(const ImVec2& fb_scale) +{ + for (int i = 0; i < CmdListsCount; i++) + { + ImDrawList* cmd_list = CmdLists[i]; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + ImDrawCmd* cmd = &cmd_list->CmdBuffer[cmd_i]; + cmd->ClipRect = ImVec4(cmd->ClipRect.x * fb_scale.x, cmd->ClipRect.y * fb_scale.y, cmd->ClipRect.z * fb_scale.x, cmd->ClipRect.w * fb_scale.y); + } + } +} + +//----------------------------------------------------------------------------- +// [SECTION] Helpers ShadeVertsXXX functions +//----------------------------------------------------------------------------- + +// Generic linear color gradient, write to RGB fields, leave A untouched. +void ImGui::ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1) +{ + ImVec2 gradient_extent = gradient_p1 - gradient_p0; + float gradient_inv_length2 = 1.0f / ImLengthSqr(gradient_extent); + ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx; + ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx; + const int col0_r = (int)(col0 >> IM_COL32_R_SHIFT) & 0xFF; + const int col0_g = (int)(col0 >> IM_COL32_G_SHIFT) & 0xFF; + const int col0_b = (int)(col0 >> IM_COL32_B_SHIFT) & 0xFF; + const int col_delta_r = ((int)(col1 >> IM_COL32_R_SHIFT) & 0xFF) - col0_r; + const int col_delta_g = ((int)(col1 >> IM_COL32_G_SHIFT) & 0xFF) - col0_g; + const int col_delta_b = ((int)(col1 >> IM_COL32_B_SHIFT) & 0xFF) - col0_b; + for (ImDrawVert* vert = vert_start; vert < vert_end; vert++) + { + float d = ImDot(vert->pos - gradient_p0, gradient_extent); + float t = ImClamp(d * gradient_inv_length2, 0.0f, 1.0f); + int r = (int)(col0_r + col_delta_r * t); + int g = (int)(col0_g + col_delta_g * t); + int b = (int)(col0_b + col_delta_b * t); + vert->col = (r << IM_COL32_R_SHIFT) | (g << IM_COL32_G_SHIFT) | (b << IM_COL32_B_SHIFT) | (vert->col & IM_COL32_A_MASK); + } +} + +// Distribute UV over (a, b) rectangle +void ImGui::ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp) +{ + const ImVec2 size = b - a; + const ImVec2 uv_size = uv_b - uv_a; + const ImVec2 scale = ImVec2( + size.x != 0.0f ? (uv_size.x / size.x) : 0.0f, + size.y != 0.0f ? (uv_size.y / size.y) : 0.0f); + + ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx; + ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx; + if (clamp) + { + const ImVec2 min = ImMin(uv_a, uv_b); + const ImVec2 max = ImMax(uv_a, uv_b); + for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) + vertex->uv = ImClamp(uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale), min, max); + } + else + { + for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) + vertex->uv = uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale); + } +} + +//----------------------------------------------------------------------------- +// [SECTION] ImFontConfig +//----------------------------------------------------------------------------- + +ImFontConfig::ImFontConfig() +{ + memset(this, 0, sizeof(*this)); + FontDataOwnedByAtlas = true; + OversampleH = 3; // FIXME: 2 may be a better default? + OversampleV = 1; + GlyphMaxAdvanceX = FLT_MAX; + RasterizerMultiply = 1.0f; + EllipsisChar = (ImWchar)-1; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImFontAtlas +//----------------------------------------------------------------------------- + +// A work of art lies ahead! (. = white layer, X = black layer, others are blank) +// The 2x2 white texels on the top left are the ones we'll use everywhere in Dear ImGui to render filled shapes. +// (This is used when io.MouseDrawCursor = true) +const int FONT_ATLAS_DEFAULT_TEX_DATA_W = 122; // Actual texture will be 2 times that + 1 spacing. +const int FONT_ATLAS_DEFAULT_TEX_DATA_H = 27; +static const char FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[FONT_ATLAS_DEFAULT_TEX_DATA_W * FONT_ATLAS_DEFAULT_TEX_DATA_H + 1] = +{ + "..- -XXXXXXX- X - X -XXXXXXX - XXXXXXX- XX - XX XX " + "..- -X.....X- X.X - X.X -X.....X - X.....X- X..X -X..X X..X" + "--- -XXX.XXX- X...X - X...X -X....X - X....X- X..X -X...X X...X" + "X - X.X - X.....X - X.....X -X...X - X...X- X..X - X...X X...X " + "XX - X.X -X.......X- X.......X -X..X.X - X.X..X- X..X - X...X...X " + "X.X - X.X -XXXX.XXXX- XXXX.XXXX -X.X X.X - X.X X.X- X..XXX - X.....X " + "X..X - X.X - X.X - X.X -XX X.X - X.X XX- X..X..XXX - X...X " + "X...X - X.X - X.X - XX X.X XX - X.X - X.X - X..X..X..XX - X.X " + "X....X - X.X - X.X - X.X X.X X.X - X.X - X.X - X..X..X..X.X - X...X " + "X.....X - X.X - X.X - X..X X.X X..X - X.X - X.X -XXX X..X..X..X..X- X.....X " + "X......X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X XX-XX X.X -X..XX........X..X- X...X...X " + "X.......X - X.X - X.X -X.....................X- X.X X.X-X.X X.X -X...X...........X- X...X X...X " + "X........X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X..X-X..X.X - X..............X-X...X X...X" + "X.........X -XXX.XXX- X.X - X..X X.X X..X - X...X-X...X - X.............X-X..X X..X" + "X..........X-X.....X- X.X - X.X X.X X.X - X....X-X....X - X.............X- XX XX " + "X......XXXXX-XXXXXXX- X.X - XX X.X XX - X.....X-X.....X - X............X--------------" + "X...X..X --------- X.X - X.X - XXXXXXX-XXXXXXX - X...........X - " + "X..X X..X - -XXXX.XXXX- XXXX.XXXX ------------------------------------- X..........X - " + "X.X X..X - -X.......X- X.......X - XX XX - - X..........X - " + "XX X..X - - X.....X - X.....X - X.X X.X - - X........X - " + " X..X - - X...X - X...X - X..X X..X - - X........X - " + " XX - - X.X - X.X - X...XXXXXXXXXXXXX...X - - XXXXXXXXXX - " + "------------- - X - X -X.....................X- ------------------- " + " ----------------------------------- X...XXXXXXXXXXXXX...X - " + " - X..X X..X - " + " - X.X X.X - " + " - XX XX - " +}; + +static const ImVec2 FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ImGuiMouseCursor_COUNT][3] = +{ + // Pos ........ Size ......... Offset ...... + { ImVec2( 0,3), ImVec2(12,19), ImVec2( 0, 0) }, // ImGuiMouseCursor_Arrow + { ImVec2(13,0), ImVec2( 7,16), ImVec2( 1, 8) }, // ImGuiMouseCursor_TextInput + { ImVec2(31,0), ImVec2(23,23), ImVec2(11,11) }, // ImGuiMouseCursor_ResizeAll + { ImVec2(21,0), ImVec2( 9,23), ImVec2( 4,11) }, // ImGuiMouseCursor_ResizeNS + { ImVec2(55,18),ImVec2(23, 9), ImVec2(11, 4) }, // ImGuiMouseCursor_ResizeEW + { ImVec2(73,0), ImVec2(17,17), ImVec2( 8, 8) }, // ImGuiMouseCursor_ResizeNESW + { ImVec2(55,0), ImVec2(17,17), ImVec2( 8, 8) }, // ImGuiMouseCursor_ResizeNWSE + { ImVec2(91,0), ImVec2(17,22), ImVec2( 5, 0) }, // ImGuiMouseCursor_Hand + { ImVec2(109,0),ImVec2(13,15), ImVec2( 6, 7) }, // ImGuiMouseCursor_NotAllowed +}; + +ImFontAtlas::ImFontAtlas() +{ + memset(this, 0, sizeof(*this)); + TexGlyphPadding = 1; + PackIdMouseCursors = PackIdLines = -1; +} + +ImFontAtlas::~ImFontAtlas() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + Clear(); +} + +void ImFontAtlas::ClearInputData() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + for (int i = 0; i < ConfigData.Size; i++) + if (ConfigData[i].FontData && ConfigData[i].FontDataOwnedByAtlas) + { + IM_FREE(ConfigData[i].FontData); + ConfigData[i].FontData = NULL; + } + + // When clearing this we lose access to the font name and other information used to build the font. + for (int i = 0; i < Fonts.Size; i++) + if (Fonts[i]->ConfigData >= ConfigData.Data && Fonts[i]->ConfigData < ConfigData.Data + ConfigData.Size) + { + Fonts[i]->ConfigData = NULL; + Fonts[i]->ConfigDataCount = 0; + } + ConfigData.clear(); + CustomRects.clear(); + PackIdMouseCursors = PackIdLines = -1; + // Important: we leave TexReady untouched +} + +void ImFontAtlas::ClearTexData() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + if (TexPixelsAlpha8) + IM_FREE(TexPixelsAlpha8); + if (TexPixelsRGBA32) + IM_FREE(TexPixelsRGBA32); + TexPixelsAlpha8 = NULL; + TexPixelsRGBA32 = NULL; + TexPixelsUseColors = false; + // Important: we leave TexReady untouched +} + +void ImFontAtlas::ClearFonts() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + Fonts.clear_delete(); + TexReady = false; +} + +void ImFontAtlas::Clear() +{ + ClearInputData(); + ClearTexData(); + ClearFonts(); +} + +void ImFontAtlas::GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel) +{ + // Build atlas on demand + if (TexPixelsAlpha8 == NULL) + Build(); + + *out_pixels = TexPixelsAlpha8; + if (out_width) *out_width = TexWidth; + if (out_height) *out_height = TexHeight; + if (out_bytes_per_pixel) *out_bytes_per_pixel = 1; +} + +void ImFontAtlas::GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel) +{ + // Convert to RGBA32 format on demand + // Although it is likely to be the most commonly used format, our font rendering is 1 channel / 8 bpp + if (!TexPixelsRGBA32) + { + unsigned char* pixels = NULL; + GetTexDataAsAlpha8(&pixels, NULL, NULL); + if (pixels) + { + TexPixelsRGBA32 = (unsigned int*)IM_ALLOC((size_t)TexWidth * (size_t)TexHeight * 4); + const unsigned char* src = pixels; + unsigned int* dst = TexPixelsRGBA32; + for (int n = TexWidth * TexHeight; n > 0; n--) + *dst++ = IM_COL32(255, 255, 255, (unsigned int)(*src++)); + } + } + + *out_pixels = (unsigned char*)TexPixelsRGBA32; + if (out_width) *out_width = TexWidth; + if (out_height) *out_height = TexHeight; + if (out_bytes_per_pixel) *out_bytes_per_pixel = 4; +} + +ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg) +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0); + IM_ASSERT(font_cfg->SizePixels > 0.0f); + + // Create new font + if (!font_cfg->MergeMode) + Fonts.push_back(IM_NEW(ImFont)); + else + IM_ASSERT(!Fonts.empty() && "Cannot use MergeMode for the first font"); // When using MergeMode make sure that a font has already been added before. You can use ImGui::GetIO().Fonts->AddFontDefault() to add the default imgui font. + + ConfigData.push_back(*font_cfg); + ImFontConfig& new_font_cfg = ConfigData.back(); + if (new_font_cfg.DstFont == NULL) + new_font_cfg.DstFont = Fonts.back(); + if (!new_font_cfg.FontDataOwnedByAtlas) + { + new_font_cfg.FontData = IM_ALLOC(new_font_cfg.FontDataSize); + new_font_cfg.FontDataOwnedByAtlas = true; + memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize); + } + + if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1) + new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar; + + // Invalidate texture + TexReady = false; + ClearTexData(); + return new_font_cfg.DstFont; +} + +// Default font TTF is compressed with stb_compress then base85 encoded (see misc/fonts/binary_to_compressed_c.cpp for encoder) +static unsigned int stb_decompress_length(const unsigned char* input); +static unsigned int stb_decompress(unsigned char* output, const unsigned char* input, unsigned int length); +static const char* GetDefaultCompressedFontDataTTFBase85(); +static unsigned int Decode85Byte(char c) { return c >= '\\' ? c-36 : c-35; } +static void Decode85(const unsigned char* src, unsigned char* dst) +{ + while (*src) + { + unsigned int tmp = Decode85Byte(src[0]) + 85 * (Decode85Byte(src[1]) + 85 * (Decode85Byte(src[2]) + 85 * (Decode85Byte(src[3]) + 85 * Decode85Byte(src[4])))); + dst[0] = ((tmp >> 0) & 0xFF); dst[1] = ((tmp >> 8) & 0xFF); dst[2] = ((tmp >> 16) & 0xFF); dst[3] = ((tmp >> 24) & 0xFF); // We can't assume little-endianness. + src += 5; + dst += 4; + } +} + +// Load embedded ProggyClean.ttf at size 13, disable oversampling +ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template) +{ + ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); + if (!font_cfg_template) + { + font_cfg.OversampleH = font_cfg.OversampleV = 1; + font_cfg.PixelSnapH = true; + } + if (font_cfg.SizePixels <= 0.0f) + font_cfg.SizePixels = 13.0f * 1.0f; + if (font_cfg.Name[0] == '\0') + ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels); + font_cfg.EllipsisChar = (ImWchar)0x0085; + font_cfg.GlyphOffset.y = 1.0f * IM_FLOOR(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units + + const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85(); + const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault(); + ImFont* font = AddFontFromMemoryCompressedBase85TTF(ttf_compressed_base85, font_cfg.SizePixels, &font_cfg, glyph_ranges); + return font; +} + +ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + size_t data_size = 0; + void* data = ImFileLoadToMemory(filename, "rb", &data_size, 0); + if (!data) + { + IM_ASSERT_USER_ERROR(0, "Could not load font file!"); + return NULL; + } + ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); + if (font_cfg.Name[0] == '\0') + { + // Store a short copy of filename into into the font name for convenience + const char* p; + for (p = filename + strlen(filename); p > filename && p[-1] != '/' && p[-1] != '\\'; p--) {} + ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "%s, %.0fpx", p, size_pixels); + } + return AddFontFromMemoryTTF(data, (int)data_size, size_pixels, &font_cfg, glyph_ranges); +} + +// NB: Transfer ownership of 'ttf_data' to ImFontAtlas, unless font_cfg_template->FontDataOwnedByAtlas == false. Owned TTF buffer will be deleted after Build(). +ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); + IM_ASSERT(font_cfg.FontData == NULL); + font_cfg.FontData = ttf_data; + font_cfg.FontDataSize = ttf_size; + font_cfg.SizePixels = size_pixels > 0.0f ? size_pixels : font_cfg.SizePixels; + if (glyph_ranges) + font_cfg.GlyphRanges = glyph_ranges; + return AddFont(&font_cfg); +} + +ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_data, int compressed_ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) +{ + const unsigned int buf_decompressed_size = stb_decompress_length((const unsigned char*)compressed_ttf_data); + unsigned char* buf_decompressed_data = (unsigned char*)IM_ALLOC(buf_decompressed_size); + stb_decompress(buf_decompressed_data, (const unsigned char*)compressed_ttf_data, (unsigned int)compressed_ttf_size); + + ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); + IM_ASSERT(font_cfg.FontData == NULL); + font_cfg.FontDataOwnedByAtlas = true; + return AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, size_pixels, &font_cfg, glyph_ranges); +} + +ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges) +{ + int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4; + void* compressed_ttf = IM_ALLOC((size_t)compressed_ttf_size); + Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf); + ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges); + IM_FREE(compressed_ttf); + return font; +} + +int ImFontAtlas::AddCustomRectRegular(int width, int height) +{ + IM_ASSERT(width > 0 && width <= 0xFFFF); + IM_ASSERT(height > 0 && height <= 0xFFFF); + ImFontAtlasCustomRect r; + r.Width = (unsigned short)width; + r.Height = (unsigned short)height; + CustomRects.push_back(r); + return CustomRects.Size - 1; // Return index +} + +int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset) +{ +#ifdef IMGUI_USE_WCHAR32 + IM_ASSERT(id <= IM_UNICODE_CODEPOINT_MAX); +#endif + IM_ASSERT(font != NULL); + IM_ASSERT(width > 0 && width <= 0xFFFF); + IM_ASSERT(height > 0 && height <= 0xFFFF); + ImFontAtlasCustomRect r; + r.Width = (unsigned short)width; + r.Height = (unsigned short)height; + r.GlyphID = id; + r.GlyphAdvanceX = advance_x; + r.GlyphOffset = offset; + r.Font = font; + CustomRects.push_back(r); + return CustomRects.Size - 1; // Return index +} + +void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const +{ + IM_ASSERT(TexWidth > 0 && TexHeight > 0); // Font atlas needs to be built before we can calculate UV coordinates + IM_ASSERT(rect->IsPacked()); // Make sure the rectangle has been packed + *out_uv_min = ImVec2((float)rect->X * TexUvScale.x, (float)rect->Y * TexUvScale.y); + *out_uv_max = ImVec2((float)(rect->X + rect->Width) * TexUvScale.x, (float)(rect->Y + rect->Height) * TexUvScale.y); +} + +bool ImFontAtlas::GetMouseCursorTexData(ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]) +{ + if (cursor_type <= ImGuiMouseCursor_None || cursor_type >= ImGuiMouseCursor_COUNT) + return false; + if (Flags & ImFontAtlasFlags_NoMouseCursors) + return false; + + IM_ASSERT(PackIdMouseCursors != -1); + ImFontAtlasCustomRect* r = GetCustomRectByIndex(PackIdMouseCursors); + ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][0] + ImVec2((float)r->X, (float)r->Y); + ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][1]; + *out_size = size; + *out_offset = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][2]; + out_uv_border[0] = (pos) * TexUvScale; + out_uv_border[1] = (pos + size) * TexUvScale; + pos.x += FONT_ATLAS_DEFAULT_TEX_DATA_W + 1; + out_uv_fill[0] = (pos) * TexUvScale; + out_uv_fill[1] = (pos + size) * TexUvScale; + return true; +} + +bool ImFontAtlas::Build() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + + // Default font is none are specified + if (ConfigData.Size == 0) + AddFontDefault(); + + // Select builder + // - Note that we do not reassign to atlas->FontBuilderIO, since it is likely to point to static data which + // may mess with some hot-reloading schemes. If you need to assign to this (for dynamic selection) AND are + // using a hot-reloading scheme that messes up static data, store your own instance of ImFontBuilderIO somewhere + // and point to it instead of pointing directly to return value of the GetBuilderXXX functions. + const ImFontBuilderIO* builder_io = FontBuilderIO; + if (builder_io == NULL) + { +#ifdef IMGUI_ENABLE_FREETYPE + builder_io = ImGuiFreeType::GetBuilderForFreeType(); +#elif defined(IMGUI_ENABLE_STB_TRUETYPE) + builder_io = ImFontAtlasGetBuilderForStbTruetype(); +#else + IM_ASSERT(0); // Invalid Build function +#endif + } + + // Build + return builder_io->FontBuilder_Build(this); +} + +void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_brighten_factor) +{ + for (unsigned int i = 0; i < 256; i++) + { + unsigned int value = (unsigned int)(i * in_brighten_factor); + out_table[i] = value > 255 ? 255 : (value & 0xFF); + } +} + +void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride) +{ + unsigned char* data = pixels + x + y * stride; + for (int j = h; j > 0; j--, data += stride) + for (int i = 0; i < w; i++) + data[i] = table[data[i]]; +} + +#ifdef IMGUI_ENABLE_STB_TRUETYPE +// Temporary data for one source font (multiple source fonts can be merged into one destination ImFont) +// (C++03 doesn't allow instancing ImVector<> with function-local types so we declare the type here.) +struct ImFontBuildSrcData +{ + stbtt_fontinfo FontInfo; + stbtt_pack_range PackRange; // Hold the list of codepoints to pack (essentially points to Codepoints.Data) + stbrp_rect* Rects; // Rectangle to pack. We first fill in their size and the packer will give us their position. + stbtt_packedchar* PackedChars; // Output glyphs + const ImWchar* SrcRanges; // Ranges as requested by user (user is allowed to request too much, e.g. 0x0020..0xFFFF) + int DstIndex; // Index into atlas->Fonts[] and dst_tmp_array[] + int GlyphsHighest; // Highest requested codepoint + int GlyphsCount; // Glyph count (excluding missing glyphs and glyphs already set by an earlier source font) + ImBitVector GlyphsSet; // Glyph bit map (random access, 1-bit per codepoint. This will be a maximum of 8KB) + ImVector GlyphsList; // Glyph codepoints list (flattened version of GlyphsMap) +}; + +// Temporary data for one destination ImFont* (multiple source fonts can be merged into one destination ImFont) +struct ImFontBuildDstData +{ + int SrcCount; // Number of source fonts targeting this destination font. + int GlyphsHighest; + int GlyphsCount; + ImBitVector GlyphsSet; // This is used to resolve collision when multiple sources are merged into a same destination font. +}; + +static void UnpackBitVectorToFlatIndexList(const ImBitVector* in, ImVector* out) +{ + IM_ASSERT(sizeof(in->Storage.Data[0]) == sizeof(int)); + const ImU32* it_begin = in->Storage.begin(); + const ImU32* it_end = in->Storage.end(); + for (const ImU32* it = it_begin; it < it_end; it++) + if (ImU32 entries_32 = *it) + for (ImU32 bit_n = 0; bit_n < 32; bit_n++) + if (entries_32 & ((ImU32)1 << bit_n)) + out->push_back((int)(((it - it_begin) << 5) + bit_n)); +} + +static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) +{ + IM_ASSERT(atlas->ConfigData.Size > 0); + + ImFontAtlasBuildInit(atlas); + + // Clear atlas + atlas->TexID = (ImTextureID)NULL; + atlas->TexWidth = atlas->TexHeight = 0; + atlas->TexUvScale = ImVec2(0.0f, 0.0f); + atlas->TexUvWhitePixel = ImVec2(0.0f, 0.0f); + atlas->ClearTexData(); + + // Temporary storage for building + ImVector src_tmp_array; + ImVector dst_tmp_array; + src_tmp_array.resize(atlas->ConfigData.Size); + dst_tmp_array.resize(atlas->Fonts.Size); + memset(src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes()); + memset(dst_tmp_array.Data, 0, (size_t)dst_tmp_array.size_in_bytes()); + + // 1. Initialize font loading structure, check font data validity + for (int src_i = 0; src_i < atlas->ConfigData.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + ImFontConfig& cfg = atlas->ConfigData[src_i]; + IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == atlas)); + + // Find index from cfg.DstFont (we allow the user to set cfg.DstFont. Also it makes casual debugging nicer than when storing indices) + src_tmp.DstIndex = -1; + for (int output_i = 0; output_i < atlas->Fonts.Size && src_tmp.DstIndex == -1; output_i++) + if (cfg.DstFont == atlas->Fonts[output_i]) + src_tmp.DstIndex = output_i; + if (src_tmp.DstIndex == -1) + { + IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array? + return false; + } + // Initialize helper structure for font loading and verify that the TTF/OTF data is correct + const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo); + IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found."); + if (!stbtt_InitFont(&src_tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset)) + return false; + + // Measure highest codepoints + ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; + src_tmp.SrcRanges = cfg.GlyphRanges ? cfg.GlyphRanges : atlas->GetGlyphRangesDefault(); + for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2) + src_tmp.GlyphsHighest = ImMax(src_tmp.GlyphsHighest, (int)src_range[1]); + dst_tmp.SrcCount++; + dst_tmp.GlyphsHighest = ImMax(dst_tmp.GlyphsHighest, src_tmp.GlyphsHighest); + } + + // 2. For every requested codepoint, check for their presence in the font data, and handle redundancy or overlaps between source fonts to avoid unused glyphs. + int total_glyphs_count = 0; + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; + src_tmp.GlyphsSet.Create(src_tmp.GlyphsHighest + 1); + if (dst_tmp.GlyphsSet.Storage.empty()) + dst_tmp.GlyphsSet.Create(dst_tmp.GlyphsHighest + 1); + + for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2) + for (unsigned int codepoint = src_range[0]; codepoint <= src_range[1]; codepoint++) + { + if (dst_tmp.GlyphsSet.TestBit(codepoint)) // Don't overwrite existing glyphs. We could make this an option for MergeMode (e.g. MergeOverwrite==true) + continue; + if (!stbtt_FindGlyphIndex(&src_tmp.FontInfo, codepoint)) // It is actually in the font? + continue; + + // Add to avail set/counters + src_tmp.GlyphsCount++; + dst_tmp.GlyphsCount++; + src_tmp.GlyphsSet.SetBit(codepoint); + dst_tmp.GlyphsSet.SetBit(codepoint); + total_glyphs_count++; + } + } + + // 3. Unpack our bit map into a flat list (we now have all the Unicode points that we know are requested _and_ available _and_ not overlapping another) + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + src_tmp.GlyphsList.reserve(src_tmp.GlyphsCount); + UnpackBitVectorToFlatIndexList(&src_tmp.GlyphsSet, &src_tmp.GlyphsList); + src_tmp.GlyphsSet.Clear(); + IM_ASSERT(src_tmp.GlyphsList.Size == src_tmp.GlyphsCount); + } + for (int dst_i = 0; dst_i < dst_tmp_array.Size; dst_i++) + dst_tmp_array[dst_i].GlyphsSet.Clear(); + dst_tmp_array.clear(); + + // Allocate packing character data and flag packed characters buffer as non-packed (x0=y0=x1=y1=0) + // (We technically don't need to zero-clear buf_rects, but let's do it for the sake of sanity) + ImVector buf_rects; + ImVector buf_packedchars; + buf_rects.resize(total_glyphs_count); + buf_packedchars.resize(total_glyphs_count); + memset(buf_rects.Data, 0, (size_t)buf_rects.size_in_bytes()); + memset(buf_packedchars.Data, 0, (size_t)buf_packedchars.size_in_bytes()); + + // 4. Gather glyphs sizes so we can pack them in our virtual canvas. + int total_surface = 0; + int buf_rects_out_n = 0; + int buf_packedchars_out_n = 0; + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + if (src_tmp.GlyphsCount == 0) + continue; + + src_tmp.Rects = &buf_rects[buf_rects_out_n]; + src_tmp.PackedChars = &buf_packedchars[buf_packedchars_out_n]; + buf_rects_out_n += src_tmp.GlyphsCount; + buf_packedchars_out_n += src_tmp.GlyphsCount; + + // Convert our ranges in the format stb_truetype wants + ImFontConfig& cfg = atlas->ConfigData[src_i]; + src_tmp.PackRange.font_size = cfg.SizePixels; + src_tmp.PackRange.first_unicode_codepoint_in_range = 0; + src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data; + src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size; + src_tmp.PackRange.chardata_for_range = src_tmp.PackedChars; + src_tmp.PackRange.h_oversample = (unsigned char)cfg.OversampleH; + src_tmp.PackRange.v_oversample = (unsigned char)cfg.OversampleV; + + // Gather the sizes of all rectangles we will need to pack (this loop is based on stbtt_PackFontRangesGatherRects) + const float scale = (cfg.SizePixels > 0) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels); + const int padding = atlas->TexGlyphPadding; + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsList.Size; glyph_i++) + { + int x0, y0, x1, y1; + const int glyph_index_in_font = stbtt_FindGlyphIndex(&src_tmp.FontInfo, src_tmp.GlyphsList[glyph_i]); + IM_ASSERT(glyph_index_in_font != 0); + stbtt_GetGlyphBitmapBoxSubpixel(&src_tmp.FontInfo, glyph_index_in_font, scale * cfg.OversampleH, scale * cfg.OversampleV, 0, 0, &x0, &y0, &x1, &y1); + src_tmp.Rects[glyph_i].w = (stbrp_coord)(x1 - x0 + padding + cfg.OversampleH - 1); + src_tmp.Rects[glyph_i].h = (stbrp_coord)(y1 - y0 + padding + cfg.OversampleV - 1); + total_surface += src_tmp.Rects[glyph_i].w * src_tmp.Rects[glyph_i].h; + } + } + + // We need a width for the skyline algorithm, any width! + // The exact width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height. + // User can override TexDesiredWidth and TexGlyphPadding if they wish, otherwise we use a simple heuristic to select the width based on expected surface. + const int surface_sqrt = (int)ImSqrt((float)total_surface) + 1; + atlas->TexHeight = 0; + if (atlas->TexDesiredWidth > 0) + atlas->TexWidth = atlas->TexDesiredWidth; + else + atlas->TexWidth = (surface_sqrt >= 4096 * 0.7f) ? 4096 : (surface_sqrt >= 2048 * 0.7f) ? 2048 : (surface_sqrt >= 1024 * 0.7f) ? 1024 : 512; + + // 5. Start packing + // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values). + const int TEX_HEIGHT_MAX = 1024 * 32; + stbtt_pack_context spc = {}; + stbtt_PackBegin(&spc, NULL, atlas->TexWidth, TEX_HEIGHT_MAX, 0, atlas->TexGlyphPadding, NULL); + ImFontAtlasBuildPackCustomRects(atlas, spc.pack_info); + + // 6. Pack each source font. No rendering yet, we are working with rectangles in an infinitely tall texture at this point. + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + if (src_tmp.GlyphsCount == 0) + continue; + + stbrp_pack_rects((stbrp_context*)spc.pack_info, src_tmp.Rects, src_tmp.GlyphsCount); + + // Extend texture height and mark missing glyphs as non-packed so we won't render them. + // FIXME: We are not handling packing failure here (would happen if we got off TEX_HEIGHT_MAX or if a single if larger than TexWidth?) + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) + if (src_tmp.Rects[glyph_i].was_packed) + atlas->TexHeight = ImMax(atlas->TexHeight, src_tmp.Rects[glyph_i].y + src_tmp.Rects[glyph_i].h); + } + + // 7. Allocate texture + atlas->TexHeight = (atlas->Flags & ImFontAtlasFlags_NoPowerOfTwoHeight) ? (atlas->TexHeight + 1) : ImUpperPowerOfTwo(atlas->TexHeight); + atlas->TexUvScale = ImVec2(1.0f / atlas->TexWidth, 1.0f / atlas->TexHeight); + atlas->TexPixelsAlpha8 = (unsigned char*)IM_ALLOC(atlas->TexWidth * atlas->TexHeight); + memset(atlas->TexPixelsAlpha8, 0, atlas->TexWidth * atlas->TexHeight); + spc.pixels = atlas->TexPixelsAlpha8; + spc.height = atlas->TexHeight; + + // 8. Render/rasterize font characters into the texture + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontConfig& cfg = atlas->ConfigData[src_i]; + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + if (src_tmp.GlyphsCount == 0) + continue; + + stbtt_PackFontRangesRenderIntoRects(&spc, &src_tmp.FontInfo, &src_tmp.PackRange, 1, src_tmp.Rects); + + // Apply multiply operator + if (cfg.RasterizerMultiply != 1.0f) + { + unsigned char multiply_table[256]; + ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, cfg.RasterizerMultiply); + stbrp_rect* r = &src_tmp.Rects[0]; + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++, r++) + if (r->was_packed) + ImFontAtlasBuildMultiplyRectAlpha8(multiply_table, atlas->TexPixelsAlpha8, r->x, r->y, r->w, r->h, atlas->TexWidth * 1); + } + src_tmp.Rects = NULL; + } + + // End packing + stbtt_PackEnd(&spc); + buf_rects.clear(); + + // 9. Setup ImFont and glyphs for runtime + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + if (src_tmp.GlyphsCount == 0) + continue; + + // When merging fonts with MergeMode=true: + // - We can have multiple input fonts writing into a same destination font. + // - dst_font->ConfigData is != from cfg which is our source configuration. + ImFontConfig& cfg = atlas->ConfigData[src_i]; + ImFont* dst_font = cfg.DstFont; + + const float font_scale = stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels); + int unscaled_ascent, unscaled_descent, unscaled_line_gap; + stbtt_GetFontVMetrics(&src_tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap); + + const float ascent = ImFloor(unscaled_ascent * font_scale + ((unscaled_ascent > 0.0f) ? +1 : -1)); + const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1)); + ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); + const float font_off_x = cfg.GlyphOffset.x; + const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent); + + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) + { + // Register glyph + const int codepoint = src_tmp.GlyphsList[glyph_i]; + const stbtt_packedchar& pc = src_tmp.PackedChars[glyph_i]; + stbtt_aligned_quad q; + float unused_x = 0.0f, unused_y = 0.0f; + stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &unused_x, &unused_y, &q, 0); + dst_font->AddGlyph(&cfg, (ImWchar)codepoint, q.x0 + font_off_x, q.y0 + font_off_y, q.x1 + font_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance); + } + } + + // Cleanup + src_tmp_array.clear_destruct(); + + ImFontAtlasBuildFinish(atlas); + return true; +} + +const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype() +{ + static ImFontBuilderIO io; + io.FontBuilder_Build = ImFontAtlasBuildWithStbTruetype; + return &io; +} + +#endif // IMGUI_ENABLE_STB_TRUETYPE + +void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent) +{ + if (!font_config->MergeMode) + { + font->ClearOutputData(); + font->FontSize = font_config->SizePixels; + font->ConfigData = font_config; + font->ConfigDataCount = 0; + font->ContainerAtlas = atlas; + font->Ascent = ascent; + font->Descent = descent; + } + font->ConfigDataCount++; +} + +void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque) +{ + stbrp_context* pack_context = (stbrp_context*)stbrp_context_opaque; + IM_ASSERT(pack_context != NULL); + + ImVector& user_rects = atlas->CustomRects; + IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong. + + ImVector pack_rects; + pack_rects.resize(user_rects.Size); + memset(pack_rects.Data, 0, (size_t)pack_rects.size_in_bytes()); + for (int i = 0; i < user_rects.Size; i++) + { + pack_rects[i].w = user_rects[i].Width; + pack_rects[i].h = user_rects[i].Height; + } + stbrp_pack_rects(pack_context, &pack_rects[0], pack_rects.Size); + for (int i = 0; i < pack_rects.Size; i++) + if (pack_rects[i].was_packed) + { + user_rects[i].X = (unsigned short)pack_rects[i].x; + user_rects[i].Y = (unsigned short)pack_rects[i].y; + IM_ASSERT(pack_rects[i].w == user_rects[i].Width && pack_rects[i].h == user_rects[i].Height); + atlas->TexHeight = ImMax(atlas->TexHeight, pack_rects[i].y + pack_rects[i].h); + } +} + +void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value) +{ + IM_ASSERT(x >= 0 && x + w <= atlas->TexWidth); + IM_ASSERT(y >= 0 && y + h <= atlas->TexHeight); + unsigned char* out_pixel = atlas->TexPixelsAlpha8 + x + (y * atlas->TexWidth); + for (int off_y = 0; off_y < h; off_y++, out_pixel += atlas->TexWidth, in_str += w) + for (int off_x = 0; off_x < w; off_x++) + out_pixel[off_x] = (in_str[off_x] == in_marker_char) ? in_marker_pixel_value : 0x00; +} + +void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value) +{ + IM_ASSERT(x >= 0 && x + w <= atlas->TexWidth); + IM_ASSERT(y >= 0 && y + h <= atlas->TexHeight); + unsigned int* out_pixel = atlas->TexPixelsRGBA32 + x + (y * atlas->TexWidth); + for (int off_y = 0; off_y < h; off_y++, out_pixel += atlas->TexWidth, in_str += w) + for (int off_x = 0; off_x < w; off_x++) + out_pixel[off_x] = (in_str[off_x] == in_marker_char) ? in_marker_pixel_value : IM_COL32_BLACK_TRANS; +} + +static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas) +{ + ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdMouseCursors); + IM_ASSERT(r->IsPacked()); + + const int w = atlas->TexWidth; + if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors)) + { + // Render/copy pixels + IM_ASSERT(r->Width == FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 && r->Height == FONT_ATLAS_DEFAULT_TEX_DATA_H); + const int x_for_white = r->X; + const int x_for_black = r->X + FONT_ATLAS_DEFAULT_TEX_DATA_W + 1; + if (atlas->TexPixelsAlpha8 != NULL) + { + ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', 0xFF); + ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', 0xFF); + } + else + { + ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', IM_COL32_WHITE); + ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', IM_COL32_WHITE); + } + } + else + { + // Render 4 white pixels + IM_ASSERT(r->Width == 2 && r->Height == 2); + const int offset = (int)r->X + (int)r->Y * w; + if (atlas->TexPixelsAlpha8 != NULL) + { + atlas->TexPixelsAlpha8[offset] = atlas->TexPixelsAlpha8[offset + 1] = atlas->TexPixelsAlpha8[offset + w] = atlas->TexPixelsAlpha8[offset + w + 1] = 0xFF; + } + else + { + atlas->TexPixelsRGBA32[offset] = atlas->TexPixelsRGBA32[offset + 1] = atlas->TexPixelsRGBA32[offset + w] = atlas->TexPixelsRGBA32[offset + w + 1] = IM_COL32_WHITE; + } + } + atlas->TexUvWhitePixel = ImVec2((r->X + 0.5f) * atlas->TexUvScale.x, (r->Y + 0.5f) * atlas->TexUvScale.y); +} + +static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas) +{ + if (atlas->Flags & ImFontAtlasFlags_NoBakedLines) + return; + + // This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them + ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdLines); + IM_ASSERT(r->IsPacked()); + for (unsigned int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row + { + // Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle + unsigned int y = n; + unsigned int line_width = n; + unsigned int pad_left = (r->Width - line_width) / 2; + unsigned int pad_right = r->Width - (pad_left + line_width); + + // Write each slice + IM_ASSERT(pad_left + line_width + pad_right == r->Width && y < r->Height); // Make sure we're inside the texture bounds before we start writing pixels + if (atlas->TexPixelsAlpha8 != NULL) + { + unsigned char* write_ptr = &atlas->TexPixelsAlpha8[r->X + ((r->Y + y) * atlas->TexWidth)]; + for (unsigned int i = 0; i < pad_left; i++) + *(write_ptr + i) = 0x00; + + for (unsigned int i = 0; i < line_width; i++) + *(write_ptr + pad_left + i) = 0xFF; + + for (unsigned int i = 0; i < pad_right; i++) + *(write_ptr + pad_left + line_width + i) = 0x00; + } + else + { + unsigned int* write_ptr = &atlas->TexPixelsRGBA32[r->X + ((r->Y + y) * atlas->TexWidth)]; + for (unsigned int i = 0; i < pad_left; i++) + *(write_ptr + i) = IM_COL32(255, 255, 255, 0); + + for (unsigned int i = 0; i < line_width; i++) + *(write_ptr + pad_left + i) = IM_COL32_WHITE; + + for (unsigned int i = 0; i < pad_right; i++) + *(write_ptr + pad_left + line_width + i) = IM_COL32(255, 255, 255, 0); + } + + // Calculate UVs for this line + ImVec2 uv0 = ImVec2((float)(r->X + pad_left - 1), (float)(r->Y + y)) * atlas->TexUvScale; + ImVec2 uv1 = ImVec2((float)(r->X + pad_left + line_width + 1), (float)(r->Y + y + 1)) * atlas->TexUvScale; + float half_v = (uv0.y + uv1.y) * 0.5f; // Calculate a constant V in the middle of the row to avoid sampling artifacts + atlas->TexUvLines[n] = ImVec4(uv0.x, half_v, uv1.x, half_v); + } +} + +// Note: this is called / shared by both the stb_truetype and the FreeType builder +void ImFontAtlasBuildInit(ImFontAtlas* atlas) +{ + // Register texture region for mouse cursors or standard white pixels + if (atlas->PackIdMouseCursors < 0) + { + if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors)) + atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1, FONT_ATLAS_DEFAULT_TEX_DATA_H); + else + atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(2, 2); + } + + // Register texture region for thick lines + // The +2 here is to give space for the end caps, whilst height +1 is to accommodate the fact we have a zero-width row + if (atlas->PackIdLines < 0) + { + if (!(atlas->Flags & ImFontAtlasFlags_NoBakedLines)) + atlas->PackIdLines = atlas->AddCustomRectRegular(IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2, IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1); + } +} + +// This is called/shared by both the stb_truetype and the FreeType builder. +void ImFontAtlasBuildFinish(ImFontAtlas* atlas) +{ + // Render into our custom data blocks + IM_ASSERT(atlas->TexPixelsAlpha8 != NULL || atlas->TexPixelsRGBA32 != NULL); + ImFontAtlasBuildRenderDefaultTexData(atlas); + ImFontAtlasBuildRenderLinesTexData(atlas); + + // Register custom rectangle glyphs + for (int i = 0; i < atlas->CustomRects.Size; i++) + { + const ImFontAtlasCustomRect* r = &atlas->CustomRects[i]; + if (r->Font == NULL || r->GlyphID == 0) + continue; + + // Will ignore ImFontConfig settings: GlyphMinAdvanceX, GlyphMinAdvanceY, GlyphExtraSpacing, PixelSnapH + IM_ASSERT(r->Font->ContainerAtlas == atlas); + ImVec2 uv0, uv1; + atlas->CalcCustomRectUV(r, &uv0, &uv1); + r->Font->AddGlyph(NULL, (ImWchar)r->GlyphID, r->GlyphOffset.x, r->GlyphOffset.y, r->GlyphOffset.x + r->Width, r->GlyphOffset.y + r->Height, uv0.x, uv0.y, uv1.x, uv1.y, r->GlyphAdvanceX); + } + + // Build all fonts lookup tables + for (int i = 0; i < atlas->Fonts.Size; i++) + if (atlas->Fonts[i]->DirtyLookupTables) + atlas->Fonts[i]->BuildLookupTable(); + + atlas->TexReady = true; +} + +// Retrieve list of range (2 int per range, values are inclusive) +const ImWchar* ImFontAtlas::GetGlyphRangesDefault() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0, + }; + return &ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesKorean() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x3131, 0x3163, // Korean alphabets + 0xAC00, 0xD7A3, // Korean characters + 0xFFFD, 0xFFFD, // Invalid + 0, + }; + return &ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesChineseFull() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x2000, 0x206F, // General Punctuation + 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana + 0x31F0, 0x31FF, // Katakana Phonetic Extensions + 0xFF00, 0xFFEF, // Half-width characters + 0xFFFD, 0xFFFD, // Invalid + 0x4e00, 0x9FAF, // CJK Ideograms + 0, + }; + return &ranges[0]; +} + +static void UnpackAccumulativeOffsetsIntoRanges(int base_codepoint, const short* accumulative_offsets, int accumulative_offsets_count, ImWchar* out_ranges) +{ + for (int n = 0; n < accumulative_offsets_count; n++, out_ranges += 2) + { + out_ranges[0] = out_ranges[1] = (ImWchar)(base_codepoint + accumulative_offsets[n]); + base_codepoint += accumulative_offsets[n]; + } + out_ranges[0] = 0; +} + +//------------------------------------------------------------------------- +// [SECTION] ImFontAtlas glyph ranges helpers +//------------------------------------------------------------------------- + +const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon() +{ + // Store 2500 regularly used characters for Simplified Chinese. + // Sourced from https://zh.wiktionary.org/wiki/%E9%99%84%E5%BD%95:%E7%8E%B0%E4%BB%A3%E6%B1%89%E8%AF%AD%E5%B8%B8%E7%94%A8%E5%AD%97%E8%A1%A8 + // This table covers 97.97% of all characters used during the month in July, 1987. + // You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters. + // (Stored as accumulative offsets from the initial unicode codepoint 0x4E00. This encoding is designed to helps us compact the source code size.) + static const short accumulative_offsets_from_0x4E00[] = + { + 0,1,2,4,1,1,1,1,2,1,3,2,1,2,2,1,1,1,1,1,5,2,1,2,3,3,3,2,2,4,1,1,1,2,1,5,2,3,1,2,1,2,1,1,2,1,1,2,2,1,4,1,1,1,1,5,10,1,2,19,2,1,2,1,2,1,2,1,2, + 1,5,1,6,3,2,1,2,2,1,1,1,4,8,5,1,1,4,1,1,3,1,2,1,5,1,2,1,1,1,10,1,1,5,2,4,6,1,4,2,2,2,12,2,1,1,6,1,1,1,4,1,1,4,6,5,1,4,2,2,4,10,7,1,1,4,2,4, + 2,1,4,3,6,10,12,5,7,2,14,2,9,1,1,6,7,10,4,7,13,1,5,4,8,4,1,1,2,28,5,6,1,1,5,2,5,20,2,2,9,8,11,2,9,17,1,8,6,8,27,4,6,9,20,11,27,6,68,2,2,1,1, + 1,2,1,2,2,7,6,11,3,3,1,1,3,1,2,1,1,1,1,1,3,1,1,8,3,4,1,5,7,2,1,4,4,8,4,2,1,2,1,1,4,5,6,3,6,2,12,3,1,3,9,2,4,3,4,1,5,3,3,1,3,7,1,5,1,1,1,1,2, + 3,4,5,2,3,2,6,1,1,2,1,7,1,7,3,4,5,15,2,2,1,5,3,22,19,2,1,1,1,1,2,5,1,1,1,6,1,1,12,8,2,9,18,22,4,1,1,5,1,16,1,2,7,10,15,1,1,6,2,4,1,2,4,1,6, + 1,1,3,2,4,1,6,4,5,1,2,1,1,2,1,10,3,1,3,2,1,9,3,2,5,7,2,19,4,3,6,1,1,1,1,1,4,3,2,1,1,1,2,5,3,1,1,1,2,2,1,1,2,1,1,2,1,3,1,1,1,3,7,1,4,1,1,2,1, + 1,2,1,2,4,4,3,8,1,1,1,2,1,3,5,1,3,1,3,4,6,2,2,14,4,6,6,11,9,1,15,3,1,28,5,2,5,5,3,1,3,4,5,4,6,14,3,2,3,5,21,2,7,20,10,1,2,19,2,4,28,28,2,3, + 2,1,14,4,1,26,28,42,12,40,3,52,79,5,14,17,3,2,2,11,3,4,6,3,1,8,2,23,4,5,8,10,4,2,7,3,5,1,1,6,3,1,2,2,2,5,28,1,1,7,7,20,5,3,29,3,17,26,1,8,4, + 27,3,6,11,23,5,3,4,6,13,24,16,6,5,10,25,35,7,3,2,3,3,14,3,6,2,6,1,4,2,3,8,2,1,1,3,3,3,4,1,1,13,2,2,4,5,2,1,14,14,1,2,2,1,4,5,2,3,1,14,3,12, + 3,17,2,16,5,1,2,1,8,9,3,19,4,2,2,4,17,25,21,20,28,75,1,10,29,103,4,1,2,1,1,4,2,4,1,2,3,24,2,2,2,1,1,2,1,3,8,1,1,1,2,1,1,3,1,1,1,6,1,5,3,1,1, + 1,3,4,1,1,5,2,1,5,6,13,9,16,1,1,1,1,3,2,3,2,4,5,2,5,2,2,3,7,13,7,2,2,1,1,1,1,2,3,3,2,1,6,4,9,2,1,14,2,14,2,1,18,3,4,14,4,11,41,15,23,15,23, + 176,1,3,4,1,1,1,1,5,3,1,2,3,7,3,1,1,2,1,2,4,4,6,2,4,1,9,7,1,10,5,8,16,29,1,1,2,2,3,1,3,5,2,4,5,4,1,1,2,2,3,3,7,1,6,10,1,17,1,44,4,6,2,1,1,6, + 5,4,2,10,1,6,9,2,8,1,24,1,2,13,7,8,8,2,1,4,1,3,1,3,3,5,2,5,10,9,4,9,12,2,1,6,1,10,1,1,7,7,4,10,8,3,1,13,4,3,1,6,1,3,5,2,1,2,17,16,5,2,16,6, + 1,4,2,1,3,3,6,8,5,11,11,1,3,3,2,4,6,10,9,5,7,4,7,4,7,1,1,4,2,1,3,6,8,7,1,6,11,5,5,3,24,9,4,2,7,13,5,1,8,82,16,61,1,1,1,4,2,2,16,10,3,8,1,1, + 6,4,2,1,3,1,1,1,4,3,8,4,2,2,1,1,1,1,1,6,3,5,1,1,4,6,9,2,1,1,1,2,1,7,2,1,6,1,5,4,4,3,1,8,1,3,3,1,3,2,2,2,2,3,1,6,1,2,1,2,1,3,7,1,8,2,1,2,1,5, + 2,5,3,5,10,1,2,1,1,3,2,5,11,3,9,3,5,1,1,5,9,1,2,1,5,7,9,9,8,1,3,3,3,6,8,2,3,2,1,1,32,6,1,2,15,9,3,7,13,1,3,10,13,2,14,1,13,10,2,1,3,10,4,15, + 2,15,15,10,1,3,9,6,9,32,25,26,47,7,3,2,3,1,6,3,4,3,2,8,5,4,1,9,4,2,2,19,10,6,2,3,8,1,2,2,4,2,1,9,4,4,4,6,4,8,9,2,3,1,1,1,1,3,5,5,1,3,8,4,6, + 2,1,4,12,1,5,3,7,13,2,5,8,1,6,1,2,5,14,6,1,5,2,4,8,15,5,1,23,6,62,2,10,1,1,8,1,2,2,10,4,2,2,9,2,1,1,3,2,3,1,5,3,3,2,1,3,8,1,1,1,11,3,1,1,4, + 3,7,1,14,1,2,3,12,5,2,5,1,6,7,5,7,14,11,1,3,1,8,9,12,2,1,11,8,4,4,2,6,10,9,13,1,1,3,1,5,1,3,2,4,4,1,18,2,3,14,11,4,29,4,2,7,1,3,13,9,2,2,5, + 3,5,20,7,16,8,5,72,34,6,4,22,12,12,28,45,36,9,7,39,9,191,1,1,1,4,11,8,4,9,2,3,22,1,1,1,1,4,17,1,7,7,1,11,31,10,2,4,8,2,3,2,1,4,2,16,4,32,2, + 3,19,13,4,9,1,5,2,14,8,1,1,3,6,19,6,5,1,16,6,2,10,8,5,1,2,3,1,5,5,1,11,6,6,1,3,3,2,6,3,8,1,1,4,10,7,5,7,7,5,8,9,2,1,3,4,1,1,3,1,3,3,2,6,16, + 1,4,6,3,1,10,6,1,3,15,2,9,2,10,25,13,9,16,6,2,2,10,11,4,3,9,1,2,6,6,5,4,30,40,1,10,7,12,14,33,6,3,6,7,3,1,3,1,11,14,4,9,5,12,11,49,18,51,31, + 140,31,2,2,1,5,1,8,1,10,1,4,4,3,24,1,10,1,3,6,6,16,3,4,5,2,1,4,2,57,10,6,22,2,22,3,7,22,6,10,11,36,18,16,33,36,2,5,5,1,1,1,4,10,1,4,13,2,7, + 5,2,9,3,4,1,7,43,3,7,3,9,14,7,9,1,11,1,1,3,7,4,18,13,1,14,1,3,6,10,73,2,2,30,6,1,11,18,19,13,22,3,46,42,37,89,7,3,16,34,2,2,3,9,1,7,1,1,1,2, + 2,4,10,7,3,10,3,9,5,28,9,2,6,13,7,3,1,3,10,2,7,2,11,3,6,21,54,85,2,1,4,2,2,1,39,3,21,2,2,5,1,1,1,4,1,1,3,4,15,1,3,2,4,4,2,3,8,2,20,1,8,7,13, + 4,1,26,6,2,9,34,4,21,52,10,4,4,1,5,12,2,11,1,7,2,30,12,44,2,30,1,1,3,6,16,9,17,39,82,2,2,24,7,1,7,3,16,9,14,44,2,1,2,1,2,3,5,2,4,1,6,7,5,3, + 2,6,1,11,5,11,2,1,18,19,8,1,3,24,29,2,1,3,5,2,2,1,13,6,5,1,46,11,3,5,1,1,5,8,2,10,6,12,6,3,7,11,2,4,16,13,2,5,1,1,2,2,5,2,28,5,2,23,10,8,4, + 4,22,39,95,38,8,14,9,5,1,13,5,4,3,13,12,11,1,9,1,27,37,2,5,4,4,63,211,95,2,2,2,1,3,5,2,1,1,2,2,1,1,1,3,2,4,1,2,1,1,5,2,2,1,1,2,3,1,3,1,1,1, + 3,1,4,2,1,3,6,1,1,3,7,15,5,3,2,5,3,9,11,4,2,22,1,6,3,8,7,1,4,28,4,16,3,3,25,4,4,27,27,1,4,1,2,2,7,1,3,5,2,28,8,2,14,1,8,6,16,25,3,3,3,14,3, + 3,1,1,2,1,4,6,3,8,4,1,1,1,2,3,6,10,6,2,3,18,3,2,5,5,4,3,1,5,2,5,4,23,7,6,12,6,4,17,11,9,5,1,1,10,5,12,1,1,11,26,33,7,3,6,1,17,7,1,5,12,1,11, + 2,4,1,8,14,17,23,1,2,1,7,8,16,11,9,6,5,2,6,4,16,2,8,14,1,11,8,9,1,1,1,9,25,4,11,19,7,2,15,2,12,8,52,7,5,19,2,16,4,36,8,1,16,8,24,26,4,6,2,9, + 5,4,36,3,28,12,25,15,37,27,17,12,59,38,5,32,127,1,2,9,17,14,4,1,2,1,1,8,11,50,4,14,2,19,16,4,17,5,4,5,26,12,45,2,23,45,104,30,12,8,3,10,2,2, + 3,3,1,4,20,7,2,9,6,15,2,20,1,3,16,4,11,15,6,134,2,5,59,1,2,2,2,1,9,17,3,26,137,10,211,59,1,2,4,1,4,1,1,1,2,6,2,3,1,1,2,3,2,3,1,3,4,4,2,3,3, + 1,4,3,1,7,2,2,3,1,2,1,3,3,3,2,2,3,2,1,3,14,6,1,3,2,9,6,15,27,9,34,145,1,1,2,1,1,1,1,2,1,1,1,1,2,2,2,3,1,2,1,1,1,2,3,5,8,3,5,2,4,1,3,2,2,2,12, + 4,1,1,1,10,4,5,1,20,4,16,1,15,9,5,12,2,9,2,5,4,2,26,19,7,1,26,4,30,12,15,42,1,6,8,172,1,1,4,2,1,1,11,2,2,4,2,1,2,1,10,8,1,2,1,4,5,1,2,5,1,8, + 4,1,3,4,2,1,6,2,1,3,4,1,2,1,1,1,1,12,5,7,2,4,3,1,1,1,3,3,6,1,2,2,3,3,3,2,1,2,12,14,11,6,6,4,12,2,8,1,7,10,1,35,7,4,13,15,4,3,23,21,28,52,5, + 26,5,6,1,7,10,2,7,53,3,2,1,1,1,2,163,532,1,10,11,1,3,3,4,8,2,8,6,2,2,23,22,4,2,2,4,2,1,3,1,3,3,5,9,8,2,1,2,8,1,10,2,12,21,20,15,105,2,3,1,1, + 3,2,3,1,1,2,5,1,4,15,11,19,1,1,1,1,5,4,5,1,1,2,5,3,5,12,1,2,5,1,11,1,1,15,9,1,4,5,3,26,8,2,1,3,1,1,15,19,2,12,1,2,5,2,7,2,19,2,20,6,26,7,5, + 2,2,7,34,21,13,70,2,128,1,1,2,1,1,2,1,1,3,2,2,2,15,1,4,1,3,4,42,10,6,1,49,85,8,1,2,1,1,4,4,2,3,6,1,5,7,4,3,211,4,1,2,1,2,5,1,2,4,2,2,6,5,6, + 10,3,4,48,100,6,2,16,296,5,27,387,2,2,3,7,16,8,5,38,15,39,21,9,10,3,7,59,13,27,21,47,5,21,6 + }; + static ImWchar base_ranges[] = // not zero-terminated + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x2000, 0x206F, // General Punctuation + 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana + 0x31F0, 0x31FF, // Katakana Phonetic Extensions + 0xFF00, 0xFFEF, // Half-width characters + 0xFFFD, 0xFFFD // Invalid + }; + static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(accumulative_offsets_from_0x4E00) * 2 + 1] = { 0 }; + if (!full_ranges[0]) + { + memcpy(full_ranges, base_ranges, sizeof(base_ranges)); + UnpackAccumulativeOffsetsIntoRanges(0x4E00, accumulative_offsets_from_0x4E00, IM_ARRAYSIZE(accumulative_offsets_from_0x4E00), full_ranges + IM_ARRAYSIZE(base_ranges)); + } + return &full_ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesJapanese() +{ + // 2999 ideograms code points for Japanese + // - 2136 Joyo (meaning "for regular use" or "for common use") Kanji code points + // - 863 Jinmeiyo (meaning "for personal name") Kanji code points + // - Sourced from the character information database of the Information-technology Promotion Agency, Japan + // - https://mojikiban.ipa.go.jp/mji/ + // - Available under the terms of the Creative Commons Attribution-ShareAlike 2.1 Japan (CC BY-SA 2.1 JP). + // - https://creativecommons.org/licenses/by-sa/2.1/jp/deed.en + // - https://creativecommons.org/licenses/by-sa/2.1/jp/legalcode + // - You can generate this code by the script at: + // - https://github.com/vaiorabbit/everyday_use_kanji + // - References: + // - List of Joyo Kanji + // - (Official list by the Agency for Cultural Affairs) https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kakuki/14/tosin02/index.html + // - (Wikipedia) https://en.wikipedia.org/wiki/List_of_j%C5%8Dy%C5%8D_kanji + // - List of Jinmeiyo Kanji + // - (Official list by the Ministry of Justice) http://www.moj.go.jp/MINJI/minji86.html + // - (Wikipedia) https://en.wikipedia.org/wiki/Jinmeiy%C5%8D_kanji + // - Missing 1 Joyo Kanji: U+20B9F (Kun'yomi: Shikaru, On'yomi: Shitsu,shichi), see https://github.com/ocornut/imgui/pull/3627 for details. + // You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters. + // (Stored as accumulative offsets from the initial unicode codepoint 0x4E00. This encoding is designed to helps us compact the source code size.) + static const short accumulative_offsets_from_0x4E00[] = + { + 0,1,2,4,1,1,1,1,2,1,3,3,2,2,1,5,3,5,7,5,6,1,2,1,7,2,6,3,1,8,1,1,4,1,1,18,2,11,2,6,2,1,2,1,5,1,2,1,3,1,2,1,2,3,3,1,1,2,3,1,1,1,12,7,9,1,4,5,1, + 1,2,1,10,1,1,9,2,2,4,5,6,9,3,1,1,1,1,9,3,18,5,2,2,2,2,1,6,3,7,1,1,1,1,2,2,4,2,1,23,2,10,4,3,5,2,4,10,2,4,13,1,6,1,9,3,1,1,6,6,7,6,3,1,2,11,3, + 2,2,3,2,15,2,2,5,4,3,6,4,1,2,5,2,12,16,6,13,9,13,2,1,1,7,16,4,7,1,19,1,5,1,2,2,7,7,8,2,6,5,4,9,18,7,4,5,9,13,11,8,15,2,1,1,1,2,1,2,2,1,2,2,8, + 2,9,3,3,1,1,4,4,1,1,1,4,9,1,4,3,5,5,2,7,5,3,4,8,2,1,13,2,3,3,1,14,1,1,4,5,1,3,6,1,5,2,1,1,3,3,3,3,1,1,2,7,6,6,7,1,4,7,6,1,1,1,1,1,12,3,3,9,5, + 2,6,1,5,6,1,2,3,18,2,4,14,4,1,3,6,1,1,6,3,5,5,3,2,2,2,2,12,3,1,4,2,3,2,3,11,1,7,4,1,2,1,3,17,1,9,1,24,1,1,4,2,2,4,1,2,7,1,1,1,3,1,2,2,4,15,1, + 1,2,1,1,2,1,5,2,5,20,2,5,9,1,10,8,7,6,1,1,1,1,1,1,6,2,1,2,8,1,1,1,1,5,1,1,3,1,1,1,1,3,1,1,12,4,1,3,1,1,1,1,1,10,3,1,7,5,13,1,2,3,4,6,1,1,30, + 2,9,9,1,15,38,11,3,1,8,24,7,1,9,8,10,2,1,9,31,2,13,6,2,9,4,49,5,2,15,2,1,10,2,1,1,1,2,2,6,15,30,35,3,14,18,8,1,16,10,28,12,19,45,38,1,3,2,3, + 13,2,1,7,3,6,5,3,4,3,1,5,7,8,1,5,3,18,5,3,6,1,21,4,24,9,24,40,3,14,3,21,3,2,1,2,4,2,3,1,15,15,6,5,1,1,3,1,5,6,1,9,7,3,3,2,1,4,3,8,21,5,16,4, + 5,2,10,11,11,3,6,3,2,9,3,6,13,1,2,1,1,1,1,11,12,6,6,1,4,2,6,5,2,1,1,3,3,6,13,3,1,1,5,1,2,3,3,14,2,1,2,2,2,5,1,9,5,1,1,6,12,3,12,3,4,13,2,14, + 2,8,1,17,5,1,16,4,2,2,21,8,9,6,23,20,12,25,19,9,38,8,3,21,40,25,33,13,4,3,1,4,1,2,4,1,2,5,26,2,1,1,2,1,3,6,2,1,1,1,1,1,1,2,3,1,1,1,9,2,3,1,1, + 1,3,6,3,2,1,1,6,6,1,8,2,2,2,1,4,1,2,3,2,7,3,2,4,1,2,1,2,2,1,1,1,1,1,3,1,2,5,4,10,9,4,9,1,1,1,1,1,1,5,3,2,1,6,4,9,6,1,10,2,31,17,8,3,7,5,40,1, + 7,7,1,6,5,2,10,7,8,4,15,39,25,6,28,47,18,10,7,1,3,1,1,2,1,1,1,3,3,3,1,1,1,3,4,2,1,4,1,3,6,10,7,8,6,2,2,1,3,3,2,5,8,7,9,12,2,15,1,1,4,1,2,1,1, + 1,3,2,1,3,3,5,6,2,3,2,10,1,4,2,8,1,1,1,11,6,1,21,4,16,3,1,3,1,4,2,3,6,5,1,3,1,1,3,3,4,6,1,1,10,4,2,7,10,4,7,4,2,9,4,3,1,1,1,4,1,8,3,4,1,3,1, + 6,1,4,2,1,4,7,2,1,8,1,4,5,1,1,2,2,4,6,2,7,1,10,1,1,3,4,11,10,8,21,4,6,1,3,5,2,1,2,28,5,5,2,3,13,1,2,3,1,4,2,1,5,20,3,8,11,1,3,3,3,1,8,10,9,2, + 10,9,2,3,1,1,2,4,1,8,3,6,1,7,8,6,11,1,4,29,8,4,3,1,2,7,13,1,4,1,6,2,6,12,12,2,20,3,2,3,6,4,8,9,2,7,34,5,1,18,6,1,1,4,4,5,7,9,1,2,2,4,3,4,1,7, + 2,2,2,6,2,3,25,5,3,6,1,4,6,7,4,2,1,4,2,13,6,4,4,3,1,5,3,4,4,3,2,1,1,4,1,2,1,1,3,1,11,1,6,3,1,7,3,6,2,8,8,6,9,3,4,11,3,2,10,12,2,5,11,1,6,4,5, + 3,1,8,5,4,6,6,3,5,1,1,3,2,1,2,2,6,17,12,1,10,1,6,12,1,6,6,19,9,6,16,1,13,4,4,15,7,17,6,11,9,15,12,6,7,2,1,2,2,15,9,3,21,4,6,49,18,7,3,2,3,1, + 6,8,2,2,6,2,9,1,3,6,4,4,1,2,16,2,5,2,1,6,2,3,5,3,1,2,5,1,2,1,9,3,1,8,6,4,8,11,3,1,1,1,1,3,1,13,8,4,1,3,2,2,1,4,1,11,1,5,2,1,5,2,5,8,6,1,1,7, + 4,3,8,3,2,7,2,1,5,1,5,2,4,7,6,2,8,5,1,11,4,5,3,6,18,1,2,13,3,3,1,21,1,1,4,1,4,1,1,1,8,1,2,2,7,1,2,4,2,2,9,2,1,1,1,4,3,6,3,12,5,1,1,1,5,6,3,2, + 4,8,2,2,4,2,7,1,8,9,5,2,3,2,1,3,2,13,7,14,6,5,1,1,2,1,4,2,23,2,1,1,6,3,1,4,1,15,3,1,7,3,9,14,1,3,1,4,1,1,5,8,1,3,8,3,8,15,11,4,14,4,4,2,5,5, + 1,7,1,6,14,7,7,8,5,15,4,8,6,5,6,2,1,13,1,20,15,11,9,2,5,6,2,11,2,6,2,5,1,5,8,4,13,19,25,4,1,1,11,1,34,2,5,9,14,6,2,2,6,1,1,14,1,3,14,13,1,6, + 12,21,14,14,6,32,17,8,32,9,28,1,2,4,11,8,3,1,14,2,5,15,1,1,1,1,3,6,4,1,3,4,11,3,1,1,11,30,1,5,1,4,1,5,8,1,1,3,2,4,3,17,35,2,6,12,17,3,1,6,2, + 1,1,12,2,7,3,3,2,1,16,2,8,3,6,5,4,7,3,3,8,1,9,8,5,1,2,1,3,2,8,1,2,9,12,1,1,2,3,8,3,24,12,4,3,7,5,8,3,3,3,3,3,3,1,23,10,3,1,2,2,6,3,1,16,1,16, + 22,3,10,4,11,6,9,7,7,3,6,2,2,2,4,10,2,1,1,2,8,7,1,6,4,1,3,3,3,5,10,12,12,2,3,12,8,15,1,1,16,6,6,1,5,9,11,4,11,4,2,6,12,1,17,5,13,1,4,9,5,1,11, + 2,1,8,1,5,7,28,8,3,5,10,2,17,3,38,22,1,2,18,12,10,4,38,18,1,4,44,19,4,1,8,4,1,12,1,4,31,12,1,14,7,75,7,5,10,6,6,13,3,2,11,11,3,2,5,28,15,6,18, + 18,5,6,4,3,16,1,7,18,7,36,3,5,3,1,7,1,9,1,10,7,2,4,2,6,2,9,7,4,3,32,12,3,7,10,2,23,16,3,1,12,3,31,4,11,1,3,8,9,5,1,30,15,6,12,3,2,2,11,19,9, + 14,2,6,2,3,19,13,17,5,3,3,25,3,14,1,1,1,36,1,3,2,19,3,13,36,9,13,31,6,4,16,34,2,5,4,2,3,3,5,1,1,1,4,3,1,17,3,2,3,5,3,1,3,2,3,5,6,3,12,11,1,3, + 1,2,26,7,12,7,2,14,3,3,7,7,11,25,25,28,16,4,36,1,2,1,6,2,1,9,3,27,17,4,3,4,13,4,1,3,2,2,1,10,4,2,4,6,3,8,2,1,18,1,1,24,2,2,4,33,2,3,63,7,1,6, + 40,7,3,4,4,2,4,15,18,1,16,1,1,11,2,41,14,1,3,18,13,3,2,4,16,2,17,7,15,24,7,18,13,44,2,2,3,6,1,1,7,5,1,7,1,4,3,3,5,10,8,2,3,1,8,1,1,27,4,2,1, + 12,1,2,1,10,6,1,6,7,5,2,3,7,11,5,11,3,6,6,2,3,15,4,9,1,1,2,1,2,11,2,8,12,8,5,4,2,3,1,5,2,2,1,14,1,12,11,4,1,11,17,17,4,3,2,5,5,7,3,1,5,9,9,8, + 2,5,6,6,13,13,2,1,2,6,1,2,2,49,4,9,1,2,10,16,7,8,4,3,2,23,4,58,3,29,1,14,19,19,11,11,2,7,5,1,3,4,6,2,18,5,12,12,17,17,3,3,2,4,1,6,2,3,4,3,1, + 1,1,1,5,1,1,9,1,3,1,3,6,1,8,1,1,2,6,4,14,3,1,4,11,4,1,3,32,1,2,4,13,4,1,2,4,2,1,3,1,11,1,4,2,1,4,4,6,3,5,1,6,5,7,6,3,23,3,5,3,5,3,3,13,3,9,10, + 1,12,10,2,3,18,13,7,160,52,4,2,2,3,2,14,5,4,12,4,6,4,1,20,4,11,6,2,12,27,1,4,1,2,2,7,4,5,2,28,3,7,25,8,3,19,3,6,10,2,2,1,10,2,5,4,1,3,4,1,5, + 3,2,6,9,3,6,2,16,3,3,16,4,5,5,3,2,1,2,16,15,8,2,6,21,2,4,1,22,5,8,1,1,21,11,2,1,11,11,19,13,12,4,2,3,2,3,6,1,8,11,1,4,2,9,5,2,1,11,2,9,1,1,2, + 14,31,9,3,4,21,14,4,8,1,7,2,2,2,5,1,4,20,3,3,4,10,1,11,9,8,2,1,4,5,14,12,14,2,17,9,6,31,4,14,1,20,13,26,5,2,7,3,6,13,2,4,2,19,6,2,2,18,9,3,5, + 12,12,14,4,6,2,3,6,9,5,22,4,5,25,6,4,8,5,2,6,27,2,35,2,16,3,7,8,8,6,6,5,9,17,2,20,6,19,2,13,3,1,1,1,4,17,12,2,14,7,1,4,18,12,38,33,2,10,1,1, + 2,13,14,17,11,50,6,33,20,26,74,16,23,45,50,13,38,33,6,6,7,4,4,2,1,3,2,5,8,7,8,9,3,11,21,9,13,1,3,10,6,7,1,2,2,18,5,5,1,9,9,2,68,9,19,13,2,5, + 1,4,4,7,4,13,3,9,10,21,17,3,26,2,1,5,2,4,5,4,1,7,4,7,3,4,2,1,6,1,1,20,4,1,9,2,2,1,3,3,2,3,2,1,1,1,20,2,3,1,6,2,3,6,2,4,8,1,3,2,10,3,5,3,4,4, + 3,4,16,1,6,1,10,2,4,2,1,1,2,10,11,2,2,3,1,24,31,4,10,10,2,5,12,16,164,15,4,16,7,9,15,19,17,1,2,1,1,5,1,1,1,1,1,3,1,4,3,1,3,1,3,1,2,1,1,3,3,7, + 2,8,1,2,2,2,1,3,4,3,7,8,12,92,2,10,3,1,3,14,5,25,16,42,4,7,7,4,2,21,5,27,26,27,21,25,30,31,2,1,5,13,3,22,5,6,6,11,9,12,1,5,9,7,5,5,22,60,3,5, + 13,1,1,8,1,1,3,3,2,1,9,3,3,18,4,1,2,3,7,6,3,1,2,3,9,1,3,1,3,2,1,3,1,1,1,2,1,11,3,1,6,9,1,3,2,3,1,2,1,5,1,1,4,3,4,1,2,2,4,4,1,7,2,1,2,2,3,5,13, + 18,3,4,14,9,9,4,16,3,7,5,8,2,6,48,28,3,1,1,4,2,14,8,2,9,2,1,15,2,4,3,2,10,16,12,8,7,1,1,3,1,1,1,2,7,4,1,6,4,38,39,16,23,7,15,15,3,2,12,7,21, + 37,27,6,5,4,8,2,10,8,8,6,5,1,2,1,3,24,1,16,17,9,23,10,17,6,1,51,55,44,13,294,9,3,6,2,4,2,2,15,1,1,1,13,21,17,68,14,8,9,4,1,4,9,3,11,7,1,1,1, + 5,6,3,2,1,1,1,2,3,8,1,2,2,4,1,5,5,2,1,4,3,7,13,4,1,4,1,3,1,1,1,5,5,10,1,6,1,5,2,1,5,2,4,1,4,5,7,3,18,2,9,11,32,4,3,3,2,4,7,11,16,9,11,8,13,38, + 32,8,4,2,1,1,2,1,2,4,4,1,1,1,4,1,21,3,11,1,16,1,1,6,1,3,2,4,9,8,57,7,44,1,3,3,13,3,10,1,1,7,5,2,7,21,47,63,3,15,4,7,1,16,1,1,2,8,2,3,42,15,4, + 1,29,7,22,10,3,78,16,12,20,18,4,67,11,5,1,3,15,6,21,31,32,27,18,13,71,35,5,142,4,10,1,2,50,19,33,16,35,37,16,19,27,7,1,133,19,1,4,8,7,20,1,4, + 4,1,10,3,1,6,1,2,51,5,40,15,24,43,22928,11,1,13,154,70,3,1,1,7,4,10,1,2,1,1,2,1,2,1,2,2,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1, + 3,2,1,1,1,1,2,1,1, + }; + static ImWchar base_ranges[] = // not zero-terminated + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana + 0x31F0, 0x31FF, // Katakana Phonetic Extensions + 0xFF00, 0xFFEF, // Half-width characters + 0xFFFD, 0xFFFD // Invalid + }; + static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(accumulative_offsets_from_0x4E00)*2 + 1] = { 0 }; + if (!full_ranges[0]) + { + memcpy(full_ranges, base_ranges, sizeof(base_ranges)); + UnpackAccumulativeOffsetsIntoRanges(0x4E00, accumulative_offsets_from_0x4E00, IM_ARRAYSIZE(accumulative_offsets_from_0x4E00), full_ranges + IM_ARRAYSIZE(base_ranges)); + } + return &full_ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesCyrillic() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x0400, 0x052F, // Cyrillic + Cyrillic Supplement + 0x2DE0, 0x2DFF, // Cyrillic Extended-A + 0xA640, 0xA69F, // Cyrillic Extended-B + 0, + }; + return &ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesThai() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + 0x2010, 0x205E, // Punctuations + 0x0E00, 0x0E7F, // Thai + 0, + }; + return &ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesVietnamese() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + 0x0102, 0x0103, + 0x0110, 0x0111, + 0x0128, 0x0129, + 0x0168, 0x0169, + 0x01A0, 0x01A1, + 0x01AF, 0x01B0, + 0x1EA0, 0x1EF9, + 0, + }; + return &ranges[0]; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImFontGlyphRangesBuilder +//----------------------------------------------------------------------------- + +void ImFontGlyphRangesBuilder::AddText(const char* text, const char* text_end) +{ + while (text_end ? (text < text_end) : *text) + { + unsigned int c = 0; + int c_len = ImTextCharFromUtf8(&c, text, text_end); + text += c_len; + if (c_len == 0) + break; + AddChar((ImWchar)c); + } +} + +void ImFontGlyphRangesBuilder::AddRanges(const ImWchar* ranges) +{ + for (; ranges[0]; ranges += 2) + for (unsigned int c = ranges[0]; c <= ranges[1] && c <= IM_UNICODE_CODEPOINT_MAX; c++) //-V560 + AddChar((ImWchar)c); +} + +void ImFontGlyphRangesBuilder::BuildRanges(ImVector* out_ranges) +{ + const int max_codepoint = IM_UNICODE_CODEPOINT_MAX; + for (int n = 0; n <= max_codepoint; n++) + if (GetBit(n)) + { + out_ranges->push_back((ImWchar)n); + while (n < max_codepoint && GetBit(n + 1)) + n++; + out_ranges->push_back((ImWchar)n); + } + out_ranges->push_back(0); +} + +//----------------------------------------------------------------------------- +// [SECTION] ImFont +//----------------------------------------------------------------------------- + +ImFont::ImFont() +{ + FontSize = 0.0f; + FallbackAdvanceX = 0.0f; + FallbackChar = (ImWchar)-1; + EllipsisChar = (ImWchar)-1; + DotChar = (ImWchar)-1; + FallbackGlyph = NULL; + ContainerAtlas = NULL; + ConfigData = NULL; + ConfigDataCount = 0; + DirtyLookupTables = false; + Scale = 1.0f; + Ascent = Descent = 0.0f; + MetricsTotalSurface = 0; + memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap)); +} + +ImFont::~ImFont() +{ + ClearOutputData(); +} + +void ImFont::ClearOutputData() +{ + FontSize = 0.0f; + FallbackAdvanceX = 0.0f; + Glyphs.clear(); + IndexAdvanceX.clear(); + IndexLookup.clear(); + FallbackGlyph = NULL; + ContainerAtlas = NULL; + DirtyLookupTables = true; + Ascent = Descent = 0.0f; + MetricsTotalSurface = 0; +} + +static ImWchar FindFirstExistingGlyph(ImFont* font, const ImWchar* candidate_chars, int candidate_chars_count) +{ + for (int n = 0; n < candidate_chars_count; n++) + if (font->FindGlyphNoFallback(candidate_chars[n]) != NULL) + return candidate_chars[n]; + return (ImWchar)-1; +} + +void ImFont::BuildLookupTable() +{ + int max_codepoint = 0; + for (int i = 0; i != Glyphs.Size; i++) + max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint); + + // Build lookup table + IM_ASSERT(Glyphs.Size < 0xFFFF); // -1 is reserved + IndexAdvanceX.clear(); + IndexLookup.clear(); + DirtyLookupTables = false; + memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap)); + GrowIndex(max_codepoint + 1); + for (int i = 0; i < Glyphs.Size; i++) + { + int codepoint = (int)Glyphs[i].Codepoint; + IndexAdvanceX[codepoint] = Glyphs[i].AdvanceX; + IndexLookup[codepoint] = (ImWchar)i; + + // Mark 4K page as used + const int page_n = codepoint / 4096; + Used4kPagesMap[page_n >> 3] |= 1 << (page_n & 7); + } + + // Create a glyph to handle TAB + // FIXME: Needs proper TAB handling but it needs to be contextualized (or we could arbitrary say that each string starts at "column 0" ?) + if (FindGlyph((ImWchar)' ')) + { + if (Glyphs.back().Codepoint != '\t') // So we can call this function multiple times (FIXME: Flaky) + Glyphs.resize(Glyphs.Size + 1); + ImFontGlyph& tab_glyph = Glyphs.back(); + tab_glyph = *FindGlyph((ImWchar)' '); + tab_glyph.Codepoint = '\t'; + tab_glyph.AdvanceX *= IM_TABSIZE; + IndexAdvanceX[(int)tab_glyph.Codepoint] = (float)tab_glyph.AdvanceX; + IndexLookup[(int)tab_glyph.Codepoint] = (ImWchar)(Glyphs.Size - 1); + } + + // Mark special glyphs as not visible (note that AddGlyph already mark as non-visible glyphs with zero-size polygons) + SetGlyphVisible((ImWchar)' ', false); + SetGlyphVisible((ImWchar)'\t', false); + + // Ellipsis character is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis). + // However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character. + // FIXME: Note that 0x2026 is rarely included in our font ranges. Because of this we are more likely to use three individual dots. + const ImWchar ellipsis_chars[] = { (ImWchar)0x2026, (ImWchar)0x0085 }; + const ImWchar dots_chars[] = { (ImWchar)'.', (ImWchar)0xFF0E }; + if (EllipsisChar == (ImWchar)-1) + EllipsisChar = FindFirstExistingGlyph(this, ellipsis_chars, IM_ARRAYSIZE(ellipsis_chars)); + if (DotChar == (ImWchar)-1) + DotChar = FindFirstExistingGlyph(this, dots_chars, IM_ARRAYSIZE(dots_chars)); + + // Setup fallback character + const ImWchar fallback_chars[] = { (ImWchar)IM_UNICODE_CODEPOINT_INVALID, (ImWchar)'?', (ImWchar)' ' }; + FallbackGlyph = FindGlyphNoFallback(FallbackChar); + if (FallbackGlyph == NULL) + { + FallbackChar = FindFirstExistingGlyph(this, fallback_chars, IM_ARRAYSIZE(fallback_chars)); + FallbackGlyph = FindGlyphNoFallback(FallbackChar); + if (FallbackGlyph == NULL) + { + FallbackGlyph = &Glyphs.back(); + FallbackChar = (ImWchar)FallbackGlyph->Codepoint; + } + } + + FallbackAdvanceX = FallbackGlyph->AdvanceX; + for (int i = 0; i < max_codepoint + 1; i++) + if (IndexAdvanceX[i] < 0.0f) + IndexAdvanceX[i] = FallbackAdvanceX; +} + +// API is designed this way to avoid exposing the 4K page size +// e.g. use with IsGlyphRangeUnused(0, 255) +bool ImFont::IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last) +{ + unsigned int page_begin = (c_begin / 4096); + unsigned int page_last = (c_last / 4096); + for (unsigned int page_n = page_begin; page_n <= page_last; page_n++) + if ((page_n >> 3) < sizeof(Used4kPagesMap)) + if (Used4kPagesMap[page_n >> 3] & (1 << (page_n & 7))) + return false; + return true; +} + +void ImFont::SetGlyphVisible(ImWchar c, bool visible) +{ + if (ImFontGlyph* glyph = (ImFontGlyph*)(void*)FindGlyph((ImWchar)c)) + glyph->Visible = visible ? 1 : 0; +} + +void ImFont::GrowIndex(int new_size) +{ + IM_ASSERT(IndexAdvanceX.Size == IndexLookup.Size); + if (new_size <= IndexLookup.Size) + return; + IndexAdvanceX.resize(new_size, -1.0f); + IndexLookup.resize(new_size, (ImWchar)-1); +} + +// x0/y0/x1/y1 are offset from the character upper-left layout position, in pixels. Therefore x0/y0 are often fairly close to zero. +// Not to be mistaken with texture coordinates, which are held by u0/v0/u1/v1 in normalized format (0.0..1.0 on each texture axis). +// 'cfg' is not necessarily == 'this->ConfigData' because multiple source fonts+configs can be used to build one target font. +void ImFont::AddGlyph(const ImFontConfig* cfg, ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x) +{ + if (cfg != NULL) + { + // Clamp & recenter if needed + const float advance_x_original = advance_x; + advance_x = ImClamp(advance_x, cfg->GlyphMinAdvanceX, cfg->GlyphMaxAdvanceX); + if (advance_x != advance_x_original) + { + float char_off_x = cfg->PixelSnapH ? ImFloor((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f; + x0 += char_off_x; + x1 += char_off_x; + } + + // Snap to pixel + if (cfg->PixelSnapH) + advance_x = IM_ROUND(advance_x); + + // Bake spacing + advance_x += cfg->GlyphExtraSpacing.x; + } + + Glyphs.resize(Glyphs.Size + 1); + ImFontGlyph& glyph = Glyphs.back(); + glyph.Codepoint = (unsigned int)codepoint; + glyph.Visible = (x0 != x1) && (y0 != y1); + glyph.Colored = false; + glyph.X0 = x0; + glyph.Y0 = y0; + glyph.X1 = x1; + glyph.Y1 = y1; + glyph.U0 = u0; + glyph.V0 = v0; + glyph.U1 = u1; + glyph.V1 = v1; + glyph.AdvanceX = advance_x; + + // Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round) + // We use (U1-U0)*TexWidth instead of X1-X0 to account for oversampling. + float pad = ContainerAtlas->TexGlyphPadding + 0.99f; + DirtyLookupTables = true; + MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + pad) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + pad); +} + +void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst) +{ + IM_ASSERT(IndexLookup.Size > 0); // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function. + unsigned int index_size = (unsigned int)IndexLookup.Size; + + if (dst < index_size && IndexLookup.Data[dst] == (ImWchar)-1 && !overwrite_dst) // 'dst' already exists + return; + if (src >= index_size && dst >= index_size) // both 'dst' and 'src' don't exist -> no-op + return; + + GrowIndex(dst + 1); + IndexLookup[dst] = (src < index_size) ? IndexLookup.Data[src] : (ImWchar)-1; + IndexAdvanceX[dst] = (src < index_size) ? IndexAdvanceX.Data[src] : 1.0f; +} + +const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const +{ + if (c >= (size_t)IndexLookup.Size) + return FallbackGlyph; + const ImWchar i = IndexLookup.Data[c]; + if (i == (ImWchar)-1) + return FallbackGlyph; + return &Glyphs.Data[i]; +} + +const ImFontGlyph* ImFont::FindGlyphNoFallback(ImWchar c) const +{ + if (c >= (size_t)IndexLookup.Size) + return NULL; + const ImWchar i = IndexLookup.Data[c]; + if (i == (ImWchar)-1) + return NULL; + return &Glyphs.Data[i]; +} + +const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const +{ + // Simple word-wrapping for English, not full-featured. Please submit failing cases! + // FIXME: Much possible improvements (don't cut things like "word !", "word!!!" but cut within "word,,,,", more sensible support for punctuations, support for Unicode punctuations, etc.) + + // For references, possible wrap point marked with ^ + // "aaa bbb, ccc,ddd. eee fff. ggg!" + // ^ ^ ^ ^ ^__ ^ ^ + + // List of hardcoded separators: .,;!?'" + + // Skip extra blanks after a line returns (that includes not counting them in width computation) + // e.g. "Hello world" --> "Hello" "World" + + // Cut words that cannot possibly fit within one line. + // e.g.: "The tropical fish" with ~5 characters worth of width --> "The tr" "opical" "fish" + + float line_width = 0.0f; + float word_width = 0.0f; + float blank_width = 0.0f; + wrap_width /= scale; // We work with unscaled widths to avoid scaling every characters + + const char* word_end = text; + const char* prev_word_end = NULL; + bool inside_word = true; + + const char* s = text; + while (s < text_end) + { + unsigned int c = (unsigned int)*s; + const char* next_s; + if (c < 0x80) + next_s = s + 1; + else + next_s = s + ImTextCharFromUtf8(&c, s, text_end); + if (c == 0) + break; + + if (c < 32) + { + if (c == '\n') + { + line_width = word_width = blank_width = 0.0f; + inside_word = true; + s = next_s; + continue; + } + if (c == '\r') + { + s = next_s; + continue; + } + } + + const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX); + if (ImCharIsBlankW(c)) + { + if (inside_word) + { + line_width += blank_width; + blank_width = 0.0f; + word_end = s; + } + blank_width += char_width; + inside_word = false; + } + else + { + word_width += char_width; + if (inside_word) + { + word_end = next_s; + } + else + { + prev_word_end = word_end; + line_width += word_width + blank_width; + word_width = blank_width = 0.0f; + } + + // Allow wrapping after punctuation. + inside_word = (c != '.' && c != ',' && c != ';' && c != '!' && c != '?' && c != '\"'); + } + + // We ignore blank width at the end of the line (they can be skipped) + if (line_width + word_width > wrap_width) + { + // Words that cannot possibly fit within an entire line will be cut anywhere. + if (word_width < wrap_width) + s = prev_word_end ? prev_word_end : word_end; + break; + } + + s = next_s; + } + + return s; +} + +ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end, const char** remaining) const +{ + if (!text_end) + text_end = text_begin + strlen(text_begin); // FIXME-OPT: Need to avoid this. + + const float line_height = size; + const float scale = size / FontSize; + + ImVec2 text_size = ImVec2(0, 0); + float line_width = 0.0f; + + const bool word_wrap_enabled = (wrap_width > 0.0f); + const char* word_wrap_eol = NULL; + + const char* s = text_begin; + while (s < text_end) + { + if (word_wrap_enabled) + { + // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature. + if (!word_wrap_eol) + { + word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - line_width); + if (word_wrap_eol == s) // Wrap_width is too small to fit anything. Force displaying 1 character to minimize the height discontinuity. + word_wrap_eol++; // +1 may not be a character start point in UTF-8 but it's ok because we use s >= word_wrap_eol below + } + + if (s >= word_wrap_eol) + { + if (text_size.x < line_width) + text_size.x = line_width; + text_size.y += line_height; + line_width = 0.0f; + word_wrap_eol = NULL; + + // Wrapping skips upcoming blanks + while (s < text_end) + { + const char c = *s; + if (ImCharIsBlankA(c)) { s++; } else if (c == '\n') { s++; break; } else { break; } + } + continue; + } + } + + // Decode and advance source + const char* prev_s = s; + unsigned int c = (unsigned int)*s; + if (c < 0x80) + { + s += 1; + } + else + { + s += ImTextCharFromUtf8(&c, s, text_end); + if (c == 0) // Malformed UTF-8? + break; + } + + if (c < 32) + { + if (c == '\n') + { + text_size.x = ImMax(text_size.x, line_width); + text_size.y += line_height; + line_width = 0.0f; + continue; + } + if (c == '\r') + continue; + } + + const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX) * scale; + if (line_width + char_width >= max_width) + { + s = prev_s; + break; + } + + line_width += char_width; + } + + if (text_size.x < line_width) + text_size.x = line_width; + + if (line_width > 0 || text_size.y == 0.0f) + text_size.y += line_height; + + if (remaining) + *remaining = s; + + return text_size; +} + +// Note: as with every ImDrawList drawing function, this expects that the font atlas texture is bound. +void ImFont::RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c) const +{ + const ImFontGlyph* glyph = FindGlyph(c); + if (!glyph || !glyph->Visible) + return; + if (glyph->Colored) + col |= ~IM_COL32_A_MASK; + float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f; + float x = IM_FLOOR(pos.x); + float y = IM_FLOOR(pos.y); + draw_list->PrimReserve(6, 4); + draw_list->PrimRectUV(ImVec2(x + glyph->X0 * scale, y + glyph->Y0 * scale), ImVec2(x + glyph->X1 * scale, y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col); +} + +// Note: as with every ImDrawList drawing function, this expects that the font atlas texture is bound. +void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const +{ + if (!text_end) + text_end = text_begin + strlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls. + + // Align to be pixel perfect + float x = IM_FLOOR(pos.x); + float y = IM_FLOOR(pos.y); + if (y > clip_rect.w) + return; + + const float start_x = x; + const float scale = size / FontSize; + const float line_height = FontSize * scale; + const bool word_wrap_enabled = (wrap_width > 0.0f); + const char* word_wrap_eol = NULL; + + // Fast-forward to first visible line + const char* s = text_begin; + if (y + line_height < clip_rect.y && !word_wrap_enabled) + while (y + line_height < clip_rect.y && s < text_end) + { + s = (const char*)memchr(s, '\n', text_end - s); + s = s ? s + 1 : text_end; + y += line_height; + } + + // For large text, scan for the last visible line in order to avoid over-reserving in the call to PrimReserve() + // Note that very large horizontal line will still be affected by the issue (e.g. a one megabyte string buffer without a newline will likely crash atm) + if (text_end - s > 10000 && !word_wrap_enabled) + { + const char* s_end = s; + float y_end = y; + while (y_end < clip_rect.w && s_end < text_end) + { + s_end = (const char*)memchr(s_end, '\n', text_end - s_end); + s_end = s_end ? s_end + 1 : text_end; + y_end += line_height; + } + text_end = s_end; + } + if (s == text_end) + return; + + // Reserve vertices for remaining worse case (over-reserving is useful and easily amortized) + const int vtx_count_max = (int)(text_end - s) * 4; + const int idx_count_max = (int)(text_end - s) * 6; + const int idx_expected_size = draw_list->IdxBuffer.Size + idx_count_max; + draw_list->PrimReserve(idx_count_max, vtx_count_max); + + ImDrawVert* vtx_write = draw_list->_VtxWritePtr; + ImDrawIdx* idx_write = draw_list->_IdxWritePtr; + unsigned int vtx_current_idx = draw_list->_VtxCurrentIdx; + + const ImU32 col_untinted = col | ~IM_COL32_A_MASK; + + while (s < text_end) + { + if (word_wrap_enabled) + { + // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature. + if (!word_wrap_eol) + { + word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - (x - start_x)); + if (word_wrap_eol == s) // Wrap_width is too small to fit anything. Force displaying 1 character to minimize the height discontinuity. + word_wrap_eol++; // +1 may not be a character start point in UTF-8 but it's ok because we use s >= word_wrap_eol below + } + + if (s >= word_wrap_eol) + { + x = start_x; + y += line_height; + word_wrap_eol = NULL; + + // Wrapping skips upcoming blanks + while (s < text_end) + { + const char c = *s; + if (ImCharIsBlankA(c)) { s++; } else if (c == '\n') { s++; break; } else { break; } + } + continue; + } + } + + // Decode and advance source + unsigned int c = (unsigned int)*s; + if (c < 0x80) + { + s += 1; + } + else + { + s += ImTextCharFromUtf8(&c, s, text_end); + if (c == 0) // Malformed UTF-8? + break; + } + + if (c < 32) + { + if (c == '\n') + { + x = start_x; + y += line_height; + if (y > clip_rect.w) + break; // break out of main loop + continue; + } + if (c == '\r') + continue; + } + + const ImFontGlyph* glyph = FindGlyph((ImWchar)c); + if (glyph == NULL) + continue; + + float char_width = glyph->AdvanceX * scale; + if (glyph->Visible) + { + // We don't do a second finer clipping test on the Y axis as we've already skipped anything before clip_rect.y and exit once we pass clip_rect.w + float x1 = x + glyph->X0 * scale; + float x2 = x + glyph->X1 * scale; + float y1 = y + glyph->Y0 * scale; + float y2 = y + glyph->Y1 * scale; + if (x1 <= clip_rect.z && x2 >= clip_rect.x) + { + // Render a character + float u1 = glyph->U0; + float v1 = glyph->V0; + float u2 = glyph->U1; + float v2 = glyph->V1; + + // CPU side clipping used to fit text in their frame when the frame is too small. Only does clipping for axis aligned quads. + if (cpu_fine_clip) + { + if (x1 < clip_rect.x) + { + u1 = u1 + (1.0f - (x2 - clip_rect.x) / (x2 - x1)) * (u2 - u1); + x1 = clip_rect.x; + } + if (y1 < clip_rect.y) + { + v1 = v1 + (1.0f - (y2 - clip_rect.y) / (y2 - y1)) * (v2 - v1); + y1 = clip_rect.y; + } + if (x2 > clip_rect.z) + { + u2 = u1 + ((clip_rect.z - x1) / (x2 - x1)) * (u2 - u1); + x2 = clip_rect.z; + } + if (y2 > clip_rect.w) + { + v2 = v1 + ((clip_rect.w - y1) / (y2 - y1)) * (v2 - v1); + y2 = clip_rect.w; + } + if (y1 >= y2) + { + x += char_width; + continue; + } + } + + // Support for untinted glyphs + ImU32 glyph_col = glyph->Colored ? col_untinted : col; + + // We are NOT calling PrimRectUV() here because non-inlined causes too much overhead in a debug builds. Inlined here: + { + idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2); + idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3); + vtx_write[0].pos.x = x1; vtx_write[0].pos.y = y1; vtx_write[0].col = glyph_col; vtx_write[0].uv.x = u1; vtx_write[0].uv.y = v1; + vtx_write[1].pos.x = x2; vtx_write[1].pos.y = y1; vtx_write[1].col = glyph_col; vtx_write[1].uv.x = u2; vtx_write[1].uv.y = v1; + vtx_write[2].pos.x = x2; vtx_write[2].pos.y = y2; vtx_write[2].col = glyph_col; vtx_write[2].uv.x = u2; vtx_write[2].uv.y = v2; + vtx_write[3].pos.x = x1; vtx_write[3].pos.y = y2; vtx_write[3].col = glyph_col; vtx_write[3].uv.x = u1; vtx_write[3].uv.y = v2; + vtx_write += 4; + vtx_current_idx += 4; + idx_write += 6; + } + } + } + x += char_width; + } + + // Give back unused vertices (clipped ones, blanks) ~ this is essentially a PrimUnreserve() action. + draw_list->VtxBuffer.Size = (int)(vtx_write - draw_list->VtxBuffer.Data); // Same as calling shrink() + draw_list->IdxBuffer.Size = (int)(idx_write - draw_list->IdxBuffer.Data); + draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size); + draw_list->_VtxWritePtr = vtx_write; + draw_list->_IdxWritePtr = idx_write; + draw_list->_VtxCurrentIdx = vtx_current_idx; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGui Internal Render Helpers +//----------------------------------------------------------------------------- +// Vaguely redesigned to stop accessing ImGui global state: +// - RenderArrow() +// - RenderBullet() +// - RenderCheckMark() +// - RenderArrowPointingAt() +// - RenderRectFilledRangeH() +// - RenderRectFilledWithHole() +//----------------------------------------------------------------------------- +// Function in need of a redesign (legacy mess) +// - RenderColorRectWithAlphaCheckerboard() +//----------------------------------------------------------------------------- + +// Render an arrow aimed to be aligned with text (p_min is a position in the same space text would be positioned). To e.g. denote expanded/collapsed state +void ImGui::RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale) +{ + const float h = draw_list->_Data->FontSize * 1.00f; + float r = h * 0.40f * scale; + ImVec2 center = pos + ImVec2(h * 0.50f, h * 0.50f * scale); + + ImVec2 a, b, c; + switch (dir) + { + case ImGuiDir_Up: + case ImGuiDir_Down: + if (dir == ImGuiDir_Up) r = -r; + a = ImVec2(+0.000f, +0.750f) * r; + b = ImVec2(-0.866f, -0.750f) * r; + c = ImVec2(+0.866f, -0.750f) * r; + break; + case ImGuiDir_Left: + case ImGuiDir_Right: + if (dir == ImGuiDir_Left) r = -r; + a = ImVec2(+0.750f, +0.000f) * r; + b = ImVec2(-0.750f, +0.866f) * r; + c = ImVec2(-0.750f, -0.866f) * r; + break; + case ImGuiDir_None: + case ImGuiDir_COUNT: + IM_ASSERT(0); + break; + } + draw_list->AddTriangleFilled(center + a, center + b, center + c, col); +} + +void ImGui::RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col) +{ + draw_list->AddCircleFilled(pos, draw_list->_Data->FontSize * 0.20f, col, 8); +} + +void ImGui::RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz) +{ + float thickness = ImMax(sz / 5.0f, 1.0f); + sz -= thickness * 0.5f; + pos += ImVec2(thickness * 0.25f, thickness * 0.25f); + + float third = sz / 3.0f; + float bx = pos.x + third; + float by = pos.y + sz - third * 0.5f; + draw_list->PathLineTo(ImVec2(bx - third, by - third)); + draw_list->PathLineTo(ImVec2(bx, by)); + draw_list->PathLineTo(ImVec2(bx + third * 2.0f, by - third * 2.0f)); + draw_list->PathStroke(col, 0, thickness); +} + +// Render an arrow. 'pos' is position of the arrow tip. half_sz.x is length from base to tip. half_sz.y is length on each side. +void ImGui::RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col) +{ + switch (direction) + { + case ImGuiDir_Left: draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), pos, col); return; + case ImGuiDir_Right: draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), pos, col); return; + case ImGuiDir_Up: draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), pos, col); return; + case ImGuiDir_Down: draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), pos, col); return; + case ImGuiDir_None: case ImGuiDir_COUNT: break; // Fix warnings + } +} + +static inline float ImAcos01(float x) +{ + if (x <= 0.0f) return IM_PI * 0.5f; + if (x >= 1.0f) return 0.0f; + return ImAcos(x); + //return (-0.69813170079773212f * x * x - 0.87266462599716477f) * x + 1.5707963267948966f; // Cheap approximation, may be enough for what we do. +} + +// FIXME: Cleanup and move code to ImDrawList. +void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding) +{ + if (x_end_norm == x_start_norm) + return; + if (x_start_norm > x_end_norm) + ImSwap(x_start_norm, x_end_norm); + + ImVec2 p0 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_start_norm), rect.Min.y); + ImVec2 p1 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_end_norm), rect.Max.y); + if (rounding == 0.0f) + { + draw_list->AddRectFilled(p0, p1, col, 0.0f); + return; + } + + rounding = ImClamp(ImMin((rect.Max.x - rect.Min.x) * 0.5f, (rect.Max.y - rect.Min.y) * 0.5f) - 1.0f, 0.0f, rounding); + const float inv_rounding = 1.0f / rounding; + const float arc0_b = ImAcos01(1.0f - (p0.x - rect.Min.x) * inv_rounding); + const float arc0_e = ImAcos01(1.0f - (p1.x - rect.Min.x) * inv_rounding); + const float half_pi = IM_PI * 0.5f; // We will == compare to this because we know this is the exact value ImAcos01 can return. + const float x0 = ImMax(p0.x, rect.Min.x + rounding); + if (arc0_b == arc0_e) + { + draw_list->PathLineTo(ImVec2(x0, p1.y)); + draw_list->PathLineTo(ImVec2(x0, p0.y)); + } + else if (arc0_b == 0.0f && arc0_e == half_pi) + { + draw_list->PathArcToFast(ImVec2(x0, p1.y - rounding), rounding, 3, 6); // BL + draw_list->PathArcToFast(ImVec2(x0, p0.y + rounding), rounding, 6, 9); // TR + } + else + { + draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b, 3); // BL + draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e, 3); // TR + } + if (p1.x > rect.Min.x + rounding) + { + const float arc1_b = ImAcos01(1.0f - (rect.Max.x - p1.x) * inv_rounding); + const float arc1_e = ImAcos01(1.0f - (rect.Max.x - p0.x) * inv_rounding); + const float x1 = ImMin(p1.x, rect.Max.x - rounding); + if (arc1_b == arc1_e) + { + draw_list->PathLineTo(ImVec2(x1, p0.y)); + draw_list->PathLineTo(ImVec2(x1, p1.y)); + } + else if (arc1_b == 0.0f && arc1_e == half_pi) + { + draw_list->PathArcToFast(ImVec2(x1, p0.y + rounding), rounding, 9, 12); // TR + draw_list->PathArcToFast(ImVec2(x1, p1.y - rounding), rounding, 0, 3); // BR + } + else + { + draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b, 3); // TR + draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e, 3); // BR + } + } + draw_list->PathFillConvex(col); +} + +void ImGui::RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding) +{ + const bool fill_L = (inner.Min.x > outer.Min.x); + const bool fill_R = (inner.Max.x < outer.Max.x); + const bool fill_U = (inner.Min.y > outer.Min.y); + const bool fill_D = (inner.Max.y < outer.Max.y); + if (fill_L) draw_list->AddRectFilled(ImVec2(outer.Min.x, inner.Min.y), ImVec2(inner.Min.x, inner.Max.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_U ? 0 : ImDrawFlags_RoundCornersTopLeft) | (fill_D ? 0 : ImDrawFlags_RoundCornersBottomLeft)); + if (fill_R) draw_list->AddRectFilled(ImVec2(inner.Max.x, inner.Min.y), ImVec2(outer.Max.x, inner.Max.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_U ? 0 : ImDrawFlags_RoundCornersTopRight) | (fill_D ? 0 : ImDrawFlags_RoundCornersBottomRight)); + if (fill_U) draw_list->AddRectFilled(ImVec2(inner.Min.x, outer.Min.y), ImVec2(inner.Max.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_L ? 0 : ImDrawFlags_RoundCornersTopLeft) | (fill_R ? 0 : ImDrawFlags_RoundCornersTopRight)); + if (fill_D) draw_list->AddRectFilled(ImVec2(inner.Min.x, inner.Max.y), ImVec2(inner.Max.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_L ? 0 : ImDrawFlags_RoundCornersBottomLeft) | (fill_R ? 0 : ImDrawFlags_RoundCornersBottomRight)); + if (fill_L && fill_U) draw_list->AddRectFilled(ImVec2(outer.Min.x, outer.Min.y), ImVec2(inner.Min.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersTopLeft); + if (fill_R && fill_U) draw_list->AddRectFilled(ImVec2(inner.Max.x, outer.Min.y), ImVec2(outer.Max.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersTopRight); + if (fill_L && fill_D) draw_list->AddRectFilled(ImVec2(outer.Min.x, inner.Max.y), ImVec2(inner.Min.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersBottomLeft); + if (fill_R && fill_D) draw_list->AddRectFilled(ImVec2(inner.Max.x, inner.Max.y), ImVec2(outer.Max.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersBottomRight); +} + +// Helper for ColorPicker4() +// NB: This is rather brittle and will show artifact when rounding this enabled if rounded corners overlap multiple cells. Caller currently responsible for avoiding that. +// Spent a non reasonable amount of time trying to getting this right for ColorButton with rounding+anti-aliasing+ImGuiColorEditFlags_HalfAlphaPreview flag + various grid sizes and offsets, and eventually gave up... probably more reasonable to disable rounding altogether. +// FIXME: uses ImGui::GetColorU32 +void ImGui::RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 col, float grid_step, ImVec2 grid_off, float rounding, ImDrawFlags flags) +{ + if ((flags & ImDrawFlags_RoundCornersMask_) == 0) + flags = ImDrawFlags_RoundCornersDefault_; + if (((col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT) < 0xFF) + { + ImU32 col_bg1 = GetColorU32(ImAlphaBlendColors(IM_COL32(204, 204, 204, 255), col)); + ImU32 col_bg2 = GetColorU32(ImAlphaBlendColors(IM_COL32(128, 128, 128, 255), col)); + draw_list->AddRectFilled(p_min, p_max, col_bg1, rounding, flags); + + int yi = 0; + for (float y = p_min.y + grid_off.y; y < p_max.y; y += grid_step, yi++) + { + float y1 = ImClamp(y, p_min.y, p_max.y), y2 = ImMin(y + grid_step, p_max.y); + if (y2 <= y1) + continue; + for (float x = p_min.x + grid_off.x + (yi & 1) * grid_step; x < p_max.x; x += grid_step * 2.0f) + { + float x1 = ImClamp(x, p_min.x, p_max.x), x2 = ImMin(x + grid_step, p_max.x); + if (x2 <= x1) + continue; + ImDrawFlags cell_flags = ImDrawFlags_RoundCornersNone; + if (y1 <= p_min.y) { if (x1 <= p_min.x) cell_flags |= ImDrawFlags_RoundCornersTopLeft; if (x2 >= p_max.x) cell_flags |= ImDrawFlags_RoundCornersTopRight; } + if (y2 >= p_max.y) { if (x1 <= p_min.x) cell_flags |= ImDrawFlags_RoundCornersBottomLeft; if (x2 >= p_max.x) cell_flags |= ImDrawFlags_RoundCornersBottomRight; } + + // Combine flags + cell_flags = (flags == ImDrawFlags_RoundCornersNone || cell_flags == ImDrawFlags_RoundCornersNone) ? ImDrawFlags_RoundCornersNone : (cell_flags & flags); + draw_list->AddRectFilled(ImVec2(x1, y1), ImVec2(x2, y2), col_bg2, rounding, cell_flags); + } + } + } + else + { + draw_list->AddRectFilled(p_min, p_max, col, rounding, flags); + } +} + +//----------------------------------------------------------------------------- +// [SECTION] Decompression code +//----------------------------------------------------------------------------- +// Compressed with stb_compress() then converted to a C array and encoded as base85. +// Use the program in misc/fonts/binary_to_compressed_c.cpp to create the array from a TTF file. +// The purpose of encoding as base85 instead of "0x00,0x01,..." style is only save on _source code_ size. +// Decompression from stb.h (public domain) by Sean Barrett https://github.com/nothings/stb/blob/master/stb.h +//----------------------------------------------------------------------------- + +static unsigned int stb_decompress_length(const unsigned char *input) +{ + return (input[8] << 24) + (input[9] << 16) + (input[10] << 8) + input[11]; +} + +static unsigned char *stb__barrier_out_e, *stb__barrier_out_b; +static const unsigned char *stb__barrier_in_b; +static unsigned char *stb__dout; +static void stb__match(const unsigned char *data, unsigned int length) +{ + // INVERSE of memmove... write each byte before copying the next... + IM_ASSERT(stb__dout + length <= stb__barrier_out_e); + if (stb__dout + length > stb__barrier_out_e) { stb__dout += length; return; } + if (data < stb__barrier_out_b) { stb__dout = stb__barrier_out_e+1; return; } + while (length--) *stb__dout++ = *data++; +} + +static void stb__lit(const unsigned char *data, unsigned int length) +{ + IM_ASSERT(stb__dout + length <= stb__barrier_out_e); + if (stb__dout + length > stb__barrier_out_e) { stb__dout += length; return; } + if (data < stb__barrier_in_b) { stb__dout = stb__barrier_out_e+1; return; } + memcpy(stb__dout, data, length); + stb__dout += length; +} + +#define stb__in2(x) ((i[x] << 8) + i[(x)+1]) +#define stb__in3(x) ((i[x] << 16) + stb__in2((x)+1)) +#define stb__in4(x) ((i[x] << 24) + stb__in3((x)+1)) + +static const unsigned char *stb_decompress_token(const unsigned char *i) +{ + if (*i >= 0x20) { // use fewer if's for cases that expand small + if (*i >= 0x80) stb__match(stb__dout-i[1]-1, i[0] - 0x80 + 1), i += 2; + else if (*i >= 0x40) stb__match(stb__dout-(stb__in2(0) - 0x4000 + 1), i[2]+1), i += 3; + else /* *i >= 0x20 */ stb__lit(i+1, i[0] - 0x20 + 1), i += 1 + (i[0] - 0x20 + 1); + } else { // more ifs for cases that expand large, since overhead is amortized + if (*i >= 0x18) stb__match(stb__dout-(stb__in3(0) - 0x180000 + 1), i[3]+1), i += 4; + else if (*i >= 0x10) stb__match(stb__dout-(stb__in3(0) - 0x100000 + 1), stb__in2(3)+1), i += 5; + else if (*i >= 0x08) stb__lit(i+2, stb__in2(0) - 0x0800 + 1), i += 2 + (stb__in2(0) - 0x0800 + 1); + else if (*i == 0x07) stb__lit(i+3, stb__in2(1) + 1), i += 3 + (stb__in2(1) + 1); + else if (*i == 0x06) stb__match(stb__dout-(stb__in3(1)+1), i[4]+1), i += 5; + else if (*i == 0x04) stb__match(stb__dout-(stb__in3(1)+1), stb__in2(4)+1), i += 6; + } + return i; +} + +static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, unsigned int buflen) +{ + const unsigned long ADLER_MOD = 65521; + unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; + unsigned long blocklen = buflen % 5552; + + unsigned long i; + while (buflen) { + for (i=0; i + 7 < blocklen; i += 8) { + s1 += buffer[0], s2 += s1; + s1 += buffer[1], s2 += s1; + s1 += buffer[2], s2 += s1; + s1 += buffer[3], s2 += s1; + s1 += buffer[4], s2 += s1; + s1 += buffer[5], s2 += s1; + s1 += buffer[6], s2 += s1; + s1 += buffer[7], s2 += s1; + + buffer += 8; + } + + for (; i < blocklen; ++i) + s1 += *buffer++, s2 += s1; + + s1 %= ADLER_MOD, s2 %= ADLER_MOD; + buflen -= blocklen; + blocklen = 5552; + } + return (unsigned int)(s2 << 16) + (unsigned int)s1; +} + +static unsigned int stb_decompress(unsigned char *output, const unsigned char *i, unsigned int /*length*/) +{ + if (stb__in4(0) != 0x57bC0000) return 0; + if (stb__in4(4) != 0) return 0; // error! stream is > 4GB + const unsigned int olen = stb_decompress_length(i); + stb__barrier_in_b = i; + stb__barrier_out_e = output + olen; + stb__barrier_out_b = output; + i += 16; + + stb__dout = output; + for (;;) { + const unsigned char *old_i = i; + i = stb_decompress_token(i); + if (i == old_i) { + if (*i == 0x05 && i[1] == 0xfa) { + IM_ASSERT(stb__dout == output + olen); + if (stb__dout != output + olen) return 0; + if (stb_adler32(1, output, olen) != (unsigned int) stb__in4(2)) + return 0; + return olen; + } else { + IM_ASSERT(0); /* NOTREACHED */ + return 0; + } + } + IM_ASSERT(stb__dout <= output + olen); + if (stb__dout > output + olen) + return 0; + } +} + +//----------------------------------------------------------------------------- +// [SECTION] Default font data (ProggyClean.ttf) +//----------------------------------------------------------------------------- +// ProggyClean.ttf +// Copyright (c) 2004, 2005 Tristan Grimmer +// MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip) +// Download and more information at http://upperbounds.net +//----------------------------------------------------------------------------- +// File: 'ProggyClean.ttf' (41208 bytes) +// Exported using misc/fonts/binary_to_compressed_c.cpp (with compression + base85 string encoding). +// The purpose of encoding as base85 instead of "0x00,0x01,..." style is only save on _source code_ size. +//----------------------------------------------------------------------------- +static const char proggy_clean_ttf_compressed_data_base85[11980 + 1] = + "7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/" + "2*>]b(MC;$jPfY.;h^`IWM9Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1=Ke$$'5F%)]0^#0X@U.a$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;--VsM.M0rJfLH2eTM`*oJMHRC`N" + "kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`�j@'DbG&#^$PG.Ll+DNa&VZ>1i%h1S9u5o@YaaW$e+bROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc." + "x]Ip.PH^'/aqUO/$1WxLoW0[iLAw=4h(9.`G" + "CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?Ggv:[7MI2k).'2($5FNP&EQ(,)" + "U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#" + "'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM" + "_3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu" + "Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/" + "/oL?#h7gl85[qW/NDOk%16ij;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%%`kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[Ket`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO" + "j%2n8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%" + "LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$MhLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]" + "%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et" + "Hg*`+RLgv>=4U8guD$I%D:W>-r5V*%j*W:Kvej.Lp$'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%upV1g:" + "a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VBpqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<-+k?'(^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M" + "D?@f&1'BW-)Ju#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX(" + "P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs" + "bIu)'Z,*[>br5fX^:FPAWr-m2KgLQ_nN6'8uTGT5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q" + "h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aege0jT6'N#(q%.O=?2S]u*(m<-" + "V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i" + "sZ88+dKQ)W6>J%CL`.d*(B`-n8D9oK-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P r+$%CE=68>K8r0=dSC%%(@p7" + ".m7jilQ02'0-VWAgTlGW'b)Tq7VT9q^*^$$.:&N@@" + "$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*" + "hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u" + "@-W$U%VEQ/,,>>#)D#%8cY#YZ?=,`Wdxu/ae&#" + "w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$so8lKN%5/$(vdfq7+ebA#" + "u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G[RMxJs[0MM%wci.LFDK)(%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u%lJj+D-r;BoFDoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8" + "6e%B/:=>)N4xeW.*wft-;$'58-ESqr#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#" + "b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjLV#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#SfD07&6D@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a,hC=0u+HlsV>nuIQL-5" + "_>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-Gb%" + "hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;" + "^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmLq9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%is00:" + "+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3$U4O]GKx'm9)b@p7YsvK3w^YR-" + "CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*" + "hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdFTi1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IXSsDiWP,##P`%/L-" + "S(qw%sf/@%#B6;/U7K]uZbi^Oc^2n%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdFl*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj" + "M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#$(>.Z-I&J(Q0Hd5Q%7Co-b`-cP)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8WlA2);Sa" + ">gXm8YB`1d@K#n]76-a$U,mF%Ul:#/'xoFM9QX-$.QN'>" + "[%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I" + "wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-uW%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)" + "i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo" + "1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P" + "iDDG)g,r%+?,$@?uou5tSe2aN_AQU*'IAO" + "URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#" + ";u.T%fAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T" + "w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4" + "A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#" + "/QHC#3^ZC#7jmC#;v)D#?,)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP" + "GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp" + "O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#"; + +static const char* GetDefaultCompressedFontDataTTFBase85() +{ + return proggy_clean_ttf_compressed_data_base85; +} + +#endif // #ifndef IMGUI_DISABLE diff --git a/3rdparty/imgui/src/imgui_stdlib.cpp b/3rdparty/imgui/src/imgui_stdlib.cpp new file mode 100644 index 0000000000..dd6bd8a52e --- /dev/null +++ b/3rdparty/imgui/src/imgui_stdlib.cpp @@ -0,0 +1,72 @@ +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) +// This is also an example of how you may wrap your own similar types. + +// Changelog: +// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string + +#include "imgui.h" +#include "imgui_stdlib.h" + +struct InputTextCallback_UserData +{ + std::string* Str; + ImGuiInputTextCallback ChainCallback; + void* ChainCallbackUserData; +}; + +static int InputTextCallback(ImGuiInputTextCallbackData* data) +{ + InputTextCallback_UserData* user_data = (InputTextCallback_UserData*)data->UserData; + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) + { + // Resize string callback + // If for some reason we refuse the new length (BufTextLen) and/or capacity (BufSize) we need to set them back to what we want. + std::string* str = user_data->Str; + IM_ASSERT(data->Buf == str->c_str()); + str->resize(data->BufTextLen); + data->Buf = (char*)str->c_str(); + } + else if (user_data->ChainCallback) + { + // Forward to user callback, if any + data->UserData = user_data->ChainCallbackUserData; + return user_data->ChainCallback(data); + } + return 0; +} + +bool ImGui::InputText(const char* label, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputText(label, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); +} + +bool ImGui::InputTextMultiline(const char* label, std::string* str, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputTextMultiline(label, (char*)str->c_str(), str->capacity() + 1, size, flags, InputTextCallback, &cb_user_data); +} + +bool ImGui::InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputTextWithHint(label, hint, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); +} diff --git a/3rdparty/imgui/src/imgui_tables.cpp b/3rdparty/imgui/src/imgui_tables.cpp new file mode 100644 index 0000000000..bf04f44b54 --- /dev/null +++ b/3rdparty/imgui/src/imgui_tables.cpp @@ -0,0 +1,4068 @@ +// dear imgui, v1.88 WIP +// (tables and columns code) + +/* + +Index of this file: + +// [SECTION] Commentary +// [SECTION] Header mess +// [SECTION] Tables: Main code +// [SECTION] Tables: Simple accessors +// [SECTION] Tables: Row changes +// [SECTION] Tables: Columns changes +// [SECTION] Tables: Columns width management +// [SECTION] Tables: Drawing +// [SECTION] Tables: Sorting +// [SECTION] Tables: Headers +// [SECTION] Tables: Context Menu +// [SECTION] Tables: Settings (.ini data) +// [SECTION] Tables: Garbage Collection +// [SECTION] Tables: Debugging +// [SECTION] Columns, BeginColumns, EndColumns, etc. + +*/ + +// Navigating this file: +// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. + +//----------------------------------------------------------------------------- +// [SECTION] Commentary +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Typical tables call flow: (root level is generally public API): +//----------------------------------------------------------------------------- +// - BeginTable() user begin into a table +// | BeginChild() - (if ScrollX/ScrollY is set) +// | TableBeginInitMemory() - first time table is used +// | TableResetSettings() - on settings reset +// | TableLoadSettings() - on settings load +// | TableBeginApplyRequests() - apply queued resizing/reordering/hiding requests +// | - TableSetColumnWidth() - apply resizing width (for mouse resize, often requested by previous frame) +// | - TableUpdateColumnsWeightFromWidth()- recompute columns weights (of stretch columns) from their respective width +// - TableSetupColumn() user submit columns details (optional) +// - TableSetupScrollFreeze() user submit scroll freeze information (optional) +//----------------------------------------------------------------------------- +// - TableUpdateLayout() [Internal] followup to BeginTable(): setup everything: widths, columns positions, clipping rectangles. Automatically called by the FIRST call to TableNextRow() or TableHeadersRow(). +// | TableSetupDrawChannels() - setup ImDrawList channels +// | TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission +// | TableDrawContextMenu() - draw right-click context menu +//----------------------------------------------------------------------------- +// - TableHeadersRow() or TableHeader() user submit a headers row (optional) +// | TableSortSpecsClickColumn() - when left-clicked: alter sort order and sort direction +// | TableOpenContextMenu() - when right-clicked: trigger opening of the default context menu +// - TableGetSortSpecs() user queries updated sort specs (optional, generally after submitting headers) +// - TableNextRow() user begin into a new row (also automatically called by TableHeadersRow()) +// | TableEndRow() - finish existing row +// | TableBeginRow() - add a new row +// - TableSetColumnIndex() / TableNextColumn() user begin into a cell +// | TableEndCell() - close existing column/cell +// | TableBeginCell() - enter into current column/cell +// - [...] user emit contents +//----------------------------------------------------------------------------- +// - EndTable() user ends the table +// | TableDrawBorders() - draw outer borders, inner vertical borders +// | TableMergeDrawChannels() - merge draw channels if clipping isn't required +// | EndChild() - (if ScrollX/ScrollY is set) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// TABLE SIZING +//----------------------------------------------------------------------------- +// (Read carefully because this is subtle but it does make sense!) +//----------------------------------------------------------------------------- +// About 'outer_size': +// Its meaning needs to differ slightly depending on if we are using ScrollX/ScrollY flags. +// Default value is ImVec2(0.0f, 0.0f). +// X +// - outer_size.x <= 0.0f -> Right-align from window/work-rect right-most edge. With -FLT_MIN or 0.0f will align exactly on right-most edge. +// - outer_size.x > 0.0f -> Set Fixed width. +// Y with ScrollX/ScrollY disabled: we output table directly in current window +// - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful is parent window can vertically scroll. +// - outer_size.y = 0.0f -> No minimum height (but will auto extend, unless _NoHostExtendY is set) +// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtenY is set) +// Y with ScrollX/ScrollY enabled: using a child window for scrolling +// - outer_size.y < 0.0f -> Bottom-align. Not meaningful is parent window can vertically scroll. +// - outer_size.y = 0.0f -> Bottom-align, consistent with BeginChild(). Not recommended unless table is last item in parent window. +// - outer_size.y > 0.0f -> Set Exact height. Recommended when using Scrolling on any axis. +//----------------------------------------------------------------------------- +// Outer size is also affected by the NoHostExtendX/NoHostExtendY flags. +// Important to that note how the two flags have slightly different behaviors! +// - ImGuiTableFlags_NoHostExtendX -> Make outer width auto-fit to columns (overriding outer_size.x value). Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. +// - ImGuiTableFlags_NoHostExtendY -> Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY is disabled. Data below the limit will be clipped and not visible. +// In theory ImGuiTableFlags_NoHostExtendY could be the default and any non-scrolling tables with outer_size.y != 0.0f would use exact height. +// This would be consistent but perhaps less useful and more confusing (as vertically clipped items are not easily noticeable) +//----------------------------------------------------------------------------- +// About 'inner_width': +// With ScrollX disabled: +// - inner_width -> *ignored* +// With ScrollX enabled: +// - inner_width < 0.0f -> *illegal* fit in known width (right align from outer_size.x) <-- weird +// - inner_width = 0.0f -> fit in outer_width: Fixed size columns will take space they need (if avail, otherwise shrink down), Stretch columns becomes Fixed columns. +// - inner_width > 0.0f -> override scrolling width, generally to be larger than outer_size.x. Fixed column take space they need (if avail, otherwise shrink down), Stretch columns share remaining space! +//----------------------------------------------------------------------------- +// Details: +// - If you want to use Stretch columns with ScrollX, you generally need to specify 'inner_width' otherwise the concept +// of "available space" doesn't make sense. +// - Even if not really useful, we allow 'inner_width < outer_size.x' for consistency and to facilitate understanding +// of what the value does. +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// COLUMNS SIZING POLICIES +//----------------------------------------------------------------------------- +// About overriding column sizing policy and width/weight with TableSetupColumn(): +// We use a default parameter of 'init_width_or_weight == -1'. +// - with ImGuiTableColumnFlags_WidthFixed, init_width <= 0 (default) --> width is automatic +// - with ImGuiTableColumnFlags_WidthFixed, init_width > 0 (explicit) --> width is custom +// - with ImGuiTableColumnFlags_WidthStretch, init_weight <= 0 (default) --> weight is 1.0f +// - with ImGuiTableColumnFlags_WidthStretch, init_weight > 0 (explicit) --> weight is custom +// Widths are specified _without_ CellPadding. If you specify a width of 100.0f, the column will be cover (100.0f + Padding * 2.0f) +// and you can fit a 100.0f wide item in it without clipping and with full padding. +//----------------------------------------------------------------------------- +// About default sizing policy (if you don't specify a ImGuiTableColumnFlags_WidthXXXX flag) +// - with Table policy ImGuiTableFlags_SizingFixedFit --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is equal to contents width +// - with Table policy ImGuiTableFlags_SizingFixedSame --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is max of all contents width +// - with Table policy ImGuiTableFlags_SizingStretchSame --> default Column policy is ImGuiTableColumnFlags_WidthStretch, default Weight is 1.0f +// - with Table policy ImGuiTableFlags_SizingStretchWeight --> default Column policy is ImGuiTableColumnFlags_WidthStretch, default Weight is proportional to contents +// Default Width and default Weight can be overridden when calling TableSetupColumn(). +//----------------------------------------------------------------------------- +// About mixing Fixed/Auto and Stretch columns together: +// - the typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. +// - using mixed policies with ScrollX does not make much sense, as using Stretch columns with ScrollX does not make much sense in the first place! +// that is, unless 'inner_width' is passed to BeginTable() to explicitly provide a total width to layout columns in. +// - when using ImGuiTableFlags_SizingFixedSame with mixed columns, only the Fixed/Auto columns will match their widths to the width of the maximum contents. +// - when using ImGuiTableFlags_SizingStretchSame with mixed columns, only the Stretch columns will match their weight/widths. +//----------------------------------------------------------------------------- +// About using column width: +// If a column is manual resizable or has a width specified with TableSetupColumn(): +// - you may use GetContentRegionAvail().x to query the width available in a given column. +// - right-side alignment features such as SetNextItemWidth(-x) or PushItemWidth(-x) will rely on this width. +// If the column is not resizable and has no width specified with TableSetupColumn(): +// - its width will be automatic and be set to the max of items submitted. +// - therefore you generally cannot have ALL items of the columns use e.g. SetNextItemWidth(-FLT_MIN). +// - but if the column has one or more items of known/fixed size, this will become the reference width used by SetNextItemWidth(-FLT_MIN). +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// TABLES CLIPPING/CULLING +//----------------------------------------------------------------------------- +// About clipping/culling of Rows in Tables: +// - For large numbers of rows, it is recommended you use ImGuiListClipper to only submit visible rows. +// ImGuiListClipper is reliant on the fact that rows are of equal height. +// See 'Demo->Tables->Vertical Scrolling' or 'Demo->Tables->Advanced' for a demo of using the clipper. +// - Note that auto-resizing columns don't play well with using the clipper. +// By default a table with _ScrollX but without _Resizable will have column auto-resize. +// So, if you want to use the clipper, make sure to either enable _Resizable, either setup columns width explicitly with _WidthFixed. +//----------------------------------------------------------------------------- +// About clipping/culling of Columns in Tables: +// - Both TableSetColumnIndex() and TableNextColumn() return true when the column is visible or performing +// width measurements. Otherwise, you may skip submitting the contents of a cell/column, BUT ONLY if you know +// it is not going to contribute to row height. +// In many situations, you may skip submitting contents for every column but one (e.g. the first one). +// - Case A: column is not hidden by user, and at least partially in sight (most common case). +// - Case B: column is clipped / out of sight (because of scrolling or parent ClipRect): TableNextColumn() return false as a hint but we still allow layout output. +// - Case C: column is hidden explicitly by the user (e.g. via the context menu, or _DefaultHide column flag, etc.). +// +// [A] [B] [C] +// TableNextColumn(): true false false -> [userland] when TableNextColumn() / TableSetColumnIndex() return false, user can skip submitting items but only if the column doesn't contribute to row height. +// SkipItems: false false true -> [internal] when SkipItems is true, most widgets will early out if submitted, resulting is no layout output. +// ClipRect: normal zero-width zero-width -> [internal] when ClipRect is zero, ItemAdd() will return false and most widgets will early out mid-way. +// ImDrawList output: normal dummy dummy -> [internal] when using the dummy channel, ImDrawList submissions (if any) will be wasted (because cliprect is zero-width anyway). +// +// - We need to distinguish those cases because non-hidden columns that are clipped outside of scrolling bounds should still contribute their height to the row. +// However, in the majority of cases, the contribution to row height is the same for all columns, or the tallest cells are known by the programmer. +//----------------------------------------------------------------------------- +// About clipping/culling of whole Tables: +// - Scrolling tables with a known outer size can be clipped earlier as BeginTable() will return false. +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// [SECTION] Header mess +//----------------------------------------------------------------------------- + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif +#include "imgui_internal.h" + +// System includes +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. +#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') +#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Tables: Main code +//----------------------------------------------------------------------------- +// - TableFixFlags() [Internal] +// - TableFindByID() [Internal] +// - BeginTable() +// - BeginTableEx() [Internal] +// - TableBeginInitMemory() [Internal] +// - TableBeginApplyRequests() [Internal] +// - TableSetupColumnFlags() [Internal] +// - TableUpdateLayout() [Internal] +// - TableUpdateBorders() [Internal] +// - EndTable() +// - TableSetupColumn() +// - TableSetupScrollFreeze() +//----------------------------------------------------------------------------- + +// Configuration +static const int TABLE_DRAW_CHANNEL_BG0 = 0; +static const int TABLE_DRAW_CHANNEL_BG2_FROZEN = 1; +static const int TABLE_DRAW_CHANNEL_NOCLIP = 2; // When using ImGuiTableFlags_NoClip (this becomes the last visible channel) +static const float TABLE_BORDER_SIZE = 1.0f; // FIXME-TABLE: Currently hard-coded because of clipping assumptions with outer borders rendering. +static const float TABLE_RESIZE_SEPARATOR_HALF_THICKNESS = 4.0f; // Extend outside inner borders. +static const float TABLE_RESIZE_SEPARATOR_FEEDBACK_TIMER = 0.06f; // Delay/timer before making the hover feedback (color+cursor) visible because tables/columns tends to be more cramped. + +// Helper +inline ImGuiTableFlags TableFixFlags(ImGuiTableFlags flags, ImGuiWindow* outer_window) +{ + // Adjust flags: set default sizing policy + if ((flags & ImGuiTableFlags_SizingMask_) == 0) + flags |= ((flags & ImGuiTableFlags_ScrollX) || (outer_window->Flags & ImGuiWindowFlags_AlwaysAutoResize)) ? ImGuiTableFlags_SizingFixedFit : ImGuiTableFlags_SizingStretchSame; + + // Adjust flags: enable NoKeepColumnsVisible when using ImGuiTableFlags_SizingFixedSame + if ((flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) + flags |= ImGuiTableFlags_NoKeepColumnsVisible; + + // Adjust flags: enforce borders when resizable + if (flags & ImGuiTableFlags_Resizable) + flags |= ImGuiTableFlags_BordersInnerV; + + // Adjust flags: disable NoHostExtendX/NoHostExtendY if we have any scrolling going on + if (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) + flags &= ~(ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_NoHostExtendY); + + // Adjust flags: NoBordersInBodyUntilResize takes priority over NoBordersInBody + if (flags & ImGuiTableFlags_NoBordersInBodyUntilResize) + flags &= ~ImGuiTableFlags_NoBordersInBody; + + // Adjust flags: disable saved settings if there's nothing to save + if ((flags & (ImGuiTableFlags_Resizable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Sortable)) == 0) + flags |= ImGuiTableFlags_NoSavedSettings; + + // Inherit _NoSavedSettings from top-level window (child windows always have _NoSavedSettings set) + if (outer_window->RootWindow->Flags & ImGuiWindowFlags_NoSavedSettings) + flags |= ImGuiTableFlags_NoSavedSettings; + + return flags; +} + +ImGuiTable* ImGui::TableFindByID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + return g.Tables.GetByKey(id); +} + +// Read about "TABLE SIZING" at the top of this file. +bool ImGui::BeginTable(const char* str_id, int columns_count, ImGuiTableFlags flags, const ImVec2& outer_size, float inner_width) +{ + ImGuiID id = GetID(str_id); + return BeginTableEx(str_id, id, columns_count, flags, outer_size, inner_width); +} + +bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags, const ImVec2& outer_size, float inner_width) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* outer_window = GetCurrentWindow(); + if (outer_window->SkipItems) // Consistent with other tables + beneficial side effect that assert on miscalling EndTable() will be more visible. + return false; + + // Sanity checks + IM_ASSERT(columns_count > 0 && columns_count <= IMGUI_TABLE_MAX_COLUMNS && "Only 1..64 columns allowed!"); + if (flags & ImGuiTableFlags_ScrollX) + IM_ASSERT(inner_width >= 0.0f); + + // If an outer size is specified ahead we will be able to early out when not visible. Exact clipping rules may evolve. + const bool use_child_window = (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) != 0; + const ImVec2 avail_size = GetContentRegionAvail(); + ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f); + ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size); + if (use_child_window && IsClippedEx(outer_rect, 0)) + { + ItemSize(outer_rect); + return false; + } + + // Acquire storage for the table + ImGuiTable* table = g.Tables.GetOrAddByKey(id); + const int instance_no = (table->LastFrameActive != g.FrameCount) ? 0 : table->InstanceCurrent + 1; + const ImGuiID instance_id = id + instance_no; + const ImGuiTableFlags table_last_flags = table->Flags; + if (instance_no > 0) + IM_ASSERT(table->ColumnsCount == columns_count && "BeginTable(): Cannot change columns count mid-frame while preserving same ID"); + + // Acquire temporary buffers + const int table_idx = g.Tables.GetIndex(table); + if (++g.TablesTempDataStacked > g.TablesTempData.Size) + g.TablesTempData.resize(g.TablesTempDataStacked, ImGuiTableTempData()); + ImGuiTableTempData* temp_data = table->TempData = &g.TablesTempData[g.TablesTempDataStacked - 1]; + temp_data->TableIndex = table_idx; + table->DrawSplitter = &table->TempData->DrawSplitter; + table->DrawSplitter->Clear(); + + // Fix flags + table->IsDefaultSizingPolicy = (flags & ImGuiTableFlags_SizingMask_) == 0; + flags = TableFixFlags(flags, outer_window); + + // Initialize + table->ID = id; + table->Flags = flags; + table->InstanceCurrent = (ImS16)instance_no; + table->LastFrameActive = g.FrameCount; + table->OuterWindow = table->InnerWindow = outer_window; + table->ColumnsCount = columns_count; + table->IsLayoutLocked = false; + table->InnerWidth = inner_width; + temp_data->UserOuterSize = outer_size; + if (instance_no > 0 && table->InstanceDataExtra.Size < instance_no) + table->InstanceDataExtra.push_back(ImGuiTableInstanceData()); + + // When not using a child window, WorkRect.Max will grow as we append contents. + if (use_child_window) + { + // Ensure no vertical scrollbar appears if we only want horizontal one, to make flag consistent + // (we have no other way to disable vertical scrollbar of a window while keeping the horizontal one showing) + ImVec2 override_content_size(FLT_MAX, FLT_MAX); + if ((flags & ImGuiTableFlags_ScrollX) && !(flags & ImGuiTableFlags_ScrollY)) + override_content_size.y = FLT_MIN; + + // Ensure specified width (when not specified, Stretched columns will act as if the width == OuterWidth and + // never lead to any scrolling). We don't handle inner_width < 0.0f, we could potentially use it to right-align + // based on the right side of the child window work rect, which would require knowing ahead if we are going to + // have decoration taking horizontal spaces (typically a vertical scrollbar). + if ((flags & ImGuiTableFlags_ScrollX) && inner_width > 0.0f) + override_content_size.x = inner_width; + + if (override_content_size.x != FLT_MAX || override_content_size.y != FLT_MAX) + SetNextWindowContentSize(ImVec2(override_content_size.x != FLT_MAX ? override_content_size.x : 0.0f, override_content_size.y != FLT_MAX ? override_content_size.y : 0.0f)); + + // Reset scroll if we are reactivating it + if ((table_last_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0) + SetNextWindowScroll(ImVec2(0.0f, 0.0f)); + + // Create scrolling region (without border and zero window padding) + ImGuiWindowFlags child_flags = (flags & ImGuiTableFlags_ScrollX) ? ImGuiWindowFlags_HorizontalScrollbar : ImGuiWindowFlags_None; + BeginChildEx(name, instance_id, outer_rect.GetSize(), false, child_flags); + table->InnerWindow = g.CurrentWindow; + table->WorkRect = table->InnerWindow->WorkRect; + table->OuterRect = table->InnerWindow->Rect(); + table->InnerRect = table->InnerWindow->InnerRect; + IM_ASSERT(table->InnerWindow->WindowPadding.x == 0.0f && table->InnerWindow->WindowPadding.y == 0.0f && table->InnerWindow->WindowBorderSize == 0.0f); + } + else + { + // For non-scrolling tables, WorkRect == OuterRect == InnerRect. + // But at this point we do NOT have a correct value for .Max.y (unless a height has been explicitly passed in). It will only be updated in EndTable(). + table->WorkRect = table->OuterRect = table->InnerRect = outer_rect; + } + + // Push a standardized ID for both child-using and not-child-using tables + PushOverrideID(instance_id); + + // Backup a copy of host window members we will modify + ImGuiWindow* inner_window = table->InnerWindow; + table->HostIndentX = inner_window->DC.Indent.x; + table->HostClipRect = inner_window->ClipRect; + table->HostSkipItems = inner_window->SkipItems; + temp_data->HostBackupWorkRect = inner_window->WorkRect; + temp_data->HostBackupParentWorkRect = inner_window->ParentWorkRect; + temp_data->HostBackupColumnsOffset = outer_window->DC.ColumnsOffset; + temp_data->HostBackupPrevLineSize = inner_window->DC.PrevLineSize; + temp_data->HostBackupCurrLineSize = inner_window->DC.CurrLineSize; + temp_data->HostBackupCursorMaxPos = inner_window->DC.CursorMaxPos; + temp_data->HostBackupItemWidth = outer_window->DC.ItemWidth; + temp_data->HostBackupItemWidthStackSize = outer_window->DC.ItemWidthStack.Size; + inner_window->DC.PrevLineSize = inner_window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + + // Padding and Spacing + // - None ........Content..... Pad .....Content........ + // - PadOuter | Pad ..Content..... Pad .....Content.. Pad | + // - PadInner ........Content.. Pad | Pad ..Content........ + // - PadOuter+PadInner | Pad ..Content.. Pad | Pad ..Content.. Pad | + const bool pad_outer_x = (flags & ImGuiTableFlags_NoPadOuterX) ? false : (flags & ImGuiTableFlags_PadOuterX) ? true : (flags & ImGuiTableFlags_BordersOuterV) != 0; + const bool pad_inner_x = (flags & ImGuiTableFlags_NoPadInnerX) ? false : true; + const float inner_spacing_for_border = (flags & ImGuiTableFlags_BordersInnerV) ? TABLE_BORDER_SIZE : 0.0f; + const float inner_spacing_explicit = (pad_inner_x && (flags & ImGuiTableFlags_BordersInnerV) == 0) ? g.Style.CellPadding.x : 0.0f; + const float inner_padding_explicit = (pad_inner_x && (flags & ImGuiTableFlags_BordersInnerV) != 0) ? g.Style.CellPadding.x : 0.0f; + table->CellSpacingX1 = inner_spacing_explicit + inner_spacing_for_border; + table->CellSpacingX2 = inner_spacing_explicit; + table->CellPaddingX = inner_padding_explicit; + table->CellPaddingY = g.Style.CellPadding.y; + + const float outer_padding_for_border = (flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; + const float outer_padding_explicit = pad_outer_x ? g.Style.CellPadding.x : 0.0f; + table->OuterPaddingX = (outer_padding_for_border + outer_padding_explicit) - table->CellPaddingX; + + table->CurrentColumn = -1; + table->CurrentRow = -1; + table->RowBgColorCounter = 0; + table->LastRowFlags = ImGuiTableRowFlags_None; + table->InnerClipRect = (inner_window == outer_window) ? table->WorkRect : inner_window->ClipRect; + table->InnerClipRect.ClipWith(table->WorkRect); // We need this to honor inner_width + table->InnerClipRect.ClipWithFull(table->HostClipRect); + table->InnerClipRect.Max.y = (flags & ImGuiTableFlags_NoHostExtendY) ? ImMin(table->InnerClipRect.Max.y, inner_window->WorkRect.Max.y) : inner_window->ClipRect.Max.y; + + table->RowPosY1 = table->RowPosY2 = table->WorkRect.Min.y; // This is needed somehow + table->RowTextBaseline = 0.0f; // This will be cleared again by TableBeginRow() + table->FreezeRowsRequest = table->FreezeRowsCount = 0; // This will be setup by TableSetupScrollFreeze(), if any + table->FreezeColumnsRequest = table->FreezeColumnsCount = 0; + table->IsUnfrozenRows = true; + table->DeclColumnsCount = 0; + + // Using opaque colors facilitate overlapping elements of the grid + table->BorderColorStrong = GetColorU32(ImGuiCol_TableBorderStrong); + table->BorderColorLight = GetColorU32(ImGuiCol_TableBorderLight); + + // Make table current + g.CurrentTable = table; + outer_window->DC.CurrentTableIdx = table_idx; + if (inner_window != outer_window) // So EndChild() within the inner window can restore the table properly. + inner_window->DC.CurrentTableIdx = table_idx; + + if ((table_last_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0) + table->IsResetDisplayOrderRequest = true; + + // Mark as used + if (table_idx >= g.TablesLastTimeActive.Size) + g.TablesLastTimeActive.resize(table_idx + 1, -1.0f); + g.TablesLastTimeActive[table_idx] = (float)g.Time; + temp_data->LastTimeActive = (float)g.Time; + table->MemoryCompacted = false; + + // Setup memory buffer (clear data if columns count changed) + ImGuiTableColumn* old_columns_to_preserve = NULL; + void* old_columns_raw_data = NULL; + const int old_columns_count = table->Columns.size(); + if (old_columns_count != 0 && old_columns_count != columns_count) + { + // Attempt to preserve width on column count change (#4046) + old_columns_to_preserve = table->Columns.Data; + old_columns_raw_data = table->RawData; + table->RawData = NULL; + } + if (table->RawData == NULL) + { + TableBeginInitMemory(table, columns_count); + table->IsInitializing = table->IsSettingsRequestLoad = true; + } + if (table->IsResetAllRequest) + TableResetSettings(table); + if (table->IsInitializing) + { + // Initialize + table->SettingsOffset = -1; + table->IsSortSpecsDirty = true; + table->InstanceInteracted = -1; + table->ContextPopupColumn = -1; + table->ReorderColumn = table->ResizedColumn = table->LastResizedColumn = -1; + table->AutoFitSingleColumn = -1; + table->HoveredColumnBody = table->HoveredColumnBorder = -1; + for (int n = 0; n < columns_count; n++) + { + ImGuiTableColumn* column = &table->Columns[n]; + if (old_columns_to_preserve && n < old_columns_count) + { + // FIXME: We don't attempt to preserve column order in this path. + *column = old_columns_to_preserve[n]; + } + else + { + float width_auto = column->WidthAuto; + *column = ImGuiTableColumn(); + column->WidthAuto = width_auto; + column->IsPreserveWidthAuto = true; // Preserve WidthAuto when reinitializing a live table: not technically necessary but remove a visible flicker + column->IsEnabled = column->IsUserEnabled = column->IsUserEnabledNextFrame = true; + } + column->DisplayOrder = table->DisplayOrderToIndex[n] = (ImGuiTableColumnIdx)n; + } + } + if (old_columns_raw_data) + IM_FREE(old_columns_raw_data); + + // Load settings + if (table->IsSettingsRequestLoad) + TableLoadSettings(table); + + // Handle DPI/font resize + // This is designed to facilitate DPI changes with the assumption that e.g. style.CellPadding has been scaled as well. + // It will also react to changing fonts with mixed results. It doesn't need to be perfect but merely provide a decent transition. + // FIXME-DPI: Provide consistent standards for reference size. Perhaps using g.CurrentDpiScale would be more self explanatory. + // This is will lead us to non-rounded WidthRequest in columns, which should work but is a poorly tested path. + const float new_ref_scale_unit = g.FontSize; // g.Font->GetCharAdvance('A') ? + if (table->RefScale != 0.0f && table->RefScale != new_ref_scale_unit) + { + const float scale_factor = new_ref_scale_unit / table->RefScale; + //IMGUI_DEBUG_LOG("[table] %08X RefScaleUnit %.3f -> %.3f, scaling width by %.3f\n", table->ID, table->RefScaleUnit, new_ref_scale_unit, scale_factor); + for (int n = 0; n < columns_count; n++) + table->Columns[n].WidthRequest = table->Columns[n].WidthRequest * scale_factor; + } + table->RefScale = new_ref_scale_unit; + + // Disable output until user calls TableNextRow() or TableNextColumn() leading to the TableUpdateLayout() call.. + // This is not strictly necessary but will reduce cases were "out of table" output will be misleading to the user. + // Because we cannot safely assert in EndTable() when no rows have been created, this seems like our best option. + inner_window->SkipItems = true; + + // Clear names + // At this point the ->NameOffset field of each column will be invalid until TableUpdateLayout() or the first call to TableSetupColumn() + if (table->ColumnsNames.Buf.Size > 0) + table->ColumnsNames.Buf.resize(0); + + // Apply queued resizing/reordering/hiding requests + TableBeginApplyRequests(table); + + return true; +} + +// For reference, the average total _allocation count_ for a table is: +// + 0 (for ImGuiTable instance, we are pooling allocations in g.Tables) +// + 1 (for table->RawData allocated below) +// + 1 (for table->ColumnsNames, if names are used) +// Shared allocations per number of nested tables +// + 1 (for table->Splitter._Channels) +// + 2 * active_channels_count (for ImDrawCmd and ImDrawIdx buffers inside channels) +// Where active_channels_count is variable but often == columns_count or columns_count + 1, see TableSetupDrawChannels() for details. +// Unused channels don't perform their +2 allocations. +void ImGui::TableBeginInitMemory(ImGuiTable* table, int columns_count) +{ + // Allocate single buffer for our arrays + ImSpanAllocator<3> span_allocator; + span_allocator.Reserve(0, columns_count * sizeof(ImGuiTableColumn)); + span_allocator.Reserve(1, columns_count * sizeof(ImGuiTableColumnIdx)); + span_allocator.Reserve(2, columns_count * sizeof(ImGuiTableCellData), 4); + table->RawData = IM_ALLOC(span_allocator.GetArenaSizeInBytes()); + memset(table->RawData, 0, span_allocator.GetArenaSizeInBytes()); + span_allocator.SetArenaBasePtr(table->RawData); + span_allocator.GetSpan(0, &table->Columns); + span_allocator.GetSpan(1, &table->DisplayOrderToIndex); + span_allocator.GetSpan(2, &table->RowCellData); +} + +// Apply queued resizing/reordering/hiding requests +void ImGui::TableBeginApplyRequests(ImGuiTable* table) +{ + // Handle resizing request + // (We process this at the first TableBegin of the frame) + // FIXME-TABLE: Contains columns if our work area doesn't allow for scrolling? + if (table->InstanceCurrent == 0) + { + if (table->ResizedColumn != -1 && table->ResizedColumnNextWidth != FLT_MAX) + TableSetColumnWidth(table->ResizedColumn, table->ResizedColumnNextWidth); + table->LastResizedColumn = table->ResizedColumn; + table->ResizedColumnNextWidth = FLT_MAX; + table->ResizedColumn = -1; + + // Process auto-fit for single column, which is a special case for stretch columns and fixed columns with FixedSame policy. + // FIXME-TABLE: Would be nice to redistribute available stretch space accordingly to other weights, instead of giving it all to siblings. + if (table->AutoFitSingleColumn != -1) + { + TableSetColumnWidth(table->AutoFitSingleColumn, table->Columns[table->AutoFitSingleColumn].WidthAuto); + table->AutoFitSingleColumn = -1; + } + } + + // Handle reordering request + // Note: we don't clear ReorderColumn after handling the request. + if (table->InstanceCurrent == 0) + { + if (table->HeldHeaderColumn == -1 && table->ReorderColumn != -1) + table->ReorderColumn = -1; + table->HeldHeaderColumn = -1; + if (table->ReorderColumn != -1 && table->ReorderColumnDir != 0) + { + // We need to handle reordering across hidden columns. + // In the configuration below, moving C to the right of E will lead to: + // ... C [D] E ---> ... [D] E C (Column name/index) + // ... 2 3 4 ... 2 3 4 (Display order) + const int reorder_dir = table->ReorderColumnDir; + IM_ASSERT(reorder_dir == -1 || reorder_dir == +1); + IM_ASSERT(table->Flags & ImGuiTableFlags_Reorderable); + ImGuiTableColumn* src_column = &table->Columns[table->ReorderColumn]; + ImGuiTableColumn* dst_column = &table->Columns[(reorder_dir == -1) ? src_column->PrevEnabledColumn : src_column->NextEnabledColumn]; + IM_UNUSED(dst_column); + const int src_order = src_column->DisplayOrder; + const int dst_order = dst_column->DisplayOrder; + src_column->DisplayOrder = (ImGuiTableColumnIdx)dst_order; + for (int order_n = src_order + reorder_dir; order_n != dst_order + reorder_dir; order_n += reorder_dir) + table->Columns[table->DisplayOrderToIndex[order_n]].DisplayOrder -= (ImGuiTableColumnIdx)reorder_dir; + IM_ASSERT(dst_column->DisplayOrder == dst_order - reorder_dir); + + // Display order is stored in both columns->IndexDisplayOrder and table->DisplayOrder[], + // rebuild the later from the former. + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->DisplayOrderToIndex[table->Columns[column_n].DisplayOrder] = (ImGuiTableColumnIdx)column_n; + table->ReorderColumnDir = 0; + table->IsSettingsDirty = true; + } + } + + // Handle display order reset request + if (table->IsResetDisplayOrderRequest) + { + for (int n = 0; n < table->ColumnsCount; n++) + table->DisplayOrderToIndex[n] = table->Columns[n].DisplayOrder = (ImGuiTableColumnIdx)n; + table->IsResetDisplayOrderRequest = false; + table->IsSettingsDirty = true; + } +} + +// Adjust flags: default width mode + stretch columns are not allowed when auto extending +static void TableSetupColumnFlags(ImGuiTable* table, ImGuiTableColumn* column, ImGuiTableColumnFlags flags_in) +{ + ImGuiTableColumnFlags flags = flags_in; + + // Sizing Policy + if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0) + { + const ImGuiTableFlags table_sizing_policy = (table->Flags & ImGuiTableFlags_SizingMask_); + if (table_sizing_policy == ImGuiTableFlags_SizingFixedFit || table_sizing_policy == ImGuiTableFlags_SizingFixedSame) + flags |= ImGuiTableColumnFlags_WidthFixed; + else + flags |= ImGuiTableColumnFlags_WidthStretch; + } + else + { + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiTableColumnFlags_WidthMask_)); // Check that only 1 of each set is used. + } + + // Resize + if ((table->Flags & ImGuiTableFlags_Resizable) == 0) + flags |= ImGuiTableColumnFlags_NoResize; + + // Sorting + if ((flags & ImGuiTableColumnFlags_NoSortAscending) && (flags & ImGuiTableColumnFlags_NoSortDescending)) + flags |= ImGuiTableColumnFlags_NoSort; + + // Indentation + if ((flags & ImGuiTableColumnFlags_IndentMask_) == 0) + flags |= (table->Columns.index_from_ptr(column) == 0) ? ImGuiTableColumnFlags_IndentEnable : ImGuiTableColumnFlags_IndentDisable; + + // Alignment + //if ((flags & ImGuiTableColumnFlags_AlignMask_) == 0) + // flags |= ImGuiTableColumnFlags_AlignCenter; + //IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiTableColumnFlags_AlignMask_)); // Check that only 1 of each set is used. + + // Preserve status flags + column->Flags = flags | (column->Flags & ImGuiTableColumnFlags_StatusMask_); + + // Build an ordered list of available sort directions + column->SortDirectionsAvailCount = column->SortDirectionsAvailMask = column->SortDirectionsAvailList = 0; + if (table->Flags & ImGuiTableFlags_Sortable) + { + int count = 0, mask = 0, list = 0; + if ((flags & ImGuiTableColumnFlags_PreferSortAscending) != 0 && (flags & ImGuiTableColumnFlags_NoSortAscending) == 0) { mask |= 1 << ImGuiSortDirection_Ascending; list |= ImGuiSortDirection_Ascending << (count << 1); count++; } + if ((flags & ImGuiTableColumnFlags_PreferSortDescending) != 0 && (flags & ImGuiTableColumnFlags_NoSortDescending) == 0) { mask |= 1 << ImGuiSortDirection_Descending; list |= ImGuiSortDirection_Descending << (count << 1); count++; } + if ((flags & ImGuiTableColumnFlags_PreferSortAscending) == 0 && (flags & ImGuiTableColumnFlags_NoSortAscending) == 0) { mask |= 1 << ImGuiSortDirection_Ascending; list |= ImGuiSortDirection_Ascending << (count << 1); count++; } + if ((flags & ImGuiTableColumnFlags_PreferSortDescending) == 0 && (flags & ImGuiTableColumnFlags_NoSortDescending) == 0) { mask |= 1 << ImGuiSortDirection_Descending; list |= ImGuiSortDirection_Descending << (count << 1); count++; } + if ((table->Flags & ImGuiTableFlags_SortTristate) || count == 0) { mask |= 1 << ImGuiSortDirection_None; count++; } + column->SortDirectionsAvailList = (ImU8)list; + column->SortDirectionsAvailMask = (ImU8)mask; + column->SortDirectionsAvailCount = (ImU8)count; + ImGui::TableFixColumnSortDirection(table, column); + } +} + +// Layout columns for the frame. This is in essence the followup to BeginTable(). +// Runs on the first call to TableNextRow(), to give a chance for TableSetupColumn() to be called first. +// FIXME-TABLE: Our width (and therefore our WorkRect) will be minimal in the first frame for _WidthAuto columns. +// Increase feedback side-effect with widgets relying on WorkRect.Max.x... Maybe provide a default distribution for _WidthAuto columns? +void ImGui::TableUpdateLayout(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(table->IsLayoutLocked == false); + + const ImGuiTableFlags table_sizing_policy = (table->Flags & ImGuiTableFlags_SizingMask_); + table->IsDefaultDisplayOrder = true; + table->ColumnsEnabledCount = 0; + table->EnabledMaskByIndex = 0x00; + table->EnabledMaskByDisplayOrder = 0x00; + table->LeftMostEnabledColumn = -1; + table->MinColumnWidth = ImMax(1.0f, g.Style.FramePadding.x * 1.0f); // g.Style.ColumnsMinSpacing; // FIXME-TABLE + + // [Part 1] Apply/lock Enabled and Order states. Calculate auto/ideal width for columns. Count fixed/stretch columns. + // Process columns in their visible orders as we are building the Prev/Next indices. + int count_fixed = 0; // Number of columns that have fixed sizing policies + int count_stretch = 0; // Number of columns that have stretch sizing policies + int prev_visible_column_idx = -1; + bool has_auto_fit_request = false; + bool has_resizable = false; + float stretch_sum_width_auto = 0.0f; + float fixed_max_width_auto = 0.0f; + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + const int column_n = table->DisplayOrderToIndex[order_n]; + if (column_n != order_n) + table->IsDefaultDisplayOrder = false; + ImGuiTableColumn* column = &table->Columns[column_n]; + + // Clear column setup if not submitted by user. Currently we make it mandatory to call TableSetupColumn() every frame. + // It would easily work without but we're not ready to guarantee it since e.g. names need resubmission anyway. + // We take a slight shortcut but in theory we could be calling TableSetupColumn() here with dummy values, it should yield the same effect. + if (table->DeclColumnsCount <= column_n) + { + TableSetupColumnFlags(table, column, ImGuiTableColumnFlags_None); + column->NameOffset = -1; + column->UserID = 0; + column->InitStretchWeightOrWidth = -1.0f; + } + + // Update Enabled state, mark settings and sort specs dirty + if (!(table->Flags & ImGuiTableFlags_Hideable) || (column->Flags & ImGuiTableColumnFlags_NoHide)) + column->IsUserEnabledNextFrame = true; + if (column->IsUserEnabled != column->IsUserEnabledNextFrame) + { + column->IsUserEnabled = column->IsUserEnabledNextFrame; + table->IsSettingsDirty = true; + } + column->IsEnabled = column->IsUserEnabled && (column->Flags & ImGuiTableColumnFlags_Disabled) == 0; + + if (column->SortOrder != -1 && !column->IsEnabled) + table->IsSortSpecsDirty = true; + if (column->SortOrder > 0 && !(table->Flags & ImGuiTableFlags_SortMulti)) + table->IsSortSpecsDirty = true; + + // Auto-fit unsized columns + const bool start_auto_fit = (column->Flags & ImGuiTableColumnFlags_WidthFixed) ? (column->WidthRequest < 0.0f) : (column->StretchWeight < 0.0f); + if (start_auto_fit) + column->AutoFitQueue = column->CannotSkipItemsQueue = (1 << 3) - 1; // Fit for three frames + + if (!column->IsEnabled) + { + column->IndexWithinEnabledSet = -1; + continue; + } + + // Mark as enabled and link to previous/next enabled column + column->PrevEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; + column->NextEnabledColumn = -1; + if (prev_visible_column_idx != -1) + table->Columns[prev_visible_column_idx].NextEnabledColumn = (ImGuiTableColumnIdx)column_n; + else + table->LeftMostEnabledColumn = (ImGuiTableColumnIdx)column_n; + column->IndexWithinEnabledSet = table->ColumnsEnabledCount++; + table->EnabledMaskByIndex |= (ImU64)1 << column_n; + table->EnabledMaskByDisplayOrder |= (ImU64)1 << column->DisplayOrder; + prev_visible_column_idx = column_n; + IM_ASSERT(column->IndexWithinEnabledSet <= column->DisplayOrder); + + // Calculate ideal/auto column width (that's the width required for all contents to be visible without clipping) + // Combine width from regular rows + width from headers unless requested not to. + if (!column->IsPreserveWidthAuto) + column->WidthAuto = TableGetColumnWidthAuto(table, column); + + // Non-resizable columns keep their requested width (apply user value regardless of IsPreserveWidthAuto) + const bool column_is_resizable = (column->Flags & ImGuiTableColumnFlags_NoResize) == 0; + if (column_is_resizable) + has_resizable = true; + if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && column->InitStretchWeightOrWidth > 0.0f && !column_is_resizable) + column->WidthAuto = column->InitStretchWeightOrWidth; + + if (column->AutoFitQueue != 0x00) + has_auto_fit_request = true; + if (column->Flags & ImGuiTableColumnFlags_WidthStretch) + { + stretch_sum_width_auto += column->WidthAuto; + count_stretch++; + } + else + { + fixed_max_width_auto = ImMax(fixed_max_width_auto, column->WidthAuto); + count_fixed++; + } + } + if ((table->Flags & ImGuiTableFlags_Sortable) && table->SortSpecsCount == 0 && !(table->Flags & ImGuiTableFlags_SortTristate)) + table->IsSortSpecsDirty = true; + table->RightMostEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; + IM_ASSERT(table->LeftMostEnabledColumn >= 0 && table->RightMostEnabledColumn >= 0); + + // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible + // to avoid the column fitting having to wait until the first visible frame of the child container (may or not be a good thing). + // FIXME-TABLE: for always auto-resizing columns may not want to do that all the time. + if (has_auto_fit_request && table->OuterWindow != table->InnerWindow) + table->InnerWindow->SkipItems = false; + if (has_auto_fit_request) + table->IsSettingsDirty = true; + + // [Part 3] Fix column flags and record a few extra information. + float sum_width_requests = 0.0f; // Sum of all width for fixed and auto-resize columns, excluding width contributed by Stretch columns but including spacing/padding. + float stretch_sum_weights = 0.0f; // Sum of all weights for stretch columns. + table->LeftMostStretchedColumn = table->RightMostStretchedColumn = -1; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + if (!(table->EnabledMaskByIndex & ((ImU64)1 << column_n))) + continue; + ImGuiTableColumn* column = &table->Columns[column_n]; + + const bool column_is_resizable = (column->Flags & ImGuiTableColumnFlags_NoResize) == 0; + if (column->Flags & ImGuiTableColumnFlags_WidthFixed) + { + // Apply same widths policy + float width_auto = column->WidthAuto; + if (table_sizing_policy == ImGuiTableFlags_SizingFixedSame && (column->AutoFitQueue != 0x00 || !column_is_resizable)) + width_auto = fixed_max_width_auto; + + // Apply automatic width + // Latch initial size for fixed columns and update it constantly for auto-resizing column (unless clipped!) + if (column->AutoFitQueue != 0x00) + column->WidthRequest = width_auto; + else if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !column_is_resizable && (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n))) + column->WidthRequest = width_auto; + + // FIXME-TABLE: Increase minimum size during init frame to avoid biasing auto-fitting widgets + // (e.g. TextWrapped) too much. Otherwise what tends to happen is that TextWrapped would output a very + // large height (= first frame scrollbar display very off + clipper would skip lots of items). + // This is merely making the side-effect less extreme, but doesn't properly fixes it. + // FIXME: Move this to ->WidthGiven to avoid temporary lossyless? + // FIXME: This break IsPreserveWidthAuto from not flickering if the stored WidthAuto was smaller. + if (column->AutoFitQueue > 0x01 && table->IsInitializing && !column->IsPreserveWidthAuto) + column->WidthRequest = ImMax(column->WidthRequest, table->MinColumnWidth * 4.0f); // FIXME-TABLE: Another constant/scale? + sum_width_requests += column->WidthRequest; + } + else + { + // Initialize stretch weight + if (column->AutoFitQueue != 0x00 || column->StretchWeight < 0.0f || !column_is_resizable) + { + if (column->InitStretchWeightOrWidth > 0.0f) + column->StretchWeight = column->InitStretchWeightOrWidth; + else if (table_sizing_policy == ImGuiTableFlags_SizingStretchProp) + column->StretchWeight = (column->WidthAuto / stretch_sum_width_auto) * count_stretch; + else + column->StretchWeight = 1.0f; + } + + stretch_sum_weights += column->StretchWeight; + if (table->LeftMostStretchedColumn == -1 || table->Columns[table->LeftMostStretchedColumn].DisplayOrder > column->DisplayOrder) + table->LeftMostStretchedColumn = (ImGuiTableColumnIdx)column_n; + if (table->RightMostStretchedColumn == -1 || table->Columns[table->RightMostStretchedColumn].DisplayOrder < column->DisplayOrder) + table->RightMostStretchedColumn = (ImGuiTableColumnIdx)column_n; + } + column->IsPreserveWidthAuto = false; + sum_width_requests += table->CellPaddingX * 2.0f; + } + table->ColumnsEnabledFixedCount = (ImGuiTableColumnIdx)count_fixed; + table->ColumnsStretchSumWeights = stretch_sum_weights; + + // [Part 4] Apply final widths based on requested widths + const ImRect work_rect = table->WorkRect; + const float width_spacings = (table->OuterPaddingX * 2.0f) + (table->CellSpacingX1 + table->CellSpacingX2) * (table->ColumnsEnabledCount - 1); + const float width_avail = ((table->Flags & ImGuiTableFlags_ScrollX) && table->InnerWidth == 0.0f) ? table->InnerClipRect.GetWidth() : work_rect.GetWidth(); + const float width_avail_for_stretched_columns = width_avail - width_spacings - sum_width_requests; + float width_remaining_for_stretched_columns = width_avail_for_stretched_columns; + table->ColumnsGivenWidth = width_spacings + (table->CellPaddingX * 2.0f) * table->ColumnsEnabledCount; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + if (!(table->EnabledMaskByIndex & ((ImU64)1 << column_n))) + continue; + ImGuiTableColumn* column = &table->Columns[column_n]; + + // Allocate width for stretched/weighted columns (StretchWeight gets converted into WidthRequest) + if (column->Flags & ImGuiTableColumnFlags_WidthStretch) + { + float weight_ratio = column->StretchWeight / stretch_sum_weights; + column->WidthRequest = IM_FLOOR(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f); + width_remaining_for_stretched_columns -= column->WidthRequest; + } + + // [Resize Rule 1] The right-most Visible column is not resizable if there is at least one Stretch column + // See additional comments in TableSetColumnWidth(). + if (column->NextEnabledColumn == -1 && table->LeftMostStretchedColumn != -1) + column->Flags |= ImGuiTableColumnFlags_NoDirectResize_; + + // Assign final width, record width in case we will need to shrink + column->WidthGiven = ImFloor(ImMax(column->WidthRequest, table->MinColumnWidth)); + table->ColumnsGivenWidth += column->WidthGiven; + } + + // [Part 5] Redistribute stretch remainder width due to rounding (remainder width is < 1.0f * number of Stretch column). + // Using right-to-left distribution (more likely to match resizing cursor). + if (width_remaining_for_stretched_columns >= 1.0f && !(table->Flags & ImGuiTableFlags_PreciseWidths)) + for (int order_n = table->ColumnsCount - 1; stretch_sum_weights > 0.0f && width_remaining_for_stretched_columns >= 1.0f && order_n >= 0; order_n--) + { + if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n))) + continue; + ImGuiTableColumn* column = &table->Columns[table->DisplayOrderToIndex[order_n]]; + if (!(column->Flags & ImGuiTableColumnFlags_WidthStretch)) + continue; + column->WidthRequest += 1.0f; + column->WidthGiven += 1.0f; + width_remaining_for_stretched_columns -= 1.0f; + } + + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + table->HoveredColumnBody = -1; + table->HoveredColumnBorder = -1; + const ImRect mouse_hit_rect(table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.Max.x, ImMax(table->OuterRect.Max.y, table->OuterRect.Min.y + table_instance->LastOuterHeight)); + const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0); + + // [Part 6] Setup final position, offset, skip/clip states and clipping rectangles, detect hovered column + // Process columns in their visible orders as we are comparing the visible order and adjusting host_clip_rect while looping. + int visible_n = 0; + bool offset_x_frozen = (table->FreezeColumnsCount > 0); + float offset_x = ((table->FreezeColumnsCount > 0) ? table->OuterRect.Min.x : work_rect.Min.x) + table->OuterPaddingX - table->CellSpacingX1; + ImRect host_clip_rect = table->InnerClipRect; + //host_clip_rect.Max.x += table->CellPaddingX + table->CellSpacingX2; + table->VisibleMaskByIndex = 0x00; + table->RequestOutputMaskByIndex = 0x00; + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + + column->NavLayerCurrent = (ImS8)((table->FreezeRowsCount > 0 || column_n < table->FreezeColumnsCount) ? ImGuiNavLayer_Menu : ImGuiNavLayer_Main); + + if (offset_x_frozen && table->FreezeColumnsCount == visible_n) + { + offset_x += work_rect.Min.x - table->OuterRect.Min.x; + offset_x_frozen = false; + } + + // Clear status flags + column->Flags &= ~ImGuiTableColumnFlags_StatusMask_; + + if ((table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n)) == 0) + { + // Hidden column: clear a few fields and we are done with it for the remainder of the function. + // We set a zero-width clip rect but set Min.y/Max.y properly to not interfere with the clipper. + column->MinX = column->MaxX = column->WorkMinX = column->ClipRect.Min.x = column->ClipRect.Max.x = offset_x; + column->WidthGiven = 0.0f; + column->ClipRect.Min.y = work_rect.Min.y; + column->ClipRect.Max.y = FLT_MAX; + column->ClipRect.ClipWithFull(host_clip_rect); + column->IsVisibleX = column->IsVisibleY = column->IsRequestOutput = false; + column->IsSkipItems = true; + column->ItemWidth = 1.0f; + continue; + } + + // Detect hovered column + if (is_hovering_table && g.IO.MousePos.x >= column->ClipRect.Min.x && g.IO.MousePos.x < column->ClipRect.Max.x) + table->HoveredColumnBody = (ImGuiTableColumnIdx)column_n; + + // Lock start position + column->MinX = offset_x; + + // Lock width based on start position and minimum/maximum width for this position + float max_width = TableGetMaxColumnWidth(table, column_n); + column->WidthGiven = ImMin(column->WidthGiven, max_width); + column->WidthGiven = ImMax(column->WidthGiven, ImMin(column->WidthRequest, table->MinColumnWidth)); + column->MaxX = offset_x + column->WidthGiven + table->CellSpacingX1 + table->CellSpacingX2 + table->CellPaddingX * 2.0f; + + // Lock other positions + // - ClipRect.Min.x: Because merging draw commands doesn't compare min boundaries, we make ClipRect.Min.x match left bounds to be consistent regardless of merging. + // - ClipRect.Max.x: using WorkMaxX instead of MaxX (aka including padding) makes things more consistent when resizing down, tho slightly detrimental to visibility in very-small column. + // - ClipRect.Max.x: using MaxX makes it easier for header to receive hover highlight with no discontinuity and display sorting arrow. + // - FIXME-TABLE: We want equal width columns to have equal (ClipRect.Max.x - WorkMinX) width, which means ClipRect.max.x cannot stray off host_clip_rect.Max.x else right-most column may appear shorter. + column->WorkMinX = column->MinX + table->CellPaddingX + table->CellSpacingX1; + column->WorkMaxX = column->MaxX - table->CellPaddingX - table->CellSpacingX2; // Expected max + column->ItemWidth = ImFloor(column->WidthGiven * 0.65f); + column->ClipRect.Min.x = column->MinX; + column->ClipRect.Min.y = work_rect.Min.y; + column->ClipRect.Max.x = column->MaxX; //column->WorkMaxX; + column->ClipRect.Max.y = FLT_MAX; + column->ClipRect.ClipWithFull(host_clip_rect); + + // Mark column as Clipped (not in sight) + // Note that scrolling tables (where inner_window != outer_window) handle Y clipped earlier in BeginTable() so IsVisibleY really only applies to non-scrolling tables. + // FIXME-TABLE: Because InnerClipRect.Max.y is conservatively ==outer_window->ClipRect.Max.y, we never can mark columns _Above_ the scroll line as not IsVisibleY. + // Taking advantage of LastOuterHeight would yield good results there... + // FIXME-TABLE: Y clipping is disabled because it effectively means not submitting will reduce contents width which is fed to outer_window->DC.CursorMaxPos.x, + // and this may be used (e.g. typically by outer_window using AlwaysAutoResize or outer_window's horizontal scrollbar, but could be something else). + // Possible solution to preserve last known content width for clipped column. Test 'table_reported_size' fails when enabling Y clipping and window is resized small. + column->IsVisibleX = (column->ClipRect.Max.x > column->ClipRect.Min.x); + column->IsVisibleY = true; // (column->ClipRect.Max.y > column->ClipRect.Min.y); + const bool is_visible = column->IsVisibleX; //&& column->IsVisibleY; + if (is_visible) + table->VisibleMaskByIndex |= ((ImU64)1 << column_n); + + // Mark column as requesting output from user. Note that fixed + non-resizable sets are auto-fitting at all times and therefore always request output. + column->IsRequestOutput = is_visible || column->AutoFitQueue != 0 || column->CannotSkipItemsQueue != 0; + if (column->IsRequestOutput) + table->RequestOutputMaskByIndex |= ((ImU64)1 << column_n); + + // Mark column as SkipItems (ignoring all items/layout) + column->IsSkipItems = !column->IsEnabled || table->HostSkipItems; + if (column->IsSkipItems) + IM_ASSERT(!is_visible); + + // Update status flags + column->Flags |= ImGuiTableColumnFlags_IsEnabled; + if (is_visible) + column->Flags |= ImGuiTableColumnFlags_IsVisible; + if (column->SortOrder != -1) + column->Flags |= ImGuiTableColumnFlags_IsSorted; + if (table->HoveredColumnBody == column_n) + column->Flags |= ImGuiTableColumnFlags_IsHovered; + + // Alignment + // FIXME-TABLE: This align based on the whole column width, not per-cell, and therefore isn't useful in + // many cases (to be able to honor this we might be able to store a log of cells width, per row, for + // visible rows, but nav/programmatic scroll would have visible artifacts.) + //if (column->Flags & ImGuiTableColumnFlags_AlignRight) + // column->WorkMinX = ImMax(column->WorkMinX, column->MaxX - column->ContentWidthRowsUnfrozen); + //else if (column->Flags & ImGuiTableColumnFlags_AlignCenter) + // column->WorkMinX = ImLerp(column->WorkMinX, ImMax(column->StartX, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f); + + // Reset content width variables + column->ContentMaxXFrozen = column->ContentMaxXUnfrozen = column->WorkMinX; + column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX; + + // Don't decrement auto-fit counters until container window got a chance to submit its items + if (table->HostSkipItems == false) + { + column->AutoFitQueue >>= 1; + column->CannotSkipItemsQueue >>= 1; + } + + if (visible_n < table->FreezeColumnsCount) + host_clip_rect.Min.x = ImClamp(column->MaxX + TABLE_BORDER_SIZE, host_clip_rect.Min.x, host_clip_rect.Max.x); + + offset_x += column->WidthGiven + table->CellSpacingX1 + table->CellSpacingX2 + table->CellPaddingX * 2.0f; + visible_n++; + } + + // [Part 7] Detect/store when we are hovering the unused space after the right-most column (so e.g. context menus can react on it) + // Clear Resizable flag if none of our column are actually resizable (either via an explicit _NoResize flag, either + // because of using _WidthAuto/_WidthStretch). This will hide the resizing option from the context menu. + const float unused_x1 = ImMax(table->WorkRect.Min.x, table->Columns[table->RightMostEnabledColumn].ClipRect.Max.x); + if (is_hovering_table && table->HoveredColumnBody == -1) + { + if (g.IO.MousePos.x >= unused_x1) + table->HoveredColumnBody = (ImGuiTableColumnIdx)table->ColumnsCount; + } + if (has_resizable == false && (table->Flags & ImGuiTableFlags_Resizable)) + table->Flags &= ~ImGuiTableFlags_Resizable; + + // [Part 8] Lock actual OuterRect/WorkRect right-most position. + // This is done late to handle the case of fixed-columns tables not claiming more widths that they need. + // Because of this we are careful with uses of WorkRect and InnerClipRect before this point. + if (table->RightMostStretchedColumn != -1) + table->Flags &= ~ImGuiTableFlags_NoHostExtendX; + if (table->Flags & ImGuiTableFlags_NoHostExtendX) + { + table->OuterRect.Max.x = table->WorkRect.Max.x = unused_x1; + table->InnerClipRect.Max.x = ImMin(table->InnerClipRect.Max.x, unused_x1); + } + table->InnerWindow->ParentWorkRect = table->WorkRect; + table->BorderX1 = table->InnerClipRect.Min.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : -1.0f); + table->BorderX2 = table->InnerClipRect.Max.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : +1.0f); + + // [Part 9] Allocate draw channels and setup background cliprect + TableSetupDrawChannels(table); + + // [Part 10] Hit testing on borders + if (table->Flags & ImGuiTableFlags_Resizable) + TableUpdateBorders(table); + table_instance->LastFirstRowHeight = 0.0f; + table->IsLayoutLocked = true; + table->IsUsingHeaders = false; + + // [Part 11] Context menu + if (table->IsContextPopupOpen && table->InstanceCurrent == table->InstanceInteracted) + { + const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); + if (BeginPopupEx(context_menu_id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings)) + { + TableDrawContextMenu(table); + EndPopup(); + } + else + { + table->IsContextPopupOpen = false; + } + } + + // [Part 13] Sanitize and build sort specs before we have a change to use them for display. + // This path will only be exercised when sort specs are modified before header rows (e.g. init or visibility change) + if (table->IsSortSpecsDirty && (table->Flags & ImGuiTableFlags_Sortable)) + TableSortSpecsBuild(table); + + // Initial state + ImGuiWindow* inner_window = table->InnerWindow; + if (table->Flags & ImGuiTableFlags_NoClip) + table->DrawSplitter->SetCurrentChannel(inner_window->DrawList, TABLE_DRAW_CHANNEL_NOCLIP); + else + inner_window->DrawList->PushClipRect(inner_window->ClipRect.Min, inner_window->ClipRect.Max, false); +} + +// Process hit-testing on resizing borders. Actual size change will be applied in EndTable() +// - Set table->HoveredColumnBorder with a short delay/timer to reduce feedback noise +// - Submit ahead of table contents and header, use ImGuiButtonFlags_AllowItemOverlap to prioritize widgets +// overlapping the same area. +void ImGui::TableUpdateBorders(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(table->Flags & ImGuiTableFlags_Resizable); + + // At this point OuterRect height may be zero or under actual final height, so we rely on temporal coherency and + // use the final height from last frame. Because this is only affecting _interaction_ with columns, it is not + // really problematic (whereas the actual visual will be displayed in EndTable() and using the current frame height). + // Actual columns highlight/render will be performed in EndTable() and not be affected. + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + const float hit_half_width = TABLE_RESIZE_SEPARATOR_HALF_THICKNESS; + const float hit_y1 = table->OuterRect.Min.y; + const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight); + const float hit_y2_head = hit_y1 + table_instance->LastFirstRowHeight; + + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n))) + continue; + + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) + continue; + + // ImGuiTableFlags_NoBordersInBodyUntilResize will be honored in TableDrawBorders() + const float border_y2_hit = (table->Flags & ImGuiTableFlags_NoBordersInBody) ? hit_y2_head : hit_y2_body; + if ((table->Flags & ImGuiTableFlags_NoBordersInBody) && table->IsUsingHeaders == false) + continue; + + if (!column->IsVisibleX && table->LastResizedColumn != column_n) + continue; + + ImGuiID column_id = TableGetColumnResizeID(table, column_n, table->InstanceCurrent); + ImRect hit_rect(column->MaxX - hit_half_width, hit_y1, column->MaxX + hit_half_width, border_y2_hit); + //GetForegroundDrawList()->AddRect(hit_rect.Min, hit_rect.Max, IM_COL32(255, 0, 0, 100)); + KeepAliveID(column_id); + + bool hovered = false, held = false; + bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_NoNavFocus); + if (pressed && IsMouseDoubleClicked(0)) + { + TableSetColumnWidthAutoSingle(table, column_n); + ClearActiveID(); + held = hovered = false; + } + if (held) + { + if (table->LastResizedColumn == -1) + table->ResizeLockMinContentsX2 = table->RightMostEnabledColumn != -1 ? table->Columns[table->RightMostEnabledColumn].MaxX : -FLT_MAX; + table->ResizedColumn = (ImGuiTableColumnIdx)column_n; + table->InstanceInteracted = table->InstanceCurrent; + } + if ((hovered && g.HoveredIdTimer > TABLE_RESIZE_SEPARATOR_FEEDBACK_TIMER) || held) + { + table->HoveredColumnBorder = (ImGuiTableColumnIdx)column_n; + SetMouseCursor(ImGuiMouseCursor_ResizeEW); + } + } +} + +void ImGui::EndTable() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Only call EndTable() if BeginTable() returns true!"); + + // This assert would be very useful to catch a common error... unfortunately it would probably trigger in some + // cases, and for consistency user may sometimes output empty tables (and still benefit from e.g. outer border) + //IM_ASSERT(table->IsLayoutLocked && "Table unused: never called TableNextRow(), is that the intent?"); + + // If the user never got to call TableNextRow() or TableNextColumn(), we call layout ourselves to ensure all our + // code paths are consistent (instead of just hoping that TableBegin/TableEnd will work), get borders drawn, etc. + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + + const ImGuiTableFlags flags = table->Flags; + ImGuiWindow* inner_window = table->InnerWindow; + ImGuiWindow* outer_window = table->OuterWindow; + ImGuiTableTempData* temp_data = table->TempData; + IM_ASSERT(inner_window == g.CurrentWindow); + IM_ASSERT(outer_window == inner_window || outer_window == inner_window->ParentWindow); + + if (table->IsInsideRow) + TableEndRow(table); + + // Context menu in columns body + if (flags & ImGuiTableFlags_ContextMenuInBody) + if (table->HoveredColumnBody != -1 && !IsAnyItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) + TableOpenContextMenu((int)table->HoveredColumnBody); + + // Finalize table height + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + inner_window->DC.PrevLineSize = temp_data->HostBackupPrevLineSize; + inner_window->DC.CurrLineSize = temp_data->HostBackupCurrLineSize; + inner_window->DC.CursorMaxPos = temp_data->HostBackupCursorMaxPos; + const float inner_content_max_y = table->RowPosY2; + IM_ASSERT(table->RowPosY2 == inner_window->DC.CursorPos.y); + if (inner_window != outer_window) + inner_window->DC.CursorMaxPos.y = inner_content_max_y; + else if (!(flags & ImGuiTableFlags_NoHostExtendY)) + table->OuterRect.Max.y = table->InnerRect.Max.y = ImMax(table->OuterRect.Max.y, inner_content_max_y); // Patch OuterRect/InnerRect height + table->WorkRect.Max.y = ImMax(table->WorkRect.Max.y, table->OuterRect.Max.y); + table_instance->LastOuterHeight = table->OuterRect.GetHeight(); + + // Setup inner scrolling range + // FIXME: This ideally should be done earlier, in BeginTable() SetNextWindowContentSize call, just like writing to inner_window->DC.CursorMaxPos.y, + // but since the later is likely to be impossible to do we'd rather update both axises together. + if (table->Flags & ImGuiTableFlags_ScrollX) + { + const float outer_padding_for_border = (table->Flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; + float max_pos_x = table->InnerWindow->DC.CursorMaxPos.x; + if (table->RightMostEnabledColumn != -1) + max_pos_x = ImMax(max_pos_x, table->Columns[table->RightMostEnabledColumn].WorkMaxX + table->CellPaddingX + table->OuterPaddingX - outer_padding_for_border); + if (table->ResizedColumn != -1) + max_pos_x = ImMax(max_pos_x, table->ResizeLockMinContentsX2); + table->InnerWindow->DC.CursorMaxPos.x = max_pos_x; + } + + // Pop clipping rect + if (!(flags & ImGuiTableFlags_NoClip)) + inner_window->DrawList->PopClipRect(); + inner_window->ClipRect = inner_window->DrawList->_ClipRectStack.back(); + + // Draw borders + if ((flags & ImGuiTableFlags_Borders) != 0) + TableDrawBorders(table); + +#if 0 + // Strip out dummy channel draw calls + // We have no way to prevent user submitting direct ImDrawList calls into a hidden column (but ImGui:: calls will be clipped out) + // Pros: remove draw calls which will have no effect. since they'll have zero-size cliprect they may be early out anyway. + // Cons: making it harder for users watching metrics/debugger to spot the wasted vertices. + if (table->DummyDrawChannel != (ImGuiTableColumnIdx)-1) + { + ImDrawChannel* dummy_channel = &table->DrawSplitter._Channels[table->DummyDrawChannel]; + dummy_channel->_CmdBuffer.resize(0); + dummy_channel->_IdxBuffer.resize(0); + } +#endif + + // Flatten channels and merge draw calls + ImDrawListSplitter* splitter = table->DrawSplitter; + splitter->SetCurrentChannel(inner_window->DrawList, 0); + if ((table->Flags & ImGuiTableFlags_NoClip) == 0) + TableMergeDrawChannels(table); + splitter->Merge(inner_window->DrawList); + + // Update ColumnsAutoFitWidth to get us ahead for host using our size to auto-resize without waiting for next BeginTable() + float auto_fit_width_for_fixed = 0.0f; + float auto_fit_width_for_stretched = 0.0f; + float auto_fit_width_for_stretched_min = 0.0f; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (table->EnabledMaskByIndex & ((ImU64)1 << column_n)) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + float column_width_request = ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !(column->Flags & ImGuiTableColumnFlags_NoResize)) ? column->WidthRequest : TableGetColumnWidthAuto(table, column); + if (column->Flags & ImGuiTableColumnFlags_WidthFixed) + auto_fit_width_for_fixed += column_width_request; + else + auto_fit_width_for_stretched += column_width_request; + if ((column->Flags & ImGuiTableColumnFlags_WidthStretch) && (column->Flags & ImGuiTableColumnFlags_NoResize) != 0) + auto_fit_width_for_stretched_min = ImMax(auto_fit_width_for_stretched_min, column_width_request / (column->StretchWeight / table->ColumnsStretchSumWeights)); + } + const float width_spacings = (table->OuterPaddingX * 2.0f) + (table->CellSpacingX1 + table->CellSpacingX2) * (table->ColumnsEnabledCount - 1); + table->ColumnsAutoFitWidth = width_spacings + (table->CellPaddingX * 2.0f) * table->ColumnsEnabledCount + auto_fit_width_for_fixed + ImMax(auto_fit_width_for_stretched, auto_fit_width_for_stretched_min); + + // Update scroll + if ((table->Flags & ImGuiTableFlags_ScrollX) == 0 && inner_window != outer_window) + { + inner_window->Scroll.x = 0.0f; + } + else if (table->LastResizedColumn != -1 && table->ResizedColumn == -1 && inner_window->ScrollbarX && table->InstanceInteracted == table->InstanceCurrent) + { + // When releasing a column being resized, scroll to keep the resulting column in sight + const float neighbor_width_to_keep_visible = table->MinColumnWidth + table->CellPaddingX * 2.0f; + ImGuiTableColumn* column = &table->Columns[table->LastResizedColumn]; + if (column->MaxX < table->InnerClipRect.Min.x) + SetScrollFromPosX(inner_window, column->MaxX - inner_window->Pos.x - neighbor_width_to_keep_visible, 1.0f); + else if (column->MaxX > table->InnerClipRect.Max.x) + SetScrollFromPosX(inner_window, column->MaxX - inner_window->Pos.x + neighbor_width_to_keep_visible, 1.0f); + } + + // Apply resizing/dragging at the end of the frame + if (table->ResizedColumn != -1 && table->InstanceCurrent == table->InstanceInteracted) + { + ImGuiTableColumn* column = &table->Columns[table->ResizedColumn]; + const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + TABLE_RESIZE_SEPARATOR_HALF_THICKNESS); + const float new_width = ImFloor(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f); + table->ResizedColumnNextWidth = new_width; + } + + // Pop from id stack + IM_ASSERT_USER_ERROR(inner_window->IDStack.back() == table->ID + table->InstanceCurrent, "Mismatching PushID/PopID!"); + IM_ASSERT_USER_ERROR(outer_window->DC.ItemWidthStack.Size >= temp_data->HostBackupItemWidthStackSize, "Too many PopItemWidth!"); + PopID(); + + // Restore window data that we modified + const ImVec2 backup_outer_max_pos = outer_window->DC.CursorMaxPos; + inner_window->WorkRect = temp_data->HostBackupWorkRect; + inner_window->ParentWorkRect = temp_data->HostBackupParentWorkRect; + inner_window->SkipItems = table->HostSkipItems; + outer_window->DC.CursorPos = table->OuterRect.Min; + outer_window->DC.ItemWidth = temp_data->HostBackupItemWidth; + outer_window->DC.ItemWidthStack.Size = temp_data->HostBackupItemWidthStackSize; + outer_window->DC.ColumnsOffset = temp_data->HostBackupColumnsOffset; + + // Layout in outer window + // (FIXME: To allow auto-fit and allow desirable effect of SameLine() we dissociate 'used' vs 'ideal' size by overriding + // CursorPosPrevLine and CursorMaxPos manually. That should be a more general layout feature, see same problem e.g. #3414) + if (inner_window != outer_window) + { + EndChild(); + } + else + { + ItemSize(table->OuterRect.GetSize()); + ItemAdd(table->OuterRect, 0); + } + + // Override declared contents width/height to enable auto-resize while not needlessly adding a scrollbar + if (table->Flags & ImGuiTableFlags_NoHostExtendX) + { + // FIXME-TABLE: Could we remove this section? + // ColumnsAutoFitWidth may be one frame ahead here since for Fixed+NoResize is calculated from latest contents + IM_ASSERT((table->Flags & ImGuiTableFlags_ScrollX) == 0); + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth); + } + else if (temp_data->UserOuterSize.x <= 0.0f) + { + const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.x : 0.0f; + outer_window->DC.IdealMaxPos.x = ImMax(outer_window->DC.IdealMaxPos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth + decoration_size - temp_data->UserOuterSize.x); + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, ImMin(table->OuterRect.Max.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth)); + } + else + { + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, table->OuterRect.Max.x); + } + if (temp_data->UserOuterSize.y <= 0.0f) + { + const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollY) ? inner_window->ScrollbarSizes.y : 0.0f; + outer_window->DC.IdealMaxPos.y = ImMax(outer_window->DC.IdealMaxPos.y, inner_content_max_y + decoration_size - temp_data->UserOuterSize.y); + outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, ImMin(table->OuterRect.Max.y, inner_content_max_y)); + } + else + { + // OuterRect.Max.y may already have been pushed downward from the initial value (unless ImGuiTableFlags_NoHostExtendY is set) + outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, table->OuterRect.Max.y); + } + + // Save settings + if (table->IsSettingsDirty) + TableSaveSettings(table); + table->IsInitializing = false; + + // Clear or restore current table, if any + IM_ASSERT(g.CurrentWindow == outer_window && g.CurrentTable == table); + IM_ASSERT(g.TablesTempDataStacked > 0); + temp_data = (--g.TablesTempDataStacked > 0) ? &g.TablesTempData[g.TablesTempDataStacked - 1] : NULL; + g.CurrentTable = temp_data ? g.Tables.GetByIndex(temp_data->TableIndex) : NULL; + if (g.CurrentTable) + { + g.CurrentTable->TempData = temp_data; + g.CurrentTable->DrawSplitter = &temp_data->DrawSplitter; + } + outer_window->DC.CurrentTableIdx = g.CurrentTable ? g.Tables.GetIndex(g.CurrentTable) : -1; +} + +// See "COLUMN SIZING POLICIES" comments at the top of this file +// If (init_width_or_weight <= 0.0f) it is ignored +void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, float init_width_or_weight, ImGuiID user_id) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!"); + IM_ASSERT(table->IsLayoutLocked == false && "Need to call call TableSetupColumn() before first row!"); + IM_ASSERT((flags & ImGuiTableColumnFlags_StatusMask_) == 0 && "Illegal to pass StatusMask values to TableSetupColumn()"); + if (table->DeclColumnsCount >= table->ColumnsCount) + { + IM_ASSERT_USER_ERROR(table->DeclColumnsCount < table->ColumnsCount, "Called TableSetupColumn() too many times!"); + return; + } + + ImGuiTableColumn* column = &table->Columns[table->DeclColumnsCount]; + table->DeclColumnsCount++; + + // Assert when passing a width or weight if policy is entirely left to default, to avoid storing width into weight and vice-versa. + // Give a grace to users of ImGuiTableFlags_ScrollX. + if (table->IsDefaultSizingPolicy && (flags & ImGuiTableColumnFlags_WidthMask_) == 0 && (flags & ImGuiTableFlags_ScrollX) == 0) + IM_ASSERT(init_width_or_weight <= 0.0f && "Can only specify width/weight if sizing policy is set explicitly in either Table or Column."); + + // When passing a width automatically enforce WidthFixed policy + // (whereas TableSetupColumnFlags would default to WidthAuto if table is not Resizable) + if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0 && init_width_or_weight > 0.0f) + if ((table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedFit || (table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) + flags |= ImGuiTableColumnFlags_WidthFixed; + + TableSetupColumnFlags(table, column, flags); + column->UserID = user_id; + flags = column->Flags; + + // Initialize defaults + column->InitStretchWeightOrWidth = init_width_or_weight; + if (table->IsInitializing) + { + // Init width or weight + if (column->WidthRequest < 0.0f && column->StretchWeight < 0.0f) + { + if ((flags & ImGuiTableColumnFlags_WidthFixed) && init_width_or_weight > 0.0f) + column->WidthRequest = init_width_or_weight; + if (flags & ImGuiTableColumnFlags_WidthStretch) + column->StretchWeight = (init_width_or_weight > 0.0f) ? init_width_or_weight : -1.0f; + + // Disable auto-fit if an explicit width/weight has been specified + if (init_width_or_weight > 0.0f) + column->AutoFitQueue = 0x00; + } + + // Init default visibility/sort state + if ((flags & ImGuiTableColumnFlags_DefaultHide) && (table->SettingsLoadedFlags & ImGuiTableFlags_Hideable) == 0) + column->IsUserEnabled = column->IsUserEnabledNextFrame = false; + if (flags & ImGuiTableColumnFlags_DefaultSort && (table->SettingsLoadedFlags & ImGuiTableFlags_Sortable) == 0) + { + column->SortOrder = 0; // Multiple columns using _DefaultSort will be reassigned unique SortOrder values when building the sort specs. + column->SortDirection = (column->Flags & ImGuiTableColumnFlags_PreferSortDescending) ? (ImS8)ImGuiSortDirection_Descending : (ImU8)(ImGuiSortDirection_Ascending); + } + } + + // Store name (append with zero-terminator in contiguous buffer) + column->NameOffset = -1; + if (label != NULL && label[0] != 0) + { + column->NameOffset = (ImS16)table->ColumnsNames.size(); + table->ColumnsNames.append(label, label + strlen(label) + 1); + } +} + +// [Public] +void ImGui::TableSetupScrollFreeze(int columns, int rows) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!"); + IM_ASSERT(table->IsLayoutLocked == false && "Need to call TableSetupColumn() before first row!"); + IM_ASSERT(columns >= 0 && columns < IMGUI_TABLE_MAX_COLUMNS); + IM_ASSERT(rows >= 0 && rows < 128); // Arbitrary limit + + table->FreezeColumnsRequest = (table->Flags & ImGuiTableFlags_ScrollX) ? (ImGuiTableColumnIdx)ImMin(columns, table->ColumnsCount) : 0; + table->FreezeColumnsCount = (table->InnerWindow->Scroll.x != 0.0f) ? table->FreezeColumnsRequest : 0; + table->FreezeRowsRequest = (table->Flags & ImGuiTableFlags_ScrollY) ? (ImGuiTableColumnIdx)rows : 0; + table->FreezeRowsCount = (table->InnerWindow->Scroll.y != 0.0f) ? table->FreezeRowsRequest : 0; + table->IsUnfrozenRows = (table->FreezeRowsCount == 0); // Make sure this is set before TableUpdateLayout() so ImGuiListClipper can benefit from it.b + + // Ensure frozen columns are ordered in their section. We still allow multiple frozen columns to be reordered. + // FIXME-TABLE: This work for preserving 2143 into 21|43. How about 4321 turning into 21|43? (preserve relative order in each section) + for (int column_n = 0; column_n < table->FreezeColumnsRequest; column_n++) + { + int order_n = table->DisplayOrderToIndex[column_n]; + if (order_n != column_n && order_n >= table->FreezeColumnsRequest) + { + ImSwap(table->Columns[table->DisplayOrderToIndex[order_n]].DisplayOrder, table->Columns[table->DisplayOrderToIndex[column_n]].DisplayOrder); + ImSwap(table->DisplayOrderToIndex[order_n], table->DisplayOrderToIndex[column_n]); + } + } +} + +//----------------------------------------------------------------------------- +// [SECTION] Tables: Simple accessors +//----------------------------------------------------------------------------- +// - TableGetColumnCount() +// - TableGetColumnName() +// - TableGetColumnName() [Internal] +// - TableSetColumnEnabled() +// - TableGetColumnFlags() +// - TableGetCellBgRect() [Internal] +// - TableGetColumnResizeID() [Internal] +// - TableGetHoveredColumn() [Internal] +// - TableSetBgColor() +//----------------------------------------------------------------------------- + +int ImGui::TableGetColumnCount() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + return table ? table->ColumnsCount : 0; +} + +const char* ImGui::TableGetColumnName(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return NULL; + if (column_n < 0) + column_n = table->CurrentColumn; + return TableGetColumnName(table, column_n); +} + +const char* ImGui::TableGetColumnName(const ImGuiTable* table, int column_n) +{ + if (table->IsLayoutLocked == false && column_n >= table->DeclColumnsCount) + return ""; // NameOffset is invalid at this point + const ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->NameOffset == -1) + return ""; + return &table->ColumnsNames.Buf[column->NameOffset]; +} + +// Change user accessible enabled/disabled state of a column (often perceived as "showing/hiding" from users point of view) +// Note that end-user can use the context menu to change this themselves (right-click in headers, or right-click in columns body with ImGuiTableFlags_ContextMenuInBody) +// - Require table to have the ImGuiTableFlags_Hideable flag because we are manipulating user accessible state. +// - Request will be applied during next layout, which happens on the first call to TableNextRow() after BeginTable(). +// - For the getter you can test (TableGetColumnFlags() & ImGuiTableColumnFlags_IsEnabled) != 0. +// - Alternative: the ImGuiTableColumnFlags_Disabled is an overriding/master disable flag which will also hide the column from context menu. +void ImGui::TableSetColumnEnabled(int column_n, bool enabled) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL); + if (!table) + return; + IM_ASSERT(table->Flags & ImGuiTableFlags_Hideable); // See comments above + if (column_n < 0) + column_n = table->CurrentColumn; + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + ImGuiTableColumn* column = &table->Columns[column_n]; + column->IsUserEnabledNextFrame = enabled; +} + +// We allow querying for an extra column in order to poll the IsHovered state of the right-most section +ImGuiTableColumnFlags ImGui::TableGetColumnFlags(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return ImGuiTableColumnFlags_None; + if (column_n < 0) + column_n = table->CurrentColumn; + if (column_n == table->ColumnsCount) + return (table->HoveredColumnBody == column_n) ? ImGuiTableColumnFlags_IsHovered : ImGuiTableColumnFlags_None; + return table->Columns[column_n].Flags; +} + +// Return the cell rectangle based on currently known height. +// - Important: we generally don't know our row height until the end of the row, so Max.y will be incorrect in many situations. +// The only case where this is correct is if we provided a min_row_height to TableNextRow() and don't go below it, or in TableEndRow() when we locked that height. +// - Important: if ImGuiTableFlags_PadOuterX is set but ImGuiTableFlags_PadInnerX is not set, the outer-most left and right +// columns report a small offset so their CellBgRect can extend up to the outer border. +// FIXME: But the rendering code in TableEndRow() nullifies that with clamping required for scrolling. +ImRect ImGui::TableGetCellBgRect(const ImGuiTable* table, int column_n) +{ + const ImGuiTableColumn* column = &table->Columns[column_n]; + float x1 = column->MinX; + float x2 = column->MaxX; + //if (column->PrevEnabledColumn == -1) + // x1 -= table->OuterPaddingX; + //if (column->NextEnabledColumn == -1) + // x2 += table->OuterPaddingX; + x1 = ImMax(x1, table->WorkRect.Min.x); + x2 = ImMin(x2, table->WorkRect.Max.x); + return ImRect(x1, table->RowPosY1, x2, table->RowPosY2); +} + +// Return the resizing ID for the right-side of the given column. +ImGuiID ImGui::TableGetColumnResizeID(const ImGuiTable* table, int column_n, int instance_no) +{ + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + ImGuiID id = table->ID + 1 + (instance_no * table->ColumnsCount) + column_n; + return id; +} + +// Return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. +int ImGui::TableGetHoveredColumn() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return -1; + return (int)table->HoveredColumnBody; +} + +void ImGui::TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(target != ImGuiTableBgTarget_None); + + if (color == IM_COL32_DISABLE) + color = 0; + + // We cannot draw neither the cell or row background immediately as we don't know the row height at this point in time. + switch (target) + { + case ImGuiTableBgTarget_CellBg: + { + if (table->RowPosY1 > table->InnerClipRect.Max.y) // Discard + return; + if (column_n == -1) + column_n = table->CurrentColumn; + if ((table->VisibleMaskByIndex & ((ImU64)1 << column_n)) == 0) + return; + if (table->RowCellDataCurrent < 0 || table->RowCellData[table->RowCellDataCurrent].Column != column_n) + table->RowCellDataCurrent++; + ImGuiTableCellData* cell_data = &table->RowCellData[table->RowCellDataCurrent]; + cell_data->BgColor = color; + cell_data->Column = (ImGuiTableColumnIdx)column_n; + break; + } + case ImGuiTableBgTarget_RowBg0: + case ImGuiTableBgTarget_RowBg1: + { + if (table->RowPosY1 > table->InnerClipRect.Max.y) // Discard + return; + IM_ASSERT(column_n == -1); + int bg_idx = (target == ImGuiTableBgTarget_RowBg1) ? 1 : 0; + table->RowBgColor[bg_idx] = color; + break; + } + default: + IM_ASSERT(0); + } +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Row changes +//------------------------------------------------------------------------- +// - TableGetRowIndex() +// - TableNextRow() +// - TableBeginRow() [Internal] +// - TableEndRow() [Internal] +//------------------------------------------------------------------------- + +// [Public] Note: for row coloring we use ->RowBgColorCounter which is the same value without counting header rows +int ImGui::TableGetRowIndex() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return 0; + return table->CurrentRow; +} + +// [Public] Starts into the first cell of a new row +void ImGui::TableNextRow(ImGuiTableRowFlags row_flags, float row_min_height) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + if (table->IsInsideRow) + TableEndRow(table); + + table->LastRowFlags = table->RowFlags; + table->RowFlags = row_flags; + table->RowMinHeight = row_min_height; + TableBeginRow(table); + + // We honor min_row_height requested by user, but cannot guarantee per-row maximum height, + // because that would essentially require a unique clipping rectangle per-cell. + table->RowPosY2 += table->CellPaddingY * 2.0f; + table->RowPosY2 = ImMax(table->RowPosY2, table->RowPosY1 + row_min_height); + + // Disable output until user calls TableNextColumn() + table->InnerWindow->SkipItems = true; +} + +// [Internal] Called by TableNextRow() +void ImGui::TableBeginRow(ImGuiTable* table) +{ + ImGuiWindow* window = table->InnerWindow; + IM_ASSERT(!table->IsInsideRow); + + // New row + table->CurrentRow++; + table->CurrentColumn = -1; + table->RowBgColor[0] = table->RowBgColor[1] = IM_COL32_DISABLE; + table->RowCellDataCurrent = -1; + table->IsInsideRow = true; + + // Begin frozen rows + float next_y1 = table->RowPosY2; + if (table->CurrentRow == 0 && table->FreezeRowsCount > 0) + next_y1 = window->DC.CursorPos.y = table->OuterRect.Min.y; + + table->RowPosY1 = table->RowPosY2 = next_y1; + table->RowTextBaseline = 0.0f; + table->RowIndentOffsetX = window->DC.Indent.x - table->HostIndentX; // Lock indent + window->DC.PrevLineTextBaseOffset = 0.0f; + window->DC.CursorMaxPos.y = next_y1; + + // Making the header BG color non-transparent will allow us to overlay it multiple times when handling smooth dragging. + if (table->RowFlags & ImGuiTableRowFlags_Headers) + { + TableSetBgColor(ImGuiTableBgTarget_RowBg0, GetColorU32(ImGuiCol_TableHeaderBg)); + if (table->CurrentRow == 0) + table->IsUsingHeaders = true; + } +} + +// [Internal] Called by TableNextRow() +void ImGui::TableEndRow(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(window == table->InnerWindow); + IM_ASSERT(table->IsInsideRow); + + if (table->CurrentColumn != -1) + TableEndCell(table); + + // Logging + if (g.LogEnabled) + LogRenderedText(NULL, "|"); + + // Position cursor at the bottom of our row so it can be used for e.g. clipping calculation. However it is + // likely that the next call to TableBeginCell() will reposition the cursor to take account of vertical padding. + window->DC.CursorPos.y = table->RowPosY2; + + // Row background fill + const float bg_y1 = table->RowPosY1; + const float bg_y2 = table->RowPosY2; + const bool unfreeze_rows_actual = (table->CurrentRow + 1 == table->FreezeRowsCount); + const bool unfreeze_rows_request = (table->CurrentRow + 1 == table->FreezeRowsRequest); + if (table->CurrentRow == 0) + TableGetInstanceData(table, table->InstanceCurrent)->LastFirstRowHeight = bg_y2 - bg_y1; + + const bool is_visible = (bg_y2 >= table->InnerClipRect.Min.y && bg_y1 <= table->InnerClipRect.Max.y); + if (is_visible) + { + // Decide of background color for the row + ImU32 bg_col0 = 0; + ImU32 bg_col1 = 0; + if (table->RowBgColor[0] != IM_COL32_DISABLE) + bg_col0 = table->RowBgColor[0]; + else if (table->Flags & ImGuiTableFlags_RowBg) + bg_col0 = GetColorU32((table->RowBgColorCounter & 1) ? ImGuiCol_TableRowBgAlt : ImGuiCol_TableRowBg); + if (table->RowBgColor[1] != IM_COL32_DISABLE) + bg_col1 = table->RowBgColor[1]; + + // Decide of top border color + ImU32 border_col = 0; + const float border_size = TABLE_BORDER_SIZE; + if (table->CurrentRow > 0 || table->InnerWindow == table->OuterWindow) + if (table->Flags & ImGuiTableFlags_BordersInnerH) + border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight; + + const bool draw_cell_bg_color = table->RowCellDataCurrent >= 0; + const bool draw_strong_bottom_border = unfreeze_rows_actual; + if ((bg_col0 | bg_col1 | border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color) + { + // In theory we could call SetWindowClipRectBeforeSetChannel() but since we know TableEndRow() is + // always followed by a change of clipping rectangle we perform the smallest overwrite possible here. + if ((table->Flags & ImGuiTableFlags_NoClip) == 0) + window->DrawList->_CmdHeader.ClipRect = table->Bg0ClipRectForDrawCmd.ToVec4(); + table->DrawSplitter->SetCurrentChannel(window->DrawList, TABLE_DRAW_CHANNEL_BG0); + } + + // Draw row background + // We soft/cpu clip this so all backgrounds and borders can share the same clipping rectangle + if (bg_col0 || bg_col1) + { + ImRect row_rect(table->WorkRect.Min.x, bg_y1, table->WorkRect.Max.x, bg_y2); + row_rect.ClipWith(table->BgClipRect); + if (bg_col0 != 0 && row_rect.Min.y < row_rect.Max.y) + window->DrawList->AddRectFilled(row_rect.Min, row_rect.Max, bg_col0); + if (bg_col1 != 0 && row_rect.Min.y < row_rect.Max.y) + window->DrawList->AddRectFilled(row_rect.Min, row_rect.Max, bg_col1); + } + + // Draw cell background color + if (draw_cell_bg_color) + { + ImGuiTableCellData* cell_data_end = &table->RowCellData[table->RowCellDataCurrent]; + for (ImGuiTableCellData* cell_data = &table->RowCellData[0]; cell_data <= cell_data_end; cell_data++) + { + // As we render the BG here we need to clip things (for layout we would not) + // FIXME: This cancels the OuterPadding addition done by TableGetCellBgRect(), need to keep it while rendering correctly while scrolling. + const ImGuiTableColumn* column = &table->Columns[cell_data->Column]; + ImRect cell_bg_rect = TableGetCellBgRect(table, cell_data->Column); + cell_bg_rect.ClipWith(table->BgClipRect); + cell_bg_rect.Min.x = ImMax(cell_bg_rect.Min.x, column->ClipRect.Min.x); // So that first column after frozen one gets clipped when scrolling + cell_bg_rect.Max.x = ImMin(cell_bg_rect.Max.x, column->MaxX); + window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor); + } + } + + // Draw top border + if (border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y) + window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), border_col, border_size); + + // Draw bottom border at the row unfreezing mark (always strong) + if (draw_strong_bottom_border && bg_y2 >= table->BgClipRect.Min.y && bg_y2 < table->BgClipRect.Max.y) + window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y2), ImVec2(table->BorderX2, bg_y2), table->BorderColorStrong, border_size); + } + + // End frozen rows (when we are past the last frozen row line, teleport cursor and alter clipping rectangle) + // We need to do that in TableEndRow() instead of TableBeginRow() so the list clipper can mark end of row and + // get the new cursor position. + if (unfreeze_rows_request) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + column->NavLayerCurrent = (ImS8)((column_n < table->FreezeColumnsCount) ? ImGuiNavLayer_Menu : ImGuiNavLayer_Main); + } + if (unfreeze_rows_actual) + { + IM_ASSERT(table->IsUnfrozenRows == false); + table->IsUnfrozenRows = true; + + // BgClipRect starts as table->InnerClipRect, reduce it now and make BgClipRectForDrawCmd == BgClipRect + float y0 = ImMax(table->RowPosY2 + 1, window->InnerClipRect.Min.y); + table->BgClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y = ImMin(y0, window->InnerClipRect.Max.y); + table->BgClipRect.Max.y = table->Bg2ClipRectForDrawCmd.Max.y = window->InnerClipRect.Max.y; + table->Bg2DrawChannelCurrent = table->Bg2DrawChannelUnfrozen; + IM_ASSERT(table->Bg2ClipRectForDrawCmd.Min.y <= table->Bg2ClipRectForDrawCmd.Max.y); + + float row_height = table->RowPosY2 - table->RowPosY1; + table->RowPosY2 = window->DC.CursorPos.y = table->WorkRect.Min.y + table->RowPosY2 - table->OuterRect.Min.y; + table->RowPosY1 = table->RowPosY2 - row_height; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + column->DrawChannelCurrent = column->DrawChannelUnfrozen; + column->ClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y; + } + + // Update cliprect ahead of TableBeginCell() so clipper can access to new ClipRect->Min.y + SetWindowClipRectBeforeSetChannel(window, table->Columns[0].ClipRect); + table->DrawSplitter->SetCurrentChannel(window->DrawList, table->Columns[0].DrawChannelCurrent); + } + + if (!(table->RowFlags & ImGuiTableRowFlags_Headers)) + table->RowBgColorCounter++; + table->IsInsideRow = false; +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Columns changes +//------------------------------------------------------------------------- +// - TableGetColumnIndex() +// - TableSetColumnIndex() +// - TableNextColumn() +// - TableBeginCell() [Internal] +// - TableEndCell() [Internal] +//------------------------------------------------------------------------- + +int ImGui::TableGetColumnIndex() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return 0; + return table->CurrentColumn; +} + +// [Public] Append into a specific column +bool ImGui::TableSetColumnIndex(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return false; + + if (table->CurrentColumn != column_n) + { + if (table->CurrentColumn != -1) + TableEndCell(table); + IM_ASSERT(column_n >= 0 && table->ColumnsCount); + TableBeginCell(table, column_n); + } + + // Return whether the column is visible. User may choose to skip submitting items based on this return value, + // however they shouldn't skip submitting for columns that may have the tallest contribution to row height. + return (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n)) != 0; +} + +// [Public] Append into the next column, wrap and create a new row when already on last column +bool ImGui::TableNextColumn() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return false; + + if (table->IsInsideRow && table->CurrentColumn + 1 < table->ColumnsCount) + { + if (table->CurrentColumn != -1) + TableEndCell(table); + TableBeginCell(table, table->CurrentColumn + 1); + } + else + { + TableNextRow(); + TableBeginCell(table, 0); + } + + // Return whether the column is visible. User may choose to skip submitting items based on this return value, + // however they shouldn't skip submitting for columns that may have the tallest contribution to row height. + int column_n = table->CurrentColumn; + return (table->RequestOutputMaskByIndex & ((ImU64)1 << column_n)) != 0; +} + + +// [Internal] Called by TableSetColumnIndex()/TableNextColumn() +// This is called very frequently, so we need to be mindful of unnecessary overhead. +// FIXME-TABLE FIXME-OPT: Could probably shortcut some things for non-active or clipped columns. +void ImGui::TableBeginCell(ImGuiTable* table, int column_n) +{ + ImGuiTableColumn* column = &table->Columns[column_n]; + ImGuiWindow* window = table->InnerWindow; + table->CurrentColumn = column_n; + + // Start position is roughly ~~ CellRect.Min + CellPadding + Indent + float start_x = column->WorkMinX; + if (column->Flags & ImGuiTableColumnFlags_IndentEnable) + start_x += table->RowIndentOffsetX; // ~~ += window.DC.Indent.x - table->HostIndentX, except we locked it for the row. + + window->DC.CursorPos.x = start_x; + window->DC.CursorPos.y = table->RowPosY1 + table->CellPaddingY; + window->DC.CursorMaxPos.x = window->DC.CursorPos.x; + window->DC.ColumnsOffset.x = start_x - window->Pos.x - window->DC.Indent.x; // FIXME-WORKRECT + window->DC.CurrLineTextBaseOffset = table->RowTextBaseline; + window->DC.NavLayerCurrent = (ImGuiNavLayer)column->NavLayerCurrent; + + window->WorkRect.Min.y = window->DC.CursorPos.y; + window->WorkRect.Min.x = column->WorkMinX; + window->WorkRect.Max.x = column->WorkMaxX; + window->DC.ItemWidth = column->ItemWidth; + + // To allow ImGuiListClipper to function we propagate our row height + if (!column->IsEnabled) + window->DC.CursorPos.y = ImMax(window->DC.CursorPos.y, table->RowPosY2); + + window->SkipItems = column->IsSkipItems; + if (column->IsSkipItems) + { + ImGuiContext& g = *GImGui; + g.LastItemData.ID = 0; + g.LastItemData.StatusFlags = 0; + } + + if (table->Flags & ImGuiTableFlags_NoClip) + { + // FIXME: if we end up drawing all borders/bg in EndTable, could remove this and just assert that channel hasn't changed. + table->DrawSplitter->SetCurrentChannel(window->DrawList, TABLE_DRAW_CHANNEL_NOCLIP); + //IM_ASSERT(table->DrawSplitter._Current == TABLE_DRAW_CHANNEL_NOCLIP); + } + else + { + // FIXME-TABLE: Could avoid this if draw channel is dummy channel? + SetWindowClipRectBeforeSetChannel(window, column->ClipRect); + table->DrawSplitter->SetCurrentChannel(window->DrawList, column->DrawChannelCurrent); + } + + // Logging + ImGuiContext& g = *GImGui; + if (g.LogEnabled && !column->IsSkipItems) + { + LogRenderedText(&window->DC.CursorPos, "|"); + g.LogLinePosY = FLT_MAX; + } +} + +// [Internal] Called by TableNextRow()/TableSetColumnIndex()/TableNextColumn() +void ImGui::TableEndCell(ImGuiTable* table) +{ + ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; + ImGuiWindow* window = table->InnerWindow; + + // Report maximum position so we can infer content size per column. + float* p_max_pos_x; + if (table->RowFlags & ImGuiTableRowFlags_Headers) + p_max_pos_x = &column->ContentMaxXHeadersUsed; // Useful in case user submit contents in header row that is not a TableHeader() call + else + p_max_pos_x = table->IsUnfrozenRows ? &column->ContentMaxXUnfrozen : &column->ContentMaxXFrozen; + *p_max_pos_x = ImMax(*p_max_pos_x, window->DC.CursorMaxPos.x); + table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->CellPaddingY); + column->ItemWidth = window->DC.ItemWidth; + + // Propagate text baseline for the entire row + // FIXME-TABLE: Here we propagate text baseline from the last line of the cell.. instead of the first one. + table->RowTextBaseline = ImMax(table->RowTextBaseline, window->DC.PrevLineTextBaseOffset); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Columns width management +//------------------------------------------------------------------------- +// - TableGetMaxColumnWidth() [Internal] +// - TableGetColumnWidthAuto() [Internal] +// - TableSetColumnWidth() +// - TableSetColumnWidthAutoSingle() [Internal] +// - TableSetColumnWidthAutoAll() [Internal] +// - TableUpdateColumnsWeightFromWidth() [Internal] +//------------------------------------------------------------------------- + +// Maximum column content width given current layout. Use column->MinX so this value on a per-column basis. +float ImGui::TableGetMaxColumnWidth(const ImGuiTable* table, int column_n) +{ + const ImGuiTableColumn* column = &table->Columns[column_n]; + float max_width = FLT_MAX; + const float min_column_distance = table->MinColumnWidth + table->CellPaddingX * 2.0f + table->CellSpacingX1 + table->CellSpacingX2; + if (table->Flags & ImGuiTableFlags_ScrollX) + { + // Frozen columns can't reach beyond visible width else scrolling will naturally break. + // (we use DisplayOrder as within a set of multiple frozen column reordering is possible) + if (column->DisplayOrder < table->FreezeColumnsRequest) + { + max_width = (table->InnerClipRect.Max.x - (table->FreezeColumnsRequest - column->DisplayOrder) * min_column_distance) - column->MinX; + max_width = max_width - table->OuterPaddingX - table->CellPaddingX - table->CellSpacingX2; + } + } + else if ((table->Flags & ImGuiTableFlags_NoKeepColumnsVisible) == 0) + { + // If horizontal scrolling if disabled, we apply a final lossless shrinking of columns in order to make + // sure they are all visible. Because of this we also know that all of the columns will always fit in + // table->WorkRect and therefore in table->InnerRect (because ScrollX is off) + // FIXME-TABLE: This is solved incorrectly but also quite a difficult problem to fix as we also want ClipRect width to match. + // See "table_width_distrib" and "table_width_keep_visible" tests + max_width = table->WorkRect.Max.x - (table->ColumnsEnabledCount - column->IndexWithinEnabledSet - 1) * min_column_distance - column->MinX; + //max_width -= table->CellSpacingX1; + max_width -= table->CellSpacingX2; + max_width -= table->CellPaddingX * 2.0f; + max_width -= table->OuterPaddingX; + } + return max_width; +} + +// Note this is meant to be stored in column->WidthAuto, please generally use the WidthAuto field +float ImGui::TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column) +{ + const float content_width_body = ImMax(column->ContentMaxXFrozen, column->ContentMaxXUnfrozen) - column->WorkMinX; + const float content_width_headers = column->ContentMaxXHeadersIdeal - column->WorkMinX; + float width_auto = content_width_body; + if (!(column->Flags & ImGuiTableColumnFlags_NoHeaderWidth)) + width_auto = ImMax(width_auto, content_width_headers); + + // Non-resizable fixed columns preserve their requested width + if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && column->InitStretchWeightOrWidth > 0.0f) + if (!(table->Flags & ImGuiTableFlags_Resizable) || (column->Flags & ImGuiTableColumnFlags_NoResize)) + width_auto = column->InitStretchWeightOrWidth; + + return ImMax(width_auto, table->MinColumnWidth); +} + +// 'width' = inner column width, without padding +void ImGui::TableSetColumnWidth(int column_n, float width) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && table->IsLayoutLocked == false); + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + ImGuiTableColumn* column_0 = &table->Columns[column_n]; + float column_0_width = width; + + // Apply constraints early + // Compare both requested and actual given width to avoid overwriting requested width when column is stuck (minimum size, bounded) + IM_ASSERT(table->MinColumnWidth > 0.0f); + const float min_width = table->MinColumnWidth; + const float max_width = ImMax(min_width, TableGetMaxColumnWidth(table, column_n)); + column_0_width = ImClamp(column_0_width, min_width, max_width); + if (column_0->WidthGiven == column_0_width || column_0->WidthRequest == column_0_width) + return; + + //IMGUI_DEBUG_LOG("TableSetColumnWidth(%d, %.1f->%.1f)\n", column_0_idx, column_0->WidthGiven, column_0_width); + ImGuiTableColumn* column_1 = (column_0->NextEnabledColumn != -1) ? &table->Columns[column_0->NextEnabledColumn] : NULL; + + // In this surprisingly not simple because of how we support mixing Fixed and multiple Stretch columns. + // - All fixed: easy. + // - All stretch: easy. + // - One or more fixed + one stretch: easy. + // - One or more fixed + more than one stretch: tricky. + // Qt when manual resize is enabled only support a single _trailing_ stretch column. + + // When forwarding resize from Wn| to Fn+1| we need to be considerate of the _NoResize flag on Fn+1. + // FIXME-TABLE: Find a way to rewrite all of this so interactions feel more consistent for the user. + // Scenarios: + // - F1 F2 F3 resize from F1| or F2| --> ok: alter ->WidthRequested of Fixed column. Subsequent columns will be offset. + // - F1 F2 F3 resize from F3| --> ok: alter ->WidthRequested of Fixed column. If active, ScrollX extent can be altered. + // - F1 F2 W3 resize from F1| or F2| --> ok: alter ->WidthRequested of Fixed column. If active, ScrollX extent can be altered, but it doesn't make much sense as the Stretch column will always be minimal size. + // - F1 F2 W3 resize from W3| --> ok: no-op (disabled by Resize Rule 1) + // - W1 W2 W3 resize from W1| or W2| --> ok + // - W1 W2 W3 resize from W3| --> ok: no-op (disabled by Resize Rule 1) + // - W1 F2 F3 resize from F3| --> ok: no-op (disabled by Resize Rule 1) + // - W1 F2 resize from F2| --> ok: no-op (disabled by Resize Rule 1) + // - W1 W2 F3 resize from W1| or W2| --> ok + // - W1 F2 W3 resize from W1| or F2| --> ok + // - F1 W2 F3 resize from W2| --> ok + // - F1 W3 F2 resize from W3| --> ok + // - W1 F2 F3 resize from W1| --> ok: equivalent to resizing |F2. F3 will not move. + // - W1 F2 F3 resize from F2| --> ok + // All resizes from a Wx columns are locking other columns. + + // Possible improvements: + // - W1 W2 W3 resize W1| --> to not be stuck, both W2 and W3 would stretch down. Seems possible to fix. Would be most beneficial to simplify resize of all-weighted columns. + // - W3 F1 F2 resize W3| --> to not be stuck past F1|, both F1 and F2 would need to stretch down, which would be lossy or ambiguous. Seems hard to fix. + + // [Resize Rule 1] Can't resize from right of right-most visible column if there is any Stretch column. Implemented in TableUpdateLayout(). + + // If we have all Fixed columns OR resizing a Fixed column that doesn't come after a Stretch one, we can do an offsetting resize. + // This is the preferred resize path + if (column_0->Flags & ImGuiTableColumnFlags_WidthFixed) + if (!column_1 || table->LeftMostStretchedColumn == -1 || table->Columns[table->LeftMostStretchedColumn].DisplayOrder >= column_0->DisplayOrder) + { + column_0->WidthRequest = column_0_width; + table->IsSettingsDirty = true; + return; + } + + // We can also use previous column if there's no next one (this is used when doing an auto-fit on the right-most stretch column) + if (column_1 == NULL) + column_1 = (column_0->PrevEnabledColumn != -1) ? &table->Columns[column_0->PrevEnabledColumn] : NULL; + if (column_1 == NULL) + return; + + // Resizing from right-side of a Stretch column before a Fixed column forward sizing to left-side of fixed column. + // (old_a + old_b == new_a + new_b) --> (new_a == old_a + old_b - new_b) + float column_1_width = ImMax(column_1->WidthRequest - (column_0_width - column_0->WidthRequest), min_width); + column_0_width = column_0->WidthRequest + column_1->WidthRequest - column_1_width; + IM_ASSERT(column_0_width > 0.0f && column_1_width > 0.0f); + column_0->WidthRequest = column_0_width; + column_1->WidthRequest = column_1_width; + if ((column_0->Flags | column_1->Flags) & ImGuiTableColumnFlags_WidthStretch) + TableUpdateColumnsWeightFromWidth(table); + table->IsSettingsDirty = true; +} + +// Disable clipping then auto-fit, will take 2 frames +// (we don't take a shortcut for unclipped columns to reduce inconsistencies when e.g. resizing multiple columns) +void ImGui::TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n) +{ + // Single auto width uses auto-fit + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled) + return; + column->CannotSkipItemsQueue = (1 << 0); + table->AutoFitSingleColumn = (ImGuiTableColumnIdx)column_n; +} + +void ImGui::TableSetColumnWidthAutoAll(ImGuiTable* table) +{ + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled && !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) // Cannot reset weight of hidden stretch column + continue; + column->CannotSkipItemsQueue = (1 << 0); + column->AutoFitQueue = (1 << 1); + } +} + +void ImGui::TableUpdateColumnsWeightFromWidth(ImGuiTable* table) +{ + IM_ASSERT(table->LeftMostStretchedColumn != -1 && table->RightMostStretchedColumn != -1); + + // Measure existing quantity + float visible_weight = 0.0f; + float visible_width = 0.0f; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) + continue; + IM_ASSERT(column->StretchWeight > 0.0f); + visible_weight += column->StretchWeight; + visible_width += column->WidthRequest; + } + IM_ASSERT(visible_weight > 0.0f && visible_width > 0.0f); + + // Apply new weights + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) + continue; + column->StretchWeight = (column->WidthRequest / visible_width) * visible_weight; + IM_ASSERT(column->StretchWeight > 0.0f); + } +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Drawing +//------------------------------------------------------------------------- +// - TablePushBackgroundChannel() [Internal] +// - TablePopBackgroundChannel() [Internal] +// - TableSetupDrawChannels() [Internal] +// - TableMergeDrawChannels() [Internal] +// - TableDrawBorders() [Internal] +//------------------------------------------------------------------------- + +// Bg2 is used by Selectable (and possibly other widgets) to render to the background. +// Unlike our Bg0/1 channel which we uses for RowBg/CellBg/Borders and where we guarantee all shapes to be CPU-clipped, the Bg2 channel being widgets-facing will rely on regular ClipRect. +void ImGui::TablePushBackgroundChannel() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiTable* table = g.CurrentTable; + + // Optimization: avoid SetCurrentChannel() + PushClipRect() + table->HostBackupInnerClipRect = window->ClipRect; + SetWindowClipRectBeforeSetChannel(window, table->Bg2ClipRectForDrawCmd); + table->DrawSplitter->SetCurrentChannel(window->DrawList, table->Bg2DrawChannelCurrent); +} + +void ImGui::TablePopBackgroundChannel() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiTable* table = g.CurrentTable; + ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; + + // Optimization: avoid PopClipRect() + SetCurrentChannel() + SetWindowClipRectBeforeSetChannel(window, table->HostBackupInnerClipRect); + table->DrawSplitter->SetCurrentChannel(window->DrawList, column->DrawChannelCurrent); +} + +// Allocate draw channels. Called by TableUpdateLayout() +// - We allocate them following storage order instead of display order so reordering columns won't needlessly +// increase overall dormant memory cost. +// - We isolate headers draw commands in their own channels instead of just altering clip rects. +// This is in order to facilitate merging of draw commands. +// - After crossing FreezeRowsCount, all columns see their current draw channel changed to a second set of channels. +// - We only use the dummy draw channel so we can push a null clipping rectangle into it without affecting other +// channels, while simplifying per-row/per-cell overhead. It will be empty and discarded when merged. +// - We allocate 1 or 2 background draw channels. This is because we know TablePushBackgroundChannel() is only used for +// horizontal spanning. If we allowed vertical spanning we'd need one background draw channel per merge group (1-4). +// Draw channel allocation (before merging): +// - NoClip --> 2+D+1 channels: bg0/1 + bg2 + foreground (same clip rect == always 1 draw call) +// - Clip --> 2+D+N channels +// - FreezeRows --> 2+D+N*2 (unless scrolling value is zero) +// - FreezeRows || FreezeColunns --> 3+D+N*2 (unless scrolling value is zero) +// Where D is 1 if any column is clipped or hidden (dummy channel) otherwise 0. +void ImGui::TableSetupDrawChannels(ImGuiTable* table) +{ + const int freeze_row_multiplier = (table->FreezeRowsCount > 0) ? 2 : 1; + const int channels_for_row = (table->Flags & ImGuiTableFlags_NoClip) ? 1 : table->ColumnsEnabledCount; + const int channels_for_bg = 1 + 1 * freeze_row_multiplier; + const int channels_for_dummy = (table->ColumnsEnabledCount < table->ColumnsCount || table->VisibleMaskByIndex != table->EnabledMaskByIndex) ? +1 : 0; + const int channels_total = channels_for_bg + (channels_for_row * freeze_row_multiplier) + channels_for_dummy; + table->DrawSplitter->Split(table->InnerWindow->DrawList, channels_total); + table->DummyDrawChannel = (ImGuiTableDrawChannelIdx)((channels_for_dummy > 0) ? channels_total - 1 : -1); + table->Bg2DrawChannelCurrent = TABLE_DRAW_CHANNEL_BG2_FROZEN; + table->Bg2DrawChannelUnfrozen = (ImGuiTableDrawChannelIdx)((table->FreezeRowsCount > 0) ? 2 + channels_for_row : TABLE_DRAW_CHANNEL_BG2_FROZEN); + + int draw_channel_current = 2; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->IsVisibleX && column->IsVisibleY) + { + column->DrawChannelFrozen = (ImGuiTableDrawChannelIdx)(draw_channel_current); + column->DrawChannelUnfrozen = (ImGuiTableDrawChannelIdx)(draw_channel_current + (table->FreezeRowsCount > 0 ? channels_for_row + 1 : 0)); + if (!(table->Flags & ImGuiTableFlags_NoClip)) + draw_channel_current++; + } + else + { + column->DrawChannelFrozen = column->DrawChannelUnfrozen = table->DummyDrawChannel; + } + column->DrawChannelCurrent = column->DrawChannelFrozen; + } + + // Initial draw cmd starts with a BgClipRect that matches the one of its host, to facilitate merge draw commands by default. + // All our cell highlight are manually clipped with BgClipRect. When unfreezing it will be made smaller to fit scrolling rect. + // (This technically isn't part of setting up draw channels, but is reasonably related to be done here) + table->BgClipRect = table->InnerClipRect; + table->Bg0ClipRectForDrawCmd = table->OuterWindow->ClipRect; + table->Bg2ClipRectForDrawCmd = table->HostClipRect; + IM_ASSERT(table->BgClipRect.Min.y <= table->BgClipRect.Max.y); +} + +// This function reorder draw channels based on matching clip rectangle, to facilitate merging them. Called by EndTable(). +// For simplicity we call it TableMergeDrawChannels() but in fact it only reorder channels + overwrite ClipRect, +// actual merging is done by table->DrawSplitter.Merge() which is called right after TableMergeDrawChannels(). +// +// Columns where the contents didn't stray off their local clip rectangle can be merged. To achieve +// this we merge their clip rect and make them contiguous in the channel list, so they can be merged +// by the call to DrawSplitter.Merge() following to the call to this function. +// We reorder draw commands by arranging them into a maximum of 4 distinct groups: +// +// 1 group: 2 groups: 2 groups: 4 groups: +// [ 0. ] no freeze [ 0. ] row freeze [ 01 ] col freeze [ 01 ] row+col freeze +// [ .. ] or no scroll [ 2. ] and v-scroll [ .. ] and h-scroll [ 23 ] and v+h-scroll +// +// Each column itself can use 1 channel (row freeze disabled) or 2 channels (row freeze enabled). +// When the contents of a column didn't stray off its limit, we move its channels into the corresponding group +// based on its position (within frozen rows/columns groups or not). +// At the end of the operation our 1-4 groups will each have a ImDrawCmd using the same ClipRect. +// This function assume that each column are pointing to a distinct draw channel, +// otherwise merge_group->ChannelsCount will not match set bit count of merge_group->ChannelsMask. +// +// Column channels will not be merged into one of the 1-4 groups in the following cases: +// - The contents stray off its clipping rectangle (we only compare the MaxX value, not the MinX value). +// Direct ImDrawList calls won't be taken into account by default, if you use them make sure the ImGui:: bounds +// matches, by e.g. calling SetCursorScreenPos(). +// - The channel uses more than one draw command itself. We drop all our attempt at merging stuff here.. +// we could do better but it's going to be rare and probably not worth the hassle. +// Columns for which the draw channel(s) haven't been merged with other will use their own ImDrawCmd. +// +// This function is particularly tricky to understand.. take a breath. +void ImGui::TableMergeDrawChannels(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + ImDrawListSplitter* splitter = table->DrawSplitter; + const bool has_freeze_v = (table->FreezeRowsCount > 0); + const bool has_freeze_h = (table->FreezeColumnsCount > 0); + IM_ASSERT(splitter->_Current == 0); + + // Track which groups we are going to attempt to merge, and which channels goes into each group. + struct MergeGroup + { + ImRect ClipRect; + int ChannelsCount; + ImBitArray ChannelsMask; + + MergeGroup() { ChannelsCount = 0; } + }; + int merge_group_mask = 0x00; + MergeGroup merge_groups[4]; + + // 1. Scan channels and take note of those which can be merged + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + if ((table->VisibleMaskByIndex & ((ImU64)1 << column_n)) == 0) + continue; + ImGuiTableColumn* column = &table->Columns[column_n]; + + const int merge_group_sub_count = has_freeze_v ? 2 : 1; + for (int merge_group_sub_n = 0; merge_group_sub_n < merge_group_sub_count; merge_group_sub_n++) + { + const int channel_no = (merge_group_sub_n == 0) ? column->DrawChannelFrozen : column->DrawChannelUnfrozen; + + // Don't attempt to merge if there are multiple draw calls within the column + ImDrawChannel* src_channel = &splitter->_Channels[channel_no]; + if (src_channel->_CmdBuffer.Size > 0 && src_channel->_CmdBuffer.back().ElemCount == 0 && src_channel->_CmdBuffer.back().UserCallback != NULL) // Equivalent of PopUnusedDrawCmd() + src_channel->_CmdBuffer.pop_back(); + if (src_channel->_CmdBuffer.Size != 1) + continue; + + // Find out the width of this merge group and check if it will fit in our column + // (note that we assume that rendering didn't stray on the left direction. we should need a CursorMinPos to detect it) + if (!(column->Flags & ImGuiTableColumnFlags_NoClip)) + { + float content_max_x; + if (!has_freeze_v) + content_max_x = ImMax(column->ContentMaxXUnfrozen, column->ContentMaxXHeadersUsed); // No row freeze + else if (merge_group_sub_n == 0) + content_max_x = ImMax(column->ContentMaxXFrozen, column->ContentMaxXHeadersUsed); // Row freeze: use width before freeze + else + content_max_x = column->ContentMaxXUnfrozen; // Row freeze: use width after freeze + if (content_max_x > column->ClipRect.Max.x) + continue; + } + + const int merge_group_n = (has_freeze_h && column_n < table->FreezeColumnsCount ? 0 : 1) + (has_freeze_v && merge_group_sub_n == 0 ? 0 : 2); + IM_ASSERT(channel_no < IMGUI_TABLE_MAX_DRAW_CHANNELS); + MergeGroup* merge_group = &merge_groups[merge_group_n]; + if (merge_group->ChannelsCount == 0) + merge_group->ClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); + merge_group->ChannelsMask.SetBit(channel_no); + merge_group->ChannelsCount++; + merge_group->ClipRect.Add(src_channel->_CmdBuffer[0].ClipRect); + merge_group_mask |= (1 << merge_group_n); + } + + // Invalidate current draw channel + // (we don't clear DrawChannelFrozen/DrawChannelUnfrozen solely to facilitate debugging/later inspection of data) + column->DrawChannelCurrent = (ImGuiTableDrawChannelIdx)-1; + } + + // [DEBUG] Display merge groups +#if 0 + if (g.IO.KeyShift) + for (int merge_group_n = 0; merge_group_n < IM_ARRAYSIZE(merge_groups); merge_group_n++) + { + MergeGroup* merge_group = &merge_groups[merge_group_n]; + if (merge_group->ChannelsCount == 0) + continue; + char buf[32]; + ImFormatString(buf, 32, "MG%d:%d", merge_group_n, merge_group->ChannelsCount); + ImVec2 text_pos = merge_group->ClipRect.Min + ImVec2(4, 4); + ImVec2 text_size = CalcTextSize(buf, NULL); + GetForegroundDrawList()->AddRectFilled(text_pos, text_pos + text_size, IM_COL32(0, 0, 0, 255)); + GetForegroundDrawList()->AddText(text_pos, IM_COL32(255, 255, 0, 255), buf, NULL); + GetForegroundDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 255, 0, 255)); + } +#endif + + // 2. Rewrite channel list in our preferred order + if (merge_group_mask != 0) + { + // We skip channel 0 (Bg0/Bg1) and 1 (Bg2 frozen) from the shuffling since they won't move - see channels allocation in TableSetupDrawChannels(). + const int LEADING_DRAW_CHANNELS = 2; + g.DrawChannelsTempMergeBuffer.resize(splitter->_Count - LEADING_DRAW_CHANNELS); // Use shared temporary storage so the allocation gets amortized + ImDrawChannel* dst_tmp = g.DrawChannelsTempMergeBuffer.Data; + ImBitArray remaining_mask; // We need 132-bit of storage + remaining_mask.SetBitRange(LEADING_DRAW_CHANNELS, splitter->_Count); + remaining_mask.ClearBit(table->Bg2DrawChannelUnfrozen); + IM_ASSERT(has_freeze_v == false || table->Bg2DrawChannelUnfrozen != TABLE_DRAW_CHANNEL_BG2_FROZEN); + int remaining_count = splitter->_Count - (has_freeze_v ? LEADING_DRAW_CHANNELS + 1 : LEADING_DRAW_CHANNELS); + //ImRect host_rect = (table->InnerWindow == table->OuterWindow) ? table->InnerClipRect : table->HostClipRect; + ImRect host_rect = table->HostClipRect; + for (int merge_group_n = 0; merge_group_n < IM_ARRAYSIZE(merge_groups); merge_group_n++) + { + if (int merge_channels_count = merge_groups[merge_group_n].ChannelsCount) + { + MergeGroup* merge_group = &merge_groups[merge_group_n]; + ImRect merge_clip_rect = merge_group->ClipRect; + + // Extend outer-most clip limits to match those of host, so draw calls can be merged even if + // outer-most columns have some outer padding offsetting them from their parent ClipRect. + // The principal cases this is dealing with are: + // - On a same-window table (not scrolling = single group), all fitting columns ClipRect -> will extend and match host ClipRect -> will merge + // - Columns can use padding and have left-most ClipRect.Min.x and right-most ClipRect.Max.x != from host ClipRect -> will extend and match host ClipRect -> will merge + // FIXME-TABLE FIXME-WORKRECT: We are wasting a merge opportunity on tables without scrolling if column doesn't fit + // within host clip rect, solely because of the half-padding difference between window->WorkRect and window->InnerClipRect. + if ((merge_group_n & 1) == 0 || !has_freeze_h) + merge_clip_rect.Min.x = ImMin(merge_clip_rect.Min.x, host_rect.Min.x); + if ((merge_group_n & 2) == 0 || !has_freeze_v) + merge_clip_rect.Min.y = ImMin(merge_clip_rect.Min.y, host_rect.Min.y); + if ((merge_group_n & 1) != 0) + merge_clip_rect.Max.x = ImMax(merge_clip_rect.Max.x, host_rect.Max.x); + if ((merge_group_n & 2) != 0 && (table->Flags & ImGuiTableFlags_NoHostExtendY) == 0) + merge_clip_rect.Max.y = ImMax(merge_clip_rect.Max.y, host_rect.Max.y); +#if 0 + GetOverlayDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 0, 0, 200), 0.0f, 0, 1.0f); + GetOverlayDrawList()->AddLine(merge_group->ClipRect.Min, merge_clip_rect.Min, IM_COL32(255, 100, 0, 200)); + GetOverlayDrawList()->AddLine(merge_group->ClipRect.Max, merge_clip_rect.Max, IM_COL32(255, 100, 0, 200)); +#endif + remaining_count -= merge_group->ChannelsCount; + for (int n = 0; n < IM_ARRAYSIZE(remaining_mask.Storage); n++) + remaining_mask.Storage[n] &= ~merge_group->ChannelsMask.Storage[n]; + for (int n = 0; n < splitter->_Count && merge_channels_count != 0; n++) + { + // Copy + overwrite new clip rect + if (!merge_group->ChannelsMask.TestBit(n)) + continue; + merge_group->ChannelsMask.ClearBit(n); + merge_channels_count--; + + ImDrawChannel* channel = &splitter->_Channels[n]; + IM_ASSERT(channel->_CmdBuffer.Size == 1 && merge_clip_rect.Contains(ImRect(channel->_CmdBuffer[0].ClipRect))); + channel->_CmdBuffer[0].ClipRect = merge_clip_rect.ToVec4(); + memcpy(dst_tmp++, channel, sizeof(ImDrawChannel)); + } + } + + // Make sure Bg2DrawChannelUnfrozen appears in the middle of our groups (whereas Bg0/Bg1 and Bg2 frozen are fixed to 0 and 1) + if (merge_group_n == 1 && has_freeze_v) + memcpy(dst_tmp++, &splitter->_Channels[table->Bg2DrawChannelUnfrozen], sizeof(ImDrawChannel)); + } + + // Append unmergeable channels that we didn't reorder at the end of the list + for (int n = 0; n < splitter->_Count && remaining_count != 0; n++) + { + if (!remaining_mask.TestBit(n)) + continue; + ImDrawChannel* channel = &splitter->_Channels[n]; + memcpy(dst_tmp++, channel, sizeof(ImDrawChannel)); + remaining_count--; + } + IM_ASSERT(dst_tmp == g.DrawChannelsTempMergeBuffer.Data + g.DrawChannelsTempMergeBuffer.Size); + memcpy(splitter->_Channels.Data + LEADING_DRAW_CHANNELS, g.DrawChannelsTempMergeBuffer.Data, (splitter->_Count - LEADING_DRAW_CHANNELS) * sizeof(ImDrawChannel)); + } +} + +// FIXME-TABLE: This is a mess, need to redesign how we render borders (as some are also done in TableEndRow) +void ImGui::TableDrawBorders(ImGuiTable* table) +{ + ImGuiWindow* inner_window = table->InnerWindow; + if (!table->OuterWindow->ClipRect.Overlaps(table->OuterRect)) + return; + + ImDrawList* inner_drawlist = inner_window->DrawList; + table->DrawSplitter->SetCurrentChannel(inner_drawlist, TABLE_DRAW_CHANNEL_BG0); + inner_drawlist->PushClipRect(table->Bg0ClipRectForDrawCmd.Min, table->Bg0ClipRectForDrawCmd.Max, false); + + // Draw inner border and resizing feedback + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + const float border_size = TABLE_BORDER_SIZE; + const float draw_y1 = table->InnerRect.Min.y; + const float draw_y2_body = table->InnerRect.Max.y; + const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table_instance->LastFirstRowHeight) : draw_y1; + if (table->Flags & ImGuiTableFlags_BordersInnerV) + { + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + if (!(table->EnabledMaskByDisplayOrder & ((ImU64)1 << order_n))) + continue; + + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + const bool is_hovered = (table->HoveredColumnBorder == column_n); + const bool is_resized = (table->ResizedColumn == column_n) && (table->InstanceInteracted == table->InstanceCurrent); + const bool is_resizable = (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) == 0; + const bool is_frozen_separator = (table->FreezeColumnsCount == order_n + 1); + if (column->MaxX > table->InnerClipRect.Max.x && !is_resized) + continue; + + // Decide whether right-most column is visible + if (column->NextEnabledColumn == -1 && !is_resizable) + if ((table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame || (table->Flags & ImGuiTableFlags_NoHostExtendX)) + continue; + if (column->MaxX <= column->ClipRect.Min.x) // FIXME-TABLE FIXME-STYLE: Assume BorderSize==1, this is problematic if we want to increase the border size.. + continue; + + // Draw in outer window so right-most column won't be clipped + // Always draw full height border when being resized/hovered, or on the delimitation of frozen column scrolling. + ImU32 col; + float draw_y2; + if (is_hovered || is_resized || is_frozen_separator) + { + draw_y2 = draw_y2_body; + col = is_resized ? GetColorU32(ImGuiCol_SeparatorActive) : is_hovered ? GetColorU32(ImGuiCol_SeparatorHovered) : table->BorderColorStrong; + } + else + { + draw_y2 = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? draw_y2_head : draw_y2_body; + col = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? table->BorderColorStrong : table->BorderColorLight; + } + + if (draw_y2 > draw_y1) + inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), col, border_size); + } + } + + // Draw outer border + // FIXME: could use AddRect or explicit VLine/HLine helper? + if (table->Flags & ImGuiTableFlags_BordersOuter) + { + // Display outer border offset by 1 which is a simple way to display it without adding an extra draw call + // (Without the offset, in outer_window it would be rendered behind cells, because child windows are above their + // parent. In inner_window, it won't reach out over scrollbars. Another weird solution would be to display part + // of it in inner window, and the part that's over scrollbars in the outer window..) + // Either solution currently won't allow us to use a larger border size: the border would clipped. + const ImRect outer_border = table->OuterRect; + const ImU32 outer_col = table->BorderColorStrong; + if ((table->Flags & ImGuiTableFlags_BordersOuter) == ImGuiTableFlags_BordersOuter) + { + inner_drawlist->AddRect(outer_border.Min, outer_border.Max, outer_col, 0.0f, 0, border_size); + } + else if (table->Flags & ImGuiTableFlags_BordersOuterV) + { + inner_drawlist->AddLine(outer_border.Min, ImVec2(outer_border.Min.x, outer_border.Max.y), outer_col, border_size); + inner_drawlist->AddLine(ImVec2(outer_border.Max.x, outer_border.Min.y), outer_border.Max, outer_col, border_size); + } + else if (table->Flags & ImGuiTableFlags_BordersOuterH) + { + inner_drawlist->AddLine(outer_border.Min, ImVec2(outer_border.Max.x, outer_border.Min.y), outer_col, border_size); + inner_drawlist->AddLine(ImVec2(outer_border.Min.x, outer_border.Max.y), outer_border.Max, outer_col, border_size); + } + } + if ((table->Flags & ImGuiTableFlags_BordersInnerH) && table->RowPosY2 < table->OuterRect.Max.y) + { + // Draw bottom-most row border + const float border_y = table->RowPosY2; + if (border_y >= table->BgClipRect.Min.y && border_y < table->BgClipRect.Max.y) + inner_drawlist->AddLine(ImVec2(table->BorderX1, border_y), ImVec2(table->BorderX2, border_y), table->BorderColorLight, border_size); + } + + inner_drawlist->PopClipRect(); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Sorting +//------------------------------------------------------------------------- +// - TableGetSortSpecs() +// - TableFixColumnSortDirection() [Internal] +// - TableGetColumnNextSortDirection() [Internal] +// - TableSetColumnSortDirection() [Internal] +// - TableSortSpecsSanitize() [Internal] +// - TableSortSpecsBuild() [Internal] +//------------------------------------------------------------------------- + +// Return NULL if no sort specs (most often when ImGuiTableFlags_Sortable is not set) +// You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since +// last call, or the first time. +// Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable()! +ImGuiTableSortSpecs* ImGui::TableGetSortSpecs() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL); + + if (!(table->Flags & ImGuiTableFlags_Sortable)) + return NULL; + + // Require layout (in case TableHeadersRow() hasn't been called) as it may alter IsSortSpecsDirty in some paths. + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + + TableSortSpecsBuild(table); + + return &table->SortSpecs; +} + +static inline ImGuiSortDirection TableGetColumnAvailSortDirection(ImGuiTableColumn* column, int n) +{ + IM_ASSERT(n < column->SortDirectionsAvailCount); + return (column->SortDirectionsAvailList >> (n << 1)) & 0x03; +} + +// Fix sort direction if currently set on a value which is unavailable (e.g. activating NoSortAscending/NoSortDescending) +void ImGui::TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column) +{ + if (column->SortOrder == -1 || (column->SortDirectionsAvailMask & (1 << column->SortDirection)) != 0) + return; + column->SortDirection = (ImU8)TableGetColumnAvailSortDirection(column, 0); + table->IsSortSpecsDirty = true; +} + +// Calculate next sort direction that would be set after clicking the column +// - If the PreferSortDescending flag is set, we will default to a Descending direction on the first click. +// - Note that the PreferSortAscending flag is never checked, it is essentially the default and therefore a no-op. +IM_STATIC_ASSERT(ImGuiSortDirection_None == 0 && ImGuiSortDirection_Ascending == 1 && ImGuiSortDirection_Descending == 2); +ImGuiSortDirection ImGui::TableGetColumnNextSortDirection(ImGuiTableColumn* column) +{ + IM_ASSERT(column->SortDirectionsAvailCount > 0); + if (column->SortOrder == -1) + return TableGetColumnAvailSortDirection(column, 0); + for (int n = 0; n < 3; n++) + if (column->SortDirection == TableGetColumnAvailSortDirection(column, n)) + return TableGetColumnAvailSortDirection(column, (n + 1) % column->SortDirectionsAvailCount); + IM_ASSERT(0); + return ImGuiSortDirection_None; +} + +// Note that the NoSortAscending/NoSortDescending flags are processed in TableSortSpecsSanitize(), and they may change/revert +// the value of SortDirection. We could technically also do it here but it would be unnecessary and duplicate code. +void ImGui::TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + + if (!(table->Flags & ImGuiTableFlags_SortMulti)) + append_to_sort_specs = false; + if (!(table->Flags & ImGuiTableFlags_SortTristate)) + IM_ASSERT(sort_direction != ImGuiSortDirection_None); + + ImGuiTableColumnIdx sort_order_max = 0; + if (append_to_sort_specs) + for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) + sort_order_max = ImMax(sort_order_max, table->Columns[other_column_n].SortOrder); + + ImGuiTableColumn* column = &table->Columns[column_n]; + column->SortDirection = (ImU8)sort_direction; + if (column->SortDirection == ImGuiSortDirection_None) + column->SortOrder = -1; + else if (column->SortOrder == -1 || !append_to_sort_specs) + column->SortOrder = append_to_sort_specs ? sort_order_max + 1 : 0; + + for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) + { + ImGuiTableColumn* other_column = &table->Columns[other_column_n]; + if (other_column != column && !append_to_sort_specs) + other_column->SortOrder = -1; + TableFixColumnSortDirection(table, other_column); + } + table->IsSettingsDirty = true; + table->IsSortSpecsDirty = true; +} + +void ImGui::TableSortSpecsSanitize(ImGuiTable* table) +{ + IM_ASSERT(table->Flags & ImGuiTableFlags_Sortable); + + // Clear SortOrder from hidden column and verify that there's no gap or duplicate. + int sort_order_count = 0; + ImU64 sort_order_mask = 0x00; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->SortOrder != -1 && !column->IsEnabled) + column->SortOrder = -1; + if (column->SortOrder == -1) + continue; + sort_order_count++; + sort_order_mask |= ((ImU64)1 << column->SortOrder); + IM_ASSERT(sort_order_count < (int)sizeof(sort_order_mask) * 8); + } + + const bool need_fix_linearize = ((ImU64)1 << sort_order_count) != (sort_order_mask + 1); + const bool need_fix_single_sort_order = (sort_order_count > 1) && !(table->Flags & ImGuiTableFlags_SortMulti); + if (need_fix_linearize || need_fix_single_sort_order) + { + ImU64 fixed_mask = 0x00; + for (int sort_n = 0; sort_n < sort_order_count; sort_n++) + { + // Fix: Rewrite sort order fields if needed so they have no gap or duplicate. + // (e.g. SortOrder 0 disappeared, SortOrder 1..2 exists --> rewrite then as SortOrder 0..1) + int column_with_smallest_sort_order = -1; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if ((fixed_mask & ((ImU64)1 << (ImU64)column_n)) == 0 && table->Columns[column_n].SortOrder != -1) + if (column_with_smallest_sort_order == -1 || table->Columns[column_n].SortOrder < table->Columns[column_with_smallest_sort_order].SortOrder) + column_with_smallest_sort_order = column_n; + IM_ASSERT(column_with_smallest_sort_order != -1); + fixed_mask |= ((ImU64)1 << column_with_smallest_sort_order); + table->Columns[column_with_smallest_sort_order].SortOrder = (ImGuiTableColumnIdx)sort_n; + + // Fix: Make sure only one column has a SortOrder if ImGuiTableFlags_MultiSortable is not set. + if (need_fix_single_sort_order) + { + sort_order_count = 1; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (column_n != column_with_smallest_sort_order) + table->Columns[column_n].SortOrder = -1; + break; + } + } + } + + // Fallback default sort order (if no column had the ImGuiTableColumnFlags_DefaultSort flag) + if (sort_order_count == 0 && !(table->Flags & ImGuiTableFlags_SortTristate)) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->IsEnabled && !(column->Flags & ImGuiTableColumnFlags_NoSort)) + { + sort_order_count = 1; + column->SortOrder = 0; + column->SortDirection = (ImU8)TableGetColumnAvailSortDirection(column, 0); + break; + } + } + + table->SortSpecsCount = (ImGuiTableColumnIdx)sort_order_count; +} + +void ImGui::TableSortSpecsBuild(ImGuiTable* table) +{ + bool dirty = table->IsSortSpecsDirty; + if (dirty) + { + TableSortSpecsSanitize(table); + table->SortSpecsMulti.resize(table->SortSpecsCount <= 1 ? 0 : table->SortSpecsCount); + table->SortSpecs.SpecsDirty = true; // Mark as dirty for user + table->IsSortSpecsDirty = false; // Mark as not dirty for us + } + + // Write output + ImGuiTableColumnSortSpecs* sort_specs = (table->SortSpecsCount == 0) ? NULL : (table->SortSpecsCount == 1) ? &table->SortSpecsSingle : table->SortSpecsMulti.Data; + if (dirty && sort_specs != NULL) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->SortOrder == -1) + continue; + IM_ASSERT(column->SortOrder < table->SortSpecsCount); + ImGuiTableColumnSortSpecs* sort_spec = &sort_specs[column->SortOrder]; + sort_spec->ColumnUserID = column->UserID; + sort_spec->ColumnIndex = (ImGuiTableColumnIdx)column_n; + sort_spec->SortOrder = (ImGuiTableColumnIdx)column->SortOrder; + sort_spec->SortDirection = column->SortDirection; + } + + table->SortSpecs.Specs = sort_specs; + table->SortSpecs.SpecsCount = table->SortSpecsCount; +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Headers +//------------------------------------------------------------------------- +// - TableGetHeaderRowHeight() [Internal] +// - TableHeadersRow() +// - TableHeader() +//------------------------------------------------------------------------- + +float ImGui::TableGetHeaderRowHeight() +{ + // Caring for a minor edge case: + // Calculate row height, for the unlikely case that some labels may be taller than others. + // If we didn't do that, uneven header height would highlight but smaller one before the tallest wouldn't catch input for all height. + // In your custom header row you may omit this all together and just call TableNextRow() without a height... + float row_height = GetTextLineHeight(); + int columns_count = TableGetColumnCount(); + for (int column_n = 0; column_n < columns_count; column_n++) + { + ImGuiTableColumnFlags flags = TableGetColumnFlags(column_n); + if ((flags & ImGuiTableColumnFlags_IsEnabled) && !(flags & ImGuiTableColumnFlags_NoHeaderLabel)) + row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y); + } + row_height += GetStyle().CellPadding.y * 2.0f; + return row_height; +} + +// [Public] This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn(). +// The intent is that advanced users willing to create customized headers would not need to use this helper +// and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets. +// See 'Demo->Tables->Custom headers' for a demonstration of implementing a custom version of this. +// This code is constructed to not make much use of internal functions, as it is intended to be a template to copy. +// FIXME-TABLE: TableOpenContextMenu() and TableGetHeaderRowHeight() are not public. +void ImGui::TableHeadersRow() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableHeadersRow() after BeginTable()!"); + + // Layout if not already done (this is automatically done by TableNextRow, we do it here solely to facilitate stepping in debugger as it is frequent to step in TableUpdateLayout) + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + + // Open row + const float row_y1 = GetCursorScreenPos().y; + const float row_height = TableGetHeaderRowHeight(); + TableNextRow(ImGuiTableRowFlags_Headers, row_height); + if (table->HostSkipItems) // Merely an optimization, you may skip in your own code. + return; + + const int columns_count = TableGetColumnCount(); + for (int column_n = 0; column_n < columns_count; column_n++) + { + if (!TableSetColumnIndex(column_n)) + continue; + + // Push an id to allow unnamed labels (generally accidental, but let's behave nicely with them) + // - in your own code you may omit the PushID/PopID all-together, provided you know they won't collide + // - table->InstanceCurrent is only >0 when we use multiple BeginTable/EndTable calls with same identifier. + const char* name = (TableGetColumnFlags(column_n) & ImGuiTableColumnFlags_NoHeaderLabel) ? "" : TableGetColumnName(column_n); + PushID(table->InstanceCurrent * table->ColumnsCount + column_n); + TableHeader(name); + PopID(); + } + + // Allow opening popup from the right-most section after the last column. + ImVec2 mouse_pos = ImGui::GetMousePos(); + if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count) + if (mouse_pos.y >= row_y1 && mouse_pos.y < row_y1 + row_height) + TableOpenContextMenu(-1); // Will open a non-column-specific popup. +} + +// Emit a column header (text + optional sort order) +// We cpu-clip text here so that all columns headers can be merged into a same draw call. +// Note that because of how we cpu-clip and display sorting indicators, you _cannot_ use SameLine() after a TableHeader() +void ImGui::TableHeader(const char* label) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableHeader() after BeginTable()!"); + IM_ASSERT(table->CurrentColumn != -1); + const int column_n = table->CurrentColumn; + ImGuiTableColumn* column = &table->Columns[column_n]; + + // Label + if (label == NULL) + label = ""; + const char* label_end = FindRenderedTextEnd(label); + ImVec2 label_size = CalcTextSize(label, label_end, true); + ImVec2 label_pos = window->DC.CursorPos; + + // If we already got a row height, there's use that. + // FIXME-TABLE: Padding problem if the correct outer-padding CellBgRect strays off our ClipRect? + ImRect cell_r = TableGetCellBgRect(table, column_n); + float label_height = ImMax(label_size.y, table->RowMinHeight - table->CellPaddingY * 2.0f); + + // Calculate ideal size for sort order arrow + float w_arrow = 0.0f; + float w_sort_text = 0.0f; + char sort_order_suf[4] = ""; + const float ARROW_SCALE = 0.65f; + if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) + { + w_arrow = ImFloor(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x); + if (column->SortOrder > 0) + { + ImFormatString(sort_order_suf, IM_ARRAYSIZE(sort_order_suf), "%d", column->SortOrder + 1); + w_sort_text = g.Style.ItemInnerSpacing.x + CalcTextSize(sort_order_suf).x; + } + } + + // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considering for merging. + float max_pos_x = label_pos.x + label_size.x + w_sort_text + w_arrow; + column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, column->WorkMaxX); + column->ContentMaxXHeadersIdeal = ImMax(column->ContentMaxXHeadersIdeal, max_pos_x); + + // Keep header highlighted when context menu is open. + const bool selected = (table->IsContextPopupOpen && table->ContextPopupColumn == column_n && table->InstanceInteracted == table->InstanceCurrent); + ImGuiID id = window->GetID(label); + ImRect bb(cell_r.Min.x, cell_r.Min.y, cell_r.Max.x, ImMax(cell_r.Max.y, cell_r.Min.y + label_height + g.Style.CellPadding.y * 2.0f)); + ItemSize(ImVec2(0.0f, label_height)); // Don't declare unclipped width, it'll be fed ContentMaxPosHeadersIdeal + if (!ItemAdd(bb, id)) + return; + + //GetForegroundDrawList()->AddRect(cell_r.Min, cell_r.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] + //GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] + + // Using AllowItemOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items. + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowItemOverlap); + if (g.ActiveId != id) + SetItemAllowOverlap(); + if (held || hovered || selected) + { + const ImU32 col = GetColorU32(held ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + //RenderFrame(bb.Min, bb.Max, col, false, 0.0f); + TableSetBgColor(ImGuiTableBgTarget_CellBg, col, table->CurrentColumn); + } + else + { + // Submit single cell bg color in the case we didn't submit a full header row + if ((table->RowFlags & ImGuiTableRowFlags_Headers) == 0) + TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_TableHeaderBg), table->CurrentColumn); + } + RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); + if (held) + table->HeldHeaderColumn = (ImGuiTableColumnIdx)column_n; + window->DC.CursorPos.y -= g.Style.ItemSpacing.y * 0.5f; + + // Drag and drop to re-order columns. + // FIXME-TABLE: Scroll request while reordering a column and it lands out of the scrolling zone. + if (held && (table->Flags & ImGuiTableFlags_Reorderable) && IsMouseDragging(0) && !g.DragDropActive) + { + // While moving a column it will jump on the other side of the mouse, so we also test for MouseDelta.x + table->ReorderColumn = (ImGuiTableColumnIdx)column_n; + table->InstanceInteracted = table->InstanceCurrent; + + // We don't reorder: through the frozen<>unfrozen line, or through a column that is marked with ImGuiTableColumnFlags_NoReorder. + if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < cell_r.Min.x) + if (ImGuiTableColumn* prev_column = (column->PrevEnabledColumn != -1) ? &table->Columns[column->PrevEnabledColumn] : NULL) + if (!((column->Flags | prev_column->Flags) & ImGuiTableColumnFlags_NoReorder)) + if ((column->IndexWithinEnabledSet < table->FreezeColumnsRequest) == (prev_column->IndexWithinEnabledSet < table->FreezeColumnsRequest)) + table->ReorderColumnDir = -1; + if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > cell_r.Max.x) + if (ImGuiTableColumn* next_column = (column->NextEnabledColumn != -1) ? &table->Columns[column->NextEnabledColumn] : NULL) + if (!((column->Flags | next_column->Flags) & ImGuiTableColumnFlags_NoReorder)) + if ((column->IndexWithinEnabledSet < table->FreezeColumnsRequest) == (next_column->IndexWithinEnabledSet < table->FreezeColumnsRequest)) + table->ReorderColumnDir = +1; + } + + // Sort order arrow + const float ellipsis_max = cell_r.Max.x - w_arrow - w_sort_text; + if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) + { + if (column->SortOrder != -1) + { + float x = ImMax(cell_r.Min.x, cell_r.Max.x - w_arrow - w_sort_text); + float y = label_pos.y; + if (column->SortOrder > 0) + { + PushStyleColor(ImGuiCol_Text, GetColorU32(ImGuiCol_Text, 0.70f)); + RenderText(ImVec2(x + g.Style.ItemInnerSpacing.x, y), sort_order_suf); + PopStyleColor(); + x += w_sort_text; + } + RenderArrow(window->DrawList, ImVec2(x, y), GetColorU32(ImGuiCol_Text), column->SortDirection == ImGuiSortDirection_Ascending ? ImGuiDir_Up : ImGuiDir_Down, ARROW_SCALE); + } + + // Handle clicking on column header to adjust Sort Order + if (pressed && table->ReorderColumn != column_n) + { + ImGuiSortDirection sort_direction = TableGetColumnNextSortDirection(column); + TableSetColumnSortDirection(column_n, sort_direction, g.IO.KeyShift); + } + } + + // Render clipped label. Clipping here ensure that in the majority of situations, all our header cells will + // be merged into a single draw call. + //window->DrawList->AddCircleFilled(ImVec2(ellipsis_max, label_pos.y), 40, IM_COL32_WHITE); + RenderTextEllipsis(window->DrawList, label_pos, ImVec2(ellipsis_max, label_pos.y + label_height + g.Style.FramePadding.y), ellipsis_max, ellipsis_max, label, label_end, &label_size); + + const bool text_clipped = label_size.x > (ellipsis_max - label_pos.x); + if (text_clipped && hovered && g.HoveredIdNotActiveTimer > g.TooltipSlowDelay) + SetTooltip("%.*s", (int)(label_end - label), label); + + // We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden + if (IsMouseReleased(1) && IsItemHovered()) + TableOpenContextMenu(column_n); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Context Menu +//------------------------------------------------------------------------- +// - TableOpenContextMenu() [Internal] +// - TableDrawContextMenu() [Internal] +//------------------------------------------------------------------------- + +// Use -1 to open menu not specific to a given column. +void ImGui::TableOpenContextMenu(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (column_n == -1 && table->CurrentColumn != -1) // When called within a column automatically use this one (for consistency) + column_n = table->CurrentColumn; + if (column_n == table->ColumnsCount) // To facilitate using with TableGetHoveredColumn() + column_n = -1; + IM_ASSERT(column_n >= -1 && column_n < table->ColumnsCount); + if (table->Flags & (ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + table->IsContextPopupOpen = true; + table->ContextPopupColumn = (ImGuiTableColumnIdx)column_n; + table->InstanceInteracted = table->InstanceCurrent; + const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); + OpenPopupEx(context_menu_id, ImGuiPopupFlags_None); + } +} + +// Output context menu into current window (generally a popup) +// FIXME-TABLE: Ideally this should be writable by the user. Full programmatic access to that data? +void ImGui::TableDrawContextMenu(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + bool want_separator = false; + const int column_n = (table->ContextPopupColumn >= 0 && table->ContextPopupColumn < table->ColumnsCount) ? table->ContextPopupColumn : -1; + ImGuiTableColumn* column = (column_n != -1) ? &table->Columns[column_n] : NULL; + + // Sizing + if (table->Flags & ImGuiTableFlags_Resizable) + { + if (column != NULL) + { + const bool can_resize = !(column->Flags & ImGuiTableColumnFlags_NoResize) && column->IsEnabled; + if (MenuItem("Size column to fit###SizeOne", NULL, false, can_resize)) + TableSetColumnWidthAutoSingle(table, column_n); + } + + const char* size_all_desc; + if (table->ColumnsEnabledFixedCount == table->ColumnsEnabledCount && (table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame) + size_all_desc = "Size all columns to fit###SizeAll"; // All fixed + else + size_all_desc = "Size all columns to default###SizeAll"; // All stretch or mixed + if (MenuItem(size_all_desc, NULL)) + TableSetColumnWidthAutoAll(table); + want_separator = true; + } + + // Ordering + if (table->Flags & ImGuiTableFlags_Reorderable) + { + if (MenuItem("Reset order", NULL, false, !table->IsDefaultDisplayOrder)) + table->IsResetDisplayOrderRequest = true; + want_separator = true; + } + + // Reset all (should work but seems unnecessary/noisy to expose?) + //if (MenuItem("Reset all")) + // table->IsResetAllRequest = true; + + // Sorting + // (modify TableOpenContextMenu() to add _Sortable flag if enabling this) +#if 0 + if ((table->Flags & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0) + { + if (want_separator) + Separator(); + want_separator = true; + + bool append_to_sort_specs = g.IO.KeyShift; + if (MenuItem("Sort in Ascending Order", NULL, column->SortOrder != -1 && column->SortDirection == ImGuiSortDirection_Ascending, (column->Flags & ImGuiTableColumnFlags_NoSortAscending) == 0)) + TableSetColumnSortDirection(table, column_n, ImGuiSortDirection_Ascending, append_to_sort_specs); + if (MenuItem("Sort in Descending Order", NULL, column->SortOrder != -1 && column->SortDirection == ImGuiSortDirection_Descending, (column->Flags & ImGuiTableColumnFlags_NoSortDescending) == 0)) + TableSetColumnSortDirection(table, column_n, ImGuiSortDirection_Descending, append_to_sort_specs); + } +#endif + + // Hiding / Visibility + if (table->Flags & ImGuiTableFlags_Hideable) + { + if (want_separator) + Separator(); + want_separator = true; + + PushItemFlag(ImGuiItemFlags_SelectableDontClosePopup, true); + for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) + { + ImGuiTableColumn* other_column = &table->Columns[other_column_n]; + if (other_column->Flags & ImGuiTableColumnFlags_Disabled) + continue; + + const char* name = TableGetColumnName(table, other_column_n); + if (name == NULL || name[0] == 0) + name = ""; + + // Make sure we can't hide the last active column + bool menu_item_active = (other_column->Flags & ImGuiTableColumnFlags_NoHide) ? false : true; + if (other_column->IsUserEnabled && table->ColumnsEnabledCount <= 1) + menu_item_active = false; + if (MenuItem(name, NULL, other_column->IsUserEnabled, menu_item_active)) + other_column->IsUserEnabledNextFrame = !other_column->IsUserEnabled; + } + PopItemFlag(); + } +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Settings (.ini data) +//------------------------------------------------------------------------- +// FIXME: The binding/finding/creating flow are too confusing. +//------------------------------------------------------------------------- +// - TableSettingsInit() [Internal] +// - TableSettingsCalcChunkSize() [Internal] +// - TableSettingsCreate() [Internal] +// - TableSettingsFindByID() [Internal] +// - TableGetBoundSettings() [Internal] +// - TableResetSettings() +// - TableSaveSettings() [Internal] +// - TableLoadSettings() [Internal] +// - TableSettingsHandler_ClearAll() [Internal] +// - TableSettingsHandler_ApplyAll() [Internal] +// - TableSettingsHandler_ReadOpen() [Internal] +// - TableSettingsHandler_ReadLine() [Internal] +// - TableSettingsHandler_WriteAll() [Internal] +// - TableSettingsInstallHandler() [Internal] +//------------------------------------------------------------------------- +// [Init] 1: TableSettingsHandler_ReadXXXX() Load and parse .ini file into TableSettings. +// [Main] 2: TableLoadSettings() When table is created, bind Table to TableSettings, serialize TableSettings data into Table. +// [Main] 3: TableSaveSettings() When table properties are modified, serialize Table data into bound or new TableSettings, mark .ini as dirty. +// [Main] 4: TableSettingsHandler_WriteAll() When .ini file is dirty (which can come from other source), save TableSettings into .ini file. +//------------------------------------------------------------------------- + +// Clear and initialize empty settings instance +static void TableSettingsInit(ImGuiTableSettings* settings, ImGuiID id, int columns_count, int columns_count_max) +{ + IM_PLACEMENT_NEW(settings) ImGuiTableSettings(); + ImGuiTableColumnSettings* settings_column = settings->GetColumnSettings(); + for (int n = 0; n < columns_count_max; n++, settings_column++) + IM_PLACEMENT_NEW(settings_column) ImGuiTableColumnSettings(); + settings->ID = id; + settings->ColumnsCount = (ImGuiTableColumnIdx)columns_count; + settings->ColumnsCountMax = (ImGuiTableColumnIdx)columns_count_max; + settings->WantApply = true; +} + +static size_t TableSettingsCalcChunkSize(int columns_count) +{ + return sizeof(ImGuiTableSettings) + (size_t)columns_count * sizeof(ImGuiTableColumnSettings); +} + +ImGuiTableSettings* ImGui::TableSettingsCreate(ImGuiID id, int columns_count) +{ + ImGuiContext& g = *GImGui; + ImGuiTableSettings* settings = g.SettingsTables.alloc_chunk(TableSettingsCalcChunkSize(columns_count)); + TableSettingsInit(settings, id, columns_count, columns_count); + return settings; +} + +// Find existing settings +ImGuiTableSettings* ImGui::TableSettingsFindByID(ImGuiID id) +{ + // FIXME-OPT: Might want to store a lookup map for this? + ImGuiContext& g = *GImGui; + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + if (settings->ID == id) + return settings; + return NULL; +} + +// Get settings for a given table, NULL if none +ImGuiTableSettings* ImGui::TableGetBoundSettings(ImGuiTable* table) +{ + if (table->SettingsOffset != -1) + { + ImGuiContext& g = *GImGui; + ImGuiTableSettings* settings = g.SettingsTables.ptr_from_offset(table->SettingsOffset); + IM_ASSERT(settings->ID == table->ID); + if (settings->ColumnsCountMax >= table->ColumnsCount) + return settings; // OK + settings->ID = 0; // Invalidate storage, we won't fit because of a count change + } + return NULL; +} + +// Restore initial state of table (with or without saved settings) +void ImGui::TableResetSettings(ImGuiTable* table) +{ + table->IsInitializing = table->IsSettingsDirty = true; + table->IsResetAllRequest = false; + table->IsSettingsRequestLoad = false; // Don't reload from ini + table->SettingsLoadedFlags = ImGuiTableFlags_None; // Mark as nothing loaded so our initialized data becomes authoritative +} + +void ImGui::TableSaveSettings(ImGuiTable* table) +{ + table->IsSettingsDirty = false; + if (table->Flags & ImGuiTableFlags_NoSavedSettings) + return; + + // Bind or create settings data + ImGuiContext& g = *GImGui; + ImGuiTableSettings* settings = TableGetBoundSettings(table); + if (settings == NULL) + { + settings = TableSettingsCreate(table->ID, table->ColumnsCount); + table->SettingsOffset = g.SettingsTables.offset_from_ptr(settings); + } + settings->ColumnsCount = (ImGuiTableColumnIdx)table->ColumnsCount; + + // Serialize ImGuiTable/ImGuiTableColumn into ImGuiTableSettings/ImGuiTableColumnSettings + IM_ASSERT(settings->ID == table->ID); + IM_ASSERT(settings->ColumnsCount == table->ColumnsCount && settings->ColumnsCountMax >= settings->ColumnsCount); + ImGuiTableColumn* column = table->Columns.Data; + ImGuiTableColumnSettings* column_settings = settings->GetColumnSettings(); + + bool save_ref_scale = false; + settings->SaveFlags = ImGuiTableFlags_None; + for (int n = 0; n < table->ColumnsCount; n++, column++, column_settings++) + { + const float width_or_weight = (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? column->StretchWeight : column->WidthRequest; + column_settings->WidthOrWeight = width_or_weight; + column_settings->Index = (ImGuiTableColumnIdx)n; + column_settings->DisplayOrder = column->DisplayOrder; + column_settings->SortOrder = column->SortOrder; + column_settings->SortDirection = column->SortDirection; + column_settings->IsEnabled = column->IsUserEnabled; + column_settings->IsStretch = (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? 1 : 0; + if ((column->Flags & ImGuiTableColumnFlags_WidthStretch) == 0) + save_ref_scale = true; + + // We skip saving some data in the .ini file when they are unnecessary to restore our state. + // Note that fixed width where initial width was derived from auto-fit will always be saved as InitStretchWeightOrWidth will be 0.0f. + // FIXME-TABLE: We don't have logic to easily compare SortOrder to DefaultSortOrder yet so it's always saved when present. + if (width_or_weight != column->InitStretchWeightOrWidth) + settings->SaveFlags |= ImGuiTableFlags_Resizable; + if (column->DisplayOrder != n) + settings->SaveFlags |= ImGuiTableFlags_Reorderable; + if (column->SortOrder != -1) + settings->SaveFlags |= ImGuiTableFlags_Sortable; + if (column->IsUserEnabled != ((column->Flags & ImGuiTableColumnFlags_DefaultHide) == 0)) + settings->SaveFlags |= ImGuiTableFlags_Hideable; + } + settings->SaveFlags &= table->Flags; + settings->RefScale = save_ref_scale ? table->RefScale : 0.0f; + + MarkIniSettingsDirty(); +} + +void ImGui::TableLoadSettings(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + table->IsSettingsRequestLoad = false; + if (table->Flags & ImGuiTableFlags_NoSavedSettings) + return; + + // Bind settings + ImGuiTableSettings* settings; + if (table->SettingsOffset == -1) + { + settings = TableSettingsFindByID(table->ID); + if (settings == NULL) + return; + if (settings->ColumnsCount != table->ColumnsCount) // Allow settings if columns count changed. We could otherwise decide to return... + table->IsSettingsDirty = true; + table->SettingsOffset = g.SettingsTables.offset_from_ptr(settings); + } + else + { + settings = TableGetBoundSettings(table); + } + + table->SettingsLoadedFlags = settings->SaveFlags; + table->RefScale = settings->RefScale; + + // Serialize ImGuiTableSettings/ImGuiTableColumnSettings into ImGuiTable/ImGuiTableColumn + ImGuiTableColumnSettings* column_settings = settings->GetColumnSettings(); + ImU64 display_order_mask = 0; + for (int data_n = 0; data_n < settings->ColumnsCount; data_n++, column_settings++) + { + int column_n = column_settings->Index; + if (column_n < 0 || column_n >= table->ColumnsCount) + continue; + + ImGuiTableColumn* column = &table->Columns[column_n]; + if (settings->SaveFlags & ImGuiTableFlags_Resizable) + { + if (column_settings->IsStretch) + column->StretchWeight = column_settings->WidthOrWeight; + else + column->WidthRequest = column_settings->WidthOrWeight; + column->AutoFitQueue = 0x00; + } + if (settings->SaveFlags & ImGuiTableFlags_Reorderable) + column->DisplayOrder = column_settings->DisplayOrder; + else + column->DisplayOrder = (ImGuiTableColumnIdx)column_n; + display_order_mask |= (ImU64)1 << column->DisplayOrder; + column->IsUserEnabled = column->IsUserEnabledNextFrame = column_settings->IsEnabled; + column->SortOrder = column_settings->SortOrder; + column->SortDirection = column_settings->SortDirection; + } + + // Validate and fix invalid display order data + const ImU64 expected_display_order_mask = (settings->ColumnsCount == 64) ? ~0 : ((ImU64)1 << settings->ColumnsCount) - 1; + if (display_order_mask != expected_display_order_mask) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->Columns[column_n].DisplayOrder = (ImGuiTableColumnIdx)column_n; + + // Rebuild index + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->DisplayOrderToIndex[table->Columns[column_n].DisplayOrder] = (ImGuiTableColumnIdx)column_n; +} + +static void TableSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Tables.GetMapSize(); i++) + if (ImGuiTable* table = g.Tables.TryGetMapData(i)) + table->SettingsOffset = -1; + g.SettingsTables.clear(); +} + +// Apply to existing windows (if any) +static void TableSettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Tables.GetMapSize(); i++) + if (ImGuiTable* table = g.Tables.TryGetMapData(i)) + { + table->IsSettingsRequestLoad = true; + table->SettingsOffset = -1; + } +} + +static void* TableSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name) +{ + ImGuiID id = 0; + int columns_count = 0; + if (sscanf(name, "0x%08X,%d", &id, &columns_count) < 2) + return NULL; + + if (ImGuiTableSettings* settings = ImGui::TableSettingsFindByID(id)) + { + if (settings->ColumnsCountMax >= columns_count) + { + TableSettingsInit(settings, id, columns_count, settings->ColumnsCountMax); // Recycle + return settings; + } + settings->ID = 0; // Invalidate storage, we won't fit because of a count change + } + return ImGui::TableSettingsCreate(id, columns_count); +} + +static void TableSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line) +{ + // "Column 0 UserID=0x42AD2D21 Width=100 Visible=1 Order=0 Sort=0v" + ImGuiTableSettings* settings = (ImGuiTableSettings*)entry; + float f = 0.0f; + int column_n = 0, r = 0, n = 0; + + if (sscanf(line, "RefScale=%f", &f) == 1) { settings->RefScale = f; return; } + + if (sscanf(line, "Column %d%n", &column_n, &r) == 1) + { + if (column_n < 0 || column_n >= settings->ColumnsCount) + return; + line = ImStrSkipBlank(line + r); + char c = 0; + ImGuiTableColumnSettings* column = settings->GetColumnSettings() + column_n; + column->Index = (ImGuiTableColumnIdx)column_n; + if (sscanf(line, "UserID=0x%08X%n", (ImU32*)&n, &r)==1) { line = ImStrSkipBlank(line + r); column->UserID = (ImGuiID)n; } + if (sscanf(line, "Width=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->WidthOrWeight = (float)n; column->IsStretch = 0; settings->SaveFlags |= ImGuiTableFlags_Resizable; } + if (sscanf(line, "Weight=%f%n", &f, &r) == 1) { line = ImStrSkipBlank(line + r); column->WidthOrWeight = f; column->IsStretch = 1; settings->SaveFlags |= ImGuiTableFlags_Resizable; } + if (sscanf(line, "Visible=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->IsEnabled = (ImU8)n; settings->SaveFlags |= ImGuiTableFlags_Hideable; } + if (sscanf(line, "Order=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->DisplayOrder = (ImGuiTableColumnIdx)n; settings->SaveFlags |= ImGuiTableFlags_Reorderable; } + if (sscanf(line, "Sort=%d%c%n", &n, &c, &r) == 2) { line = ImStrSkipBlank(line + r); column->SortOrder = (ImGuiTableColumnIdx)n; column->SortDirection = (c == '^') ? ImGuiSortDirection_Descending : ImGuiSortDirection_Ascending; settings->SaveFlags |= ImGuiTableFlags_Sortable; } + } +} + +static void TableSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) +{ + ImGuiContext& g = *ctx; + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + { + if (settings->ID == 0) // Skip ditched settings + continue; + + // TableSaveSettings() may clear some of those flags when we establish that the data can be stripped + // (e.g. Order was unchanged) + const bool save_size = (settings->SaveFlags & ImGuiTableFlags_Resizable) != 0; + const bool save_visible = (settings->SaveFlags & ImGuiTableFlags_Hideable) != 0; + const bool save_order = (settings->SaveFlags & ImGuiTableFlags_Reorderable) != 0; + const bool save_sort = (settings->SaveFlags & ImGuiTableFlags_Sortable) != 0; + if (!save_size && !save_visible && !save_order && !save_sort) + continue; + + buf->reserve(buf->size() + 30 + settings->ColumnsCount * 50); // ballpark reserve + buf->appendf("[%s][0x%08X,%d]\n", handler->TypeName, settings->ID, settings->ColumnsCount); + if (settings->RefScale != 0.0f) + buf->appendf("RefScale=%g\n", settings->RefScale); + ImGuiTableColumnSettings* column = settings->GetColumnSettings(); + for (int column_n = 0; column_n < settings->ColumnsCount; column_n++, column++) + { + // "Column 0 UserID=0x42AD2D21 Width=100 Visible=1 Order=0 Sort=0v" + bool save_column = column->UserID != 0 || save_size || save_visible || save_order || (save_sort && column->SortOrder != -1); + if (!save_column) + continue; + buf->appendf("Column %-2d", column_n); + if (column->UserID != 0) buf->appendf(" UserID=%08X", column->UserID); + if (save_size && column->IsStretch) buf->appendf(" Weight=%.4f", column->WidthOrWeight); + if (save_size && !column->IsStretch) buf->appendf(" Width=%d", (int)column->WidthOrWeight); + if (save_visible) buf->appendf(" Visible=%d", column->IsEnabled); + if (save_order) buf->appendf(" Order=%d", column->DisplayOrder); + if (save_sort && column->SortOrder != -1) buf->appendf(" Sort=%d%c", column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? 'v' : '^'); + buf->append("\n"); + } + buf->append("\n"); + } +} + +void ImGui::TableSettingsAddSettingsHandler() +{ + ImGuiSettingsHandler ini_handler; + ini_handler.TypeName = "Table"; + ini_handler.TypeHash = ImHashStr("Table"); + ini_handler.ClearAllFn = TableSettingsHandler_ClearAll; + ini_handler.ReadOpenFn = TableSettingsHandler_ReadOpen; + ini_handler.ReadLineFn = TableSettingsHandler_ReadLine; + ini_handler.ApplyAllFn = TableSettingsHandler_ApplyAll; + ini_handler.WriteAllFn = TableSettingsHandler_WriteAll; + AddSettingsHandler(&ini_handler); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Garbage Collection +//------------------------------------------------------------------------- +// - TableRemove() [Internal] +// - TableGcCompactTransientBuffers() [Internal] +// - TableGcCompactSettings() [Internal] +//------------------------------------------------------------------------- + +// Remove Table (currently only used by TestEngine) +void ImGui::TableRemove(ImGuiTable* table) +{ + //IMGUI_DEBUG_LOG("TableRemove() id=0x%08X\n", table->ID); + ImGuiContext& g = *GImGui; + int table_idx = g.Tables.GetIndex(table); + //memset(table->RawData.Data, 0, table->RawData.size_in_bytes()); + //memset(table, 0, sizeof(ImGuiTable)); + g.Tables.Remove(table->ID, table); + g.TablesLastTimeActive[table_idx] = -1.0f; +} + +// Free up/compact internal Table buffers for when it gets unused +void ImGui::TableGcCompactTransientBuffers(ImGuiTable* table) +{ + //IMGUI_DEBUG_LOG("TableGcCompactTransientBuffers() id=0x%08X\n", table->ID); + ImGuiContext& g = *GImGui; + IM_ASSERT(table->MemoryCompacted == false); + table->SortSpecs.Specs = NULL; + table->SortSpecsMulti.clear(); + table->IsSortSpecsDirty = true; // FIXME: shouldn't have to leak into user performing a sort + table->ColumnsNames.clear(); + table->MemoryCompacted = true; + for (int n = 0; n < table->ColumnsCount; n++) + table->Columns[n].NameOffset = -1; + g.TablesLastTimeActive[g.Tables.GetIndex(table)] = -1.0f; +} + +void ImGui::TableGcCompactTransientBuffers(ImGuiTableTempData* temp_data) +{ + temp_data->DrawSplitter.ClearFreeMemory(); + temp_data->LastTimeActive = -1.0f; +} + +// Compact and remove unused settings data (currently only used by TestEngine) +void ImGui::TableGcCompactSettings() +{ + ImGuiContext& g = *GImGui; + int required_memory = 0; + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + if (settings->ID != 0) + required_memory += (int)TableSettingsCalcChunkSize(settings->ColumnsCount); + if (required_memory == g.SettingsTables.Buf.Size) + return; + ImChunkStream new_chunk_stream; + new_chunk_stream.Buf.reserve(required_memory); + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + if (settings->ID != 0) + memcpy(new_chunk_stream.alloc_chunk(TableSettingsCalcChunkSize(settings->ColumnsCount)), settings, TableSettingsCalcChunkSize(settings->ColumnsCount)); + g.SettingsTables.swap(new_chunk_stream); +} + + +//------------------------------------------------------------------------- +// [SECTION] Tables: Debugging +//------------------------------------------------------------------------- +// - DebugNodeTable() [Internal] +//------------------------------------------------------------------------- + +#ifndef IMGUI_DISABLE_METRICS_WINDOW + +static const char* DebugNodeTableGetSizingPolicyDesc(ImGuiTableFlags sizing_policy) +{ + sizing_policy &= ImGuiTableFlags_SizingMask_; + if (sizing_policy == ImGuiTableFlags_SizingFixedFit) { return "FixedFit"; } + if (sizing_policy == ImGuiTableFlags_SizingFixedSame) { return "FixedSame"; } + if (sizing_policy == ImGuiTableFlags_SizingStretchProp) { return "StretchProp"; } + if (sizing_policy == ImGuiTableFlags_SizingStretchSame) { return "StretchSame"; } + return "N/A"; +} + +void ImGui::DebugNodeTable(ImGuiTable* table) +{ + char buf[512]; + char* p = buf; + const char* buf_end = buf + IM_ARRAYSIZE(buf); + const bool is_active = (table->LastFrameActive >= ImGui::GetFrameCount() - 2); // Note that fully clipped early out scrolling tables will appear as inactive here. + ImFormatString(p, buf_end - p, "Table 0x%08X (%d columns, in '%s')%s", table->ID, table->ColumnsCount, table->OuterWindow->Name, is_active ? "" : " *Inactive*"); + if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } + bool open = TreeNode(table, "%s", buf); + if (!is_active) { PopStyleColor(); } + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(table->OuterRect.Min, table->OuterRect.Max, IM_COL32(255, 255, 0, 255)); + if (IsItemVisible() && table->HoveredColumnBody != -1) + GetForegroundDrawList()->AddRect(GetItemRectMin(), GetItemRectMax(), IM_COL32(255, 255, 0, 255)); + if (!open) + return; + if (table->InstanceCurrent > 0) + ImGui::Text("** %d instances of same table! Some data below will refer to last instance.", table->InstanceCurrent + 1); + bool clear_settings = SmallButton("Clear settings"); + BulletText("OuterRect: Pos: (%.1f,%.1f) Size: (%.1f,%.1f) Sizing: '%s'", table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.GetWidth(), table->OuterRect.GetHeight(), DebugNodeTableGetSizingPolicyDesc(table->Flags)); + BulletText("ColumnsGivenWidth: %.1f, ColumnsAutoFitWidth: %.1f, InnerWidth: %.1f%s", table->ColumnsGivenWidth, table->ColumnsAutoFitWidth, table->InnerWidth, table->InnerWidth == 0.0f ? " (auto)" : ""); + BulletText("CellPaddingX: %.1f, CellSpacingX: %.1f/%.1f, OuterPaddingX: %.1f", table->CellPaddingX, table->CellSpacingX1, table->CellSpacingX2, table->OuterPaddingX); + BulletText("HoveredColumnBody: %d, HoveredColumnBorder: %d", table->HoveredColumnBody, table->HoveredColumnBorder); + BulletText("ResizedColumn: %d, ReorderColumn: %d, HeldHeaderColumn: %d", table->ResizedColumn, table->ReorderColumn, table->HeldHeaderColumn); + //BulletText("BgDrawChannels: %d/%d", 0, table->BgDrawChannelUnfrozen); + float sum_weights = 0.0f; + for (int n = 0; n < table->ColumnsCount; n++) + if (table->Columns[n].Flags & ImGuiTableColumnFlags_WidthStretch) + sum_weights += table->Columns[n].StretchWeight; + for (int n = 0; n < table->ColumnsCount; n++) + { + ImGuiTableColumn* column = &table->Columns[n]; + const char* name = TableGetColumnName(table, n); + ImFormatString(buf, IM_ARRAYSIZE(buf), + "Column %d order %d '%s': offset %+.2f to %+.2f%s\n" + "Enabled: %d, VisibleX/Y: %d/%d, RequestOutput: %d, SkipItems: %d, DrawChannels: %d,%d\n" + "WidthGiven: %.1f, Request/Auto: %.1f/%.1f, StretchWeight: %.3f (%.1f%%)\n" + "MinX: %.1f, MaxX: %.1f (%+.1f), ClipRect: %.1f to %.1f (+%.1f)\n" + "ContentWidth: %.1f,%.1f, HeadersUsed/Ideal %.1f/%.1f\n" + "Sort: %d%s, UserID: 0x%08X, Flags: 0x%04X: %s%s%s..", + n, column->DisplayOrder, name, column->MinX - table->WorkRect.Min.x, column->MaxX - table->WorkRect.Min.x, (n < table->FreezeColumnsRequest) ? " (Frozen)" : "", + column->IsEnabled, column->IsVisibleX, column->IsVisibleY, column->IsRequestOutput, column->IsSkipItems, column->DrawChannelFrozen, column->DrawChannelUnfrozen, + column->WidthGiven, column->WidthRequest, column->WidthAuto, column->StretchWeight, column->StretchWeight > 0.0f ? (column->StretchWeight / sum_weights) * 100.0f : 0.0f, + column->MinX, column->MaxX, column->MaxX - column->MinX, column->ClipRect.Min.x, column->ClipRect.Max.x, column->ClipRect.Max.x - column->ClipRect.Min.x, + column->ContentMaxXFrozen - column->WorkMinX, column->ContentMaxXUnfrozen - column->WorkMinX, column->ContentMaxXHeadersUsed - column->WorkMinX, column->ContentMaxXHeadersIdeal - column->WorkMinX, + column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? " (Asc)" : (column->SortDirection == ImGuiSortDirection_Descending) ? " (Des)" : "", column->UserID, column->Flags, + (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? "WidthStretch " : "", + (column->Flags & ImGuiTableColumnFlags_WidthFixed) ? "WidthFixed " : "", + (column->Flags & ImGuiTableColumnFlags_NoResize) ? "NoResize " : ""); + Bullet(); + Selectable(buf); + if (IsItemHovered()) + { + ImRect r(column->MinX, table->OuterRect.Min.y, column->MaxX, table->OuterRect.Max.y); + GetForegroundDrawList()->AddRect(r.Min, r.Max, IM_COL32(255, 255, 0, 255)); + } + } + if (ImGuiTableSettings* settings = TableGetBoundSettings(table)) + DebugNodeTableSettings(settings); + if (clear_settings) + table->IsResetAllRequest = true; + TreePop(); +} + +void ImGui::DebugNodeTableSettings(ImGuiTableSettings* settings) +{ + if (!TreeNode((void*)(intptr_t)settings->ID, "Settings 0x%08X (%d columns)", settings->ID, settings->ColumnsCount)) + return; + BulletText("SaveFlags: 0x%08X", settings->SaveFlags); + BulletText("ColumnsCount: %d (max %d)", settings->ColumnsCount, settings->ColumnsCountMax); + for (int n = 0; n < settings->ColumnsCount; n++) + { + ImGuiTableColumnSettings* column_settings = &settings->GetColumnSettings()[n]; + ImGuiSortDirection sort_dir = (column_settings->SortOrder != -1) ? (ImGuiSortDirection)column_settings->SortDirection : ImGuiSortDirection_None; + BulletText("Column %d Order %d SortOrder %d %s Vis %d %s %7.3f UserID 0x%08X", + n, column_settings->DisplayOrder, column_settings->SortOrder, + (sort_dir == ImGuiSortDirection_Ascending) ? "Asc" : (sort_dir == ImGuiSortDirection_Descending) ? "Des" : "---", + column_settings->IsEnabled, column_settings->IsStretch ? "Weight" : "Width ", column_settings->WidthOrWeight, column_settings->UserID); + } + TreePop(); +} + +#else // #ifndef IMGUI_DISABLE_METRICS_WINDOW + +void ImGui::DebugNodeTable(ImGuiTable*) {} +void ImGui::DebugNodeTableSettings(ImGuiTableSettings*) {} + +#endif + + +//------------------------------------------------------------------------- +// [SECTION] Columns, BeginColumns, EndColumns, etc. +// (This is a legacy API, prefer using BeginTable/EndTable!) +//------------------------------------------------------------------------- +// FIXME: sizing is lossy when columns width is very small (default width may turn negative etc.) +//------------------------------------------------------------------------- +// - SetWindowClipRectBeforeSetChannel() [Internal] +// - GetColumnIndex() +// - GetColumnsCount() +// - GetColumnOffset() +// - GetColumnWidth() +// - SetColumnOffset() +// - SetColumnWidth() +// - PushColumnClipRect() [Internal] +// - PushColumnsBackground() [Internal] +// - PopColumnsBackground() [Internal] +// - FindOrCreateColumns() [Internal] +// - GetColumnsID() [Internal] +// - BeginColumns() +// - NextColumn() +// - EndColumns() +// - Columns() +//------------------------------------------------------------------------- + +// [Internal] Small optimization to avoid calls to PopClipRect/SetCurrentChannel/PushClipRect in sequences, +// they would meddle many times with the underlying ImDrawCmd. +// Instead, we do a preemptive overwrite of clipping rectangle _without_ altering the command-buffer and let +// the subsequent single call to SetCurrentChannel() does it things once. +void ImGui::SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect) +{ + ImVec4 clip_rect_vec4 = clip_rect.ToVec4(); + window->ClipRect = clip_rect; + window->DrawList->_CmdHeader.ClipRect = clip_rect_vec4; + window->DrawList->_ClipRectStack.Data[window->DrawList->_ClipRectStack.Size - 1] = clip_rect_vec4; +} + +int ImGui::GetColumnIndex() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CurrentColumns ? window->DC.CurrentColumns->Current : 0; +} + +int ImGui::GetColumnsCount() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CurrentColumns ? window->DC.CurrentColumns->Count : 1; +} + +float ImGui::GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm) +{ + return offset_norm * (columns->OffMaxX - columns->OffMinX); +} + +float ImGui::GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset) +{ + return offset / (columns->OffMaxX - columns->OffMinX); +} + +static const float COLUMNS_HIT_RECT_HALF_WIDTH = 4.0f; + +static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index) +{ + // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing + // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning. + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(column_index > 0); // We are not supposed to drag column 0. + IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index)); + + float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + COLUMNS_HIT_RECT_HALF_WIDTH - window->Pos.x; + x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing); + if ((columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths)) + x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing); + + return x; +} + +float ImGui::GetColumnOffset(int column_index) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns == NULL) + return 0.0f; + + if (column_index < 0) + column_index = columns->Current; + IM_ASSERT(column_index < columns->Columns.Size); + + const float t = columns->Columns[column_index].OffsetNorm; + const float x_offset = ImLerp(columns->OffMinX, columns->OffMaxX, t); + return x_offset; +} + +static float GetColumnWidthEx(ImGuiOldColumns* columns, int column_index, bool before_resize = false) +{ + if (column_index < 0) + column_index = columns->Current; + + float offset_norm; + if (before_resize) + offset_norm = columns->Columns[column_index + 1].OffsetNormBeforeResize - columns->Columns[column_index].OffsetNormBeforeResize; + else + offset_norm = columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm; + return ImGui::GetColumnOffsetFromNorm(columns, offset_norm); +} + +float ImGui::GetColumnWidth(int column_index) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns == NULL) + return GetContentRegionAvail().x; + + if (column_index < 0) + column_index = columns->Current; + return GetColumnOffsetFromNorm(columns, columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm); +} + +void ImGui::SetColumnOffset(int column_index, float offset) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiOldColumns* columns = window->DC.CurrentColumns; + IM_ASSERT(columns != NULL); + + if (column_index < 0) + column_index = columns->Current; + IM_ASSERT(column_index < columns->Columns.Size); + + const bool preserve_width = !(columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths) && (column_index < columns->Count - 1); + const float width = preserve_width ? GetColumnWidthEx(columns, column_index, columns->IsBeingResized) : 0.0f; + + if (!(columns->Flags & ImGuiOldColumnFlags_NoForceWithinWindow)) + offset = ImMin(offset, columns->OffMaxX - g.Style.ColumnsMinSpacing * (columns->Count - column_index)); + columns->Columns[column_index].OffsetNorm = GetColumnNormFromOffset(columns, offset - columns->OffMinX); + + if (preserve_width) + SetColumnOffset(column_index + 1, offset + ImMax(g.Style.ColumnsMinSpacing, width)); +} + +void ImGui::SetColumnWidth(int column_index, float width) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + IM_ASSERT(columns != NULL); + + if (column_index < 0) + column_index = columns->Current; + SetColumnOffset(column_index + 1, GetColumnOffset(column_index) + width); +} + +void ImGui::PushColumnClipRect(int column_index) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (column_index < 0) + column_index = columns->Current; + + ImGuiOldColumnData* column = &columns->Columns[column_index]; + PushClipRect(column->ClipRect.Min, column->ClipRect.Max, false); +} + +// Get into the columns background draw command (which is generally the same draw command as before we called BeginColumns) +void ImGui::PushColumnsBackground() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns->Count == 1) + return; + + // Optimization: avoid SetCurrentChannel() + PushClipRect() + columns->HostBackupClipRect = window->ClipRect; + SetWindowClipRectBeforeSetChannel(window, columns->HostInitialClipRect); + columns->Splitter.SetCurrentChannel(window->DrawList, 0); +} + +void ImGui::PopColumnsBackground() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns->Count == 1) + return; + + // Optimization: avoid PopClipRect() + SetCurrentChannel() + SetWindowClipRectBeforeSetChannel(window, columns->HostBackupClipRect); + columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1); +} + +ImGuiOldColumns* ImGui::FindOrCreateColumns(ImGuiWindow* window, ImGuiID id) +{ + // We have few columns per window so for now we don't need bother much with turning this into a faster lookup. + for (int n = 0; n < window->ColumnsStorage.Size; n++) + if (window->ColumnsStorage[n].ID == id) + return &window->ColumnsStorage[n]; + + window->ColumnsStorage.push_back(ImGuiOldColumns()); + ImGuiOldColumns* columns = &window->ColumnsStorage.back(); + columns->ID = id; + return columns; +} + +ImGuiID ImGui::GetColumnsID(const char* str_id, int columns_count) +{ + ImGuiWindow* window = GetCurrentWindow(); + + // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget. + // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer. + PushID(0x11223347 + (str_id ? 0 : columns_count)); + ImGuiID id = window->GetID(str_id ? str_id : "columns"); + PopID(); + + return id; +} + +void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + + IM_ASSERT(columns_count >= 1); + IM_ASSERT(window->DC.CurrentColumns == NULL); // Nested columns are currently not supported + + // Acquire storage for the columns set + ImGuiID id = GetColumnsID(str_id, columns_count); + ImGuiOldColumns* columns = FindOrCreateColumns(window, id); + IM_ASSERT(columns->ID == id); + columns->Current = 0; + columns->Count = columns_count; + columns->Flags = flags; + window->DC.CurrentColumns = columns; + + columns->HostCursorPosY = window->DC.CursorPos.y; + columns->HostCursorMaxPosX = window->DC.CursorMaxPos.x; + columns->HostInitialClipRect = window->ClipRect; + columns->HostBackupParentWorkRect = window->ParentWorkRect; + window->ParentWorkRect = window->WorkRect; + + // Set state for first column + // We aim so that the right-most column will have the same clipping width as other after being clipped by parent ClipRect + const float column_padding = g.Style.ItemSpacing.x; + const float half_clip_extend_x = ImFloor(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize)); + const float max_1 = window->WorkRect.Max.x + column_padding - ImMax(column_padding - window->WindowPadding.x, 0.0f); + const float max_2 = window->WorkRect.Max.x + half_clip_extend_x; + columns->OffMinX = window->DC.Indent.x - column_padding + ImMax(column_padding - window->WindowPadding.x, 0.0f); + columns->OffMaxX = ImMax(ImMin(max_1, max_2) - window->Pos.x, columns->OffMinX + 1.0f); + columns->LineMinY = columns->LineMaxY = window->DC.CursorPos.y; + + // Clear data if columns count changed + if (columns->Columns.Size != 0 && columns->Columns.Size != columns_count + 1) + columns->Columns.resize(0); + + // Initialize default widths + columns->IsFirstFrame = (columns->Columns.Size == 0); + if (columns->Columns.Size == 0) + { + columns->Columns.reserve(columns_count + 1); + for (int n = 0; n < columns_count + 1; n++) + { + ImGuiOldColumnData column; + column.OffsetNorm = n / (float)columns_count; + columns->Columns.push_back(column); + } + } + + for (int n = 0; n < columns_count; n++) + { + // Compute clipping rectangle + ImGuiOldColumnData* column = &columns->Columns[n]; + float clip_x1 = IM_ROUND(window->Pos.x + GetColumnOffset(n)); + float clip_x2 = IM_ROUND(window->Pos.x + GetColumnOffset(n + 1) - 1.0f); + column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX); + column->ClipRect.ClipWithFull(window->ClipRect); + } + + if (columns->Count > 1) + { + columns->Splitter.Split(window->DrawList, 1 + columns->Count); + columns->Splitter.SetCurrentChannel(window->DrawList, 1); + PushColumnClipRect(0); + } + + // We don't generally store Indent.x inside ColumnsOffset because it may be manipulated by the user. + float offset_0 = GetColumnOffset(columns->Current); + float offset_1 = GetColumnOffset(columns->Current + 1); + float width = offset_1 - offset_0; + PushItemWidth(width * 0.65f); + window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; +} + +void ImGui::NextColumn() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems || window->DC.CurrentColumns == NULL) + return; + + ImGuiContext& g = *GImGui; + ImGuiOldColumns* columns = window->DC.CurrentColumns; + + if (columns->Count == 1) + { + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + IM_ASSERT(columns->Current == 0); + return; + } + + // Next column + if (++columns->Current == columns->Count) + columns->Current = 0; + + PopItemWidth(); + + // Optimization: avoid PopClipRect() + SetCurrentChannel() + PushClipRect() + // (which would needlessly attempt to update commands in the wrong channel, then pop or overwrite them), + ImGuiOldColumnData* column = &columns->Columns[columns->Current]; + SetWindowClipRectBeforeSetChannel(window, column->ClipRect); + columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1); + + const float column_padding = g.Style.ItemSpacing.x; + columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); + if (columns->Current > 0) + { + // Columns 1+ ignore IndentX (by canceling it out) + // FIXME-COLUMNS: Unnecessary, could be locked? + window->DC.ColumnsOffset.x = GetColumnOffset(columns->Current) - window->DC.Indent.x + column_padding; + } + else + { + // New row/line: column 0 honor IndentX. + window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); + columns->LineMinY = columns->LineMaxY; + } + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.y = columns->LineMinY; + window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + window->DC.CurrLineTextBaseOffset = 0.0f; + + // FIXME-COLUMNS: Share code with BeginColumns() - move code on columns setup. + float offset_0 = GetColumnOffset(columns->Current); + float offset_1 = GetColumnOffset(columns->Current + 1); + float width = offset_1 - offset_0; + PushItemWidth(width * 0.65f); + window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; +} + +void ImGui::EndColumns() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + IM_ASSERT(columns != NULL); + + PopItemWidth(); + if (columns->Count > 1) + { + PopClipRect(); + columns->Splitter.Merge(window->DrawList); + } + + const ImGuiOldColumnFlags flags = columns->Flags; + columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); + window->DC.CursorPos.y = columns->LineMaxY; + if (!(flags & ImGuiOldColumnFlags_GrowParentContentsSize)) + window->DC.CursorMaxPos.x = columns->HostCursorMaxPosX; // Restore cursor max pos, as columns don't grow parent + + // Draw columns borders and handle resize + // The IsBeingResized flag ensure we preserve pre-resize columns width so back-and-forth are not lossy + bool is_being_resized = false; + if (!(flags & ImGuiOldColumnFlags_NoBorder) && !window->SkipItems) + { + // We clip Y boundaries CPU side because very long triangles are mishandled by some GPU drivers. + const float y1 = ImMax(columns->HostCursorPosY, window->ClipRect.Min.y); + const float y2 = ImMin(window->DC.CursorPos.y, window->ClipRect.Max.y); + int dragging_column = -1; + for (int n = 1; n < columns->Count; n++) + { + ImGuiOldColumnData* column = &columns->Columns[n]; + float x = window->Pos.x + GetColumnOffset(n); + const ImGuiID column_id = columns->ID + ImGuiID(n); + const float column_hit_hw = COLUMNS_HIT_RECT_HALF_WIDTH; + const ImRect column_hit_rect(ImVec2(x - column_hit_hw, y1), ImVec2(x + column_hit_hw, y2)); + KeepAliveID(column_id); + if (IsClippedEx(column_hit_rect, column_id)) // FIXME: Can be removed or replaced with a lower-level test + continue; + + bool hovered = false, held = false; + if (!(flags & ImGuiOldColumnFlags_NoResize)) + { + ButtonBehavior(column_hit_rect, column_id, &hovered, &held); + if (hovered || held) + g.MouseCursor = ImGuiMouseCursor_ResizeEW; + if (held && !(column->Flags & ImGuiOldColumnFlags_NoResize)) + dragging_column = n; + } + + // Draw column + const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); + const float xi = IM_FLOOR(x); + window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col); + } + + // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame. + if (dragging_column != -1) + { + if (!columns->IsBeingResized) + for (int n = 0; n < columns->Count + 1; n++) + columns->Columns[n].OffsetNormBeforeResize = columns->Columns[n].OffsetNorm; + columns->IsBeingResized = is_being_resized = true; + float x = GetDraggedColumnOffset(columns, dragging_column); + SetColumnOffset(dragging_column, x); + } + } + columns->IsBeingResized = is_being_resized; + + window->WorkRect = window->ParentWorkRect; + window->ParentWorkRect = columns->HostBackupParentWorkRect; + window->DC.CurrentColumns = NULL; + window->DC.ColumnsOffset.x = 0.0f; + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); +} + +void ImGui::Columns(int columns_count, const char* id, bool border) +{ + ImGuiWindow* window = GetCurrentWindow(); + IM_ASSERT(columns_count >= 1); + + ImGuiOldColumnFlags flags = (border ? 0 : ImGuiOldColumnFlags_NoBorder); + //flags |= ImGuiOldColumnFlags_NoPreserveWidths; // NB: Legacy behavior + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns != NULL && columns->Count == columns_count && columns->Flags == flags) + return; + + if (columns != NULL) + EndColumns(); + + if (columns_count != 1) + BeginColumns(id, columns_count, flags); +} + +//------------------------------------------------------------------------- + +#endif // #ifndef IMGUI_DISABLE diff --git a/3rdparty/imgui/src/imgui_widgets.cpp b/3rdparty/imgui/src/imgui_widgets.cpp new file mode 100644 index 0000000000..b18eac1aa7 --- /dev/null +++ b/3rdparty/imgui/src/imgui_widgets.cpp @@ -0,0 +1,8304 @@ +// dear imgui, v1.88 WIP +// (widgets code) + +/* + +Index of this file: + +// [SECTION] Forward Declarations +// [SECTION] Widgets: Text, etc. +// [SECTION] Widgets: Main (Button, Image, Checkbox, RadioButton, ProgressBar, Bullet, etc.) +// [SECTION] Widgets: Low-level Layout helpers (Spacing, Dummy, NewLine, Separator, etc.) +// [SECTION] Widgets: ComboBox +// [SECTION] Data Type and Data Formatting Helpers +// [SECTION] Widgets: DragScalar, DragFloat, DragInt, etc. +// [SECTION] Widgets: SliderScalar, SliderFloat, SliderInt, etc. +// [SECTION] Widgets: InputScalar, InputFloat, InputInt, etc. +// [SECTION] Widgets: InputText, InputTextMultiline +// [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc. +// [SECTION] Widgets: TreeNode, CollapsingHeader, etc. +// [SECTION] Widgets: Selectable +// [SECTION] Widgets: ListBox +// [SECTION] Widgets: PlotLines, PlotHistogram +// [SECTION] Widgets: Value helpers +// [SECTION] Widgets: MenuItem, BeginMenu, EndMenu, etc. +// [SECTION] Widgets: BeginTabBar, EndTabBar, etc. +// [SECTION] Widgets: BeginTabItem, EndTabItem, etc. +// [SECTION] Widgets: Columns, BeginColumns, EndColumns, etc. + +*/ + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif +#include "imgui_internal.h" + +// System includes +#include // toupper +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +//------------------------------------------------------------------------- +// Warnings +//------------------------------------------------------------------------- + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. +#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') +#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#endif + +//------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------- + +// Widgets +static const float DRAGDROP_HOLD_TO_OPEN_TIMER = 0.70f; // Time for drag-hold to activate items accepting the ImGuiButtonFlags_PressedOnDragDropHold button behavior. +static const float DRAG_MOUSE_THRESHOLD_FACTOR = 0.50f; // Multiplier for the default value of io.MouseDragThreshold to make DragFloat/DragInt react faster to mouse drags. + +// Those MIN/MAX values are not define because we need to point to them +static const signed char IM_S8_MIN = -128; +static const signed char IM_S8_MAX = 127; +static const unsigned char IM_U8_MIN = 0; +static const unsigned char IM_U8_MAX = 0xFF; +static const signed short IM_S16_MIN = -32768; +static const signed short IM_S16_MAX = 32767; +static const unsigned short IM_U16_MIN = 0; +static const unsigned short IM_U16_MAX = 0xFFFF; +static const ImS32 IM_S32_MIN = INT_MIN; // (-2147483647 - 1), (0x80000000); +static const ImS32 IM_S32_MAX = INT_MAX; // (2147483647), (0x7FFFFFFF) +static const ImU32 IM_U32_MIN = 0; +static const ImU32 IM_U32_MAX = UINT_MAX; // (0xFFFFFFFF) +#ifdef LLONG_MIN +static const ImS64 IM_S64_MIN = LLONG_MIN; // (-9223372036854775807ll - 1ll); +static const ImS64 IM_S64_MAX = LLONG_MAX; // (9223372036854775807ll); +#else +static const ImS64 IM_S64_MIN = -9223372036854775807LL - 1; +static const ImS64 IM_S64_MAX = 9223372036854775807LL; +#endif +static const ImU64 IM_U64_MIN = 0; +#ifdef ULLONG_MAX +static const ImU64 IM_U64_MAX = ULLONG_MAX; // (0xFFFFFFFFFFFFFFFFull); +#else +static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1); +#endif + +//------------------------------------------------------------------------- +// [SECTION] Forward Declarations +//------------------------------------------------------------------------- + +// For InputTextEx() +static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source); +static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end); +static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false); + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Text, etc. +//------------------------------------------------------------------------- +// - TextEx() [Internal] +// - TextUnformatted() +// - Text() +// - TextV() +// - TextColored() +// - TextColoredV() +// - TextDisabled() +// - TextDisabledV() +// - TextWrapped() +// - TextWrappedV() +// - LabelText() +// - LabelTextV() +// - BulletText() +// - BulletTextV() +//------------------------------------------------------------------------- + +void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + ImGuiContext& g = *GImGui; + + // Accept null ranges + if (text == text_end) + text = text_end = ""; + + // Calculate length + const char* text_begin = text; + if (text_end == NULL) + text_end = text + strlen(text); // FIXME-OPT + + const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); + const float wrap_pos_x = window->DC.TextWrapPos; + const bool wrap_enabled = (wrap_pos_x >= 0.0f); + if (text_end - text <= 2000 || wrap_enabled) + { + // Common case + const float wrap_width = wrap_enabled ? CalcWrapWidthForPos(window->DC.CursorPos, wrap_pos_x) : 0.0f; + const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width); + + ImRect bb(text_pos, text_pos + text_size); + ItemSize(text_size, 0.0f); + if (!ItemAdd(bb, 0)) + return; + + // Render (we don't hide text after ## in this end-user function) + RenderTextWrapped(bb.Min, text_begin, text_end, wrap_width); + } + else + { + // Long text! + // Perform manual coarse clipping to optimize for long multi-line text + // - From this point we will only compute the width of lines that are visible. Optimization only available when word-wrapping is disabled. + // - We also don't vertically center the text within the line full height, which is unlikely to matter because we are likely the biggest and only item on the line. + // - We use memchr(), pay attention that well optimized versions of those str/mem functions are much faster than a casually written loop. + const char* line = text; + const float line_height = GetTextLineHeight(); + ImVec2 text_size(0, 0); + + // Lines to skip (can't skip when logging text) + ImVec2 pos = text_pos; + if (!g.LogEnabled) + { + int lines_skippable = (int)((window->ClipRect.Min.y - text_pos.y) / line_height); + if (lines_skippable > 0) + { + int lines_skipped = 0; + while (line < text_end && lines_skipped < lines_skippable) + { + const char* line_end = (const char*)memchr(line, '\n', text_end - line); + if (!line_end) + line_end = text_end; + if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0) + text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x); + line = line_end + 1; + lines_skipped++; + } + pos.y += lines_skipped * line_height; + } + } + + // Lines to render + if (line < text_end) + { + ImRect line_rect(pos, pos + ImVec2(FLT_MAX, line_height)); + while (line < text_end) + { + if (IsClippedEx(line_rect, 0)) + break; + + const char* line_end = (const char*)memchr(line, '\n', text_end - line); + if (!line_end) + line_end = text_end; + text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x); + RenderText(pos, line, line_end, false); + line = line_end + 1; + line_rect.Min.y += line_height; + line_rect.Max.y += line_height; + pos.y += line_height; + } + + // Count remaining lines + int lines_skipped = 0; + while (line < text_end) + { + const char* line_end = (const char*)memchr(line, '\n', text_end - line); + if (!line_end) + line_end = text_end; + if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0) + text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x); + line = line_end + 1; + lines_skipped++; + } + pos.y += lines_skipped * line_height; + } + text_size.y = (pos - text_pos).y; + + ImRect bb(text_pos, text_pos + text_size); + ItemSize(text_size, 0.0f); + ItemAdd(bb, 0); + } +} + +void ImGui::TextUnformatted(const char* text, const char* text_end) +{ + TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText); +} + +void ImGui::Text(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + TextV(fmt, args); + va_end(args); +} + +void ImGui::TextV(const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + // FIXME-OPT: Handle the %s shortcut? + ImGuiContext& g = *GImGui; + const char* text_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); + TextEx(g.TempBuffer, text_end, ImGuiTextFlags_NoWidthForLargeClippedText); +} + +void ImGui::TextColored(const ImVec4& col, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + TextColoredV(col, fmt, args); + va_end(args); +} + +void ImGui::TextColoredV(const ImVec4& col, const char* fmt, va_list args) +{ + PushStyleColor(ImGuiCol_Text, col); + if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) + TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting + else + TextV(fmt, args); + PopStyleColor(); +} + +void ImGui::TextDisabled(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + TextDisabledV(fmt, args); + va_end(args); +} + +void ImGui::TextDisabledV(const char* fmt, va_list args) +{ + ImGuiContext& g = *GImGui; + PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); + if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) + TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting + else + TextV(fmt, args); + PopStyleColor(); +} + +void ImGui::TextWrapped(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + TextWrappedV(fmt, args); + va_end(args); +} + +void ImGui::TextWrappedV(const char* fmt, va_list args) +{ + ImGuiContext& g = *GImGui; + bool need_backup = (g.CurrentWindow->DC.TextWrapPos < 0.0f); // Keep existing wrap position if one is already set + if (need_backup) + PushTextWrapPos(0.0f); + if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) + TextEx(va_arg(args, const char*), NULL, ImGuiTextFlags_NoWidthForLargeClippedText); // Skip formatting + else + TextV(fmt, args); + if (need_backup) + PopTextWrapPos(); +} + +void ImGui::LabelText(const char* label, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + LabelTextV(label, fmt, args); + va_end(args); +} + +// Add a label+text combo aligned to other label+value widgets +void ImGui::LabelTextV(const char* label, const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const float w = CalcItemWidth(); + + const char* value_text_begin = &g.TempBuffer[0]; + const char* value_text_end = value_text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); + const ImVec2 value_size = CalcTextSize(value_text_begin, value_text_end, false); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + const ImVec2 pos = window->DC.CursorPos; + const ImRect value_bb(pos, pos + ImVec2(w, value_size.y + style.FramePadding.y * 2)); + const ImRect total_bb(pos, pos + ImVec2(w + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), ImMax(value_size.y, label_size.y) + style.FramePadding.y * 2)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, 0)) + return; + + // Render + RenderTextClipped(value_bb.Min + style.FramePadding, value_bb.Max, value_text_begin, value_text_end, &value_size, ImVec2(0.0f, 0.0f)); + if (label_size.x > 0.0f) + RenderText(ImVec2(value_bb.Max.x + style.ItemInnerSpacing.x, value_bb.Min.y + style.FramePadding.y), label); +} + +void ImGui::BulletText(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + BulletTextV(fmt, args); + va_end(args); +} + +// Text with a little bullet aligned to the typical tree node. +void ImGui::BulletTextV(const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + + const char* text_begin = g.TempBuffer; + const char* text_end = text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); + const ImVec2 label_size = CalcTextSize(text_begin, text_end, false); + const ImVec2 total_size = ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x * 2) : 0.0f), label_size.y); // Empty text doesn't add padding + ImVec2 pos = window->DC.CursorPos; + pos.y += window->DC.CurrLineTextBaseOffset; + ItemSize(total_size, 0.0f); + const ImRect bb(pos, pos + total_size); + if (!ItemAdd(bb, 0)) + return; + + // Render + ImU32 text_col = GetColorU32(ImGuiCol_Text); + RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize * 0.5f, g.FontSize * 0.5f), text_col); + RenderText(bb.Min + ImVec2(g.FontSize + style.FramePadding.x * 2, 0.0f), text_begin, text_end, false); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Main +//------------------------------------------------------------------------- +// - ButtonBehavior() [Internal] +// - Button() +// - SmallButton() +// - InvisibleButton() +// - ArrowButton() +// - CloseButton() [Internal] +// - CollapseButton() [Internal] +// - GetWindowScrollbarID() [Internal] +// - GetWindowScrollbarRect() [Internal] +// - Scrollbar() [Internal] +// - ScrollbarEx() [Internal] +// - Image() +// - ImageButton() +// - Checkbox() +// - CheckboxFlagsT() [Internal] +// - CheckboxFlags() +// - RadioButton() +// - ProgressBar() +// - Bullet() +//------------------------------------------------------------------------- + +// The ButtonBehavior() function is key to many interactions and used by many/most widgets. +// Because we handle so many cases (keyboard/gamepad navigation, drag and drop) and many specific behavior (via ImGuiButtonFlags_), +// this code is a little complex. +// By far the most common path is interacting with the Mouse using the default ImGuiButtonFlags_PressedOnClickRelease button behavior. +// See the series of events below and the corresponding state reported by dear imgui: +//------------------------------------------------------------------------------------------------------------------------------------------------ +// with PressedOnClickRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() +// Frame N+0 (mouse is outside bb) - - - - - - +// Frame N+1 (mouse moves inside bb) - true - - - - +// Frame N+2 (mouse button is down) - true true true - true +// Frame N+3 (mouse button is down) - true true - - - +// Frame N+4 (mouse moves outside bb) - - true - - - +// Frame N+5 (mouse moves inside bb) - true true - - - +// Frame N+6 (mouse button is released) true true - - true - +// Frame N+7 (mouse button is released) - true - - - - +// Frame N+8 (mouse moves outside bb) - - - - - - +//------------------------------------------------------------------------------------------------------------------------------------------------ +// with PressedOnClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() +// Frame N+2 (mouse button is down) true true true true - true +// Frame N+3 (mouse button is down) - true true - - - +// Frame N+6 (mouse button is released) - true - - true - +// Frame N+7 (mouse button is released) - true - - - - +//------------------------------------------------------------------------------------------------------------------------------------------------ +// with PressedOnRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() +// Frame N+2 (mouse button is down) - true - - - true +// Frame N+3 (mouse button is down) - true - - - - +// Frame N+6 (mouse button is released) true true - - - - +// Frame N+7 (mouse button is released) - true - - - - +//------------------------------------------------------------------------------------------------------------------------------------------------ +// with PressedOnDoubleClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() +// Frame N+0 (mouse button is down) - true - - - true +// Frame N+1 (mouse button is down) - true - - - - +// Frame N+2 (mouse button is released) - true - - - - +// Frame N+3 (mouse button is released) - true - - - - +// Frame N+4 (mouse button is down) true true true true - true +// Frame N+5 (mouse button is down) - true true - - - +// Frame N+6 (mouse button is released) - true - - true - +// Frame N+7 (mouse button is released) - true - - - - +//------------------------------------------------------------------------------------------------------------------------------------------------ +// Note that some combinations are supported, +// - PressedOnDragDropHold can generally be associated with any flag. +// - PressedOnDoubleClick can be associated by PressedOnClickRelease/PressedOnRelease, in which case the second release event won't be reported. +//------------------------------------------------------------------------------------------------------------------------------------------------ +// The behavior of the return-value changes when ImGuiButtonFlags_Repeat is set: +// Repeat+ Repeat+ Repeat+ Repeat+ +// PressedOnClickRelease PressedOnClick PressedOnRelease PressedOnDoubleClick +//------------------------------------------------------------------------------------------------------------------------------------------------- +// Frame N+0 (mouse button is down) - true - true +// ... - - - - +// Frame N + RepeatDelay true true - true +// ... - - - - +// Frame N + RepeatDelay + RepeatRate*N true true - true +//------------------------------------------------------------------------------------------------------------------------------------------------- + +bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + + // Default only reacts to left mouse button + if ((flags & ImGuiButtonFlags_MouseButtonMask_) == 0) + flags |= ImGuiButtonFlags_MouseButtonDefault_; + + // Default behavior requires click + release inside bounding box + if ((flags & ImGuiButtonFlags_PressedOnMask_) == 0) + flags |= ImGuiButtonFlags_PressedOnDefault_; + + ImGuiWindow* backup_hovered_window = g.HoveredWindow; + const bool flatten_hovered_children = (flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredWindow && g.HoveredWindow->RootWindow == window; + if (flatten_hovered_children) + g.HoveredWindow = window; + +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (id != 0 && g.LastItemData.ID != id) + IMGUI_TEST_ENGINE_ITEM_ADD(bb, id); +#endif + + bool pressed = false; + bool hovered = ItemHoverable(bb, id); + + // Drag source doesn't report as hovered + if (hovered && g.DragDropActive && g.DragDropPayload.SourceId == id && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover)) + hovered = false; + + // Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button + if (g.DragDropActive && (flags & ImGuiButtonFlags_PressedOnDragDropHold) && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) + if (IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) + { + hovered = true; + SetHoveredID(id); + if (g.HoveredIdTimer - g.IO.DeltaTime <= DRAGDROP_HOLD_TO_OPEN_TIMER && g.HoveredIdTimer >= DRAGDROP_HOLD_TO_OPEN_TIMER) + { + pressed = true; + g.DragDropHoldJustPressedId = id; + FocusWindow(window); + } + } + + if (flatten_hovered_children) + g.HoveredWindow = backup_hovered_window; + + // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one. + if (hovered && (flags & ImGuiButtonFlags_AllowItemOverlap) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0)) + hovered = false; + + // Mouse handling + if (hovered) + { + if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt)) + { + // Poll buttons + int mouse_button_clicked = -1; + if ((flags & ImGuiButtonFlags_MouseButtonLeft) && g.IO.MouseClicked[0]) { mouse_button_clicked = 0; } + else if ((flags & ImGuiButtonFlags_MouseButtonRight) && g.IO.MouseClicked[1]) { mouse_button_clicked = 1; } + else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && g.IO.MouseClicked[2]) { mouse_button_clicked = 2; } + + if (mouse_button_clicked != -1 && g.ActiveId != id) + { + if (flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere)) + { + SetActiveID(id, window); + g.ActiveIdMouseButton = mouse_button_clicked; + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + SetFocusID(id, window); + FocusWindow(window); + } + if ((flags & ImGuiButtonFlags_PressedOnClick) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseClickedCount[mouse_button_clicked] == 2)) + { + pressed = true; + if (flags & ImGuiButtonFlags_NoHoldingActiveId) + ClearActiveID(); + else + SetActiveID(id, window); // Hold on ID + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + SetFocusID(id, window); + g.ActiveIdMouseButton = mouse_button_clicked; + FocusWindow(window); + } + } + if (flags & ImGuiButtonFlags_PressedOnRelease) + { + int mouse_button_released = -1; + if ((flags & ImGuiButtonFlags_MouseButtonLeft) && g.IO.MouseReleased[0]) { mouse_button_released = 0; } + else if ((flags & ImGuiButtonFlags_MouseButtonRight) && g.IO.MouseReleased[1]) { mouse_button_released = 1; } + else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && g.IO.MouseReleased[2]) { mouse_button_released = 2; } + if (mouse_button_released != -1) + { + const bool has_repeated_at_least_once = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; // Repeat mode trumps on release behavior + if (!has_repeated_at_least_once) + pressed = true; + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + SetFocusID(id, window); + ClearActiveID(); + } + } + + // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). + // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings. + if (g.ActiveId == id && (flags & ImGuiButtonFlags_Repeat)) + if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, true)) + pressed = true; + } + + if (pressed) + g.NavDisableHighlight = true; + } + + // Gamepad/Keyboard navigation + // We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse. + if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId)) + if (!(flags & ImGuiButtonFlags_NoHoveredOnFocus)) + hovered = true; + if (g.NavActivateDownId == id) + { + bool nav_activated_by_code = (g.NavActivateId == id); + bool nav_activated_by_inputs = IsNavInputTest(ImGuiNavInput_Activate, (flags & ImGuiButtonFlags_Repeat) ? ImGuiNavReadMode_Repeat : ImGuiNavReadMode_Pressed); + if (nav_activated_by_code || nav_activated_by_inputs) + { + // Set active id so it can be queried by user via IsItemActive(), equivalent of holding the mouse button. + pressed = true; + SetActiveID(id, window); + g.ActiveIdSource = ImGuiInputSource_Nav; + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + SetFocusID(id, window); + } + } + + // Process while held + bool held = false; + if (g.ActiveId == id) + { + if (g.ActiveIdSource == ImGuiInputSource_Mouse) + { + if (g.ActiveIdIsJustActivated) + g.ActiveIdClickOffset = g.IO.MousePos - bb.Min; + + const int mouse_button = g.ActiveIdMouseButton; + IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT); + if (g.IO.MouseDown[mouse_button]) + { + held = true; + } + else + { + bool release_in = hovered && (flags & ImGuiButtonFlags_PressedOnClickRelease) != 0; + bool release_anywhere = (flags & ImGuiButtonFlags_PressedOnClickReleaseAnywhere) != 0; + if ((release_in || release_anywhere) && !g.DragDropActive) + { + // Report as pressed when releasing the mouse (this is the most common path) + bool is_double_click_release = (flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseReleased[mouse_button] && g.IO.MouseClickedLastCount[mouse_button] == 2; + bool is_repeating_already = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps + if (!is_double_click_release && !is_repeating_already) + pressed = true; + } + ClearActiveID(); + } + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + g.NavDisableHighlight = true; + } + else if (g.ActiveIdSource == ImGuiInputSource_Nav) + { + // When activated using Nav, we hold on the ActiveID until activation button is released + if (g.NavActivateDownId != id) + ClearActiveID(); + } + if (pressed) + g.ActiveIdHasBeenPressedBefore = true; + } + + if (out_hovered) *out_hovered = hovered; + if (out_held) *out_held = held; + + return pressed; +} + +bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + ImVec2 pos = window->DC.CursorPos; + if ((flags & ImGuiButtonFlags_AlignTextBaseLine) && style.FramePadding.y < window->DC.CurrLineTextBaseOffset) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag) + pos.y += window->DC.CurrLineTextBaseOffset - style.FramePadding.y; + ImVec2 size = CalcItemSize(size_arg, label_size.x + style.FramePadding.x * 2.0f, label_size.y + style.FramePadding.y * 2.0f); + + const ImRect bb(pos, pos + size); + ItemSize(size, style.FramePadding.y); + if (!ItemAdd(bb, id)) + return false; + + if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) + flags |= ImGuiButtonFlags_Repeat; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); + + // Render + const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + RenderNavHighlight(bb, id); + RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding); + + if (g.LogEnabled) + LogSetNextTextDecoration("[", "]"); + RenderTextClipped(bb.Min + style.FramePadding, bb.Max - style.FramePadding, label, NULL, &label_size, style.ButtonTextAlign, &bb); + + // Automatically close popups + //if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup)) + // CloseCurrentPopup(); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return pressed; +} + +bool ImGui::Button(const char* label, const ImVec2& size_arg) +{ + return ButtonEx(label, size_arg, ImGuiButtonFlags_None); +} + +// Small buttons fits within text without additional vertical spacing. +bool ImGui::SmallButton(const char* label) +{ + ImGuiContext& g = *GImGui; + float backup_padding_y = g.Style.FramePadding.y; + g.Style.FramePadding.y = 0.0f; + bool pressed = ButtonEx(label, ImVec2(0, 0), ImGuiButtonFlags_AlignTextBaseLine); + g.Style.FramePadding.y = backup_padding_y; + return pressed; +} + +// Tip: use ImGui::PushID()/PopID() to push indices or pointers in the ID stack. +// Then you can keep 'str_id' empty or the same for all your buttons (instead of creating a string based on a non-string id) +bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + // Cannot use zero-size for InvisibleButton(). Unlike Button() there is not way to fallback using the label size. + IM_ASSERT(size_arg.x != 0.0f && size_arg.y != 0.0f); + + const ImGuiID id = window->GetID(str_id); + ImVec2 size = CalcItemSize(size_arg, 0.0f, 0.0f); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + ItemSize(size); + if (!ItemAdd(bb, id)) + return false; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags); + return pressed; +} + +bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImGuiID id = window->GetID(str_id); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + const float default_size = GetFrameHeight(); + ItemSize(size, (size.y >= default_size) ? g.Style.FramePadding.y : -1.0f); + if (!ItemAdd(bb, id)) + return false; + + if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) + flags |= ImGuiButtonFlags_Repeat; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); + + // Render + const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + const ImU32 text_col = GetColorU32(ImGuiCol_Text); + RenderNavHighlight(bb, id); + RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding); + RenderArrow(window->DrawList, bb.Min + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), text_col, dir); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags); + return pressed; +} + +bool ImGui::ArrowButton(const char* str_id, ImGuiDir dir) +{ + float sz = GetFrameHeight(); + return ArrowButtonEx(str_id, dir, ImVec2(sz, sz), ImGuiButtonFlags_None); +} + +// Button to close a window +bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Tweak 1: Shrink hit-testing area if button covers an abnormally large proportion of the visible region. That's in order to facilitate moving the window away. (#3825) + // This may better be applied as a general hit-rect reduction mechanism for all widgets to ensure the area to move window is always accessible? + const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); + ImRect bb_interact = bb; + const float area_to_visible_ratio = window->OuterRectClipped.GetArea() / bb.GetArea(); + if (area_to_visible_ratio < 1.5f) + bb_interact.Expand(ImFloor(bb_interact.GetSize() * -0.25f)); + + // Tweak 2: We intentionally allow interaction when clipped so that a mechanical Alt,Right,Activate sequence can always close a window. + // (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible). + bool is_clipped = !ItemAdd(bb_interact, id); + + bool hovered, held; + bool pressed = ButtonBehavior(bb_interact, id, &hovered, &held); + if (is_clipped) + return pressed; + + // Render + // FIXME: Clarify this mess + ImU32 col = GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered); + ImVec2 center = bb.GetCenter(); + if (hovered) + window->DrawList->AddCircleFilled(center, ImMax(2.0f, g.FontSize * 0.5f + 1.0f), col, 12); + + float cross_extent = g.FontSize * 0.5f * 0.7071f - 1.0f; + ImU32 cross_col = GetColorU32(ImGuiCol_Text); + center -= ImVec2(0.5f, 0.5f); + window->DrawList->AddLine(center + ImVec2(+cross_extent, +cross_extent), center + ImVec2(-cross_extent, -cross_extent), cross_col, 1.0f); + window->DrawList->AddLine(center + ImVec2(+cross_extent, -cross_extent), center + ImVec2(-cross_extent, +cross_extent), cross_col, 1.0f); + + return pressed; +} + +bool ImGui::CollapseButton(ImGuiID id, const ImVec2& pos) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); + ItemAdd(bb, id); + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_None); + + // Render + ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImU32 text_col = GetColorU32(ImGuiCol_Text); + if (hovered || held) + window->DrawList->AddCircleFilled(bb.GetCenter()/*+ ImVec2(0.0f, -0.5f)*/, g.FontSize * 0.5f + 1.0f, bg_col, 12); + RenderArrow(window->DrawList, bb.Min + g.Style.FramePadding, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); + + // Switch to moving the window after mouse is moved beyond the initial drag threshold + if (IsItemActive() && IsMouseDragging(0)) + StartMouseMovingWindow(window); + + return pressed; +} + +ImGuiID ImGui::GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis) +{ + return window->GetID(axis == ImGuiAxis_X ? "#SCROLLX" : "#SCROLLY"); +} + +// Return scrollbar rectangle, must only be called for corresponding axis if window->ScrollbarX/Y is set. +ImRect ImGui::GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis) +{ + const ImRect outer_rect = window->Rect(); + const ImRect inner_rect = window->InnerRect; + const float border_size = window->WindowBorderSize; + const float scrollbar_size = window->ScrollbarSizes[axis ^ 1]; // (ScrollbarSizes.x = width of Y scrollbar; ScrollbarSizes.y = height of X scrollbar) + IM_ASSERT(scrollbar_size > 0.0f); + if (axis == ImGuiAxis_X) + return ImRect(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x, outer_rect.Max.y); + else + return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y, outer_rect.Max.x, inner_rect.Max.y); +} + +void ImGui::Scrollbar(ImGuiAxis axis) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + const ImGuiID id = GetWindowScrollbarID(window, axis); + KeepAliveID(id); + + // Calculate scrollbar bounding box + ImRect bb = GetWindowScrollbarRect(window, axis); + ImDrawFlags rounding_corners = ImDrawFlags_RoundCornersNone; + if (axis == ImGuiAxis_X) + { + rounding_corners |= ImDrawFlags_RoundCornersBottomLeft; + if (!window->ScrollbarY) + rounding_corners |= ImDrawFlags_RoundCornersBottomRight; + } + else + { + if ((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) + rounding_corners |= ImDrawFlags_RoundCornersTopRight; + if (!window->ScrollbarX) + rounding_corners |= ImDrawFlags_RoundCornersBottomRight; + } + float size_avail = window->InnerRect.Max[axis] - window->InnerRect.Min[axis]; + float size_contents = window->ContentSize[axis] + window->WindowPadding[axis] * 2.0f; + ImS64 scroll = (ImS64)window->Scroll[axis]; + ScrollbarEx(bb, id, axis, &scroll, (ImS64)size_avail, (ImS64)size_contents, rounding_corners); + window->Scroll[axis] = (float)scroll; +} + +// Vertical/Horizontal scrollbar +// The entire piece of code below is rather confusing because: +// - We handle absolute seeking (when first clicking outside the grab) and relative manipulation (afterward or when clicking inside the grab) +// - We store values as normalized ratio and in a form that allows the window content to change while we are holding on a scrollbar +// - We handle both horizontal and vertical scrollbars, which makes the terminology not ideal. +// Still, the code should probably be made simpler.. +bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 size_avail_v, ImS64 size_contents_v, ImDrawFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + const float bb_frame_width = bb_frame.GetWidth(); + const float bb_frame_height = bb_frame.GetHeight(); + if (bb_frame_width <= 0.0f || bb_frame_height <= 0.0f) + return false; + + // When we are too small, start hiding and disabling the grab (this reduce visual noise on very small window and facilitate using the window resize grab) + float alpha = 1.0f; + if ((axis == ImGuiAxis_Y) && bb_frame_height < g.FontSize + g.Style.FramePadding.y * 2.0f) + alpha = ImSaturate((bb_frame_height - g.FontSize) / (g.Style.FramePadding.y * 2.0f)); + if (alpha <= 0.0f) + return false; + + const ImGuiStyle& style = g.Style; + const bool allow_interaction = (alpha >= 1.0f); + + ImRect bb = bb_frame; + bb.Expand(ImVec2(-ImClamp(IM_FLOOR((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_FLOOR((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f))); + + // V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar) + const float scrollbar_size_v = (axis == ImGuiAxis_X) ? bb.GetWidth() : bb.GetHeight(); + + // Calculate the height of our grabbable box. It generally represent the amount visible (vs the total scrollable amount) + // But we maintain a minimum size in pixel to allow for the user to still aim inside. + IM_ASSERT(ImMax(size_contents_v, size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers. + const ImS64 win_size_v = ImMax(ImMax(size_contents_v, size_avail_v), (ImS64)1); + const float grab_h_pixels = ImClamp(scrollbar_size_v * ((float)size_avail_v / (float)win_size_v), style.GrabMinSize, scrollbar_size_v); + const float grab_h_norm = grab_h_pixels / scrollbar_size_v; + + // Handle input right away. None of the code of Begin() is relying on scrolling position before calling Scrollbar(). + bool held = false; + bool hovered = false; + ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_NoNavFocus); + + const ImS64 scroll_max = ImMax((ImS64)1, size_contents_v - size_avail_v); + float scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max); + float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; // Grab position in normalized space + if (held && allow_interaction && grab_h_norm < 1.0f) + { + const float scrollbar_pos_v = bb.Min[axis]; + const float mouse_pos_v = g.IO.MousePos[axis]; + + // Click position in scrollbar normalized space (0.0f->1.0f) + const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v); + SetHoveredID(id); + + bool seek_absolute = false; + if (g.ActiveIdIsJustActivated) + { + // On initial click calculate the distance between mouse and the center of the grab + seek_absolute = (clicked_v_norm < grab_v_norm || clicked_v_norm > grab_v_norm + grab_h_norm); + if (seek_absolute) + g.ScrollbarClickDeltaToGrabCenter = 0.0f; + else + g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; + } + + // Apply scroll (p_scroll_v will generally point on one member of window->Scroll) + // It is ok to modify Scroll here because we are being called in Begin() after the calculation of ContentSize and before setting up our starting position + const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm)); + *p_scroll_v = (ImS64)(scroll_v_norm * scroll_max); + + // Update values for rendering + scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max); + grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; + + // Update distance to grab now that we have seeked and saturated + if (seek_absolute) + g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; + } + + // Render + const ImU32 bg_col = GetColorU32(ImGuiCol_ScrollbarBg); + const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab, alpha); + window->DrawList->AddRectFilled(bb_frame.Min, bb_frame.Max, bg_col, window->WindowRounding, flags); + ImRect grab_rect; + if (axis == ImGuiAxis_X) + grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, bb.Max.y); + else + grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels); + window->DrawList->AddRectFilled(grab_rect.Min, grab_rect.Max, grab_col, style.ScrollbarRounding); + + return held; +} + +void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + if (border_col.w > 0.0f) + bb.Max += ImVec2(2, 2); + ItemSize(bb); + if (!ItemAdd(bb, 0)) + return; + + if (border_col.w > 0.0f) + { + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f); + window->DrawList->AddImage(user_texture_id, bb.Min + ImVec2(1, 1), bb.Max - ImVec2(1, 1), uv0, uv1, GetColorU32(tint_col)); + } + else + { + window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, GetColorU32(tint_col)); + } +} + +// ImageButton() is flawed as 'id' is always derived from 'texture_id' (see #2464 #1390) +// We provide this internal helper to write your own variant while we figure out how to redesign the public ImageButton() API. +bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec2& padding, const ImVec4& bg_col, const ImVec4& tint_col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding * 2); + ItemSize(bb); + if (!ItemAdd(bb, id)) + return false; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held); + + // Render + const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + RenderNavHighlight(bb, id); + RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, g.Style.FrameRounding)); + if (bg_col.w > 0.0f) + window->DrawList->AddRectFilled(bb.Min + padding, bb.Max - padding, GetColorU32(bg_col)); + window->DrawList->AddImage(texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, GetColorU32(tint_col)); + + return pressed; +} + +// frame_padding < 0: uses FramePadding from style (default) +// frame_padding = 0: no framing +// frame_padding > 0: set framing size +bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + // Default to using texture ID as ID. User can still push string/integer prefixes. + PushID((void*)(intptr_t)user_texture_id); + const ImGuiID id = window->GetID("#image"); + PopID(); + + const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float)frame_padding, (float)frame_padding) : g.Style.FramePadding; + return ImageButtonEx(id, user_texture_id, size, uv0, uv1, padding, bg_col, tint_col); +} + +bool ImGui::Checkbox(const char* label, bool* v) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + const float square_sz = GetFrameHeight(); + const ImVec2 pos = window->DC.CursorPos; + const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id)) + { + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); + return false; + } + + bool hovered, held; + bool pressed = ButtonBehavior(total_bb, id, &hovered, &held); + if (pressed) + { + *v = !(*v); + MarkItemEdited(id); + } + + const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); + RenderNavHighlight(total_bb, id); + RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding); + ImU32 check_col = GetColorU32(ImGuiCol_CheckMark); + bool mixed_value = (g.LastItemData.InFlags & ImGuiItemFlags_MixedValue) != 0; + if (mixed_value) + { + // Undocumented tristate/mixed/indeterminate checkbox (#2644) + // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox) + ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f))); + window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding); + } + else if (*v) + { + const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f); + } + + ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); + if (g.LogEnabled) + LogRenderedText(&label_pos, mixed_value ? "[~]" : *v ? "[x]" : "[ ]"); + if (label_size.x > 0.0f) + RenderText(label_pos, label); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); + return pressed; +} + +template +bool ImGui::CheckboxFlagsT(const char* label, T* flags, T flags_value) +{ + bool all_on = (*flags & flags_value) == flags_value; + bool any_on = (*flags & flags_value) != 0; + bool pressed; + if (!all_on && any_on) + { + ImGuiContext& g = *GImGui; + ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; + g.CurrentItemFlags |= ImGuiItemFlags_MixedValue; + pressed = Checkbox(label, &all_on); + g.CurrentItemFlags = backup_item_flags; + } + else + { + pressed = Checkbox(label, &all_on); + + } + if (pressed) + { + if (all_on) + *flags |= flags_value; + else + *flags &= ~flags_value; + } + return pressed; +} + +bool ImGui::CheckboxFlags(const char* label, int* flags, int flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::RadioButton(const char* label, bool active) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + const float square_sz = GetFrameHeight(); + const ImVec2 pos = window->DC.CursorPos; + const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); + const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id)) + return false; + + ImVec2 center = check_bb.GetCenter(); + center.x = IM_ROUND(center.x); + center.y = IM_ROUND(center.y); + const float radius = (square_sz - 1.0f) * 0.5f; + + bool hovered, held; + bool pressed = ButtonBehavior(total_bb, id, &hovered, &held); + if (pressed) + MarkItemEdited(id); + + RenderNavHighlight(total_bb, id); + window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16); + if (active) + { + const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark), 16); + } + + if (style.FrameBorderSize > 0.0f) + { + window->DrawList->AddCircle(center + ImVec2(1, 1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize); + window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize); + } + + ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); + if (g.LogEnabled) + LogRenderedText(&label_pos, active ? "(x)" : "( )"); + if (label_size.x > 0.0f) + RenderText(label_pos, label); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return pressed; +} + +// FIXME: This would work nicely if it was a public template, e.g. 'template RadioButton(const char* label, T* v, T v_button)', but I'm not sure how we would expose it.. +bool ImGui::RadioButton(const char* label, int* v, int v_button) +{ + const bool pressed = RadioButton(label, *v == v_button); + if (pressed) + *v = v_button; + return pressed; +} + +// size_arg (for each axis) < 0.0f: align to end, 0.0f: auto, > 0.0f: specified size +void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* overlay) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + + ImVec2 pos = window->DC.CursorPos; + ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y * 2.0f); + ImRect bb(pos, pos + size); + ItemSize(size, style.FramePadding.y); + if (!ItemAdd(bb, 0)) + return; + + // Render + fraction = ImSaturate(fraction); + RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); + bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize)); + const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y); + RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding); + + // Default displaying the fraction as percentage string, but user can override it + char overlay_buf[32]; + if (!overlay) + { + ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f); + overlay = overlay_buf; + } + + ImVec2 overlay_size = CalcTextSize(overlay, NULL); + if (overlay_size.x > 0.0f) + RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb); +} + +void ImGui::Bullet() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const float line_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), g.FontSize); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height)); + ItemSize(bb); + if (!ItemAdd(bb, 0)) + { + SameLine(0, style.FramePadding.x * 2); + return; + } + + // Render and stay on same line + ImU32 text_col = GetColorU32(ImGuiCol_Text); + RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize * 0.5f, line_height * 0.5f), text_col); + SameLine(0, style.FramePadding.x * 2.0f); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Low-level Layout helpers +//------------------------------------------------------------------------- +// - Spacing() +// - Dummy() +// - NewLine() +// - AlignTextToFramePadding() +// - SeparatorEx() [Internal] +// - Separator() +// - SplitterBehavior() [Internal] +// - ShrinkWidths() [Internal] +//------------------------------------------------------------------------- + +void ImGui::Spacing() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + ItemSize(ImVec2(0, 0)); +} + +void ImGui::Dummy(const ImVec2& size) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + ItemSize(size); + ItemAdd(bb, 0); +} + +void ImGui::NewLine() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiLayoutType backup_layout_type = window->DC.LayoutType; + window->DC.LayoutType = ImGuiLayoutType_Vertical; + window->DC.IsSameLine = false; + if (window->DC.CurrLineSize.y > 0.0f) // In the event that we are on a line with items that is smaller that FontSize high, we will preserve its height. + ItemSize(ImVec2(0, 0)); + else + ItemSize(ImVec2(0.0f, g.FontSize)); + window->DC.LayoutType = backup_layout_type; +} + +void ImGui::AlignTextToFramePadding() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + window->DC.CurrLineSize.y = ImMax(window->DC.CurrLineSize.y, g.FontSize + g.Style.FramePadding.y * 2); + window->DC.CurrLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, g.Style.FramePadding.y); +} + +// Horizontal/vertical separating line +void ImGui::SeparatorEx(ImGuiSeparatorFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + IM_ASSERT(ImIsPowerOfTwo(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical))); // Check that only 1 option is selected + + float thickness_draw = 1.0f; + float thickness_layout = 0.0f; + if (flags & ImGuiSeparatorFlags_Vertical) + { + // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout. + float y1 = window->DC.CursorPos.y; + float y2 = window->DC.CursorPos.y + window->DC.CurrLineSize.y; + const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + thickness_draw, y2)); + ItemSize(ImVec2(thickness_layout, 0.0f)); + if (!ItemAdd(bb, 0)) + return; + + // Draw + window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator)); + if (g.LogEnabled) + LogText(" |"); + } + else if (flags & ImGuiSeparatorFlags_Horizontal) + { + // Horizontal Separator + float x1 = window->Pos.x; + float x2 = window->Pos.x + window->Size.x; + + // FIXME-WORKRECT: old hack (#205) until we decide of consistent behavior with WorkRect/Indent and Separator + if (g.GroupStack.Size > 0 && g.GroupStack.back().WindowID == window->ID) + x1 += window->DC.Indent.x; + + // FIXME-WORKRECT: In theory we should simply be using WorkRect.Min.x/Max.x everywhere but it isn't aesthetically what we want, + // need to introduce a variant of WorkRect for that purpose. (#4787) + if (ImGuiTable* table = g.CurrentTable) + { + x1 = table->Columns[table->CurrentColumn].MinX; + x2 = table->Columns[table->CurrentColumn].MaxX; + } + + ImGuiOldColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL; + if (columns) + PushColumnsBackground(); + + // We don't provide our width to the layout so that it doesn't get feed back into AutoFit + // FIXME: This prevents ->CursorMaxPos based bounding box evaluation from working (e.g. TableEndCell) + const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y + thickness_draw)); + ItemSize(ImVec2(0.0f, thickness_layout)); + const bool item_visible = ItemAdd(bb, 0); + if (item_visible) + { + // Draw + window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x, bb.Min.y), GetColorU32(ImGuiCol_Separator)); + if (g.LogEnabled) + LogRenderedText(&bb.Min, "--------------------------------\n"); + + } + if (columns) + { + PopColumnsBackground(); + columns->LineMinY = window->DC.CursorPos.y; + } + } +} + +void ImGui::Separator() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + // Those flags should eventually be overridable by the user + ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal; + flags |= ImGuiSeparatorFlags_SpanAllColumns; // NB: this only applies to legacy Columns() api as they relied on Separator() a lot. + SeparatorEx(flags); +} + +// Using 'hover_visibility_delay' allows us to hide the highlight and mouse cursor for a short time, which can be convenient to reduce visual noise. +bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend, float hover_visibility_delay) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + const ImGuiItemFlags item_flags_backup = g.CurrentItemFlags; + g.CurrentItemFlags |= ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus; + bool item_add = ItemAdd(bb, id); + g.CurrentItemFlags = item_flags_backup; + if (!item_add) + return false; + + bool hovered, held; + ImRect bb_interact = bb; + bb_interact.Expand(axis == ImGuiAxis_Y ? ImVec2(0.0f, hover_extend) : ImVec2(hover_extend, 0.0f)); + ButtonBehavior(bb_interact, id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap); + if (hovered) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; // for IsItemHovered(), because bb_interact is larger than bb + if (g.ActiveId != id) + SetItemAllowOverlap(); + + if (held || (hovered && g.HoveredIdPreviousFrame == id && g.HoveredIdTimer >= hover_visibility_delay)) + SetMouseCursor(axis == ImGuiAxis_Y ? ImGuiMouseCursor_ResizeNS : ImGuiMouseCursor_ResizeEW); + + ImRect bb_render = bb; + if (held) + { + ImVec2 mouse_delta_2d = g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min; + float mouse_delta = (axis == ImGuiAxis_Y) ? mouse_delta_2d.y : mouse_delta_2d.x; + + // Minimum pane size + float size_1_maximum_delta = ImMax(0.0f, *size1 - min_size1); + float size_2_maximum_delta = ImMax(0.0f, *size2 - min_size2); + if (mouse_delta < -size_1_maximum_delta) + mouse_delta = -size_1_maximum_delta; + if (mouse_delta > size_2_maximum_delta) + mouse_delta = size_2_maximum_delta; + + // Apply resize + if (mouse_delta != 0.0f) + { + if (mouse_delta < 0.0f) + IM_ASSERT(*size1 + mouse_delta >= min_size1); + if (mouse_delta > 0.0f) + IM_ASSERT(*size2 - mouse_delta >= min_size2); + *size1 += mouse_delta; + *size2 -= mouse_delta; + bb_render.Translate((axis == ImGuiAxis_X) ? ImVec2(mouse_delta, 0.0f) : ImVec2(0.0f, mouse_delta)); + MarkItemEdited(id); + } + } + + // Render + const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : (hovered && g.HoveredIdTimer >= hover_visibility_delay) ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); + window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, 0.0f); + + return held; +} + +static int IMGUI_CDECL ShrinkWidthItemComparer(const void* lhs, const void* rhs) +{ + const ImGuiShrinkWidthItem* a = (const ImGuiShrinkWidthItem*)lhs; + const ImGuiShrinkWidthItem* b = (const ImGuiShrinkWidthItem*)rhs; + if (int d = (int)(b->Width - a->Width)) + return d; + return (b->Index - a->Index); +} + +// Shrink excess width from a set of item, by removing width from the larger items first. +// Set items Width to -1.0f to disable shrinking this item. +void ImGui::ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess) +{ + if (count == 1) + { + if (items[0].Width >= 0.0f) + items[0].Width = ImMax(items[0].Width - width_excess, 1.0f); + return; + } + ImQsort(items, (size_t)count, sizeof(ImGuiShrinkWidthItem), ShrinkWidthItemComparer); + int count_same_width = 1; + while (width_excess > 0.0f && count_same_width < count) + { + while (count_same_width < count && items[0].Width <= items[count_same_width].Width) + count_same_width++; + float max_width_to_remove_per_item = (count_same_width < count && items[count_same_width].Width >= 0.0f) ? (items[0].Width - items[count_same_width].Width) : (items[0].Width - 1.0f); + if (max_width_to_remove_per_item <= 0.0f) + break; + float width_to_remove_per_item = ImMin(width_excess / count_same_width, max_width_to_remove_per_item); + for (int item_n = 0; item_n < count_same_width; item_n++) + items[item_n].Width -= width_to_remove_per_item; + width_excess -= width_to_remove_per_item * count_same_width; + } + + // Round width and redistribute remainder left-to-right (could make it an option of the function?) + // Ensure that e.g. the right-most tab of a shrunk tab-bar always reaches exactly at the same distance from the right-most edge of the tab bar separator. + width_excess = 0.0f; + for (int n = 0; n < count; n++) + { + float width_rounded = ImFloor(items[n].Width); + width_excess += items[n].Width - width_rounded; + items[n].Width = width_rounded; + } + if (width_excess > 0.0f) + for (int n = 0; n < count; n++) + if (items[n].Index < (int)(width_excess + 0.01f)) + items[n].Width += 1.0f; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: ComboBox +//------------------------------------------------------------------------- +// - CalcMaxPopupHeightFromItemCount() [Internal] +// - BeginCombo() +// - BeginComboPopup() [Internal] +// - EndCombo() +// - BeginComboPreview() [Internal] +// - EndComboPreview() [Internal] +// - Combo() +//------------------------------------------------------------------------- + +static float CalcMaxPopupHeightFromItemCount(int items_count) +{ + ImGuiContext& g = *GImGui; + if (items_count <= 0) + return FLT_MAX; + return (g.FontSize + g.Style.ItemSpacing.y) * items_count - g.Style.ItemSpacing.y + (g.Style.WindowPadding.y * 2); +} + +bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + + ImGuiNextWindowDataFlags backup_next_window_data_flags = g.NextWindowData.Flags; + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + if (window->SkipItems) + return false; + + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + IM_ASSERT((flags & (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)) != (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)); // Can't use both flags together + + const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : GetFrameHeight(); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : CalcItemWidth(); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); + const ImRect total_bb(bb.Min, bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id, &bb)) + return false; + + // Open on click + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held); + const ImGuiID popup_id = ImHashStr("##ComboPopup", 0, id); + bool popup_open = IsPopupOpen(popup_id, ImGuiPopupFlags_None); + if (pressed && !popup_open) + { + OpenPopupEx(popup_id, ImGuiPopupFlags_None); + popup_open = true; + } + + // Render shape + const ImU32 frame_col = GetColorU32(hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); + const float value_x2 = ImMax(bb.Min.x, bb.Max.x - arrow_size); + RenderNavHighlight(bb, id); + if (!(flags & ImGuiComboFlags_NoPreview)) + window->DrawList->AddRectFilled(bb.Min, ImVec2(value_x2, bb.Max.y), frame_col, style.FrameRounding, (flags & ImGuiComboFlags_NoArrowButton) ? ImDrawFlags_RoundCornersAll : ImDrawFlags_RoundCornersLeft); + if (!(flags & ImGuiComboFlags_NoArrowButton)) + { + ImU32 bg_col = GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImU32 text_col = GetColorU32(ImGuiCol_Text); + window->DrawList->AddRectFilled(ImVec2(value_x2, bb.Min.y), bb.Max, bg_col, style.FrameRounding, (w <= arrow_size) ? ImDrawFlags_RoundCornersAll : ImDrawFlags_RoundCornersRight); + if (value_x2 + arrow_size - style.FramePadding.x <= bb.Max.x) + RenderArrow(window->DrawList, ImVec2(value_x2 + style.FramePadding.y, bb.Min.y + style.FramePadding.y), text_col, ImGuiDir_Down, 1.0f); + } + RenderFrameBorder(bb.Min, bb.Max, style.FrameRounding); + + // Custom preview + if (flags & ImGuiComboFlags_CustomPreview) + { + g.ComboPreviewData.PreviewRect = ImRect(bb.Min.x, bb.Min.y, value_x2, bb.Max.y); + IM_ASSERT(preview_value == NULL || preview_value[0] == 0); + preview_value = NULL; + } + + // Render preview and label + if (preview_value != NULL && !(flags & ImGuiComboFlags_NoPreview)) + { + if (g.LogEnabled) + LogSetNextTextDecoration("{", "}"); + RenderTextClipped(bb.Min + style.FramePadding, ImVec2(value_x2, bb.Max.y), preview_value, NULL, NULL); + } + if (label_size.x > 0) + RenderText(ImVec2(bb.Max.x + style.ItemInnerSpacing.x, bb.Min.y + style.FramePadding.y), label); + + if (!popup_open) + return false; + + g.NextWindowData.Flags = backup_next_window_data_flags; + return BeginComboPopup(popup_id, bb, flags); +} + +bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags) +{ + ImGuiContext& g = *GImGui; + if (!IsPopupOpen(popup_id, ImGuiPopupFlags_None)) + { + g.NextWindowData.ClearFlags(); + return false; + } + + // Set popup size + float w = bb.GetWidth(); + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) + { + g.NextWindowData.SizeConstraintRect.Min.x = ImMax(g.NextWindowData.SizeConstraintRect.Min.x, w); + } + else + { + if ((flags & ImGuiComboFlags_HeightMask_) == 0) + flags |= ImGuiComboFlags_HeightRegular; + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiComboFlags_HeightMask_)); // Only one + int popup_max_height_in_items = -1; + if (flags & ImGuiComboFlags_HeightRegular) popup_max_height_in_items = 8; + else if (flags & ImGuiComboFlags_HeightSmall) popup_max_height_in_items = 4; + else if (flags & ImGuiComboFlags_HeightLarge) popup_max_height_in_items = 20; + SetNextWindowSizeConstraints(ImVec2(w, 0.0f), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items))); + } + + // This is essentially a specialized version of BeginPopupEx() + char name[16]; + ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth + + // Set position given a custom constraint (peak into expected window size so we can position it) + // FIXME: This might be easier to express with an hypothetical SetNextWindowPosConstraints() function? + // FIXME: This might be moved to Begin() or at least around the same spot where Tooltips and other Popups are calling FindBestWindowPosForPopupEx()? + if (ImGuiWindow* popup_window = FindWindowByName(name)) + if (popup_window->WasActive) + { + // Always override 'AutoPosLastDirection' to not leave a chance for a past value to affect us. + ImVec2 size_expected = CalcWindowNextAutoFitSize(popup_window); + popup_window->AutoPosLastDirection = (flags & ImGuiComboFlags_PopupAlignLeft) ? ImGuiDir_Left : ImGuiDir_Down; // Left = "Below, Toward Left", Down = "Below, Toward Right (default)" + ImRect r_outer = GetPopupAllowedExtentRect(popup_window); + ImVec2 pos = FindBestWindowPosForPopupEx(bb.GetBL(), size_expected, &popup_window->AutoPosLastDirection, r_outer, bb, ImGuiPopupPositionPolicy_ComboBox); + SetNextWindowPos(pos); + } + + // We don't use BeginPopupEx() solely because we have a custom name string, which we could make an argument to BeginPopupEx() + ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoMove; + PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(g.Style.FramePadding.x, g.Style.WindowPadding.y)); // Horizontally align ourselves with the framed text + bool ret = Begin(name, NULL, window_flags); + PopStyleVar(); + if (!ret) + { + EndPopup(); + IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above + return false; + } + return true; +} + +void ImGui::EndCombo() +{ + EndPopup(); +} + +// Call directly after the BeginCombo/EndCombo block. The preview is designed to only host non-interactive elements +// (Experimental, see GitHub issues: #1658, #4168) +bool ImGui::BeginComboPreview() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiComboPreviewData* preview_data = &g.ComboPreviewData; + + if (window->SkipItems || !window->ClipRect.Overlaps(g.LastItemData.Rect)) // FIXME: Because we don't have a ImGuiItemStatusFlags_Visible flag to test last ItemAdd() result + return false; + IM_ASSERT(g.LastItemData.Rect.Min.x == preview_data->PreviewRect.Min.x && g.LastItemData.Rect.Min.y == preview_data->PreviewRect.Min.y); // Didn't call after BeginCombo/EndCombo block or forgot to pass ImGuiComboFlags_CustomPreview flag? + if (!window->ClipRect.Contains(preview_data->PreviewRect)) // Narrower test (optional) + return false; + + // FIXME: This could be contained in a PushWorkRect() api + preview_data->BackupCursorPos = window->DC.CursorPos; + preview_data->BackupCursorMaxPos = window->DC.CursorMaxPos; + preview_data->BackupCursorPosPrevLine = window->DC.CursorPosPrevLine; + preview_data->BackupPrevLineTextBaseOffset = window->DC.PrevLineTextBaseOffset; + preview_data->BackupLayout = window->DC.LayoutType; + window->DC.CursorPos = preview_data->PreviewRect.Min + g.Style.FramePadding; + window->DC.CursorMaxPos = window->DC.CursorPos; + window->DC.LayoutType = ImGuiLayoutType_Horizontal; + window->DC.IsSameLine = false; + PushClipRect(preview_data->PreviewRect.Min, preview_data->PreviewRect.Max, true); + + return true; +} + +void ImGui::EndComboPreview() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiComboPreviewData* preview_data = &g.ComboPreviewData; + + // FIXME: Using CursorMaxPos approximation instead of correct AABB which we will store in ImDrawCmd in the future + ImDrawList* draw_list = window->DrawList; + if (window->DC.CursorMaxPos.x < preview_data->PreviewRect.Max.x && window->DC.CursorMaxPos.y < preview_data->PreviewRect.Max.y) + if (draw_list->CmdBuffer.Size > 1) // Unlikely case that the PushClipRect() didn't create a command + { + draw_list->_CmdHeader.ClipRect = draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ClipRect = draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 2].ClipRect; + draw_list->_TryMergeDrawCmds(); + } + PopClipRect(); + window->DC.CursorPos = preview_data->BackupCursorPos; + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, preview_data->BackupCursorMaxPos); + window->DC.CursorPosPrevLine = preview_data->BackupCursorPosPrevLine; + window->DC.PrevLineTextBaseOffset = preview_data->BackupPrevLineTextBaseOffset; + window->DC.LayoutType = preview_data->BackupLayout; + window->DC.IsSameLine = false; + preview_data->PreviewRect = ImRect(); +} + +// Getter for the old Combo() API: const char*[] +static bool Items_ArrayGetter(void* data, int idx, const char** out_text) +{ + const char* const* items = (const char* const*)data; + if (out_text) + *out_text = items[idx]; + return true; +} + +// Getter for the old Combo() API: "item1\0item2\0item3\0" +static bool Items_SingleStringGetter(void* data, int idx, const char** out_text) +{ + // FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited. + const char* items_separated_by_zeros = (const char*)data; + int items_count = 0; + const char* p = items_separated_by_zeros; + while (*p) + { + if (idx == items_count) + break; + p += strlen(p) + 1; + items_count++; + } + if (!*p) + return false; + if (out_text) + *out_text = p; + return true; +} + +// Old API, prefer using BeginCombo() nowadays if you can. +bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items) +{ + ImGuiContext& g = *GImGui; + + // Call the getter to obtain the preview string which is a parameter to BeginCombo() + const char* preview_value = NULL; + if (*current_item >= 0 && *current_item < items_count) + items_getter(data, *current_item, &preview_value); + + // The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here. + if (popup_max_height_in_items != -1 && !(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint)) + SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items))); + + if (!BeginCombo(label, preview_value, ImGuiComboFlags_None)) + return false; + + // Display items + // FIXME-OPT: Use clipper (but we need to disable it on the appearing frame to make sure our call to SetItemDefaultFocus() is processed) + bool value_changed = false; + for (int i = 0; i < items_count; i++) + { + PushID(i); + const bool item_selected = (i == *current_item); + const char* item_text; + if (!items_getter(data, i, &item_text)) + item_text = "*Unknown item*"; + if (Selectable(item_text, item_selected)) + { + value_changed = true; + *current_item = i; + } + if (item_selected) + SetItemDefaultFocus(); + PopID(); + } + + EndCombo(); + + if (value_changed) + MarkItemEdited(g.LastItemData.ID); + + return value_changed; +} + +// Combo box helper allowing to pass an array of strings. +bool ImGui::Combo(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items) +{ + const bool value_changed = Combo(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_in_items); + return value_changed; +} + +// Combo box helper allowing to pass all items in a single string literal holding multiple zero-terminated items "item1\0item2\0" +bool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items) +{ + int items_count = 0; + const char* p = items_separated_by_zeros; // FIXME-OPT: Avoid computing this, or at least only when combo is open + while (*p) + { + p += strlen(p) + 1; + items_count++; + } + bool value_changed = Combo(label, current_item, Items_SingleStringGetter, (void*)items_separated_by_zeros, items_count, height_in_items); + return value_changed; +} + +//------------------------------------------------------------------------- +// [SECTION] Data Type and Data Formatting Helpers [Internal] +//------------------------------------------------------------------------- +// - PatchFormatStringFloatToInt() +// - DataTypeGetInfo() +// - DataTypeFormatString() +// - DataTypeApplyOp() +// - DataTypeApplyOpFromText() +// - DataTypeClamp() +// - GetMinimumStepAtDecimalPrecision +// - RoundScalarWithFormat<>() +//------------------------------------------------------------------------- + +static const ImGuiDataTypeInfo GDataTypeInfo[] = +{ + { sizeof(char), "S8", "%d", "%d" }, // ImGuiDataType_S8 + { sizeof(unsigned char), "U8", "%u", "%u" }, + { sizeof(short), "S16", "%d", "%d" }, // ImGuiDataType_S16 + { sizeof(unsigned short), "U16", "%u", "%u" }, + { sizeof(int), "S32", "%d", "%d" }, // ImGuiDataType_S32 + { sizeof(unsigned int), "U32", "%u", "%u" }, +#ifdef _MSC_VER + { sizeof(ImS64), "S64", "%I64d","%I64d" }, // ImGuiDataType_S64 + { sizeof(ImU64), "U64", "%I64u","%I64u" }, +#else + { sizeof(ImS64), "S64", "%lld", "%lld" }, // ImGuiDataType_S64 + { sizeof(ImU64), "U64", "%llu", "%llu" }, +#endif + { sizeof(float), "float", "%.3f","%f" }, // ImGuiDataType_Float (float are promoted to double in va_arg) + { sizeof(double), "double","%f", "%lf" }, // ImGuiDataType_Double +}; +IM_STATIC_ASSERT(IM_ARRAYSIZE(GDataTypeInfo) == ImGuiDataType_COUNT); + +// FIXME-LEGACY: Prior to 1.61 our DragInt() function internally used floats and because of this the compile-time default value for format was "%.0f". +// Even though we changed the compile-time default, we expect users to have carried %f around, which would break the display of DragInt() calls. +// To honor backward compatibility we are rewriting the format string, unless IMGUI_DISABLE_OBSOLETE_FUNCTIONS is enabled. What could possibly go wrong?! +static const char* PatchFormatStringFloatToInt(const char* fmt) +{ + if (fmt[0] == '%' && fmt[1] == '.' && fmt[2] == '0' && fmt[3] == 'f' && fmt[4] == 0) // Fast legacy path for "%.0f" which is expected to be the most common case. + return "%d"; + const char* fmt_start = ImParseFormatFindStart(fmt); // Find % (if any, and ignore %%) + const char* fmt_end = ImParseFormatFindEnd(fmt_start); // Find end of format specifier, which itself is an exercise of confidence/recklessness (because snprintf is dependent on libc or user). + if (fmt_end > fmt_start && fmt_end[-1] == 'f') + { +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + if (fmt_start == fmt && fmt_end[0] == 0) + return "%d"; + ImGuiContext& g = *GImGui; + ImFormatString(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), "%.*s%%d%s", (int)(fmt_start - fmt), fmt, fmt_end); // Honor leading and trailing decorations, but lose alignment/precision. + return g.TempBuffer; +#else + IM_ASSERT(0 && "DragInt(): Invalid format string!"); // Old versions used a default parameter of "%.0f", please replace with e.g. "%d" +#endif + } + return fmt; +} + +const ImGuiDataTypeInfo* ImGui::DataTypeGetInfo(ImGuiDataType data_type) +{ + IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT); + return &GDataTypeInfo[data_type]; +} + +int ImGui::DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format) +{ + // Signedness doesn't matter when pushing integer arguments + if (data_type == ImGuiDataType_S32 || data_type == ImGuiDataType_U32) + return ImFormatString(buf, buf_size, format, *(const ImU32*)p_data); + if (data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64) + return ImFormatString(buf, buf_size, format, *(const ImU64*)p_data); + if (data_type == ImGuiDataType_Float) + return ImFormatString(buf, buf_size, format, *(const float*)p_data); + if (data_type == ImGuiDataType_Double) + return ImFormatString(buf, buf_size, format, *(const double*)p_data); + if (data_type == ImGuiDataType_S8) + return ImFormatString(buf, buf_size, format, *(const ImS8*)p_data); + if (data_type == ImGuiDataType_U8) + return ImFormatString(buf, buf_size, format, *(const ImU8*)p_data); + if (data_type == ImGuiDataType_S16) + return ImFormatString(buf, buf_size, format, *(const ImS16*)p_data); + if (data_type == ImGuiDataType_U16) + return ImFormatString(buf, buf_size, format, *(const ImU16*)p_data); + IM_ASSERT(0); + return 0; +} + +void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg1, const void* arg2) +{ + IM_ASSERT(op == '+' || op == '-'); + switch (data_type) + { + case ImGuiDataType_S8: + if (op == '+') { *(ImS8*)output = ImAddClampOverflow(*(const ImS8*)arg1, *(const ImS8*)arg2, IM_S8_MIN, IM_S8_MAX); } + if (op == '-') { *(ImS8*)output = ImSubClampOverflow(*(const ImS8*)arg1, *(const ImS8*)arg2, IM_S8_MIN, IM_S8_MAX); } + return; + case ImGuiDataType_U8: + if (op == '+') { *(ImU8*)output = ImAddClampOverflow(*(const ImU8*)arg1, *(const ImU8*)arg2, IM_U8_MIN, IM_U8_MAX); } + if (op == '-') { *(ImU8*)output = ImSubClampOverflow(*(const ImU8*)arg1, *(const ImU8*)arg2, IM_U8_MIN, IM_U8_MAX); } + return; + case ImGuiDataType_S16: + if (op == '+') { *(ImS16*)output = ImAddClampOverflow(*(const ImS16*)arg1, *(const ImS16*)arg2, IM_S16_MIN, IM_S16_MAX); } + if (op == '-') { *(ImS16*)output = ImSubClampOverflow(*(const ImS16*)arg1, *(const ImS16*)arg2, IM_S16_MIN, IM_S16_MAX); } + return; + case ImGuiDataType_U16: + if (op == '+') { *(ImU16*)output = ImAddClampOverflow(*(const ImU16*)arg1, *(const ImU16*)arg2, IM_U16_MIN, IM_U16_MAX); } + if (op == '-') { *(ImU16*)output = ImSubClampOverflow(*(const ImU16*)arg1, *(const ImU16*)arg2, IM_U16_MIN, IM_U16_MAX); } + return; + case ImGuiDataType_S32: + if (op == '+') { *(ImS32*)output = ImAddClampOverflow(*(const ImS32*)arg1, *(const ImS32*)arg2, IM_S32_MIN, IM_S32_MAX); } + if (op == '-') { *(ImS32*)output = ImSubClampOverflow(*(const ImS32*)arg1, *(const ImS32*)arg2, IM_S32_MIN, IM_S32_MAX); } + return; + case ImGuiDataType_U32: + if (op == '+') { *(ImU32*)output = ImAddClampOverflow(*(const ImU32*)arg1, *(const ImU32*)arg2, IM_U32_MIN, IM_U32_MAX); } + if (op == '-') { *(ImU32*)output = ImSubClampOverflow(*(const ImU32*)arg1, *(const ImU32*)arg2, IM_U32_MIN, IM_U32_MAX); } + return; + case ImGuiDataType_S64: + if (op == '+') { *(ImS64*)output = ImAddClampOverflow(*(const ImS64*)arg1, *(const ImS64*)arg2, IM_S64_MIN, IM_S64_MAX); } + if (op == '-') { *(ImS64*)output = ImSubClampOverflow(*(const ImS64*)arg1, *(const ImS64*)arg2, IM_S64_MIN, IM_S64_MAX); } + return; + case ImGuiDataType_U64: + if (op == '+') { *(ImU64*)output = ImAddClampOverflow(*(const ImU64*)arg1, *(const ImU64*)arg2, IM_U64_MIN, IM_U64_MAX); } + if (op == '-') { *(ImU64*)output = ImSubClampOverflow(*(const ImU64*)arg1, *(const ImU64*)arg2, IM_U64_MIN, IM_U64_MAX); } + return; + case ImGuiDataType_Float: + if (op == '+') { *(float*)output = *(const float*)arg1 + *(const float*)arg2; } + if (op == '-') { *(float*)output = *(const float*)arg1 - *(const float*)arg2; } + return; + case ImGuiDataType_Double: + if (op == '+') { *(double*)output = *(const double*)arg1 + *(const double*)arg2; } + if (op == '-') { *(double*)output = *(const double*)arg1 - *(const double*)arg2; } + return; + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); +} + +// User can input math operators (e.g. +100) to edit a numerical values. +// NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess.. +bool ImGui::DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format) +{ + while (ImCharIsBlankA(*buf)) + buf++; + if (!buf[0]) + return false; + + // Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all. + const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type); + ImGuiDataTypeTempStorage data_backup; + memcpy(&data_backup, p_data, type_info->Size); + + // Sanitize format + // For float/double we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in, so force them into %f and %lf + char format_sanitized[32]; + if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) + format = type_info->ScanFmt; + else + format = ImParseFormatSanitizeForScanning(format, format_sanitized, IM_ARRAYSIZE(format_sanitized)); + + // Small types need a 32-bit buffer to receive the result from scanf() + int v32 = 0; + if (sscanf(buf, format, type_info->Size >= 4 ? p_data : &v32) < 1) + return false; + if (type_info->Size < 4) + { + if (data_type == ImGuiDataType_S8) + *(ImS8*)p_data = (ImS8)ImClamp(v32, (int)IM_S8_MIN, (int)IM_S8_MAX); + else if (data_type == ImGuiDataType_U8) + *(ImU8*)p_data = (ImU8)ImClamp(v32, (int)IM_U8_MIN, (int)IM_U8_MAX); + else if (data_type == ImGuiDataType_S16) + *(ImS16*)p_data = (ImS16)ImClamp(v32, (int)IM_S16_MIN, (int)IM_S16_MAX); + else if (data_type == ImGuiDataType_U16) + *(ImU16*)p_data = (ImU16)ImClamp(v32, (int)IM_U16_MIN, (int)IM_U16_MAX); + else + IM_ASSERT(0); + } + + return memcmp(&data_backup, p_data, type_info->Size) != 0; +} + +template +static int DataTypeCompareT(const T* lhs, const T* rhs) +{ + if (*lhs < *rhs) return -1; + if (*lhs > *rhs) return +1; + return 0; +} + +int ImGui::DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2) +{ + switch (data_type) + { + case ImGuiDataType_S8: return DataTypeCompareT((const ImS8* )arg_1, (const ImS8* )arg_2); + case ImGuiDataType_U8: return DataTypeCompareT((const ImU8* )arg_1, (const ImU8* )arg_2); + case ImGuiDataType_S16: return DataTypeCompareT((const ImS16* )arg_1, (const ImS16* )arg_2); + case ImGuiDataType_U16: return DataTypeCompareT((const ImU16* )arg_1, (const ImU16* )arg_2); + case ImGuiDataType_S32: return DataTypeCompareT((const ImS32* )arg_1, (const ImS32* )arg_2); + case ImGuiDataType_U32: return DataTypeCompareT((const ImU32* )arg_1, (const ImU32* )arg_2); + case ImGuiDataType_S64: return DataTypeCompareT((const ImS64* )arg_1, (const ImS64* )arg_2); + case ImGuiDataType_U64: return DataTypeCompareT((const ImU64* )arg_1, (const ImU64* )arg_2); + case ImGuiDataType_Float: return DataTypeCompareT((const float* )arg_1, (const float* )arg_2); + case ImGuiDataType_Double: return DataTypeCompareT((const double*)arg_1, (const double*)arg_2); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return 0; +} + +template +static bool DataTypeClampT(T* v, const T* v_min, const T* v_max) +{ + // Clamp, both sides are optional, return true if modified + if (v_min && *v < *v_min) { *v = *v_min; return true; } + if (v_max && *v > *v_max) { *v = *v_max; return true; } + return false; +} + +bool ImGui::DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max) +{ + switch (data_type) + { + case ImGuiDataType_S8: return DataTypeClampT((ImS8* )p_data, (const ImS8* )p_min, (const ImS8* )p_max); + case ImGuiDataType_U8: return DataTypeClampT((ImU8* )p_data, (const ImU8* )p_min, (const ImU8* )p_max); + case ImGuiDataType_S16: return DataTypeClampT((ImS16* )p_data, (const ImS16* )p_min, (const ImS16* )p_max); + case ImGuiDataType_U16: return DataTypeClampT((ImU16* )p_data, (const ImU16* )p_min, (const ImU16* )p_max); + case ImGuiDataType_S32: return DataTypeClampT((ImS32* )p_data, (const ImS32* )p_min, (const ImS32* )p_max); + case ImGuiDataType_U32: return DataTypeClampT((ImU32* )p_data, (const ImU32* )p_min, (const ImU32* )p_max); + case ImGuiDataType_S64: return DataTypeClampT((ImS64* )p_data, (const ImS64* )p_min, (const ImS64* )p_max); + case ImGuiDataType_U64: return DataTypeClampT((ImU64* )p_data, (const ImU64* )p_min, (const ImU64* )p_max); + case ImGuiDataType_Float: return DataTypeClampT((float* )p_data, (const float* )p_min, (const float* )p_max); + case ImGuiDataType_Double: return DataTypeClampT((double*)p_data, (const double*)p_min, (const double*)p_max); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return false; +} + +static float GetMinimumStepAtDecimalPrecision(int decimal_precision) +{ + static const float min_steps[10] = { 1.0f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f }; + if (decimal_precision < 0) + return FLT_MIN; + return (decimal_precision < IM_ARRAYSIZE(min_steps)) ? min_steps[decimal_precision] : ImPow(10.0f, (float)-decimal_precision); +} + +template +TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, TYPE v) +{ + IM_UNUSED(data_type); + IM_ASSERT(data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double); + const char* fmt_start = ImParseFormatFindStart(format); + if (fmt_start[0] != '%' || fmt_start[1] == '%') // Don't apply if the value is not visible in the format string + return v; + + // Sanitize format + char fmt_sanitized[32]; + ImParseFormatSanitizeForPrinting(fmt_start, fmt_sanitized, IM_ARRAYSIZE(fmt_sanitized)); + fmt_start = fmt_sanitized; + + // Format value with our rounding, and read back + char v_str[64]; + ImFormatString(v_str, IM_ARRAYSIZE(v_str), fmt_start, v); + const char* p = v_str; + while (*p == ' ') + p++; + v = (TYPE)ImAtof(p); + + return v; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: DragScalar, DragFloat, DragInt, etc. +//------------------------------------------------------------------------- +// - DragBehaviorT<>() [Internal] +// - DragBehavior() [Internal] +// - DragScalar() +// - DragScalarN() +// - DragFloat() +// - DragFloat2() +// - DragFloat3() +// - DragFloat4() +// - DragFloatRange2() +// - DragInt() +// - DragInt2() +// - DragInt3() +// - DragInt4() +// - DragIntRange2() +//------------------------------------------------------------------------- + +// This is called by DragBehavior() when the widget is active (held by mouse or being manipulated with Nav controls) +template +bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const TYPE v_min, const TYPE v_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiContext& g = *GImGui; + const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; + const bool is_clamped = (v_min < v_max); + const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; + const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); + + // Default tweak speed + if (v_speed == 0.0f && is_clamped && (v_max - v_min < FLT_MAX)) + v_speed = (float)((v_max - v_min) * g.DragSpeedDefaultRatio); + + // Inputs accumulates into g.DragCurrentAccum, which is flushed into the current value as soon as it makes a difference with our precision settings + float adjust_delta = 0.0f; + if (g.ActiveIdSource == ImGuiInputSource_Mouse && IsMousePosValid() && IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR)) + { + adjust_delta = g.IO.MouseDelta[axis]; + if (g.IO.KeyAlt) + adjust_delta *= 1.0f / 100.0f; + if (g.IO.KeyShift) + adjust_delta *= 10.0f; + } + else if (g.ActiveIdSource == ImGuiInputSource_Nav) + { + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; + adjust_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiNavReadMode_RepeatFast, 1.0f / 10.0f, 10.0f)[axis]; + v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision)); + } + adjust_delta *= v_speed; + + // For vertical drag we currently assume that Up=higher value (like we do with vertical sliders). This may become a parameter. + if (axis == ImGuiAxis_Y) + adjust_delta = -adjust_delta; + + // For logarithmic use our range is effectively 0..1 so scale the delta into that range + if (is_logarithmic && (v_max - v_min < FLT_MAX) && ((v_max - v_min) > 0.000001f)) // Epsilon to avoid /0 + adjust_delta /= (float)(v_max - v_min); + + // Clear current value on activation + // Avoid altering values and clamping when we are _already_ past the limits and heading in the same direction, so e.g. if range is 0..255, current value is 300 and we are pushing to the right side, keep the 300. + bool is_just_activated = g.ActiveIdIsJustActivated; + bool is_already_past_limits_and_pushing_outward = is_clamped && ((*v >= v_max && adjust_delta > 0.0f) || (*v <= v_min && adjust_delta < 0.0f)); + if (is_just_activated || is_already_past_limits_and_pushing_outward) + { + g.DragCurrentAccum = 0.0f; + g.DragCurrentAccumDirty = false; + } + else if (adjust_delta != 0.0f) + { + g.DragCurrentAccum += adjust_delta; + g.DragCurrentAccumDirty = true; + } + + if (!g.DragCurrentAccumDirty) + return false; + + TYPE v_cur = *v; + FLOATTYPE v_old_ref_for_accum_remainder = (FLOATTYPE)0.0f; + + float logarithmic_zero_epsilon = 0.0f; // Only valid when is_logarithmic is true + const float zero_deadzone_halfsize = 0.0f; // Drag widgets have no deadzone (as it doesn't make sense) + if (is_logarithmic) + { + // When using logarithmic sliders, we need to clamp to avoid hitting zero, but our choice of clamp value greatly affects slider precision. We attempt to use the specified precision to estimate a good lower bound. + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 1; + logarithmic_zero_epsilon = ImPow(0.1f, (float)decimal_precision); + + // Convert to parametric space, apply delta, convert back + float v_old_parametric = ScaleRatioFromValueT(data_type, v_cur, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + float v_new_parametric = v_old_parametric + g.DragCurrentAccum; + v_cur = ScaleValueFromRatioT(data_type, v_new_parametric, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + v_old_ref_for_accum_remainder = v_old_parametric; + } + else + { + v_cur += (SIGNEDTYPE)g.DragCurrentAccum; + } + + // Round to user desired precision based on format string + if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat)) + v_cur = RoundScalarWithFormatT(format, data_type, v_cur); + + // Preserve remainder after rounding has been applied. This also allow slow tweaking of values. + g.DragCurrentAccumDirty = false; + if (is_logarithmic) + { + // Convert to parametric space, apply delta, convert back + float v_new_parametric = ScaleRatioFromValueT(data_type, v_cur, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + g.DragCurrentAccum -= (float)(v_new_parametric - v_old_ref_for_accum_remainder); + } + else + { + g.DragCurrentAccum -= (float)((SIGNEDTYPE)v_cur - (SIGNEDTYPE)*v); + } + + // Lose zero sign for float/double + if (v_cur == (TYPE)-0) + v_cur = (TYPE)0; + + // Clamp values (+ handle overflow/wrap-around for integer types) + if (*v != v_cur && is_clamped) + { + if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f && !is_floating_point)) + v_cur = v_min; + if (v_cur > v_max || (v_cur < *v && adjust_delta > 0.0f && !is_floating_point)) + v_cur = v_max; + } + + // Apply result + if (*v == v_cur) + return false; + *v = v_cur; + return true; +} + +bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. + IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flags! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); + + ImGuiContext& g = *GImGui; + if (g.ActiveId == id) + { + if (g.ActiveIdSource == ImGuiInputSource_Mouse && !g.IO.MouseDown[0]) + ClearActiveID(); + else if (g.ActiveIdSource == ImGuiInputSource_Nav && g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated) + ClearActiveID(); + } + if (g.ActiveId != id) + return false; + if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) + return false; + + switch (data_type) + { + case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = DragBehaviorT(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS8*) p_min : IM_S8_MIN, p_max ? *(const ImS8*)p_max : IM_S8_MAX, format, flags); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } + case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = DragBehaviorT(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU8*) p_min : IM_U8_MIN, p_max ? *(const ImU8*)p_max : IM_U8_MAX, format, flags); if (r) *(ImU8*)p_v = (ImU8)v32; return r; } + case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = DragBehaviorT(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS16*)p_min : IM_S16_MIN, p_max ? *(const ImS16*)p_max : IM_S16_MAX, format, flags); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } + case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = DragBehaviorT(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU16*)p_min : IM_U16_MIN, p_max ? *(const ImU16*)p_max : IM_U16_MAX, format, flags); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } + case ImGuiDataType_S32: return DragBehaviorT(data_type, (ImS32*)p_v, v_speed, p_min ? *(const ImS32* )p_min : IM_S32_MIN, p_max ? *(const ImS32* )p_max : IM_S32_MAX, format, flags); + case ImGuiDataType_U32: return DragBehaviorT(data_type, (ImU32*)p_v, v_speed, p_min ? *(const ImU32* )p_min : IM_U32_MIN, p_max ? *(const ImU32* )p_max : IM_U32_MAX, format, flags); + case ImGuiDataType_S64: return DragBehaviorT(data_type, (ImS64*)p_v, v_speed, p_min ? *(const ImS64* )p_min : IM_S64_MIN, p_max ? *(const ImS64* )p_max : IM_S64_MAX, format, flags); + case ImGuiDataType_U64: return DragBehaviorT(data_type, (ImU64*)p_v, v_speed, p_min ? *(const ImU64* )p_min : IM_U64_MIN, p_max ? *(const ImU64* )p_max : IM_U64_MAX, format, flags); + case ImGuiDataType_Float: return DragBehaviorT(data_type, (float*)p_v, v_speed, p_min ? *(const float* )p_min : -FLT_MAX, p_max ? *(const float* )p_max : FLT_MAX, format, flags); + case ImGuiDataType_Double: return DragBehaviorT(data_type, (double*)p_v, v_speed, p_min ? *(const double*)p_min : -DBL_MAX, p_max ? *(const double*)p_max : DBL_MAX, format, flags); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return false; +} + +// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a Drag widget, p_min and p_max are optional. +// Read code of e.g. DragFloat(), DragInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. +bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const float w = CalcItemWidth(); + + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); + const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + + const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0; + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id, &frame_bb, temp_input_allowed ? ImGuiItemFlags_Inputable : 0)) + return false; + + // Default format string when passing NULL + if (format == NULL) + format = DataTypeGetInfo(data_type)->PrintFmt; + else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) + format = PatchFormatStringFloatToInt(format); + + // Tabbing or CTRL-clicking on Drag turns it into an InputText + const bool hovered = ItemHoverable(frame_bb, id); + bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); + if (!temp_input_is_active) + { + const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; + const bool clicked = (hovered && g.IO.MouseClicked[0]); + const bool double_clicked = (hovered && g.IO.MouseClickedCount[0] == 2); + if (input_requested_by_tabbing || clicked || double_clicked || g.NavActivateId == id || g.NavActivateInputId == id) + { + SetActiveID(id, window); + SetFocusID(id, window); + FocusWindow(window); + g.ActiveIdUsingNavDirMask = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + if (temp_input_allowed) + if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || double_clicked || g.NavActivateInputId == id) + temp_input_is_active = true; + } + + // Experimental: simple click (without moving) turns Drag into an InputText + if (g.IO.ConfigDragClickToInputText && temp_input_allowed && !temp_input_is_active) + if (g.ActiveId == id && hovered && g.IO.MouseReleased[0] && !IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR)) + { + g.NavActivateId = g.NavActivateInputId = id; + g.NavActivateFlags = ImGuiActivateFlags_PreferInput; + temp_input_is_active = true; + } + } + + if (temp_input_is_active) + { + // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set + const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0 && (p_min == NULL || p_max == NULL || DataTypeCompare(data_type, p_min, p_max) < 0); + return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL); + } + + // Draw frame + const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); + RenderNavHighlight(frame_bb, id); + RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding); + + // Drag behavior + const bool value_changed = DragBehavior(id, data_type, p_data, v_speed, p_min, p_max, format, flags); + if (value_changed) + MarkItemEdited(id); + + // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. + char value_buf[64]; + const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); + if (g.LogEnabled) + LogSetNextTextDecoration("{", "}"); + RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); + + if (label_size.x > 0.0f) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return value_changed; +} + +bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + bool value_changed = false; + BeginGroup(); + PushID(label); + PushMultiItemsWidths(components, CalcItemWidth()); + size_t type_size = GDataTypeInfo[data_type].Size; + for (int i = 0; i < components; i++) + { + PushID(i); + if (i > 0) + SameLine(0, g.Style.ItemInnerSpacing.x); + value_changed |= DragScalar("", data_type, p_data, v_speed, p_min, p_max, format, flags); + PopID(); + PopItemWidth(); + p_data = (void*)((char*)p_data + type_size); + } + PopID(); + + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0, g.Style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + + EndGroup(); + return value_changed; +} + +bool ImGui::DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, flags); +} + +// NB: You likely want to specify the ImGuiSliderFlags_AlwaysClamp when using this. +bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed, float v_min, float v_max, const char* format, const char* format_max, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + PushID(label); + BeginGroup(); + PushMultiItemsWidths(2, CalcItemWidth()); + + float min_min = (v_min >= v_max) ? -FLT_MAX : v_min; + float min_max = (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max); + ImGuiSliderFlags min_flags = flags | ((min_min == min_max) ? ImGuiSliderFlags_ReadOnly : 0); + bool value_changed = DragScalar("##min", ImGuiDataType_Float, v_current_min, v_speed, &min_min, &min_max, format, min_flags); + PopItemWidth(); + SameLine(0, g.Style.ItemInnerSpacing.x); + + float max_min = (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min); + float max_max = (v_min >= v_max) ? FLT_MAX : v_max; + ImGuiSliderFlags max_flags = flags | ((max_min == max_max) ? ImGuiSliderFlags_ReadOnly : 0); + value_changed |= DragScalar("##max", ImGuiDataType_Float, v_current_max, v_speed, &max_min, &max_max, format_max ? format_max : format, max_flags); + PopItemWidth(); + SameLine(0, g.Style.ItemInnerSpacing.x); + + TextEx(label, FindRenderedTextEnd(label)); + EndGroup(); + PopID(); + + return value_changed; +} + +// NB: v_speed is float to allow adjusting the drag speed with more precision +bool ImGui::DragInt(const char* label, int* v, float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalar(label, ImGuiDataType_S32, v, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragInt2(const char* label, int v[2], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_S32, v, 2, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragInt3(const char* label, int v[3], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_S32, v, 3, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragInt4(const char* label, int v[4], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_S32, v, 4, v_speed, &v_min, &v_max, format, flags); +} + +// NB: You likely want to specify the ImGuiSliderFlags_AlwaysClamp when using this. +bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed, int v_min, int v_max, const char* format, const char* format_max, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + PushID(label); + BeginGroup(); + PushMultiItemsWidths(2, CalcItemWidth()); + + int min_min = (v_min >= v_max) ? INT_MIN : v_min; + int min_max = (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max); + ImGuiSliderFlags min_flags = flags | ((min_min == min_max) ? ImGuiSliderFlags_ReadOnly : 0); + bool value_changed = DragInt("##min", v_current_min, v_speed, min_min, min_max, format, min_flags); + PopItemWidth(); + SameLine(0, g.Style.ItemInnerSpacing.x); + + int max_min = (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min); + int max_max = (v_min >= v_max) ? INT_MAX : v_max; + ImGuiSliderFlags max_flags = flags | ((max_min == max_max) ? ImGuiSliderFlags_ReadOnly : 0); + value_changed |= DragInt("##max", v_current_max, v_speed, max_min, max_max, format_max ? format_max : format, max_flags); + PopItemWidth(); + SameLine(0, g.Style.ItemInnerSpacing.x); + + TextEx(label, FindRenderedTextEnd(label)); + EndGroup(); + PopID(); + + return value_changed; +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +// Obsolete versions with power parameter. See https://github.com/ocornut/imgui/issues/3361 for details. +bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power) +{ + ImGuiSliderFlags drag_flags = ImGuiSliderFlags_None; + if (power != 1.0f) + { + IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); + IM_ASSERT(p_min != NULL && p_max != NULL); // When using a power curve the drag needs to have known bounds + drag_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths + } + return DragScalar(label, data_type, p_data, v_speed, p_min, p_max, format, drag_flags); +} + +bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power) +{ + ImGuiSliderFlags drag_flags = ImGuiSliderFlags_None; + if (power != 1.0f) + { + IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); + IM_ASSERT(p_min != NULL && p_max != NULL); // When using a power curve the drag needs to have known bounds + drag_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths + } + return DragScalarN(label, data_type, p_data, components, v_speed, p_min, p_max, format, drag_flags); +} + +#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +//------------------------------------------------------------------------- +// [SECTION] Widgets: SliderScalar, SliderFloat, SliderInt, etc. +//------------------------------------------------------------------------- +// - ScaleRatioFromValueT<> [Internal] +// - ScaleValueFromRatioT<> [Internal] +// - SliderBehaviorT<>() [Internal] +// - SliderBehavior() [Internal] +// - SliderScalar() +// - SliderScalarN() +// - SliderFloat() +// - SliderFloat2() +// - SliderFloat3() +// - SliderFloat4() +// - SliderAngle() +// - SliderInt() +// - SliderInt2() +// - SliderInt3() +// - SliderInt4() +// - VSliderScalar() +// - VSliderFloat() +// - VSliderInt() +//------------------------------------------------------------------------- + +// Convert a value v in the output space of a slider into a parametric position on the slider itself (the logical opposite of ScaleValueFromRatioT) +template +float ImGui::ScaleRatioFromValueT(ImGuiDataType data_type, TYPE v, TYPE v_min, TYPE v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_halfsize) +{ + if (v_min == v_max) + return 0.0f; + IM_UNUSED(data_type); + + const TYPE v_clamped = (v_min < v_max) ? ImClamp(v, v_min, v_max) : ImClamp(v, v_max, v_min); + if (is_logarithmic) + { + bool flipped = v_max < v_min; + + if (flipped) // Handle the case where the range is backwards + ImSwap(v_min, v_max); + + // Fudge min/max to avoid getting close to log(0) + FLOATTYPE v_min_fudged = (ImAbs((FLOATTYPE)v_min) < logarithmic_zero_epsilon) ? ((v_min < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_min; + FLOATTYPE v_max_fudged = (ImAbs((FLOATTYPE)v_max) < logarithmic_zero_epsilon) ? ((v_max < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_max; + + // Awkward special cases - we need ranges of the form (-100 .. 0) to convert to (-100 .. -epsilon), not (-100 .. epsilon) + if ((v_min == 0.0f) && (v_max < 0.0f)) + v_min_fudged = -logarithmic_zero_epsilon; + else if ((v_max == 0.0f) && (v_min < 0.0f)) + v_max_fudged = -logarithmic_zero_epsilon; + + float result; + + if (v_clamped <= v_min_fudged) + result = 0.0f; // Workaround for values that are in-range but below our fudge + else if (v_clamped >= v_max_fudged) + result = 1.0f; // Workaround for values that are in-range but above our fudge + else if ((v_min * v_max) < 0.0f) // Range crosses zero, so split into two portions + { + float zero_point_center = (-(float)v_min) / ((float)v_max - (float)v_min); // The zero point in parametric space. There's an argument we should take the logarithmic nature into account when calculating this, but for now this should do (and the most common case of a symmetrical range works fine) + float zero_point_snap_L = zero_point_center - zero_deadzone_halfsize; + float zero_point_snap_R = zero_point_center + zero_deadzone_halfsize; + if (v == 0.0f) + result = zero_point_center; // Special case for exactly zero + else if (v < 0.0f) + result = (1.0f - (float)(ImLog(-(FLOATTYPE)v_clamped / logarithmic_zero_epsilon) / ImLog(-v_min_fudged / logarithmic_zero_epsilon))) * zero_point_snap_L; + else + result = zero_point_snap_R + ((float)(ImLog((FLOATTYPE)v_clamped / logarithmic_zero_epsilon) / ImLog(v_max_fudged / logarithmic_zero_epsilon)) * (1.0f - zero_point_snap_R)); + } + else if ((v_min < 0.0f) || (v_max < 0.0f)) // Entirely negative slider + result = 1.0f - (float)(ImLog(-(FLOATTYPE)v_clamped / -v_max_fudged) / ImLog(-v_min_fudged / -v_max_fudged)); + else + result = (float)(ImLog((FLOATTYPE)v_clamped / v_min_fudged) / ImLog(v_max_fudged / v_min_fudged)); + + return flipped ? (1.0f - result) : result; + } + + // Linear slider + return (float)((FLOATTYPE)(SIGNEDTYPE)(v_clamped - v_min) / (FLOATTYPE)(SIGNEDTYPE)(v_max - v_min)); +} + +// Convert a parametric position on a slider into a value v in the output space (the logical opposite of ScaleRatioFromValueT) +template +TYPE ImGui::ScaleValueFromRatioT(ImGuiDataType data_type, float t, TYPE v_min, TYPE v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_halfsize) +{ + if (v_min == v_max) + return v_min; + const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); + + TYPE result; + if (is_logarithmic) + { + // We special-case the extents because otherwise our fudging can lead to "mathematically correct" but non-intuitive behaviors like a fully-left slider not actually reaching the minimum value + if (t <= 0.0f) + result = v_min; + else if (t >= 1.0f) + result = v_max; + else + { + bool flipped = v_max < v_min; // Check if range is "backwards" + + // Fudge min/max to avoid getting silly results close to zero + FLOATTYPE v_min_fudged = (ImAbs((FLOATTYPE)v_min) < logarithmic_zero_epsilon) ? ((v_min < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_min; + FLOATTYPE v_max_fudged = (ImAbs((FLOATTYPE)v_max) < logarithmic_zero_epsilon) ? ((v_max < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_max; + + if (flipped) + ImSwap(v_min_fudged, v_max_fudged); + + // Awkward special case - we need ranges of the form (-100 .. 0) to convert to (-100 .. -epsilon), not (-100 .. epsilon) + if ((v_max == 0.0f) && (v_min < 0.0f)) + v_max_fudged = -logarithmic_zero_epsilon; + + float t_with_flip = flipped ? (1.0f - t) : t; // t, but flipped if necessary to account for us flipping the range + + if ((v_min * v_max) < 0.0f) // Range crosses zero, so we have to do this in two parts + { + float zero_point_center = (-(float)ImMin(v_min, v_max)) / ImAbs((float)v_max - (float)v_min); // The zero point in parametric space + float zero_point_snap_L = zero_point_center - zero_deadzone_halfsize; + float zero_point_snap_R = zero_point_center + zero_deadzone_halfsize; + if (t_with_flip >= zero_point_snap_L && t_with_flip <= zero_point_snap_R) + result = (TYPE)0.0f; // Special case to make getting exactly zero possible (the epsilon prevents it otherwise) + else if (t_with_flip < zero_point_center) + result = (TYPE)-(logarithmic_zero_epsilon * ImPow(-v_min_fudged / logarithmic_zero_epsilon, (FLOATTYPE)(1.0f - (t_with_flip / zero_point_snap_L)))); + else + result = (TYPE)(logarithmic_zero_epsilon * ImPow(v_max_fudged / logarithmic_zero_epsilon, (FLOATTYPE)((t_with_flip - zero_point_snap_R) / (1.0f - zero_point_snap_R)))); + } + else if ((v_min < 0.0f) || (v_max < 0.0f)) // Entirely negative slider + result = (TYPE)-(-v_max_fudged * ImPow(-v_min_fudged / -v_max_fudged, (FLOATTYPE)(1.0f - t_with_flip))); + else + result = (TYPE)(v_min_fudged * ImPow(v_max_fudged / v_min_fudged, (FLOATTYPE)t_with_flip)); + } + } + else + { + // Linear slider + if (is_floating_point) + { + result = ImLerp(v_min, v_max, t); + } + else + { + // - For integer values we want the clicking position to match the grab box so we round above + // This code is carefully tuned to work with large values (e.g. high ranges of U64) while preserving this property.. + // - Not doing a *1.0 multiply at the end of a range as it tends to be lossy. While absolute aiming at a large s64/u64 + // range is going to be imprecise anyway, with this check we at least make the edge values matches expected limits. + if (t < 1.0) + { + FLOATTYPE v_new_off_f = (SIGNEDTYPE)(v_max - v_min) * t; + result = (TYPE)((SIGNEDTYPE)v_min + (SIGNEDTYPE)(v_new_off_f + (FLOATTYPE)(v_min > v_max ? -0.5 : 0.5))); + } + else + { + result = v_max; + } + } + } + + return result; +} + +// FIXME: Move more of the code into SliderBehavior() +template +bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, TYPE* v, const TYPE v_min, const TYPE v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb) +{ + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + + const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; + const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; + const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); + + const float grab_padding = 2.0f; + const float slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f; + float grab_sz = style.GrabMinSize; + SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max); + if (!is_floating_point && v_range >= 0) // v_range < 0 may happen on integer overflows + grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit + grab_sz = ImMin(grab_sz, slider_sz); + const float slider_usable_sz = slider_sz - grab_sz; + const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f; + const float slider_usable_pos_max = bb.Max[axis] - grab_padding - grab_sz * 0.5f; + + float logarithmic_zero_epsilon = 0.0f; // Only valid when is_logarithmic is true + float zero_deadzone_halfsize = 0.0f; // Only valid when is_logarithmic is true + if (is_logarithmic) + { + // When using logarithmic sliders, we need to clamp to avoid hitting zero, but our choice of clamp value greatly affects slider precision. We attempt to use the specified precision to estimate a good lower bound. + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 1; + logarithmic_zero_epsilon = ImPow(0.1f, (float)decimal_precision); + zero_deadzone_halfsize = (style.LogSliderDeadzone * 0.5f) / ImMax(slider_usable_sz, 1.0f); + } + + // Process interacting with the slider + bool value_changed = false; + if (g.ActiveId == id) + { + bool set_new_value = false; + float clicked_t = 0.0f; + if (g.ActiveIdSource == ImGuiInputSource_Mouse) + { + if (!g.IO.MouseDown[0]) + { + ClearActiveID(); + } + else + { + const float mouse_abs_pos = g.IO.MousePos[axis]; + clicked_t = (slider_usable_sz > 0.0f) ? ImClamp((mouse_abs_pos - slider_usable_pos_min) / slider_usable_sz, 0.0f, 1.0f) : 0.0f; + if (axis == ImGuiAxis_Y) + clicked_t = 1.0f - clicked_t; + set_new_value = true; + } + } + else if (g.ActiveIdSource == ImGuiInputSource_Nav) + { + if (g.ActiveIdIsJustActivated) + { + g.SliderCurrentAccum = 0.0f; // Reset any stored nav delta upon activation + g.SliderCurrentAccumDirty = false; + } + + const ImVec2 input_delta2 = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiNavReadMode_RepeatFast, 0.0f, 0.0f); + float input_delta = (axis == ImGuiAxis_X) ? input_delta2.x : -input_delta2.y; + if (input_delta != 0.0f) + { + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; + if (decimal_precision > 0) + { + input_delta /= 100.0f; // Gamepad/keyboard tweak speeds in % of slider bounds + if (IsNavInputDown(ImGuiNavInput_TweakSlow)) + input_delta /= 10.0f; + } + else + { + if ((v_range >= -100.0f && v_range <= 100.0f) || IsNavInputDown(ImGuiNavInput_TweakSlow)) + input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / (float)v_range; // Gamepad/keyboard tweak speeds in integer steps + else + input_delta /= 100.0f; + } + if (IsNavInputDown(ImGuiNavInput_TweakFast)) + input_delta *= 10.0f; + + g.SliderCurrentAccum += input_delta; + g.SliderCurrentAccumDirty = true; + } + + float delta = g.SliderCurrentAccum; + if (g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated) + { + ClearActiveID(); + } + else if (g.SliderCurrentAccumDirty) + { + clicked_t = ScaleRatioFromValueT(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + + if ((clicked_t >= 1.0f && delta > 0.0f) || (clicked_t <= 0.0f && delta < 0.0f)) // This is to avoid applying the saturation when already past the limits + { + set_new_value = false; + g.SliderCurrentAccum = 0.0f; // If pushing up against the limits, don't continue to accumulate + } + else + { + set_new_value = true; + float old_clicked_t = clicked_t; + clicked_t = ImSaturate(clicked_t + delta); + + // Calculate what our "new" clicked_t will be, and thus how far we actually moved the slider, and subtract this from the accumulator + TYPE v_new = ScaleValueFromRatioT(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat)) + v_new = RoundScalarWithFormatT(format, data_type, v_new); + float new_clicked_t = ScaleRatioFromValueT(data_type, v_new, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + + if (delta > 0) + g.SliderCurrentAccum -= ImMin(new_clicked_t - old_clicked_t, delta); + else + g.SliderCurrentAccum -= ImMax(new_clicked_t - old_clicked_t, delta); + } + + g.SliderCurrentAccumDirty = false; + } + } + + if (set_new_value) + { + TYPE v_new = ScaleValueFromRatioT(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + + // Round to user desired precision based on format string + if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat)) + v_new = RoundScalarWithFormatT(format, data_type, v_new); + + // Apply result + if (*v != v_new) + { + *v = v_new; + value_changed = true; + } + } + } + + if (slider_sz < 1.0f) + { + *out_grab_bb = ImRect(bb.Min, bb.Min); + } + else + { + // Output grab position so it can be displayed by the caller + float grab_t = ScaleRatioFromValueT(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + if (axis == ImGuiAxis_Y) + grab_t = 1.0f - grab_t; + const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t); + if (axis == ImGuiAxis_X) + *out_grab_bb = ImRect(grab_pos - grab_sz * 0.5f, bb.Min.y + grab_padding, grab_pos + grab_sz * 0.5f, bb.Max.y - grab_padding); + else + *out_grab_bb = ImRect(bb.Min.x + grab_padding, grab_pos - grab_sz * 0.5f, bb.Max.x - grab_padding, grab_pos + grab_sz * 0.5f); + } + + return value_changed; +} + +// For 32-bit and larger types, slider bounds are limited to half the natural type range. +// So e.g. an integer Slider between INT_MAX-10 and INT_MAX will fail, but an integer Slider between INT_MAX/2-10 and INT_MAX/2 will be ok. +// It would be possible to lift that limitation with some work but it doesn't seem to be worth it for sliders. +bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb) +{ + // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. + IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flag! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); + + ImGuiContext& g = *GImGui; + if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) + return false; + + switch (data_type) + { + case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)p_min, *(const ImS8*)p_max, format, flags, out_grab_bb); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } + case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_U32, &v32, *(const ImU8*)p_min, *(const ImU8*)p_max, format, flags, out_grab_bb); if (r) *(ImU8*)p_v = (ImU8)v32; return r; } + case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_S32, &v32, *(const ImS16*)p_min, *(const ImS16*)p_max, format, flags, out_grab_bb); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } + case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_U32, &v32, *(const ImU16*)p_min, *(const ImU16*)p_max, format, flags, out_grab_bb); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } + case ImGuiDataType_S32: + IM_ASSERT(*(const ImS32*)p_min >= IM_S32_MIN / 2 && *(const ImS32*)p_max <= IM_S32_MAX / 2); + return SliderBehaviorT(bb, id, data_type, (ImS32*)p_v, *(const ImS32*)p_min, *(const ImS32*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_U32: + IM_ASSERT(*(const ImU32*)p_max <= IM_U32_MAX / 2); + return SliderBehaviorT(bb, id, data_type, (ImU32*)p_v, *(const ImU32*)p_min, *(const ImU32*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_S64: + IM_ASSERT(*(const ImS64*)p_min >= IM_S64_MIN / 2 && *(const ImS64*)p_max <= IM_S64_MAX / 2); + return SliderBehaviorT(bb, id, data_type, (ImS64*)p_v, *(const ImS64*)p_min, *(const ImS64*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_U64: + IM_ASSERT(*(const ImU64*)p_max <= IM_U64_MAX / 2); + return SliderBehaviorT(bb, id, data_type, (ImU64*)p_v, *(const ImU64*)p_min, *(const ImU64*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_Float: + IM_ASSERT(*(const float*)p_min >= -FLT_MAX / 2.0f && *(const float*)p_max <= FLT_MAX / 2.0f); + return SliderBehaviorT(bb, id, data_type, (float*)p_v, *(const float*)p_min, *(const float*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_Double: + IM_ASSERT(*(const double*)p_min >= -DBL_MAX / 2.0f && *(const double*)p_max <= DBL_MAX / 2.0f); + return SliderBehaviorT(bb, id, data_type, (double*)p_v, *(const double*)p_min, *(const double*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return false; +} + +// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a slider, they are all required. +// Read code of e.g. SliderFloat(), SliderInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. +bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const float w = CalcItemWidth(); + + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); + const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + + const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0; + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id, &frame_bb, temp_input_allowed ? ImGuiItemFlags_Inputable : 0)) + return false; + + // Default format string when passing NULL + if (format == NULL) + format = DataTypeGetInfo(data_type)->PrintFmt; + else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) + format = PatchFormatStringFloatToInt(format); + + // Tabbing or CTRL-clicking on Slider turns it into an input box + const bool hovered = ItemHoverable(frame_bb, id); + bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); + if (!temp_input_is_active) + { + const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; + const bool clicked = (hovered && g.IO.MouseClicked[0]); + if (input_requested_by_tabbing || clicked || g.NavActivateId == id || g.NavActivateInputId == id) + { + SetActiveID(id, window); + SetFocusID(id, window); + FocusWindow(window); + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + if (temp_input_allowed && (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || g.NavActivateInputId == id)) + temp_input_is_active = true; + } + } + + if (temp_input_is_active) + { + // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set + const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0; + return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL); + } + + // Draw frame + const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); + RenderNavHighlight(frame_bb, id); + RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, g.Style.FrameRounding); + + // Slider behavior + ImRect grab_bb; + const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags, &grab_bb); + if (value_changed) + MarkItemEdited(id); + + // Render grab + if (grab_bb.Max.x > grab_bb.Min.x) + window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding); + + // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. + char value_buf[64]; + const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); + if (g.LogEnabled) + LogSetNextTextDecoration("{", "}"); + RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); + + if (label_size.x > 0.0f) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return value_changed; +} + +// Add multiple sliders on 1 line for compact edition of multiple components +bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + bool value_changed = false; + BeginGroup(); + PushID(label); + PushMultiItemsWidths(components, CalcItemWidth()); + size_t type_size = GDataTypeInfo[data_type].Size; + for (int i = 0; i < components; i++) + { + PushID(i); + if (i > 0) + SameLine(0, g.Style.ItemInnerSpacing.x); + value_changed |= SliderScalar("", data_type, v, v_min, v_max, format, flags); + PopID(); + PopItemWidth(); + v = (void*)((char*)v + type_size); + } + PopID(); + + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0, g.Style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + + EndGroup(); + return value_changed; +} + +bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderAngle(const char* label, float* v_rad, float v_degrees_min, float v_degrees_max, const char* format, ImGuiSliderFlags flags) +{ + if (format == NULL) + format = "%.0f deg"; + float v_deg = (*v_rad) * 360.0f / (2 * IM_PI); + bool value_changed = SliderFloat(label, &v_deg, v_degrees_min, v_degrees_max, format, flags); + *v_rad = v_deg * (2 * IM_PI) / 360.0f; + return value_changed; +} + +bool ImGui::SliderInt(const char* label, int* v, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalar(label, ImGuiDataType_S32, v, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_S32, v, 2, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_S32, v, 3, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_S32, v, 4, &v_min, &v_max, format, flags); +} + +bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size); + const ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + + ItemSize(bb, style.FramePadding.y); + if (!ItemAdd(frame_bb, id)) + return false; + + // Default format string when passing NULL + if (format == NULL) + format = DataTypeGetInfo(data_type)->PrintFmt; + else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) + format = PatchFormatStringFloatToInt(format); + + const bool hovered = ItemHoverable(frame_bb, id); + if ((hovered && g.IO.MouseClicked[0]) || g.NavActivateId == id || g.NavActivateInputId == id) + { + SetActiveID(id, window); + SetFocusID(id, window); + FocusWindow(window); + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); + } + + // Draw frame + const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); + RenderNavHighlight(frame_bb, id); + RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, g.Style.FrameRounding); + + // Slider behavior + ImRect grab_bb; + const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags | ImGuiSliderFlags_Vertical, &grab_bb); + if (value_changed) + MarkItemEdited(id); + + // Render grab + if (grab_bb.Max.y > grab_bb.Min.y) + window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding); + + // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. + // For the vertical slider we allow centered text to overlap the frame padding + char value_buf[64]; + const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); + RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.0f)); + if (label_size.x > 0.0f) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); + + return value_changed; +} + +bool ImGui::VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return VSliderScalar(label, size, ImGuiDataType_Float, v, &v_min, &v_max, format, flags); +} + +bool ImGui::VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return VSliderScalar(label, size, ImGuiDataType_S32, v, &v_min, &v_max, format, flags); +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +// Obsolete versions with power parameter. See https://github.com/ocornut/imgui/issues/3361 for details. +bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power) +{ + ImGuiSliderFlags slider_flags = ImGuiSliderFlags_None; + if (power != 1.0f) + { + IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); + slider_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths + } + return SliderScalar(label, data_type, p_data, p_min, p_max, format, slider_flags); +} + +bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, float power) +{ + ImGuiSliderFlags slider_flags = ImGuiSliderFlags_None; + if (power != 1.0f) + { + IM_ASSERT(power == 1.0f && "Call function with ImGuiSliderFlags_Logarithmic flags instead of using the old 'float power' function!"); + slider_flags |= ImGuiSliderFlags_Logarithmic; // Fallback for non-asserting paths + } + return SliderScalarN(label, data_type, v, components, v_min, v_max, format, slider_flags); +} + +#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +//------------------------------------------------------------------------- +// [SECTION] Widgets: InputScalar, InputFloat, InputInt, etc. +//------------------------------------------------------------------------- +// - ImParseFormatFindStart() [Internal] +// - ImParseFormatFindEnd() [Internal] +// - ImParseFormatTrimDecorations() [Internal] +// - ImParseFormatSanitizeForPrinting() [Internal] +// - ImParseFormatSanitizeForScanning() [Internal] +// - ImParseFormatPrecision() [Internal] +// - TempInputTextScalar() [Internal] +// - InputScalar() +// - InputScalarN() +// - InputFloat() +// - InputFloat2() +// - InputFloat3() +// - InputFloat4() +// - InputInt() +// - InputInt2() +// - InputInt3() +// - InputInt4() +// - InputDouble() +//------------------------------------------------------------------------- + +// We don't use strchr() because our strings are usually very short and often start with '%' +const char* ImParseFormatFindStart(const char* fmt) +{ + while (char c = fmt[0]) + { + if (c == '%' && fmt[1] != '%') + return fmt; + else if (c == '%') + fmt++; + fmt++; + } + return fmt; +} + +const char* ImParseFormatFindEnd(const char* fmt) +{ + // Printf/scanf types modifiers: I/L/h/j/l/t/w/z. Other uppercase letters qualify as types aka end of the format. + if (fmt[0] != '%') + return fmt; + const unsigned int ignored_uppercase_mask = (1 << ('I'-'A')) | (1 << ('L'-'A')); + const unsigned int ignored_lowercase_mask = (1 << ('h'-'a')) | (1 << ('j'-'a')) | (1 << ('l'-'a')) | (1 << ('t'-'a')) | (1 << ('w'-'a')) | (1 << ('z'-'a')); + for (char c; (c = *fmt) != 0; fmt++) + { + if (c >= 'A' && c <= 'Z' && ((1 << (c - 'A')) & ignored_uppercase_mask) == 0) + return fmt + 1; + if (c >= 'a' && c <= 'z' && ((1 << (c - 'a')) & ignored_lowercase_mask) == 0) + return fmt + 1; + } + return fmt; +} + +// Extract the format out of a format string with leading or trailing decorations +// fmt = "blah blah" -> return fmt +// fmt = "%.3f" -> return fmt +// fmt = "hello %.3f" -> return fmt + 6 +// fmt = "%.3f hello" -> return buf written with "%.3f" +const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, size_t buf_size) +{ + const char* fmt_start = ImParseFormatFindStart(fmt); + if (fmt_start[0] != '%') + return fmt; + const char* fmt_end = ImParseFormatFindEnd(fmt_start); + if (fmt_end[0] == 0) // If we only have leading decoration, we don't need to copy the data. + return fmt_start; + ImStrncpy(buf, fmt_start, ImMin((size_t)(fmt_end - fmt_start) + 1, buf_size)); + return buf; +} + +// Sanitize format +// - Zero terminate so extra characters after format (e.g. "%f123") don't confuse atof/atoi +// - stb_sprintf.h supports several new modifiers which format numbers in a way that also makes them incompatible atof/atoi. +void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size) +{ + const char* fmt_end = ImParseFormatFindEnd(fmt_in); + IM_UNUSED(fmt_out_size); + IM_ASSERT((size_t)(fmt_end - fmt_in + 1) < fmt_out_size); // Format is too long, let us know if this happens to you! + while (fmt_in < fmt_end) + { + char c = *fmt_in++; + if (c != '\'' && c != '$' && c != '_') // Custom flags provided by stb_sprintf.h. POSIX 2008 also supports '. + *(fmt_out++) = c; + } + *fmt_out = 0; // Zero-terminate +} + +// - For scanning we need to remove all width and precision fields "%3.7f" -> "%f". BUT don't strip types like "%I64d" which includes digits. ! "%07I64d" -> "%I64d" +const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size) +{ + const char* fmt_end = ImParseFormatFindEnd(fmt_in); + const char* fmt_out_begin = fmt_out; + IM_UNUSED(fmt_out_size); + IM_ASSERT((size_t)(fmt_end - fmt_in + 1) < fmt_out_size); // Format is too long, let us know if this happens to you! + bool has_type = false; + while (fmt_in < fmt_end) + { + char c = *fmt_in++; + if (!has_type && ((c >= '0' && c <= '9') || c == '.')) + continue; + has_type |= ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); // Stop skipping digits + if (c != '\'' && c != '$' && c != '_') // Custom flags provided by stb_sprintf.h. POSIX 2008 also supports '. + *(fmt_out++) = c; + } + *fmt_out = 0; // Zero-terminate + return fmt_out_begin; +} + +template +static const char* ImAtoi(const char* src, TYPE* output) +{ + int negative = 0; + if (*src == '-') { negative = 1; src++; } + if (*src == '+') { src++; } + TYPE v = 0; + while (*src >= '0' && *src <= '9') + v = (v * 10) + (*src++ - '0'); + *output = negative ? -v : v; + return src; +} + +// Parse display precision back from the display format string +// FIXME: This is still used by some navigation code path to infer a minimum tweak step, but we should aim to rework widgets so it isn't needed. +int ImParseFormatPrecision(const char* fmt, int default_precision) +{ + fmt = ImParseFormatFindStart(fmt); + if (fmt[0] != '%') + return default_precision; + fmt++; + while (*fmt >= '0' && *fmt <= '9') + fmt++; + int precision = INT_MAX; + if (*fmt == '.') + { + fmt = ImAtoi(fmt + 1, &precision); + if (precision < 0 || precision > 99) + precision = default_precision; + } + if (*fmt == 'e' || *fmt == 'E') // Maximum precision with scientific notation + precision = -1; + if ((*fmt == 'g' || *fmt == 'G') && precision == INT_MAX) + precision = -1; + return (precision == INT_MAX) ? default_precision : precision; +} + +// Create text input in place of another active widget (e.g. used when doing a CTRL+Click on drag/slider widgets) +// FIXME: Facilitate using this in variety of other situations. +bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags) +{ + // On the first frame, g.TempInputTextId == 0, then on subsequent frames it becomes == id. + // We clear ActiveID on the first frame to allow the InputText() taking it back. + ImGuiContext& g = *GImGui; + const bool init = (g.TempInputId != id); + if (init) + ClearActiveID(); + + g.CurrentWindow->DC.CursorPos = bb.Min; + bool value_changed = InputTextEx(label, NULL, buf, buf_size, bb.GetSize(), flags | ImGuiInputTextFlags_MergedItem); + if (init) + { + // First frame we started displaying the InputText widget, we expect it to take the active id. + IM_ASSERT(g.ActiveId == id); + g.TempInputId = g.ActiveId; + } + return value_changed; +} + +static inline ImGuiInputTextFlags InputScalar_DefaultCharsFilter(ImGuiDataType data_type, const char* format) +{ + if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) + return ImGuiInputTextFlags_CharsScientific; + const char format_last_char = format[0] ? format[strlen(format) - 1] : 0; + return (format_last_char == 'x' || format_last_char == 'X') ? ImGuiInputTextFlags_CharsHexadecimal : ImGuiInputTextFlags_CharsDecimal; +} + +// Note that Drag/Slider functions are only forwarding the min/max values clamping values if the ImGuiSliderFlags_AlwaysClamp flag is set! +// This is intended: this way we allow CTRL+Click manual input to set a value out of bounds, for maximum flexibility. +// However this may not be ideal for all uses, as some user code may break on out of bound values. +bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min, const void* p_clamp_max) +{ + char fmt_buf[32]; + char data_buf[32]; + format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf)); + DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format); + ImStrTrimBlanks(data_buf); + + ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; + flags |= InputScalar_DefaultCharsFilter(data_type, format); + + bool value_changed = false; + if (TempInputText(bb, id, label, data_buf, IM_ARRAYSIZE(data_buf), flags)) + { + // Backup old value + size_t data_type_size = DataTypeGetInfo(data_type)->Size; + ImGuiDataTypeTempStorage data_backup; + memcpy(&data_backup, p_data, data_type_size); + + // Apply new value (or operations) then clamp + DataTypeApplyFromText(data_buf, data_type, p_data, format); + if (p_clamp_min || p_clamp_max) + { + if (p_clamp_min && p_clamp_max && DataTypeCompare(data_type, p_clamp_min, p_clamp_max) > 0) + ImSwap(p_clamp_min, p_clamp_max); + DataTypeClamp(data_type, p_data, p_clamp_min, p_clamp_max); + } + + // Only mark as edited if new value is different + value_changed = memcmp(&data_backup, p_data, data_type_size) != 0; + if (value_changed) + MarkItemEdited(id); + } + return value_changed; +} + +// Note: p_data, p_step, p_step_fast are _pointers_ to a memory address holding the data. For an Input widget, p_step and p_step_fast are optional. +// Read code of e.g. InputFloat(), InputInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. +bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + + if (format == NULL) + format = DataTypeGetInfo(data_type)->PrintFmt; + + char buf[64]; + DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format); + + // Testing ActiveId as a minor optimization as filtering is not needed until active + if (g.ActiveId == 0 && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0) + flags |= InputScalar_DefaultCharsFilter(data_type, format); + flags |= ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string. + + bool value_changed = false; + if (p_step != NULL) + { + const float button_size = GetFrameHeight(); + + BeginGroup(); // The only purpose of the group here is to allow the caller to query item data e.g. IsItemActive() + PushID(label); + SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2)); + if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view + value_changed = DataTypeApplyFromText(buf, data_type, p_data, format); + + // Step buttons + const ImVec2 backup_frame_padding = style.FramePadding; + style.FramePadding.x = style.FramePadding.y; + ImGuiButtonFlags button_flags = ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups; + if (flags & ImGuiInputTextFlags_ReadOnly) + BeginDisabled(); + SameLine(0, style.ItemInnerSpacing.x); + if (ButtonEx("-", ImVec2(button_size, button_size), button_flags)) + { + DataTypeApplyOp(data_type, '-', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); + value_changed = true; + } + SameLine(0, style.ItemInnerSpacing.x); + if (ButtonEx("+", ImVec2(button_size, button_size), button_flags)) + { + DataTypeApplyOp(data_type, '+', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); + value_changed = true; + } + if (flags & ImGuiInputTextFlags_ReadOnly) + EndDisabled(); + + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0, style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + style.FramePadding = backup_frame_padding; + + PopID(); + EndGroup(); + } + else + { + if (InputText(label, buf, IM_ARRAYSIZE(buf), flags)) + value_changed = DataTypeApplyFromText(buf, data_type, p_data, format); + } + if (value_changed) + MarkItemEdited(g.LastItemData.ID); + + return value_changed; +} + +bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + bool value_changed = false; + BeginGroup(); + PushID(label); + PushMultiItemsWidths(components, CalcItemWidth()); + size_t type_size = GDataTypeInfo[data_type].Size; + for (int i = 0; i < components; i++) + { + PushID(i); + if (i > 0) + SameLine(0, g.Style.ItemInnerSpacing.x); + value_changed |= InputScalar("", data_type, p_data, p_step, p_step_fast, format, flags); + PopID(); + PopItemWidth(); + p_data = (void*)((char*)p_data + type_size); + } + PopID(); + + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0.0f, g.Style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + + EndGroup(); + return value_changed; +} + +bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, const char* format, ImGuiInputTextFlags flags) +{ + flags |= ImGuiInputTextFlags_CharsScientific; + return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step > 0.0f ? &step : NULL), (void*)(step_fast > 0.0f ? &step_fast : NULL), format, flags); +} + +bool ImGui::InputFloat2(const char* label, float v[2], const char* format, ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_Float, v, 2, NULL, NULL, format, flags); +} + +bool ImGui::InputFloat3(const char* label, float v[3], const char* format, ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_Float, v, 3, NULL, NULL, format, flags); +} + +bool ImGui::InputFloat4(const char* label, float v[4], const char* format, ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_Float, v, 4, NULL, NULL, format, flags); +} + +bool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiInputTextFlags flags) +{ + // Hexadecimal input provided as a convenience but the flag name is awkward. Typically you'd use InputText() to parse your own data, if you want to handle prefixes. + const char* format = (flags & ImGuiInputTextFlags_CharsHexadecimal) ? "%08X" : "%d"; + return InputScalar(label, ImGuiDataType_S32, (void*)v, (void*)(step > 0 ? &step : NULL), (void*)(step_fast > 0 ? &step_fast : NULL), format, flags); +} + +bool ImGui::InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_S32, v, 2, NULL, NULL, "%d", flags); +} + +bool ImGui::InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_S32, v, 3, NULL, NULL, "%d", flags); +} + +bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_S32, v, 4, NULL, NULL, "%d", flags); +} + +bool ImGui::InputDouble(const char* label, double* v, double step, double step_fast, const char* format, ImGuiInputTextFlags flags) +{ + flags |= ImGuiInputTextFlags_CharsScientific; + return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step > 0.0 ? &step : NULL), (void*)(step_fast > 0.0 ? &step_fast : NULL), format, flags); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: InputText, InputTextMultiline, InputTextWithHint +//------------------------------------------------------------------------- +// - InputText() +// - InputTextWithHint() +// - InputTextMultiline() +// - InputTextGetCharInfo() [Internal] +// - InputTextReindexLines() [Internal] +// - InputTextReindexLinesRange() [Internal] +// - InputTextEx() [Internal] +//------------------------------------------------------------------------- + +bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline() + return InputTextEx(label, NULL, buf, (int)buf_size, ImVec2(0, 0), flags, callback, user_data); +} + +bool ImGui::InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + return InputTextEx(label, NULL, buf, (int)buf_size, size, flags | ImGuiInputTextFlags_Multiline, callback, user_data); +} + +bool ImGui::InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline() + return InputTextEx(label, hint, buf, (int)buf_size, ImVec2(0, 0), flags, callback, user_data); +} + +static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end) +{ + int line_count = 0; + const char* s = text_begin; + while (char c = *s++) // We are only matching for \n so we can ignore UTF-8 decoding + if (c == '\n') + line_count++; + s--; + if (s[0] != '\n' && s[0] != '\r') + line_count++; + *out_text_end = s; + return line_count; +} + +static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining, ImVec2* out_offset, bool stop_on_new_line) +{ + ImGuiContext& g = *GImGui; + ImFont* font = g.Font; + const float line_height = g.FontSize; + const float scale = line_height / font->FontSize; + + ImVec2 text_size = ImVec2(0, 0); + float line_width = 0.0f; + + const ImWchar* s = text_begin; + while (s < text_end) + { + unsigned int c = (unsigned int)(*s++); + if (c == '\n') + { + text_size.x = ImMax(text_size.x, line_width); + text_size.y += line_height; + line_width = 0.0f; + if (stop_on_new_line) + break; + continue; + } + if (c == '\r') + continue; + + const float char_width = font->GetCharAdvance((ImWchar)c) * scale; + line_width += char_width; + } + + if (text_size.x < line_width) + text_size.x = line_width; + + if (out_offset) + *out_offset = ImVec2(line_width, text_size.y + line_height); // offset allow for the possibility of sitting after a trailing \n + + if (line_width > 0 || text_size.y == 0.0f) // whereas size.y will ignore the trailing \n + text_size.y += line_height; + + if (remaining) + *remaining = s; + + return text_size; +} + +// Wrapper for stb_textedit.h to edit text (our wrapper is for: statically sized buffer, single-line, wchar characters. InputText converts between UTF-8 and wchar) +namespace ImStb +{ + +static int STB_TEXTEDIT_STRINGLEN(const ImGuiInputTextState* obj) { return obj->CurLenW; } +static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx) { return obj->TextW[idx]; } +static float STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *GImGui; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); } +static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x200000 ? 0 : key; } +static ImWchar STB_TEXTEDIT_NEWLINE = '\n'; +static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* obj, int line_start_idx) +{ + const ImWchar* text = obj->TextW.Data; + const ImWchar* text_remaining = NULL; + const ImVec2 size = InputTextCalcTextSizeW(text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true); + r->x0 = 0.0f; + r->x1 = size.x; + r->baseline_y_delta = size.y; + r->ymin = 0.0f; + r->ymax = size.y; + r->num_chars = (int)(text_remaining - (text + line_start_idx)); +} + +// When ImGuiInputTextFlags_Password is set, we don't want actions such as CTRL+Arrow to leak the fact that underlying data are blanks or separators. +static bool is_separator(unsigned int c) { return ImCharIsBlankW(c) || c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|' || c=='\n' || c=='\r'; } +static int is_word_boundary_from_right(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (is_separator(obj->TextW[idx - 1]) && !is_separator(obj->TextW[idx]) ) : 1; } +static int is_word_boundary_from_left(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (!is_separator(obj->TextW[idx - 1]) && is_separator(obj->TextW[idx])) : 1; } +static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL(ImGuiInputTextState* obj, int idx) { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; } +static int STB_TEXTEDIT_MOVEWORDRIGHT_MAC(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; } +#define STB_TEXTEDIT_MOVEWORDLEFT STB_TEXTEDIT_MOVEWORDLEFT_IMPL // They need to be #define for stb_textedit.h +#ifdef __APPLE__ // FIXME: Move setting to IO structure +#define STB_TEXTEDIT_MOVEWORDRIGHT STB_TEXTEDIT_MOVEWORDRIGHT_MAC +#else +static int STB_TEXTEDIT_MOVEWORDRIGHT_WIN(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; } +#define STB_TEXTEDIT_MOVEWORDRIGHT STB_TEXTEDIT_MOVEWORDRIGHT_WIN +#endif + +static void STB_TEXTEDIT_DELETECHARS(ImGuiInputTextState* obj, int pos, int n) +{ + ImWchar* dst = obj->TextW.Data + pos; + + // We maintain our buffer length in both UTF-8 and wchar formats + obj->Edited = true; + obj->CurLenA -= ImTextCountUtf8BytesFromStr(dst, dst + n); + obj->CurLenW -= n; + + // Offset remaining text (FIXME-OPT: Use memmove) + const ImWchar* src = obj->TextW.Data + pos + n; + while (ImWchar c = *src++) + *dst++ = c; + *dst = '\0'; +} + +static bool STB_TEXTEDIT_INSERTCHARS(ImGuiInputTextState* obj, int pos, const ImWchar* new_text, int new_text_len) +{ + const bool is_resizable = (obj->Flags & ImGuiInputTextFlags_CallbackResize) != 0; + const int text_len = obj->CurLenW; + IM_ASSERT(pos <= text_len); + + const int new_text_len_utf8 = ImTextCountUtf8BytesFromStr(new_text, new_text + new_text_len); + if (!is_resizable && (new_text_len_utf8 + obj->CurLenA + 1 > obj->BufCapacityA)) + return false; + + // Grow internal buffer if needed + if (new_text_len + text_len + 1 > obj->TextW.Size) + { + if (!is_resizable) + return false; + IM_ASSERT(text_len < obj->TextW.Size); + obj->TextW.resize(text_len + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1); + } + + ImWchar* text = obj->TextW.Data; + if (pos != text_len) + memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar)); + memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar)); + + obj->Edited = true; + obj->CurLenW += new_text_len; + obj->CurLenA += new_text_len_utf8; + obj->TextW[obj->CurLenW] = '\0'; + + return true; +} + +// We don't use an enum so we can build even with conflicting symbols (if another user of stb_textedit.h leak their STB_TEXTEDIT_K_* symbols) +#define STB_TEXTEDIT_K_LEFT 0x200000 // keyboard input to move cursor left +#define STB_TEXTEDIT_K_RIGHT 0x200001 // keyboard input to move cursor right +#define STB_TEXTEDIT_K_UP 0x200002 // keyboard input to move cursor up +#define STB_TEXTEDIT_K_DOWN 0x200003 // keyboard input to move cursor down +#define STB_TEXTEDIT_K_LINESTART 0x200004 // keyboard input to move cursor to start of line +#define STB_TEXTEDIT_K_LINEEND 0x200005 // keyboard input to move cursor to end of line +#define STB_TEXTEDIT_K_TEXTSTART 0x200006 // keyboard input to move cursor to start of text +#define STB_TEXTEDIT_K_TEXTEND 0x200007 // keyboard input to move cursor to end of text +#define STB_TEXTEDIT_K_DELETE 0x200008 // keyboard input to delete selection or character under cursor +#define STB_TEXTEDIT_K_BACKSPACE 0x200009 // keyboard input to delete selection or character left of cursor +#define STB_TEXTEDIT_K_UNDO 0x20000A // keyboard input to perform undo +#define STB_TEXTEDIT_K_REDO 0x20000B // keyboard input to perform redo +#define STB_TEXTEDIT_K_WORDLEFT 0x20000C // keyboard input to move cursor left one word +#define STB_TEXTEDIT_K_WORDRIGHT 0x20000D // keyboard input to move cursor right one word +#define STB_TEXTEDIT_K_PGUP 0x20000E // keyboard input to move cursor up a page +#define STB_TEXTEDIT_K_PGDOWN 0x20000F // keyboard input to move cursor down a page +#define STB_TEXTEDIT_K_SHIFT 0x400000 + +#define STB_TEXTEDIT_IMPLEMENTATION +#include "imstb_textedit.h" + +// stb_textedit internally allows for a single undo record to do addition and deletion, but somehow, calling +// the stb_textedit_paste() function creates two separate records, so we perform it manually. (FIXME: Report to nothings/stb?) +static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* state, const STB_TEXTEDIT_CHARTYPE* text, int text_len) +{ + stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len); + ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW); + if (text_len <= 0) + return; + if (ImStb::STB_TEXTEDIT_INSERTCHARS(str, 0, text, text_len)) + { + state->cursor = text_len; + state->has_preferred_x = 0; + return; + } + IM_ASSERT(0); // Failed to insert character, normally shouldn't happen because of how we currently use stb_textedit_replace() +} + +} // namespace ImStb + +void ImGuiInputTextState::OnKeyPressed(int key) +{ + stb_textedit_key(this, &Stb, key); + CursorFollow = true; + CursorAnimReset(); +} + +ImGuiInputTextCallbackData::ImGuiInputTextCallbackData() +{ + memset(this, 0, sizeof(*this)); +} + +// Public API to manipulate UTF-8 text +// We expose UTF-8 to the user (unlike the STB_TEXTEDIT_* functions which are manipulating wchar) +// FIXME: The existence of this rarely exercised code path is a bit of a nuisance. +void ImGuiInputTextCallbackData::DeleteChars(int pos, int bytes_count) +{ + IM_ASSERT(pos + bytes_count <= BufTextLen); + char* dst = Buf + pos; + const char* src = Buf + pos + bytes_count; + while (char c = *src++) + *dst++ = c; + *dst = '\0'; + + if (CursorPos >= pos + bytes_count) + CursorPos -= bytes_count; + else if (CursorPos >= pos) + CursorPos = pos; + SelectionStart = SelectionEnd = CursorPos; + BufDirty = true; + BufTextLen -= bytes_count; +} + +void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, const char* new_text_end) +{ + const bool is_resizable = (Flags & ImGuiInputTextFlags_CallbackResize) != 0; + const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)strlen(new_text); + if (new_text_len + BufTextLen >= BufSize) + { + if (!is_resizable) + return; + + // Contrary to STB_TEXTEDIT_INSERTCHARS() this is working in the UTF8 buffer, hence the mildly similar code (until we remove the U16 buffer altogether!) + ImGuiContext& g = *GImGui; + ImGuiInputTextState* edit_state = &g.InputTextState; + IM_ASSERT(edit_state->ID != 0 && g.ActiveId == edit_state->ID); + IM_ASSERT(Buf == edit_state->TextA.Data); + int new_buf_size = BufTextLen + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1; + edit_state->TextA.reserve(new_buf_size + 1); + Buf = edit_state->TextA.Data; + BufSize = edit_state->BufCapacityA = new_buf_size; + } + + if (BufTextLen != pos) + memmove(Buf + pos + new_text_len, Buf + pos, (size_t)(BufTextLen - pos)); + memcpy(Buf + pos, new_text, (size_t)new_text_len * sizeof(char)); + Buf[BufTextLen + new_text_len] = '\0'; + + if (CursorPos >= pos) + CursorPos += new_text_len; + SelectionStart = SelectionEnd = CursorPos; + BufDirty = true; + BufTextLen += new_text_len; +} + +// Return false to discard a character. +static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source) +{ + IM_ASSERT(input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Clipboard); + unsigned int c = *p_char; + + // Filter non-printable (NB: isprint is unreliable! see #2467) + bool apply_named_filters = true; + if (c < 0x20) + { + bool pass = false; + pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline)); // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code) + pass |= (c == '\t' && (flags & ImGuiInputTextFlags_AllowTabInput)); + if (!pass) + return false; + apply_named_filters = false; // Override named filters below so newline and tabs can still be inserted. + } + + if (input_source != ImGuiInputSource_Clipboard) + { + // We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817) + if (c == 127) + return false; + + // Filter private Unicode range. GLFW on OSX seems to send private characters for special keys like arrow keys (FIXME) + if (c >= 0xE000 && c <= 0xF8FF) + return false; + } + + // Filter Unicode ranges we are not handling in this build + if (c > IM_UNICODE_CODEPOINT_MAX) + return false; + + // Generic named filters + if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific))) + { + // The libc allows overriding locale, with e.g. 'setlocale(LC_NUMERIC, "de_DE.UTF-8");' which affect the output/input of printf/scanf to use e.g. ',' instead of '.'. + // The standard mandate that programs starts in the "C" locale where the decimal point is '.'. + // We don't really intend to provide widespread support for it, but out of empathy for people stuck with using odd API, we support the bare minimum aka overriding the decimal point. + // Change the default decimal_point with: + // ImGui::GetCurrentContext()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point; + // Users of non-default decimal point (in particular ',') may be affected by word-selection logic (is_word_boundary_from_right/is_word_boundary_from_left) functions. + ImGuiContext& g = *GImGui; + const unsigned c_decimal_point = (unsigned int)g.PlatformLocaleDecimalPoint; + + // Allow 0-9 . - + * / + if (flags & ImGuiInputTextFlags_CharsDecimal) + if (!(c >= '0' && c <= '9') && (c != c_decimal_point) && (c != '-') && (c != '+') && (c != '*') && (c != '/')) + return false; + + // Allow 0-9 . - + * / e E + if (flags & ImGuiInputTextFlags_CharsScientific) + if (!(c >= '0' && c <= '9') && (c != c_decimal_point) && (c != '-') && (c != '+') && (c != '*') && (c != '/') && (c != 'e') && (c != 'E')) + return false; + + // Allow 0-9 a-F A-F + if (flags & ImGuiInputTextFlags_CharsHexadecimal) + if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) + return false; + + // Turn a-z into A-Z + if (flags & ImGuiInputTextFlags_CharsUppercase) + if (c >= 'a' && c <= 'z') + *p_char = (c += (unsigned int)('A' - 'a')); + + if (flags & ImGuiInputTextFlags_CharsNoBlank) + if (ImCharIsBlankW(c)) + return false; + } + + // Custom callback filter + if (flags & ImGuiInputTextFlags_CallbackCharFilter) + { + ImGuiInputTextCallbackData callback_data; + memset(&callback_data, 0, sizeof(ImGuiInputTextCallbackData)); + callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter; + callback_data.EventChar = (ImWchar)c; + callback_data.Flags = flags; + callback_data.UserData = user_data; + if (callback(&callback_data) != 0) + return false; + *p_char = callback_data.EventChar; + if (!callback_data.EventChar) + return false; + } + + return true; +} + +// Edit a string of text +// - buf_size account for the zero-terminator, so a buf_size of 6 can hold "Hello" but not "Hello!". +// This is so we can easily call InputText() on static arrays using ARRAYSIZE() and to match +// Note that in std::string world, capacity() would omit 1 byte used by the zero-terminator. +// - When active, hold on a privately held copy of the text (and apply back to 'buf'). So changing 'buf' while the InputText is active has no effect. +// - If you want to use ImGui::InputText() with std::string, see misc/cpp/imgui_stdlib.h +// (FIXME: Rather confusing and messy function, among the worse part of our codebase, expecting to rewrite a V2 at some point.. Partly because we are +// doing UTF8 > U16 > UTF8 conversions on the go to easily interface with stb_textedit. Ideally should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188) +bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* callback_user_data) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + IM_ASSERT(buf != NULL && buf_size >= 0); + IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackHistory) && (flags & ImGuiInputTextFlags_Multiline))); // Can't use both together (they both use up/down keys) + IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackCompletion) && (flags & ImGuiInputTextFlags_AllowTabInput))); // Can't use both together (they both use tab key) + + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + const ImGuiStyle& style = g.Style; + + const bool RENDER_SELECTION_WHEN_INACTIVE = false; + const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0; + const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0; + const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0; + const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0; + const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0; + if (is_resizable) + IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag! + + if (is_multiline) // Open group before calling GetID() because groups tracks id created within their scope (including the scrollbar) + BeginGroup(); + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const ImVec2 frame_size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? g.FontSize * 8.0f : label_size.y) + style.FramePadding.y * 2.0f); // Arbitrary default of 8 lines high for multi-line + const ImVec2 total_size = ImVec2(frame_size.x + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), frame_size.y); + + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); + const ImRect total_bb(frame_bb.Min, frame_bb.Min + total_size); + + ImGuiWindow* draw_window = window; + ImVec2 inner_size = frame_size; + ImGuiItemStatusFlags item_status_flags = 0; + ImGuiLastItemData item_data_backup; + if (is_multiline) + { + ImVec2 backup_pos = window->DC.CursorPos; + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_Inputable)) + { + EndGroup(); + return false; + } + item_status_flags = g.LastItemData.StatusFlags; + item_data_backup = g.LastItemData; + window->DC.CursorPos = backup_pos; + + // We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug. + // FIXME-NAV: Pressing NavActivate will trigger general child activation right before triggering our own below. Harmless but bizarre. + PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); + PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); + PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); + PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges + bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove); + PopStyleVar(3); + PopStyleColor(); + if (!child_visible) + { + EndChild(); + EndGroup(); + return false; + } + draw_window = g.CurrentWindow; // Child window + draw_window->DC.NavLayersActiveMaskNext |= (1 << draw_window->DC.NavLayerCurrent); // This is to ensure that EndChild() will display a navigation highlight so we can "enter" into it. + draw_window->DC.CursorPos += style.FramePadding; + inner_size.x -= draw_window->ScrollbarSizes.x; + } + else + { + // Support for internal ImGuiInputTextFlags_MergedItem flag, which could be redesigned as an ItemFlags if needed (with test performed in ItemAdd) + ItemSize(total_bb, style.FramePadding.y); + if (!(flags & ImGuiInputTextFlags_MergedItem)) + if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_Inputable)) + return false; + item_status_flags = g.LastItemData.StatusFlags; + } + const bool hovered = ItemHoverable(frame_bb, id); + if (hovered) + g.MouseCursor = ImGuiMouseCursor_TextInput; + + // We are only allowed to access the state if we are already the active widget. + ImGuiInputTextState* state = GetInputTextState(id); + + const bool input_requested_by_tabbing = (item_status_flags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; + const bool input_requested_by_nav = (g.ActiveId != id) && ((g.NavActivateInputId == id) || (g.NavActivateId == id && (g.NavInputSource == ImGuiInputSource_Keyboard || g.NavInputSource == ImGuiInputSource_Gamepad))); + + const bool user_clicked = hovered && io.MouseClicked[0]; + const bool user_scroll_finish = is_multiline && state != NULL && g.ActiveId == 0 && g.ActiveIdPreviousFrame == GetWindowScrollbarID(draw_window, ImGuiAxis_Y); + const bool user_scroll_active = is_multiline && state != NULL && g.ActiveId == GetWindowScrollbarID(draw_window, ImGuiAxis_Y); + bool clear_active_id = false; + bool select_all = false; + + float scroll_y = is_multiline ? draw_window->Scroll.y : FLT_MAX; + + const bool init_changed_specs = (state != NULL && state->Stb.single_line != !is_multiline); + const bool init_make_active = (user_clicked || user_scroll_finish || input_requested_by_nav || input_requested_by_tabbing); + const bool init_state = (init_make_active || user_scroll_active); + if ((init_state && g.ActiveId != id) || init_changed_specs) + { + // Access state even if we don't own it yet. + state = &g.InputTextState; + state->CursorAnimReset(); + + // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar) + // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode) + const int buf_len = (int)strlen(buf); + state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string. + memcpy(state->InitialTextA.Data, buf, buf_len + 1); + + // Start edition + const char* buf_end = NULL; + state->TextW.resize(buf_size + 1); // wchar count <= UTF-8 count. we use +1 to make sure that .Data is always pointing to at least an empty string. + state->TextA.resize(0); + state->TextAIsValid = false; // TextA is not valid yet (we will display buf until then) + state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, buf_size, buf, NULL, &buf_end); + state->CurLenA = (int)(buf_end - buf); // We can't get the result from ImStrncpy() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8. + + // Preserve cursor position and undo/redo stack if we come back to same widget + // FIXME: For non-readonly widgets we might be able to require that TextAIsValid && TextA == buf ? (untested) and discard undo stack if user buffer has changed. + const bool recycle_state = (state->ID == id && !init_changed_specs); + if (recycle_state) + { + // Recycle existing cursor/selection/undo stack but clamp position + // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler. + state->CursorClamp(); + } + else + { + state->ID = id; + state->ScrollX = 0.0f; + stb_textedit_initialize_state(&state->Stb, !is_multiline); + } + + if (!is_multiline) + { + if (flags & ImGuiInputTextFlags_AutoSelectAll) + select_all = true; + if (input_requested_by_nav && (!recycle_state || !(g.NavActivateFlags & ImGuiActivateFlags_TryToPreserveState))) + select_all = true; + if (input_requested_by_tabbing || (user_clicked && io.KeyCtrl)) + select_all = true; + } + + if (flags & ImGuiInputTextFlags_AlwaysOverwrite) + state->Stb.insert_mode = 1; // stb field name is indeed incorrect (see #2863) + } + + if (g.ActiveId != id && init_make_active) + { + IM_ASSERT(state && state->ID == id); + SetActiveID(id, window); + SetFocusID(id, window); + FocusWindow(window); + + // Declare our inputs + IM_ASSERT(ImGuiNavInput_COUNT < 32); + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + if (is_multiline || (flags & ImGuiInputTextFlags_CallbackHistory)) + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); + g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel); + SetActiveIdUsingKey(ImGuiKey_Home); + SetActiveIdUsingKey(ImGuiKey_End); + if (is_multiline) + { + SetActiveIdUsingKey(ImGuiKey_PageUp); + SetActiveIdUsingKey(ImGuiKey_PageDown); + } + if (flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_AllowTabInput)) // Disable keyboard tabbing out as we will use the \t character. + { + SetActiveIdUsingKey(ImGuiKey_Tab); + } + } + + // We have an edge case if ActiveId was set through another widget (e.g. widget being swapped), clear id immediately (don't wait until the end of the function) + if (g.ActiveId == id && state == NULL) + ClearActiveID(); + + // Release focus when we click outside + if (g.ActiveId == id && io.MouseClicked[0] && !init_state && !init_make_active) //-V560 + clear_active_id = true; + + // Lock the decision of whether we are going to take the path displaying the cursor or selection + const bool render_cursor = (g.ActiveId == id) || (state && user_scroll_active); + bool render_selection = state && (state->HasSelection() || select_all) && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor); + bool value_changed = false; + bool enter_pressed = false; + + // When read-only we always use the live data passed to the function + // FIXME-OPT: Because our selection/cursor code currently needs the wide text we need to convert it when active, which is not ideal :( + if (is_readonly && state != NULL && (render_cursor || render_selection)) + { + const char* buf_end = NULL; + state->TextW.resize(buf_size + 1); + state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, buf, NULL, &buf_end); + state->CurLenA = (int)(buf_end - buf); + state->CursorClamp(); + render_selection &= state->HasSelection(); + } + + // Select the buffer to render. + const bool buf_display_from_state = (render_cursor || render_selection || g.ActiveId == id) && !is_readonly && state && state->TextAIsValid; + const bool is_displaying_hint = (hint != NULL && (buf_display_from_state ? state->TextA.Data : buf)[0] == 0); + + // Password pushes a temporary font with only a fallback glyph + if (is_password && !is_displaying_hint) + { + const ImFontGlyph* glyph = g.Font->FindGlyph('*'); + ImFont* password_font = &g.InputTextPasswordFont; + password_font->FontSize = g.Font->FontSize; + password_font->Scale = g.Font->Scale; + password_font->Ascent = g.Font->Ascent; + password_font->Descent = g.Font->Descent; + password_font->ContainerAtlas = g.Font->ContainerAtlas; + password_font->FallbackGlyph = glyph; + password_font->FallbackAdvanceX = glyph->AdvanceX; + IM_ASSERT(password_font->Glyphs.empty() && password_font->IndexAdvanceX.empty() && password_font->IndexLookup.empty()); + PushFont(password_font); + } + + // Process mouse inputs and character inputs + int backup_current_text_length = 0; + if (g.ActiveId == id) + { + IM_ASSERT(state != NULL); + backup_current_text_length = state->CurLenA; + state->Edited = false; + state->BufCapacityA = buf_size; + state->Flags = flags; + + // Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget. + // Down the line we should have a cleaner library-wide concept of Selected vs Active. + g.ActiveIdAllowOverlap = !io.MouseDown[0]; + g.WantTextInputNextFrame = 1; + + // Edit in progress + const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + state->ScrollX; + const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y) : (g.FontSize * 0.5f)); + + const bool is_osx = io.ConfigMacOSXBehaviors; + if (select_all) + { + state->SelectAll(); + state->SelectedAllMouseLock = true; + } + else if (hovered && io.MouseClickedCount[0] >= 2 && !io.KeyShift) + { + stb_textedit_click(state, &state->Stb, mouse_x, mouse_y); + const int multiclick_count = (io.MouseClickedCount[0] - 2); + if ((multiclick_count % 2) == 0) + { + // Double-click: Select word + // We always use the "Mac" word advance for double-click select vs CTRL+Right which use the platform dependent variant: + // FIXME: There are likely many ways to improve this behavior, but there's no "right" behavior (depends on use-case, software, OS) + const bool is_bol = (state->Stb.cursor == 0) || ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb.cursor - 1) == '\n'; + if (STB_TEXT_HAS_SELECTION(&state->Stb) || !is_bol) + state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT); + //state->OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT); + if (!STB_TEXT_HAS_SELECTION(&state->Stb)) + ImStb::stb_textedit_prep_selection_at_cursor(&state->Stb); + state->Stb.cursor = ImStb::STB_TEXTEDIT_MOVEWORDRIGHT_MAC(state, state->Stb.cursor); + state->Stb.select_end = state->Stb.cursor; + ImStb::stb_textedit_clamp(state, &state->Stb); + } + else + { + // Triple-click: Select line + const bool is_eol = ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb.cursor) == '\n'; + state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART); + state->OnKeyPressed(STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT); + state->OnKeyPressed(STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT); + if (!is_eol && is_multiline) + { + ImSwap(state->Stb.select_start, state->Stb.select_end); + state->Stb.cursor = state->Stb.select_end; + } + state->CursorFollow = false; + } + state->CursorAnimReset(); + } + else if (io.MouseClicked[0] && !state->SelectedAllMouseLock) + { + // FIXME: unselect on late click could be done release? + if (hovered) + { + stb_textedit_click(state, &state->Stb, mouse_x, mouse_y); + state->CursorAnimReset(); + } + } + else if (io.MouseDown[0] && !state->SelectedAllMouseLock && (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f)) + { + stb_textedit_drag(state, &state->Stb, mouse_x, mouse_y); + state->CursorAnimReset(); + state->CursorFollow = true; + } + if (state->SelectedAllMouseLock && !io.MouseDown[0]) + state->SelectedAllMouseLock = false; + + // We except backends to emit a Tab key but some also emit a Tab character which we ignore (#2467, #1336) + // (For Tab and Enter: Win32/SFML/Allegro are sending both keys and chars, GLFW and SDL are only sending keys. For Space they all send all threes) + const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeySuper); + if ((flags & ImGuiInputTextFlags_AllowTabInput) && IsKeyPressed(ImGuiKey_Tab) && !ignore_char_inputs && !io.KeyShift && !is_readonly) + { + unsigned int c = '\t'; // Insert TAB + if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + state->OnKeyPressed((int)c); + } + + // Process regular text input (before we check for Return because using some IME will effectively send a Return?) + // We ignore CTRL inputs, but need to allow ALT+CTRL as some keyboards (e.g. German) use AltGR (which _is_ Alt+Ctrl) to input certain characters. + if (io.InputQueueCharacters.Size > 0) + { + if (!ignore_char_inputs && !is_readonly && !input_requested_by_nav) + for (int n = 0; n < io.InputQueueCharacters.Size; n++) + { + // Insert character if they pass filtering + unsigned int c = (unsigned int)io.InputQueueCharacters[n]; + if (c == '\t') // Skip Tab, see above. + continue; + if (c == '\b') + { + state->OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE); + continue; + } + + if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + state->OnKeyPressed((int)c); + } + + // Consume characters + io.InputQueueCharacters.resize(0); + } + } + + // Process other shortcuts/key-presses + bool cancel_edit = false; + if (g.ActiveId == id && !g.ActiveIdIsJustActivated && !clear_active_id) + { + IM_ASSERT(state != NULL); + + const int row_count_per_page = ImMax((int)((inner_size.y - style.FramePadding.y) / g.FontSize), 1); + state->Stb.row_count_per_page = row_count_per_page; + + const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0); + const bool is_osx = io.ConfigMacOSXBehaviors; + const bool is_osx_shift_shortcut = is_osx && (io.KeyMods == (ImGuiModFlags_Super | ImGuiModFlags_Shift)); + const bool is_wordmove_key_down = is_osx ? io.KeyAlt : io.KeyCtrl; // OS X style: Text editing cursor movement using Alt instead of Ctrl + const bool is_startend_key_down = is_osx && io.KeySuper && !io.KeyCtrl && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End + const bool is_ctrl_key_only = (io.KeyMods == ImGuiModFlags_Ctrl); + const bool is_shift_key_only = (io.KeyMods == ImGuiModFlags_Shift); + const bool is_shortcut_key = g.IO.ConfigMacOSXBehaviors ? (io.KeyMods == ImGuiModFlags_Super) : (io.KeyMods == ImGuiModFlags_Ctrl); + + const bool is_cut = ((is_shortcut_key && IsKeyPressed(ImGuiKey_X)) || (is_shift_key_only && IsKeyPressed(ImGuiKey_Delete))) && !is_readonly && !is_password && (!is_multiline || state->HasSelection()); + const bool is_copy = ((is_shortcut_key && IsKeyPressed(ImGuiKey_C)) || (is_ctrl_key_only && IsKeyPressed(ImGuiKey_Insert))) && !is_password && (!is_multiline || state->HasSelection()); + const bool is_paste = ((is_shortcut_key && IsKeyPressed(ImGuiKey_V)) || (is_shift_key_only && IsKeyPressed(ImGuiKey_Insert))) && !is_readonly; + const bool is_undo = ((is_shortcut_key && IsKeyPressed(ImGuiKey_Z)) && !is_readonly && is_undoable); + const bool is_redo = ((is_shortcut_key && IsKeyPressed(ImGuiKey_Y)) || (is_osx_shift_shortcut && IsKeyPressed(ImGuiKey_Z))) && !is_readonly && is_undoable; + + // We allow validate/cancel with Nav source (gamepad) to makes it easier to undo an accidental NavInput press with no keyboard wired, but otherwise it isn't very useful. + const bool is_validate_enter = IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_KeypadEnter); + const bool is_validate_nav = (IsNavInputTest(ImGuiNavInput_Activate, ImGuiNavReadMode_Pressed) && !IsKeyPressed(ImGuiKey_Space)) || IsNavInputTest(ImGuiNavInput_Input, ImGuiNavReadMode_Pressed); + const bool is_cancel = false; /*IsKeyPressed(ImGuiKey_Escape) || IsNavInputTest(ImGuiNavInput_Cancel, ImGuiNavReadMode_Pressed);*/ + + if (IsKeyPressed(ImGuiKey_LeftArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); } + else if (IsKeyPressed(ImGuiKey_RightArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); } + else if (IsKeyPressed(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); } + else if (IsKeyPressed(ImGuiKey_DownArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMin(draw_window->Scroll.y + g.FontSize, GetScrollMaxY())); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTEND : STB_TEXTEDIT_K_DOWN) | k_mask); } + else if (IsKeyPressed(ImGuiKey_PageUp) && is_multiline) { state->OnKeyPressed(STB_TEXTEDIT_K_PGUP | k_mask); scroll_y -= row_count_per_page * g.FontSize; } + else if (IsKeyPressed(ImGuiKey_PageDown) && is_multiline) { state->OnKeyPressed(STB_TEXTEDIT_K_PGDOWN | k_mask); scroll_y += row_count_per_page * g.FontSize; } + else if (IsKeyPressed(ImGuiKey_Home)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask); } + else if (IsKeyPressed(ImGuiKey_End)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask); } + else if (IsKeyPressed(ImGuiKey_Delete) && !is_readonly && !is_cut) { state->OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask); } + else if (IsKeyPressed(ImGuiKey_Backspace) && !is_readonly) + { + if (!state->HasSelection()) + { + if (is_wordmove_key_down) + state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT); + else if (is_osx && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) + state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT); + } + state->OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask); + } + else if (is_validate_enter) + { + bool ctrl_enter_for_new_line = (flags & ImGuiInputTextFlags_CtrlEnterForNewLine) != 0; + if (!is_multiline || (ctrl_enter_for_new_line && !io.KeyCtrl) || (!ctrl_enter_for_new_line && io.KeyCtrl)) + { + enter_pressed = clear_active_id = true; + } + else if (!is_readonly) + { + unsigned int c = '\n'; // Insert new line + if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + state->OnKeyPressed((int)c); + } + } + else if (is_validate_nav) + { + IM_ASSERT(!is_validate_enter); + enter_pressed = clear_active_id = true; + } + else if (is_cancel) + { + clear_active_id = cancel_edit = true; + } + else if (is_undo || is_redo) + { + state->OnKeyPressed(is_undo ? STB_TEXTEDIT_K_UNDO : STB_TEXTEDIT_K_REDO); + state->ClearSelection(); + } + else if (is_shortcut_key && IsKeyPressed(ImGuiKey_A)) + { + state->SelectAll(); + state->CursorFollow = true; + } + else if (is_cut || is_copy) + { + // Cut, Copy + if (io.SetClipboardTextFn) + { + const int ib = state->HasSelection() ? ImMin(state->Stb.select_start, state->Stb.select_end) : 0; + const int ie = state->HasSelection() ? ImMax(state->Stb.select_start, state->Stb.select_end) : state->CurLenW; + const int clipboard_data_len = ImTextCountUtf8BytesFromStr(state->TextW.Data + ib, state->TextW.Data + ie) + 1; + char* clipboard_data = (char*)IM_ALLOC(clipboard_data_len * sizeof(char)); + ImTextStrToUtf8(clipboard_data, clipboard_data_len, state->TextW.Data + ib, state->TextW.Data + ie); + SetClipboardText(clipboard_data); + MemFree(clipboard_data); + } + if (is_cut) + { + if (!state->HasSelection()) + state->SelectAll(); + state->CursorFollow = true; + stb_textedit_cut(state, &state->Stb); + } + } + else if (is_paste) + { + if (const char* clipboard = GetClipboardText()) + { + // Filter pasted buffer + const int clipboard_len = (int)strlen(clipboard); + ImWchar* clipboard_filtered = (ImWchar*)IM_ALLOC((clipboard_len + 1) * sizeof(ImWchar)); + int clipboard_filtered_len = 0; + for (const char* s = clipboard; *s; ) + { + unsigned int c; + s += ImTextCharFromUtf8(&c, s, NULL); + if (c == 0) + break; + if (!InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Clipboard)) + continue; + clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c; + } + clipboard_filtered[clipboard_filtered_len] = 0; + if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation + { + stb_textedit_paste(state, &state->Stb, clipboard_filtered, clipboard_filtered_len); + state->CursorFollow = true; + } + MemFree(clipboard_filtered); + } + } + + // Update render selection flag after events have been handled, so selection highlight can be displayed during the same frame. + render_selection |= state->HasSelection() && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor); + } + + // Process callbacks and apply result back to user's buffer. + const char* apply_new_text = NULL; + int apply_new_text_length = 0; + if (g.ActiveId == id) + { + IM_ASSERT(state != NULL); + if (cancel_edit) + { + // Restore initial value. Only return true if restoring to the initial value changes the current buffer contents. + if (!is_readonly && strcmp(buf, state->InitialTextA.Data) != 0) + { + // Push records into the undo stack so we can CTRL+Z the revert operation itself + apply_new_text = state->InitialTextA.Data; + apply_new_text_length = state->InitialTextA.Size - 1; + ImVector w_text; + if (apply_new_text_length > 0) + { + w_text.resize(ImTextCountCharsFromUtf8(apply_new_text, apply_new_text + apply_new_text_length) + 1); + ImTextStrFromUtf8(w_text.Data, w_text.Size, apply_new_text, apply_new_text + apply_new_text_length); + } + stb_textedit_replace(state, &state->Stb, w_text.Data, (apply_new_text_length > 0) ? (w_text.Size - 1) : 0); + } + } + + // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame. + // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. + // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize). + bool apply_edit_back_to_user_buffer = !cancel_edit || (enter_pressed && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0); + if (apply_edit_back_to_user_buffer) + { + // Apply new value immediately - copy modified buffer back + // Note that as soon as the input box is active, the in-widget value gets priority over any underlying modification of the input buffer + // FIXME: We actually always render 'buf' when calling DrawList->AddText, making the comment above incorrect. + // FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks. + if (!is_readonly) + { + state->TextAIsValid = true; + state->TextA.resize(state->TextW.Size * 4 + 1); + ImTextStrToUtf8(state->TextA.Data, state->TextA.Size, state->TextW.Data, NULL); + } + + // User callback + if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackEdit | ImGuiInputTextFlags_CallbackAlways)) != 0) + { + IM_ASSERT(callback != NULL); + + // The reason we specify the usage semantic (Completion/History) is that Completion needs to disable keyboard TABBING at the moment. + ImGuiInputTextFlags event_flag = 0; + ImGuiKey event_key = ImGuiKey_None; + if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && IsKeyPressed(ImGuiKey_Tab)) + { + event_flag = ImGuiInputTextFlags_CallbackCompletion; + event_key = ImGuiKey_Tab; + } + else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressed(ImGuiKey_UpArrow)) + { + event_flag = ImGuiInputTextFlags_CallbackHistory; + event_key = ImGuiKey_UpArrow; + } + else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressed(ImGuiKey_DownArrow)) + { + event_flag = ImGuiInputTextFlags_CallbackHistory; + event_key = ImGuiKey_DownArrow; + } + else if ((flags & ImGuiInputTextFlags_CallbackEdit) && state->Edited) + { + event_flag = ImGuiInputTextFlags_CallbackEdit; + } + else if (flags & ImGuiInputTextFlags_CallbackAlways) + { + event_flag = ImGuiInputTextFlags_CallbackAlways; + } + + if (event_flag) + { + ImGuiInputTextCallbackData callback_data; + memset(&callback_data, 0, sizeof(ImGuiInputTextCallbackData)); + callback_data.EventFlag = event_flag; + callback_data.Flags = flags; + callback_data.UserData = callback_user_data; + + char* callback_buf = is_readonly ? buf : state->TextA.Data; + callback_data.EventKey = event_key; + callback_data.Buf = callback_buf; + callback_data.BufTextLen = state->CurLenA; + callback_data.BufSize = state->BufCapacityA; + callback_data.BufDirty = false; + + // We have to convert from wchar-positions to UTF-8-positions, which can be pretty slow (an incentive to ditch the ImWchar buffer, see https://github.com/nothings/stb/issues/188) + ImWchar* text = state->TextW.Data; + const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + state->Stb.cursor); + const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_start); + const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_end); + + // Call user code + callback(&callback_data); + + // Read back what user may have modified + callback_buf = is_readonly ? buf : state->TextA.Data; // Pointer may have been invalidated by a resize callback + IM_ASSERT(callback_data.Buf == callback_buf); // Invalid to modify those fields + IM_ASSERT(callback_data.BufSize == state->BufCapacityA); + IM_ASSERT(callback_data.Flags == flags); + const bool buf_dirty = callback_data.BufDirty; + if (callback_data.CursorPos != utf8_cursor_pos || buf_dirty) { state->Stb.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); state->CursorFollow = true; } + if (callback_data.SelectionStart != utf8_selection_start || buf_dirty) { state->Stb.select_start = (callback_data.SelectionStart == callback_data.CursorPos) ? state->Stb.cursor : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart); } + if (callback_data.SelectionEnd != utf8_selection_end || buf_dirty) { state->Stb.select_end = (callback_data.SelectionEnd == callback_data.SelectionStart) ? state->Stb.select_start : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); } + if (buf_dirty) + { + IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text! + if (callback_data.BufTextLen > backup_current_text_length && is_resizable) + state->TextW.resize(state->TextW.Size + (callback_data.BufTextLen - backup_current_text_length)); + state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, callback_data.Buf, NULL); + state->CurLenA = callback_data.BufTextLen; // Assume correct length and valid UTF-8 from user, saves us an extra strlen() + state->CursorAnimReset(); + } + } + } + + // Will copy result string if modified + if (!is_readonly && strcmp(state->TextA.Data, buf) != 0) + { + apply_new_text = state->TextA.Data; + apply_new_text_length = state->CurLenA; + } + } + + // Clear temporary user storage + state->Flags = ImGuiInputTextFlags_None; + } + + // Copy result to user buffer. This can currently only happen when (g.ActiveId == id) + if (apply_new_text != NULL) + { + // We cannot test for 'backup_current_text_length != apply_new_text_length' here because we have no guarantee that the size + // of our owned buffer matches the size of the string object held by the user, and by design we allow InputText() to be used + // without any storage on user's side. + IM_ASSERT(apply_new_text_length >= 0); + if (is_resizable) + { + ImGuiInputTextCallbackData callback_data; + callback_data.EventFlag = ImGuiInputTextFlags_CallbackResize; + callback_data.Flags = flags; + callback_data.Buf = buf; + callback_data.BufTextLen = apply_new_text_length; + callback_data.BufSize = ImMax(buf_size, apply_new_text_length + 1); + callback_data.UserData = callback_user_data; + callback(&callback_data); + buf = callback_data.Buf; + buf_size = callback_data.BufSize; + apply_new_text_length = ImMin(callback_data.BufTextLen, buf_size - 1); + IM_ASSERT(apply_new_text_length <= buf_size); + } + //IMGUI_DEBUG_LOG("InputText(\"%s\"): apply_new_text length %d\n", label, apply_new_text_length); + + // If the underlying buffer resize was denied or not carried to the next frame, apply_new_text_length+1 may be >= buf_size. + ImStrncpy(buf, apply_new_text, ImMin(apply_new_text_length + 1, buf_size)); + value_changed = true; + } + + // Release active ID at the end of the function (so e.g. pressing Return still does a final application of the value) + if (clear_active_id && g.ActiveId == id) + ClearActiveID(); + + // Render frame + if (!is_multiline) + { + RenderNavHighlight(frame_bb, id); + RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); + } + + const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + inner_size.x, frame_bb.Min.y + inner_size.y); // Not using frame_bb.Max because we have adjusted size + ImVec2 draw_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding; + ImVec2 text_size(0.0f, 0.0f); + + // Set upper limit of single-line InputTextEx() at 2 million characters strings. The current pathological worst case is a long line + // without any carriage return, which would makes ImFont::RenderText() reserve too many vertices and probably crash. Avoid it altogether. + // Note that we only use this limit on single-line InputText(), so a pathologically large line on a InputTextMultiline() would still crash. + const int buf_display_max_length = 2 * 1024 * 1024; + const char* buf_display = buf_display_from_state ? state->TextA.Data : buf; //-V595 + const char* buf_display_end = NULL; // We have specialized paths below for setting the length + if (is_displaying_hint) + { + buf_display = hint; + buf_display_end = hint + strlen(hint); + } + + // Render text. We currently only render selection when the widget is active or while scrolling. + // FIXME: We could remove the '&& render_cursor' to keep rendering selection when inactive. + if (render_cursor || render_selection) + { + IM_ASSERT(state != NULL); + if (!is_displaying_hint) + buf_display_end = buf_display + state->CurLenA; + + // Render text (with cursor and selection) + // This is going to be messy. We need to: + // - Display the text (this alone can be more easily clipped) + // - Handle scrolling, highlight selection, display cursor (those all requires some form of 1d->2d cursor position calculation) + // - Measure text height (for scrollbar) + // We are attempting to do most of that in **one main pass** to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort) + // FIXME: This should occur on buf_display but we'd need to maintain cursor/select_start/select_end for UTF-8. + const ImWchar* text_begin = state->TextW.Data; + ImVec2 cursor_offset, select_start_offset; + + { + // Find lines numbers straddling 'cursor' (slot 0) and 'select_start' (slot 1) positions. + const ImWchar* searches_input_ptr[2] = { NULL, NULL }; + int searches_result_line_no[2] = { -1000, -1000 }; + int searches_remaining = 0; + if (render_cursor) + { + searches_input_ptr[0] = text_begin + state->Stb.cursor; + searches_result_line_no[0] = -1; + searches_remaining++; + } + if (render_selection) + { + searches_input_ptr[1] = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end); + searches_result_line_no[1] = -1; + searches_remaining++; + } + + // Iterate all lines to find our line numbers + // In multi-line mode, we never exit the loop until all lines are counted, so add one extra to the searches_remaining counter. + searches_remaining += is_multiline ? 1 : 0; + int line_count = 0; + //for (const ImWchar* s = text_begin; (s = (const ImWchar*)wcschr((const wchar_t*)s, (wchar_t)'\n')) != NULL; s++) // FIXME-OPT: Could use this when wchar_t are 16-bit + for (const ImWchar* s = text_begin; *s != 0; s++) + if (*s == '\n') + { + line_count++; + if (searches_result_line_no[0] == -1 && s >= searches_input_ptr[0]) { searches_result_line_no[0] = line_count; if (--searches_remaining <= 0) break; } + if (searches_result_line_no[1] == -1 && s >= searches_input_ptr[1]) { searches_result_line_no[1] = line_count; if (--searches_remaining <= 0) break; } + } + line_count++; + if (searches_result_line_no[0] == -1) + searches_result_line_no[0] = line_count; + if (searches_result_line_no[1] == -1) + searches_result_line_no[1] = line_count; + + // Calculate 2d position by finding the beginning of the line and measuring distance + cursor_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[0], text_begin), searches_input_ptr[0]).x; + cursor_offset.y = searches_result_line_no[0] * g.FontSize; + if (searches_result_line_no[1] >= 0) + { + select_start_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[1], text_begin), searches_input_ptr[1]).x; + select_start_offset.y = searches_result_line_no[1] * g.FontSize; + } + + // Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224) + if (is_multiline) + text_size = ImVec2(inner_size.x, line_count * g.FontSize); + } + + // Scroll + if (render_cursor && state->CursorFollow) + { + // Horizontal scroll in chunks of quarter width + if (!(flags & ImGuiInputTextFlags_NoHorizontalScroll)) + { + const float scroll_increment_x = inner_size.x * 0.25f; + const float visible_width = inner_size.x - style.FramePadding.x; + if (cursor_offset.x < state->ScrollX) + state->ScrollX = IM_FLOOR(ImMax(0.0f, cursor_offset.x - scroll_increment_x)); + else if (cursor_offset.x - visible_width >= state->ScrollX) + state->ScrollX = IM_FLOOR(cursor_offset.x - visible_width + scroll_increment_x); + } + else + { + state->ScrollX = 0.0f; + } + + // Vertical scroll + if (is_multiline) + { + // Test if cursor is vertically visible + if (cursor_offset.y - g.FontSize < scroll_y) + scroll_y = ImMax(0.0f, cursor_offset.y - g.FontSize); + else if (cursor_offset.y - (inner_size.y - style.FramePadding.y * 2.0f) >= scroll_y) + scroll_y = cursor_offset.y - inner_size.y + style.FramePadding.y * 2.0f; + const float scroll_max_y = ImMax((text_size.y + style.FramePadding.y * 2.0f) - inner_size.y, 0.0f); + scroll_y = ImClamp(scroll_y, 0.0f, scroll_max_y); + draw_pos.y += (draw_window->Scroll.y - scroll_y); // Manipulate cursor pos immediately avoid a frame of lag + draw_window->Scroll.y = scroll_y; + } + + state->CursorFollow = false; + } + + // Draw selection + const ImVec2 draw_scroll = ImVec2(state->ScrollX, 0.0f); + if (render_selection) + { + const ImWchar* text_selected_begin = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end); + const ImWchar* text_selected_end = text_begin + ImMax(state->Stb.select_start, state->Stb.select_end); + + ImU32 bg_color = GetColorU32(ImGuiCol_TextSelectedBg, render_cursor ? 1.0f : 0.6f); // FIXME: current code flow mandate that render_cursor is always true here, we are leaving the transparent one for tests. + float bg_offy_up = is_multiline ? 0.0f : -1.0f; // FIXME: those offsets should be part of the style? they don't play so well with multi-line selection. + float bg_offy_dn = is_multiline ? 0.0f : 2.0f; + ImVec2 rect_pos = draw_pos + select_start_offset - draw_scroll; + for (const ImWchar* p = text_selected_begin; p < text_selected_end; ) + { + if (rect_pos.y > clip_rect.w + g.FontSize) + break; + if (rect_pos.y < clip_rect.y) + { + //p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bit + //p = p ? p + 1 : text_selected_end; + while (p < text_selected_end) + if (*p++ == '\n') + break; + } + else + { + ImVec2 rect_size = InputTextCalcTextSizeW(p, text_selected_end, &p, NULL, true); + if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines + ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn)); + rect.ClipWith(clip_rect); + if (rect.Overlaps(clip_rect)) + draw_window->DrawList->AddRectFilled(rect.Min, rect.Max, bg_color); + } + rect_pos.x = draw_pos.x - draw_scroll.x; + rect_pos.y += g.FontSize; + } + } + + // We test for 'buf_display_max_length' as a way to avoid some pathological cases (e.g. single-line 1 MB string) which would make ImDrawList crash. + if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length) + { + ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text); + draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect); + } + + // Draw blinking cursor + if (render_cursor) + { + state->CursorAnim += io.DeltaTime; + bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (state->CursorAnim <= 0.0f) || ImFmod(state->CursorAnim, 1.20f) <= 0.80f; + ImVec2 cursor_screen_pos = ImFloor(draw_pos + cursor_offset - draw_scroll); + ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y - g.FontSize + 0.5f, cursor_screen_pos.x + 1.0f, cursor_screen_pos.y - 1.5f); + if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect)) + draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text)); + + // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.) + if (!is_readonly) + { + g.PlatformImeData.WantVisible = true; + g.PlatformImeData.InputPos = ImVec2(cursor_screen_pos.x - 1.0f, cursor_screen_pos.y - g.FontSize); + g.PlatformImeData.InputLineHeight = g.FontSize; + } + } + } + else + { + // Render text only (no selection, no cursor) + if (is_multiline) + text_size = ImVec2(inner_size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_display_end) * g.FontSize); // We don't need width + else if (!is_displaying_hint && g.ActiveId == id) + buf_display_end = buf_display + state->CurLenA; + else if (!is_displaying_hint) + buf_display_end = buf_display + strlen(buf_display); + + if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length) + { + ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text); + draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect); + } + } + + if (is_password && !is_displaying_hint) + PopFont(); + + if (is_multiline) + { + // For focus requests to work on our multiline we need to ensure our child ItemAdd() call specifies the ImGuiItemFlags_Inputable (ref issue #4761)... + Dummy(ImVec2(text_size.x, text_size.y + style.FramePadding.y)); + ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; + g.CurrentItemFlags |= ImGuiItemFlags_Inputable | ImGuiItemFlags_NoTabStop; + EndChild(); + item_data_backup.StatusFlags |= (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredWindow); + g.CurrentItemFlags = backup_item_flags; + + // ...and then we need to undo the group overriding last item data, which gets a bit messy as EndGroup() tries to forward scrollbar being active... + // FIXME: This quite messy/tricky, should attempt to get rid of the child window. + EndGroup(); + if (g.LastItemData.ID == 0) + { + g.LastItemData.ID = id; + g.LastItemData.InFlags = item_data_backup.InFlags; + g.LastItemData.StatusFlags = item_data_backup.StatusFlags; + } + } + + // Log as text + if (g.LogEnabled && (!is_password || is_displaying_hint)) + { + LogSetNextTextDecoration("{", "}"); + LogRenderedText(&draw_pos, buf_display, buf_display_end); + } + + if (label_size.x > 0) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); + + if (value_changed && !(flags & ImGuiInputTextFlags_NoMarkEdited)) + MarkItemEdited(id); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + if ((flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0) + return enter_pressed; + else + return value_changed; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc. +//------------------------------------------------------------------------- +// - ColorEdit3() +// - ColorEdit4() +// - ColorPicker3() +// - RenderColorRectWithAlphaCheckerboard() [Internal] +// - ColorPicker4() +// - ColorButton() +// - SetColorEditOptions() +// - ColorTooltip() [Internal] +// - ColorEditOptionsPopup() [Internal] +// - ColorPickerOptionsPopup() [Internal] +//------------------------------------------------------------------------- + +bool ImGui::ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags) +{ + return ColorEdit4(label, col, flags | ImGuiColorEditFlags_NoAlpha); +} + +// ColorEdit supports RGB and HSV inputs. In case of RGB input resulting color may have undefined hue and/or saturation. +// Since widget displays both RGB and HSV values we must preserve hue and saturation to prevent these values resetting. +static void ColorEditRestoreHS(const float* col, float* H, float* S, float* V) +{ + // This check is optional. Suppose we have two color widgets side by side, both widgets display different colors, but both colors have hue and/or saturation undefined. + // With color check: hue/saturation is preserved in one widget. Editing color in one widget would reset hue/saturation in another one. + // Without color check: common hue/saturation would be displayed in all widgets that have hue/saturation undefined. + // g.ColorEditLastColor is stored as ImU32 RGB value: this essentially gives us color equality check with reduced precision. + // Tiny external color changes would not be detected and this check would still pass. This is OK, since we only restore hue/saturation _only_ if they are undefined, + // therefore this change flipping hue/saturation from undefined to a very tiny value would still be represented in color picker. + ImGuiContext& g = *GImGui; + if (g.ColorEditLastColor != ImGui::ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0))) + return; + + // When S == 0, H is undefined. + // When H == 1 it wraps around to 0. + if (*S == 0.0f || (*H == 0.0f && g.ColorEditLastHue == 1)) + *H = g.ColorEditLastHue; + + // When V == 0, S is undefined. + if (*V == 0.0f) + *S = g.ColorEditLastSat; +} + +// Edit colors components (each component in 0.0f..1.0f range). +// See enum ImGuiColorEditFlags_ for available options. e.g. Only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. +// With typical options: Left-click on color square to open color picker. Right-click to open option menu. CTRL-Click over input fields to edit them and TAB to go to next item. +bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const float square_sz = GetFrameHeight(); + const float w_full = CalcItemWidth(); + const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); + const float w_inputs = w_full - w_button; + const char* label_display_end = FindRenderedTextEnd(label); + g.NextItemData.ClearFlags(); + + BeginGroup(); + PushID(label); + + // If we're not showing any slider there's no point in doing any HSV conversions + const ImGuiColorEditFlags flags_untouched = flags; + if (flags & ImGuiColorEditFlags_NoInputs) + flags = (flags & (~ImGuiColorEditFlags_DisplayMask_)) | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_NoOptions; + + // Context menu: display and modify options (before defaults are applied) + if (!(flags & ImGuiColorEditFlags_NoOptions)) + ColorEditOptionsPopup(col, flags); + + // Read stored options + if (!(flags & ImGuiColorEditFlags_DisplayMask_)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_DisplayMask_); + if (!(flags & ImGuiColorEditFlags_DataTypeMask_)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_DataTypeMask_); + if (!(flags & ImGuiColorEditFlags_PickerMask_)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_PickerMask_); + if (!(flags & ImGuiColorEditFlags_InputMask_)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_InputMask_); + flags |= (g.ColorEditOptions & ~(ImGuiColorEditFlags_DisplayMask_ | ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_PickerMask_ | ImGuiColorEditFlags_InputMask_)); + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DisplayMask_)); // Check that only 1 is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_)); // Check that only 1 is selected + + const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0; + const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0; + const int components = alpha ? 4 : 3; + + // Convert to the formats we need + float f[4] = { col[0], col[1], col[2], alpha ? col[3] : 1.0f }; + if ((flags & ImGuiColorEditFlags_InputHSV) && (flags & ImGuiColorEditFlags_DisplayRGB)) + ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); + else if ((flags & ImGuiColorEditFlags_InputRGB) && (flags & ImGuiColorEditFlags_DisplayHSV)) + { + // Hue is lost when converting from greyscale rgb (saturation=0). Restore it. + ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); + ColorEditRestoreHS(col, &f[0], &f[1], &f[2]); + } + int i[4] = { IM_F32_TO_INT8_UNBOUND(f[0]), IM_F32_TO_INT8_UNBOUND(f[1]), IM_F32_TO_INT8_UNBOUND(f[2]), IM_F32_TO_INT8_UNBOUND(f[3]) }; + + bool value_changed = false; + bool value_changed_as_float = false; + + const ImVec2 pos = window->DC.CursorPos; + const float inputs_offset_x = (style.ColorButtonPosition == ImGuiDir_Left) ? w_button : 0.0f; + window->DC.CursorPos.x = pos.x + inputs_offset_x; + + if ((flags & (ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) + { + // RGB/HSV 0..255 Sliders + const float w_item_one = ImMax(1.0f, IM_FLOOR((w_inputs - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); + const float w_item_last = ImMax(1.0f, IM_FLOOR(w_inputs - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); + + const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); + static const char* ids[4] = { "##X", "##Y", "##Z", "##W" }; + static const char* fmt_table_int[3][4] = + { + { "%3d", "%3d", "%3d", "%3d" }, // Short display + { "R:%3d", "G:%3d", "B:%3d", "A:%3d" }, // Long display for RGBA + { "H:%3d", "S:%3d", "V:%3d", "A:%3d" } // Long display for HSVA + }; + static const char* fmt_table_float[3][4] = + { + { "%0.3f", "%0.3f", "%0.3f", "%0.3f" }, // Short display + { "R:%0.3f", "G:%0.3f", "B:%0.3f", "A:%0.3f" }, // Long display for RGBA + { "H:%0.3f", "S:%0.3f", "V:%0.3f", "A:%0.3f" } // Long display for HSVA + }; + const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_DisplayHSV) ? 2 : 1; + + for (int n = 0; n < components; n++) + { + if (n > 0) + SameLine(0, style.ItemInnerSpacing.x); + SetNextItemWidth((n + 1 < components) ? w_item_one : w_item_last); + + // FIXME: When ImGuiColorEditFlags_HDR flag is passed HS values snap in weird ways when SV values go below 0. + if (flags & ImGuiColorEditFlags_Float) + { + value_changed |= DragFloat(ids[n], &f[n], 1.0f / 255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]); + value_changed_as_float |= value_changed; + } + else + { + value_changed |= DragInt(ids[n], &i[n], 1.0f, 0, hdr ? 0 : 255, fmt_table_int[fmt_idx][n]); + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + } + } + else if ((flags & ImGuiColorEditFlags_DisplayHex) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) + { + // RGB Hexadecimal Input + char buf[64]; + if (alpha) + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255), ImClamp(i[3], 0, 255)); + else + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255)); + SetNextItemWidth(w_inputs); + if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase)) + { + value_changed = true; + char* p = buf; + while (*p == '#' || ImCharIsBlankA(*p)) + p++; + i[0] = i[1] = i[2] = 0; + i[3] = 0xFF; // alpha default to 255 is not parsed by scanf (e.g. inputting #FFFFFF omitting alpha) + int r; + if (alpha) + r = sscanf(p, "%02X%02X%02X%02X", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2], (unsigned int*)&i[3]); // Treat at unsigned (%X is unsigned) + else + r = sscanf(p, "%02X%02X%02X", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2]); + IM_UNUSED(r); // Fixes C6031: Return value ignored: 'sscanf'. + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + } + + ImGuiWindow* picker_active_window = NULL; + if (!(flags & ImGuiColorEditFlags_NoSmallPreview)) + { + const float button_offset_x = ((flags & ImGuiColorEditFlags_NoInputs) || (style.ColorButtonPosition == ImGuiDir_Left)) ? 0.0f : w_inputs + style.ItemInnerSpacing.x; + window->DC.CursorPos = ImVec2(pos.x + button_offset_x, pos.y); + + const ImVec4 col_v4(col[0], col[1], col[2], alpha ? col[3] : 1.0f); + if (ColorButton("##ColorButton", col_v4, flags)) + { + if (!(flags & ImGuiColorEditFlags_NoPicker)) + { + // Store current color and open a picker + g.ColorPickerRef = col_v4; + OpenPopup("picker"); + SetNextWindowPos(g.LastItemData.Rect.GetBL() + ImVec2(0.0f, style.ItemSpacing.y)); + } + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + + if (BeginPopup("picker")) + { + picker_active_window = g.CurrentWindow; + if (label != label_display_end) + { + TextEx(label, label_display_end); + Spacing(); + } + ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_PickerMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar; + ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags_DisplayMask_ | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf; + SetNextItemWidth(square_sz * 12.0f); // Use 256 + bar sizes? + value_changed |= ColorPicker4("##picker", col, picker_flags, &g.ColorPickerRef.x); + EndPopup(); + } + } + + if (label != label_display_end && !(flags & ImGuiColorEditFlags_NoLabel)) + { + SameLine(0.0f, style.ItemInnerSpacing.x); + TextEx(label, label_display_end); + } + + // Convert back + if (value_changed && picker_active_window == NULL) + { + if (!value_changed_as_float) + for (int n = 0; n < 4; n++) + f[n] = i[n] / 255.0f; + if ((flags & ImGuiColorEditFlags_DisplayHSV) && (flags & ImGuiColorEditFlags_InputRGB)) + { + g.ColorEditLastHue = f[0]; + g.ColorEditLastSat = f[1]; + ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); + g.ColorEditLastColor = ColorConvertFloat4ToU32(ImVec4(f[0], f[1], f[2], 0)); + } + if ((flags & ImGuiColorEditFlags_DisplayRGB) && (flags & ImGuiColorEditFlags_InputHSV)) + ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); + + col[0] = f[0]; + col[1] = f[1]; + col[2] = f[2]; + if (alpha) + col[3] = f[3]; + } + + PopID(); + EndGroup(); + + // Drag and Drop Target + // NB: The flag test is merely an optional micro-optimization, BeginDragDropTarget() does the same test. + if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget()) + { + bool accepted_drag_drop = false; + if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) + { + memcpy((float*)col, payload->Data, sizeof(float) * 3); // Preserve alpha if any //-V512 + value_changed = accepted_drag_drop = true; + } + if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) + { + memcpy((float*)col, payload->Data, sizeof(float) * components); + value_changed = accepted_drag_drop = true; + } + + // Drag-drop payloads are always RGB + if (accepted_drag_drop && (flags & ImGuiColorEditFlags_InputHSV)) + ColorConvertRGBtoHSV(col[0], col[1], col[2], col[0], col[1], col[2]); + EndDragDropTarget(); + } + + // When picker is being actively used, use its active id so IsItemActive() will function on ColorEdit4(). + if (picker_active_window && g.ActiveId != 0 && g.ActiveIdWindow == picker_active_window) + g.LastItemData.ID = g.ActiveId; + + if (value_changed) + MarkItemEdited(g.LastItemData.ID); + + return value_changed; +} + +bool ImGui::ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags) +{ + float col4[4] = { col[0], col[1], col[2], 1.0f }; + if (!ColorPicker4(label, col4, flags | ImGuiColorEditFlags_NoAlpha)) + return false; + col[0] = col4[0]; col[1] = col4[1]; col[2] = col4[2]; + return true; +} + +// Helper for ColorPicker4() +static void RenderArrowsForVerticalBar(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, float bar_w, float alpha) +{ + ImU32 alpha8 = IM_F32_TO_INT8_SAT(alpha); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x + 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Right, IM_COL32(0,0,0,alpha8)); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x, pos.y), half_sz, ImGuiDir_Right, IM_COL32(255,255,255,alpha8)); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x - 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Left, IM_COL32(0,0,0,alpha8)); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x, pos.y), half_sz, ImGuiDir_Left, IM_COL32(255,255,255,alpha8)); +} + +// Note: ColorPicker4() only accesses 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. +// (In C++ the 'float col[4]' notation for a function argument is equivalent to 'float* col', we only specify a size to facilitate understanding of the code.) +// FIXME: we adjust the big color square height based on item width, which may cause a flickering feedback loop (if automatic height makes a vertical scrollbar appears, affecting automatic width..) +// FIXME: this is trying to be aware of style.Alpha but not fully correct. Also, the color wheel will have overlapping glitches with (style.Alpha < 1.0) +bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags, const float* ref_col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImDrawList* draw_list = window->DrawList; + ImGuiStyle& style = g.Style; + ImGuiIO& io = g.IO; + + const float width = CalcItemWidth(); + g.NextItemData.ClearFlags(); + + PushID(label); + BeginGroup(); + + if (!(flags & ImGuiColorEditFlags_NoSidePreview)) + flags |= ImGuiColorEditFlags_NoSmallPreview; + + // Context menu: display and store options. + if (!(flags & ImGuiColorEditFlags_NoOptions)) + ColorPickerOptionsPopup(col, flags); + + // Read stored options + if (!(flags & ImGuiColorEditFlags_PickerMask_)) + flags |= ((g.ColorEditOptions & ImGuiColorEditFlags_PickerMask_) ? g.ColorEditOptions : ImGuiColorEditFlags_DefaultOptions_) & ImGuiColorEditFlags_PickerMask_; + if (!(flags & ImGuiColorEditFlags_InputMask_)) + flags |= ((g.ColorEditOptions & ImGuiColorEditFlags_InputMask_) ? g.ColorEditOptions : ImGuiColorEditFlags_DefaultOptions_) & ImGuiColorEditFlags_InputMask_; + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_PickerMask_)); // Check that only 1 is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_)); // Check that only 1 is selected + if (!(flags & ImGuiColorEditFlags_NoOptions)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_AlphaBar); + + // Setup + int components = (flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4; + bool alpha_bar = (flags & ImGuiColorEditFlags_AlphaBar) && !(flags & ImGuiColorEditFlags_NoAlpha); + ImVec2 picker_pos = window->DC.CursorPos; + float square_sz = GetFrameHeight(); + float bars_width = square_sz; // Arbitrary smallish width of Hue/Alpha picking bars + float sv_picker_size = ImMax(bars_width * 1, width - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box + float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x; + float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x; + float bars_triangles_half_sz = IM_FLOOR(bars_width * 0.20f); + + float backup_initial_col[4]; + memcpy(backup_initial_col, col, components * sizeof(float)); + + float wheel_thickness = sv_picker_size * 0.08f; + float wheel_r_outer = sv_picker_size * 0.50f; + float wheel_r_inner = wheel_r_outer - wheel_thickness; + ImVec2 wheel_center(picker_pos.x + (sv_picker_size + bars_width)*0.5f, picker_pos.y + sv_picker_size * 0.5f); + + // Note: the triangle is displayed rotated with triangle_pa pointing to Hue, but most coordinates stays unrotated for logic. + float triangle_r = wheel_r_inner - (int)(sv_picker_size * 0.027f); + ImVec2 triangle_pa = ImVec2(triangle_r, 0.0f); // Hue point. + ImVec2 triangle_pb = ImVec2(triangle_r * -0.5f, triangle_r * -0.866025f); // Black point. + ImVec2 triangle_pc = ImVec2(triangle_r * -0.5f, triangle_r * +0.866025f); // White point. + + float H = col[0], S = col[1], V = col[2]; + float R = col[0], G = col[1], B = col[2]; + if (flags & ImGuiColorEditFlags_InputRGB) + { + // Hue is lost when converting from greyscale rgb (saturation=0). Restore it. + ColorConvertRGBtoHSV(R, G, B, H, S, V); + ColorEditRestoreHS(col, &H, &S, &V); + } + else if (flags & ImGuiColorEditFlags_InputHSV) + { + ColorConvertHSVtoRGB(H, S, V, R, G, B); + } + + bool value_changed = false, value_changed_h = false, value_changed_sv = false; + + PushItemFlag(ImGuiItemFlags_NoNav, true); + if (flags & ImGuiColorEditFlags_PickerHueWheel) + { + // Hue wheel + SV triangle logic + InvisibleButton("hsv", ImVec2(sv_picker_size + style.ItemInnerSpacing.x + bars_width, sv_picker_size)); + if (IsItemActive()) + { + ImVec2 initial_off = g.IO.MouseClickedPos[0] - wheel_center; + ImVec2 current_off = g.IO.MousePos - wheel_center; + float initial_dist2 = ImLengthSqr(initial_off); + if (initial_dist2 >= (wheel_r_inner - 1) * (wheel_r_inner - 1) && initial_dist2 <= (wheel_r_outer + 1) * (wheel_r_outer + 1)) + { + // Interactive with Hue wheel + H = ImAtan2(current_off.y, current_off.x) / IM_PI * 0.5f; + if (H < 0.0f) + H += 1.0f; + value_changed = value_changed_h = true; + } + float cos_hue_angle = ImCos(-H * 2.0f * IM_PI); + float sin_hue_angle = ImSin(-H * 2.0f * IM_PI); + if (ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, ImRotate(initial_off, cos_hue_angle, sin_hue_angle))) + { + // Interacting with SV triangle + ImVec2 current_off_unrotated = ImRotate(current_off, cos_hue_angle, sin_hue_angle); + if (!ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated)) + current_off_unrotated = ImTriangleClosestPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated); + float uu, vv, ww; + ImTriangleBarycentricCoords(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated, uu, vv, ww); + V = ImClamp(1.0f - vv, 0.0001f, 1.0f); + S = ImClamp(uu / V, 0.0001f, 1.0f); + value_changed = value_changed_sv = true; + } + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + } + else if (flags & ImGuiColorEditFlags_PickerHueBar) + { + // SV rectangle logic + InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size)); + if (IsItemActive()) + { + S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size - 1)); + V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); + + // Greatly reduces hue jitter and reset to 0 when hue == 255 and color is rapidly modified using SV square. + if (g.ColorEditLastColor == ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0))) + H = g.ColorEditLastHue; + value_changed = value_changed_sv = true; + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + + // Hue bar logic + SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y)); + InvisibleButton("hue", ImVec2(bars_width, sv_picker_size)); + if (IsItemActive()) + { + H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); + value_changed = value_changed_h = true; + } + } + + // Alpha bar logic + if (alpha_bar) + { + SetCursorScreenPos(ImVec2(bar1_pos_x, picker_pos.y)); + InvisibleButton("alpha", ImVec2(bars_width, sv_picker_size)); + if (IsItemActive()) + { + col[3] = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); + value_changed = true; + } + } + PopItemFlag(); // ImGuiItemFlags_NoNav + + if (!(flags & ImGuiColorEditFlags_NoSidePreview)) + { + SameLine(0, style.ItemInnerSpacing.x); + BeginGroup(); + } + + if (!(flags & ImGuiColorEditFlags_NoLabel)) + { + const char* label_display_end = FindRenderedTextEnd(label); + if (label != label_display_end) + { + if ((flags & ImGuiColorEditFlags_NoSidePreview)) + SameLine(0, style.ItemInnerSpacing.x); + TextEx(label, label_display_end); + } + } + + if (!(flags & ImGuiColorEditFlags_NoSidePreview)) + { + PushItemFlag(ImGuiItemFlags_NoNavDefaultFocus, true); + ImVec4 col_v4(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); + if ((flags & ImGuiColorEditFlags_NoLabel)) + Text("Current"); + + ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf | ImGuiColorEditFlags_NoTooltip; + ColorButton("##current", col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2)); + if (ref_col != NULL) + { + Text("Original"); + ImVec4 ref_col_v4(ref_col[0], ref_col[1], ref_col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : ref_col[3]); + if (ColorButton("##original", ref_col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2))) + { + memcpy(col, ref_col, components * sizeof(float)); + value_changed = true; + } + } + PopItemFlag(); + EndGroup(); + } + + // Convert back color to RGB + if (value_changed_h || value_changed_sv) + { + if (flags & ImGuiColorEditFlags_InputRGB) + { + ColorConvertHSVtoRGB(H, S, V, col[0], col[1], col[2]); + g.ColorEditLastHue = H; + g.ColorEditLastSat = S; + g.ColorEditLastColor = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0)); + } + else if (flags & ImGuiColorEditFlags_InputHSV) + { + col[0] = H; + col[1] = S; + col[2] = V; + } + } + + // R,G,B and H,S,V slider color editor + bool value_changed_fix_hue_wrap = false; + if ((flags & ImGuiColorEditFlags_NoInputs) == 0) + { + PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x); + ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; + ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker; + if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) + if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_DisplayRGB)) + { + // FIXME: Hackily differentiating using the DragInt (ActiveId != 0 && !ActiveIdAllowOverlap) vs. using the InputText or DropTarget. + // For the later we don't want to run the hue-wrap canceling code. If you are well versed in HSV picker please provide your input! (See #2050) + value_changed_fix_hue_wrap = (g.ActiveId != 0 && !g.ActiveIdAllowOverlap); + value_changed = true; + } + if (flags & ImGuiColorEditFlags_DisplayHSV || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) + value_changed |= ColorEdit4("##hsv", col, sub_flags | ImGuiColorEditFlags_DisplayHSV); + if (flags & ImGuiColorEditFlags_DisplayHex || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) + value_changed |= ColorEdit4("##hex", col, sub_flags | ImGuiColorEditFlags_DisplayHex); + PopItemWidth(); + } + + // Try to cancel hue wrap (after ColorEdit4 call), if any + if (value_changed_fix_hue_wrap && (flags & ImGuiColorEditFlags_InputRGB)) + { + float new_H, new_S, new_V; + ColorConvertRGBtoHSV(col[0], col[1], col[2], new_H, new_S, new_V); + if (new_H <= 0 && H > 0) + { + if (new_V <= 0 && V != new_V) + ColorConvertHSVtoRGB(H, S, new_V <= 0 ? V * 0.5f : new_V, col[0], col[1], col[2]); + else if (new_S <= 0) + ColorConvertHSVtoRGB(H, new_S <= 0 ? S * 0.5f : new_S, new_V, col[0], col[1], col[2]); + } + } + + if (value_changed) + { + if (flags & ImGuiColorEditFlags_InputRGB) + { + R = col[0]; + G = col[1]; + B = col[2]; + ColorConvertRGBtoHSV(R, G, B, H, S, V); + ColorEditRestoreHS(col, &H, &S, &V); // Fix local Hue as display below will use it immediately. + } + else if (flags & ImGuiColorEditFlags_InputHSV) + { + H = col[0]; + S = col[1]; + V = col[2]; + ColorConvertHSVtoRGB(H, S, V, R, G, B); + } + } + + const int style_alpha8 = IM_F32_TO_INT8_SAT(style.Alpha); + const ImU32 col_black = IM_COL32(0,0,0,style_alpha8); + const ImU32 col_white = IM_COL32(255,255,255,style_alpha8); + const ImU32 col_midgrey = IM_COL32(128,128,128,style_alpha8); + const ImU32 col_hues[6 + 1] = { IM_COL32(255,0,0,style_alpha8), IM_COL32(255,255,0,style_alpha8), IM_COL32(0,255,0,style_alpha8), IM_COL32(0,255,255,style_alpha8), IM_COL32(0,0,255,style_alpha8), IM_COL32(255,0,255,style_alpha8), IM_COL32(255,0,0,style_alpha8) }; + + ImVec4 hue_color_f(1, 1, 1, style.Alpha); ColorConvertHSVtoRGB(H, 1, 1, hue_color_f.x, hue_color_f.y, hue_color_f.z); + ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f); + ImU32 user_col32_striped_of_alpha = ColorConvertFloat4ToU32(ImVec4(R, G, B, style.Alpha)); // Important: this is still including the main rendering/style alpha!! + + ImVec2 sv_cursor_pos; + + if (flags & ImGuiColorEditFlags_PickerHueWheel) + { + // Render Hue Wheel + const float aeps = 0.5f / wheel_r_outer; // Half a pixel arc length in radians (2pi cancels out). + const int segment_per_arc = ImMax(4, (int)wheel_r_outer / 12); + for (int n = 0; n < 6; n++) + { + const float a0 = (n) /6.0f * 2.0f * IM_PI - aeps; + const float a1 = (n+1.0f)/6.0f * 2.0f * IM_PI + aeps; + const int vert_start_idx = draw_list->VtxBuffer.Size; + draw_list->PathArcTo(wheel_center, (wheel_r_inner + wheel_r_outer)*0.5f, a0, a1, segment_per_arc); + draw_list->PathStroke(col_white, 0, wheel_thickness); + const int vert_end_idx = draw_list->VtxBuffer.Size; + + // Paint colors over existing vertices + ImVec2 gradient_p0(wheel_center.x + ImCos(a0) * wheel_r_inner, wheel_center.y + ImSin(a0) * wheel_r_inner); + ImVec2 gradient_p1(wheel_center.x + ImCos(a1) * wheel_r_inner, wheel_center.y + ImSin(a1) * wheel_r_inner); + ShadeVertsLinearColorGradientKeepAlpha(draw_list, vert_start_idx, vert_end_idx, gradient_p0, gradient_p1, col_hues[n], col_hues[n + 1]); + } + + // Render Cursor + preview on Hue Wheel + float cos_hue_angle = ImCos(H * 2.0f * IM_PI); + float sin_hue_angle = ImSin(H * 2.0f * IM_PI); + ImVec2 hue_cursor_pos(wheel_center.x + cos_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f, wheel_center.y + sin_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f); + float hue_cursor_rad = value_changed_h ? wheel_thickness * 0.65f : wheel_thickness * 0.55f; + int hue_cursor_segments = ImClamp((int)(hue_cursor_rad / 1.4f), 9, 32); + draw_list->AddCircleFilled(hue_cursor_pos, hue_cursor_rad, hue_color32, hue_cursor_segments); + draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad + 1, col_midgrey, hue_cursor_segments); + draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, col_white, hue_cursor_segments); + + // Render SV triangle (rotated according to hue) + ImVec2 tra = wheel_center + ImRotate(triangle_pa, cos_hue_angle, sin_hue_angle); + ImVec2 trb = wheel_center + ImRotate(triangle_pb, cos_hue_angle, sin_hue_angle); + ImVec2 trc = wheel_center + ImRotate(triangle_pc, cos_hue_angle, sin_hue_angle); + ImVec2 uv_white = GetFontTexUvWhitePixel(); + draw_list->PrimReserve(6, 6); + draw_list->PrimVtx(tra, uv_white, hue_color32); + draw_list->PrimVtx(trb, uv_white, hue_color32); + draw_list->PrimVtx(trc, uv_white, col_white); + draw_list->PrimVtx(tra, uv_white, 0); + draw_list->PrimVtx(trb, uv_white, col_black); + draw_list->PrimVtx(trc, uv_white, 0); + draw_list->AddTriangle(tra, trb, trc, col_midgrey, 1.5f); + sv_cursor_pos = ImLerp(ImLerp(trc, tra, ImSaturate(S)), trb, ImSaturate(1 - V)); + } + else if (flags & ImGuiColorEditFlags_PickerHueBar) + { + // Render SV Square + draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), col_white, hue_color32, hue_color32, col_white); + draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0, 0, col_black, col_black); + RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0.0f); + sv_cursor_pos.x = ImClamp(IM_ROUND(picker_pos.x + ImSaturate(S) * sv_picker_size), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much + sv_cursor_pos.y = ImClamp(IM_ROUND(picker_pos.y + ImSaturate(1 - V) * sv_picker_size), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2); + + // Render Hue Bar + for (int i = 0; i < 6; ++i) + draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), col_hues[i], col_hues[i], col_hues[i + 1], col_hues[i + 1]); + float bar0_line_y = IM_ROUND(picker_pos.y + H * sv_picker_size); + RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f); + RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); + } + + // Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range) + float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f; + draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, user_col32_striped_of_alpha, 12); + draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad + 1, col_midgrey, 12); + draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, col_white, 12); + + // Render alpha bar + if (alpha_bar) + { + float alpha = ImSaturate(col[3]); + ImRect bar1_bb(bar1_pos_x, picker_pos.y, bar1_pos_x + bars_width, picker_pos.y + sv_picker_size); + RenderColorRectWithAlphaCheckerboard(draw_list, bar1_bb.Min, bar1_bb.Max, 0, bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f)); + draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, user_col32_striped_of_alpha, user_col32_striped_of_alpha, user_col32_striped_of_alpha & ~IM_COL32_A_MASK, user_col32_striped_of_alpha & ~IM_COL32_A_MASK); + float bar1_line_y = IM_ROUND(picker_pos.y + (1.0f - alpha) * sv_picker_size); + RenderFrameBorder(bar1_bb.Min, bar1_bb.Max, 0.0f); + RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); + } + + EndGroup(); + + if (value_changed && memcmp(backup_initial_col, col, components * sizeof(float)) == 0) + value_changed = false; + if (value_changed) + MarkItemEdited(g.LastItemData.ID); + + PopID(); + + return value_changed; +} + +// A little color square. Return true when clicked. +// FIXME: May want to display/ignore the alpha component in the color display? Yet show it in the tooltip. +// 'desc_id' is not called 'label' because we don't display it next to the button, but only in the tooltip. +// Note that 'col' may be encoded in HSV if ImGuiColorEditFlags_InputHSV is set. +bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags, const ImVec2& size_arg) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiID id = window->GetID(desc_id); + const float default_size = GetFrameHeight(); + const ImVec2 size(size_arg.x == 0.0f ? default_size : size_arg.x, size_arg.y == 0.0f ? default_size : size_arg.y); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + ItemSize(bb, (size.y >= default_size) ? g.Style.FramePadding.y : 0.0f); + if (!ItemAdd(bb, id)) + return false; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held); + + if (flags & ImGuiColorEditFlags_NoAlpha) + flags &= ~(ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf); + + ImVec4 col_rgb = col; + if (flags & ImGuiColorEditFlags_InputHSV) + ColorConvertHSVtoRGB(col_rgb.x, col_rgb.y, col_rgb.z, col_rgb.x, col_rgb.y, col_rgb.z); + + ImVec4 col_rgb_without_alpha(col_rgb.x, col_rgb.y, col_rgb.z, 1.0f); + float grid_step = ImMin(size.x, size.y) / 2.99f; + float rounding = ImMin(g.Style.FrameRounding, grid_step * 0.5f); + ImRect bb_inner = bb; + float off = 0.0f; + if ((flags & ImGuiColorEditFlags_NoBorder) == 0) + { + off = -0.75f; // The border (using Col_FrameBg) tends to look off when color is near-opaque and rounding is enabled. This offset seemed like a good middle ground to reduce those artifacts. + bb_inner.Expand(off); + } + if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col_rgb.w < 1.0f) + { + float mid_x = IM_ROUND((bb_inner.Min.x + bb_inner.Max.x) * 0.5f); + RenderColorRectWithAlphaCheckerboard(window->DrawList, ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawFlags_RoundCornersRight); + window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_rgb_without_alpha), rounding, ImDrawFlags_RoundCornersLeft); + } + else + { + // Because GetColorU32() multiplies by the global style Alpha and we don't want to display a checkerboard if the source code had no alpha + ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaPreview) ? col_rgb : col_rgb_without_alpha; + if (col_source.w < 1.0f) + RenderColorRectWithAlphaCheckerboard(window->DrawList, bb_inner.Min, bb_inner.Max, GetColorU32(col_source), grid_step, ImVec2(off, off), rounding); + else + window->DrawList->AddRectFilled(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), rounding); + } + RenderNavHighlight(bb, id); + if ((flags & ImGuiColorEditFlags_NoBorder) == 0) + { + if (g.Style.FrameBorderSize > 0.0f) + RenderFrameBorder(bb.Min, bb.Max, rounding); + else + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color button are often in need of some sort of border + } + + // Drag and Drop Source + // NB: The ActiveId test is merely an optional micro-optimization, BeginDragDropSource() does the same test. + if (g.ActiveId == id && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropSource()) + { + if (flags & ImGuiColorEditFlags_NoAlpha) + SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F, &col_rgb, sizeof(float) * 3, ImGuiCond_Once); + else + SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, &col_rgb, sizeof(float) * 4, ImGuiCond_Once); + ColorButton(desc_id, col, flags); + SameLine(); + TextEx("Color"); + EndDragDropSource(); + } + + // Tooltip + if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered) + ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)); + + return pressed; +} + +// Initialize/override default color options +void ImGui::SetColorEditOptions(ImGuiColorEditFlags flags) +{ + ImGuiContext& g = *GImGui; + if ((flags & ImGuiColorEditFlags_DisplayMask_) == 0) + flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_DisplayMask_; + if ((flags & ImGuiColorEditFlags_DataTypeMask_) == 0) + flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_DataTypeMask_; + if ((flags & ImGuiColorEditFlags_PickerMask_) == 0) + flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_PickerMask_; + if ((flags & ImGuiColorEditFlags_InputMask_) == 0) + flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_InputMask_; + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DisplayMask_)); // Check only 1 option is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DataTypeMask_)); // Check only 1 option is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_PickerMask_)); // Check only 1 option is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_)); // Check only 1 option is selected + g.ColorEditOptions = flags; +} + +// Note: only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. +void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags) +{ + ImGuiContext& g = *GImGui; + + BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None); + const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text; + if (text_end > text) + { + TextEx(text, text_end); + Separator(); + } + + ImVec2 sz(g.FontSize * 3 + g.Style.FramePadding.y * 2, g.FontSize * 3 + g.Style.FramePadding.y * 2); + ImVec4 cf(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); + int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]); + ColorButton("##preview", cf, (flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz); + SameLine(); + if ((flags & ImGuiColorEditFlags_InputRGB) || !(flags & ImGuiColorEditFlags_InputMask_)) + { + if (flags & ImGuiColorEditFlags_NoAlpha) + Text("#%02X%02X%02X\nR: %d, G: %d, B: %d\n(%.3f, %.3f, %.3f)", cr, cg, cb, cr, cg, cb, col[0], col[1], col[2]); + else + Text("#%02X%02X%02X%02X\nR:%d, G:%d, B:%d, A:%d\n(%.3f, %.3f, %.3f, %.3f)", cr, cg, cb, ca, cr, cg, cb, ca, col[0], col[1], col[2], col[3]); + } + else if (flags & ImGuiColorEditFlags_InputHSV) + { + if (flags & ImGuiColorEditFlags_NoAlpha) + Text("H: %.3f, S: %.3f, V: %.3f", col[0], col[1], col[2]); + else + Text("H: %.3f, S: %.3f, V: %.3f, A: %.3f", col[0], col[1], col[2], col[3]); + } + EndTooltip(); +} + +void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) +{ + bool allow_opt_inputs = !(flags & ImGuiColorEditFlags_DisplayMask_); + bool allow_opt_datatype = !(flags & ImGuiColorEditFlags_DataTypeMask_); + if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup("context")) + return; + ImGuiContext& g = *GImGui; + ImGuiColorEditFlags opts = g.ColorEditOptions; + if (allow_opt_inputs) + { + if (RadioButton("RGB", (opts & ImGuiColorEditFlags_DisplayRGB) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayRGB; + if (RadioButton("HSV", (opts & ImGuiColorEditFlags_DisplayHSV) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayHSV; + if (RadioButton("Hex", (opts & ImGuiColorEditFlags_DisplayHex) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayHex; + } + if (allow_opt_datatype) + { + if (allow_opt_inputs) Separator(); + if (RadioButton("0..255", (opts & ImGuiColorEditFlags_Uint8) != 0)) opts = (opts & ~ImGuiColorEditFlags_DataTypeMask_) | ImGuiColorEditFlags_Uint8; + if (RadioButton("0.00..1.00", (opts & ImGuiColorEditFlags_Float) != 0)) opts = (opts & ~ImGuiColorEditFlags_DataTypeMask_) | ImGuiColorEditFlags_Float; + } + + if (allow_opt_inputs || allow_opt_datatype) + Separator(); + if (Button("Copy as..", ImVec2(-1, 0))) + OpenPopup("Copy"); + if (BeginPopup("Copy")) + { + int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]); + char buf[64]; + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%.3ff, %.3ff, %.3ff, %.3ff)", col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); + if (Selectable(buf)) + SetClipboardText(buf); + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%d,%d,%d,%d)", cr, cg, cb, ca); + if (Selectable(buf)) + SetClipboardText(buf); + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", cr, cg, cb); + if (Selectable(buf)) + SetClipboardText(buf); + if (!(flags & ImGuiColorEditFlags_NoAlpha)) + { + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", cr, cg, cb, ca); + if (Selectable(buf)) + SetClipboardText(buf); + } + EndPopup(); + } + + g.ColorEditOptions = opts; + EndPopup(); +} + +void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags) +{ + bool allow_opt_picker = !(flags & ImGuiColorEditFlags_PickerMask_); + bool allow_opt_alpha_bar = !(flags & ImGuiColorEditFlags_NoAlpha) && !(flags & ImGuiColorEditFlags_AlphaBar); + if ((!allow_opt_picker && !allow_opt_alpha_bar) || !BeginPopup("context")) + return; + ImGuiContext& g = *GImGui; + if (allow_opt_picker) + { + ImVec2 picker_size(g.FontSize * 8, ImMax(g.FontSize * 8 - (GetFrameHeight() + g.Style.ItemInnerSpacing.x), 1.0f)); // FIXME: Picker size copied from main picker function + PushItemWidth(picker_size.x); + for (int picker_type = 0; picker_type < 2; picker_type++) + { + // Draw small/thumbnail version of each picker type (over an invisible button for selection) + if (picker_type > 0) Separator(); + PushID(picker_type); + ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoSidePreview | (flags & ImGuiColorEditFlags_NoAlpha); + if (picker_type == 0) picker_flags |= ImGuiColorEditFlags_PickerHueBar; + if (picker_type == 1) picker_flags |= ImGuiColorEditFlags_PickerHueWheel; + ImVec2 backup_pos = GetCursorScreenPos(); + if (Selectable("##selectable", false, 0, picker_size)) // By default, Selectable() is closing popup + g.ColorEditOptions = (g.ColorEditOptions & ~ImGuiColorEditFlags_PickerMask_) | (picker_flags & ImGuiColorEditFlags_PickerMask_); + SetCursorScreenPos(backup_pos); + ImVec4 previewing_ref_col; + memcpy(&previewing_ref_col, ref_col, sizeof(float) * ((picker_flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4)); + ColorPicker4("##previewing_picker", &previewing_ref_col.x, picker_flags); + PopID(); + } + PopItemWidth(); + } + if (allow_opt_alpha_bar) + { + if (allow_opt_picker) Separator(); + CheckboxFlags("Alpha Bar", &g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar); + } + EndPopup(); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: TreeNode, CollapsingHeader, etc. +//------------------------------------------------------------------------- +// - TreeNode() +// - TreeNodeV() +// - TreeNodeEx() +// - TreeNodeExV() +// - TreeNodeBehavior() [Internal] +// - TreePush() +// - TreePop() +// - GetTreeNodeToLabelSpacing() +// - SetNextItemOpen() +// - CollapsingHeader() +//------------------------------------------------------------------------- + +bool ImGui::TreeNode(const char* str_id, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + bool is_open = TreeNodeExV(str_id, 0, fmt, args); + va_end(args); + return is_open; +} + +bool ImGui::TreeNode(const void* ptr_id, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + bool is_open = TreeNodeExV(ptr_id, 0, fmt, args); + va_end(args); + return is_open; +} + +bool ImGui::TreeNode(const char* label) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + return TreeNodeBehavior(window->GetID(label), 0, label, NULL); +} + +bool ImGui::TreeNodeV(const char* str_id, const char* fmt, va_list args) +{ + return TreeNodeExV(str_id, 0, fmt, args); +} + +bool ImGui::TreeNodeV(const void* ptr_id, const char* fmt, va_list args) +{ + return TreeNodeExV(ptr_id, 0, fmt, args); +} + +bool ImGui::TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + return TreeNodeBehavior(window->GetID(label), flags, label, NULL); +} + +bool ImGui::TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + bool is_open = TreeNodeExV(str_id, flags, fmt, args); + va_end(args); + return is_open; +} + +bool ImGui::TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + bool is_open = TreeNodeExV(ptr_id, flags, fmt, args); + va_end(args); + return is_open; +} + +bool ImGui::TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const char* label_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); + return TreeNodeBehavior(window->GetID(str_id), flags, g.TempBuffer, label_end); +} + +bool ImGui::TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const char* label_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args); + return TreeNodeBehavior(window->GetID(ptr_id), flags, g.TempBuffer, label_end); +} + +bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags) +{ + if (flags & ImGuiTreeNodeFlags_Leaf) + return true; + + // We only write to the tree storage if the user clicks (or explicitly use the SetNextItemOpen function) + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiStorage* storage = window->DC.StateStorage; + + bool is_open; + if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasOpen) + { + if (g.NextItemData.OpenCond & ImGuiCond_Always) + { + is_open = g.NextItemData.OpenVal; + storage->SetInt(id, is_open); + } + else + { + // We treat ImGuiCond_Once and ImGuiCond_FirstUseEver the same because tree node state are not saved persistently. + const int stored_value = storage->GetInt(id, -1); + if (stored_value == -1) + { + is_open = g.NextItemData.OpenVal; + storage->SetInt(id, is_open); + } + else + { + is_open = stored_value != 0; + } + } + } + else + { + is_open = storage->GetInt(id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0; + } + + // When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior). + // NB- If we are above max depth we still allow manually opened nodes to be logged. + if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && (window->DC.TreeDepth - g.LogDepthRef) < g.LogDepthToExpand) + is_open = true; + + return is_open; +} + +bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const bool display_frame = (flags & ImGuiTreeNodeFlags_Framed) != 0; + const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, ImMin(window->DC.CurrLineTextBaseOffset, style.FramePadding.y)); + + if (!label_end) + label_end = FindRenderedTextEnd(label); + const ImVec2 label_size = CalcTextSize(label, label_end, false); + + // We vertically grow up to current line height up the typical widget height. + const float frame_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), label_size.y + padding.y * 2); + ImRect frame_bb; + frame_bb.Min.x = (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x; + frame_bb.Min.y = window->DC.CursorPos.y; + frame_bb.Max.x = window->WorkRect.Max.x; + frame_bb.Max.y = window->DC.CursorPos.y + frame_height; + if (display_frame) + { + // Framed header expand a little outside the default padding, to the edge of InnerClipRect + // (FIXME: May remove this at some point and make InnerClipRect align with WindowPadding.x instead of WindowPadding.x*0.5f) + frame_bb.Min.x -= IM_FLOOR(window->WindowPadding.x * 0.5f - 1.0f); + frame_bb.Max.x += IM_FLOOR(window->WindowPadding.x * 0.5f); + } + + const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapser arrow width + Spacing + const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it + const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x * 2 : 0.0f); // Include collapser + ImVec2 text_pos(window->DC.CursorPos.x + text_offset_x, window->DC.CursorPos.y + text_offset_y); + ItemSize(ImVec2(text_width, frame_height), padding.y); + + // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing + ImRect interact_bb = frame_bb; + if (!display_frame && (flags & (ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth)) == 0) + interact_bb.Max.x = frame_bb.Min.x + text_width + style.ItemSpacing.x * 2.0f; + + // Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child. + // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop(). + // This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero. + const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0; + bool is_open = TreeNodeBehaviorIsOpen(id, flags); + if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) + window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth); + + bool item_add = ItemAdd(interact_bb, id); + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDisplayRect; + g.LastItemData.DisplayRect = frame_bb; + + if (!item_add) + { + if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) + TreePushOverrideID(id); + IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0)); + return is_open; + } + + ImGuiButtonFlags button_flags = ImGuiTreeNodeFlags_None; + if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) + button_flags |= ImGuiButtonFlags_AllowItemOverlap; + if (!is_leaf) + button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; + + // We allow clicking on the arrow section with keyboard modifiers held, in order to easily + // allow browsing a tree while preserving selection with code implementing multi-selection patterns. + // When clicking on the rest of the tree node we always disallow keyboard modifiers. + const float arrow_hit_x1 = (text_pos.x - text_offset_x) - style.TouchExtraPadding.x; + const float arrow_hit_x2 = (text_pos.x - text_offset_x) + (g.FontSize + padding.x * 2.0f) + style.TouchExtraPadding.x; + const bool is_mouse_x_over_arrow = (g.IO.MousePos.x >= arrow_hit_x1 && g.IO.MousePos.x < arrow_hit_x2); + if (window != g.HoveredWindow || !is_mouse_x_over_arrow) + button_flags |= ImGuiButtonFlags_NoKeyModifiers; + + // Open behaviors can be altered with the _OpenOnArrow and _OnOnDoubleClick flags. + // Some alteration have subtle effects (e.g. toggle on MouseUp vs MouseDown events) due to requirements for multi-selection and drag and drop support. + // - Single-click on label = Toggle on MouseUp (default, when _OpenOnArrow=0) + // - Single-click on arrow = Toggle on MouseDown (when _OpenOnArrow=0) + // - Single-click on arrow = Toggle on MouseDown (when _OpenOnArrow=1) + // - Double-click on label = Toggle on MouseDoubleClick (when _OpenOnDoubleClick=1) + // - Double-click on arrow = Toggle on MouseDoubleClick (when _OpenOnDoubleClick=1 and _OpenOnArrow=0) + // It is rather standard that arrow click react on Down rather than Up. + // We set ImGuiButtonFlags_PressedOnClickRelease on OpenOnDoubleClick because we want the item to be active on the initial MouseDown in order for drag and drop to work. + if (is_mouse_x_over_arrow) + button_flags |= ImGuiButtonFlags_PressedOnClick; + else if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) + button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; + else + button_flags |= ImGuiButtonFlags_PressedOnClickRelease; + + bool selected = (flags & ImGuiTreeNodeFlags_Selected) != 0; + const bool was_selected = selected; + + bool hovered, held; + bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags); + bool toggled = false; + if (!is_leaf) + { + if (pressed && g.DragDropHoldJustPressedId != id) + { + if ((flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) == 0 || (g.NavActivateId == id)) + toggled = true; + if (flags & ImGuiTreeNodeFlags_OpenOnArrow) + toggled |= is_mouse_x_over_arrow && !g.NavDisableMouseHover; // Lightweight equivalent of IsMouseHoveringRect() since ButtonBehavior() already did the job + if ((flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) && g.IO.MouseClickedCount[0] == 2) + toggled = true; + } + else if (pressed && g.DragDropHoldJustPressedId == id) + { + IM_ASSERT(button_flags & ImGuiButtonFlags_PressedOnDragDropHold); + if (!is_open) // When using Drag and Drop "hold to open" we keep the node highlighted after opening, but never close it again. + toggled = true; + } + + if (g.NavId == id && g.NavMoveDir == ImGuiDir_Left && is_open) + { + toggled = true; + NavMoveRequestCancel(); + } + if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right && !is_open) // If there's something upcoming on the line we may want to give it the priority? + { + toggled = true; + NavMoveRequestCancel(); + } + + if (toggled) + { + is_open = !is_open; + window->DC.StateStorage->SetInt(id, is_open); + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledOpen; + } + } + if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) + SetItemAllowOverlap(); + + // In this branch, TreeNodeBehavior() cannot toggle the selection so this will never trigger. + if (selected != was_selected) //-V547 + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection; + + // Render + const ImU32 text_col = GetColorU32(ImGuiCol_Text); + ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin; + if (display_frame) + { + // Framed type + const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding); + RenderNavHighlight(frame_bb, id, nav_highlight_flags); + if (flags & ImGuiTreeNodeFlags_Bullet) + RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col); + else if (!is_leaf) + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); + else // Leaf without bullet, left-adjusted text + text_pos.x -= text_offset_x; + if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton) + frame_bb.Max.x -= g.FontSize + style.FramePadding.x; + + if (g.LogEnabled) + LogSetNextTextDecoration("###", "###"); + RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); + } + else + { + // Unframed typed for tree nodes + if (hovered || selected) + { + const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false); + } + RenderNavHighlight(frame_bb, id, nav_highlight_flags); + if (flags & ImGuiTreeNodeFlags_Bullet) + RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col); + else if (!is_leaf) + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f); + if (g.LogEnabled) + LogSetNextTextDecoration(">", NULL); + RenderText(text_pos, label, label_end, false); + } + + if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) + TreePushOverrideID(id); + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0)); + return is_open; +} + +void ImGui::TreePush(const char* str_id) +{ + ImGuiWindow* window = GetCurrentWindow(); + Indent(); + window->DC.TreeDepth++; + PushID(str_id); +} + +void ImGui::TreePush(const void* ptr_id) +{ + ImGuiWindow* window = GetCurrentWindow(); + Indent(); + window->DC.TreeDepth++; + PushID(ptr_id); +} + +void ImGui::TreePushOverrideID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + Indent(); + window->DC.TreeDepth++; + PushOverrideID(id); +} + +void ImGui::TreePop() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + Unindent(); + + window->DC.TreeDepth--; + ImU32 tree_depth_mask = (1 << window->DC.TreeDepth); + + // Handle Left arrow to move to parent tree node (when ImGuiTreeNodeFlags_NavLeftJumpsBackHere is enabled) + if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) + if (g.NavIdIsAlive && (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask)) + { + SetNavID(window->IDStack.back(), g.NavLayer, 0, ImRect()); + NavMoveRequestCancel(); + } + window->DC.TreeJumpToParentOnPopMask &= tree_depth_mask - 1; + + IM_ASSERT(window->IDStack.Size > 1); // There should always be 1 element in the IDStack (pushed during window creation). If this triggers you called TreePop/PopID too much. + PopID(); +} + +// Horizontal distance preceding label when using TreeNode() or Bullet() +float ImGui::GetTreeNodeToLabelSpacing() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + (g.Style.FramePadding.x * 2.0f); +} + +// Set next TreeNode/CollapsingHeader open state. +void ImGui::SetNextItemOpen(bool is_open, ImGuiCond cond) +{ + ImGuiContext& g = *GImGui; + if (g.CurrentWindow->SkipItems) + return; + g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasOpen; + g.NextItemData.OpenVal = is_open; + g.NextItemData.OpenCond = cond ? cond : ImGuiCond_Always; +} + +// CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag). +// This is basically the same as calling TreeNodeEx(label, ImGuiTreeNodeFlags_CollapsingHeader). You can remove the _NoTreePushOnOpen flag if you want behavior closer to normal TreeNode(). +bool ImGui::CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + return TreeNodeBehavior(window->GetID(label), flags | ImGuiTreeNodeFlags_CollapsingHeader, label); +} + +// p_visible == NULL : regular collapsing header +// p_visible != NULL && *p_visible == true : show a small close button on the corner of the header, clicking the button will set *p_visible = false +// p_visible != NULL && *p_visible == false : do not show the header at all +// Do not mistake this with the Open state of the header itself, which you can adjust with SetNextItemOpen() or ImGuiTreeNodeFlags_DefaultOpen. +bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + if (p_visible && !*p_visible) + return false; + + ImGuiID id = window->GetID(label); + flags |= ImGuiTreeNodeFlags_CollapsingHeader; + if (p_visible) + flags |= ImGuiTreeNodeFlags_AllowItemOverlap | ImGuiTreeNodeFlags_ClipLabelForTrailingButton; + bool is_open = TreeNodeBehavior(id, flags, label); + if (p_visible != NULL) + { + // Create a small overlapping close button + // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc. + // FIXME: CloseButton can overlap into text, need find a way to clip the text somehow. + ImGuiContext& g = *GImGui; + ImGuiLastItemData last_item_backup = g.LastItemData; + float button_size = g.FontSize; + float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x * 2.0f - button_size); + float button_y = g.LastItemData.Rect.Min.y; + ImGuiID close_button_id = GetIDWithSeed("#CLOSE", NULL, id); + if (CloseButton(close_button_id, ImVec2(button_x, button_y))) + *p_visible = false; + g.LastItemData = last_item_backup; + } + + return is_open; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Selectable +//------------------------------------------------------------------------- +// - Selectable() +//------------------------------------------------------------------------- + +// Tip: pass a non-visible label (e.g. "##hello") then you can use the space to draw other text or image. +// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id. +// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags. +// FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. +bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + + // Submit label or explicit size to ItemSize(), whereas ItemAdd() will submit a larger/spanning rectangle. + ImGuiID id = window->GetID(label); + ImVec2 label_size = CalcTextSize(label, NULL, true); + ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y); + ImVec2 pos = window->DC.CursorPos; + pos.y += window->DC.CurrLineTextBaseOffset; + ItemSize(size, 0.0f); + + // Fill horizontal space + // We don't support (size < 0.0f) in Selectable() because the ItemSpacing extension would make explicitly right-aligned sizes not visibly match other widgets. + const bool span_all_columns = (flags & ImGuiSelectableFlags_SpanAllColumns) != 0; + const float min_x = span_all_columns ? window->ParentWorkRect.Min.x : pos.x; + const float max_x = span_all_columns ? window->ParentWorkRect.Max.x : window->WorkRect.Max.x; + if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth)) + size.x = ImMax(label_size.x, max_x - min_x); + + // Text stays at the submission position, but bounding box may be extended on both sides + const ImVec2 text_min = pos; + const ImVec2 text_max(min_x + size.x, pos.y + size.y); + + // Selectables are meant to be tightly packed together with no click-gap, so we extend their box to cover spacing between selectable. + ImRect bb(min_x, pos.y, text_max.x, text_max.y); + if ((flags & ImGuiSelectableFlags_NoPadWithHalfSpacing) == 0) + { + const float spacing_x = span_all_columns ? 0.0f : style.ItemSpacing.x; + const float spacing_y = style.ItemSpacing.y; + const float spacing_L = IM_FLOOR(spacing_x * 0.50f); + const float spacing_U = IM_FLOOR(spacing_y * 0.50f); + bb.Min.x -= spacing_L; + bb.Min.y -= spacing_U; + bb.Max.x += (spacing_x - spacing_L); + bb.Max.y += (spacing_y - spacing_U); + } + //if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); } + + // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackground for every Selectable.. + const float backup_clip_rect_min_x = window->ClipRect.Min.x; + const float backup_clip_rect_max_x = window->ClipRect.Max.x; + if (span_all_columns) + { + window->ClipRect.Min.x = window->ParentWorkRect.Min.x; + window->ClipRect.Max.x = window->ParentWorkRect.Max.x; + } + + const bool disabled_item = (flags & ImGuiSelectableFlags_Disabled) != 0; + const bool item_add = ItemAdd(bb, id, NULL, disabled_item ? ImGuiItemFlags_Disabled : ImGuiItemFlags_None); + if (span_all_columns) + { + window->ClipRect.Min.x = backup_clip_rect_min_x; + window->ClipRect.Max.x = backup_clip_rect_max_x; + } + + if (!item_add) + return false; + + const bool disabled_global = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; + if (disabled_item && !disabled_global) // Only testing this as an optimization + BeginDisabled(); + + // FIXME: We can standardize the behavior of those two, we could also keep the fast path of override ClipRect + full push on render only, + // which would be advantageous since most selectable are not selected. + if (span_all_columns && window->DC.CurrentColumns) + PushColumnsBackground(); + else if (span_all_columns && g.CurrentTable) + TablePushBackgroundChannel(); + + // We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries + ImGuiButtonFlags button_flags = 0; + if (flags & ImGuiSelectableFlags_NoHoldingActiveID) { button_flags |= ImGuiButtonFlags_NoHoldingActiveId; } + if (flags & ImGuiSelectableFlags_SelectOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; } + if (flags & ImGuiSelectableFlags_SelectOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; } + if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; } + if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; } + + const bool was_selected = selected; + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); + + // Auto-select when moved into + // - This will be more fully fleshed in the range-select branch + // - This is not exposed as it won't nicely work with some user side handling of shift/control + // - We cannot do 'if (g.NavJustMovedToId != id) { selected = false; pressed = was_selected; }' for two reasons + // - (1) it would require focus scope to be set, need exposing PushFocusScope() or equivalent (e.g. BeginSelection() calling PushFocusScope()) + // - (2) usage will fail with clipped items + // The multi-select API aim to fix those issues, e.g. may be replaced with a BeginSelection() API. + if ((flags & ImGuiSelectableFlags_SelectOnNav) && g.NavJustMovedToId != 0 && g.NavJustMovedToFocusScopeId == window->DC.NavFocusScopeIdCurrent) + if (g.NavJustMovedToId == id) + selected = pressed = true; + + // Update NavId when clicking or when Hovering (this doesn't happen on most widgets), so navigation can be resumed with gamepad/keyboard + if (pressed || (hovered && (flags & ImGuiSelectableFlags_SetNavIdOnHover))) + { + if (!g.NavDisableMouseHover && g.NavWindow == window && g.NavLayer == window->DC.NavLayerCurrent) + { + SetNavID(id, window->DC.NavLayerCurrent, window->DC.NavFocusScopeIdCurrent, WindowRectAbsToRel(window, bb)); // (bb == NavRect) + g.NavDisableHighlight = true; + } + } + if (pressed) + MarkItemEdited(id); + + if (flags & ImGuiSelectableFlags_AllowItemOverlap) + SetItemAllowOverlap(); + + // In this branch, Selectable() cannot toggle the selection so this will never trigger. + if (selected != was_selected) //-V547 + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection; + + // Render + if (held && (flags & ImGuiSelectableFlags_DrawHoveredWhenHeld)) + hovered = true; + if (hovered || selected) + { + const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + RenderFrame(bb.Min, bb.Max, col, false, 0.0f); + } + RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); + + if (span_all_columns && window->DC.CurrentColumns) + PopColumnsBackground(); + else if (span_all_columns && g.CurrentTable) + TablePopBackgroundChannel(); + + RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb); + + // Automatically close popups + if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(g.LastItemData.InFlags & ImGuiItemFlags_SelectableDontClosePopup)) + CloseCurrentPopup(); + + if (disabled_item && !disabled_global) + EndDisabled(); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return pressed; //-V1020 +} + +bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) +{ + if (Selectable(label, *p_selected, flags, size_arg)) + { + *p_selected = !*p_selected; + return true; + } + return false; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: ListBox +//------------------------------------------------------------------------- +// - BeginListBox() +// - EndListBox() +// - ListBox() +//------------------------------------------------------------------------- + +// Tip: To have a list filling the entire window width, use size.x = -FLT_MIN and pass an non-visible label e.g. "##empty" +// Tip: If your vertical size is calculated from an item count (e.g. 10 * item_height) consider adding a fractional part to facilitate seeing scrolling boundaries (e.g. 10.25 * item_height). +bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImGuiStyle& style = g.Style; + const ImGuiID id = GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + // Size default to hold ~7.25 items. + // Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. + ImVec2 size = ImFloor(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f)); + ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y)); + ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); + ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + g.NextItemData.ClearFlags(); + + if (!IsRectVisible(bb.Min, bb.Max)) + { + ItemSize(bb.GetSize(), style.FramePadding.y); + ItemAdd(bb, 0, &frame_bb); + return false; + } + + // FIXME-OPT: We could omit the BeginGroup() if label_size.x but would need to omit the EndGroup() as well. + BeginGroup(); + if (label_size.x > 0.0f) + { + ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y); + RenderText(label_pos, label); + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size); + } + + BeginChildFrame(id, frame_bb.GetSize()); + return true; +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +// OBSOLETED in 1.81 (from February 2021) +bool ImGui::ListBoxHeader(const char* label, int items_count, int height_in_items) +{ + // If height_in_items == -1, default height is maximum 7. + ImGuiContext& g = *GImGui; + float height_in_items_f = (height_in_items < 0 ? ImMin(items_count, 7) : height_in_items) + 0.25f; + ImVec2 size; + size.x = 0.0f; + size.y = GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f; + return BeginListBox(label, size); +} +#endif + +void ImGui::EndListBox() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT((window->Flags & ImGuiWindowFlags_ChildWindow) && "Mismatched BeginListBox/EndListBox calls. Did you test the return value of BeginListBox?"); + IM_UNUSED(window); + + EndChildFrame(); + EndGroup(); // This is only required to be able to do IsItemXXX query on the whole ListBox including label +} + +bool ImGui::ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_items) +{ + const bool value_changed = ListBox(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_items); + return value_changed; +} + +// This is merely a helper around BeginListBox(), EndListBox(). +// Considering using those directly to submit custom data or store selection differently. +bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items) +{ + ImGuiContext& g = *GImGui; + + // Calculate size from "height_in_items" + if (height_in_items < 0) + height_in_items = ImMin(items_count, 7); + float height_in_items_f = height_in_items + 0.25f; + ImVec2 size(0.0f, ImFloor(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f)); + + if (!BeginListBox(label, size)) + return false; + + // Assume all items have even height (= 1 line of text). If you need items of different height, + // you can create a custom version of ListBox() in your code without using the clipper. + bool value_changed = false; + ImGuiListClipper clipper; + clipper.Begin(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to. + while (clipper.Step()) + for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + { + const char* item_text; + if (!items_getter(data, i, &item_text)) + item_text = "*Unknown item*"; + + PushID(i); + const bool item_selected = (i == *current_item); + if (Selectable(item_text, item_selected)) + { + *current_item = i; + value_changed = true; + } + if (item_selected) + SetItemDefaultFocus(); + PopID(); + } + EndListBox(); + + if (value_changed) + MarkItemEdited(g.LastItemData.ID); + + return value_changed; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: PlotLines, PlotHistogram +//------------------------------------------------------------------------- +// - PlotEx() [Internal] +// - PlotLines() +// - PlotHistogram() +//------------------------------------------------------------------------- +// Plot/Graph widgets are not very good. +// Consider writing your own, or using a third-party one, see: +// - ImPlot https://github.com/epezent/implot +// - others https://github.com/ocornut/imgui/wiki/Useful-Extensions +//------------------------------------------------------------------------- + +int ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return -1; + + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + + const ImVec2 label_size = CalcTextSize(label, NULL, true); + if (frame_size.x == 0.0f) + frame_size.x = CalcItemWidth(); + if (frame_size.y == 0.0f) + frame_size.y = label_size.y + (style.FramePadding.y * 2); + + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); + const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding); + const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, 0, &frame_bb)) + return -1; + const bool hovered = ItemHoverable(frame_bb, id); + + // Determine scale from values if not specified + if (scale_min == FLT_MAX || scale_max == FLT_MAX) + { + float v_min = FLT_MAX; + float v_max = -FLT_MAX; + for (int i = 0; i < values_count; i++) + { + const float v = values_getter(data, i); + if (v != v) // Ignore NaN values + continue; + v_min = ImMin(v_min, v); + v_max = ImMax(v_max, v); + } + if (scale_min == FLT_MAX) + scale_min = v_min; + if (scale_max == FLT_MAX) + scale_max = v_max; + } + + RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); + + const int values_count_min = (plot_type == ImGuiPlotType_Lines) ? 2 : 1; + int idx_hovered = -1; + if (values_count >= values_count_min) + { + int res_w = ImMin((int)frame_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); + int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); + + // Tooltip on hover + if (hovered && inner_bb.Contains(g.IO.MousePos)) + { + const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f); + const int v_idx = (int)(t * item_count); + IM_ASSERT(v_idx >= 0 && v_idx < values_count); + + const float v0 = values_getter(data, (v_idx + values_offset) % values_count); + const float v1 = values_getter(data, (v_idx + 1 + values_offset) % values_count); + if (plot_type == ImGuiPlotType_Lines) + SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx + 1, v1); + else if (plot_type == ImGuiPlotType_Histogram) + SetTooltip("%d: %8.4g", v_idx, v0); + idx_hovered = v_idx; + } + + const float t_step = 1.0f / (float)res_w; + const float inv_scale = (scale_min == scale_max) ? 0.0f : (1.0f / (scale_max - scale_min)); + + float v0 = values_getter(data, (0 + values_offset) % values_count); + float t0 = 0.0f; + ImVec2 tp0 = ImVec2( t0, 1.0f - ImSaturate((v0 - scale_min) * inv_scale) ); // Point in the normalized space of our target rectangle + float histogram_zero_line_t = (scale_min * scale_max < 0.0f) ? (1 + scale_min * inv_scale) : (scale_min < 0.0f ? 0.0f : 1.0f); // Where does the zero line stands + + const ImU32 col_base = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram); + const ImU32 col_hovered = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered); + + for (int n = 0; n < res_w; n++) + { + const float t1 = t0 + t_step; + const int v1_idx = (int)(t0 * item_count + 0.5f); + IM_ASSERT(v1_idx >= 0 && v1_idx < values_count); + const float v1 = values_getter(data, (v1_idx + values_offset + 1) % values_count); + const ImVec2 tp1 = ImVec2( t1, 1.0f - ImSaturate((v1 - scale_min) * inv_scale) ); + + // NB: Draw calls are merged together by the DrawList system. Still, we should render our batch are lower level to save a bit of CPU. + ImVec2 pos0 = ImLerp(inner_bb.Min, inner_bb.Max, tp0); + ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, histogram_zero_line_t)); + if (plot_type == ImGuiPlotType_Lines) + { + window->DrawList->AddLine(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); + } + else if (plot_type == ImGuiPlotType_Histogram) + { + if (pos1.x >= pos0.x + 2.0f) + pos1.x -= 1.0f; + window->DrawList->AddRectFilled(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); + } + + t0 = t1; + tp0 = tp1; + } + } + + // Text overlay + if (overlay_text) + RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, overlay_text, NULL, NULL, ImVec2(0.5f, 0.0f)); + + if (label_size.x > 0.0f) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label); + + // Return hovered index or -1 if none are hovered. + // This is currently not exposed in the public API because we need a larger redesign of the whole thing, but in the short-term we are making it available in PlotEx(). + return idx_hovered; +} + +struct ImGuiPlotArrayGetterData +{ + const float* Values; + int Stride; + + ImGuiPlotArrayGetterData(const float* values, int stride) { Values = values; Stride = stride; } +}; + +static float Plot_ArrayGetter(void* data, int idx) +{ + ImGuiPlotArrayGetterData* plot_data = (ImGuiPlotArrayGetterData*)data; + const float v = *(const float*)(const void*)((const unsigned char*)plot_data->Values + (size_t)idx * plot_data->Stride); + return v; +} + +void ImGui::PlotLines(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride) +{ + ImGuiPlotArrayGetterData data(values, stride); + PlotEx(ImGuiPlotType_Lines, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); +} + +void ImGui::PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size) +{ + PlotEx(ImGuiPlotType_Lines, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); +} + +void ImGui::PlotHistogram(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride) +{ + ImGuiPlotArrayGetterData data(values, stride); + PlotEx(ImGuiPlotType_Histogram, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); +} + +void ImGui::PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size) +{ + PlotEx(ImGuiPlotType_Histogram, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Value helpers +// Those is not very useful, legacy API. +//------------------------------------------------------------------------- +// - Value() +//------------------------------------------------------------------------- + +void ImGui::Value(const char* prefix, bool b) +{ + Text("%s: %s", prefix, (b ? "true" : "false")); +} + +void ImGui::Value(const char* prefix, int v) +{ + Text("%s: %d", prefix, v); +} + +void ImGui::Value(const char* prefix, unsigned int v) +{ + Text("%s: %d", prefix, v); +} + +void ImGui::Value(const char* prefix, float v, const char* float_format) +{ + if (float_format) + { + char fmt[64]; + ImFormatString(fmt, IM_ARRAYSIZE(fmt), "%%s: %s", float_format); + Text(fmt, prefix, v); + } + else + { + Text("%s: %.3f", prefix, v); + } +} + +//------------------------------------------------------------------------- +// [SECTION] MenuItem, BeginMenu, EndMenu, etc. +//------------------------------------------------------------------------- +// - ImGuiMenuColumns [Internal] +// - BeginMenuBar() +// - EndMenuBar() +// - BeginMainMenuBar() +// - EndMainMenuBar() +// - BeginMenu() +// - EndMenu() +// - MenuItemEx() [Internal] +// - MenuItem() +//------------------------------------------------------------------------- + +// Helpers for internal use +void ImGuiMenuColumns::Update(float spacing, bool window_reappearing) +{ + if (window_reappearing) + memset(Widths, 0, sizeof(Widths)); + Spacing = (ImU16)spacing; + CalcNextTotalWidth(true); + memset(Widths, 0, sizeof(Widths)); + TotalWidth = NextTotalWidth; + NextTotalWidth = 0; +} + +void ImGuiMenuColumns::CalcNextTotalWidth(bool update_offsets) +{ + ImU16 offset = 0; + bool want_spacing = false; + for (int i = 0; i < IM_ARRAYSIZE(Widths); i++) + { + ImU16 width = Widths[i]; + if (want_spacing && width > 0) + offset += Spacing; + want_spacing |= (width > 0); + if (update_offsets) + { + if (i == 1) { OffsetLabel = offset; } + if (i == 2) { OffsetShortcut = offset; } + if (i == 3) { OffsetMark = offset; } + } + offset += width; + } + NextTotalWidth = offset; +} + +float ImGuiMenuColumns::DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark) +{ + Widths[0] = ImMax(Widths[0], (ImU16)w_icon); + Widths[1] = ImMax(Widths[1], (ImU16)w_label); + Widths[2] = ImMax(Widths[2], (ImU16)w_shortcut); + Widths[3] = ImMax(Widths[3], (ImU16)w_mark); + CalcNextTotalWidth(false); + return (float)ImMax(TotalWidth, NextTotalWidth); +} + +// FIXME: Provided a rectangle perhaps e.g. a BeginMenuBarEx() could be used anywhere.. +// Currently the main responsibility of this function being to setup clip-rect + horizontal layout + menu navigation layer. +// Ideally we also want this to be responsible for claiming space out of the main window scrolling rectangle, in which case ImGuiWindowFlags_MenuBar will become unnecessary. +// Then later the same system could be used for multiple menu-bars, scrollbars, side-bars. +bool ImGui::BeginMenuBar() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + if (!(window->Flags & ImGuiWindowFlags_MenuBar)) + return false; + + IM_ASSERT(!window->DC.MenuBarAppending); + BeginGroup(); // Backup position on layer 0 // FIXME: Misleading to use a group for that backup/restore + PushID("##menubar"); + + // We don't clip with current window clipping rectangle as it is already set to the area below. However we clip with window full rect. + // We remove 1 worth of rounding to Max.x to that text in long menus and small windows don't tend to display over the lower-right rounded area, which looks particularly glitchy. + ImRect bar_rect = window->MenuBarRect(); + ImRect clip_rect(IM_ROUND(bar_rect.Min.x + window->WindowBorderSize), IM_ROUND(bar_rect.Min.y + window->WindowBorderSize), IM_ROUND(ImMax(bar_rect.Min.x, bar_rect.Max.x - ImMax(window->WindowRounding, window->WindowBorderSize))), IM_ROUND(bar_rect.Max.y)); + clip_rect.ClipWith(window->OuterRectClipped); + PushClipRect(clip_rect.Min, clip_rect.Max, false); + + // We overwrite CursorMaxPos because BeginGroup sets it to CursorPos (essentially the .EmitItem hack in EndMenuBar() would need something analogous here, maybe a BeginGroupEx() with flags). + window->DC.CursorPos = window->DC.CursorMaxPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffset.x, bar_rect.Min.y + window->DC.MenuBarOffset.y); + window->DC.LayoutType = ImGuiLayoutType_Horizontal; + window->DC.IsSameLine = false; + window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; + window->DC.MenuBarAppending = true; + AlignTextToFramePadding(); + return true; +} + +void ImGui::EndMenuBar() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + ImGuiContext& g = *GImGui; + + // Nav: When a move request within one of our child menu failed, capture the request to navigate among our siblings. + if (NavMoveRequestButNoResultYet() && (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right) && (g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu)) + { + // Try to find out if the request is for one of our child menu + ImGuiWindow* nav_earliest_child = g.NavWindow; + while (nav_earliest_child->ParentWindow && (nav_earliest_child->ParentWindow->Flags & ImGuiWindowFlags_ChildMenu)) + nav_earliest_child = nav_earliest_child->ParentWindow; + if (nav_earliest_child->ParentWindow == window && nav_earliest_child->DC.ParentLayoutType == ImGuiLayoutType_Horizontal && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded) == 0) + { + // To do so we claim focus back, restore NavId and then process the movement request for yet another frame. + // This involve a one-frame delay which isn't very problematic in this situation. We could remove it by scoring in advance for multiple window (probably not worth bothering) + const ImGuiNavLayer layer = ImGuiNavLayer_Menu; + IM_ASSERT(window->DC.NavLayersActiveMaskNext & (1 << layer)); // Sanity check + FocusWindow(window); + SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); + g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection. + g.NavDisableMouseHover = g.NavMousePosDirty = true; + NavMoveRequestForward(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags, g.NavMoveScrollFlags); // Repeat + } + } + + IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'" + IM_ASSERT(window->Flags & ImGuiWindowFlags_MenuBar); + IM_ASSERT(window->DC.MenuBarAppending); + PopClipRect(); + PopID(); + window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->Pos.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos. + g.GroupStack.back().EmitItem = false; + EndGroup(); // Restore position on layer 0 + window->DC.LayoutType = ImGuiLayoutType_Vertical; + window->DC.IsSameLine = false; + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + window->DC.MenuBarAppending = false; +} + +// Important: calling order matters! +// FIXME: Somehow overlapping with docking tech. +// FIXME: The "rect-cut" aspect of this could be formalized into a lower-level helper (rect-cut: https://halt.software/dead-simple-layouts) +bool ImGui::BeginViewportSideBar(const char* name, ImGuiViewport* viewport_p, ImGuiDir dir, float axis_size, ImGuiWindowFlags window_flags) +{ + IM_ASSERT(dir != ImGuiDir_None); + + ImGuiWindow* bar_window = FindWindowByName(name); + if (bar_window == NULL || bar_window->BeginCount == 0) + { + // Calculate and set window size/position + ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)(viewport_p ? viewport_p : GetMainViewport()); + ImRect avail_rect = viewport->GetBuildWorkRect(); + ImGuiAxis axis = (dir == ImGuiDir_Up || dir == ImGuiDir_Down) ? ImGuiAxis_Y : ImGuiAxis_X; + ImVec2 pos = avail_rect.Min; + if (dir == ImGuiDir_Right || dir == ImGuiDir_Down) + pos[axis] = avail_rect.Max[axis] - axis_size; + ImVec2 size = avail_rect.GetSize(); + size[axis] = axis_size; + SetNextWindowPos(pos); + SetNextWindowSize(size); + + // Report our size into work area (for next frame) using actual window size + if (dir == ImGuiDir_Up || dir == ImGuiDir_Left) + viewport->BuildWorkOffsetMin[axis] += axis_size; + else if (dir == ImGuiDir_Down || dir == ImGuiDir_Right) + viewport->BuildWorkOffsetMax[axis] -= axis_size; + } + + window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove; + PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0)); // Lift normal size constraint + bool is_open = Begin(name, NULL, window_flags); + PopStyleVar(2); + + return is_open; +} + +bool ImGui::BeginMainMenuBar() +{ + ImGuiContext& g = *GImGui; + ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)GetMainViewport(); + + // For the main menu bar, which cannot be moved, we honor g.Style.DisplaySafeAreaPadding to ensure text can be visible on a TV set. + // FIXME: This could be generalized as an opt-in way to clamp window->DC.CursorStartPos to avoid SafeArea? + // FIXME: Consider removing support for safe area down the line... it's messy. Nowadays consoles have support for TV calibration in OS settings. + g.NextWindowData.MenuBarOffsetMinVal = ImVec2(g.Style.DisplaySafeAreaPadding.x, ImMax(g.Style.DisplaySafeAreaPadding.y - g.Style.FramePadding.y, 0.0f)); + ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_MenuBar; + float height = GetFrameHeight(); + bool is_open = BeginViewportSideBar("##MainMenuBar", viewport, ImGuiDir_Up, height, window_flags); + g.NextWindowData.MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f); + + if (is_open) + BeginMenuBar(); + else + End(); + return is_open; +} + +void ImGui::EndMainMenuBar() +{ + EndMenuBar(); + + // When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window + // FIXME: With this strategy we won't be able to restore a NULL focus. + ImGuiContext& g = *GImGui; + if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest) + FocusTopMostWindowUnderOne(g.NavWindow, NULL); + + End(); +} + +static bool IsRootOfOpenMenuSet() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if ((g.OpenPopupStack.Size <= g.BeginPopupStack.Size) || (window->Flags & ImGuiWindowFlags_ChildMenu)) + return false; + + // Initially we used 'OpenParentId' to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) based on parent ID. + // This would however prevent the use of e.g. PuhsID() user code submitting menus. + // Previously this worked between popup and a first child menu because the first child menu always had the _ChildWindow flag, + // making hovering on parent popup possible while first child menu was focused - but this was generally a bug with other side effects. + // Instead we don't treat Popup specifically (in order to consistently support menu features in them), maybe the first child menu of a Popup + // doesn't have the _ChildWindow flag, and we rely on this IsRootOfOpenMenuSet() check to allow hovering between root window/popup and first chilld menu. + const ImGuiPopupData* upper_popup = &g.OpenPopupStack[g.BeginPopupStack.Size]; + return (/*upper_popup->OpenParentId == window->IDStack.back() &&*/ upper_popup->Window && (upper_popup->Window->Flags & ImGuiWindowFlags_ChildMenu)); +} + +bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + bool menu_is_open = IsPopupOpen(id, ImGuiPopupFlags_None); + + // Sub-menus are ChildWindow so that mouse can be hovering across them (otherwise top-most popup menu would steal focus and not allow hovering on parent menu) + // The first menu in a hierarchy isn't so hovering doesn't get accross (otherwise e.g. resizing borders with ImGuiButtonFlags_FlattenChildren would react), but top-most BeginMenu() will bypass that limitation. + ImGuiWindowFlags flags = ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoNavFocus; + if (window->Flags & ImGuiWindowFlags_ChildMenu) + flags |= ImGuiWindowFlags_ChildWindow; + + // If a menu with same the ID was already submitted, we will append to it, matching the behavior of Begin(). + // We are relying on a O(N) search - so O(N log N) over the frame - which seems like the most efficient for the expected small amount of BeginMenu() calls per frame. + // If somehow this is ever becoming a problem we can switch to use e.g. ImGuiStorage mapping key to last frame used. + if (g.MenusIdSubmittedThisFrame.contains(id)) + { + if (menu_is_open) + menu_is_open = BeginPopupEx(id, flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display) + else + g.NextWindowData.ClearFlags(); // we behave like Begin() and need to consume those values + return menu_is_open; + } + + // Tag menu as used. Next time BeginMenu() with same ID is called it will append to existing menu + g.MenusIdSubmittedThisFrame.push_back(id); + + ImVec2 label_size = CalcTextSize(label, NULL, true); + + // Odd hack to allow hovering across menus of a same menu-set (otherwise we wouldn't be able to hover parent without always being a Child window) + const bool menuset_is_open = IsRootOfOpenMenuSet(); + ImGuiWindow* backed_nav_window = g.NavWindow; + if (menuset_is_open) + g.NavWindow = window; + + // The reference position stored in popup_pos will be used by Begin() to find a suitable position for the child menu, + // However the final position is going to be different! It is chosen by FindBestWindowPosForPopup(). + // e.g. Menus tend to overlap each other horizontally to amplify relative Z-ordering. + ImVec2 popup_pos, pos = window->DC.CursorPos; + PushID(label); + if (!enabled) + BeginDisabled(); + const ImGuiMenuColumns* offsets = &window->DC.MenuColumns; + bool pressed; + const ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_SelectOnClick | ImGuiSelectableFlags_DontClosePopups; + if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) + { + // Menu inside an horizontal menu bar + // Selectable extend their highlight by half ItemSpacing in each direction. + // For ChildMenu, the popup position will be overwritten by the call to FindBestWindowPosForPopup() in Begin() + popup_pos = ImVec2(pos.x - 1.0f - IM_FLOOR(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight()); + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); + PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); + float w = label_size.x; + ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); + pressed = Selectable("", menu_is_open, selectable_flags, ImVec2(w, 0.0f)); + RenderText(text_pos, label); + PopStyleVar(); + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + } + else + { + // Menu inside a regular/vertical menu + // (In a typical menu window where all items are BeginMenu() or MenuItem() calls, extra_w will always be 0.0f. + // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. + popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y); + float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; + float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); + float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, 0.0f, checkmark_w); // Feedback to next frame + float extra_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); + ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); + pressed = Selectable("", menu_is_open, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, 0.0f)); + RenderText(text_pos, label); + if (icon_w > 0.0f) + RenderText(pos + ImVec2(offsets->OffsetIcon, 0.0f), icon); + RenderArrow(window->DrawList, pos + ImVec2(offsets->OffsetMark + extra_w + g.FontSize * 0.30f, 0.0f), GetColorU32(ImGuiCol_Text), ImGuiDir_Right); + } + if (!enabled) + EndDisabled(); + + const bool hovered = (g.HoveredId == id) && enabled && !g.NavDisableMouseHover; + if (menuset_is_open) + g.NavWindow = backed_nav_window; + + bool want_open = false; + bool want_close = false; + if (window->DC.LayoutType == ImGuiLayoutType_Vertical) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu)) + { + // Close menu when not hovering it anymore unless we are moving roughly in the direction of the menu + // Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers, so menus feels more reactive. + bool moving_toward_child_menu = false; + ImGuiWindow* child_menu_window = (g.BeginPopupStack.Size < g.OpenPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].SourceWindow == window) ? g.OpenPopupStack[g.BeginPopupStack.Size].Window : NULL; + if (g.HoveredWindow == window && child_menu_window != NULL && !(window->Flags & ImGuiWindowFlags_MenuBar)) + { + float ref_unit = g.FontSize; // FIXME-DPI + ImRect next_window_rect = child_menu_window->Rect(); + ImVec2 ta = (g.IO.MousePos - g.IO.MouseDelta); + ImVec2 tb = (window->Pos.x < child_menu_window->Pos.x) ? next_window_rect.GetTL() : next_window_rect.GetTR(); + ImVec2 tc = (window->Pos.x < child_menu_window->Pos.x) ? next_window_rect.GetBL() : next_window_rect.GetBR(); + float extra = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f); // add a bit of extra slack. + ta.x += (window->Pos.x < child_menu_window->Pos.x) ? -0.5f : +0.5f; // to avoid numerical issues (FIXME: ??) + tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -ref_unit * 8.0f); // triangle has maximum height to limit the slope and the bias toward large sub-menus + tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +ref_unit * 8.0f); + moving_toward_child_menu = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos); + //GetForegroundDrawList()->AddTriangleFilled(ta, tb, tc, moving_toward_other_child_menu ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); // [DEBUG] + } + + // The 'HovereWindow == window' check creates an inconsistency (e.g. moving away from menu slowly tends to hit same window, whereas moving away fast does not) + // But we also need to not close the top-menu menu when moving over void. Perhaps we should extend the triangle check to a larger polygon. + // (Remember to test this on BeginPopup("A")->BeginMenu("B") sequence which behaves slightly differently as B isn't a Child of A and hovering isn't shared.) + if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu) + want_close = true; + + // Open + if (!menu_is_open && pressed) // Click/activate to open + want_open = true; + else if (!menu_is_open && hovered && !moving_toward_child_menu) // Hover to open + want_open = true; + if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right) // Nav-Right to open + { + want_open = true; + NavMoveRequestCancel(); + } + } + else + { + // Menu bar + if (menu_is_open && pressed && menuset_is_open) // Click an open menu again to close it + { + want_close = true; + want_open = menu_is_open = false; + } + else if (pressed || (hovered && menuset_is_open && !menu_is_open)) // First click to open, then hover to open others + { + want_open = true; + } + else if (g.NavId == id && g.NavMoveDir == ImGuiDir_Down) // Nav-Down to open + { + want_open = true; + NavMoveRequestCancel(); + } + } + + if (!enabled) // explicitly close if an open menu becomes disabled, facilitate users code a lot in pattern such as 'if (BeginMenu("options", has_object)) { ..use object.. }' + want_close = true; + if (want_close && IsPopupOpen(id, ImGuiPopupFlags_None)) + ClosePopupToLevel(g.BeginPopupStack.Size, true); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Openable | (menu_is_open ? ImGuiItemStatusFlags_Opened : 0)); + PopID(); + + if (!menu_is_open && want_open && g.OpenPopupStack.Size > g.BeginPopupStack.Size) + { + // Don't recycle same menu level in the same frame, first close the other menu and yield for a frame. + OpenPopup(label); + return false; + } + + menu_is_open |= want_open; + if (want_open) + OpenPopup(label); + + if (menu_is_open) + { + SetNextWindowPos(popup_pos, ImGuiCond_Always); // Note: this is super misleading! The value will serve as reference for FindBestWindowPosForPopup(), not actual pos. + PushStyleVar(ImGuiStyleVar_ChildRounding, style.PopupRounding); // First level will use _PopupRounding, subsequent will use _ChildRounding + menu_is_open = BeginPopupEx(id, flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display) + PopStyleVar(); + } + else + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + } + + return menu_is_open; +} + +bool ImGui::BeginMenu(const char* label, bool enabled) +{ + return BeginMenuEx(label, NULL, enabled); +} + +void ImGui::EndMenu() +{ + // Nav: When a left move request _within our child menu_ failed, close ourselves (the _parent_ menu). + // A menu doesn't close itself because EndMenuBar() wants the catch the last Left<>Right inputs. + // However, it means that with the current code, a BeginMenu() from outside another menu or a menu-bar won't be closable with the Left direction. + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.NavMoveDir == ImGuiDir_Left && NavMoveRequestButNoResultYet() && window->DC.LayoutType == ImGuiLayoutType_Vertical) + if (g.NavWindow && (g.NavWindow->RootWindowForNav->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->RootWindowForNav->ParentWindow == window) + { + ClosePopupToLevel(g.BeginPopupStack.Size, true); + NavMoveRequestCancel(); + } + + EndPopup(); +} + +bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut, bool selected, bool enabled) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + ImVec2 pos = window->DC.CursorPos; + ImVec2 label_size = CalcTextSize(label, NULL, true); + + const bool menuset_is_open = IsRootOfOpenMenuSet(); + ImGuiWindow* backed_nav_window = g.NavWindow; + if (menuset_is_open) + g.NavWindow = window; + + // We've been using the equivalent of ImGuiSelectableFlags_SetNavIdOnHover on all Selectable() since early Nav system days (commit 43ee5d73), + // but I am unsure whether this should be kept at all. For now moved it to be an opt-in feature used by menus only. + bool pressed; + PushID(label); + if (!enabled) + BeginDisabled(); + + const ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_SelectOnRelease | ImGuiSelectableFlags_SetNavIdOnHover; + const ImGuiMenuColumns* offsets = &window->DC.MenuColumns; + if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) + { + // Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful + // Note that in this situation: we don't render the shortcut, we render a highlight instead of the selected tick mark. + float w = label_size.x; + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); + ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); + PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); + pressed = Selectable("", selected, selectable_flags, ImVec2(w, 0.0f)); + PopStyleVar(); + RenderText(text_pos, label); + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + } + else + { + // Menu item inside a vertical menu + // (In a typical menu window where all items are BeginMenu() or MenuItem() calls, extra_w will always be 0.0f. + // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. + float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; + float shortcut_w = (shortcut && shortcut[0]) ? CalcTextSize(shortcut, NULL).x : 0.0f; + float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); + float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, shortcut_w, checkmark_w); // Feedback for next frame + float stretch_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); + pressed = Selectable("", false, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, 0.0f)); + RenderText(pos + ImVec2(offsets->OffsetLabel, 0.0f), label); + if (icon_w > 0.0f) + RenderText(pos + ImVec2(offsets->OffsetIcon, 0.0f), icon); + if (shortcut_w > 0.0f) + { + PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); + RenderText(pos + ImVec2(offsets->OffsetShortcut + stretch_w, 0.0f), shortcut, NULL, false); + PopStyleColor(); + } + if (selected) + RenderCheckMark(window->DrawList, pos + ImVec2(offsets->OffsetMark + stretch_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(ImGuiCol_Text), g.FontSize * 0.866f); + } + IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (selected ? ImGuiItemStatusFlags_Checked : 0)); + if (!enabled) + EndDisabled(); + PopID(); + if (menuset_is_open) + g.NavWindow = backed_nav_window; + + return pressed; +} + +bool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, bool enabled) +{ + return MenuItemEx(label, NULL, shortcut, selected, enabled); +} + +bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled) +{ + if (MenuItemEx(label, NULL, shortcut, p_selected ? *p_selected : false, enabled)) + { + if (p_selected) + *p_selected = !*p_selected; + return true; + } + return false; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: BeginTabBar, EndTabBar, etc. +//------------------------------------------------------------------------- +// - BeginTabBar() +// - BeginTabBarEx() [Internal] +// - EndTabBar() +// - TabBarLayout() [Internal] +// - TabBarCalcTabID() [Internal] +// - TabBarCalcMaxTabWidth() [Internal] +// - TabBarFindTabById() [Internal] +// - TabBarRemoveTab() [Internal] +// - TabBarCloseTab() [Internal] +// - TabBarScrollClamp() [Internal] +// - TabBarScrollToTab() [Internal] +// - TabBarQueueChangeTabOrder() [Internal] +// - TabBarScrollingButtons() [Internal] +// - TabBarTabListPopupButton() [Internal] +//------------------------------------------------------------------------- + +struct ImGuiTabBarSection +{ + int TabCount; // Number of tabs in this section. + float Width; // Sum of width of tabs in this section (after shrinking down) + float Spacing; // Horizontal spacing at the end of the section. + + ImGuiTabBarSection() { memset(this, 0, sizeof(*this)); } +}; + +namespace ImGui +{ + static void TabBarLayout(ImGuiTabBar* tab_bar); + static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label); + static float TabBarCalcMaxTabWidth(); + static float TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling); + static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections); + static ImGuiTabItem* TabBarScrollingButtons(ImGuiTabBar* tab_bar); + static ImGuiTabItem* TabBarTabListPopupButton(ImGuiTabBar* tab_bar); +} + +ImGuiTabBar::ImGuiTabBar() +{ + memset(this, 0, sizeof(*this)); + CurrFrameVisible = PrevFrameVisible = -1; + LastTabItemIdx = -1; +} + +static inline int TabItemGetSectionIdx(const ImGuiTabItem* tab) +{ + return (tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1; +} + +static int IMGUI_CDECL TabItemComparerBySection(const void* lhs, const void* rhs) +{ + const ImGuiTabItem* a = (const ImGuiTabItem*)lhs; + const ImGuiTabItem* b = (const ImGuiTabItem*)rhs; + const int a_section = TabItemGetSectionIdx(a); + const int b_section = TabItemGetSectionIdx(b); + if (a_section != b_section) + return a_section - b_section; + return (int)(a->IndexDuringLayout - b->IndexDuringLayout); +} + +static int IMGUI_CDECL TabItemComparerByBeginOrder(const void* lhs, const void* rhs) +{ + const ImGuiTabItem* a = (const ImGuiTabItem*)lhs; + const ImGuiTabItem* b = (const ImGuiTabItem*)rhs; + return (int)(a->BeginOrder - b->BeginOrder); +} + +static ImGuiTabBar* GetTabBarFromTabBarRef(const ImGuiPtrOrIndex& ref) +{ + ImGuiContext& g = *GImGui; + return ref.Ptr ? (ImGuiTabBar*)ref.Ptr : g.TabBars.GetByIndex(ref.Index); +} + +static ImGuiPtrOrIndex GetTabBarRefFromTabBar(ImGuiTabBar* tab_bar) +{ + ImGuiContext& g = *GImGui; + if (g.TabBars.Contains(tab_bar)) + return ImGuiPtrOrIndex(g.TabBars.GetIndex(tab_bar)); + return ImGuiPtrOrIndex(tab_bar); +} + +bool ImGui::BeginTabBar(const char* str_id, ImGuiTabBarFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + ImGuiID id = window->GetID(str_id); + ImGuiTabBar* tab_bar = g.TabBars.GetOrAddByKey(id); + ImRect tab_bar_bb = ImRect(window->DC.CursorPos.x, window->DC.CursorPos.y, window->WorkRect.Max.x, window->DC.CursorPos.y + g.FontSize + g.Style.FramePadding.y * 2); + tab_bar->ID = id; + return BeginTabBarEx(tab_bar, tab_bar_bb, flags | ImGuiTabBarFlags_IsFocused); +} + +bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImGuiTabBarFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + if ((flags & ImGuiTabBarFlags_DockNode) == 0) + PushOverrideID(tab_bar->ID); + + // Add to stack + g.CurrentTabBarStack.push_back(GetTabBarRefFromTabBar(tab_bar)); + g.CurrentTabBar = tab_bar; + + // Append with multiple BeginTabBar()/EndTabBar() pairs. + tab_bar->BackupCursorPos = window->DC.CursorPos; + if (tab_bar->CurrFrameVisible == g.FrameCount) + { + window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); + tab_bar->BeginCount++; + return true; + } + + // Ensure correct ordering when toggling ImGuiTabBarFlags_Reorderable flag, or when a new tab was added while being not reorderable + if ((flags & ImGuiTabBarFlags_Reorderable) != (tab_bar->Flags & ImGuiTabBarFlags_Reorderable) || (tab_bar->TabsAddedNew && !(flags & ImGuiTabBarFlags_Reorderable))) + ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerByBeginOrder); + tab_bar->TabsAddedNew = false; + + // Flags + if ((flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) + flags |= ImGuiTabBarFlags_FittingPolicyDefault_; + + tab_bar->Flags = flags; + tab_bar->BarRect = tab_bar_bb; + tab_bar->WantLayout = true; // Layout will be done on the first call to ItemTab() + tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible; + tab_bar->CurrFrameVisible = g.FrameCount; + tab_bar->PrevTabsContentsHeight = tab_bar->CurrTabsContentsHeight; + tab_bar->CurrTabsContentsHeight = 0.0f; + tab_bar->ItemSpacingY = g.Style.ItemSpacing.y; + tab_bar->FramePadding = g.Style.FramePadding; + tab_bar->TabsActiveCount = 0; + tab_bar->BeginCount = 1; + + // Set cursor pos in a way which only be used in the off-chance the user erroneously submits item before BeginTabItem(): items will overlap + window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); + + // Draw separator + const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive); + const float y = tab_bar->BarRect.Max.y - 1.0f; + { + const float separator_min_x = tab_bar->BarRect.Min.x - IM_FLOOR(window->WindowPadding.x * 0.5f); + const float separator_max_x = tab_bar->BarRect.Max.x + IM_FLOOR(window->WindowPadding.x * 0.5f); + window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f); + } + return true; +} + +void ImGui::EndTabBar() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + ImGuiTabBar* tab_bar = g.CurrentTabBar; + if (tab_bar == NULL) + { + IM_ASSERT_USER_ERROR(tab_bar != NULL, "Mismatched BeginTabBar()/EndTabBar()!"); + return; + } + + // Fallback in case no TabItem have been submitted + if (tab_bar->WantLayout) + TabBarLayout(tab_bar); + + // Restore the last visible height if no tab is visible, this reduce vertical flicker/movement when a tabs gets removed without calling SetTabItemClosed(). + const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount); + if (tab_bar->VisibleTabWasSubmitted || tab_bar->VisibleTabId == 0 || tab_bar_appearing) + { + tab_bar->CurrTabsContentsHeight = ImMax(window->DC.CursorPos.y - tab_bar->BarRect.Max.y, tab_bar->CurrTabsContentsHeight); + window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->CurrTabsContentsHeight; + } + else + { + window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->PrevTabsContentsHeight; + } + if (tab_bar->BeginCount > 1) + window->DC.CursorPos = tab_bar->BackupCursorPos; + + if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0) + PopID(); + + g.CurrentTabBarStack.pop_back(); + g.CurrentTabBar = g.CurrentTabBarStack.empty() ? NULL : GetTabBarFromTabBarRef(g.CurrentTabBarStack.back()); +} + +// This is called only once a frame before by the first call to ItemTab() +// The reason we're not calling it in BeginTabBar() is to leave a chance to the user to call the SetTabItemClosed() functions. +static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) +{ + ImGuiContext& g = *GImGui; + tab_bar->WantLayout = false; + + // Garbage collect by compacting list + // Detect if we need to sort out tab list (e.g. in rare case where a tab changed section) + int tab_dst_n = 0; + bool need_sort_by_section = false; + ImGuiTabBarSection sections[3]; // Layout sections: Leading, Central, Trailing + for (int tab_src_n = 0; tab_src_n < tab_bar->Tabs.Size; tab_src_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_src_n]; + if (tab->LastFrameVisible < tab_bar->PrevFrameVisible || tab->WantClose) + { + // Remove tab + if (tab_bar->VisibleTabId == tab->ID) { tab_bar->VisibleTabId = 0; } + if (tab_bar->SelectedTabId == tab->ID) { tab_bar->SelectedTabId = 0; } + if (tab_bar->NextSelectedTabId == tab->ID) { tab_bar->NextSelectedTabId = 0; } + continue; + } + if (tab_dst_n != tab_src_n) + tab_bar->Tabs[tab_dst_n] = tab_bar->Tabs[tab_src_n]; + + tab = &tab_bar->Tabs[tab_dst_n]; + tab->IndexDuringLayout = (ImS16)tab_dst_n; + + // We will need sorting if tabs have changed section (e.g. moved from one of Leading/Central/Trailing to another) + int curr_tab_section_n = TabItemGetSectionIdx(tab); + if (tab_dst_n > 0) + { + ImGuiTabItem* prev_tab = &tab_bar->Tabs[tab_dst_n - 1]; + int prev_tab_section_n = TabItemGetSectionIdx(prev_tab); + if (curr_tab_section_n == 0 && prev_tab_section_n != 0) + need_sort_by_section = true; + if (prev_tab_section_n == 2 && curr_tab_section_n != 2) + need_sort_by_section = true; + } + + sections[curr_tab_section_n].TabCount++; + tab_dst_n++; + } + if (tab_bar->Tabs.Size != tab_dst_n) + tab_bar->Tabs.resize(tab_dst_n); + + if (need_sort_by_section) + ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerBySection); + + // Calculate spacing between sections + sections[0].Spacing = sections[0].TabCount > 0 && (sections[1].TabCount + sections[2].TabCount) > 0 ? g.Style.ItemInnerSpacing.x : 0.0f; + sections[1].Spacing = sections[1].TabCount > 0 && sections[2].TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f; + + // Setup next selected tab + ImGuiID scroll_to_tab_id = 0; + if (tab_bar->NextSelectedTabId) + { + tab_bar->SelectedTabId = tab_bar->NextSelectedTabId; + tab_bar->NextSelectedTabId = 0; + scroll_to_tab_id = tab_bar->SelectedTabId; + } + + // Process order change request (we could probably process it when requested but it's just saner to do it in a single spot). + if (tab_bar->ReorderRequestTabId != 0) + { + if (TabBarProcessReorder(tab_bar)) + if (tab_bar->ReorderRequestTabId == tab_bar->SelectedTabId) + scroll_to_tab_id = tab_bar->ReorderRequestTabId; + tab_bar->ReorderRequestTabId = 0; + } + + // Tab List Popup (will alter tab_bar->BarRect and therefore the available width!) + const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_TabListPopupButton) != 0; + if (tab_list_popup_button) + if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Min.x! + scroll_to_tab_id = tab_bar->SelectedTabId = tab_to_select->ID; + + // Leading/Trailing tabs will be shrink only if central one aren't visible anymore, so layout the shrink data as: leading, trailing, central + // (whereas our tabs are stored as: leading, central, trailing) + int shrink_buffer_indexes[3] = { 0, sections[0].TabCount + sections[2].TabCount, sections[0].TabCount }; + g.ShrinkWidthBuffer.resize(tab_bar->Tabs.Size); + + // Compute ideal tabs widths + store them into shrink buffer + ImGuiTabItem* most_recently_selected_tab = NULL; + int curr_section_n = -1; + bool found_selected_tab_id = false; + for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + IM_ASSERT(tab->LastFrameVisible >= tab_bar->PrevFrameVisible); + + if ((most_recently_selected_tab == NULL || most_recently_selected_tab->LastFrameSelected < tab->LastFrameSelected) && !(tab->Flags & ImGuiTabItemFlags_Button)) + most_recently_selected_tab = tab; + if (tab->ID == tab_bar->SelectedTabId) + found_selected_tab_id = true; + if (scroll_to_tab_id == 0 && g.NavJustMovedToId == tab->ID) + scroll_to_tab_id = tab->ID; + + // Refresh tab width immediately, otherwise changes of style e.g. style.FramePadding.x would noticeably lag in the tab bar. + // Additionally, when using TabBarAddTab() to manipulate tab bar order we occasionally insert new tabs that don't have a width yet, + // and we cannot wait for the next BeginTabItem() call. We cannot compute this width within TabBarAddTab() because font size depends on the active window. + const char* tab_name = tab_bar->GetTabName(tab); + const bool has_close_button = (tab->Flags & ImGuiTabItemFlags_NoCloseButton) ? false : true; + tab->ContentWidth = TabItemCalcSize(tab_name, has_close_button).x; + + int section_n = TabItemGetSectionIdx(tab); + ImGuiTabBarSection* section = §ions[section_n]; + section->Width += tab->ContentWidth + (section_n == curr_section_n ? g.Style.ItemInnerSpacing.x : 0.0f); + curr_section_n = section_n; + + // Store data so we can build an array sorted by width if we need to shrink tabs down + IM_MSVC_WARNING_SUPPRESS(6385); + int shrink_buffer_index = shrink_buffer_indexes[section_n]++; + g.ShrinkWidthBuffer[shrink_buffer_index].Index = tab_n; + g.ShrinkWidthBuffer[shrink_buffer_index].Width = tab->ContentWidth; + + IM_ASSERT(tab->ContentWidth > 0.0f); + tab->Width = tab->ContentWidth; + } + + // Compute total ideal width (used for e.g. auto-resizing a window) + tab_bar->WidthAllTabsIdeal = 0.0f; + for (int section_n = 0; section_n < 3; section_n++) + tab_bar->WidthAllTabsIdeal += sections[section_n].Width + sections[section_n].Spacing; + + // Horizontal scrolling buttons + // (note that TabBarScrollButtons() will alter BarRect.Max.x) + if ((tab_bar->WidthAllTabsIdeal > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll)) + if (ImGuiTabItem* scroll_and_select_tab = TabBarScrollingButtons(tab_bar)) + { + scroll_to_tab_id = scroll_and_select_tab->ID; + if ((scroll_and_select_tab->Flags & ImGuiTabItemFlags_Button) == 0) + tab_bar->SelectedTabId = scroll_to_tab_id; + } + + // Shrink widths if full tabs don't fit in their allocated space + float section_0_w = sections[0].Width + sections[0].Spacing; + float section_1_w = sections[1].Width + sections[1].Spacing; + float section_2_w = sections[2].Width + sections[2].Spacing; + bool central_section_is_visible = (section_0_w + section_2_w) < tab_bar->BarRect.GetWidth(); + float width_excess; + if (central_section_is_visible) + width_excess = ImMax(section_1_w - (tab_bar->BarRect.GetWidth() - section_0_w - section_2_w), 0.0f); // Excess used to shrink central section + else + width_excess = (section_0_w + section_2_w) - tab_bar->BarRect.GetWidth(); // Excess used to shrink leading/trailing section + + // With ImGuiTabBarFlags_FittingPolicyScroll policy, we will only shrink leading/trailing if the central section is not visible anymore + if (width_excess > 0.0f && ((tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyResizeDown) || !central_section_is_visible)) + { + int shrink_data_count = (central_section_is_visible ? sections[1].TabCount : sections[0].TabCount + sections[2].TabCount); + int shrink_data_offset = (central_section_is_visible ? sections[0].TabCount + sections[2].TabCount : 0); + ShrinkWidths(g.ShrinkWidthBuffer.Data + shrink_data_offset, shrink_data_count, width_excess); + + // Apply shrunk values into tabs and sections + for (int tab_n = shrink_data_offset; tab_n < shrink_data_offset + shrink_data_count; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[g.ShrinkWidthBuffer[tab_n].Index]; + float shrinked_width = IM_FLOOR(g.ShrinkWidthBuffer[tab_n].Width); + if (shrinked_width < 0.0f) + continue; + + int section_n = TabItemGetSectionIdx(tab); + sections[section_n].Width -= (tab->Width - shrinked_width); + tab->Width = shrinked_width; + } + } + + // Layout all active tabs + int section_tab_index = 0; + float tab_offset = 0.0f; + tab_bar->WidthAllTabs = 0.0f; + for (int section_n = 0; section_n < 3; section_n++) + { + ImGuiTabBarSection* section = §ions[section_n]; + if (section_n == 2) + tab_offset = ImMin(ImMax(0.0f, tab_bar->BarRect.GetWidth() - section->Width), tab_offset); + + for (int tab_n = 0; tab_n < section->TabCount; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[section_tab_index + tab_n]; + tab->Offset = tab_offset; + tab_offset += tab->Width + (tab_n < section->TabCount - 1 ? g.Style.ItemInnerSpacing.x : 0.0f); + } + tab_bar->WidthAllTabs += ImMax(section->Width + section->Spacing, 0.0f); + tab_offset += section->Spacing; + section_tab_index += section->TabCount; + } + + // If we have lost the selected tab, select the next most recently active one + if (found_selected_tab_id == false) + tab_bar->SelectedTabId = 0; + if (tab_bar->SelectedTabId == 0 && tab_bar->NextSelectedTabId == 0 && most_recently_selected_tab != NULL) + scroll_to_tab_id = tab_bar->SelectedTabId = most_recently_selected_tab->ID; + + // Lock in visible tab + tab_bar->VisibleTabId = tab_bar->SelectedTabId; + tab_bar->VisibleTabWasSubmitted = false; + + // Update scrolling + if (scroll_to_tab_id != 0) + TabBarScrollToTab(tab_bar, scroll_to_tab_id, sections); + tab_bar->ScrollingAnim = TabBarScrollClamp(tab_bar, tab_bar->ScrollingAnim); + tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget); + if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget) + { + // Scrolling speed adjust itself so we can always reach our target in 1/3 seconds. + // Teleport if we are aiming far off the visible line + tab_bar->ScrollingSpeed = ImMax(tab_bar->ScrollingSpeed, 70.0f * g.FontSize); + tab_bar->ScrollingSpeed = ImMax(tab_bar->ScrollingSpeed, ImFabs(tab_bar->ScrollingTarget - tab_bar->ScrollingAnim) / 0.3f); + const bool teleport = (tab_bar->PrevFrameVisible + 1 < g.FrameCount) || (tab_bar->ScrollingTargetDistToVisibility > 10.0f * g.FontSize); + tab_bar->ScrollingAnim = teleport ? tab_bar->ScrollingTarget : ImLinearSweep(tab_bar->ScrollingAnim, tab_bar->ScrollingTarget, g.IO.DeltaTime * tab_bar->ScrollingSpeed); + } + else + { + tab_bar->ScrollingSpeed = 0.0f; + } + tab_bar->ScrollingRectMinX = tab_bar->BarRect.Min.x + sections[0].Width + sections[0].Spacing; + tab_bar->ScrollingRectMaxX = tab_bar->BarRect.Max.x - sections[2].Width - sections[1].Spacing; + + // Clear name buffers + if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0) + tab_bar->TabsNames.Buf.resize(0); + + // Actual layout in host window (we don't do it in BeginTabBar() so as not to waste an extra frame) + ImGuiWindow* window = g.CurrentWindow; + window->DC.CursorPos = tab_bar->BarRect.Min; + ItemSize(ImVec2(tab_bar->WidthAllTabs, tab_bar->BarRect.GetHeight()), tab_bar->FramePadding.y); + window->DC.IdealMaxPos.x = ImMax(window->DC.IdealMaxPos.x, tab_bar->BarRect.Min.x + tab_bar->WidthAllTabsIdeal); +} + +// Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack. +static ImU32 ImGui::TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label) +{ + if (tab_bar->Flags & ImGuiTabBarFlags_DockNode) + { + ImGuiID id = ImHashStr(label); + KeepAliveID(id); + return id; + } + else + { + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(label); + } +} + +static float ImGui::TabBarCalcMaxTabWidth() +{ + ImGuiContext& g = *GImGui; + return g.FontSize * 20.0f; +} + +ImGuiTabItem* ImGui::TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id) +{ + if (tab_id != 0) + for (int n = 0; n < tab_bar->Tabs.Size; n++) + if (tab_bar->Tabs[n].ID == tab_id) + return &tab_bar->Tabs[n]; + return NULL; +} + +// The *TabId fields be already set by the docking system _before_ the actual TabItem was created, so we clear them regardless. +void ImGui::TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id) +{ + if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id)) + tab_bar->Tabs.erase(tab); + if (tab_bar->VisibleTabId == tab_id) { tab_bar->VisibleTabId = 0; } + if (tab_bar->SelectedTabId == tab_id) { tab_bar->SelectedTabId = 0; } + if (tab_bar->NextSelectedTabId == tab_id) { tab_bar->NextSelectedTabId = 0; } +} + +// Called on manual closure attempt +void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) +{ + IM_ASSERT(!(tab->Flags & ImGuiTabItemFlags_Button)); + if (!(tab->Flags & ImGuiTabItemFlags_UnsavedDocument)) + { + // This will remove a frame of lag for selecting another tab on closure. + // However we don't run it in the case where the 'Unsaved' flag is set, so user gets a chance to fully undo the closure + tab->WantClose = true; + if (tab_bar->VisibleTabId == tab->ID) + { + tab->LastFrameVisible = -1; + tab_bar->SelectedTabId = tab_bar->NextSelectedTabId = 0; + } + } + else + { + // Actually select before expecting closure attempt (on an UnsavedDocument tab user is expect to e.g. show a popup) + if (tab_bar->VisibleTabId != tab->ID) + tab_bar->NextSelectedTabId = tab->ID; + } +} + +static float ImGui::TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling) +{ + scrolling = ImMin(scrolling, tab_bar->WidthAllTabs - tab_bar->BarRect.GetWidth()); + return ImMax(scrolling, 0.0f); +} + +// Note: we may scroll to tab that are not selected! e.g. using keyboard arrow keys +static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections) +{ + ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id); + if (tab == NULL) + return; + if (tab->Flags & ImGuiTabItemFlags_SectionMask_) + return; + + ImGuiContext& g = *GImGui; + float margin = g.FontSize * 1.0f; // When to scroll to make Tab N+1 visible always make a bit of N visible to suggest more scrolling area (since we don't have a scrollbar) + int order = tab_bar->GetTabOrder(tab); + + // Scrolling happens only in the central section (leading/trailing sections are not scrolling) + // FIXME: This is all confusing. + float scrollable_width = tab_bar->BarRect.GetWidth() - sections[0].Width - sections[2].Width - sections[1].Spacing; + + // We make all tabs positions all relative Sections[0].Width to make code simpler + float tab_x1 = tab->Offset - sections[0].Width + (order > sections[0].TabCount - 1 ? -margin : 0.0f); + float tab_x2 = tab->Offset - sections[0].Width + tab->Width + (order + 1 < tab_bar->Tabs.Size - sections[2].TabCount ? margin : 1.0f); + tab_bar->ScrollingTargetDistToVisibility = 0.0f; + if (tab_bar->ScrollingTarget > tab_x1 || (tab_x2 - tab_x1 >= scrollable_width)) + { + // Scroll to the left + tab_bar->ScrollingTargetDistToVisibility = ImMax(tab_bar->ScrollingAnim - tab_x2, 0.0f); + tab_bar->ScrollingTarget = tab_x1; + } + else if (tab_bar->ScrollingTarget < tab_x2 - scrollable_width) + { + // Scroll to the right + tab_bar->ScrollingTargetDistToVisibility = ImMax((tab_x1 - scrollable_width) - tab_bar->ScrollingAnim, 0.0f); + tab_bar->ScrollingTarget = tab_x2 - scrollable_width; + } +} + +void ImGui::TabBarQueueReorder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int offset) +{ + IM_ASSERT(offset != 0); + IM_ASSERT(tab_bar->ReorderRequestTabId == 0); + tab_bar->ReorderRequestTabId = tab->ID; + tab_bar->ReorderRequestOffset = (ImS16)offset; +} + +void ImGui::TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, const ImGuiTabItem* src_tab, ImVec2 mouse_pos) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(tab_bar->ReorderRequestTabId == 0); + if ((tab_bar->Flags & ImGuiTabBarFlags_Reorderable) == 0) + return; + + const bool is_central_section = (src_tab->Flags & ImGuiTabItemFlags_SectionMask_) == 0; + const float bar_offset = tab_bar->BarRect.Min.x - (is_central_section ? tab_bar->ScrollingTarget : 0); + + // Count number of contiguous tabs we are crossing over + const int dir = (bar_offset + src_tab->Offset) > mouse_pos.x ? -1 : +1; + const int src_idx = tab_bar->Tabs.index_from_ptr(src_tab); + int dst_idx = src_idx; + for (int i = src_idx; i >= 0 && i < tab_bar->Tabs.Size; i += dir) + { + // Reordered tabs must share the same section + const ImGuiTabItem* dst_tab = &tab_bar->Tabs[i]; + if (dst_tab->Flags & ImGuiTabItemFlags_NoReorder) + break; + if ((dst_tab->Flags & ImGuiTabItemFlags_SectionMask_) != (src_tab->Flags & ImGuiTabItemFlags_SectionMask_)) + break; + dst_idx = i; + + // Include spacing after tab, so when mouse cursor is between tabs we would not continue checking further tabs that are not hovered. + const float x1 = bar_offset + dst_tab->Offset - g.Style.ItemInnerSpacing.x; + const float x2 = bar_offset + dst_tab->Offset + dst_tab->Width + g.Style.ItemInnerSpacing.x; + //GetForegroundDrawList()->AddRect(ImVec2(x1, tab_bar->BarRect.Min.y), ImVec2(x2, tab_bar->BarRect.Max.y), IM_COL32(255, 0, 0, 255)); + if ((dir < 0 && mouse_pos.x > x1) || (dir > 0 && mouse_pos.x < x2)) + break; + } + + if (dst_idx != src_idx) + TabBarQueueReorder(tab_bar, src_tab, dst_idx - src_idx); +} + +bool ImGui::TabBarProcessReorder(ImGuiTabBar* tab_bar) +{ + ImGuiTabItem* tab1 = TabBarFindTabByID(tab_bar, tab_bar->ReorderRequestTabId); + if (tab1 == NULL || (tab1->Flags & ImGuiTabItemFlags_NoReorder)) + return false; + + //IM_ASSERT(tab_bar->Flags & ImGuiTabBarFlags_Reorderable); // <- this may happen when using debug tools + int tab2_order = tab_bar->GetTabOrder(tab1) + tab_bar->ReorderRequestOffset; + if (tab2_order < 0 || tab2_order >= tab_bar->Tabs.Size) + return false; + + // Reordered tabs must share the same section + // (Note: TabBarQueueReorderFromMousePos() also has a similar test but since we allow direct calls to TabBarQueueReorder() we do it here too) + ImGuiTabItem* tab2 = &tab_bar->Tabs[tab2_order]; + if (tab2->Flags & ImGuiTabItemFlags_NoReorder) + return false; + if ((tab1->Flags & ImGuiTabItemFlags_SectionMask_) != (tab2->Flags & ImGuiTabItemFlags_SectionMask_)) + return false; + + ImGuiTabItem item_tmp = *tab1; + ImGuiTabItem* src_tab = (tab_bar->ReorderRequestOffset > 0) ? tab1 + 1 : tab2; + ImGuiTabItem* dst_tab = (tab_bar->ReorderRequestOffset > 0) ? tab1 : tab2 + 1; + const int move_count = (tab_bar->ReorderRequestOffset > 0) ? tab_bar->ReorderRequestOffset : -tab_bar->ReorderRequestOffset; + memmove(dst_tab, src_tab, move_count * sizeof(ImGuiTabItem)); + *tab2 = item_tmp; + + if (tab_bar->Flags & ImGuiTabBarFlags_SaveSettings) + MarkIniSettingsDirty(); + return true; +} + +static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + const ImVec2 arrow_button_size(g.FontSize - 2.0f, g.FontSize + g.Style.FramePadding.y * 2.0f); + const float scrolling_buttons_width = arrow_button_size.x * 2.0f; + + const ImVec2 backup_cursor_pos = window->DC.CursorPos; + //window->DrawList->AddRect(ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Max.x, tab_bar->BarRect.Max.y), IM_COL32(255,0,0,255)); + + int select_dir = 0; + ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text]; + arrow_col.w *= 0.5f; + + PushStyleColor(ImGuiCol_Text, arrow_col); + PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + const float backup_repeat_delay = g.IO.KeyRepeatDelay; + const float backup_repeat_rate = g.IO.KeyRepeatRate; + g.IO.KeyRepeatDelay = 0.250f; + g.IO.KeyRepeatRate = 0.200f; + float x = ImMax(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.x - scrolling_buttons_width); + window->DC.CursorPos = ImVec2(x, tab_bar->BarRect.Min.y); + if (ArrowButtonEx("##<", ImGuiDir_Left, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat)) + select_dir = -1; + window->DC.CursorPos = ImVec2(x + arrow_button_size.x, tab_bar->BarRect.Min.y); + if (ArrowButtonEx("##>", ImGuiDir_Right, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat)) + select_dir = +1; + PopStyleColor(2); + g.IO.KeyRepeatRate = backup_repeat_rate; + g.IO.KeyRepeatDelay = backup_repeat_delay; + + ImGuiTabItem* tab_to_scroll_to = NULL; + if (select_dir != 0) + if (ImGuiTabItem* tab_item = TabBarFindTabByID(tab_bar, tab_bar->SelectedTabId)) + { + int selected_order = tab_bar->GetTabOrder(tab_item); + int target_order = selected_order + select_dir; + + // Skip tab item buttons until another tab item is found or end is reached + while (tab_to_scroll_to == NULL) + { + // If we are at the end of the list, still scroll to make our tab visible + tab_to_scroll_to = &tab_bar->Tabs[(target_order >= 0 && target_order < tab_bar->Tabs.Size) ? target_order : selected_order]; + + // Cross through buttons + // (even if first/last item is a button, return it so we can update the scroll) + if (tab_to_scroll_to->Flags & ImGuiTabItemFlags_Button) + { + target_order += select_dir; + selected_order += select_dir; + tab_to_scroll_to = (target_order < 0 || target_order >= tab_bar->Tabs.Size) ? tab_to_scroll_to : NULL; + } + } + } + window->DC.CursorPos = backup_cursor_pos; + tab_bar->BarRect.Max.x -= scrolling_buttons_width + 1.0f; + + return tab_to_scroll_to; +} + +static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // We use g.Style.FramePadding.y to match the square ArrowButton size + const float tab_list_popup_button_width = g.FontSize + g.Style.FramePadding.y; + const ImVec2 backup_cursor_pos = window->DC.CursorPos; + window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x - g.Style.FramePadding.y, tab_bar->BarRect.Min.y); + tab_bar->BarRect.Min.x += tab_list_popup_button_width; + + ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text]; + arrow_col.w *= 0.5f; + PushStyleColor(ImGuiCol_Text, arrow_col); + PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + bool open = BeginCombo("##v", NULL, ImGuiComboFlags_NoPreview | ImGuiComboFlags_HeightLargest); + PopStyleColor(2); + + ImGuiTabItem* tab_to_select = NULL; + if (open) + { + for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + if (tab->Flags & ImGuiTabItemFlags_Button) + continue; + + const char* tab_name = tab_bar->GetTabName(tab); + if (Selectable(tab_name, tab_bar->SelectedTabId == tab->ID)) + tab_to_select = tab; + } + EndCombo(); + } + + window->DC.CursorPos = backup_cursor_pos; + return tab_to_select; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: BeginTabItem, EndTabItem, etc. +//------------------------------------------------------------------------- +// - BeginTabItem() +// - EndTabItem() +// - TabItemButton() +// - TabItemEx() [Internal] +// - SetTabItemClosed() +// - TabItemCalcSize() [Internal] +// - TabItemBackground() [Internal] +// - TabItemLabelAndCloseButton() [Internal] +//------------------------------------------------------------------------- + +bool ImGui::BeginTabItem(const char* label, bool* p_open, ImGuiTabItemFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + ImGuiTabBar* tab_bar = g.CurrentTabBar; + if (tab_bar == NULL) + { + IM_ASSERT_USER_ERROR(tab_bar, "Needs to be called between BeginTabBar() and EndTabBar()!"); + return false; + } + IM_ASSERT(!(flags & ImGuiTabItemFlags_Button)); // BeginTabItem() Can't be used with button flags, use TabItemButton() instead! + + bool ret = TabItemEx(tab_bar, label, p_open, flags); + if (ret && !(flags & ImGuiTabItemFlags_NoPushId)) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx]; + PushOverrideID(tab->ID); // We already hashed 'label' so push into the ID stack directly instead of doing another hash through PushID(label) + } + return ret; +} + +void ImGui::EndTabItem() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + ImGuiTabBar* tab_bar = g.CurrentTabBar; + if (tab_bar == NULL) + { + IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!"); + return; + } + IM_ASSERT(tab_bar->LastTabItemIdx >= 0); + ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx]; + if (!(tab->Flags & ImGuiTabItemFlags_NoPushId)) + PopID(); +} + +bool ImGui::TabItemButton(const char* label, ImGuiTabItemFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + ImGuiTabBar* tab_bar = g.CurrentTabBar; + if (tab_bar == NULL) + { + IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!"); + return false; + } + return TabItemEx(tab_bar, label, NULL, flags | ImGuiTabItemFlags_Button | ImGuiTabItemFlags_NoReorder); +} + +bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags) +{ + // Layout whole tab bar if not already done + if (tab_bar->WantLayout) + TabBarLayout(tab_bar); + + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + const ImGuiStyle& style = g.Style; + const ImGuiID id = TabBarCalcTabID(tab_bar, label); + + // If the user called us with *p_open == false, we early out and don't render. + // We make a call to ItemAdd() so that attempts to use a contextual popup menu with an implicit ID won't use an older ID. + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + if (p_open && !*p_open) + { + ItemAdd(ImRect(), id, NULL, ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus); + return false; + } + + IM_ASSERT(!p_open || !(flags & ImGuiTabItemFlags_Button)); + IM_ASSERT((flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)) != (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)); // Can't use both Leading and Trailing + + // Store into ImGuiTabItemFlags_NoCloseButton, also honor ImGuiTabItemFlags_NoCloseButton passed by user (although not documented) + if (flags & ImGuiTabItemFlags_NoCloseButton) + p_open = NULL; + else if (p_open == NULL) + flags |= ImGuiTabItemFlags_NoCloseButton; + + // Calculate tab contents size + ImVec2 size = TabItemCalcSize(label, p_open != NULL); + + // Acquire tab data + ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, id); + bool tab_is_new = false; + if (tab == NULL) + { + tab_bar->Tabs.push_back(ImGuiTabItem()); + tab = &tab_bar->Tabs.back(); + tab->ID = id; + tab->Width = size.x; + tab_bar->TabsAddedNew = true; + tab_is_new = true; + } + tab_bar->LastTabItemIdx = (ImS16)tab_bar->Tabs.index_from_ptr(tab); + tab->ContentWidth = size.x; + tab->BeginOrder = tab_bar->TabsActiveCount++; + + const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount); + const bool tab_bar_focused = (tab_bar->Flags & ImGuiTabBarFlags_IsFocused) != 0; + const bool tab_appearing = (tab->LastFrameVisible + 1 < g.FrameCount); + const bool is_tab_button = (flags & ImGuiTabItemFlags_Button) != 0; + tab->LastFrameVisible = g.FrameCount; + tab->Flags = flags; + + // Append name with zero-terminator + tab->NameOffset = (ImS32)tab_bar->TabsNames.size(); + tab_bar->TabsNames.append(label, label + strlen(label) + 1); + + // Update selected tab + if (tab_appearing && (tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs) && tab_bar->NextSelectedTabId == 0) + if (!tab_bar_appearing || tab_bar->SelectedTabId == 0) + if (!is_tab_button) + tab_bar->NextSelectedTabId = id; // New tabs gets activated + if ((flags & ImGuiTabItemFlags_SetSelected) && (tab_bar->SelectedTabId != id)) // SetSelected can only be passed on explicit tab bar + if (!is_tab_button) + tab_bar->NextSelectedTabId = id; + + // Lock visibility + // (Note: tab_contents_visible != tab_selected... because CTRL+TAB operations may preview some tabs without selecting them!) + bool tab_contents_visible = (tab_bar->VisibleTabId == id); + if (tab_contents_visible) + tab_bar->VisibleTabWasSubmitted = true; + + // On the very first frame of a tab bar we let first tab contents be visible to minimize appearing glitches + if (!tab_contents_visible && tab_bar->SelectedTabId == 0 && tab_bar_appearing) + if (tab_bar->Tabs.Size == 1 && !(tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs)) + tab_contents_visible = true; + + // Note that tab_is_new is not necessarily the same as tab_appearing! When a tab bar stops being submitted + // and then gets submitted again, the tabs will have 'tab_appearing=true' but 'tab_is_new=false'. + if (tab_appearing && (!tab_bar_appearing || tab_is_new)) + { + ItemAdd(ImRect(), id, NULL, ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus); + if (is_tab_button) + return false; + return tab_contents_visible; + } + + if (tab_bar->SelectedTabId == id) + tab->LastFrameSelected = g.FrameCount; + + // Backup current layout position + const ImVec2 backup_main_cursor_pos = window->DC.CursorPos; + + // Layout + const bool is_central_section = (tab->Flags & ImGuiTabItemFlags_SectionMask_) == 0; + size.x = tab->Width; + if (is_central_section) + window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_FLOOR(tab->Offset - tab_bar->ScrollingAnim), 0.0f); + else + window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(tab->Offset, 0.0f); + ImVec2 pos = window->DC.CursorPos; + ImRect bb(pos, pos + size); + + // We don't have CPU clipping primitives to clip the CloseButton (until it becomes a texture), so need to add an extra draw call (temporary in the case of vertical animation) + const bool want_clip_rect = is_central_section && (bb.Min.x < tab_bar->ScrollingRectMinX || bb.Max.x > tab_bar->ScrollingRectMaxX); + if (want_clip_rect) + PushClipRect(ImVec2(ImMax(bb.Min.x, tab_bar->ScrollingRectMinX), bb.Min.y - 1), ImVec2(tab_bar->ScrollingRectMaxX, bb.Max.y), true); + + ImVec2 backup_cursor_max_pos = window->DC.CursorMaxPos; + ItemSize(bb.GetSize(), style.FramePadding.y); + window->DC.CursorMaxPos = backup_cursor_max_pos; + + if (!ItemAdd(bb, id)) + { + if (want_clip_rect) + PopClipRect(); + window->DC.CursorPos = backup_main_cursor_pos; + return tab_contents_visible; + } + + // Click to Select a tab + ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowItemOverlap); + if (g.DragDropActive) + button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); + if (pressed && !is_tab_button) + tab_bar->NextSelectedTabId = id; + + // Allow the close button to overlap unless we are dragging (in which case we don't want any overlapping tabs to be hovered) + if (g.ActiveId != id) + SetItemAllowOverlap(); + + // Drag and drop: re-order tabs + if (held && !tab_appearing && IsMouseDragging(0)) + { + if (!g.DragDropActive && (tab_bar->Flags & ImGuiTabBarFlags_Reorderable)) + { + // While moving a tab it will jump on the other side of the mouse, so we also test for MouseDelta.x + if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < bb.Min.x) + { + TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); + } + else if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > bb.Max.x) + { + TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); + } + } + } + +#if 0 + if (hovered && g.HoveredIdNotActiveTimer > TOOLTIP_DELAY && bb.GetWidth() < tab->ContentWidth) + { + // Enlarge tab display when hovering + bb.Max.x = bb.Min.x + IM_FLOOR(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f))); + display_draw_list = GetForegroundDrawList(window); + TabItemBackground(display_draw_list, bb, flags, GetColorU32(ImGuiCol_TitleBgActive)); + } +#endif + + // Render tab shape + ImDrawList* display_draw_list = window->DrawList; + const ImU32 tab_col = GetColorU32((held || hovered) ? ImGuiCol_TabHovered : tab_contents_visible ? (tab_bar_focused ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive) : (tab_bar_focused ? ImGuiCol_Tab : ImGuiCol_TabUnfocused)); + TabItemBackground(display_draw_list, bb, flags, tab_col); + RenderNavHighlight(bb, id); + + // Select with right mouse button. This is so the common idiom for context menu automatically highlight the current widget. + const bool hovered_unblocked = IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup); + if (hovered_unblocked && (IsMouseClicked(1) || IsMouseReleased(1))) + if (!is_tab_button) + tab_bar->NextSelectedTabId = id; + + if (tab_bar->Flags & ImGuiTabBarFlags_NoCloseWithMiddleMouseButton) + flags |= ImGuiTabItemFlags_NoCloseWithMiddleMouseButton; + + // Render tab label, process close button + const ImGuiID close_button_id = p_open ? GetIDWithSeed("#CLOSE", NULL, id) : 0; + bool just_closed; + bool text_clipped; + TabItemLabelAndCloseButton(display_draw_list, bb, flags, tab_bar->FramePadding, label, id, close_button_id, tab_contents_visible, &just_closed, &text_clipped); + if (just_closed && p_open != NULL) + { + *p_open = false; + TabBarCloseTab(tab_bar, tab); + } + + // Restore main window position so user can draw there + if (want_clip_rect) + PopClipRect(); + window->DC.CursorPos = backup_main_cursor_pos; + + // Tooltip + // (Won't work over the close button because ItemOverlap systems messes up with HoveredIdTimer-> seems ok) + // (We test IsItemHovered() to discard e.g. when another item is active or drag and drop over the tab bar, which g.HoveredId ignores) + // FIXME: This is a mess. + // FIXME: We may want disabled tab to still display the tooltip? + if (text_clipped && g.HoveredId == id && !held && g.HoveredIdNotActiveTimer > g.TooltipSlowDelay && IsItemHovered()) + if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip) && !(tab->Flags & ImGuiTabItemFlags_NoTooltip)) + SetTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label); + + IM_ASSERT(!is_tab_button || !(tab_bar->SelectedTabId == tab->ID && is_tab_button)); // TabItemButton should not be selected + if (is_tab_button) + return pressed; + return tab_contents_visible; +} + +// [Public] This is call is 100% optional but it allows to remove some one-frame glitches when a tab has been unexpectedly removed. +// To use it to need to call the function SetTabItemClosed() between BeginTabBar() and EndTabBar(). +// Tabs closed by the close button will automatically be flagged to avoid this issue. +void ImGui::SetTabItemClosed(const char* label) +{ + ImGuiContext& g = *GImGui; + bool is_within_manual_tab_bar = g.CurrentTabBar && !(g.CurrentTabBar->Flags & ImGuiTabBarFlags_DockNode); + if (is_within_manual_tab_bar) + { + ImGuiTabBar* tab_bar = g.CurrentTabBar; + ImGuiID tab_id = TabBarCalcTabID(tab_bar, label); + if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id)) + tab->WantClose = true; // Will be processed by next call to TabBarLayout() + } +} + +ImVec2 ImGui::TabItemCalcSize(const char* label, bool has_close_button) +{ + ImGuiContext& g = *GImGui; + ImVec2 label_size = CalcTextSize(label, NULL, true); + ImVec2 size = ImVec2(label_size.x + g.Style.FramePadding.x, label_size.y + g.Style.FramePadding.y * 2.0f); + if (has_close_button) + size.x += g.Style.FramePadding.x + (g.Style.ItemInnerSpacing.x + g.FontSize); // We use Y intentionally to fit the close button circle. + else + size.x += g.Style.FramePadding.x + 1.0f; + return ImVec2(ImMin(size.x, TabBarCalcMaxTabWidth()), size.y); +} + +void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col) +{ + // While rendering tabs, we trim 1 pixel off the top of our bounding box so they can fit within a regular frame height while looking "detached" from it. + ImGuiContext& g = *GImGui; + const float width = bb.GetWidth(); + IM_UNUSED(flags); + IM_ASSERT(width > 0.0f); + const float rounding = ImMax(0.0f, ImMin((flags & ImGuiTabItemFlags_Button) ? g.Style.FrameRounding : g.Style.TabRounding, width * 0.5f - 1.0f)); + const float y1 = bb.Min.y + 1.0f; + const float y2 = bb.Max.y - 1.0f; + draw_list->PathLineTo(ImVec2(bb.Min.x, y2)); + draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding, y1 + rounding), rounding, 6, 9); + draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding, y1 + rounding), rounding, 9, 12); + draw_list->PathLineTo(ImVec2(bb.Max.x, y2)); + draw_list->PathFillConvex(col); + if (g.Style.TabBorderSize > 0.0f) + { + draw_list->PathLineTo(ImVec2(bb.Min.x + 0.5f, y2)); + draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding + 0.5f, y1 + rounding + 0.5f), rounding, 6, 9); + draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding - 0.5f, y1 + rounding + 0.5f), rounding, 9, 12); + draw_list->PathLineTo(ImVec2(bb.Max.x - 0.5f, y2)); + draw_list->PathStroke(GetColorU32(ImGuiCol_Border), 0, g.Style.TabBorderSize); + } +} + +// Render text label (with custom clipping) + Unsaved Document marker + Close Button logic +// We tend to lock style.FramePadding for a given tab-bar, hence the 'frame_padding' parameter. +void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped) +{ + ImGuiContext& g = *GImGui; + ImVec2 label_size = CalcTextSize(label, NULL, true); + + if (out_just_closed) + *out_just_closed = false; + if (out_text_clipped) + *out_text_clipped = false; + + if (bb.GetWidth() <= 1.0f) + return; + + // In Style V2 we'll have full override of all colors per state (e.g. focused, selected) + // But right now if you want to alter text color of tabs this is what you need to do. +#if 0 + const float backup_alpha = g.Style.Alpha; + if (!is_contents_visible) + g.Style.Alpha *= 0.7f; +#endif + + // Render text label (with clipping + alpha gradient) + unsaved marker + ImRect text_pixel_clip_bb(bb.Min.x + frame_padding.x, bb.Min.y + frame_padding.y, bb.Max.x - frame_padding.x, bb.Max.y); + ImRect text_ellipsis_clip_bb = text_pixel_clip_bb; + + // Return clipped state ignoring the close button + if (out_text_clipped) + { + *out_text_clipped = (text_ellipsis_clip_bb.Min.x + label_size.x) > text_pixel_clip_bb.Max.x; + //draw_list->AddCircle(text_ellipsis_clip_bb.Min, 3.0f, *out_text_clipped ? IM_COL32(255, 0, 0, 255) : IM_COL32(0, 255, 0, 255)); + } + + const float button_sz = g.FontSize; + const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x * 2.0f - button_sz), bb.Min.y); + + // Close Button & Unsaved Marker + // We are relying on a subtle and confusing distinction between 'hovered' and 'g.HoveredId' which happens because we are using ImGuiButtonFlags_AllowOverlapMode + SetItemAllowOverlap() + // 'hovered' will be true when hovering the Tab but NOT when hovering the close button + // 'g.HoveredId==id' will be true when hovering the Tab including when hovering the close button + // 'g.ActiveId==close_button_id' will be true when we are holding on the close button, in which case both hovered booleans are false + bool close_button_pressed = false; + bool close_button_visible = false; + if (close_button_id != 0) + if (is_contents_visible || bb.GetWidth() >= ImMax(button_sz, g.Style.TabMinWidthForCloseButton)) + if (g.HoveredId == tab_id || g.HoveredId == close_button_id || g.ActiveId == tab_id || g.ActiveId == close_button_id) + close_button_visible = true; + bool unsaved_marker_visible = (flags & ImGuiTabItemFlags_UnsavedDocument) != 0 && (button_pos.x + button_sz <= bb.Max.x); + + if (close_button_visible) + { + ImGuiLastItemData last_item_backup = g.LastItemData; + PushStyleVar(ImGuiStyleVar_FramePadding, frame_padding); + if (CloseButton(close_button_id, button_pos)) + close_button_pressed = true; + PopStyleVar(); + g.LastItemData = last_item_backup; + + // Close with middle mouse button + if (!(flags & ImGuiTabItemFlags_NoCloseWithMiddleMouseButton) && IsMouseClicked(2)) + close_button_pressed = true; + } + else if (unsaved_marker_visible) + { + const ImRect bullet_bb(button_pos, button_pos + ImVec2(button_sz, button_sz) + g.Style.FramePadding * 2.0f); + RenderBullet(draw_list, bullet_bb.GetCenter(), GetColorU32(ImGuiCol_Text)); + } + + // This is all rather complicated + // (the main idea is that because the close button only appears on hover, we don't want it to alter the ellipsis position) + // FIXME: if FramePadding is noticeably large, ellipsis_max_x will be wrong here (e.g. #3497), maybe for consistency that parameter of RenderTextEllipsis() shouldn't exist.. + float ellipsis_max_x = close_button_visible ? text_pixel_clip_bb.Max.x : bb.Max.x - 1.0f; + if (close_button_visible || unsaved_marker_visible) + { + text_pixel_clip_bb.Max.x -= close_button_visible ? (button_sz) : (button_sz * 0.80f); + text_ellipsis_clip_bb.Max.x -= unsaved_marker_visible ? (button_sz * 0.80f) : 0.0f; + ellipsis_max_x = text_pixel_clip_bb.Max.x; + } + RenderTextEllipsis(draw_list, text_ellipsis_clip_bb.Min, text_ellipsis_clip_bb.Max, text_pixel_clip_bb.Max.x, ellipsis_max_x, label, NULL, &label_size); + +#if 0 + if (!is_contents_visible) + g.Style.Alpha = backup_alpha; +#endif + + if (out_just_closed) + *out_just_closed = close_button_pressed; +} + + +#endif // #ifndef IMGUI_DISABLE diff --git a/3rdparty/imgui/src/imstb_rectpack.h b/3rdparty/imgui/src/imstb_rectpack.h new file mode 100644 index 0000000000..f6917e7a6e --- /dev/null +++ b/3rdparty/imgui/src/imstb_rectpack.h @@ -0,0 +1,627 @@ +// [DEAR IMGUI] +// This is a slightly modified version of stb_rect_pack.h 1.01. +// Grep for [DEAR IMGUI] to find the changes. +// +// stb_rect_pack.h - v1.01 - public domain - rectangle packing +// Sean Barrett 2014 +// +// Useful for e.g. packing rectangular textures into an atlas. +// Does not do rotation. +// +// Before #including, +// +// #define STB_RECT_PACK_IMPLEMENTATION +// +// in the file that you want to have the implementation. +// +// Not necessarily the awesomest packing method, but better than +// the totally naive one in stb_truetype (which is primarily what +// this is meant to replace). +// +// Has only had a few tests run, may have issues. +// +// More docs to come. +// +// No memory allocations; uses qsort() and assert() from stdlib. +// Can override those by defining STBRP_SORT and STBRP_ASSERT. +// +// This library currently uses the Skyline Bottom-Left algorithm. +// +// Please note: better rectangle packers are welcome! Please +// implement them to the same API, but with a different init +// function. +// +// Credits +// +// Library +// Sean Barrett +// Minor features +// Martins Mozeiko +// github:IntellectualKitty +// +// Bugfixes / warning fixes +// Jeremy Jaussaud +// Fabian Giesen +// +// Version history: +// +// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section +// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles +// 0.99 (2019-02-07) warning fixes +// 0.11 (2017-03-03) return packing success/fail result +// 0.10 (2016-10-25) remove cast-away-const to avoid warnings +// 0.09 (2016-08-27) fix compiler warnings +// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) +// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) +// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort +// 0.05: added STBRP_ASSERT to allow replacing assert +// 0.04: fixed minor bug in STBRP_LARGE_RECTS support +// 0.01: initial release +// +// LICENSE +// +// See end of file for license information. + +////////////////////////////////////////////////////////////////////////////// +// +// INCLUDE SECTION +// + +#ifndef STB_INCLUDE_STB_RECT_PACK_H +#define STB_INCLUDE_STB_RECT_PACK_H + +#define STB_RECT_PACK_VERSION 1 + +#ifdef STBRP_STATIC +#define STBRP_DEF static +#else +#define STBRP_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stbrp_context stbrp_context; +typedef struct stbrp_node stbrp_node; +typedef struct stbrp_rect stbrp_rect; + +typedef int stbrp_coord; + +#define STBRP__MAXVAL 0x7fffffff +// Mostly for internal use, but this is the maximum supported coordinate value. + +STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects); +// Assign packed locations to rectangles. The rectangles are of type +// 'stbrp_rect' defined below, stored in the array 'rects', and there +// are 'num_rects' many of them. +// +// Rectangles which are successfully packed have the 'was_packed' flag +// set to a non-zero value and 'x' and 'y' store the minimum location +// on each axis (i.e. bottom-left in cartesian coordinates, top-left +// if you imagine y increasing downwards). Rectangles which do not fit +// have the 'was_packed' flag set to 0. +// +// You should not try to access the 'rects' array from another thread +// while this function is running, as the function temporarily reorders +// the array while it executes. +// +// To pack into another rectangle, you need to call stbrp_init_target +// again. To continue packing into the same rectangle, you can call +// this function again. Calling this multiple times with multiple rect +// arrays will probably produce worse packing results than calling it +// a single time with the full rectangle array, but the option is +// available. +// +// The function returns 1 if all of the rectangles were successfully +// packed and 0 otherwise. + +struct stbrp_rect +{ + // reserved for your use: + int id; + + // input: + stbrp_coord w, h; + + // output: + stbrp_coord x, y; + int was_packed; // non-zero if valid packing + +}; // 16 bytes, nominally + + +STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes); +// Initialize a rectangle packer to: +// pack a rectangle that is 'width' by 'height' in dimensions +// using temporary storage provided by the array 'nodes', which is 'num_nodes' long +// +// You must call this function every time you start packing into a new target. +// +// There is no "shutdown" function. The 'nodes' memory must stay valid for +// the following stbrp_pack_rects() call (or calls), but can be freed after +// the call (or calls) finish. +// +// Note: to guarantee best results, either: +// 1. make sure 'num_nodes' >= 'width' +// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' +// +// If you don't do either of the above things, widths will be quantized to multiples +// of small integers to guarantee the algorithm doesn't run out of temporary storage. +// +// If you do #2, then the non-quantized algorithm will be used, but the algorithm +// may run out of temporary storage and be unable to pack some rectangles. + +STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem); +// Optionally call this function after init but before doing any packing to +// change the handling of the out-of-temp-memory scenario, described above. +// If you call init again, this will be reset to the default (false). + + +STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic); +// Optionally select which packing heuristic the library should use. Different +// heuristics will produce better/worse results for different data sets. +// If you call init again, this will be reset to the default. + +enum +{ + STBRP_HEURISTIC_Skyline_default=0, + STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, + STBRP_HEURISTIC_Skyline_BF_sortHeight +}; + + +////////////////////////////////////////////////////////////////////////////// +// +// the details of the following structures don't matter to you, but they must +// be visible so you can handle the memory allocations for them + +struct stbrp_node +{ + stbrp_coord x,y; + stbrp_node *next; +}; + +struct stbrp_context +{ + int width; + int height; + int align; + int init_mode; + int heuristic; + int num_nodes; + stbrp_node *active_head; + stbrp_node *free_head; + stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' +}; + +#ifdef __cplusplus +} +#endif + +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// IMPLEMENTATION SECTION +// + +#ifdef STB_RECT_PACK_IMPLEMENTATION +#ifndef STBRP_SORT +#include +#define STBRP_SORT qsort +#endif + +#ifndef STBRP_ASSERT +#include +#define STBRP_ASSERT assert +#endif + +#ifdef _MSC_VER +#define STBRP__NOTUSED(v) (void)(v) +#define STBRP__CDECL __cdecl +#else +#define STBRP__NOTUSED(v) (void)sizeof(v) +#define STBRP__CDECL +#endif + +enum +{ + STBRP__INIT_skyline = 1 +}; + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic) +{ + switch (context->init_mode) { + case STBRP__INIT_skyline: + STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); + context->heuristic = heuristic; + break; + default: + STBRP_ASSERT(0); + } +} + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem) +{ + if (allow_out_of_mem) + // if it's ok to run out of memory, then don't bother aligning them; + // this gives better packing, but may fail due to OOM (even though + // the rectangles easily fit). @TODO a smarter approach would be to only + // quantize once we've hit OOM, then we could get rid of this parameter. + context->align = 1; + else { + // if it's not ok to run out of memory, then quantize the widths + // so that num_nodes is always enough nodes. + // + // I.e. num_nodes * align >= width + // align >= width / num_nodes + // align = ceil(width/num_nodes) + + context->align = (context->width + context->num_nodes-1) / context->num_nodes; + } +} + +STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes) +{ + int i; + + for (i=0; i < num_nodes-1; ++i) + nodes[i].next = &nodes[i+1]; + nodes[i].next = NULL; + context->init_mode = STBRP__INIT_skyline; + context->heuristic = STBRP_HEURISTIC_Skyline_default; + context->free_head = &nodes[0]; + context->active_head = &context->extra[0]; + context->width = width; + context->height = height; + context->num_nodes = num_nodes; + stbrp_setup_allow_out_of_mem(context, 0); + + // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) + context->extra[0].x = 0; + context->extra[0].y = 0; + context->extra[0].next = &context->extra[1]; + context->extra[1].x = (stbrp_coord) width; + context->extra[1].y = (1<<30); + context->extra[1].next = NULL; +} + +// find minimum y position if it starts at x1 +static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste) +{ + stbrp_node *node = first; + int x1 = x0 + width; + int min_y, visited_width, waste_area; + + STBRP__NOTUSED(c); + + STBRP_ASSERT(first->x <= x0); + + #if 0 + // skip in case we're past the node + while (node->next->x <= x0) + ++node; + #else + STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency + #endif + + STBRP_ASSERT(node->x <= x0); + + min_y = 0; + waste_area = 0; + visited_width = 0; + while (node->x < x1) { + if (node->y > min_y) { + // raise min_y higher. + // we've accounted for all waste up to min_y, + // but we'll now add more waste for everything we've visted + waste_area += visited_width * (node->y - min_y); + min_y = node->y; + // the first time through, visited_width might be reduced + if (node->x < x0) + visited_width += node->next->x - x0; + else + visited_width += node->next->x - node->x; + } else { + // add waste area + int under_width = node->next->x - node->x; + if (under_width + visited_width > width) + under_width = width - visited_width; + waste_area += under_width * (min_y - node->y); + visited_width += under_width; + } + node = node->next; + } + + *pwaste = waste_area; + return min_y; +} + +typedef struct +{ + int x,y; + stbrp_node **prev_link; +} stbrp__findresult; + +static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height) +{ + int best_waste = (1<<30), best_x, best_y = (1 << 30); + stbrp__findresult fr; + stbrp_node **prev, *node, *tail, **best = NULL; + + // align to multiple of c->align + width = (width + c->align - 1); + width -= width % c->align; + STBRP_ASSERT(width % c->align == 0); + + // if it can't possibly fit, bail immediately + if (width > c->width || height > c->height) { + fr.prev_link = NULL; + fr.x = fr.y = 0; + return fr; + } + + node = c->active_head; + prev = &c->active_head; + while (node->x + width <= c->width) { + int y,waste; + y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); + if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL + // bottom left + if (y < best_y) { + best_y = y; + best = prev; + } + } else { + // best-fit + if (y + height <= c->height) { + // can only use it if it first vertically + if (y < best_y || (y == best_y && waste < best_waste)) { + best_y = y; + best_waste = waste; + best = prev; + } + } + } + prev = &node->next; + node = node->next; + } + + best_x = (best == NULL) ? 0 : (*best)->x; + + // if doing best-fit (BF), we also have to try aligning right edge to each node position + // + // e.g, if fitting + // + // ____________________ + // |____________________| + // + // into + // + // | | + // | ____________| + // |____________| + // + // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned + // + // This makes BF take about 2x the time + + if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { + tail = c->active_head; + node = c->active_head; + prev = &c->active_head; + // find first node that's admissible + while (tail->x < width) + tail = tail->next; + while (tail) { + int xpos = tail->x - width; + int y,waste; + STBRP_ASSERT(xpos >= 0); + // find the left position that matches this + while (node->next->x <= xpos) { + prev = &node->next; + node = node->next; + } + STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); + y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); + if (y + height <= c->height) { + if (y <= best_y) { + if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { + best_x = xpos; + //STBRP_ASSERT(y <= best_y); [DEAR IMGUI] + best_y = y; + best_waste = waste; + best = prev; + } + } + } + tail = tail->next; + } + } + + fr.prev_link = best; + fr.x = best_x; + fr.y = best_y; + return fr; +} + +static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height) +{ + // find best position according to heuristic + stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); + stbrp_node *node, *cur; + + // bail if: + // 1. it failed + // 2. the best node doesn't fit (we don't always check this) + // 3. we're out of memory + if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { + res.prev_link = NULL; + return res; + } + + // on success, create new node + node = context->free_head; + node->x = (stbrp_coord) res.x; + node->y = (stbrp_coord) (res.y + height); + + context->free_head = node->next; + + // insert the new node into the right starting point, and + // let 'cur' point to the remaining nodes needing to be + // stiched back in + + cur = *res.prev_link; + if (cur->x < res.x) { + // preserve the existing one, so start testing with the next one + stbrp_node *next = cur->next; + cur->next = node; + cur = next; + } else { + *res.prev_link = node; + } + + // from here, traverse cur and free the nodes, until we get to one + // that shouldn't be freed + while (cur->next && cur->next->x <= res.x + width) { + stbrp_node *next = cur->next; + // move the current node to the free list + cur->next = context->free_head; + context->free_head = cur; + cur = next; + } + + // stitch the list back in + node->next = cur; + + if (cur->x < res.x + width) + cur->x = (stbrp_coord) (res.x + width); + +#ifdef _DEBUG + cur = context->active_head; + while (cur->x < context->width) { + STBRP_ASSERT(cur->x < cur->next->x); + cur = cur->next; + } + STBRP_ASSERT(cur->next == NULL); + + { + int count=0; + cur = context->active_head; + while (cur) { + cur = cur->next; + ++count; + } + cur = context->free_head; + while (cur) { + cur = cur->next; + ++count; + } + STBRP_ASSERT(count == context->num_nodes+2); + } +#endif + + return res; +} + +static int STBRP__CDECL rect_height_compare(const void *a, const void *b) +{ + const stbrp_rect *p = (const stbrp_rect *) a; + const stbrp_rect *q = (const stbrp_rect *) b; + if (p->h > q->h) + return -1; + if (p->h < q->h) + return 1; + return (p->w > q->w) ? -1 : (p->w < q->w); +} + +static int STBRP__CDECL rect_original_order(const void *a, const void *b) +{ + const stbrp_rect *p = (const stbrp_rect *) a; + const stbrp_rect *q = (const stbrp_rect *) b; + return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); +} + +STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects) +{ + int i, all_rects_packed = 1; + + // we use the 'was_packed' field internally to allow sorting/unsorting + for (i=0; i < num_rects; ++i) { + rects[i].was_packed = i; + } + + // sort according to heuristic + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); + + for (i=0; i < num_rects; ++i) { + if (rects[i].w == 0 || rects[i].h == 0) { + rects[i].x = rects[i].y = 0; // empty rect needs no space + } else { + stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); + if (fr.prev_link) { + rects[i].x = (stbrp_coord) fr.x; + rects[i].y = (stbrp_coord) fr.y; + } else { + rects[i].x = rects[i].y = STBRP__MAXVAL; + } + } + } + + // unsort + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); + + // set was_packed flags and all_rects_packed status + for (i=0; i < num_rects; ++i) { + rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); + if (!rects[i].was_packed) + all_rects_packed = 0; + } + + // return the all_rects_packed status + return all_rects_packed; +} +#endif + +/* +------------------------------------------------------------------------------ +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/3rdparty/imgui/src/imstb_truetype.h b/3rdparty/imgui/src/imstb_truetype.h new file mode 100644 index 0000000000..643d37899e --- /dev/null +++ b/3rdparty/imgui/src/imstb_truetype.h @@ -0,0 +1,5085 @@ +// [DEAR IMGUI] +// This is a slightly modified version of stb_truetype.h 1.26. +// Mostly fixing for compiler and static analyzer warnings. +// Grep for [DEAR IMGUI] to find the changes. + +// stb_truetype.h - v1.26 - public domain +// authored from 2009-2021 by Sean Barrett / RAD Game Tools +// +// ======================================================================= +// +// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES +// +// This library does no range checking of the offsets found in the file, +// meaning an attacker can use it to read arbitrary memory. +// +// ======================================================================= +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// render glyphs to one-channel SDF bitmaps (signed-distance field/function) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// Dougall Johnson: OpenType / Type 2 font handling +// Daniel Ribeiro Maciel: basic GPOS-based kerning +// +// Misc other: +// Ryan Gordon +// Simon Glass +// github:IntellectualKitty +// Imanol Celaya +// Daniel Ribeiro Maciel +// +// Bug/warning reports/fixes: +// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe +// Cass Everitt Martins Mozeiko github:aloucks +// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam +// Brian Hook Omar Cornut github:vassvik +// Walter van Niftrik Ryan Griege +// David Gow Peter LaValle +// David Given Sergey Popov +// Ivan-Assen Ivanov Giumo X. Clanjor +// Anthony Pesch Higor Euripedes +// Johan Duparc Thomas Fields +// Hou Qiming Derek Vinyard +// Rob Loach Cort Stratton +// Kenney Phillis Jr. Brian Costabile +// Ken Voskuil (kaesve) +// +// VERSION HISTORY +// +// 1.26 (2021-08-28) fix broken rasterizer +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// variant PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// +// Full history can be found at the end of this file. +// +// LICENSE +// +// See end of file for license information. +// +// USAGE +// +// Include this file in whatever places need to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// To make the implementation private to the file that generates the implementation, +// #define STBTT_STATIC +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// Improved 3D API (more shippable): +// #include "stb_rect_pack.h" -- optional, but you really want it +// stbtt_PackBegin() +// stbtt_PackSetOversampling() -- for improved quality on small fonts +// stbtt_PackFontRanges() -- pack and renders +// stbtt_PackEnd() +// stbtt_GetPackedQuad() +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections +// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetFontVMetricsOS2() +// stbtt_GetCodepointKernAdvance() +// +// Starting with version 1.06, the rasterizer was replaced with a new, +// faster and generally-more-precise rasterizer. The new rasterizer more +// accurately measures pixel coverage for anti-aliasing, except in the case +// where multiple shapes overlap, in which case it overestimates the AA pixel +// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If +// this turns out to be a problem, you can re-enable the old rasterizer with +// #define STBTT_RASTERIZER_VERSION 1 +// which will incur about a 15% speed hit. +// +// ADDITIONAL DOCUMENTATION +// +// Immediately after this block comment are a series of sample programs. +// +// After the sample programs is the "header file" section. This section +// includes documentation for each API function. +// +// Some important concepts to understand to use this library: +// +// Codepoint +// Characters are defined by unicode codepoints, e.g. 65 is +// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is +// the hiragana for "ma". +// +// Glyph +// A visual character shape (every codepoint is rendered as +// some glyph) +// +// Glyph index +// A font-specific integer ID representing a glyph +// +// Baseline +// Glyph shapes are defined relative to a baseline, which is the +// bottom of uppercase characters. Characters extend both above +// and below the baseline. +// +// Current Point +// As you draw text to the screen, you keep track of a "current point" +// which is the origin of each character. The current point's vertical +// position is the baseline. Even "baked fonts" use this model. +// +// Vertical Font Metrics +// The vertical qualities of the font, used to vertically position +// and space the characters. See docs for stbtt_GetFontVMetrics. +// +// Font Size in Pixels or Points +// The preferred interface for specifying font sizes in stb_truetype +// is to specify how tall the font's vertical extent should be in pixels. +// If that sounds good enough, skip the next paragraph. +// +// Most font APIs instead use "points", which are a common typographic +// measurement for describing font size, defined as 72 points per inch. +// stb_truetype provides a point API for compatibility. However, true +// "per inch" conventions don't make much sense on computer displays +// since different monitors have different number of pixels per +// inch. For example, Windows traditionally uses a convention that +// there are 96 pixels per inch, thus making 'inch' measurements have +// nothing to do with inches, and thus effectively defining a point to +// be 1.333 pixels. Additionally, the TrueType font data provides +// an explicit scale factor to scale a given font's glyphs to points, +// but the author has observed that this scale factor is often wrong +// for non-commercial fonts, thus making fonts scaled in points +// according to the TrueType spec incoherently sized in practice. +// +// DETAILED USAGE: +// +// Scale: +// Select how high you want the font to be, in points or pixels. +// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute +// a scale factor SF that will be used by all other functions. +// +// Baseline: +// You need to select a y-coordinate that is the baseline of where +// your text will appear. Call GetFontBoundingBox to get the baseline-relative +// bounding box for all characters. SF*-y0 will be the distance in pixels +// that the worst-case character could extend above the baseline, so if +// you want the top edge of characters to appear at the top of the +// screen where y=0, then you would set the baseline to SF*-y0. +// +// Current point: +// Set the current point where the first character will appear. The +// first character could extend left of the current point; this is font +// dependent. You can either choose a current point that is the leftmost +// point and hope, or add some padding, or check the bounding box or +// left-side-bearing of the first character to be displayed and set +// the current point based on that. +// +// Displaying a character: +// Compute the bounding box of the character. It will contain signed values +// relative to . I.e. if it returns x0,y0,x1,y1, +// then the character should be displayed in the rectangle from +// to = 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 + glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0); + glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0); + glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1); + glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1<<25]; + +int main(int argc, char **argv) +{ + stbtt_fontinfo font; + unsigned char *bitmap; + int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); + + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24<<20]; +unsigned char screen[20][79]; + +int main(int arg, char **argv) +{ + stbtt_fontinfo font; + int i,j,ascent,baseline,ch=0; + float scale, xpos=2; // leave a little padding in case the character extends left + char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent,0,0); + baseline = (int) (ascent*scale); + + while (text[ch]) { + int advance,lsb,x0,y0,x1,y1; + float x_shift = xpos - (float) floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to render + // a sequence of characters, you really need to render each bitmap to a temp buffer, then + // "alpha blend" that into the working buffer + xpos += (advance * scale); + if (text[ch+1]) + xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); + ++ch; + } + + for (j=0; j < 20; ++j) { + for (i=0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i]>>5]); + putchar('\n'); + } + + return 0; +} +#endif + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH YOUR CODEBASE +//// +//// The following sections allow you to supply alternate definitions +//// of C library functions used by stb_truetype, e.g. if you don't +//// link with the C runtime library. + +#ifdef STB_TRUETYPE_IMPLEMENTATION + // #define your own (u)stbtt_int8/16/32 before including to override this + #ifndef stbtt_uint8 + typedef unsigned char stbtt_uint8; + typedef signed char stbtt_int8; + typedef unsigned short stbtt_uint16; + typedef signed short stbtt_int16; + typedef unsigned int stbtt_uint32; + typedef signed int stbtt_int32; + #endif + + typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; + typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; + + // e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h + #ifndef STBTT_ifloor + #include + #define STBTT_ifloor(x) ((int) floor(x)) + #define STBTT_iceil(x) ((int) ceil(x)) + #endif + + #ifndef STBTT_sqrt + #include + #define STBTT_sqrt(x) sqrt(x) + #define STBTT_pow(x,y) pow(x,y) + #endif + + #ifndef STBTT_fmod + #include + #define STBTT_fmod(x,y) fmod(x,y) + #endif + + #ifndef STBTT_cos + #include + #define STBTT_cos(x) cos(x) + #define STBTT_acos(x) acos(x) + #endif + + #ifndef STBTT_fabs + #include + #define STBTT_fabs(x) fabs(x) + #endif + + // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h + #ifndef STBTT_malloc + #include + #define STBTT_malloc(x,u) ((void)(u),malloc(x)) + #define STBTT_free(x,u) ((void)(u),free(x)) + #endif + + #ifndef STBTT_assert + #include + #define STBTT_assert(x) assert(x) + #endif + + #ifndef STBTT_strlen + #include + #define STBTT_strlen(x) strlen(x) + #endif + + #ifndef STBTT_memcpy + #include + #define STBTT_memcpy memcpy + #define STBTT_memset memset + #endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef STBTT_STATIC +#define STBTT_DEF static +#else +#define STBTT_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// private structure +typedef struct +{ + unsigned char *data; + int cursor; + int size; +} stbtt__buf; + +////////////////////////////////////////////////////////////////////////////// +// +// TEXTURE BAKING API +// +// If you use this API, you only have to call two functions ever. +// + +typedef struct +{ + unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap + float xoff,yoff,xadvance; +} stbtt_bakedchar; + +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata); // you allocate this, it's num_chars long +// if return is positive, the first unused row of the bitmap +// if return is negative, returns the negative of the number of characters that fit +// if return is 0, no characters fit and no rows were used +// This uses a very crappy packing. + +typedef struct +{ + float x0,y0,s0,t0; // top-left + float x1,y1,s1,t1; // bottom-right +} stbtt_aligned_quad; + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, // same data as above + int char_index, // character to display + float *xpos, float *ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad *q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// +// The coordinate system used assumes y increases downwards. +// +// Characters will extend both above and below the current position; +// see discussion of "BASELINE" above. +// +// It's inefficient; you might want to c&p it and optimize it. + +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap); +// Query the font vertical metrics without having to create a font first. + + +////////////////////////////////////////////////////////////////////////////// +// +// NEW TEXTURE BAKING API +// +// This provides options for packing multiple fonts into one atlas, not +// perfectly but better than nothing. + +typedef struct +{ + unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap + float xoff,yoff,xadvance; + float xoff2,yoff2; +} stbtt_packedchar; + +typedef struct stbtt_pack_context stbtt_pack_context; +typedef struct stbtt_fontinfo stbtt_fontinfo; +#ifndef STB_RECT_PACK_VERSION +typedef struct stbrp_rect stbrp_rect; +#endif + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); +// Initializes a packing context stored in the passed-in stbtt_pack_context. +// Future calls using this context will pack characters into the bitmap passed +// in here: a 1-channel bitmap that is width * height. stride_in_bytes is +// the distance from one row to the next (or 0 to mean they are packed tightly +// together). "padding" is the amount of padding to leave between each +// character (normally you want '1' for bitmaps you'll use as textures with +// bilinear filtering). +// +// Returns 0 on failure, 1 on success. + +STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); +// Cleans up the packing context and frees all memory. + +#define STBTT_POINT_SIZE(x) (-(x)) + +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, + int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); +// Creates character bitmaps from the font_index'th font found in fontdata (use +// font_index=0 if you don't know what that is). It creates num_chars_in_range +// bitmaps for characters with unicode values starting at first_unicode_char_in_range +// and increasing. Data for how to render them is stored in chardata_for_range; +// pass these to stbtt_GetPackedQuad to get back renderable quads. +// +// font_size is the full height of the character from ascender to descender, +// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed +// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() +// and pass that result as 'font_size': +// ..., 20 , ... // font max minus min y is 20 pixels tall +// ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall + +typedef struct +{ + float font_size; + int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint + int *array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints + int num_chars; + stbtt_packedchar *chardata_for_range; // output + unsigned char h_oversample, v_oversample; // don't set these, they're used internally +} stbtt_pack_range; + +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); +// Creates character bitmaps from multiple ranges of characters stored in +// ranges. This will usually create a better-packed bitmap than multiple +// calls to stbtt_PackFontRange. Note that you can call this multiple +// times within a single PackBegin/PackEnd. + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); +// Oversampling a font increases the quality by allowing higher-quality subpixel +// positioning, and is especially valuable at smaller text sizes. +// +// This function sets the amount of oversampling for all following calls to +// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given +// pack context. The default (no oversampling) is achieved by h_oversample=1 +// and v_oversample=1. The total number of pixels required is +// h_oversample*v_oversample larger than the default; for example, 2x2 +// oversampling requires 4x the storage of 1x1. For best results, render +// oversampled textures with bilinear filtering. Look at the readme in +// stb/tests/oversample for information about oversampled fonts +// +// To use with PackFontRangesGather etc., you must set it before calls +// call to PackFontRangesGatherRects. + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); +// If skip != 0, this tells stb_truetype to skip any codepoints for which +// there is no corresponding glyph. If skip=0, which is the default, then +// codepoints without a glyph recived the font's "missing character" glyph, +// typically an empty box by convention. + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above + int char_index, // character to display + float *xpos, float *ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad *q, // output: quad to draw + int align_to_integer); + +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); +// Calling these functions in sequence is roughly equivalent to calling +// stbtt_PackFontRanges(). If you more control over the packing of multiple +// fonts, or if you want to pack custom data into a font texture, take a look +// at the source to of stbtt_PackFontRanges() and create a custom version +// using these functions, e.g. call GatherRects multiple times, +// building up a single array of rects, then call PackRects once, +// then call RenderIntoRects repeatedly. This may result in a +// better packing than calling PackFontRanges multiple times +// (or it may not). + +// this is an opaque structure that you shouldn't mess with which holds +// all the context needed from PackBegin to PackEnd. +struct stbtt_pack_context { + void *user_allocator_context; + void *pack_info; + int width; + int height; + int stride_in_bytes; + int padding; + int skip_missing; + unsigned int h_oversample, v_oversample; + unsigned char *pixels; + void *nodes; +}; + +////////////////////////////////////////////////////////////////////////////// +// +// FONT LOADING +// +// + +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); +// This function will determine the number of fonts in a font file. TrueType +// collection (.ttc) files may contain multiple fonts, while TrueType font +// (.ttf) files only contain one font. The number of fonts can be used for +// indexing with the previous function where the index is between zero and one +// less than the total fonts. If an error occurs, -1 is returned. + +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); +// Each .ttf/.ttc file may have more than one font. Each font has a sequential +// index number starting from 0. Call this function to get the font offset for +// a given index; it returns -1 if the index is out of range. A regular .ttf +// file will only define one font and it always be at offset 0, so it will +// return '0' for index 0, and -1 for all other indices. + +// The following structure is defined publicly so you can declare one on +// the stack or as a global or etc, but you should treat it as opaque. +struct stbtt_fontinfo +{ + void * userdata; + unsigned char * data; // pointer to .ttf file + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph + + stbtt__buf cff; // cff font data + stbtt__buf charstrings; // the charstring index + stbtt__buf gsubrs; // global charstring subroutines index + stbtt__buf subrs; // private charstring subroutines index + stbtt__buf fontdicts; // array of font dicts + stbtt__buf fdselect; // map from glyph to fontdict +}; + +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); +// Given an offset into the file that defines a font, this function builds +// the necessary cached info for the rest of the system. You must allocate +// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't +// need to do anything special to free it, because the contents are pure +// value data with no additional data structures. Returns 0 on failure. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER TO GLYPH-INDEX CONVERSIOn + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); +// If you're going to perform multiple operations on the same character +// and you want a speed-up, call this function with the character you're +// going to process, then use glyph-based functions instead of the +// codepoint-based functions. +// Returns 0 if the character codepoint is not defined in the font. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER PROPERTIES +// + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); +// computes a scale factor to produce a font whose "height" is 'pixels' tall. +// Height is measured as the distance from the highest ascender to the lowest +// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics +// and computing: +// scale = pixels / (ascent - descent) +// so if you prefer to measure height by the ascent only, use a similar calculation. + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); +// computes a scale factor to produce a font whose EM size is mapped to +// 'pixels' tall. This is probably what traditional APIs compute, but +// I'm not positive. + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); +// ascent is the coordinate above the baseline the font extends; descent +// is the coordinate below the baseline the font extends (i.e. it is typically negative) +// lineGap is the spacing between one row's descent and the next row's ascent... +// so you should advance the vertical position by "*ascent - *descent + *lineGap" +// these are expressed in unscaled coordinates, so you must multiply by +// the scale factor for a given size + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap); +// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 +// table (specific to MS/Windows TTF files). +// +// Returns 1 on success (table present), 0 on failure. + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); +// the bounding box around all possible characters + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); +// leftSideBearing is the offset from the current horizontal position to the left edge of the character +// advanceWidth is the offset from the current horizontal position to the next horizontal position +// these are expressed in unscaled coordinates + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); +// an additional amount to add to the 'advance' value between ch1 and ch2 + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); +// Gets the bounding box of the visible part of the glyph, in unscaled coordinates + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); +// as above, but takes one or more glyph indices for greater efficiency + +typedef struct stbtt_kerningentry +{ + int glyph1; // use stbtt_FindGlyphIndex + int glyph2; + int advance; +} stbtt_kerningentry; + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info); +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length); +// Retrieves a complete list of all of the kerning pairs provided by the font +// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. +// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) + +////////////////////////////////////////////////////////////////////////////// +// +// GLYPH SHAPES (you probably don't need these, but they have to go before +// the bitmaps for C declaration-order reasons) +// + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) + enum { + STBTT_vmove=1, + STBTT_vline, + STBTT_vcurve, + STBTT_vcubic + }; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values + // (we share this with other code at RAD) + #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file + typedef struct + { + stbtt_vertex_type x,y,cx,cy,cx1,cy1; + unsigned char type,padding; + } stbtt_vertex; +#endif + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); +// returns non-zero if nothing is drawn for this glyph + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); +// returns # of vertices and fills *vertices with the pointer to them +// these are expressed in "unscaled" coordinates +// +// The shape is a series of contours. Each one starts with +// a STBTT_moveto, then consists of a series of mixed +// STBTT_lineto and STBTT_curveto segments. A lineto +// draws a line from previous endpoint to its x,y; a curveto +// draws a quadratic bezier from previous endpoint to +// its x,y, using cx,cy as the bezier control point. + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); +// frees the data allocated above + +STBTT_DEF unsigned char *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl); +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg); +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg); +// fills svg with the character's SVG data. +// returns data size or 0 if SVG not found. + +////////////////////////////////////////////////////////////////////////////// +// +// BITMAP RENDERING +// + +STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); +// frees the bitmap allocated below + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// allocates a large-enough single-channel 8bpp bitmap and renders the +// specified character/glyph at the specified scale into it, with +// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). +// *width & *height are filled out with the width & height of the bitmap, +// which is stored left-to-right, top-to-bottom. +// +// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); +// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap +// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap +// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the +// width and height and positioning info for it first. + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); +// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint); +// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering +// is performed (see stbtt_PackSetOversampling) + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +// get the bbox of the bitmap centered around the glyph origin; so the +// bitmap width is ix1-ix0, height is iy1-iy0, and location to place +// the bitmap top left is (leftSideBearing*scale,iy0). +// (Note that the bitmap uses y-increases-down, but the shape uses +// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); +// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel +// shift for the character + +// the following functions are equivalent to the above functions, but operate +// on glyph indices instead of Unicode codepoints (for efficiency) +STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); +STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int glyph); +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); + + +// @TODO: don't expose this structure +typedef struct +{ + int w,h,stride; + unsigned char *pixels; +} stbtt__bitmap; + +// rasterize a shape with quadratic beziers into a bitmap +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, // 1-channel bitmap to draw into + float flatness_in_pixels, // allowable error of curve in pixels + stbtt_vertex *vertices, // array of vertices defining shape + int num_verts, // number of vertices in above array + float scale_x, float scale_y, // scale applied to input vertices + float shift_x, float shift_y, // translation applied to input vertices + int x_off, int y_off, // another translation applied to input + int invert, // if non-zero, vertically flip shape + void *userdata); // context for to STBTT_MALLOC + +////////////////////////////////////////////////////////////////////////////// +// +// Signed Distance Function (or Field) rendering + +STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata); +// frees the SDF bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); +// These functions compute a discretized SDF field for a single character, suitable for storing +// in a single-channel texture, sampling with bilinear filtering, and testing against +// larger than some threshold to produce scalable fonts. +// info -- the font +// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap +// glyph/codepoint -- the character to generate the SDF for +// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), +// which allows effects like bit outlines +// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) +// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) +// if positive, > onedge_value is inside; if negative, < onedge_value is inside +// width,height -- output height & width of the SDF bitmap (including padding) +// xoff,yoff -- output origin of the character +// return value -- a 2D array of bytes 0..255, width*height in size +// +// pixel_dist_scale & onedge_value are a scale & bias that allows you to make +// optimal use of the limited 0..255 for your application, trading off precision +// and special effects. SDF values outside the range 0..255 are clamped to 0..255. +// +// Example: +// scale = stbtt_ScaleForPixelHeight(22) +// padding = 5 +// onedge_value = 180 +// pixel_dist_scale = 180/5.0 = 36.0 +// +// This will create an SDF bitmap in which the character is about 22 pixels +// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled +// shape, sample the SDF at each pixel and fill the pixel if the SDF value +// is greater than or equal to 180/255. (You'll actually want to antialias, +// which is beyond the scope of this example.) Additionally, you can compute +// offset outlines (e.g. to stroke the character border inside & outside, +// or only outside). For example, to fill outside the character up to 3 SDF +// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above +// choice of variables maps a range from 5 pixels outside the shape to +// 2 pixels inside the shape to 0..255; this is intended primarily for apply +// outside effects only (the interior range is needed to allow proper +// antialiasing of the font at *smaller* sizes) +// +// The function computes the SDF analytically at each SDF pixel, not by e.g. +// building a higher-res bitmap and approximating it. In theory the quality +// should be as high as possible for an SDF of this size & representation, but +// unclear if this is true in practice (perhaps building a higher-res bitmap +// and computing from that can allow drop-out prevention). +// +// The algorithm has not been optimized at all, so expect it to be slow +// if computing lots of characters or very large sizes. + + + +////////////////////////////////////////////////////////////////////////////// +// +// Finding the right font... +// +// You should really just solve this offline, keep your own tables +// of what font is what, and don't try to get it out of the .ttf file. +// That's because getting it out of the .ttf file is really hard, because +// the names in the file can appear in many possible encodings, in many +// possible languages, and e.g. if you need a case-insensitive comparison, +// the details of that depend on the encoding & language in a complex way +// (actually underspecified in truetype, but also gigantic). +// +// But you can use the provided functions in two possible ways: +// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on +// unicode-encoded names to try to find the font you want; +// you can run this before calling stbtt_InitFont() +// +// stbtt_GetFontNameString() lets you get any of the various strings +// from the file yourself and do your own comparisons on them. +// You have to have called stbtt_InitFont() first. + + +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); +// returns the offset (not index) of the font that matches, or -1 if none +// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". +// if you use any other flag, use a font name like "Arial"; this checks +// the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); +// returns 1/0 whether the first string interpreted as utf8 is identical to +// the second string interpreted as big-endian utf16... useful for strings from next func + +STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); +// returns the string (which may be big-endian double byte, e.g. for unicode) +// and puts the length in bytes in *length. +// +// some of the values for the IDs are below; for more see the truetype spec: +// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html +// http://www.microsoft.com/typography/otspec/name.htm + +enum { // platformID + STBTT_PLATFORM_ID_UNICODE =0, + STBTT_PLATFORM_ID_MAC =1, + STBTT_PLATFORM_ID_ISO =2, + STBTT_PLATFORM_ID_MICROSOFT =3 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 =0, + STBTT_UNICODE_EID_UNICODE_1_1 =1, + STBTT_UNICODE_EID_ISO_10646 =2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL =0, + STBTT_MS_EID_UNICODE_BMP =1, + STBTT_MS_EID_SHIFTJIS =2, + STBTT_MS_EID_UNICODE_FULL =10 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, + STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, + STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, + STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 +}; + +enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, + STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, + STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, + STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, + STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, + STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D +}; + +enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, + STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, + STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, + STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , + STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , + STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, + STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 +}; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +#ifndef STBTT_MAX_OVERSAMPLE +#define STBTT_MAX_OVERSAMPLE 8 +#endif + +#if STBTT_MAX_OVERSAMPLE > 255 +#error "STBTT_MAX_OVERSAMPLE cannot be > 255" +#endif + +typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; + +#ifndef STBTT_RASTERIZER_VERSION +#define STBTT_RASTERIZER_VERSION 2 +#endif + +#ifdef _MSC_VER +#define STBTT__NOTUSED(v) (void)(v) +#else +#define STBTT__NOTUSED(v) (void)sizeof(v) +#endif + +////////////////////////////////////////////////////////////////////////// +// +// stbtt__buf helpers to parse data from file +// + +static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) +{ + if (b->cursor >= b->size) + return 0; + return b->data[b->cursor++]; +} + +static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) +{ + if (b->cursor >= b->size) + return 0; + return b->data[b->cursor]; +} + +static void stbtt__buf_seek(stbtt__buf *b, int o) +{ + STBTT_assert(!(o > b->size || o < 0)); + b->cursor = (o > b->size || o < 0) ? b->size : o; +} + +static void stbtt__buf_skip(stbtt__buf *b, int o) +{ + stbtt__buf_seek(b, b->cursor + o); +} + +static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) +{ + stbtt_uint32 v = 0; + int i; + STBTT_assert(n >= 1 && n <= 4); + for (i = 0; i < n; i++) + v = (v << 8) | stbtt__buf_get8(b); + return v; +} + +static stbtt__buf stbtt__new_buf(const void *p, size_t size) +{ + stbtt__buf r; + STBTT_assert(size < 0x40000000); + r.data = (stbtt_uint8*) p; + r.size = (int) size; + r.cursor = 0; + return r; +} + +#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) +#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) + +static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) +{ + stbtt__buf r = stbtt__new_buf(NULL, 0); + if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; + r.data = b->data + o; + r.size = s; + return r; +} + +static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) +{ + int count, start, offsize; + start = b->cursor; + count = stbtt__buf_get16(b); + if (count) { + offsize = stbtt__buf_get8(b); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(b, offsize * count); + stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); + } + return stbtt__buf_range(b, start, b->cursor - start); +} + +static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) +{ + int b0 = stbtt__buf_get8(b); + if (b0 >= 32 && b0 <= 246) return b0 - 139; + else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; + else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; + else if (b0 == 28) return stbtt__buf_get16(b); + else if (b0 == 29) return stbtt__buf_get32(b); + STBTT_assert(0); + return 0; +} + +static void stbtt__cff_skip_operand(stbtt__buf *b) { + int v, b0 = stbtt__buf_peek8(b); + STBTT_assert(b0 >= 28); + if (b0 == 30) { + stbtt__buf_skip(b, 1); + while (b->cursor < b->size) { + v = stbtt__buf_get8(b); + if ((v & 0xF) == 0xF || (v >> 4) == 0xF) + break; + } + } else { + stbtt__cff_int(b); + } +} + +static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) +{ + stbtt__buf_seek(b, 0); + while (b->cursor < b->size) { + int start = b->cursor, end, op; + while (stbtt__buf_peek8(b) >= 28) + stbtt__cff_skip_operand(b); + end = b->cursor; + op = stbtt__buf_get8(b); + if (op == 12) op = stbtt__buf_get8(b) | 0x100; + if (op == key) return stbtt__buf_range(b, start, end-start); + } + return stbtt__buf_range(b, 0, 0); +} + +static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) +{ + int i; + stbtt__buf operands = stbtt__dict_get(b, key); + for (i = 0; i < outcount && operands.cursor < operands.size; i++) + out[i] = stbtt__cff_int(&operands); +} + +static int stbtt__cff_index_count(stbtt__buf *b) +{ + stbtt__buf_seek(b, 0); + return stbtt__buf_get16(b); +} + +static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) +{ + int count, offsize, start, end; + stbtt__buf_seek(&b, 0); + count = stbtt__buf_get16(&b); + offsize = stbtt__buf_get8(&b); + STBTT_assert(i >= 0 && i < count); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(&b, i*offsize); + start = stbtt__buf_get(&b, offsize); + end = stbtt__buf_get(&b, offsize); + return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); +} + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + +#define ttBYTE(p) (* (stbtt_uint8 *) (p)) +#define ttCHAR(p) (* (stbtt_int8 *) (p)) +#define ttFixed(p) ttLONG(p) + +static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } +static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } +static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } +static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) + +static int stbtt__isfont(stbtt_uint8 *font) +{ + // check the version number + if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 + if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 + if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts + return 0; +} + +// @OPTIMIZE: binary search +static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) +{ + stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for (i=0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16*i; + if (stbtt_tag(data+loc+0, tag)) + return ttULONG(data+loc+8); + } + return 0; +} + +static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) +{ + // if it's just a font, there's only one valid index + if (stbtt__isfont(font_collection)) + return index == 0 ? 0 : -1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection+8); + if (index >= n) + return -1; + return ttULONG(font_collection+12+index*4); + } + } + return -1; +} + +static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) +{ + // if it's just a font, there's only one valid font + if (stbtt__isfont(font_collection)) + return 1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { + return ttLONG(font_collection+8); + } + } + return 0; +} + +static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) +{ + stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; + stbtt__buf pdict; + stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); + if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); + pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); + stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); + if (!subrsoff) return stbtt__new_buf(NULL, 0); + stbtt__buf_seek(&cff, private_loc[1]+subrsoff); + return stbtt__cff_get_index(&cff); +} + +// since most people won't use this, find this table the first time it's needed +static int stbtt__get_svg(stbtt_fontinfo *info) +{ + stbtt_uint32 t; + if (info->svg < 0) { + t = stbtt__find_table(info->data, info->fontstart, "SVG "); + if (t) { + stbtt_uint32 offset = ttULONG(info->data + t + 2); + info->svg = t + offset; + } else { + info->svg = 0; + } + } + return info->svg; +} + +static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) +{ + stbtt_uint32 cmap, t; + stbtt_int32 i,numTables; + + info->data = data; + info->fontstart = fontstart; + info->cff = stbtt__new_buf(NULL, 0); + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required + + if (!cmap || !info->head || !info->hhea || !info->hmtx) + return 0; + if (info->glyf) { + // required for truetype + if (!info->loca) return 0; + } else { + // initialization for CFF / Type2 fonts (OTF) + stbtt__buf b, topdict, topdictidx; + stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; + stbtt_uint32 cff; + + cff = stbtt__find_table(data, fontstart, "CFF "); + if (!cff) return 0; + + info->fontdicts = stbtt__new_buf(NULL, 0); + info->fdselect = stbtt__new_buf(NULL, 0); + + // @TODO this should use size from table (not 512MB) + info->cff = stbtt__new_buf(data+cff, 512*1024*1024); + b = info->cff; + + // read the header + stbtt__buf_skip(&b, 2); + stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize + + // @TODO the name INDEX could list multiple fonts, + // but we just use the first one. + stbtt__cff_get_index(&b); // name INDEX + topdictidx = stbtt__cff_get_index(&b); + topdict = stbtt__cff_index_get(topdictidx, 0); + stbtt__cff_get_index(&b); // string INDEX + info->gsubrs = stbtt__cff_get_index(&b); + + stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); + stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); + stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); + stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); + info->subrs = stbtt__get_subrs(b, topdict); + + // we only support Type 2 charstrings + if (cstype != 2) return 0; + if (charstrings == 0) return 0; + + if (fdarrayoff) { + // looks like a CID font + if (!fdselectoff) return 0; + stbtt__buf_seek(&b, fdarrayoff); + info->fontdicts = stbtt__cff_get_index(&b); + info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); + } + + stbtt__buf_seek(&b, charstrings); + info->charstrings = stbtt__cff_get_index(&b); + } + + t = stbtt__find_table(data, fontstart, "maxp"); + if (t) + info->numGlyphs = ttUSHORT(data+t+4); + else + info->numGlyphs = 0xffff; + + info->svg = -1; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data + cmap + 2); + info->index_map = 0; + for (i=0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch(ttUSHORT(data+encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch (ttUSHORT(data+encoding_record+2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data+encoding_record+4); + break; + } + break; + case STBTT_PLATFORM_ID_UNICODE: + // Mac/iOS has these + // all the encodingIDs are unicode, so we don't bother to check it + info->index_map = cmap + ttULONG(data+encoding_record+4); + break; + } + } + if (info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data+info->head + 50); + return 1; +} + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) +{ + stbtt_uint8 *data = info->data; + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data + index_map + 0); + if (format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data + index_map + 2); + if (unicode_codepoint < bytes-6) + return ttBYTE(data + index_map + 6 + unicode_codepoint); + return 0; + } else if (format == 6) { + stbtt_uint32 first = ttUSHORT(data + index_map + 6); + stbtt_uint32 count = ttUSHORT(data + index_map + 8); + if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) + return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); + return 0; + } else if (format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); + stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if (unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) + search += rangeShift*2; + + // now decrement to bias correctly to find smallest + search -= 2; + while (entrySelector) { + stbtt_uint16 end; + searchRange >>= 1; + end = ttUSHORT(data + search + searchRange*2); + if (unicode_codepoint > end) + search += searchRange*2; + --entrySelector; + } + search += 2; + + { + stbtt_uint16 offset, start, last; + stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); + + start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); + last = ttUSHORT(data + endCount + 2*item); + if (unicode_codepoint < start || unicode_codepoint > last) + return 0; + + offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); + if (offset == 0) + return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); + + return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); + } + } else if (format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data+index_map+12); + stbtt_int32 low,high; + low = 0; high = (stbtt_int32)ngroups; + // Binary search the right group. + while (low < high) { + stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); + stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); + if ((stbtt_uint32) unicode_codepoint < start_char) + high = mid; + else if ((stbtt_uint32) unicode_codepoint > end_char) + low = mid+1; + else { + stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); + if (format == 12) + return start_glyph + unicode_codepoint-start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) +{ + v->type = type; + v->x = (stbtt_int16) x; + v->y = (stbtt_int16) y; + v->cx = (stbtt_int16) cx; + v->cy = (stbtt_int16) cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) +{ + int g1,g2; + + STBTT_assert(!info->cff.size); + + if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if (info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; + } else { + g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); + } + + return g1==g2 ? -1 : g1; // if length is 0, return -1 +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); + +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) +{ + if (info->cff.size) { + stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); + } else { + int g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 0; + + if (x0) *x0 = ttSHORT(info->data + g + 2); + if (y0) *y0 = ttSHORT(info->data + g + 4); + if (x1) *x1 = ttSHORT(info->data + g + 6); + if (y1) *y1 = ttSHORT(info->data + g + 8); + } + return 1; +} + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); +} + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) +{ + stbtt_int16 numberOfContours; + int g; + if (info->cff.size) + return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; + g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 1; + numberOfContours = ttSHORT(info->data + g); + return numberOfContours == 0; +} + +static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if (start_off) { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); + } + return num_vertices; +} + +static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint8 *endPtsOfContours; + stbtt_uint8 *data = info->data; + stbtt_vertex *vertices=0; + int num_vertices=0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if (g < 0) return 0; + + numberOfContours = ttSHORT(data + g); + + if (numberOfContours > 0) { + stbtt_uint8 flags=0,flagcount; + stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; + stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; + stbtt_uint8 *points; + endPtsOfContours = (data + g + 10); + ins = ttUSHORT(data + g + 10 + numberOfContours * 2); + points = data + g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); + + m = n + 2*numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if (vertices == 0) + return 0; + + next_move = 0; + flagcount=0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for (i=0; i < n; ++i) { + if (flagcount == 0) { + flags = *points++; + if (flags & 8) + flagcount = *points++; + } else + --flagcount; + vertices[off+i].type = flags; + } + + // now load x coordinates + x=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 2) { + stbtt_int16 dx = *points++; + x += (flags & 16) ? dx : -dx; // ??? + } else { + if (!(flags & 16)) { + x = x + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].x = (stbtt_int16) x; + } + + // now load y coordinates + y=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 4) { + stbtt_int16 dy = *points++; + y += (flags & 32) ? dy : -dy; // ??? + } else { + if (!(flags & 32)) { + y = y + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].y = (stbtt_int16) y; + } + + // now convert them to our format + num_vertices=0; + sx = sy = cx = cy = scx = scy = 0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + x = (stbtt_int16) vertices[off+i].x; + y = (stbtt_int16) vertices[off+i].y; + + if (next_move == i) { + if (i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + + // now start the new one + start_off = !(flags & 1); + if (start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if (!(vertices[off+i+1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; + sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; + } else { + // otherwise just use the next point as our start point + sx = (stbtt_int32) vertices[off+i+1].x; + sy = (stbtt_int32) vertices[off+i+1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); + was_off = 0; + next_move = 1 + ttUSHORT(endPtsOfContours+j*2); + ++j; + } else { + if (!(flags & 1)) { // if it's a curve + if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + } else if (numberOfContours < 0) { + // Compound shapes. + int more = 1; + stbtt_uint8 *comp = data + g + 10; + num_vertices = 0; + vertices = 0; + while (more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex *comp_verts = 0, *tmp = 0; + float mtx[6] = {1,0,0,1,0,0}, m, n; + + flags = ttSHORT(comp); comp+=2; + gidx = ttSHORT(comp); comp+=2; + + if (flags & 2) { // XY values + if (flags & 1) { // shorts + mtx[4] = ttSHORT(comp); comp+=2; + mtx[5] = ttSHORT(comp); comp+=2; + } else { + mtx[4] = ttCHAR(comp); comp+=1; + mtx[5] = ttCHAR(comp); comp+=1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if (flags & (1<<3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } + + // Find transformation scales. + m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); + n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if (comp_num_verts > 0) { + // Transform vertices. + for (i = 0; i < comp_num_verts; ++i) { + stbtt_vertex* v = &comp_verts[i]; + stbtt_vertex_type x,y; + x=v->x; y=v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + x=v->cx; y=v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); + if (!tmp) { + if (vertices) STBTT_free(vertices, info->userdata); + if (comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if (num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); + STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); + if (vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1<<5); + } + } else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +typedef struct +{ + int bounds; + int started; + float first_x, first_y; + float x, y; + stbtt_int32 min_x, max_x, min_y, max_y; + + stbtt_vertex *pvertices; + int num_vertices; +} stbtt__csctx; + +#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} + +static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) +{ + if (x > c->max_x || !c->started) c->max_x = x; + if (y > c->max_y || !c->started) c->max_y = y; + if (x < c->min_x || !c->started) c->min_x = x; + if (y < c->min_y || !c->started) c->min_y = y; + c->started = 1; +} + +static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) +{ + if (c->bounds) { + stbtt__track_vertex(c, x, y); + if (type == STBTT_vcubic) { + stbtt__track_vertex(c, cx, cy); + stbtt__track_vertex(c, cx1, cy1); + } + } else { + stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); + c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; + c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; + } + c->num_vertices++; +} + +static void stbtt__csctx_close_shape(stbtt__csctx *ctx) +{ + if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) +{ + stbtt__csctx_close_shape(ctx); + ctx->first_x = ctx->x = ctx->x + dx; + ctx->first_y = ctx->y = ctx->y + dy; + stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) +{ + ctx->x += dx; + ctx->y += dy; + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) +{ + float cx1 = ctx->x + dx1; + float cy1 = ctx->y + dy1; + float cx2 = cx1 + dx2; + float cy2 = cy1 + dy2; + ctx->x = cx2 + dx3; + ctx->y = cy2 + dy3; + stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); +} + +static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) +{ + int count = stbtt__cff_index_count(&idx); + int bias = 107; + if (count >= 33900) + bias = 32768; + else if (count >= 1240) + bias = 1131; + n += bias; + if (n < 0 || n >= count) + return stbtt__new_buf(NULL, 0); + return stbtt__cff_index_get(idx, n); +} + +static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) +{ + stbtt__buf fdselect = info->fdselect; + int nranges, start, end, v, fmt, fdselector = -1, i; + + stbtt__buf_seek(&fdselect, 0); + fmt = stbtt__buf_get8(&fdselect); + if (fmt == 0) { + // untested + stbtt__buf_skip(&fdselect, glyph_index); + fdselector = stbtt__buf_get8(&fdselect); + } else if (fmt == 3) { + nranges = stbtt__buf_get16(&fdselect); + start = stbtt__buf_get16(&fdselect); + for (i = 0; i < nranges; i++) { + v = stbtt__buf_get8(&fdselect); + end = stbtt__buf_get16(&fdselect); + if (glyph_index >= start && glyph_index < end) { + fdselector = v; + break; + } + start = end; + } + } + if (fdselector == -1) stbtt__new_buf(NULL, 0); + return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); +} + +static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) +{ + int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; + int has_subrs = 0, clear_stack; + float s[48]; + stbtt__buf subr_stack[10], subrs = info->subrs, b; + float f; + +#define STBTT__CSERR(s) (0) + + // this currently ignores the initial width value, which isn't needed if we have hmtx + b = stbtt__cff_index_get(info->charstrings, glyph_index); + while (b.cursor < b.size) { + i = 0; + clear_stack = 1; + b0 = stbtt__buf_get8(&b); + switch (b0) { + // @TODO implement hinting + case 0x13: // hintmask + case 0x14: // cntrmask + if (in_header) + maskbits += (sp / 2); // implicit "vstem" + in_header = 0; + stbtt__buf_skip(&b, (maskbits + 7) / 8); + break; + + case 0x01: // hstem + case 0x03: // vstem + case 0x12: // hstemhm + case 0x17: // vstemhm + maskbits += (sp / 2); + break; + + case 0x15: // rmoveto + in_header = 0; + if (sp < 2) return STBTT__CSERR("rmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); + break; + case 0x04: // vmoveto + in_header = 0; + if (sp < 1) return STBTT__CSERR("vmoveto stack"); + stbtt__csctx_rmove_to(c, 0, s[sp-1]); + break; + case 0x16: // hmoveto + in_header = 0; + if (sp < 1) return STBTT__CSERR("hmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp-1], 0); + break; + + case 0x05: // rlineto + if (sp < 2) return STBTT__CSERR("rlineto stack"); + for (; i + 1 < sp; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i+1]); + break; + + // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical + // starting from a different place. + + case 0x07: // vlineto + if (sp < 1) return STBTT__CSERR("vlineto stack"); + goto vlineto; + case 0x06: // hlineto + if (sp < 1) return STBTT__CSERR("hlineto stack"); + for (;;) { + if (i >= sp) break; + stbtt__csctx_rline_to(c, s[i], 0); + i++; + vlineto: + if (i >= sp) break; + stbtt__csctx_rline_to(c, 0, s[i]); + i++; + } + break; + + case 0x1F: // hvcurveto + if (sp < 4) return STBTT__CSERR("hvcurveto stack"); + goto hvcurveto; + case 0x1E: // vhcurveto + if (sp < 4) return STBTT__CSERR("vhcurveto stack"); + for (;;) { + if (i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); + i += 4; + hvcurveto: + if (i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); + i += 4; + } + break; + + case 0x08: // rrcurveto + if (sp < 6) return STBTT__CSERR("rcurveline stack"); + for (; i + 5 < sp; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); + break; + + case 0x18: // rcurveline + if (sp < 8) return STBTT__CSERR("rcurveline stack"); + for (; i + 5 < sp - 2; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); + if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); + stbtt__csctx_rline_to(c, s[i], s[i+1]); + break; + + case 0x19: // rlinecurve + if (sp < 8) return STBTT__CSERR("rlinecurve stack"); + for (; i + 1 < sp - 6; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i+1]); + if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); + stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); + break; + + case 0x1A: // vvcurveto + case 0x1B: // hhcurveto + if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); + f = 0.0; + if (sp & 1) { f = s[i]; i++; } + for (; i + 3 < sp; i += 4) { + if (b0 == 0x1B) + stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); + else + stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); + f = 0.0; + } + break; + + case 0x0A: // callsubr + if (!has_subrs) { + if (info->fdselect.size) + subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); + has_subrs = 1; + } + // FALLTHROUGH + case 0x1D: // callgsubr + if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); + v = (int) s[--sp]; + if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); + subr_stack[subr_stack_height++] = b; + b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); + if (b.size == 0) return STBTT__CSERR("subr not found"); + b.cursor = 0; + clear_stack = 0; + break; + + case 0x0B: // return + if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); + b = subr_stack[--subr_stack_height]; + clear_stack = 0; + break; + + case 0x0E: // endchar + stbtt__csctx_close_shape(c); + return 1; + + case 0x0C: { // two-byte escape + float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; + float dx, dy; + int b1 = stbtt__buf_get8(&b); + switch (b1) { + // @TODO These "flex" implementations ignore the flex-depth and resolution, + // and always draw beziers. + case 0x22: // hflex + if (sp < 7) return STBTT__CSERR("hflex stack"); + dx1 = s[0]; + dx2 = s[1]; + dy2 = s[2]; + dx3 = s[3]; + dx4 = s[4]; + dx5 = s[5]; + dx6 = s[6]; + stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); + break; + + case 0x23: // flex + if (sp < 13) return STBTT__CSERR("flex stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = s[10]; + dy6 = s[11]; + //fd is s[12] + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + case 0x24: // hflex1 + if (sp < 9) return STBTT__CSERR("hflex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dx4 = s[5]; + dx5 = s[6]; + dy5 = s[7]; + dx6 = s[8]; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); + break; + + case 0x25: // flex1 + if (sp < 11) return STBTT__CSERR("flex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = dy6 = s[10]; + dx = dx1+dx2+dx3+dx4+dx5; + dy = dy1+dy2+dy3+dy4+dy5; + if (STBTT_fabs(dx) > STBTT_fabs(dy)) + dy6 = -dy; + else + dx6 = -dx; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + default: + return STBTT__CSERR("unimplemented"); + } + } break; + + default: + if (b0 != 255 && b0 != 28 && b0 < 32) + return STBTT__CSERR("reserved operator"); + + // push immediate + if (b0 == 255) { + f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; + } else { + stbtt__buf_skip(&b, -1); + f = (float)(stbtt_int16)stbtt__cff_int(&b); + } + if (sp >= 48) return STBTT__CSERR("push stack overflow"); + s[sp++] = f; + clear_stack = 0; + break; + } + if (clear_stack) sp = 0; + } + return STBTT__CSERR("no endchar"); + +#undef STBTT__CSERR +} + +static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + // runs the charstring twice, once to count and once to output (to avoid realloc) + stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); + stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); + if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { + *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); + output_ctx.pvertices = *pvertices; + if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { + STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); + return output_ctx.num_vertices; + } + } + *pvertices = NULL; + return 0; +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) +{ + stbtt__csctx c = STBTT__CSCTX_INIT(1); + int r = stbtt__run_charstring(info, glyph_index, &c); + if (x0) *x0 = r ? c.min_x : 0; + if (y0) *y0 = r ? c.min_y : 0; + if (x1) *x1 = r ? c.max_x : 0; + if (y1) *y1 = r ? c.max_y : 0; + return r ? c.num_vertices : 0; +} + +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + if (!info->cff.size) + return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); + else + return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); +} + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); + if (glyph_index < numOfLongHorMetrics) { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); + } else { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); + } +} + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info) +{ + stbtt_uint8 *data = info->data + info->kern; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + return ttUSHORT(data+10); +} + +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length) +{ + stbtt_uint8 *data = info->data + info->kern; + int k, length; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + length = ttUSHORT(data+10); + if (table_length < length) + length = table_length; + + for (k = 0; k < length; k++) + { + table[k].glyph1 = ttUSHORT(data+18+(k*6)); + table[k].glyph2 = ttUSHORT(data+20+(k*6)); + table[k].advance = ttSHORT(data+22+(k*6)); + } + + return length; +} + +static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) +{ + stbtt_uint8 *data = info->data + info->kern; + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(data+10) - 1; + needle = glyph1 << 16 | glyph2; + while (l <= r) { + m = (l + r) >> 1; + straw = ttULONG(data+18+(m*6)); // note: unaligned read + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else + return ttSHORT(data+22+(m*6)); + } + return 0; +} + +static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph) +{ + stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); + switch (coverageFormat) { + case 1: { + stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); + + // Binary search. + stbtt_int32 l=0, r=glyphCount-1, m; + int straw, needle=glyph; + while (l <= r) { + stbtt_uint8 *glyphArray = coverageTable + 4; + stbtt_uint16 glyphID; + m = (l + r) >> 1; + glyphID = ttUSHORT(glyphArray + 2 * m); + straw = glyphID; + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else { + return m; + } + } + break; + } + + case 2: { + stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); + stbtt_uint8 *rangeArray = coverageTable + 4; + + // Binary search. + stbtt_int32 l=0, r=rangeCount-1, m; + int strawStart, strawEnd, needle=glyph; + while (l <= r) { + stbtt_uint8 *rangeRecord; + m = (l + r) >> 1; + rangeRecord = rangeArray + 6 * m; + strawStart = ttUSHORT(rangeRecord); + strawEnd = ttUSHORT(rangeRecord + 2); + if (needle < strawStart) + r = m - 1; + else if (needle > strawEnd) + l = m + 1; + else { + stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); + return startCoverageIndex + glyph - strawStart; + } + } + break; + } + + default: return -1; // unsupported + } + + return -1; +} + +static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph) +{ + stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); + switch (classDefFormat) + { + case 1: { + stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); + stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); + stbtt_uint8 *classDef1ValueArray = classDefTable + 6; + + if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) + return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); + break; + } + + case 2: { + stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); + stbtt_uint8 *classRangeRecords = classDefTable + 4; + + // Binary search. + stbtt_int32 l=0, r=classRangeCount-1, m; + int strawStart, strawEnd, needle=glyph; + while (l <= r) { + stbtt_uint8 *classRangeRecord; + m = (l + r) >> 1; + classRangeRecord = classRangeRecords + 6 * m; + strawStart = ttUSHORT(classRangeRecord); + strawEnd = ttUSHORT(classRangeRecord + 2); + if (needle < strawStart) + r = m - 1; + else if (needle > strawEnd) + l = m + 1; + else + return (stbtt_int32)ttUSHORT(classRangeRecord + 4); + } + break; + } + + default: + return -1; // Unsupported definition type, return an error. + } + + // "All glyphs not assigned to a class fall into class 0". (OpenType spec) + return 0; +} + +// Define to STBTT_assert(x) if you want to break on unimplemented formats. +#define STBTT_GPOS_TODO_assert(x) + +static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) +{ + stbtt_uint16 lookupListOffset; + stbtt_uint8 *lookupList; + stbtt_uint16 lookupCount; + stbtt_uint8 *data; + stbtt_int32 i, sti; + + if (!info->gpos) return 0; + + data = info->data + info->gpos; + + if (ttUSHORT(data+0) != 1) return 0; // Major version 1 + if (ttUSHORT(data+2) != 0) return 0; // Minor version 0 + + lookupListOffset = ttUSHORT(data+8); + lookupList = data + lookupListOffset; + lookupCount = ttUSHORT(lookupList); + + for (i=0; i= pairSetCount) return 0; + + needle=glyph2; + r=pairValueCount-1; + l=0; + + // Binary search. + while (l <= r) { + stbtt_uint16 secondGlyph; + stbtt_uint8 *pairValue; + m = (l + r) >> 1; + pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; + secondGlyph = ttUSHORT(pairValue); + straw = secondGlyph; + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else { + stbtt_int16 xAdvance = ttSHORT(pairValue + 2); + return xAdvance; + } + } + } else + return 0; + break; + } + + case 2: { + stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); + if (valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); + stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); + int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); + int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); + + stbtt_uint16 class1Count = ttUSHORT(table + 12); + stbtt_uint16 class2Count = ttUSHORT(table + 14); + stbtt_uint8 *class1Records, *class2Records; + stbtt_int16 xAdvance; + + if (glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed + if (glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed + + class1Records = table + 16; + class2Records = class1Records + 2 * (glyph1class * class2Count); + xAdvance = ttSHORT(class2Records + 2 * glyph2class); + return xAdvance; + } else + return 0; + break; + } + + default: + return 0; // Unsupported position format + } + } + } + + return 0; +} + +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2) +{ + int xAdvance = 0; + + if (info->gpos) + xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); + else if (info->kern) + xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); + + return xAdvance; +} + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) +{ + if (!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); +} + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); +} + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) +{ + if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); + if (descent) *descent = ttSHORT(info->data+info->hhea + 6); + if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); +} + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap) +{ + int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); + if (!tab) + return 0; + if (typoAscent ) *typoAscent = ttSHORT(info->data+tab + 68); + if (typoDescent) *typoDescent = ttSHORT(info->data+tab + 70); + if (typoLineGap) *typoLineGap = ttSHORT(info->data+tab + 72); + return 1; +} + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) +{ + *x0 = ttSHORT(info->data + info->head + 36); + *y0 = ttSHORT(info->data + info->head + 38); + *x1 = ttSHORT(info->data + info->head + 40); + *y1 = ttSHORT(info->data + info->head + 42); +} + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) +{ + int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); + return (float) height / fheight; +} + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) +{ + int unitsPerEm = ttUSHORT(info->data + info->head + 18); + return pixels / unitsPerEm; +} + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) +{ + STBTT_free(v, info->userdata); +} + +STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl) +{ + int i; + stbtt_uint8 *data = info->data; + stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info); + + int numEntries = ttUSHORT(svg_doc_list); + stbtt_uint8 *svg_docs = svg_doc_list + 2; + + for(i=0; i= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) + return svg_doc; + } + return 0; +} + +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg) +{ + stbtt_uint8 *data = info->data; + stbtt_uint8 *svg_doc; + + if (info->svg == 0) + return 0; + + svg_doc = stbtt_FindSVGDoc(info, gl); + if (svg_doc != NULL) { + *svg = (char *) data + info->svg + ttULONG(svg_doc + 4); + return ttULONG(svg_doc + 8); + } else { + return 0; + } +} + +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg) +{ + return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning + if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { + // e.g. space character + if (ix0) *ix0 = 0; + if (iy0) *iy0 = 0; + if (ix1) *ix1 = 0; + if (iy1) *iy1 = 0; + } else { + // move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); + if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); + if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); + if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); + } +} + +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); +} + +////////////////////////////////////////////////////////////////////////////// +// +// Rasterizer + +typedef struct stbtt__hheap_chunk +{ + struct stbtt__hheap_chunk *next; +} stbtt__hheap_chunk; + +typedef struct stbtt__hheap +{ + struct stbtt__hheap_chunk *head; + void *first_free; + int num_remaining_in_head_chunk; +} stbtt__hheap; + +static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) +{ + if (hh->first_free) { + void *p = hh->first_free; + hh->first_free = * (void **) p; + return p; + } else { + if (hh->num_remaining_in_head_chunk == 0) { + int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); + stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); + if (c == NULL) + return NULL; + c->next = hh->head; + hh->head = c; + hh->num_remaining_in_head_chunk = count; + } + --hh->num_remaining_in_head_chunk; + return (char *) (hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; + } +} + +static void stbtt__hheap_free(stbtt__hheap *hh, void *p) +{ + *(void **) p = hh->first_free; + hh->first_free = p; +} + +static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) +{ + stbtt__hheap_chunk *c = hh->head; + while (c) { + stbtt__hheap_chunk *n = c->next; + STBTT_free(c, userdata); + c = n; + } +} + +typedef struct stbtt__edge { + float x0,y0, x1,y1; + int invert; +} stbtt__edge; + + +typedef struct stbtt__active_edge +{ + struct stbtt__active_edge *next; + #if STBTT_RASTERIZER_VERSION==1 + int x,dx; + float ey; + int direction; + #elif STBTT_RASTERIZER_VERSION==2 + float fx,fdx,fdy; + float direction; + float sy; + float ey; + #else + #error "Unrecognized value of STBTT_RASTERIZER_VERSION" + #endif +} stbtt__active_edge; + +#if STBTT_RASTERIZER_VERSION == 1 +#define STBTT_FIXSHIFT 10 +#define STBTT_FIX (1 << STBTT_FIXSHIFT) +#define STBTT_FIXMASK (STBTT_FIX-1) + +static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) +{ + stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + if (!z) return z; + + // round dx down to avoid overshooting + if (dxdy < 0) + z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); + else + z->dx = STBTT_ifloor(STBTT_FIX * dxdy); + + z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount + z->x -= off_x * STBTT_FIX; + + z->ey = e->y1; + z->next = 0; + z->direction = e->invert ? 1 : -1; + return z; +} +#elif STBTT_RASTERIZER_VERSION == 2 +static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) +{ + stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + //STBTT_assert(e->y0 <= start_point); + if (!z) return z; + z->fdx = dxdy; + z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; + z->fx = e->x0 + dxdy * (start_point - e->y0); + z->fx -= off_x; + z->direction = e->invert ? 1.0f : -1.0f; + z->sy = e->y0; + z->ey = e->y1; + z->next = 0; + return z; +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#if STBTT_RASTERIZER_VERSION == 1 +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) +{ + // non-zero winding fill + int x0=0, w=0; + + while (e) { + if (w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; w += e->direction; + } else { + int x1 = e->x; w += e->direction; + // if we went to zero, we need to draw + if (w == 0) { + int i = x0 >> STBTT_FIXSHIFT; + int j = x1 >> STBTT_FIXSHIFT; + + if (i < len && j >= 0) { + if (i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); + } else { + if (i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); + else + i = -1; // clip + + if (j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); + else + j = len; // clip + + for (++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8) max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge *active = NULL; + int y,j=0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], *scanline; + + if (result->w > 512) + scanline = (unsigned char *) STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; + + while (j < result->h) { + STBTT_memset(scanline, 0, result->w); + for (s=0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge **step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while (*step) { + stbtt__active_edge * z = *step; + if (z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for(;;) { + int changed=0; + step = &active; + while (*step && (*step)->next) { + if ((*step)->x > (*step)->next->x) { + stbtt__active_edge *t = *step; + stbtt__active_edge *q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if (!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while (e->y0 <= scan_y) { + if (e->y1 > scan_y) { + stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); + if (z != NULL) { + // find insertion point + if (active == NULL) + active = z; + else if (z->x < active->x) { + // insert at front + z->next = active; + active = z; + } else { + // find thing to insert AFTER + stbtt__active_edge *p = active; + while (p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + } + ++e; + } + + // now process all active edges in XOR fashion + if (active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +#elif STBTT_RASTERIZER_VERSION == 2 + +// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 +// (i.e. it has already been clipped to those) +static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) +{ + if (y0 == y1) return; + STBTT_assert(y0 < y1); + STBTT_assert(e->sy <= e->ey); + if (y0 > e->ey) return; + if (y1 < e->sy) return; + if (y0 < e->sy) { + x0 += (x1-x0) * (e->sy - y0) / (y1-y0); + y0 = e->sy; + } + if (y1 > e->ey) { + x1 += (x1-x0) * (e->ey - y1) / (y1-y0); + y1 = e->ey; + } + + if (x0 == x) + STBTT_assert(x1 <= x+1); + else if (x0 == x+1) + STBTT_assert(x1 >= x); + else if (x0 <= x) + STBTT_assert(x1 <= x); + else if (x0 >= x+1) + STBTT_assert(x1 >= x+1); + else + STBTT_assert(x1 >= x && x1 <= x+1); + + if (x0 <= x && x1 <= x) + scanline[x] += e->direction * (y1-y0); + else if (x0 >= x+1 && x1 >= x+1) + ; + else { + STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); + scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position + } +} + +static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) +{ + STBTT_assert(top_width >= 0); + STBTT_assert(bottom_width >= 0); + return (top_width + bottom_width) / 2.0f * height; +} + +static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) +{ + return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); +} + +static float stbtt__sized_triangle_area(float height, float width) +{ + return height * width / 2; +} + +static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) +{ + float y_bottom = y_top+1; + + while (e) { + // brute force every pixel + + // compute intersection points with top & bottom + STBTT_assert(e->ey >= y_top); + + if (e->fdx == 0) { + float x0 = e->fx; + if (x0 < len) { + if (x0 >= 0) { + stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); + stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); + } else { + stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); + } + } + } else { + float x0 = e->fx; + float dx = e->fdx; + float xb = x0 + dx; + float x_top, x_bottom; + float sy0,sy1; + float dy = e->fdy; + STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); + + // compute endpoints of line segment clipped to this scanline (if the + // line segment starts on this scanline. x0 is the intersection of the + // line with y_top, but that may be off the line segment. + if (e->sy > y_top) { + x_top = x0 + dx * (e->sy - y_top); + sy0 = e->sy; + } else { + x_top = x0; + sy0 = y_top; + } + if (e->ey < y_bottom) { + x_bottom = x0 + dx * (e->ey - y_top); + sy1 = e->ey; + } else { + x_bottom = xb; + sy1 = y_bottom; + } + + if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { + // from here on, we don't have to range check x values + + if ((int) x_top == (int) x_bottom) { + float height; + // simple case, only spans one pixel + int x = (int) x_top; + height = (sy1 - sy0) * e->direction; + STBTT_assert(x >= 0 && x < len); + scanline[x] += stbtt__position_trapezoid_area(height, x_top, x+1.0f, x_bottom, x+1.0f); + scanline_fill[x] += height; // everything right of this pixel is filled + } else { + int x,x1,x2; + float y_crossing, y_final, step, sign, area; + // covers 2+ pixels + if (x_top > x_bottom) { + // flip scanline vertically; signed area is the same + float t; + sy0 = y_bottom - (sy0 - y_top); + sy1 = y_bottom - (sy1 - y_top); + t = sy0, sy0 = sy1, sy1 = t; + t = x_bottom, x_bottom = x_top, x_top = t; + dx = -dx; + dy = -dy; + t = x0, x0 = xb, xb = t; + } + STBTT_assert(dy >= 0); + STBTT_assert(dx >= 0); + + x1 = (int) x_top; + x2 = (int) x_bottom; + // compute intersection with y axis at x1+1 + y_crossing = y_top + dy * (x1+1 - x0); + + // compute intersection with y axis at x2 + y_final = y_top + dy * (x2 - x0); + + // x1 x_top x2 x_bottom + // y_top +------|-----+------------+------------+--------|---+------------+ + // | | | | | | + // | | | | | | + // sy0 | Txxxxx|............|............|............|............| + // y_crossing | *xxxxx.......|............|............|............| + // | | xxxxx..|............|............|............| + // | | /- xx*xxxx........|............|............| + // | | dy < | xxxxxx..|............|............| + // y_final | | \- | xx*xxx.........|............| + // sy1 | | | | xxxxxB...|............| + // | | | | | | + // | | | | | | + // y_bottom +------------+------------+------------+------------+------------+ + // + // goal is to measure the area covered by '.' in each pixel + + // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 + // @TODO: maybe test against sy1 rather than y_bottom? + if (y_crossing > y_bottom) + y_crossing = y_bottom; + + sign = e->direction; + + // area of the rectangle covered from sy0..y_crossing + area = sign * (y_crossing-sy0); + + // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) + scanline[x1] += stbtt__sized_triangle_area(area, x1+1 - x_top); + + // check if final y_crossing is blown up; no test case for this + if (y_final > y_bottom) { + int denom = (x2 - (x1+1)); + y_final = y_bottom; + if (denom != 0) { // [DEAR IMGUI] Avoid div by zero (https://github.com/nothings/stb/issues/1316) + dy = (y_final - y_crossing ) / denom; // if denom=0, y_final = y_crossing, so y_final <= y_bottom + } + } + + // in second pixel, area covered by line segment found in first pixel + // is always a rectangle 1 wide * the height of that line segment; this + // is exactly what the variable 'area' stores. it also gets a contribution + // from the line segment within it. the THIRD pixel will get the first + // pixel's rectangle contribution, the second pixel's rectangle contribution, + // and its own contribution. the 'own contribution' is the same in every pixel except + // the leftmost and rightmost, a trapezoid that slides down in each pixel. + // the second pixel's contribution to the third pixel will be the + // rectangle 1 wide times the height change in the second pixel, which is dy. + + step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, + // which multiplied by 1-pixel-width is how much pixel area changes for each step in x + // so the area advances by 'step' every time + + for (x = x1+1; x < x2; ++x) { + scanline[x] += area + step/2; // area of trapezoid is 1*step/2 + area += step; + } + STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down + STBTT_assert(sy1 > y_final-0.01f); + + // area covered in the last pixel is the rectangle from all the pixels to the left, + // plus the trapezoid filled by the line segment in this pixel all the way to the right edge + scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1-y_final, (float) x2, x2+1.0f, x_bottom, x2+1.0f); + + // the rest of the line is filled based on the total height of the line segment in this pixel + scanline_fill[x2] += sign * (sy1-sy0); + } + } else { + // if edge goes outside of box we're drawing, we require + // clipping logic. since this does not match the intended use + // of this library, we use a different, very slow brute + // force implementation + // note though that this does happen some of the time because + // x_top and x_bottom can be extrapolated at the top & bottom of + // the shape and actually lie outside the bounding box + int x; + for (x=0; x < len; ++x) { + // cases: + // + // there can be up to two intersections with the pixel. any intersection + // with left or right edges can be handled by splitting into two (or three) + // regions. intersections with top & bottom do not necessitate case-wise logic. + // + // the old way of doing this found the intersections with the left & right edges, + // then used some simple logic to produce up to three segments in sorted order + // from top-to-bottom. however, this had a problem: if an x edge was epsilon + // across the x border, then the corresponding y position might not be distinct + // from the other y segment, and it might ignored as an empty segment. to avoid + // that, we need to explicitly produce segments based on x positions. + + // rename variables to clearly-defined pairs + float y0 = y_top; + float x1 = (float) (x); + float x2 = (float) (x+1); + float x3 = xb; + float y3 = y_bottom; + + // x = e->x + e->dx * (y-y_top) + // (y-y_top) = (x - e->x) / e->dx + // y = (x - e->x) / e->dx + y_top + float y1 = (x - x0) / dx + y_top; + float y2 = (x+1 - x0) / dx + y_top; + + if (x0 < x1 && x3 > x2) { // three segments descending down-right + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else if (x3 < x1 && x0 > x2) { // three segments descending down-left + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); + } else if (x0 < x1 && x3 > x1) { // two segments across x, down-right + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); + } else if (x3 < x1 && x0 > x1) { // two segments across x, down-left + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); + } else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else { // one segment + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); + } + } + } + } + e = e->next; + } +} + +// directly AA rasterize edges w/o supersampling +static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge *active = NULL; + int y,j=0, i; + float scanline_data[129], *scanline, *scanline2; + + STBTT__NOTUSED(vsubsample); + + if (result->w > 64) + scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); + else + scanline = scanline_data; + + scanline2 = scanline + result->w; + + y = off_y; + e[n].y0 = (float) (off_y + result->h) + 1; + + while (j < result->h) { + // find center of pixel for this scanline + float scan_y_top = y + 0.0f; + float scan_y_bottom = y + 1.0f; + stbtt__active_edge **step = &active; + + STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); + STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); + + // update all active edges; + // remove all active edges that terminate before the top of this scanline + while (*step) { + stbtt__active_edge * z = *step; + if (z->ey <= scan_y_top) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } else { + step = &((*step)->next); // advance through list + } + } + + // insert all edges that start before the bottom of this scanline + while (e->y0 <= scan_y_bottom) { + if (e->y0 != e->y1) { + stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); + if (z != NULL) { + if (j == 0 && off_y != 0) { + if (z->ey < scan_y_top) { + // this can happen due to subpixel positioning and some kind of fp rounding error i think + z->ey = scan_y_top; + } + } + STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds + // insert at front + z->next = active; + active = z; + } + } + ++e; + } + + // now process all active edges + if (active) + stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); + + { + float sum = 0; + for (i=0; i < result->w; ++i) { + float k; + int m; + sum += scanline2[i]; + k = scanline[i] + sum; + k = (float) STBTT_fabs(k)*255 + 0.5f; + m = (int) k; + if (m > 255) m = 255; + result->pixels[j*result->stride + i] = (unsigned char) m; + } + } + // advance all the edges + step = &active; + while (*step) { + stbtt__active_edge *z = *step; + z->fx += z->fdx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + + ++y; + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) + +static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) +{ + int i,j; + for (i=1; i < n; ++i) { + stbtt__edge t = p[i], *a = &t; + j = i; + while (j > 0) { + stbtt__edge *b = &p[j-1]; + int c = STBTT__COMPARE(a,b); + if (!c) break; + p[j] = p[j-1]; + --j; + } + if (i != j) + p[j] = t; + } +} + +static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) +{ + /* threshold for transitioning to insertion sort */ + while (n > 12) { + stbtt__edge t; + int c01,c12,c,m,i,j; + + /* compute median of three */ + m = n >> 1; + c01 = STBTT__COMPARE(&p[0],&p[m]); + c12 = STBTT__COMPARE(&p[m],&p[n-1]); + /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ + if (c01 != c12) { + /* otherwise, we'll need to swap something else to middle */ + int z; + c = STBTT__COMPARE(&p[0],&p[n-1]); + /* 0>mid && midn => n; 0 0 */ + /* 0n: 0>n => 0; 0 n */ + z = (c == c12) ? 0 : n-1; + t = p[z]; + p[z] = p[m]; + p[m] = t; + } + /* now p[m] is the median-of-three */ + /* swap it to the beginning so it won't move around */ + t = p[0]; + p[0] = p[m]; + p[m] = t; + + /* partition loop */ + i=1; + j=n-1; + for(;;) { + /* handling of equality is crucial here */ + /* for sentinels & efficiency with duplicates */ + for (;;++i) { + if (!STBTT__COMPARE(&p[i], &p[0])) break; + } + for (;;--j) { + if (!STBTT__COMPARE(&p[0], &p[j])) break; + } + /* make sure we haven't crossed */ + if (i >= j) break; + t = p[i]; + p[i] = p[j]; + p[j] = t; + + ++i; + --j; + } + /* recurse on smaller side, iterate on larger */ + if (j < (n-i)) { + stbtt__sort_edges_quicksort(p,j); + p = p+i; + n = n-i; + } else { + stbtt__sort_edges_quicksort(p+i, n-i); + n = j; + } + } +} + +static void stbtt__sort_edges(stbtt__edge *p, int n) +{ + stbtt__sort_edges_quicksort(p, n); + stbtt__sort_edges_ins_sort(p, n); +} + +typedef struct +{ + float x,y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge *e; + int n,i,j,k,m; +#if STBTT_RASTERIZER_VERSION == 1 + int vsubsample = result->h < 8 ? 15 : 5; +#elif STBTT_RASTERIZER_VERSION == 2 + int vsubsample = 1; +#else + #error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for (i=0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel + if (e == 0) return; + n = 0; + + m=0; + for (i=0; i < windings; ++i) { + stbtt__point *p = pts + m; + m += wcount[i]; + j = wcount[i]-1; + for (k=0; k < wcount[i]; j=k++) { + int a=k,b=j; + // skip the edge if horizontal + if (p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a=j,b=k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + stbtt__sort_edges(e, n); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point *points, int n, float x, float y) +{ + if (!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2*x1 + x2)/4; + float my = (y0 + 2*y1 + y2)/4; + // versus directly drawn line + float dx = (x0+x2)/2 - mx; + float dy = (y0+y2)/2 - my; + if (n > 16) // 65536 segments on one curve better be enough! + return 1; + if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); + stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); + } else { + stbtt__add_point(points, *num_points,x2,y2); + *num_points = *num_points+1; + } + return 1; +} + +static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) +{ + // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough + float dx0 = x1-x0; + float dy0 = y1-y0; + float dx1 = x2-x1; + float dy1 = y2-y1; + float dx2 = x3-x2; + float dy2 = y3-y2; + float dx = x3-x0; + float dy = y3-y0; + float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); + float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); + float flatness_squared = longlen*longlen-shortlen*shortlen; + + if (n > 16) // 65536 segments on one curve better be enough! + return; + + if (flatness_squared > objspace_flatness_squared) { + float x01 = (x0+x1)/2; + float y01 = (y0+y1)/2; + float x12 = (x1+x2)/2; + float y12 = (y1+y2)/2; + float x23 = (x2+x3)/2; + float y23 = (y2+y3)/2; + + float xa = (x01+x12)/2; + float ya = (y01+y12)/2; + float xb = (x12+x23)/2; + float yb = (y12+y23)/2; + + float mx = (xa+xb)/2; + float my = (ya+yb)/2; + + stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); + stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); + } else { + stbtt__add_point(points, *num_points,x3,y3); + *num_points = *num_points+1; + } +} + +// returns number of contours +static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) +{ + stbtt__point *points=0; + int num_points=0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i,n=0,start=0, pass; + + // count how many "moves" there are to get the contour count + for (i=0; i < num_verts; ++i) + if (vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if (n == 0) return 0; + + *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if (*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for (pass=0; pass < 2; ++pass) { + float x=0,y=0; + if (pass == 1) { + points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); + if (points == NULL) goto error; + } + num_points = 0; + n= -1; + for (i=0; i < num_verts; ++i) { + switch (vertices[i].type) { + case STBTT_vmove: + // start the next contour + if (n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x,y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x,y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + case STBTT_vcubic: + stbtt__tesselate_cubic(points, &num_points, x,y, + vertices[i].cx, vertices[i].cy, + vertices[i].cx1, vertices[i].cy1, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count = 0; + int *winding_lengths = NULL; + stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); + if (windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) +{ + STBTT_free(bitmap, userdata); +} + +STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + int ix0,iy0,ix1,iy1; + stbtt__bitmap gbm; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if (scale_x == 0) scale_x = scale_y; + if (scale_y == 0) { + if (scale_x == 0) { + STBTT_free(vertices, info->userdata); + return NULL; + } + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if (width ) *width = gbm.w; + if (height) *height = gbm.h; + if (xoff ) *xoff = ix0; + if (yoff ) *yoff = iy0; + + if (gbm.w && gbm.h) { + gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); + if (gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0,iy0; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if (gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); +} + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info,codepoint)); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); +} + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small + +static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata) +{ + float scale; + int x,y,bottom_y, i; + stbtt_fontinfo f; + f.userdata = NULL; + if (!stbtt_InitFont(&f, data, offset)) + return -1; + STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels + x=y=1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for (i=0; i < num_chars; ++i) { + int advance, lsb, x0,y0,x1,y1,gw,gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); + gw = x1-x0; + gh = y1-y0; + if (x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x+gw < pw); + STBTT_assert(y+gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); + chardata[i].x0 = (stbtt_int16) x; + chardata[i].y0 = (stbtt_int16) y; + chardata[i].x1 = (stbtt_int16) (x + gw); + chardata[i].y1 = (stbtt_int16) (y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float) x0; + chardata[i].yoff = (float) y0; + x = x + gw + 1; + if (y+gh+1 > bottom_y) + bottom_y = y+gh+1; + } + return bottom_y; +} + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_bakedchar *b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// rectangle packing replacement routines if you don't have stb_rect_pack.h +// + +#ifndef STB_RECT_PACK_VERSION + +typedef int stbrp_coord; + +//////////////////////////////////////////////////////////////////////////////////// +// // +// // +// COMPILER WARNING ?!?!? // +// // +// // +// if you get a compile warning due to these symbols being defined more than // +// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // +// // +//////////////////////////////////////////////////////////////////////////////////// + +typedef struct +{ + int width,height; + int x,y,bottom_y; +} stbrp_context; + +typedef struct +{ + unsigned char x; +} stbrp_node; + +struct stbrp_rect +{ + stbrp_coord x,y; + int id,w,h,was_packed; +}; + +static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) +{ + con->width = pw; + con->height = ph; + con->x = 0; + con->y = 0; + con->bottom_y = 0; + STBTT__NOTUSED(nodes); + STBTT__NOTUSED(num_nodes); +} + +static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) +{ + int i; + for (i=0; i < num_rects; ++i) { + if (con->x + rects[i].w > con->width) { + con->x = 0; + con->y = con->bottom_y; + } + if (con->y + rects[i].h > con->height) + break; + rects[i].x = con->x; + rects[i].y = con->y; + rects[i].was_packed = 1; + con->x += rects[i].w; + if (con->y + rects[i].h > con->bottom_y) + con->bottom_y = con->y + rects[i].h; + } + for ( ; i < num_rects; ++i) + rects[i].was_packed = 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If +// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) +{ + stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); + int num_nodes = pw - padding; + stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); + + if (context == NULL || nodes == NULL) { + if (context != NULL) STBTT_free(context, alloc_context); + if (nodes != NULL) STBTT_free(nodes , alloc_context); + return 0; + } + + spc->user_allocator_context = alloc_context; + spc->width = pw; + spc->height = ph; + spc->pixels = pixels; + spc->pack_info = context; + spc->nodes = nodes; + spc->padding = padding; + spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; + spc->h_oversample = 1; + spc->v_oversample = 1; + spc->skip_missing = 0; + + stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); + + if (pixels) + STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels + + return 1; +} + +STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) +{ + STBTT_free(spc->nodes , spc->user_allocator_context); + STBTT_free(spc->pack_info, spc->user_allocator_context); +} + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) +{ + STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); + STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); + if (h_oversample <= STBTT_MAX_OVERSAMPLE) + spc->h_oversample = h_oversample; + if (v_oversample <= STBTT_MAX_OVERSAMPLE) + spc->v_oversample = v_oversample; +} + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip) +{ + spc->skip_missing = skip; +} + +#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) + +static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_w = w - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for (j=0; j < h; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch (kernel_width) { + case 2: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 2); + } + break; + case 3: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 3); + } + break; + case 4: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 4); + } + break; + case 5: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 5); + } + break; + default: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / kernel_width); + } + break; + } + + for (; i < w; ++i) { + STBTT_assert(pixels[i] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i] = (unsigned char) (total / kernel_width); + } + + pixels += stride_in_bytes; + } +} + +static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_h = h - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for (j=0; j < w; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch (kernel_width) { + case 2: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 2); + } + break; + case 3: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 3); + } + break; + case 4: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 4); + } + break; + case 5: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 5); + } + break; + default: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); + } + break; + } + + for (; i < h; ++i) { + STBTT_assert(pixels[i*stride_in_bytes] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); + } + + pixels += 1; + } +} + +static float stbtt__oversample_shift(int oversample) +{ + if (!oversample) + return 0.0f; + + // The prefilter is a box filter of width "oversample", + // which shifts phase by (oversample - 1)/2 pixels in + // oversampled space. We want to shift in the opposite + // direction to counter this. + return (float)-(oversample - 1) / (2.0f * (float)oversample); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) +{ + int i,j,k; + int missing_glyph_added = 0; + + k=0; + for (i=0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + ranges[i].h_oversample = (unsigned char) spc->h_oversample; + ranges[i].v_oversample = (unsigned char) spc->v_oversample; + for (j=0; j < ranges[i].num_chars; ++j) { + int x0,y0,x1,y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { + rects[k].w = rects[k].h = 0; + } else { + stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0,0, + &x0,&y0,&x1,&y1); + rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); + rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); + if (glyph == 0) + missing_glyph_added = 1; + } + ++k; + } + } + + return k; +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float *sub_x, float *sub_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, + output, + out_w - (prefilter_x - 1), + out_h - (prefilter_y - 1), + out_stride, + scale_x, + scale_y, + shift_x, + shift_y, + glyph); + + if (prefilter_x > 1) + stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); + + if (prefilter_y > 1) + stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); + + *sub_x = stbtt__oversample_shift(prefilter_x); + *sub_y = stbtt__oversample_shift(prefilter_y); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) +{ + int i,j,k, missing_glyph = -1, return_value = 1; + + // save current values + int old_h_over = spc->h_oversample; + int old_v_over = spc->v_oversample; + + k = 0; + for (i=0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + float recip_h,recip_v,sub_x,sub_y; + spc->h_oversample = ranges[i].h_oversample; + spc->v_oversample = ranges[i].v_oversample; + recip_h = 1.0f / spc->h_oversample; + recip_v = 1.0f / spc->v_oversample; + sub_x = stbtt__oversample_shift(spc->h_oversample); + sub_y = stbtt__oversample_shift(spc->v_oversample); + for (j=0; j < ranges[i].num_chars; ++j) { + stbrp_rect *r = &rects[k]; + if (r->was_packed && r->w != 0 && r->h != 0) { + stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; + int advance, lsb, x0,y0,x1,y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + stbrp_coord pad = (stbrp_coord) spc->padding; + + // pad on left and top + r->x += pad; + r->y += pad; + r->w -= pad; + r->h -= pad; + stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); + stbtt_GetGlyphBitmapBox(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + &x0,&y0,&x1,&y1); + stbtt_MakeGlyphBitmapSubpixel(info, + spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w - spc->h_oversample+1, + r->h - spc->v_oversample+1, + spc->stride_in_bytes, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0,0, + glyph); + + if (spc->h_oversample > 1) + stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->h_oversample); + + if (spc->v_oversample > 1) + stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->v_oversample); + + bc->x0 = (stbtt_int16) r->x; + bc->y0 = (stbtt_int16) r->y; + bc->x1 = (stbtt_int16) (r->x + r->w); + bc->y1 = (stbtt_int16) (r->y + r->h); + bc->xadvance = scale * advance; + bc->xoff = (float) x0 * recip_h + sub_x; + bc->yoff = (float) y0 * recip_v + sub_y; + bc->xoff2 = (x0 + r->w) * recip_h + sub_x; + bc->yoff2 = (y0 + r->h) * recip_v + sub_y; + + if (glyph == 0) + missing_glyph = j; + } else if (spc->skip_missing) { + return_value = 0; + } else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { + ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; + } else { + return_value = 0; // if any fail, report failure + } + + ++k; + } + } + + // restore original values + spc->h_oversample = old_h_over; + spc->v_oversample = old_v_over; + + return return_value; +} + +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) +{ + stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); +} + +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) +{ + stbtt_fontinfo info; + int i, j, n, return_value; // [DEAR IMGUI] removed = 1; + //stbrp_context *context = (stbrp_context *) spc->pack_info; + stbrp_rect *rects; + + // flag all characters as NOT packed + for (i=0; i < num_ranges; ++i) + for (j=0; j < ranges[i].num_chars; ++j) + ranges[i].chardata_for_range[j].x0 = + ranges[i].chardata_for_range[j].y0 = + ranges[i].chardata_for_range[j].x1 = + ranges[i].chardata_for_range[j].y1 = 0; + + n = 0; + for (i=0; i < num_ranges; ++i) + n += ranges[i].num_chars; + + rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); + if (rects == NULL) + return 0; + + info.userdata = spc->user_allocator_context; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); + + n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); + + stbtt_PackFontRangesPackRects(spc, rects, n); + + return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); + + STBTT_free(rects, spc->user_allocator_context); + return return_value; +} + +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) +{ + stbtt_pack_range range; + range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; + range.array_of_unicode_codepoints = NULL; + range.num_chars = num_chars_in_range; + range.chardata_for_range = chardata_for_range; + range.font_size = font_size; + return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); +} + +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap) +{ + int i_ascent, i_descent, i_lineGap; + float scale; + stbtt_fontinfo info; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); + scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); + stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); + *ascent = (float) i_ascent * scale; + *descent = (float) i_descent * scale; + *lineGap = (float) i_lineGap * scale; +} + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) +{ + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_packedchar *b = chardata + char_index; + + if (align_to_integer) { + float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); + float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); + q->x0 = x; + q->y0 = y; + q->x1 = x + b->xoff2 - b->xoff; + q->y1 = y + b->yoff2 - b->yoff; + } else { + q->x0 = *xpos + b->xoff; + q->y0 = *ypos + b->yoff; + q->x1 = *xpos + b->xoff2; + q->y1 = *ypos + b->yoff2; + } + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// sdf computation +// + +#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) +#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) + +static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) +{ + float q0perp = q0[1]*ray[0] - q0[0]*ray[1]; + float q1perp = q1[1]*ray[0] - q1[0]*ray[1]; + float q2perp = q2[1]*ray[0] - q2[0]*ray[1]; + float roperp = orig[1]*ray[0] - orig[0]*ray[1]; + + float a = q0perp - 2*q1perp + q2perp; + float b = q1perp - q0perp; + float c = q0perp - roperp; + + float s0 = 0., s1 = 0.; + int num_s = 0; + + if (a != 0.0) { + float discr = b*b - a*c; + if (discr > 0.0) { + float rcpna = -1 / a; + float d = (float) STBTT_sqrt(discr); + s0 = (b+d) * rcpna; + s1 = (b-d) * rcpna; + if (s0 >= 0.0 && s0 <= 1.0) + num_s = 1; + if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { + if (num_s == 0) s0 = s1; + ++num_s; + } + } + } else { + // 2*b*s + c = 0 + // s = -c / (2*b) + s0 = c / (-2 * b); + if (s0 >= 0.0 && s0 <= 1.0) + num_s = 1; + } + + if (num_s == 0) + return 0; + else { + float rcp_len2 = 1 / (ray[0]*ray[0] + ray[1]*ray[1]); + float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; + + float q0d = q0[0]*rayn_x + q0[1]*rayn_y; + float q1d = q1[0]*rayn_x + q1[1]*rayn_y; + float q2d = q2[0]*rayn_x + q2[1]*rayn_y; + float rod = orig[0]*rayn_x + orig[1]*rayn_y; + + float q10d = q1d - q0d; + float q20d = q2d - q0d; + float q0rd = q0d - rod; + + hits[0][0] = q0rd + s0*(2.0f - 2.0f*s0)*q10d + s0*s0*q20d; + hits[0][1] = a*s0+b; + + if (num_s > 1) { + hits[1][0] = q0rd + s1*(2.0f - 2.0f*s1)*q10d + s1*s1*q20d; + hits[1][1] = a*s1+b; + return 2; + } else { + return 1; + } + } +} + +static int equal(float *a, float *b) +{ + return (a[0] == b[0] && a[1] == b[1]); +} + +static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex *verts) +{ + int i; + float orig[2], ray[2] = { 1, 0 }; + float y_frac; + int winding = 0; + + // make sure y never passes through a vertex of the shape + y_frac = (float) STBTT_fmod(y, 1.0f); + if (y_frac < 0.01f) + y += 0.01f; + else if (y_frac > 0.99f) + y -= 0.01f; + + orig[0] = x; + orig[1] = y; + + // test a ray from (-infinity,y) to (x,y) + for (i=0; i < nverts; ++i) { + if (verts[i].type == STBTT_vline) { + int x0 = (int) verts[i-1].x, y0 = (int) verts[i-1].y; + int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y; + if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; + if (x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + if (verts[i].type == STBTT_vcurve) { + int x0 = (int) verts[i-1].x , y0 = (int) verts[i-1].y ; + int x1 = (int) verts[i ].cx, y1 = (int) verts[i ].cy; + int x2 = (int) verts[i ].x , y2 = (int) verts[i ].y ; + int ax = STBTT_min(x0,STBTT_min(x1,x2)), ay = STBTT_min(y0,STBTT_min(y1,y2)); + int by = STBTT_max(y0,STBTT_max(y1,y2)); + if (y > ay && y < by && x > ax) { + float q0[2],q1[2],q2[2]; + float hits[2][2]; + q0[0] = (float)x0; + q0[1] = (float)y0; + q1[0] = (float)x1; + q1[1] = (float)y1; + q2[0] = (float)x2; + q2[1] = (float)y2; + if (equal(q0,q1) || equal(q1,q2)) { + x0 = (int)verts[i-1].x; + y0 = (int)verts[i-1].y; + x1 = (int)verts[i ].x; + y1 = (int)verts[i ].y; + if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; + if (x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } else { + int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); + if (num_hits >= 1) + if (hits[0][0] < 0) + winding += (hits[0][1] < 0 ? -1 : 1); + if (num_hits >= 2) + if (hits[1][0] < 0) + winding += (hits[1][1] < 0 ? -1 : 1); + } + } + } + } + return winding; +} + +static float stbtt__cuberoot( float x ) +{ + if (x<0) + return -(float) STBTT_pow(-x,1.0f/3.0f); + else + return (float) STBTT_pow( x,1.0f/3.0f); +} + +// x^3 + a*x^2 + b*x + c = 0 +static int stbtt__solve_cubic(float a, float b, float c, float* r) +{ + float s = -a / 3; + float p = b - a*a / 3; + float q = a * (2*a*a - 9*b) / 27 + c; + float p3 = p*p*p; + float d = q*q + 4*p3 / 27; + if (d >= 0) { + float z = (float) STBTT_sqrt(d); + float u = (-q + z) / 2; + float v = (-q - z) / 2; + u = stbtt__cuberoot(u); + v = stbtt__cuberoot(v); + r[0] = s + u + v; + return 1; + } else { + float u = (float) STBTT_sqrt(-p/3); + float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative + float m = (float) STBTT_cos(v); + float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; + r[0] = s + u * 2 * m; + r[1] = s - u * (m + n); + r[2] = s - u * (m - n); + + //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? + //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); + //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); + return 3; + } +} + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) +{ + float scale_x = scale, scale_y = scale; + int ix0,iy0,ix1,iy1; + int w,h; + unsigned char *data; + + if (scale == 0) return NULL; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1); + + // if empty, return NULL + if (ix0 == ix1 || iy0 == iy1) + return NULL; + + ix0 -= padding; + iy0 -= padding; + ix1 += padding; + iy1 += padding; + + w = (ix1 - ix0); + h = (iy1 - iy0); + + if (width ) *width = w; + if (height) *height = h; + if (xoff ) *xoff = ix0; + if (yoff ) *yoff = iy0; + + // invert for y-downwards bitmaps + scale_y = -scale_y; + + { + int x,y,i,j; + float *precompute; + stbtt_vertex *verts; + int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); + data = (unsigned char *) STBTT_malloc(w * h, info->userdata); + precompute = (float *) STBTT_malloc(num_verts * sizeof(float), info->userdata); + + for (i=0,j=num_verts-1; i < num_verts; j=i++) { + if (verts[i].type == STBTT_vline) { + float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; + float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y; + float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); + precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; + } else if (verts[i].type == STBTT_vcurve) { + float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y; + float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y; + float x0 = verts[i].x *scale_x, y0 = verts[i].y *scale_y; + float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; + float len2 = bx*bx + by*by; + if (len2 != 0.0f) + precompute[i] = 1.0f / (bx*bx + by*by); + else + precompute[i] = 0.0f; + } else + precompute[i] = 0.0f; + } + + for (y=iy0; y < iy1; ++y) { + for (x=ix0; x < ix1; ++x) { + float val; + float min_dist = 999999.0f; + float sx = (float) x + 0.5f; + float sy = (float) y + 0.5f; + float x_gspace = (sx / scale_x); + float y_gspace = (sy / scale_y); + + int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path + + for (i=0; i < num_verts; ++i) { + float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; + + if (verts[i].type == STBTT_vline && precompute[i] != 0.0f) { + float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y; + + float dist,dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); + if (dist2 < min_dist*min_dist) + min_dist = (float) STBTT_sqrt(dist2); + + // coarse culling against bbox + //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && + // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) + dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i]; + STBTT_assert(i != 0); + if (dist < min_dist) { + // check position along line + // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) + // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) + float dx = x1-x0, dy = y1-y0; + float px = x0-sx, py = y0-sy; + // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy + // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve + float t = -(px*dx + py*dy) / (dx*dx + dy*dy); + if (t >= 0.0f && t <= 1.0f) + min_dist = dist; + } + } else if (verts[i].type == STBTT_vcurve) { + float x2 = verts[i-1].x *scale_x, y2 = verts[i-1].y *scale_y; + float x1 = verts[i ].cx*scale_x, y1 = verts[i ].cy*scale_y; + float box_x0 = STBTT_min(STBTT_min(x0,x1),x2); + float box_y0 = STBTT_min(STBTT_min(y0,y1),y2); + float box_x1 = STBTT_max(STBTT_max(x0,x1),x2); + float box_y1 = STBTT_max(STBTT_max(y0,y1),y2); + // coarse culling against bbox to avoid computing cubic unnecessarily + if (sx > box_x0-min_dist && sx < box_x1+min_dist && sy > box_y0-min_dist && sy < box_y1+min_dist) { + int num=0; + float ax = x1-x0, ay = y1-y0; + float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; + float mx = x0 - sx, my = y0 - sy; + float res[3] = {0.f,0.f,0.f}; + float px,py,t,it,dist2; + float a_inv = precompute[i]; + if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula + float a = 3*(ax*bx + ay*by); + float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by); + float c = mx*ax+my*ay; + if (a == 0.0) { // if a is 0, it's linear + if (b != 0.0) { + res[num++] = -c/b; + } + } else { + float discriminant = b*b - 4*a*c; + if (discriminant < 0) + num = 0; + else { + float root = (float) STBTT_sqrt(discriminant); + res[0] = (-b - root)/(2*a); + res[1] = (-b + root)/(2*a); + num = 2; // don't bother distinguishing 1-solution case, as code below will still work + } + } + } else { + float b = 3*(ax*bx + ay*by) * a_inv; // could precompute this as it doesn't depend on sample point + float c = (2*(ax*ax + ay*ay) + (mx*bx+my*by)) * a_inv; + float d = (mx*ax+my*ay) * a_inv; + num = stbtt__solve_cubic(b, c, d, res); + } + dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); + if (dist2 < min_dist*min_dist) + min_dist = (float) STBTT_sqrt(dist2); + + if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { + t = res[0], it = 1.0f - t; + px = it*it*x0 + 2*t*it*x1 + t*t*x2; + py = it*it*y0 + 2*t*it*y1 + t*t*y2; + dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); + if (dist2 < min_dist * min_dist) + min_dist = (float) STBTT_sqrt(dist2); + } + if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { + t = res[1], it = 1.0f - t; + px = it*it*x0 + 2*t*it*x1 + t*t*x2; + py = it*it*y0 + 2*t*it*y1 + t*t*y2; + dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); + if (dist2 < min_dist * min_dist) + min_dist = (float) STBTT_sqrt(dist2); + } + if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { + t = res[2], it = 1.0f - t; + px = it*it*x0 + 2*t*it*x1 + t*t*x2; + py = it*it*y0 + 2*t*it*y1 + t*t*y2; + dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); + if (dist2 < min_dist * min_dist) + min_dist = (float) STBTT_sqrt(dist2); + } + } + } + } + if (winding == 0) + min_dist = -min_dist; // if outside the shape, value is negative + val = onedge_value + pixel_dist_scale * min_dist; + if (val < 0) + val = 0; + else if (val > 255) + val = 255; + data[(y-iy0)*w+(x-ix0)] = (unsigned char) val; + } + } + STBTT_free(precompute, info->userdata); + STBTT_free(verts, info->userdata); + } + return data; +} + +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata) +{ + STBTT_free(bitmap, userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) +{ + stbtt_int32 i=0; + + // convert utf16 to utf8 and compare the results while converting + while (len2) { + stbtt_uint16 ch = s2[0]*256 + s2[1]; + if (ch < 0x80) { + if (i >= len1) return -1; + if (s1[i++] != ch) return -1; + } else if (ch < 0x800) { + if (i+1 >= len1) return -1; + if (s1[i++] != 0xc0 + (ch >> 6)) return -1; + if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } else if (ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = s2[2]*256 + s2[3]; + if (i+3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if (s1[i++] != 0xf0 + (c >> 18)) return -1; + if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; + s2 += 2; // plus another 2 below + len2 -= 2; + } else if (ch >= 0xdc00 && ch < 0xe000) { + return -1; + } else { + if (i+2 >= len1) return -1; + if (s1[i++] != 0xe0 + (ch >> 12)) return -1; + if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; + } + s2 += 2; + len2 -= 2; + } + return i; +} + +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); +} + +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) +{ + stbtt_int32 i,count,stringOffset; + stbtt_uint8 *fc = font->data; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return NULL; + + count = ttUSHORT(fc+nm+2); + stringOffset = nm + ttUSHORT(fc+nm+4); + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) + && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { + *length = ttUSHORT(fc+loc+8); + return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); + } + } + return NULL; +} + +static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc+nm+2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); + + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc+loc+6); + if (id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); + + // is this a Unicode encoding? + if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc+loc+8); + stbtt_int32 off = ttUSHORT(fc+loc+10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); + if (matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { + slen = ttUSHORT(fc+loc+12+8); + off = ttUSHORT(fc+loc+12+10); + if (slen == 0) { + if (matchlen == nlen) + return 1; + } else if (matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; + if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) + return 1; + } + } else { + // if nothing immediately following + if (matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} + +static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) +{ + stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); + stbtt_uint32 nm,hd; + if (!stbtt__isfont(fc+offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if (flags) { + hd = stbtt__find_table(fc, offset, "head"); + if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return 0; + + if (flags) { + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } else { + if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} + +static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) +{ + stbtt_int32 i; + for (i=0;;++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if (off < 0) return off; + if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) + return off; + } +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, + float pixel_height, unsigned char *pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar *chardata) +{ + return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); +} + +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); +} + +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) +{ + return stbtt_GetNumberOfFonts_internal((unsigned char *) data); +} + +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) +{ + return stbtt_InitFont_internal(info, (unsigned char *) data, offset); +} + +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) +{ + return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); +} + +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + +#endif // STB_TRUETYPE_IMPLEMENTATION + + +// FULL VERSION HISTORY +// +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) allow user-defined fabs() replacement +// fix memory leak if fontsize=0.0 +// fix warning from duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// allow PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) +// also more precise AA rasterizer, except if shapes overlap +// remove need for STBTT_sort +// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC +// 1.04 (2015-04-15) typo in example +// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes +// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ +// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match +// non-oversampled; STBTT_POINT_SIZE for packed case only +// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling +// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) +// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID +// 0.8b (2014-07-07) fix a warning +// 0.8 (2014-05-25) fix a few more warnings +// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back +// 0.6c (2012-07-24) improve documentation +// 0.6b (2012-07-20) fix a few more warnings +// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, +// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b (2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (stb) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// + +/* +------------------------------------------------------------------------------ +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/3rdparty/include/gsl/algorithm b/3rdparty/include/gsl/algorithm new file mode 100644 index 0000000000..b27475de54 --- /dev/null +++ b/3rdparty/include/gsl/algorithm @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_ALGORITHM_H +#define GSL_ALGORITHM_H + +#include // for Expects +#include // for dynamic_extent, span + +#include // for copy_n +#include // for ptrdiff_t +#include // for is_assignable + +#ifdef _MSC_VER +#pragma warning(push) + +// turn off some warnings that are noisy about our Expects statements +#pragma warning(disable : 4127) // conditional expression is constant +#pragma warning(disable : 4996) // unsafe use of std::copy_n + +#endif // _MSC_VER + +namespace gsl +{ +// Note: this will generate faster code than std::copy using span iterator in older msvc+stl +// not necessary for msvc since VS2017 15.8 (_MSC_VER >= 1915) +template +void copy(span src, span dest) +{ + static_assert(std::is_assignable::value, + "Elements of source span can not be assigned to elements of destination span"); + static_assert(SrcExtent == dynamic_extent || DestExtent == dynamic_extent || + (SrcExtent <= DestExtent), + "Source range is longer than target range"); + + Expects(dest.size() >= src.size()); + // clang-format off + GSL_SUPPRESS(stl.1) // NO-FORMAT: attribute + // clang-format on + std::copy_n(src.data(), src.size(), dest.data()); +} + +} // namespace gsl + +#ifdef _MSC_VER +#pragma warning(pop) +#endif // _MSC_VER + +#endif // GSL_ALGORITHM_H diff --git a/3rdparty/include/gsl/assert b/3rdparty/include/gsl/assert new file mode 100644 index 0000000000..a6012048fc --- /dev/null +++ b/3rdparty/include/gsl/assert @@ -0,0 +1,136 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_CONTRACTS_H +#define GSL_CONTRACTS_H + +// +// Temporary until MSVC STL supports no-exceptions mode. +// Currently terminate is a no-op in this mode, so we add termination behavior back +// +#if defined(_MSC_VER) && (defined(_KERNEL_MODE) || (defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS)) +#define GSL_KERNEL_MODE + +#define GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND +#include +#define RANGE_CHECKS_FAILURE 0 + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Winvalid-noreturn" +#endif // defined(__clang__) + +#else // defined(_MSC_VER) && (defined(_KERNEL_MODE) || (defined(_HAS_EXCEPTIONS) && + // !_HAS_EXCEPTIONS)) + +#include + +#endif // defined(_MSC_VER) && (defined(_KERNEL_MODE) || (defined(_HAS_EXCEPTIONS) && + // !_HAS_EXCEPTIONS)) + +// +// make suppress attributes parse for some compilers +// Hopefully temporary until suppression standardization occurs +// +#if defined(__clang__) +#define GSL_SUPPRESS(x) [[gsl::suppress("x")]] +#else +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#define GSL_SUPPRESS(x) [[gsl::suppress(x)]] +#else +#define GSL_SUPPRESS(x) +#endif // _MSC_VER +#endif // __clang__ + +#define GSL_STRINGIFY_DETAIL(x) #x +#define GSL_STRINGIFY(x) GSL_STRINGIFY_DETAIL(x) + +#if defined(__clang__) || defined(__GNUC__) +#define GSL_LIKELY(x) __builtin_expect(!!(x), 1) +#define GSL_UNLIKELY(x) __builtin_expect(!!(x), 0) + +#else + +#define GSL_LIKELY(x) (!!(x)) +#define GSL_UNLIKELY(x) (!!(x)) +#endif // defined(__clang__) || defined(__GNUC__) + +// +// GSL_ASSUME(cond) +// +// Tell the optimizer that the predicate cond must hold. It is unspecified +// whether or not cond is actually evaluated. +// +#ifdef _MSC_VER +#define GSL_ASSUME(cond) __assume(cond) +#elif defined(__GNUC__) +#define GSL_ASSUME(cond) ((cond) ? static_cast(0) : __builtin_unreachable()) +#else +#define GSL_ASSUME(cond) static_cast((cond) ? 0 : 0) +#endif + +// +// GSL.assert: assertions +// + +namespace gsl +{ + +namespace details +{ +#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) + + typedef void(__cdecl* terminate_handler)(); + + // clang-format off + GSL_SUPPRESS(f.6) // NO-FORMAT: attribute + // clang-format on + [[noreturn]] inline void __cdecl default_terminate_handler() + { + __fastfail(RANGE_CHECKS_FAILURE); + } + + inline gsl::details::terminate_handler& get_terminate_handler() noexcept + { + static terminate_handler handler = &default_terminate_handler; + return handler; + } + +#endif // defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) + + [[noreturn]] inline void terminate() noexcept + { +#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) + (*gsl::details::get_terminate_handler())(); +#else + std::terminate(); +#endif // defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) + } + +} // namespace details +} // namespace gsl + +#define GSL_CONTRACT_CHECK(type, cond) \ + (GSL_LIKELY(cond) ? static_cast(0) : gsl::details::terminate()) + +#define Expects(cond) GSL_CONTRACT_CHECK("Precondition", cond) +#define Ensures(cond) GSL_CONTRACT_CHECK("Postcondition", cond) + +#if defined(GSL_MSVC_USE_STL_NOEXCEPTION_WORKAROUND) && defined(__clang__) +#pragma clang diagnostic pop +#endif + +#endif // GSL_CONTRACTS_H diff --git a/3rdparty/include/gsl/byte b/3rdparty/include/gsl/byte new file mode 100644 index 0000000000..9231340b56 --- /dev/null +++ b/3rdparty/include/gsl/byte @@ -0,0 +1,213 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_BYTE_H +#define GSL_BYTE_H + +// +// make suppress attributes work for some compilers +// Hopefully temporary until suppression standardization occurs +// +#if defined(__clang__) +#define GSL_SUPPRESS(x) [[gsl::suppress("x")]] +#else +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#define GSL_SUPPRESS(x) [[gsl::suppress(x)]] +#else +#define GSL_SUPPRESS(x) +#endif // _MSC_VER +#endif // __clang__ + +#include + +// VS2017 15.8 added support for the __cpp_lib_byte definition +// To do: drop _HAS_STD_BYTE when support for pre 15.8 expires +#ifdef _MSC_VER + +#pragma warning(push) + +// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool. +#pragma warning(disable : 26493) // don't use c-style casts // TODO: MSVC suppression in templates + // does not always work + +#ifndef GSL_USE_STD_BYTE +// this tests if we are under MSVC and the standard lib has std::byte and it is enabled +#if (defined(_HAS_STD_BYTE) && _HAS_STD_BYTE) || \ + (defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603) + +#define GSL_USE_STD_BYTE 1 + +#else // (defined(_HAS_STD_BYTE) && _HAS_STD_BYTE) || (defined(__cpp_lib_byte) && __cpp_lib_byte >= + // 201603) + +#define GSL_USE_STD_BYTE 0 + +#endif // (defined(_HAS_STD_BYTE) && _HAS_STD_BYTE) || (defined(__cpp_lib_byte) && __cpp_lib_byte >= + // 201603) +#endif // GSL_USE_STD_BYTE + +#else // _MSC_VER + +#ifndef GSL_USE_STD_BYTE +#include /* __cpp_lib_byte */ +// this tests if we are under GCC or Clang with enough -std=c++1z power to get us std::byte +// also check if libc++ version is sufficient (> 5.0) or libstdc++ actually contains std::byte +#if defined(__cplusplus) && (__cplusplus >= 201703L) && \ + (defined(__cpp_lib_byte) && (__cpp_lib_byte >= 201603) || \ + defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 5000)) + +#define GSL_USE_STD_BYTE 1 + +#else // defined(__cplusplus) && (__cplusplus >= 201703L) && + // (defined(__cpp_lib_byte) && (__cpp_lib_byte >= 201603) || + // defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 5000)) + +#define GSL_USE_STD_BYTE 0 + +#endif // defined(__cplusplus) && (__cplusplus >= 201703L) && + // (defined(__cpp_lib_byte) && (__cpp_lib_byte >= 201603) || + // defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 5000)) +#endif // GSL_USE_STD_BYTE + +#endif // _MSC_VER + +// Use __may_alias__ attribute on gcc and clang +#if defined __clang__ || (defined(__GNUC__) && __GNUC__ > 5) +#define byte_may_alias __attribute__((__may_alias__)) +#else // defined __clang__ || defined __GNUC__ +#define byte_may_alias +#endif // defined __clang__ || defined __GNUC__ + +#if GSL_USE_STD_BYTE +#include +#endif + +namespace gsl +{ +#if GSL_USE_STD_BYTE + +using std::byte; +using std::to_integer; + +#else // GSL_USE_STD_BYTE + +// This is a simple definition for now that allows +// use of byte within span<> to be standards-compliant +enum class byte_may_alias byte : unsigned char +{ +}; + +template ::value>> +constexpr byte& operator<<=(byte& b, IntegerType shift) noexcept +{ + return b = byte(static_cast(b) << shift); +} + +template ::value>> +constexpr byte operator<<(byte b, IntegerType shift) noexcept +{ + return byte(static_cast(b) << shift); +} + +template ::value>> +constexpr byte& operator>>=(byte& b, IntegerType shift) noexcept +{ + return b = byte(static_cast(b) >> shift); +} + +template ::value>> +constexpr byte operator>>(byte b, IntegerType shift) noexcept +{ + return byte(static_cast(b) >> shift); +} + +constexpr byte& operator|=(byte& l, byte r) noexcept +{ + return l = byte(static_cast(l) | static_cast(r)); +} + +constexpr byte operator|(byte l, byte r) noexcept +{ + return byte(static_cast(l) | static_cast(r)); +} + +constexpr byte& operator&=(byte& l, byte r) noexcept +{ + return l = byte(static_cast(l) & static_cast(r)); +} + +constexpr byte operator&(byte l, byte r) noexcept +{ + return byte(static_cast(l) & static_cast(r)); +} + +constexpr byte& operator^=(byte& l, byte r) noexcept +{ + return l = byte(static_cast(l) ^ static_cast(r)); +} + +constexpr byte operator^(byte l, byte r) noexcept +{ + return byte(static_cast(l) ^ static_cast(r)); +} + +constexpr byte operator~(byte b) noexcept { return byte(~static_cast(b)); } + +template ::value>> +constexpr IntegerType to_integer(byte b) noexcept +{ + return static_cast(b); +} + +#endif // GSL_USE_STD_BYTE + +template +constexpr byte to_byte_impl(T t) noexcept +{ + static_assert( + E, "gsl::to_byte(t) must be provided an unsigned char, otherwise data loss may occur. " + "If you are calling to_byte with an integer contant use: gsl::to_byte() version."); + return static_cast(t); +} +template <> +// NOTE: need suppression since c++14 does not allow "return {t}" +// GSL_SUPPRESS(type.4) // NO-FORMAT: attribute // TODO: suppression does not work +constexpr byte to_byte_impl(unsigned char t) noexcept +{ + return byte(t); +} + +template +constexpr byte to_byte(T t) noexcept +{ + return to_byte_impl::value, T>(t); +} + +template +constexpr byte to_byte() noexcept +{ + static_assert(I >= 0 && I <= 255, + "gsl::byte only has 8 bits of storage, values must be in range 0-255"); + return static_cast(I); +} + +} // namespace gsl + +#ifdef _MSC_VER +#pragma warning(pop) +#endif // _MSC_VER + +#endif // GSL_BYTE_H diff --git a/3rdparty/include/gsl/gsl b/3rdparty/include/gsl/gsl new file mode 100644 index 0000000000..adadc40fe6 --- /dev/null +++ b/3rdparty/include/gsl/gsl @@ -0,0 +1,32 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_GSL_H +#define GSL_GSL_H + +#include // copy +#include // Ensures/Expects +#include // byte +#include // owner, not_null +#include // span +#include // zstring, string_span, zstring_builder... +#include // finally()/narrow_cast()... + +#ifdef __cpp_exceptions +#include // narrow() +#endif + +#endif // GSL_GSL_H diff --git a/3rdparty/include/gsl/gsl_algorithm b/3rdparty/include/gsl/gsl_algorithm new file mode 100644 index 0000000000..8a88a59b21 --- /dev/null +++ b/3rdparty/include/gsl/gsl_algorithm @@ -0,0 +1,4 @@ +#pragma once +#pragma message( \ + "This header will soon be removed. Use instead of ") +#include diff --git a/3rdparty/include/gsl/gsl_assert b/3rdparty/include/gsl/gsl_assert new file mode 100644 index 0000000000..1dd24b1b38 --- /dev/null +++ b/3rdparty/include/gsl/gsl_assert @@ -0,0 +1,3 @@ +#pragma once +#pragma message("This header will soon be removed. Use instead of ") +#include diff --git a/3rdparty/include/gsl/gsl_byte b/3rdparty/include/gsl/gsl_byte new file mode 100644 index 0000000000..b41f2d9a4d --- /dev/null +++ b/3rdparty/include/gsl/gsl_byte @@ -0,0 +1,3 @@ +#pragma once +#pragma message("This header will soon be removed. Use instead of ") +#include diff --git a/3rdparty/include/gsl/gsl_narrow b/3rdparty/include/gsl/gsl_narrow new file mode 100644 index 0000000000..d30d42128c --- /dev/null +++ b/3rdparty/include/gsl/gsl_narrow @@ -0,0 +1,3 @@ +#pragma once +#pragma message("This header will soon be removed. Use instead of ") +#include diff --git a/3rdparty/include/gsl/gsl_util b/3rdparty/include/gsl/gsl_util new file mode 100644 index 0000000000..feb19902cd --- /dev/null +++ b/3rdparty/include/gsl/gsl_util @@ -0,0 +1,3 @@ +#pragma once +#pragma message("This header will soon be removed. Use instead of ") +#include diff --git a/3rdparty/include/gsl/narrow b/3rdparty/include/gsl/narrow new file mode 100644 index 0000000000..ac341ec8cf --- /dev/null +++ b/3rdparty/include/gsl/narrow @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_NARROW_H +#define GSL_NARROW_H +#include // for Expects +#include // for narrow_cast +namespace gsl +{ +struct narrowing_error : public std::exception +{ + const char* what() const noexcept override { return "narrowing_error"; } +}; + +// narrow() : a checked version of narrow_cast() that throws if the cast changed the value +template ::value>::type* = nullptr> +// clang-format off +GSL_SUPPRESS(type.1) // NO-FORMAT: attribute +GSL_SUPPRESS(f.6) // NO-FORMAT: attribute // TODO: MSVC /analyze does not recognise noexcept(false) + // clang-format on + constexpr T narrow(U u) noexcept(false) +{ + constexpr const bool is_different_signedness = + (std::is_signed::value != std::is_signed::value); + +GSL_SUPPRESS(es.103) // NO-FORMAT: attribute // don't overflow +GSL_SUPPRESS(es.104) // NO-FORMAT: attribute // don't underflow +GSL_SUPPRESS(p.2) // NO-FORMAT: attribute // don't rely on undefined behavior + const T t = narrow_cast(u); // While this is technically undefined behavior in some cases (i.e., if the source value is of floating-point type + // and cannot fit into the destination integral type), the resultant behavior is benign on the platforms + // that we target (i.e., no hardware trap representations are hit). + + if (static_cast(t) != u || (is_different_signedness && ((t < T{}) != (u < U{})))) + { + throw narrowing_error{}; + } + + return t; +} + +template ::value>::type* = nullptr> +// clang-format off +GSL_SUPPRESS(type.1) // NO-FORMAT: attribute +GSL_SUPPRESS(f.6) // NO-FORMAT: attribute // TODO: MSVC /analyze does not recognise noexcept(false) + // clang-format on + constexpr T narrow(U u) noexcept(false) +{ + const T t = narrow_cast(u); + + if (static_cast(t) != u) + { + throw narrowing_error{}; + } + + return t; +} +} // namespace gsl +#endif // GSL_NARROW_H diff --git a/3rdparty/include/gsl/pointers b/3rdparty/include/gsl/pointers new file mode 100644 index 0000000000..e6b234853a --- /dev/null +++ b/3rdparty/include/gsl/pointers @@ -0,0 +1,323 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_POINTERS_H +#define GSL_POINTERS_H + +#include // for Ensures, Expects + +#include // for forward +#include // for ptrdiff_t, nullptr_t, size_t +#include // for shared_ptr, unique_ptr +#include // for hash +#include // for enable_if_t, is_convertible, is_assignable + +#if !defined(GSL_NO_IOSTREAMS) +#include // for ostream +#endif // !defined(GSL_NO_IOSTREAMS) + +namespace gsl +{ + +namespace details +{ + template + struct is_comparable_to_nullptr : std::false_type + { + }; + + template + struct is_comparable_to_nullptr< + T, + std::enable_if_t() != nullptr), bool>::value>> + : std::true_type + { + }; +} // namespace details + +// +// GSL.owner: ownership pointers +// +using std::shared_ptr; +using std::unique_ptr; + +// +// owner +// +// owner is designed as a bridge for code that must deal directly with owning pointers for some +// reason +// +// T must be a pointer type +// - disallow construction from any type other than pointer type +// +template ::value>> +using owner = T; + +// +// not_null +// +// Restricts a pointer or smart pointer to only hold non-null values. +// +// Has zero size overhead over T. +// +// If T is a pointer (i.e. T == U*) then +// - allow construction from U* +// - disallow construction from nullptr_t +// - disallow default construction +// - ensure construction from null U* fails +// - allow implicit conversion to U* +// +template +class not_null +{ +public: + static_assert(details::is_comparable_to_nullptr::value, "T cannot be compared to nullptr."); + + template ::value>> + constexpr not_null(U&& u) : ptr_(std::forward(u)) + { + Expects(ptr_ != nullptr); + } + + template ::value>> + constexpr not_null(T u) : ptr_(std::move(u)) + { + Expects(ptr_ != nullptr); + } + + template ::value>> + constexpr not_null(const not_null& other) : not_null(other.get()) + {} + + not_null(const not_null& other) = default; + not_null& operator=(const not_null& other) = default; + constexpr std::conditional_t::value, T, const T&> get() const + { + Ensures(ptr_ != nullptr); + return ptr_; + } + + constexpr operator T() const { return get(); } + constexpr decltype(auto) operator->() const { return get(); } + constexpr decltype(auto) operator*() const { return *get(); } + + // prevents compilation when someone attempts to assign a null pointer constant + not_null(std::nullptr_t) = delete; + not_null& operator=(std::nullptr_t) = delete; + + // unwanted operators...pointers only point to single objects! + not_null& operator++() = delete; + not_null& operator--() = delete; + not_null operator++(int) = delete; + not_null operator--(int) = delete; + not_null& operator+=(std::ptrdiff_t) = delete; + not_null& operator-=(std::ptrdiff_t) = delete; + void operator[](std::ptrdiff_t) const = delete; + +private: + T ptr_; +}; + +template +auto make_not_null(T&& t) noexcept +{ + return not_null>>{std::forward(t)}; +} + +#if !defined(GSL_NO_IOSTREAMS) +template +std::ostream& operator<<(std::ostream& os, const not_null& val) +{ + os << val.get(); + return os; +} +#endif // !defined(GSL_NO_IOSTREAMS) + +template +auto operator==(const not_null& lhs, + const not_null& rhs) noexcept(noexcept(lhs.get() == rhs.get())) + -> decltype(lhs.get() == rhs.get()) +{ + return lhs.get() == rhs.get(); +} + +template +auto operator!=(const not_null& lhs, + const not_null& rhs) noexcept(noexcept(lhs.get() != rhs.get())) + -> decltype(lhs.get() != rhs.get()) +{ + return lhs.get() != rhs.get(); +} + +template +auto operator<(const not_null& lhs, + const not_null& rhs) noexcept(noexcept(lhs.get() < rhs.get())) + -> decltype(lhs.get() < rhs.get()) +{ + return lhs.get() < rhs.get(); +} + +template +auto operator<=(const not_null& lhs, + const not_null& rhs) noexcept(noexcept(lhs.get() <= rhs.get())) + -> decltype(lhs.get() <= rhs.get()) +{ + return lhs.get() <= rhs.get(); +} + +template +auto operator>(const not_null& lhs, + const not_null& rhs) noexcept(noexcept(lhs.get() > rhs.get())) + -> decltype(lhs.get() > rhs.get()) +{ + return lhs.get() > rhs.get(); +} + +template +auto operator>=(const not_null& lhs, + const not_null& rhs) noexcept(noexcept(lhs.get() >= rhs.get())) + -> decltype(lhs.get() >= rhs.get()) +{ + return lhs.get() >= rhs.get(); +} + +// more unwanted operators +template +std::ptrdiff_t operator-(const not_null&, const not_null&) = delete; +template +not_null operator-(const not_null&, std::ptrdiff_t) = delete; +template +not_null operator+(const not_null&, std::ptrdiff_t) = delete; +template +not_null operator+(std::ptrdiff_t, const not_null&) = delete; + +} // namespace gsl + +namespace std +{ +template +struct hash> +{ + std::size_t operator()(const gsl::not_null& value) const { return hash{}(value.get()); } +}; + +} // namespace std + +namespace gsl +{ + +// +// strict_not_null +// +// Restricts a pointer or smart pointer to only hold non-null values, +// +// - provides a strict (i.e. explicit constructor from T) wrapper of not_null +// - to be used for new code that wishes the design to be cleaner and make not_null +// checks intentional, or in old code that would like to make the transition. +// +// To make the transition from not_null, incrementally replace not_null +// by strict_not_null and fix compilation errors +// +// Expect to +// - remove all unneeded conversions from raw pointer to not_null and back +// - make API clear by specifying not_null in parameters where needed +// - remove unnecessary asserts +// +template +class strict_not_null : public not_null +{ +public: + template ::value>> + constexpr explicit strict_not_null(U&& u) : not_null(std::forward(u)) + {} + + template ::value>> + constexpr explicit strict_not_null(T u) : not_null(u) + {} + + template ::value>> + constexpr strict_not_null(const not_null& other) : not_null(other) + {} + + template ::value>> + constexpr strict_not_null(const strict_not_null& other) : not_null(other) + {} + + strict_not_null(strict_not_null&& other) = default; + strict_not_null(const strict_not_null& other) = default; + strict_not_null& operator=(const strict_not_null& other) = default; + strict_not_null& operator=(const not_null& other) + { + not_null::operator=(other); + return *this; + } + + // prevents compilation when someone attempts to assign a null pointer constant + strict_not_null(std::nullptr_t) = delete; + strict_not_null& operator=(std::nullptr_t) = delete; + + // unwanted operators...pointers only point to single objects! + strict_not_null& operator++() = delete; + strict_not_null& operator--() = delete; + strict_not_null operator++(int) = delete; + strict_not_null operator--(int) = delete; + strict_not_null& operator+=(std::ptrdiff_t) = delete; + strict_not_null& operator-=(std::ptrdiff_t) = delete; + void operator[](std::ptrdiff_t) const = delete; +}; + +// more unwanted operators +template +std::ptrdiff_t operator-(const strict_not_null&, const strict_not_null&) = delete; +template +strict_not_null operator-(const strict_not_null&, std::ptrdiff_t) = delete; +template +strict_not_null operator+(const strict_not_null&, std::ptrdiff_t) = delete; +template +strict_not_null operator+(std::ptrdiff_t, const strict_not_null&) = delete; + +template +auto make_strict_not_null(T&& t) noexcept +{ + return strict_not_null>>{std::forward(t)}; +} + +#if (defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L)) + +// deduction guides to prevent the ctad-maybe-unsupported warning +template +not_null(T) -> not_null; +template +strict_not_null(T) -> strict_not_null; + +#endif // ( defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L) ) + +} // namespace gsl + +namespace std +{ +template +struct hash> +{ + std::size_t operator()(const gsl::strict_not_null& value) const + { + return hash{}(value.get()); + } +}; + +} // namespace std + +#endif // GSL_POINTERS_H diff --git a/3rdparty/include/gsl/span b/3rdparty/include/gsl/span new file mode 100644 index 0000000000..cc8a7b9b0e --- /dev/null +++ b/3rdparty/include/gsl/span @@ -0,0 +1,821 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_SPAN_H +#define GSL_SPAN_H + +#include // for Expects +#include // for byte +#include // for narrow_cast + +#include // for array +#include // for ptrdiff_t, size_t, nullptr_t +#include // for span specialization of gsl::at and other span-related extensions +#include // for reverse_iterator, distance, random_access_... +#include // for enable_if_t, declval, is_convertible, inte... + +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(push) + +// turn off some warnings that are noisy about our Expects statements +#pragma warning(disable : 4127) // conditional expression is constant +#pragma warning( \ + disable : 4146) // unary minus operator applied to unsigned type, result still unsigned +#pragma warning(disable : 4702) // unreachable code + +// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool. +#pragma warning(disable : 26495) // uninitalized member when constructor calls constructor +#pragma warning(disable : 26446) // parser bug does not allow attributes on some templates + +#endif // _MSC_VER + +// See if we have enough C++17 power to use a static constexpr data member +// without needing an out-of-line definition +#if !(defined(__cplusplus) && (__cplusplus >= 201703L)) +#define GSL_USE_STATIC_CONSTEXPR_WORKAROUND +#endif // !(defined(__cplusplus) && (__cplusplus >= 201703L)) + +// GCC 7 does not like the signed unsigned missmatch (size_t ptrdiff_t) +// While there is a conversion from signed to unsigned, it happens at +// compiletime, so the compiler wouldn't have to warn indiscriminately, but +// could check if the source value actually doesn't fit into the target type +// and only warn in those cases. +#if defined(__GNUC__) && __GNUC__ > 6 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#endif + +namespace gsl +{ + +// implementation details +namespace details +{ + template + struct is_span_oracle : std::false_type + { + }; + + template + struct is_span_oracle> : std::true_type + { + }; + + template + struct is_span : public is_span_oracle> + { + }; + + template + struct is_std_array_oracle : std::false_type + { + }; + + template + struct is_std_array_oracle> : std::true_type + { + }; + + template + struct is_std_array : is_std_array_oracle> + { + }; + + template + struct is_allowed_extent_conversion + : std::integral_constant + { + }; + + template + struct is_allowed_element_type_conversion + : std::integral_constant::value> + { + }; + + template + class span_iterator + { + public: + using iterator_category = std::random_access_iterator_tag; + using value_type = std::remove_cv_t; + using difference_type = std::ptrdiff_t; + using pointer = Type*; + using reference = Type&; + +#ifdef _MSC_VER + using _Unchecked_type = pointer; +#endif // _MSC_VER + constexpr span_iterator() = default; + + constexpr span_iterator(pointer begin, pointer end, pointer current) + : begin_(begin), end_(end), current_(current) + {} + + constexpr operator span_iterator() const noexcept + { + return {begin_, end_, current_}; + } + + constexpr reference operator*() const noexcept + { + Expects(begin_ && end_); + Expects(begin_ <= current_ && current_ < end_); + return *current_; + } + + constexpr pointer operator->() const noexcept + { + Expects(begin_ && end_); + Expects(begin_ <= current_ && current_ < end_); + return current_; + } + constexpr span_iterator& operator++() noexcept + { + Expects(begin_ && current_ && end_); + Expects(current_ < end_); + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + ++current_; + return *this; + } + + constexpr span_iterator operator++(int) noexcept + { + span_iterator ret = *this; + ++*this; + return ret; + } + + constexpr span_iterator& operator--() noexcept + { + Expects(begin_ && end_); + Expects(begin_ < current_); + --current_; + return *this; + } + + constexpr span_iterator operator--(int) noexcept + { + span_iterator ret = *this; + --*this; + return ret; + } + + constexpr span_iterator& operator+=(const difference_type n) noexcept + { + if (n != 0) Expects(begin_ && current_ && end_); + if (n > 0) Expects(end_ - current_ >= n); + if (n < 0) Expects(current_ - begin_ >= -n); + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + current_ += n; + return *this; + } + + constexpr span_iterator operator+(const difference_type n) const noexcept + { + span_iterator ret = *this; + ret += n; + return ret; + } + + friend constexpr span_iterator operator+(const difference_type n, + const span_iterator& rhs) noexcept + { + return rhs + n; + } + + constexpr span_iterator& operator-=(const difference_type n) noexcept + { + if (n != 0) Expects(begin_ && current_ && end_); + if (n > 0) Expects(current_ - begin_ >= n); + if (n < 0) Expects(end_ - current_ >= -n); + current_ -= n; + return *this; + } + + constexpr span_iterator operator-(const difference_type n) const noexcept + { + span_iterator ret = *this; + ret -= n; + return ret; + } + + template < + class Type2, + std::enable_if_t, value_type>::value, int> = 0> + constexpr difference_type operator-(const span_iterator& rhs) const noexcept + { + Expects(begin_ == rhs.begin_ && end_ == rhs.end_); + return current_ - rhs.current_; + } + + constexpr reference operator[](const difference_type n) const noexcept + { + return *(*this + n); + } + + template < + class Type2, + std::enable_if_t, value_type>::value, int> = 0> + constexpr bool operator==(const span_iterator& rhs) const noexcept + { + Expects(begin_ == rhs.begin_ && end_ == rhs.end_); + return current_ == rhs.current_; + } + + template < + class Type2, + std::enable_if_t, value_type>::value, int> = 0> + constexpr bool operator!=(const span_iterator& rhs) const noexcept + { + return !(*this == rhs); + } + + template < + class Type2, + std::enable_if_t, value_type>::value, int> = 0> + constexpr bool operator<(const span_iterator& rhs) const noexcept + { + Expects(begin_ == rhs.begin_ && end_ == rhs.end_); + return current_ < rhs.current_; + } + + template < + class Type2, + std::enable_if_t, value_type>::value, int> = 0> + constexpr bool operator>(const span_iterator& rhs) const noexcept + { + return rhs < *this; + } + + template < + class Type2, + std::enable_if_t, value_type>::value, int> = 0> + constexpr bool operator<=(const span_iterator& rhs) const noexcept + { + return !(rhs < *this); + } + + template < + class Type2, + std::enable_if_t, value_type>::value, int> = 0> + constexpr bool operator>=(const span_iterator& rhs) const noexcept + { + return !(*this < rhs); + } + +#ifdef _MSC_VER + // MSVC++ iterator debugging support; allows STL algorithms in 15.8+ + // to unwrap span_iterator to a pointer type after a range check in STL + // algorithm calls + friend constexpr void _Verify_range(span_iterator lhs, span_iterator rhs) noexcept + { // test that [lhs, rhs) forms a valid range inside an STL algorithm + Expects(lhs.begin_ == rhs.begin_ // range spans have to match + && lhs.end_ == rhs.end_ && + lhs.current_ <= rhs.current_); // range must not be transposed + } + + constexpr void _Verify_offset(const difference_type n) const noexcept + { // test that *this + n is within the range of this call + if (n != 0) Expects(begin_ && current_ && end_); + if (n > 0) Expects(end_ - current_ >= n); + if (n < 0) Expects(current_ - begin_ >= -n); + } + + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + constexpr pointer _Unwrapped() const noexcept + { // after seeking *this to a high water mark, or using one of the + // _Verify_xxx functions above, unwrap this span_iterator to a raw + // pointer + return current_; + } + + // Tell the STL that span_iterator should not be unwrapped if it can't + // validate in advance, even in release / optimized builds: +#if defined(GSL_USE_STATIC_CONSTEXPR_WORKAROUND) + static constexpr const bool _Unwrap_when_unverified = false; +#else + static constexpr bool _Unwrap_when_unverified = false; +#endif + // clang-format off + GSL_SUPPRESS(con.3) // NO-FORMAT: attribute // TODO: false positive + // clang-format on + constexpr void _Seek_to(const pointer p) noexcept + { // adjust the position of *this to previously verified location p + // after _Unwrapped + current_ = p; + } +#endif + + pointer begin_ = nullptr; + pointer end_ = nullptr; + pointer current_ = nullptr; + }; + + template + class extent_type + { + public: + using size_type = std::size_t; + + constexpr extent_type() noexcept = default; + + constexpr explicit extent_type(extent_type); + + constexpr explicit extent_type(size_type size) { Expects(size == Ext); } + + constexpr size_type size() const noexcept { return Ext; } + + private: +#if defined(GSL_USE_STATIC_CONSTEXPR_WORKAROUND) + static constexpr const size_type size_ = Ext; // static size equal to Ext +#else + static constexpr size_type size_ = Ext; // static size equal to Ext +#endif + }; + + template <> + class extent_type + { + public: + using size_type = std::size_t; + + template + constexpr explicit extent_type(extent_type ext) : size_(ext.size()) + {} + + constexpr explicit extent_type(size_type size) : size_(size) + { + Expects(size != dynamic_extent); + } + + constexpr size_type size() const noexcept { return size_; } + + private: + size_type size_; + }; + + template + constexpr extent_type::extent_type(extent_type ext) + { + Expects(ext.size() == Ext); + } + + template + struct calculate_subspan_type + { + using type = span; + }; +} // namespace details + +// [span], class template span +template +class span +{ +public: + // constants and types + using element_type = ElementType; + using value_type = std::remove_cv_t; + using size_type = std::size_t; + using pointer = element_type*; + using const_pointer = const element_type*; + using reference = element_type&; + using const_reference = const element_type&; + using difference_type = std::ptrdiff_t; + + using iterator = details::span_iterator; + using reverse_iterator = std::reverse_iterator; + +#if defined(GSL_USE_STATIC_CONSTEXPR_WORKAROUND) + static constexpr const size_type extent{Extent}; +#else + static constexpr size_type extent{Extent}; +#endif + + // [span.cons], span constructors, copy, assignment, and destructor + template " SFINAE, since "std::enable_if_t" is ill-formed when Extent is greater than 0. + class = std::enable_if_t<(Dependent || + details::is_allowed_extent_conversion<0, Extent>::value)>> + constexpr span() noexcept : storage_(nullptr, details::extent_type<0>()) + {} + + template = 0> + constexpr explicit span(pointer ptr, size_type count) noexcept : storage_(ptr, count) + { + Expects(count == Extent); + } + + template = 0> + constexpr span(pointer ptr, size_type count) noexcept : storage_(ptr, count) + {} + + template = 0> + constexpr explicit span(pointer firstElem, pointer lastElem) noexcept + : storage_(firstElem, narrow_cast(lastElem - firstElem)) + { + Expects(lastElem - firstElem == static_cast(Extent)); + } + + template = 0> + constexpr span(pointer firstElem, pointer lastElem) noexcept + : storage_(firstElem, narrow_cast(lastElem - firstElem)) + {} + + template ::value, int> = 0> + constexpr span(element_type (&arr)[N]) noexcept + : storage_(KnownNotNull{arr}, details::extent_type()) + {} + + template < + class T, std::size_t N, + std::enable_if_t<(details::is_allowed_extent_conversion::value && + details::is_allowed_element_type_conversion::value), + int> = 0> + constexpr span(std::array& arr) noexcept + : storage_(KnownNotNull{arr.data()}, details::extent_type()) + {} + + template ::value && + details::is_allowed_element_type_conversion::value), + int> = 0> + constexpr span(const std::array& arr) noexcept + : storage_(KnownNotNull{arr.data()}, details::extent_type()) + {} + + // NB: the SFINAE on these constructors uses .data() as an incomplete/imperfect proxy for the + // requirement on Container to be a contiguous sequence container. + template ::value && + !details::is_std_array::value && + std::is_pointer().data())>::value && + std::is_convertible< + std::remove_pointer_t().data())> (*)[], + element_type (*)[]>::value, + int> = 0> + constexpr explicit span(Container& cont) noexcept : span(cont.data(), cont.size()) + {} + + template ::value && + !details::is_std_array::value && + std::is_pointer().data())>::value && + std::is_convertible< + std::remove_pointer_t().data())> (*)[], + element_type (*)[]>::value, + int> = 0> + constexpr span(Container& cont) noexcept : span(cont.data(), cont.size()) + {} + + template < + std::size_t MyExtent = Extent, class Container, + std::enable_if_t< + MyExtent != dynamic_extent && std::is_const::value && + !details::is_span::value && !details::is_std_array::value && + std::is_pointer().data())>::value && + std::is_convertible< + std::remove_pointer_t().data())> (*)[], + element_type (*)[]>::value, + int> = 0> + constexpr explicit span(const Container& cont) noexcept : span(cont.data(), cont.size()) + {} + + template < + std::size_t MyExtent = Extent, class Container, + std::enable_if_t< + MyExtent == dynamic_extent && std::is_const::value && + !details::is_span::value && !details::is_std_array::value && + std::is_pointer().data())>::value && + std::is_convertible< + std::remove_pointer_t().data())> (*)[], + element_type (*)[]>::value, + int> = 0> + constexpr span(const Container& cont) noexcept : span(cont.data(), cont.size()) + {} + + constexpr span(const span& other) noexcept = default; + + template ::value, + int> = 0> + constexpr span(const span& other) noexcept + : storage_(other.data(), details::extent_type(other.size())) + {} + + template ::value, + int> = 0> + constexpr explicit span(const span& other) noexcept + : storage_(other.data(), details::extent_type(other.size())) + {} + + ~span() noexcept = default; + constexpr span& operator=(const span& other) noexcept = default; + + // [span.sub], span subviews + template + constexpr span first() const noexcept + { + Expects(Count <= size()); + return span{data(), Count}; + } + + template + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + constexpr span last() const noexcept + { + Expects(Count <= size()); + return span{data() + (size() - Count), Count}; + } + + template + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + constexpr auto subspan() const noexcept -> + typename details::calculate_subspan_type::type + { + Expects((size() >= Offset) && (Count == dynamic_extent || (Count <= size() - Offset))); + using type = + typename details::calculate_subspan_type::type; + return type{data() + Offset, Count == dynamic_extent ? size() - Offset : Count}; + } + + constexpr span first(size_type count) const noexcept + { + Expects(count <= size()); + return {data(), count}; + } + + constexpr span last(size_type count) const noexcept + { + Expects(count <= size()); + return make_subspan(size() - count, dynamic_extent, subspan_selector{}); + } + + constexpr span + subspan(size_type offset, size_type count = dynamic_extent) const noexcept + { + return make_subspan(offset, count, subspan_selector{}); + } + + // [span.obs], span observers + constexpr size_type size() const noexcept { return storage_.size(); } + + constexpr size_type size_bytes() const noexcept + { + Expects(size() < dynamic_extent / sizeof(element_type)); + return size() * sizeof(element_type); + } + + constexpr bool empty() const noexcept { return size() == 0; } + + // [span.elem], span element access + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + constexpr reference operator[](size_type idx) const noexcept + { + Expects(idx < size()); + return data()[idx]; + } + + constexpr reference front() const noexcept + { + Expects(size() > 0); + return data()[0]; + } + + constexpr reference back() const noexcept + { + Expects(size() > 0); + return data()[size() - 1]; + } + + constexpr pointer data() const noexcept { return storage_.data(); } + + // [span.iter], span iterator support + constexpr iterator begin() const noexcept + { + const auto data = storage_.data(); + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + return {data, data + size(), data}; + } + + constexpr iterator end() const noexcept + { + const auto data = storage_.data(); + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + const auto endData = data + storage_.size(); + return {data, endData, endData}; + } + + constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; } + constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; } + +#ifdef _MSC_VER + // Tell MSVC how to unwrap spans in range-based-for + constexpr pointer _Unchecked_begin() const noexcept { return data(); } + constexpr pointer _Unchecked_end() const noexcept + { + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + return data() + size(); + } +#endif // _MSC_VER + +private: + // Needed to remove unnecessary null check in subspans + struct KnownNotNull + { + pointer p; + }; + + // this implementation detail class lets us take advantage of the + // empty base class optimization to pay for only storage of a single + // pointer in the case of fixed-size spans + template + class storage_type : public ExtentType + { + public: + // KnownNotNull parameter is needed to remove unnecessary null check + // in subspans and constructors from arrays + template + constexpr storage_type(KnownNotNull data, OtherExtentType ext) + : ExtentType(ext), data_(data.p) + { + Expects(ExtentType::size() != dynamic_extent); + } + + template + constexpr storage_type(pointer data, OtherExtentType ext) : ExtentType(ext), data_(data) + { + Expects(ExtentType::size() != dynamic_extent); + Expects(data || ExtentType::size() == 0); + } + + constexpr pointer data() const noexcept { return data_; } + + private: + pointer data_; + }; + + storage_type> storage_; + + // The rest is needed to remove unnecessary null check + // in subspans and constructors from arrays + constexpr span(KnownNotNull ptr, size_type count) noexcept : storage_(ptr, count) {} + + template + class subspan_selector + { + }; + + template + constexpr span + make_subspan(size_type offset, size_type count, subspan_selector) const noexcept + { + const span tmp(*this); + return tmp.subspan(offset, count); + } + + // clang-format off + GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + constexpr span + make_subspan(size_type offset, size_type count, subspan_selector) const noexcept + { + Expects(size() >= offset); + + if (count == dynamic_extent) { return {KnownNotNull{data() + offset}, size() - offset}; } + + Expects(size() - offset >= count); + return {KnownNotNull{data() + offset}, count}; + } +}; + +#if (defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L)) + +// Deduction Guides +template +span(Type (&)[Extent]) -> span; + +template +span(std::array&) -> span; + +template +span(const std::array&) -> span; + +template ().data())>> +span(Container&) -> span; + +template ().data())>> +span(const Container&) -> span; + +#endif // ( defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201611L) ) + +#if defined(GSL_USE_STATIC_CONSTEXPR_WORKAROUND) +template +constexpr const typename span::size_type span::extent; +#endif + +namespace details +{ + // if we only supported compilers with good constexpr support then + // this pair of classes could collapse down to a constexpr function + + // we should use a narrow_cast<> to go to std::size_t, but older compilers may not see it as + // constexpr + // and so will fail compilation of the template + template + struct calculate_byte_size : std::integral_constant + { + static_assert(Extent < dynamic_extent / sizeof(ElementType), "Size is too big."); + }; + + template + struct calculate_byte_size + : std::integral_constant + { + }; +} // namespace details + +// [span.objectrep], views of object representation +template +span::value> +as_bytes(span s) noexcept +{ + using type = span::value>; + + // clang-format off + GSL_SUPPRESS(type.1) // NO-FORMAT: attribute + // clang-format on + return type{reinterpret_cast(s.data()), s.size_bytes()}; +} + +template ::value, int> = 0> +span::value> +as_writable_bytes(span s) noexcept +{ + using type = span::value>; + + // clang-format off + GSL_SUPPRESS(type.1) // NO-FORMAT: attribute + // clang-format on + return type{reinterpret_cast(s.data()), s.size_bytes()}; +} + +} // namespace gsl + +#if defined(_MSC_VER) && !defined(__clang__) + +#pragma warning(pop) +#endif // _MSC_VER + +#if defined(__GNUC__) && __GNUC__ > 6 +#pragma GCC diagnostic pop +#endif // __GNUC__ > 6 + +#endif // GSL_SPAN_H diff --git a/3rdparty/include/gsl/span_ext b/3rdparty/include/gsl/span_ext new file mode 100644 index 0000000000..e82a5b6bad --- /dev/null +++ b/3rdparty/include/gsl/span_ext @@ -0,0 +1,212 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_SPAN_EXT_H +#define GSL_SPAN_EXT_H + +/////////////////////////////////////////////////////////////////////////////// +// +// File: span_ext +// Purpose: continue offering features that have been cut from the official +// implementation of span. +// While modernizing gsl::span a number of features needed to be removed to +// be compliant with the design of std::span +// +/////////////////////////////////////////////////////////////////////////////// + +#include // GSL_KERNEL_MODE +#include // for narrow_cast, narrow + +#include // for ptrdiff_t, size_t +#include + +#ifndef GSL_KERNEL_MODE +#include // for lexicographical_compare +#endif // GSL_KERNEL_MODE + +namespace gsl +{ + +// [span.views.constants], constants +constexpr const std::size_t dynamic_extent = narrow_cast(-1); + +template +class span; + +// std::equal and std::lexicographical_compare are not /kernel compatible +// so all comparison operators must be removed for kernel mode. +#ifndef GSL_KERNEL_MODE + +// [span.comparison], span comparison operators +template +constexpr bool operator==(span l, span r) +{ + return std::equal(l.begin(), l.end(), r.begin(), r.end()); +} + +template +constexpr bool operator!=(span l, span r) +{ + return !(l == r); +} + +template +constexpr bool operator<(span l, span r) +{ + return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end()); +} + +template +constexpr bool operator<=(span l, span r) +{ + return !(l > r); +} + +template +constexpr bool operator>(span l, span r) +{ + return r < l; +} + +template +constexpr bool operator>=(span l, span r) +{ + return !(l < r); +} + +#endif // GSL_KERNEL_MODE + +// +// make_span() - Utility functions for creating spans +// +template +constexpr span make_span(ElementType* ptr, typename span::size_type count) +{ + return span(ptr, count); +} + +template +constexpr span make_span(ElementType* firstElem, ElementType* lastElem) +{ + return span(firstElem, lastElem); +} + +template +constexpr span make_span(ElementType (&arr)[N]) noexcept +{ + return span(arr); +} + +template +constexpr span make_span(Container& cont) +{ + return span(cont); +} + +template +constexpr span make_span(const Container& cont) +{ + return span(cont); +} + +template +constexpr span make_span(Ptr& cont, std::size_t count) +{ + return span(cont, count); +} + +template +constexpr span make_span(Ptr& cont) +{ + return span(cont); +} + +// Specialization of gsl::at for span +template +constexpr ElementType& at(span s, index i) +{ + // No bounds checking here because it is done in span::operator[] called below + Ensures(i >= 0); + return s[narrow_cast(i)]; +} + +// [span.obs] Free observer functions +template +constexpr std::ptrdiff_t ssize(const span& s) noexcept +{ + return static_cast(s.size()); +} + +// [span.iter] Free functions for begin/end functions +template +constexpr typename span::iterator +begin(const span& s) noexcept +{ + return s.begin(); +} + +template +constexpr typename span::iterator +end(const span& s) noexcept +{ + return s.end(); +} + +template +constexpr typename span::reverse_iterator +rbegin(const span& s) noexcept +{ + return s.rbegin(); +} + +template +constexpr typename span::reverse_iterator +rend(const span& s) noexcept +{ + return s.rend(); +} + +template +constexpr typename span::iterator +cbegin(const span& s) noexcept +{ + return s.begin(); +} + +template +constexpr typename span::iterator +cend(const span& s) noexcept +{ + return s.end(); +} + +template +constexpr typename span::reverse_iterator +crbegin(const span& s) noexcept +{ + return s.rbegin(); +} + +template +constexpr typename span::reverse_iterator +crend(const span& s) noexcept +{ + return s.rend(); +} + +} // namespace gsl + +#endif // GSL_SPAN_EXT_H diff --git a/3rdparty/include/gsl/string_span b/3rdparty/include/gsl/string_span new file mode 100644 index 0000000000..7c1f3458ff --- /dev/null +++ b/3rdparty/include/gsl/string_span @@ -0,0 +1,759 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_STRING_SPAN_H +#define GSL_STRING_SPAN_H + +#include // for Ensures, Expects +#include // for operator!=, operator==, dynamic_extent +#include // for narrow_cast + +#include // for equal, lexicographical_compare +#include // for array +#include // for size_t, nullptr_t +#include // for PTRDIFF_MAX +#include +#include // for basic_string, allocator, char_traits +#include // for declval, is_convertible, enable_if_t, add_... + +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(push) + +// Turn MSVC /analyze rules that generate too much noise. TODO: fix in the tool. +#pragma warning(disable : 26446) // TODO: bug in parser - attributes and templates +#pragma warning(disable : 26481) // TODO: suppress does not work inside templates sometimes +#pragma warning(disable : 4996) // use of functions & classes marked [[deprecated]] +#endif // _MSC_VER + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +namespace gsl +{ +// +// czstring and wzstring +// +// These are "tag" typedefs for C-style strings (i.e. null-terminated character arrays) +// that allow static analysis to help find bugs. +// +// There are no additional features/semantics that we can find a way to add inside the +// type system for these types that will not either incur significant runtime costs or +// (sometimes needlessly) break existing programs when introduced. +// + +template +using basic_zstring = CharT*; + +using czstring = basic_zstring; + +using cwzstring = basic_zstring; + +using cu16zstring = basic_zstring; + +using cu32zstring = basic_zstring; + +using zstring = basic_zstring; + +using wzstring = basic_zstring; + +using u16zstring = basic_zstring; + +using u32zstring = basic_zstring; + +namespace details +{ + template + [[deprecated("string_span was removed from the C++ Core Guidelines. For more information, see " + "isocpp/CppCoreGuidelines PR#1680")]] constexpr std::size_t + string_length(const CharT* str, std::size_t n) + { + if (str == nullptr || n == dynamic_extent) return 0; + + const span str_span{str, n}; + + std::size_t len = 0; + while (len < n && str_span[len]) len++; + + return len; + } +} // namespace details + +// +// ensure_sentinel() +// +// Provides a way to obtain an span from a contiguous sequence +// that ends with a (non-inclusive) sentinel value. +// +// Will fail-fast if sentinel cannot be found before max elements are examined. +// +template +[[deprecated("string_span was removed from the C++ Core Guidelines. For more information, see " + "isocpp/CppCoreGuidelines PR#1680")]] constexpr span +ensure_sentinel(T* seq, std::size_t max = static_cast(-1)) +{ + Ensures(seq != nullptr); + + // clang-format off + GSL_SUPPRESS(f.23) // TODO: false positive // TODO: suppress does not work + // clang-format on + auto cur = seq; + Ensures(cur != nullptr); // workaround for removing the warning + + // clang-format off + GSL_SUPPRESS(bounds.1) // TODO: suppress does not work + // clang-format on + while (static_cast(cur - seq) < max && *cur != Sentinel) ++cur; + Ensures(*cur == Sentinel); + return {seq, static_cast(cur - seq)}; +} + +// +// ensure_z - creates a span for a zero terminated strings. The span will not contain the zero +// termination. Will fail fast if a null-terminator cannot be found before the limit of size_type. +// +template +[[deprecated("string_span was removed from the C++ Core Guidelines. For more information, see " + "isocpp/CppCoreGuidelines PR#1680")]] constexpr span +ensure_z(CharT* const& sz, std::size_t max = static_cast(-1)) +{ + return ensure_sentinel(sz, max); +} + +template +constexpr span ensure_z(CharT (&sz)[N]) +{ + return ensure_z(&sz[0], N); +} + +template +[[deprecated( + "string_span was removed from the C++ Core Guidelines. For more information, see " + "isocpp/CppCoreGuidelines PR#1680")]] constexpr span::type, + dynamic_extent> +ensure_z(Cont& cont) +{ + return ensure_z(cont.data(), cont.size()); +} + +template +class [[deprecated("string_span was removed from the C++ Core Guidelines. For more information, " + "see isocpp/CppCoreGuidelines PR#1680")]] basic_string_span; + +namespace details +{ + template + struct [[deprecated( + "string_span was removed from the C++ Core Guidelines. For more information, " + "see isocpp/CppCoreGuidelines PR#1680")]] is_basic_string_span_oracle : std::false_type{}; + + template + struct [[deprecated( + "string_span was removed from the C++ Core Guidelines. For more information, see " + "isocpp/CppCoreGuidelines PR#1680")]] is_basic_string_span_oracle> + : std::true_type{}; + + template + struct [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] is_basic_string_span + : is_basic_string_span_oracle>{}; +} // namespace details + +// +// string_span and relatives +// +template +class [[deprecated("string_span was removed from the C++ Core Guidelines. For more information, " + "see isocpp/CppCoreGuidelines PR#1680")]] basic_string_span +{ +public: + using element_type = CharT; + using value_type = std::remove_cv_t; + using pointer = std::add_pointer_t; + using reference = std::add_lvalue_reference_t; + using const_reference = std::add_lvalue_reference_t>; + using impl_type = span; + + using size_type = typename impl_type::size_type; + using iterator = typename impl_type::iterator; + using reverse_iterator = typename impl_type::reverse_iterator; + + // default (empty) + constexpr basic_string_span() noexcept = default; + + // copy + constexpr basic_string_span(const basic_string_span& other) noexcept = default; + + // assign + constexpr basic_string_span& operator=(const basic_string_span& other) noexcept = default; + + constexpr basic_string_span(pointer ptr, size_type length) : span_(ptr, length) {} + constexpr basic_string_span(pointer firstElem, pointer lastElem) : span_(firstElem, lastElem) {} + + // From static arrays - if 0-terminated, remove 0 from the view + // All other containers allow 0s within the length, so we do not remove them + template + constexpr basic_string_span(element_type(&arr)[N]) : span_(remove_z(arr)) + {} + + template > + constexpr basic_string_span(std::array & arr) noexcept : span_(arr) + {} + + template > + constexpr basic_string_span(const std::array& arr) noexcept : span_(arr) + {} + + // Container signature should work for basic_string after C++17 version exists + template + // GSL_SUPPRESS(bounds.4) // TODO: parser bug + constexpr basic_string_span(std::basic_string & str) + : span_(&str[0], str.length()) + {} + + template + constexpr basic_string_span(const std::basic_string& str) + : span_(&str[0], str.length()) + {} + + // from containers. Containers must have a pointer type and data() function signatures + template ::value && + std::is_convertible::value && + std::is_convertible().data())>::value>> + constexpr basic_string_span(Container & cont) : span_(cont) + {} + + template ::value && + std::is_convertible::value && + std::is_convertible().data())>::value>> + constexpr basic_string_span(const Container& cont) : span_(cont) + {} + + // from string_span + template < + class OtherValueType, std::size_t OtherExtent, + class = std::enable_if_t::impl_type, impl_type>::value>> + constexpr basic_string_span(basic_string_span other) + : span_(other.data(), other.length()) + {} + + template + constexpr basic_string_span first() const + { + return {span_.template first()}; + } + + constexpr basic_string_span first(size_type count) const + { + return {span_.first(count)}; + } + + template + constexpr basic_string_span last() const + { + return {span_.template last()}; + } + + constexpr basic_string_span last(size_type count) const + { + return {span_.last(count)}; + } + + template + constexpr basic_string_span subspan() const + { + return {span_.template subspan()}; + } + + constexpr basic_string_span subspan( + size_type offset, size_type count = dynamic_extent) const + { + return {span_.subspan(offset, count)}; + } + + constexpr reference operator[](size_type idx) const { return span_[idx]; } + constexpr reference operator()(size_type idx) const { return span_[idx]; } + + constexpr pointer data() const { return span_.data(); } + + constexpr size_type length() const noexcept { return span_.size(); } + constexpr size_type size() const noexcept { return span_.size(); } + constexpr size_type size_bytes() const noexcept { return span_.size_bytes(); } + constexpr size_type length_bytes() const noexcept { return span_.length_bytes(); } + constexpr bool empty() const noexcept { return size() == 0; } + + constexpr iterator begin() const noexcept { return span_.begin(); } + constexpr iterator end() const noexcept { return span_.end(); } + + constexpr reverse_iterator rbegin() const noexcept { return span_.rbegin(); } + constexpr reverse_iterator rend() const noexcept { return span_.rend(); } + +private: + static constexpr impl_type remove_z(pointer const& sz, std::size_t max) + { + return impl_type(sz, details::string_length(sz, max)); + } + + template + static constexpr impl_type remove_z(element_type(&sz)[N]) + { + return remove_z(&sz[0], N); + } + + impl_type span_; +}; + +template +using string_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_string_span; + +template +using cstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_string_span; + +template +using wstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_string_span; + +template +using cwstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_string_span; + +template +using u16string_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_string_span; + +template +using cu16string_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_string_span; + +template +using u32string_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_string_span; + +template +using cu32string_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_string_span; + +// +// to_string() allow (explicit) conversions from string_span to string +// + +template +constexpr std::basic_string::type> +to_string(basic_string_span view) +{ + return {view.data(), narrow_cast(view.length())}; +} + +template , + typename Allocator = std::allocator, typename gCharT, std::size_t Extent> +constexpr std::basic_string +to_basic_string(basic_string_span view) +{ + return {view.data(), narrow_cast(view.length())}; +} + +template +constexpr basic_string_span::value> +as_bytes(basic_string_span s) noexcept +{ + // clang-format off + GSL_SUPPRESS(type.1) + // clang-format on + return {reinterpret_cast(s.data()), s.size_bytes()}; +} + +template ::value>> +constexpr basic_string_span::value> +as_writable_bytes(basic_string_span s) noexcept +{ + // clang-format off + GSL_SUPPRESS(type.1) + // clang-format on + return {reinterpret_cast(s.data()), s.size_bytes()}; +} + +// zero-terminated string span, used to convert +// zero-terminated spans to legacy strings +template +class [[deprecated("string_span was removed from the C++ Core Guidelines. For more information, " + "see isocpp/CppCoreGuidelines PR#1680")]] basic_zstring_span +{ +public: + using value_type = CharT; + using const_value_type = std::add_const_t; + + using pointer = std::add_pointer_t; + using const_pointer = std::add_pointer_t; + + using zstring_type = basic_zstring; + using const_zstring_type = basic_zstring; + + using impl_type = span; + using string_span_type = basic_string_span; + + constexpr basic_zstring_span(impl_type s) : span_(s) + { + // expects a zero-terminated span + Expects(s.size() > 0); + Expects(s[s.size() - 1] == value_type{}); + } + + // copy + constexpr basic_zstring_span(const basic_zstring_span& other) = default; + + // move + constexpr basic_zstring_span(basic_zstring_span && other) = default; + + // assign + constexpr basic_zstring_span& operator=(const basic_zstring_span& other) = default; + + // move assign + constexpr basic_zstring_span& operator=(basic_zstring_span&& other) = default; + + constexpr bool empty() const noexcept { return false; } + + constexpr string_span_type as_string_span() const noexcept + { + return {span_.data(), span_.size() - 1}; + } + constexpr string_span_type ensure_z() const { return gsl::ensure_z(span_); } + + constexpr const_zstring_type assume_z() const noexcept { return span_.data(); } + +private: + impl_type span_; +}; + +template +using zstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_zstring_span; + +template +using wzstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_zstring_span; + +template +using u16zstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_zstring_span; + +template +using u32zstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_zstring_span; + +template +using czstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_zstring_span; + +template +using cwzstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For more " + "information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_zstring_span; + +template +using cu16zstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For " + "more information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_zstring_span; + +template +using cu32zstring_span [[deprecated("string_span was removed from the C++ Core Guidelines. For " + "more information, see isocpp/CppCoreGuidelines PR#1680")]] = + basic_zstring_span; + +// operator == +template ::value || + std::is_convertible>>::value>> +bool operator==(const gsl::basic_string_span& one, const T& other) +{ + const gsl::basic_string_span> tmp(other); + return std::equal(one.begin(), one.end(), tmp.begin(), tmp.end()); +} + +template ::value && + std::is_convertible>>::value>> +bool operator==(const T& one, const gsl::basic_string_span& other) +{ + const gsl::basic_string_span> tmp(one); + return std::equal(tmp.begin(), tmp.end(), other.begin(), other.end()); +} + +// operator != +template , Extent>>::value>> +bool operator!=(gsl::basic_string_span one, const T& other) +{ + return !(one == other); +} + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename = std::enable_if_t< + std::is_convertible, Extent>>::value && + !gsl::details::is_basic_string_span::value>> +bool operator!=(const T& one, gsl::basic_string_span other) +{ + return !(one == other); +} + +// operator< +template , Extent>>::value>> +bool operator<(gsl::basic_string_span one, const T& other) +{ + const gsl::basic_string_span, Extent> tmp(other); + return std::lexicographical_compare(one.begin(), one.end(), tmp.begin(), tmp.end()); +} + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename = std::enable_if_t< + std::is_convertible, Extent>>::value && + !gsl::details::is_basic_string_span::value>> +bool operator<(const T& one, gsl::basic_string_span other) +{ + gsl::basic_string_span, Extent> tmp(one); + return std::lexicographical_compare(tmp.begin(), tmp.end(), other.begin(), other.end()); +} + +#ifndef _MSC_VER + +// VS treats temp and const containers as convertible to basic_string_span, +// so the cases below are already covered by the previous operators + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename DataType = typename T::value_type, + typename = std::enable_if_t< + !gsl::details::is_span::value && !gsl::details::is_basic_string_span::value && + std::is_convertible::value && + std::is_same().size(), *std::declval().data())>, + DataType>::value>> +bool operator<(gsl::basic_string_span one, const T& other) +{ + gsl::basic_string_span, Extent> tmp(other); + return std::lexicographical_compare(one.begin(), one.end(), tmp.begin(), tmp.end()); +} + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename DataType = typename T::value_type, + typename = std::enable_if_t< + !gsl::details::is_span::value && !gsl::details::is_basic_string_span::value && + std::is_convertible::value && + std::is_same().size(), *std::declval().data())>, + DataType>::value>> +bool operator<(const T& one, gsl::basic_string_span other) +{ + gsl::basic_string_span, Extent> tmp(one); + return std::lexicographical_compare(tmp.begin(), tmp.end(), other.begin(), other.end()); +} +#endif + +// operator <= +template , Extent>>::value>> +bool operator<=(gsl::basic_string_span one, const T& other) +{ + return !(other < one); +} + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename = std::enable_if_t< + std::is_convertible, Extent>>::value && + !gsl::details::is_basic_string_span::value>> +bool operator<=(const T& one, gsl::basic_string_span other) +{ + return !(other < one); +} + +#ifndef _MSC_VER + +// VS treats temp and const containers as convertible to basic_string_span, +// so the cases below are already covered by the previous operators + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename DataType = typename T::value_type, + typename = std::enable_if_t< + !gsl::details::is_span::value && !gsl::details::is_basic_string_span::value && + std::is_convertible::value && + std::is_same().size(), *std::declval().data())>, + DataType>::value>> +bool operator<=(gsl::basic_string_span one, const T& other) +{ + return !(other < one); +} + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename DataType = typename T::value_type, + typename = std::enable_if_t< + !gsl::details::is_span::value && !gsl::details::is_basic_string_span::value && + std::is_convertible::value && + std::is_same().size(), *std::declval().data())>, + DataType>::value>> +bool operator<=(const T& one, gsl::basic_string_span other) +{ + return !(other < one); +} +#endif + +// operator> +template , Extent>>::value>> +bool operator>(gsl::basic_string_span one, const T& other) +{ + return other < one; +} + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename = std::enable_if_t< + std::is_convertible, Extent>>::value && + !gsl::details::is_basic_string_span::value>> +bool operator>(const T& one, gsl::basic_string_span other) +{ + return other < one; +} + +#ifndef _MSC_VER + +// VS treats temp and const containers as convertible to basic_string_span, +// so the cases below are already covered by the previous operators + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename DataType = typename T::value_type, + typename = std::enable_if_t< + !gsl::details::is_span::value && !gsl::details::is_basic_string_span::value && + std::is_convertible::value && + std::is_same().size(), *std::declval().data())>, + DataType>::value>> +bool operator>(gsl::basic_string_span one, const T& other) +{ + return other < one; +} + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename DataType = typename T::value_type, + typename = std::enable_if_t< + !gsl::details::is_span::value && !gsl::details::is_basic_string_span::value && + std::is_convertible::value && + std::is_same().size(), *std::declval().data())>, + DataType>::value>> +bool operator>(const T& one, gsl::basic_string_span other) +{ + return other < one; +} +#endif + +// operator >= +template , Extent>>::value>> +bool operator>=(gsl::basic_string_span one, const T& other) +{ + return !(one < other); +} + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename = std::enable_if_t< + std::is_convertible, Extent>>::value && + !gsl::details::is_basic_string_span::value>> +bool operator>=(const T& one, gsl::basic_string_span other) +{ + return !(one < other); +} + +#ifndef _MSC_VER + +// VS treats temp and const containers as convertible to basic_string_span, +// so the cases below are already covered by the previous operators + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename DataType = typename T::value_type, + typename = std::enable_if_t< + !gsl::details::is_span::value && !gsl::details::is_basic_string_span::value && + std::is_convertible::value && + std::is_same().size(), *std::declval().data())>, + DataType>::value>> +bool operator>=(gsl::basic_string_span one, const T& other) +{ + return !(one < other); +} + +template < + typename CharT, std::size_t Extent = dynamic_extent, typename T, + typename DataType = typename T::value_type, + typename = std::enable_if_t< + !gsl::details::is_span::value && !gsl::details::is_basic_string_span::value && + std::is_convertible::value && + std::is_same().size(), *std::declval().data())>, + DataType>::value>> +bool operator>=(const T& one, gsl::basic_string_span other) +{ + return !(one < other); +} +#endif +} // namespace gsl + +#if defined(_MSC_VER) && !defined(__clang__) +#pragma warning(pop) + +#endif // _MSC_VER + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif +#endif // GSL_STRING_SPAN_H diff --git a/3rdparty/include/gsl/util b/3rdparty/include/gsl/util new file mode 100644 index 0000000000..a215bad108 --- /dev/null +++ b/3rdparty/include/gsl/util @@ -0,0 +1,160 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015 Microsoft Corporation. All rights reserved. +// +// This code is licensed under the MIT License (MIT). +// +// 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 GSL_UTIL_H +#define GSL_UTIL_H + +#include // for Expects + +#include +#include // for ptrdiff_t, size_t +#include // for initializer_list +#include // for is_signed, integral_constant +#include // for exchange, forward + +#if defined(__has_include) && __has_include() +#include +#if defined(__cpp_lib_span) && __cpp_lib_span >= 202002L +#include +#endif // __cpp_lib_span >= 202002L +#endif //__has_include() + +#if defined(_MSC_VER) && !defined(__clang__) + +#pragma warning(push) +#pragma warning(disable : 4127) // conditional expression is constant + +#endif // _MSC_VER + +#if defined(__cplusplus) && (__cplusplus >= 201703L) +#define GSL_NODISCARD [[nodiscard]] +#else +#define GSL_NODISCARD +#endif // defined(__cplusplus) && (__cplusplus >= 201703L) + +namespace gsl +{ +// +// GSL.util: utilities +// + +// index type for all container indexes/subscripts/sizes +using index = std::ptrdiff_t; + +// final_action allows you to ensure something gets run at the end of a scope +template +class final_action +{ +public: + static_assert(!std::is_reference::value && !std::is_const::value && + !std::is_volatile::value, + "Final_action should store its callable by value"); + + explicit final_action(F f) noexcept : f_(std::move(f)) {} + + final_action(final_action&& other) noexcept + : f_(std::move(other.f_)), invoke_(std::exchange(other.invoke_, false)) + {} + + final_action(const final_action&) = delete; + final_action& operator=(const final_action&) = delete; + final_action& operator=(final_action&&) = delete; + + // clang-format off + GSL_SUPPRESS(f.6) // NO-FORMAT: attribute // terminate if throws + // clang-format on + ~final_action() noexcept + { + if (invoke_) f_(); + } + +private: + F f_; + bool invoke_{true}; +}; + +// finally() - convenience function to generate a final_action +template +GSL_NODISCARD final_action::type>::type> +finally(F&& f) noexcept +{ + return final_action::type>::type>( + std::forward(f)); +} + +// narrow_cast(): a searchable way to do narrowing casts of values +template +// clang-format off +GSL_SUPPRESS(type.1) // NO-FORMAT: attribute + // clang-format on + constexpr T narrow_cast(U&& u) noexcept +{ + return static_cast(std::forward(u)); +} + +// +// at() - Bounds-checked way of accessing builtin arrays, std::array, std::vector +// +template +// clang-format off +GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute +GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute + // clang-format on + constexpr T& at(T (&arr)[N], const index i) +{ + Expects(i >= 0 && i < narrow_cast(N)); + return arr[narrow_cast(i)]; +} + +template +// clang-format off +GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute +GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute + // clang-format on + constexpr auto at(Cont& cont, const index i) -> decltype(cont[cont.size()]) +{ + Expects(i >= 0 && i < narrow_cast(cont.size())); + using size_type = decltype(cont.size()); + return cont[narrow_cast(i)]; +} + +template +// clang-format off +GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute + // clang-format on + constexpr T at(const std::initializer_list cont, const index i) +{ + Expects(i >= 0 && i < narrow_cast(cont.size())); + return *(cont.begin() + i); +} + +#if defined(__cpp_lib_span) && __cpp_lib_span >= 202002L +template +constexpr auto at(std::span sp, const index i) -> decltype(sp[sp.size()]) +{ + Expects(i >= 0 && i < narrow_cast(sp.size())); + return sp[gsl::narrow_cast(i)]; +} +#endif // __cpp_lib_span >= 202002L +} // namespace gsl + +#if defined(_MSC_VER) && !defined(__clang__) + +#pragma warning(pop) + +#endif // _MSC_VER + +#endif // GSL_UTIL_H diff --git a/3rdparty/jpgd/CMakeLists.txt b/3rdparty/jpgd/CMakeLists.txt new file mode 100644 index 0000000000..d22505b312 --- /dev/null +++ b/3rdparty/jpgd/CMakeLists.txt @@ -0,0 +1,12 @@ +add_library(jpgd + jpgd.cpp + jpgd.h + jpgd_idct.h + jpge.cpp + jpge.h +) + +target_include_directories(jpgd PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") +set_property(TARGET jpgd PROPERTY CXX_STANDARD 17) +set_property(TARGET jpgd PROPERTY CXX_STANDARD_REQUIRED ON) + diff --git a/3rdparty/jpgd/jpge.cpp b/3rdparty/jpgd/jpge.cpp index 4bdc34a97c..d9cc1866d3 100644 --- a/3rdparty/jpgd/jpge.cpp +++ b/3rdparty/jpgd/jpge.cpp @@ -32,7 +32,6 @@ #include #include -#include #define JPGE_MAX(a,b) (((a)>(b))?(a):(b)) #define JPGE_MIN(a,b) (((a)<(b))?(a):(b)) diff --git a/3rdparty/rainterface/.gitignore b/3rdparty/rainterface/.gitignore new file mode 100644 index 0000000000..5761abcfdf --- /dev/null +++ b/3rdparty/rainterface/.gitignore @@ -0,0 +1 @@ +*.o diff --git a/3rdparty/rainterface/LICENSE b/3rdparty/rainterface/LICENSE new file mode 100644 index 0000000000..296dc5caec --- /dev/null +++ b/3rdparty/rainterface/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 RetroAchievements.org + +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/3rdparty/rainterface/RA_Consoles.h b/3rdparty/rainterface/RA_Consoles.h new file mode 100644 index 0000000000..59839b64f8 --- /dev/null +++ b/3rdparty/rainterface/RA_Consoles.h @@ -0,0 +1,84 @@ +#ifndef RA_CONSOLES_H +#define RA_CONSOLES_H + +/* this list should match the list in rcheevos/include/rconsoles.h */ +enum ConsoleID +{ + UnknownConsoleID = 0, + MegaDrive = 1, + N64 = 2, + SNES = 3, + GB = 4, + GBA = 5, + GBC = 6, + NES = 7, + PCEngine = 8, + SegaCD = 9, + Sega32X = 10, + MasterSystem = 11, + PlayStation = 12, + Lynx = 13, + NeoGeoPocket = 14, + GameGear = 15, + GameCube = 16, + Jaguar = 17, + DS = 18, + WII = 19, + WIIU = 20, + PlayStation2 = 21, + Xbox = 22, + MagnavoxOdyssey = 23, + PokemonMini = 24, + Atari2600 = 25, + MSDOS = 26, + Arcade = 27, + VirtualBoy = 28, + MSX = 29, + C64 = 30, + ZX81 = 31, + Oric = 32, + SG1000 = 33, + VIC20 = 34, + Amiga = 35, + AtariST = 36, + AmstradCPC = 37, + AppleII = 38, + Saturn = 39, + Dreamcast = 40, + PSP = 41, + CDi = 42, + ThreeDO = 43, + Colecovision = 44, + Intellivision = 45, + Vectrex = 46, + PC8800 = 47, + PC9800 = 48, + PCFX = 49, + Atari5200 = 50, + Atari7800 = 51, + X68K = 52, + WonderSwan = 53, + CassetteVision = 54, + SuperCassetteVision = 55, + NeoGeoCD = 56, + FairchildChannelF = 57, + FMTowns = 58, + ZXSpectrum = 59, + GameAndWatch = 60, + NokiaNGage = 61, + Nintendo3DS = 62, + Supervision = 63, + SharpX1 = 64, + Tic80 = 65, + ThomsonTO8 = 66, + PC6000 = 67, + Pico = 68, + MegaDuck = 69, + Zeebo = 70, + Arduboy = 71, + WASM4 = 72, + + NumConsoleIDs +}; + +#endif /* !RA_CONSOLES_H */ diff --git a/3rdparty/rainterface/RA_Emulators.h b/3rdparty/rainterface/RA_Emulators.h new file mode 100644 index 0000000000..ebaa702336 --- /dev/null +++ b/3rdparty/rainterface/RA_Emulators.h @@ -0,0 +1,23 @@ +#ifndef RA_EMULATORS_H +#define RA_EMULATORS_H + +enum EmulatorID +{ + RA_Gens = 0, + RA_Project64 = 1, + RA_Snes9x = 2, + RA_VisualboyAdvance = 3, + RA_Nester = 4, + RA_FCEUX = 5, + RA_PCE = 6, + RA_Libretro = 7, + RA_Meka = 8, + RA_QUASI88 = 9, + RA_AppleWin = 10, + RA_Oricutron = 11, + + NumEmulatorIDs, + UnknownEmulator = NumEmulatorIDs +}; + +#endif /* !RA_EMULATORS_H */ diff --git a/3rdparty/rainterface/RA_Interface.cpp b/3rdparty/rainterface/RA_Interface.cpp new file mode 100644 index 0000000000..2152538500 --- /dev/null +++ b/3rdparty/rainterface/RA_Interface.cpp @@ -0,0 +1,1051 @@ +#include "RA_Interface.h" + +#include +#include +#include +#include + +#ifndef CCONV +#define CCONV __cdecl +#endif + +// Initialization +static const char* (CCONV* _RA_IntegrationVersion)() = nullptr; +static const char* (CCONV* _RA_HostName)() = nullptr; +static const char* (CCONV* _RA_HostUrl)() = nullptr; +static int (CCONV* _RA_InitI)(HWND hMainWnd, int nConsoleID, const char* sClientVer) = nullptr; +static int (CCONV* _RA_InitOffline)(HWND hMainWnd, int nConsoleID, const char* sClientVer) = nullptr; +static int (CCONV* _RA_InitClient)(HWND hMainWnd, const char* sClientName, const char* sClientVer) = nullptr; +static int (CCONV* _RA_InitClientOffline)(HWND hMainWnd, const char* sClientName, const char* sClientVer) = nullptr; +static void (CCONV* _RA_InstallSharedFunctions)(int(*)(), void(*)(), void(*)(), void(*)(), void(*)(char*), void(*)(), void(*)(const char*)) = nullptr; +static void (CCONV* _RA_SetForceRepaint)(int bEnable) = nullptr; +static HMENU (CCONV* _RA_CreatePopupMenu)() = nullptr; +static int (CCONV* _RA_GetPopupMenuItems)(RA_MenuItem*) = nullptr; +static void (CCONV* _RA_InvokeDialog)(LPARAM nID) = nullptr; +static void (CCONV* _RA_SetUserAgentDetail)(const char* sDetail); +static void (CCONV* _RA_AttemptLogin)(int bBlocking) = nullptr; +static int (CCONV* _RA_SetConsoleID)(unsigned int nConsoleID) = nullptr; +static void (CCONV* _RA_ClearMemoryBanks)() = nullptr; +static void (CCONV* _RA_InstallMemoryBank)(int nBankID, RA_ReadMemoryFunc* pReader, RA_WriteMemoryFunc* pWriter, int nBankSize) = nullptr; +static void (CCONV* _RA_InstallMemoryBankBlockReader)(int nBankID, RA_ReadMemoryBlockFunc* pReader) = nullptr; +static int (CCONV* _RA_Shutdown)() = nullptr; +// Overlay +static int (CCONV* _RA_IsOverlayFullyVisible)() = nullptr; +static void (CCONV* _RA_SetPaused)(int bIsPaused) = nullptr; +static void (CCONV* _RA_NavigateOverlay)(ControllerInput* pInput) = nullptr; +static void (CCONV* _RA_UpdateHWnd)(HWND hMainHWND); +// Game Management +static unsigned int (CCONV* _RA_IdentifyRom)(const BYTE* pROM, unsigned int nROMSize) = nullptr; +static unsigned int (CCONV* _RA_IdentifyHash)(const char* sHash) = nullptr; +static void (CCONV* _RA_ActivateGame)(unsigned int nGameId) = nullptr; +static int (CCONV* _RA_OnLoadNewRom)(const BYTE* pROM, unsigned int nROMSize) = nullptr; +static int (CCONV* _RA_ConfirmLoadNewRom)(int bQuitting) = nullptr; +// Runtime Functionality +static void (CCONV* _RA_DoAchievementsFrame)() = nullptr; +static void (CCONV* _RA_SuspendRepaint)() = nullptr; +static void (CCONV* _RA_ResumeRepaint)() = nullptr; +static void (CCONV* _RA_UpdateAppTitle)(const char* pMessage) = nullptr; +static const char* (CCONV* _RA_UserName)() = nullptr; +static int (CCONV* _RA_HardcoreModeIsActive)(void) = nullptr; +static int (CCONV* _RA_WarnDisableHardcore)(const char* sActivity) = nullptr; +static void (CCONV* _RA_OnReset)() = nullptr; +static void (CCONV* _RA_OnSaveState)(const char* sFilename) = nullptr; +static void (CCONV* _RA_OnLoadState)(const char* sFilename) = nullptr; +static int (CCONV* _RA_CaptureState)(char* pBuffer, int nBufferSize) = nullptr; +static void (CCONV* _RA_RestoreState)(const char* pBuffer) = nullptr; + +static HINSTANCE g_hRADLL = nullptr; + +void RA_AttemptLogin(int bBlocking) +{ + if (_RA_AttemptLogin != nullptr) + _RA_AttemptLogin(bBlocking); +} + +const char* RA_UserName(void) +{ + if (_RA_UserName != nullptr) + return _RA_UserName(); + + return ""; +} + +void RA_NavigateOverlay(ControllerInput* pInput) +{ + if (_RA_NavigateOverlay != nullptr) + _RA_NavigateOverlay(pInput); +} + +void RA_UpdateRenderOverlay(HDC hDC, ControllerInput* pInput, float fDeltaTime, RECT* prcSize, bool Full_Screen, bool Paused) +{ + if (_RA_NavigateOverlay != nullptr) + _RA_NavigateOverlay(pInput); +} + +int RA_IsOverlayFullyVisible(void) +{ + if (_RA_IsOverlayFullyVisible != nullptr) + return _RA_IsOverlayFullyVisible(); + + return 0; +} + +void RA_UpdateHWnd(HWND hMainWnd) +{ + if (_RA_UpdateHWnd != nullptr) + _RA_UpdateHWnd(hMainWnd); +} + +unsigned int RA_IdentifyRom(BYTE* pROMData, unsigned int nROMSize) +{ + if (_RA_IdentifyRom != nullptr) + return _RA_IdentifyRom(pROMData, nROMSize); + + return 0; +} + +unsigned int RA_IdentifyHash(const char* sHash) +{ + if (_RA_IdentifyHash!= nullptr) + return _RA_IdentifyHash(sHash); + + return 0; +} + +void RA_ActivateGame(unsigned int nGameId) +{ + if (_RA_ActivateGame != nullptr) + _RA_ActivateGame(nGameId); +} + +void RA_OnLoadNewRom(BYTE* pROMData, unsigned int nROMSize) +{ + if (_RA_OnLoadNewRom != nullptr) + _RA_OnLoadNewRom(pROMData, nROMSize); +} + +void RA_ClearMemoryBanks(void) +{ + if (_RA_ClearMemoryBanks != nullptr) + _RA_ClearMemoryBanks(); +} + +void RA_InstallMemoryBank(int nBankID, RA_ReadMemoryFunc pReader, RA_WriteMemoryFunc pWriter, int nBankSize) +{ + if (_RA_InstallMemoryBank != nullptr) + _RA_InstallMemoryBank(nBankID, pReader, pWriter, nBankSize); +} + +void RA_InstallMemoryBankBlockReader(int nBankID, RA_ReadMemoryBlockFunc pReader) +{ + if (_RA_InstallMemoryBankBlockReader != nullptr) + _RA_InstallMemoryBankBlockReader(nBankID, pReader); +} + +HMENU RA_CreatePopupMenu(void) +{ + return (_RA_CreatePopupMenu != nullptr) ? _RA_CreatePopupMenu() : nullptr; +} + +int RA_GetPopupMenuItems(RA_MenuItem *pItems) +{ + return (_RA_GetPopupMenuItems != nullptr) ? _RA_GetPopupMenuItems(pItems) : 0; +} + +void RA_UpdateAppTitle(const char* sCustomMsg) +{ + if (_RA_UpdateAppTitle != nullptr) + _RA_UpdateAppTitle(sCustomMsg); +} + +void RA_HandleHTTPResults(void) +{ +} + +int RA_ConfirmLoadNewRom(int bIsQuitting) +{ + return _RA_ConfirmLoadNewRom ? _RA_ConfirmLoadNewRom(bIsQuitting) : 1; +} + +void RA_InvokeDialog(LPARAM nID) +{ + if (_RA_InvokeDialog != nullptr) + _RA_InvokeDialog(nID); +} + +void RA_SetPaused(bool bIsPaused) +{ + if (_RA_SetPaused != nullptr) + _RA_SetPaused(bIsPaused); +} + +void RA_OnLoadState(const char* sFilename) +{ + if (_RA_OnLoadState != nullptr) + _RA_OnLoadState(sFilename); +} + +void RA_OnSaveState(const char* sFilename) +{ + if (_RA_OnSaveState != nullptr) + _RA_OnSaveState(sFilename); +} + +int RA_CaptureState(char* pBuffer, int nBufferSize) +{ + if (_RA_CaptureState != nullptr) + return _RA_CaptureState(pBuffer, nBufferSize); + + return 0; +} + +void RA_RestoreState(const char* pBuffer) +{ + if (_RA_RestoreState != nullptr) + _RA_RestoreState(pBuffer); +} + +void RA_OnReset(void) +{ + if (_RA_OnReset != nullptr) + _RA_OnReset(); +} + +void RA_DoAchievementsFrame(void) +{ + if (_RA_DoAchievementsFrame != nullptr) + _RA_DoAchievementsFrame(); +} + +void RA_SetForceRepaint(int bEnable) +{ + if (_RA_SetForceRepaint != nullptr) + _RA_SetForceRepaint(bEnable); +} + +void RA_SuspendRepaint(void) +{ + if (_RA_SuspendRepaint != nullptr) + _RA_SuspendRepaint(); +} + +void RA_ResumeRepaint(void) +{ + if (_RA_ResumeRepaint != nullptr) + _RA_ResumeRepaint(); +} + +void RA_SetConsoleID(unsigned int nConsoleID) +{ + if (_RA_SetConsoleID != nullptr) + _RA_SetConsoleID(nConsoleID); +} + +int RA_HardcoreModeIsActive(void) +{ + return (_RA_HardcoreModeIsActive != nullptr) ? _RA_HardcoreModeIsActive() : 0; +} + +int RA_WarnDisableHardcore(const char* sActivity) +{ + // If Hardcore mode not active, allow the activity. + if (!RA_HardcoreModeIsActive()) + return 1; + + // DLL function will display a yes/no dialog. If the user chooses yes, the DLL will disable hardcore mode, and the activity can proceed. + if (_RA_WarnDisableHardcore != nullptr) + return _RA_WarnDisableHardcore(sActivity); + + // We cannot disable hardcore mode, so just warn the user and prevent the activity. + std::string sMessage; + sMessage = "You cannot " + std::string(sActivity) + " while Hardcore mode is active."; + MessageBoxA(nullptr, sMessage.c_str(), "Warning", MB_OK | MB_ICONWARNING); + return 0; +} + +void RA_DisableHardcore() +{ + // passing nullptr to _RA_WarnDisableHardcore will just disable hardcore mode without prompting. + if (_RA_WarnDisableHardcore != nullptr) + _RA_WarnDisableHardcore(nullptr); +} + +static size_t DownloadToFile(char* pData, size_t nDataSize, void* pUserData) +{ + FILE* file = (FILE*)pUserData; + return fwrite(pData, 1, nDataSize, file); +} + +typedef struct DownloadBuffer +{ + char* pBuffer; + size_t nBufferSize; + size_t nOffset; +} DownloadBuffer; + +static size_t DownloadToBuffer(char* pData, size_t nDataSize, void* pUserData) +{ + DownloadBuffer* pBuffer = (DownloadBuffer*)pUserData; + const size_t nRemaining = pBuffer->nBufferSize - pBuffer->nOffset; + if (nDataSize > nRemaining) + nDataSize = nRemaining; + + if (nDataSize > 0) + { + memcpy(pBuffer->pBuffer + pBuffer->nOffset, pData, nDataSize); + pBuffer->nOffset += nDataSize; + } + + return nDataSize; +} + +typedef size_t (DownloadFunc)(char* pData, size_t nDataSize, void* pUserData); + +static BOOL DoBlockingHttpCall(const char* sHostUrl, const char* sRequestedPage, const char* sPostData, + DownloadFunc fnDownload, void* pDownloadUserData, DWORD* pBytesRead, DWORD* pStatusCode) +{ + BOOL bResults = FALSE, bSuccess = FALSE; + HINTERNET hSession = nullptr, hConnect = nullptr, hRequest = nullptr; + size_t nHostnameLen; + + WCHAR wBuffer[1024]; + size_t nTemp; + DWORD nBytesAvailable = 0; + DWORD nBytesToRead = 0; + DWORD nBytesFetched = 0; + (*pBytesRead) = 0; + + INTERNET_PORT nPort = INTERNET_DEFAULT_HTTP_PORT; + const char* sHostName = sHostUrl; + if (_strnicmp(sHostName, "http://", 7) == 0) + { + sHostName += 7; + } + else if (_strnicmp(sHostName, "https://", 8) == 0) + { + sHostName += 8; + nPort = INTERNET_DEFAULT_HTTPS_PORT; + } + + const char* sPort = strchr(sHostName, ':'); + if (sPort) + { + nHostnameLen = sPort - sHostName; + nPort = atoi(sPort + 1); + } + else + { + nHostnameLen = strlen(sHostName); + } + + // Use WinHttpOpen to obtain a session handle. + hSession = WinHttpOpen(L"RetroAchievements Client Bootstrap", + WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, + WINHTTP_NO_PROXY_NAME, + WINHTTP_NO_PROXY_BYPASS, 0); + + // Specify an HTTP server. + if (hSession == nullptr) + { + *pStatusCode = GetLastError(); + } + else + { +#if defined(_MSC_VER) && _MSC_VER >= 1400 + mbstowcs_s(&nTemp, wBuffer, sizeof(wBuffer) / sizeof(wBuffer[0]), sHostName, nHostnameLen); +#else + nTemp = mbstowcs(wBuffer, sHostName, nHostnameLen); +#endif + + if (nTemp > 0) + { + hConnect = WinHttpConnect(hSession, wBuffer, nPort, 0); + } + + // Create an HTTP Request handle. + if (hConnect == nullptr) + { + *pStatusCode = GetLastError(); + } + else + { +#if defined(_MSC_VER) && _MSC_VER >= 1400 + mbstowcs_s(&nTemp, wBuffer, sizeof(wBuffer) / sizeof(wBuffer[0]), sRequestedPage, strlen(sRequestedPage) + 1); +#else + nTemp = mbstowcs(wBuffer, sRequestedPage, strlen(sRequestedPage) + 1); +#endif + + hRequest = WinHttpOpenRequest(hConnect, + sPostData ? L"POST" : L"GET", + wBuffer, + nullptr, + WINHTTP_NO_REFERER, + WINHTTP_DEFAULT_ACCEPT_TYPES, + (nPort == INTERNET_DEFAULT_HTTPS_PORT) ? WINHTTP_FLAG_SECURE : 0); + + // Send a Request. + if (hRequest == nullptr) + { + *pStatusCode = GetLastError(); + } + else + { + if (sPostData) + { + const size_t nPostDataLength = strlen(sPostData); + bResults = WinHttpSendRequest(hRequest, + L"Content-Type: application/x-www-form-urlencoded", + 0, (LPVOID)sPostData, (DWORD)nPostDataLength, (DWORD)nPostDataLength, 0); + } + else + { + bResults = WinHttpSendRequest(hRequest, + L"Content-Type: application/x-www-form-urlencoded", + 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); + } + + if (!bResults || !WinHttpReceiveResponse(hRequest, nullptr)) + { + *pStatusCode = GetLastError(); + } + else + { + char buffer[16384]; + DWORD dwSize = sizeof(DWORD); + WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, pStatusCode, &dwSize, WINHTTP_NO_HEADER_INDEX); + + bSuccess = TRUE; + do + { + nBytesAvailable = 0; + WinHttpQueryDataAvailable(hRequest, &nBytesAvailable); + if (nBytesAvailable == 0) + break; + + do + { + if (nBytesAvailable > sizeof(buffer)) + nBytesToRead = sizeof(buffer); + else + nBytesToRead = nBytesAvailable; + + nBytesFetched = 0; + if (WinHttpReadData(hRequest, buffer, nBytesToRead, &nBytesFetched)) + { + size_t nBytesWritten = fnDownload(buffer, nBytesFetched, pDownloadUserData); + if (nBytesWritten < nBytesFetched) + { + if (*pStatusCode == 200) + *pStatusCode = 998; + + bSuccess = FALSE; + break; + } + + (*pBytesRead) += (DWORD)nBytesWritten; + nBytesAvailable -= nBytesFetched; + } + else + { + if (*pStatusCode == 200) + *pStatusCode = GetLastError(); + + bSuccess = FALSE; + break; + } + } while (nBytesAvailable > 0); + } while (TRUE); + } + + WinHttpCloseHandle(hRequest); + } + + WinHttpCloseHandle(hConnect); + } + + WinHttpCloseHandle(hSession); + } + + return bSuccess; +} + +static BOOL IsNetworkError(DWORD nStatusCode) +{ + switch (nStatusCode) + { + case 12002: // timeout + case 12007: // dns lookup failed + case 12017: // handle closed before request completed + case 12019: // handle not initialized + case 12028: // data not available at this time + case 12029: // handshake failed + case 12030: // connection aborted + case 12031: // connection reset + case 12032: // explicit request to retry + case 12152: // response could not be parsed, corrupt? + case 12163: // lost connection during request + return TRUE; + + default: + return FALSE; + } +} + +static BOOL DoBlockingHttpCallWithRetry(const char* sHostUrl, const char* sRequestedPage, const char* sPostData, + char pBufferOut[], unsigned int nBufferOutSize, DWORD* pBytesRead, DWORD* pStatusCode) +{ + int nRetries = 4; + do + { + DownloadBuffer downloadBuffer; + memset(&downloadBuffer, 0, sizeof(downloadBuffer)); + downloadBuffer.pBuffer = pBufferOut; + downloadBuffer.nBufferSize = nBufferOutSize; + + if (DoBlockingHttpCall(sHostUrl, sRequestedPage, sPostData, DownloadToBuffer, &downloadBuffer, pBytesRead, pStatusCode) != FALSE) + return TRUE; + + if (!IsNetworkError(*pStatusCode)) + return FALSE; + + --nRetries; + } while (nRetries); + + return FALSE; +} + +static BOOL DoBlockingHttpCallWithRetry(const char* sHostUrl, const char* sRequestedPage, const char* sPostData, + FILE* pFile, DWORD* pBytesRead, DWORD* pStatusCode) +{ + int nRetries = 4; + do + { + fseek(pFile, 0, SEEK_SET); + if (DoBlockingHttpCall(sHostUrl, sRequestedPage, sPostData, DownloadToFile, pFile, pBytesRead, pStatusCode) != FALSE) + return TRUE; + + if (!IsNetworkError(*pStatusCode)) + return FALSE; + + --nRetries; + } while (nRetries); + + return FALSE; +} + +#ifndef RA_UTEST +static std::wstring GetIntegrationPath() +{ + wchar_t sBuffer[2048]; + DWORD iIndex = GetModuleFileNameW(0, sBuffer, 2048); + while (iIndex > 0 && sBuffer[iIndex - 1] != '\\' && sBuffer[iIndex - 1] != '/') + --iIndex; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + wcscpy_s(&sBuffer[iIndex], sizeof(sBuffer)/sizeof(sBuffer[0]) - iIndex, L"RA_Integration.dll"); +#else + wcscpy(&sBuffer[iIndex], L"RA_Integration.dll"); +#endif + + return std::wstring(sBuffer); +} +#endif + +#if 0 + +static void FetchIntegrationFromWeb(char* sLatestVersionUrl, DWORD* pStatusCode) +{ + DWORD nBytesRead = 0; + const wchar_t* sDownloadFilename = L"RA_Integration.download"; + const wchar_t* sFilename = L"RA_Integration.dll"; + const wchar_t* sOldFilename = L"RA_Integration.old"; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + FILE* pf; + errno_t nErr = _wfopen_s(&pf, sDownloadFilename, L"wb"); +#else + FILE* pf = _wfopen(sDownloadFilename, L"wb"); +#endif + + if (!pf) + { +#if defined(_MSC_VER) && _MSC_VER >= 1400 + wchar_t sErrBuffer[2048]; + _wcserror_s(sErrBuffer, sizeof(sErrBuffer) / sizeof(sErrBuffer[0]), nErr); + + std::wstring sErrMsg = std::wstring(L"Unable to write ") + sOldFilename + L"\n" + sErrBuffer; +#else + std::wstring sErrMsg = std::wstring(L"Unable to write ") + sOldFilename + L"\n" + _wcserror(errno); +#endif + + MessageBoxW(nullptr, sErrMsg.c_str(), L"Error", MB_OK | MB_ICONERROR); + return; + } + + char* pSplit = sLatestVersionUrl + 8; /* skip over protocol */ + while (*pSplit != '/') + { + if (!*pSplit) + { + *pStatusCode = 997; + return; + } + ++pSplit; + } + *pSplit++ = '\0'; + + if (DoBlockingHttpCallWithRetry(sLatestVersionUrl, pSplit, nullptr, pf, &nBytesRead, pStatusCode)) + { + fclose(pf); + + /* wait up to one second for the DLL to actually be released - sometimes it's not immediate */ + for (int i = 0; i < 10; i++) + { + if (GetModuleHandleW(sFilename) == nullptr) + break; + + Sleep(100); + } + + // delete the last old dll if it's still present + DeleteFileW(sOldFilename); + + // if there's a dll present, rename it + if (GetFileAttributesW(sFilename) != INVALID_FILE_ATTRIBUTES && + !MoveFileW(sFilename, sOldFilename)) + { + MessageBoxW(nullptr, L"Could not rename old dll", L"Error", MB_OK | MB_ICONERROR); + } + // rename the download to be the dll + else if (!MoveFileW(sDownloadFilename, sFilename)) + { + MessageBoxW(nullptr, L"Could not rename new dll", L"Error", MB_OK | MB_ICONERROR); + } + + // delete the old dll + DeleteFileW(sOldFilename); + } + else + { + fclose(pf); + } +} + +#endif + +//Returns the last Win32 error, in string format. Returns an empty string if there is no error. +static std::string GetLastErrorAsString() +{ + //Get the error message, if any. + DWORD errorMessageID = ::GetLastError(); + if (errorMessageID == 0) + return "No error message has been recorded"; + + LPSTR messageBuffer = nullptr; + size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, nullptr); + + std::string message(messageBuffer, size); + + //Free the buffer. + LocalFree(messageBuffer); + + return message; +} + +static const char* CCONV _RA_InstallIntegration() +{ + SetErrorMode(0); + + std::wstring sIntegrationPath = GetIntegrationPath(); + + DWORD dwAttrib = GetFileAttributesW(sIntegrationPath.c_str()); + if (dwAttrib == INVALID_FILE_ATTRIBUTES) + return "0.0"; + + g_hRADLL = LoadLibraryW(sIntegrationPath.c_str()); + if (g_hRADLL == nullptr) + { + char buffer[1024]; + sprintf_s(buffer, 1024, "Could not load RA_Integration.dll: %d\n%s\n", ::GetLastError(), GetLastErrorAsString().c_str()); + MessageBoxA(nullptr, buffer, "Warning", MB_OK | MB_ICONWARNING); + + return "0.0"; + } + + // Install function pointers one by one + + _RA_IntegrationVersion = (const char* (CCONV*)()) GetProcAddress(g_hRADLL, "_RA_IntegrationVersion"); + _RA_HostName = (const char* (CCONV*)()) GetProcAddress(g_hRADLL, "_RA_HostName"); + _RA_HostUrl = (const char* (CCONV*)()) GetProcAddress(g_hRADLL, "_RA_HostUrl"); + _RA_InitI = (int(CCONV*)(HWND, int, const char*)) GetProcAddress(g_hRADLL, "_RA_InitI"); + _RA_InitOffline = (int(CCONV*)(HWND, int, const char*)) GetProcAddress(g_hRADLL, "_RA_InitOffline"); + _RA_InitClient = (int(CCONV*)(HWND, const char*, const char*)) GetProcAddress(g_hRADLL, "_RA_InitClient"); + _RA_InitClientOffline = (int(CCONV*)(HWND, const char*, const char*)) GetProcAddress(g_hRADLL, "_RA_InitClientOffline"); + _RA_InstallSharedFunctions = (void(CCONV*)(int(*)(), void(*)(), void(*)(), void(*)(), void(*)(char*), void(*)(), void(*)(const char*))) GetProcAddress(g_hRADLL, "_RA_InstallSharedFunctionsExt"); + _RA_SetForceRepaint = (void(CCONV*)(int)) GetProcAddress(g_hRADLL, "_RA_SetForceRepaint"); + _RA_CreatePopupMenu = (HMENU(CCONV*)(void)) GetProcAddress(g_hRADLL, "_RA_CreatePopupMenu"); + _RA_GetPopupMenuItems = (int(CCONV*)(RA_MenuItem*)) GetProcAddress(g_hRADLL, "_RA_GetPopupMenuItems"); + _RA_InvokeDialog = (void(CCONV*)(LPARAM)) GetProcAddress(g_hRADLL, "_RA_InvokeDialog"); + _RA_SetUserAgentDetail = (void(CCONV*)(const char*)) GetProcAddress(g_hRADLL, "_RA_SetUserAgentDetail"); + _RA_AttemptLogin = (void(CCONV*)(int)) GetProcAddress(g_hRADLL, "_RA_AttemptLogin"); + _RA_SetConsoleID = (int(CCONV*)(unsigned int)) GetProcAddress(g_hRADLL, "_RA_SetConsoleID"); + _RA_ClearMemoryBanks = (void(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_ClearMemoryBanks"); + _RA_InstallMemoryBank = (void(CCONV*)(int, RA_ReadMemoryFunc*, RA_WriteMemoryFunc*, int)) GetProcAddress(g_hRADLL, "_RA_InstallMemoryBank"); + _RA_InstallMemoryBankBlockReader = (void(CCONV*)(int, RA_ReadMemoryBlockFunc*)) GetProcAddress(g_hRADLL, "_RA_InstallMemoryBankBlockReader"); + _RA_Shutdown = (int(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_Shutdown"); + _RA_IsOverlayFullyVisible = (int(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_IsOverlayFullyVisible"); + _RA_SetPaused = (void(CCONV*)(int)) GetProcAddress(g_hRADLL, "_RA_SetPaused"); + _RA_NavigateOverlay = (void(CCONV*)(ControllerInput*)) GetProcAddress(g_hRADLL, "_RA_NavigateOverlay"); + _RA_UpdateHWnd = (void(CCONV*)(HWND)) GetProcAddress(g_hRADLL, "_RA_UpdateHWnd"); + _RA_IdentifyRom = (unsigned int(CCONV*)(const BYTE*, unsigned int)) GetProcAddress(g_hRADLL, "_RA_IdentifyRom"); + _RA_IdentifyHash = (unsigned int(CCONV*)(const char*)) GetProcAddress(g_hRADLL, "_RA_IdentifyHash"); + _RA_ActivateGame = (void(CCONV*)(unsigned int)) GetProcAddress(g_hRADLL, "_RA_ActivateGame"); + _RA_OnLoadNewRom = (int(CCONV*)(const BYTE*, unsigned int)) GetProcAddress(g_hRADLL, "_RA_OnLoadNewRom"); + _RA_ConfirmLoadNewRom = (int(CCONV*)(int)) GetProcAddress(g_hRADLL, "_RA_ConfirmLoadNewRom"); + _RA_DoAchievementsFrame = (void(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_DoAchievementsFrame"); + _RA_SuspendRepaint = (void(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_SuspendRepaint"); + _RA_ResumeRepaint = (void(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_ResumeRepaint"); + _RA_UpdateAppTitle = (void(CCONV*)(const char*)) GetProcAddress(g_hRADLL, "_RA_UpdateAppTitle"); + _RA_UserName = (const char* (CCONV*)()) GetProcAddress(g_hRADLL, "_RA_UserName"); + _RA_HardcoreModeIsActive = (int(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_HardcoreModeIsActive"); + _RA_WarnDisableHardcore = (int(CCONV*)(const char*)) GetProcAddress(g_hRADLL, "_RA_WarnDisableHardcore"); + _RA_OnReset = (void(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_OnReset"); + _RA_OnSaveState = (void(CCONV*)(const char*)) GetProcAddress(g_hRADLL, "_RA_OnSaveState"); + _RA_OnLoadState = (void(CCONV*)(const char*)) GetProcAddress(g_hRADLL, "_RA_OnLoadState"); + _RA_CaptureState = (int(CCONV*)(char*, int)) GetProcAddress(g_hRADLL, "_RA_CaptureState"); + _RA_RestoreState = (void(CCONV*)(const char*)) GetProcAddress(g_hRADLL, "_RA_RestoreState"); + + return _RA_IntegrationVersion ? _RA_IntegrationVersion() : "0.0"; +} + +static void GetJsonField(const char* sJson, const char* sField, char *pBuffer, size_t nBufferSize) +{ + const size_t nFieldSize = strlen(sField); + const char* pValue; + + *pBuffer = 0; + do + { + const char* pScan = strstr(sJson, sField); + if (!pScan) + return; + + if (pScan[-1] != '"' || pScan[nFieldSize] != '"') + { + sJson = pScan + 1; + continue; + } + + pScan += nFieldSize + 1; + while (*pScan == ':' || isspace(*pScan)) + ++pScan; + if (*pScan != '"') + return; + + pValue = ++pScan; + while (*pScan != '"') + { + if (!*pScan) + return; + + ++pScan; + } + + while (pValue < pScan && nBufferSize > 1) + { + if (*pValue == '\\') + ++pValue; + + *pBuffer++ = *pValue++; + nBufferSize--; + } + + *pBuffer = '\0'; + return; + + } while (1); +} + +static unsigned long long ParseVersion(const char* sVersion) +{ + char* pPart; + + unsigned long long major = strtoul(sVersion, &pPart, 10); + if (*pPart == '.') + ++pPart; + + unsigned long long minor = strtoul(pPart, &pPart, 10); + if (*pPart == '.') + ++pPart; + + unsigned long long patch = strtoul(pPart, &pPart, 10); + if (*pPart == '.') + ++pPart; + + unsigned long long revision = strtoul(pPart, &pPart, 10); + + // 64-bit max signed value is 9223 37203 68547 75807 + unsigned long long version = (major * 100000) + minor; + version = (version * 100000) + patch; + version = (version * 100000) + revision; + return version; +} + +static void RA_InitCommon(HWND hMainHWND, int nEmulatorID, const char* sClientName, const char* sClientVersion) +{ + char sVerInstalled[32]; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + strcpy_s(sVerInstalled, sizeof(sVerInstalled), _RA_InstallIntegration()); +#else + strcpy(sVerInstalled, _RA_InstallIntegration()); +#endif + + char sHostUrl[256] = ""; + if (_RA_HostUrl != nullptr) + { +#if defined(_MSC_VER) && _MSC_VER >= 1400 + strcpy_s(sHostUrl, sizeof(sHostUrl), _RA_HostUrl()); +#else + strcpy(sHostUrl, _RA_HostUrl()); +#endif + } + else if (_RA_HostName != nullptr) + { + sprintf_s(sHostUrl, "http://%s", _RA_HostName()); + } + + if (!sHostUrl[0]) + { +#if defined(_MSC_VER) && _MSC_VER >= 1400 + strcpy_s(sHostUrl, sizeof(sHostUrl), "http://retroachievements.org"); +#else + strcpy(sHostUrl, "http://retroachievements.org"); +#endif + } + else if (_RA_InitOffline != nullptr && strcmp(sHostUrl, "http://OFFLINE") == 0) + { + if (sClientName == nullptr) + _RA_InitOffline(hMainHWND, nEmulatorID, sClientVersion); + else + _RA_InitClientOffline(hMainHWND, sClientName, sClientVersion); + return; + } + + DWORD nBytesRead = 0; + DWORD nStatusCode = 0; + char buffer[1024]; + ZeroMemory(buffer, 1024); + + if (DoBlockingHttpCallWithRetry(sHostUrl, "dorequest.php", "r=latestintegration", buffer, sizeof(buffer), &nBytesRead, &nStatusCode) == FALSE) + { + if (_RA_InitOffline != nullptr) + { + sprintf_s(buffer, sizeof(buffer), "Cannot access %s (status code %u)\nWorking offline.", sHostUrl, nStatusCode); + MessageBoxA(hMainHWND, buffer, "Warning", MB_OK | MB_ICONWARNING); + + _RA_InitOffline(hMainHWND, nEmulatorID, sClientVersion); + } + else + { + sprintf_s(buffer, sizeof(buffer), "Cannot access %s (status code %u)\nPlease try again later.", sHostUrl, nStatusCode); + MessageBoxA(hMainHWND, buffer, "Warning", MB_OK | MB_ICONWARNING); + + RA_Shutdown(); + } + return; + } + + /* remove trailing zeros from client version */ + char* ptr = sVerInstalled + strlen(sVerInstalled); + while (ptr[-1] == '0' && ptr[-2] == '.' && (ptr - 2) > sVerInstalled) + ptr -= 2; + *ptr = '\0'; + if (strchr(sVerInstalled, '.') == NULL) + { + *ptr++ = '.'; + *ptr++ = '0'; + *ptr = '\0'; + } + + char sLatestVersionUrl[256]; + char sVersionBuffer[32]; + GetJsonField(buffer, "MinimumVersion", sVersionBuffer, sizeof(sVersionBuffer)); + const unsigned long long nMinimumDLLVer = ParseVersion(sVersionBuffer); + + GetJsonField(buffer, "LatestVersion", sVersionBuffer, sizeof(sVersionBuffer)); + const unsigned long long nLatestDLLVer = ParseVersion(sVersionBuffer); + +#if defined(_M_X64) || defined(__amd64__) + GetJsonField(buffer, "LatestVersionUrlX64", sLatestVersionUrl, sizeof(sLatestVersionUrl)); +#else + GetJsonField(buffer, "LatestVersionUrl", sLatestVersionUrl, sizeof(sLatestVersionUrl)); +#endif + + if (nLatestDLLVer == 0 || !sLatestVersionUrl[0]) + { + /* NOTE: repurposing sLatestVersionUrl for the error message */ + GetJsonField(buffer, "Error", sLatestVersionUrl, sizeof(sLatestVersionUrl)); + if (sLatestVersionUrl[0]) + sprintf_s(buffer, sizeof(buffer), "Failed to fetch latest integration version.\n\n%s", sLatestVersionUrl); + else + sprintf_s(buffer, sizeof(buffer), "The latest integration check did not return a valid response."); + + MessageBoxA(hMainHWND, buffer, "Error", MB_OK | MB_ICONERROR); + RA_Shutdown(); + return; + } + + int nMBReply = 0; + unsigned long long nVerInstalled = ParseVersion(sVerInstalled); + if (nVerInstalled < nMinimumDLLVer) + { + RA_Shutdown(); // Unhook the DLL so we can replace it. + + if (nVerInstalled == 0) + { + sprintf_s(buffer, sizeof(buffer), "Install RetroAchievements toolset?\n\n" + "In order to earn achievements you must download the toolset library."); + } + else + { + sprintf_s(buffer, sizeof(buffer), "Upgrade RetroAchievements toolset?\n\n" + "A required upgrade to the toolset is available. If you don't upgrade, you won't be able to earn achievements.\n\n" + "Latest Version: %s\nInstalled Version: %s", sVersionBuffer, sVerInstalled); + } + + nMBReply = MessageBoxA(hMainHWND, buffer, "Warning", MB_YESNO | MB_ICONWARNING); + } + else if (nVerInstalled < nLatestDLLVer) + { + sprintf_s(buffer, sizeof(buffer), "Upgrade RetroAchievements toolset?\n\n" + "An optional upgrade to the toolset is available.\n\n" + "Latest Version: %s\nInstalled Version: %s", sVersionBuffer, sVerInstalled); + + nMBReply = MessageBoxA(hMainHWND, buffer, "Warning", MB_YESNO | MB_ICONWARNING); + + if (nMBReply == IDYES) + RA_Shutdown(); // Unhook the DLL so we can replace it. + } + + if (nMBReply == IDYES) + { + //FetchIntegrationFromWeb(sLatestVersionUrl, &nStatusCode); + nStatusCode = 0; + + if (nStatusCode == 200) + nVerInstalled = ParseVersion(_RA_InstallIntegration()); + + if (nVerInstalled < nLatestDLLVer) + { + sprintf_s(buffer, sizeof(buffer), "Failed to update toolset (status code %u).", nStatusCode); + MessageBoxA(hMainHWND, buffer, "Error", MB_OK | MB_ICONERROR); + } + } + + if (nVerInstalled < nMinimumDLLVer) + { + RA_Shutdown(); + + sprintf_s(buffer, sizeof(buffer), "%s toolset is required to earn achievements.", nVerInstalled == 0 ? "The" : "A newer"); + MessageBoxA(hMainHWND, buffer, "Warning", MB_OK | MB_ICONWARNING); + } + else if (sClientName == nullptr) + { + if (!_RA_InitI(hMainHWND, nEmulatorID, sClientVersion)) + RA_Shutdown(); + } + else + { + if (!_RA_InitClient(hMainHWND, sClientName, sClientVersion)) + RA_Shutdown(); + } +} + +void RA_Init(HWND hMainHWND, int nEmulatorID, const char* sClientVersion) +{ + RA_InitCommon(hMainHWND, nEmulatorID, nullptr, sClientVersion); +} + +void RA_InitClient(HWND hMainHWND, const char* sClientName, const char* sClientVersion) +{ + RA_InitCommon(hMainHWND, -1, sClientName, sClientVersion); +} + +void RA_SetUserAgentDetail(const char* sDetail) +{ + if (_RA_SetUserAgentDetail != nullptr) + _RA_SetUserAgentDetail(sDetail); +} + +void RA_InstallSharedFunctions(int(*)(void), void(*fpCauseUnpause)(void), void(*fpCausePause)(void), void(*fpRebuildMenu)(void), void(*fpEstimateTitle)(char*), void(*fpResetEmulation)(void), void(*fpLoadROM)(const char*)) +{ + if (_RA_InstallSharedFunctions != nullptr) + _RA_InstallSharedFunctions(nullptr, fpCauseUnpause, fpCausePause, fpRebuildMenu, fpEstimateTitle, fpResetEmulation, fpLoadROM); +} + +void RA_Shutdown() +{ + // Call shutdown on toolchain + if (_RA_Shutdown != nullptr) + { +#ifdef __cplusplus + try { +#endif + _RA_Shutdown(); +#ifdef __cplusplus + } + catch (std::runtime_error&) { + } +#endif + } + + // Clear func ptrs + _RA_IntegrationVersion = nullptr; + _RA_HostName = nullptr; + _RA_HostUrl = nullptr; + _RA_InitI = nullptr; + _RA_InitOffline = nullptr; + _RA_InitClient = nullptr; + _RA_InitClientOffline = nullptr; + _RA_InstallSharedFunctions = nullptr; + _RA_SetForceRepaint = nullptr; + _RA_CreatePopupMenu = nullptr; + _RA_GetPopupMenuItems = nullptr; + _RA_InvokeDialog = nullptr; + _RA_SetUserAgentDetail = nullptr; + _RA_AttemptLogin = nullptr; + _RA_SetConsoleID = nullptr; + _RA_ClearMemoryBanks = nullptr; + _RA_InstallMemoryBank = nullptr; + _RA_InstallMemoryBankBlockReader = nullptr; + _RA_Shutdown = nullptr; + _RA_IsOverlayFullyVisible = nullptr; + _RA_SetPaused = nullptr; + _RA_NavigateOverlay = nullptr; + _RA_UpdateHWnd = nullptr; + _RA_IdentifyRom = nullptr; + _RA_IdentifyHash = nullptr; + _RA_ActivateGame = nullptr; + _RA_OnLoadNewRom = nullptr; + _RA_ConfirmLoadNewRom = nullptr; + _RA_DoAchievementsFrame = nullptr; + _RA_SuspendRepaint = nullptr; + _RA_ResumeRepaint = nullptr; + _RA_UpdateAppTitle = nullptr; + _RA_UserName = nullptr; + _RA_HardcoreModeIsActive = nullptr; + _RA_WarnDisableHardcore = nullptr; + _RA_OnReset = nullptr; + _RA_OnSaveState = nullptr; + _RA_OnLoadState = nullptr; + _RA_CaptureState = nullptr; + _RA_RestoreState = nullptr; + + /* unload the DLL */ + if (g_hRADLL) + { + FreeLibrary(g_hRADLL); + g_hRADLL = nullptr; + } +} diff --git a/3rdparty/rainterface/RA_Interface.h b/3rdparty/rainterface/RA_Interface.h new file mode 100644 index 0000000000..763ff90c75 --- /dev/null +++ b/3rdparty/rainterface/RA_Interface.h @@ -0,0 +1,386 @@ +#ifndef RA_INTERFACE_H +#define RA_INTERFACE_H + +#include /* HWND */ + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************** + * Initialization * + ******************************/ + +/** + * Loads and initializes the DLL. + * + * Must be called before using any of the other functions. Will automatically download the DLL + * if not found, or prompt the user to upgrade if a newer version is available + * + * @param hMainHWND the handle of the main window + * @param nEmulatorID the unique idenfier of the emulator + * @param sClientVersion the current version of the emulator (will be validated against the minimum version for the specified emulator ID) + */ +extern void RA_Init(HWND hMainHWND, int nEmulatorID, const char* sClientVersion); + +/** + * Loads and initializes the DLL. + * + * Must be called before using any of the other functions. Will automatically download the DLL + * if not found, or prompt the user to upgrade if a newer version is available + * + * @param hMainHWND the handle of the main window + * @param sClientName the name of the client, displayed in the title bar and included in the User-Agent for API calls + * @param sClientVersion the current version of the client + */ +extern void RA_InitClient(HWND hMainHWND, const char* sClientName, const char* sClientVersion); + +/** + * Defines callbacks that the DLL can use to interact with the client. + * + * @param fpUnusedIsActive [no longer used] returns non-zero if a game is running + * @param fpCauseUnpause unpauses the emulator + * @param fpCausePause pauses the emulator + * @param fpRebuildMenu notifies the client that the popup menu has changed (@see RA_CreatePopupMenu) + * @param fpEstimateTitle gets a short description for the game being loaded (parameter is a 256-byte buffer to fill) + * @param fpResetEmulator resets the emulator + * @param fpLoadROM [currently unused] tells the emulator to load a specific game + */ +extern void RA_InstallSharedFunctions(int (*fpUnusedIsActive)(void), + void (*fpCauseUnpause)(void), void (*fpCausePause)(void), void (*fpRebuildMenu)(void), + void (*fpEstimateTitle)(char*), void (*fpResetEmulator)(void), void (*fpLoadROM)(const char*)); + +/** + * Tells the DLL to use UpdateWindow instead of InvalidateRect when the UI needs to be repainted. This is primarily + * necessary when integrating with an emulator using the SDL library as it keeps the message queue flooded so the + * InvalidateRect messages never get turned into WM_PAINT messages. + * + * @param bEnable non-zero if InvalidateRect calls should be replaced with UpdateWindow + */ +extern void RA_SetForceRepaint(int bEnable); + +/** + * Creates a popup menu that can be appended to the main menu of the emulator. + * + * @return handle to the menu. if not attached to the program menu, caller must destroy it themselves. + */ +extern HMENU RA_CreatePopupMenu(void); + +/* Resource values for menu items - needed by MFC ON_COMMAND_RANGE macros or WM_COMMAND WndProc handlers + * they're not all currently used, allowing additional items without forcing recompilation of the emulators + */ +#define IDM_RA_MENUSTART 1700 +#define IDM_RA_MENUEND 1739 + +typedef struct RA_MenuItem +{ + LPCWSTR sLabel; + LPARAM nID; + int bChecked; +} RA_MenuItem; + +/** + * Gets items for building a popup menu. + * + * @param pItems Pre-allocated array to populate [should contain space for at least 32 items] + * @return Number of items populated in the items array + */ +extern int RA_GetPopupMenuItems(RA_MenuItem *pItems); + +/** + * Called when a menu item in the popup menu is selected. + * + * @param nID the ID of the menu item (will be between IDM_RA_MENUSTART and IDM_RA_MENUEND) + */ +extern void RA_InvokeDialog(LPARAM nID); + +/** + * Provides additional information to include in the User-Agent string for API calls. + * + * This is primarily used to identify dependencies or configurations (such as libretro core versions) + * + * @param sDetail the additional information to include + */ +extern void RA_SetUserAgentDetail(const char* sDetail); + +/** + * Attempts to log in to the retroachievements.org site. + * + * Prompts the user for their login credentials and performs the login. If they've previously logged in and have + * chosen to store their credentials, the login occurs without prompting. + * + * @param bBlocking if zero, control is returned to the calling process while the login request is processed by the server. + */ +extern void RA_AttemptLogin(int bBlocking); + +/** + * Specifies the console associated to the emulator. + * + * May be called just before loading a game if the emulator supports multiple consoles. + * + * @param nConsoleID the unique identifier of the console associated to the game being loaded. + */ +extern void RA_SetConsoleID(unsigned int nConsoleID); + +/** + * Resets memory references created by previous calls to RA_InstallMemoryBank. + */ +extern void RA_ClearMemoryBanks(void); + +typedef unsigned char (RA_ReadMemoryFunc)(unsigned int nAddress); +typedef void (RA_WriteMemoryFunc)(unsigned int nAddress, unsigned char nValue); +/** + * Exposes a block of memory to the DLL. + * + * The blocks of memory expected by the DLL are unique per console ID. To identify the correct map for a console, + * view the consoleinfo.c file in the rcheevos repository. + * + * @param nBankID the index of the bank to update. will replace any existing bank at that index. + * @param pReader a function to read from the bank. parameter is the offset within the bank to read from. + * @param pWriter a function to write to the bank. parameters are the offset within the bank to write to and an 8-bit value to write. + * @param nBankSize the size of the bank. + */ +extern void RA_InstallMemoryBank(int nBankID, RA_ReadMemoryFunc pReader, RA_WriteMemoryFunc pWriter, int nBankSize); + +typedef unsigned int (RA_ReadMemoryBlockFunc)(unsigned int nAddress, unsigned char* pBuffer, unsigned int nBytes); +extern void RA_InstallMemoryBankBlockReader(int nBankID, RA_ReadMemoryBlockFunc pReader); + +/** + * Deinitializes and unloads the DLL. + */ +extern void RA_Shutdown(void); + + + +/****************************** + * Overlay * + ******************************/ + +/** + * Determines if the overlay is fully visible. + * + * Precursor check before calling RA_NavigateOverlay + * + * @return non-zero if the overlay is fully visible, zero if it is not. + */ +extern int RA_IsOverlayFullyVisible(void); + +/** + * Called to show or hide the overlay. + * + * @param bIsPaused true to show the overlay, false to hide it. + */ +extern void RA_SetPaused(bool bIsPaused); + +struct ControllerInput +{ + int m_bUpPressed; + int m_bDownPressed; + int m_bLeftPressed; + int m_bRightPressed; + int m_bConfirmPressed; /* Usually C or A */ + int m_bCancelPressed; /* Usually B */ + int m_bQuitPressed; /* Usually Start */ +}; + +/** + * Passes controller input to the overlay. + * + * Does nothing if the overlay is not fully visible. + * + * @param pInput pointer to a ControllerInput structure indicating which inputs are active. + */ +extern void RA_NavigateOverlay(struct ControllerInput* pInput); + +/** + * [deprecated] Updates the overlay for a single frame. + * + * This function just calls RA_NavigateOverlay. Updating and rendering is now handled internally to the DLL. + */ +extern void RA_UpdateRenderOverlay(HDC, struct ControllerInput* pInput, float, RECT*, bool, bool); + +/** + * Updates the handle to the main window. + * + * The main window handle is used to anchor the overlay. If the client recreates the handle as the result of switching + * from windowed mode to full screen, or for any other reason, it should call this to reattach the overlay. + * + * @param hMainHWND the new handle of the main window + */ +extern void RA_UpdateHWnd(HWND hMainHWND); + + + +/****************************** + * Game Management * + ******************************/ + +/** + * Identifies the game associated to a block of memory. + * + * The block of memory is the fully buffered game file. If more complicated identification is required, the caller + * needs to link against rcheevos/rhash directly to generate the hash, and call RA_IdentifyHash with the result. + * Can be called when switching discs to ensure the additional discs are still associated to the loaded game. + * + * @param pROMData the contents of the game file + * @param nROMSize the size of the game file + * @return the unique identifier of the game, 0 if no association available. + */ +extern unsigned int RA_IdentifyRom(BYTE* pROMData, unsigned int nROMSize); + +/** + * Identifies the game associated to a pre-generated hash. + * + * Used when the hash algorithm is something other than full file. + * Can be called when switching discs to ensure the additional discs are still associated to the loaded game. + * + * @param sHash the hash generated by rcheevos/rhash + * @return the unique identifier of the game, 0 if no association available. + */ +extern unsigned int RA_IdentifyHash(const char* sHash); + +/** + * Fetches all retroachievements related data for the specified game. + * + * @param nGameId the unique identifier of the game to activate + */ +extern void RA_ActivateGame(unsigned int nGameId); + +/** + * Identifies and activates the game associated to a block of memory. + * + * Functions as a call to RA_IdentifyRom followed by a call to RA_ActivateGame. + * + * @param pROMData the contents of the game file + * @param nROMSize the size of the game file + */ +extern void RA_OnLoadNewRom(BYTE* pROMData, unsigned int nROMSize); + +/** + * Called before unloading the game to allow the user to save any changes they might have. + * + * @param bIsQuitting non-zero to change the messaging to indicate the emulator is closing. + * @return zero to abort the unload. non-zero to continue. + */ +extern int RA_ConfirmLoadNewRom(int bIsQuitting); + + + +/****************************** + * Runtime Functionality * + ******************************/ + +/** + * Does all achievement-related processing for a single frame. + */ +extern void RA_DoAchievementsFrame(void); + +/** + * Temporarily disables forced updating of tool windows. + * + * Primarily used while fast-forwarding. + */ +extern void RA_SuspendRepaint(void); + +/** + * Resumes forced updating of tool windows. + */ +extern void RA_ResumeRepaint(void); + +/** + * [deprecated] Used to be used to ensure the asynchronous server calls are processed on the UI thread. + * That's all managed within the DLL now. Calling this function does nothing. + */ +extern void RA_HandleHTTPResults(void); + +/** + * Adds flavor text to the application title bar. + * + * Application title bar is managed by the DLL. Value will be "ClientName - Version - Flavor Text - Username" + * + * @param sCustomMessage the flavor text to include in the title bar. + */ +extern void RA_UpdateAppTitle(const char* sCustomMessage); + +/** + * Get the user name of the currently logged in user. + * + * @return user name of the currently logged in user, empty if no user is logged in. + */ +const char* RA_UserName(void); + +/** + * Determines if the user is currently playing with hardcore enabled. + * + * The client should disable any features that would give the player an unfair advantage if this returns non-zero. + * Things like loading states, using cheats, modifying RAM, disabling rendering layers, viewing decoded tilemaps, etc. + * + * @return non-zero if hardcore mode is currently active. + */ +extern int RA_HardcoreModeIsActive(void); + +/** + * Warns the user they're about to do something that will disable hardcore mode. + * + * @param sActivity what the user is about to do (i.e. "load a state"). + * @return non-zero if the user disabled hardcore and the activity is allowed. + * zero if the user declined to disable hardcore and the activity should be aborted. + */ +extern int RA_WarnDisableHardcore(const char* sActivity); + +/** + * Disables hardcore mode without prompting or notifying the user. + * + * Should only be called if the client does its own prompting/notification. + * Typically used when an activity cannot be aborted. + */ +extern void RA_DisableHardcore(void); + +/** + * Notifies the DLL that the game has been reset. + * + * Disables active leaderboards and resets hit counts on all active achievements. + */ +extern void RA_OnReset(void); + +/** + * Notifies the DLL that a save state has been created. + * + * Creates a .rap file next to the state file that contains achievement-related information for the save state. + * + * @param sFilename full path to the save state file. + */ +extern void RA_OnSaveState(const char* sFilename); + +/** + * Notifies the DLL that a save state has been loaded. + * + * Loads the .rap file next to the state file that contains achievement-related information for the save state being loaded. + * + * @param sFilename full path to the save state file. + */ +extern void RA_OnLoadState(const char* sFilename); + +/** + * Captures the current state of the achievement runtime for inclusion in a save state. + * + * @param pBuffer buffer to write achievement state information to + * @param nBufferSize the size of the buffer + * @return the number of bytes needed to capture the achievement state. if less than nBufferSize, pBuffer + * will not be populated. the function should be called again with a larger buffer. + */ +extern int RA_CaptureState(char* pBuffer, int nBufferSize); + +/** + * Restores the state of the achievement runtime from a previously captured state. + * + * @param pBuffer buffer containing previously serialized achievement state information + */ +extern void RA_RestoreState(const char* pBuffer); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // !RA_INTERFACE_H diff --git a/3rdparty/rainterface/README.md b/3rdparty/rainterface/README.md new file mode 100644 index 0000000000..9fb572bd82 --- /dev/null +++ b/3rdparty/rainterface/README.md @@ -0,0 +1,5 @@ +# RAInterface + +This code is intended to be loaded into another repository as a submodule. + +An emulator should include RA_Interface.cpp in its build and link against winhttp.lib. Then, the emulator can be modified to call the hooks provided in RA_Interface.cpp at appropriate times to integrate with the RetroAchievements server via the RA_Integration.dll. See wiki for more details. diff --git a/3rdparty/rainterface/rainterface.vcxproj b/3rdparty/rainterface/rainterface.vcxproj new file mode 100644 index 0000000000..3879e983cc --- /dev/null +++ b/3rdparty/rainterface/rainterface.vcxproj @@ -0,0 +1,48 @@ + + + + + + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8} + + + + StaticLibrary + $(DefaultPlatformToolset) + MultiByte + true + true + false + + + + + + + + + + + + + + AllRules.ruleset + + + + %(PreprocessorDefinitions) + $(ProjectDir)%(AdditionalIncludeDirectories) + TurnOffAllWarnings + + + + + + + + + + + + + \ No newline at end of file diff --git a/3rdparty/rainterface/rainterface.vcxproj.filters b/3rdparty/rainterface/rainterface.vcxproj.filters new file mode 100644 index 0000000000..e276966113 --- /dev/null +++ b/3rdparty/rainterface/rainterface.vcxproj.filters @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/3rdparty/rapidjson/CMakeLists.txt b/3rdparty/rapidjson/CMakeLists.txt new file mode 100644 index 0000000000..d85323b4c9 --- /dev/null +++ b/3rdparty/rapidjson/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(rapidjson INTERFACE) +target_include_directories(rapidjson INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/") diff --git a/3rdparty/rapidjson/include/rapidjson/allocators.h b/3rdparty/rapidjson/include/rapidjson/allocators.h new file mode 100644 index 0000000000..cc67c89713 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/allocators.h @@ -0,0 +1,284 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ALLOCATORS_H_ +#define RAPIDJSON_ALLOCATORS_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Allocator + +/*! \class rapidjson::Allocator + \brief Concept for allocating, resizing and freeing memory block. + + Note that Malloc() and Realloc() are non-static but Free() is static. + + So if an allocator need to support Free(), it needs to put its pointer in + the header of memory block. + +\code +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +\endcode +*/ + + +/*! \def RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY + \ingroup RAPIDJSON_CONFIG + \brief User-defined kDefaultChunkCapacity definition. + + User can define this as any \c size that is a power of 2. +*/ + +#ifndef RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY +#define RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY (64 * 1024) +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// CrtAllocator + +//! C-runtime library allocator. +/*! This class is just wrapper for standard C library memory routines. + \note implements Allocator concept +*/ +class CrtAllocator { +public: + static const bool kNeedFree = true; + void* Malloc(size_t size) { + if (size) // behavior of malloc(0) is implementation defined. + return std::malloc(size); + else + return NULL; // standardize to returning NULL. + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + (void)originalSize; + if (newSize == 0) { + std::free(originalPtr); + return NULL; + } + return std::realloc(originalPtr, newSize); + } + static void Free(void *ptr) { std::free(ptr); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// MemoryPoolAllocator + +//! Default memory allocator used by the parser and DOM. +/*! This allocator allocate memory blocks from pre-allocated memory chunks. + + It does not free memory blocks. And Realloc() only allocate new memory. + + The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. + + User may also supply a buffer as the first chunk. + + If the user-buffer is full then additional chunks are allocated by BaseAllocator. + + The user-buffer is not deallocated by this allocator. + + \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. + \note implements Allocator concept +*/ +template +class MemoryPoolAllocator { +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + RAPIDJSON_ASSERT(buffer != 0); + RAPIDJSON_ASSERT(size > sizeof(ChunkHeader)); + chunkHead_ = reinterpret_cast(buffer); + chunkHead_->capacity = size - sizeof(ChunkHeader); + chunkHead_->size = 0; + chunkHead_->next = 0; + } + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() { + Clear(); + RAPIDJSON_DELETE(ownBaseAllocator_); + } + + //! Deallocates all memory chunks, excluding the user-supplied buffer. + void Clear() { + while (chunkHead_ && chunkHead_ != userBuffer_) { + ChunkHeader* next = chunkHead_->next; + baseAllocator_->Free(chunkHead_); + chunkHead_ = next; + } + if (chunkHead_ && chunkHead_ == userBuffer_) + chunkHead_->size = 0; // Clear user buffer + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() const { + size_t capacity = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() const { + size_t size = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + if (!size) + return NULL; + + size = RAPIDJSON_ALIGN(size); + if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity) + if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) + return NULL; + + void *buffer = reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size; + chunkHead_->size += size; + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + if (newSize == 0) + return NULL; + + originalSize = RAPIDJSON_ALIGN(originalSize); + newSize = RAPIDJSON_ALIGN(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) { + size_t increment = static_cast(newSize - originalSize); + if (chunkHead_->size + increment <= chunkHead_->capacity) { + chunkHead_->size += increment; + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + if (void* newBuffer = Malloc(newSize)) { + if (originalSize) + std::memcpy(newBuffer, originalPtr, originalSize); + return newBuffer; + } + else + return NULL; + } + + //! Frees a memory block (concept Allocator) + static void Free(void *ptr) { (void)ptr; } // Do nothing + +private: + //! Copy constructor is not permitted. + MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */; + //! Copy assignment operator is not permitted. + MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */; + + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + \return true if success. + */ + bool AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator)(); + if (ChunkHeader* chunk = reinterpret_cast(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity))) { + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = chunkHead_; + chunkHead_ = chunk; + return true; + } + else + return false; + } + + static const int kDefaultChunkCapacity = RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY; //!< Default chunk capacity. + + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + void *userBuffer_; //!< User supplied buffer. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object. +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/cursorstreamwrapper.h b/3rdparty/rapidjson/include/rapidjson/cursorstreamwrapper.h new file mode 100644 index 0000000000..52c11a7c01 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/cursorstreamwrapper.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_CURSORSTREAMWRAPPER_H_ +#define RAPIDJSON_CURSORSTREAMWRAPPER_H_ + +#include "stream.h" + +#if defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4702) // unreachable code +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + + +//! Cursor stream wrapper for counting line and column number if error exists. +/*! + \tparam InputStream Any stream that implements Stream Concept +*/ +template > +class CursorStreamWrapper : public GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + + CursorStreamWrapper(InputStream& is): + GenericStreamWrapper(is), line_(1), col_(0) {} + + // counting line and column number + Ch Take() { + Ch ch = this->is_.Take(); + if(ch == '\n') { + line_ ++; + col_ = 0; + } else { + col_ ++; + } + return ch; + } + + //! Get the error line number, if error exists. + size_t GetLine() const { return line_; } + //! Get the error column number, if error exists. + size_t GetColumn() const { return col_; } + +private: + size_t line_; //!< Current Line + size_t col_; //!< Current Column +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_POP +#endif + +#if defined(__GNUC__) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/document.h b/3rdparty/rapidjson/include/rapidjson/document.h new file mode 100644 index 0000000000..68aaae7e6b --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/document.h @@ -0,0 +1,2732 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_DOCUMENT_H_ +#define RAPIDJSON_DOCUMENT_H_ + +/*! \file document.h */ + +#include "reader.h" +#include "internal/meta.h" +#include "internal/strfunc.h" +#include "memorystream.h" +#include "encodedstream.h" +#include // placement new +#include +#ifdef __cpp_lib_three_way_comparison +#include +#endif + +RAPIDJSON_DIAG_PUSH +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(c++98-compat) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_OFF(effc++) +#endif // __GNUC__ + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS +#include // std::random_access_iterator_tag +#endif + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +// Forward declaration. +template +class GenericValue; + +template +class GenericDocument; + +/*! \def RAPIDJSON_DEFAULT_ALLOCATOR + \ingroup RAPIDJSON_CONFIG + \brief Allows to choose default allocator. + + User can define this to use CrtAllocator or MemoryPoolAllocator. +*/ +#ifndef RAPIDJSON_DEFAULT_ALLOCATOR +#define RAPIDJSON_DEFAULT_ALLOCATOR MemoryPoolAllocator +#endif + +/*! \def RAPIDJSON_DEFAULT_STACK_ALLOCATOR + \ingroup RAPIDJSON_CONFIG + \brief Allows to choose default stack allocator for Document. + + User can define this to use CrtAllocator or MemoryPoolAllocator. +*/ +#ifndef RAPIDJSON_DEFAULT_STACK_ALLOCATOR +#define RAPIDJSON_DEFAULT_STACK_ALLOCATOR CrtAllocator +#endif + +/*! \def RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY + \ingroup RAPIDJSON_CONFIG + \brief User defined kDefaultObjectCapacity value. + + User can define this as any natural number. +*/ +#ifndef RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY +// number of objects that rapidjson::Value allocates memory for by default +#define RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY 16 +#endif + +/*! \def RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY + \ingroup RAPIDJSON_CONFIG + \brief User defined kDefaultArrayCapacity value. + + User can define this as any natural number. +*/ +#ifndef RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY +// number of array elements that rapidjson::Value allocates memory for by default +#define RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY 16 +#endif + +//! Name-value pair in a JSON object value. +/*! + This class was internal to GenericValue. It used to be a inner struct. + But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. + https://code.google.com/p/rapidjson/issues/detail?id=64 +*/ +template +class GenericMember { +public: + GenericValue name; //!< name of member (must be a string) + GenericValue value; //!< value of member. + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericMember(GenericMember&& rhs) RAPIDJSON_NOEXCEPT + : name(std::move(rhs.name)), + value(std::move(rhs.value)) + { + } + + //! Move assignment in C++11 + GenericMember& operator=(GenericMember&& rhs) RAPIDJSON_NOEXCEPT { + return *this = static_cast(rhs); + } +#endif + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. Its name and value will become a null value after assignment. + */ + GenericMember& operator=(GenericMember& rhs) RAPIDJSON_NOEXCEPT { + if (RAPIDJSON_LIKELY(this != &rhs)) { + name = rhs.name; + value = rhs.value; + } + return *this; + } + + // swap() for std::sort() and other potential use in STL. + friend inline void swap(GenericMember& a, GenericMember& b) RAPIDJSON_NOEXCEPT { + a.name.Swap(b.name); + a.value.Swap(b.value); + } + +private: + //! Copy constructor is not permitted. + GenericMember(const GenericMember& rhs); +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericMemberIterator + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS + +//! (Constant) member iterator for a JSON object value +/*! + \tparam Const Is this a constant iterator? + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. + + This class implements a Random Access Iterator for GenericMember elements + of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. + + \note This iterator implementation is mainly intended to avoid implicit + conversions from iterator values to \c NULL, + e.g. from GenericValue::FindMember. + + \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a + pointer-based implementation, if your platform doesn't provide + the C++ header. + + \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator + */ +template +class GenericMemberIterator { + + friend class GenericValue; + template friend class GenericMemberIterator; + + typedef GenericMember PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + +public: + //! Iterator type itself + typedef GenericMemberIterator Iterator; + //! Constant iterator type + typedef GenericMemberIterator ConstIterator; + //! Non-constant iterator type + typedef GenericMemberIterator NonConstIterator; + + /** \name std::iterator_traits support */ + //@{ + typedef ValueType value_type; + typedef ValueType * pointer; + typedef ValueType & reference; + typedef std::ptrdiff_t difference_type; + typedef std::random_access_iterator_tag iterator_category; + //@} + + //! Pointer to (const) GenericMember + typedef pointer Pointer; + //! Reference to (const) GenericMember + typedef reference Reference; + //! Signed integer type (e.g. \c ptrdiff_t) + typedef difference_type DifferenceType; + + //! Default constructor (singular value) + /*! Creates an iterator pointing to no element. + \note All operations, except for comparisons, are undefined on such values. + */ + GenericMemberIterator() : ptr_() {} + + //! Iterator conversions to more const + /*! + \param it (Non-const) iterator to copy from + + Allows the creation of an iterator from another GenericMemberIterator + that is "less const". Especially, creating a non-constant iterator + from a constant iterator are disabled: + \li const -> non-const (not ok) + \li const -> const (ok) + \li non-const -> const (ok) + \li non-const -> non-const (ok) + + \note If the \c Const template parameter is already \c false, this + constructor effectively defines a regular copy-constructor. + Otherwise, the copy constructor is implicitly defined. + */ + GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} + Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } + + //! @name stepping + //@{ + Iterator& operator++(){ ++ptr_; return *this; } + Iterator& operator--(){ --ptr_; return *this; } + Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } + Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } + //@} + + //! @name increment/decrement + //@{ + Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } + Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } + + Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } + Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } + //@} + + //! @name relations + //@{ + template bool operator==(const GenericMemberIterator& that) const { return ptr_ == that.ptr_; } + template bool operator!=(const GenericMemberIterator& that) const { return ptr_ != that.ptr_; } + template bool operator<=(const GenericMemberIterator& that) const { return ptr_ <= that.ptr_; } + template bool operator>=(const GenericMemberIterator& that) const { return ptr_ >= that.ptr_; } + template bool operator< (const GenericMemberIterator& that) const { return ptr_ < that.ptr_; } + template bool operator> (const GenericMemberIterator& that) const { return ptr_ > that.ptr_; } + +#ifdef __cpp_lib_three_way_comparison + template std::strong_ordering operator<=>(const GenericMemberIterator& that) const { return ptr_ <=> that.ptr_; } +#endif + //@} + + //! @name dereference + //@{ + Reference operator*() const { return *ptr_; } + Pointer operator->() const { return ptr_; } + Reference operator[](DifferenceType n) const { return ptr_[n]; } + //@} + + //! Distance + DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } + +private: + //! Internal constructor from plain pointer + explicit GenericMemberIterator(Pointer p) : ptr_(p) {} + + Pointer ptr_; //!< raw pointer +}; + +#else // RAPIDJSON_NOMEMBERITERATORCLASS + +// class-based member iterator implementation disabled, use plain pointers + +template +class GenericMemberIterator; + +//! non-const GenericMemberIterator +template +class GenericMemberIterator { + //! use plain pointer as iterator type + typedef GenericMember* Iterator; +}; +//! const GenericMemberIterator +template +class GenericMemberIterator { + //! use plain const pointer as iterator type + typedef const GenericMember* Iterator; +}; + +#endif // RAPIDJSON_NOMEMBERITERATORCLASS + +/////////////////////////////////////////////////////////////////////////////// +// GenericStringRef + +//! Reference to a constant string (not taking a copy) +/*! + \tparam CharType character type of the string + + This helper class is used to automatically infer constant string + references for string literals, especially from \c const \b (!) + character arrays. + + The main use is for creating JSON string values without copying the + source string via an \ref Allocator. This requires that the referenced + string pointers have a sufficient lifetime, which exceeds the lifetime + of the associated GenericValue. + + \b Example + \code + Value v("foo"); // ok, no need to copy & calculate length + const char foo[] = "foo"; + v.SetString(foo); // ok + + const char* bar = foo; + // Value x(bar); // not ok, can't rely on bar's lifetime + Value x(StringRef(bar)); // lifetime explicitly guaranteed by user + Value y(StringRef(bar, 3)); // ok, explicitly pass length + \endcode + + \see StringRef, GenericValue::SetString +*/ +template +struct GenericStringRef { + typedef CharType Ch; //!< character type of the string + + //! Create string reference from \c const character array +#ifndef __clang__ // -Wdocumentation + /*! + This constructor implicitly creates a constant string reference from + a \c const character array. It has better performance than + \ref StringRef(const CharType*) by inferring the string \ref length + from the array length, and also supports strings containing null + characters. + + \tparam N length of the string, automatically inferred + + \param str Constant character array, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note Constant complexity. + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + template + GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT + : s(str), length(N-1) {} + + //! Explicitly create string reference from \c const character pointer +#ifndef __clang__ // -Wdocumentation + /*! + This constructor can be used to \b explicitly create a reference to + a constant string pointer. + + \see StringRef(const CharType*) + + \param str Constant character pointer, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + explicit GenericStringRef(const CharType* str) + : s(str), length(NotNullStrLen(str)) {} + + //! Create constant string reference from pointer and length +#ifndef __clang__ // -Wdocumentation + /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param len length of the string, excluding the trailing NULL terminator + + \post \ref s == str && \ref length == len + \note Constant complexity. + */ +#endif + GenericStringRef(const CharType* str, SizeType len) + : s(RAPIDJSON_LIKELY(str) ? str : emptyString), length(len) { RAPIDJSON_ASSERT(str != 0 || len == 0u); } + + GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} + + //! implicit conversion to plain CharType pointer + operator const Ch *() const { return s; } + + const Ch* const s; //!< plain CharType pointer + const SizeType length; //!< length of the string (excluding the trailing NULL terminator) + +private: + SizeType NotNullStrLen(const CharType* str) { + RAPIDJSON_ASSERT(str != 0); + return internal::StrLen(str); + } + + /// Empty string - used when passing in a NULL pointer + static const Ch emptyString[]; + + //! Disallow construction from non-const array + template + GenericStringRef(CharType (&str)[N]) /* = delete */; + //! Copy assignment operator not permitted - immutable type + GenericStringRef& operator=(const GenericStringRef& rhs) /* = delete */; +}; + +template +const CharType GenericStringRef::emptyString[] = { CharType() }; + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + \tparam CharType Character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + + \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember +*/ +template +inline GenericStringRef StringRef(const CharType* str) { + return GenericStringRef(str); +} + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + This version has better performance with supplied length, and also + supports string containing null characters. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param length The length of source string. + \return GenericStringRef string reference object + \relatesalso GenericStringRef +*/ +template +inline GenericStringRef StringRef(const CharType* str, size_t length) { + return GenericStringRef(str, SizeType(length)); +} + +#if RAPIDJSON_HAS_STDSTRING +//! Mark a string object as constant string +/*! Mark a string object (e.g. \c std::string) as a "string literal". + This function can be used to avoid copying a string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. +*/ +template +inline GenericStringRef StringRef(const std::basic_string& str) { + return GenericStringRef(str.data(), SizeType(str.size())); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue type traits +namespace internal { + +template +struct IsGenericValueImpl : FalseType {}; + +// select candidates according to nested encoding and allocator types +template struct IsGenericValueImpl::Type, typename Void::Type> + : IsBaseOf, T>::Type {}; + +// helper to match arbitrary GenericValue instantiations, including derived classes +template struct IsGenericValue : IsGenericValueImpl::Type {}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// TypeHelper + +namespace internal { + +template +struct TypeHelper {}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsBool(); } + static bool Get(const ValueType& v) { return v.GetBool(); } + static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } + static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static int Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; + +#ifdef _MSC_VER +RAPIDJSON_STATIC_ASSERT(sizeof(long) == sizeof(int)); +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static long Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, long data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, long data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +RAPIDJSON_STATIC_ASSERT(sizeof(unsigned long) == sizeof(unsigned)); +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned long Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned long data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned long data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; +#endif + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt64(); } + static int64_t Get(const ValueType& v) { return v.GetInt64(); } + static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } + static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint64(); } + static uint64_t Get(const ValueType& v) { return v.GetUint64(); } + static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } + static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsDouble(); } + static double Get(const ValueType& v) { return v.GetDouble(); } + static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } + static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsFloat(); } + static float Get(const ValueType& v) { return v.GetFloat(); } + static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } + static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } +}; + +template +struct TypeHelper { + typedef const typename ValueType::Ch* StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return v.GetString(); } + static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } + static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; + +#if RAPIDJSON_HAS_STDSTRING +template +struct TypeHelper > { + typedef std::basic_string StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } + static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; +#endif + +template +struct TypeHelper { + typedef typename ValueType::Array ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(ValueType& v) { return v.GetArray(); } + static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } + static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstArray ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(const ValueType& v) { return v.GetArray(); } +}; + +template +struct TypeHelper { + typedef typename ValueType::Object ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(ValueType& v) { return v.GetObject(); } + static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } + static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstObject ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(const ValueType& v) { return v.GetObject(); } +}; + +} // namespace internal + +// Forward declarations +template class GenericArray; +template class GenericObject; + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +template +class GenericValue { +public: + //! Name-value pair in an object. + typedef GenericMember Member; + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericStringRef StringRefType; //!< Reference to a constant string + typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. + typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + typedef GenericValue ValueType; //!< Value type of itself. + typedef GenericArray Array; + typedef GenericArray ConstArray; + typedef GenericObject Object; + typedef GenericObject ConstObject; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) { + rhs.data_.f.flags = kNullFlag; // give up contents + } +#endif + +private: + //! Copy constructor is not permitted. + GenericValue(const GenericValue& rhs); + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Moving from a GenericDocument is not permitted. + template + GenericValue(GenericDocument&& rhs); + + //! Move assignment from a GenericDocument is not permitted. + template + GenericValue& operator=(GenericDocument&& rhs); +#endif + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() { + static const uint16_t defaultFlags[] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, + kNumberAnyFlag + }; + RAPIDJSON_NOEXCEPT_ASSERT(type >= kNullType && type <= kNumberType); + data_.f.flags = defaultFlags[type]; + + // Use ShortString to store empty string. + if (type == kStringType) + data_.ss.SetLength(0); + } + + //! Explicit copy constructor (with allocator) + /*! Creates a copy of a Value by using the given Allocator + \tparam SourceAllocator allocator of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + \see CopyFrom() + */ + template + GenericValue(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + switch (rhs.GetType()) { + case kObjectType: { + SizeType count = rhs.data_.o.size; + Member* lm = reinterpret_cast(allocator.Malloc(count * sizeof(Member))); + const typename GenericValue::Member* rm = rhs.GetMembersPointer(); + for (SizeType i = 0; i < count; i++) { + new (&lm[i].name) GenericValue(rm[i].name, allocator, copyConstStrings); + new (&lm[i].value) GenericValue(rm[i].value, allocator, copyConstStrings); + } + data_.f.flags = kObjectFlag; + data_.o.size = data_.o.capacity = count; + SetMembersPointer(lm); + } + break; + case kArrayType: { + SizeType count = rhs.data_.a.size; + GenericValue* le = reinterpret_cast(allocator.Malloc(count * sizeof(GenericValue))); + const GenericValue* re = rhs.GetElementsPointer(); + for (SizeType i = 0; i < count; i++) + new (&le[i]) GenericValue(re[i], allocator, copyConstStrings); + data_.f.flags = kArrayFlag; + data_.a.size = data_.a.capacity = count; + SetElementsPointer(le); + } + break; + case kStringType: + if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) { + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + } + else + SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); + break; + default: + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + break; + } + } + + //! Constructor for boolean value. + /*! \param b Boolean value + \note This constructor is limited to \em real boolean values and rejects + implicitly converted types like arbitrary pointers. Use an explicit cast + to \c bool, if you want to construct a boolean JSON value in such cases. + */ +#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen + template + explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame))) RAPIDJSON_NOEXCEPT // See #472 +#else + explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT +#endif + : data_() { + // safe-guard against failing SFINAE + RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); + data_.f.flags = b ? kTrueFlag : kFalseFlag; + } + + //! Constructor for int value. + explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i; + data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; + } + + //! Constructor for unsigned value. + explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u; + data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); + } + + //! Constructor for int64_t value. + explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i64; + data_.f.flags = kNumberInt64Flag; + if (i64 >= 0) { + data_.f.flags |= kNumberUint64Flag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + else if (i64 >= static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for uint64_t value. + explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u64; + data_.f.flags = kNumberUint64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) + data_.f.flags |= kInt64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for double value. + explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for float value. + explicit GenericValue(float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast(f); data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } + + //! Constructor for constant string (i.e. do not make a copy of string) + explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor for copy-string from a string object (i.e. do make a copy of string) + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } +#endif + + //! Constructor for Array. + /*! + \param a An array obtained by \c GetArray(). + \note \c Array is always pass-by-value. + \note the source array is moved into this value and the sourec array becomes empty. + */ + GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { + a.value_.data_ = Data(); + a.value_.data_.f.flags = kArrayFlag; + } + + //! Constructor for Object. + /*! + \param o An object obtained by \c GetObject(). + \note \c Object is always pass-by-value. + \note the source object is moved into this value and the sourec object becomes empty. + */ + GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { + o.value_.data_ = Data(); + o.value_.data_.f.flags = kObjectFlag; + } + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + switch(data_.f.flags) { + case kArrayFlag: + { + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + Allocator::Free(e); + } + break; + + case kObjectFlag: + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + Allocator::Free(GetMembersPointer()); + break; + + case kCopyStringFlag: + Allocator::Free(const_cast(GetStringPointer())); + break; + + default: + break; // Do nothing for other types. + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + if (RAPIDJSON_LIKELY(this != &rhs)) { + this->~GenericValue(); + RawAssign(rhs); + } + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { + return *this = rhs.Move(); + } +#endif + + //! Assignment of constant string reference (no copy) + /*! \param str Constant string reference to be assigned + \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. + \see GenericStringRef, operator=(T) + */ + GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { + GenericValue s(str); + return *this = s; + } + + //! Assignment with primitive types. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value The value to be assigned. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref SetString(const Ch*, Allocator&) (for copying) or + \ref StringRef() (to explicitly mark the pointer as constant) instead. + All other pointer types would implicitly convert to \c bool, + use \ref SetBool() instead. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) + operator=(T value) { + GenericValue v(value); + return *this = v; + } + + //! Deep-copy assignment from Value + /*! Assigns a \b copy of the Value to the current Value object + \tparam SourceAllocator Allocator type of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator to use for copying + \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer) + */ + template + GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator, bool copyConstStrings = false) { + RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); + this->~GenericValue(); + new (this) GenericValue(rhs, allocator, copyConstStrings); + return *this; + } + + //! Exchange the contents of this value with those of other. + /*! + \param other Another value. + \note Constant complexity. + */ + GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { + GenericValue temp; + temp.RawAssign(*this); + RawAssign(other); + other.RawAssign(temp); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.value, b.value); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Prepare Value for move semantics + /*! \return *this */ + GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } + //@} + + //!@name Equal-to and not-equal-to operators + //@{ + //! Equal-to operator + /*! + \note If an object contains duplicated named member, comparing equality with any object is always \c false. + \note Complexity is quadratic in Object's member number and linear for the rest (number of all values in the subtree and total lengths of all strings). + */ + template + bool operator==(const GenericValue& rhs) const { + typedef GenericValue RhsType; + if (GetType() != rhs.GetType()) + return false; + + switch (GetType()) { + case kObjectType: // Warning: O(n^2) inner-loop + if (data_.o.size != rhs.data_.o.size) + return false; + for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { + typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); + if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) + return false; + } + return true; + + case kArrayType: + if (data_.a.size != rhs.data_.a.size) + return false; + for (SizeType i = 0; i < data_.a.size; i++) + if ((*this)[i] != rhs[i]) + return false; + return true; + + case kStringType: + return StringEqual(rhs); + + case kNumberType: + if (IsDouble() || rhs.IsDouble()) { + double a = GetDouble(); // May convert from integer to double. + double b = rhs.GetDouble(); // Ditto + return a >= b && a <= b; // Prevent -Wfloat-equal + } + else + return data_.n.u64 == rhs.data_.n.u64; + + default: + return true; + } + } + + //! Equal-to operator with const C-string pointer + bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } + +#if RAPIDJSON_HAS_STDSTRING + //! Equal-to operator with string object + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } +#endif + + //! Equal-to operator with primitive types + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } + + //! Not-equal-to operator + /*! \return !(*this == rhs) + */ + template + bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with const C-string pointer + bool operator!=(const Ch* rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with arbitrary types + /*! \return !(*this == rhs) + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } + + //! Equal-to operator with arbitrary types (symmetric version) + /*! \return (rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } + + //! Not-Equal-to operator with arbitrary types (symmetric version) + /*! \return !(rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } + //@} + + //!@name Type + //@{ + + Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } + bool IsNull() const { return data_.f.flags == kNullFlag; } + bool IsFalse() const { return data_.f.flags == kFalseFlag; } + bool IsTrue() const { return data_.f.flags == kTrueFlag; } + bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } + bool IsObject() const { return data_.f.flags == kObjectFlag; } + bool IsArray() const { return data_.f.flags == kArrayFlag; } + bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } + bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } + bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } + bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } + bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } + bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } + bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } + + // Checks whether a number can be losslessly converted to a double. + bool IsLosslessDouble() const { + if (!IsNumber()) return false; + if (IsUint64()) { + uint64_t u = GetUint64(); + volatile double d = static_cast(u); + return (d >= 0.0) + && (d < static_cast((std::numeric_limits::max)())) + && (u == static_cast(d)); + } + if (IsInt64()) { + int64_t i = GetInt64(); + volatile double d = static_cast(i); + return (d >= static_cast((std::numeric_limits::min)())) + && (d < static_cast((std::numeric_limits::max)())) + && (i == static_cast(d)); + } + return true; // double, int, uint are always lossless + } + + // Checks whether a number is a float (possible lossy). + bool IsFloat() const { + if ((data_.f.flags & kDoubleFlag) == 0) + return false; + double d = GetDouble(); + return d >= -3.4028234e38 && d <= 3.4028234e38; + } + // Checks whether a number can be losslessly converted to a float. + bool IsLosslessFloat() const { + if (!IsNumber()) return false; + double a = GetDouble(); + if (a < static_cast(-(std::numeric_limits::max)()) + || a > static_cast((std::numeric_limits::max)())) + return false; + double b = static_cast(static_cast(a)); + return a >= b && a <= b; // Prevent -Wfloat-equal + } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } + //!< Set boolean value + /*! \post IsBool() == true */ + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + /*! \post IsObject() == true */ + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the number of members in the object. + SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Get the capacity of object. + SizeType MemberCapacity() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.capacity; } + + //! Check whether the object is empty. + bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) + \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. + Since 0.2, if the name is not correct, it will assert. + If user is unsure whether a member exists, user should use HasMember() first. + A better approach is to use FindMember(). + \note Linear time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { + GenericValue n(StringRef(name)); + return (*this)[n]; + } + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam SourceAllocator Allocator of the \c name value + + \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). + And it can also handle strings with embedded null characters. + + \note Linear time complexity. + */ + template + GenericValue& operator[](const GenericValue& name) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value; + else { + RAPIDJSON_ASSERT(false); // see above note + + // This will generate -Wexit-time-destructors in clang + // static GenericValue NullValue; + // return NullValue; + + // Use static buffer and placement-new to prevent destruction + static char buffer[sizeof(GenericValue)]; + return *new (buffer) GenericValue(); + } + } + template + const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } + +#if RAPIDJSON_HAS_STDSTRING + //! Get a value from an object associated with name (string object). + GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } + const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } +#endif + + //! Const member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } + //! Const \em past-the-end member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } + //! Member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } + //! \em Past-the-end member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } + + //! Request the object to have enough capacity to store members. + /*! \param newCapacity The capacity that the object at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& MemberReserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsObject()); + if (newCapacity > data_.o.capacity) { + SetMembersPointer(reinterpret_cast(allocator.Realloc(GetMembersPointer(), data_.o.capacity * sizeof(Member), newCapacity * sizeof(Member)))); + data_.o.capacity = newCapacity; + } + return *this; + } + + //! Check whether a member exists in the object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } + +#if RAPIDJSON_HAS_STDSTRING + //! Check whether a member exists in the object with string object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } +#endif + + //! Check whether a member exists in the object with GenericValue name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + template + bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } + + //! Find member by name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + MemberIterator FindMember(const Ch* name) { + GenericValue n(StringRef(name)); + return FindMember(n); + } + + ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } + + //! Find member by name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + template + MemberIterator FindMember(const GenericValue& name) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + MemberIterator member = MemberBegin(); + for ( ; member != MemberEnd(); ++member) + if (name.StringEqual(member->name)) + break; + return member; + } + template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } + +#if RAPIDJSON_HAS_STDSTRING + //! Find member by string object name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + */ + MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } + ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } +#endif + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c name and \c value will be transferred to this object on success. + \pre IsObject() && name.IsString() + \post name.IsNull() && value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + + ObjectData& o = data_.o; + if (o.size >= o.capacity) + MemberReserve(o.capacity == 0 ? kDefaultObjectCapacity : (o.capacity + (o.capacity + 1) / 2), allocator); + Member* members = GetMembersPointer(); + members[o.size].name.RawAssign(name); + members[o.size].value.RawAssign(value); + o.size++; + return *this; + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Add a string object as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { + GenericValue v(value, allocator); + return AddMember(name, v, allocator); + } +#endif + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A string value as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(GenericValue& name, T value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + + //! Add a member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this object on success. + \pre IsObject() + \post value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A constant string reference as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(StringRefType name, T value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + RAPIDJSON_ASSERT(IsObject()); + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Linear time complexity. + */ + bool RemoveMember(const Ch* name) { + GenericValue n(StringRef(name)); + return RemoveMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } +#endif + + template + bool RemoveMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + RemoveMember(m); + return true; + } + else + return false; + } + + //! Remove a member in object by iterator. + /*! \param m member iterator (obtained by FindMember() or MemberBegin()). + \return the new iterator after removal. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Constant time complexity. + */ + MemberIterator RemoveMember(MemberIterator m) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); + + MemberIterator last(GetMembersPointer() + (data_.o.size - 1)); + if (data_.o.size > 1 && m != last) + *m = *last; // Move the last one to this place + else + m->~Member(); // Only one left, just destroy + --data_.o.size; + return m; + } + + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note This function preserves the relative order of the remaining object + members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator pos) { + return EraseMember(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note This function preserves the relative order of the remaining object + members. + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(first >= MemberBegin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= MemberEnd()); + + MemberIterator pos = MemberBegin() + (first - MemberBegin()); + for (MemberIterator itr = pos; itr != last; ++itr) + itr->~Member(); + std::memmove(static_cast(&*pos), &*last, static_cast(MemberEnd() - last) * sizeof(Member)); + data_.o.size -= static_cast(last - first); + return pos; + } + + //! Erase a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note Linear time complexity. + */ + bool EraseMember(const Ch* name) { + GenericValue n(StringRef(name)); + return EraseMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } +#endif + + template + bool EraseMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + EraseMember(m); + return true; + } + else + return false; + } + + Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + /*! \post IsArray == true */ + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void Clear() { + RAPIDJSON_ASSERT(IsArray()); + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \pre IsArray() == true + \param index Zero-based index of element. + \see operator[](T*) + */ + GenericValue& operator[](SizeType index) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(index < data_.a.size); + return GetElementsPointer()[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } + + //! Element iterator + /*! \pre IsArray() == true */ + ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } + //! \em Past-the-end element iterator + /*! \pre IsArray() == true */ + ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } + //! Constant element iterator + /*! \pre IsArray() == true */ + ConstValueIterator Begin() const { return const_cast(*this).Begin(); } + //! Constant \em past-the-end element iterator + /*! \pre IsArray() == true */ + ConstValueIterator End() const { return const_cast(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a GenericValue at the end of the array. + /*! \param value Value to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \post value.IsNull() == true + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this array on success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); + GetElementsPointer()[data_.a.size++].RawAssign(value); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { + return PushBack(value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + //! Append a constant string reference at the end of the array. + /*! \param value Constant string reference to be appended. + \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + \see GenericStringRef + */ + GenericValue& PushBack(StringRefType value, Allocator& allocator) { + return (*this).template PushBack(value, allocator); + } + + //! Append a primitive value at the end of the array. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value Value of primitive type T to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref PushBack(GenericValue&, Allocator&) or \ref + PushBack(StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + /*! + \note Constant time complexity. + */ + GenericValue& PopBack() { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(!Empty()); + GetElementsPointer()[--data_.a.size].~GenericValue(); + return *this; + } + + //! Remove an element of array by iterator. + /*! + \param pos iterator to the element to remove + \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() + \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator pos) { + return Erase(pos, pos + 1); + } + + //! Remove elements in the range [first, last) of the array. + /*! + \param first iterator to the first element to remove + \param last iterator following the last element to remove + \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() + \return Iterator following the last removed element. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(data_.a.size > 0); + RAPIDJSON_ASSERT(GetElementsPointer() != 0); + RAPIDJSON_ASSERT(first >= Begin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= End()); + ValueIterator pos = Begin() + (first - Begin()); + for (ValueIterator itr = pos; itr != last; ++itr) + itr->~GenericValue(); + std::memmove(static_cast(pos), last, static_cast(End() - last) * sizeof(GenericValue)); + data_.a.size -= static_cast(last - first); + return pos; + } + + Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); } + ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } + + //@} + + //!@name Number + //@{ + + int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } + + //! Get the value as double type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless. + */ + double GetDouble() const { + RAPIDJSON_ASSERT(IsNumber()); + if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) + RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) + } + + //! Get the value as float type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless. + */ + float GetFloat() const { + return static_cast(GetDouble()); + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(static_cast(f)); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); } + + //! Get the length of string. + /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == length + \see SetString(StringRefType) + */ + GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } + + //! Set this value as a string without copying source string. + /*! \param s source string reference + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == s.length + */ + GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { return SetString(StringRef(s, length), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(StringRef(s), allocator); } + + //! Set this value as a string by copying from source string. + /*! \param s source string reference + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator); return *this; } + +#if RAPIDJSON_HAS_STDSTRING + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(StringRef(s), allocator); } +#endif + + //@} + + //!@name Array + //@{ + + //! Templated version for checking whether this value is type T. + /*! + \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string + */ + template + bool Is() const { return internal::TypeHelper::Is(*this); } + + template + T Get() const { return internal::TypeHelper::Get(*this); } + + template + T Get() { return internal::TypeHelper::Get(*this); } + + template + ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } + + template + ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template + bool Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: return handler.Null(); + case kFalseType: return handler.Bool(false); + case kTrueType: return handler.Bool(true); + + case kObjectType: + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + return false; + for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. + if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) + return false; + if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) + return false; + } + return handler.EndObject(data_.o.size); + + case kArrayType: + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + return false; + for (const GenericValue* v = Begin(); v != End(); ++v) + if (RAPIDJSON_UNLIKELY(!v->Accept(handler))) + return false; + return handler.EndArray(data_.a.size); + + case kStringType: + return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); + + default: + RAPIDJSON_ASSERT(GetType() == kNumberType); + if (IsDouble()) return handler.Double(data_.n.d); + else if (IsInt()) return handler.Int(data_.n.i.i); + else if (IsUint()) return handler.Uint(data_.n.u.u); + else if (IsInt64()) return handler.Int64(data_.n.i64); + else return handler.Uint64(data_.n.u64); + } + } + +private: + template friend class GenericValue; + template friend class GenericDocument; + + enum { + kBoolFlag = 0x0008, + kNumberFlag = 0x0010, + kIntFlag = 0x0020, + kUintFlag = 0x0040, + kInt64Flag = 0x0080, + kUint64Flag = 0x0100, + kDoubleFlag = 0x0200, + kStringFlag = 0x0400, + kCopyFlag = 0x0800, + kInlineStrFlag = 0x1000, + + // Initial flags of different types. + kNullFlag = kNullType, + kTrueFlag = kTrueType | kBoolFlag, + kFalseFlag = kFalseType | kBoolFlag, + kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag, + kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag, + kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag, + kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag, + kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag, + kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag, + kConstStringFlag = kStringType | kStringFlag, + kCopyStringFlag = kStringType | kStringFlag | kCopyFlag, + kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag, + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0x07 + }; + + static const SizeType kDefaultArrayCapacity = RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY; + static const SizeType kDefaultObjectCapacity = RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY; + + struct Flag { +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION + char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer +#elif RAPIDJSON_64BIT + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes +#else + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes +#endif + uint16_t flags; + }; + + struct String { + SizeType length; + SizeType hashcode; //!< reserved + const Ch* str; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars + // (excluding the terminating zero) and store a value to determine the length of the contained + // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string + // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as + // the string terminator as well. For getting the string length back from that value just use + // "MaxSize - str[LenPos]". + // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, + // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). + struct ShortString { + enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; + Ch str[MaxChars]; + + inline static bool Usable(SizeType len) { return (MaxSize >= len); } + inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } + inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } + }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct ObjectData { + SizeType size; + SizeType capacity; + Member* members; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct ArrayData { + SizeType size; + SizeType capacity; + GenericValue* elements; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + ShortString ss; + Number n; + ObjectData o; + ArrayData a; + Flag f; + }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION + + RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); } + RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } + RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } + RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } + RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); } + RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { + data_.f.flags = kArrayFlag; + if (count) { + GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); + SetElementsPointer(e); + std::memcpy(static_cast(e), values, count * sizeof(GenericValue)); + } + else + SetElementsPointer(0); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { + data_.f.flags = kObjectFlag; + if (count) { + Member* m = static_cast(allocator.Malloc(count * sizeof(Member))); + SetMembersPointer(m); + std::memcpy(static_cast(m), members, count * sizeof(Member)); + } + else + SetMembersPointer(0); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { + data_.f.flags = kConstStringFlag; + SetStringPointer(s); + data_.s.length = s.length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(StringRefType s, Allocator& allocator) { + Ch* str = 0; + if (ShortString::Usable(s.length)) { + data_.f.flags = kShortStringFlag; + data_.ss.SetLength(s.length); + str = data_.ss.str; + } else { + data_.f.flags = kCopyStringFlag; + data_.s.length = s.length; + str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); + SetStringPointer(str); + } + std::memcpy(str, s, s.length * sizeof(Ch)); + str[s.length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + data_ = rhs.data_; + // data_.f.flags = rhs.data_.f.flags; + rhs.data_.f.flags = kNullFlag; + } + + template + bool StringEqual(const GenericValue& rhs) const { + RAPIDJSON_ASSERT(IsString()); + RAPIDJSON_ASSERT(rhs.IsString()); + + const SizeType len1 = GetStringLength(); + const SizeType len2 = rhs.GetStringLength(); + if(len1 != len2) { return false; } + + const Ch* const str1 = GetString(); + const Ch* const str2 = rhs.GetString(); + if(str1 == str2) { return true; } // fast path for constant string + + return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); + } + + Data data_; +}; + +//! GenericValue with UTF8 encoding +typedef GenericValue > Value; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \note implements Handler concept + \tparam Encoding Encoding for both parsing and string storage. + \tparam Allocator Allocator for allocating memory for the DOM + \tparam StackAllocator Allocator for allocating memory for stack during parsing. + \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. +*/ +template +class GenericDocument : public GenericValue { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + + //! Constructor + /*! Creates an empty document of specified type. + \param type Mandatory type of object to create. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + } + + //! Constructor + /*! Creates an empty document which type is Null. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(std::move(rhs.stack_)), + parseResult_(rhs.parseResult_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + } +#endif + + ~GenericDocument() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + { + // The cast to ValueType is necessary here, because otherwise it would + // attempt to call GenericValue's templated assignment operator. + ValueType::operator=(std::forward(rhs)); + + // Calling the destructor here would prematurely call stack_'s destructor + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = std::move(rhs.stack_); + parseResult_ = rhs.parseResult_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + + return *this; + } +#endif + + //! Exchange the contents of this document with those of another. + /*! + \param rhs Another document. + \note Constant complexity. + \see GenericValue::Swap + */ + GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT { + ValueType::Swap(rhs); + stack_.Swap(rhs.stack_); + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(parseResult_, rhs.parseResult_); + return *this; + } + + // Allow Swap with ValueType. + // Refer to Effective C++ 3rd Edition/Item 33: Avoid hiding inherited names. + using ValueType::Swap; + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.doc, b.doc); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Populate this document by a generator which produces SAX events. + /*! \tparam Generator A functor with bool f(Handler) prototype. + \param g Generator functor which sends SAX events to the parameter. + \return The document itself for fluent API. + */ + template + GenericDocument& Populate(Generator& g) { + ClearStackOnExit scope(*this); + if (g(*this)) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //!@name Parse from stream + //!@{ + + //! Parse JSON text from an input stream (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Encoding of input stream + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + GenericReader reader( + stack_.HasAllocator() ? &stack_.GetAllocator() : 0); + ClearStackOnExit scope(*this); + parseResult_ = reader.template Parse(is, *this); + if (parseResult_) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //! Parse JSON text from an input stream + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + + //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + //!@} + + //!@name Parse in-place from mutable string + //!@{ + + //! Parse JSON text from a mutable string + /*! \tparam parseFlags Combination of \ref ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) + /*! \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu(str); + } + //!@} + + //!@name Parse from read-only string + //!@{ + + //! Parse JSON text from a read-only string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \tparam SourceEncoding Transcoding from input Encoding + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a read-only string + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) + /*! \param str Read-only zero-terminated string to be parsed. + */ + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + MemoryStream ms(reinterpret_cast(str), length * sizeof(typename SourceEncoding::Ch)); + EncodedInputStream is(ms); + ParseStream(is); + return *this; + } + + template + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + template + GenericDocument& Parse(const std::basic_string& str) { + // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) + return Parse(str.c_str()); + } + + template + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str.c_str()); + } + + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str); + } +#endif // RAPIDJSON_HAS_STDSTRING + + //!@} + + //!@name Handling parse errors + //!@{ + + //! Whether a parse error has occurred in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseError() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + + //! Implicit conversion to get the last parse result +#ifndef __clang // -Wdocumentation + /*! \return \ref ParseResult of the last parse operation + + \code + Document doc; + ParseResult ok = doc.Parse(json); + if (!ok) + printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); + \endcode + */ +#endif + operator ParseResult() const { return parseResult_; } + //!@} + + //! Get the allocator of this document. + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} + ~ClearStackOnExit() { d_.ClearStack(); } + private: + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + GenericDocument& d_; + }; + + // callers of the following private Handler functions + // template friend class GenericReader; // for parsing + template friend class GenericValue; // for deep copying + +public: + // Implementation of Handler + bool Null() { new (stack_.template Push()) ValueType(); return true; } + bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } + bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } + bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } + + bool RawNumber(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } + + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop(memberCount); + stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); + return true; + } + + bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } + + bool EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop(elementCount); + stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); + return true; + } + +private: + //! Prohibit copying + GenericDocument(const GenericDocument&); + //! Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop(1))->~ValueType(); + else + stack_.Clear(); + stack_.ShrinkToFit(); + } + + void Destroy() { + RAPIDJSON_DELETE(ownAllocator_); + } + + static const size_t kDefaultStackCapacity = 1024; + Allocator* allocator_; + Allocator* ownAllocator_; + internal::Stack stack_; + ParseResult parseResult_; +}; + +//! GenericDocument with UTF8 encoding +typedef GenericDocument > Document; + + +//! Helper class for accessing Value of array type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetArray(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericArray { +public: + typedef GenericArray ConstArray; + typedef GenericArray Array; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef ValueType* ValueIterator; // This may be const or non-const iterator + typedef const ValueT* ConstValueIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + + template + friend class GenericValue; + + GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} + GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } + ~GenericArray() {} + + SizeType Size() const { return value_.Size(); } + SizeType Capacity() const { return value_.Capacity(); } + bool Empty() const { return value_.Empty(); } + void Clear() const { value_.Clear(); } + ValueType& operator[](SizeType index) const { return value_[index]; } + ValueIterator Begin() const { return value_.Begin(); } + ValueIterator End() const { return value_.End(); } + GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } + GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + GenericArray PopBack() const { value_.PopBack(); return *this; } + ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + ValueIterator begin() const { return value_.Begin(); } + ValueIterator end() const { return value_.End(); } +#endif + +private: + GenericArray(); + GenericArray(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +//! Helper class for accessing Value of object type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetObject(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericObject { +public: + typedef GenericObject ConstObject; + typedef GenericObject Object; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator + typedef GenericMemberIterator ConstMemberIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename ValueType::Ch Ch; + + template + friend class GenericValue; + + GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} + GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } + ~GenericObject() {} + + SizeType MemberCount() const { return value_.MemberCount(); } + SizeType MemberCapacity() const { return value_.MemberCapacity(); } + bool ObjectEmpty() const { return value_.ObjectEmpty(); } + template ValueType& operator[](T* name) const { return value_[name]; } + template ValueType& operator[](const GenericValue& name) const { return value_[name]; } +#if RAPIDJSON_HAS_STDSTRING + ValueType& operator[](const std::basic_string& name) const { return value_[name]; } +#endif + MemberIterator MemberBegin() const { return value_.MemberBegin(); } + MemberIterator MemberEnd() const { return value_.MemberEnd(); } + GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const { value_.MemberReserve(newCapacity, allocator); return *this; } + bool HasMember(const Ch* name) const { return value_.HasMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } +#endif + template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } + MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } + template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } +#if RAPIDJSON_HAS_STDSTRING + MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } +#endif + GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_STDSTRING + GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + void RemoveAllMembers() { value_.RemoveAllMembers(); } + bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } +#endif + template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } + MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } + MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } + bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } +#endif + template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + MemberIterator begin() const { return value_.MemberBegin(); } + MemberIterator end() const { return value_.MemberEnd(); } +#endif + +private: + GenericObject(); + GenericObject(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/encodedstream.h b/3rdparty/rapidjson/include/rapidjson/encodedstream.h new file mode 100644 index 0000000000..223601c059 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/encodedstream.h @@ -0,0 +1,299 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ENCODEDSTREAM_H_ +#define RAPIDJSON_ENCODEDSTREAM_H_ + +#include "stream.h" +#include "memorystream.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Input byte stream wrapper with a statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileReadStream. +*/ +template +class EncodedInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedInputStream(InputByteStream& is) : is_(is) { + current_ = Encoding::TakeBOM(is_); + } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); + + InputByteStream& is_; + Ch current_; +}; + +//! Specialized for UTF8 MemoryStream. +template <> +class EncodedInputStream, MemoryStream> { +public: + typedef UTF8<>::Ch Ch; + + EncodedInputStream(MemoryStream& is) : is_(is) { + if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); + } + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) {} + void Flush() {} + Ch* PutBegin() { return 0; } + size_t PutEnd(Ch*) { return 0; } + + MemoryStream& is_; + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); +}; + +//! Output byte stream wrapper with statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. +*/ +template +class EncodedOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { + if (putBOM) + Encoding::PutBOM(os_); + } + + void Put(Ch c) { Encoding::Put(os_, c); } + void Flush() { os_.Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedOutputStream(const EncodedOutputStream&); + EncodedOutputStream& operator=(const EncodedOutputStream&); + + OutputByteStream& os_; +}; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + +//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for reading. + \tparam InputByteStream type of input byte stream to be wrapped. +*/ +template +class AutoUTFInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param is input stream to be wrapped. + \param type UTF encoding type if it is not detected from the stream. + */ + AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + DetectType(); + static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; + takeFunc_ = f[type_]; + current_ = takeFunc_(*is_); + } + + UTFType GetType() const { return type_; } + bool HasBOM() const { return hasBOM_; } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } + size_t Tell() const { return is_->Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFInputStream(const AutoUTFInputStream&); + AutoUTFInputStream& operator=(const AutoUTFInputStream&); + + // Detect encoding type with BOM or RFC 4627 + void DetectType() { + // BOM (Byte Order Mark): + // 00 00 FE FF UTF-32BE + // FF FE 00 00 UTF-32LE + // FE FF UTF-16BE + // FF FE UTF-16LE + // EF BB BF UTF-8 + + const unsigned char* c = reinterpret_cast(is_->Peek4()); + if (!c) + return; + + unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); + hasBOM_ = false; + if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } + + // RFC 4627: Section 3 + // "Since the first two characters of a JSON text will always be ASCII + // characters [RFC0020], it is possible to determine whether an octet + // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + // at the pattern of nulls in the first four octets." + // 00 00 00 xx UTF-32BE + // 00 xx 00 xx UTF-16BE + // xx 00 00 00 UTF-32LE + // xx 00 xx 00 UTF-16LE + // xx xx xx xx UTF-8 + + if (!hasBOM_) { + int pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); + switch (pattern) { + case 0x08: type_ = kUTF32BE; break; + case 0x0A: type_ = kUTF16BE; break; + case 0x01: type_ = kUTF32LE; break; + case 0x05: type_ = kUTF16LE; break; + case 0x0F: type_ = kUTF8; break; + default: break; // Use type defined by user. + } + } + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + } + + typedef Ch (*TakeFunc)(InputByteStream& is); + InputByteStream* is_; + UTFType type_; + Ch current_; + TakeFunc takeFunc_; + bool hasBOM_; +}; + +//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for writing. + \tparam OutputByteStream type of output byte stream to be wrapped. +*/ +template +class AutoUTFOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param os output stream to be wrapped. + \param type UTF encoding type. + \param putBOM Whether to write BOM at the beginning of the stream. + */ + AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + + static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; + putFunc_ = f[type_]; + + if (putBOM) + PutBOM(); + } + + UTFType GetType() const { return type_; } + + void Put(Ch c) { putFunc_(*os_, c); } + void Flush() { os_->Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFOutputStream(const AutoUTFOutputStream&); + AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); + + void PutBOM() { + typedef void (*PutBOMFunc)(OutputByteStream&); + static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; + f[type_](*os_); + } + + typedef void (*PutFunc)(OutputByteStream&, Ch); + + OutputByteStream* os_; + UTFType type_; + PutFunc putFunc_; +}; + +#undef RAPIDJSON_ENCODINGS_FUNC + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/encodings.h b/3rdparty/rapidjson/include/rapidjson/encodings.h new file mode 100644 index 0000000000..0b24467950 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/encodings.h @@ -0,0 +1,716 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ENCODINGS_H_ +#define RAPIDJSON_ENCODINGS_H_ + +#include "rapidjson.h" + +#if defined(_MSC_VER) && !defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(overflow) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. + + enum { supportUnicode = 1 }; // or 0 if not supporting unicode + + //! \brief Encode a Unicode codepoint to an output stream. + //! \param os Output stream. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + template + static void Encode(OutputStream& os, unsigned codepoint); + + //! \brief Decode a Unicode codepoint from an input stream. + //! \param is Input stream. + //! \param codepoint Output of the unicode codepoint. + //! \return true if a valid codepoint can be decoded from the stream. + template + static bool Decode(InputStream& is, unsigned* codepoint); + + //! \brief Validate one Unicode codepoint from an encoded stream. + //! \param is Input stream to obtain codepoint. + //! \param os Output for copying one codepoint. + //! \return true if it is valid. + //! \note This function just validating and copying the codepoint without actually decode it. + template + static bool Validate(InputStream& is, OutputStream& os); + + // The following functions are deal with byte streams. + + //! Take a character from input byte stream, skip BOM if exist. + template + static CharType TakeBOM(InputByteStream& is); + + //! Take a character from input byte stream. + template + static Ch Take(InputByteStream& is); + + //! Put BOM to output byte stream. + template + static void PutBOM(OutputByteStream& os); + + //! Put a character to output byte stream. + template + static void Put(OutputByteStream& os, Ch c); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + http://tools.ietf.org/html/rfc3629 + \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. + \note implements Encoding concept +*/ +template +struct UTF8 { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + os.Put(static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + PutUnsafe(os, static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { +#define RAPIDJSON_COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) +#define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) + typename InputStream::Ch c = is.Take(); + if (!(c & 0x80)) { + *codepoint = static_cast(c); + return true; + } + + unsigned char type = GetRange(static_cast(c)); + if (type >= 32) { + *codepoint = 0; + } else { + *codepoint = (0xFFu >> type) & static_cast(c); + } + bool result = true; + switch (type) { + case 2: RAPIDJSON_TAIL(); return result; + case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; + case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; + case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + default: return false; + } +#undef RAPIDJSON_COPY +#undef RAPIDJSON_TRANS +#undef RAPIDJSON_TAIL + } + + template + static bool Validate(InputStream& is, OutputStream& os) { +#define RAPIDJSON_COPY() os.Put(c = is.Take()) +#define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70) + Ch c; + RAPIDJSON_COPY(); + if (!(c & 0x80)) + return true; + + bool result = true; + switch (GetRange(static_cast(c))) { + case 2: RAPIDJSON_TAIL(); return result; + case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); return result; + case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); return result; + case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); return result; + default: return false; + } +#undef RAPIDJSON_COPY +#undef RAPIDJSON_TRANS +#undef RAPIDJSON_TAIL + } + + static unsigned char GetRange(unsigned char c) { + // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. + static const unsigned char type[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + }; + return type[c]; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + typename InputByteStream::Ch c = Take(is); + if (static_cast(c) != 0xEFu) return c; + c = is.Take(); + if (static_cast(c) != 0xBBu) return c; + c = is.Take(); + if (static_cast(c) != 0xBFu) return c; + c = is.Take(); + return c; + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xEFu)); + os.Put(static_cast(0xBBu)); + os.Put(static_cast(0xBFu)); + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + http://tools.ietf.org/html/rfc2781 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF16LE and UTF16BE, which handle endianness. +*/ +template +struct UTF16 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + os.Put(static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + os.Put(static_cast((v >> 10) | 0xD800)); + os.Put(static_cast((v & 0x3FF) | 0xDC00)); + } + } + + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + PutUnsafe(os, static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + PutUnsafe(os, static_cast((v >> 10) | 0xD800)); + PutUnsafe(os, static_cast((v & 0x3FF) | 0xDC00)); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + typename InputStream::Ch c = is.Take(); + if (c < 0xD800 || c > 0xDFFF) { + *codepoint = static_cast(c); + return true; + } + else if (c <= 0xDBFF) { + *codepoint = (static_cast(c) & 0x3FF) << 10; + c = is.Take(); + *codepoint |= (static_cast(c) & 0x3FF); + *codepoint += 0x10000; + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + typename InputStream::Ch c; + os.Put(static_cast(c = is.Take())); + if (c < 0xD800 || c > 0xDFFF) + return true; + else if (c <= 0xDBFF) { + os.Put(c = is.Take()); + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } +}; + +//! UTF-16 little endian encoding. +template +struct UTF16LE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(static_cast(c) & 0xFFu)); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + } +}; + +//! UTF-16 big endian encoding. +template +struct UTF16BE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + os.Put(static_cast(static_cast(c) & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF32LE and UTF32BE, which handle endianness. +*/ +template +struct UTF32 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(codepoint); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, codepoint); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c = is.Take(); + *codepoint = c; + return c <= 0x10FFFF; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c; + os.Put(c = is.Take()); + return c <= 0x10FFFF; + } +}; + +//! UTF-32 little endian enocoding. +template +struct UTF32LE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 24; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 24) & 0xFFu)); + } +}; + +//! UTF-32 big endian encoding. +template +struct UTF32BE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 24; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((c >> 24) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast(c & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// ASCII + +//! ASCII encoding. +/*! http://en.wikipedia.org/wiki/ASCII + \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. + \note implements Encoding concept +*/ +template +struct ASCII { + typedef CharType Ch; + + enum { supportUnicode = 0 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + os.Put(static_cast(codepoint & 0xFF)); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + PutUnsafe(os, static_cast(codepoint & 0xFF)); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + uint8_t c = static_cast(is.Take()); + *codepoint = c; + return c <= 0X7F; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + uint8_t c = static_cast(is.Take()); + os.Put(static_cast(c)); + return c <= 0x7F; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + uint8_t c = static_cast(Take(is)); + return static_cast(c); + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + (void)os; + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// AutoUTF + +//! Runtime-specified UTF encoding type of a stream. +enum UTFType { + kUTF8 = 0, //!< UTF-8. + kUTF16LE = 1, //!< UTF-16 little endian. + kUTF16BE = 2, //!< UTF-16 big endian. + kUTF32LE = 3, //!< UTF-32 little endian. + kUTF32BE = 4 //!< UTF-32 big endian. +}; + +//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. +/*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). +*/ +template +struct AutoUTF { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + + template + static RAPIDJSON_FORCEINLINE void Encode(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; + (*f[os.GetType()])(os, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE bool Decode(InputStream& is, unsigned* codepoint) { + typedef bool (*DecodeFunc)(InputStream&, unsigned*); + static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; + return (*f[is.GetType()])(is, codepoint); + } + + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + typedef bool (*ValidateFunc)(InputStream&, OutputStream&); + static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; + return (*f[is.GetType()])(is, os); + } + +#undef RAPIDJSON_ENCODINGS_FUNC +}; + +/////////////////////////////////////////////////////////////////////////////// +// Transcoder + +//! Encoding conversion. +template +struct Transcoder { + //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. + template + static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::Encode(os, codepoint); + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::EncodeUnsafe(os, codepoint); + return true; + } + + //! Validate one Unicode codepoint from an encoded stream. + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Transcode(is, os); // Since source/target encoding is different, must transcode. + } +}; + +// Forward declaration. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c); + +//! Specialization of Transcoder with same source and target encoding. +template +struct Transcoder { + template + static RAPIDJSON_FORCEINLINE bool Transcode(InputStream& is, OutputStream& os) { + os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + static RAPIDJSON_FORCEINLINE bool Validate(InputStream& is, OutputStream& os) { + return Encoding::Validate(is, os); // source/target encoding are the same + } +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__)) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/error/en.h b/3rdparty/rapidjson/include/rapidjson/error/en.h new file mode 100644 index 0000000000..2db838bff2 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/error/en.h @@ -0,0 +1,74 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ERROR_EN_H_ +#define RAPIDJSON_ERROR_EN_H_ + +#include "error.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(covered-switch-default) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Maps error code of parsing into error message. +/*! + \ingroup RAPIDJSON_ERRORS + \param parseErrorCode Error code obtained in parsing. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { + switch (parseErrorCode) { + case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); + + case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); + case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); + + case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); + + case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); + case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); + case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); + + case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); + + case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); + case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); + case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); + case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); + case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); + + case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); + case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); + case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); + + case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); + case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); + + default: return RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_EN_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/error/error.h b/3rdparty/rapidjson/include/rapidjson/error/error.h new file mode 100644 index 0000000000..9311d2f03b --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/error/error.h @@ -0,0 +1,161 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ERROR_ERROR_H_ +#define RAPIDJSON_ERROR_ERROR_H_ + +#include "../rapidjson.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +/*! \file error.h */ + +/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_CHARTYPE + +//! Character type of error messages. +/*! \ingroup RAPIDJSON_ERRORS + The default character type is \c char. + On Windows, user can define this macro as \c TCHAR for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_CHARTYPE +#define RAPIDJSON_ERROR_CHARTYPE char +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_STRING + +//! Macro for converting string literial to \ref RAPIDJSON_ERROR_CHARTYPE[]. +/*! \ingroup RAPIDJSON_ERRORS + By default this conversion macro does nothing. + On Windows, user can define this macro as \c _T(x) for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_STRING +#define RAPIDJSON_ERROR_STRING(x) x +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseErrorCode + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericReader::Parse, GenericReader::GetParseErrorCode +*/ +enum ParseErrorCode { + kParseErrorNone = 0, //!< No error. + + kParseErrorDocumentEmpty, //!< The document is empty. + kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. + + kParseErrorValueInvalid, //!< Invalid value. + + kParseErrorObjectMissName, //!< Missing a name for object member. + kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. + kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. + + kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. + + kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. + kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. + kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. + kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. + kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. + + kParseErrorNumberTooBig, //!< Number too big to be stored in double. + kParseErrorNumberMissFraction, //!< Miss fraction part in number. + kParseErrorNumberMissExponent, //!< Miss exponent in number. + + kParseErrorTermination, //!< Parsing was terminated. + kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. +}; + +//! Result of parsing (wraps ParseErrorCode) +/*! + \ingroup RAPIDJSON_ERRORS + \code + Document doc; + ParseResult ok = doc.Parse("[42]"); + if (!ok) { + fprintf(stderr, "JSON parse error: %s (%u)", + GetParseError_En(ok.Code()), ok.Offset()); + exit(EXIT_FAILURE); + } + \endcode + \see GenericReader::Parse, GenericDocument::Parse +*/ +struct ParseResult { + //!! Unspecified boolean type + typedef bool (ParseResult::*BooleanType)() const; +public: + //! Default constructor, no error. + ParseResult() : code_(kParseErrorNone), offset_(0) {} + //! Constructor to set an error. + ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} + + //! Get the error code. + ParseErrorCode Code() const { return code_; } + //! Get the error offset, if \ref IsError(), 0 otherwise. + size_t Offset() const { return offset_; } + + //! Explicit conversion to \c bool, returns \c true, iff !\ref IsError(). + operator BooleanType() const { return !IsError() ? &ParseResult::IsError : NULL; } + //! Whether the result is an error. + bool IsError() const { return code_ != kParseErrorNone; } + + bool operator==(const ParseResult& that) const { return code_ == that.code_; } + bool operator==(ParseErrorCode code) const { return code_ == code; } + friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } + + bool operator!=(const ParseResult& that) const { return !(*this == that); } + bool operator!=(ParseErrorCode code) const { return !(*this == code); } + friend bool operator!=(ParseErrorCode code, const ParseResult & err) { return err != code; } + + //! Reset error code. + void Clear() { Set(kParseErrorNone); } + //! Update error code and offset. + void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } + +private: + ParseErrorCode code_; + size_t offset_; +}; + +//! Function pointer type of GetParseError(). +/*! \ingroup RAPIDJSON_ERRORS + + This is the prototype for \c GetParseError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetParseErrorFunc GetParseError = GetParseError_En; // or whatever + const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); +\endcode +*/ +typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_ERROR_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/filereadstream.h b/3rdparty/rapidjson/include/rapidjson/filereadstream.h new file mode 100644 index 0000000000..6b343707ad --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/filereadstream.h @@ -0,0 +1,99 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_FILEREADSTREAM_H_ +#define RAPIDJSON_FILEREADSTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! File byte stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileReadStream { +public: + typedef char Ch; //!< Character type (byte). + + //! Constructor. + /*! + \param fp File pointer opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(fp_ != 0); + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; + } + +private: + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = std::fread(buffer_, 1, bufferSize_, fp_); + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (readCount_ < bufferSize_) { + buffer_[readCount_] = '\0'; + ++bufferLast_; + eof_ = true; + } + } + } + + std::FILE* fp_; + Ch *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/filewritestream.h b/3rdparty/rapidjson/include/rapidjson/filewritestream.h new file mode 100644 index 0000000000..8b48fee197 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/filewritestream.h @@ -0,0 +1,104 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_FILEWRITESTREAM_H_ +#define RAPIDJSON_FILEWRITESTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of C file stream for output using fwrite(). +/*! + \note implements Stream concept +*/ +class FileWriteStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { + RAPIDJSON_ASSERT(fp_ != 0); + } + + void Put(char c) { + if (current_ >= bufferEnd_) + Flush(); + + *current_++ = c; + } + + void PutN(char c, size_t n) { + size_t avail = static_cast(bufferEnd_ - current_); + while (n > avail) { + std::memset(current_, c, avail); + current_ += avail; + Flush(); + n -= avail; + avail = static_cast(bufferEnd_ - current_); + } + + if (n > 0) { + std::memset(current_, c, n); + current_ += n; + } + } + + void Flush() { + if (current_ != buffer_) { + size_t result = std::fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); + if (result < static_cast(current_ - buffer_)) { + // failure deliberately ignored at this time + // added to avoid warn_unused_result build errors + } + current_ = buffer_; + } + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileWriteStream(const FileWriteStream&); + FileWriteStream& operator=(const FileWriteStream&); + + std::FILE* fp_; + char *buffer_; + char *bufferEnd_; + char *current_; +}; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(FileWriteStream& stream, char c, size_t n) { + stream.PutN(c, n); +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/fwd.h b/3rdparty/rapidjson/include/rapidjson/fwd.h new file mode 100644 index 0000000000..b74a2b8198 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/fwd.h @@ -0,0 +1,151 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_FWD_H_ +#define RAPIDJSON_FWD_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +// encodings.h + +template struct UTF8; +template struct UTF16; +template struct UTF16BE; +template struct UTF16LE; +template struct UTF32; +template struct UTF32BE; +template struct UTF32LE; +template struct ASCII; +template struct AutoUTF; + +template +struct Transcoder; + +// allocators.h + +class CrtAllocator; + +template +class MemoryPoolAllocator; + +// stream.h + +template +struct GenericStringStream; + +typedef GenericStringStream > StringStream; + +template +struct GenericInsituStringStream; + +typedef GenericInsituStringStream > InsituStringStream; + +// stringbuffer.h + +template +class GenericStringBuffer; + +typedef GenericStringBuffer, CrtAllocator> StringBuffer; + +// filereadstream.h + +class FileReadStream; + +// filewritestream.h + +class FileWriteStream; + +// memorybuffer.h + +template +struct GenericMemoryBuffer; + +typedef GenericMemoryBuffer MemoryBuffer; + +// memorystream.h + +struct MemoryStream; + +// reader.h + +template +struct BaseReaderHandler; + +template +class GenericReader; + +typedef GenericReader, UTF8, CrtAllocator> Reader; + +// writer.h + +template +class Writer; + +// prettywriter.h + +template +class PrettyWriter; + +// document.h + +template +class GenericMember; + +template +class GenericMemberIterator; + +template +struct GenericStringRef; + +template +class GenericValue; + +typedef GenericValue, MemoryPoolAllocator > Value; + +template +class GenericDocument; + +typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; + +// pointer.h + +template +class GenericPointer; + +typedef GenericPointer Pointer; + +// schema.h + +template +class IGenericRemoteSchemaDocumentProvider; + +template +class GenericSchemaDocument; + +typedef GenericSchemaDocument SchemaDocument; +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +template < + typename SchemaDocumentType, + typename OutputHandler, + typename StateAllocator> +class GenericSchemaValidator; + +typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSONFWD_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/biginteger.h b/3rdparty/rapidjson/include/rapidjson/internal/biginteger.h new file mode 100644 index 0000000000..8eb87c7c0f --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/biginteger.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_BIGINTEGER_H_ +#define RAPIDJSON_BIGINTEGER_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_M_AMD64) +#include // for _umul128 +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class BigInteger { +public: + typedef uint64_t Type; + + BigInteger(const BigInteger& rhs) : count_(rhs.count_) { + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + + explicit BigInteger(uint64_t u) : count_(1) { + digits_[0] = u; + } + + BigInteger(const char* decimals, size_t length) : count_(1) { + RAPIDJSON_ASSERT(length > 0); + digits_[0] = 0; + size_t i = 0; + const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 + while (length >= kMaxDigitPerIteration) { + AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); + length -= kMaxDigitPerIteration; + i += kMaxDigitPerIteration; + } + + if (length > 0) + AppendDecimal64(decimals + i, decimals + i + length); + } + + BigInteger& operator=(const BigInteger &rhs) + { + if (this != &rhs) { + count_ = rhs.count_; + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + return *this; + } + + BigInteger& operator=(uint64_t u) { + digits_[0] = u; + count_ = 1; + return *this; + } + + BigInteger& operator+=(uint64_t u) { + Type backup = digits_[0]; + digits_[0] += u; + for (size_t i = 0; i < count_ - 1; i++) { + if (digits_[i] >= backup) + return *this; // no carry + backup = digits_[i + 1]; + digits_[i + 1] += 1; + } + + // Last carry + if (digits_[count_ - 1] < backup) + PushBack(1); + + return *this; + } + + BigInteger& operator*=(uint64_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + uint64_t hi; + digits_[i] = MulAdd64(digits_[i], u, k, &hi); + k = hi; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator*=(uint32_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + const uint64_t c = digits_[i] >> 32; + const uint64_t d = digits_[i] & 0xFFFFFFFF; + const uint64_t uc = u * c; + const uint64_t ud = u * d; + const uint64_t p0 = ud + k; + const uint64_t p1 = uc + (p0 >> 32); + digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); + k = p1 >> 32; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator<<=(size_t shift) { + if (IsZero() || shift == 0) return *this; + + size_t offset = shift / kTypeBit; + size_t interShift = shift % kTypeBit; + RAPIDJSON_ASSERT(count_ + offset <= kCapacity); + + if (interShift == 0) { + std::memmove(digits_ + offset, digits_, count_ * sizeof(Type)); + count_ += offset; + } + else { + digits_[count_] = 0; + for (size_t i = count_; i > 0; i--) + digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); + digits_[offset] = digits_[0] << interShift; + count_ += offset; + if (digits_[count_]) + count_++; + } + + std::memset(digits_, 0, offset * sizeof(Type)); + + return *this; + } + + bool operator==(const BigInteger& rhs) const { + return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; + } + + bool operator==(const Type rhs) const { + return count_ == 1 && digits_[0] == rhs; + } + + BigInteger& MultiplyPow5(unsigned exp) { + static const uint32_t kPow5[12] = { + 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 * 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 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 + }; + if (exp == 0) return *this; + for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 + for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 + if (exp > 0) *this *= kPow5[exp - 1]; + return *this; + } + + // Compute absolute difference of this and rhs. + // Assume this != rhs + bool Difference(const BigInteger& rhs, BigInteger* out) const { + int cmp = Compare(rhs); + RAPIDJSON_ASSERT(cmp != 0); + const BigInteger *a, *b; // Makes a > b + bool ret; + if (cmp < 0) { a = &rhs; b = this; ret = true; } + else { a = this; b = &rhs; ret = false; } + + Type borrow = 0; + for (size_t i = 0; i < a->count_; i++) { + Type d = a->digits_[i] - borrow; + if (i < b->count_) + d -= b->digits_[i]; + borrow = (d > a->digits_[i]) ? 1 : 0; + out->digits_[i] = d; + if (d != 0) + out->count_ = i + 1; + } + + return ret; + } + + int Compare(const BigInteger& rhs) const { + if (count_ != rhs.count_) + return count_ < rhs.count_ ? -1 : 1; + + for (size_t i = count_; i-- > 0;) + if (digits_[i] != rhs.digits_[i]) + return digits_[i] < rhs.digits_[i] ? -1 : 1; + + return 0; + } + + size_t GetCount() const { return count_; } + Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } + bool IsZero() const { return count_ == 1 && digits_[0] == 0; } + +private: + void AppendDecimal64(const char* begin, const char* end) { + uint64_t u = ParseUint64(begin, end); + if (IsZero()) + *this = u; + else { + unsigned exp = static_cast(end - begin); + (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u + } + } + + void PushBack(Type digit) { + RAPIDJSON_ASSERT(count_ < kCapacity); + digits_[count_++] = digit; + } + + static uint64_t ParseUint64(const char* begin, const char* end) { + uint64_t r = 0; + for (const char* p = begin; p != end; ++p) { + RAPIDJSON_ASSERT(*p >= '0' && *p <= '9'); + r = r * 10u + static_cast(*p - '0'); + } + return r; + } + + // Assume a * b + k < 2^128 + static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t low = _umul128(a, b, outHigh) + k; + if (low < k) + (*outHigh)++; + return low; +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(a) * static_cast(b); + p += k; + *outHigh = static_cast(p >> 64); + return static_cast(p); +#else + const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; + uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; + x1 += (x0 >> 32); // can't give carry + x1 += x2; + if (x1 < x2) + x3 += (static_cast(1) << 32); + uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); + uint64_t hi = x3 + (x1 >> 32); + + lo += k; + if (lo < k) + hi++; + *outHigh = hi; + return lo; +#endif + } + + static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 + static const size_t kCapacity = kBitCount / sizeof(Type); + static const size_t kTypeBit = sizeof(Type) * 8; + + Type digits_[kCapacity]; + size_t count_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_BIGINTEGER_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/clzll.h b/3rdparty/rapidjson/include/rapidjson/internal/clzll.h new file mode 100644 index 0000000000..6cd7923492 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/clzll.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_CLZLL_H_ +#define RAPIDJSON_CLZLL_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) +#include +#if defined(_WIN64) +#pragma intrinsic(_BitScanReverse64) +#else +#pragma intrinsic(_BitScanReverse) +#endif +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline uint32_t clzll(uint64_t x) { + // Passing 0 to __builtin_clzll is UB in GCC and results in an + // infinite loop in the software implementation. + RAPIDJSON_ASSERT(x != 0); + +#if defined(_MSC_VER) + unsigned long r = 0; +#if defined(_WIN64) + _BitScanReverse64(&r, x); +#else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) + return 63 - (r + 32); + + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x & 0xFFFFFFFF)); +#endif // _WIN64 + + return 63 - r; +#elif (defined(__GNUC__) && __GNUC__ >= 4) || RAPIDJSON_HAS_BUILTIN(__builtin_clzll) + // __builtin_clzll wrapper + return static_cast(__builtin_clzll(x)); +#else + // naive version + uint32_t r; + while (!(x & (static_cast(1) << 63))) { + x <<= 1; + ++r; + } + + return r; +#endif // _MSC_VER +} + +#define RAPIDJSON_CLZLL RAPIDJSON_NAMESPACE::internal::clzll + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_CLZLL_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/diyfp.h b/3rdparty/rapidjson/include/rapidjson/internal/diyfp.h new file mode 100644 index 0000000000..8f7d853a35 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/diyfp.h @@ -0,0 +1,257 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DIYFP_H_ +#define RAPIDJSON_DIYFP_H_ + +#include "../rapidjson.h" +#include "clzll.h" +#include + +#if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER) +#include +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +struct DiyFp { + DiyFp() : f(), e() {} + + DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} + + explicit DiyFp(double d) { + union { + double d; + uint64_t u64; + } u = { d }; + + int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); + uint64_t significand = (u.u64 & kDpSignificandMask); + if (biased_e != 0) { + f = significand + kDpHiddenBit; + e = biased_e - kDpExponentBias; + } + else { + f = significand; + e = kDpMinExponent + 1; + } + } + + DiyFp operator-(const DiyFp& rhs) const { + return DiyFp(f - rhs.f, e); + } + + DiyFp operator*(const DiyFp& rhs) const { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t h; + uint64_t l = _umul128(f, rhs.f, &h); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(f) * static_cast(rhs.f); + uint64_t h = static_cast(p >> 64); + uint64_t l = static_cast(p); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#else + const uint64_t M32 = 0xFFFFFFFF; + const uint64_t a = f >> 32; + const uint64_t b = f & M32; + const uint64_t c = rhs.f >> 32; + const uint64_t d = rhs.f & M32; + const uint64_t ac = a * c; + const uint64_t bc = b * c; + const uint64_t ad = a * d; + const uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); + tmp += 1U << 31; /// mult_round + return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); +#endif + } + + DiyFp Normalize() const { + int s = static_cast(clzll(f)); + return DiyFp(f << s, e - s); + } + + DiyFp NormalizeBoundary() const { + DiyFp res = *this; + while (!(res.f & (kDpHiddenBit << 1))) { + res.f <<= 1; + res.e--; + } + res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); + res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); + return res; + } + + void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { + DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); + DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); + mi.f <<= mi.e - pl.e; + mi.e = pl.e; + *plus = pl; + *minus = mi; + } + + double ToDouble() const { + union { + double d; + uint64_t u64; + }u; + RAPIDJSON_ASSERT(f <= kDpHiddenBit + kDpSignificandMask); + if (e < kDpDenormalExponent) { + // Underflow. + return 0.0; + } + if (e >= kDpMaxExponent) { + // Overflow. + return std::numeric_limits::infinity(); + } + const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : + static_cast(e + kDpExponentBias); + u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); + return u.d; + } + + static const int kDiySignificandSize = 64; + static const int kDpSignificandSize = 52; + static const int kDpExponentBias = 0x3FF + kDpSignificandSize; + static const int kDpMaxExponent = 0x7FF - kDpExponentBias; + static const int kDpMinExponent = -kDpExponentBias; + static const int kDpDenormalExponent = -kDpExponentBias + 1; + static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + uint64_t f; + int e; +}; + +inline DiyFp GetCachedPowerByIndex(size_t index) { + // 10^-348, 10^-340, ..., 10^340 + static const uint64_t kCachedPowers_F[] = { + RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), + RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), + RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), + RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), + RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), + RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), + RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), + RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), + RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), + RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), + RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), + RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), + RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), + RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), + RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), + RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), + RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), + RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), + RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), + RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), + RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), + RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), + RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), + RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), + RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), + RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), + RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), + RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), + RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), + RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), + RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), + RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), + RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), + RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), + RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), + RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), + RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), + RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), + RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), + RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), + RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), + RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), + RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), + RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) + }; + static const int16_t kCachedPowers_E[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, + -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, + -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, + -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, + -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, + 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, + 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, + 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, + 907, 933, 960, 986, 1013, 1039, 1066 + }; + RAPIDJSON_ASSERT(index < 87); + return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); +} + +inline DiyFp GetCachedPower(int e, int* K) { + + //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; + double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive + int k = static_cast(dk); + if (dk - k > 0.0) + k++; + + unsigned index = static_cast((k >> 3) + 1); + *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table + + return GetCachedPowerByIndex(index); +} + +inline DiyFp GetCachedPower10(int exp, int *outExp) { + RAPIDJSON_ASSERT(exp >= -348); + unsigned index = static_cast(exp + 348) / 8u; + *outExp = -348 + static_cast(index) * 8; + return GetCachedPowerByIndex(index); +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +RAPIDJSON_DIAG_OFF(padded) +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DIYFP_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/dtoa.h b/3rdparty/rapidjson/include/rapidjson/internal/dtoa.h new file mode 100644 index 0000000000..bf2e9b2e59 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/dtoa.h @@ -0,0 +1,245 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DTOA_ +#define RAPIDJSON_DTOA_ + +#include "itoa.h" // GetDigitsLut() +#include "diyfp.h" +#include "ieee754.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 +#endif + +inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { + while (rest < wp_w && delta - rest >= ten_kappa && + (rest + ten_kappa < wp_w || /// closer + wp_w - rest > rest + ten_kappa - wp_w)) { + buffer[len - 1]--; + rest += ten_kappa; + } +} + +inline int CountDecimalDigit32(uint32_t n) { + // Simple pure C++ implementation was faster than __builtin_clz version in this situation. + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + // Will not reach 10 digits in DigitGen() + //if (n < 1000000000) return 9; + //return 10; + return 9; +} + +inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { + static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); + const DiyFp wp_w = Mp - W; + uint32_t p1 = static_cast(Mp.f >> -one.e); + uint64_t p2 = Mp.f & (one.f - 1); + int kappa = CountDecimalDigit32(p1); // kappa in [0, 9] + *len = 0; + + while (kappa > 0) { + uint32_t d = 0; + switch (kappa) { + case 9: d = p1 / 100000000; p1 %= 100000000; break; + case 8: d = p1 / 10000000; p1 %= 10000000; break; + case 7: d = p1 / 1000000; p1 %= 1000000; break; + case 6: d = p1 / 100000; p1 %= 100000; break; + case 5: d = p1 / 10000; p1 %= 10000; break; + case 4: d = p1 / 1000; p1 %= 1000; break; + case 3: d = p1 / 100; p1 %= 100; break; + case 2: d = p1 / 10; p1 %= 10; break; + case 1: d = p1; p1 = 0; break; + default:; + } + if (d || *len) + buffer[(*len)++] = static_cast('0' + static_cast(d)); + kappa--; + uint64_t tmp = (static_cast(p1) << -one.e) + p2; + if (tmp <= delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, tmp, static_cast(kPow10[kappa]) << -one.e, wp_w.f); + return; + } + } + + // kappa = 0 + for (;;) { + p2 *= 10; + delta *= 10; + char d = static_cast(p2 >> -one.e); + if (d || *len) + buffer[(*len)++] = static_cast('0' + d); + p2 &= one.f - 1; + kappa--; + if (p2 < delta) { + *K += kappa; + int index = -kappa; + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[index] : 0)); + return; + } + } +} + +inline void Grisu2(double value, char* buffer, int* length, int* K) { + const DiyFp v(value); + DiyFp w_m, w_p; + v.NormalizedBoundaries(&w_m, &w_p); + + const DiyFp c_mk = GetCachedPower(w_p.e, K); + const DiyFp W = v.Normalize() * c_mk; + DiyFp Wp = w_p * c_mk; + DiyFp Wm = w_m * c_mk; + Wm.f++; + Wp.f--; + DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); +} + +inline char* WriteExponent(int K, char* buffer) { + if (K < 0) { + *buffer++ = '-'; + K = -K; + } + + if (K >= 100) { + *buffer++ = static_cast('0' + static_cast(K / 100)); + K %= 100; + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else if (K >= 10) { + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else + *buffer++ = static_cast('0' + static_cast(K)); + + return buffer; +} + +inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { + const int kk = length + k; // 10^(kk-1) <= v < 10^kk + + if (0 <= k && kk <= 21) { + // 1234e7 -> 12340000000 + for (int i = length; i < kk; i++) + buffer[i] = '0'; + buffer[kk] = '.'; + buffer[kk + 1] = '0'; + return &buffer[kk + 2]; + } + else if (0 < kk && kk <= 21) { + // 1234e-2 -> 12.34 + std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); + buffer[kk] = '.'; + if (0 > k + maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[kk + 2]; // Reserve one zero + } + else + return &buffer[length + 1]; + } + else if (-6 < kk && kk <= 0) { + // 1234e-6 -> 0.001234 + const int offset = 2 - kk; + std::memmove(&buffer[offset], &buffer[0], static_cast(length)); + buffer[0] = '0'; + buffer[1] = '.'; + for (int i = 2; i < offset; i++) + buffer[i] = '0'; + if (length - kk > maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = maxDecimalPlaces + 1; i > 2; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[3]; // Reserve one zero + } + else + return &buffer[length + offset]; + } + else if (kk < -maxDecimalPlaces) { + // Truncate to zero + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else if (length == 1) { + // 1e30 + buffer[1] = 'e'; + return WriteExponent(kk - 1, &buffer[2]); + } + else { + // 1234e30 -> 1.234e33 + std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); + buffer[1] = '.'; + buffer[length + 1] = 'e'; + return WriteExponent(kk - 1, &buffer[0 + length + 2]); + } +} + +inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { + RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); + Double d(value); + if (d.IsZero()) { + if (d.Sign()) + *buffer++ = '-'; // -0.0, Issue #289 + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + int length, K; + Grisu2(value, buffer, &length, &K); + return Prettify(buffer, length, K, maxDecimalPlaces); + } +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DTOA_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/ieee754.h b/3rdparty/rapidjson/include/rapidjson/internal/ieee754.h new file mode 100644 index 0000000000..c2684ba2a3 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/ieee754.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_IEEE754_ +#define RAPIDJSON_IEEE754_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class Double { +public: + Double() {} + Double(double d) : d_(d) {} + Double(uint64_t u) : u_(u) {} + + double Value() const { return d_; } + uint64_t Uint64Value() const { return u_; } + + double NextPositiveDouble() const { + RAPIDJSON_ASSERT(!Sign()); + return Double(u_ + 1).Value(); + } + + bool Sign() const { return (u_ & kSignMask) != 0; } + uint64_t Significand() const { return u_ & kSignificandMask; } + int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } + + bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } + bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } + bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } + bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } + bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } + + uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } + int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } + uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } + + static int EffectiveSignificandSize(int order) { + if (order >= -1021) + return 53; + else if (order <= -1074) + return 0; + else + return order + 1074; + } + +private: + static const int kSignificandSize = 52; + static const int kExponentBias = 0x3FF; + static const int kDenormalExponent = 1 - kExponentBias; + static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); + static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + union { + double d_; + uint64_t u_; + }; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_IEEE754_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/itoa.h b/3rdparty/rapidjson/include/rapidjson/internal/itoa.h new file mode 100644 index 0000000000..9b1c45cc1b --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/itoa.h @@ -0,0 +1,308 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ITOA_ +#define RAPIDJSON_ITOA_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline const char* GetDigitsLut() { + static const char cDigitsLut[200] = { + '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', + '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', + '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', + '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', + '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', + '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', + '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', + '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', + '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', + '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' + }; + return cDigitsLut; +} + +inline char* u32toa(uint32_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + + const char* cDigitsLut = GetDigitsLut(); + + if (value < 10000) { + const uint32_t d1 = (value / 100) << 1; + const uint32_t d2 = (value % 100) << 1; + + if (value >= 1000) + *buffer++ = cDigitsLut[d1]; + if (value >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else if (value < 100000000) { + // value = bbbbcccc + const uint32_t b = value / 10000; + const uint32_t c = value % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + else { + // value = aabbbbcccc in decimal + + const uint32_t a = value / 100000000; // 1 to 42 + value %= 100000000; + + if (a >= 10) { + const unsigned i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else + *buffer++ = static_cast('0' + static_cast(a)); + + const uint32_t b = value / 10000; // 0 to 9999 + const uint32_t c = value % 10000; // 0 to 9999 + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + return buffer; +} + +inline char* i32toa(int32_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + uint32_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u32toa(u, buffer); +} + +inline char* u64toa(uint64_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + const char* cDigitsLut = GetDigitsLut(); + const uint64_t kTen8 = 100000000; + const uint64_t kTen9 = kTen8 * 10; + const uint64_t kTen10 = kTen8 * 100; + const uint64_t kTen11 = kTen8 * 1000; + const uint64_t kTen12 = kTen8 * 10000; + const uint64_t kTen13 = kTen8 * 100000; + const uint64_t kTen14 = kTen8 * 1000000; + const uint64_t kTen15 = kTen8 * 10000000; + const uint64_t kTen16 = kTen8 * kTen8; + + if (value < kTen8) { + uint32_t v = static_cast(value); + if (v < 10000) { + const uint32_t d1 = (v / 100) << 1; + const uint32_t d2 = (v % 100) << 1; + + if (v >= 1000) + *buffer++ = cDigitsLut[d1]; + if (v >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (v >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else { + // value = bbbbcccc + const uint32_t b = v / 10000; + const uint32_t c = v % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + } + else if (value < kTen16) { + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + if (value >= kTen15) + *buffer++ = cDigitsLut[d1]; + if (value >= kTen14) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= kTen13) + *buffer++ = cDigitsLut[d2]; + if (value >= kTen12) + *buffer++ = cDigitsLut[d2 + 1]; + if (value >= kTen11) + *buffer++ = cDigitsLut[d3]; + if (value >= kTen10) + *buffer++ = cDigitsLut[d3 + 1]; + if (value >= kTen9) + *buffer++ = cDigitsLut[d4]; + + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + else { + const uint32_t a = static_cast(value / kTen16); // 1 to 1844 + value %= kTen16; + + if (a < 10) + *buffer++ = static_cast('0' + static_cast(a)); + else if (a < 100) { + const uint32_t i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else if (a < 1000) { + *buffer++ = static_cast('0' + static_cast(a / 100)); + + const uint32_t i = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else { + const uint32_t i = (a / 100) << 1; + const uint32_t j = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + *buffer++ = cDigitsLut[j]; + *buffer++ = cDigitsLut[j + 1]; + } + + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + + return buffer; +} + +inline char* i64toa(int64_t value, char* buffer) { + RAPIDJSON_ASSERT(buffer != 0); + uint64_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u64toa(u, buffer); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ITOA_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/meta.h b/3rdparty/rapidjson/include/rapidjson/internal/meta.h new file mode 100644 index 0000000000..d401edf851 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/meta.h @@ -0,0 +1,186 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_META_H_ +#define RAPIDJSON_INTERNAL_META_H_ + +#include "../rapidjson.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(_MSC_VER) && !defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(6334) +#endif + +#if RAPIDJSON_HAS_CXX11_TYPETRAITS +#include +#endif + +//@cond RAPIDJSON_INTERNAL +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching +template struct Void { typedef void Type; }; + +/////////////////////////////////////////////////////////////////////////////// +// BoolType, TrueType, FalseType +// +template struct BoolType { + static const bool Value = Cond; + typedef BoolType Type; +}; +typedef BoolType TrueType; +typedef BoolType FalseType; + + +/////////////////////////////////////////////////////////////////////////////// +// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr +// + +template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; +template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; +template struct SelectIfCond : SelectIfImpl::template Apply {}; +template struct SelectIf : SelectIfCond {}; + +template struct AndExprCond : FalseType {}; +template <> struct AndExprCond : TrueType {}; +template struct OrExprCond : TrueType {}; +template <> struct OrExprCond : FalseType {}; + +template struct BoolExpr : SelectIf::Type {}; +template struct NotExpr : SelectIf::Type {}; +template struct AndExpr : AndExprCond::Type {}; +template struct OrExpr : OrExprCond::Type {}; + + +/////////////////////////////////////////////////////////////////////////////// +// AddConst, MaybeAddConst, RemoveConst +template struct AddConst { typedef const T Type; }; +template struct MaybeAddConst : SelectIfCond {}; +template struct RemoveConst { typedef T Type; }; +template struct RemoveConst { typedef T Type; }; + + +/////////////////////////////////////////////////////////////////////////////// +// IsSame, IsConst, IsMoreConst, IsPointer +// +template struct IsSame : FalseType {}; +template struct IsSame : TrueType {}; + +template struct IsConst : FalseType {}; +template struct IsConst : TrueType {}; + +template +struct IsMoreConst + : AndExpr::Type, typename RemoveConst::Type>, + BoolType::Value >= IsConst::Value> >::Type {}; + +template struct IsPointer : FalseType {}; +template struct IsPointer : TrueType {}; + +/////////////////////////////////////////////////////////////////////////////// +// IsBaseOf +// +#if RAPIDJSON_HAS_CXX11_TYPETRAITS + +template struct IsBaseOf + : BoolType< ::std::is_base_of::value> {}; + +#else // simplified version adopted from Boost + +template struct IsBaseOfImpl { + RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); + RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); + + typedef char (&Yes)[1]; + typedef char (&No) [2]; + + template + static Yes Check(const D*, T); + static No Check(const B*, int); + + struct Host { + operator const B*() const; + operator const D*(); + }; + + enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; +}; + +template struct IsBaseOf + : OrExpr, BoolExpr > >::Type {}; + +#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS + + +////////////////////////////////////////////////////////////////////////// +// EnableIf / DisableIf +// +template struct EnableIfCond { typedef T Type; }; +template struct EnableIfCond { /* empty */ }; + +template struct DisableIfCond { typedef T Type; }; +template struct DisableIfCond { /* empty */ }; + +template +struct EnableIf : EnableIfCond {}; + +template +struct DisableIf : DisableIfCond {}; + +// SFINAE helpers +struct SfinaeTag {}; +template struct RemoveSfinaeTag; +template struct RemoveSfinaeTag { typedef T Type; }; + +#define RAPIDJSON_REMOVEFPTR_(type) \ + typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ + < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type + +#define RAPIDJSON_ENABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type * = NULL + +#define RAPIDJSON_DISABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type * = NULL + +#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type + +#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type + +} // namespace internal +RAPIDJSON_NAMESPACE_END +//@endcond + +#if defined(_MSC_VER) && !defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_META_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/pow10.h b/3rdparty/rapidjson/include/rapidjson/internal/pow10.h new file mode 100644 index 0000000000..02f475d705 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/pow10.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_POW10_ +#define RAPIDJSON_POW10_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n non-negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes + 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + RAPIDJSON_ASSERT(n >= 0 && n <= 308); + return e[n]; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_POW10_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/regex.h b/3rdparty/rapidjson/include/rapidjson/internal/regex.h new file mode 100644 index 0000000000..af7e06de51 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/regex.h @@ -0,0 +1,739 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_REGEX_H_ +#define RAPIDJSON_INTERNAL_REGEX_H_ + +#include "../allocators.h" +#include "../stream.h" +#include "stack.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifndef RAPIDJSON_REGEX_VERBOSE +#define RAPIDJSON_REGEX_VERBOSE 0 +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// DecodedStream + +template +class DecodedStream { +public: + DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } + unsigned Peek() { return codepoint_; } + unsigned Take() { + unsigned c = codepoint_; + if (c) // No further decoding when '\0' + Decode(); + return c; + } + +private: + void Decode() { + if (!Encoding::Decode(ss_, &codepoint_)) + codepoint_ = 0; + } + + SourceStream& ss_; + unsigned codepoint_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericRegex + +static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 +static const SizeType kRegexInvalidRange = ~SizeType(0); + +template +class GenericRegexSearch; + +//! Regular expression engine with subset of ECMAscript grammar. +/*! + Supported regular expression syntax: + - \c ab Concatenation + - \c a|b Alternation + - \c a? Zero or one + - \c a* Zero or more + - \c a+ One or more + - \c a{3} Exactly 3 times + - \c a{3,} At least 3 times + - \c a{3,5} 3 to 5 times + - \c (ab) Grouping + - \c ^a At the beginning + - \c a$ At the end + - \c . Any character + - \c [abc] Character classes + - \c [a-c] Character class range + - \c [a-z0-9_] Character class combination + - \c [^abc] Negated character classes + - \c [^a-c] Negated character class range + - \c [\b] Backspace (U+0008) + - \c \\| \\\\ ... Escape characters + - \c \\f Form feed (U+000C) + - \c \\n Line feed (U+000A) + - \c \\r Carriage return (U+000D) + - \c \\t Tab (U+0009) + - \c \\v Vertical tab (U+000B) + + \note This is a Thompson NFA engine, implemented with reference to + Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", + https://swtch.com/~rsc/regexp/regexp1.html +*/ +template +class GenericRegex { +public: + typedef Encoding EncodingType; + typedef typename Encoding::Ch Ch; + template friend class GenericRegexSearch; + + GenericRegex(const Ch* source, Allocator* allocator = 0) : + ownAllocator_(allocator ? 0 : RAPIDJSON_NEW(Allocator)()), allocator_(allocator ? allocator : ownAllocator_), + states_(allocator_, 256), ranges_(allocator_, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), + anchorBegin_(), anchorEnd_() + { + GenericStringStream ss(source); + DecodedStream, Encoding> ds(ss); + Parse(ds); + } + + ~GenericRegex() + { + RAPIDJSON_DELETE(ownAllocator_); + } + + bool IsValid() const { + return root_ != kRegexInvalidState; + } + +private: + enum Operator { + kZeroOrOne, + kZeroOrMore, + kOneOrMore, + kConcatenation, + kAlternation, + kLeftParenthesis + }; + + static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' + static const unsigned kRangeCharacterClass = 0xFFFFFFFE; + static const unsigned kRangeNegationFlag = 0x80000000; + + struct Range { + unsigned start; // + unsigned end; + SizeType next; + }; + + struct State { + SizeType out; //!< Equals to kInvalid for matching state + SizeType out1; //!< Equals to non-kInvalid for split + SizeType rangeStart; + unsigned codepoint; + }; + + struct Frag { + Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} + SizeType start; + SizeType out; //!< link-list of all output states + SizeType minIndex; + }; + + State& GetState(SizeType index) { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + const State& GetState(SizeType index) const { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + Range& GetRange(SizeType index) { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + const Range& GetRange(SizeType index) const { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + template + void Parse(DecodedStream& ds) { + Stack operandStack(allocator_, 256); // Frag + Stack operatorStack(allocator_, 256); // Operator + Stack atomCountStack(allocator_, 256); // unsigned (Atom per parenthesis) + + *atomCountStack.template Push() = 0; + + unsigned codepoint; + while (ds.Peek() != 0) { + switch (codepoint = ds.Take()) { + case '^': + anchorBegin_ = true; + break; + + case '$': + anchorEnd_ = true; + break; + + case '|': + while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + *operatorStack.template Push() = kAlternation; + *atomCountStack.template Top() = 0; + break; + + case '(': + *operatorStack.template Push() = kLeftParenthesis; + *atomCountStack.template Push() = 0; + break; + + case ')': + while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + if (operatorStack.Empty()) + return; + operatorStack.template Pop(1); + atomCountStack.template Pop(1); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '?': + if (!Eval(operandStack, kZeroOrOne)) + return; + break; + + case '*': + if (!Eval(operandStack, kZeroOrMore)) + return; + break; + + case '+': + if (!Eval(operandStack, kOneOrMore)) + return; + break; + + case '{': + { + unsigned n, m; + if (!ParseUnsigned(ds, &n)) + return; + + if (ds.Peek() == ',') { + ds.Take(); + if (ds.Peek() == '}') + m = kInfinityQuantifier; + else if (!ParseUnsigned(ds, &m) || m < n) + return; + } + else + m = n; + + if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') + return; + ds.Take(); + } + break; + + case '.': + PushOperand(operandStack, kAnyCharacterClass); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '[': + { + SizeType range; + if (!ParseRange(ds, &range)) + return; + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); + GetState(s).rangeStart = range; + *operandStack.template Push() = Frag(s, s, s); + } + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '\\': // Escape character + if (!CharacterEscape(ds, &codepoint)) + return; // Unsupported escape character + // fall through to default + RAPIDJSON_DELIBERATE_FALLTHROUGH; + + default: // Pattern character + PushOperand(operandStack, codepoint); + ImplicitConcatenation(atomCountStack, operatorStack); + } + } + + while (!operatorStack.Empty()) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + + // Link the operand to matching state. + if (operandStack.GetSize() == sizeof(Frag)) { + Frag* e = operandStack.template Pop(1); + Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); + root_ = e->start; + +#if RAPIDJSON_REGEX_VERBOSE + printf("root: %d\n", root_); + for (SizeType i = 0; i < stateCount_ ; i++) { + State& s = GetState(i); + printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); + } + printf("\n"); +#endif + } + } + + SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { + State* s = states_.template Push(); + s->out = out; + s->out1 = out1; + s->codepoint = codepoint; + s->rangeStart = kRegexInvalidRange; + return stateCount_++; + } + + void PushOperand(Stack& operandStack, unsigned codepoint) { + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); + *operandStack.template Push() = Frag(s, s, s); + } + + void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { + if (*atomCountStack.template Top()) + *operatorStack.template Push() = kConcatenation; + (*atomCountStack.template Top())++; + } + + SizeType Append(SizeType l1, SizeType l2) { + SizeType old = l1; + while (GetState(l1).out != kRegexInvalidState) + l1 = GetState(l1).out; + GetState(l1).out = l2; + return old; + } + + void Patch(SizeType l, SizeType s) { + for (SizeType next; l != kRegexInvalidState; l = next) { + next = GetState(l).out; + GetState(l).out = s; + } + } + + bool Eval(Stack& operandStack, Operator op) { + switch (op) { + case kConcatenation: + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); + { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + Patch(e1.out, e2.start); + *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); + } + return true; + + case kAlternation: + if (operandStack.GetSize() >= sizeof(Frag) * 2) { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + SizeType s = NewState(e1.start, e2.start, 0); + *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); + return true; + } + return false; + + case kZeroOrOne: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); + return true; + } + return false; + + case kZeroOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(s, s, e.minIndex); + return true; + } + return false; + + case kOneOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(e.start, s, e.minIndex); + return true; + } + return false; + + default: + // syntax error (e.g. unclosed kLeftParenthesis) + return false; + } + } + + bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { + RAPIDJSON_ASSERT(n <= m); + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); + + if (n == 0) { + if (m == 0) // a{0} not support + return false; + else if (m == kInfinityQuantifier) + Eval(operandStack, kZeroOrMore); // a{0,} -> a* + else { + Eval(operandStack, kZeroOrOne); // a{0,5} -> a? + for (unsigned i = 0; i < m - 1; i++) + CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? + for (unsigned i = 0; i < m - 1; i++) + Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? + } + return true; + } + + for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a + CloneTopOperand(operandStack); + + if (m == kInfinityQuantifier) + Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ + else if (m > n) { + CloneTopOperand(operandStack); // a{3,5} -> a a a a + Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? + for (unsigned i = n; i < m - 1; i++) + CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? + for (unsigned i = n; i < m; i++) + Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? + } + + for (unsigned i = 0; i < n - 1; i++) + Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? + + return true; + } + + static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } + + void CloneTopOperand(Stack& operandStack) { + const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation + SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) + State* s = states_.template Push(count); + memcpy(s, &GetState(src.minIndex), count * sizeof(State)); + for (SizeType j = 0; j < count; j++) { + if (s[j].out != kRegexInvalidState) + s[j].out += count; + if (s[j].out1 != kRegexInvalidState) + s[j].out1 += count; + } + *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); + stateCount_ += count; + } + + template + bool ParseUnsigned(DecodedStream& ds, unsigned* u) { + unsigned r = 0; + if (ds.Peek() < '0' || ds.Peek() > '9') + return false; + while (ds.Peek() >= '0' && ds.Peek() <= '9') { + if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 + return false; // overflow + r = r * 10 + (ds.Take() - '0'); + } + *u = r; + return true; + } + + template + bool ParseRange(DecodedStream& ds, SizeType* range) { + bool isBegin = true; + bool negate = false; + int step = 0; + SizeType start = kRegexInvalidRange; + SizeType current = kRegexInvalidRange; + unsigned codepoint; + while ((codepoint = ds.Take()) != 0) { + if (isBegin) { + isBegin = false; + if (codepoint == '^') { + negate = true; + continue; + } + } + + switch (codepoint) { + case ']': + if (start == kRegexInvalidRange) + return false; // Error: nothing inside [] + if (step == 2) { // Add trailing '-' + SizeType r = NewRange('-'); + RAPIDJSON_ASSERT(current != kRegexInvalidRange); + GetRange(current).next = r; + } + if (negate) + GetRange(start).start |= kRangeNegationFlag; + *range = start; + return true; + + case '\\': + if (ds.Peek() == 'b') { + ds.Take(); + codepoint = 0x0008; // Escape backspace character + } + else if (!CharacterEscape(ds, &codepoint)) + return false; + // fall through to default + RAPIDJSON_DELIBERATE_FALLTHROUGH; + + default: + switch (step) { + case 1: + if (codepoint == '-') { + step++; + break; + } + // fall through to step 0 for other characters + RAPIDJSON_DELIBERATE_FALLTHROUGH; + + case 0: + { + SizeType r = NewRange(codepoint); + if (current != kRegexInvalidRange) + GetRange(current).next = r; + if (start == kRegexInvalidRange) + start = r; + current = r; + } + step = 1; + break; + + default: + RAPIDJSON_ASSERT(step == 2); + GetRange(current).end = codepoint; + step = 0; + } + } + } + return false; + } + + SizeType NewRange(unsigned codepoint) { + Range* r = ranges_.template Push(); + r->start = r->end = codepoint; + r->next = kRegexInvalidRange; + return rangeCount_++; + } + + template + bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { + unsigned codepoint; + switch (codepoint = ds.Take()) { + case '^': + case '$': + case '|': + case '(': + case ')': + case '?': + case '*': + case '+': + case '.': + case '[': + case ']': + case '{': + case '}': + case '\\': + *escapedCodepoint = codepoint; return true; + case 'f': *escapedCodepoint = 0x000C; return true; + case 'n': *escapedCodepoint = 0x000A; return true; + case 'r': *escapedCodepoint = 0x000D; return true; + case 't': *escapedCodepoint = 0x0009; return true; + case 'v': *escapedCodepoint = 0x000B; return true; + default: + return false; // Unsupported escape character + } + } + + Allocator* ownAllocator_; + Allocator* allocator_; + Stack states_; + Stack ranges_; + SizeType root_; + SizeType stateCount_; + SizeType rangeCount_; + + static const unsigned kInfinityQuantifier = ~0u; + + // For SearchWithAnchoring() + bool anchorBegin_; + bool anchorEnd_; +}; + +template +class GenericRegexSearch { +public: + typedef typename RegexType::EncodingType Encoding; + typedef typename Encoding::Ch Ch; + + GenericRegexSearch(const RegexType& regex, Allocator* allocator = 0) : + regex_(regex), allocator_(allocator), ownAllocator_(0), + state0_(allocator, 0), state1_(allocator, 0), stateSet_() + { + RAPIDJSON_ASSERT(regex_.IsValid()); + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + stateSet_ = static_cast(allocator_->Malloc(GetStateSetSize())); + state0_.template Reserve(regex_.stateCount_); + state1_.template Reserve(regex_.stateCount_); + } + + ~GenericRegexSearch() { + Allocator::Free(stateSet_); + RAPIDJSON_DELETE(ownAllocator_); + } + + template + bool Match(InputStream& is) { + return SearchWithAnchoring(is, true, true); + } + + bool Match(const Ch* s) { + GenericStringStream is(s); + return Match(is); + } + + template + bool Search(InputStream& is) { + return SearchWithAnchoring(is, regex_.anchorBegin_, regex_.anchorEnd_); + } + + bool Search(const Ch* s) { + GenericStringStream is(s); + return Search(is); + } + +private: + typedef typename RegexType::State State; + typedef typename RegexType::Range Range; + + template + bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) { + DecodedStream ds(is); + + state0_.Clear(); + Stack *current = &state0_, *next = &state1_; + const size_t stateSetSize = GetStateSetSize(); + std::memset(stateSet_, 0, stateSetSize); + + bool matched = AddState(*current, regex_.root_); + unsigned codepoint; + while (!current->Empty() && (codepoint = ds.Take()) != 0) { + std::memset(stateSet_, 0, stateSetSize); + next->Clear(); + matched = false; + for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { + const State& sr = regex_.GetState(*s); + if (sr.codepoint == codepoint || + sr.codepoint == RegexType::kAnyCharacterClass || + (sr.codepoint == RegexType::kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) + { + matched = AddState(*next, sr.out) || matched; + if (!anchorEnd && matched) + return true; + } + if (!anchorBegin) + AddState(*next, regex_.root_); + } + internal::Swap(current, next); + } + + return matched; + } + + size_t GetStateSetSize() const { + return (regex_.stateCount_ + 31) / 32 * 4; + } + + // Return whether the added states is a match state + bool AddState(Stack& l, SizeType index) { + RAPIDJSON_ASSERT(index != kRegexInvalidState); + + const State& s = regex_.GetState(index); + if (s.out1 != kRegexInvalidState) { // Split + bool matched = AddState(l, s.out); + return AddState(l, s.out1) || matched; + } + else if (!(stateSet_[index >> 5] & (1u << (index & 31)))) { + stateSet_[index >> 5] |= (1u << (index & 31)); + *l.template PushUnsafe() = index; + } + return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. + } + + bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { + bool yes = (regex_.GetRange(rangeIndex).start & RegexType::kRangeNegationFlag) == 0; + while (rangeIndex != kRegexInvalidRange) { + const Range& r = regex_.GetRange(rangeIndex); + if (codepoint >= (r.start & ~RegexType::kRangeNegationFlag) && codepoint <= r.end) + return yes; + rangeIndex = r.next; + } + return !yes; + } + + const RegexType& regex_; + Allocator* allocator_; + Allocator* ownAllocator_; + Stack state0_; + Stack state1_; + uint32_t* stateSet_; +}; + +typedef GenericRegex > Regex; +typedef GenericRegexSearch RegexSearch; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_REGEX_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/stack.h b/3rdparty/rapidjson/include/rapidjson/internal/stack.h new file mode 100644 index 0000000000..45dca6a8b0 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/stack.h @@ -0,0 +1,232 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_STACK_H_ +#define RAPIDJSON_INTERNAL_STACK_H_ + +#include "../allocators.h" +#include "swap.h" +#include + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template +class Stack { +public: + // Optimization note: Do not allocate memory for stack_ in constructor. + // Do it lazily when first Push() -> Expand() -> Resize(). + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack(Stack&& rhs) + : allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(rhs.stack_), + stackTop_(rhs.stackTop_), + stackEnd_(rhs.stackEnd_), + initialCapacity_(rhs.initialCapacity_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } +#endif + + ~Stack() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack& operator=(Stack&& rhs) { + if (&rhs != this) + { + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = rhs.stack_; + stackTop_ = rhs.stackTop_; + stackEnd_ = rhs.stackEnd_; + initialCapacity_ = rhs.initialCapacity_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } + return *this; + } +#endif + + void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(stack_, rhs.stack_); + internal::Swap(stackTop_, rhs.stackTop_); + internal::Swap(stackEnd_, rhs.stackEnd_); + internal::Swap(initialCapacity_, rhs.initialCapacity_); + } + + void Clear() { stackTop_ = stack_; } + + void ShrinkToFit() { + if (Empty()) { + // If the stack is empty, completely deallocate the memory. + Allocator::Free(stack_); // NOLINT (+clang-analyzer-unix.Malloc) + stack_ = 0; + stackTop_ = 0; + stackEnd_ = 0; + } + else + Resize(GetSize()); + } + + // Optimization note: try to minimize the size of this function for force inline. + // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. + template + RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { + // Expand the stack if needed + if (RAPIDJSON_UNLIKELY(static_cast(sizeof(T) * count) > (stackEnd_ - stackTop_))) + Expand(count); + } + + template + RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { + Reserve(count); + return PushUnsafe(count); + } + + template + RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { + RAPIDJSON_ASSERT(stackTop_); + RAPIDJSON_ASSERT(static_cast(sizeof(T) * count) <= (stackEnd_ - stackTop_)); + T* ret = reinterpret_cast(stackTop_); + stackTop_ += sizeof(T) * count; + return ret; + } + + template + T* Pop(size_t count) { + RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stackTop_ -= count * sizeof(T); + return reinterpret_cast(stackTop_); + } + + template + T* Top() { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + const T* Top() const { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + T* End() { return reinterpret_cast(stackTop_); } + + template + const T* End() const { return reinterpret_cast(stackTop_); } + + template + T* Bottom() { return reinterpret_cast(stack_); } + + template + const T* Bottom() const { return reinterpret_cast(stack_); } + + bool HasAllocator() const { + return allocator_ != 0; + } + + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + bool Empty() const { return stackTop_ == stack_; } + size_t GetSize() const { return static_cast(stackTop_ - stack_); } + size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } + +private: + template + void Expand(size_t count) { + // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. + size_t newCapacity; + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + newCapacity = initialCapacity_; + } else { + newCapacity = GetCapacity(); + newCapacity += (newCapacity + 1) / 2; + } + size_t newSize = GetSize() + sizeof(T) * count; + if (newCapacity < newSize) + newCapacity = newSize; + + Resize(newCapacity); + } + + void Resize(size_t newCapacity) { + const size_t size = GetSize(); // Backup the current size + stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); + stackTop_ = stack_ + size; + stackEnd_ = stack_ + newCapacity; + } + + void Destroy() { + Allocator::Free(stack_); + RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack + } + + // Prohibit copy constructor & assignment operator. + Stack(const Stack&); + Stack& operator=(const Stack&); + + Allocator* allocator_; + Allocator* ownAllocator_; + char *stack_; + char *stackTop_; + char *stackEnd_; + size_t initialCapacity_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STACK_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/strfunc.h b/3rdparty/rapidjson/include/rapidjson/internal/strfunc.h new file mode 100644 index 0000000000..226439a767 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/strfunc.h @@ -0,0 +1,69 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ +#define RAPIDJSON_INTERNAL_STRFUNC_H_ + +#include "../stream.h" +#include + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template +inline SizeType StrLen(const Ch* s) { + RAPIDJSON_ASSERT(s != 0); + const Ch* p = s; + while (*p) ++p; + return SizeType(p - s); +} + +template <> +inline SizeType StrLen(const char* s) { + return SizeType(std::strlen(s)); +} + +template <> +inline SizeType StrLen(const wchar_t* s) { + return SizeType(std::wcslen(s)); +} + +//! Returns number of code points in a encoded string. +template +bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { + RAPIDJSON_ASSERT(s != 0); + RAPIDJSON_ASSERT(outCount != 0); + GenericStringStream is(s); + const typename Encoding::Ch* end = s + length; + SizeType count = 0; + while (is.src_ < end) { + unsigned codepoint; + if (!Encoding::Decode(is, &codepoint)) + return false; + count++; + } + *outCount = count; + return true; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/strtod.h b/3rdparty/rapidjson/include/rapidjson/internal/strtod.h new file mode 100644 index 0000000000..dfca22b65a --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/strtod.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_STRTOD_ +#define RAPIDJSON_STRTOD_ + +#include "ieee754.h" +#include "biginteger.h" +#include "diyfp.h" +#include "pow10.h" +#include +#include + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline double FastPath(double significand, int exp) { + if (exp < -308) + return 0.0; + else if (exp >= 0) + return significand * internal::Pow10(exp); + else + return significand / internal::Pow10(-exp); +} + +inline double StrtodNormalPrecision(double d, int p) { + if (p < -308) { + // Prevent expSum < -308, making Pow10(p) = 0 + d = FastPath(d, -308); + d = FastPath(d, p + 308); + } + else + d = FastPath(d, p); + return d; +} + +template +inline T Min3(T a, T b, T c) { + T m = a; + if (m > b) m = b; + if (m > c) m = c; + return m; +} + +inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { + const Double db(b); + const uint64_t bInt = db.IntegerSignificand(); + const int bExp = db.IntegerExponent(); + const int hExp = bExp - 1; + + int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; + + // Adjust for decimal exponent + if (dExp >= 0) { + dS_Exp2 += dExp; + dS_Exp5 += dExp; + } + else { + bS_Exp2 -= dExp; + bS_Exp5 -= dExp; + hS_Exp2 -= dExp; + hS_Exp5 -= dExp; + } + + // Adjust for binary exponent + if (bExp >= 0) + bS_Exp2 += bExp; + else { + dS_Exp2 -= bExp; + hS_Exp2 -= bExp; + } + + // Adjust for half ulp exponent + if (hExp >= 0) + hS_Exp2 += hExp; + else { + dS_Exp2 -= hExp; + bS_Exp2 -= hExp; + } + + // Remove common power of two factor from all three scaled values + int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); + dS_Exp2 -= common_Exp2; + bS_Exp2 -= common_Exp2; + hS_Exp2 -= common_Exp2; + + BigInteger dS = d; + dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); + + BigInteger bS(bInt); + bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); + + BigInteger hS(1); + hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); + + BigInteger delta(0); + dS.Difference(bS, &delta); + + return delta.Compare(hS); +} + +inline bool StrtodFast(double d, int p, double* result) { + // Use fast path for string-to-double conversion if possible + // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + if (p > 22 && p < 22 + 16) { + // Fast Path Cases In Disguise + d *= internal::Pow10(p - 22); + p = 22; + } + + if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 + *result = FastPath(d, p); + return true; + } + else + return false; +} + +// Compute an approximation and see if it is within 1/2 ULP +inline bool StrtodDiyFp(const char* decimals, int dLen, int dExp, double* result) { + uint64_t significand = 0; + int i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 + for (; i < dLen; i++) { + if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || + (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5')) + break; + significand = significand * 10u + static_cast(decimals[i] - '0'); + } + + if (i < dLen && decimals[i] >= '5') // Rounding + significand++; + + int remaining = dLen - i; + const int kUlpShift = 3; + const int kUlp = 1 << kUlpShift; + int64_t error = (remaining == 0) ? 0 : kUlp / 2; + + DiyFp v(significand, 0); + v = v.Normalize(); + error <<= -v.e; + + dExp += remaining; + + int actualExp; + DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); + if (actualExp != dExp) { + static const DiyFp kPow10[] = { + DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 0x00000000), -60), // 10^1 + DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 0x00000000), -57), // 10^2 + DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 0x00000000), -54), // 10^3 + DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), -50), // 10^4 + DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 0x00000000), -47), // 10^5 + DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 0x00000000), -44), // 10^6 + DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 0x00000000), -40) // 10^7 + }; + int adjustment = dExp - actualExp; + RAPIDJSON_ASSERT(adjustment >= 1 && adjustment < 8); + v = v * kPow10[adjustment - 1]; + if (dLen + adjustment > 19) // has more digits than decimal digits in 64-bit + error += kUlp / 2; + } + + v = v * cachedPower; + + error += kUlp + (error == 0 ? 0 : 1); + + const int oldExp = v.e; + v = v.Normalize(); + error <<= oldExp - v.e; + + const int effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); + int precisionSize = 64 - effectiveSignificandSize; + if (precisionSize + kUlpShift >= 64) { + int scaleExp = (precisionSize + kUlpShift) - 63; + v.f >>= scaleExp; + v.e += scaleExp; + error = (error >> scaleExp) + 1 + kUlp; + precisionSize -= scaleExp; + } + + DiyFp rounded(v.f >> precisionSize, v.e + precisionSize); + const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; + const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; + if (precisionBits >= halfWay + static_cast(error)) { + rounded.f++; + if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) + rounded.f >>= 1; + rounded.e++; + } + } + + *result = rounded.ToDouble(); + + return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); +} + +inline double StrtodBigInteger(double approx, const char* decimals, int dLen, int dExp) { + RAPIDJSON_ASSERT(dLen >= 0); + const BigInteger dInt(decimals, static_cast(dLen)); + Double a(approx); + int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); + if (cmp < 0) + return a.Value(); // within half ULP + else if (cmp == 0) { + // Round towards even + if (a.Significand() & 1) + return a.NextPositiveDouble(); + else + return a.Value(); + } + else // adjustment + return a.NextPositiveDouble(); +} + +inline double StrtodFullPrecision(double d, int p, const char* decimals, size_t length, size_t decimalPosition, int exp) { + RAPIDJSON_ASSERT(d >= 0.0); + RAPIDJSON_ASSERT(length >= 1); + + double result = 0.0; + if (StrtodFast(d, p, &result)) + return result; + + RAPIDJSON_ASSERT(length <= INT_MAX); + int dLen = static_cast(length); + + RAPIDJSON_ASSERT(length >= decimalPosition); + RAPIDJSON_ASSERT(length - decimalPosition <= INT_MAX); + int dExpAdjust = static_cast(length - decimalPosition); + + RAPIDJSON_ASSERT(exp >= INT_MIN + dExpAdjust); + int dExp = exp - dExpAdjust; + + // Make sure length+dExp does not overflow + RAPIDJSON_ASSERT(dExp <= INT_MAX - dLen); + + // Trim leading zeros + while (dLen > 0 && *decimals == '0') { + dLen--; + decimals++; + } + + // Trim trailing zeros + while (dLen > 0 && decimals[dLen - 1] == '0') { + dLen--; + dExp++; + } + + if (dLen == 0) { // Buffer only contains zeros. + return 0.0; + } + + // Trim right-most digits + const int kMaxDecimalDigit = 767 + 1; + if (dLen > kMaxDecimalDigit) { + dExp += dLen - kMaxDecimalDigit; + dLen = kMaxDecimalDigit; + } + + // If too small, underflow to zero. + // Any x <= 10^-324 is interpreted as zero. + if (dLen + dExp <= -324) + return 0.0; + + // If too large, overflow to infinity. + // Any x >= 10^309 is interpreted as +infinity. + if (dLen + dExp > 309) + return std::numeric_limits::infinity(); + + if (StrtodDiyFp(decimals, dLen, dExp, &result)) + return result; + + // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison + return StrtodBigInteger(result, decimals, dLen, dExp); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STRTOD_ diff --git a/3rdparty/rapidjson/include/rapidjson/internal/swap.h b/3rdparty/rapidjson/include/rapidjson/internal/swap.h new file mode 100644 index 0000000000..666e49f97b --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/internal/swap.h @@ -0,0 +1,46 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_INTERNAL_SWAP_H_ +#define RAPIDJSON_INTERNAL_SWAP_H_ + +#include "../rapidjson.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom swap() to avoid dependency on C++ header +/*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. + \note This has the same semantics as std::swap(). +*/ +template +inline void Swap(T& a, T& b) RAPIDJSON_NOEXCEPT { + T tmp = a; + a = b; + b = tmp; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_SWAP_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/istreamwrapper.h b/3rdparty/rapidjson/include/rapidjson/istreamwrapper.h new file mode 100644 index 0000000000..c4950b9dcf --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/istreamwrapper.h @@ -0,0 +1,128 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_ISTREAMWRAPPER_H_ +#define RAPIDJSON_ISTREAMWRAPPER_H_ + +#include "stream.h" +#include +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::istringstream + - \c std::stringstream + - \c std::wistringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wifstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_istream. +*/ + +template +class BasicIStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + + //! Constructor. + /*! + \param stream stream opened for read. + */ + BasicIStreamWrapper(StreamType &stream) : stream_(stream), buffer_(peekBuffer_), bufferSize_(4), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + Read(); + } + + //! Constructor. + /*! + \param stream stream opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + BasicIStreamWrapper(StreamType &stream, char* buffer, size_t bufferSize) : stream_(stream), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; + } + +private: + BasicIStreamWrapper(); + BasicIStreamWrapper(const BasicIStreamWrapper&); + BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); + + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = bufferSize_; + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (!stream_.read(buffer_, static_cast(bufferSize_))) { + readCount_ = static_cast(stream_.gcount()); + *(bufferLast_ = buffer_ + readCount_) = '\0'; + eof_ = true; + } + } + } + + StreamType &stream_; + Ch peekBuffer_[4], *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +typedef BasicIStreamWrapper IStreamWrapper; +typedef BasicIStreamWrapper WIStreamWrapper; + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ISTREAMWRAPPER_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/memorybuffer.h b/3rdparty/rapidjson/include/rapidjson/memorybuffer.h new file mode 100644 index 0000000000..39bee1dec1 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/memorybuffer.h @@ -0,0 +1,70 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_MEMORYBUFFER_H_ +#define RAPIDJSON_MEMORYBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output byte stream. +/*! + This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. + + It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. + + Differences between MemoryBuffer and StringBuffer: + 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. + 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. + + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +struct GenericMemoryBuffer { + typedef char Ch; // byte + + GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { stack_.ShrinkToFit(); } + Ch* Push(size_t count) { return stack_.template Push(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetBuffer() const { + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; +}; + +typedef GenericMemoryBuffer<> MemoryBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { + std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/memorystream.h b/3rdparty/rapidjson/include/rapidjson/memorystream.h new file mode 100644 index 0000000000..1d71d8a4f0 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/memorystream.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_MEMORYSTREAM_H_ +#define RAPIDJSON_MEMORYSTREAM_H_ + +#include "stream.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory input byte stream. +/*! + This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. + + It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. + + Differences between MemoryStream and StringStream: + 1. StringStream has encoding but MemoryStream is a byte stream. + 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. + 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). + \note implements Stream concept +*/ +struct MemoryStream { + typedef char Ch; // byte + + MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} + + Ch Peek() const { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } + Ch Take() { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } + size_t Tell() const { return static_cast(src_ - begin_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return Tell() + 4 <= size_ ? src_ : 0; + } + + const Ch* src_; //!< Current read position. + const Ch* begin_; //!< Original head of the string. + const Ch* end_; //!< End of stream. + size_t size_; //!< Size of the stream. +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/msinttypes/inttypes.h b/3rdparty/rapidjson/include/rapidjson/msinttypes/inttypes.h new file mode 100644 index 0000000000..18111286bf --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/msinttypes/inttypes.h @@ -0,0 +1,316 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// miloyip: VC supports inttypes.h since VC2013 +#if _MSC_VER >= 1800 +#include +#else + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_VER >= 1800 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/3rdparty/rapidjson/include/rapidjson/msinttypes/stdint.h b/3rdparty/rapidjson/include/rapidjson/msinttypes/stdint.h new file mode 100644 index 0000000000..3d4477b9a0 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/msinttypes/stdint.h @@ -0,0 +1,300 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. +#if _MSC_VER >= 1600 // [ +#include + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#else // ] _MSC_VER >= 1700 [ + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we have to wrap include with 'extern "C++" {}' +// or compiler would give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if defined(__cplusplus) && !defined(_M_ARM) +extern "C" { +#endif +# include +#if defined(__cplusplus) && !defined(_M_ARM) +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_VER >= 1600 ] + +#endif // _MSC_STDINT_H_ ] diff --git a/3rdparty/rapidjson/include/rapidjson/ostreamwrapper.h b/3rdparty/rapidjson/include/rapidjson/ostreamwrapper.h new file mode 100644 index 0000000000..6f4667c08a --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/ostreamwrapper.h @@ -0,0 +1,81 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_OSTREAMWRAPPER_H_ +#define RAPIDJSON_OSTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::ostringstream + - \c std::stringstream + - \c std::wpstringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wofstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_ostream. +*/ + +template +class BasicOStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} + + void Put(Ch c) { + stream_.put(c); + } + + void Flush() { + stream_.flush(); + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + BasicOStreamWrapper(const BasicOStreamWrapper&); + BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); + + StreamType& stream_; +}; + +typedef BasicOStreamWrapper OStreamWrapper; +typedef BasicOStreamWrapper WOStreamWrapper; + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_OSTREAMWRAPPER_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/pointer.h b/3rdparty/rapidjson/include/rapidjson/pointer.h new file mode 100644 index 0000000000..b8143b6380 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/pointer.h @@ -0,0 +1,1415 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_POINTER_H_ +#define RAPIDJSON_POINTER_H_ + +#include "document.h" +#include "internal/itoa.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode +*/ +enum PointerParseErrorCode { + kPointerParseErrorNone = 0, //!< The parse is successful + + kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' + kPointerParseErrorInvalidEscape, //!< Invalid escape + kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment + kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericPointer + +//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. +/*! + This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" + (https://tools.ietf.org/html/rfc6901). + + A JSON pointer is for identifying a specific value in a JSON document + (GenericDocument). It can simplify coding of DOM tree manipulation, because it + can access multiple-level depth of DOM tree with single API call. + + After it parses a string representation (e.g. "/foo/0" or URI fragment + representation (e.g. "#/foo/0") into its internal representation (tokens), + it can be used to resolve a specific value in multiple documents, or sub-tree + of documents. + + Contrary to GenericValue, Pointer can be copy constructed and copy assigned. + Apart from assignment, a Pointer cannot be modified after construction. + + Although Pointer is very convenient, please aware that constructing Pointer + involves parsing and dynamic memory allocation. A special constructor with user- + supplied tokens eliminates these. + + GenericPointer depends on GenericDocument and GenericValue. + + \tparam ValueType The value type of the DOM tree. E.g. GenericValue > + \tparam Allocator The allocator type for allocating memory for internal representation. + + \note GenericPointer uses same encoding of ValueType. + However, Allocator of GenericPointer is independent of Allocator of Value. +*/ +template +class GenericPointer { +public: + typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value + typedef typename ValueType::Ch Ch; //!< Character type from Value + + //! A token is the basic units of internal representation. + /*! + A JSON pointer string representation "/foo/123" is parsed to two tokens: + "foo" and 123. 123 will be represented in both numeric form and string form. + They are resolved according to the actual value type (object or array). + + For token that are not numbers, or the numeric value is out of bound + (greater than limits of SizeType), they are only treated as string form + (i.e. the token's index will be equal to kPointerInvalidIndex). + + This struct is public so that user can create a Pointer without parsing and + allocation, using a special constructor. + */ + struct Token { + const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. + SizeType length; //!< Length of the name. + SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. + }; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor. + GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A null-terminated, string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + */ + explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, internal::StrLen(source)); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source.c_str(), source.size()); + } +#endif + + //! Constructor that parses a string or URI fragment representation, with length of the source string. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param length Length of source. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Slightly faster than the overload without length. + */ + GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, length); + } + + //! Constructor with user-supplied tokens. + /*! + This constructor let user supplies const array of tokens. + This prevents the parsing process and eliminates allocation. + This is preferred for memory constrained environments. + + \param tokens An constant array of tokens representing the JSON pointer. + \param tokenCount Number of tokens. + + \b Example + \code + #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } + #define INDEX(i) { #i, sizeof(#i) - 1, i } + + static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; + static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); + // Equivalent to static const Pointer p("/foo/123"); + + #undef NAME + #undef INDEX + \endcode + */ + GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs) : allocator_(rhs.allocator_), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs, Allocator* allocator) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Destructor. + ~GenericPointer() { + if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. + Allocator::Free(tokens_); + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Assignment operator. + GenericPointer& operator=(const GenericPointer& rhs) { + if (this != &rhs) { + // Do not delete ownAllcator + if (nameBuffer_) + Allocator::Free(tokens_); + + tokenCount_ = rhs.tokenCount_; + parseErrorOffset_ = rhs.parseErrorOffset_; + parseErrorCode_ = rhs.parseErrorCode_; + + if (rhs.nameBuffer_) + CopyFromRaw(rhs); // Normally parsed tokens. + else { + tokens_ = rhs.tokens_; // User supplied const tokens. + nameBuffer_ = 0; + } + } + return *this; + } + + //! Swap the content of this pointer with an other. + /*! + \param other The pointer to swap with. + \note Constant complexity. + */ + GenericPointer& Swap(GenericPointer& other) RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, other.allocator_); + internal::Swap(ownAllocator_, other.ownAllocator_); + internal::Swap(nameBuffer_, other.nameBuffer_); + internal::Swap(tokens_, other.tokens_); + internal::Swap(tokenCount_, other.tokenCount_); + internal::Swap(parseErrorOffset_, other.parseErrorOffset_); + internal::Swap(parseErrorCode_, other.parseErrorCode_); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.pointer, b.pointer); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericPointer& a, GenericPointer& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //@} + + //!@name Append token + //@{ + + //! Append a token and return a new Pointer + /*! + \param token Token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Token& token, Allocator* allocator = 0) const { + GenericPointer r; + r.allocator_ = allocator; + Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); + std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); + r.tokens_[tokenCount_].name = p; + r.tokens_[tokenCount_].length = token.length; + r.tokens_[tokenCount_].index = token.index; + return r; + } + + //! Append a name token with length, and return a new Pointer + /*! + \param name Name to be appended. + \param length Length of name. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { + Token token = { name, length, kPointerInvalidIndex }; + return Append(token, allocator); + } + + //! Append a name token without length, and return a new Pointer + /*! + \param name Name (const Ch*) to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) + Append(T* name, Allocator* allocator = 0) const { + return Append(name, internal::StrLen(name), allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Append a name token, and return a new Pointer + /*! + \param name Name to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { + return Append(name.c_str(), static_cast(name.size()), allocator); + } +#endif + + //! Append a index token, and return a new Pointer + /*! + \param index Index to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(SizeType index, Allocator* allocator = 0) const { + char buffer[21]; + char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); + SizeType length = static_cast(end - buffer); + buffer[length] = '\0'; + + if (sizeof(Ch) == 1) { + Token token = { reinterpret_cast(buffer), length, index }; + return Append(token, allocator); + } + else { + Ch name[21]; + for (size_t i = 0; i <= length; i++) + name[i] = static_cast(buffer[i]); + Token token = { name, length, index }; + return Append(token, allocator); + } + } + + //! Append a token by value, and return a new Pointer + /*! + \param token token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { + if (token.IsString()) + return Append(token.GetString(), token.GetStringLength(), allocator); + else { + RAPIDJSON_ASSERT(token.IsUint64()); + RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); + return Append(static_cast(token.GetUint64()), allocator); + } + } + + //!@name Handling Parse Error + //@{ + + //! Check whether this is a valid pointer. + bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } + + //! Get the parsing error offset in code unit. + size_t GetParseErrorOffset() const { return parseErrorOffset_; } + + //! Get the parsing error code. + PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } + + //@} + + //! Get the allocator of this pointer. + Allocator& GetAllocator() { return *allocator_; } + + //!@name Tokens + //@{ + + //! Get the token array (const version only). + const Token* GetTokens() const { return tokens_; } + + //! Get the number of tokens. + size_t GetTokenCount() const { return tokenCount_; } + + //@} + + //!@name Equality/inequality operators + //@{ + + //! Equality operator. + /*! + \note When any pointers are invalid, always returns false. + */ + bool operator==(const GenericPointer& rhs) const { + if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) + return false; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index || + tokens_[i].length != rhs.tokens_[i].length || + (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) + { + return false; + } + } + + return true; + } + + //! Inequality operator. + /*! + \note When any pointers are invalid, always returns true. + */ + bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } + + //! Less than operator. + /*! + \note Invalid pointers are always greater than valid ones. + */ + bool operator<(const GenericPointer& rhs) const { + if (!IsValid()) + return false; + if (!rhs.IsValid()) + return true; + + if (tokenCount_ != rhs.tokenCount_) + return tokenCount_ < rhs.tokenCount_; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index) + return tokens_[i].index < rhs.tokens_[i].index; + + if (tokens_[i].length != rhs.tokens_[i].length) + return tokens_[i].length < rhs.tokens_[i].length; + + if (int cmp = std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch) * tokens_[i].length)) + return cmp < 0; + } + + return false; + } + + //@} + + //!@name Stringify + //@{ + + //! Stringify the pointer into string representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + return Stringify(os); + } + + //! Stringify the pointer into URI fragment representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool StringifyUriFragment(OutputStream& os) const { + return Stringify(os); + } + + //@} + + //!@name Create value + //@{ + + //! Create a value in a subtree. + /*! + If the value is not exist, it creates all parent values and a JSON Null value. + So it always succeed and return the newly created or existing value. + + Remind that it may change types of parents according to tokens, so it + potentially removes previously stored values. For example, if a document + was an array, and "/foo" is used to create a value, then the document + will be changed to an object, and all existing array elements are lost. + + \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created (a JSON Null value), or already exists value. + */ + ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + bool exist = true; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + if (v->IsArray() && t->name[0] == '-' && t->length == 1) { + v->PushBack(ValueType().Move(), allocator); + v = &((*v)[v->Size() - 1]); + exist = false; + } + else { + if (t->index == kPointerInvalidIndex) { // must be object name + if (!v->IsObject()) + v->SetObject(); // Change to Object + } + else { // object name or array index + if (!v->IsArray() && !v->IsObject()) + v->SetArray(); // Change to Array + } + + if (v->IsArray()) { + if (t->index >= v->Size()) { + v->Reserve(t->index + 1, allocator); + while (t->index >= v->Size()) + v->PushBack(ValueType().Move(), allocator); + exist = false; + } + v = &((*v)[t->index]); + } + else { + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); + if (m == v->MemberEnd()) { + v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); + m = v->MemberEnd(); + v = &(--m)->value; // Assumes AddMember() appends at the end + exist = false; + } + else + v = &m->value; + } + } + } + + if (alreadyExist) + *alreadyExist = exist; + + return *v; + } + + //! Creates a value in a document. + /*! + \param document A document to be resolved. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created, or already exists value. + */ + template + ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { + return Create(document, document.GetAllocator(), alreadyExist); + } + + //@} + + //!@name Query value + //@{ + + //! Query a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. + \return Pointer to the value if it can be resolved. Otherwise null. + + \note + There are only 3 situations when a value cannot be resolved: + 1. A value in the path is not an array nor object. + 2. An object value does not contain the token. + 3. A token is out of range of an array value. + + Use unresolvedTokenIndex to retrieve the token index. + */ + ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); + if (m == v->MemberEnd()) + break; + v = &m->value; + } + continue; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + break; + v = &((*v)[t->index]); + continue; + default: + break; + } + + // Error: unresolved token + if (unresolvedTokenIndex) + *unresolvedTokenIndex = static_cast(t - tokens_); + return 0; + } + return v; + } + + //! Query a const value in a const subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Pointer to the value if it can be resolved. Otherwise null. + */ + const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { + return Get(const_cast(root), unresolvedTokenIndex); + } + + //@} + + //!@name Query a value with default + //@{ + + //! Query a value in a subtree with default value. + /*! + Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. + So that this function always succeed. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param defaultValue Default value to be cloned if the value was not exists. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); + } + + //! Query a value in a subtree with default null-terminated string. + ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a subtree with default std::basic_string. + ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + ValueType& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } +#endif + + //! Query a value in a subtree with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { + return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); + } + + //! Query a value in a document with default value. + template + ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //! Query a value in a document with default null-terminated string. + template + ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a document with default std::basic_string. + template + ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } +#endif + + //! Query a value in a document with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(GenericDocument& document, T defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //@} + + //!@name Set a value + //@{ + + //! Set a value in a subtree, with move semantics. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be set. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = value; + } + + //! Set a value in a subtree, with copy semantics. + ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).CopyFrom(value, allocator); + } + + //! Set a null-terminated string in a subtree. + ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Set a std::basic_string in a subtree. + ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } +#endif + + //! Set a primitive value in a subtree. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value).Move(); + } + + //! Set a value in a document, with move semantics. + template + ValueType& Set(GenericDocument& document, ValueType& value) const { + return Create(document) = value; + } + + //! Set a value in a document, with copy semantics. + template + ValueType& Set(GenericDocument& document, const ValueType& value) const { + return Create(document).CopyFrom(value, document.GetAllocator()); + } + + //! Set a null-terminated string in a document. + template + ValueType& Set(GenericDocument& document, const Ch* value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Sets a std::basic_string in a document. + template + ValueType& Set(GenericDocument& document, const std::basic_string& value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } +#endif + + //! Set a primitive value in a document. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(GenericDocument& document, T value) const { + return Create(document) = value; + } + + //@} + + //!@name Swap a value + //@{ + + //! Swap a value with a value in a subtree. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be swapped. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).Swap(value); + } + + //! Swap a value with a value in a document. + template + ValueType& Swap(GenericDocument& document, ValueType& value) const { + return Create(document).Swap(value); + } + + //@} + + //! Erase a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Whether the resolved value is found and erased. + + \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. + */ + bool Erase(ValueType& root) const { + RAPIDJSON_ASSERT(IsValid()); + if (tokenCount_ == 0) // Cannot erase the root + return false; + + ValueType* v = &root; + const Token* last = tokens_ + (tokenCount_ - 1); + for (const Token *t = tokens_; t != last; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); + if (m == v->MemberEnd()) + return false; + v = &m->value; + } + break; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + return false; + v = &((*v)[t->index]); + break; + default: + return false; + } + } + + switch (v->GetType()) { + case kObjectType: + return v->EraseMember(GenericStringRef(last->name, last->length)); + case kArrayType: + if (last->index == kPointerInvalidIndex || last->index >= v->Size()) + return false; + v->Erase(v->Begin() + last->index); + return true; + default: + return false; + } + } + +private: + //! Clone the content from rhs to this. + /*! + \param rhs Source pointer. + \param extraToken Extra tokens to be allocated. + \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. + \return Start of non-occupied name buffer, for storing extra names. + */ + Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { + if (!allocator_) // allocator is independently owned. + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens + for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) + nameBufferSize += t->length; + + tokenCount_ = rhs.tokenCount_ + extraToken; + tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); + nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + if (rhs.tokenCount_ > 0) { + std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); + } + if (nameBufferSize > 0) { + std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); + } + + // Adjust pointers to name buffer + std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_; + for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t) + t->name += diff; + + return nameBuffer_ + nameBufferSize; + } + + //! Check whether a character should be percent-encoded. + /*! + According to RFC 3986 2.3 Unreserved Characters. + \param c The character (code unit) to be tested. + */ + bool NeedPercentEncode(Ch c) const { + return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); + } + + //! Parse a JSON String or its URI fragment representation into tokens. +#ifndef __clang__ // -Wdocumentation + /*! + \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. + \param length Length of the source string. + \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. + */ +#endif + void Parse(const Ch* source, size_t length) { + RAPIDJSON_ASSERT(source != NULL); + RAPIDJSON_ASSERT(nameBuffer_ == 0); + RAPIDJSON_ASSERT(tokens_ == 0); + + // Create own allocator if user did not supply. + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + // Count number of '/' as tokenCount + tokenCount_ = 0; + for (const Ch* s = source; s != source + length; s++) + if (*s == '/') + tokenCount_++; + + Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); + Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + size_t i = 0; + + // Detect if it is a URI fragment + bool uriFragment = false; + if (source[i] == '#') { + uriFragment = true; + i++; + } + + if (i != length && source[i] != '/') { + parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; + goto error; + } + + while (i < length) { + RAPIDJSON_ASSERT(source[i] == '/'); + i++; // consumes '/' + + token->name = name; + bool isNumber = true; + + while (i < length && source[i] != '/') { + Ch c = source[i]; + if (uriFragment) { + // Decoding percent-encoding for URI fragment + if (c == '%') { + PercentDecodeStream is(&source[i], source + length); + GenericInsituStringStream os(name); + Ch* begin = os.PutBegin(); + if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { + parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; + goto error; + } + size_t len = os.PutEnd(begin); + i += is.Tell() - 1; + if (len == 1) + c = *name; + else { + name += len; + isNumber = false; + i++; + continue; + } + } + else if (NeedPercentEncode(c)) { + parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; + goto error; + } + } + + i++; + + // Escaping "~0" -> '~', "~1" -> '/' + if (c == '~') { + if (i < length) { + c = source[i]; + if (c == '0') c = '~'; + else if (c == '1') c = '/'; + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + i++; + } + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + } + + // First check for index: all of characters are digit + if (c < '0' || c > '9') + isNumber = false; + + *name++ = c; + } + token->length = static_cast(name - token->name); + if (token->length == 0) + isNumber = false; + *name++ = '\0'; // Null terminator + + // Second check for index: more than one digit cannot have leading zero + if (isNumber && token->length > 1 && token->name[0] == '0') + isNumber = false; + + // String to SizeType conversion + SizeType n = 0; + if (isNumber) { + for (size_t j = 0; j < token->length; j++) { + SizeType m = n * 10 + static_cast(token->name[j] - '0'); + if (m < n) { // overflow detection + isNumber = false; + break; + } + n = m; + } + } + + token->index = isNumber ? n : kPointerInvalidIndex; + token++; + } + + RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer + parseErrorCode_ = kPointerParseErrorNone; + return; + + error: + Allocator::Free(tokens_); + nameBuffer_ = 0; + tokens_ = 0; + tokenCount_ = 0; + parseErrorOffset_ = i; + return; + } + + //! Stringify to string or URI fragment representation. + /*! + \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. + \tparam OutputStream type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + RAPIDJSON_ASSERT(IsValid()); + + if (uriFragment) + os.Put('#'); + + for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + os.Put('/'); + for (size_t j = 0; j < t->length; j++) { + Ch c = t->name[j]; + if (c == '~') { + os.Put('~'); + os.Put('0'); + } + else if (c == '/') { + os.Put('~'); + os.Put('1'); + } + else if (uriFragment && NeedPercentEncode(c)) { + // Transcode to UTF8 sequence + GenericStringStream source(&t->name[j]); + PercentEncodeStream target(os); + if (!Transcoder >().Validate(source, target)) + return false; + j += source.Tell() - 1; + } + else + os.Put(c); + } + } + return true; + } + + //! A helper stream for decoding a percent-encoded sequence into code unit. + /*! + This stream decodes %XY triplet into code unit (0-255). + If it encounters invalid characters, it sets output code unit as 0 and + mark invalid, and to be checked by IsValid(). + */ + class PercentDecodeStream { + public: + typedef typename ValueType::Ch Ch; + + //! Constructor + /*! + \param source Start of the stream + \param end Past-the-end of the stream. + */ + PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} + + Ch Take() { + if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet + valid_ = false; + return 0; + } + src_++; + Ch c = 0; + for (int j = 0; j < 2; j++) { + c = static_cast(c << 4); + Ch h = *src_; + if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); + else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); + else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); + else { + valid_ = false; + return 0; + } + src_++; + } + return c; + } + + size_t Tell() const { return static_cast(src_ - head_); } + bool IsValid() const { return valid_; } + + private: + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. + const Ch* end_; //!< Past-the-end position. + bool valid_; //!< Whether the parsing is valid. + }; + + //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. + template + class PercentEncodeStream { + public: + PercentEncodeStream(OutputStream& os) : os_(os) {} + void Put(char c) { // UTF-8 must be byte + unsigned char u = static_cast(c); + static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + os_.Put('%'); + os_.Put(static_cast(hexDigits[u >> 4])); + os_.Put(static_cast(hexDigits[u & 15])); + } + private: + OutputStream& os_; + }; + + Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. + Allocator* ownAllocator_; //!< Allocator owned by this Pointer. + Ch* nameBuffer_; //!< A buffer containing all names in tokens. + Token* tokens_; //!< A list of tokens. + size_t tokenCount_; //!< Number of tokens in tokens_. + size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. + PointerParseErrorCode parseErrorCode_; //!< Parsing error code. +}; + +//! GenericPointer for Value (UTF-8, default allocator). +typedef GenericPointer Pointer; + +//!@name Helper functions for GenericPointer +//@{ + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { + return pointer.Create(root, a); +} + +template +typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Create(root, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { + return pointer.Create(document); +} + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Create(document); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { + return pointer.Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { + return pointer.Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { + return GenericPointer(source, N - 1).Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Swap(root, value, a); +} + +template +typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Swap(root, value, a); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Swap(document, value); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Swap(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +bool EraseValueByPointer(T& root, const GenericPointer& pointer) { + return pointer.Erase(root); +} + +template +bool EraseValueByPointer(T& root, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Erase(root); +} + +//@} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_POINTER_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/prettywriter.h b/3rdparty/rapidjson/include/rapidjson/prettywriter.h new file mode 100644 index 0000000000..94eeb69db3 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/prettywriter.h @@ -0,0 +1,277 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_PRETTYWRITER_H_ +#define RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Combination of PrettyWriter format flags. +/*! \see PrettyWriter::SetFormatOptions + */ +enum PrettyFormatOptions { + kFormatDefault = 0, //!< Default pretty formatting. + kFormatSingleLineArray = 1 //!< Format arrays on a single line. +}; + +//! Writer with indentation and spacing. +/*! + \tparam OutputStream Type of output os. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class PrettyWriter : public Writer { +public: + typedef Writer Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + + + explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + PrettyWriter(PrettyWriter&& rhs) : + Base(std::forward(rhs)), indentChar_(rhs.indentChar_), indentCharCount_(rhs.indentCharCount_), formatOptions_(rhs.formatOptions_) {} +#endif + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + //! Set pretty writer formatting options. + /*! \param options Formatting options. + */ + PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { + formatOptions_ = options; + return *this; + } + + /*! @name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { PrettyPrefix(kNullType); return Base::EndValue(Base::WriteNull()); } + bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::EndValue(Base::WriteBool(b)); } + bool Int(int i) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt(i)); } + bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint(u)); } + bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteInt64(i64)); } + bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteUint64(u64)); } + bool Double(double d) { PrettyPrefix(kNumberType); return Base::EndValue(Base::WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kNumberType); + return Base::EndValue(Base::WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + PrettyPrefix(kStringType); + return Base::EndValue(Base::WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push()) typename Base::Level(false); + return Base::WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); // not inside an Object + RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); // currently inside an Array, not Object + RAPIDJSON_ASSERT(0 == Base::level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::EndValue(Base::WriteEndObject()); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + bool StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push()) typename Base::Level(true); + return Base::WriteStartArray(); + } + + bool EndArray(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::EndValue(Base::WriteEndArray()); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::Flush(); + return true; + } + + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + RAPIDJSON_ASSERT(json != 0); + PrettyPrefix(type); + return Base::EndValue(Base::WriteRawValue(json, length)); + } + +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::os_->Put(','); // add comma if it is not the first element in array + if (formatOptions_ & kFormatSingleLineArray) + Base::os_->Put(' '); + } + + if (!(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::os_->Put(','); + Base::os_->Put('\n'); + } + else { + Base::os_->Put(':'); + Base::os_->Put(' '); + } + } + else + Base::os_->Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. + Base::hasRoot_ = true; + } + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(*Base::os_, static_cast(indentChar_), count); + } + + Ch indentChar_; + unsigned indentCharCount_; + PrettyFormatOptions formatOptions_; + +private: + // Prohibit copy constructor & assignment operator. + PrettyWriter(const PrettyWriter&); + PrettyWriter& operator=(const PrettyWriter&); +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/rapidjson.h b/3rdparty/rapidjson/include/rapidjson/rapidjson.h new file mode 100644 index 0000000000..329ce92be8 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/rapidjson.h @@ -0,0 +1,676 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_RAPIDJSON_H_ +#define RAPIDJSON_RAPIDJSON_H_ + +/*!\file rapidjson.h + \brief common definitions and configuration + + \see RAPIDJSON_CONFIG + */ + +/*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration + \brief Configuration macros for library features + + Some RapidJSON features are configurable to adapt the library to a wide + variety of platforms, environments and usage scenarios. Most of the + features can be configured in terms of overridden or predefined + preprocessor macros at compile-time. + + Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. + + \note These macros should be given on the compiler command-line + (where applicable) to avoid inconsistent values when compiling + different translation units of a single application. + */ + +#include // malloc(), realloc(), free(), size_t +#include // memset(), memcpy(), memmove(), memcmp() + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_VERSION_STRING +// +// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. +// + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +// token stringification +#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) +#define RAPIDJSON_DO_STRINGIFY(x) #x + +// token concatenation +#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) +#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) +#define RAPIDJSON_DO_JOIN2(X, Y) X##Y +//!@endcond + +/*! \def RAPIDJSON_MAJOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Major version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_MINOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Minor version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_PATCH_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Patch version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_VERSION_STRING + \ingroup RAPIDJSON_CONFIG + \brief Version of RapidJSON in ".." string format. +*/ +#define RAPIDJSON_MAJOR_VERSION 1 +#define RAPIDJSON_MINOR_VERSION 1 +#define RAPIDJSON_PATCH_VERSION 0 +#define RAPIDJSON_VERSION_STRING \ + RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NAMESPACE_(BEGIN|END) +/*! \def RAPIDJSON_NAMESPACE + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace + + In order to avoid symbol clashes and/or "One Definition Rule" errors + between multiple inclusions of (different versions of) RapidJSON in + a single binary, users can customize the name of the main RapidJSON + namespace. + + In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE + to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple + levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref + RAPIDJSON_NAMESPACE_END need to be defined as well: + + \code + // in some .cpp file + #define RAPIDJSON_NAMESPACE my::rapidjson + #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { + #define RAPIDJSON_NAMESPACE_END } } + #include "rapidjson/..." + \endcode + + \see rapidjson + */ +/*! \def RAPIDJSON_NAMESPACE_BEGIN + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (opening expression) + \see RAPIDJSON_NAMESPACE +*/ +/*! \def RAPIDJSON_NAMESPACE_END + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (closing expression) + \see RAPIDJSON_NAMESPACE +*/ +#ifndef RAPIDJSON_NAMESPACE +#define RAPIDJSON_NAMESPACE rapidjson +#endif +#ifndef RAPIDJSON_NAMESPACE_BEGIN +#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { +#endif +#ifndef RAPIDJSON_NAMESPACE_END +#define RAPIDJSON_NAMESPACE_END } +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_HAS_STDSTRING + +#ifndef RAPIDJSON_HAS_STDSTRING +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation +#else +#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default +#endif +/*! \def RAPIDJSON_HAS_STDSTRING + \ingroup RAPIDJSON_CONFIG + \brief Enable RapidJSON support for \c std::string + + By defining this preprocessor symbol to \c 1, several convenience functions for using + \ref rapidjson::GenericValue with \c std::string are enabled, especially + for construction and comparison. + + \hideinitializer +*/ +#endif // !defined(RAPIDJSON_HAS_STDSTRING) + +#if RAPIDJSON_HAS_STDSTRING +#include +#endif // RAPIDJSON_HAS_STDSTRING + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_INT64DEFINE + +/*! \def RAPIDJSON_NO_INT64DEFINE + \ingroup RAPIDJSON_CONFIG + \brief Use external 64-bit integer types. + + RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types + to be available at global scope. + + If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to + prevent RapidJSON from defining its own types. +*/ +#ifndef RAPIDJSON_NO_INT64DEFINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 +#include "msinttypes/stdint.h" +#include "msinttypes/inttypes.h" +#else +// Other compilers should have this. +#include +#include +#endif +//!@endcond +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_INT64DEFINE +#endif +#endif // RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_FORCEINLINE + +#ifndef RAPIDJSON_FORCEINLINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __forceinline +#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) +#else +#define RAPIDJSON_FORCEINLINE +#endif +//!@endcond +#endif // RAPIDJSON_FORCEINLINE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ENDIAN +#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! + \def RAPIDJSON_ENDIAN + \ingroup RAPIDJSON_CONFIG + + GCC 4.6 provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define RAPIDJSON_ENDIAN to either + \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. + + Default detection implemented with reference to + \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html + \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp +*/ +#ifndef RAPIDJSON_ENDIAN +// Detect with GCC 4.6's macro +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __BYTE_ORDER__ +// Detect with GLIBC's endian.h +# elif defined(__GLIBC__) +# include +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __GLIBC__ +// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro +# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +// Detect with architecture macros +# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(RAPIDJSON_DOXYGEN_RUNNING) +# define RAPIDJSON_ENDIAN +# else +# error Unknown machine endianness detected. User needs to define RAPIDJSON_ENDIAN. +# endif +#endif // RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_64BIT + +//! Whether using 64-bit architecture +#ifndef RAPIDJSON_64BIT +#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) +#define RAPIDJSON_64BIT 1 +#else +#define RAPIDJSON_64BIT 0 +#endif +#endif // RAPIDJSON_64BIT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ALIGN + +//! Data alignment of the machine. +/*! \ingroup RAPIDJSON_CONFIG + \param x pointer to align + + Some machines require strict data alignment. The default is 8 bytes. + User can customize by defining the RAPIDJSON_ALIGN function macro. +*/ +#ifndef RAPIDJSON_ALIGN +#define RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_UINT64_C2 + +//! Construct a 64-bit literal by a pair of 32-bit integer. +/*! + 64-bit literal with or without ULL suffix is prone to compiler warnings. + UINT64_C() is C macro which cause compilation problems. + Use this macro to define 64-bit constants by a pair of 32-bit integer. +*/ +#ifndef RAPIDJSON_UINT64_C2 +#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_48BITPOINTER_OPTIMIZATION + +//! Use only lower 48-bit address for some pointers. +/*! + \ingroup RAPIDJSON_CONFIG + + This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. + The higher 16-bit can be used for storing other data. + \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. +*/ +#ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 +#else +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 +#endif +#endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION + +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 +#if RAPIDJSON_64BIT != 1 +#error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 +#endif +#define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) +#define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) +#else +#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) +#define RAPIDJSON_GETPOINTER(type, p) (p) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_NEON/RAPIDJSON_SIMD + +/*! \def RAPIDJSON_SIMD + \ingroup RAPIDJSON_CONFIG + \brief Enable SSE2/SSE4.2/Neon optimization. + + RapidJSON supports optimized implementations for some parsing operations + based on the SSE2, SSE4.2 or NEon SIMD extensions on modern Intel + or ARM compatible processors. + + To enable these optimizations, three different symbols can be defined; + \code + // Enable SSE2 optimization. + #define RAPIDJSON_SSE2 + + // Enable SSE4.2 optimization. + #define RAPIDJSON_SSE42 + \endcode + + // Enable ARM Neon optimization. + #define RAPIDJSON_NEON + \endcode + + \c RAPIDJSON_SSE42 takes precedence over SSE2, if both are defined. + + If any of these symbols is defined, RapidJSON defines the macro + \c RAPIDJSON_SIMD to indicate the availability of the optimized code. +*/ +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ + || defined(RAPIDJSON_NEON) || defined(RAPIDJSON_DOXYGEN_RUNNING) +#define RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef RAPIDJSON_NO_SIZETYPEDEFINE +/*! \def RAPIDJSON_NO_SIZETYPEDEFINE + \ingroup RAPIDJSON_CONFIG + \brief User-provided \c SizeType definition. + + In order to avoid using 32-bit size types for indexing strings and arrays, + define this preprocessor symbol and provide the type rapidjson::SizeType + before including RapidJSON: + \code + #define RAPIDJSON_NO_SIZETYPEDEFINE + namespace rapidjson { typedef ::std::size_t SizeType; } + #include "rapidjson/..." + \endcode + + \see rapidjson::SizeType +*/ +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_SIZETYPEDEFINE +#endif +RAPIDJSON_NAMESPACE_BEGIN +//! Size type (for string lengths, array sizes, etc.) +/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, + instead of using \c size_t. Users may override the SizeType by defining + \ref RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +RAPIDJSON_NAMESPACE_END +#endif + +// always import std::size_t to rapidjson namespace +RAPIDJSON_NAMESPACE_BEGIN +using std::size_t; +RAPIDJSON_NAMESPACE_END + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ASSERT + +//! Assertion. +/*! \ingroup RAPIDJSON_CONFIG + By default, rapidjson uses C \c assert() for internal assertions. + User can override it by defining RAPIDJSON_ASSERT(x) macro. + + \note Parsing errors are handled and can be customized by the + \ref RAPIDJSON_ERRORS APIs. +*/ +#ifndef RAPIDJSON_ASSERT +#include +#define RAPIDJSON_ASSERT(x) assert(x) +#endif // RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_STATIC_ASSERT + +// Prefer C++11 static_assert, if available +#ifndef RAPIDJSON_STATIC_ASSERT +#if __cplusplus >= 201103L || ( defined(_MSC_VER) && _MSC_VER >= 1800 ) +#define RAPIDJSON_STATIC_ASSERT(x) \ + static_assert(x, RAPIDJSON_STRINGIFY(x)) +#endif // C++11 +#endif // RAPIDJSON_STATIC_ASSERT + +// Adopt C++03 implementation from boost +#ifndef RAPIDJSON_STATIC_ASSERT +#ifndef __clang__ +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#endif +RAPIDJSON_NAMESPACE_BEGIN +template struct STATIC_ASSERTION_FAILURE; +template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; +template struct StaticAssertTest {}; +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +#else +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif +#ifndef __clang__ +//!@endcond +#endif + +/*! \def RAPIDJSON_STATIC_ASSERT + \brief (Internal) macro to check for conditions at compile-time + \param x compile-time condition + \hideinitializer + */ +#define RAPIDJSON_STATIC_ASSERT(x) \ + typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ + sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ + RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif // RAPIDJSON_STATIC_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY + +//! Compiler branching hint for expression with high probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression likely to be true. +*/ +#ifndef RAPIDJSON_LIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define RAPIDJSON_LIKELY(x) (x) +#endif +#endif + +//! Compiler branching hint for expression with low probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression unlikely to be true. +*/ +#ifndef RAPIDJSON_UNLIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define RAPIDJSON_UNLIKELY(x) (x) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#define RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +// adopted from Boost +#define RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +#if defined(__has_builtin) +#define RAPIDJSON_HAS_BUILTIN(x) __has_builtin(x) +#else +#define RAPIDJSON_HAS_BUILTIN(x) 0 +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF + +#if defined(__GNUC__) +#define RAPIDJSON_GNUC \ + RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) +#endif + +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) + +#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) +#define RAPIDJSON_DIAG_OFF(x) \ + RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define RAPIDJSON_PRAGMA(x) __pragma(x) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) + +#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ + +#endif // RAPIDJSON_DIAG_* + +/////////////////////////////////////////////////////////////////////////////// +// C++11 features + +#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS +#if defined(__clang__) +#if __has_feature(cxx_rvalue_references) && \ + (defined(_MSC_VER) || defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1600) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) + +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + +#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1900) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#else +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 +#endif +#endif +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT noexcept +#else +#define RAPIDJSON_NOEXCEPT /* noexcept */ +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT + +// no automatic detection, yet +#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS +#if (defined(_MSC_VER) && _MSC_VER >= 1700) +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 1 +#else +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 +#endif +#endif + +#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1700) || \ + (defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 && defined(__GXX_EXPERIMENTAL_CXX0X__)) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 +#else +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RANGE_FOR + +/////////////////////////////////////////////////////////////////////////////// +// C++17 features + +#if defined(__has_cpp_attribute) +# if __has_cpp_attribute(fallthrough) +# define RAPIDJSON_DELIBERATE_FALLTHROUGH [[fallthrough]] +# else +# define RAPIDJSON_DELIBERATE_FALLTHROUGH +# endif +#else +# define RAPIDJSON_DELIBERATE_FALLTHROUGH +#endif + +//!@endcond + +//! Assertion (in non-throwing contexts). + /*! \ingroup RAPIDJSON_CONFIG + Some functions provide a \c noexcept guarantee, if the compiler supports it. + In these cases, the \ref RAPIDJSON_ASSERT macro cannot be overridden to + throw an exception. This macro adds a separate customization point for + such cases. + + Defaults to C \c assert() (as \ref RAPIDJSON_ASSERT), if \c noexcept is + supported, and to \ref RAPIDJSON_ASSERT otherwise. + */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NOEXCEPT_ASSERT + +#ifndef RAPIDJSON_NOEXCEPT_ASSERT +#ifdef RAPIDJSON_ASSERT_THROWS +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT_ASSERT(x) +#else +#include +#define RAPIDJSON_NOEXCEPT_ASSERT(x) assert(x) +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT +#else +#define RAPIDJSON_NOEXCEPT_ASSERT(x) RAPIDJSON_ASSERT(x) +#endif // RAPIDJSON_ASSERT_THROWS +#endif // RAPIDJSON_NOEXCEPT_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// new/delete + +#ifndef RAPIDJSON_NEW +///! customization point for global \c new +#define RAPIDJSON_NEW(TypeName) new TypeName +#endif +#ifndef RAPIDJSON_DELETE +///! customization point for global \c delete +#define RAPIDJSON_DELETE(x) delete x +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Type + +/*! \namespace rapidjson + \brief main RapidJSON namespace + \see RAPIDJSON_NAMESPACE +*/ +RAPIDJSON_NAMESPACE_BEGIN + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6 //!< number +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/reader.h b/3rdparty/rapidjson/include/rapidjson/reader.h new file mode 100644 index 0000000000..0f85032a72 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/reader.h @@ -0,0 +1,2236 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_READER_H_ +#define RAPIDJSON_READER_H_ + +/*! \file reader.h */ + +#include "allocators.h" +#include "stream.h" +#include "encodedstream.h" +#include "internal/clzll.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strtod.h" +#include + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#elif defined(RAPIDJSON_NEON) +#include +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(old-style-cast) +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define RAPIDJSON_NOTHING /* deliberately empty */ +#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ + RAPIDJSON_MULTILINEMACRO_END +#endif +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) +//!@endcond + +/*! \def RAPIDJSON_PARSE_ERROR_NORETURN + \ingroup RAPIDJSON_ERRORS + \brief Macro to indicate a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + This macros can be used as a customization point for the internal + error handling mechanism of RapidJSON. + + A common usage model is to throw an exception instead of requiring the + caller to explicitly check the \ref rapidjson::GenericReader::Parse's + return value: + + \code + #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ + throw ParseException(parseErrorCode, #parseErrorCode, offset) + + #include // std::runtime_error + #include "rapidjson/error/error.h" // rapidjson::ParseResult + + struct ParseException : std::runtime_error, rapidjson::ParseResult { + ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) + : std::runtime_error(msg), ParseResult(code, offset) {} + }; + + #include "rapidjson/reader.h" + \endcode + + \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse + */ +#ifndef RAPIDJSON_PARSE_ERROR_NORETURN +#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ + SetParseError(parseErrorCode, offset); \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +/*! \def RAPIDJSON_PARSE_ERROR + \ingroup RAPIDJSON_ERRORS + \brief (Internal) macro to indicate and handle a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. + + \see RAPIDJSON_PARSE_ERROR_NORETURN + \hideinitializer + */ +#ifndef RAPIDJSON_PARSE_ERROR +#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +#include "error/error.h" // ParseErrorCode, ParseResult + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +/*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kParseDefaultFlags definition. + + User can define this as any \c ParseFlag combinations. +*/ +#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS +#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags +#endif + +//! Combination of parseFlags +/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream + */ +enum ParseFlag { + kParseNoFlags = 0, //!< No flags are set. + kParseInsituFlag = 1, //!< In-situ(destructive) parsing. + kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. + kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. + kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. + kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). + kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. + kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. + kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. + kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. + kParseEscapedApostropheFlag = 512, //!< Allow escaped apostrophe in strings. + kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. + The functions return true if no error occurs. If they return false, + the event publisher should terminate the process. +\code +concept Handler { + typename Ch; + + bool Null(); + bool Bool(bool b); + bool Int(int i); + bool Uint(unsigned i); + bool Int64(int64_t i); + bool Uint64(uint64_t i); + bool Double(double d); + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType length, bool copy); + bool String(const Ch* str, SizeType length, bool copy); + bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); + bool EndObject(SizeType memberCount); + bool StartArray(); + bool EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \note implements Handler concept +*/ +template, typename Derived = void> +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; + + bool Default() { return true; } + bool Null() { return static_cast(*this).Default(); } + bool Bool(bool) { return static_cast(*this).Default(); } + bool Int(int) { return static_cast(*this).Default(); } + bool Uint(unsigned) { return static_cast(*this).Default(); } + bool Int64(int64_t) { return static_cast(*this).Default(); } + bool Uint64(uint64_t) { return static_cast(*this).Default(); } + bool Double(double) { return static_cast(*this).Default(); } + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } + bool StartObject() { return static_cast(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool EndObject(SizeType) { return static_cast(*this).Default(); } + bool StartArray() { return static_cast(*this).Default(); } + bool EndArray(SizeType) { return static_cast(*this).Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimization. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param is A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + typename InputStream::Ch c; + while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') + s.Take(); +} + +inline const char* SkipWhitespace(const char* p, const char* end) { + while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + return p; +} + +#ifdef RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The middle of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + const int r = _mm_cmpistri(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | _SIDD_NEGATIVE_POLARITY); + if (r != 16) // some of characters is non-whitespace + return p + r; + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_NEON) + +//! Skip whitespace with ARM Neon instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + return p + 8 + (lz >> 3); + } + } else { + uint32_t lz = internal::clzll(low); + return p + (lz >> 3); + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + const uint8x16_t w0 = vmovq_n_u8(' '); + const uint8x16_t w1 = vmovq_n_u8('\n'); + const uint8x16_t w2 = vmovq_n_u8('\r'); + const uint8x16_t w3 = vmovq_n_u8('\t'); + + for (; p <= end - 16; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, w0); + x = vorrq_u8(x, vceqq_u8(s, w1)); + x = vorrq_u8(x, vceqq_u8(s, w2)); + x = vorrq_u8(x, vceqq_u8(s, w3)); + + x = vmvnq_u8(x); // Negate + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + return p + 8 + (lz >> 3); + } + } else { + uint32_t lz = internal::clzll(low); + return p + (lz >> 3); + } + } + + return SkipWhitespace(p, end); +} + +#endif // RAPIDJSON_NEON + +#ifdef RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& is) { + is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& is) { + is.src_ = SkipWhitespace_SIMD(is.src_); +} + +template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { + is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); +} +#endif // RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam SourceEncoding Encoding of the input stream. + \tparam TargetEncoding Encoding of the parse output. + \tparam StackAllocator Allocator type for stack. +*/ +template +class GenericReader { +public: + typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type + + //! Constructor. + /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : + stack_(stackAllocator, stackCapacity), parseResult_(), state_(IterativeParsingStartState) {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + if (parseFlags & kParseIterativeFlag) + return IterativeParse(is, handler); + + parseResult_.Clear(); + + ClearStackOnExit scope(*this); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + else { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (!(parseFlags & kParseStopWhenDoneFlag)) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + } + } + + return parseResult_; + } + + //! Parse JSON text (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + return Parse(is, handler); + } + + //! Initialize JSON text token-by-token parsing + /*! + */ + void IterativeParseInit() { + parseResult_.Clear(); + state_ = IterativeParsingStartState; + } + + //! Parse one token from JSON text + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + bool IterativeParseNext(InputStream& is, Handler& handler) { + while (RAPIDJSON_LIKELY(is.Peek() != '\0')) { + SkipWhitespaceAndComments(is); + + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state_, t); + IterativeParsingState d = Transit(state_, t, n, is, handler); + + // If we've finished or hit an error... + if (RAPIDJSON_UNLIKELY(IsIterativeParsingCompleteState(d))) { + // Report errors. + if (d == IterativeParsingErrorState) { + HandleError(state_, is); + return false; + } + + // Transition to the finish state. + RAPIDJSON_ASSERT(d == IterativeParsingFinishState); + state_ = d; + + // If StopWhenDone is not set... + if (!(parseFlags & kParseStopWhenDoneFlag)) { + // ... and extra non-whitespace data is found... + SkipWhitespaceAndComments(is); + if (is.Peek() != '\0') { + // ... this is considered an error. + HandleError(state_, is); + return false; + } + } + + // Success! We are done! + return true; + } + + // Transition to the new state. + state_ = d; + + // If we parsed anything other than a delimiter, we invoked the handler, so we can return true now. + if (!IsIterativeParsingDelimiterState(n)) + return true; + } + + // We reached the end of file. + stack_.Clear(); + + if (state_ != IterativeParsingFinishState) { + HandleError(state_, is); + return false; + } + + return true; + } + + //! Check if token-by-token parsing JSON text is complete + /*! \return Whether the JSON has been fully decoded. + */ + RAPIDJSON_FORCEINLINE bool IterativeParseComplete() const { + return IsIterativeParsingCompleteState(state_); + } + + //! Whether a parse error has occurred in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + +protected: + void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } + +private: + // Prohibit copy constructor & assignment operator. + GenericReader(const GenericReader&); + GenericReader& operator=(const GenericReader&); + + void ClearStack() { stack_.Clear(); } + + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericReader& r) : r_(r) {} + ~ClearStackOnExit() { r_.ClearStack(); } + private: + GenericReader& r_; + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + }; + + template + void SkipWhitespaceAndComments(InputStream& is) { + SkipWhitespace(is); + + if (parseFlags & kParseCommentsFlag) { + while (RAPIDJSON_UNLIKELY(Consume(is, '/'))) { + if (Consume(is, '*')) { + while (true) { + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + else if (Consume(is, '*')) { + if (Consume(is, '/')) + break; + } + else + is.Take(); + } + } + else if (RAPIDJSON_LIKELY(Consume(is, '/'))) + while (is.Peek() != '\0' && is.Take() != '\n') {} + else + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + + SkipWhitespace(is); + } + } + } + + // Parse object: { string : value, ... } + template + void ParseObject(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '{'); + is.Take(); // Skip '{' + + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, '}')) { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType memberCount = 0;;) { + if (RAPIDJSON_UNLIKELY(is.Peek() != '"')) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + + ParseString(is, handler, true); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (RAPIDJSON_UNLIKELY(!Consume(is, ':'))) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++memberCount; + + switch (is.Peek()) { + case ',': + is.Take(); + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + break; + case '}': + is.Take(); + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy + } + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == '}') { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + // Parse array: [ value, ... ] + template + void ParseArray(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '['); + is.Take(); // Skip '[' + + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++elementCount; + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ',')) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + } + else if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == ']') { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + template + void ParseNull(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'n'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { + if (RAPIDJSON_UNLIKELY(!handler.Null())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseTrue(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 't'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(true))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseFalse(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'f'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(false))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { + if (RAPIDJSON_LIKELY(is.Peek() == expect)) { + is.Take(); + return true; + } + else + return false; + } + + // Helper function to parse four hexadecimal digits in \uXXXX in ParseString(). + template + unsigned ParseHex4(InputStream& is, size_t escapeOffset) { + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = is.Peek(); + codepoint <<= 4; + codepoint += static_cast(c); + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); + } + is.Take(); + } + return codepoint; + } + + template + class StackStream { + public: + typedef CharType Ch; + + StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} + RAPIDJSON_FORCEINLINE void Put(Ch c) { + *stack_.template Push() = c; + ++length_; + } + + RAPIDJSON_FORCEINLINE void* Push(SizeType count) { + length_ += count; + return stack_.template Push(count); + } + + size_t Length() const { return length_; } + + Ch* Pop() { + return stack_.template Pop(length_); + } + + private: + StackStream(const StackStream&); + StackStream& operator=(const StackStream&); + + internal::Stack& stack_; + SizeType length_; + }; + + // Parse string and generate String event. Different code paths for kParseInsituFlag. + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + RAPIDJSON_ASSERT(s.Peek() == '\"'); + s.Take(); // Skip '\"' + + bool success = false; + if (parseFlags & kParseInsituFlag) { + typename InputStream::Ch *head = s.PutBegin(); + ParseStringToStream(s, s); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + size_t length = s.PutEnd(head) - 1; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); + } + else { + StackStream stackStream(stack_); + ParseStringToStream(s, stackStream); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + SizeType length = static_cast(stackStream.Length()) - 1; + const typename TargetEncoding::Ch* const str = stackStream.Pop(); + success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); + } + if (RAPIDJSON_UNLIKELY(!success)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse string to an output is + // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. + template + RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const char escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 +//!@endcond + + for (;;) { + // Scan and copy string before "\\\"" or < 0x20. This is an optional optimzation. + if (!(parseFlags & kParseValidateEncodingFlag)) + ScanCopyUnescapedString(is, os); + + Ch c = is.Peek(); + if (RAPIDJSON_UNLIKELY(c == '\\')) { // Escape + size_t escapeOffset = is.Tell(); // For invalid escaping, report the initial '\\' as error offset + is.Take(); + Ch e = is.Peek(); + if ((sizeof(Ch) == 1 || unsigned(e) < 256) && RAPIDJSON_LIKELY(escape[static_cast(e)])) { + is.Take(); + os.Put(static_cast(escape[static_cast(e)])); + } + else if ((parseFlags & kParseEscapedApostropheFlag) && RAPIDJSON_LIKELY(e == '\'')) { // Allow escaped apostrophe + is.Take(); + os.Put('\''); + } + else if (RAPIDJSON_LIKELY(e == 'u')) { // Unicode + is.Take(); + unsigned codepoint = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDBFF)) { + // Handle UTF-16 surrogate pair + if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + unsigned codepoint2 = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + TEncoding::Encode(os, codepoint); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); + } + else if (RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote + is.Take(); + os.Put('\0'); // null-terminate the string + return; + } + else if (RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + if (c == '\0') + RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, is.Tell()); + } + else { + size_t offset = is.Tell(); + if (RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? + !Transcoder::Validate(is, os) : + !Transcoder::Transcode(is, os)))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); + } + } + } + + template + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { + // Do nothing for generic version + } + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType length; + #ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; + #else + length = static_cast(__builtin_ffs(r) - 1); + #endif + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16, q += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + for (const char* pend = p + length; p != pend; ) + *q++ = *p++; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + p += length; + break; + } + } + + is.src_ = is.dst_ = p; + } +#elif defined(RAPIDJSON_NEON) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + length = 8 + (lz >> 3); + escaped = true; + } + } else { + uint32_t lz = internal::clzll(low); + length = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + if (length != 0) { + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + } + break; + } + vst1q_u8(reinterpret_cast(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16, q += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + SizeType length = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + length = 8 + (lz >> 3); + escaped = true; + } + } else { + uint32_t lz = internal::clzll(low); + length = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + for (const char* pend = p + length; p != pend; ) { + *q++ = *p++; + } + break; + } + vst1q_u8(reinterpret_cast(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (;; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + p += 8 + (lz >> 3); + break; + } + } else { + uint32_t lz = internal::clzll(low); + p += lz >> 3; + break; + } + } + + is.src_ = is.dst_ = p; + } +#endif // RAPIDJSON_NEON + + template + class NumberStream; + + template + class NumberStream { + public: + typedef typename InputStream::Ch Ch; + + NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } + + RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } + RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } + RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } + RAPIDJSON_FORCEINLINE void Push(char) {} + + size_t Tell() { return is.Tell(); } + size_t Length() { return 0; } + const char* Pop() { return 0; } + + protected: + NumberStream& operator=(const NumberStream&); + + InputStream& is; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is), stackStream(reader.stack_) {} + + RAPIDJSON_FORCEINLINE Ch TakePush() { + stackStream.Put(static_cast(Base::is.Peek())); + return Base::is.Take(); + } + + RAPIDJSON_FORCEINLINE void Push(char c) { + stackStream.Put(c); + } + + size_t Length() { return stackStream.Length(); } + + const char* Pop() { + stackStream.Put('\0'); + return stackStream.Pop(); + } + + private: + StackStream stackStream; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {} + + RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } + }; + + template + void ParseNumber(InputStream& is, Handler& handler) { + internal::StreamLocalCopy copy(is); + NumberStream s(*this, copy.s); + + size_t startOffset = s.Tell(); + double d = 0.0; + bool useNanOrInf = false; + + // Parse minus + bool minus = Consume(s, '-'); + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i = 0; + uint64_t i64 = 0; + bool use64bit = false; + int significandDigit = 0; + if (RAPIDJSON_UNLIKELY(s.Peek() == '0')) { + i = 0; + s.TakePush(); + } + else if (RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { + i = static_cast(s.TakePush() - '0'); + + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 + if (RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 + if (RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + // Parse NaN or Infinity here + else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { + if (Consume(s, 'N')) { + if (Consume(s, 'a') && Consume(s, 'N')) { + d = std::numeric_limits::quiet_NaN(); + useNanOrInf = true; + } + } + else if (RAPIDJSON_LIKELY(Consume(s, 'I'))) { + if (Consume(s, 'n') && Consume(s, 'f')) { + d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); + useNanOrInf = true; + + if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') + && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) { + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + } + + if (RAPIDJSON_UNLIKELY(!useNanOrInf)) { + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + + // Parse 64bit int + bool useDouble = false; + if (use64bit) { + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + + // Force double for big integer + if (useDouble) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + d = d * 10 + (s.TakePush() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + size_t decimalPosition; + if (Consume(s, '.')) { + decimalPosition = s.Length(); + + if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); + + if (!useDouble) { +#if RAPIDJSON_64BIT + // Use i64 to store significand in 64-bit architecture + if (!use64bit) + i64 = i; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path + break; + else { + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + --expFrac; + if (i64 != 0) + significandDigit++; + } + } + + d = static_cast(i64); +#else + // Use double to store significand in 32-bit architecture + d = static_cast(use64bit ? i64 : i); +#endif + useDouble = true; + } + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (significandDigit < 17) { + d = d * 10.0 + (s.TakePush() - '0'); + --expFrac; + if (RAPIDJSON_LIKELY(d > 0.0)) + significandDigit++; + } + else + s.TakePush(); + } + } + else + decimalPosition = s.Length(); // decimal position at the end of integer. + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (Consume(s, 'e') || Consume(s, 'E')) { + if (!useDouble) { + d = static_cast(use64bit ? i64 : i); + useDouble = true; + } + + bool expMinus = false; + if (Consume(s, '+')) + ; + else if (Consume(s, '-')) + expMinus = true; + + if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = static_cast(s.Take() - '0'); + if (expMinus) { + // (exp + expFrac) must not underflow int => we're detecting when -exp gets + // dangerously close to INT_MIN (a pessimistic next digit 9 would push it into + // underflow territory): + // + // -(exp * 10 + 9) + expFrac >= INT_MIN + // <=> exp <= (expFrac - INT_MIN - 9) / 10 + RAPIDJSON_ASSERT(expFrac <= 0); + int maxExp = (expFrac + 2147483639) / 10; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) { + while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent + s.Take(); + } + } + } + else { // positive exp + int maxExp = 308 - expFrac; + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + bool cont = true; + + if (parseFlags & kParseNumbersAsStringsFlag) { + if (parseFlags & kParseInsituFlag) { + s.Pop(); // Pop stack no matter if it will be used or not. + typename InputStream::Ch* head = is.PutBegin(); + const size_t length = s.Tell() - startOffset; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + // unable to insert the \0 character here, it will erase the comma after this number + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + cont = handler.RawNumber(str, SizeType(length), false); + } + else { + SizeType numCharsToCopy = static_cast(s.Length()); + StringStream srcStream(s.Pop()); + StackStream dstStream(stack_); + while (numCharsToCopy--) { + Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); + } + dstStream.Put('\0'); + const typename TargetEncoding::Ch* str = dstStream.Pop(); + const SizeType length = static_cast(dstStream.Length()) - 1; + cont = handler.RawNumber(str, SizeType(length), true); + } + } + else { + size_t length = s.Length(); + const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not. + + if (useDouble) { + int p = exp + expFrac; + if (parseFlags & kParseFullPrecisionFlag) + d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); + else + d = internal::StrtodNormalPrecision(d, p); + + // Use > max, instead of == inf, to fix bogus warning -Wfloat-equal + if (d > (std::numeric_limits::max)()) { + // Overflow + // TODO: internal::StrtodX should report overflow (or underflow) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + + cont = handler.Double(minus ? -d : d); + } + else if (useNanOrInf) { + cont = handler.Double(d); + } + else { + if (use64bit) { + if (minus) + cont = handler.Int64(static_cast(~i64 + 1)); + else + cont = handler.Uint64(i64); + } + else { + if (minus) + cont = handler.Int(static_cast(~i + 1)); + else + cont = handler.Uint(i); + } + } + } + if (RAPIDJSON_UNLIKELY(!cont)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); + } + + // Parse any JSON value + template + void ParseValue(InputStream& is, Handler& handler) { + switch (is.Peek()) { + case 'n': ParseNull (is, handler); break; + case 't': ParseTrue (is, handler); break; + case 'f': ParseFalse (is, handler); break; + case '"': ParseString(is, handler); break; + case '{': ParseObject(is, handler); break; + case '[': ParseArray (is, handler); break; + default : + ParseNumber(is, handler); + break; + + } + } + + // Iterative Parsing + + // States + enum IterativeParsingState { + IterativeParsingFinishState = 0, // sink states at top + IterativeParsingErrorState, // sink states at top + IterativeParsingStartState, + + // Object states + IterativeParsingObjectInitialState, + IterativeParsingMemberKeyState, + IterativeParsingMemberValueState, + IterativeParsingObjectFinishState, + + // Array states + IterativeParsingArrayInitialState, + IterativeParsingElementState, + IterativeParsingArrayFinishState, + + // Single value state + IterativeParsingValueState, + + // Delimiter states (at bottom) + IterativeParsingElementDelimiterState, + IterativeParsingMemberDelimiterState, + IterativeParsingKeyValueDelimiterState, + + cIterativeParsingStateCount + }; + + // Tokens + enum Token { + LeftBracketToken = 0, + RightBracketToken, + + LeftCurlyBracketToken, + RightCurlyBracketToken, + + CommaToken, + ColonToken, + + StringToken, + FalseToken, + TrueToken, + NullToken, + NumberToken, + + kTokenCount + }; + + RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) const { + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define N NumberToken +#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N + // Maps from ASCII to Token + static const unsigned char tokenMap[256] = { + N16, // 00~0F + N16, // 10~1F + N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F + N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F + N16, // 40~4F + N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F + N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F + N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F + N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF + }; +#undef N +#undef N16 +//!@endcond + + if (sizeof(Ch) == 1 || static_cast(c) < 256) + return static_cast(tokenMap[static_cast(c)]); + else + return NumberToken; + } + + RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) const { + // current state x one lookahead token -> new state + static const char G[cIterativeParsingStateCount][kTokenCount] = { + // Finish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Error(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Start + { + IterativeParsingArrayInitialState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingValueState, // String + IterativeParsingValueState, // False + IterativeParsingValueState, // True + IterativeParsingValueState, // Null + IterativeParsingValueState // Number + }, + // ObjectInitial + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberKey + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingKeyValueDelimiterState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberValue + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingMemberDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ObjectFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ArrayInitial + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // Element + { + IterativeParsingErrorState, // Left bracket + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingElementDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ArrayFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Single Value (sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ElementDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // MemberDelimiter + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // KeyValueDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberValueState, // String + IterativeParsingMemberValueState, // False + IterativeParsingMemberValueState, // True + IterativeParsingMemberValueState, // Null + IterativeParsingMemberValueState // Number + }, + }; // End of G + + return static_cast(G[state][token]); + } + + // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). + // May return a new state on state pop. + template + RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { + (void)token; + + switch (dst) { + case IterativeParsingErrorState: + return dst; + + case IterativeParsingObjectInitialState: + case IterativeParsingArrayInitialState: + { + // Push the state(Element or MemeberValue) if we are nested in another array or value of member. + // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. + IterativeParsingState n = src; + if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) + n = IterativeParsingElementState; + else if (src == IterativeParsingKeyValueDelimiterState) + n = IterativeParsingMemberValueState; + // Push current state. + *stack_.template Push(1) = n; + // Initialize and push the member/element count. + *stack_.template Push(1) = 0; + // Call handler + bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return dst; + } + } + + case IterativeParsingMemberKeyState: + ParseString(is, handler, true); + if (HasParseError()) + return IterativeParsingErrorState; + else + return dst; + + case IterativeParsingKeyValueDelimiterState: + RAPIDJSON_ASSERT(token == ColonToken); + is.Take(); + return dst; + + case IterativeParsingMemberValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingElementState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingMemberDelimiterState: + case IterativeParsingElementDelimiterState: + is.Take(); + // Update member/element count. + *stack_.template Top() = *stack_.template Top() + 1; + return dst; + + case IterativeParsingObjectFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); + return IterativeParsingErrorState; + } + // Get member count. + SizeType c = *stack_.template Pop(1); + // If the object is not empty, count the last member. + if (src == IterativeParsingMemberValueState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndObject(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingArrayFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); + return IterativeParsingErrorState; + } + // Get element count. + SizeType c = *stack_.template Pop(1); + // If the array is not empty, count the last element. + if (src == IterativeParsingElementState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndArray(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + default: + // This branch is for IterativeParsingValueState actually. + // Use `default:` rather than + // `case IterativeParsingValueState:` is for code coverage. + + // The IterativeParsingStartState is not enumerated in this switch-case. + // It is impossible for that case. And it can be caught by following assertion. + + // The IterativeParsingFinishState is not enumerated in this switch-case either. + // It is a "derivative" state which cannot triggered from Predict() directly. + // Therefore it cannot happen here. And it can be caught by following assertion. + RAPIDJSON_ASSERT(dst == IterativeParsingValueState); + + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return IterativeParsingFinishState; + } + } + + template + void HandleError(IterativeParsingState src, InputStream& is) { + if (HasParseError()) { + // Error flag has been set. + return; + } + + switch (src) { + case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; + case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; + case IterativeParsingObjectInitialState: + case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; + case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; + case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; + case IterativeParsingKeyValueDelimiterState: + case IterativeParsingArrayInitialState: + case IterativeParsingElementDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; + default: RAPIDJSON_ASSERT(src == IterativeParsingElementState); RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; + } + } + + RAPIDJSON_FORCEINLINE bool IsIterativeParsingDelimiterState(IterativeParsingState s) const { + return s >= IterativeParsingElementDelimiterState; + } + + RAPIDJSON_FORCEINLINE bool IsIterativeParsingCompleteState(IterativeParsingState s) const { + return s <= IterativeParsingErrorState; + } + + template + ParseResult IterativeParse(InputStream& is, Handler& handler) { + parseResult_.Clear(); + ClearStackOnExit scope(*this); + IterativeParsingState state = IterativeParsingStartState; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + while (is.Peek() != '\0') { + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state, t); + IterativeParsingState d = Transit(state, t, n, is, handler); + + if (d == IterativeParsingErrorState) { + HandleError(state, is); + break; + } + + state = d; + + // Do not further consume streams if a root JSON has been parsed. + if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) + break; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + + // Handle the end of file. + if (state != IterativeParsingFinishState) + HandleError(state, is); + + return parseResult_; + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + ParseResult parseResult_; + IterativeParsingState state_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader, UTF8<> > Reader; + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_READER_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/schema.h b/3rdparty/rapidjson/include/rapidjson/schema.h new file mode 100644 index 0000000000..fc39d06c5f --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/schema.h @@ -0,0 +1,2496 @@ +// Tencent is pleased to support the open source community by making RapidJSON available-> +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License-> You may obtain a copy of the License at +// +// http://opensource->org/licenses/MIT +// +// 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-> + +#ifndef RAPIDJSON_SCHEMA_H_ +#define RAPIDJSON_SCHEMA_H_ + +#include "document.h" +#include "pointer.h" +#include "stringbuffer.h" +#include // abs, floor + +#if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX) +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 +#endif + +#if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX && defined(RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) +#define RAPIDJSON_SCHEMA_USE_STDREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_STDREGEX 0 +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX +#include "internal/regex.h" +#elif RAPIDJSON_SCHEMA_USE_STDREGEX +#include +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX +#define RAPIDJSON_SCHEMA_HAS_REGEX 1 +#else +#define RAPIDJSON_SCHEMA_HAS_REGEX 0 +#endif + +#ifndef RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_VERBOSE 0 +#endif + +#if RAPIDJSON_SCHEMA_VERBOSE +#include "stringbuffer.h" +#endif + +RAPIDJSON_DIAG_PUSH + +#if defined(__GNUC__) +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(weak-vtables) +RAPIDJSON_DIAG_OFF(exit-time-destructors) +RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) +RAPIDJSON_DIAG_OFF(variadic-macros) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Verbose Utilities + +#if RAPIDJSON_SCHEMA_VERBOSE + +namespace internal { + +inline void PrintInvalidKeyword(const char* keyword) { + printf("Fail keyword: %s\n", keyword); +} + +inline void PrintInvalidKeyword(const wchar_t* keyword) { + wprintf(L"Fail keyword: %ls\n", keyword); +} + +inline void PrintInvalidDocument(const char* document) { + printf("Fail document: %s\n\n", document); +} + +inline void PrintInvalidDocument(const wchar_t* document) { + wprintf(L"Fail document: %ls\n\n", document); +} + +inline void PrintValidatorPointers(unsigned depth, const char* s, const char* d) { + printf("S: %*s%s\nD: %*s%s\n\n", depth * 4, " ", s, depth * 4, " ", d); +} + +inline void PrintValidatorPointers(unsigned depth, const wchar_t* s, const wchar_t* d) { + wprintf(L"S: %*ls%ls\nD: %*ls%ls\n\n", depth * 4, L" ", s, depth * 4, L" ", d); +} + +} // namespace internal + +#endif // RAPIDJSON_SCHEMA_VERBOSE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_INVALID_KEYWORD_RETURN + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword) +#else +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) +#endif + +#define RAPIDJSON_INVALID_KEYWORD_RETURN(keyword)\ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + context.invalidKeyword = keyword.GetString();\ + RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword.GetString());\ + return false;\ +RAPIDJSON_MULTILINEMACRO_END + +/////////////////////////////////////////////////////////////////////////////// +// Forward declarations + +template +class GenericSchemaDocument; + +namespace internal { + +template +class Schema; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaValidator + +class ISchemaValidator { +public: + virtual ~ISchemaValidator() {} + virtual bool IsValid() const = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaStateFactory + +template +class ISchemaStateFactory { +public: + virtual ~ISchemaStateFactory() {} + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&) = 0; + virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; + virtual void* CreateHasher() = 0; + virtual uint64_t GetHashCode(void* hasher) = 0; + virtual void DestroryHasher(void* hasher) = 0; + virtual void* MallocState(size_t size) = 0; + virtual void FreeState(void* p) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// IValidationErrorHandler + +template +class IValidationErrorHandler { +public: + typedef typename SchemaType::Ch Ch; + typedef typename SchemaType::SValue SValue; + + virtual ~IValidationErrorHandler() {} + + virtual void NotMultipleOf(int64_t actual, const SValue& expected) = 0; + virtual void NotMultipleOf(uint64_t actual, const SValue& expected) = 0; + virtual void NotMultipleOf(double actual, const SValue& expected) = 0; + virtual void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void AboveMaximum(double actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) = 0; + virtual void BelowMinimum(double actual, const SValue& expected, bool exclusive) = 0; + + virtual void TooLong(const Ch* str, SizeType length, SizeType expected) = 0; + virtual void TooShort(const Ch* str, SizeType length, SizeType expected) = 0; + virtual void DoesNotMatch(const Ch* str, SizeType length) = 0; + + virtual void DisallowedItem(SizeType index) = 0; + virtual void TooFewItems(SizeType actualCount, SizeType expectedCount) = 0; + virtual void TooManyItems(SizeType actualCount, SizeType expectedCount) = 0; + virtual void DuplicateItems(SizeType index1, SizeType index2) = 0; + + virtual void TooManyProperties(SizeType actualCount, SizeType expectedCount) = 0; + virtual void TooFewProperties(SizeType actualCount, SizeType expectedCount) = 0; + virtual void StartMissingProperties() = 0; + virtual void AddMissingProperty(const SValue& name) = 0; + virtual bool EndMissingProperties() = 0; + virtual void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void DisallowedProperty(const Ch* name, SizeType length) = 0; + + virtual void StartDependencyErrors() = 0; + virtual void StartMissingDependentProperties() = 0; + virtual void AddMissingDependentProperty(const SValue& targetName) = 0; + virtual void EndMissingDependentProperties(const SValue& sourceName) = 0; + virtual void AddDependencySchemaError(const SValue& souceName, ISchemaValidator* subvalidator) = 0; + virtual bool EndDependencyErrors() = 0; + + virtual void DisallowedValue() = 0; + virtual void StartDisallowedType() = 0; + virtual void AddExpectedType(const typename SchemaType::ValueType& expectedType) = 0; + virtual void EndDisallowedType(const typename SchemaType::ValueType& actualType) = 0; + virtual void NotAllOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void NoneOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void NotOneOf(ISchemaValidator** subvalidators, SizeType count) = 0; + virtual void Disallowed() = 0; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// Hasher + +// For comparison of compound value +template +class Hasher { +public: + typedef typename Encoding::Ch Ch; + + Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} + + bool Null() { return WriteType(kNullType); } + bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } + bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Double(double d) { + Number n; + if (d < 0) n.u.i = static_cast(d); + else n.u.u = static_cast(d); + n.d = d; + return WriteNumber(n); + } + + bool RawNumber(const Ch* str, SizeType len, bool) { + WriteBuffer(kNumberType, str, len * sizeof(Ch)); + return true; + } + + bool String(const Ch* str, SizeType len, bool) { + WriteBuffer(kStringType, str, len * sizeof(Ch)); + return true; + } + + bool StartObject() { return true; } + bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool EndObject(SizeType memberCount) { + uint64_t h = Hash(0, kObjectType); + uint64_t* kv = stack_.template Pop(memberCount * 2); + for (SizeType i = 0; i < memberCount; i++) + h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive + *stack_.template Push() = h; + return true; + } + + bool StartArray() { return true; } + bool EndArray(SizeType elementCount) { + uint64_t h = Hash(0, kArrayType); + uint64_t* e = stack_.template Pop(elementCount); + for (SizeType i = 0; i < elementCount; i++) + h = Hash(h, e[i]); // Use hash to achieve element order sensitive + *stack_.template Push() = h; + return true; + } + + bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } + + uint64_t GetHashCode() const { + RAPIDJSON_ASSERT(IsValid()); + return *stack_.template Top(); + } + +private: + static const size_t kDefaultSize = 256; + struct Number { + union U { + uint64_t u; + int64_t i; + }u; + double d; + }; + + bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } + + bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } + + bool WriteBuffer(Type type, const void* data, size_t len) { + // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ + uint64_t h = Hash(RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); + const unsigned char* d = static_cast(data); + for (size_t i = 0; i < len; i++) + h = Hash(h, d[i]); + *stack_.template Push() = h; + return true; + } + + static uint64_t Hash(uint64_t h, uint64_t d) { + static const uint64_t kPrime = RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); + h ^= d; + h *= kPrime; + return h; + } + + Stack stack_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidationContext + +template +struct SchemaValidationContext { + typedef Schema SchemaType; + typedef ISchemaStateFactory SchemaValidatorFactoryType; + typedef IValidationErrorHandler ErrorHandlerType; + typedef typename SchemaType::ValueType ValueType; + typedef typename ValueType::Ch Ch; + + enum PatternValidatorType { + kPatternValidatorOnly, + kPatternValidatorWithProperty, + kPatternValidatorWithAdditionalProperty + }; + + SchemaValidationContext(SchemaValidatorFactoryType& f, ErrorHandlerType& eh, const SchemaType* s) : + factory(f), + error_handler(eh), + schema(s), + valueSchema(), + invalidKeyword(), + hasher(), + arrayElementHashCodes(), + validators(), + validatorCount(), + patternPropertiesValidators(), + patternPropertiesValidatorCount(), + patternPropertiesSchemas(), + patternPropertiesSchemaCount(), + valuePatternValidatorType(kPatternValidatorOnly), + propertyExist(), + inArray(false), + valueUniqueness(false), + arrayUniqueness(false) + { + } + + ~SchemaValidationContext() { + if (hasher) + factory.DestroryHasher(hasher); + if (validators) { + for (SizeType i = 0; i < validatorCount; i++) + factory.DestroySchemaValidator(validators[i]); + factory.FreeState(validators); + } + if (patternPropertiesValidators) { + for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) + factory.DestroySchemaValidator(patternPropertiesValidators[i]); + factory.FreeState(patternPropertiesValidators); + } + if (patternPropertiesSchemas) + factory.FreeState(patternPropertiesSchemas); + if (propertyExist) + factory.FreeState(propertyExist); + } + + SchemaValidatorFactoryType& factory; + ErrorHandlerType& error_handler; + const SchemaType* schema; + const SchemaType* valueSchema; + const Ch* invalidKeyword; + void* hasher; // Only validator access + void* arrayElementHashCodes; // Only validator access this + ISchemaValidator** validators; + SizeType validatorCount; + ISchemaValidator** patternPropertiesValidators; + SizeType patternPropertiesValidatorCount; + const SchemaType** patternPropertiesSchemas; + SizeType patternPropertiesSchemaCount; + PatternValidatorType valuePatternValidatorType; + PatternValidatorType objectPatternValidatorType; + SizeType arrayElementIndex; + bool* propertyExist; + bool inArray; + bool valueUniqueness; + bool arrayUniqueness; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Schema + +template +class Schema { +public: + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename SchemaDocumentType::AllocatorType AllocatorType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef SchemaValidationContext Context; + typedef Schema SchemaType; + typedef GenericValue SValue; + typedef IValidationErrorHandler ErrorHandler; + friend class GenericSchemaDocument; + + Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator) : + allocator_(allocator), + uri_(schemaDocument->GetURI(), *allocator), + pointer_(p, allocator), + typeless_(schemaDocument->GetTypeless()), + enum_(), + enumCount_(), + not_(), + type_((1 << kTotalSchemaType) - 1), // typeless + validatorCount_(), + notValidatorIndex_(), + properties_(), + additionalPropertiesSchema_(), + patternProperties_(), + patternPropertyCount_(), + propertyCount_(), + minProperties_(), + maxProperties_(SizeType(~0)), + additionalProperties_(true), + hasDependencies_(), + hasRequired_(), + hasSchemaDependencies_(), + additionalItemsSchema_(), + itemsList_(), + itemsTuple_(), + itemsTupleCount_(), + minItems_(), + maxItems_(SizeType(~0)), + additionalItems_(true), + uniqueItems_(false), + pattern_(), + minLength_(0), + maxLength_(~SizeType(0)), + exclusiveMinimum_(false), + exclusiveMaximum_(false), + defaultValueLength_(0) + { + typedef typename ValueType::ConstValueIterator ConstValueIterator; + typedef typename ValueType::ConstMemberIterator ConstMemberIterator; + + if (!value.IsObject()) + return; + + if (const ValueType* v = GetMember(value, GetTypeString())) { + type_ = 0; + if (v->IsString()) + AddType(*v); + else if (v->IsArray()) + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) + AddType(*itr); + } + + if (const ValueType* v = GetMember(value, GetEnumString())) + if (v->IsArray() && v->Size() > 0) { + enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { + typedef Hasher > EnumHasherType; + char buffer[256u + 24]; + MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer)); + EnumHasherType h(&hasherAllocator, 256); + itr->Accept(h); + enum_[enumCount_++] = h.GetHashCode(); + } + } + + if (schemaDocument) { + AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); + AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); + AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); + } + + if (const ValueType* v = GetMember(value, GetNotString())) { + schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document); + notValidatorIndex_ = validatorCount_; + validatorCount_++; + } + + // Object + + const ValueType* properties = GetMember(value, GetPropertiesString()); + const ValueType* required = GetMember(value, GetRequiredString()); + const ValueType* dependencies = GetMember(value, GetDependenciesString()); + { + // Gather properties from properties/required/dependencies + SValue allProperties(kArrayType); + + if (properties && properties->IsObject()) + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) + AddUniqueElement(allProperties, itr->name); + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) + AddUniqueElement(allProperties, *itr); + + if (dependencies && dependencies->IsObject()) + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + AddUniqueElement(allProperties, itr->name); + if (itr->value.IsArray()) + for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) + if (i->IsString()) + AddUniqueElement(allProperties, *i); + } + + if (allProperties.Size() > 0) { + propertyCount_ = allProperties.Size(); + properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); + for (SizeType i = 0; i < propertyCount_; i++) { + new (&properties_[i]) Property(); + properties_[i].name = allProperties[i]; + properties_[i].schema = typeless_; + } + } + } + + if (properties && properties->IsObject()) { + PointerType q = p.Append(GetPropertiesString(), allocator_); + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { + SizeType index; + if (FindPropertyIndex(itr->name, &index)) + schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document); + } + } + + if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { + PointerType q = p.Append(GetPatternPropertiesString(), allocator_); + patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); + patternPropertyCount_ = 0; + + for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { + new (&patternProperties_[patternPropertyCount_]) PatternProperty(); + patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name); + schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, q.Append(itr->name, allocator_), itr->value, document); + patternPropertyCount_++; + } + } + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) { + SizeType index; + if (FindPropertyIndex(*itr, &index)) { + properties_[index].required = true; + hasRequired_ = true; + } + } + + if (dependencies && dependencies->IsObject()) { + PointerType q = p.Append(GetDependenciesString(), allocator_); + hasDependencies_ = true; + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + SizeType sourceIndex; + if (FindPropertyIndex(itr->name, &sourceIndex)) { + if (itr->value.IsArray()) { + properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); + std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); + for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { + SizeType targetIndex; + if (FindPropertyIndex(*targetItr, &targetIndex)) + properties_[sourceIndex].dependencies[targetIndex] = true; + } + } + else if (itr->value.IsObject()) { + hasSchemaDependencies_ = true; + schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document); + properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; + validatorCount_++; + } + } + } + } + + if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { + if (v->IsBool()) + additionalProperties_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document); + } + + AssignIfExist(minProperties_, value, GetMinPropertiesString()); + AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); + + // Array + if (const ValueType* v = GetMember(value, GetItemsString())) { + PointerType q = p.Append(GetItemsString(), allocator_); + if (v->IsObject()) // List validation + schemaDocument->CreateSchema(&itemsList_, q, *v, document); + else if (v->IsArray()) { // Tuple validation + itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); + SizeType index = 0; + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) + schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document); + } + } + + AssignIfExist(minItems_, value, GetMinItemsString()); + AssignIfExist(maxItems_, value, GetMaxItemsString()); + + if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { + if (v->IsBool()) + additionalItems_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document); + } + + AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); + + // String + AssignIfExist(minLength_, value, GetMinLengthString()); + AssignIfExist(maxLength_, value, GetMaxLengthString()); + + if (const ValueType* v = GetMember(value, GetPatternString())) + pattern_ = CreatePattern(*v); + + // Number + if (const ValueType* v = GetMember(value, GetMinimumString())) + if (v->IsNumber()) + minimum_.CopyFrom(*v, *allocator_); + + if (const ValueType* v = GetMember(value, GetMaximumString())) + if (v->IsNumber()) + maximum_.CopyFrom(*v, *allocator_); + + AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); + AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); + + if (const ValueType* v = GetMember(value, GetMultipleOfString())) + if (v->IsNumber() && v->GetDouble() > 0.0) + multipleOf_.CopyFrom(*v, *allocator_); + + // Default + if (const ValueType* v = GetMember(value, GetDefaultValueString())) + if (v->IsString()) + defaultValueLength_ = v->GetStringLength(); + + } + + ~Schema() { + AllocatorType::Free(enum_); + if (properties_) { + for (SizeType i = 0; i < propertyCount_; i++) + properties_[i].~Property(); + AllocatorType::Free(properties_); + } + if (patternProperties_) { + for (SizeType i = 0; i < patternPropertyCount_; i++) + patternProperties_[i].~PatternProperty(); + AllocatorType::Free(patternProperties_); + } + AllocatorType::Free(itemsTuple_); +#if RAPIDJSON_SCHEMA_HAS_REGEX + if (pattern_) { + pattern_->~RegexType(); + AllocatorType::Free(pattern_); + } +#endif + } + + const SValue& GetURI() const { + return uri_; + } + + const PointerType& GetPointer() const { + return pointer_; + } + + bool BeginValue(Context& context) const { + if (context.inArray) { + if (uniqueItems_) + context.valueUniqueness = true; + + if (itemsList_) + context.valueSchema = itemsList_; + else if (itemsTuple_) { + if (context.arrayElementIndex < itemsTupleCount_) + context.valueSchema = itemsTuple_[context.arrayElementIndex]; + else if (additionalItemsSchema_) + context.valueSchema = additionalItemsSchema_; + else if (additionalItems_) + context.valueSchema = typeless_; + else { + context.error_handler.DisallowedItem(context.arrayElementIndex); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetItemsString()); + } + } + else + context.valueSchema = typeless_; + + context.arrayElementIndex++; + } + return true; + } + + RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { + if (context.patternPropertiesValidatorCount > 0) { + bool otherValid = false; + SizeType count = context.patternPropertiesValidatorCount; + if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) + otherValid = context.patternPropertiesValidators[--count]->IsValid(); + + bool patternValid = true; + for (SizeType i = 0; i < count; i++) + if (!context.patternPropertiesValidators[i]->IsValid()) { + patternValid = false; + break; + } + + if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { + if (!patternValid) { + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + } + else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { + if (!patternValid || !otherValid) { + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + } + else if (!patternValid && !otherValid) { // kPatternValidatorWithAdditionalProperty) + context.error_handler.PropertyViolations(context.patternPropertiesValidators, count + 1); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + } + + if (enum_) { + const uint64_t h = context.factory.GetHashCode(context.hasher); + for (SizeType i = 0; i < enumCount_; i++) + if (enum_[i] == h) + goto foundEnum; + context.error_handler.DisallowedValue(); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetEnumString()); + foundEnum:; + } + + if (allOf_.schemas) + for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) + if (!context.validators[i]->IsValid()) { + context.error_handler.NotAllOf(&context.validators[allOf_.begin], allOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAllOfString()); + } + + if (anyOf_.schemas) { + for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) + if (context.validators[i]->IsValid()) + goto foundAny; + context.error_handler.NoneOf(&context.validators[anyOf_.begin], anyOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAnyOfString()); + foundAny:; + } + + if (oneOf_.schemas) { + bool oneValid = false; + for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) + if (context.validators[i]->IsValid()) { + if (oneValid) { + context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } else + oneValid = true; + } + if (!oneValid) { + context.error_handler.NotOneOf(&context.validators[oneOf_.begin], oneOf_.count); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } + } + + if (not_ && context.validators[notValidatorIndex_]->IsValid()) { + context.error_handler.Disallowed(); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetNotString()); + } + + return true; + } + + bool Null(Context& context) const { + if (!(type_ & (1 << kNullSchemaType))) { + DisallowedType(context, GetNullString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + return CreateParallelValidator(context); + } + + bool Bool(Context& context, bool) const { + if (!(type_ & (1 << kBooleanSchemaType))) { + DisallowedType(context, GetBooleanString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + return CreateParallelValidator(context); + } + + bool Int(Context& context, int i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint(Context& context, unsigned u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Int64(Context& context, int64_t i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint64(Context& context, uint64_t u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Double(Context& context, double d) const { + if (!(type_ & (1 << kNumberSchemaType))) { + DisallowedType(context, GetNumberString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) + return false; + + if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) + return false; + + if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) + return false; + + return CreateParallelValidator(context); + } + + bool String(Context& context, const Ch* str, SizeType length, bool) const { + if (!(type_ & (1 << kStringSchemaType))) { + DisallowedType(context, GetStringString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (minLength_ != 0 || maxLength_ != SizeType(~0)) { + SizeType count; + if (internal::CountStringCodePoint(str, length, &count)) { + if (count < minLength_) { + context.error_handler.TooShort(str, length, minLength_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinLengthString()); + } + if (count > maxLength_) { + context.error_handler.TooLong(str, length, maxLength_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxLengthString()); + } + } + } + + if (pattern_ && !IsPatternMatch(pattern_, str, length)) { + context.error_handler.DoesNotMatch(str, length); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternString()); + } + + return CreateParallelValidator(context); + } + + bool StartObject(Context& context) const { + if (!(type_ & (1 << kObjectSchemaType))) { + DisallowedType(context, GetObjectString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (hasDependencies_ || hasRequired_) { + context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); + std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); + } + + if (patternProperties_) { // pre-allocate schema array + SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType + context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); + context.patternPropertiesSchemaCount = 0; + std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); + } + + return CreateParallelValidator(context); + } + + bool Key(Context& context, const Ch* str, SizeType len, bool) const { + if (patternProperties_) { + context.patternPropertiesSchemaCount = 0; + for (SizeType i = 0; i < patternPropertyCount_; i++) + if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; + context.valueSchema = typeless_; + } + } + + SizeType index = 0; + if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { + if (context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; + } + else + context.valueSchema = properties_[index].schema; + + if (context.propertyExist) + context.propertyExist[index] = true; + + return true; + } + + if (additionalPropertiesSchema_) { + if (additionalPropertiesSchema_ && context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; + context.valueSchema = typeless_; + context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; + } + else + context.valueSchema = additionalPropertiesSchema_; + return true; + } + else if (additionalProperties_) { + context.valueSchema = typeless_; + return true; + } + + if (context.patternPropertiesSchemaCount == 0) { // patternProperties are not additional properties + context.error_handler.DisallowedProperty(str, len); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAdditionalPropertiesString()); + } + + return true; + } + + bool EndObject(Context& context, SizeType memberCount) const { + if (hasRequired_) { + context.error_handler.StartMissingProperties(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].required && !context.propertyExist[index]) + if (properties_[index].schema->defaultValueLength_ == 0 ) + context.error_handler.AddMissingProperty(properties_[index].name); + if (context.error_handler.EndMissingProperties()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString()); + } + + if (memberCount < minProperties_) { + context.error_handler.TooFewProperties(memberCount, minProperties_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinPropertiesString()); + } + + if (memberCount > maxProperties_) { + context.error_handler.TooManyProperties(memberCount, maxProperties_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxPropertiesString()); + } + + if (hasDependencies_) { + context.error_handler.StartDependencyErrors(); + for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) { + const Property& source = properties_[sourceIndex]; + if (context.propertyExist[sourceIndex]) { + if (source.dependencies) { + context.error_handler.StartMissingDependentProperties(); + for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) + if (source.dependencies[targetIndex] && !context.propertyExist[targetIndex]) + context.error_handler.AddMissingDependentProperty(properties_[targetIndex].name); + context.error_handler.EndMissingDependentProperties(source.name); + } + else if (source.dependenciesSchema) { + ISchemaValidator* dependenciesValidator = context.validators[source.dependenciesValidatorIndex]; + if (!dependenciesValidator->IsValid()) + context.error_handler.AddDependencySchemaError(source.name, dependenciesValidator); + } + } + } + if (context.error_handler.EndDependencyErrors()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + + return true; + } + + bool StartArray(Context& context) const { + if (!(type_ & (1 << kArraySchemaType))) { + DisallowedType(context, GetArrayString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + context.arrayElementIndex = 0; + context.inArray = true; + + return CreateParallelValidator(context); + } + + bool EndArray(Context& context, SizeType elementCount) const { + context.inArray = false; + + if (elementCount < minItems_) { + context.error_handler.TooFewItems(elementCount, minItems_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinItemsString()); + } + + if (elementCount > maxItems_) { + context.error_handler.TooManyItems(elementCount, maxItems_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxItemsString()); + } + + return true; + } + + // Generate functions for string literal according to Ch +#define RAPIDJSON_STRING_(name, ...) \ + static const ValueType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const ValueType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1));\ + return v;\ + } + + RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') + RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') + RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') + RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') + RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') + RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') + RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') + RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') + RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') + RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') + RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') + RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') + RAPIDJSON_STRING_(Not, 'n', 'o', 't') + RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') + RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') + RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') + RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') + RAPIDJSON_STRING_(DefaultValue, 'd', 'e', 'f', 'a', 'u', 'l', 't') + +#undef RAPIDJSON_STRING_ + +private: + enum SchemaValueType { + kNullSchemaType, + kBooleanSchemaType, + kObjectSchemaType, + kArraySchemaType, + kStringSchemaType, + kNumberSchemaType, + kIntegerSchemaType, + kTotalSchemaType + }; + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + typedef internal::GenericRegex RegexType; +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + typedef std::basic_regex RegexType; +#else + typedef char RegexType; +#endif + + struct SchemaArray { + SchemaArray() : schemas(), count() {} + ~SchemaArray() { AllocatorType::Free(schemas); } + const SchemaType** schemas; + SizeType begin; // begin index of context.validators + SizeType count; + }; + + template + void AddUniqueElement(V1& a, const V2& v) { + for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) + if (*itr == v) + return; + V1 c(v, *allocator_); + a.PushBack(c, *allocator_); + } + + static const ValueType* GetMember(const ValueType& value, const ValueType& name) { + typename ValueType::ConstMemberIterator itr = value.FindMember(name); + return itr != value.MemberEnd() ? &(itr->value) : 0; + } + + static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsBool()) + out = v->GetBool(); + } + + static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) + out = static_cast(v->GetUint64()); + } + + void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { + if (const ValueType* v = GetMember(value, name)) { + if (v->IsArray() && v->Size() > 0) { + PointerType q = p.Append(name, allocator_); + out.count = v->Size(); + out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); + memset(out.schemas, 0, sizeof(Schema*)* out.count); + for (SizeType i = 0; i < out.count; i++) + schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document); + out.begin = validatorCount_; + validatorCount_ += out.count; + } + } + } + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), allocator_); + if (!r->IsValid()) { + r->~RegexType(); + AllocatorType::Free(r); + r = 0; + } + return r; + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { + GenericRegexSearch rs(*pattern); + return rs.Search(str); + } +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType *r = static_cast(allocator_->Malloc(sizeof(RegexType))); + try { + return new (r) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); + } + catch (const std::regex_error&) { + AllocatorType::Free(r); + } + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { + std::match_results r; + return std::regex_search(str, str + length, r, *pattern); + } +#else + template + RegexType* CreatePattern(const ValueType&) { return 0; } + + static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } +#endif // RAPIDJSON_SCHEMA_USE_STDREGEX + + void AddType(const ValueType& type) { + if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; + else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; + else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; + else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; + else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; + else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; + else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); + } + + bool CreateParallelValidator(Context& context) const { + if (enum_ || context.arrayUniqueness) + context.hasher = context.factory.CreateHasher(); + + if (validatorCount_) { + RAPIDJSON_ASSERT(context.validators == 0); + context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); + context.validatorCount = validatorCount_; + + if (allOf_.schemas) + CreateSchemaValidators(context, allOf_); + + if (anyOf_.schemas) + CreateSchemaValidators(context, anyOf_); + + if (oneOf_.schemas) + CreateSchemaValidators(context, oneOf_); + + if (not_) + context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_); + + if (hasSchemaDependencies_) { + for (SizeType i = 0; i < propertyCount_; i++) + if (properties_[i].dependenciesSchema) + context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema); + } + } + + return true; + } + + void CreateSchemaValidators(Context& context, const SchemaArray& schemas) const { + for (SizeType i = 0; i < schemas.count; i++) + context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i]); + } + + // O(n) + bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { + SizeType len = name.GetStringLength(); + const Ch* str = name.GetString(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].name.GetStringLength() == len && + (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) + { + *outIndex = index; + return true; + } + return false; + } + + bool CheckInt(Context& context, int64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { + DisallowedType(context, GetIntegerString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (!minimum_.IsNull()) { + if (minimum_.IsInt64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + } + else if (minimum_.IsUint64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); // i <= max(int64_t) < minimum.GetUint64() + } + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsInt64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + } + else if (maximum_.IsUint64()) { } + /* do nothing */ // i <= max(int64_t) < maximum_.GetUint64() + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) { + context.error_handler.NotMultipleOf(i, multipleOf_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckUint(Context& context, uint64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) { + DisallowedType(context, GetIntegerString()); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + } + + if (!minimum_.IsNull()) { + if (minimum_.IsUint64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) { + context.error_handler.BelowMinimum(i, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + } + else if (minimum_.IsInt64()) + /* do nothing */; // i >= 0 > minimum.Getint64() + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsUint64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + } + else if (maximum_.IsInt64()) { + context.error_handler.AboveMaximum(i, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); // i >= 0 > maximum_ + } + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (i % multipleOf_.GetUint64() != 0) { + context.error_handler.NotMultipleOf(i, multipleOf_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckDoubleMinimum(Context& context, double d) const { + if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) { + context.error_handler.BelowMinimum(d, minimum_, exclusiveMinimum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + return true; + } + + bool CheckDoubleMaximum(Context& context, double d) const { + if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) { + context.error_handler.AboveMaximum(d, maximum_, exclusiveMaximum_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + return true; + } + + bool CheckDoubleMultipleOf(Context& context, double d) const { + double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); + double q = std::floor(a / b); + double r = a - q * b; + if (r > 0.0) { + context.error_handler.NotMultipleOf(d, multipleOf_); + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + return true; + } + + void DisallowedType(Context& context, const ValueType& actualType) const { + ErrorHandler& eh = context.error_handler; + eh.StartDisallowedType(); + + if (type_ & (1 << kNullSchemaType)) eh.AddExpectedType(GetNullString()); + if (type_ & (1 << kBooleanSchemaType)) eh.AddExpectedType(GetBooleanString()); + if (type_ & (1 << kObjectSchemaType)) eh.AddExpectedType(GetObjectString()); + if (type_ & (1 << kArraySchemaType)) eh.AddExpectedType(GetArrayString()); + if (type_ & (1 << kStringSchemaType)) eh.AddExpectedType(GetStringString()); + + if (type_ & (1 << kNumberSchemaType)) eh.AddExpectedType(GetNumberString()); + else if (type_ & (1 << kIntegerSchemaType)) eh.AddExpectedType(GetIntegerString()); + + eh.EndDisallowedType(actualType); + } + + struct Property { + Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} + ~Property() { AllocatorType::Free(dependencies); } + SValue name; + const SchemaType* schema; + const SchemaType* dependenciesSchema; + SizeType dependenciesValidatorIndex; + bool* dependencies; + bool required; + }; + + struct PatternProperty { + PatternProperty() : schema(), pattern() {} + ~PatternProperty() { + if (pattern) { + pattern->~RegexType(); + AllocatorType::Free(pattern); + } + } + const SchemaType* schema; + RegexType* pattern; + }; + + AllocatorType* allocator_; + SValue uri_; + PointerType pointer_; + const SchemaType* typeless_; + uint64_t* enum_; + SizeType enumCount_; + SchemaArray allOf_; + SchemaArray anyOf_; + SchemaArray oneOf_; + const SchemaType* not_; + unsigned type_; // bitmask of kSchemaType + SizeType validatorCount_; + SizeType notValidatorIndex_; + + Property* properties_; + const SchemaType* additionalPropertiesSchema_; + PatternProperty* patternProperties_; + SizeType patternPropertyCount_; + SizeType propertyCount_; + SizeType minProperties_; + SizeType maxProperties_; + bool additionalProperties_; + bool hasDependencies_; + bool hasRequired_; + bool hasSchemaDependencies_; + + const SchemaType* additionalItemsSchema_; + const SchemaType* itemsList_; + const SchemaType** itemsTuple_; + SizeType itemsTupleCount_; + SizeType minItems_; + SizeType maxItems_; + bool additionalItems_; + bool uniqueItems_; + + RegexType* pattern_; + SizeType minLength_; + SizeType maxLength_; + + SValue minimum_; + SValue maximum_; + SValue multipleOf_; + bool exclusiveMinimum_; + bool exclusiveMaximum_; + + SizeType defaultValueLength_; +}; + +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + *documentStack.template Push() = '/'; + char buffer[21]; + size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); + for (size_t i = 0; i < length; i++) + *documentStack.template Push() = static_cast(buffer[i]); + } +}; + +// Partial specialized version for char to prevent buffer copying. +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + if (sizeof(SizeType) == 4) { + char *buffer = documentStack.template Push(1 + 10); // '/' + uint + *buffer++ = '/'; + const char* end = internal::u32toa(index, buffer); + documentStack.template Pop(static_cast(10 - (end - buffer))); + } + else { + char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 + *buffer++ = '/'; + const char* end = internal::u64toa(index, buffer); + documentStack.template Pop(static_cast(20 - (end - buffer))); + } + } +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// IGenericRemoteSchemaDocumentProvider + +template +class IGenericRemoteSchemaDocumentProvider { +public: + typedef typename SchemaDocumentType::Ch Ch; + + virtual ~IGenericRemoteSchemaDocumentProvider() {} + virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaDocument + +//! JSON schema document. +/*! + A JSON schema document is a compiled version of a JSON schema. + It is basically a tree of internal::Schema. + + \note This is an immutable class (i.e. its instance cannot be modified after construction). + \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. + \tparam Allocator Allocator type for allocating memory of this document. +*/ +template +class GenericSchemaDocument { +public: + typedef ValueT ValueType; + typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; + typedef Allocator AllocatorType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef internal::Schema SchemaType; + typedef GenericPointer PointerType; + typedef GenericValue URIType; + friend class internal::Schema; + template + friend class GenericSchemaValidator; + + //! Constructor. + /*! + Compile a JSON document into schema document. + + \param document A JSON document as source. + \param uri The base URI of this schema document for purposes of violation reporting. + \param uriLength Length of \c name, in code points. + \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. + \param allocator An optional allocator instance for allocating memory. Can be null. + */ + explicit GenericSchemaDocument(const ValueType& document, const Ch* uri = 0, SizeType uriLength = 0, + IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0) : + remoteProvider_(remoteProvider), + allocator_(allocator), + ownAllocator_(), + root_(), + typeless_(), + schemaMap_(allocator, kInitialSchemaMapSize), + schemaRef_(allocator, kInitialSchemaRefSize) + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)(); + + Ch noUri[1] = {0}; + uri_.SetString(uri ? uri : noUri, uriLength, *allocator_); + + typeless_ = static_cast(allocator_->Malloc(sizeof(SchemaType))); + new (typeless_) SchemaType(this, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), allocator_); + + // Generate root schema, it will call CreateSchema() to create sub-schemas, + // And call AddRefSchema() if there are $ref. + CreateSchemaRecursive(&root_, PointerType(), document, document); + + // Resolve $ref + while (!schemaRef_.Empty()) { + SchemaRefEntry* refEntry = schemaRef_.template Pop(1); + if (const SchemaType* s = GetSchema(refEntry->target)) { + if (refEntry->schema) + *refEntry->schema = s; + + // Create entry in map if not exist + if (!GetSchema(refEntry->source)) { + new (schemaMap_.template Push()) SchemaEntry(refEntry->source, const_cast(s), false, allocator_); + } + } + else if (refEntry->schema) + *refEntry->schema = typeless_; + + refEntry->~SchemaRefEntry(); + } + + RAPIDJSON_ASSERT(root_ != 0); + + schemaRef_.ShrinkToFit(); // Deallocate all memory for ref + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericSchemaDocument(GenericSchemaDocument&& rhs) RAPIDJSON_NOEXCEPT : + remoteProvider_(rhs.remoteProvider_), + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + root_(rhs.root_), + typeless_(rhs.typeless_), + schemaMap_(std::move(rhs.schemaMap_)), + schemaRef_(std::move(rhs.schemaRef_)), + uri_(std::move(rhs.uri_)) + { + rhs.remoteProvider_ = 0; + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.typeless_ = 0; + } +#endif + + //! Destructor + ~GenericSchemaDocument() { + while (!schemaMap_.Empty()) + schemaMap_.template Pop(1)->~SchemaEntry(); + + if (typeless_) { + typeless_->~SchemaType(); + Allocator::Free(typeless_); + } + + RAPIDJSON_DELETE(ownAllocator_); + } + + const URIType& GetURI() const { return uri_; } + + //! Get the root schema. + const SchemaType& GetRoot() const { return *root_; } + +private: + //! Prohibit copying + GenericSchemaDocument(const GenericSchemaDocument&); + //! Prohibit assignment + GenericSchemaDocument& operator=(const GenericSchemaDocument&); + + struct SchemaRefEntry { + SchemaRefEntry(const PointerType& s, const PointerType& t, const SchemaType** outSchema, Allocator *allocator) : source(s, allocator), target(t, allocator), schema(outSchema) {} + PointerType source; + PointerType target; + const SchemaType** schema; + }; + + struct SchemaEntry { + SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} + ~SchemaEntry() { + if (owned) { + schema->~SchemaType(); + Allocator::Free(schema); + } + } + PointerType pointer; + SchemaType* schema; + bool owned; + }; + + void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + if (schema) + *schema = typeless_; + + if (v.GetType() == kObjectType) { + const SchemaType* s = GetSchema(pointer); + if (!s) + CreateSchema(schema, pointer, v, document); + + for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) + CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document); + } + else if (v.GetType() == kArrayType) + for (SizeType i = 0; i < v.Size(); i++) + CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document); + } + + void CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + RAPIDJSON_ASSERT(pointer.IsValid()); + if (v.IsObject()) { + if (!HandleRefSchema(pointer, schema, v, document)) { + SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_); + new (schemaMap_.template Push()) SchemaEntry(pointer, s, true, allocator_); + if (schema) + *schema = s; + } + } + } + + bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document) { + static const Ch kRefString[] = { '$', 'r', 'e', 'f', '\0' }; + static const ValueType kRefValue(kRefString, 4); + + typename ValueType::ConstMemberIterator itr = v.FindMember(kRefValue); + if (itr == v.MemberEnd()) + return false; + + if (itr->value.IsString()) { + SizeType len = itr->value.GetStringLength(); + if (len > 0) { + const Ch* s = itr->value.GetString(); + SizeType i = 0; + while (i < len && s[i] != '#') // Find the first # + i++; + + if (i > 0) { // Remote reference, resolve immediately + if (remoteProvider_) { + if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(s, i)) { + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const SchemaType* sc = remoteDocument->GetSchema(pointer)) { + if (schema) + *schema = sc; + new (schemaMap_.template Push()) SchemaEntry(source, const_cast(sc), false, allocator_); + return true; + } + } + } + } + } + else if (s[i] == '#') { // Local reference, defer resolution + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const ValueType* nv = pointer.Get(document)) + if (HandleRefSchema(source, schema, *nv, document)) + return true; + + new (schemaRef_.template Push()) SchemaRefEntry(source, pointer, schema, allocator_); + return true; + } + } + } + } + return false; + } + + const SchemaType* GetSchema(const PointerType& pointer) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (pointer == target->pointer) + return target->schema; + return 0; + } + + PointerType GetPointer(const SchemaType* schema) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (schema == target->schema) + return target->pointer; + return PointerType(); + } + + const SchemaType* GetTypeless() const { return typeless_; } + + static const size_t kInitialSchemaMapSize = 64; + static const size_t kInitialSchemaRefSize = 64; + + IRemoteSchemaDocumentProviderType* remoteProvider_; + Allocator *allocator_; + Allocator *ownAllocator_; + const SchemaType* root_; //!< Root schema. + SchemaType* typeless_; + internal::Stack schemaMap_; // Stores created Pointer -> Schemas + internal::Stack schemaRef_; // Stores Pointer from $ref and schema which holds the $ref + URIType uri_; +}; + +//! GenericSchemaDocument using Value type. +typedef GenericSchemaDocument SchemaDocument; +//! IGenericRemoteSchemaDocumentProvider using SchemaDocument. +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaValidator + +//! JSON Schema Validator. +/*! + A SAX style JSON schema validator. + It uses a \c GenericSchemaDocument to validate SAX events. + It delegates the incoming SAX events to an output handler. + The default output handler does nothing. + It can be reused multiple times by calling \c Reset(). + + \tparam SchemaDocumentType Type of schema document. + \tparam OutputHandler Type of output handler. Default handler does nothing. + \tparam StateAllocator Allocator for storing the internal validation states. +*/ +template < + typename SchemaDocumentType, + typename OutputHandler = BaseReaderHandler, + typename StateAllocator = CrtAllocator> +class GenericSchemaValidator : + public internal::ISchemaStateFactory, + public internal::ISchemaValidator, + public internal::IValidationErrorHandler +{ +public: + typedef typename SchemaDocumentType::SchemaType SchemaType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename SchemaType::EncodingType EncodingType; + typedef typename SchemaType::SValue SValue; + typedef typename EncodingType::Ch Ch; + typedef GenericStringRef StringRefType; + typedef GenericValue ValueType; + + //! Constructor without output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Constructor with output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + OutputHandler& outputHandler, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(&outputHandler), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Destructor. + ~GenericSchemaValidator() { + Reset(); + RAPIDJSON_DELETE(ownStateAllocator_); + } + + //! Reset the internal states. + void Reset() { + while (!schemaStack_.Empty()) + PopSchema(); + documentStack_.Clear(); + error_.SetObject(); + currentError_.SetNull(); + missingDependents_.SetNull(); + valid_ = true; + } + + //! Checks whether the current state is valid. + // Implementation of ISchemaValidator + virtual bool IsValid() const { return valid_; } + + //! Gets the error object. + ValueType& GetError() { return error_; } + const ValueType& GetError() const { return error_; } + + //! Gets the JSON pointer pointed to the invalid schema. + PointerType GetInvalidSchemaPointer() const { + return schemaStack_.Empty() ? PointerType() : CurrentSchema().GetPointer(); + } + + //! Gets the keyword of invalid schema. + const Ch* GetInvalidSchemaKeyword() const { + return schemaStack_.Empty() ? 0 : CurrentContext().invalidKeyword; + } + + //! Gets the JSON pointer pointed to the invalid value. + PointerType GetInvalidDocumentPointer() const { + if (documentStack_.Empty()) { + return PointerType(); + } + else { + return PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); + } + } + + void NotMultipleOf(int64_t actual, const SValue& expected) { + AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected); + } + void NotMultipleOf(uint64_t actual, const SValue& expected) { + AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected); + } + void NotMultipleOf(double actual, const SValue& expected) { + AddNumberError(SchemaType::GetMultipleOfString(), ValueType(actual).Move(), expected); + } + void AboveMaximum(int64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void AboveMaximum(uint64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void AboveMaximum(double actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMaximumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMaximumString : 0); + } + void BelowMinimum(int64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + void BelowMinimum(uint64_t actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + void BelowMinimum(double actual, const SValue& expected, bool exclusive) { + AddNumberError(SchemaType::GetMinimumString(), ValueType(actual).Move(), expected, + exclusive ? &SchemaType::GetExclusiveMinimumString : 0); + } + + void TooLong(const Ch* str, SizeType length, SizeType expected) { + AddNumberError(SchemaType::GetMaxLengthString(), + ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); + } + void TooShort(const Ch* str, SizeType length, SizeType expected) { + AddNumberError(SchemaType::GetMinLengthString(), + ValueType(str, length, GetStateAllocator()).Move(), SValue(expected).Move()); + } + void DoesNotMatch(const Ch* str, SizeType length) { + currentError_.SetObject(); + currentError_.AddMember(GetActualString(), ValueType(str, length, GetStateAllocator()).Move(), GetStateAllocator()); + AddCurrentError(SchemaType::GetPatternString()); + } + + void DisallowedItem(SizeType index) { + currentError_.SetObject(); + currentError_.AddMember(GetDisallowedString(), ValueType(index).Move(), GetStateAllocator()); + AddCurrentError(SchemaType::GetAdditionalItemsString(), true); + } + void TooFewItems(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMinItemsString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void TooManyItems(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMaxItemsString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void DuplicateItems(SizeType index1, SizeType index2) { + ValueType duplicates(kArrayType); + duplicates.PushBack(index1, GetStateAllocator()); + duplicates.PushBack(index2, GetStateAllocator()); + currentError_.SetObject(); + currentError_.AddMember(GetDuplicatesString(), duplicates, GetStateAllocator()); + AddCurrentError(SchemaType::GetUniqueItemsString(), true); + } + + void TooManyProperties(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMaxPropertiesString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void TooFewProperties(SizeType actualCount, SizeType expectedCount) { + AddNumberError(SchemaType::GetMinPropertiesString(), + ValueType(actualCount).Move(), SValue(expectedCount).Move()); + } + void StartMissingProperties() { + currentError_.SetArray(); + } + void AddMissingProperty(const SValue& name) { + currentError_.PushBack(ValueType(name, GetStateAllocator()).Move(), GetStateAllocator()); + } + bool EndMissingProperties() { + if (currentError_.Empty()) + return false; + ValueType error(kObjectType); + error.AddMember(GetMissingString(), currentError_, GetStateAllocator()); + currentError_ = error; + AddCurrentError(SchemaType::GetRequiredString()); + return true; + } + void PropertyViolations(ISchemaValidator** subvalidators, SizeType count) { + for (SizeType i = 0; i < count; ++i) + MergeError(static_cast(subvalidators[i])->GetError()); + } + void DisallowedProperty(const Ch* name, SizeType length) { + currentError_.SetObject(); + currentError_.AddMember(GetDisallowedString(), ValueType(name, length, GetStateAllocator()).Move(), GetStateAllocator()); + AddCurrentError(SchemaType::GetAdditionalPropertiesString(), true); + } + + void StartDependencyErrors() { + currentError_.SetObject(); + } + void StartMissingDependentProperties() { + missingDependents_.SetArray(); + } + void AddMissingDependentProperty(const SValue& targetName) { + missingDependents_.PushBack(ValueType(targetName, GetStateAllocator()).Move(), GetStateAllocator()); + } + void EndMissingDependentProperties(const SValue& sourceName) { + if (!missingDependents_.Empty()) + currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), + missingDependents_, GetStateAllocator()); + } + void AddDependencySchemaError(const SValue& sourceName, ISchemaValidator* subvalidator) { + currentError_.AddMember(ValueType(sourceName, GetStateAllocator()).Move(), + static_cast(subvalidator)->GetError(), GetStateAllocator()); + } + bool EndDependencyErrors() { + if (currentError_.ObjectEmpty()) + return false; + ValueType error(kObjectType); + error.AddMember(GetErrorsString(), currentError_, GetStateAllocator()); + currentError_ = error; + AddCurrentError(SchemaType::GetDependenciesString()); + return true; + } + + void DisallowedValue() { + currentError_.SetObject(); + AddCurrentError(SchemaType::GetEnumString()); + } + void StartDisallowedType() { + currentError_.SetArray(); + } + void AddExpectedType(const typename SchemaType::ValueType& expectedType) { + currentError_.PushBack(ValueType(expectedType, GetStateAllocator()).Move(), GetStateAllocator()); + } + void EndDisallowedType(const typename SchemaType::ValueType& actualType) { + ValueType error(kObjectType); + error.AddMember(GetExpectedString(), currentError_, GetStateAllocator()); + error.AddMember(GetActualString(), ValueType(actualType, GetStateAllocator()).Move(), GetStateAllocator()); + currentError_ = error; + AddCurrentError(SchemaType::GetTypeString()); + } + void NotAllOf(ISchemaValidator** subvalidators, SizeType count) { + for (SizeType i = 0; i < count; ++i) { + MergeError(static_cast(subvalidators[i])->GetError()); + } + } + void NoneOf(ISchemaValidator** subvalidators, SizeType count) { + AddErrorArray(SchemaType::GetAnyOfString(), subvalidators, count); + } + void NotOneOf(ISchemaValidator** subvalidators, SizeType count) { + AddErrorArray(SchemaType::GetOneOfString(), subvalidators, count); + } + void Disallowed() { + currentError_.SetObject(); + AddCurrentError(SchemaType::GetNotString()); + } + +#define RAPIDJSON_STRING_(name, ...) \ + static const StringRefType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const StringRefType v(s, static_cast(sizeof(s) / sizeof(Ch) - 1)); \ + return v;\ + } + + RAPIDJSON_STRING_(InstanceRef, 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'R', 'e', 'f') + RAPIDJSON_STRING_(SchemaRef, 's', 'c', 'h', 'e', 'm', 'a', 'R', 'e', 'f') + RAPIDJSON_STRING_(Expected, 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd') + RAPIDJSON_STRING_(Actual, 'a', 'c', 't', 'u', 'a', 'l') + RAPIDJSON_STRING_(Disallowed, 'd', 'i', 's', 'a', 'l', 'l', 'o', 'w', 'e', 'd') + RAPIDJSON_STRING_(Missing, 'm', 'i', 's', 's', 'i', 'n', 'g') + RAPIDJSON_STRING_(Errors, 'e', 'r', 'r', 'o', 'r', 's') + RAPIDJSON_STRING_(Duplicates, 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', 's') + +#undef RAPIDJSON_STRING_ + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + *documentStack_.template Push() = '\0';\ + documentStack_.template Pop(1);\ + internal::PrintInvalidDocument(documentStack_.template Bottom());\ +RAPIDJSON_MULTILINEMACRO_END +#else +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() +#endif + +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ + if (!valid_) return false; \ + if (!BeginValue() || !CurrentSchema().method arg1) {\ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\ + return valid_ = false;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ + for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ + if (context->hasher)\ + static_cast(context->hasher)->method arg2;\ + if (context->validators)\ + for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ + static_cast(context->validators[i_])->method arg2;\ + if (context->patternPropertiesValidators)\ + for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ + static_cast(context->patternPropertiesValidators[i_])->method arg2;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ + return valid_ = EndValue() && (!outputHandler_ || outputHandler_->method arg2) + +#define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ + RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) + + bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext()), ( )); } + bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } + bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } + bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } + bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } + bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } + bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } + bool RawNumber(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + bool String(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + + bool StartObject() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); + return valid_ = !outputHandler_ || outputHandler_->StartObject(); + } + + bool Key(const Ch* str, SizeType len, bool copy) { + if (!valid_) return false; + AppendToken(str, len); + if (!CurrentSchema().Key(CurrentContext(), str, len, copy)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); + return valid_ = !outputHandler_ || outputHandler_->Key(str, len, copy); + } + + bool EndObject(SizeType memberCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); + if (!CurrentSchema().EndObject(CurrentContext(), memberCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); + } + + bool StartArray() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); + return valid_ = !outputHandler_ || outputHandler_->StartArray(); + } + + bool EndArray(SizeType elementCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); + if (!CurrentSchema().EndArray(CurrentContext(), elementCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); + } + +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_ +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_ +#undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ +#undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ + + // Implementation of ISchemaStateFactory + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root) { + return new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, documentStack_.template Bottom(), documentStack_.GetSize(), +#if RAPIDJSON_SCHEMA_VERBOSE + depth_ + 1, +#endif + &GetStateAllocator()); + } + + virtual void DestroySchemaValidator(ISchemaValidator* validator) { + GenericSchemaValidator* v = static_cast(validator); + v->~GenericSchemaValidator(); + StateAllocator::Free(v); + } + + virtual void* CreateHasher() { + return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); + } + + virtual uint64_t GetHashCode(void* hasher) { + return static_cast(hasher)->GetHashCode(); + } + + virtual void DestroryHasher(void* hasher) { + HasherType* h = static_cast(hasher); + h->~HasherType(); + StateAllocator::Free(h); + } + + virtual void* MallocState(size_t size) { + return GetStateAllocator().Malloc(size); + } + + virtual void FreeState(void* p) { + StateAllocator::Free(p); + } + +private: + typedef typename SchemaType::Context Context; + typedef GenericValue, StateAllocator> HashCodeArray; + typedef internal::Hasher HasherType; + + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + const SchemaType& root, + const char* basePath, size_t basePathSize, +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth, +#endif + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(root), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + outputHandler_(0), + error_(kObjectType), + currentError_(), + missingDependents_(), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(depth) +#endif + { + if (basePath && basePathSize) + memcpy(documentStack_.template Push(basePathSize), basePath, basePathSize); + } + + StateAllocator& GetStateAllocator() { + if (!stateAllocator_) + stateAllocator_ = ownStateAllocator_ = RAPIDJSON_NEW(StateAllocator)(); + return *stateAllocator_; + } + + bool BeginValue() { + if (schemaStack_.Empty()) + PushSchema(root_); + else { + if (CurrentContext().inArray) + internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); + + if (!CurrentSchema().BeginValue(CurrentContext())) + return false; + + SizeType count = CurrentContext().patternPropertiesSchemaCount; + const SchemaType** sa = CurrentContext().patternPropertiesSchemas; + typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; + bool valueUniqueness = CurrentContext().valueUniqueness; + RAPIDJSON_ASSERT(CurrentContext().valueSchema); + PushSchema(*CurrentContext().valueSchema); + + if (count > 0) { + CurrentContext().objectPatternValidatorType = patternValidatorType; + ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; + SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; + va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); + for (SizeType i = 0; i < count; i++) + va[validatorCount++] = CreateSchemaValidator(*sa[i]); + } + + CurrentContext().arrayUniqueness = valueUniqueness; + } + return true; + } + + bool EndValue() { + if (!CurrentSchema().EndValue(CurrentContext())) + return false; + +#if RAPIDJSON_SCHEMA_VERBOSE + GenericStringBuffer sb; + schemaDocument_->GetPointer(&CurrentSchema()).Stringify(sb); + + *documentStack_.template Push() = '\0'; + documentStack_.template Pop(1); + internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom()); +#endif + + uint64_t h = CurrentContext().arrayUniqueness ? static_cast(CurrentContext().hasher)->GetHashCode() : 0; + + PopSchema(); + + if (!schemaStack_.Empty()) { + Context& context = CurrentContext(); + if (context.valueUniqueness) { + HashCodeArray* a = static_cast(context.arrayElementHashCodes); + if (!a) + CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); + for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) + if (itr->GetUint64() == h) { + DuplicateItems(static_cast(itr - a->Begin()), a->Size()); + RAPIDJSON_INVALID_KEYWORD_RETURN(SchemaType::GetUniqueItemsString()); + } + a->PushBack(h, GetStateAllocator()); + } + } + + // Remove the last token of document pointer + while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') + ; + + return true; + } + + void AppendToken(const Ch* str, SizeType len) { + documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters + *documentStack_.template PushUnsafe() = '/'; + for (SizeType i = 0; i < len; i++) { + if (str[i] == '~') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '0'; + } + else if (str[i] == '/') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '1'; + } + else + *documentStack_.template PushUnsafe() = str[i]; + } + } + + RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, *this, &schema); } + + RAPIDJSON_FORCEINLINE void PopSchema() { + Context* c = schemaStack_.template Pop(1); + if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { + a->~HashCodeArray(); + StateAllocator::Free(a); + } + c->~Context(); + } + + void AddErrorLocation(ValueType& result, bool parent) { + GenericStringBuffer sb; + PointerType instancePointer = GetInvalidDocumentPointer(); + ((parent && instancePointer.GetTokenCount() > 0) + ? PointerType(instancePointer.GetTokens(), instancePointer.GetTokenCount() - 1) + : instancePointer).StringifyUriFragment(sb); + ValueType instanceRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), + GetStateAllocator()); + result.AddMember(GetInstanceRefString(), instanceRef, GetStateAllocator()); + sb.Clear(); + memcpy(sb.Push(CurrentSchema().GetURI().GetStringLength()), + CurrentSchema().GetURI().GetString(), + CurrentSchema().GetURI().GetStringLength() * sizeof(Ch)); + GetInvalidSchemaPointer().StringifyUriFragment(sb); + ValueType schemaRef(sb.GetString(), static_cast(sb.GetSize() / sizeof(Ch)), + GetStateAllocator()); + result.AddMember(GetSchemaRefString(), schemaRef, GetStateAllocator()); + } + + void AddError(ValueType& keyword, ValueType& error) { + typename ValueType::MemberIterator member = error_.FindMember(keyword); + if (member == error_.MemberEnd()) + error_.AddMember(keyword, error, GetStateAllocator()); + else { + if (member->value.IsObject()) { + ValueType errors(kArrayType); + errors.PushBack(member->value, GetStateAllocator()); + member->value = errors; + } + member->value.PushBack(error, GetStateAllocator()); + } + } + + void AddCurrentError(const typename SchemaType::ValueType& keyword, bool parent = false) { + AddErrorLocation(currentError_, parent); + AddError(ValueType(keyword, GetStateAllocator(), false).Move(), currentError_); + } + + void MergeError(ValueType& other) { + for (typename ValueType::MemberIterator it = other.MemberBegin(), end = other.MemberEnd(); it != end; ++it) { + AddError(it->name, it->value); + } + } + + void AddNumberError(const typename SchemaType::ValueType& keyword, ValueType& actual, const SValue& expected, + const typename SchemaType::ValueType& (*exclusive)() = 0) { + currentError_.SetObject(); + currentError_.AddMember(GetActualString(), actual, GetStateAllocator()); + currentError_.AddMember(GetExpectedString(), ValueType(expected, GetStateAllocator()).Move(), GetStateAllocator()); + if (exclusive) + currentError_.AddMember(ValueType(exclusive(), GetStateAllocator()).Move(), true, GetStateAllocator()); + AddCurrentError(keyword); + } + + void AddErrorArray(const typename SchemaType::ValueType& keyword, + ISchemaValidator** subvalidators, SizeType count) { + ValueType errors(kArrayType); + for (SizeType i = 0; i < count; ++i) + errors.PushBack(static_cast(subvalidators[i])->GetError(), GetStateAllocator()); + currentError_.SetObject(); + currentError_.AddMember(GetErrorsString(), errors, GetStateAllocator()); + AddCurrentError(keyword); + } + + const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } + Context& CurrentContext() { return *schemaStack_.template Top(); } + const Context& CurrentContext() const { return *schemaStack_.template Top(); } + + static const size_t kDefaultSchemaStackCapacity = 1024; + static const size_t kDefaultDocumentStackCapacity = 256; + const SchemaDocumentType* schemaDocument_; + const SchemaType& root_; + StateAllocator* stateAllocator_; + StateAllocator* ownStateAllocator_; + internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) + internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) + OutputHandler* outputHandler_; + ValueType error_; + ValueType currentError_; + ValueType missingDependents_; + bool valid_; +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth_; +#endif +}; + +typedef GenericSchemaValidator SchemaValidator; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidatingReader + +//! A helper class for parsing with validation. +/*! + This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). + + \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam SourceEncoding Encoding of the input stream. + \tparam SchemaDocumentType Type of schema document. + \tparam StackAllocator Allocator type for stack. +*/ +template < + unsigned parseFlags, + typename InputStream, + typename SourceEncoding, + typename SchemaDocumentType = SchemaDocument, + typename StackAllocator = CrtAllocator> +class SchemaValidatingReader { +public: + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename InputStream::Ch Ch; + typedef GenericValue ValueType; + + //! Constructor + /*! + \param is Input stream. + \param sd Schema document. + */ + SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), error_(kObjectType), isValid_(true) {} + + template + bool operator()(Handler& handler) { + GenericReader reader; + GenericSchemaValidator validator(sd_, handler); + parseResult_ = reader.template Parse(is_, validator); + + isValid_ = validator.IsValid(); + if (isValid_) { + invalidSchemaPointer_ = PointerType(); + invalidSchemaKeyword_ = 0; + invalidDocumentPointer_ = PointerType(); + error_.SetObject(); + } + else { + invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); + invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); + invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); + error_.CopyFrom(validator.GetError(), allocator_); + } + + return parseResult_; + } + + const ParseResult& GetParseResult() const { return parseResult_; } + bool IsValid() const { return isValid_; } + const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } + const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } + const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } + const ValueType& GetError() const { return error_; } + +private: + InputStream& is_; + const SchemaDocumentType& sd_; + + ParseResult parseResult_; + PointerType invalidSchemaPointer_; + const Ch* invalidSchemaKeyword_; + PointerType invalidDocumentPointer_; + StackAllocator allocator_; + ValueType error_; + bool isValid_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_SCHEMA_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/stream.h b/3rdparty/rapidjson/include/rapidjson/stream.h new file mode 100644 index 0000000000..7f2643e481 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/stream.h @@ -0,0 +1,223 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#include "rapidjson.h" + +#ifndef RAPIDJSON_STREAM_H_ +#define RAPIDJSON_STREAM_H_ + +#include "encodings.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). + + For write-only stream, only need to implement Put() and Flush(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! Flush the buffer. + void Flush(); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Provides additional information for stream. +/*! + By using traits pattern, this type provides a default configuration for stream. + For custom stream, this type can be specialized for other configuration. + See TEST(Reader, CustomStringStream) in readertest.cpp for example. +*/ +template +struct StreamTraits { + //! Whether to make local copy of stream for optimization during parsing. + /*! + By default, for safety, streams do not use local copy optimization. + Stream that can be copied fast should specialize this, like StreamTraits. + */ + enum { copyOptimization = 0 }; +}; + +//! Reserve n characters for writing to a stream. +template +inline void PutReserve(Stream& stream, size_t count) { + (void)stream; + (void)count; +} + +//! Write character to a stream, presuming buffer is reserved. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { + stream.Put(c); +} + +//! Put N copies of a character to a stream. +template +inline void PutN(Stream& stream, Ch c, size_t n) { + PutReserve(stream, n); + for (size_t i = 0; i < n; i++) + PutUnsafe(stream, c); +} + +/////////////////////////////////////////////////////////////////////////////// +// GenericStreamWrapper + +//! A Stream Wrapper +/*! \tThis string stream is a wrapper for any stream by just forwarding any + \treceived message to the origin stream. + \note implements Stream concept +*/ + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4702) // unreachable code +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +template > +class GenericStreamWrapper { +public: + typedef typename Encoding::Ch Ch; + GenericStreamWrapper(InputStream& is): is_(is) {} + + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() { return is_.Tell(); } + Ch* PutBegin() { return is_.PutBegin(); } + void Put(Ch ch) { is_.Put(ch); } + void Flush() { is_.Flush(); } + size_t PutEnd(Ch* ch) { return is_.PutEnd(ch); } + + // wrapper for MemoryStream + const Ch* Peek4() const { return is_.Peek4(); } + + // wrapper for AutoUTFInputStream + UTFType GetType() const { return is_.GetType(); } + bool HasBOM() const { return is_.HasBOM(); } + +protected: + InputStream& is_; +}; + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +RAPIDJSON_DIAG_POP +#endif + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \note implements Stream concept +*/ +template +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return static_cast(src_ - head_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! String stream with UTF8 encoding. +typedef GenericStringStream > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \note implements Stream concept +*/ +template +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return static_cast(src_ - head_); } + + // Write + void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + + Ch* PutBegin() { return dst_ = src_; } + size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } + void Flush() {} + + Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } + void Pop(size_t count) { dst_ -= count; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! Insitu string stream with UTF8 encoding. +typedef GenericInsituStringStream > InsituStringStream; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STREAM_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/stringbuffer.h b/3rdparty/rapidjson/include/rapidjson/stringbuffer.h new file mode 100644 index 0000000000..4e38b82c3d --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/stringbuffer.h @@ -0,0 +1,121 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_STRINGBUFFER_H_ +#define RAPIDJSON_STRINGBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +#include "internal/stack.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +class GenericStringBuffer { +public: + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} + GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { + if (&rhs != this) + stack_ = std::move(rhs.stack_); + return *this; + } +#endif + + void Put(Ch c) { *stack_.template Push() = c; } + void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.ShrinkToFit(); + stack_.template Pop(1); + } + + void Reserve(size_t count) { stack_.template Reserve(count); } + Ch* Push(size_t count) { return stack_.template Push(count); } + Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.template Pop(1); + + return stack_.template Bottom(); + } + + //! Get the size of string in bytes in the string buffer. + size_t GetSize() const { return stack_.GetSize(); } + + //! Get the length of string in Ch in the string buffer. + size_t GetLength() const { return stack_.GetSize() / sizeof(Ch); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; + +private: + // Prohibit copy constructor & assignment operator. + GenericStringBuffer(const GenericStringBuffer&); + GenericStringBuffer& operator=(const GenericStringBuffer&); +}; + +//! String buffer with UTF8 encoding +typedef GenericStringBuffer > StringBuffer; + +template +inline void PutReserve(GenericStringBuffer& stream, size_t count) { + stream.Reserve(count); +} + +template +inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { + stream.PutUnsafe(c); +} + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { + std::memset(stream.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/3rdparty/rapidjson/include/rapidjson/writer.h b/3rdparty/rapidjson/include/rapidjson/writer.h new file mode 100644 index 0000000000..e7fb873a45 --- /dev/null +++ b/3rdparty/rapidjson/include/rapidjson/writer.h @@ -0,0 +1,710 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// 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. + +#ifndef RAPIDJSON_WRITER_H_ +#define RAPIDJSON_WRITER_H_ + +#include "stream.h" +#include "internal/clzll.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include "internal/dtoa.h" +#include "internal/itoa.h" +#include "stringbuffer.h" +#include // placement new + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#elif defined(RAPIDJSON_NEON) +#include +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(c++98-compat) +#elif defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// WriteFlag + +/*! \def RAPIDJSON_WRITE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kWriteDefaultFlags definition. + + User can define this as any \c WriteFlag combinations. +*/ +#ifndef RAPIDJSON_WRITE_DEFAULT_FLAGS +#define RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags +#endif + +//! Combination of writeFlags +enum WriteFlag { + kWriteNoFlags = 0, //!< No flags are set. + kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. + kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. + kWriteDefaultFlags = RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining RAPIDJSON_WRITE_DEFAULT_FLAGS +}; + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output os. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam OutputStream Type of output stream. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. + \note implements Handler concept +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class Writer { +public: + typedef typename SourceEncoding::Ch Ch; + + static const int kDefaultMaxDecimalPlaces = 324; + + //! Constructor + /*! \param os Output stream. + \param stackAllocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit + Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + explicit + Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Writer(Writer&& rhs) : + os_(rhs.os_), level_stack_(std::move(rhs.level_stack_)), maxDecimalPlaces_(rhs.maxDecimalPlaces_), hasRoot_(rhs.hasRoot_) { + rhs.os_ = 0; + } +#endif + + //! Reset the writer with a new stream. + /*! + This function reset the writer with a new stream and default settings, + in order to make a Writer object reusable for output multiple JSONs. + + \param os New output stream. + \code + Writer writer(os1); + writer.StartObject(); + // ... + writer.EndObject(); + + writer.Reset(os2); + writer.StartObject(); + // ... + writer.EndObject(); + \endcode + */ + void Reset(OutputStream& os) { + os_ = &os; + hasRoot_ = false; + level_stack_.Clear(); + } + + //! Checks whether the output is a complete JSON. + /*! + A complete JSON has a complete root object or array. + */ + bool IsComplete() const { + return hasRoot_ && level_stack_.Empty(); + } + + int GetMaxDecimalPlaces() const { + return maxDecimalPlaces_; + } + + //! Sets the maximum number of decimal places for double output. + /*! + This setting truncates the output with specified number of decimal places. + + For example, + + \code + writer.SetMaxDecimalPlaces(3); + writer.StartArray(); + writer.Double(0.12345); // "0.123" + writer.Double(0.0001); // "0.0" + writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) + writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) + writer.EndArray(); + \endcode + + The default setting does not truncate any decimal places. You can restore to this setting by calling + \code + writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); + \endcode + */ + void SetMaxDecimalPlaces(int maxDecimalPlaces) { + maxDecimalPlaces_ = maxDecimalPlaces; + } + + /*!@name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } + bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } + bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } + bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } + bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } + bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } + + //! Writes the given \c double value to the stream + /*! + \param d The value to be written. + \return Whether it is succeed. + */ + bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kNumberType); + return EndValue(WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + RAPIDJSON_ASSERT(str != 0); + (void)copy; + Prefix(kStringType); + return EndValue(WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push()) Level(false); + return WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) + { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); // not inside an Object + RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); // currently inside an Array, not Object + RAPIDJSON_ASSERT(0 == level_stack_.template Top()->valueCount % 2); // Object has a Key without a Value + level_stack_.template Pop(1); + return EndValue(WriteEndObject()); + } + + bool StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push()) Level(true); + return WriteStartArray(); + } + + bool EndArray(SizeType elementCount = 0) { + (void)elementCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndArray()); + } + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* const& str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* const& str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + */ + bool RawValue(const Ch* json, size_t length, Type type) { + RAPIDJSON_ASSERT(json != 0); + Prefix(type); + return EndValue(WriteRawValue(json, length)); + } + + //! Flush the output stream. + /*! + Allows the user to flush the output stream immediately. + */ + void Flush() { + os_->Flush(); + } + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : valueCount(0), inArray(inArray_) {} + size_t valueCount; //!< number of values in this level + bool inArray; //!< true if in array, otherwise in object + }; + + static const size_t kDefaultLevelDepth = 32; + + bool WriteNull() { + PutReserve(*os_, 4); + PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; + } + + bool WriteBool(bool b) { + if (b) { + PutReserve(*os_, 4); + PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); + } + else { + PutReserve(*os_, 5); + PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); + } + return true; + } + + bool WriteInt(int i) { + char buffer[11]; + const char* end = internal::i32toa(i, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint(unsigned u) { + char buffer[10]; + const char* end = internal::u32toa(u, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteInt64(int64_t i64) { + char buffer[21]; + const char* end = internal::i64toa(i64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint64(uint64_t u64) { + char buffer[20]; + char* end = internal::u64toa(u64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + if (!(writeFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char buffer[25]; + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteString(const Ch* str, SizeType length) { + static const typename OutputStream::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + if (TargetEncoding::supportUnicode) + PutReserve(*os_, 2 + length * 6); // "\uxxxx..." + else + PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." + + PutUnsafe(*os_, '\"'); + GenericStringStream is(str); + while (ScanWriteUnescapedString(is, length)) { + const Ch c = is.Peek(); + if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { + // Unicode escaping + unsigned codepoint; + if (RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) + return false; + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { + PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); + } + else { + RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); + // Surrogate pair + unsigned s = codepoint - 0x010000; + unsigned lead = (s >> 10) + 0xD800; + unsigned trail = (s & 0x3FF) + 0xDC00; + PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(lead ) & 15]); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(trail ) & 15]); + } + } + else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { + is.Take(); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, static_cast(escape[static_cast(c)])); + if (escape[static_cast(c)] == 'u') { + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); + PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); + } + } + else if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + PutUnsafe(*os_, '\"'); + return true; + } + + bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { + return RAPIDJSON_LIKELY(is.Tell() < length); + } + + bool WriteStartObject() { os_->Put('{'); return true; } + bool WriteEndObject() { os_->Put('}'); return true; } + bool WriteStartArray() { os_->Put('['); return true; } + bool WriteEndArray() { os_->Put(']'); return true; } + + bool WriteRawValue(const Ch* json, size_t length) { + PutReserve(*os_, length); + GenericStringStream is(json); + while (RAPIDJSON_LIKELY(is.Tell() < length)) { + RAPIDJSON_ASSERT(is.Peek() != '\0'); + if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + return true; + } + + void Prefix(Type type) { + (void)type; + if (RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root + Level* level = level_stack_.template Top(); + if (level->valueCount > 0) { + if (level->inArray) + os_->Put(','); // add comma if it is not the first element in array + else // in object + os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. + hasRoot_ = true; + } + } + + // Flush the value if it is the top level one. + bool EndValue(bool ret) { + if (RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text + Flush(); + return ret; + } + + OutputStream* os_; + internal::Stack level_stack_; + int maxDecimalPlaces_; + bool hasRoot_; + +private: + // Prohibit copy constructor & assignment operator. + Writer(const Writer&); + Writer& operator=(const Writer&); +}; + +// Full specialization for StringStream to prevent memory copying + +template<> +inline bool Writer::WriteInt(int i) { + char *buffer = os_->Push(11); + const char* end = internal::i32toa(i, buffer); + os_->Pop(static_cast(11 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint(unsigned u) { + char *buffer = os_->Push(10); + const char* end = internal::u32toa(u, buffer); + os_->Pop(static_cast(10 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteInt64(int64_t i64) { + char *buffer = os_->Push(21); + const char* end = internal::i64toa(i64, buffer); + os_->Pop(static_cast(21 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint64(uint64_t u) { + char *buffer = os_->Push(20); + const char* end = internal::u64toa(u, buffer); + os_->Pop(static_cast(20 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + // Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). + if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char *buffer = os_->Push(25); + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + os_->Pop(static_cast(25 - (end - buffer))); + return true; +} + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (; p != endAligned; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x1F) == 0x1F + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType len; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + len = offset; +#else + len = static_cast(__builtin_ffs(r) - 1); +#endif + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#elif defined(RAPIDJSON_NEON) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + const uint8x16_t s0 = vmovq_n_u8('"'); + const uint8x16_t s1 = vmovq_n_u8('\\'); + const uint8x16_t s2 = vmovq_n_u8('\b'); + const uint8x16_t s3 = vmovq_n_u8(32); + + for (; p != endAligned; p += 16) { + const uint8x16_t s = vld1q_u8(reinterpret_cast(p)); + uint8x16_t x = vceqq_u8(s, s0); + x = vorrq_u8(x, vceqq_u8(s, s1)); + x = vorrq_u8(x, vceqq_u8(s, s2)); + x = vorrq_u8(x, vcltq_u8(s, s3)); + + x = vrev64q_u8(x); // Rev in 64 + uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0); // extract + uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1); // extract + + SizeType len = 0; + bool escaped = false; + if (low == 0) { + if (high != 0) { + uint32_t lz = internal::clzll(high); + len = 8 + (lz >> 3); + escaped = true; + } + } else { + uint32_t lz = internal::clzll(low); + len = lz >> 3; + escaped = true; + } + if (RAPIDJSON_UNLIKELY(escaped)) { // some of characters is escaped + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + vst1q_u8(reinterpret_cast(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#endif // RAPIDJSON_NEON + +RAPIDJSON_NAMESPACE_END + +#if defined(_MSC_VER) || defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/3rdparty/rapidjson/license.txt b/3rdparty/rapidjson/license.txt new file mode 100644 index 0000000000..7ccc161c84 --- /dev/null +++ b/3rdparty/rapidjson/license.txt @@ -0,0 +1,57 @@ +Tencent is pleased to support the open source community by making RapidJSON available. + +Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. + +If you have downloaded a copy of the RapidJSON binary from Tencent, please note that the RapidJSON binary is licensed under the MIT License. +If you have downloaded a copy of the RapidJSON source code from Tencent, please note that RapidJSON source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms. Your integration of RapidJSON into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within RapidJSON. To avoid the problematic JSON license in your own projects, it's sufficient to exclude the bin/jsonchecker/ directory, as it's the only code under the JSON license. +A copy of the MIT License is included in this file. + +Other dependencies and licenses: + +Open Source Software Licensed Under the BSD License: +-------------------------------------------------------------------- + +The msinttypes r29 +Copyright (c) 2006-2013 Alexander Chemeris +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. +* Neither the name of copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS AND 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. + +Open Source Software Licensed Under the JSON License: +-------------------------------------------------------------------- + +json.org +Copyright (c) 2002 JSON.org +All Rights Reserved. + +JSON_checker +Copyright (c) 2002 JSON.org +All Rights Reserved. + + +Terms of the JSON License: +--------------------------------------------------- + +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 shall be used for Good, not Evil. + +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. + + +Terms of the MIT License: +-------------------------------------------------------------------- + +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/3rdparty/rcheevos/CMakeLists.txt b/3rdparty/rcheevos/CMakeLists.txt new file mode 100644 index 0000000000..34f647a1cb --- /dev/null +++ b/3rdparty/rcheevos/CMakeLists.txt @@ -0,0 +1,47 @@ +add_library(rcheevos + rcheevos/include/rc_api_editor.h + rcheevos/include/rc_api_info.h + rcheevos/include/rc_api_request.h + rcheevos/include/rc_api_runtime.h + rcheevos/include/rc_api_user.h + rcheevos/include/rc_consoles.h + rcheevos/include/rc_error.h + rcheevos/include/rc_hash.h + rcheevos/include/rcheevos.h + rcheevos/include/rc_runtime.h + rcheevos/include/rc_runtime_types.h + rcheevos/include/rc_url.h + rcheevos/src/rapi/rc_api_common.c + rcheevos/src/rapi/rc_api_common.h + rcheevos/src/rapi/rc_api_editor.c + rcheevos/src/rapi/rc_api_info.c + rcheevos/src/rapi/rc_api_runtime.c + rcheevos/src/rapi/rc_api_user.c + rcheevos/src/rcheevos/alloc.c + rcheevos/src/rcheevos/compat.c + rcheevos/src/rcheevos/condition.c + rcheevos/src/rcheevos/condset.c + rcheevos/src/rcheevos/consoleinfo.c + rcheevos/src/rcheevos/format.c + rcheevos/src/rcheevos/lboard.c + rcheevos/src/rcheevos/memref.c + rcheevos/src/rcheevos/operand.c + rcheevos/src/rcheevos/rc_compat.h + rcheevos/src/rcheevos/rc_internal.h + rcheevos/src/rcheevos/rc_validate.c + rcheevos/src/rcheevos/rc_validate.h + rcheevos/src/rcheevos/richpresence.c + rcheevos/src/rcheevos/runtime.c + rcheevos/src/rcheevos/runtime_progress.c + rcheevos/src/rcheevos/trigger.c + rcheevos/src/rcheevos/value.c + rcheevos/src/rhash/hash.c + rcheevos/src/rhash/md5.c + rcheevos/src/rhash/md5.h + rcheevos/src/rurl/url.c +) + +target_include_directories(rcheevos PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/rcheevos/include") +target_include_directories(rcheevos INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/rcheevos/include") +target_compile_definitions(rcheevos PRIVATE "RC_DISABLE_LUA=1" "RCHEEVOS_URL_SSL") + diff --git a/3rdparty/rcheevos/rcheevos b/3rdparty/rcheevos/rcheevos new file mode 160000 index 0000000000..31f8788fe0 --- /dev/null +++ b/3rdparty/rcheevos/rcheevos @@ -0,0 +1 @@ +Subproject commit 31f8788fe0e694e99db7ce138d45a655c556fa96 diff --git a/3rdparty/rcheevos/rcheevos.vcxproj b/3rdparty/rcheevos/rcheevos.vcxproj new file mode 100644 index 0000000000..b8ff5285bd --- /dev/null +++ b/3rdparty/rcheevos/rcheevos.vcxproj @@ -0,0 +1,84 @@ + + + + + + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3} + + + + StaticLibrary + $(DefaultPlatformToolset) + MultiByte + true + true + false + + + + + + + + + + + + + + AllRules.ruleset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _CRT_NONSTDC_NO_WARNINGS;RC_DISABLE_LUA;RCHEEVOS_URL_SSL;%(PreprocessorDefinitions) + $(ProjectDir)rcheevos\include;%(AdditionalIncludeDirectories) + TurnOffAllWarnings + + + + + \ No newline at end of file diff --git a/3rdparty/rcheevos/rcheevos.vcxproj.filters b/3rdparty/rcheevos/rcheevos.vcxproj.filters new file mode 100644 index 0000000000..255fc643c5 --- /dev/null +++ b/3rdparty/rcheevos/rcheevos.vcxproj.filters @@ -0,0 +1,144 @@ + + + + + {0d8ef204-a486-4873-a41d-743ca6cbe840} + + + {3aa9379e-4fd1-4772-b18c-b899631a4161} + + + {c95da822-5bca-4274-b57e-d2092e76e8f1} + + + {01fc10b0-c122-461b-b75a-f97c8b89d627} + + + {f132daaf-af7e-4a43-8fcf-5651b805b43f} + + + + + rapi + + + rapi + + + rapi + + + rapi + + + rapi + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rcheevos + + + rhash + + + rhash + + + rurl + + + + + rapi + + + rcheevos + + + rcheevos + + + rcheevos + + + rhash + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + \ No newline at end of file diff --git a/3rdparty/sdl2/SDL b/3rdparty/sdl2/SDL index 53dea98309..0bfeed061b 160000 --- a/3rdparty/sdl2/SDL +++ b/3rdparty/sdl2/SDL @@ -1 +1 @@ -Subproject commit 53dea9830964eee8b5c2a7ee0a65d6e268dc78a1 +Subproject commit 0bfeed061b10ea7dd37c88d9bae1824bad760f3a diff --git a/3rdparty/sdl2/SDL.vcxproj b/3rdparty/sdl2/SDL.vcxproj index 91f3c8b3f9..164212ff95 100644 --- a/3rdparty/sdl2/SDL.vcxproj +++ b/3rdparty/sdl2/SDL.vcxproj @@ -60,9 +60,10 @@ + - + @@ -157,6 +158,7 @@ + @@ -173,6 +175,7 @@ + @@ -196,13 +199,14 @@ + + - @@ -280,15 +284,21 @@ + + + + + + @@ -320,16 +330,18 @@ + - - - + + + + @@ -350,12 +362,15 @@ + + + diff --git a/3rdparty/sdl2/SDL.vcxproj.filters b/3rdparty/sdl2/SDL.vcxproj.filters index eec12ec2ca..1bc7b8cbea 100644 --- a/3rdparty/sdl2/SDL.vcxproj.filters +++ b/3rdparty/sdl2/SDL.vcxproj.filters @@ -542,6 +542,9 @@ joystick\hidapi + + joystick\hidapi + joystick\hidapi @@ -966,6 +969,9 @@ joystick\hidapi + + joystick\hidapi + joystick\hidapi @@ -978,9 +984,15 @@ joystick\hidapi + + joystick\hidapi + joystick\hidapi + + joystick\hidapi + joystick\hidapi diff --git a/3rdparty/vulkan-headers b/3rdparty/vulkan-headers index 52a76fd0a6..9f4c61a314 160000 --- a/3rdparty/vulkan-headers +++ b/3rdparty/vulkan-headers @@ -1 +1 @@ -Subproject commit 52a76fd0a693708eb8c25bd0ab7a1008091f64d4 +Subproject commit 9f4c61a31435a7a90a314fc68aeb386c92a09c0f diff --git a/3rdparty/wxwidgets3.0/src/common/image.cpp b/3rdparty/wxwidgets3.0/src/common/image.cpp index 2120296c56..c8f8fd3964 100644 --- a/3rdparty/wxwidgets3.0/src/common/image.cpp +++ b/3rdparty/wxwidgets3.0/src/common/image.cpp @@ -627,7 +627,8 @@ wxImage wxImage::ResampleBox(int width, int height) const const BoxPrecalc& hPrecalc = hPrecalcs[x]; // Box of pixels to average - averaged_pixels = 0; + averaged_pixels = (vPrecalc.boxEnd - vPrecalc.boxStart + 1) + *(hPrecalc.boxEnd - hPrecalc.boxStart + 1); sum_r = sum_g = sum_b = sum_a = 0.0; for ( int j = vPrecalc.boxStart; j <= vPrecalc.boxEnd; ++j ) @@ -642,8 +643,6 @@ wxImage wxImage::ResampleBox(int width, int height) const sum_b += src_data[src_pixel_index * 3 + 2]; if ( src_alpha ) sum_a += src_alpha[src_pixel_index]; - - averaged_pixels++; } } diff --git a/3rdparty/zydis/CMakeLists.txt b/3rdparty/zydis/CMakeLists.txt new file mode 100644 index 0000000000..6ce9b3b1d0 --- /dev/null +++ b/3rdparty/zydis/CMakeLists.txt @@ -0,0 +1,90 @@ +add_library(zydis + dependencies/zycore/src/Allocator.c + dependencies/zycore/src/API/Memory.c + dependencies/zycore/src/API/Process.c + dependencies/zycore/src/API/Synchronization.c + dependencies/zycore/src/API/Terminal.c + dependencies/zycore/src/API/Thread.c + dependencies/zycore/src/ArgParse.c + dependencies/zycore/src/Bitset.c + dependencies/zycore/src/Format.c + dependencies/zycore/src/List.c + dependencies/zycore/src/String.c + dependencies/zycore/src/Vector.c + dependencies/zycore/src/Zycore.c + src/Decoder.c + src/DecoderData.c + src/Formatter.c + src/FormatterATT.c + src/FormatterBase.c + src/FormatterBuffer.c + src/FormatterIntel.c + src/MetaInfo.c + src/Mnemonic.c + src/Register.c + src/SharedData.c + src/String.c + src/Utils.c + src/Zydis.c + dependencies/zycore/include/Zycore/Allocator.h + dependencies/zycore/include/Zycore/API/Memory.h + dependencies/zycore/include/Zycore/API/Process.h + dependencies/zycore/include/Zycore/API/Synchronization.h + dependencies/zycore/include/Zycore/API/Terminal.h + dependencies/zycore/include/Zycore/API/Thread.h + dependencies/zycore/include/Zycore/ArgParse.h + dependencies/zycore/include/Zycore/Atomic.h + dependencies/zycore/include/Zycore/Bitset.h + dependencies/zycore/include/Zycore/Comparison.h + dependencies/zycore/include/Zycore/Defines.h + dependencies/zycore/include/Zycore/Format.h + dependencies/zycore/include/Zycore/Internal/AtomicGNU.h + dependencies/zycore/include/Zycore/Internal/AtomicMSVC.h + dependencies/zycore/include/Zycore/LibC.h + dependencies/zycore/include/Zycore/List.h + dependencies/zycore/include/Zycore/Object.h + dependencies/zycore/include/Zycore/Status.h + dependencies/zycore/include/Zycore/String.h + dependencies/zycore/include/Zycore/Types.h + dependencies/zycore/include/Zycore/Vector.h + dependencies/zycore/include/Zycore/Zycore.h + include/Zydis/Decoder.h + include/Zydis/DecoderTypes.h + include/Zydis/Formatter.h + include/Zydis/FormatterBuffer.h + include/Zydis/Generated/EnumInstructionCategory.h + include/Zydis/Generated/EnumISAExt.h + include/Zydis/Generated/EnumISASet.h + include/Zydis/Generated/EnumMnemonic.h + include/Zydis/Generated/EnumRegister.h + include/Zydis/Internal/DecoderData.h + include/Zydis/Internal/FormatterATT.h + include/Zydis/Internal/FormatterBase.h + include/Zydis/Internal/FormatterIntel.h + include/Zydis/Internal/SharedData.h + include/Zydis/Internal/String.h + include/Zydis/MetaInfo.h + include/Zydis/Mnemonic.h + include/Zydis/Register.h + include/Zydis/SharedTypes.h + include/Zydis/ShortString.h + include/Zydis/Status.h + include/Zydis/Utils.h + include/Zydis/Zydis.h +) + +target_compile_definitions(zydis PUBLIC + ZYCORE_STATIC_DEFINE + ZYDIS_STATIC_DEFINE +) + +target_include_directories(zydis PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zycore/include + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + +target_include_directories(zydis PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zycore/src + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + diff --git a/3rdparty/zydis/LICENSE b/3rdparty/zydis/LICENSE new file mode 100644 index 0000000000..11185a5a74 --- /dev/null +++ b/3rdparty/zydis/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2014-2021 Florian Bernd +Copyright (c) 2014-2021 Joel Höner + +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/3rdparty/zydis/README.md b/3rdparty/zydis/README.md new file mode 100644 index 0000000000..87dbcfad4f --- /dev/null +++ b/3rdparty/zydis/README.md @@ -0,0 +1,178 @@ +

+ zydis logo +

+ +
+ +

Fast and lightweight x86/x86-64 disassembler library.

+ +## Features +- Supports all x86 and x86-64 (AMD64) instructions and [extensions](./include/Zydis/Generated/EnumISAExt.h) +- Optimized for high performance +- No dynamic memory allocation ("malloc") +- Thread-safe by design +- Very small file-size overhead compared to other common disassembler libraries +- [Complete doxygen documentation](https://zydis.re/doc/3/) +- Absolutely no third party dependencies — not even libc + - Should compile on any platform with a working C99 compiler + - Tested on Windows, macOS, FreeBSD, Linux and UEFI, both user and kernel mode + +## Quick Example +The following example program uses Zydis to disassemble a given memory buffer and prints the output to the console ([more examples here](./examples/)). + +```C +#include +#include +#include + +int main() +{ + ZyanU8 data[] = + { + 0x51, 0x8D, 0x45, 0xFF, 0x50, 0xFF, 0x75, 0x0C, 0xFF, 0x75, + 0x08, 0xFF, 0x15, 0xA0, 0xA5, 0x48, 0x76, 0x85, 0xC0, 0x0F, + 0x88, 0xFC, 0xDA, 0x02, 0x00 + }; + + // Initialize decoder context + ZydisDecoder decoder; + ZydisDecoderInit(&decoder, ZYDIS_MACHINE_MODE_LONG_64, ZYDIS_ADDRESS_WIDTH_64); + + // Initialize formatter. Only required when you actually plan to do instruction + // formatting ("disassembling"), like we do here + ZydisFormatter formatter; + ZydisFormatterInit(&formatter, ZYDIS_FORMATTER_STYLE_INTEL); + + // Loop over the instructions in our buffer. + // The runtime-address (instruction pointer) is chosen arbitrary here in order to better + // visualize relative addressing + ZyanU64 runtime_address = 0x007FFFFFFF400000; + ZyanUSize offset = 0; + const ZyanUSize length = sizeof(data); + ZydisDecodedInstruction instruction; + while (ZYAN_SUCCESS(ZydisDecoderDecodeBuffer(&decoder, data + offset, length - offset, + &instruction))) + { + // Print current instruction pointer. + printf("%016" PRIX64 " ", runtime_address); + + // Format & print the binary instruction structure to human readable format + char buffer[256]; + ZydisFormatterFormatInstruction(&formatter, &instruction, buffer, sizeof(buffer), + runtime_address); + puts(buffer); + + offset += instruction.length; + runtime_address += instruction.length; + } +} +``` + +## Sample Output +The above example program generates the following output: + +```asm +007FFFFFFF400000 push rcx +007FFFFFFF400001 lea eax, [rbp-0x01] +007FFFFFFF400004 push rax +007FFFFFFF400005 push qword ptr [rbp+0x0C] +007FFFFFFF400008 push qword ptr [rbp+0x08] +007FFFFFFF40000B call [0x008000007588A5B1] +007FFFFFFF400011 test eax, eax +007FFFFFFF400013 js 0x007FFFFFFF42DB15 +``` + +## Build + +#### Unix +Zydis builds cleanly on most platforms without any external dependencies. You can use CMake to generate project files for your favorite C99 compiler. + +```bash +git clone --recursive 'https://github.com/zyantific/zydis.git' +cd zydis +mkdir build && cd build +cmake .. +make +``` + +#### Windows +Either use the [Visual Studio 2017 project](./msvc/) or build Zydis using [CMake](https://cmake.org/download/) ([video guide](https://www.youtube.com/watch?v=fywLDK1OAtQ)). + +#### Building Zydis - Using vcpkg + +You can download and install Zydis using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager: + +```bash +git clone https://github.com/Microsoft/vcpkg.git +cd vcpkg +./bootstrap-vcpkg.sh +./vcpkg integrate install +vcpkg install zydis +``` +The Zydis 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. + +## Using Zydis in a CMake project +An example on how to use Zydis in your own CMake based project [can be found in this repo](https://github.com/zyantific/zydis-submodule-example). + +## `ZydisInfo` tool +![ZydisInfo](./assets/screenshots/ZydisInfo.png) + +## Bindings +Official bindings exist for a selection of languages: +- [Pascal](https://github.com/zyantific/zydis-pascal) +- [Python 3](https://github.com/zyantific/zydis-py) +- [Rust](https://github.com/zyantific/zydis-rs) + +Unofficial but actively maintained bindings: +- [Go](https://github.com/jpap/go-zydis) +- [LuaJIT](https://github.com/Wiladams/lj2zydis) +- [Haskell](https://github.com/nerded1337/zydiskell) + +## Versions + +#### Scheme +Versions follow the [semantic versioning scheme](https://semver.org/). All stability guarantees apply to the API only — ABI stability between patches cannot be assumed unless explicitly mentioned in the release notes. + +#### Branches & Tags +- `master` holds the bleeding edge code of the next, unreleased Zydis version. Elevated amounts of bugs and issues must be expected, API stability is not guaranteed outside of tagged commits. +- Stable and preview versions are annotated with git tags + - beta and other preview versions have `-beta`, `-rc`, etc. suffixes +- `maintenance/v2` contains the code of the latest legacy release of v2 + - v2 is now deprecated, but will receive security fixes until 2021 + +## Credits +- Intel (for open-sourcing [XED](https://github.com/intelxed/xed), allowing for automatic comparison of our tables against theirs, improving both) +- [LLVM](https://llvm.org) (for providing pretty solid instruction data as well) +- Christian Ludloff (http://sandpile.org, insanely helpful) +- [LekoArts](https://www.lekoarts.de/) (for creating the project logo) +- Our [contributors on GitHub](https://github.com/zyantific/zydis/graphs/contributors) + +## Troubleshooting + +#### `-fPIC` for shared library builds + +``` +/usr/bin/ld: ./libfoo.a(foo.c.o): relocation R_X86_64_PC32 against symbol `bar' can not be used when making a shared object; recompile with -fPIC +``` + +Under some circumstances (e.g. when building Zydis as a static library using +CMake and then using Makefiles to manually link it into a shared library), CMake +might fail to detect that relocation information must be emitted. This can be forced +by passing `-DCMAKE_POSITION_INDEPENDENT_CODE=ON` to the CMake invocation. + +## Consulting and Business Support +We offer consulting services and professional business support for Zydis. If you need a custom extension, require help in integrating Zydis into your product or simply want contractually guaranteed updates and turnaround times, we are happy to assist with that! Please contact us at business@zyantific.com. + +## Donations + +Since GitHub Sponsors currently doesn't support sponsoring teams directly, donations are collected and distributed using [flobernd](https://github.com/users/flobernd/sponsorship)s account. + +## License + +Zydis is licensed under the MIT license. diff --git a/3rdparty/zydis/dependencies/zycore/LICENSE b/3rdparty/zydis/dependencies/zycore/LICENSE new file mode 100644 index 0000000000..4d9069aee5 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2018-2020 Florian Bernd +Copyright (c) 2018-2020 Joel Höner + +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/3rdparty/zydis/dependencies/zycore/README.md b/3rdparty/zydis/dependencies/zycore/README.md new file mode 100644 index 0000000000..ff2fc4101a --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/README.md @@ -0,0 +1,29 @@ +# Zyan Core Library for C + +License: MIT +GitHub Actions +Discord + +Internal library providing platform independent types, macros and a fallback for environments without LibC. + +## Features + +- Platform independent types + - Integer types (`ZyanU8`, `ZyanI32`, `ZyanUSize`, ...) + - `ZyanBool` (+ `ZYAN_FALSE`, `ZYAN_TRUE`) + - `ZYAN_NULL` +- Macros + - Compiler/Platform/Architecture detection + - Asserts and static asserts + - Utils (`ARRAY_LENGTH`, `FALLTHROUGH`, `UNUSED`, ...) +- Common types + - `ZyanBitset` + - `ZyanString`/`ZyanStringView` +- Container types + - `ZyanVector` + - `ZyanList` +- LibC abstraction (WiP) + +## License + +Zycore is licensed under the MIT license. diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Memory.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Memory.h new file mode 100644 index 0000000000..1030e83f41 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Memory.h @@ -0,0 +1,137 @@ +/*************************************************************************************************** + + 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_API_MEMORY_H +#define ZYCORE_API_MEMORY_H + +#include +#include +#include + +#ifndef ZYAN_NO_LIBC + +#if defined(ZYAN_WINDOWS) +# include +#elif defined(ZYAN_POSIX) +# include +#else +# error "Unsupported platform detected" +#endif + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + +/** + * Defines the `ZyanMemoryPageProtection` enum. + */ +typedef enum ZyanMemoryPageProtection_ +{ +#if defined(ZYAN_WINDOWS) + + ZYAN_PAGE_READONLY = PAGE_READONLY, + ZYAN_PAGE_READWRITE = PAGE_READWRITE, + ZYAN_PAGE_EXECUTE = PAGE_EXECUTE, + ZYAN_PAGE_EXECUTE_READ = PAGE_EXECUTE_READ, + ZYAN_PAGE_EXECUTE_READWRITE = PAGE_EXECUTE_READWRITE + +#elif defined(ZYAN_POSIX) + + ZYAN_PAGE_READONLY = PROT_READ, + ZYAN_PAGE_READWRITE = PROT_READ | PROT_WRITE, + ZYAN_PAGE_EXECUTE = PROT_EXEC, + ZYAN_PAGE_EXECUTE_READ = PROT_EXEC | PROT_READ, + ZYAN_PAGE_EXECUTE_READWRITE = PROT_EXEC | PROT_READ | PROT_WRITE + +#endif +} ZyanMemoryPageProtection; + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns the system page size. + * + * @return The system page size. + */ +ZYCORE_EXPORT ZyanU32 ZyanMemoryGetSystemPageSize(); + +/** + * Returns the system allocation granularity. + * + * The system allocation granularity specifies the minimum amount of bytes which can be allocated + * at a specific address by a single call of `ZyanMemoryVirtualAlloc`. + * + * This value is typically 64KiB on Windows systems and equal to the page size on most POSIX + * platforms. + * + * @return The system allocation granularity. + */ +ZYCORE_EXPORT ZyanU32 ZyanMemoryGetSystemAllocationGranularity(); + +/* ---------------------------------------------------------------------------------------------- */ +/* Memory management */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Changes the memory protection value of one or more pages. + * + * @param address The start address aligned to a page boundary. + * @param size The size. + * @param protection The new page protection value. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanMemoryVirtualProtect(void* address, ZyanUSize size, + ZyanMemoryPageProtection protection); + +/** + * Releases one or more memory pages starting at the given address. + * + * @param address The start address aligned to a page boundary. + * @param size The size. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanMemoryVirtualFree(void* address, ZyanUSize size); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#endif /* ZYAN_NO_LIBC */ + +#endif /* ZYCORE_API_MEMORY_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Process.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Process.h new file mode 100644 index 0000000000..f8e1e4f2df --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Process.h @@ -0,0 +1,70 @@ +/*************************************************************************************************** + + 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_API_PROCESS_H +#define ZYCORE_API_PROCESS_H + +#include +#include + +#ifndef ZYAN_NO_LIBC + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + + + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * @brief Flushes the process instruction cache. + * + * @param address The address. + * @param size The size. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanProcessFlushInstructionCache(void* address, ZyanUSize size); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#endif /* ZYAN_NO_LIBC */ + +#endif /* ZYCORE_API_PROCESS_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Synchronization.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Synchronization.h new file mode 100644 index 0000000000..ec32f066bf --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Synchronization.h @@ -0,0 +1,132 @@ +/*************************************************************************************************** + + 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_API_SYNCHRONIZATION_H +#define ZYCORE_API_SYNCHRONIZATION_H + +#include +#include + +#ifndef ZYAN_NO_LIBC + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + +#if defined(ZYAN_POSIX) + +#include + +/* ---------------------------------------------------------------------------------------------- */ +/* Critical Section */ +/* ---------------------------------------------------------------------------------------------- */ + +typedef pthread_mutex_t ZyanCriticalSection; + +/* ---------------------------------------------------------------------------------------------- */ + +#elif defined(ZYAN_WINDOWS) + +#include + +/* ---------------------------------------------------------------------------------------------- */ +/* Critical Section */ +/* ---------------------------------------------------------------------------------------------- */ + +typedef CRITICAL_SECTION ZyanCriticalSection; + +/* ---------------------------------------------------------------------------------------------- */ + +#else +# error "Unsupported platform detected" +#endif + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Critical Section */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Initializes a critical section. + * + * @param critical_section A pointer to the `ZyanCriticalSection` struct. + */ +ZYCORE_EXPORT ZyanStatus ZyanCriticalSectionInitialize(ZyanCriticalSection* critical_section); + +/** + * Enters a critical section. + * + * @param critical_section A pointer to the `ZyanCriticalSection` struct. + */ +ZYCORE_EXPORT ZyanStatus ZyanCriticalSectionEnter(ZyanCriticalSection* critical_section); + +/** + * Tries to enter a critical section. + * + * @param critical_section A pointer to the `ZyanCriticalSection` struct. + * + * @return Returns `ZYAN_TRUE` if the critical section was successfully entered or `ZYAN_FALSE`, + * if not. + */ +ZYCORE_EXPORT ZyanBool ZyanCriticalSectionTryEnter(ZyanCriticalSection* critical_section); + +/** + * Leaves a critical section. + * + * @param critical_section A pointer to the `ZyanCriticalSection` struct. + */ +ZYCORE_EXPORT ZyanStatus ZyanCriticalSectionLeave(ZyanCriticalSection* critical_section); + +/** + * Deletes a critical section. + * + * @param critical_section A pointer to the `ZyanCriticalSection` struct. + */ +ZYCORE_EXPORT ZyanStatus ZyanCriticalSectionDelete(ZyanCriticalSection* critical_section); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYAN_NO_LIBC */ + +#endif /* ZYCORE_API_SYNCHRONIZATION_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Terminal.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Terminal.h new file mode 100644 index 0000000000..3bff8c15b5 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Terminal.h @@ -0,0 +1,162 @@ +/*************************************************************************************************** + + 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 cross-platform terminal helper functions. + * @brief + */ + +#ifndef ZYCORE_API_TERMINAL_H +#define ZYCORE_API_TERMINAL_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ZYAN_NO_LIBC + +/* ============================================================================================== */ +/* VT100 CSI SGR sequences */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYAN_VT100SGR_RESET "\033[0m" + +/* ---------------------------------------------------------------------------------------------- */ +/* Foreground colors */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYAN_VT100SGR_FG_DEFAULT "\033[39m" + +#define ZYAN_VT100SGR_FG_BLACK "\033[30m" +#define ZYAN_VT100SGR_FG_RED "\033[31m" +#define ZYAN_VT100SGR_FG_GREEN "\033[32m" +#define ZYAN_VT100SGR_FG_YELLOW "\033[33m" +#define ZYAN_VT100SGR_FG_BLUE "\033[34m" +#define ZYAN_VT100SGR_FG_MAGENTA "\033[35m" +#define ZYAN_VT100SGR_FG_CYAN "\033[36m" +#define ZYAN_VT100SGR_FG_WHITE "\033[37m" +#define ZYAN_VT100SGR_FG_BRIGHT_BLACK "\033[90m" +#define ZYAN_VT100SGR_FG_BRIGHT_RED "\033[91m" +#define ZYAN_VT100SGR_FG_BRIGHT_GREEN "\033[92m" +#define ZYAN_VT100SGR_FG_BRIGHT_YELLOW "\033[93m" +#define ZYAN_VT100SGR_FG_BRIGHT_BLUE "\033[94m" +#define ZYAN_VT100SGR_FG_BRIGHT_MAGENTA "\033[95m" +#define ZYAN_VT100SGR_FG_BRIGHT_CYAN "\033[96m" +#define ZYAN_VT100SGR_FG_BRIGHT_WHITE "\033[97m" + +/* ---------------------------------------------------------------------------------------------- */ +/* Background color */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYAN_VT100SGR_BG_DEFAULT "\033[49m" + +#define ZYAN_VT100SGR_BG_BLACK "\033[40m" +#define ZYAN_VT100SGR_BG_RED "\033[41m" +#define ZYAN_VT100SGR_BG_GREEN "\033[42m" +#define ZYAN_VT100SGR_BG_YELLOW "\033[43m" +#define ZYAN_VT100SGR_BG_BLUE "\033[44m" +#define ZYAN_VT100SGR_BG_MAGENTA "\033[45m" +#define ZYAN_VT100SGR_BG_CYAN "\033[46m" +#define ZYAN_VT100SGR_BG_WHITE "\033[47m" +#define ZYAN_VT100SGR_BG_BRIGHT_BLACK "\033[100m" +#define ZYAN_VT100SGR_BG_BRIGHT_RED "\033[101m" +#define ZYAN_VT100SGR_BG_BRIGHT_GREEN "\033[102m" +#define ZYAN_VT100SGR_BG_BRIGHT_YELLOW "\033[103m" +#define ZYAN_VT100SGR_BG_BRIGHT_BLUE "\033[104m" +#define ZYAN_VT100SGR_BG_BRIGHT_MAGENTA "\033[105m" +#define ZYAN_VT100SGR_BG_BRIGHT_CYAN "\033[106m" +#define ZYAN_VT100SGR_BG_BRIGHT_WHITE "\033[107m" + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + +/** + * Declares the `ZyanStandardStream` enum. + */ +typedef enum ZyanStandardStream_ +{ + /** + * The default input stream. + */ + ZYAN_STDSTREAM_IN, + /** + * The default output stream. + */ + ZYAN_STDSTREAM_OUT, + /** + * The default error stream. + */ + ZYAN_STDSTREAM_ERR +} ZyanStandardStream; + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/** + * Enables VT100 ansi escape codes for the given stream. + * + * @param stream Either `ZYAN_STDSTREAM_OUT` or `ZYAN_STDSTREAM_ERR`. + * + * @return A zyan status code. + * + * This functions returns `ZYAN_STATUS_SUCCESS` on all non-Windows systems without performing any + * operations, assuming that VT100 is supported by default. + * + * On Windows systems, VT100 functionality is only supported on Windows 10 build 1607 (anniversary + * update) and later. + */ +ZYCORE_EXPORT ZyanStatus ZyanTerminalEnableVT100(ZyanStandardStream stream); + +/** + * Checks, if the given standard stream reads from or writes to a terminal. + * + * @param stream The standard stream to check. + * + * @return `ZYAN_STATUS_TRUE`, if the stream is bound to a terminal, `ZYAN_STATUS_FALSE` if not, + * or another zyan status code if an error occured. + */ +ZYCORE_EXPORT ZyanStatus ZyanTerminalIsTTY(ZyanStandardStream stream); + +/* ============================================================================================== */ + +#endif // ZYAN_NO_LIBC + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_API_TERMINAL_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Thread.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Thread.h new file mode 100644 index 0000000000..402a2da5da --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/API/Thread.h @@ -0,0 +1,243 @@ +/*************************************************************************************************** + + 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_API_THREAD_H +#define ZYCORE_API_THREAD_H + +#include +#include + +#ifndef ZYAN_NO_LIBC + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + +#if defined(ZYAN_POSIX) + +#include + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZyanThread` data-type. + */ +typedef pthread_t ZyanThread; + +/** + * Defines the `ZyanThreadId` data-type. + */ +typedef ZyanU64 ZyanThreadId; + +/* ---------------------------------------------------------------------------------------------- */ +/* Thread Local Storage (TLS) */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZyanThreadTlsIndex` data-type. + */ +typedef pthread_key_t ZyanThreadTlsIndex; + +/** + * Defines the `ZyanThreadTlsCallback` function prototype. + */ +typedef void(*ZyanThreadTlsCallback)(void* data); + +/** + * Declares a Thread Local Storage (TLS) callback function. + * + * @param name The callback function name. + * @param param_type The callback data parameter type. + * @param param_name The callback data parameter name. + */ +#define ZYAN_THREAD_DECLARE_TLS_CALLBACK(name, param_type, param_name) \ + void name(param_type* param_name) + +/* ---------------------------------------------------------------------------------------------- */ + +#elif defined(ZYAN_WINDOWS) + +#include + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZyanThread` data-type. + */ +typedef HANDLE ZyanThread; + +/** + * Defines the `ZyanThreadId` data-type. + */ +typedef DWORD ZyanThreadId; + +/* ---------------------------------------------------------------------------------------------- */ +/* Thread Local Storage (TLS) */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZyanThreadTlsIndex` data-type. + */ +typedef DWORD ZyanThreadTlsIndex; + +/** + * Defines the `ZyanThreadTlsCallback` function prototype. + */ +typedef PFLS_CALLBACK_FUNCTION ZyanThreadTlsCallback; + +/** + * Declares a Thread Local Storage (TLS) callback function. + * + * @param name The callback function name. + * @param param_type The callback data parameter type. + * @param param_name The callback data parameter name. + */ +#define ZYAN_THREAD_DECLARE_TLS_CALLBACK(name, param_type, param_name) \ + VOID NTAPI name(param_type* param_name) + +/* ---------------------------------------------------------------------------------------------- */ + +#else +# error "Unsupported platform detected" +#endif + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns the handle of the current thread. + * + * @param thread Receives the handle of the current thread. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanThreadGetCurrentThread(ZyanThread* thread); + +/** + * Returns the unique id of the current thread. + * + * @param thread_id Receives the unique id of the current thread. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanThreadGetCurrentThreadId(ZyanThreadId* thread_id); + +/* ---------------------------------------------------------------------------------------------- */ +/* Thread Local Storage (TLS) */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Allocates a new Thread Local Storage (TLS) slot. + * + * @param index Receives the TLS slot index. + * @param destructor A pointer to a destructor callback which is invoked to finalize the data + * in the TLS slot or `ZYAN_NULL`, if not needed. + * + * The maximum available number of TLS slots is implementation specific and different on each + * platform: + * - Windows + * - A total amount of 128 slots per process are guaranteed + * - POSIX + * - A total amount of 128 slots per process are guaranteed + * - Some systems guarantee larger amounts like e.g. 1024 slots per process + * + * Note that the invocation rules for the destructor callback are implementation specific and + * different on each platform: + * - Windows + * - The callback is invoked when a thread exits + * - The callback is invoked when the process exits + * - The callback is invoked when the TLS slot is released + * - POSIX + * - The callback is invoked when a thread exits and the stored value is not null + * - The callback is NOT invoked when the process exits + * - The callback is NOT invoked when the TLS slot is released + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanThreadTlsAlloc(ZyanThreadTlsIndex* index, + ZyanThreadTlsCallback destructor); + +/** + * Releases a Thread Local Storage (TLS) slot. + * + * @param index The TLS slot index. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanThreadTlsFree(ZyanThreadTlsIndex index); + +/** + * Returns the value inside the given Thread Local Storage (TLS) slot for the + * calling thread. + * + * @param index The TLS slot index. + * @param data Receives the value inside the given Thread Local Storage + * (TLS) slot for the calling thread. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanThreadTlsGetValue(ZyanThreadTlsIndex index, void** data); + +/** + * Set the value of the given Thread Local Storage (TLS) slot for the calling thread. + * + * @param index The TLS slot index. + * @param data The value to store inside the given Thread Local Storage (TLS) slot for the + * calling thread + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanThreadTlsSetValue(ZyanThreadTlsIndex index, void* data); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYAN_NO_LIBC */ + +#endif /* ZYCORE_API_THREAD_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Allocator.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Allocator.h new file mode 100644 index 0000000000..ff80a2c3a5 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Allocator.h @@ -0,0 +1,142 @@ +/*************************************************************************************************** + + 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 + +#include +#include + +#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 */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/ArgParse.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/ArgParse.h new file mode 100644 index 0000000000..5d389cb617 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/ArgParse.h @@ -0,0 +1,173 @@ +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + 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 + * Implements command-line argument parsing. + */ + +#ifndef ZYCORE_ARGPARSE_H +#define ZYCORE_ARGPARSE_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Structs and other types */ +/* ============================================================================================== */ + +/** + * Definition of a single argument. + */ +typedef struct ZyanArgParseDefinition_ +{ + /** + * The argument name, e.g. `--help`. + * + * Must start with either one or two dashes. Single dash arguments must consist of a single + * character, (e.g. `-n`), double-dash arguments can be of arbitrary length. + */ + const char* name; + /** + * Whether the argument is boolean or expects a value. + */ + ZyanBool boolean; + /** + * Whether this argument is required (error if missing). + */ + ZyanBool required; +} ZyanArgParseDefinition; + +/** + * Configuration for argument parsing. + */ +typedef struct ZyanArgParseConfig_ +{ + /** + * `argv` argument passed to `main` by LibC. + */ + const char** argv; + /** + * `argc` argument passed to `main` by LibC. + */ + ZyanUSize argc; + /** + * Minimum # of accepted unnamed / anonymous arguments. + */ + ZyanUSize min_unnamed_args; + /** + * Maximum # of accepted unnamed / anonymous arguments. + */ + ZyanUSize max_unnamed_args; + /** + * Argument definition array, or `ZYAN_NULL`. + * + * Expects a pointer to an array of `ZyanArgParseDefinition` instances. The array is + * terminated by setting the `.name` field of the last element to `ZYAN_NULL`. If no named + * arguments should be parsed, you can also set this to `ZYAN_NULL`. + */ + ZyanArgParseDefinition* args; +} ZyanArgParseConfig; + +/** + * Information about a parsed argument. + */ +typedef struct ZyanArgParseArg_ +{ + /** + * Corresponding argument definition, or `ZYAN_NULL` for unnamed args. + * + * This pointer is borrowed from the `cfg` pointer passed to `ZyanArgParse`. + */ + const ZyanArgParseDefinition* def; + /** + * Whether the argument has a value (is non-boolean). + */ + ZyanBool has_value; + /** + * If `has_value == true`, then the argument value. + * + * This is a view into the `argv` string array passed to `ZyanArgParse` via the `cfg` argument. + */ + ZyanStringView value; +} ZyanArgParseArg; + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +#ifndef ZYAN_NO_LIBC + +/** + * Parse arguments according to a `ZyanArgParseConfig` definition. + * + * @param cfg Argument parser config to use. + * @param parsed Receives the parsed output. Vector of `ZyanArgParseArg`. Ownership is + * transferred to the user. Input is expected to be uninitialized. On error, + * the vector remains uninitialized. + * @param error_token On error, if it makes sense, receives the argument fragment causing the + * error. Optional, may be `ZYAN_NULL`. The pointer borrows into the `cfg` + * struct and doesn't have to be freed by the user. + * + * @return A `ZyanStatus` status determining whether the parsing succeeded. + */ +ZYCORE_EXPORT ZyanStatus ZyanArgParse(const ZyanArgParseConfig *cfg, ZyanVector* parsed, + const char** error_token); + +#endif + +/** + * Parse arguments according to a `ZyanArgParseConfig` definition. + * + * This version allows specification of a custom memory allocator and thus supports no-libc. + * + * @param cfg Argument parser config to use. + * @param parsed Receives the parsed output. Vector of `ZyanArgParseArg`. Ownership is + * transferred to the user. Input is expected to be uninitialized. On error, + * the vector remains uninitialized. + * @param error_token On error, if it makes sense, receives the argument fragment causing the + * error. Optional, may be `ZYAN_NULL`. The pointer borrows into the `cfg` + * struct and doesn't have to be freed by the user. + * @param allocator The `ZyanAllocator` to be used for allocating the output vector's data. + * + * @return A `ZyanStatus` status determining whether the parsing succeeded. + */ +ZYCORE_EXPORT ZyanStatus ZyanArgParseEx(const ZyanArgParseConfig *cfg, ZyanVector* parsed, + const char** error_token, ZyanAllocator* allocator); + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_ARGPARSE_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Atomic.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Atomic.h new file mode 100644 index 0000000000..f5dcf273f7 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Atomic.h @@ -0,0 +1,236 @@ +/*************************************************************************************************** + + Zyan Core Library (Zyan-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 + * Cross compiler atomic intrinsics. + */ + +#ifndef ZYCORE_ATOMIC_H +#define ZYCORE_ATOMIC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* ============================================================================================== */ +/* Enums and Types */ +/* ============================================================================================== */ + +/* + * Wraps a 32-bit value to provide atomic access. + */ +typedef struct ZyanAtomic32_ +{ + ZyanU32 volatile value; +} ZyanAtomic32; + +/* + * Wraps a 64-bit value to provide atomic access. + */ +typedef struct ZyanAtomic64_ +{ + ZyanU64 volatile value; +} ZyanAtomic64; + +/* + * Wraps a pointer-sized value to provide atomic access. + */ +typedef struct ZyanAtomicPointer_ +{ + ZyanVoidPointer volatile value; +} ZyanAtomicPointer; + +/* ============================================================================================== */ +/* Macros */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Pointer sized */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * @copydoc ZyanAtomicCompareExchange + */ +#define ZYAN_ATOMIC_COMPARE_EXCHANGE(destination, comparand, value) \ + ZyanAtomicCompareExchange((ZyanAtomicPointer*)&(destination), (comparand), (value)) + +/** + * @copydoc ZyanAtomicIncrement + */ +#define ZYAN_ATOMIC_INCREMENT(destination) \ + ZyanAtomicIncrement((ZyanAtomicPointer*)&(destination)); + +/** + * @copydoc ZyanAtomicDecrement + */ +#define ZYAN_ATOMIC_DECREMENT(destination) \ + ZyanAtomicDecrement((ZyanAtomicPointer*)&(destination)); + +/* ---------------------------------------------------------------------------------------------- */ +/* 32-bit */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * @copydoc ZyanAtomicCompareExchange + */ +#define ZYAN_ATOMIC_COMPARE_EXCHANGE32(destination, comparand, value) \ + ZyanAtomicCompareExchange32((ZyanAtomic32*)&(destination), (comparand), (value)) + +/** + * @copydoc ZyanAtomicIncrement + */ +#define ZYAN_ATOMIC_INCREMENT32(destination) \ + ZyanAtomicIncrement32((ZyanAtomic32*)&(destination)); + +/** + * @copydoc ZyanAtomicDecrement + */ +#define ZYAN_ATOMIC_DECREMENT32(destination) \ + ZyanAtomicDecrement32((ZyanAtomic32*)&(destination)); + +/* ---------------------------------------------------------------------------------------------- */ +/* 64-bit */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * @copydoc ZyanAtomicCompareExchange + */ +#define ZYAN_ATOMIC_COMPARE_EXCHANGE64(destination, comparand, value) \ + ZyanAtomicCompareExchange64((ZyanAtomic64*)&(destination), (comparand), (value)) + +/** + * @copydoc ZyanAtomicIncrement + */ +#define ZYAN_ATOMIC_INCREMENT64(destination) \ + ZyanAtomicIncrement64((ZyanAtomic64*)&(destination)); + +/** + * @copydoc ZyanAtomicDecrement + */ +#define ZYAN_ATOMIC_DECREMENT64(destination) \ + ZyanAtomicDecrement64((ZyanAtomic64*)&(destination)); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Pointer sized */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Compares two values for equality and, if they are equal, replaces the first value. + * + * @param destination A pointer to the destination value. + * @param comparand The value to compare with. + * @param value The replacement value. + * + * @return The original value. + */ +static ZyanUPointer ZyanAtomicCompareExchange(ZyanAtomicPointer* destination, + ZyanUPointer comparand, ZyanUPointer value); + +/** + * Increments the given value and stores the result, as an atomic operation. + * + * @param destination A pointer to the destination value. + * + * @return The incremented value. +*/ +static ZyanUPointer ZyanAtomicIncrement(ZyanAtomicPointer* destination); + +/** + * Decrements the given value and stores the result, as an atomic operation. + * + * @param destination A pointer to the destination value. + * + * @return The decremented value. +*/ +static ZyanUPointer ZyanAtomicDecrement(ZyanAtomicPointer* destination); + +/* ---------------------------------------------------------------------------------------------- */ +/* 32-bit */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * @copydoc ZyanAtomicCompareExchange + */ +static ZyanU32 ZyanAtomicCompareExchange32(ZyanAtomic32* destination, + ZyanU32 comparand, ZyanU32 value); + +/** + * @copydoc ZyanAtomicIncrement + */ +static ZyanU32 ZyanAtomicIncrement32(ZyanAtomic32* destination); + +/** + * @copydoc ZyanAtomicDecrement + */ +static ZyanU32 ZyanAtomicDecrement32(ZyanAtomic32* destination); + +/* ---------------------------------------------------------------------------------------------- */ +/* 64-bit */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * @copydoc ZyanAtomicCompareExchange + */ +static ZyanU64 ZyanAtomicCompareExchange64(ZyanAtomic64* destination, + ZyanU64 comparand, ZyanU64 value); + +/** + * @copydoc ZyanAtomicIncrement + */ +static ZyanU64 ZyanAtomicIncrement64(ZyanAtomic64* destination); + +/** + * @copydoc ZyanAtomicDecrement + */ +static ZyanU64 ZyanAtomicDecrement64(ZyanAtomic64* destination); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#if defined(ZYAN_CLANG) || defined(ZYAN_GCC) || defined(ZYAN_ICC) +# include +#elif defined(ZYAN_MSVC) +# include +#else +# error "Unsupported compiler detected" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_ATOMIC_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Bitset.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Bitset.h new file mode 100644 index 0000000000..0404f87364 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Bitset.h @@ -0,0 +1,483 @@ +/*************************************************************************************************** + + 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 bitset class. + */ + +#ifndef ZYCORE_BITSET_H +#define ZYCORE_BITSET_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* 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 ZyanBitset_ +{ + /** + * The bitset size. + */ + ZyanUSize size; + /** + * The bitset data. + */ + ZyanVector bits; +} ZyanBitset; + +/** + * Defines the `ZyanBitsetByteOperation` function prototype. + * + * @param v1 A pointer to the first byte. This value receives the result after performing the + * desired operation. + * @param v2 A pointer to the second byte. + * + * @return A zyan status code. + * + * This function is used to perform byte-wise operations on two `ZyanBitset` instances. + */ +typedef ZyanStatus (*ZyanBitsetByteOperation)(ZyanU8* v1, const ZyanU8* v2); + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constructor and destructor */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +/** + * Initializes the given `ZyanBitset` instance. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param count The initial amount of bits. + * + * @return A zyan status code. + * + * The space for the bitset is dynamically allocated by the default allocator using the default + * growth factor and the default shrink threshold. + */ +ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanBitsetInit(ZyanBitset* bitset, ZyanUSize count); + +#endif // ZYAN_NO_LIBC + +/** + * Initializes the given `ZyanBitset` instance and sets a custom `allocator` and memory + * allocation/deallocation parameters. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param count The initial amount of bits. + * @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. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetInitEx(ZyanBitset* bitset, ZyanUSize count, + ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold); + +/** + * Initializes the given `ZyanBitset` instance and configures it to use a custom user + * defined buffer with a fixed size. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param count The initial amount of bits. + * @param buffer A pointer to the buffer that is used as storage for the bits. + * @param capacity The maximum capacity (number of bytes) of the buffer. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetInitBuffer(ZyanBitset* bitset, ZyanUSize count, void* buffer, + ZyanUSize capacity); + +/** + * Destroys the given `ZyanBitset` instance. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetDestroy(ZyanBitset* bitset); + +/* ---------------------------------------------------------------------------------------------- */ +/* Logical operations */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Performs a byte-wise `operation` for every byte in the given `ZyanBitset` instances. + * + * @param destination A pointer to the `ZyanBitset` instance that is used as the first input and + * as the destination. + * @param source A pointer to the `ZyanBitset` instance that is used as the second input. + * @param operation A pointer to the function that performs the desired operation. + * + * @return A zyan status code. + * + * The `operation` callback is invoked once for every byte in the smallest of the `ZyanBitset` + * instances. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetPerformByteOperation(ZyanBitset* destination, + const ZyanBitset* source, ZyanBitsetByteOperation operation); + +/** + * Performs a logical `AND` operation on the given `ZyanBitset` instances. + * + * @param destination A pointer to the `ZyanBitset` instance that is used as the first input and + * as the destination. + * @param source A pointer to the `ZyanBitset` instance that is used as the second input. + * + * @return A zyan status code. + * + * If the destination bitmask contains more bits than the source one, the state of the remaining + * bits will be undefined. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetAND(ZyanBitset* destination, const ZyanBitset* source); + +/** + * Performs a logical `OR` operation on the given `ZyanBitset` instances. + * + * @param destination A pointer to the `ZyanBitset` instance that is used as the first input and + * as the destination. + * @param source A pointer to the `ZyanBitset` instance that is used as the second input. + * + * @return A zyan status code. + * + * If the destination bitmask contains more bits than the source one, the state of the remaining + * bits will be undefined. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetOR (ZyanBitset* destination, const ZyanBitset* source); + +/** + * Performs a logical `XOR` operation on the given `ZyanBitset` instances. + * + * @param destination A pointer to the `ZyanBitset` instance that is used as the first input and + * as the destination. + * @param source A pointer to the `ZyanBitset` instance that is used as the second input. + * + * @return A zyan status code. + * + * If the destination bitmask contains more bits than the source one, the state of the remaining + * bits will be undefined. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetXOR(ZyanBitset* destination, const ZyanBitset* source); + +/** + * Flips all bits of the given `ZyanBitset` instance. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetFlip(ZyanBitset* bitset); + +/* ---------------------------------------------------------------------------------------------- */ +/* Bit access */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Sets the bit at `index` of the given `ZyanBitset` instance to `1`. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param index The bit index. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetSet(ZyanBitset* bitset, ZyanUSize index); + +/** + * Sets the bit at `index` of the given `ZyanBitset` instance to `0`. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param index The bit index. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetReset(ZyanBitset* bitset, ZyanUSize index); + +/** + * Sets the bit at `index` of the given `ZyanBitset` instance to the specified `value`. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param index The bit index. + * @param value The new value. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetAssign(ZyanBitset* bitset, ZyanUSize index, ZyanBool value); + +/** + * Toggles the bit at `index` of the given `ZyanBitset` instance. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param index The bit index. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetToggle(ZyanBitset* bitset, ZyanUSize index); + +/** + * Returns the value of the bit at `index`. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param index The bit index. + * + * @return `ZYAN_STATUS_TRUE`, if the bit is set or `ZYAN_STATUS_FALSE`, if not, Another zyan + * status code, if an error occurred. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetTest(ZyanBitset* bitset, ZyanUSize index); + +/** + * Returns the value of the most significant bit. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return `ZYAN_STATUS_TRUE`, if the bit is set or `ZYAN_STATUS_FALSE`, if not. Another zyan + * status code, if an error occurred. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetTestMSB(ZyanBitset* bitset); + +/** + * Returns the value of the least significant bit. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return `ZYAN_STATUS_TRUE`, if the bit is set or `ZYAN_STATUS_FALSE`, if not. Another zyan + * status code, if an error occurred. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetTestLSB(ZyanBitset* bitset); + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Sets all bits of the given `ZyanBitset` instance to `1`. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetSetAll(ZyanBitset* bitset); + +/** + * Sets all bits of the given `ZyanBitset` instance to `0`. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetResetAll(ZyanBitset* bitset); + +/* ---------------------------------------------------------------------------------------------- */ +/* Size management */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Adds a new bit at the end of the bitset. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param value The value of the new bit. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetPush(ZyanBitset* bitset, ZyanBool value); + +/** + * Removes the last bit of the bitset. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetPop(ZyanBitset* bitset); + +/** + * Deletes all bits of the given `ZyanBitset` instance. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetClear(ZyanBitset* bitset); + +/* ---------------------------------------------------------------------------------------------- */ +/* Memory management */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Changes the capacity of the given `ZyanBitset` instance. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param count The new capacity (number of bits). + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetReserve(ZyanBitset* bitset, ZyanUSize count); + +/** + * Shrinks the capacity of the given bitset to match it's size. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetShrinkToFit(ZyanBitset* bitset); + +/* ---------------------------------------------------------------------------------------------- */ +/* Information */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns the current size of the bitset in bits. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param size Receives the size of the bitset in bits. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetGetSize(const ZyanBitset* bitset, ZyanUSize* size); + +/** + * Returns the current capacity of the bitset in bits. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param capacity Receives the size of the bitset in bits. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetGetCapacity(const ZyanBitset* bitset, ZyanUSize* capacity); + +/** + * Returns the current size of the bitset in bytes. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param size Receives the size of the bitset in bytes. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetGetSizeBytes(const ZyanBitset* bitset, ZyanUSize* size); + +/** + * Returns the current capacity of the bitset in bytes. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param capacity Receives the size of the bitset in bytes. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetGetCapacityBytes(const ZyanBitset* bitset, ZyanUSize* capacity); + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns the amount of bits set in the given bitset. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * @param count Receives the amount of bits set in the given bitset. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetCount(const ZyanBitset* bitset, ZyanUSize* count); + +/** + * Checks, if all bits of the given bitset are set. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return `ZYAN_STATUS_TRUE`, if all bits are set, `ZYAN_STATUS_FALSE`, if not. Another zyan + * status code, if an error occurred. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetAll(const ZyanBitset* bitset); + +/** + * Checks, if at least one bit of the given bitset is set. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return `ZYAN_STATUS_TRUE`, if at least one bit is set, `ZYAN_STATUS_FALSE`, if not. Another + * zyan status code, if an error occurred. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetAny(const ZyanBitset* bitset); + +/** + * Checks, if none bits of the given bitset are set. + * + * @param bitset A pointer to the `ZyanBitset` instance. + * + * @return `ZYAN_STATUS_TRUE`, if none bits are set, `ZYAN_STATUS_FALSE`, if not. Another zyan + * status code, if an error occurred. + */ +ZYCORE_EXPORT ZyanStatus ZyanBitsetNone(const ZyanBitset* bitset); + +///* ---------------------------------------------------------------------------------------------- */ +// +///** +// * Returns a 32-bit unsigned integer representation of the data. +// * +// * @param bitset A pointer to the `ZyanBitset` instance. +// * @param value Receives the 32-bit unsigned integer representation of the data. +// * +// * @return A zyan status code. +// */ +//ZYCORE_EXPORT ZyanStatus ZyanBitsetToU32(const ZyanBitset* bitset, ZyanU32* value); +// +///** +// * Returns a 64-bit unsigned integer representation of the data. +// * +// * @param bitset A pointer to the `ZyanBitset` instance. +// * @param value Receives the 64-bit unsigned integer representation of the data. +// * +// * @return A zyan status code. +// */ +//ZYCORE_EXPORT ZyanStatus ZyanBitsetToU64(const ZyanBitset* bitset, ZyanU64* value); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_BITSET_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Comparison.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Comparison.h new file mode 100644 index 0000000000..6d8b518b3a --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Comparison.h @@ -0,0 +1,316 @@ +/*************************************************************************************************** + + 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 + +#include +#include + +#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 */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Defines.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Defines.h new file mode 100644 index 0000000000..28d7eaec6f --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Defines.h @@ -0,0 +1,522 @@ +/*************************************************************************************************** + + 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(sun) || defined(__sun) +# define ZYAN_SOLARIS +# define ZYAN_POSIX +#elif 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 +#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) +// Warning disabled for PCSX2 since we define this on the command line. +//# 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 __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)) + +/* ---------------------------------------------------------------------------------------------- */ +/* 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 */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Format.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Format.h new file mode 100644 index 0000000000..006ca3126e --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Format.h @@ -0,0 +1,285 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include + +#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 diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Internal/AtomicGNU.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Internal/AtomicGNU.h new file mode 100644 index 0000000000..49d4b6fdae --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Internal/AtomicGNU.h @@ -0,0 +1,117 @@ +/*************************************************************************************************** + + Zyan Core Library (Zyan-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. + +***************************************************************************************************/ + +#ifndef ZYCORE_ATOMIC_GNU_H +#define ZYCORE_ATOMIC_GNU_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* ============================================================================================== */ +/* Functions */ +/* ============================================================================================== */ + +#if defined(ZYAN_CLANG) || defined(ZYAN_GCC) || defined(ZYAN_ICC) + +/* ---------------------------------------------------------------------------------------------- */ +/* Pointer sized */ +/* ---------------------------------------------------------------------------------------------- */ + +ZYAN_INLINE ZyanUPointer ZyanAtomicCompareExchange(ZyanAtomicPointer* destination, + ZyanUPointer comparand, ZyanUPointer value) +{ + return (ZyanUPointer)(__sync_val_compare_and_swap( + &destination->value, (void*)comparand, (void*)value, &destination->value)); +} + +ZYAN_INLINE ZyanUPointer ZyanAtomicIncrement(ZyanAtomicPointer* destination) +{ + return (ZyanUPointer)(__sync_fetch_and_add(&destination->value, (void*)1, + &destination->value)) + 1; +} + +ZYAN_INLINE ZyanUPointer ZyanAtomicDecrement(ZyanAtomicPointer* destination) +{ + return (ZyanUPointer)(__sync_sub_and_fetch(&destination->value, (void*)1, &destination->value)); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* 32-bit */ +/* ---------------------------------------------------------------------------------------------- */ + +ZYAN_INLINE ZyanU32 ZyanAtomicCompareExchange32(ZyanAtomic32* destination, + ZyanU32 comparand, ZyanU32 value) +{ + return (ZyanU32)(__sync_val_compare_and_swap(&destination->value, comparand, value, + &destination->value)); +} + +ZYAN_INLINE ZyanU32 ZyanAtomicIncrement32(ZyanAtomic32* destination) +{ + return (ZyanU32)(__sync_fetch_and_add(&destination->value, 1, &destination->value)) + 1; +} + +ZYAN_INLINE ZyanU32 ZyanAtomicDecrement32(ZyanAtomic32* destination) +{ + return (ZyanU32)(__sync_sub_and_fetch(&destination->value, 1, &destination->value)); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* 64-bit */ +/* ---------------------------------------------------------------------------------------------- */ + +ZYAN_INLINE ZyanU64 ZyanAtomicCompareExchange64(ZyanAtomic64* destination, + ZyanU64 comparand, ZyanU64 value) +{ + return (ZyanU64)(__sync_val_compare_and_swap(&destination->value, comparand, value, + &destination->value)); +} + +ZYAN_INLINE ZyanU64 ZyanAtomicIncrement64(ZyanAtomic64* destination) +{ + return (ZyanU64)(__sync_fetch_and_add(&destination->value, 1, &destination->value)) + 1; +} + +ZYAN_INLINE ZyanU64 ZyanAtomicDecrement64(ZyanAtomic64* destination) +{ + return (ZyanU64)(__sync_sub_and_fetch(&destination->value, 1, &destination->value)); +} + +/* ---------------------------------------------------------------------------------------------- */ + +#endif + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_ATOMIC_GNU_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Internal/AtomicMSVC.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Internal/AtomicMSVC.h new file mode 100644 index 0000000000..f4dc1e60c8 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Internal/AtomicMSVC.h @@ -0,0 +1,141 @@ +/*************************************************************************************************** + + Zyan Core Library (Zyan-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. + +***************************************************************************************************/ + +#ifndef ZYCORE_ATOMIC_MSVC_H +#define ZYCORE_ATOMIC_MSVC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include + +/* ============================================================================================== */ +/* Functions */ +/* ============================================================================================== */ + +#if defined(ZYAN_MSVC) + +/* ---------------------------------------------------------------------------------------------- */ +/* Pointer sized */ +/* ---------------------------------------------------------------------------------------------- */ + +#if defined(ZYAN_X86) + +static ZYAN_INLINE ZyanUPointer ZyanAtomicCompareExchange(ZyanAtomicPointer* destination, + ZyanUPointer comparand, ZyanUPointer value) +{ + return (ZyanUPointer)ZyanAtomicCompareExchange32((ZyanAtomic32*)destination, comparand, value); +} + +static ZYAN_INLINE ZyanUPointer ZyanAtomicIncrement(ZyanAtomicPointer* destination) +{ + return (ZyanUPointer)ZyanAtomicIncrement32((ZyanAtomic32*)destination); +} + +static ZYAN_INLINE ZyanUPointer ZyanAtomicDecrement(ZyanAtomicPointer* destination) +{ + return (ZyanUPointer)ZyanAtomicDecrement32((ZyanAtomic32*)destination); +} + +#elif defined(ZYAN_X64) + +static ZYAN_INLINE ZyanUPointer ZyanAtomicCompareExchange(ZyanAtomicPointer* destination, + ZyanUPointer comparand, ZyanUPointer value) +{ + return (ZyanUPointer)ZyanAtomicCompareExchange64((ZyanAtomic64*)destination, comparand, value); +} + +static ZYAN_INLINE ZyanUPointer ZyanAtomicIncrement(ZyanAtomicPointer* destination) +{ + return (ZyanUPointer)ZyanAtomicIncrement64((ZyanAtomic64*)destination); +} + +static ZYAN_INLINE ZyanUPointer ZyanAtomicDecrement(ZyanAtomicPointer* destination) +{ + return (ZyanUPointer)ZyanAtomicDecrement64((ZyanAtomic64*)destination); +} + +#else +# error "Unsupported architecture detected" +#endif + +/* ---------------------------------------------------------------------------------------------- */ +/* 32-bit */ +/* ---------------------------------------------------------------------------------------------- */ + +static ZYAN_INLINE ZyanU32 ZyanAtomicCompareExchange32(ZyanAtomic32* destination, + ZyanU32 comparand, ZyanU32 value) +{ + return (ZyanU32)(_InterlockedCompareExchange((volatile LONG*)&(destination->value), + (LONG)value, (LONG)comparand)); +} + +static ZYAN_INLINE ZyanU32 ZyanAtomicIncrement32(ZyanAtomic32* destination) +{ + return (ZyanU32)(_InterlockedIncrement((volatile LONG*)&(destination->value))); +} + +static ZYAN_INLINE ZyanU32 ZyanAtomicDecrement32(ZyanAtomic32* destination) +{ + return (ZyanU32)(_InterlockedDecrement((volatile LONG*)&(destination->value))); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* 64-bit */ +/* ---------------------------------------------------------------------------------------------- */ + +static ZYAN_INLINE ZyanU64 ZyanAtomicCompareExchange64(ZyanAtomic64* destination, + ZyanU64 comparand, ZyanU64 value) +{ + return (ZyanU64)(_InterlockedCompareExchange64((volatile LONG64*)&(destination->value), + (LONG64)value, (LONG64)comparand)); +} + +static ZYAN_INLINE ZyanU64 ZyanAtomicIncrement64(ZyanAtomic64* destination) +{ + return (ZyanU64)(_InterlockedIncrement64((volatile LONG64*)&(destination->value))); +} + +static ZYAN_INLINE ZyanU64 ZyanAtomicDecrement64(ZyanAtomic64* destination) +{ + return (ZyanU64)(_InterlockedDecrement64((volatile LONG64*)&(destination->value))); +} + +/* ---------------------------------------------------------------------------------------------- */ + +#endif + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_ATOMIC_MSVC_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/LibC.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/LibC.h new file mode 100644 index 0000000000..cb0b2f3258 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/LibC.h @@ -0,0 +1,511 @@ +/*************************************************************************************************** + + 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_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 */ +/* ============================================================================================== */ + +#include +#include + +/* + * 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 */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/List.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/List.h new file mode 100644 index 0000000000..86244b8858 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/List.h @@ -0,0 +1,573 @@ +/*************************************************************************************************** + + 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 doubly linked list. + */ + +#ifndef ZYCORE_LIST_H +#define ZYCORE_LIST_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + +/** + * Defines the `ZyanListNode` struct. + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + */ +typedef struct ZyanListNode_ +{ + /** + * A pointer to the previous list node. + */ + struct ZyanListNode_* prev; + /** + * A pointer to the next list node. + */ + struct ZyanListNode_* next; +} ZyanListNode; + +/** + * Defines the `ZyanList` struct. + * + * All fields in this struct should be considered as "private". Any changes may lead to unexpected + * behavior. + */ +typedef struct ZyanList_ +{ + /** + * The memory allocator. + */ + ZyanAllocator* allocator; + /** + * The current number of elements in the list. + */ + ZyanUSize size; + /** + * The size of a single element in bytes. + */ + ZyanUSize element_size; + /** + * The element destructor callback. + */ + ZyanMemberProcedure destructor; + /** + * The head node. + */ + ZyanListNode* head; + /** + * The tail node. + */ + ZyanListNode* tail; + /** + * The data buffer. + * + * Only used for instances created by `ZyanListInitCustomBuffer`. + */ + void* buffer; + /** + * The data buffer capacity (number of bytes). + * + * Only used for instances created by `ZyanListInitCustomBuffer`. + */ + ZyanUSize capacity; + /** + * The first unused node. + * + * When removing a node, the first-unused value is updated to point at the removed node and the + * next node of the removed node will be updated to point at the old first-unused node. + * + * When appending the memory of the first unused-node is recycled to store the new node. The + * value of the first-unused node is then updated to point at the reused nodes next node. + * + * If the first-unused value is `ZYAN_NULL`, any new node will be "allocated" behind the tail + * node (if there is enough space left in the fixed size buffer). + * + * Only used for instances created by `ZyanListInitCustomBuffer`. + */ + ZyanListNode* first_unused; +} ZyanList; + +/* ============================================================================================== */ +/* Macros */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines an uninitialized `ZyanList` instance. + */ +#define ZYAN_LIST_INITIALIZER \ + { \ + /* allocator */ ZYAN_NULL, \ + /* size */ 0, \ + /* element_size */ 0, \ + /* head */ ZYAN_NULL, \ + /* destructor */ ZYAN_NULL, \ + /* tail */ ZYAN_NULL, \ + /* buffer */ ZYAN_NULL, \ + /* capacity */ 0, \ + /* first_unused */ ZYAN_NULL \ + } + +/* ---------------------------------------------------------------------------------------------- */ +/* Helper macros */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns the data value of the given `node`. + * + * @param type The desired value type. + * @param node A pointer to the `ZyanListNode` struct. + * + * @result The data value of the given `node`. + * + * Note that this function is unsafe and might dereference a null-pointer. + */ +#ifdef __cplusplus +#define ZYAN_LIST_GET(type, node) \ + (*reinterpret_cast(ZyanListGetNodeData(node))) +#else +#define ZYAN_LIST_GET(type, node) \ + (*(const type*)ZyanListGetNodeData(node)) +#endif + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constructor and destructor */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +/** + * Initializes the given `ZyanList` instance. + * + * @param list A pointer to the `ZyanList` instance. + * @param element_size The size of a single element in bytes. + * @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 list elements is dynamically allocated by the default allocator. + * + * Finalization with `ZyanListDestroy` is required for all instances created by this function. + */ +ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanListInit(ZyanList* list, ZyanUSize element_size, + ZyanMemberProcedure destructor); + +#endif // ZYAN_NO_LIBC + +/** + * Initializes the given `ZyanList` instance and sets a custom `allocator`. + * + * @param list A pointer to the `ZyanList` instance. + * @param element_size The size of a single element in bytes. + * @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. + * + * @return A zyan status code. + * + * Finalization with `ZyanListDestroy` is required for all instances created by this function. + */ +ZYCORE_EXPORT ZyanStatus ZyanListInitEx(ZyanList* list, ZyanUSize element_size, + ZyanMemberProcedure destructor, ZyanAllocator* allocator); + +/** + * Initializes the given `ZyanList` instance and configures it to use a custom user + * defined buffer with a fixed size. + * + * @param list A pointer to the `ZyanList` instance. + * @param element_size The size of a single element in bytes. + * @param destructor A destructor callback that is invoked every time an item is deleted, or + * `ZYAN_NULL` if not needed. + * @param buffer A pointer to the buffer that is used as storage for the elements. + * @param capacity The maximum capacity (number of bytes) of the buffer including the + * space required for the list-nodes. + * + * @return A zyan status code. + * + * The buffer capacity required to store `n` elements of type `T` is be calculated by: + * `size = n * sizeof(ZyanListNode) + n * sizeof(T)` + * + * Finalization is not required for instances created by this function. + */ +ZYCORE_EXPORT ZyanStatus ZyanListInitCustomBuffer(ZyanList* list, ZyanUSize element_size, + ZyanMemberProcedure destructor, void* buffer, ZyanUSize capacity); + +/** + * Destroys the given `ZyanList` instance. + * + * @param list A pointer to the `ZyanList` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListDestroy(ZyanList* list); + +/* ---------------------------------------------------------------------------------------------- */ +/* Duplication */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +/** + * Initializes a new `ZyanList` instance by duplicating an existing list. + * + * @param destination A pointer to the (uninitialized) destination `ZyanList` instance. + * @param source A pointer to the source list. + * + * @return A zyan status code. + * + * The memory for the list is dynamically allocated by the default allocator. + * + * Finalization with `ZyanListDestroy` is required for all instances created by this function. + */ +ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanListDuplicate(ZyanList* destination, + const ZyanList* source); + +#endif // ZYAN_NO_LIBC + +/** + * Initializes a new `ZyanList` instance by duplicating an existing list and sets a + * custom `allocator`. + * + * @param destination A pointer to the (uninitialized) destination `ZyanList` instance. + * @param source A pointer to the source list. + * @param allocator A pointer to a `ZyanAllocator` instance. + * + * @return A zyan status code. + + * Finalization with `ZyanListDestroy` is required for all instances created by this function. + */ +ZYCORE_EXPORT ZyanStatus ZyanListDuplicateEx(ZyanList* destination, const ZyanList* source, + ZyanAllocator* allocator); + +/** + * Initializes a new `ZyanList` instance by duplicating an existing list and + * configures it to use a custom user defined buffer with a fixed size. + * + * @param destination A pointer to the (uninitialized) destination `ZyanList` instance. + * @param source A pointer to the source list. + * @param buffer A pointer to the buffer that is used as storage for the elements. + * @param capacity The maximum capacity (number of bytes) of the buffer including the + * space required for the list-nodes. + + * This function will fail, if the capacity of the buffer is not sufficient + * to store all elements of the source list. + * + * @return A zyan status code. + * + * The buffer capacity required to store `n` elements of type `T` is be calculated by: + * `size = n * sizeof(ZyanListNode) + n * sizeof(T)` + * + * Finalization is not required for instances created by this function. + */ +ZYCORE_EXPORT ZyanStatus ZyanListDuplicateCustomBuffer(ZyanList* destination, + const ZyanList* source, void* buffer, ZyanUSize capacity); + +/* ---------------------------------------------------------------------------------------------- */ +/* Item access */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns a pointer to the first `ZyanListNode` struct of the given list. + * + * @param list A pointer to the `ZyanList` instance. + * @param node Receives a pointer to the first `ZyanListNode` struct of the list. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListGetHeadNode(const ZyanList* list, const ZyanListNode** node); + +/** + * Returns a pointer to the last `ZyanListNode` struct of the given list. + * + * @param list A pointer to the `ZyanList` instance. + * @param node Receives a pointer to the last `ZyanListNode` struct of the list. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListGetTailNode(const ZyanList* list, const ZyanListNode** node); + +/** + * Receives a pointer to the previous `ZyanListNode` struct linked to the passed one. + * + * @param node Receives a pointer to the previous `ZyanListNode` struct linked to the passed + * one. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListGetPrevNode(const ZyanListNode** node); + +/** + * Receives a pointer to the next `ZyanListNode` struct linked to the passed one. + * + * @param node Receives a pointer to the next `ZyanListNode` struct linked to the passed one. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListGetNextNode(const ZyanListNode** node); + +/** + * Returns a constant pointer to the data of the given `node`. + * + * @param node A pointer to the `ZyanListNode` struct. + * + * @return A constant pointer to the the data of the given `node` or `ZYAN_NULL`, if an error + * occured. + * + * Take a look at `ZyanListGetNodeDataEx`, if you need a function that returns a zyan status code. + */ +ZYCORE_EXPORT const void* ZyanListGetNodeData(const ZyanListNode* node); + +/** + * Returns a constant pointer to the data of the given `node`.. + * + * @param node A pointer to the `ZyanListNode` struct. + * @param value Receives a constant pointer to the data of the given `node`. + * + * Take a look at `ZyanListGetNodeData`, if you need a function that directly returns a pointer. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListGetNodeDataEx(const ZyanListNode* node, const void** value); + +/** + * Returns a mutable pointer to the data of the given `node`. + * + * @param node A pointer to the `ZyanListNode` struct. + * + * @return A mutable pointer to the the data of the given `node` or `ZYAN_NULL`, if an error + * occured. + * + * Take a look at `ZyanListGetPointerMutableEx` instead, if you need a function that returns a + * zyan status code. + */ +ZYCORE_EXPORT void* ZyanListGetNodeDataMutable(const ZyanListNode* node); + +/** + * Returns a mutable pointer to the data of the given `node`.. + * + * @param node A pointer to the `ZyanListNode` struct. + * @param value Receives a mutable pointer to the data of the given `node`. + * + * Take a look at `ZyanListGetNodeDataMutable`, if you need a function that directly returns a + * pointer. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListGetNodeDataMutableEx(const ZyanListNode* node, void** value); + +/** + * Assigns a new data value to the given `node`. + * + * @param list A pointer to the `ZyanList` instance. + * @param node A pointer to the `ZyanListNode` struct. + * @param value The value to assign. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListSetNodeData(const ZyanList* list, const ZyanListNode* node, + const void* value); + +/* ---------------------------------------------------------------------------------------------- */ +/* Insertion */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Adds a new `item` to the end of the list. + * + * @param list A pointer to the `ZyanList` instance. + * @param item A pointer to the item to add. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListPushBack(ZyanList* list, const void* item); + +/** + * Adds a new `item` to the beginning of the list. + * + * @param list A pointer to the `ZyanList` instance. + * @param item A pointer to the item to add. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListPushFront(ZyanList* list, const void* item); + +/** + * Constructs an `item` in-place at the end of the list. + * + * @param list A pointer to the `ZyanList` instance. + * @param item Receives a pointer to the new item. + * @param constructor The constructor callback or `ZYAN_NULL`. The new item will be in + * undefined state, if no constructor was passed. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListEmplaceBack(ZyanList* list, void** item, + ZyanMemberFunction constructor); + +/** + * Constructs an `item` in-place at the beginning of the list. + * + * @param list A pointer to the `ZyanList` instance. + * @param item Receives a pointer to the new item. + * @param constructor The constructor callback or `ZYAN_NULL`. The new item will be in + * undefined state, if no constructor was passed. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListEmplaceFront(ZyanList* list, void** item, + ZyanMemberFunction constructor); + +/* ---------------------------------------------------------------------------------------------- */ +/* Deletion */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Removes the last element of the list. + * + * @param list A pointer to the `ZyanList` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListPopBack(ZyanList* list); + +/** + * Removes the firstelement of the list. + * + * @param list A pointer to the `ZyanList` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListPopFront(ZyanList* list); + +/** + * Removes the given `node` from the list. + * + * @param list A pointer to the `ZyanList` instance. + * @param node A pointer to the `ZyanListNode` struct. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListRemove(ZyanList* list, const ZyanListNode* node); + +/** + * Removes multiple nodes from the list. + * + * @param list A pointer to the `ZyanList` instance. + * @param first A pointer to the first node. + * @param last A pointer to the last node. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListRemoveRange(ZyanList* list, const ZyanListNode* first, + const ZyanListNode* last); + +/** + * Erases all elements of the list. + * + * @param list A pointer to the `ZyanList` instance. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListClear(ZyanList* list); + +/* ---------------------------------------------------------------------------------------------- */ +/* Searching */ +/* ---------------------------------------------------------------------------------------------- */ + +// TODO: + +/* ---------------------------------------------------------------------------------------------- */ +/* Memory management */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Resizes the given `ZyanList` instance. + * + * @param list A pointer to the `ZyanList` instance. + * @param size The new size of the list. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListResize(ZyanList* list, ZyanUSize size); + +/** + * Resizes the given `ZyanList` instance. + * + * @param list A pointer to the `ZyanList` instance. + * @param size The new size of the list. + * @param initializer A pointer to a value to be used as initializer for new items. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListResizeEx(ZyanList* list, ZyanUSize size, const void* initializer); + +/* ---------------------------------------------------------------------------------------------- */ +/* Information */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns the current size of the list. + * + * @param list A pointer to the `ZyanList` instance. + * @param size Receives the size of the list. + * + * @return A zyan status code. + */ +ZYCORE_EXPORT ZyanStatus ZyanListGetSize(const ZyanList* list, ZyanUSize* size); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_VECTOR_H */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Object.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Object.h new file mode 100644 index 0000000000..d015cef772 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Object.h @@ -0,0 +1,84 @@ +/*************************************************************************************************** + + 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 + +#include +#include + +#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 */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Status.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Status.h new file mode 100644 index 0000000000..b0d7fdf58b --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Status.h @@ -0,0 +1,287 @@ +/*************************************************************************************************** + + 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 + +#include + +/* ============================================================================================== */ +/* 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 */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/String.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/String.h new file mode 100644 index 0000000000..7bffaa6743 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/String.h @@ -0,0 +1,1011 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include +#include + +#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 diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Types.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Types.h new file mode 100644 index 0000000000..07b9ae21d0 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Types.h @@ -0,0 +1,236 @@ +/*************************************************************************************************** + + 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 + +#include + +/* ============================================================================================== */ +/* 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) + typedef __UINT8_TYPE__ ZyanU8; + typedef __UINT16_TYPE__ ZyanU16; + typedef __UINT32_TYPE__ ZyanU32; + typedef __UINT64_TYPE__ ZyanU64; + typedef __INT8_TYPE__ ZyanI8; + typedef __INT16_TYPE__ ZyanI16; + typedef __INT32_TYPE__ ZyanI32; + typedef __INT64_TYPE__ ZyanI64; + typedef __SIZE_TYPE__ ZyanUSize; + typedef __PTRDIFF_TYPE__ ZyanISize; + typedef __UINTPTR_TYPE__ ZyanUPointer; + typedef __INTPTR_TYPE__ ZyanIPointer; +# 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 +# define ZYAN_INT8_MAX __INT8_MAX__ +# define ZYAN_INT8_MIN (-ZYAN_INT8_MAX - 1) +# define ZYAN_INT16_MAX __INT16_MAX__ +# define ZYAN_INT16_MIN (-ZYAN_INT16_MAX - 1) +# define ZYAN_INT32_MAX __INT32_MAX__ +# define ZYAN_INT32_MIN (-ZYAN_INT32_MAX - 1) +# define ZYAN_INT64_MAX __INT64_MAX__ +# define ZYAN_INT64_MIN (-ZYAN_INT64_MAX - 1) +# 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 +#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 0 +#define ZYAN_TRUE 1 + +/** + * 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 */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Vector.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Vector.h new file mode 100644 index 0000000000..3bf7cbcfcf --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Vector.h @@ -0,0 +1,722 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include +#include +#include + +#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 */ diff --git a/3rdparty/zydis/dependencies/zycore/include/Zycore/Zycore.h b/3rdparty/zydis/dependencies/zycore/include/Zycore/Zycore.h new file mode 100644 index 0000000000..6a46f6bc22 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/include/Zycore/Zycore.h @@ -0,0 +1,110 @@ +/*************************************************************************************************** + + 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 + * Master include file, including everything else. + */ + +#ifndef ZYCORE_H +#define ZYCORE_H + +#include + +// TODO: + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Macros */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constants */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * A macro that defines the zycore version. + */ +#define ZYCORE_VERSION (ZyanU64)0x0001000200000000 + +/* ---------------------------------------------------------------------------------------------- */ +/* Helper macros */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Extracts the major-part of the zycore version. + * + * @param version The zycore version value + */ +#define ZYCORE_VERSION_MAJOR(version) (ZyanU16)((version & 0xFFFF000000000000) >> 48) + +/** + * Extracts the minor-part of the zycore version. + * + * @param version The zycore version value + */ +#define ZYCORE_VERSION_MINOR(version) (ZyanU16)((version & 0x0000FFFF00000000) >> 32) + +/** + * Extracts the patch-part of the zycore version. + * + * @param version The zycore version value + */ +#define ZYCORE_VERSION_PATCH(version) (ZyanU16)((version & 0x00000000FFFF0000) >> 16) + +/** + * Extracts the build-part of the zycore version. + * + * @param version The zycore version value + */ +#define ZYCORE_VERSION_BUILD(version) (ZyanU16)(version & 0x000000000000FFFF) + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/** + * Returns the zycore version. + * + * @return The zycore version. + * + * Use the macros provided in this file to extract the major, minor, patch and build part from the + * returned version value. + */ +ZYCORE_EXPORT ZyanU64 ZycoreGetVersion(void); + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYCORE_H */ diff --git a/3rdparty/zydis/dependencies/zycore/src/API/Memory.c b/3rdparty/zydis/dependencies/zycore/src/API/Memory.c new file mode 100644 index 0000000000..3f0c3d8418 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/API/Memory.c @@ -0,0 +1,132 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +#ifndef ZYAN_NO_LIBC + +#if defined(ZYAN_WINDOWS) + +#elif defined(ZYAN_POSIX) +# include +#else +# error "Unsupported platform detected" +#endif + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanU32 ZyanMemoryGetSystemPageSize() +{ +#if defined(ZYAN_WINDOWS) + + SYSTEM_INFO system_info; + GetSystemInfo(&system_info); + + return system_info.dwPageSize; + +#elif defined(ZYAN_POSIX) + + return sysconf(_SC_PAGE_SIZE); + +#endif +} + +ZyanU32 ZyanMemoryGetSystemAllocationGranularity() +{ +#if defined(ZYAN_WINDOWS) + + SYSTEM_INFO system_info; + GetSystemInfo(&system_info); + + return system_info.dwAllocationGranularity; + +#elif defined(ZYAN_POSIX) + + return sysconf(_SC_PAGE_SIZE); + +#endif +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Memory management */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanMemoryVirtualProtect(void* address, ZyanUSize size, + ZyanMemoryPageProtection protection) +{ +#if defined(ZYAN_WINDOWS) + + DWORD old; + if (!VirtualProtect(address, size, protection, &old)) + { + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + +#elif defined(ZYAN_POSIX) + + if (mprotect(address, size, protection)) + { + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + +#endif + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanMemoryVirtualFree(void* address, ZyanUSize size) +{ +#if defined(ZYAN_WINDOWS) + + ZYAN_UNUSED(size); + if (!VirtualFree(address, 0, MEM_RELEASE)) + { + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + +#elif defined(ZYAN_POSIX) + + if (munmap(address, size)) + { + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + +#endif + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#endif /* ZYAN_NO_LIBC */ diff --git a/3rdparty/zydis/dependencies/zycore/src/API/Process.c b/3rdparty/zydis/dependencies/zycore/src/API/Process.c new file mode 100644 index 0000000000..63e8e8f5cf --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/API/Process.c @@ -0,0 +1,76 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#if defined(ZYAN_WINDOWS) +#if defined(ZYAN_KERNEL) +# include +#else +# include +#endif +#elif defined(ZYAN_POSIX) +# include +#else +# error "Unsupported platform detected" +#endif +#include + +#ifndef ZYAN_NO_LIBC + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanProcessFlushInstructionCache(void* address, ZyanUSize size) +{ +#if defined(ZYAN_WINDOWS) + + if (!FlushInstructionCache(GetCurrentProcess(), address, size)) + { + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + +#elif defined(ZYAN_POSIX) + + if (msync(address, size, MS_SYNC | MS_INVALIDATE)) + { + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + +#endif + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#endif /* ZYAN_NO_LIBC */ diff --git a/3rdparty/zydis/dependencies/zycore/src/API/Synchronization.c b/3rdparty/zydis/dependencies/zycore/src/API/Synchronization.c new file mode 100644 index 0000000000..48080bbc43 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/API/Synchronization.c @@ -0,0 +1,204 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +#ifndef ZYAN_NO_LIBC + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* */ +/* ---------------------------------------------------------------------------------------------- */ + + + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +#if defined(ZYAN_POSIX) + +#include + +/* ---------------------------------------------------------------------------------------------- */ +/* Critical Section */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanCriticalSectionInitialize(ZyanCriticalSection* critical_section) +{ + pthread_mutexattr_t attribute; + + int error = pthread_mutexattr_init(&attribute); + if (error != 0) + { + if (error == ENOMEM) + { + return ZYAN_STATUS_NOT_ENOUGH_MEMORY; + } + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + pthread_mutexattr_settype(&attribute, PTHREAD_MUTEX_RECURSIVE); + + error = pthread_mutex_init(critical_section, &attribute); + pthread_mutexattr_destroy(&attribute); + if (error != 0) + { + if (error == EAGAIN) + { + return ZYAN_STATUS_OUT_OF_RESOURCES; + } + if (error == ENOMEM) + { + return ZYAN_STATUS_NOT_ENOUGH_MEMORY; + } + if (error == EPERM) + { + return ZYAN_STATUS_ACCESS_DENIED; + } + if ((error == EBUSY) || (error == EINVAL)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanCriticalSectionEnter(ZyanCriticalSection* critical_section) +{ + const int error = pthread_mutex_lock(critical_section); + if (error != 0) + { + if (error == EINVAL) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (error == EAGAIN) + { + return ZYAN_STATUS_INVALID_OPERATION; + } + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanBool ZyanCriticalSectionTryEnter(ZyanCriticalSection* critical_section) +{ + // No fine grained error handling for this one + return pthread_mutex_trylock(critical_section) ? ZYAN_FALSE : ZYAN_TRUE; +} + +ZyanStatus ZyanCriticalSectionLeave(ZyanCriticalSection* critical_section) +{ + const int error = pthread_mutex_unlock(critical_section); + if (error != 0) + { + if (error == EINVAL) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (error == EPERM) + { + return ZYAN_STATUS_INVALID_OPERATION; + } + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanCriticalSectionDelete(ZyanCriticalSection* critical_section) +{ + const int error = pthread_mutex_destroy(critical_section); + if (error != 0) + { + if ((error == EBUSY) || (error == EINVAL)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +#elif defined(ZYAN_WINDOWS) + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanCriticalSectionInitialize(ZyanCriticalSection* critical_section) +{ + InitializeCriticalSection(critical_section); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanCriticalSectionEnter(ZyanCriticalSection* critical_section) +{ + EnterCriticalSection(critical_section); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanBool ZyanCriticalSectionTryEnter(ZyanCriticalSection* critical_section) +{ + return TryEnterCriticalSection(critical_section) ? ZYAN_TRUE : ZYAN_FALSE; +} + +ZyanStatus ZyanCriticalSectionLeave(ZyanCriticalSection* critical_section) +{ + LeaveCriticalSection(critical_section); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanCriticalSectionDelete(ZyanCriticalSection* critical_section) +{ + DeleteCriticalSection(critical_section); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +#else +# error "Unsupported platform detected" +#endif + +/* ============================================================================================== */ + +#endif /* ZYAN_NO_LIBC */ diff --git a/3rdparty/zydis/dependencies/zycore/src/API/Terminal.c b/3rdparty/zydis/dependencies/zycore/src/API/Terminal.c new file mode 100644 index 0000000000..382bd789ac --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/API/Terminal.c @@ -0,0 +1,160 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +#ifndef ZYAN_NO_LIBC + +#if defined(ZYAN_POSIX) +# include +#elif defined(ZYAN_WINDOWS) +# include +# include +#else +# error "Unsupported platform detected" +#endif + +// Provide fallback for old SDK versions +#ifdef ZYAN_WINDOWS +# ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING +# define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +# endif +#endif + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +ZyanStatus ZyanTerminalEnableVT100(ZyanStandardStream stream) +{ + if ((stream != ZYAN_STDSTREAM_OUT) && (stream != ZYAN_STDSTREAM_ERR)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + +#ifdef ZYAN_WINDOWS + // Get file descriptor + int file; + switch (stream) + { + case ZYAN_STDSTREAM_OUT: + file = _fileno(ZYAN_STDOUT); + break; + case ZYAN_STDSTREAM_ERR: + file = _fileno(ZYAN_STDERR); + break; + default: + ZYAN_UNREACHABLE; + } + if (file < 0) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + HANDLE const handle = (HANDLE)_get_osfhandle(file); + if (handle == INVALID_HANDLE_VALUE) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + DWORD mode; + if (!GetConsoleMode(handle, &mode)) + { + // The given standard stream is not bound to a terminal + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + if (!SetConsoleMode(handle, mode)) + { + return ZYAN_STATUS_BAD_SYSTEMCALL; + } +#endif + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanTerminalIsTTY(ZyanStandardStream stream) +{ + // Get file descriptor + int file; +#ifdef ZYAN_WINDOWS + switch (stream) + { + case ZYAN_STDSTREAM_IN: + file = _fileno(ZYAN_STDIN); + break; + case ZYAN_STDSTREAM_OUT: + file = _fileno(ZYAN_STDOUT); + break; + case ZYAN_STDSTREAM_ERR: + file = _fileno(ZYAN_STDERR); + break; + default: + ZYAN_UNREACHABLE; + } + if (file < 0) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } +#else + switch (stream) + { + case ZYAN_STDSTREAM_IN: + file = STDIN_FILENO; + break; + case ZYAN_STDSTREAM_OUT: + file = STDOUT_FILENO; + break; + case ZYAN_STDSTREAM_ERR: + file = STDERR_FILENO; + break; + default: + ZYAN_UNREACHABLE; + } +#endif + +#ifdef ZYAN_WINDOWS + if (_isatty(file)) +#else + if ( isatty(file)) +#endif + { + return ZYAN_STATUS_TRUE; + } + if (ZYAN_ERRNO == EBADF) + { + // Invalid file descriptor + return ZYAN_STATUS_INVALID_ARGUMENT; + } + //ZYAN_ASSERT((errno == EINVAL) || (errno == ENOTTY)); + + return ZYAN_STATUS_FALSE; +} + +/* ============================================================================================== */ + +#endif /* ZYAN_NO_LIBC */ diff --git a/3rdparty/zydis/dependencies/zycore/src/API/Thread.c b/3rdparty/zydis/dependencies/zycore/src/API/Thread.c new file mode 100644 index 0000000000..0cc3d8cad5 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/API/Thread.c @@ -0,0 +1,244 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +#ifndef ZYAN_NO_LIBC + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Legacy Windows import declarations */ +/* ---------------------------------------------------------------------------------------------- */ + +#if defined(ZYAN_WINDOWS) && defined(_WIN32_WINNT) && \ + (_WIN32_WINNT >= 0x0501) && (_WIN32_WINNT < 0x0600) + +/** + * The Windows SDK conditionally declares the following prototypes: the target OS must be Vista + * (0x0600) or above. MSDN states the same incorrect minimum requirement for the Fls* functions. + * + * However, these functions exist and work perfectly fine on XP (SP3) and Server 2003. + * Preserve backward compatibility with these OSes by declaring the prototypes here if needed. + */ + +#ifndef FLS_OUT_OF_INDEXES +#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) +#endif + +WINBASEAPI +DWORD +WINAPI +FlsAlloc( + _In_opt_ PFLS_CALLBACK_FUNCTION lpCallback + ); + +WINBASEAPI +PVOID +WINAPI +FlsGetValue( + _In_ DWORD dwFlsIndex + ); + +WINBASEAPI +BOOL +WINAPI +FlsSetValue( + _In_ DWORD dwFlsIndex, + _In_opt_ PVOID lpFlsData + ); + +WINBASEAPI +BOOL +WINAPI +FlsFree( + _In_ DWORD dwFlsIndex + ); + +#endif /* (_WIN32_WINNT >= 0x0501) && (_WIN32_WINNT < 0x0600)*/ + + + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +#if defined(ZYAN_POSIX) + +#include + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanThreadGetCurrentThread(ZyanThread* thread) +{ + *thread = pthread_self(); + + return ZYAN_STATUS_SUCCESS; +} + +ZYAN_STATIC_ASSERT(sizeof(ZyanThreadId) <= sizeof(ZyanU64)); +ZyanStatus ZyanThreadGetCurrentThreadId(ZyanThreadId* thread_id) +{ + // TODO: Use `pthread_getthreadid_np` on platforms where it is available + + pthread_t ptid = pthread_self(); + *thread_id = *(ZyanThreadId*)ptid; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Thread Local Storage */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanThreadTlsAlloc(ZyanThreadTlsIndex* index, ZyanThreadTlsCallback destructor) +{ + ZyanThreadTlsIndex value; + const int error = pthread_key_create(&value, destructor); + if (error != 0) + { + if (error == EAGAIN) + { + return ZYAN_STATUS_OUT_OF_RESOURCES; + } + if (error == ENOMEM) + { + return ZYAN_STATUS_NOT_ENOUGH_MEMORY; + } + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + + *index = value; + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanThreadTlsFree(ZyanThreadTlsIndex index) +{ + return !pthread_key_delete(index) ? ZYAN_STATUS_SUCCESS : ZYAN_STATUS_BAD_SYSTEMCALL; +} + +ZyanStatus ZyanThreadTlsGetValue(ZyanThreadTlsIndex index, void** data) +{ + *data = pthread_getspecific(index); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanThreadTlsSetValue(ZyanThreadTlsIndex index, void* data) +{ + const int error = pthread_setspecific(index, data); + if (error != 0) + { + if (error == EINVAL) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +#elif defined(ZYAN_WINDOWS) + +/* ---------------------------------------------------------------------------------------------- */ +/* General */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanThreadGetCurrentThread(ZyanThread* thread) +{ + *thread = GetCurrentThread(); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanThreadGetCurrentThreadId(ZyanThreadId* thread_id) +{ + *thread_id = GetCurrentThreadId(); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Thread Local Storage (TLS) */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanThreadTlsAlloc(ZyanThreadTlsIndex* index, ZyanThreadTlsCallback destructor) +{ + const ZyanThreadTlsIndex value = FlsAlloc(destructor); + if (value == FLS_OUT_OF_INDEXES) + { + return ZYAN_STATUS_OUT_OF_RESOURCES; + } + + *index = value; + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanThreadTlsFree(ZyanThreadTlsIndex index) +{ + return FlsFree(index) ? ZYAN_STATUS_SUCCESS : ZYAN_STATUS_BAD_SYSTEMCALL; +} + +ZyanStatus ZyanThreadTlsGetValue(ZyanThreadTlsIndex index, void** data) +{ + *data = FlsGetValue(index); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanThreadTlsSetValue(ZyanThreadTlsIndex index, void* data) +{ + if (!FlsSetValue(index, data)) + { + const DWORD error = GetLastError(); + if (error == ERROR_INVALID_PARAMETER) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + return ZYAN_STATUS_BAD_SYSTEMCALL; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +#else +# error "Unsupported platform detected" +#endif + +/* ============================================================================================== */ + +#endif /* ZYAN_NO_LIBC */ diff --git a/3rdparty/zydis/dependencies/zycore/src/Allocator.c b/3rdparty/zydis/dependencies/zycore/src/Allocator.c new file mode 100644 index 0000000000..5fadf64764 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/Allocator.c @@ -0,0 +1,134 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Default allocator */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +static ZyanStatus ZyanAllocatorDefaultAllocate(ZyanAllocator* allocator, void** p, + ZyanUSize element_size, ZyanUSize n) +{ + ZYAN_ASSERT(allocator); + ZYAN_ASSERT(p); + ZYAN_ASSERT(element_size); + ZYAN_ASSERT(n); + + ZYAN_UNUSED(allocator); + + *p = ZYAN_MALLOC(element_size * n); + if (!*p) + { + return ZYAN_STATUS_NOT_ENOUGH_MEMORY; + } + + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZyanAllocatorDefaultReallocate(ZyanAllocator* allocator, void** p, + ZyanUSize element_size, ZyanUSize n) +{ + ZYAN_ASSERT(allocator); + ZYAN_ASSERT(p); + ZYAN_ASSERT(element_size); + ZYAN_ASSERT(n); + + ZYAN_UNUSED(allocator); + + void* const x = ZYAN_REALLOC(*p, element_size * n); + if (!x) + { + return ZYAN_STATUS_NOT_ENOUGH_MEMORY; + } + *p = x; + + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZyanAllocatorDefaultDeallocate(ZyanAllocator* allocator, void* p, + ZyanUSize element_size, ZyanUSize n) +{ + ZYAN_ASSERT(allocator); + ZYAN_ASSERT(p); + ZYAN_ASSERT(element_size); + ZYAN_ASSERT(n); + + ZYAN_UNUSED(allocator); + ZYAN_UNUSED(element_size); + ZYAN_UNUSED(n); + + ZYAN_FREE(p); + + return ZYAN_STATUS_SUCCESS; +} + +#endif // ZYAN_NO_LIBC + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +ZyanStatus ZyanAllocatorInit(ZyanAllocator* allocator, ZyanAllocatorAllocate allocate, + ZyanAllocatorAllocate reallocate, ZyanAllocatorDeallocate deallocate) +{ + if (!allocator || !allocate || !reallocate || !deallocate) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + allocator->allocate = allocate; + allocator->reallocate = reallocate; + allocator->deallocate = deallocate; + + return ZYAN_STATUS_SUCCESS; +} + +#ifndef ZYAN_NO_LIBC + +ZyanAllocator* ZyanAllocatorDefault(void) +{ + static ZyanAllocator allocator = + { + &ZyanAllocatorDefaultAllocate, + &ZyanAllocatorDefaultReallocate, + &ZyanAllocatorDefaultDeallocate + }; + return &allocator; +} + +#endif + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/dependencies/zycore/src/ArgParse.c b/3rdparty/zydis/dependencies/zycore/src/ArgParse.c new file mode 100644 index 0000000000..109cfc8ac1 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/ArgParse.c @@ -0,0 +1,279 @@ +/*************************************************************************************************** + + Zyan Core Library (Zycore-C) + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +#ifndef ZYAN_NO_LIBC + +ZyanStatus ZyanArgParse(const ZyanArgParseConfig *cfg, ZyanVector* parsed, + const char** error_token) +{ + return ZyanArgParseEx(cfg, parsed, error_token, ZyanAllocatorDefault()); +} + +#endif + +ZyanStatus ZyanArgParseEx(const ZyanArgParseConfig *cfg, ZyanVector* parsed, + const char** error_token, ZyanAllocator* allocator) +{ +# define ZYAN_ERR_TOK(tok) if (error_token) { *error_token = tok; } + + ZYAN_ASSERT(cfg); + ZYAN_ASSERT(parsed); + + // TODO: Once we have a decent hash map impl, refactor this to use it. The majority of for + // loops through the argument list could be avoided. + + if (cfg->min_unnamed_args > cfg->max_unnamed_args) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Check argument syntax. + for (const ZyanArgParseDefinition* def = cfg->args; def && def->name; ++def) + { + // TODO: Duplicate check + + if (!def->name) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanUSize arg_len = ZYAN_STRLEN(def->name); + if (arg_len < 2 || def->name[0] != '-') + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Single dash arguments only accept a single char name. + if (def->name[1] != '-' && arg_len != 2) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + } + + // Initialize output vector. + ZYAN_CHECK(ZyanVectorInitEx(parsed, sizeof(ZyanArgParseArg), cfg->argc, ZYAN_NULL, allocator, + ZYAN_VECTOR_DEFAULT_GROWTH_FACTOR, ZYAN_VECTOR_DEFAULT_SHRINK_THRESHOLD)); + + ZyanStatus err; + ZyanBool accept_dash_args = ZYAN_TRUE; + ZyanUSize num_unnamed_args = 0; + for (ZyanUSize i = 1; i < cfg->argc; ++i) + { + const char* cur_arg = cfg->argv[i]; + ZyanUSize arg_len = ZYAN_STRLEN(cfg->argv[i]); + + // Double-dash argument? + if (accept_dash_args && arg_len >= 2 && ZYAN_MEMCMP(cur_arg, "--", 2) == 0) + { + // GNU style end of argument parsing. + if (arg_len == 2) + { + accept_dash_args = ZYAN_FALSE; + } + // Regular double-dash argument. + else + { + // Allocate parsed argument struct. + ZyanArgParseArg* parsed_arg; + ZYAN_CHECK(ZyanVectorEmplace(parsed, (void**)&parsed_arg, ZYAN_NULL)); + ZYAN_MEMSET(parsed_arg, 0, sizeof(*parsed_arg)); + + // Find corresponding argument definition. + for (const ZyanArgParseDefinition* def = cfg->args; def && def->name; ++def) + { + if (ZYAN_STRCMP(def->name, cur_arg) == 0) + { + parsed_arg->def = def; + break; + } + } + + // Search exhausted & argument not found. RIP. + if (!parsed_arg->def) + { + err = ZYAN_STATUS_ARG_NOT_UNDERSTOOD; + ZYAN_ERR_TOK(cur_arg); + goto failure; + } + + // Does the argument expect a value? If yes, consume next token. + if (!parsed_arg->def->boolean) + { + if (i == cfg->argc - 1) + { + err = ZYAN_STATUS_ARG_MISSES_VALUE; + ZYAN_ERR_TOK(cur_arg); + goto failure; + } + parsed_arg->has_value = ZYAN_TRUE; + ZYAN_CHECK(ZyanStringViewInsideBuffer(&parsed_arg->value, cfg->argv[++i])); + } + } + + // Continue parsing at next token. + continue; + } + + // Single-dash argument? + // TODO: How to deal with just dashes? Current code treats it as unnamed arg. + if (accept_dash_args && arg_len > 1 && cur_arg[0] == '-') + { + // Iterate argument token chars until there are either no more chars left + // or we encounter a non-boolean argument, in which case we consume the + // remaining chars as its value. + for (const char* read_ptr = cur_arg + 1; *read_ptr; ++read_ptr) + { + // Allocate parsed argument struct. + ZyanArgParseArg* parsed_arg; + ZYAN_CHECK(ZyanVectorEmplace(parsed, (void**)&parsed_arg, ZYAN_NULL)); + ZYAN_MEMSET(parsed_arg, 0, sizeof(*parsed_arg)); + + // Find corresponding argument definition. + for (const ZyanArgParseDefinition* def = cfg->args; def && def->name; ++def) + { + if (ZYAN_STRLEN(def->name) == 2 && + def->name[0] == '-' && + def->name[1] == *read_ptr) + { + parsed_arg->def = def; + break; + } + } + + // Search exhausted, no match found? + if (!parsed_arg->def) + { + err = ZYAN_STATUS_ARG_NOT_UNDERSTOOD; + ZYAN_ERR_TOK(cur_arg); + goto failure; + } + + // Requires value? + if (!parsed_arg->def->boolean) + { + // If there are chars left, consume them (e.g. `-n1000`). + if (read_ptr[1]) + { + parsed_arg->has_value = ZYAN_TRUE; + ZYAN_CHECK(ZyanStringViewInsideBuffer(&parsed_arg->value, read_ptr + 1)); + } + // If not, consume next token (e.g. `-n 1000`). + else + { + if (i == cfg->argc - 1) + { + err = ZYAN_STATUS_ARG_MISSES_VALUE; + ZYAN_ERR_TOK(cur_arg) + goto failure; + } + + parsed_arg->has_value = ZYAN_TRUE; + ZYAN_CHECK(ZyanStringViewInsideBuffer(&parsed_arg->value, cfg->argv[++i])); + } + + // Either way, continue with next argument. + goto continue_main_loop; + } + } + } + + // Still here? We're looking at an unnamed argument. + ++num_unnamed_args; + if (num_unnamed_args > cfg->max_unnamed_args) + { + err = ZYAN_STATUS_TOO_MANY_ARGS; + ZYAN_ERR_TOK(cur_arg); + goto failure; + } + + // Allocate parsed argument struct. + ZyanArgParseArg* parsed_arg; + ZYAN_CHECK(ZyanVectorEmplace(parsed, (void**)&parsed_arg, ZYAN_NULL)); + ZYAN_MEMSET(parsed_arg, 0, sizeof(*parsed_arg)); + parsed_arg->has_value = ZYAN_TRUE; + ZYAN_CHECK(ZyanStringViewInsideBuffer(&parsed_arg->value, cur_arg)); + + continue_main_loop:; + } + + // All tokens processed. Do we have enough unnamed arguments? + if (num_unnamed_args < cfg->min_unnamed_args) + { + err = ZYAN_STATUS_TOO_FEW_ARGS; + // No sensible error token for this error type. + goto failure; + } + + // Check whether all required arguments are present. + ZyanUSize num_parsed_args; + ZYAN_CHECK(ZyanVectorGetSize(parsed, &num_parsed_args)); + for (const ZyanArgParseDefinition* def = cfg->args; def && def->name; ++def) + { + if (!def->required) continue; + + ZyanBool arg_found = ZYAN_FALSE; + for (ZyanUSize i = 0; i < num_parsed_args; ++i) + { + const ZyanArgParseArg* arg = ZYAN_NULL; + ZYAN_CHECK(ZyanVectorGetPointer(parsed, i, (const void**)&arg)); + + // Skip unnamed args. + if (!arg->def) continue; + + if (arg->def == def) + { + arg_found = ZYAN_TRUE; + break; + } + } + + if (!arg_found) + { + err = ZYAN_STATUS_REQUIRED_ARG_MISSING; + ZYAN_ERR_TOK(def->name); + goto failure; + } + } + + // Yay! + ZYAN_ERR_TOK(ZYAN_NULL); + return ZYAN_STATUS_SUCCESS; + +failure: + ZYAN_CHECK(ZyanVectorDestroy(parsed)); + return err; + +# undef ZYAN_ERR_TOK +} + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/dependencies/zycore/src/Bitset.c b/3rdparty/zydis/dependencies/zycore/src/Bitset.c new file mode 100644 index 0000000000..b1c733d6c5 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/Bitset.c @@ -0,0 +1,670 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* Internal constants */ +/* ============================================================================================== */ + +#define ZYAN_BITSET_GROWTH_FACTOR 2 +#define ZYAN_BITSET_SHRINK_THRESHOLD 2 + +/* ============================================================================================== */ +/* Internal macros */ +/* ============================================================================================== */ + +/** + * Computes the smallest integer value not less than `x`. + * + * @param x The value. + * + * @return The smallest integer value not less than `x`. + */ +#define ZYAN_BITSET_CEIL(x) \ + (((x) == ((ZyanU32)(x))) ? (ZyanU32)(x) : ((ZyanU32)(x)) + 1) + +/** + * Converts bits to bytes. + * + * @param x The value in bits. + * + * @return The amount of bytes needed to fit `x` bits. + */ +#define ZYAN_BITSET_BITS_TO_BYTES(x) \ + ZYAN_BITSET_CEIL((x) / 8) + +/** + * Returns the offset of the given bit. + * + * @param index The bit index. + * + * @return The offset of the given bit. + */ +#define ZYAN_BITSET_BIT_OFFSET(index) \ + (7 - ((index) % 8)) + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Helper functions */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Initializes the given `vector` with `count` "zero"-bytes. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param count The number of bytes. + * + * @return A zyan status code. + */ +static ZyanStatus ZyanBitsetInitVectorElements(ZyanVector* vector, ZyanUSize count) +{ + ZYAN_ASSERT(vector); + + static const ZyanU8 zero = 0; + for (ZyanUSize i = 0; i < count; ++i) + { + ZYAN_CHECK(ZyanVectorPushBack(vector, &zero)); + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Byte operations */ +/* ---------------------------------------------------------------------------------------------- */ + +static ZyanStatus ZyanBitsetOperationAND(ZyanU8* b1, const ZyanU8* b2) +{ + *b1 &= *b2; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZyanBitsetOperationOR (ZyanU8* b1, const ZyanU8* b2) +{ + *b1 |= *b2; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZyanBitsetOperationXOR(ZyanU8* b1, const ZyanU8* b2) +{ + *b1 ^= *b2; + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constructor and destructor */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +ZyanStatus ZyanBitsetInit(ZyanBitset* bitset, ZyanUSize count) +{ + return ZyanBitsetInitEx(bitset, count, ZyanAllocatorDefault(), ZYAN_BITSET_GROWTH_FACTOR, + ZYAN_BITSET_SHRINK_THRESHOLD); +} + +#endif // ZYAN_NO_LIBC + +ZyanStatus ZyanBitsetInitEx(ZyanBitset* bitset, ZyanUSize count, ZyanAllocator* allocator, + ZyanU8 growth_factor, ZyanU8 shrink_threshold) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanU32 bytes = ZYAN_BITSET_BITS_TO_BYTES(count); + + bitset->size = count; + ZYAN_CHECK(ZyanVectorInitEx(&bitset->bits, sizeof(ZyanU8), bytes, ZYAN_NULL, allocator, + growth_factor, shrink_threshold)); + ZYAN_CHECK(ZyanBitsetInitVectorElements(&bitset->bits, bytes)); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetInitBuffer(ZyanBitset* bitset, ZyanUSize count, void* buffer, + ZyanUSize capacity) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanU32 bytes = ZYAN_BITSET_BITS_TO_BYTES(count); + if (capacity < bytes) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + bitset->size = count; + ZYAN_CHECK(ZyanVectorInitCustomBuffer(&bitset->bits, sizeof(ZyanU8), buffer, capacity, + ZYAN_NULL)); + ZYAN_CHECK(ZyanBitsetInitVectorElements(&bitset->bits, bytes)); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetDestroy(ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanVectorDestroy(&bitset->bits); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Logical operations */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanBitsetPerformByteOperation(ZyanBitset* destination, const ZyanBitset* source, + ZyanBitsetByteOperation operation) +{ + if (!destination || !source || !operation) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanUSize s1; + ZyanUSize s2; + ZYAN_CHECK(ZyanVectorGetSize(&destination->bits, &s1)); + ZYAN_CHECK(ZyanVectorGetSize(&source->bits, &s2)); + + const ZyanUSize min = ZYAN_MIN(s1, s2); + for (ZyanUSize i = 0; i < min; ++i) + { + ZyanU8* v1; + const ZyanU8* v2; + ZYAN_CHECK(ZyanVectorGetPointerMutable(&destination->bits, i, (void**)&v1)); + ZYAN_CHECK(ZyanVectorGetPointer(&source->bits, i, (const void**)&v2)); + + ZYAN_ASSERT(v1); + ZYAN_ASSERT(v2); + + ZYAN_CHECK(operation(v1, v2)); + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetAND(ZyanBitset* destination, const ZyanBitset* source) +{ + return ZyanBitsetPerformByteOperation(destination, source, ZyanBitsetOperationAND); +} + +ZyanStatus ZyanBitsetOR (ZyanBitset* destination, const ZyanBitset* source) +{ + return ZyanBitsetPerformByteOperation(destination, source, ZyanBitsetOperationOR ); +} + +ZyanStatus ZyanBitsetXOR(ZyanBitset* destination, const ZyanBitset* source) +{ + return ZyanBitsetPerformByteOperation(destination, source, ZyanBitsetOperationXOR); +} + +ZyanStatus ZyanBitsetFlip(ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanUSize size; + ZYAN_CHECK(ZyanVectorGetSize(&bitset->bits, &size)); + for (ZyanUSize i = 0; i < size; ++i) + { + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointerMutable(&bitset->bits, i, (void**)&value)); + *value = ~(*value); + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Bit access */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanBitsetSet(ZyanBitset* bitset, ZyanUSize index) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index >= bitset->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointerMutable(&bitset->bits, index / 8, (void**)&value)); + + *value |= (1 << ZYAN_BITSET_BIT_OFFSET(index)); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetReset(ZyanBitset* bitset, ZyanUSize index) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index >= bitset->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointerMutable(&bitset->bits, index / 8, (void**)&value)); + *value &= ~(1 << ZYAN_BITSET_BIT_OFFSET(index)); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetAssign(ZyanBitset* bitset, ZyanUSize index, ZyanBool value) +{ + if (value) + { + return ZyanBitsetSet(bitset, index); + } + return ZyanBitsetReset(bitset, index); +} + +ZyanStatus ZyanBitsetToggle(ZyanBitset* bitset, ZyanUSize index) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index >= bitset->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointerMutable(&bitset->bits, index / 8, (void**)&value)); + *value ^= (1 << ZYAN_BITSET_BIT_OFFSET(index)); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetTest(ZyanBitset* bitset, ZyanUSize index) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index >= bitset->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + const ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointer(&bitset->bits, index / 8, (const void**)&value)); + if ((*value & (1 << ZYAN_BITSET_BIT_OFFSET(index))) == 0) + { + return ZYAN_STATUS_FALSE; + } + return ZYAN_STATUS_TRUE; +} + +ZyanStatus ZyanBitsetTestMSB(ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanBitsetTest(bitset, bitset->size - 1); +} + +ZyanStatus ZyanBitsetTestLSB(ZyanBitset* bitset) +{ + return ZyanBitsetTest(bitset, 0); +} + +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanBitsetSetAll(ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanUSize size; + ZYAN_CHECK(ZyanVectorGetSize(&bitset->bits, &size)); + for (ZyanUSize i = 0; i < size; ++i) + { + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointerMutable(&bitset->bits, i, (void**)&value)); + *value = 0xFF; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetResetAll(ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanUSize size; + ZYAN_CHECK(ZyanVectorGetSize(&bitset->bits, &size)); + for (ZyanUSize i = 0; i < size; ++i) + { + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointerMutable(&bitset->bits, i, (void**)&value)); + *value = 0x00; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Size management */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanBitsetPush(ZyanBitset* bitset, ZyanBool value) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if ((bitset->size++ % 8) == 0) + { + static const ZyanU8 zero = 0; + ZYAN_CHECK(ZyanVectorPushBack(&bitset->bits, &zero)); + } + + return ZyanBitsetAssign(bitset, bitset->size - 1, value); +} + +ZyanStatus ZyanBitsetPop(ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if ((--bitset->size % 8) == 0) + { + return ZyanVectorPopBack(&bitset->bits); + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetClear(ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + bitset->size = 0; + return ZyanVectorClear(&bitset->bits); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Memory management */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanBitsetReserve(ZyanBitset* bitset, ZyanUSize count) +{ + return ZyanVectorReserve(&bitset->bits, ZYAN_BITSET_BITS_TO_BYTES(count)); +} + +ZyanStatus ZyanBitsetShrinkToFit(ZyanBitset* bitset) +{ + return ZyanVectorShrinkToFit(&bitset->bits); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Information */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanBitsetGetSize(const ZyanBitset* bitset, ZyanUSize* size) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *size = bitset->size; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetGetCapacity(const ZyanBitset* bitset, ZyanUSize* capacity) +{ + ZYAN_CHECK(ZyanBitsetGetCapacityBytes(bitset, capacity)); + *capacity *= 8; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetGetSizeBytes(const ZyanBitset* bitset, ZyanUSize* size) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanVectorGetSize(&bitset->bits, size); +} + +ZyanStatus ZyanBitsetGetCapacityBytes(const ZyanBitset* bitset, ZyanUSize* capacity) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanVectorGetCapacity(&bitset->bits, capacity); +} + +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanBitsetCount(const ZyanBitset* bitset, ZyanUSize* count) +{ + if (!bitset || !count) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *count = 0; + + ZyanUSize size; + ZYAN_CHECK(ZyanVectorGetSize(&bitset->bits, &size)); + for (ZyanUSize i = 0; i < size; ++i) + { + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointer(&bitset->bits, i, (const void**)&value)); + + ZyanU8 popcnt = *value; + popcnt = (popcnt & 0x55) + ((popcnt >> 1) & 0x55); + popcnt = (popcnt & 0x33) + ((popcnt >> 2) & 0x33); + popcnt = (popcnt & 0x0F) + ((popcnt >> 4) & 0x0F); + + *count += popcnt; + } + + *count = ZYAN_MIN(*count, bitset->size); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanBitsetAll(const ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanUSize size; + ZYAN_CHECK(ZyanVectorGetSize(&bitset->bits, &size)); + for (ZyanUSize i = 0; i < size; ++i) + { + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointer(&bitset->bits, i, (const void**)&value)); + if (i < (size - 1)) + { + if (*value != 0xFF) + { + return ZYAN_STATUS_FALSE; + } + } else + { + const ZyanU8 mask = ~(8 - (bitset->size % 8)); + if ((*value & mask) != mask) + { + return ZYAN_STATUS_FALSE; + } + } + } + + return ZYAN_STATUS_TRUE; +} + +ZyanStatus ZyanBitsetAny(const ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanUSize size; + ZYAN_CHECK(ZyanVectorGetSize(&bitset->bits, &size)); + for (ZyanUSize i = 0; i < size; ++i) + { + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointer(&bitset->bits, i, (const void**)&value)); + if (i < (size - 1)) + { + if (*value != 0x00) + { + return ZYAN_STATUS_TRUE; + } + } else + { + const ZyanU8 mask = ~(8 - (bitset->size % 8)); + if ((*value & mask) != 0x00) + { + return ZYAN_STATUS_TRUE; + } + } + } + + return ZYAN_STATUS_FALSE; +} + +ZyanStatus ZyanBitsetNone(const ZyanBitset* bitset) +{ + if (!bitset) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanUSize size; + ZYAN_CHECK(ZyanVectorGetSize(&bitset->bits, &size)); + for (ZyanUSize i = 0; i < size; ++i) + { + ZyanU8* value; + ZYAN_CHECK(ZyanVectorGetPointer(&bitset->bits, i, (const void**)&value)); + if (i < (size - 1)) + { + if (*value != 0x00) + { + return ZYAN_STATUS_FALSE; + } + } else + { + const ZyanU8 mask = ~(8 - (bitset->size % 8)); + if ((*value & mask) != 0x00) + { + return ZYAN_STATUS_FALSE; + } + } + } + + return ZYAN_STATUS_TRUE; +} + +/* ---------------------------------------------------------------------------------------------- */ + +//ZyanStatus ZyanBitsetToU32(const ZyanBitset* bitset, ZyanU32* value) +//{ +// if (!bitset) +// { +// return ZYAN_STATUS_INVALID_ARGUMENT; +// } +// if (bitset->size > 32) +// { +// return ZYAN_STATUS_INVALID_OPERATION; +// } +// +// // TODO: +// +// return ZYAN_STATUS_SUCCESS; +//} +// +//ZyanStatus ZyanBitsetToU64(const ZyanBitset* bitset, ZyanU64* value) +//{ +// if (!bitset) +// { +// return ZYAN_STATUS_INVALID_ARGUMENT; +// } +// if (bitset->size > 64) +// { +// return ZYAN_STATUS_INVALID_OPERATION; +// } +// +// // TODO: +// +// return ZYAN_STATUS_SUCCESS; +//} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/dependencies/zycore/src/Format.c b/3rdparty/zydis/dependencies/zycore/src/Format.c new file mode 100644 index 0000000000..4529f88a77 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/Format.c @@ -0,0 +1,507 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Defines */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYCORE_MAXCHARS_DEC_32 10 +#define ZYCORE_MAXCHARS_DEC_64 20 +#define ZYCORE_MAXCHARS_HEX_32 8 +#define ZYCORE_MAXCHARS_HEX_64 16 + +/* ---------------------------------------------------------------------------------------------- */ +/* Lookup Tables */ +/* ---------------------------------------------------------------------------------------------- */ + +static const char* const DECIMAL_LOOKUP = + "00010203040506070809" + "10111213141516171819" + "20212223242526272829" + "30313233343536373839" + "40414243444546474849" + "50515253545556575859" + "60616263646566676869" + "70717273747576777879" + "80818283848586878889" + "90919293949596979899"; + +/* ---------------------------------------------------------------------------------------------- */ +/* Static strings */ +/* ---------------------------------------------------------------------------------------------- */ + +static const ZyanStringView STR_ADD = ZYAN_DEFINE_STRING_VIEW("+"); +static const ZyanStringView STR_SUB = ZYAN_DEFINE_STRING_VIEW("-"); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Internal macros */ +/* ============================================================================================== */ + +/** + * Writes a terminating '\0' character at the end of the string data. + */ +#define ZYCORE_STRING_NULLTERMINATE(string) \ + *(char*)((ZyanU8*)(string)->vector.data + (string)->vector.size - 1) = '\0'; + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Decimal */ +/* ---------------------------------------------------------------------------------------------- */ + +#if defined(ZYAN_X86) || defined(ZYAN_ARM) || defined(ZYAN_EMSCRIPTEN) || defined(ZYAN_WASM) +ZyanStatus ZyanStringAppendDecU32(ZyanString* string, ZyanU32 value, ZyanU8 padding_length) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + char buffer[ZYCORE_MAXCHARS_DEC_32]; + char *buffer_end = &buffer[ZYCORE_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) + { + ZYAN_CHECK(ZyanStringResize(string, string->vector.size + length_total - 1)); + } + + 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; + ZYCORE_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} +#endif + +ZyanStatus ZyanStringAppendDecU64(ZyanString* string, ZyanU64 value, ZyanU8 padding_length) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + char buffer[ZYCORE_MAXCHARS_DEC_64]; + char *buffer_end = &buffer[ZYCORE_MAXCHARS_DEC_64]; + char *buffer_write_pointer = buffer_end; + while (value >= 100) + { + const ZyanU64 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) + { + ZYAN_CHECK(ZyanStringResize(string, string->vector.size + length_total - 1)); + } + + 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; + ZYCORE_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Hexadecimal */ +/* ---------------------------------------------------------------------------------------------- */ + +#if defined(ZYAN_X86) || defined(ZYAN_ARM) || defined(ZYAN_EMSCRIPTEN) || defined(ZYAN_WASM) +ZyanStatus ZyanStringAppendHexU32(ZyanString* string, ZyanU32 value, ZyanU8 padding_length, + ZyanBool uppercase) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanUSize len = string->vector.size; + ZyanUSize remaining = string->vector.capacity - string->vector.size; + + if (remaining < (ZyanUSize)padding_length) + { + ZYAN_CHECK(ZyanStringResize(string, len + padding_length - 1)); + remaining = padding_length; + } + + if (!value) + { + const ZyanU8 n = (padding_length ? padding_length : 1); + + if (remaining < (ZyanUSize)n) + { + ZYAN_CHECK(ZyanStringResize(string, string->vector.size + n - 1)); + } + + ZYAN_MEMSET((char*)string->vector.data + len - 1, '0', n); + string->vector.size = len + n; + ZYCORE_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; + } + + ZyanU8 n = 0; + char* buffer = ZYAN_NULL; + for (ZyanI8 i = ZYCORE_MAXCHARS_HEX_32 - 1; i >= 0; --i) + { + const ZyanU8 v = (value >> i * 4) & 0x0F; + if (!n) + { + if (!v) + { + continue; + } + if (remaining <= (ZyanU8)i) + { + ZYAN_CHECK(ZyanStringResize(string, string->vector.size + i)); + } + buffer = (char*)string->vector.data + len - 1; + 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; + ZYCORE_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} +#endif + +ZyanStatus ZyanStringAppendHexU64(ZyanString* string, ZyanU64 value, ZyanU8 padding_length, + ZyanBool uppercase) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanUSize len = string->vector.size; + ZyanUSize remaining = string->vector.capacity - string->vector.size; + + if (remaining < (ZyanUSize)padding_length) + { + ZYAN_CHECK(ZyanStringResize(string, len + padding_length - 1)); + remaining = padding_length; + } + + if (!value) + { + const ZyanU8 n = (padding_length ? padding_length : 1); + + if (remaining < (ZyanUSize)n) + { + ZYAN_CHECK(ZyanStringResize(string, string->vector.size + n - 1)); + } + + ZYAN_MEMSET((char*)string->vector.data + len - 1, '0', n); + string->vector.size = len + n; + ZYCORE_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; + } + + ZyanU8 n = 0; + char* buffer = ZYAN_NULL; + for (ZyanI8 i = ((value & 0xFFFFFFFF00000000) ? + ZYCORE_MAXCHARS_HEX_64 : ZYCORE_MAXCHARS_HEX_32) - 1; i >= 0; --i) + { + const ZyanU8 v = (value >> i * 4) & 0x0F; + if (!n) + { + if (!v) + { + continue; + } + if (remaining <= (ZyanU8)i) + { + ZYAN_CHECK(ZyanStringResize(string, string->vector.size + i)); + } + buffer = (char*)string->vector.data + len - 1; + 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; + ZYCORE_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Insertion */ +/* ---------------------------------------------------------------------------------------------- */ + +//ZyanStatus ZyanStringInsertFormat(ZyanString* string, ZyanUSize index, const char* format, ...) +//{ +// +//} +// +///* ---------------------------------------------------------------------------------------------- */ +// +//ZyanStatus ZyanStringInsertDecU(ZyanString* string, ZyanUSize index, ZyanU64 value, +// ZyanUSize padding_length) +//{ +// +//} +// +//ZyanStatus ZyanStringInsertDecS(ZyanString* string, ZyanUSize index, ZyanI64 value, +// ZyanUSize padding_length, ZyanBool force_sign, const ZyanString* prefix) +//{ +// +//} +// +//ZyanStatus ZyanStringInsertHexU(ZyanString* string, ZyanUSize index, ZyanU64 value, +// ZyanUSize padding_length, ZyanBool uppercase) +//{ +// +//} +// +//ZyanStatus ZyanStringInsertHexS(ZyanString* string, ZyanUSize index, ZyanI64 value, +// ZyanUSize padding_length, ZyanBool uppercase, ZyanBool force_sign, const ZyanString* prefix) +//{ +// +//} + +/* ---------------------------------------------------------------------------------------------- */ +/* Appending */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +ZyanStatus ZyanStringAppendFormat(ZyanString* string, const char* format, ...) +{ + if (!string || !format) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanVAList arglist; + ZYAN_VA_START(arglist, format); + + const ZyanUSize len = string->vector.size; + + ZyanI32 w = ZYAN_VSNPRINTF((char*)string->vector.data + len - 1, + string->vector.capacity - len + 1, format, arglist); + if (w < 0) + { + ZYAN_VA_END(arglist); + return ZYAN_STATUS_FAILED; + } + if (w <= (ZyanI32)(string->vector.capacity - len)) + { + string->vector.size = len + w; + + ZYAN_VA_END(arglist); + return ZYAN_STATUS_SUCCESS; + } + + // The remaining capacity was not sufficent to fit the formatted string. Trying to resize .. + const ZyanStatus status = ZyanStringResize(string, string->vector.size + w - 1); + if (!ZYAN_SUCCESS(status)) + { + ZYAN_VA_END(arglist); + return status; + } + + w = ZYAN_VSNPRINTF((char*)string->vector.data + len - 1, + string->vector.capacity - string->vector.size + 1, format, arglist); + if (w < 0) + { + ZYAN_VA_END(arglist); + return ZYAN_STATUS_FAILED; + } + ZYAN_ASSERT(w <= (ZyanI32)(string->vector.capacity - string->vector.size)); + + ZYAN_VA_END(arglist); + return ZYAN_STATUS_SUCCESS; +} + +#endif // ZYAN_NO_LIBC + +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringAppendDecU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length) +{ +#if defined(ZYAN_X64) || defined(ZYAN_AARCH64) + return ZyanStringAppendDecU64(string, value, padding_length); +#else + // Working with 64-bit values is slow on non 64-bit systems + if (value & 0xFFFFFFFF00000000) + { + return ZyanStringAppendDecU64(string, value, padding_length); + } + return ZyanStringAppendDecU32(string, (ZyanU32)value, padding_length); +#endif +} + +ZyanStatus ZyanStringAppendDecS(ZyanString* string, ZyanI64 value, ZyanU8 padding_length, + ZyanBool force_sign, const ZyanStringView* prefix) +{ + if (value < 0) + { + ZYAN_CHECK(ZyanStringAppend(string, &STR_SUB)); + if (prefix) + { + ZYAN_CHECK(ZyanStringAppend(string, prefix)); + } + return ZyanStringAppendDecU(string, ZyanAbsI64(value), padding_length); + } + + if (force_sign) + { + ZYAN_ASSERT(value >= 0); + ZYAN_CHECK(ZyanStringAppend(string, &STR_ADD)); + } + + if (prefix) + { + ZYAN_CHECK(ZyanStringAppend(string, prefix)); + } + return ZyanStringAppendDecU(string, value, padding_length); +} + +ZyanStatus ZyanStringAppendHexU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length, + ZyanBool uppercase) +{ +#if defined(ZYAN_X64) || defined(ZYAN_AARCH64) + return ZyanStringAppendHexU64(string, value, padding_length, uppercase); +#else + // Working with 64-bit values is slow on non 64-bit systems + if (value & 0xFFFFFFFF00000000) + { + return ZyanStringAppendHexU64(string, value, padding_length, uppercase); + } + return ZyanStringAppendHexU32(string, (ZyanU32)value, padding_length, uppercase); +#endif +} + +ZyanStatus ZyanStringAppendHexS(ZyanString* string, ZyanI64 value, ZyanU8 padding_length, + ZyanBool uppercase, ZyanBool force_sign, const ZyanStringView* prefix) +{ + if (value < 0) + { + ZYAN_CHECK(ZyanStringAppend(string, &STR_SUB)); + if (prefix) + { + ZYAN_CHECK(ZyanStringAppend(string, prefix)); + } + return ZyanStringAppendHexU(string, ZyanAbsI64(value), padding_length, uppercase); + } + + if (force_sign) + { + ZYAN_ASSERT(value >= 0); + ZYAN_CHECK(ZyanStringAppend(string, &STR_ADD)); + } + + if (prefix) + { + ZYAN_CHECK(ZyanStringAppend(string, prefix)); + } + return ZyanStringAppendHexU(string, value, padding_length, uppercase); +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/dependencies/zycore/src/List.c b/3rdparty/zydis/dependencies/zycore/src/List.c new file mode 100644 index 0000000000..e233da81f8 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/List.c @@ -0,0 +1,673 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* Internal macros */ +/* ============================================================================================== */ + +/** + * Returns a pointer to the data of the given `node`. + * + * @param node A pointer to the `ZyanNodeData` struct. + * + * @return A pointer to the data of the given `node`. + */ +#define ZYCORE_LIST_GET_NODE_DATA(node) \ + ((void*)(node + 1)) + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Helper functions */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Allocates memory for a new list node. + * + * @param list A pointer to the `ZyanList` instance. + * @param node Receives a pointer to the new `ZyanListNode` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZyanListAllocateNode(ZyanList* list, ZyanListNode** node) +{ + ZYAN_ASSERT(list); + ZYAN_ASSERT(node); + + const ZyanBool is_dynamic = (list->allocator != ZYAN_NULL); + if (is_dynamic) + { + ZYAN_ASSERT(list->allocator->allocate); + ZYAN_CHECK(list->allocator->allocate(list->allocator, (void**)node, + sizeof(ZyanListNode) + list->element_size, 1)); + } else + { + if (list->first_unused) + { + *node = list->first_unused; + list->first_unused = (*node)->next; + } else + { + const ZyanUSize size = list->size * (sizeof(ZyanListNode) + list->element_size); + if (size + (sizeof(ZyanListNode) + list->element_size) > list->capacity) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + *node = (ZyanListNode*)((ZyanU8*)list->buffer + size); + } + } + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Frees memory of a node. + * + * @param list A pointer to the `ZyanList` instance. + * @param node A pointer to the `ZyanListNode` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZyanListDeallocateNode(ZyanList* list, ZyanListNode* node) +{ + ZYAN_ASSERT(list); + ZYAN_ASSERT(node); + + const ZyanBool is_dynamic = (list->allocator != ZYAN_NULL); + if (is_dynamic) + { + ZYAN_ASSERT(list->allocator->deallocate); + ZYAN_CHECK(list->allocator->deallocate(list->allocator, (void*)node, + sizeof(ZyanListNode) + list->element_size, 1)); + } else + { + node->next = list->first_unused; + list->first_unused = node; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constructor and destructor */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +ZYAN_REQUIRES_LIBC ZyanStatus ZyanListInit(ZyanList* list, ZyanUSize element_size, + ZyanMemberProcedure destructor) +{ + return ZyanListInitEx(list, element_size, destructor, ZyanAllocatorDefault()); +} + +#endif // ZYAN_NO_LIBC + +ZyanStatus ZyanListInitEx(ZyanList* list, ZyanUSize element_size, ZyanMemberProcedure destructor, + ZyanAllocator* allocator) +{ + if (!list || !element_size || !allocator) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + list->allocator = allocator; + list->size = 0; + list->element_size = element_size; + list->destructor = destructor; + list->head = ZYAN_NULL; + list->tail = ZYAN_NULL; + list->buffer = ZYAN_NULL; + list->capacity = 0; + list->first_unused = ZYAN_NULL; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListInitCustomBuffer(ZyanList* list, ZyanUSize element_size, + ZyanMemberProcedure destructor, void* buffer, ZyanUSize capacity) +{ + if (!list || !element_size || !buffer || !capacity) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + list->allocator = ZYAN_NULL; + list->size = 0; + list->element_size = element_size; + list->destructor = destructor; + list->head = ZYAN_NULL; + list->tail = ZYAN_NULL; + list->buffer = buffer; + list->capacity = capacity; + list->first_unused = ZYAN_NULL; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListDestroy(ZyanList* list) +{ + if (!list) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_ASSERT(list->element_size); + + const ZyanBool is_dynamic = (list->allocator != ZYAN_NULL); + ZyanListNode* node = (is_dynamic || list->destructor) ? list->head : ZYAN_NULL; + while (node) + { + if (list->destructor) + { + list->destructor(ZYCORE_LIST_GET_NODE_DATA(node)); + } + + ZyanListNode* const next = node->next; + + if (is_dynamic) + { + ZYAN_CHECK(list->allocator->deallocate(list->allocator, node, + sizeof(ZyanListNode) + list->element_size, 1)); + } + + node = next; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Duplication */ +/* ---------------------------------------------------------------------------------------------- */ + + + +/* ---------------------------------------------------------------------------------------------- */ +/* Item access */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanListGetHeadNode(const ZyanList* list, const ZyanListNode** node) +{ + if (!list) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *node = list->head; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListGetTailNode(const ZyanList* list, const ZyanListNode** node) +{ + if (!list) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *node = list->tail; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListGetPrevNode(const ZyanListNode** node) +{ + if (!node || !*node) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *node = (*node)->prev; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListGetNextNode(const ZyanListNode** node) +{ + if (!node || !*node) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *node = (*node)->next; + + return ZYAN_STATUS_SUCCESS; +} + +const void* ZyanListGetNodeData(const ZyanListNode* node) +{ + if (!node) + { + return ZYAN_NULL; + } + + return (const void*)ZYCORE_LIST_GET_NODE_DATA(node); +} + +ZyanStatus ZyanListGetNodeDataEx(const ZyanListNode* node, const void** value) +{ + if (!node) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *value = (const void*)ZYCORE_LIST_GET_NODE_DATA(node); + + return ZYAN_STATUS_SUCCESS; +} + +void* ZyanListGetNodeDataMutable(const ZyanListNode* node) +{ + if (!node) + { + return ZYAN_NULL; + } + + return ZYCORE_LIST_GET_NODE_DATA(node); +} + +ZyanStatus ZyanListGetNodeDataMutableEx(const ZyanListNode* node, void** value) +{ + if (!node) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *value = ZYCORE_LIST_GET_NODE_DATA(node); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListSetNodeData(const ZyanList* list, const ZyanListNode* node, const void* value) +{ + if (!list || !node || !value) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (list->destructor) + { + list->destructor(ZYCORE_LIST_GET_NODE_DATA(node)); + } + + ZYAN_ASSERT(list->element_size); + ZYAN_MEMCPY(ZYCORE_LIST_GET_NODE_DATA(node), value, list->element_size); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Insertion */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanListPushBack(ZyanList* list, const void* item) +{ + if (!list || !item) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanListNode* node; + ZYAN_CHECK(ZyanListAllocateNode(list, &node)); + node->prev = list->tail; + node->next = ZYAN_NULL; + + ZYAN_MEMCPY(ZYCORE_LIST_GET_NODE_DATA(node), item, list->element_size); + + if (!list->head) + { + list->head = node; + list->tail = node; + } else + { + list->tail->next = node; + list->tail = node; + } + ++list->size; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListPushFront(ZyanList* list, const void* item) +{ + if (!list || !item) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanListNode* node; + ZYAN_CHECK(ZyanListAllocateNode(list, &node)); + node->prev = ZYAN_NULL; + node->next = list->head; + + ZYAN_MEMCPY(ZYCORE_LIST_GET_NODE_DATA(node), item, list->element_size); + + if (!list->head) + { + list->head = node; + list->tail = node; + } else + { + list->head->prev= node; + list->head = node; + } + ++list->size; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListEmplaceBack(ZyanList* list, void** item, ZyanMemberFunction constructor) +{ + if (!list || !item) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanListNode* node; + ZYAN_CHECK(ZyanListAllocateNode(list, &node)); + node->prev = list->tail; + node->next = ZYAN_NULL; + + *item = ZYCORE_LIST_GET_NODE_DATA(node); + if (constructor) + { + constructor(*item); + } + + if (!list->head) + { + list->head = node; + list->tail = node; + } else + { + list->tail->next = node; + list->tail = node; + } + ++list->size; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListEmplaceFront(ZyanList* list, void** item, ZyanMemberFunction constructor) +{ + if (!list || !item) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZyanListNode* node; + ZYAN_CHECK(ZyanListAllocateNode(list, &node)); + node->prev = ZYAN_NULL; + node->next = list->head; + + *item = ZYCORE_LIST_GET_NODE_DATA(node); + if (constructor) + { + constructor(*item); + } + + if (!list->head) + { + list->head = node; + list->tail = node; + } else + { + list->head->prev= node; + list->head = node; + } + ++list->size; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Deletion */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanListPopBack(ZyanList* list) +{ + if (!list) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (!list->tail) + { + return ZYAN_STATUS_INVALID_OPERATION; + } + + ZyanListNode* const node = list->tail; + + if (list->destructor) + { + list->destructor(ZYCORE_LIST_GET_NODE_DATA(node)); + } + + list->tail = node->prev; + if (list->tail) + { + list->tail->next = ZYAN_NULL; + } + if (list->head == node) + { + list->head = list->tail; + } + --list->size; + + return ZyanListDeallocateNode(list, node); +} + +ZyanStatus ZyanListPopFront(ZyanList* list) +{ + if (!list) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (!list->head) + { + return ZYAN_STATUS_INVALID_OPERATION; + } + + ZyanListNode* const node = list->head; + + if (list->destructor) + { + list->destructor(ZYCORE_LIST_GET_NODE_DATA(node)); + } + + list->head = node->next; + if (list->head) + { + list->head->prev = ZYAN_NULL; + } + if (list->tail == node) + { + list->tail = list->head; + } + --list->size; + + return ZyanListDeallocateNode(list, node); +} + +ZyanStatus ZyanListRemove(ZyanList* list, const ZyanListNode* node) +{ + ZYAN_UNUSED(list); + ZYAN_UNUSED(node); + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListRemoveRange(ZyanList* list, const ZyanListNode* first, const ZyanListNode* last) +{ + ZYAN_UNUSED(list); + ZYAN_UNUSED(first); + ZYAN_UNUSED(last); + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanListClear(ZyanList* list) +{ + return ZyanListResizeEx(list, 0, ZYAN_NULL); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Searching */ +/* ---------------------------------------------------------------------------------------------- */ + + + +/* ---------------------------------------------------------------------------------------------- */ +/* Memory management */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanListResize(ZyanList* list, ZyanUSize size) +{ + return ZyanListResizeEx(list, size, ZYAN_NULL); +} + +ZyanStatus ZyanListResizeEx(ZyanList* list, ZyanUSize size, const void* initializer) +{ + if (!list) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (size == list->size) + { + return ZYAN_STATUS_SUCCESS; + } + + if (size == 0) + { + const ZyanBool is_dynamic = (list->allocator != ZYAN_NULL); + ZyanListNode* node = (is_dynamic || list->destructor) ? list->head : ZYAN_NULL; + while (node) + { + if (list->destructor) + { + list->destructor(ZYCORE_LIST_GET_NODE_DATA(node)); + } + + ZyanListNode* const next = node->next; + + if (is_dynamic) + { + ZYAN_CHECK(list->allocator->deallocate(list->allocator, node, + sizeof(ZyanListNode) + list->element_size, 1)); + } + + node = next; + } + + list->size = 0; + list->head = 0; + list->tail = 0; + list->first_unused = ZYAN_NULL; + + return ZYAN_STATUS_SUCCESS; + } + + if (size > list->size) + { + ZyanListNode* node; + for (ZyanUSize i = list->size; i < size; ++i) + { + ZYAN_CHECK(ZyanListAllocateNode(list, &node)); + node->prev = list->tail; + node->next = ZYAN_NULL; + + if (initializer) + { + ZYAN_MEMCPY(ZYCORE_LIST_GET_NODE_DATA(node), initializer, list->element_size); + } + + if (!list->head) + { + list->head = node; + list->tail = node; + } else + { + list->tail->next = node; + list->tail = node; + } + + // `ZyanListAllocateNode` needs the list size + ++list->size; + } + } else + { + for (ZyanUSize i = size; i < list->size; ++i) + { + ZyanListNode* const node = list->tail; + + if (list->destructor) + { + list->destructor(ZYCORE_LIST_GET_NODE_DATA(node)); + } + + list->tail = node->prev; + if (list->tail) + { + list->tail->next = ZYAN_NULL; + } + + ZYAN_CHECK(ZyanListDeallocateNode(list, node)); + } + + list->size = size; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Information */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanListGetSize(const ZyanList* list, ZyanUSize* size) +{ + if (!list) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *size = list->size; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/dependencies/zycore/src/String.c b/3rdparty/zydis/dependencies/zycore/src/String.c new file mode 100644 index 0000000000..9dce43f4ed --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/String.c @@ -0,0 +1,1098 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* Internal macros */ +/* ============================================================================================== */ + +/** + * Writes a terminating '\0' character at the end of the string data. + */ +#define ZYCORE_STRING_NULLTERMINATE(string) \ + *(char*)((ZyanU8*)(string)->vector.data + (string)->vector.size - 1) = '\0'; + +/** + * Checks for a terminating '\0' character at the end of the string data. + */ +#define ZYCORE_STRING_ASSERT_NULLTERMINATION(string) \ + ZYAN_ASSERT(*(char*)((ZyanU8*)(string)->vector.data + (string)->vector.size - 1) == '\0'); + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constructor and destructor */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +ZyanStatus ZyanStringInit(ZyanString* string, ZyanUSize capacity) +{ + return ZyanStringInitEx(string, capacity, ZyanAllocatorDefault(), + ZYAN_STRING_DEFAULT_GROWTH_FACTOR, ZYAN_STRING_DEFAULT_SHRINK_THRESHOLD); +} + +#endif // ZYAN_NO_LIBC + +ZyanStatus ZyanStringInitEx(ZyanString* string, ZyanUSize capacity, ZyanAllocator* allocator, + ZyanU8 growth_factor, ZyanU8 shrink_threshold) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + string->flags = 0; + capacity = ZYAN_MAX(ZYAN_STRING_MIN_CAPACITY, capacity) + 1; + ZYAN_CHECK(ZyanVectorInitEx(&string->vector, sizeof(char), capacity, ZYAN_NULL, allocator, + growth_factor, shrink_threshold)); + ZYAN_ASSERT(string->vector.capacity >= capacity); + // Some of the string code relies on `sizeof(char) == 1` + ZYAN_ASSERT(string->vector.element_size == 1); + + *(char*)string->vector.data = '\0'; + ++string->vector.size; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringInitCustomBuffer(ZyanString* string, char* buffer, ZyanUSize capacity) +{ + if (!string || !capacity) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + string->flags = ZYAN_STRING_HAS_FIXED_CAPACITY; + ZYAN_CHECK(ZyanVectorInitCustomBuffer(&string->vector, sizeof(char), (void*)buffer, capacity, + ZYAN_NULL)); + ZYAN_ASSERT(string->vector.capacity == capacity); + // Some of the string code relies on `sizeof(char) == 1` + ZYAN_ASSERT(string->vector.element_size == 1); + + *(char*)string->vector.data = '\0'; + ++string->vector.size; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringDestroy(ZyanString* string) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (string->flags & ZYAN_STRING_HAS_FIXED_CAPACITY) + { + return ZYAN_STATUS_SUCCESS; + } + + return ZyanVectorDestroy(&string->vector); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Duplication */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +ZyanStatus ZyanStringDuplicate(ZyanString* destination, const ZyanStringView* source, + ZyanUSize capacity) +{ + return ZyanStringDuplicateEx(destination, source, capacity, ZyanAllocatorDefault(), + ZYAN_STRING_DEFAULT_GROWTH_FACTOR, ZYAN_STRING_DEFAULT_SHRINK_THRESHOLD); +} + +#endif // ZYAN_NO_LIBC + +ZyanStatus ZyanStringDuplicateEx(ZyanString* destination, const ZyanStringView* source, + ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold) +{ + if (!source || !source->string.vector.size) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanUSize len = source->string.vector.size; + capacity = ZYAN_MAX(capacity, len - 1); + ZYAN_CHECK(ZyanStringInitEx(destination, capacity, allocator, growth_factor, shrink_threshold)); + ZYAN_ASSERT(destination->vector.capacity >= len); + + ZYAN_MEMCPY(destination->vector.data, source->string.vector.data, + source->string.vector.size - 1); + destination->vector.size = len; + ZYCORE_STRING_NULLTERMINATE(destination); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringDuplicateCustomBuffer(ZyanString* destination, const ZyanStringView* source, + char* buffer, ZyanUSize capacity) +{ + if (!source || !source->string.vector.size) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanUSize len = source->string.vector.size; + if (capacity < len) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_CHECK(ZyanStringInitCustomBuffer(destination, buffer, capacity)); + ZYAN_ASSERT(destination->vector.capacity >= len); + + ZYAN_MEMCPY(destination->vector.data, source->string.vector.data, + source->string.vector.size - 1); + destination->vector.size = len; + ZYCORE_STRING_NULLTERMINATE(destination); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Concatenation */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +ZyanStatus ZyanStringConcat(ZyanString* destination, const ZyanStringView* s1, + const ZyanStringView* s2, ZyanUSize capacity) +{ + return ZyanStringConcatEx(destination, s1, s2, capacity, ZyanAllocatorDefault(), + ZYAN_STRING_DEFAULT_GROWTH_FACTOR, ZYAN_STRING_DEFAULT_SHRINK_THRESHOLD); +} + +#endif // ZYAN_NO_LIBC + +ZyanStatus ZyanStringConcatEx(ZyanString* destination, const ZyanStringView* s1, + const ZyanStringView* s2, ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor, + ZyanU8 shrink_threshold) +{ + if (!s1 || !s2 || !s1->string.vector.size || !s2->string.vector.size) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanUSize len = s1->string.vector.size + s2->string.vector.size - 1; + capacity = ZYAN_MAX(capacity, len - 1); + ZYAN_CHECK(ZyanStringInitEx(destination, capacity, allocator, growth_factor, shrink_threshold)); + ZYAN_ASSERT(destination->vector.capacity >= len); + + ZYAN_MEMCPY(destination->vector.data, s1->string.vector.data, s1->string.vector.size - 1); + ZYAN_MEMCPY((char*)destination->vector.data + s1->string.vector.size - 1, + s2->string.vector.data, s2->string.vector.size - 1); + destination->vector.size = len; + ZYCORE_STRING_NULLTERMINATE(destination); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringConcatCustomBuffer(ZyanString* destination, const ZyanStringView* s1, + const ZyanStringView* s2, char* buffer, ZyanUSize capacity) +{ + if (!s1 || !s2 || !s1->string.vector.size || !s2->string.vector.size) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanUSize len = s1->string.vector.size + s2->string.vector.size - 1; + if (capacity < len) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_CHECK(ZyanStringInitCustomBuffer(destination, buffer, capacity)); + ZYAN_ASSERT(destination->vector.capacity >= len); + + ZYAN_MEMCPY(destination->vector.data, s1->string.vector.data, s1->string.vector.size - 1); + ZYAN_MEMCPY((char*)destination->vector.data + s1->string.vector.size - 1, + s2->string.vector.data, s2->string.vector.size - 1); + destination->vector.size = len; + ZYCORE_STRING_NULLTERMINATE(destination); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Views */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringViewInsideView(ZyanStringView* view, const ZyanStringView* source) +{ + if (!view || !source) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + view->string.vector.data = source->string.vector.data; + view->string.vector.size = source->string.vector.size; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringViewInsideViewEx(ZyanStringView* view, const ZyanStringView* source, + ZyanUSize index, ZyanUSize count) +{ + if (!view || !source) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (index + count >= source->string.vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + view->string.vector.data = (void*)((char*)source->string.vector.data + index); + view->string.vector.size = count; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringViewInsideBuffer(ZyanStringView* view, const char* string) +{ + if (!view || !string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + view->string.vector.data = (void*)string; + view->string.vector.size = ZYAN_STRLEN(string) + 1; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringViewInsideBufferEx(ZyanStringView* view, const char* buffer, ZyanUSize length) +{ + if (!view || !buffer || !length) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + view->string.vector.data = (void*)buffer; + view->string.vector.size = length + 1; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringViewGetSize(const ZyanStringView* view, ZyanUSize* size) +{ + if (!view || !size) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_ASSERT(view->string.vector.size >= 1); + *size = view->string.vector.size - 1; + + return ZYAN_STATUS_SUCCESS; +} + +ZYCORE_EXPORT ZyanStatus ZyanStringViewGetData(const ZyanStringView* view, const char** buffer) +{ + if (!view || !buffer) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *buffer = view->string.vector.data; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Character access */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringGetChar(const ZyanStringView* string, ZyanUSize index, char* value) +{ + if (!string || !value) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow direct access to the terminating '\0' character + if (index + 1 >= string->string.vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + const char* chr; + ZYAN_CHECK(ZyanVectorGetPointer(&string->string.vector, index, (const void**)&chr)); + *value = *chr; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringGetCharMutable(ZyanString* string, ZyanUSize index, char** value) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow direct access to the terminating '\0' character + if (index + 1 >= string->vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + return ZyanVectorGetPointerMutable(&string->vector, index, (void**)value); +} + +ZyanStatus ZyanStringSetChar(ZyanString* string, ZyanUSize index, char value) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow direct access to the terminating '\0' character + if (index + 1 >= string->vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + return ZyanVectorSet(&string->vector, index, (void*)&value); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Insertion */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringInsert(ZyanString* destination, ZyanUSize index, const ZyanStringView* source) +{ + if (!destination || !source || !source->string.vector.size) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (index == destination->vector.size) + { + return ZyanStringAppend(destination, source); + } + + // Don't allow insertion after the terminating '\0' character + if (index >= destination->vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZYAN_CHECK(ZyanVectorInsertRange(&destination->vector, index, source->string.vector.data, + source->string.vector.size - 1)); + ZYCORE_STRING_ASSERT_NULLTERMINATION(destination); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringInsertEx(ZyanString* destination, ZyanUSize destination_index, + const ZyanStringView* source, ZyanUSize source_index, ZyanUSize count) +{ + if (!destination || !source || !source->string.vector.size) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (destination_index == destination->vector.size) + { + return ZyanStringAppendEx(destination, source, source_index, count); + } + + // Don't allow insertion after the terminating '\0' character + if (destination_index >= destination->vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + // Don't allow access to the terminating '\0' character + if (source_index + count >= source->string.vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZYAN_CHECK(ZyanVectorInsertRange(&destination->vector, destination_index, + (char*)source->string.vector.data + source_index, count)); + ZYCORE_STRING_ASSERT_NULLTERMINATION(destination); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Appending */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringAppend(ZyanString* destination, const ZyanStringView* source) +{ + if (!destination || !source || !source->string.vector.size) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanUSize len = destination->vector.size; + ZYAN_CHECK(ZyanVectorResize(&destination->vector, len + source->string.vector.size - 1)); + ZYAN_MEMCPY((char*)destination->vector.data + len - 1, source->string.vector.data, + source->string.vector.size - 1); + ZYCORE_STRING_NULLTERMINATE(destination); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringAppendEx(ZyanString* destination, const ZyanStringView* source, + ZyanUSize source_index, ZyanUSize count) +{ + if (!destination || !source || !source->string.vector.size) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow access to the terminating '\0' character + if (source_index + count >= source->string.vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + const ZyanUSize len = destination->vector.size; + ZYAN_CHECK(ZyanVectorResize(&destination->vector, len + count)); + ZYAN_MEMCPY((char*)destination->vector.data + len - 1, + (const char*)source->string.vector.data + source_index, count); + ZYCORE_STRING_NULLTERMINATE(destination); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Deletion */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringDelete(ZyanString* string, ZyanUSize index, ZyanUSize count) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow removal of the terminating '\0' character + if (index + count >= string->vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZYAN_CHECK(ZyanVectorDeleteRange(&string->vector, index, count)); + ZYCORE_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringTruncate(ZyanString* string, ZyanUSize index) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow removal of the terminating '\0' character + if (index >= string->vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZYAN_CHECK(ZyanVectorDeleteRange(&string->vector, index, string->vector.size - index - 1)); + ZYCORE_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringClear(ZyanString* string) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_CHECK(ZyanVectorClear(&string->vector)); + // `ZyanVector` guarantees a minimum capacity of 1 element/character + ZYAN_ASSERT(string->vector.capacity >= 1); + + *(char*)string->vector.data = '\0'; + string->vector.size++; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Searching */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringLPos(const ZyanStringView* haystack, const ZyanStringView* needle, + ZyanISize* found_index) +{ + if (!haystack) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanStringLPosEx(haystack, needle, found_index, 0, haystack->string.vector.size - 1); +} + +ZyanStatus ZyanStringLPosEx(const ZyanStringView* haystack, const ZyanStringView* needle, + ZyanISize* found_index, ZyanUSize index, ZyanUSize count) +{ + if (!haystack || !needle || !found_index) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow access to the terminating '\0' character + if (index + count >= haystack->string.vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + if ((haystack->string.vector.size == 1) || (needle->string.vector.size == 1) || + (haystack->string.vector.size < needle->string.vector.size)) + { + *found_index = -1; + return ZYAN_STATUS_FALSE; + } + + const char* s = (const char*)haystack->string.vector.data + index; + const char* b = (const char*)needle->string.vector.data; + for (; s + 1 < (const char*)haystack->string.vector.data + haystack->string.vector.size; ++s) + { + if (*s != *b) + { + continue; + } + const char* a = s; + for (;;) + { + if ((ZyanUSize)(a - (const char*)haystack->string.vector.data) > index + count) + { + *found_index = -1; + return ZYAN_STATUS_FALSE; + } + if (*b == 0) + { + *found_index = (ZyanISize)(s - (const char*)haystack->string.vector.data); + return ZYAN_STATUS_TRUE; + } + if (*a++ != *b++) + { + break; + } + } + b = (char*)needle->string.vector.data; + } + + *found_index = -1; + return ZYAN_STATUS_FALSE; +} + +ZyanStatus ZyanStringLPosI(const ZyanStringView* haystack, const ZyanStringView* needle, + ZyanISize* found_index) +{ + if (!haystack) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanStringLPosIEx(haystack, needle, found_index, 0, haystack->string.vector.size - 1); +} + +ZyanStatus ZyanStringLPosIEx(const ZyanStringView* haystack, const ZyanStringView* needle, + ZyanISize* found_index, ZyanUSize index, ZyanUSize count) +{ + // This solution assumes that characters are represented using ASCII representation, i.e., + // codes for 'a', 'b', 'c', .. 'z' are 97, 98, 99, .. 122 respectively. And codes for 'A', + // 'B', 'C', .. 'Z' are 65, 66, .. 95 respectively. + + if (!haystack || !needle || !found_index) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow access to the terminating '\0' character + if (index + count >= haystack->string.vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + if ((haystack->string.vector.size == 1) || (needle->string.vector.size == 1) || + (haystack->string.vector.size < needle->string.vector.size)) + { + *found_index = -1; + return ZYAN_STATUS_FALSE; + } + + const char* s = (const char*)haystack->string.vector.data + index; + const char* b = (const char*)needle->string.vector.data; + for (; s + 1 < (const char*)haystack->string.vector.data + haystack->string.vector.size; ++s) + { + if ((*s != *b) && ((*s ^ 32) != *b)) + { + continue; + } + const char* a = s; + for (;;) + { + if ((ZyanUSize)(a - (const char*)haystack->string.vector.data) > index + count) + { + *found_index = -1; + return ZYAN_STATUS_FALSE; + } + if (*b == 0) + { + *found_index = (ZyanISize)(s - (const char*)haystack->string.vector.data); + return ZYAN_STATUS_TRUE; + } + const char c1 = *a++; + const char c2 = *b++; + if ((c1 != c2) && ((c1 ^ 32) != c2)) + { + break; + } + } + b = (char*)needle->string.vector.data; + } + + *found_index = -1; + return ZYAN_STATUS_FALSE; +} + +ZyanStatus ZyanStringRPos(const ZyanStringView* haystack, const ZyanStringView* needle, + ZyanISize* found_index) +{ + if (!haystack) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanStringRPosEx(haystack, needle, found_index, haystack->string.vector.size - 1, + haystack->string.vector.size - 1); +} + +ZyanStatus ZyanStringRPosEx(const ZyanStringView* haystack, const ZyanStringView* needle, + ZyanISize* found_index, ZyanUSize index, ZyanUSize count) +{ + if (!haystack || !needle || !found_index) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow access to the terminating '\0' character + if ((index >= haystack->string.vector.size) || (count > index)) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + if (!index || !count || + (haystack->string.vector.size == 1) || (needle->string.vector.size == 1) || + (haystack->string.vector.size < needle->string.vector.size)) + { + *found_index = -1; + return ZYAN_STATUS_FALSE; + } + + const char* s = (const char*)haystack->string.vector.data + index - 1; + const char* b = (const char*)needle->string.vector.data + needle->string.vector.size - 2; + for (; s >= (const char*)haystack->string.vector.data; --s) + { + if (*s != *b) + { + continue; + } + const char* a = s; + for (;;) + { + if (b < (const char*)needle->string.vector.data) + { + *found_index = (ZyanISize)(a - (const char*)haystack->string.vector.data + 1); + return ZYAN_STATUS_TRUE; + } + if (a < (const char*)haystack->string.vector.data + index - count) + { + *found_index = -1; + return ZYAN_STATUS_FALSE; + } + if (*a-- != *b--) + { + break; + } + } + b = (char*)needle->string.vector.data + needle->string.vector.size - 2; + } + + *found_index = -1; + return ZYAN_STATUS_FALSE; +} + +ZyanStatus ZyanStringRPosI(const ZyanStringView* haystack, const ZyanStringView* needle, + ZyanISize* found_index) +{ + if (!haystack) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanStringRPosIEx(haystack, needle, found_index, haystack->string.vector.size - 1, + haystack->string.vector.size - 1); +} + +ZyanStatus ZyanStringRPosIEx(const ZyanStringView* haystack, const ZyanStringView* needle, + ZyanISize* found_index, ZyanUSize index, ZyanUSize count) +{ + // This solution assumes that characters are represented using ASCII representation, i.e., + // codes for 'a', 'b', 'c', .. 'z' are 97, 98, 99, .. 122 respectively. And codes for 'A', + // 'B', 'C', .. 'Z' are 65, 66, .. 95 respectively. + + if (!haystack || !needle || !found_index) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow access to the terminating '\0' character + if ((index >= haystack->string.vector.size) || (count > index)) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + if (!index || !count || + (haystack->string.vector.size == 1) || (needle->string.vector.size == 1) || + (haystack->string.vector.size < needle->string.vector.size)) + { + *found_index = -1; + return ZYAN_STATUS_FALSE; + } + + const char* s = (const char*)haystack->string.vector.data + index - 1; + const char* b = (const char*)needle->string.vector.data + needle->string.vector.size - 2; + for (; s >= (const char*)haystack->string.vector.data; --s) + { + if ((*s != *b) && ((*s ^ 32) != *b)) + { + continue; + } + const char* a = s; + for (;;) + { + if (b < (const char*)needle->string.vector.data) + { + *found_index = (ZyanISize)(a - (const char*)haystack->string.vector.data + 1); + return ZYAN_STATUS_TRUE; + } + if (a < (const char*)haystack->string.vector.data + index - count) + { + *found_index = -1; + return ZYAN_STATUS_FALSE; + } + const char c1 = *a--; + const char c2 = *b--; + if ((c1 != c2) && ((c1 ^ 32) != c2)) + { + break; + } + } + b = (char*)needle->string.vector.data + needle->string.vector.size - 2; + } + + *found_index = -1; + return ZYAN_STATUS_FALSE; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Comparing */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringCompare(const ZyanStringView* s1, const ZyanStringView* s2, ZyanI32* result) +{ + if (!s1 || !s2) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (s1->string.vector.size < s2->string.vector.size) + { + *result = -1; + return ZYAN_STATUS_FALSE; + } + if (s1->string.vector.size > s2->string.vector.size) + { + *result = 1; + return ZYAN_STATUS_FALSE; + } + + const char* const a = (char*)s1->string.vector.data; + const char* const b = (char*)s2->string.vector.data; + ZyanUSize i; + for (i = 0; (i + 1 < s1->string.vector.size) && (i + 1 < s2->string.vector.size); ++i) + { + if (a[i] == b[i]) + { + continue; + } + break; + } + + if (a[i] == b[i]) + { + *result = 0; + return ZYAN_STATUS_TRUE; + } + + if ((a[i] | 32) < (b[i] | 32)) + { + *result = -1; + return ZYAN_STATUS_FALSE; + } + + *result = 1; + return ZYAN_STATUS_FALSE; +} + +ZyanStatus ZyanStringCompareI(const ZyanStringView* s1, const ZyanStringView* s2, ZyanI32* result) +{ + // This solution assumes that characters are represented using ASCII representation, i.e., + // codes for 'a', 'b', 'c', .. 'z' are 97, 98, 99, .. 122 respectively. And codes for 'A', + // 'B', 'C', .. 'Z' are 65, 66, .. 95 respectively. + + if (!s1 || !s2) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (s1->string.vector.size < s2->string.vector.size) + { + *result = -1; + return ZYAN_STATUS_FALSE; + } + if (s1->string.vector.size > s2->string.vector.size) + { + *result = 1; + return ZYAN_STATUS_FALSE; + } + + const char* const a = (char*)s1->string.vector.data; + const char* const b = (char*)s2->string.vector.data; + ZyanUSize i; + for (i = 0; (i + 1 < s1->string.vector.size) && (i + 1 < s2->string.vector.size); ++i) + { + if ((a[i] == b[i]) || ((a[i] ^ 32) == b[i])) + { + continue; + } + break; + } + + if (a[i] == b[i]) + { + *result = 0; + return ZYAN_STATUS_TRUE; + } + + if ((a[i] | 32) < (b[i] | 32)) + { + *result = -1; + return ZYAN_STATUS_FALSE; + } + + *result = 1; + return ZYAN_STATUS_FALSE; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Case conversion */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringToLowerCase(ZyanString* string) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanStringToLowerCaseEx(string, 0, string->vector.size - 1); +} + +ZyanStatus ZyanStringToLowerCaseEx(ZyanString* string, ZyanUSize index, ZyanUSize count) +{ + // This solution assumes that characters are represented using ASCII representation, i.e., + // codes for 'a', 'b', 'c', .. 'z' are 97, 98, 99, .. 122 respectively. And codes for 'A', + // 'B', 'C', .. 'Z' are 65, 66, .. 95 respectively. + + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow access to the terminating '\0' character + if (index + count >= string->vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + char* s = (char*)string->vector.data + index; + for (ZyanUSize i = index; i < index + count; ++i) + { + const char c = *s; + if ((c >= 'A') && (c <= 'Z')) + { + *s = c | 32; + } + ++s; + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringToUpperCase(ZyanString* string) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanStringToUpperCaseEx(string, 0, string->vector.size - 1); +} + +ZyanStatus ZyanStringToUpperCaseEx(ZyanString* string, ZyanUSize index, ZyanUSize count) +{ + // This solution assumes that characters are represented using ASCII representation, i.e., + // codes for 'a', 'b', 'c', .. 'z' are 97, 98, 99, .. 122 respectively. And codes for 'A', + // 'B', 'C', .. 'Z' are 65, 66, .. 95 respectively. + + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + // Don't allow access to the terminating '\0' character + if (index + count >= string->vector.size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + char* s = (char*)string->vector.data + index; + for (ZyanUSize i = index; i < index + count; ++i) + { + const char c = *s; + if ((c >= 'a') && (c <= 'z')) + { + *s = c & ~32; + } + ++s; + } + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Memory management */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringResize(ZyanString* string, ZyanUSize size) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_CHECK(ZyanVectorResize(&string->vector, size + 1)); + ZYCORE_STRING_NULLTERMINATE(string); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringReserve(ZyanString* string, ZyanUSize capacity) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanVectorReserve(&string->vector, capacity); +} + +ZyanStatus ZyanStringShrinkToFit(ZyanString* string) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanVectorShrinkToFit(&string->vector); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Information */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanStringGetCapacity(const ZyanString* string, ZyanUSize* capacity) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_ASSERT(string->vector.capacity >= 1); + *capacity = string->vector.capacity - 1; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringGetSize(const ZyanString* string, ZyanUSize* size) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_ASSERT(string->vector.size >= 1); + *size = string->vector.size - 1; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanStringGetData(const ZyanString* string, const char** value) +{ + if (!string) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *value = string->vector.data; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/dependencies/zycore/src/Vector.c b/3rdparty/zydis/dependencies/zycore/src/Vector.c new file mode 100644 index 0000000000..f92c9de0d9 --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/Vector.c @@ -0,0 +1,846 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* Internal macros */ +/* ============================================================================================== */ + +/** + * Checks, if the passed vector should grow. + * + * @param size The desired size of the vector. + * @param capacity The current capacity of the vector. + * + * @return `ZYAN_TRUE`, if the vector should grow or `ZYAN_FALSE`, if not. + */ +#define ZYCORE_VECTOR_SHOULD_GROW(size, capacity) \ + ((size) > (capacity)) + +/** + * Checks, if the passed vector should shrink. + * + * @param size The desired size of the vector. + * @param capacity The current capacity of the vector. + * @param threshold The shrink threshold. + * + * @return `ZYAN_TRUE`, if the vector should shrink or `ZYAN_FALSE`, if not. + */ +#define ZYCORE_VECTOR_SHOULD_SHRINK(size, capacity, threshold) \ + (((threshold) != 0) && ((size) * (threshold) < (capacity))) + +/** + * Returns the offset of the element at the given `index`. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The element index. + * + * @return The offset of the element at the given `index`. + */ +#define ZYCORE_VECTOR_OFFSET(vector, index) \ + ((void*)((ZyanU8*)(vector)->data + ((index) * (vector)->element_size))) + +/* ============================================================================================== */ +/* Internal functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Helper functions */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Reallocates the internal buffer of the vector. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param capacity The new capacity. + * + * @return A zyan status code. + */ +static ZyanStatus ZyanVectorReallocate(ZyanVector* vector, ZyanUSize capacity) +{ + ZYAN_ASSERT(vector); + ZYAN_ASSERT(vector->capacity >= ZYAN_VECTOR_MIN_CAPACITY); + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + if (!vector->allocator) + { + if (vector->capacity < capacity) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + return ZYAN_STATUS_SUCCESS; + } + + ZYAN_ASSERT(vector->allocator); + ZYAN_ASSERT(vector->allocator->reallocate); + + if (capacity < ZYAN_VECTOR_MIN_CAPACITY) + { + if (vector->capacity > ZYAN_VECTOR_MIN_CAPACITY) + { + capacity = ZYAN_VECTOR_MIN_CAPACITY; + } else + { + return ZYAN_STATUS_SUCCESS; + } + } + + vector->capacity = capacity; + ZYAN_CHECK(vector->allocator->reallocate(vector->allocator, &vector->data, + vector->element_size, vector->capacity)); + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Shifts all elements starting at the specified `index` by the amount of `count` to the left. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The start index. + * @param count The amount of shift operations. + * + * @return A zyan status code. + */ +static ZyanStatus ZyanVectorShiftLeft(ZyanVector* vector, ZyanUSize index, ZyanUSize count) +{ + ZYAN_ASSERT(vector); + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + ZYAN_ASSERT(count > 0); + //ZYAN_ASSERT((ZyanISize)count - (ZyanISize)index + 1 >= 0); + + const void* const source = ZYCORE_VECTOR_OFFSET(vector, index + count); + void* const dest = ZYCORE_VECTOR_OFFSET(vector, index); + const ZyanUSize size = (vector->size - index - count) * vector->element_size; + ZYAN_MEMMOVE(dest, source, size); + + return ZYAN_STATUS_SUCCESS; +} + +/** + * Shifts all elements starting at the specified `index` by the amount of `count` to the right. + * + * @param vector A pointer to the `ZyanVector` instance. + * @param index The start index. + * @param count The amount of shift operations. + * + * @return A zyan status code. + */ +static ZyanStatus ZyanVectorShiftRight(ZyanVector* vector, ZyanUSize index, ZyanUSize count) +{ + ZYAN_ASSERT(vector); + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + ZYAN_ASSERT(count > 0); + ZYAN_ASSERT(vector->size + count <= vector->capacity); + + const void* const source = ZYCORE_VECTOR_OFFSET(vector, index); + void* const dest = ZYCORE_VECTOR_OFFSET(vector, index + count); + const ZyanUSize size = (vector->size - index) * vector->element_size; + ZYAN_MEMMOVE(dest, source, size); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constructor and destructor */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +ZyanStatus ZyanVectorInit(ZyanVector* vector, ZyanUSize element_size, ZyanUSize capacity, + ZyanMemberProcedure destructor) +{ + return ZyanVectorInitEx(vector, element_size, capacity, destructor, ZyanAllocatorDefault(), + ZYAN_VECTOR_DEFAULT_GROWTH_FACTOR, ZYAN_VECTOR_DEFAULT_SHRINK_THRESHOLD); +} + +#endif // ZYAN_NO_LIBC + +ZyanStatus ZyanVectorInitEx(ZyanVector* vector, ZyanUSize element_size, ZyanUSize capacity, + ZyanMemberProcedure destructor, ZyanAllocator* allocator, ZyanU8 growth_factor, + ZyanU8 shrink_threshold) +{ + if (!vector || !element_size || !allocator || (growth_factor < 1)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_ASSERT(allocator->allocate); + + vector->allocator = allocator; + vector->growth_factor = growth_factor; + vector->shrink_threshold = shrink_threshold; + vector->size = 0; + vector->capacity = ZYAN_MAX(ZYAN_VECTOR_MIN_CAPACITY, capacity); + vector->element_size = element_size; + vector->destructor = destructor; + vector->data = ZYAN_NULL; + + return allocator->allocate(vector->allocator, &vector->data, vector->element_size, + vector->capacity); +} + +ZyanStatus ZyanVectorInitCustomBuffer(ZyanVector* vector, ZyanUSize element_size, + void* buffer, ZyanUSize capacity, ZyanMemberProcedure destructor) +{ + if (!vector || !element_size || !buffer || !capacity) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + vector->allocator = ZYAN_NULL; + vector->growth_factor = 1; + vector->shrink_threshold = 0; + vector->size = 0; + vector->capacity = capacity; + vector->element_size = element_size; + vector->destructor = destructor; + vector->data = buffer; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorDestroy(ZyanVector* vector) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + if (vector->destructor) + { + for (ZyanUSize i = 0; i < vector->size; ++i) + { + vector->destructor(ZYCORE_VECTOR_OFFSET(vector, i)); + } + } + + if (vector->allocator && vector->capacity) + { + ZYAN_ASSERT(vector->allocator->deallocate); + ZYAN_CHECK(vector->allocator->deallocate(vector->allocator, vector->data, + vector->element_size, vector->capacity)); + } + + vector->data = ZYAN_NULL; + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Duplication */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifndef ZYAN_NO_LIBC + +ZyanStatus ZyanVectorDuplicate(ZyanVector* destination, const ZyanVector* source, + ZyanUSize capacity) +{ + return ZyanVectorDuplicateEx(destination, source, capacity, ZyanAllocatorDefault(), + ZYAN_VECTOR_DEFAULT_GROWTH_FACTOR, ZYAN_VECTOR_DEFAULT_SHRINK_THRESHOLD); +} + +#endif // ZYAN_NO_LIBC + +ZyanStatus ZyanVectorDuplicateEx(ZyanVector* destination, const ZyanVector* source, + ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold) +{ + if (!source) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanUSize len = source->size; + + capacity = ZYAN_MAX(capacity, len); + ZYAN_CHECK(ZyanVectorInitEx(destination, source->element_size, capacity, source->destructor, + allocator, growth_factor, shrink_threshold)); + ZYAN_ASSERT(destination->capacity >= len); + + ZYAN_MEMCPY(destination->data, source->data, len * source->element_size); + destination->size = len; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorDuplicateCustomBuffer(ZyanVector* destination, const ZyanVector* source, + void* buffer, ZyanUSize capacity) +{ + if (!source) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + const ZyanUSize len = source->size; + + if (capacity < len) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_CHECK(ZyanVectorInitCustomBuffer(destination, source->element_size, buffer, capacity, + source->destructor)); + ZYAN_ASSERT(destination->capacity >= len); + + ZYAN_MEMCPY(destination->data, source->data, len * source->element_size); + destination->size = len; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Element access */ +/* ---------------------------------------------------------------------------------------------- */ + +const void* ZyanVectorGet(const ZyanVector* vector, ZyanUSize index) +{ + if (!vector || (index >= vector->size)) + { + return ZYAN_NULL; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + return ZYCORE_VECTOR_OFFSET(vector, index); +} + +void* ZyanVectorGetMutable(const ZyanVector* vector, ZyanUSize index) +{ + if (!vector || (index >= vector->size)) + { + return ZYAN_NULL; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + return ZYCORE_VECTOR_OFFSET(vector, index); +} + +ZyanStatus ZyanVectorGetPointer(const ZyanVector* vector, ZyanUSize index, const void** value) +{ + if (!vector || !value) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index >= vector->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + *value = (const void*)ZYCORE_VECTOR_OFFSET(vector, index); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorGetPointerMutable(const ZyanVector* vector, ZyanUSize index, void** value) +{ + if (!vector || !value) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index >= vector->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + *value = ZYCORE_VECTOR_OFFSET(vector, index); + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorSet(ZyanVector* vector, ZyanUSize index, const void* value) +{ + if (!vector || !value) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index >= vector->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + void* const offset = ZYCORE_VECTOR_OFFSET(vector, index); + if (vector->destructor) + { + vector->destructor(offset); + } + ZYAN_MEMCPY(offset, value, vector->element_size); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Insertion */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanVectorPushBack(ZyanVector* vector, const void* element) +{ + if (!vector || !element) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + if (ZYCORE_VECTOR_SHOULD_GROW(vector->size + 1, vector->capacity)) + { + ZYAN_CHECK(ZyanVectorReallocate(vector, + ZYAN_MAX(1, (ZyanUSize)((vector->size + 1) * vector->growth_factor)))); + } + + void* const offset = ZYCORE_VECTOR_OFFSET(vector, vector->size); + ZYAN_MEMCPY(offset, element, vector->element_size); + + ++vector->size; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorInsert(ZyanVector* vector, ZyanUSize index, const void* element) +{ + return ZyanVectorInsertRange(vector, index, element, 1); +} + +ZyanStatus ZyanVectorInsertRange(ZyanVector* vector, ZyanUSize index, const void* elements, + ZyanUSize count) +{ + if (!vector || !elements || !count) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index > vector->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + if (ZYCORE_VECTOR_SHOULD_GROW(vector->size + count, vector->capacity)) + { + ZYAN_CHECK(ZyanVectorReallocate(vector, + ZYAN_MAX(1, (ZyanUSize)((vector->size + count) * vector->growth_factor)))); + } + + if (index < vector->size) + { + ZYAN_CHECK(ZyanVectorShiftRight(vector, index, count)); + } + + void* const offset = ZYCORE_VECTOR_OFFSET(vector, index); + ZYAN_MEMCPY(offset, elements, count * vector->element_size); + vector->size += count; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorEmplace(ZyanVector* vector, void** element, ZyanMemberFunction constructor) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanVectorEmplaceEx(vector, vector->size, element, constructor); +} + +ZyanStatus ZyanVectorEmplaceEx(ZyanVector* vector, ZyanUSize index, void** element, + ZyanMemberFunction constructor) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index > vector->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + if (ZYCORE_VECTOR_SHOULD_GROW(vector->size + 1, vector->capacity)) + { + ZYAN_CHECK(ZyanVectorReallocate(vector, + ZYAN_MAX(1, (ZyanUSize)((vector->size + 1) * vector->growth_factor)))); + } + + if (index < vector->size) + { + ZYAN_CHECK(ZyanVectorShiftRight(vector, index, 1)); + } + + *element = ZYCORE_VECTOR_OFFSET(vector, index); + if (constructor) + { + ZYAN_CHECK(constructor(*element)); + } + + ++vector->size; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Utils */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanVectorSwapElements(ZyanVector* vector, ZyanUSize index_first, ZyanUSize index_second) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if ((index_first >= vector->size) || (index_second >= vector->size)) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + if (vector->size == vector->capacity) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + ZyanU64* const t = ZYCORE_VECTOR_OFFSET(vector, vector->size); + ZyanU64* const a = ZYCORE_VECTOR_OFFSET(vector, index_first); + ZyanU64* const b = ZYCORE_VECTOR_OFFSET(vector, index_second); + ZYAN_MEMCPY(t, a, vector->element_size); + ZYAN_MEMCPY(a, b, vector->element_size); + ZYAN_MEMCPY(b, t, vector->element_size); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Deletion */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanVectorDelete(ZyanVector* vector, ZyanUSize index) +{ + return ZyanVectorDeleteRange(vector, index, 1); +} + +ZyanStatus ZyanVectorDeleteRange(ZyanVector* vector, ZyanUSize index, ZyanUSize count) +{ + if (!vector || !count) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (index + count > vector->size) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + if (vector->destructor) + { + for (ZyanUSize i = index; i < index + count; ++i) + { + vector->destructor(ZYCORE_VECTOR_OFFSET(vector, i)); + } + } + + if (index + count < vector->size) + { + ZYAN_CHECK(ZyanVectorShiftLeft(vector, index, count)); + } + + vector->size -= count; + if (ZYCORE_VECTOR_SHOULD_SHRINK(vector->size, vector->capacity, vector->shrink_threshold)) + { + return ZyanVectorReallocate(vector, + ZYAN_MAX(1, (ZyanUSize)(vector->size * vector->growth_factor))); + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorPopBack(ZyanVector* vector) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (vector->size == 0) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + if (vector->destructor) + { + vector->destructor(ZYCORE_VECTOR_OFFSET(vector, vector->size - 1)); + } + + --vector->size; + if (ZYCORE_VECTOR_SHOULD_SHRINK(vector->size, vector->capacity, vector->shrink_threshold)) + { + return ZyanVectorReallocate(vector, + ZYAN_MAX(1, (ZyanUSize)(vector->size * vector->growth_factor))); + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorClear(ZyanVector* vector) +{ + return ZyanVectorResizeEx(vector, 0, ZYAN_NULL); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Searching */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanVectorFind(const ZyanVector* vector, const void* element, ZyanISize* found_index, + ZyanEqualityComparison comparison) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanVectorFindEx(vector, element, found_index, comparison, 0, vector->size); +} + +ZyanStatus ZyanVectorFindEx(const ZyanVector* vector, const void* element, ZyanISize* found_index, + ZyanEqualityComparison comparison, ZyanUSize index, ZyanUSize count) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if ((index + count > vector->size) || (index == vector->size)) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + if (!count) + { + *found_index = -1; + return ZYAN_STATUS_FALSE; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + for (ZyanUSize i = index; i < index + count; ++i) + { + if (comparison(ZYCORE_VECTOR_OFFSET(vector, i), element)) + { + *found_index = i; + return ZYAN_STATUS_TRUE; + } + } + + *found_index = -1; + return ZYAN_STATUS_FALSE; +} + +ZyanStatus ZyanVectorBinarySearch(const ZyanVector* vector, const void* element, + ZyanUSize* found_index, ZyanComparison comparison) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanVectorBinarySearchEx(vector, element, found_index, comparison, 0, vector->size); +} + +ZyanStatus ZyanVectorBinarySearchEx(const ZyanVector* vector, const void* element, + ZyanUSize* found_index, ZyanComparison comparison, ZyanUSize index, ZyanUSize count) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (((index >= vector->size) && (count > 0)) || (index + count > vector->size)) + { + return ZYAN_STATUS_OUT_OF_RANGE; + } + + if (!count) + { + *found_index = index; + return ZYAN_STATUS_FALSE; + } + + ZYAN_ASSERT(vector->element_size); + ZYAN_ASSERT(vector->data); + + ZyanStatus status = ZYAN_STATUS_FALSE; + ZyanISize l = index; + ZyanISize h = index + count - 1; + while (l <= h) + { + const ZyanUSize mid = l + ((h - l) >> 1); + const ZyanI32 cmp = comparison(ZYCORE_VECTOR_OFFSET(vector, mid), element); + if (cmp < 0) + { + l = mid + 1; + } else + { + h = mid - 1; + if (cmp == 0) + { + status = ZYAN_STATUS_TRUE; + } + } + } + + *found_index = l; + return status; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Memory management */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanVectorResize(ZyanVector* vector, ZyanUSize size) +{ + return ZyanVectorResizeEx(vector, size, ZYAN_NULL); +} + +ZyanStatus ZyanVectorResizeEx(ZyanVector* vector, ZyanUSize size, const void* initializer) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + if (size == vector->size) + { + return ZYAN_STATUS_SUCCESS; + } + + if (vector->destructor && (size < vector->size)) + { + for (ZyanUSize i = size; i < vector->size; ++i) + { + vector->destructor(ZYCORE_VECTOR_OFFSET(vector, i)); + } + } + + if (ZYCORE_VECTOR_SHOULD_GROW(size, vector->capacity) || + ZYCORE_VECTOR_SHOULD_SHRINK(size, vector->capacity, vector->shrink_threshold)) + { + ZYAN_ASSERT(vector->growth_factor >= 1); + ZYAN_CHECK(ZyanVectorReallocate(vector, (ZyanUSize)(size * vector->growth_factor))); + } + + if (initializer && (size > vector->size)) + { + for (ZyanUSize i = vector->size; i < size; ++i) + { + ZYAN_MEMCPY(ZYCORE_VECTOR_OFFSET(vector, i), initializer, vector->element_size); + } + } + + vector->size = size; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorReserve(ZyanVector* vector, ZyanUSize capacity) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (capacity > vector->capacity) + { + ZYAN_CHECK(ZyanVectorReallocate(vector, capacity)); + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorShrinkToFit(ZyanVector* vector) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + return ZyanVectorReallocate(vector, vector->size); +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Information */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZyanVectorGetCapacity(const ZyanVector* vector, ZyanUSize* capacity) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *capacity = vector->capacity; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZyanVectorGetSize(const ZyanVector* vector, ZyanUSize* size) +{ + if (!vector) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *size = vector->size; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/dependencies/zycore/src/Zycore.c b/3rdparty/zydis/dependencies/zycore/src/Zycore.c new file mode 100644 index 0000000000..9bbb20024f --- /dev/null +++ b/3rdparty/zydis/dependencies/zycore/src/Zycore.c @@ -0,0 +1,38 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +ZyanU64 ZycoreGetVersion(void) +{ + return ZYCORE_VERSION; +} + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/include/ZycoreExportConfig.h b/3rdparty/zydis/include/ZycoreExportConfig.h new file mode 100644 index 0000000000..b70b847310 --- /dev/null +++ b/3rdparty/zydis/include/ZycoreExportConfig.h @@ -0,0 +1,46 @@ + +#ifndef ZYCORE_EXPORT_H +#define ZYCORE_EXPORT_H + +#ifdef ZYCORE_STATIC_DEFINE +# define ZYCORE_EXPORT +# define ZYCORE_NO_EXPORT +#else +# ifndef ZYCORE_EXPORT +# ifdef Zycore_EXPORTS + /* We are building this library */ +# define ZYCORE_EXPORT __declspec(dllexport) +# else + /* We are using this library */ +# define ZYCORE_EXPORT __declspec(dllimport) +# endif +# endif + +# ifndef ZYCORE_NO_EXPORT +# define ZYCORE_NO_EXPORT +# endif +#endif + +#ifndef ZYCORE_DEPRECATED +# ifdef _MSC_VER +# define ZYCORE_DEPRECATED __declspec(deprecated) +# else +# define ZYCORE_DEPRECATED +# endif +#endif + +#ifndef ZYCORE_DEPRECATED_EXPORT +# define ZYCORE_DEPRECATED_EXPORT ZYCORE_EXPORT ZYCORE_DEPRECATED +#endif + +#ifndef ZYCORE_DEPRECATED_NO_EXPORT +# define ZYCORE_DEPRECATED_NO_EXPORT ZYCORE_NO_EXPORT ZYCORE_DEPRECATED +#endif + +#if 0 /* DEFINE_NO_DEPRECATED */ +# ifndef ZYCORE_NO_DEPRECATED +# define ZYCORE_NO_DEPRECATED +# endif +#endif + +#endif /* ZYCORE_EXPORT_H */ diff --git a/3rdparty/zydis/include/Zydis/Decoder.h b/3rdparty/zydis/include/Zydis/Decoder.h new file mode 100644 index 0000000000..8cfbb0cc09 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Decoder.h @@ -0,0 +1,237 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include +#include + +#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, + + /** + * Maximum value of this enum. + */ + ZYDIS_DECODER_MODE_MAX_VALUE = ZYDIS_DECODER_MODE_CLDEMOTE, + /** + * 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 address width. + */ + ZydisAddressWidth address_width; + /** + * The decoder mode array. + */ + ZyanBool decoder_mode[ZYDIS_DECODER_MODE_MAX_VALUE + 1]; +} 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 address_width The address width. + * + * @return A zyan status code. + */ +ZYDIS_EXPORT ZyanStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMode machine_mode, + ZydisAddressWidth address_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`. + * + * @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, that receives the + * details about the decoded instruction. + * + * @return A zyan status code. + */ +ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeBuffer(const ZydisDecoder* decoder, + const void* buffer, ZyanUSize length, ZydisDecodedInstruction* instruction); + +/** @} */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_DECODER_H */ diff --git a/3rdparty/zydis/include/Zydis/DecoderTypes.h b/3rdparty/zydis/include/Zydis/DecoderTypes.h new file mode 100644 index 0000000000..6d6a82a401 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/DecoderTypes.h @@ -0,0 +1,1559 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include +#include +#include + +#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, + + /** + * Maximum value of this enum. + */ + ZYDIS_MEMOP_TYPE_MAX_VALUE = ZYDIS_MEMOP_TYPE_MIB, + /** + * 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 */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisDecodedOperand` struct. + */ +typedef struct ZydisDecodedOperand_ +{ + /** + * The operand-id. + */ + ZyanU8 id; + /** + * The type of the operand. + */ + ZydisOperandType type; + /** + * 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; + /** + * Extended info for register-operands. + */ + struct ZydisDecodedOperandReg_ + { + /** + * The register value. + */ + ZydisRegister value; + // TODO: AVX512_4VNNIW MULTISOURCE registers + } reg; + /** + * Extended info for memory-operands. + */ + 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; + } mem; + /** + * Extended info for pointer-operands. + */ + struct ZydisDecodedOperandPtr_ + { + ZyanU16 segment; + ZyanU32 offset; + } ptr; + /** + * Extended info for immediate-operands. + */ + 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; + } imm; +} ZydisDecodedOperand; + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* Decoded instruction */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Instruction attributes */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisInstructionAttributes` data-type. + */ +typedef ZyanU64 ZydisInstructionAttributes; + +/** + * The instruction has the `ModRM` byte. + */ +#define ZYDIS_ATTRIB_HAS_MODRM 0x0000000000000001 // (1 << 0) +/** + * The instruction has the `SIB` byte. + */ +#define ZYDIS_ATTRIB_HAS_SIB 0x0000000000000002 // (1 << 1) +/** + * The instruction has the `REX` prefix. + */ +#define ZYDIS_ATTRIB_HAS_REX 0x0000000000000004 // (1 << 2) +/** + * The instruction has the `XOP` prefix. + */ +#define ZYDIS_ATTRIB_HAS_XOP 0x0000000000000008 // (1 << 3) +/** + * The instruction has the `VEX` prefix. + */ +#define ZYDIS_ATTRIB_HAS_VEX 0x0000000000000010 // (1 << 4) +/** + * The instruction has the `EVEX` prefix. + */ +#define ZYDIS_ATTRIB_HAS_EVEX 0x0000000000000020 // (1 << 5) +/** + * The instruction has the `MVEX` prefix. + */ +#define ZYDIS_ATTRIB_HAS_MVEX 0x0000000000000040 // (1 << 6) +/** + * The instruction has one or more operands with position-relative offsets. + */ +#define ZYDIS_ATTRIB_IS_RELATIVE 0x0000000000000080 // (1 << 7) +/** + * The instruction is privileged. + * + * Privileged instructions are any instructions that require a current ring level below 3. + */ +#define ZYDIS_ATTRIB_IS_PRIVILEGED 0x0000000000000100 // (1 << 8) + +/** + * The instruction accesses one or more CPU-flags. + */ +#define ZYDIS_ATTRIB_CPUFLAG_ACCESS 0x0000001000000000 // (1 << 36) // TODO: rebase + +/** + * The instruction may conditionally read the general CPU state. + */ +#define ZYDIS_ATTRIB_CPU_STATE_CR 0x0000002000000000 // (1 << 37) // TODO: rebase +/** + * The instruction may conditionally write the general CPU state. + */ +#define ZYDIS_ATTRIB_CPU_STATE_CW 0x0000004000000000 // (1 << 38) // TODO: rebase +/** + * The instruction may conditionally read the FPU state (X87, MMX). + */ +#define ZYDIS_ATTRIB_FPU_STATE_CR 0x0000008000000000 // (1 << 39) // TODO: rebase +/** + * The instruction may conditionally write the FPU state (X87, MMX). + */ +#define ZYDIS_ATTRIB_FPU_STATE_CW 0x0000010000000000 // (1 << 40) // TODO: rebase +/** + * The instruction may conditionally read the XMM state (AVX, AVX2, AVX-512). + */ +#define ZYDIS_ATTRIB_XMM_STATE_CR 0x0000020000000000 // (1 << 41) // TODO: rebase +/** + * The instruction may conditionally write the XMM state (AVX, AVX2, AVX-512). + */ +#define ZYDIS_ATTRIB_XMM_STATE_CW 0x0000040000000000 // (1 << 42) // TODO: rebase + +/** + * The instruction accepts the `LOCK` prefix (`0xF0`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_LOCK 0x0000000000000200 // (1 << 9) +/** + * The instruction accepts the `REP` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REP 0x0000000000000400 // (1 << 10) +/** + * The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REPE 0x0000000000000800 // (1 << 11) +/** + * The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REPZ 0x0000000000000800 // (1 << 11) +/** + * The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REPNE 0x0000000000001000 // (1 << 12) +/** + * The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_REPNZ 0x0000000000001000 // (1 << 12) +/** + * The instruction accepts the `BND` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_BND 0x0000000000002000 // (1 << 13) +/** + * The instruction accepts the `XACQUIRE` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_XACQUIRE 0x0000000000004000 // (1 << 14) +/** + * The instruction accepts the `XRELEASE` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_XRELEASE 0x0000000000008000 // (1 << 15) +/** + * The instruction accepts the `XACQUIRE`/`XRELEASE` prefixes (`0xF2`, `0xF3`) + * without the `LOCK` prefix (`0x0F`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK 0x0000000000010000 // (1 << 16) +/** + * The instruction accepts branch hints (0x2E, 0x3E). + */ +#define ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS 0x0000000000020000 // (1 << 17) +/** + * The instruction accepts segment prefixes (`0x2E`, `0x36`, `0x3E`, `0x26`, + * `0x64`, `0x65`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_SEGMENT 0x0000000000040000 // (1 << 18) +/** + * The instruction has the `LOCK` prefix (`0xF0`). + */ +#define ZYDIS_ATTRIB_HAS_LOCK 0x0000000000080000 // (1 << 19) +/** + * The instruction has the `REP` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_HAS_REP 0x0000000000100000 // (1 << 20) +/** + * The instruction has the `REPE`/`REPZ` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_HAS_REPE 0x0000000000200000 // (1 << 21) +/** + * The instruction has the `REPE`/`REPZ` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_HAS_REPZ 0x0000000000200000 // (1 << 21) +/** + * The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_HAS_REPNE 0x0000000000400000 // (1 << 22) +/** + * The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_HAS_REPNZ 0x0000000000400000 // (1 << 22) +/** + * The instruction has the `BND` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_HAS_BND 0x0000000000800000 // (1 << 23) +/** + * The instruction has the `XACQUIRE` prefix (`0xF2`). + */ +#define ZYDIS_ATTRIB_HAS_XACQUIRE 0x0000000001000000 // (1 << 24) +/** + * The instruction has the `XRELEASE` prefix (`0xF3`). + */ +#define ZYDIS_ATTRIB_HAS_XRELEASE 0x0000000002000000 // (1 << 25) +/** + * The instruction has the branch-not-taken hint (`0x2E`). + */ +#define ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN 0x0000000004000000 // (1 << 26) +/** + * The instruction has the branch-taken hint (`0x3E`). + */ +#define ZYDIS_ATTRIB_HAS_BRANCH_TAKEN 0x0000000008000000 // (1 << 27) +/** + * The instruction has a segment modifier. + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT 0x00000003F0000000 +/** + * The instruction has the `CS` segment modifier (`0x2E`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_CS 0x0000000010000000 // (1 << 28) +/** + * The instruction has the `SS` segment modifier (`0x36`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_SS 0x0000000020000000 // (1 << 29) +/** + * The instruction has the `DS` segment modifier (`0x3E`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_DS 0x0000000040000000 // (1 << 30) +/** + * The instruction has the `ES` segment modifier (`0x26`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_ES 0x0000000080000000 // (1 << 31) +/** + * The instruction has the `FS` segment modifier (`0x64`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_FS 0x0000000100000000 // (1 << 32) +/** + * The instruction has the `GS` segment modifier (`0x65`). + */ +#define ZYDIS_ATTRIB_HAS_SEGMENT_GS 0x0000000200000000 // (1 << 33) +/** + * The instruction has the operand-size override prefix (`0x66`). + */ +#define ZYDIS_ATTRIB_HAS_OPERANDSIZE 0x0000000400000000 // (1 << 34) // TODO: rename +/** + * The instruction has the address-size override prefix (`0x67`). + */ +#define ZYDIS_ATTRIB_HAS_ADDRESSSIZE 0x0000000800000000 // (1 << 35) // TODO: rename +/** + * The instruction accepts the `CET` `no-track` prefix (`0x3E`). + */ +#define ZYDIS_ATTRIB_ACCEPTS_NOTRACK 0x0000080000000000 // (1 << 43) // TODO: rebase + /** + * The instruction has the `CET` `no-track` prefix (`0x3E`). + */ +#define ZYDIS_ATTRIB_HAS_NOTRACK 0x0000100000000000 // (1 << 44) // TODO: rebase + +/* ---------------------------------------------------------------------------------------------- */ +/* R/E/FLAGS info */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisCPUFlags` data-type. + */ +typedef ZyanU32 ZydisCPUFlags; + +/** + * Defines the `ZydisCPUFlag` data-type. + */ +typedef ZyanU8 ZydisCPUFlag; + +/** + * Carry flag. + */ +#define ZYDIS_CPUFLAG_CF 0 +/** + * Parity flag. + */ +#define ZYDIS_CPUFLAG_PF 2 +/** + * Adjust flag. + */ +#define ZYDIS_CPUFLAG_AF 4 +/** + * Zero flag. + */ +#define ZYDIS_CPUFLAG_ZF 6 +/** + * Sign flag. + */ +#define ZYDIS_CPUFLAG_SF 7 +/** + * Trap flag. + */ +#define ZYDIS_CPUFLAG_TF 8 +/** + * Interrupt enable flag. + */ +#define ZYDIS_CPUFLAG_IF 9 +/** + * Direction flag. + */ +#define ZYDIS_CPUFLAG_DF 10 +/** + * Overflow flag. + */ +#define ZYDIS_CPUFLAG_OF 11 +/** + * I/O privilege level flag. + */ +#define ZYDIS_CPUFLAG_IOPL 12 +/** + * Nested task flag. + */ +#define ZYDIS_CPUFLAG_NT 14 +/** + * Resume flag. + */ +#define ZYDIS_CPUFLAG_RF 16 +/** + * Virtual 8086 mode flag. + */ +#define ZYDIS_CPUFLAG_VM 17 +/** + * Alignment check. + */ +#define ZYDIS_CPUFLAG_AC 18 +/** + * Virtual interrupt flag. + */ +#define ZYDIS_CPUFLAG_VIF 19 +/** + * Virtual interrupt pending. + */ +#define ZYDIS_CPUFLAG_VIP 20 +/** + * Able to use CPUID instruction. + */ +#define ZYDIS_CPUFLAG_ID 21 + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * FPU condition-code flag 0. + * + * DEPRECATED. This flag is not actually part of `FLAGS/EFLAGS/RFLAGS` and will be removed in the + * next major release. Please refer to the `fpu_flags_read`/`fpu_flags_written` field instead and + * use one of the `ZYDIS_FPUFLAG_XXX` masks to check for specific a flag. + */ +#define ZYDIS_CPUFLAG_C0 22 +/** + * FPU condition-code flag 1. + * + * DEPRECATED. This flag is not actually part of `FLAGS/EFLAGS/RFLAGS` and will be removed in the + * next major release. Please refer to the `fpu_flags_read`/`fpu_flags_written` field instead and + * use one of the `ZYDIS_FPUFLAG_XXX` masks to check for specific a flag. + */ +#define ZYDIS_CPUFLAG_C1 23 +/** + * FPU condition-code flag 2. + * + * DEPRECATED. This flag is not actually part of `FLAGS/EFLAGS/RFLAGS` and will be removed in the + * next major release. Please refer to the `fpu_flags_read`/`fpu_flags_written` field instead and + * use one of the `ZYDIS_FPUFLAG_XXX` masks to check for specific a flag. + */ +#define ZYDIS_CPUFLAG_C2 24 +/** + * FPU condition-code flag 3. + * + * DEPRECATED. This flag is not actually part of `FLAGS/EFLAGS/RFLAGS` and will be removed in the + * next major release. Please refer to the `fpu_flags_read`/`fpu_flags_written` field instead and + * use one of the `ZYDIS_FPUFLAG_XXX` masks to check for specific a flag. + */ +#define ZYDIS_CPUFLAG_C3 25 + +/** + * DEPRECATED. This define will be removed in the next major release. + */ +#define ZYDIS_CPUFLAG_MAX_VALUE ZYDIS_CPUFLAG_C3 + + /////////////////////////////////////////////////////////////////////////////////////////////////// + + /** + * Defines the `ZydisFPUFlags` data-type. + */ +typedef ZyanU8 ZydisFPUFlags; + +/** + * FPU condition-code flag 0. + */ +#define ZYDIS_FPUFLAG_C0 0x00 // (1 << 0) +/** + * FPU condition-code flag 1. + */ +#define ZYDIS_FPUFLAG_C1 0x01 // (1 << 1) + /** + * FPU condition-code flag 2. + */ +#define ZYDIS_FPUFLAG_C2 0x02 // (1 << 2) +/** + * FPU condition-code flag 3. + */ +#define ZYDIS_FPUFLAG_C3 0x04 // (1 << 3) + +/** + * Defines the `ZydisCPUFlagAction` enum. + * + * DEPRECATED. This enum will be removed in the next major release. + */ +typedef enum ZydisCPUFlagAction_ +{ + /** + * The CPU flag is not touched by the instruction. + */ + ZYDIS_CPUFLAG_ACTION_NONE, + /** + * The CPU flag is tested (read). + */ + ZYDIS_CPUFLAG_ACTION_TESTED, + /** + * The CPU flag is tested and modified afterwards (read-write). + */ + ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, + /** + * The CPU flag is modified (write). + */ + ZYDIS_CPUFLAG_ACTION_MODIFIED, + /** + * The CPU flag is set to 0 (write). + */ + ZYDIS_CPUFLAG_ACTION_SET_0, + /** + * The CPU flag is set to 1 (write). + */ + ZYDIS_CPUFLAG_ACTION_SET_1, + /** + * The CPU flag is undefined (write). + */ + ZYDIS_CPUFLAG_ACTION_UNDEFINED, + + /** + * Maximum value of this enum. + */ + ZYDIS_CPUFLAG_ACTION_MAX_VALUE = ZYDIS_CPUFLAG_ACTION_UNDEFINED, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_CPUFLAG_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CPUFLAG_ACTION_MAX_VALUE) +} ZydisCPUFlagAction; + +/* ---------------------------------------------------------------------------------------------- */ +/* 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 */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * 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. + */ + ZyanU8 operand_count; + /** + * Detailed info for all instruction operands. + * + * Explicit 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 operands. + */ + ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]; + /** + * Instruction attributes. + */ + ZydisInstructionAttributes attributes; + /** + * Information about accessed CPU flags. + * + * DEPRECATED. This field will be removed in the next major release. Please use the + * `cpu_flags_read`/`cpu_flags_written` or `fpu_flags_read`/`fpu_flags_written` fields + * instead. + */ + struct ZydisDecodedInstructionAccessedFlags_ + { + /** + * The CPU-flag action. + * + * Use `ZydisGetAccessedFlagsByAction` to get a mask with all flags matching a specific + * action. + */ + ZydisCPUFlagAction action; + } accessed_flags[ZYDIS_CPUFLAG_MAX_VALUE + 1]; + /** + * A mask containing the CPU flags read by the instruction. + * + * The bits in this mask correspond to the actual bits in the `FLAGS/EFLAGS/RFLAGS` + * register. + * + * This mask includes the actions `TESTED` and `TESTED_MODIFIED`. + */ + ZydisCPUFlags cpu_flags_read; + /** + * A mask containing the CPU flags written by the instruction. + * + * The bits in this mask correspond to the actual bits in the `FLAGS/EFLAGS/RFLAGS` + * register. + * + * This mask includes the actions `TESTED_MODIFIED`, `SET_0`, `SET_1` and `UNDEFINED`. + */ + ZydisCPUFlags cpu_flags_written; + /** + * A mask containing the FPU flags read by the instruction. + */ + ZydisFPUFlags fpu_flags_read; + /** + * A mask containing the FPU flags written by the instruction. + */ + ZydisFPUFlags fpu_flags_written; + /** + * Extended info for `AVX` instructions. + */ + 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 + } avx; + /** + * Meta info. + */ + 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; + } meta; + /** + * Detailed info about different instruction-parts like `ModRM`, `SIB` or + * encoding-prefixes. + */ + 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]; + /** + * Detailed info about the `REX` prefix. + */ + 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; + } rex; + /** + * Detailed info about the `XOP` prefix. + */ + 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; + } xop; + /** + * Detailed info about the `VEX` prefix. + */ + 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; + } vex; + /** + * Detailed info about the `EVEX` prefix. + */ + 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; + } evex; + /** + * Detailed info about the `MVEX` prefix. + */ + 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; + } 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]; + } raw; +} ZydisDecodedInstruction; + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_INSTRUCTIONINFO_H */ diff --git a/3rdparty/zydis/include/Zydis/Formatter.h b/3rdparty/zydis/include/Zydis/Formatter.h new file mode 100644 index 0000000000..bf1dd30d66 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Formatter.h @@ -0,0 +1,1190 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include +#include +#include + +#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 */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisFormatterStyle` enum. + */ +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 */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisFormatterProperty` enum. + */ +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 padd all + * addresses to the current stack 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 padd all + * addresses to the current stack 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. + */ + 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 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; + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisNumericBase` enum. + */ +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; + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisSignedness` enum. + */ +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; + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisPadding` enum. + */ +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 */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisFormatterFunction` enum. + * + * 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 */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisDecorator` enum. + */ +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; + +/** + * Defines the `ZydisFormatterContext` struct. + */ +typedef struct ZydisFormatterContext_ +{ + /** + * A pointer to the `ZydisDecodedInstruction` struct. + */ + const ZydisDecodedInstruction* instruction; + /** + * A pointer to the `ZydisDecodedOperand` struct. + */ + const ZydisDecodedOperand* operand; + /** + * The runtime address of the instruction. + */ + ZyanU64 runtime_address; + /** + * A pointer to user-defined data. + */ + 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 */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisFormatter` struct. + * + * 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_DETAILED_PREFIXES` property. + */ + ZyanBool detailed_prefixes; + /** + * The `ZYDIS_FORMATTER_ADDR_BASE` property. + */ + ZydisNumericBase addr_base; + /** + * The `ZYDIS_FORMATTER_ADDR_SIGNEDNESS` property. + */ + ZydisSignedness addr_signedness; + /** + * The `ZYDIS_FORMATTER_ADDR_PADDING_ABSOLUTE` property. + */ + ZydisPadding addr_padding_absolute; + /** + * The `ZYDIS_FORMATTER_ADDR_PADDING_RELATIVE` property. + */ + ZydisPadding addr_padding_relative; + /** + * The `ZYDIS_FORMATTER_DISP_BASE` property. + */ + ZydisNumericBase disp_base; + /** + * The `ZYDIS_FORMATTER_DISP_SIGNEDNESS` property. + */ + ZydisSignedness disp_signedness; + /** + * The `ZYDIS_FORMATTER_DISP_PADDING` property. + */ + ZydisPadding disp_padding; + /** + * The `ZYDIS_FORMATTER_IMM_BASE` property. + */ + ZydisNumericBase imm_base; + /** + * The `ZYDIS_FORMATTER_IMM_SIGNEDNESS` property. + */ + ZydisSignedness imm_signedness; + /** + * The `ZYDIS_FORMATTER_IMM_PADDING` property. + */ + ZydisPadding imm_padding; + /** + * The `ZYDIS_FORMATTER_UPPERCASE_PREFIXES` property. + */ + ZyanI32 case_prefixes; + /** + * The `ZYDIS_FORMATTER_UPPERCASE_MNEMONIC` property. + */ + ZyanI32 case_mnemonic; + /** + * The `ZYDIS_FORMATTER_UPPERCASE_REGISTERS` property. + */ + ZyanI32 case_registers; + /** + * The `ZYDIS_FORMATTER_UPPERCASE_TYPECASTS` property. + */ + ZyanI32 case_typecasts; + /** + * The `ZYDIS_FORMATTER_UPPERCASE_DECORATORS` property. + */ + ZyanI32 case_decorators; + /** + * The `ZYDIS_FORMATTER_HEX_UPPERCASE` property. + */ + ZyanBool hex_uppercase; + /** + * 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 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. + * + * @return A zyan status code. + */ +ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatInstruction(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, char* buffer, ZyanUSize length, + ZyanU64 runtime_address); + +/** + * 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 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. + * + * @return A zyan status code. + */ +ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatInstructionEx(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, 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 index The index 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. + * + * @return A zyan status code. + * + * Use `ZydisFormatterFormatInstruction` or `ZydisFormatterFormatInstructionEx` to format a + * complete instruction. + */ +ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatOperand(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, ZyanU8 index, char* buffer, ZyanUSize length, + ZyanU64 runtime_address); + +/** + * 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 index The index 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. + * + * @return A zyan status code. + * + * Use `ZydisFormatterFormatInstruction` or `ZydisFormatterFormatInstructionEx` to format a + * complete instruction. + */ +ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatOperandEx(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, ZyanU8 index, 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 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. + * + * @return A zyan status code. + */ +ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeInstruction(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, void* buffer, ZyanUSize length, + ZyanU64 runtime_address, ZydisFormatterTokenConst** token); + +/** + * 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 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. + * + * @return A zyan status code. + */ +ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeInstructionEx(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, 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 index The index 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. + * + * @return A zyan status code. + * + * Use `ZydisFormatterTokenizeInstruction` or `ZydisFormatterTokenizeInstructionEx` to tokenize a + * complete instruction. + */ +ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeOperand(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, ZyanU8 index, void* buffer, ZyanUSize length, + ZyanU64 runtime_address, ZydisFormatterTokenConst** token); + +/** + * 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 index The index 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. + * + * @return A zyan status code. + * + * Use `ZydisFormatterTokenizeInstruction` or `ZydisFormatterTokenizeInstructionEx` to tokenize a + * complete instruction. + */ +ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeOperandEx(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, ZyanU8 index, void* buffer, ZyanUSize length, + ZyanU64 runtime_address, ZydisFormatterTokenConst** token, void* user_data); + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * @} + */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_FORMATTER_H */ diff --git a/3rdparty/zydis/include/Zydis/FormatterBuffer.h b/3rdparty/zydis/include/Zydis/FormatterBuffer.h new file mode 100644 index 0000000000..2ae2efeaa9 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/FormatterBuffer.h @@ -0,0 +1,306 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Token types */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * @biref 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 */ diff --git a/3rdparty/zydis/include/Zydis/Generated/EnumISAExt.h b/3rdparty/zydis/include/Zydis/Generated/EnumISAExt.h new file mode 100644 index 0000000000..7586109a4e --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Generated/EnumISAExt.h @@ -0,0 +1,104 @@ +/** + * 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_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_VNNI, + 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_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_PADLOCK, + ZYDIS_ISA_EXT_PAUSE, + ZYDIS_ISA_EXT_PCLMULQDQ, + ZYDIS_ISA_EXT_PCONFIG, + ZYDIS_ISA_EXT_PKU, + ZYDIS_ISA_EXT_PREFETCHWT1, + ZYDIS_ISA_EXT_PT, + 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_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_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; diff --git a/3rdparty/zydis/include/Zydis/Generated/EnumISASet.h b/3rdparty/zydis/include/Zydis/Generated/EnumISASet.h new file mode 100644 index 0000000000..46b74333a8 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Generated/EnumISASet.h @@ -0,0 +1,196 @@ +/** + * 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_AMX_BF16, + 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_VNNI, + 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_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_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_PADLOCK_ACE, + ZYDIS_ISA_SET_PADLOCK_PHE, + ZYDIS_ISA_SET_PADLOCK_PMM, + ZYDIS_ISA_SET_PADLOCK_RNG, + ZYDIS_ISA_SET_PAUSE, + ZYDIS_ISA_SET_PCLMULQDQ, + 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_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_SMAP, + ZYDIS_ISA_SET_SMX, + 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_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; diff --git a/3rdparty/zydis/include/Zydis/Generated/EnumInstructionCategory.h b/3rdparty/zydis/include/Zydis/Generated/EnumInstructionCategory.h new file mode 100644 index 0000000000..00aac5e9d8 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Generated/EnumInstructionCategory.h @@ -0,0 +1,124 @@ +/** + * 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_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_NOP, + ZYDIS_CATEGORY_PADLOCK, + ZYDIS_CATEGORY_PCLMULQDQ, + 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_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_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; diff --git a/3rdparty/zydis/include/Zydis/Generated/EnumMnemonic.h b/3rdparty/zydis/include/Zydis/Generated/EnumMnemonic.h new file mode 100644 index 0000000000..52dd37929e --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Generated/EnumMnemonic.h @@ -0,0 +1,1770 @@ +/** + * Defines the `ZydisMnemonic` enum. + */ +typedef enum ZydisMnemonic_ +{ + ZYDIS_MNEMONIC_INVALID, + ZYDIS_MNEMONIC_AAA, + ZYDIS_MNEMONIC_AAD, + ZYDIS_MNEMONIC_AAM, + 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_ARPL, + 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_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_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_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_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_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_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_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_VPDPBUSD, + ZYDIS_MNEMONIC_VPDPBUSDS, + ZYDIS_MNEMONIC_VPDPWSSD, + ZYDIS_MNEMONIC_VPDPWSSDS, + 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_VSHUFF32X4, + ZYDIS_MNEMONIC_VSHUFF64X2, + ZYDIS_MNEMONIC_VSHUFI32X4, + ZYDIS_MNEMONIC_VSHUFI64X2, + ZYDIS_MNEMONIC_VSHUFPD, + ZYDIS_MNEMONIC_VSHUFPS, + 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_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; diff --git a/3rdparty/zydis/include/Zydis/Generated/EnumRegister.h b/3rdparty/zydis/include/Zydis/Generated/EnumRegister.h new file mode 100644 index 0000000000..7b1ee41dff --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Generated/EnumRegister.h @@ -0,0 +1,302 @@ +/** + * 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; diff --git a/3rdparty/zydis/include/Zydis/Internal/DecoderData.h b/3rdparty/zydis/include/Zydis/Internal/DecoderData.h new file mode 100644 index 0000000000..db6cf53a79 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Internal/DecoderData.h @@ -0,0 +1,331 @@ +/*************************************************************************************************** + + 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 + +#include +#include + +#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 +}; + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * 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 */ diff --git a/3rdparty/zydis/include/Zydis/Internal/FormatterATT.h b/3rdparty/zydis/include/Zydis/Internal/FormatterATT.h new file mode 100644 index 0000000000..3ecfa684cd --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Internal/FormatterATT.h @@ -0,0 +1,182 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include + +#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, + /* 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 diff --git a/3rdparty/zydis/include/Zydis/Internal/FormatterBase.h b/3rdparty/zydis/include/Zydis/Internal/FormatterBase.h new file mode 100644 index 0000000000..0a61747176 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Internal/FormatterBase.h @@ -0,0 +1,318 @@ +/*************************************************************************************************** + + 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 + +#include +#include + +#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. + * @param padding_length The padding length. + */ +#define ZYDIS_STRING_APPEND_NUM_U(formatter, base, str, value, padding_length) \ + 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, \ + (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. + * @param padding_length The padding length. + * @param force_sign Forces printing of the '+' sign for positive numbers. + */ +#define ZYDIS_STRING_APPEND_NUM_S(formatter, base, str, value, padding_length, 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, \ + (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 memop_id The operand-id of 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, ZyanU8 memop_id); + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* 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 diff --git a/3rdparty/zydis/include/Zydis/Internal/FormatterIntel.h b/3rdparty/zydis/include/Zydis/Internal/FormatterIntel.h new file mode 100644 index 0000000000..06c6652c3d --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Internal/FormatterIntel.h @@ -0,0 +1,269 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include + +#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, + /* 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, + /* 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 diff --git a/3rdparty/zydis/include/Zydis/Internal/SharedData.h b/3rdparty/zydis/include/Zydis/Internal/SharedData.h new file mode 100644 index 0000000000..5289a3c94c --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Internal/SharedData.h @@ -0,0 +1,984 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include +#include +#include + +#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_INT16, + ZYDIS_IELEMENT_TYPE_INT32, + ZYDIS_IELEMENT_TYPE_INT64, + ZYDIS_IELEMENT_TYPE_UINT8, + ZYDIS_IELEMENT_TYPE_UINT16, + 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_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_ +{ + ZYDIS_IMPLREG_TYPE_STATIC, + ZYDIS_IMPLREG_TYPE_GPR_OSZ, + ZYDIS_IMPLREG_TYPE_GPR_ASZ, + ZYDIS_IMPLREG_TYPE_GPR_SSZ, + ZYDIS_IMPLREG_TYPE_IP_ASZ, + ZYDIS_IMPLREG_TYPE_IP_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_ +{ + 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 `ZydisRegisterConstraint` enum. + */ +typedef enum ZydisRegisterConstraint_ +{ + ZYDIS_REG_CONSTRAINTS_UNUSED, + ZYDIS_REG_CONSTRAINTS_NONE, + ZYDIS_REG_CONSTRAINTS_GPR, + ZYDIS_REG_CONSTRAINTS_SR_DEST, + ZYDIS_REG_CONSTRAINTS_SR, + ZYDIS_REG_CONSTRAINTS_CR, + ZYDIS_REG_CONSTRAINTS_DR, + ZYDIS_REG_CONSTRAINTS_MASK, + ZYDIS_REG_CONSTRAINTS_BND, + ZYDIS_REG_CONSTRAINTS_VSIB, + ZYDIS_REG_CONSTRAINTS_NO_REL, + + /** + * Maximum value of this enum. + */ + ZYDIS_REG_CONSTRAINTS_MAX_VALUE = ZYDIS_REG_CONSTRAINTS_NO_REL, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REG_CONSTRAINTS_MAX_VALUE) +} ZydisRegisterConstraint; + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * 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; + +/* ---------------------------------------------------------------------------------------------- */ + +// 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_REG_CONSTRAINTS_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); \ + 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 constr_REG ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS); \ + ZyanU8 constr_RM ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_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); \ + ZyanU8 constr_REG ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS); \ + ZyanU8 constr_RM ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_REQUIRED_BITS) +#endif + +#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \ + ZYDIS_INSTRUCTION_DEFINITION_BASE; \ + ZyanU8 constr_NDSNDD ZYAN_BITFIELD(ZYDIS_REG_CONSTRAINTS_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) + +/** + * 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 + +/* ---------------------------------------------------------------------------------------------- */ +/* Accessed CPU flags */ +/* ---------------------------------------------------------------------------------------------- */ + +typedef struct ZydisAccessedFlags_ +{ + ZydisCPUFlagAction action[ZYDIS_CPUFLAG_MAX_VALUE + 1]; + ZyanU32 cpu_flags_read ZYAN_BITFIELD(22); + ZyanU32 cpu_flags_written ZYAN_BITFIELD(22); + ZyanU8 fpu_flags_read ZYAN_BITFIELD( 4); + ZyanU8 fpu_flags_written ZYAN_BITFIELD( 4); +} ZydisAccessedFlags; + +/* ---------------------------------------------------------------------------------------------- */ + +#pragma pack(pop) + +#ifdef ZYAN_MSVC +# pragma warning(pop) +#endif + +/* ============================================================================================== */ +/* 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. + * @param operand A pointer to the variable that receives a pointer to the first operand- + * definition of the instruction. + * + * @return The number of operands for the given instruction-definition. + */ +ZYDIS_NO_EXPORT ZyanU8 ZydisGetOperandDefinitions(const ZydisInstructionDefinition* definition, + const ZydisOperandDefinition** operand); +#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 `ZydisAccessedFlags` struct. + * + * @return `ZYAN_TRUE`, if the instruction accesses any flags, or `ZYAN_FALSE`, if not. + */ +ZYDIS_NO_EXPORT ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition, + const ZydisAccessedFlags** flags); +#endif + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_INTERNAL_SHAREDDATA_H */ diff --git a/3rdparty/zydis/include/Zydis/Internal/String.h b/3rdparty/zydis/include/Zydis/Internal/String.h new file mode 100644 index 0000000000..18ed812dc0 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Internal/String.h @@ -0,0 +1,464 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include +#include +#include +#include + +#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. + * @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. + * @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. + * @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. + * @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 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 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 string. + * @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` (the sign char is ignored). + * @param uppercase Set `ZYAN_TRUE` to print the hexadecimal value in uppercase letters + * instead of lowercase ones. + * @param force_sign Set to `ZYAN_TRUE`, to force printing of the `+` sign for positive + * numbers. + * @param prefix The string to use as prefix or `NULL`, if not needed. + * @param suffix The string to use as suffix or `NULL`, if not needed. + * + * @return `ZYAN_STATUS_SUCCESS`, if the function succeeded, or + * `ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE`, if the size of the buffer was not + * sufficient to append the given `value`. + * + * The string-buffer pointer is increased by the number of chars written, if the call was + * successful. + */ +ZYAN_INLINE ZyanStatus ZydisStringAppendHexS(ZyanString* string, ZyanI64 value, + ZyanU8 padding_length, 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, 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, uppercase, prefix, suffix); +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif // ZYDIS_INTERNAL_STRING_H diff --git a/3rdparty/zydis/include/Zydis/MetaInfo.h b/3rdparty/zydis/include/Zydis/MetaInfo.h new file mode 100644 index 0000000000..6867d32d37 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/MetaInfo.h @@ -0,0 +1,88 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + +#include +#include +#include + +/* ============================================================================================== */ +/* 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 */ diff --git a/3rdparty/zydis/include/Zydis/Mnemonic.h b/3rdparty/zydis/include/Zydis/Mnemonic.h new file mode 100644 index 0000000000..dd8fec8cfa --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Mnemonic.h @@ -0,0 +1,88 @@ +/*************************************************************************************************** + + 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 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + +#include + +/* ============================================================================================== */ +/* 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 */ diff --git a/3rdparty/zydis/include/Zydis/Register.h b/3rdparty/zydis/include/Zydis/Register.h new file mode 100644 index 0000000000..0ff955fce7 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Register.h @@ -0,0 +1,293 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Registers */ +/* ---------------------------------------------------------------------------------------------- */ + +#include + +/* ---------------------------------------------------------------------------------------------- */ +/* 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, + /** + * 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 or does not have an enclosing-register. + */ +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 */ diff --git a/3rdparty/zydis/include/Zydis/SharedTypes.h b/3rdparty/zydis/include/Zydis/SharedTypes.h new file mode 100644 index 0000000000..00afd632c0 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/SharedTypes.h @@ -0,0 +1,484 @@ +/*************************************************************************************************** + + 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 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Macros */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constants */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_MAX_INSTRUCTION_LENGTH 15 +#define ZYDIS_MAX_OPERAND_COUNT 10 + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* 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; + +/* ---------------------------------------------------------------------------------------------- */ +/* Address width */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisAddressWidth` enum. + */ +typedef enum ZydisAddressWidth_ +{ + ZYDIS_ADDRESS_WIDTH_16, + ZYDIS_ADDRESS_WIDTH_32, + ZYDIS_ADDRESS_WIDTH_64, + + /** + * Maximum value of this enum. + */ + ZYDIS_ADDRESS_WIDTH_MAX_VALUE = ZYDIS_ADDRESS_WIDTH_64, + /** + * The minimum number of bits required to represent all values of this enum. + */ + ZYDIS_ADDRESS_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ADDRESS_WIDTH_MAX_VALUE) +} ZydisAddressWidth; + +/* ---------------------------------------------------------------------------------------------- */ +/* 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, + /** + * 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; + +/* ---------------------------------------------------------------------------------------------- */ +/* 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; + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_SHAREDTYPES_H */ diff --git a/3rdparty/zydis/include/Zydis/ShortString.h b/3rdparty/zydis/include/Zydis/ShortString.h new file mode 100644 index 0000000000..bed45af6c4 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/ShortString.h @@ -0,0 +1,90 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Enums and types */ +/* ============================================================================================== */ + +#pragma pack(push, 1) + +/** + * 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; + +#pragma pack(pop) + +/* ============================================================================================== */ +/* 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 */ diff --git a/3rdparty/zydis/include/Zydis/Status.h b/3rdparty/zydis/include/Zydis/Status.h new file mode 100644 index 0000000000..d2a75f3062 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Status.h @@ -0,0 +1,159 @@ +/*************************************************************************************************** + + 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 + +#include + +#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) + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ + +#ifdef __cplusplus +} +#endif + +#endif /* ZYDIS_STATUS_H */ diff --git a/3rdparty/zydis/include/Zydis/Utils.h b/3rdparty/zydis/include/Zydis/Utils.h new file mode 100644 index 0000000000..aef9e9671a --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Utils.h @@ -0,0 +1,275 @@ +/*************************************************************************************************** + + 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 + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* 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 */ +/* ============================================================================================== */ + +/** + * @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); + +/* ---------------------------------------------------------------------------------------------- */ +/* Accessed CPU flags */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Returns a mask of accessed CPU-flags matching the given `action`. + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param action The CPU-flag action. + * @param flags Receives the flag mask. + * + * @return A zyan status code. + */ +ZYDIS_EXPORT ZyanStatus ZydisGetAccessedFlagsByAction(const ZydisDecodedInstruction* instruction, + ZydisCPUFlagAction action, ZydisCPUFlags* flags); + +/** + * Returns a mask of accessed CPU-flags that are read (tested) by the current instruction. + * + * DEPRECATED. This function will be removed in the next major release. Please refer to the + * `cpu_flags_read` or `fpu_flags_read` fields of the `ZydisDecodedInstruction` instead. + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param flags Receives the flag mask. + * + * @return A zyan status code. + */ +ZYDIS_DEPRECATED_EXPORT ZyanStatus ZydisGetAccessedFlagsRead( + const ZydisDecodedInstruction* instruction, ZydisCPUFlags* flags); + +/** + * Returns a mask of accessed CPU-flags that are written (modified, undefined) by the current + * instruction. + * + * DEPRECATED. This function will be removed in the next major release. Please refer to the + * `cpu_flags_written` or `fpu_flags_written` fields of the `ZydisDecodedInstruction` instead. + * + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * @param flags Receives the flag mask. + * + * @return A zyan status code. + */ +ZYDIS_DEPRECATED_EXPORT ZyanStatus ZydisGetAccessedFlagsWritten( + const ZydisDecodedInstruction* instruction, ZydisCPUFlags* flags); + +/* ---------------------------------------------------------------------------------------------- */ +/* Instruction segments */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * 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_UTILS_H */ diff --git a/3rdparty/zydis/include/Zydis/Zydis.h b/3rdparty/zydis/include/Zydis/Zydis.h new file mode 100644 index 0000000000..9578fa5e17 --- /dev/null +++ b/3rdparty/zydis/include/Zydis/Zydis.h @@ -0,0 +1,169 @@ +/*************************************************************************************************** + + 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, including everything else. + */ + +#ifndef ZYDIS_H +#define ZYDIS_H + +#include +#include + +#ifndef ZYDIS_DISABLE_DECODER +# include +# include +#endif + +#ifndef ZYDIS_DISABLE_FORMATTER +# include +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================================================== */ +/* Macros */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Constants */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * A macro that defines the zydis version. + */ +#define ZYDIS_VERSION (ZyanU64)0x0003000200010000 + +/* ---------------------------------------------------------------------------------------------- */ +/* 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_FORMATTER, + ZYDIS_FEATURE_AVX512, + ZYDIS_FEATURE_KNC, + + /** + * Maximum value of this enum. + */ + ZYDIS_FEATURE_MAX_VALUE = ZYDIS_FEATURE_KNC, + /** + * 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 */ +/* ============================================================================================== */ + +/** + * @addtogroup version Version + * Functions for checking the library version and build options. + * @{ + */ + +/** + * 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 */ diff --git a/3rdparty/zydis/include/ZydisExportConfig.h b/3rdparty/zydis/include/ZydisExportConfig.h new file mode 100644 index 0000000000..c8ccbaf3c9 --- /dev/null +++ b/3rdparty/zydis/include/ZydisExportConfig.h @@ -0,0 +1,46 @@ + +#ifndef ZYDIS_EXPORT_H +#define ZYDIS_EXPORT_H + +#ifdef ZYDIS_STATIC_DEFINE +# define ZYDIS_EXPORT +# define ZYDIS_NO_EXPORT +#else +# ifndef ZYDIS_EXPORT +# ifdef Zydis_EXPORTS + /* We are building this library */ +# define ZYDIS_EXPORT __declspec(dllexport) +# else + /* We are using this library */ +# define ZYDIS_EXPORT __declspec(dllimport) +# endif +# endif + +# ifndef ZYDIS_NO_EXPORT +# define ZYDIS_NO_EXPORT +# endif +#endif + +#ifndef ZYDIS_DEPRECATED +# ifdef _MSC_VER +# define ZYDIS_DEPRECATED __declspec(deprecated) +# else +# define ZYDIS_DEPRECATED +# endif +#endif + +#ifndef ZYDIS_DEPRECATED_EXPORT +# define ZYDIS_DEPRECATED_EXPORT ZYDIS_EXPORT ZYDIS_DEPRECATED +#endif + +#ifndef ZYDIS_DEPRECATED_NO_EXPORT +# define ZYDIS_DEPRECATED_NO_EXPORT ZYDIS_NO_EXPORT ZYDIS_DEPRECATED +#endif + +#if 0 /* DEFINE_NO_DEPRECATED */ +# ifndef ZYDIS_NO_DEPRECATED +# define ZYDIS_NO_DEPRECATED +# endif +#endif + +#endif /* ZYDIS_EXPORT_H */ diff --git a/3rdparty/zydis/src/Decoder.c b/3rdparty/zydis/src/Decoder.c new file mode 100644 index 0000000000..a2e0799927 --- /dev/null +++ b/3rdparty/zydis/src/Decoder.c @@ -0,0 +1,5116 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include +#include +#include +#include + +/* ============================================================================================== */ +/* Internal enums and types */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Decoder context */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisDecoderContext` struct. + */ +typedef struct ZydisDecoderContext_ +{ + /** + * A pointer to the `ZydisDecoder` instance. + */ + const ZydisDecoder* decoder; + /** + * The input buffer. + */ + const ZyanU8* buffer; + /** + * The input buffer length. + */ + ZyanUSize buffer_len; + 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 3 (`2E`,`36`, `3E`, `26`, `64` or `65`). + */ + ZyanU8 group2; + /** + * Signals, if the instruction has an operand-size override prefix (`66`). + * + * This is the only prefix in group 3. + */ + // ZyanBool has_osz_override; + /** + * Signals, if the instruction has an address-size override prefix (`67`). + * + * This is the only prefix in group 4. + */ + // ZyanBool has_asz_override; + /** + * 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; + /** + * 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 v_vvvv; + ZyanU8 mask; + } cache; +#ifndef ZYDIS_DISABLE_AVX512 + /** + * Internal EVEX-specific information. + */ + struct + { + /** + * The EVEX tuple-type. + */ + ZydisEVEXTupleType tuple_type; + /** + * The EVEX element-size. + */ + ZyanU8 element_size; + } evex; +#endif +#ifndef ZYDIS_DISABLE_KNC + /** + * Internal MVEX-specific information. + */ + struct + { + /** + * The MVEX functionality. + */ + ZydisMVEXFunctionality functionality; + } mvex; +#endif +#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC) + /** + * The scale factor for EVEX/MVEX compressed 8-bit displacement values. + */ + ZyanU8 cd8_scale; +#endif +} ZydisDecoderContext; + +/* ---------------------------------------------------------------------------------------------- */ +/* Register encoding */ +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Defines the `ZydisRegisterEncoding` enum. + */ +typedef enum ZydisRegisterEncoding_ +{ + ZYDIS_REG_ENCODING_INVALID, + /** + * The register-id is encoded as part of the opcode. + * + * Possible extension by `REX/XOP/VEX/EVEX/MVEX.B`. + */ + ZYDIS_REG_ENCODING_OPCODE, + /** + * The register-id is encoded in `modrm.reg`. + * + * Possible extension by `EVEX/MVEX.R'` (vector only) and `REX/XOP/VEX/EVEX/MVEX.R`. + */ + ZYDIS_REG_ENCODING_REG, + /** + * The register-id is encoded in `XOP/VEX/EVEX/MVEX.vvvv`. + * + * Possible extension by `EVEX/MVEX.v'` (vector only). + */ + ZYDIS_REG_ENCODING_NDSNDD, + /** + * The register-id is encoded in `modrm.rm`. + * + * Possible extension by `EVEX/MVEX.X` (vector only) and `REX/XOP/VEX/EVEX/MVEX.B`. + */ + ZYDIS_REG_ENCODING_RM, + /** + * The register-id is encoded in `modrm.rm` or `sib.base` (if SIB is present). + * + * Possible extension by `REX/XOP/VEX/EVEX/MVEX.B`. + */ + ZYDIS_REG_ENCODING_BASE, + /** + * The register-id is encoded in `sib.index`. + * + * Possible extension by `REX/XOP/VEX/EVEX/MVEX.X`. + */ + ZYDIS_REG_ENCODING_INDEX, + /** + * The register-id is encoded in `sib.index`. + * + * Possible extension by `EVEX/MVEX.V'` (vector only) and `REX/XOP/VEX/EVEX/MVEX.X`. + */ + 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 context A pointer to the `ZydisDecoderContext` instance. + * @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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU8* value) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(value); + + if (instruction->length >= ZYDIS_MAX_INSTRUCTION_LENGTH) + { + return ZYDIS_STATUS_INSTRUCTION_TOO_LONG; + } + + if (context->buffer_len > 0) + { + *value = context->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 context A pointer to the `ZydisDecoderContext` 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(ZydisDecoderContext* context, ZydisDecodedInstruction* instruction) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(instruction->length < ZYDIS_MAX_INSTRUCTION_LENGTH); + + ++instruction->length; + ++context->buffer; + --context->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 context A pointer to the `ZydisDecoderContext` instance. + * @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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU8* value) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(value); + + if (instruction->length >= ZYDIS_MAX_INSTRUCTION_LENGTH) + { + return ZYDIS_STATUS_INSTRUCTION_TOO_LONG; + } + + if (context->buffer_len > 0) + { + *value = context->buffer++[0]; + ++instruction->length; + --context->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 context A pointer to the `ZydisDecoderContext` instance. + * @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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU8* value, ZyanU8 number_of_bytes) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(value); + + if (instruction->length + number_of_bytes > ZYDIS_MAX_INSTRUCTION_LENGTH) + { + return ZYDIS_STATUS_INSTRUCTION_TOO_LONG; + } + + if (context->buffer_len >= number_of_bytes) + { + instruction->length += number_of_bytes; + + ZYAN_MEMCPY(value, context->buffer, number_of_bytes); + context->buffer += number_of_bytes; + context->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->cache.W = instruction->raw.rex.W; + context->cache.R = instruction->raw.rex.R; + context->cache.X = instruction->raw.rex.X; + context->cache.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 (context->decoder->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->cache.W = instruction->raw.xop.W; + context->cache.R = 0x01 & ~instruction->raw.xop.R; + context->cache.X = 0x01 & ~instruction->raw.xop.X; + context->cache.B = 0x01 & ~instruction->raw.xop.B; + context->cache.L = instruction->raw.xop.L; + context->cache.LL = instruction->raw.xop.L; + context->cache.v_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 (context->decoder->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->cache.W = instruction->raw.vex.W; + context->cache.R = 0x01 & ~instruction->raw.vex.R; + context->cache.X = 0x01 & ~instruction->raw.vex.X; + context->cache.B = 0x01 & ~instruction->raw.vex.B; + context->cache.L = instruction->raw.vex.L; + context->cache.LL = instruction->raw.vex.L; + context->cache.v_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 (context->decoder->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 && + (context->decoder->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->cache.W = instruction->raw.evex.W; + context->cache.R = 0x01 & ~instruction->raw.evex.R; + context->cache.X = 0x01 & ~instruction->raw.evex.X; + context->cache.B = 0x01 & ~instruction->raw.evex.B; + context->cache.LL = (data[3] >> 5) & 0x03; + context->cache.R2 = 0x01 & ~instruction->raw.evex.R2; + context->cache.V2 = 0x01 & ~instruction->raw.evex.V2; + context->cache.v_vvvv = + ((0x01 & ~instruction->raw.evex.V2) << 4) | (0x0F & ~instruction->raw.evex.vvvv); + context->cache.mask = instruction->raw.evex.aaa; + + if (!instruction->raw.evex.V2 && (context->decoder->machine_mode != ZYDIS_MACHINE_MODE_LONG_64)) + { + return ZYDIS_STATUS_MALFORMED_EVEX; + } + if (!instruction->raw.evex.b && (context->cache.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 (context->decoder->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) + { + // MVEX is only invalid 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->cache.W = instruction->raw.mvex.W; + context->cache.R = 0x01 & ~instruction->raw.mvex.R; + context->cache.X = 0x01 & ~instruction->raw.mvex.X; + context->cache.B = 0x01 & ~instruction->raw.mvex.B; + context->cache.R2 = 0x01 & ~instruction->raw.mvex.R2; + context->cache.V2 = 0x01 & ~instruction->raw.mvex.V2; + context->cache.LL = 2; + context->cache.v_vvvv = + ((0x01 & ~instruction->raw.mvex.V2) << 4) | (0x0F & ~instruction->raw.mvex.vvvv); + context->cache.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 context A pointer to the `ZydisDecoderContext` 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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU8 size) +{ + ZYAN_ASSERT(context); + 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(context, instruction, &value)); + instruction->raw.disp.value = *(ZyanI8*)&value; + break; + } + case 16: + { + ZyanU16 value; + ZYAN_CHECK(ZydisInputNextBytes(context, instruction, (ZyanU8*)&value, 2)); + instruction->raw.disp.value = *(ZyanI16*)&value; + break; + } + case 32: + { + ZyanU32 value; + ZYAN_CHECK(ZydisInputNextBytes(context, instruction, (ZyanU8*)&value, 4)); + instruction->raw.disp.value = *(ZyanI32*)&value; + break; + } + case 64: + { + ZyanU64 value; + ZYAN_CHECK(ZydisInputNextBytes(context, 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 context A pointer to the `ZydisDecoderContext` 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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU8 id, ZyanU8 size, ZyanBool is_signed, + ZyanBool is_relative) +{ + ZYAN_ASSERT(context); + 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(context, 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(context, 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(context, 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(context, 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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZydisRegisterEncoding encoding, + ZydisRegisterClass register_class) +{ + switch (context->decoder->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: + switch (encoding) + { + 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; + } + return value; + } + case ZYDIS_REG_ENCODING_REG: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + return instruction->raw.modrm.reg; + case ZYDIS_REG_ENCODING_NDSNDD: + return context->cache.v_vvvv & 0x07; + case ZYDIS_REG_ENCODING_RM: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + return instruction->raw.modrm.rm; + case ZYDIS_REG_ENCODING_BASE: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + if (instruction->raw.modrm.rm == 4) + { + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); + return instruction->raw.sib.base; + } + return instruction->raw.modrm.rm; + case ZYDIS_REG_ENCODING_INDEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); + return instruction->raw.sib.index; + case ZYDIS_REG_ENCODING_VIDX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); + ZYAN_ASSERT((register_class == ZYDIS_REGCLASS_XMM) || + (register_class == ZYDIS_REGCLASS_YMM) || + (register_class == ZYDIS_REGCLASS_ZMM)); + return instruction->raw.sib.index; + case ZYDIS_REG_ENCODING_IS4: + return (instruction->raw.imm[0].value.u >> 4) & 0x07; + case ZYDIS_REG_ENCODING_MASK: + return context->cache.mask; + default: + ZYAN_UNREACHABLE; + } + case ZYDIS_MACHINE_MODE_LONG_64: + switch (encoding) + { + 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; + } + return value | (context->cache.B << 3); + } + case ZYDIS_REG_ENCODING_REG: + { + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZyanU8 value = instruction->raw.modrm.reg; + switch (register_class) + { + case ZYDIS_REGCLASS_GPR8: + case ZYDIS_REGCLASS_GPR16: + case ZYDIS_REGCLASS_GPR32: + case ZYDIS_REGCLASS_GPR64: + case ZYDIS_REGCLASS_XMM: + case ZYDIS_REGCLASS_YMM: + case ZYDIS_REGCLASS_ZMM: + case ZYDIS_REGCLASS_CONTROL: + case ZYDIS_REGCLASS_DEBUG: + value |= (context->cache.R << 3); + break; + default: + break; + } + // R' only exists for EVEX and MVEX. No encoding check needed + switch (register_class) + { + case ZYDIS_REGCLASS_XMM: + case ZYDIS_REGCLASS_YMM: + case ZYDIS_REGCLASS_ZMM: + value |= (context->cache.R2 << 4); + break; + default: + break; + } + return value; + } + case ZYDIS_REG_ENCODING_NDSNDD: + // v' only exists for EVEX and MVEX. No encoding check needed + switch (register_class) + { + case ZYDIS_REGCLASS_XMM: + case ZYDIS_REGCLASS_YMM: + case ZYDIS_REGCLASS_ZMM: + return context->cache.v_vvvv; + case ZYDIS_REGCLASS_MASK: + return context->cache.v_vvvv & 0x07; + default: + return context->cache.v_vvvv & 0x0F; + } + case ZYDIS_REG_ENCODING_RM: + { + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZyanU8 value = instruction->raw.modrm.rm; + switch (register_class) + { + case ZYDIS_REGCLASS_GPR8: + case ZYDIS_REGCLASS_GPR16: + case ZYDIS_REGCLASS_GPR32: + case ZYDIS_REGCLASS_GPR64: + case ZYDIS_REGCLASS_XMM: + case ZYDIS_REGCLASS_YMM: + case ZYDIS_REGCLASS_ZMM: + case ZYDIS_REGCLASS_CONTROL: + case ZYDIS_REGCLASS_DEBUG: + value |= (context->cache.B << 3); + break; + default: + break; + } + // We have to check the instruction-encoding, because the extension by X 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 |= (context->cache.X << 4); + break; + default: + break; + } + } + return value; + } + case ZYDIS_REG_ENCODING_BASE: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + if (instruction->raw.modrm.rm == 4) + { + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); + return instruction->raw.sib.base | (context->cache.B << 3); + } + return instruction->raw.modrm.rm | (context->cache.B << 3); + case ZYDIS_REG_ENCODING_INDEX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); + return instruction->raw.sib.index | (context->cache.X << 3); + case ZYDIS_REG_ENCODING_VIDX: + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MODRM); + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_SIB); + ZYAN_ASSERT((register_class == ZYDIS_REGCLASS_XMM) || + (register_class == ZYDIS_REGCLASS_YMM) || + (register_class == ZYDIS_REGCLASS_ZMM)); + // v' only exists for EVEX and MVEX. No encoding check needed + return instruction->raw.sib.index | (context->cache.X << 3) | + (context->cache.V2 << 4); + case ZYDIS_REG_ENCODING_IS4: + { + 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->cache.mask; + default: + ZYAN_UNREACHABLE; + } + 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` instance. + * @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(ZydisDecoderContext* context, + 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(context->decoder->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(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` instance. + * @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(ZydisDecoderContext* context, + 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 (context->decoder->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 (context->decoder->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 context A pointer to the `ZydisDecoderContext` instance. + * @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(ZydisDecoderContext* context, + 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_GPR_SSZ: + operand->reg.value = ZydisRegisterEncode( + (context->decoder->address_width == ZYDIS_ADDRESS_WIDTH_16) ? ZYDIS_REGCLASS_GPR16 : + (context->decoder->address_width == ZYDIS_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_IP_SSZ: + operand->reg.value = + (context->decoder->address_width == ZYDIS_ADDRESS_WIDTH_16) ? ZYDIS_REGISTER_EIP : + (context->decoder->address_width == ZYDIS_ADDRESS_WIDTH_32) ? ZYDIS_REGISTER_EIP : + ZYDIS_REGISTER_RIP; + break; + case ZYDIS_IMPLREG_TYPE_FLAGS_SSZ: + operand->reg.value = + (context->decoder->address_width == ZYDIS_ADDRESS_WIDTH_16) ? ZYDIS_REGISTER_FLAGS : + (context->decoder->address_width == ZYDIS_ADDRESS_WIDTH_32) ? ZYDIS_REGISTER_EFLAGS : + ZYDIS_REGISTER_RFLAGS; + break; + default: + ZYAN_UNREACHABLE; + } +} +#endif + +#ifndef ZYDIS_MINIMAL_MODE +/** + * Decodes an implicit memory operand. + * + * @param context A pointer to the `ZydisDecoderContext` instance. + * @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(ZydisDecoderContext* context, + 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[context->decoder->address_width], 4); + break; + case ZYDIS_IMPLMEM_BASE_SBP: + operand->mem.base = ZydisRegisterEncode(lookup[context->decoder->address_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 +/** + * Decodes the instruction operands. + * + * @param context A pointer to the`ZydisDecoderContext` struct. + * @param instruction A pointer to the`ZydisDecodedInstruction` struct. + * @param definition A pointer to the`ZydisInstructionDefinition` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeOperands(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(definition); + + ZyanU8 imm_id = 0; + const ZydisOperandDefinition* operand; + instruction->operand_count = ZydisGetOperandDefinitions(definition, &operand); + + ZYAN_ASSERT(instruction->operand_count <= ZYAN_ARRAY_LENGTH(instruction->operands)); + + for (ZyanU8 i = 0; i < instruction->operand_count; ++i) + { + ZydisRegisterClass register_class = ZYDIS_REGCLASS_INVALID; + + instruction->operands[i].id = i; + instruction->operands[i].visibility = operand->visibility; + instruction->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(context, instruction, &instruction->operands[i], + operand); + break; + case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM: + ZydisDecodeOperandImplicitMemory(context, instruction, &instruction->operands[i], + operand); + break; + case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1: + instruction->operands[i].type = ZYDIS_OPERAND_TYPE_IMMEDIATE; + instruction->operands[i].size = 8; + instruction->operands[i].imm.value.u = 1; + instruction->operands[i].imm.is_signed = ZYAN_FALSE; + instruction->operands[i].imm.is_relative = ZYAN_FALSE; + break; + default: + break; + } + if (instruction->operands[i].type) + { + goto FinalizeOperand; + } + + instruction->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, &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, &instruction->operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_RM, register_class))); + break; + case ZYDIS_OPERAND_ENCODING_OPCODE: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &instruction->operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_OPCODE, register_class))); + break; + case ZYDIS_OPERAND_ENCODING_NDSNDD: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &instruction->operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_NDSNDD, register_class))); + break; + case ZYDIS_OPERAND_ENCODING_MASK: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &instruction->operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_MASK, register_class))); + break; + case ZYDIS_OPERAND_ENCODING_IS4: + ZYAN_CHECK( + ZydisDecodeOperandRegister( + instruction, &instruction->operands[i], register_class, + ZydisCalcRegisterId( + context, instruction, ZYDIS_REG_ENCODING_IS4, register_class))); + break; + default: + ZYAN_UNREACHABLE; + } + + if (operand->is_multisource4) + { + instruction->operands[i].attributes |= ZYDIS_OATTRIB_IS_MULTISOURCE4; + } + + goto FinalizeOperand; + } + + // Memory operands + switch (operand->type) + { + case ZYDIS_SEMANTIC_OPTYPE_MEM: + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_INVALID)); + break; + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX: + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_XMM)); + break; + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY: + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_YMM)); + break; + case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ: + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_ZMM)); + 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); + instruction->operands[i].type = ZYDIS_OPERAND_TYPE_POINTER; + instruction->operands[i].ptr.offset = (ZyanU32)instruction->raw.imm[0].value.u; + instruction->operands[i].ptr.segment = (ZyanU16)instruction->raw.imm[1].value.u; + break; + case ZYDIS_SEMANTIC_OPTYPE_AGEN: + instruction->operands[i].actions = 0; // TODO: Remove after generator update + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_INVALID)); + instruction->operands[i].mem.type = ZYDIS_MEMOP_TYPE_AGEN; + break; + case ZYDIS_SEMANTIC_OPTYPE_MOFFS: + ZYAN_ASSERT(instruction->raw.disp.size); + instruction->operands[i].type = ZYDIS_OPERAND_TYPE_MEMORY; + instruction->operands[i].mem.type = ZYDIS_MEMOP_TYPE_MEM; + instruction->operands[i].mem.disp.has_displacement = ZYAN_TRUE; + instruction->operands[i].mem.disp.value = instruction->raw.disp.value; + break; + case ZYDIS_SEMANTIC_OPTYPE_MIB: + instruction->operands[i].actions = 0; // TODO: Remove after generator update + ZYAN_CHECK( + ZydisDecodeOperandMemory( + context, instruction, &instruction->operands[i], ZYDIS_REGCLASS_INVALID)); + instruction->operands[i].mem.type = ZYDIS_MEMOP_TYPE_MIB; + break; + default: + break; + } + if (instruction->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)) + { + instruction->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); + case ZYDIS_SEMANTIC_OPTYPE_IMM: + ZYAN_ASSERT((imm_id == 0) || (imm_id == 1)); + instruction->operands[i].type = ZYDIS_OPERAND_TYPE_IMMEDIATE; + instruction->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); + instruction->operands[i].imm.value.u = + (ZyanU8)instruction->raw.imm[imm_id].value.u & 0x0F; + } else + { + instruction->operands[i].imm.value.u = instruction->raw.imm[imm_id].value.u; + } + instruction->operands[i].imm.is_signed = instruction->raw.imm[imm_id].is_signed; + instruction->operands[i].imm.is_relative = instruction->raw.imm[imm_id].is_relative; + ++imm_id; + break; + default: + break; + } + ZYAN_ASSERT(instruction->operands[i].type == ZYDIS_OPERAND_TYPE_IMMEDIATE); + +FinalizeOperand: + // Set segment-register for memory operands + if (instruction->operands[i].type == ZYDIS_OPERAND_TYPE_MEMORY) + { + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_CS) + { + instruction->operands[i].mem.segment = ZYDIS_REGISTER_CS; + } else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_SS) + { + instruction->operands[i].mem.segment = ZYDIS_REGISTER_SS; + } else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_DS) + { + instruction->operands[i].mem.segment = ZYDIS_REGISTER_DS; + } else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_ES) + { + instruction->operands[i].mem.segment = ZYDIS_REGISTER_ES; + } else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_FS) + { + instruction->operands[i].mem.segment = ZYDIS_REGISTER_FS; + } else + if (!operand->ignore_seg_override && + instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_GS) + { + instruction->operands[i].mem.segment = ZYDIS_REGISTER_GS; + } else + { + if (instruction->operands[i].mem.segment == ZYDIS_REGISTER_NONE) + { + if ((instruction->operands[i].mem.base == ZYDIS_REGISTER_RSP) || + (instruction->operands[i].mem.base == ZYDIS_REGISTER_RBP) || + (instruction->operands[i].mem.base == ZYDIS_REGISTER_ESP) || + (instruction->operands[i].mem.base == ZYDIS_REGISTER_EBP) || + (instruction->operands[i].mem.base == ZYDIS_REGISTER_SP) || + (instruction->operands[i].mem.base == ZYDIS_REGISTER_BP)) + { + instruction->operands[i].mem.segment = ZYDIS_REGISTER_SS; + } else + { + instruction->operands[i].mem.segment = ZYDIS_REGISTER_DS; + } + } + } + } + + ZydisSetOperandSizeAndElementInfo(context, instruction, &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(instruction->operand_count >= 1); + switch (instruction->operands[0].actions) + { + case ZYDIS_OPERAND_ACTION_WRITE: + if (instruction->operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY) + { + instruction->operands[0].actions = ZYDIS_OPERAND_ACTION_CONDWRITE; + } else + { + instruction->operands[0].actions = ZYDIS_OPERAND_ACTION_READ_CONDWRITE; + } + break; + case ZYDIS_OPERAND_ACTION_READWRITE: + instruction->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 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 ZydisSetAttributes(ZydisDecoderContext* context, ZydisDecodedInstruction* instruction, + const ZydisInstructionDefinition* definition) +{ + ZYAN_ASSERT(context); + 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 (context->prefixes.has_lock) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_LOCK; + instruction->raw.prefixes[context->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 (context->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 (context->decoder->decoder_mode[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[context->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[context->prefixes.offset_group1].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + + if (def->accepts_branch_hints) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS; + switch (context->prefixes.group2) + { + case 0x2E: + instruction->attributes |= ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN; + instruction->raw.prefixes[context->prefixes.offset_group2].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + break; + case 0x3E: + instruction->attributes |= ZYDIS_ATTRIB_HAS_BRANCH_TAKEN; + instruction->raw.prefixes[context->prefixes.offset_group2].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + break; + default: + break; + } + } + + if (def->accepts_NOTRACK) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_NOTRACK; + if (context->decoder->decoder_mode[ZYDIS_DECODER_MODE_CET] && + (context->prefixes.offset_notrack >= 0)) + { + instruction->attributes |= ZYDIS_ATTRIB_HAS_NOTRACK; + instruction->raw.prefixes[context->prefixes.offset_notrack].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + } + + if (def->accepts_segment && !def->accepts_branch_hints) + { + instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_SEGMENT; + if (context->prefixes.effective_segment && + !(instruction->attributes & ZYDIS_ATTRIB_HAS_NOTRACK)) + { + switch (context->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[context->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 (context->prefixes.effective_segment) + { + switch (context->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[context->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->cache.LL < ZYAN_ARRAY_LENGTH(lookup)); + instruction->avx.vector_length = lookup[context->cache.LL]; + break; + } + case ZYDIS_INSTRUCTION_ENCODING_VEX: + { + // Vector length + static const ZyanU16 lookup[2] = + { + 128, + 256 + }; + ZYAN_ASSERT(context->cache.LL < ZYAN_ARRAY_LENGTH(lookup)); + instruction->avx.vector_length = lookup[context->cache.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->cache.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->cache.W && (context->evex.element_size == 16 || + context->evex.element_size == 32)) || + ( context->cache.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->cache.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->cache.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->cache.W == 0); + context->cd8_scale = 16; + break; + case ZYDIS_TUPLETYPE_T2: + switch (context->cache.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->cache.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->cache.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->cache.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->cache.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 context A pointer to the `ZydisDecoderContext` 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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction) +{ + ZYAN_ASSERT(context); + 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(context, instruction, &prefix_byte)); + switch (prefix_byte) + { + case 0xF0: + context->prefixes.has_lock = ZYAN_TRUE; + context->prefixes.offset_lock = offset; + break; + case 0xF2: + ZYAN_FALLTHROUGH; + case 0xF3: + context->prefixes.group1 = prefix_byte; + context->prefixes.mandatory_candidate = prefix_byte; + context->prefixes.offset_group1 = offset; + context->prefixes.offset_mandatory = offset; + break; + case 0x2E: + ZYAN_FALLTHROUGH; + case 0x36: + ZYAN_FALLTHROUGH; + case 0x3E: + ZYAN_FALLTHROUGH; + case 0x26: + if (context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + if ((prefix_byte == 0x3E) && + (context->prefixes.effective_segment != 0x64) && + (context->prefixes.effective_segment != 0x65)) + { + context->prefixes.offset_notrack = offset; + } + break; + } + ZYAN_FALLTHROUGH; + case 0x64: + ZYAN_FALLTHROUGH; + case 0x65: + context->prefixes.group2 = prefix_byte; + context->prefixes.offset_group2 = offset; + context->prefixes.effective_segment = prefix_byte; + context->prefixes.offset_segment = offset; + context->prefixes.offset_notrack = -1; + break; + case 0x66: + // context->prefixes.has_osz_override = ZYAN_TRUE; + context->prefixes.offset_osz_override = offset; + if (!context->prefixes.mandatory_candidate) + { + context->prefixes.mandatory_candidate = 0x66; + context->prefixes.offset_mandatory = offset; + } + instruction->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE; + break; + case 0x67: + // context->prefixes.has_asz_override = ZYAN_TRUE; + context->prefixes.offset_asz_override = offset; + instruction->attributes |= ZYDIS_ATTRIB_HAS_ADDRESSSIZE; + break; + default: + if ((context->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(context, instruction); + ++offset; + } + } while (!done); + + if (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) + { + instruction->raw.prefixes[context->prefixes.offset_osz_override].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + if (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) + { + instruction->raw.prefixes[context->prefixes.offset_asz_override].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + if (rex) + { + instruction->raw.prefixes[instruction->raw.rex.offset].type = ZYDIS_PREFIX_TYPE_EFFECTIVE; + ZydisDecodeREX(context, instruction, rex); + } + if ((context->decoder->machine_mode != ZYDIS_MACHINE_MODE_LONG_64) && + (context->prefixes.group2 == 0x3E)) + { + context->prefixes.offset_notrack = context->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 context A pointer to the `ZydisDecoderContext` 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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZydisInstructionEncodingInfo* info) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(info); + + 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(context, instruction, &modrm_byte)); + ZydisDecodeModRM(instruction, modrm_byte); + } + ZyanU8 has_sib = 0; + ZyanU8 displacement_size = 0; + if (!(info->flags & ZYDIS_INSTR_ENC_FLAG_FORCE_REG_FORM)) + { + 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 (context->decoder->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(context, 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(context, instruction, displacement_size)); + } + } + } + + if (info->flags & ZYDIS_INSTR_ENC_FLAG_HAS_DISP) + { + ZYAN_CHECK(ZydisReadDisplacement( + context, 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(context, 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(context, 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; + switch (context->decoder->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 += 2; + break; + case ZYDIS_MACHINE_MODE_LONG_64: + index += 4; + index += (context->cache.W & 0x01) << 1; + break; + default: + ZYAN_UNREACHABLE; + } + + 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]; + + switch (instruction->operand_width) + { + case 16: + context->eosz_index = 0; + break; + case 32: + context->eosz_index = 1; + break; + case 64: + context->eosz_index = 2; + break; + default: + ZYAN_UNREACHABLE; + } + + // 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; + switch (context->decoder->address_width) + { + case ZYDIS_ADDRESS_WIDTH_16: + index += 0; + break; + case ZYDIS_ADDRESS_WIDTH_32: + index += 2; + break; + case ZYDIS_ADDRESS_WIDTH_64: + index += 4; + break; + default: + ZYAN_UNREACHABLE; + } + 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]; + + switch (instruction->address_width) + { + case 16: + context->easz_index = 0; + break; + case 32: + context->easz_index = 1; + break; + case 64: + context->easz_index = 2; + break; + default: + ZYAN_UNREACHABLE; + } +} + +/* ---------------------------------------------------------------------------------------------- */ + +static ZyanStatus ZydisNodeHandlerXOP(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(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(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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + 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(context, 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(context, instruction, &next_input)); + if (((next_input & 0xF0) >= 0xC0) || + (context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64)) + { + if (instruction->attributes & ZYDIS_ATTRIB_HAS_REX) + { + return ZYDIS_STATUS_ILLEGAL_REX; + } + if (context->prefixes.has_lock) + { + return ZYDIS_STATUS_ILLEGAL_LOCK; + } + if (context->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(context, 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(context, 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(context, 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(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 (context->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(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(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(context, instruction, &next_input)); + if ((next_input & 0x1F) >= 8) + { + if (instruction->attributes & ZYDIS_ATTRIB_HAS_REX) + { + return ZYDIS_STATUS_ILLEGAL_REX; + } + if (context->prefixes.has_lock) + { + return ZYDIS_STATUS_ILLEGAL_LOCK; + } + if (context->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(context, instruction, &prefixBytes[1], 2)); + // Decode xop-prefix + instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_XOP; + ZYAN_CHECK(ZydisDecodeXOP(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 (context->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(context, instruction, &instruction->opcode)); + break; + } + + *index = instruction->opcode; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerMode(ZydisDecoderContext* context, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(index); + + switch (context->decoder->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(ZydisDecoderContext* context, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(index); + + *index = (context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) ? 0 : 1; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerModrmMod(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + if (!instruction->raw.modrm.offset) + { + instruction->raw.modrm.offset = instruction->length; + ZyanU8 modrm_byte; + ZYAN_CHECK(ZydisInputNext(context, instruction, &modrm_byte)); + ZydisDecodeModRM(instruction, modrm_byte); + } + *index = instruction->raw.modrm.mod; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerModrmModCompact(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_CHECK(ZydisNodeHandlerModrmMod(context, instruction, index)); + *index = (*index == 0x3) ? 0 : 1; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerModrmReg(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + if (!instruction->raw.modrm.offset) + { + instruction->raw.modrm.offset = instruction->length; + ZyanU8 modrm_byte; + ZYAN_CHECK(ZydisInputNext(context, instruction, &modrm_byte)); + ZydisDecodeModRM(instruction, modrm_byte); + } + *index = instruction->raw.modrm.reg; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerModrmRm(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + if (!instruction->raw.modrm.offset) + { + instruction->raw.modrm.offset = instruction->length; + ZyanU8 modrm_byte; + ZYAN_CHECK(ZydisInputNext(context, instruction, &modrm_byte)); + ZydisDecodeModRM(instruction, modrm_byte); + } + *index = instruction->raw.modrm.rm; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerMandatoryPrefix(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + switch (context->prefixes.mandatory_candidate) + { + case 0x66: + instruction->raw.prefixes[context->prefixes.offset_mandatory].type = + ZYDIS_PREFIX_TYPE_MANDATORY; + instruction->attributes &= ~ZYDIS_ATTRIB_HAS_OPERANDSIZE; + *index = 2; + break; + case 0xF3: + instruction->raw.prefixes[context->prefixes.offset_mandatory].type = + ZYDIS_PREFIX_TYPE_MANDATORY; + *index = 3; + break; + case 0xF2: + instruction->raw.prefixes[context->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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + ZYAN_ASSERT(instruction); + ZYAN_ASSERT(index); + + if ((context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && (context->cache.W)) + { + *index = 2; + } else + { + if (instruction->attributes & ZYDIS_ATTRIB_HAS_OPERANDSIZE) + { + instruction->raw.prefixes[context->prefixes.offset_osz_override].type = + ZYDIS_PREFIX_TYPE_EFFECTIVE; + } + switch (context->decoder->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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, ZyanU16* index) +{ + ZYAN_ASSERT(context); + 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 (context->decoder->address_width) + { + case ZYDIS_ADDRESS_WIDTH_16: + *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 1 : 0; + break; + case ZYDIS_ADDRESS_WIDTH_32: + *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 0 : 1; + break; + case ZYDIS_ADDRESS_WIDTH_64: + *index = (instruction->attributes & ZYDIS_ATTRIB_HAS_ADDRESSSIZE) ? 1 : 2; + break; + default: + ZYAN_UNREACHABLE; + } + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerVectorLength(ZydisDecoderContext* context, + 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->cache.LL; + if (*index == 3) + { + return ZYDIS_STATUS_DECODING_ERROR; + } + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerRexW(ZydisDecoderContext* context, + 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->cache.W; + return ZYAN_STATUS_SUCCESS; +} + +static ZyanStatus ZydisNodeHandlerRexB(ZydisDecoderContext* context, + 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->cache.B; + return ZYAN_STATUS_SUCCESS; +} + +#ifndef ZYDIS_DISABLE_AVX512 +static ZyanStatus ZydisNodeHandlerEvexB(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(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 + +/* ---------------------------------------------------------------------------------------------- */ + +/** + * Checks for certain post-decode error-conditions. + * + * @param context A pointer to the `ZydisDecoderContext` instance. + * @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(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition) +{ + const ZydisRegisterConstraint constr_REG = definition->constr_REG; + const ZydisRegisterConstraint constr_RM = definition->constr_RM; + // We set this to `NONE` instead of `UNUSED` to save up some unnecessary runtime checks + ZydisRegisterConstraint constr_NDSNDD = ZYDIS_REG_CONSTRAINTS_NONE; + ZyanBool has_VSIB = ZYAN_FALSE; + ZyanBool is_gather = ZYAN_FALSE; + ZyanBool no_source_dest_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 && + (context->decoder->machine_mode == ZYDIS_MACHINE_MODE_REAL_16)) + { + return ZYDIS_STATUS_DECODING_ERROR; + } + + if (def->no_compat_mode && + ((context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_COMPAT_16) || + (context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_COMPAT_32))) + { + return ZYDIS_STATUS_DECODING_ERROR; + } + + if (context->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; + constr_NDSNDD = def->constr_NDSNDD; + break; + } + case ZYDIS_INSTRUCTION_ENCODING_VEX: + { + const ZydisInstructionDefinitionVEX* def = + (const ZydisInstructionDefinitionVEX*)definition; + constr_NDSNDD = def->constr_NDSNDD; + is_gather = def->is_gather; + break; + } + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + { +#ifndef ZYDIS_DISABLE_AVX512 + const ZydisInstructionDefinitionEVEX* def = + (const ZydisInstructionDefinitionEVEX*)definition; + constr_NDSNDD = def->constr_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; + constr_NDSNDD = def->constr_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; + } + + // Validate register constraints + switch (constr_REG) + { + case ZYDIS_REG_CONSTRAINTS_UNUSED: + case ZYDIS_REG_CONSTRAINTS_NONE: + break; + case ZYDIS_REG_CONSTRAINTS_GPR: + if ((context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && context->cache.R2) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + case ZYDIS_REG_CONSTRAINTS_SR_DEST: + // `ZYDIS_REGISTER_CS` is not allowed as `MOV` target + if (instruction->raw.modrm.reg == 1) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + ZYAN_FALLTHROUGH; + case ZYDIS_REG_CONSTRAINTS_SR: + { + if (instruction->raw.modrm.reg > 5) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + } + case ZYDIS_REG_CONSTRAINTS_CR: + { + // Attempts to reference CR1, CR5, CR6, CR7, and CR9CR15 result in undefined opcode (#UD) + // exceptions + const ZyanU8 value = instruction->raw.modrm.reg | (context->cache.R << 3); + static const ZyanU8 lookup[16] = + { + 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 + }; + ZYAN_ASSERT(value < ZYAN_ARRAY_LENGTH(lookup)); + if (!lookup[value]) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + } + case ZYDIS_REG_CONSTRAINTS_DR: + // Attempts to reference DR8DR15 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, + // we just allow them. + if (context->cache.R) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + case ZYDIS_REG_CONSTRAINTS_MASK: + if ((context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (context->cache.R || context->cache.R2)) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + case ZYDIS_REG_CONSTRAINTS_BND: + ZYAN_ASSERT(!context->cache.R2); + if (context->cache.R || instruction->raw.modrm.reg > 3) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + default: + ZYAN_UNREACHABLE; + } + switch (constr_RM) + { + case ZYDIS_REG_CONSTRAINTS_UNUSED: + case ZYDIS_REG_CONSTRAINTS_NONE: + break; + case ZYDIS_REG_CONSTRAINTS_SR_DEST: + // `ZYDIS_REGISTER_CR` is not allowed as `MOV` target + if (instruction->raw.modrm.rm == 1) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + ZYAN_FALLTHROUGH; + case ZYDIS_REG_CONSTRAINTS_SR: + { + if (instruction->raw.modrm.rm > 6) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + } + case ZYDIS_REG_CONSTRAINTS_MASK: + break; + case ZYDIS_REG_CONSTRAINTS_BND: + if (context->cache.B || instruction->raw.modrm.rm > 3) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + case ZYDIS_REG_CONSTRAINTS_VSIB: + has_VSIB = ZYAN_TRUE; + break; + case ZYDIS_REG_CONSTRAINTS_NO_REL: + if ((context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (instruction->raw.modrm.mod == 0) && + (instruction->raw.modrm.rm == 5)) + { + return ZYDIS_STATUS_DECODING_ERROR; + } + break; + default: + ZYAN_UNREACHABLE; + } + switch (constr_NDSNDD) + { + case ZYDIS_REG_CONSTRAINTS_UNUSED: + // `.vvvv` is not allowed, if the instruction does not encode a NDS/NDD operand + if (context->cache.v_vvvv & 0x0F) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + // `.v'` is not allowed, if the instruction does not encode a NDS/NDD or VSIB operand + if (!has_VSIB && context->cache.V2) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + case ZYDIS_REG_CONSTRAINTS_NONE: + ZYAN_ASSERT(!has_VSIB || ((instruction->encoding != ZYDIS_INSTRUCTION_ENCODING_EVEX) && + (instruction->encoding != ZYDIS_INSTRUCTION_ENCODING_MVEX))); + break; + case ZYDIS_REG_CONSTRAINTS_GPR: + // `.v'` is invalid for GPR-registers + if (context->cache.V2) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + case ZYDIS_REG_CONSTRAINTS_MASK: + if ((context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) && + (context->cache.v_vvvv > 7)) + { + return ZYDIS_STATUS_BAD_REGISTER; + } + break; + default: + ZYAN_UNREACHABLE; + } + + // Check gather registers + if (is_gather) + { + ZYAN_ASSERT(has_VSIB); + ZYAN_ASSERT(instruction->raw.modrm.mod != 3); + ZYAN_ASSERT(instruction->raw.modrm.rm == 4); + + ZyanU8 dest = instruction->raw.modrm.reg; + ZyanU8 index = instruction->raw.sib.index; + ZyanU8 mask = 0xF0; + if (context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + dest = dest | (context->cache.R << 3) | (context->cache.R2 << 4); + index = index | (context->cache.X << 3) | (context->cache.V2 << 4); + } + + switch (instruction->encoding) + { + case ZYDIS_INSTRUCTION_ENCODING_VEX: + ZYAN_ASSERT((constr_REG == ZYDIS_REG_CONSTRAINTS_NONE) && + (constr_RM == ZYDIS_REG_CONSTRAINTS_VSIB) && + (constr_NDSNDD == ZYDIS_REG_CONSTRAINTS_NONE)); + if (context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + mask = context->cache.v_vvvv; + } else + { + // Ignore the high-register bits in 16- and 32-bit mode + mask = context->cache.v_vvvv & 0x07; + } + break; + case ZYDIS_INSTRUCTION_ENCODING_EVEX: + case ZYDIS_INSTRUCTION_ENCODING_MVEX: + ZYAN_ASSERT(((constr_REG == ZYDIS_REG_CONSTRAINTS_UNUSED) || + (constr_REG == ZYDIS_REG_CONSTRAINTS_NONE)) && + (constr_RM == ZYDIS_REG_CONSTRAINTS_VSIB) && + (constr_NDSNDD == ZYDIS_REG_CONSTRAINTS_UNUSED)); + + // Some gather instructions (like `VGATHERPF0{D|Q}{PS|PD}`) do not have a destination + // operand + if (constr_REG == ZYDIS_REG_CONSTRAINTS_UNUSED) + { + dest = 0xF1; + } + break; + default: + ZYAN_UNREACHABLE; + } + // 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); + + ZyanU8 dest = instruction->raw.modrm.reg; + ZyanU8 source1 = context->cache.v_vvvv; + ZyanU8 source2 = instruction->raw.modrm.rm; + + if (context->decoder->machine_mode == ZYDIS_MACHINE_MODE_LONG_64) + { + dest = dest | (context->cache.R << 3) | (context->cache.R2 << 4); + source2 = source2 | (context->cache.B << 3) | (context->cache.X << 4); + } else + { + source1 = source1 & 0x07; + } + + if ((dest == source1) || ((dest == source2) && (instruction->raw.modrm.mod == 3))) + { + 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->cache.mask) + { + return ZYDIS_STATUS_INVALID_MASK; + } + break; + case ZYDIS_MASK_POLICY_FORBIDDEN: + if (context->cache.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 context A pointer to the `ZydisDecoderContext` instance. + * @param instruction A pointer to the `ZydisDecodedInstruction` struct. + * + * @return A zyan status code. + */ +static ZyanStatus ZydisDecodeInstruction(ZydisDecoderContext* context, + ZydisDecodedInstruction* instruction) +{ + ZYAN_ASSERT(context); + 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 (context->prefixes.mandatory_candidate != 0x00) + { + instruction->raw.prefixes[context->prefixes.offset_mandatory].type = + ZYDIS_PREFIX_TYPE_IGNORED; + } + if (context->prefixes.mandatory_candidate == 0x66) + { + if (context->prefixes.offset_osz_override == + context->prefixes.offset_mandatory) + { + instruction->raw.prefixes[context->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(context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODE: + status = ZydisNodeHandlerMode(context, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODE_COMPACT: + status = ZydisNodeHandlerModeCompact(context, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODRM_MOD: + status = ZydisNodeHandlerModrmMod(context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT: + status = ZydisNodeHandlerModrmModCompact(context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODRM_REG: + status = ZydisNodeHandlerModrmReg(context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_MODRM_RM: + status = ZydisNodeHandlerModrmRm(context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1: + index = context->prefixes.group1 ? 1 : 0; + break; + case ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX: + status = ZydisNodeHandlerMandatoryPrefix(context, instruction, &index); + temp = ZydisDecoderTreeGetChildNode(node, 0); + // TODO: Return to this point, if index == 0 contains a value and the previous path + // TODO: was not successfull + // TODO: Restore consumed prefix + break; + case ZYDIS_NODETYPE_FILTER_OPERAND_SIZE: + status = ZydisNodeHandlerOperandSize(context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE: + status = ZydisNodeHandlerAddressSize(context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH: + status = ZydisNodeHandlerVectorLength(context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_REX_W: + status = ZydisNodeHandlerRexW(context, instruction, &index); + break; + case ZYDIS_NODETYPE_FILTER_REX_B: + status = ZydisNodeHandlerRexB(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 = context->decoder->decoder_mode[ZYDIS_DECODER_MODE_AMD_BRANCHES] ? 1 : 0; + break; + case ZYDIS_NODETYPE_FILTER_MODE_KNC: + index = context->decoder->decoder_mode[ZYDIS_DECODER_MODE_KNC] ? 1 : 0; + break; + case ZYDIS_NODETYPE_FILTER_MODE_MPX: + index = context->decoder->decoder_mode[ZYDIS_DECODER_MODE_MPX] ? 1 : 0; + break; + case ZYDIS_NODETYPE_FILTER_MODE_CET: + index = context->decoder->decoder_mode[ZYDIS_DECODER_MODE_CET] ? 1 : 0; + break; + case ZYDIS_NODETYPE_FILTER_MODE_LZCNT: + index = context->decoder->decoder_mode[ZYDIS_DECODER_MODE_LZCNT] ? 1 : 0; + break; + case ZYDIS_NODETYPE_FILTER_MODE_TZCNT: + index = context->decoder->decoder_mode[ZYDIS_DECODER_MODE_TZCNT] ? 1 : 0; + break; + case ZYDIS_NODETYPE_FILTER_MODE_WBNOINVD: + index = context->decoder->decoder_mode[ZYDIS_DECODER_MODE_WBNOINVD] ? 1 : 0; + break; + case ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE: + index = context->decoder->decoder_mode[ZYDIS_DECODER_MODE_CLDEMOTE] ? 1 : 0; + break; + default: + if (node_type & ZYDIS_NODETYPE_DEFINITION_MASK) + { + const ZydisInstructionDefinition* definition; + ZydisGetInstructionDefinition(instruction->encoding, node->value, &definition); + ZydisSetEffectiveOperandWidth(context, instruction, definition); + ZydisSetEffectiveAddressWidth(context, instruction, definition); + + const ZydisInstructionEncodingInfo* info; + ZydisGetInstructionEncodingInfo(node, &info); + ZYAN_CHECK(ZydisDecodeOptionalInstructionParts(context, instruction, info)); + ZYAN_CHECK(ZydisCheckErrorConditions(context, instruction, definition)); + + if (instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_3DNOW) + { + // Get actual 3dnow opcode and definition + ZYAN_CHECK(ZydisInputNext(context, 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->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 (!context->decoder->decoder_mode[ZYDIS_DECODER_MODE_MINIMAL]) + { + ZydisSetAttributes(context, 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(context, instruction, definition); + break; + default: + break; + } + ZYAN_CHECK(ZydisDecodeOperands(context, instruction, definition)); + const ZydisAccessedFlags* flags; + if (ZydisGetAccessedFlags(definition, &flags)) + { + instruction->attributes |= ZYDIS_ATTRIB_CPUFLAG_ACCESS; + ZYAN_ASSERT((ZYAN_ARRAY_LENGTH(instruction->accessed_flags) == + ZYAN_ARRAY_LENGTH(flags->action )) && + (sizeof (instruction->accessed_flags) == + sizeof (flags->action ))); + ZYAN_MEMCPY(&instruction->accessed_flags, &flags->action, + sizeof(flags->action)); + + instruction->cpu_flags_read = flags->cpu_flags_read; + instruction->cpu_flags_written = flags->cpu_flags_written; + instruction->fpu_flags_read = flags->fpu_flags_read; + instruction->fpu_flags_written = flags->fpu_flags_written; + } + } +#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, + ZydisAddressWidth address_width) +{ + static const ZyanBool decoder_modes[ZYDIS_DECODER_MODE_MAX_VALUE + 1] = + { +#ifdef ZYDIS_MINIMAL_MODE + ZYAN_TRUE , // ZYDIS_DECODER_MODE_MINIMAL +#else + ZYAN_FALSE, // ZYDIS_DECODER_MODE_MINIMAL +#endif + ZYAN_FALSE, // ZYDIS_DECODER_MODE_AMD_BRANCHES + ZYAN_FALSE, // ZYDIS_DECODER_MODE_KNC + ZYAN_TRUE , // ZYDIS_DECODER_MODE_MPX + ZYAN_TRUE , // ZYDIS_DECODER_MODE_CET + ZYAN_TRUE , // ZYDIS_DECODER_MODE_LZCNT + ZYAN_TRUE , // ZYDIS_DECODER_MODE_TZCNT + ZYAN_FALSE, // ZYDIS_DECODER_MODE_WBNOINVD + ZYAN_TRUE // ZYDIS_DECODER_MODE_CLDEMOTE + }; + + if (!decoder) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + switch (machine_mode) + { + case ZYDIS_MACHINE_MODE_LONG_64: + if (address_width != ZYDIS_ADDRESS_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 ((address_width != ZYDIS_ADDRESS_WIDTH_16) && (address_width != ZYDIS_ADDRESS_WIDTH_32)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + break; + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + decoder->machine_mode = machine_mode; + decoder->address_width = address_width; + ZYAN_MEMCPY(&decoder->decoder_mode, &decoder_modes, sizeof(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 + + decoder->decoder_mode[mode] = enabled; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisDecoderDecodeBuffer(const ZydisDecoder* decoder, const void* buffer, + ZyanUSize length, ZydisDecodedInstruction* instruction) +{ + if (!decoder || !instruction) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + if (!buffer || !length) + { + return ZYDIS_STATUS_NO_MORE_DATA; + } + + ZydisDecoderContext context; + ZYAN_MEMSET(&context, 0, sizeof(context)); + context.decoder = decoder; + context.buffer = (const ZyanU8*)buffer; + context.buffer_len = length; + context.prefixes.offset_notrack = -1; + + ZYAN_MEMSET(instruction, 0, sizeof(*instruction)); + instruction->machine_mode = decoder->machine_mode; + + // Calculate stack width from address width using a mapping process: [0, 1, 2] -> [16, 32, 64] + instruction->stack_width = 16 << decoder->address_width; + + ZYAN_CHECK(ZydisCollectOptionalPrefixes(&context, instruction)); + ZYAN_CHECK(ZydisDecodeInstruction(&context, instruction)); + + return ZYAN_STATUS_SUCCESS; +} + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/DecoderData.c b/3rdparty/zydis/src/DecoderData.c new file mode 100644 index 0000000000..0b50304203 --- /dev/null +++ b/3rdparty/zydis/src/DecoderData.c @@ -0,0 +1,174 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +/* ============================================================================================== */ +/* Data tables */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Physical instruction encodings */ +/* ---------------------------------------------------------------------------------------------- */ + +#include + +/* ---------------------------------------------------------------------------------------------- */ +/* 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 } + +#include + +#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]; + 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]; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/Formatter.c b/3rdparty/zydis/src/Formatter.c new file mode 100644 index 0000000000..cb8d00c078 --- /dev/null +++ b/3rdparty/zydis/src/Formatter.c @@ -0,0 +1,702 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include +#include +#include +#include + +/* ============================================================================================== */ +/* 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 */ +/* ---------------------------------------------------------------------------------------------- */ + +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; +#if defined(ZYAN_NO_LIBC) // no-libc correlates quite well with kernel environments + // We can't use floats in kernel. Initialize them via memcpy hack. + // Note: this is only required in the backported version for Zydis v3.0. + // Newer version depend on a version of zycore that got rid of the floats. + + ZYAN_STATIC_ASSERT(sizeof(buffer->string.vector.growth_factor) == 4); + ZYAN_STATIC_ASSERT(sizeof(buffer->string.vector.shrink_threshold) == 4); + + ZYAN_MEMCPY(&buffer->string.vector.growth_factor, "\x00\x00\x80\x3F", 4); + ZYAN_MEMCPY(&buffer->string.vector.shrink_threshold, "\x00\x00\x00\x00", 4); +#else + buffer->string.vector.growth_factor = 1.0f; + buffer->string.vector.shrink_threshold = 0.0f; +#endif + 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'; +} + +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; +#if defined(ZYAN_NO_LIBC) // no-libc correlates quite well with kernel environments + // We can't use floats in kernel. Initialize them via memcpy hack. + // Note: this is only required in the backported version for Zydis v3.0. + // Newer version depend on a version of zycore that got rid of the floats. + + ZYAN_STATIC_ASSERT(sizeof(buffer->string.vector.growth_factor) == 4); + ZYAN_STATIC_ASSERT(sizeof(buffer->string.vector.shrink_threshold) == 4); + + ZYAN_MEMCPY(&buffer->string.vector.growth_factor, "\x00\x00\x80\x3F", 4); + ZYAN_MEMCPY(&buffer->string.vector.shrink_threshold, "\x00\x00\x00\x00", 4); +#else + buffer->string.vector.growth_factor = 1.0f; + buffer->string.vector.shrink_threshold = 0.0f; +#endif + 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_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, char* buffer, ZyanUSize length, + ZyanU64 runtime_address) +{ + return ZydisFormatterFormatInstructionEx(formatter, instruction, buffer, length, + runtime_address, ZYAN_NULL); +} + +ZyanStatus ZydisFormatterFormatInstructionEx(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, char* buffer, ZyanUSize length, + ZyanU64 runtime_address, void* user_data) +{ + if (!formatter || !instruction || !buffer || (length == 0)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZydisFormatterBuffer formatter_buffer; + ZydisFormatterBufferInit(&formatter_buffer, buffer, length); + + ZydisFormatterContext context; + context.instruction = instruction; + 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, ZyanU8 index, char* buffer, ZyanUSize length, + ZyanU64 runtime_address) +{ + return ZydisFormatterFormatOperandEx(formatter, instruction, index, buffer, length, + runtime_address, ZYAN_NULL); +} + +ZyanStatus ZydisFormatterFormatOperandEx(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, ZyanU8 index, char* buffer, ZyanUSize length, + ZyanU64 runtime_address, void* user_data) +{ + if (!formatter || !instruction || index >= instruction->operand_count || !buffer || + (length == 0)) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + ZydisFormatterBuffer formatter_buffer; + ZydisFormatterBufferInit(&formatter_buffer, buffer, length); + + ZydisFormatterContext context; + context.instruction = instruction; + context.runtime_address = runtime_address; + context.operand = &instruction->operands[index]; + 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, void* buffer, ZyanUSize length, + ZyanU64 runtime_address, ZydisFormatterTokenConst** token) +{ + return ZydisFormatterTokenizeInstructionEx(formatter, instruction, buffer, length, + runtime_address, token, ZYAN_NULL); +} + +ZyanStatus ZydisFormatterTokenizeInstructionEx(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, void* buffer, ZyanUSize length, + ZyanU64 runtime_address, ZydisFormatterTokenConst** token, void* user_data) +{ + if (!formatter || !instruction || !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.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, ZyanU8 index, void* buffer, ZyanUSize length, + ZyanU64 runtime_address, ZydisFormatterTokenConst** token) +{ + return ZydisFormatterTokenizeOperandEx(formatter, instruction, index, buffer, length, + runtime_address, token, ZYAN_NULL); +} + +ZyanStatus ZydisFormatterTokenizeOperandEx(const ZydisFormatter* formatter, + const ZydisDecodedInstruction* instruction, ZyanU8 index, void* buffer, ZyanUSize length, + ZyanU64 runtime_address, ZydisFormatterTokenConst** token, void* user_data) +{ + if (!formatter || !instruction || (index >= instruction->operand_count) || !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.runtime_address = runtime_address; + context.operand = &instruction->operands[index]; + 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; +} + +/* ============================================================================================== */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/FormatterATT.c b/3rdparty/zydis/src/FormatterATT.c new file mode 100644 index 0000000000..15396c7405 --- /dev/null +++ b/3rdparty/zydis/src/FormatterATT.c @@ -0,0 +1,424 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + +#include + +/* ============================================================================================== */ +/* Formatter functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Instruction */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterATTFormatInstruction(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + 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); + ZyanI8 c = (ZyanI8)context->instruction->operand_count - 1; + for (; c >= 0; --c) + { + if (context->instruction->operands[c].visibility != ZYDIS_OPERAND_VISIBILITY_HIDDEN) + { + break; + } + } + + for (ZyanI8 i = c; i >= 0; --i) + { + const ZydisDecodedOperand* const operand = &context->instruction->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->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 = ZYAN_FALSE; + if (i == (context->instruction->operand_count - 1)) + { + decorate_operand = operand->type != ZYDIS_OPERAND_TYPE_IMMEDIATE; + } + else + { + decorate_operand = + (context->instruction->operands[i + 1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE) || + (context->instruction->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); + + 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; ++i) + { + const ZydisDecodedOperand* const operand = &context->instruction->operands[i]; + if (operand->visibility == ZYDIS_OPERAND_VISIBILITY_HIDDEN) + { + break; + } + if ((operand->type == ZYDIS_OPERAND_TYPE_MEMORY) && + (operand->mem.type == ZYDIS_MEMOP_TYPE_MEM)) + { + size = ZydisFormatterHelperGetExplicitSize(formatter, context, i); + 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->instruction->operands[0].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, 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); + 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); +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/FormatterBase.c b/3rdparty/zydis/src/FormatterBase.c new file mode 100644 index 0000000000..a2eddf9e7a --- /dev/null +++ b/3rdparty/zydis/src/FormatterBase.c @@ -0,0 +1,782 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + +#include + +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, ZyanU8 memop_id) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(context); + ZYAN_ASSERT(memop_id < context->instruction->operand_count); + + const ZydisDecodedOperand* const operand = &context->instruction->operands[memop_id]; + ZYAN_ASSERT(operand->type == ZYDIS_OPERAND_TYPE_MEMORY); + ZYAN_ASSERT(operand->mem.type == ZYDIS_MEMOP_TYPE_MEM); + + if (formatter->force_memory_size) + { + return operand->size; + } + + switch (operand->id) + { + case 0: + if ((context->instruction->operands[1].type == ZYDIS_OPERAND_TYPE_UNUSED) || + (context->instruction->operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE)) + { + return context->instruction->operands[0].size; + } + if (context->instruction->operands[0].size != context->instruction->operands[1].size) + { + return context->instruction->operands[0].size; + } + if ((context->instruction->operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER) && + (context->instruction->operands[1].visibility == ZYDIS_OPERAND_VISIBILITY_IMPLICIT) && + (context->instruction->operands[1].reg.value == ZYDIS_REGISTER_CL)) + { + return context->instruction->operands[0].size; + } + break; + case 1: + case 2: + if (context->instruction->operands[operand->id - 1].size != + context->instruction->operands[operand->id].size) + { + return context->instruction->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); + 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); + + 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->stack_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); + + 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->stack_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, 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); + 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, 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); + + 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_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; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/FormatterBuffer.c b/3rdparty/zydis/src/FormatterBuffer.c new file mode 100644 index 0000000000..8781a899b3 --- /dev/null +++ b/3rdparty/zydis/src/FormatterBuffer.c @@ -0,0 +1,191 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* 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; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/FormatterIntel.c b/3rdparty/zydis/src/FormatterIntel.c new file mode 100644 index 0000000000..abe794f623 --- /dev/null +++ b/3rdparty/zydis/src/FormatterIntel.c @@ -0,0 +1,453 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include +#include + +/* ============================================================================================== */ +/* Constants */ +/* ============================================================================================== */ + +#include + +/* ============================================================================================== */ +/* Formatter functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Intel */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisFormatterIntelFormatInstruction(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZYAN_ASSERT(formatter); + ZYAN_ASSERT(buffer); + ZYAN_ASSERT(context); + + 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; ++i) + { + const ZydisDecodedOperand* const operand = &context->instruction->operands[i]; + + if (operand->visibility == ZYDIS_OPERAND_VISIBILITY_HIDDEN) + { + break; + } + + // 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->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 = ZYAN_FALSE; + if (i == (context->instruction->operand_count - 1)) + { + decorate_operand = operand->type != ZYDIS_OPERAND_TYPE_IMMEDIATE; + } + else + { + decorate_operand = + (context->instruction->operands[i + 1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE) || + (context->instruction->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) + { + 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); + 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); + 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->id)) + { + 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->stack_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, + ZYAN_TRUE); + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/Generated/AccessedFlags.inc b/3rdparty/zydis/src/Generated/AccessedFlags.inc new file mode 100644 index 0000000000..c531a70b2d --- /dev/null +++ b/3rdparty/zydis/src/Generated/AccessedFlags.inc @@ -0,0 +1,78 @@ +#ifndef ZYDIS_MINIMAL_MODE +static const ZydisAccessedFlags ACCESSED_FLAGS[] = +{ + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED }, 0x0, 0x0, 0x0, 0xF }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_UNDEFINED }, 0x0, 0x0, 0x0, 0xF }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED }, 0x0, 0x0, 0x0, 0xF }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED }, 0x0, 0x0, 0x0, 0xF }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x40000, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_1, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x40000, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x1000, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x800, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x800, 0x800, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x400, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x1400, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x400, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_1, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x400, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x1000, 0x80200, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x30200, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x21800, 0x74300, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x21000, 0xF4300, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x80, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x880, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x40, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED }, 0x40, 0x0, 0x0, 0xF }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x8C0, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x40, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x4, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED }, 0x4, 0x0, 0x0, 0xF }, + { { ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D4, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x1, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED }, 0x1, 0x0, 0x0, 0xF }, + { { ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x41, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED }, 0x41, 0x0, 0x0, 0xF }, + { { ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0xD5, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x3F5FD5, 0x0, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x1, 0x1, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x1, 0x801, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x11, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x1, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x1, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x1, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x801, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x41, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x440, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0xD5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x400, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x25000, 0x3F5FD5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x21000, 0x3D5FD5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_TESTED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x121000, 0x2D5FD5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x3F5FD5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x3D5FD5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x3F5FD5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x2 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_TESTED_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x10, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x895, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x1, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_SET_0, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_SET_1, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x1, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_MODIFIED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 }, + { { ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_UNDEFINED, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE, ZYDIS_CPUFLAG_ACTION_NONE }, 0x0, 0x8D5, 0x0, 0x0 } +}; +#endif diff --git a/3rdparty/zydis/src/Generated/DecoderTables.inc b/3rdparty/zydis/src/Generated/DecoderTables.inc new file mode 100644 index 0000000000..b918d7f499 --- /dev/null +++ b/3rdparty/zydis/src/Generated/DecoderTables.inc @@ -0,0 +1,7585 @@ +const ZydisDecoderTreeNode FILTERS_XOP[][13] = +{ + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3ED), 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, 0x43A), 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, 0x723), 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, 0x158), 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(0x6, 0x22), ZYDIS_DEFINITION(0x7, 0x23), 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(0x3, 0x3EE), ZYDIS_DEFINITION(0x7, 0x3EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPCODE, 0x1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x140), 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_DEFINITION(0x6, 0xC), ZYDIS_DEFINITION(0x7, 0xD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x56), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x57), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x144), 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_DEFINITION(0x6, 0x640), ZYDIS_DEFINITION(0x7, 0x641), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x58), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x59), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x148), 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_DEFINITION(0x6, 0x58), ZYDIS_DEFINITION(0x7, 0x59), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x14C), 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_DEFINITION(0x6, 0x6E9), ZYDIS_DEFINITION(0x7, 0x6EA), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x150), 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_DEFINITION(0x3, 0x76C), ZYDIS_DEFINITION(0x7, 0x76D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x154), 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_DEFINITION(0x6, 0xE7), ZYDIS_DEFINITION(0x7, 0xE8), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5F), 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_DEFINITION(0x0, 0x5C2), ZYDIS_DEFINITION(0x0, 0x5C2), ZYDIS_DEFINITION(0x0, 0x5C2), ZYDIS_DEFINITION(0x0, 0x5C2), ZYDIS_DEFINITION(0x0, 0x5C2), ZYDIS_DEFINITION(0x0, 0x5C2), ZYDIS_DEFINITION(0x0, 0x5C2), ZYDIS_DEFINITION(0x0, 0x5C2), ZYDIS_DEFINITION(0x0, 0x518), ZYDIS_DEFINITION(0x0, 0x518), ZYDIS_DEFINITION(0x0, 0x518), ZYDIS_DEFINITION(0x0, 0x518), ZYDIS_DEFINITION(0x0, 0x518), ZYDIS_DEFINITION(0x0, 0x518), ZYDIS_DEFINITION(0x0, 0x518), ZYDIS_DEFINITION(0x0, 0x518), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EMVEX, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3DB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x7, 0x5C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3DC), ZYDIS_DEFINITION(0x6, 0x5C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A4), 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_MODE_COMPACT, 0xAC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAE), 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_MODRM_MOD_COMPACT, 0x3DE), 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_XOP, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A8), ZYDIS_DEFINITION(0x0, 0x75B), ZYDIS_DEFINITION(0x0, 0x75B), ZYDIS_DEFINITION(0x0, 0x75B), ZYDIS_DEFINITION(0x0, 0x75B), ZYDIS_DEFINITION(0x0, 0x75B), ZYDIS_DEFINITION(0x0, 0x75B), ZYDIS_DEFINITION(0x0, 0x75B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xCC), ZYDIS_DEFINITION(0x0, 0x207), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xCD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xCE), ZYDIS_DEFINITION(0x0, 0x629), ZYDIS_DEFINITION(0x0, 0x2BD), ZYDIS_DEFINITION(0x2, 0x30D), ZYDIS_DEFINITION(0x2, 0x30E), ZYDIS_DEFINITION(0x2, 0x30F), ZYDIS_DEFINITION(0x2, 0x310), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1A9), 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_DEFINITION(0x6, 0x70B), ZYDIS_DEFINITION(0x7, 0x70C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x1AD), 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_DEFINITION(0x3, 0x311), ZYDIS_DEFINITION(0x3, 0x311), ZYDIS_DEFINITION(0x3, 0x311), ZYDIS_DEFINITION(0x3, 0x311), ZYDIS_DEFINITION(0x3, 0x311), ZYDIS_DEFINITION(0x3, 0x311), ZYDIS_DEFINITION(0x3, 0x311), ZYDIS_DEFINITION(0x3, 0x311), ZYDIS_DEFINITION(0x5, 0x312), ZYDIS_DEFINITION(0x5, 0x312), ZYDIS_DEFINITION(0x5, 0x312), ZYDIS_DEFINITION(0x5, 0x312), ZYDIS_DEFINITION(0x5, 0x312), ZYDIS_DEFINITION(0x5, 0x312), ZYDIS_DEFINITION(0x5, 0x312), ZYDIS_DEFINITION(0x5, 0x312), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x438), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x439), ZYDIS_DEFINITION(0x4, 0x5FD), ZYDIS_DEFINITION(0x0, 0x5FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VEX, 0x0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VEX, 0x1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x724), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x725), ZYDIS_DEFINITION(0x11, 0x174), ZYDIS_DEFINITION(0x0, 0x2C4), ZYDIS_DEFINITION(0x4, 0x5FF), ZYDIS_DEFINITION(0x0, 0x600), ZYDIS_DEFINITION(0x0, 0x251), ZYDIS_DEFINITION(0x3, 0x24F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x20), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x726), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x120), ZYDIS_DEFINITION(0x0, 0x763), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x72E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x72F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x730), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x731), ZYDIS_DEFINITION(0x8, 0x2E0), ZYDIS_DEFINITION(0x8, 0x2DF), ZYDIS_DEFINITION(0x8, 0x2DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x121), ZYDIS_DEFINITION(0x3, 0x232), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x25), ZYDIS_DEFINITION(0x3, 0x3FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x26), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x125), ZYDIS_DEFINITION(0x0, 0x235), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x27), ZYDIS_DEFINITION(0x0, 0x3FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x28), ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x250), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x21E), ZYDIS_DEFINITION(0x0, 0xBE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x732), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x733), ZYDIS_DEFINITION(0x0, 0xB2), ZYDIS_DEFINITION(0x0, 0x6CD), ZYDIS_DEFINITION(0x0, 0xB8), ZYDIS_DEFINITION(0x0, 0x6D0), ZYDIS_DEFINITION(0x0, 0xB3), ZYDIS_DEFINITION(0x0, 0x6CE), 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, 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, 0x1B), ZYDIS_DEFINITION(0x0, 0xBA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1C), ZYDIS_DEFINITION(0x0, 0x253), ZYDIS_DEFINITION(0x0, 0x747), ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x722), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xC), ZYDIS_DEFINITION(0x0, 0x1A4), 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, 0x29), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2C), 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, 0x74A), ZYDIS_DEFINITION(0x0, 0x5FB), ZYDIS_DEFINITION(0x0, 0x5F1), ZYDIS_DEFINITION(0x0, 0x5F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2E), 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, 0xA1), 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_MANDATORY_PREFIX, 0x129), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xD9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xDA), 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_MODE_COMPACT, 0x3F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x40), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x41), 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_MODRM_MOD_COMPACT, 0xDE), 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_DEFINITION(0x0, 0x5C7), ZYDIS_DEFINITION(0x0, 0x51B), ZYDIS_DEFINITION(0x0, 0x110), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xEE), 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_DEFINITION(0x0, 0x5C8), ZYDIS_DEFINITION(0x0, 0x51C), ZYDIS_DEFINITION(0x0, 0x623), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0xF3), 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_DEFINITION(0x0, 0x96), ZYDIS_DEFINITION(0x0, 0x96), ZYDIS_DEFINITION(0x0, 0x96), ZYDIS_DEFINITION(0x0, 0x96), ZYDIS_DEFINITION(0x0, 0x96), ZYDIS_DEFINITION(0x0, 0x96), ZYDIS_DEFINITION(0x0, 0x96), ZYDIS_DEFINITION(0x0, 0x96), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x110), 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_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_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, 0x85), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x8D), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x91), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x92), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x93), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x94), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x95), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x96), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x97), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x98), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x9C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x9D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x9E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x159), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x161), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x162), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x163), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x164), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x165), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x166), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x167), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x173), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x174), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x175), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x176), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x177), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x178), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x179), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x17B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x17D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x17E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x181), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x182), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x183), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x184), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x18C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x18F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x199), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19A), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x19E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x19F), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C2), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x1C8), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1CB), 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, 0x1CC), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1D2), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1EA), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F0), 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_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1F9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1FB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x1FC), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x203), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x219), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x22A), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x230), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x23A), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x23E), 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_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, 0x243), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x247), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x252), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x253), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x257), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x258), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x25D), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x26B), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x275), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x281), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x282), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x283), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x284), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x285), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x289), ZYDIS_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, 0x28A), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x28E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x28F), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x290), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x291), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x292), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x293), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x297), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x298), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A0), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2A9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x2AA), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2AF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B2), 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, 0x2B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2B5), 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_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x2B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2BA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2BB), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x2BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2C3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x2C4), 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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2CE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x2CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2D1), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x2D5), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2DF), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2E9), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x2F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x2F7), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2F9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x2FA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x2FB), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x303), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x304), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x305), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x309), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x30A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x30D), 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_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, 0x313), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x31E), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x324), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x325), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x326), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x32C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x32E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x32F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x330), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x338), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x339), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33A), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x33C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x33E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x33F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x340), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x341), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x342), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x343), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x344), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x345), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x346), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x347), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x348), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x349), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x34A), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x34E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x34F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x350), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x354), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x358), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x359), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x35B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x35C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x35D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x35E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x360), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x361), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x362), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x363), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x364), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x365), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x367), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x368), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x369), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36B), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x36F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x370), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x371), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x372), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x373), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x374), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x375), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x376), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x377), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x378), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x379), 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, 0x37A), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x37E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x381), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x382), 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, 0x383), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x384), 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, 0x385), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x386), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x387), 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_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, 0x38B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x38C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x38D), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x391), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x392), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x393), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x394), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x395), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x396), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x39A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x39B), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A5), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3A9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x3AA), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AD), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3AF), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3B6), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3BA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3BB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3BC), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C0), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C1), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x3CB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x3CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3CF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3D2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 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_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_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_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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_MODE_COMPACT, 0xD0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_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_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, 0x49F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A0), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x455), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x456), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x4A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4A3), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4AE), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x4BD), ZYDIS_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, 0xE3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE4), 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, 0x4BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C1), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C2), ZYDIS_INVALID, 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x4C8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x4D2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x4D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x4E), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D7), 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_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4DD), 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_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, 0x4E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E2), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E3), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x4E4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4E5), ZYDIS_INVALID, 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4ED), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4EF), 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_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4F7), 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_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, 0x515), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x516), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x517), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x518), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x519), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x51C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x51F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x522), ZYDIS_INVALID, 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_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_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x52C), 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_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_INVALID, 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_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_INVALID }, + { 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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x564), ZYDIS_INVALID, ZYDIS_INVALID, 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_INVALID, 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x56D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x56E), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x573), 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_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_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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x52), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x33), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x596), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x597), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x598), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x599), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x59A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x59C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x34), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x35), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x36), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x37), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x626), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x629), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x636), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x639), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5AF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x646), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x649), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x5B4), 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, 0x5B5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5B9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x5BA), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5BE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C0), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x66A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x66B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5C6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D0), ZYDIS_INVALID, ZYDIS_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, 0x5D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5D7), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DB), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DC), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5DE), 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_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_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5E9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6AC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5EF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x5F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F3), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x5F4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x6C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x100), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x101), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x102), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x6D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x5F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5F9), ZYDIS_INVALID, ZYDIS_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, 0x5FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5FB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x5FE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x600), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x601), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x38), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_INVALID, 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x607), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x10D), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x6FC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FF), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x700), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x701), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x702), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x703), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x608), 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, 0x609), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x60B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x60F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x711), ZYDIS_INVALID, ZYDIS_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, 0x610), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x611), 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, 0x612), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x39), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x615), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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, 0x616), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x617), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_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 } +}; + +const ZydisDecoderTreeNode FILTERS_MODE[][3] = +{ + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_COMPACT[][2] = +{ + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x5BE) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x515) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x5BF) }, + { ZYDIS_DEFINITION(0x1, 0x6FB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x16C), ZYDIS_DEFINITION(0x1, 0x16D) }, + { ZYDIS_DEFINITION(0x1, 0x48B), ZYDIS_DEFINITION(0x1, 0x48C) }, + { ZYDIS_DEFINITION(0x1, 0x2FC), ZYDIS_DEFINITION(0x1, 0x2FD) }, + { ZYDIS_DEFINITION(0x1, 0x3A6), ZYDIS_DEFINITION(0x1, 0x3A7) }, + { ZYDIS_DEFINITION(0x1, 0x168), ZYDIS_DEFINITION(0x1, 0x169) }, + { ZYDIS_DEFINITION(0x1, 0x16A), ZYDIS_DEFINITION(0x1, 0x16B) }, + { ZYDIS_DEFINITION(0x1, 0x2FE), ZYDIS_DEFINITION(0x1, 0x2FF) }, + { ZYDIS_DEFINITION(0x1, 0x3A8), ZYDIS_DEFINITION(0x1, 0x3A9) }, + { ZYDIS_DEFINITION(0x1, 0x705), ZYDIS_DEFINITION(0x1, 0x706) }, + { ZYDIS_DEFINITION(0x1, 0x658), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x657), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x656), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x723), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x715), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xBB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6E0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x601), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x55E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x602), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x67D), ZYDIS_DEFINITION(0x1, 0x67E) }, + { ZYDIS_DEFINITION(0x1, 0x6BD), ZYDIS_DEFINITION(0x1, 0x6BE) }, + { ZYDIS_DEFINITION(0x1, 0x2C8), ZYDIS_DEFINITION(0x1, 0x2C9) }, + { ZYDIS_DEFINITION(0x1, 0x2CB), ZYDIS_DEFINITION(0x1, 0x2CC) }, + { ZYDIS_DEFINITION(0x0, 0x6FC), ZYDIS_DEFINITION(0x0, 0x6FD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x0), ZYDIS_DEFINITION(0x0, 0x704) }, + { ZYDIS_DEFINITION(0x1, 0x74), ZYDIS_DEFINITION(0x1, 0x76) }, + { ZYDIS_DEFINITION(0x1, 0x7C), ZYDIS_DEFINITION(0x1, 0x7E) }, + { ZYDIS_DEFINITION(0x1, 0x80), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x0) }, + { ZYDIS_DEFINITION(0x1, 0x85), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x1) }, + { ZYDIS_DEFINITION(0x1, 0x75), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x2) }, + { ZYDIS_DEFINITION(0x1, 0x7D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x3) }, + { ZYDIS_DEFINITION(0x1, 0x78), ZYDIS_DEFINITION(0x1, 0x7A) }, + { ZYDIS_DEFINITION(0x1, 0x8A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x4) }, + { ZYDIS_DEFINITION(0x1, 0x88), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x5) }, + { ZYDIS_DEFINITION(0x1, 0x82), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE, 0x6) }, + { ZYDIS_DEFINITION(0x1, 0x79), 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, 0x317), ZYDIS_DEFINITION(0x10, 0x318) }, + { ZYDIS_DEFINITION(0x10, 0x319), ZYDIS_DEFINITION(0x10, 0x31A) }, + { ZYDIS_DEFINITION(0x10, 0x31B), ZYDIS_DEFINITION(0x10, 0x31C) }, + { ZYDIS_DEFINITION(0x10, 0x31D), ZYDIS_DEFINITION(0x10, 0x31E) }, + { ZYDIS_DEFINITION(0x0, 0x6FE), ZYDIS_DEFINITION(0x0, 0x6FF) }, + { ZYDIS_DEFINITION(0x0, 0x700), ZYDIS_DEFINITION(0x0, 0x701) }, + { ZYDIS_DEFINITION(0x1, 0x254), ZYDIS_DEFINITION(0x1, 0x255) }, + { ZYDIS_DEFINITION(0x1, 0x25B), ZYDIS_DEFINITION(0x1, 0x25C) }, + { ZYDIS_DEFINITION(0x1, 0x259), ZYDIS_DEFINITION(0x1, 0x25A) }, + { ZYDIS_DEFINITION(0x1, 0x33B), ZYDIS_DEFINITION(0x1, 0x33C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D), ZYDIS_DEFINITION(0x1, 0x32B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1E), ZYDIS_DEFINITION(0x1, 0x32F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1F), ZYDIS_DEFINITION(0x1, 0x32C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x20), ZYDIS_DEFINITION(0x1, 0x330) }, + { ZYDIS_DEFINITION(0x1, 0x73A), ZYDIS_DEFINITION(0x1, 0x73C) }, + { ZYDIS_DEFINITION(0x1, 0x73B), ZYDIS_DEFINITION(0x1, 0x73D) }, + { ZYDIS_DEFINITION(0x1, 0x741), ZYDIS_DEFINITION(0x1, 0x743) }, + { ZYDIS_DEFINITION(0x1, 0x742), ZYDIS_DEFINITION(0x1, 0x744) }, + { 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_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x0), ZYDIS_DEFINITION(0x9, 0x2AC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x1), ZYDIS_DEFINITION(0x9, 0x298) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x2), ZYDIS_DEFINITION(0x9, 0x264) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x3), ZYDIS_DEFINITION(0x9, 0x284) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x4), ZYDIS_DEFINITION(0x9, 0x2BC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x5), ZYDIS_DEFINITION(0x9, 0x2A7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x6), ZYDIS_DEFINITION(0x9, 0x269) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x7), ZYDIS_DEFINITION(0x9, 0x289) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x8), ZYDIS_DEFINITION(0x9, 0x2B7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x9), ZYDIS_DEFINITION(0x9, 0x2A2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xA), ZYDIS_DEFINITION(0x9, 0x2B1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xB), ZYDIS_DEFINITION(0x9, 0x29D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xC), ZYDIS_DEFINITION(0x9, 0x271) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xD), ZYDIS_DEFINITION(0x9, 0x28E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xE), ZYDIS_DEFINITION(0x9, 0x276) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0xF), ZYDIS_DEFINITION(0x9, 0x293) }, + { ZYDIS_DEFINITION(0x1, 0x5EF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5F0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x748), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x749), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x659), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5F2), ZYDIS_DEFINITION(0x1, 0x5F3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2B), ZYDIS_DEFINITION(0x1, 0x10B) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x5C0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x516) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x5C1) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x517) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x150) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x151) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x238) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x238) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x238) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x238) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x238) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x238) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x238) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x238) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x152) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x152) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x152) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x152) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x152) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x152) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x152) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x152) }, + { 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, 0x38A), ZYDIS_DEFINITION(0x1, 0x6A) }, + { ZYDIS_DEFINITION(0x1, 0x38B), ZYDIS_DEFINITION(0x1, 0x6B) }, + { ZYDIS_DEFINITION(0x8, 0x2A8), ZYDIS_DEFINITION(0x8, 0x2A9) }, + { ZYDIS_DEFINITION(0x8, 0x294), ZYDIS_DEFINITION(0x8, 0x295) }, + { ZYDIS_DEFINITION(0x8, 0x260), ZYDIS_DEFINITION(0x8, 0x261) }, + { ZYDIS_DEFINITION(0x8, 0x280), ZYDIS_DEFINITION(0x8, 0x281) }, + { ZYDIS_DEFINITION(0x8, 0x2B8), ZYDIS_DEFINITION(0x8, 0x2B9) }, + { ZYDIS_DEFINITION(0x8, 0x2A3), ZYDIS_DEFINITION(0x8, 0x2A4) }, + { ZYDIS_DEFINITION(0x8, 0x265), ZYDIS_DEFINITION(0x8, 0x266) }, + { ZYDIS_DEFINITION(0x8, 0x285), ZYDIS_DEFINITION(0x8, 0x286) }, + { ZYDIS_DEFINITION(0x8, 0x2B3), ZYDIS_DEFINITION(0x8, 0x2B4) }, + { ZYDIS_DEFINITION(0x8, 0x29E), ZYDIS_DEFINITION(0x8, 0x29F) }, + { ZYDIS_DEFINITION(0x8, 0x2AD), ZYDIS_DEFINITION(0x8, 0x2AE) }, + { ZYDIS_DEFINITION(0x8, 0x299), ZYDIS_DEFINITION(0x8, 0x29A) }, + { ZYDIS_DEFINITION(0x8, 0x26D), ZYDIS_DEFINITION(0x8, 0x26E) }, + { ZYDIS_DEFINITION(0x8, 0x28A), ZYDIS_DEFINITION(0x8, 0x28B) }, + { ZYDIS_DEFINITION(0x8, 0x272), ZYDIS_DEFINITION(0x8, 0x273) }, + { ZYDIS_DEFINITION(0x8, 0x28F), ZYDIS_DEFINITION(0x8, 0x290) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x28) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x3F4) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x12) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x646) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5E) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x6EF) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x772) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0xED) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x29) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x3F5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x13) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x647) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x5F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0x6F0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x773) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xD, 0xEE) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x12, 0xA7) }, + { 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, 0x2C5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4EF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x447), 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, 0x457), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x459), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x460), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x462), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x464), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x465), 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_MODRM_MOD_COMPACT, 0x488), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x489) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x48B), 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_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x490), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x491), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x492) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x49A), ZYDIS_INVALID }, + { 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, 0x4A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4FF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x500) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x523), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x524) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x600), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x601), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x676), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x677) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x680) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x687), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CD) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6CF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E3), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6ED), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6FB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x70F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x710), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x718), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x719), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x71F), 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_INVALID, ZYDIS_DEFINITION(0x1, 0x2C2) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x252) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x3, 0x2) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x3, 0x1) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x62A) }, + { 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, 0xAA) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_AMD, 0x11), ZYDIS_DEFINITION(0x9, 0x279) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x12, 0x27A) }, + { ZYDIS_DEFINITION(0x8, 0x27B), ZYDIS_DEFINITION(0x8, 0x27C) } +}; + +const ZydisDecoderTreeNode FILTERS_PREFIX_GROUP1[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x327), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x9E) }, + { ZYDIS_DEFINITION(0x1, 0x328), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xA0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x1A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x137) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x25), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x148) } +}; + +const ZydisDecoderTreeNode FILTERS_MODRM_MOD[][4] = +{ + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODRM_MOD_COMPACT[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x1A), ZYDIS_DEFINITION(0x1, 0x1B) }, + { ZYDIS_DEFINITION(0x1, 0x1C), ZYDIS_DEFINITION(0x1, 0x1D) }, + { ZYDIS_DEFINITION(0x1, 0x1E), ZYDIS_DEFINITION(0x1, 0x1F) }, + { ZYDIS_DEFINITION(0x1, 0x20), ZYDIS_DEFINITION(0x1, 0x21) }, + { ZYDIS_DEFINITION(0x1, 0x3E6), ZYDIS_DEFINITION(0x1, 0x3E7) }, + { ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_DEFINITION(0x1, 0x3E9) }, + { ZYDIS_DEFINITION(0x1, 0x3EA), ZYDIS_DEFINITION(0x1, 0x3EB) }, + { ZYDIS_DEFINITION(0x1, 0x3EC), ZYDIS_DEFINITION(0x1, 0x3ED) }, + { 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, 0x2BE), ZYDIS_DEFINITION(0x1, 0x2BF) }, + { ZYDIS_DEFINITION(0x1, 0x2E1), ZYDIS_DEFINITION(0x1, 0x2E2) }, + { ZYDIS_DEFINITION(0x1, 0x3AF), 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, 0x3BC), ZYDIS_DEFINITION(0x1, 0x3BD) }, + { ZYDIS_DEFINITION(0x1, 0x3BE), ZYDIS_DEFINITION(0x1, 0x3BF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x10), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x11) }, + { ZYDIS_DEFINITION(0x1, 0x3C1), ZYDIS_DEFINITION(0x1, 0x3C2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13) }, + { ZYDIS_DEFINITION(0x1, 0x3C5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE, 0x0) }, + { ZYDIS_DEFINITION(0x1, 0x3C7), ZYDIS_DEFINITION(0x1, 0x3C8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x15), ZYDIS_DEFINITION(0x1, 0x3C9) }, + { 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_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_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xD7), ZYDIS_DEFINITION(0x1, 0xD8) }, + { ZYDIS_DEFINITION(0x1, 0xCF), ZYDIS_DEFINITION(0x1, 0xD0) }, + { ZYDIS_DEFINITION(0x1, 0xBF), ZYDIS_DEFINITION(0x1, 0xC0) }, + { ZYDIS_DEFINITION(0x1, 0xC7), ZYDIS_DEFINITION(0x1, 0xC8) }, + { ZYDIS_DEFINITION(0x1, 0xDD), ZYDIS_DEFINITION(0x1, 0xDE) }, + { ZYDIS_DEFINITION(0x1, 0xD5), ZYDIS_DEFINITION(0x1, 0xD6) }, + { ZYDIS_DEFINITION(0x1, 0xC1), ZYDIS_DEFINITION(0x1, 0xC2) }, + { ZYDIS_DEFINITION(0x1, 0xC9), ZYDIS_DEFINITION(0x1, 0xCA) }, + { ZYDIS_DEFINITION(0x1, 0xDB), ZYDIS_DEFINITION(0x1, 0xDC) }, + { ZYDIS_DEFINITION(0x1, 0xD3), ZYDIS_DEFINITION(0x1, 0xD4) }, + { ZYDIS_DEFINITION(0x1, 0xD9), ZYDIS_DEFINITION(0x1, 0xDA) }, + { ZYDIS_DEFINITION(0x1, 0xD1), ZYDIS_DEFINITION(0x1, 0xD2) }, + { ZYDIS_DEFINITION(0x1, 0xC3), ZYDIS_DEFINITION(0x1, 0xC4) }, + { ZYDIS_DEFINITION(0x1, 0xCB), ZYDIS_DEFINITION(0x1, 0xCC) }, + { ZYDIS_DEFINITION(0x1, 0xC5), ZYDIS_DEFINITION(0x1, 0xC6) }, + { ZYDIS_DEFINITION(0x1, 0xCD), ZYDIS_DEFINITION(0x1, 0xCE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xDF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0xE0), 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_INVALID }, + { 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_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, 0x12A), 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_DEFINITION(0x1, 0x673), ZYDIS_DEFINITION(0x1, 0x674) }, + { ZYDIS_DEFINITION(0x1, 0x66B), ZYDIS_DEFINITION(0x1, 0x66C) }, + { ZYDIS_DEFINITION(0x1, 0x65B), ZYDIS_DEFINITION(0x1, 0x65C) }, + { ZYDIS_DEFINITION(0x1, 0x663), ZYDIS_DEFINITION(0x1, 0x664) }, + { ZYDIS_DEFINITION(0x1, 0x67A), ZYDIS_DEFINITION(0x1, 0x67B) }, + { ZYDIS_DEFINITION(0x1, 0x671), ZYDIS_DEFINITION(0x1, 0x672) }, + { ZYDIS_DEFINITION(0x1, 0x65D), ZYDIS_DEFINITION(0x1, 0x65E) }, + { ZYDIS_DEFINITION(0x1, 0x665), ZYDIS_DEFINITION(0x1, 0x666) }, + { ZYDIS_DEFINITION(0x1, 0x677), ZYDIS_DEFINITION(0x1, 0x678) }, + { ZYDIS_DEFINITION(0x1, 0x66F), ZYDIS_DEFINITION(0x1, 0x670) }, + { ZYDIS_DEFINITION(0x1, 0x675), ZYDIS_DEFINITION(0x1, 0x676) }, + { ZYDIS_DEFINITION(0x1, 0x66D), ZYDIS_DEFINITION(0x1, 0x66E) }, + { ZYDIS_DEFINITION(0x1, 0x65F), ZYDIS_DEFINITION(0x1, 0x660) }, + { ZYDIS_DEFINITION(0x1, 0x667), ZYDIS_DEFINITION(0x1, 0x668) }, + { ZYDIS_DEFINITION(0x1, 0x661), ZYDIS_DEFINITION(0x1, 0x662) }, + { ZYDIS_DEFINITION(0x1, 0x669), ZYDIS_DEFINITION(0x1, 0x66A) }, + { ZYDIS_DEFINITION(0x1, 0x97), ZYDIS_DEFINITION(0x1, 0x98) }, + { ZYDIS_DEFINITION(0xB, 0x6A5), ZYDIS_DEFINITION(0xB, 0x6A6) }, + { ZYDIS_DEFINITION(0x1, 0x6A7), ZYDIS_DEFINITION(0x1, 0x6A8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x136), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1, 0x2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA3), ZYDIS_DEFINITION(0x1, 0xA4) }, + { ZYDIS_DEFINITION(0xB, 0x6B5), ZYDIS_DEFINITION(0xB, 0x6B6) }, + { ZYDIS_DEFINITION(0x1, 0x6B7), ZYDIS_DEFINITION(0x1, 0x6B8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x138), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x139) }, + { ZYDIS_DEFINITION(0x1, 0x230), ZYDIS_DEFINITION(0x1, 0x231) }, + { ZYDIS_DEFINITION(0x1, 0x105), ZYDIS_DEFINITION(0x1, 0x106) }, + { ZYDIS_DEFINITION(0x1, 0x107), ZYDIS_DEFINITION(0x1, 0x108) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2E3) }, + { ZYDIS_DEFINITION(0x1, 0x9F), ZYDIS_DEFINITION(0x1, 0xA0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2C7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CA) }, + { ZYDIS_DEFINITION(0x1, 0x394), ZYDIS_DEFINITION(0x1, 0x395) }, + { ZYDIS_DEFINITION(0x1, 0x396), ZYDIS_DEFINITION(0x1, 0x397) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13B) }, + { ZYDIS_DEFINITION(0x1, 0x720), ZYDIS_DEFINITION(0x1, 0x721) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x23), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x24) }, + { ZYDIS_DEFINITION(0x1, 0x9D), ZYDIS_DEFINITION(0x1, 0x9E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x13C), 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_DEFINITION(0x1, 0x386), ZYDIS_DEFINITION(0x1, 0x387) }, + { ZYDIS_DEFINITION(0x1, 0x388), ZYDIS_DEFINITION(0x1, 0x389) }, + { ZYDIS_DEFINITION(0x1, 0x751), ZYDIS_DEFINITION(0x1, 0x752) }, + { ZYDIS_DEFINITION(0x1, 0x753), ZYDIS_DEFINITION(0x1, 0x754) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x140), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x141) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x142) }, + { 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_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x146), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x147) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1, 0x3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x149) }, + { 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_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x159), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x177) }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x188) }, + { 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_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x196), 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_DEFINITION(0x1, 0x71E), ZYDIS_DEFINITION(0x1, 0x71F) }, + { ZYDIS_DEFINITION(0x1, 0x4), 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, 0xB) }, + { ZYDIS_DEFINITION(0x1, 0x638), ZYDIS_DEFINITION(0x1, 0x639) }, + { ZYDIS_DEFINITION(0x1, 0x63A), ZYDIS_DEFINITION(0x1, 0x63B) }, + { ZYDIS_DEFINITION(0x1, 0x63C), ZYDIS_DEFINITION(0x1, 0x63D) }, + { ZYDIS_DEFINITION(0x1, 0x63E), ZYDIS_DEFINITION(0x1, 0x63F) }, + { ZYDIS_DEFINITION(0x1, 0x50), ZYDIS_DEFINITION(0x1, 0x51) }, + { 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, 0x6E1), ZYDIS_DEFINITION(0x1, 0x6E2) }, + { ZYDIS_DEFINITION(0x1, 0x6E3), ZYDIS_DEFINITION(0x1, 0x6E4) }, + { ZYDIS_DEFINITION(0x1, 0x6E5), ZYDIS_DEFINITION(0x1, 0x6E6) }, + { ZYDIS_DEFINITION(0x1, 0x6E7), ZYDIS_DEFINITION(0x1, 0x6E8) }, + { ZYDIS_DEFINITION(0x1, 0x764), 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, 0xDF), ZYDIS_DEFINITION(0x1, 0xE0) }, + { ZYDIS_DEFINITION(0x1, 0xE1), ZYDIS_DEFINITION(0x1, 0xE2) }, + { ZYDIS_DEFINITION(0x1, 0xE3), ZYDIS_DEFINITION(0x1, 0xE4) }, + { ZYDIS_DEFINITION(0x1, 0xE5), ZYDIS_DEFINITION(0x1, 0xE6) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x70) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2F), 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x33), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x34) }, + { ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x39) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B) }, + { ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x40) }, + { ZYDIS_INVALID, 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_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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA0) }, + { ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA5) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA6) }, + { ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xAA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xAB) }, + { ZYDIS_INVALID, 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_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_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, 0xCB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xCC) }, + { 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, 0xCD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xCE) }, + { 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, 0xCF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD2) }, + { 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_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, 0xEB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xEC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xEE) }, + { 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_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, 0xFB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xBD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xBE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xFF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x100) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x101), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x102) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xC5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x103), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x104) }, + { 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, 0x105), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x106) }, + { 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, 0x107), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x108) }, + { 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, 0x109), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10A) }, + { 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, 0x10B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10D) }, + { 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, 0x10E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x10F) }, + { 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, 0x110), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x111) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xF9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x112), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x113) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x114), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x115) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x116), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x117) }, + { 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, 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, 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, 0x11C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x11D) }, + { 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, 0x11E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x11F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x120), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x121) }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x134) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x135) }, + { 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, 0x136), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x137) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x138), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x139) }, + { 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, 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_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_INVALID, 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_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_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, 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_REX_W, 0x14F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x150) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x15F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x160) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x151), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x152) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x163), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x164) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x153), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x154) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x167), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x168) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x155), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x156) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x16B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x16C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x157), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x158) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x159), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x15A) }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x17F) }, + { ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x183), 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_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x19E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x19F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1A3) }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x18) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x19) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1BA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1BB) }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x1F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1D3) }, + { 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_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, 0x206), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x207) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x208), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x209) }, + { 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_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, 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_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_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, 0x224), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x225) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x28F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x290) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x226), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x227) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x228), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x229) }, + { 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_EVEX_B, 0x2A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2A8) }, + { 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_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_EVEX_B, 0x2D7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2D8) }, + { 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_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_EVEX_B, 0x2FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2FF) }, + { 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_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_EVEX_B, 0x306), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x307) }, + { 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_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_EVEX_B, 0x36E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x36F) }, + { 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_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_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x31F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x320) }, + { 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_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x32F) }, + { 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_EVEX_B, 0x431), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x432) }, + { 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_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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38A) }, + { ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x38F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x390) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x391) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x392) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x393) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x394), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x395) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x396), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x33) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A3) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3A7), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3AF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B0) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B1) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3B5), 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_INVALID, 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_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_MODRM_REG, 0x34), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x35) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3D3), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3DF) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E0) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E1) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3E5), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x403) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x404) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x405) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x406) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x407), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x408) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x409), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x28) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x29) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x425), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x426) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x427), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x428) }, + { 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_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, 0x42F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x430) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x431), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x432) }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x36) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x44E) }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x457) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x458) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x459) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x45D), 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_INVALID, 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x37) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x46E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x46F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x470) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x38) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x471), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x472) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x473), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x474) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xAB) }, + { ZYDIS_DEFINITION(0xE, 0x228), ZYDIS_DEFINITION(0xE, 0x229) }, + { ZYDIS_DEFINITION(0xD, 0x22A), ZYDIS_DEFINITION(0xD, 0x22B) }, + { 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, 0x707), ZYDIS_DEFINITION(0x1, 0x708) }, + { ZYDIS_DEFINITION(0x1, 0x709), ZYDIS_DEFINITION(0x1, 0x70A) }, + { ZYDIS_DEFINITION(0x1, 0x756), ZYDIS_DEFINITION(0x1, 0x757) }, + { ZYDIS_DEFINITION(0x1, 0x758), ZYDIS_DEFINITION(0x1, 0x759) }, + { ZYDIS_DEFINITION(0x1, 0x301), ZYDIS_DEFINITION(0x1, 0x302) }, + { ZYDIS_DEFINITION(0x1, 0x303), ZYDIS_DEFINITION(0x1, 0x304) }, + { ZYDIS_DEFINITION(0x1, 0x305), ZYDIS_DEFINITION(0x1, 0x306) }, + { ZYDIS_DEFINITION(0x1, 0x307), ZYDIS_DEFINITION(0x1, 0x308) }, + { ZYDIS_DEFINITION(0x1, 0x309), ZYDIS_DEFINITION(0x1, 0x30A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2C3) }, + { ZYDIS_DEFINITION(0x1, 0x30B), ZYDIS_DEFINITION(0x1, 0x30C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x41), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x42) }, + { 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_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_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, 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_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_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, 0xCF) }, + { ZYDIS_DEFINITION(0x1, 0x369), ZYDIS_DEFINITION(0x1, 0x36B) }, + { ZYDIS_DEFINITION(0x1, 0x36A), ZYDIS_DEFINITION(0x1, 0x36C) }, + { ZYDIS_DEFINITION(0x1, 0x36D), ZYDIS_DEFINITION(0x1, 0x36F) }, + { ZYDIS_DEFINITION(0x1, 0x36E), ZYDIS_DEFINITION(0x1, 0x370) }, + { ZYDIS_DEFINITION(0x1, 0x333), ZYDIS_DEFINITION(0x1, 0x33B) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x33C) }, + { ZYDIS_DEFINITION(0x1, 0x635), ZYDIS_DEFINITION(0x1, 0x637) }, + { ZYDIS_DEFINITION(0x1, 0x636), ZYDIS_DEFINITION(0x1, 0x638) }, + { ZYDIS_DEFINITION(0x1, 0x62D), ZYDIS_DEFINITION(0x1, 0x62F) }, + { ZYDIS_DEFINITION(0x1, 0x62E), ZYDIS_DEFINITION(0x1, 0x630) }, + { ZYDIS_DEFINITION(0x1, 0x338), ZYDIS_DEFINITION(0x1, 0x336) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x337) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x533) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x52C) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x52D) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x52E) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x532) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x52F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x530) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x531) }, + { ZYDIS_DEFINITION(0x1, 0x30F), ZYDIS_DEFINITION(0x1, 0x311) }, + { ZYDIS_DEFINITION(0x1, 0x310), ZYDIS_DEFINITION(0x1, 0x312) }, + { ZYDIS_DEFINITION(0x1, 0x313), ZYDIS_DEFINITION(0x1, 0x315) }, + { ZYDIS_DEFINITION(0x1, 0x314), ZYDIS_DEFINITION(0x1, 0x316) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x347) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x348) }, + { ZYDIS_DEFINITION(0x1, 0x627), ZYDIS_DEFINITION(0x1, 0x628) }, + { ZYDIS_DEFINITION(0x1, 0x10F), ZYDIS_DEFINITION(0x1, 0x110) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4F2), ZYDIS_INVALID }, + { 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_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_DEFINITION(0x1, 0x33F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x340), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x608), ZYDIS_DEFINITION(0x1, 0x60A) }, + { ZYDIS_DEFINITION(0x1, 0x609), ZYDIS_DEFINITION(0x1, 0x60B) }, + { ZYDIS_DEFINITION(0x1, 0x5F6), ZYDIS_DEFINITION(0x1, 0x5F8) }, + { ZYDIS_DEFINITION(0x1, 0x5F7), ZYDIS_DEFINITION(0x1, 0x5F9) }, + { ZYDIS_DEFINITION(0x1, 0x5E4), ZYDIS_DEFINITION(0x1, 0x5E6) }, + { ZYDIS_DEFINITION(0x1, 0x5E5), ZYDIS_DEFINITION(0x1, 0x5E7) }, + { ZYDIS_DEFINITION(0x1, 0xE5), ZYDIS_DEFINITION(0x1, 0xE7) }, + { ZYDIS_DEFINITION(0x1, 0xE6), ZYDIS_DEFINITION(0x1, 0xE8) }, + { ZYDIS_DEFINITION(0x1, 0xDD), ZYDIS_DEFINITION(0x1, 0xDF) }, + { ZYDIS_DEFINITION(0x1, 0xDE), ZYDIS_DEFINITION(0x1, 0xE0) }, + { ZYDIS_DEFINITION(0x1, 0x385), ZYDIS_DEFINITION(0x1, 0x387) }, + { ZYDIS_DEFINITION(0x1, 0x386), ZYDIS_DEFINITION(0x1, 0x388) }, + { ZYDIS_DEFINITION(0x1, 0x63D), ZYDIS_DEFINITION(0x1, 0x63F) }, + { ZYDIS_DEFINITION(0x1, 0x63E), ZYDIS_DEFINITION(0x1, 0x640) }, + { ZYDIS_DEFINITION(0x1, 0xB5), ZYDIS_DEFINITION(0x1, 0xB7) }, + { ZYDIS_DEFINITION(0x1, 0xB6), ZYDIS_DEFINITION(0x1, 0xB8) }, + { ZYDIS_DEFINITION(0x1, 0x379), ZYDIS_DEFINITION(0x1, 0x37B) }, + { ZYDIS_DEFINITION(0x1, 0x37A), ZYDIS_DEFINITION(0x1, 0x37C) }, + { ZYDIS_DEFINITION(0x1, 0x129), ZYDIS_DEFINITION(0x1, 0x12B) }, + { ZYDIS_DEFINITION(0x1, 0x12A), ZYDIS_DEFINITION(0x1, 0x12C) }, + { ZYDIS_DEFINITION(0x1, 0x115), ZYDIS_DEFINITION(0x1, 0x117) }, + { ZYDIS_DEFINITION(0x1, 0x116), ZYDIS_DEFINITION(0x1, 0x118) }, + { ZYDIS_DEFINITION(0x1, 0x615), ZYDIS_DEFINITION(0x1, 0x617) }, + { ZYDIS_DEFINITION(0x1, 0x616), ZYDIS_DEFINITION(0x1, 0x618) }, + { ZYDIS_DEFINITION(0x1, 0x2FF), ZYDIS_DEFINITION(0x1, 0x301) }, + { ZYDIS_DEFINITION(0x1, 0x300), ZYDIS_DEFINITION(0x1, 0x302) }, + { ZYDIS_DEFINITION(0x1, 0x165), ZYDIS_DEFINITION(0x1, 0x167) }, + { ZYDIS_DEFINITION(0x1, 0x166), ZYDIS_DEFINITION(0x1, 0x168) }, + { ZYDIS_DEFINITION(0x1, 0x2F3), ZYDIS_DEFINITION(0x1, 0x2F5) }, + { ZYDIS_DEFINITION(0x1, 0x2F4), ZYDIS_DEFINITION(0x1, 0x2F6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x504), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x505) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x506), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x507) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x508) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x509), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x50C), ZYDIS_INVALID }, + { 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_INVALID, ZYDIS_DEFINITION(0x1, 0x2E5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x610) }, + { ZYDIS_DEFINITION(0xB, 0x105), ZYDIS_DEFINITION(0xB, 0x107) }, + { ZYDIS_DEFINITION(0xB, 0x106), ZYDIS_DEFINITION(0xB, 0x108) }, + { ZYDIS_DEFINITION(0xB, 0x600), ZYDIS_DEFINITION(0xB, 0x602) }, + { ZYDIS_DEFINITION(0xB, 0x601), ZYDIS_DEFINITION(0xB, 0x603) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x512), 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x516) }, + { ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51D) }, + { 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, 0x51E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x51F) }, + { ZYDIS_DEFINITION(0x1, 0x12), ZYDIS_DEFINITION(0x1, 0x13) }, + { ZYDIS_DEFINITION(0x1, 0x6), ZYDIS_DEFINITION(0x1, 0x7) }, + { ZYDIS_DEFINITION(0x1, 0x361), ZYDIS_DEFINITION(0x1, 0x363) }, + { ZYDIS_DEFINITION(0x1, 0x362), ZYDIS_DEFINITION(0x1, 0x364) }, + { ZYDIS_DEFINITION(0x1, 0x365), ZYDIS_DEFINITION(0x1, 0x367) }, + { ZYDIS_DEFINITION(0x1, 0x366), ZYDIS_DEFINITION(0x1, 0x368) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x339) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x33A) }, + { ZYDIS_DEFINITION(0x1, 0x631), ZYDIS_DEFINITION(0x1, 0x633) }, + { ZYDIS_DEFINITION(0x1, 0x632), ZYDIS_DEFINITION(0x1, 0x634) }, + { ZYDIS_DEFINITION(0x1, 0x629), ZYDIS_DEFINITION(0x1, 0x62B) }, + { ZYDIS_DEFINITION(0x1, 0x62A), ZYDIS_DEFINITION(0x1, 0x62C) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x334) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x335) }, + { ZYDIS_DEFINITION(0x1, 0x307), ZYDIS_DEFINITION(0x1, 0x309) }, + { ZYDIS_DEFINITION(0x1, 0x308), ZYDIS_DEFINITION(0x1, 0x30A) }, + { ZYDIS_DEFINITION(0x1, 0x30B), ZYDIS_DEFINITION(0x1, 0x30D) }, + { ZYDIS_DEFINITION(0x1, 0x30C), ZYDIS_DEFINITION(0x1, 0x30E) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x345) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x346) }, + { ZYDIS_DEFINITION(0x1, 0x625), ZYDIS_DEFINITION(0x1, 0x626) }, + { ZYDIS_DEFINITION(0x1, 0x10D), ZYDIS_DEFINITION(0x1, 0x10E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x520), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x521), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x522), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x523), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x524), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x525), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x526), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x527), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x33D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x33E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x604), ZYDIS_DEFINITION(0x1, 0x606) }, + { ZYDIS_DEFINITION(0x1, 0x605), ZYDIS_DEFINITION(0x1, 0x607) }, + { ZYDIS_DEFINITION(0x1, 0xE1), ZYDIS_DEFINITION(0x1, 0xE3) }, + { ZYDIS_DEFINITION(0x1, 0xE2), ZYDIS_DEFINITION(0x1, 0xE4) }, + { ZYDIS_DEFINITION(0x1, 0xD9), ZYDIS_DEFINITION(0x1, 0xDB) }, + { ZYDIS_DEFINITION(0x1, 0xDA), ZYDIS_DEFINITION(0x1, 0xDC) }, + { ZYDIS_DEFINITION(0x1, 0x381), ZYDIS_DEFINITION(0x1, 0x383) }, + { ZYDIS_DEFINITION(0x1, 0x382), ZYDIS_DEFINITION(0x1, 0x384) }, + { ZYDIS_DEFINITION(0x1, 0x639), ZYDIS_DEFINITION(0x1, 0x63B) }, + { ZYDIS_DEFINITION(0x1, 0x63A), ZYDIS_DEFINITION(0x1, 0x63C) }, + { ZYDIS_DEFINITION(0x1, 0xB1), ZYDIS_DEFINITION(0x1, 0xB3) }, + { ZYDIS_DEFINITION(0x1, 0xB2), ZYDIS_DEFINITION(0x1, 0xB4) }, + { ZYDIS_DEFINITION(0x1, 0x375), ZYDIS_DEFINITION(0x1, 0x377) }, + { ZYDIS_DEFINITION(0x1, 0x376), ZYDIS_DEFINITION(0x1, 0x378) }, + { ZYDIS_DEFINITION(0x1, 0x11D), ZYDIS_DEFINITION(0x1, 0x11F) }, + { ZYDIS_DEFINITION(0x1, 0x11E), ZYDIS_DEFINITION(0x1, 0x120) }, + { ZYDIS_DEFINITION(0x1, 0x125), ZYDIS_DEFINITION(0x1, 0x127) }, + { ZYDIS_DEFINITION(0x1, 0x126), ZYDIS_DEFINITION(0x1, 0x128) }, + { ZYDIS_DEFINITION(0x1, 0x611), ZYDIS_DEFINITION(0x1, 0x613) }, + { ZYDIS_DEFINITION(0x1, 0x612), ZYDIS_DEFINITION(0x1, 0x614) }, + { ZYDIS_DEFINITION(0x1, 0x2FB), ZYDIS_DEFINITION(0x1, 0x2FD) }, + { ZYDIS_DEFINITION(0x1, 0x2FC), ZYDIS_DEFINITION(0x1, 0x2FE) }, + { ZYDIS_DEFINITION(0x1, 0x161), ZYDIS_DEFINITION(0x1, 0x163) }, + { ZYDIS_DEFINITION(0x1, 0x162), ZYDIS_DEFINITION(0x1, 0x164) }, + { ZYDIS_DEFINITION(0x1, 0x2EF), ZYDIS_DEFINITION(0x1, 0x2F1) }, + { ZYDIS_DEFINITION(0x1, 0x2F0), ZYDIS_DEFINITION(0x1, 0x2F2) }, + { ZYDIS_DEFINITION(0x1, 0x5D0), ZYDIS_DEFINITION(0x1, 0x5D2) }, + { ZYDIS_DEFINITION(0x1, 0x5D1), ZYDIS_DEFINITION(0x1, 0x5D3) }, + { ZYDIS_DEFINITION(0x1, 0x5DC), ZYDIS_DEFINITION(0x1, 0x5DE) }, + { ZYDIS_DEFINITION(0x1, 0x5DD), ZYDIS_DEFINITION(0x1, 0x5DF) }, + { ZYDIS_DEFINITION(0x1, 0x5D4), ZYDIS_DEFINITION(0x1, 0x5D6) }, + { ZYDIS_DEFINITION(0x1, 0x5D5), ZYDIS_DEFINITION(0x1, 0x5D7) }, + { ZYDIS_DEFINITION(0x1, 0x399), ZYDIS_DEFINITION(0x1, 0x39B) }, + { ZYDIS_DEFINITION(0x1, 0x39A), ZYDIS_DEFINITION(0x1, 0x39C) }, + { ZYDIS_DEFINITION(0x1, 0x413), ZYDIS_DEFINITION(0x1, 0x415) }, + { ZYDIS_DEFINITION(0x1, 0x414), ZYDIS_DEFINITION(0x1, 0x416) }, + { ZYDIS_DEFINITION(0x1, 0x41F), ZYDIS_DEFINITION(0x1, 0x421) }, + { ZYDIS_DEFINITION(0x1, 0x420), ZYDIS_DEFINITION(0x1, 0x422) }, + { ZYDIS_DEFINITION(0x1, 0x417), ZYDIS_DEFINITION(0x1, 0x419) }, + { ZYDIS_DEFINITION(0x1, 0x418), ZYDIS_DEFINITION(0x1, 0x41A) }, + { ZYDIS_DEFINITION(0x1, 0x3A1), ZYDIS_DEFINITION(0x1, 0x3A3) }, + { ZYDIS_DEFINITION(0x1, 0x3A2), ZYDIS_DEFINITION(0x1, 0x3A4) }, + { ZYDIS_DEFINITION(0x1, 0x5C0), ZYDIS_DEFINITION(0x1, 0x5C2) }, + { ZYDIS_DEFINITION(0x1, 0x5C1), ZYDIS_DEFINITION(0x1, 0x5C3) }, + { ZYDIS_DEFINITION(0x1, 0x5CC), ZYDIS_DEFINITION(0x1, 0x5CE) }, + { ZYDIS_DEFINITION(0x1, 0x5CD), ZYDIS_DEFINITION(0x1, 0x5CF) }, + { ZYDIS_DEFINITION(0x1, 0x5C4), ZYDIS_DEFINITION(0x1, 0x5C6) }, + { ZYDIS_DEFINITION(0x1, 0x5C5), ZYDIS_DEFINITION(0x1, 0x5C7) }, + { ZYDIS_DEFINITION(0x1, 0x395), ZYDIS_DEFINITION(0x1, 0x397) }, + { ZYDIS_DEFINITION(0x1, 0x396), ZYDIS_DEFINITION(0x1, 0x398) }, + { ZYDIS_DEFINITION(0x1, 0x5D8), ZYDIS_DEFINITION(0x1, 0x5DA) }, + { ZYDIS_DEFINITION(0x1, 0x5D9), ZYDIS_DEFINITION(0x1, 0x5DB) }, + { ZYDIS_DEFINITION(0x1, 0x5C8), ZYDIS_DEFINITION(0x1, 0x5CA) }, + { ZYDIS_DEFINITION(0x1, 0x5C9), ZYDIS_DEFINITION(0x1, 0x5CB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x528), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x529) }, + { ZYDIS_DEFINITION(0x1, 0x319), ZYDIS_DEFINITION(0x1, 0x31A) }, + { ZYDIS_DEFINITION(0x1, 0x323), ZYDIS_DEFINITION(0x1, 0x325) }, + { ZYDIS_DEFINITION(0x1, 0x324), ZYDIS_DEFINITION(0x1, 0x326) }, + { ZYDIS_DEFINITION(0xB, 0x53C), ZYDIS_DEFINITION(0xB, 0x53E) }, + { ZYDIS_DEFINITION(0xB, 0x53D), ZYDIS_DEFINITION(0xB, 0x53F) }, + { ZYDIS_DEFINITION(0xB, 0x596), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x597), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x57A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x57B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x56A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x56B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x580), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x581), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x570), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x571), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x554), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x555), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x588), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x589), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x586), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x587), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x55C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x55D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x55A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x55B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F9), ZYDIS_DEFINITION(0x1, 0x3FB) }, + { ZYDIS_DEFINITION(0x1, 0x3FA), ZYDIS_DEFINITION(0x1, 0x3FC) }, + { ZYDIS_DEFINITION(0x1, 0x405), ZYDIS_DEFINITION(0x1, 0x407) }, + { ZYDIS_DEFINITION(0x1, 0x406), ZYDIS_DEFINITION(0x1, 0x408) }, + { ZYDIS_DEFINITION(0x1, 0x3FD), ZYDIS_DEFINITION(0x1, 0x3FF) }, + { ZYDIS_DEFINITION(0x1, 0x3FE), ZYDIS_DEFINITION(0x1, 0x400) }, + { ZYDIS_DEFINITION(0x1, 0x2CD), ZYDIS_DEFINITION(0x1, 0x2CF) }, + { ZYDIS_DEFINITION(0x1, 0x2CE), ZYDIS_DEFINITION(0x1, 0x2D0) }, + { ZYDIS_DEFINITION(0x1, 0x2D5), ZYDIS_DEFINITION(0x1, 0x2D7) }, + { ZYDIS_DEFINITION(0x1, 0x2D6), ZYDIS_DEFINITION(0x1, 0x2D8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52B) }, + { ZYDIS_DEFINITION(0x1, 0x31D), ZYDIS_DEFINITION(0x1, 0x31E) }, + { ZYDIS_DEFINITION(0x1, 0x327), ZYDIS_DEFINITION(0x1, 0x329) }, + { ZYDIS_DEFINITION(0x1, 0x328), ZYDIS_DEFINITION(0x1, 0x32A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x52F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x530), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x531), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x532), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x101), ZYDIS_DEFINITION(0xB, 0x103) }, + { ZYDIS_DEFINITION(0xB, 0x102), ZYDIS_DEFINITION(0xB, 0x104) }, + { ZYDIS_DEFINITION(0xB, 0x498), ZYDIS_DEFINITION(0xB, 0x499) }, + { ZYDIS_DEFINITION(0xB, 0x46B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x5FC), ZYDIS_DEFINITION(0xB, 0x5FE) }, + { ZYDIS_DEFINITION(0xB, 0x5FD), ZYDIS_DEFINITION(0xB, 0x5FF) }, + { ZYDIS_DEFINITION(0x1, 0xBD), ZYDIS_DEFINITION(0x1, 0xBF) }, + { ZYDIS_DEFINITION(0x1, 0xBE), ZYDIS_DEFINITION(0x1, 0xC0) }, + { ZYDIS_DEFINITION(0x1, 0x598), ZYDIS_DEFINITION(0x1, 0x59A) }, + { ZYDIS_DEFINITION(0x1, 0x599), ZYDIS_DEFINITION(0x1, 0x59B) }, + { ZYDIS_DEFINITION(0x1, 0x582), ZYDIS_DEFINITION(0x1, 0x584) }, + { ZYDIS_DEFINITION(0x1, 0x583), ZYDIS_DEFINITION(0x1, 0x585) }, + { ZYDIS_DEFINITION(0x1, 0x58A), ZYDIS_DEFINITION(0x1, 0x58C) }, + { ZYDIS_DEFINITION(0x1, 0x58B), ZYDIS_DEFINITION(0x1, 0x58D) }, + { ZYDIS_DEFINITION(0x1, 0x3AD), ZYDIS_DEFINITION(0x1, 0x3AF) }, + { ZYDIS_DEFINITION(0x1, 0x3AE), ZYDIS_DEFINITION(0x1, 0x3B0) }, + { ZYDIS_DEFINITION(0x1, 0x520), ZYDIS_DEFINITION(0x1, 0x522) }, + { ZYDIS_DEFINITION(0x1, 0x521), ZYDIS_DEFINITION(0x1, 0x523) }, + { ZYDIS_DEFINITION(0x1, 0x34F), ZYDIS_DEFINITION(0x1, 0x350) }, + { ZYDIS_DEFINITION(0x1, 0x4DA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4DB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x5B0), ZYDIS_DEFINITION(0x1, 0x5B2) }, + { ZYDIS_DEFINITION(0x1, 0x5B1), ZYDIS_DEFINITION(0x1, 0x5B3) }, + { ZYDIS_DEFINITION(0x1, 0x5B4), ZYDIS_DEFINITION(0x1, 0x5B6) }, + { ZYDIS_DEFINITION(0x1, 0x5B5), ZYDIS_DEFINITION(0x1, 0x5B7) }, + { ZYDIS_DEFINITION(0x1, 0x4CE), ZYDIS_DEFINITION(0x1, 0x4D0) }, + { ZYDIS_DEFINITION(0x1, 0x4CF), ZYDIS_DEFINITION(0x1, 0x4D1) }, + { ZYDIS_DEFINITION(0x1, 0x3C9), ZYDIS_DEFINITION(0x1, 0x3CB) }, + { ZYDIS_DEFINITION(0x1, 0x3CA), ZYDIS_DEFINITION(0x1, 0x3CC) }, + { ZYDIS_DEFINITION(0x1, 0x3B9), ZYDIS_DEFINITION(0x1, 0x3BB) }, + { ZYDIS_DEFINITION(0x1, 0x3BA), ZYDIS_DEFINITION(0x1, 0x3BC) }, + { ZYDIS_DEFINITION(0x1, 0x3BD), ZYDIS_DEFINITION(0x1, 0x3BF) }, + { ZYDIS_DEFINITION(0x1, 0x3BE), ZYDIS_DEFINITION(0x1, 0x3C0) }, + { ZYDIS_DEFINITION(0x1, 0x4B6), ZYDIS_DEFINITION(0x1, 0x4B8) }, + { ZYDIS_DEFINITION(0x1, 0x4B7), ZYDIS_DEFINITION(0x1, 0x4B9) }, + { ZYDIS_DEFINITION(0x1, 0x3CD), ZYDIS_DEFINITION(0x1, 0x3CF) }, + { ZYDIS_DEFINITION(0x1, 0x3CE), ZYDIS_DEFINITION(0x1, 0x3D0) }, + { ZYDIS_DEFINITION(0x1, 0x3D1), ZYDIS_DEFINITION(0x1, 0x3D3) }, + { ZYDIS_DEFINITION(0x1, 0x3D2), ZYDIS_DEFINITION(0x1, 0x3D4) }, + { ZYDIS_DEFINITION(0x1, 0x57C), ZYDIS_DEFINITION(0x1, 0x57E) }, + { ZYDIS_DEFINITION(0x1, 0x57D), ZYDIS_DEFINITION(0x1, 0x57F) }, + { ZYDIS_DEFINITION(0x1, 0x572), ZYDIS_DEFINITION(0x1, 0x574) }, + { ZYDIS_DEFINITION(0x1, 0x573), ZYDIS_DEFINITION(0x1, 0x575) }, + { ZYDIS_DEFINITION(0x1, 0x3D5), ZYDIS_DEFINITION(0x1, 0x3D7) }, + { ZYDIS_DEFINITION(0x1, 0x3D6), ZYDIS_DEFINITION(0x1, 0x3D8) }, + { ZYDIS_DEFINITION(0x1, 0x514), ZYDIS_DEFINITION(0x1, 0x516) }, + { ZYDIS_DEFINITION(0x1, 0x515), ZYDIS_DEFINITION(0x1, 0x517) }, + { ZYDIS_DEFINITION(0x1, 0x518), ZYDIS_DEFINITION(0x1, 0x51A) }, + { ZYDIS_DEFINITION(0x1, 0x519), ZYDIS_DEFINITION(0x1, 0x51B) }, + { ZYDIS_DEFINITION(0x1, 0x14D), ZYDIS_DEFINITION(0x1, 0x14F) }, + { ZYDIS_DEFINITION(0x1, 0x14E), ZYDIS_DEFINITION(0x1, 0x150) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x341) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x342) }, + { ZYDIS_DEFINITION(0x1, 0x5A8), ZYDIS_DEFINITION(0x1, 0x5AA) }, + { ZYDIS_DEFINITION(0x1, 0x5A9), ZYDIS_DEFINITION(0x1, 0x5AB) }, + { ZYDIS_DEFINITION(0x1, 0x5AC), ZYDIS_DEFINITION(0x1, 0x5AE) }, + { ZYDIS_DEFINITION(0x1, 0x5AD), ZYDIS_DEFINITION(0x1, 0x5AF) }, + { ZYDIS_DEFINITION(0x1, 0x4CA), ZYDIS_DEFINITION(0x1, 0x4CC) }, + { ZYDIS_DEFINITION(0x1, 0x4CB), ZYDIS_DEFINITION(0x1, 0x4CD) }, + { ZYDIS_DEFINITION(0x1, 0x528), ZYDIS_DEFINITION(0x1, 0x52A) }, + { ZYDIS_DEFINITION(0x1, 0x529), ZYDIS_DEFINITION(0x1, 0x52B) }, + { ZYDIS_DEFINITION(0x1, 0x3B1), ZYDIS_DEFINITION(0x1, 0x3B3) }, + { ZYDIS_DEFINITION(0x1, 0x3B2), ZYDIS_DEFINITION(0x1, 0x3B4) }, + { ZYDIS_DEFINITION(0x1, 0x3B5), ZYDIS_DEFINITION(0x1, 0x3B7) }, + { ZYDIS_DEFINITION(0x1, 0x3B6), ZYDIS_DEFINITION(0x1, 0x3B8) }, + { ZYDIS_DEFINITION(0x1, 0x4B2), ZYDIS_DEFINITION(0x1, 0x4B4) }, + { ZYDIS_DEFINITION(0x1, 0x4B3), ZYDIS_DEFINITION(0x1, 0x4B5) }, + { ZYDIS_DEFINITION(0x1, 0x5E0), ZYDIS_DEFINITION(0x1, 0x5E2) }, + { ZYDIS_DEFINITION(0x1, 0x5E1), ZYDIS_DEFINITION(0x1, 0x5E3) }, + { ZYDIS_DEFINITION(0x1, 0x56C), ZYDIS_DEFINITION(0x1, 0x56E) }, + { ZYDIS_DEFINITION(0x1, 0x56D), ZYDIS_DEFINITION(0x1, 0x56F) }, + { ZYDIS_DEFINITION(0x1, 0x556), ZYDIS_DEFINITION(0x1, 0x558) }, + { ZYDIS_DEFINITION(0x1, 0x557), ZYDIS_DEFINITION(0x1, 0x559) }, + { ZYDIS_DEFINITION(0x1, 0x55E), ZYDIS_DEFINITION(0x1, 0x560) }, + { ZYDIS_DEFINITION(0x1, 0x55F), ZYDIS_DEFINITION(0x1, 0x561) }, + { ZYDIS_DEFINITION(0x1, 0x524), ZYDIS_DEFINITION(0x1, 0x526) }, + { ZYDIS_DEFINITION(0x1, 0x525), ZYDIS_DEFINITION(0x1, 0x527) }, + { ZYDIS_DEFINITION(0x1, 0x49E), ZYDIS_DEFINITION(0x1, 0x4A0) }, + { ZYDIS_DEFINITION(0x1, 0x49F), ZYDIS_DEFINITION(0x1, 0x4A1) }, + { ZYDIS_DEFINITION(0x1, 0x534), ZYDIS_DEFINITION(0x1, 0x536) }, + { ZYDIS_DEFINITION(0x1, 0x535), ZYDIS_DEFINITION(0x1, 0x537) }, + { ZYDIS_DEFINITION(0x1, 0x2E6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x59C), ZYDIS_DEFINITION(0x1, 0x59E) }, + { ZYDIS_DEFINITION(0x1, 0x59D), ZYDIS_DEFINITION(0x1, 0x59F) }, + { ZYDIS_DEFINITION(0x1, 0x5B8), ZYDIS_DEFINITION(0x1, 0x5BA) }, + { ZYDIS_DEFINITION(0x1, 0x5B9), ZYDIS_DEFINITION(0x1, 0x5BB) }, + { ZYDIS_DEFINITION(0x1, 0x5A0), ZYDIS_DEFINITION(0x1, 0x5A2) }, + { ZYDIS_DEFINITION(0x1, 0x5A1), ZYDIS_DEFINITION(0x1, 0x5A3) }, + { ZYDIS_DEFINITION(0x1, 0x5A4), ZYDIS_DEFINITION(0x1, 0x5A6) }, + { ZYDIS_DEFINITION(0x1, 0x5A5), ZYDIS_DEFINITION(0x1, 0x5A7) }, + { ZYDIS_DEFINITION(0x1, 0x3A5), ZYDIS_DEFINITION(0x1, 0x3A7) }, + { ZYDIS_DEFINITION(0x1, 0x3A6), ZYDIS_DEFINITION(0x1, 0x3A8) }, + { ZYDIS_DEFINITION(0x1, 0x3C1), ZYDIS_DEFINITION(0x1, 0x3C3) }, + { ZYDIS_DEFINITION(0x1, 0x3C2), ZYDIS_DEFINITION(0x1, 0x3C4) }, + { ZYDIS_DEFINITION(0x1, 0x3A9), ZYDIS_DEFINITION(0x1, 0x3AB) }, + { ZYDIS_DEFINITION(0x1, 0x3AA), ZYDIS_DEFINITION(0x1, 0x3AC) }, + { ZYDIS_DEFINITION(0x1, 0x538), ZYDIS_DEFINITION(0x1, 0x53A) }, + { ZYDIS_DEFINITION(0x1, 0x539), ZYDIS_DEFINITION(0x1, 0x53B) }, + { ZYDIS_DEFINITION(0x1, 0x47E), ZYDIS_DEFINITION(0x1, 0x480) }, + { ZYDIS_DEFINITION(0x1, 0x47F), ZYDIS_DEFINITION(0x1, 0x481) }, + { ZYDIS_DEFINITION(0x1, 0x476), ZYDIS_DEFINITION(0x1, 0x478) }, + { ZYDIS_DEFINITION(0x1, 0x477), ZYDIS_DEFINITION(0x1, 0x479) }, + { ZYDIS_DEFINITION(0x1, 0x47A), ZYDIS_DEFINITION(0x1, 0x47C) }, + { ZYDIS_DEFINITION(0x1, 0x47B), ZYDIS_DEFINITION(0x1, 0x47D) }, + { ZYDIS_DEFINITION(0x1, 0x49A), ZYDIS_DEFINITION(0x1, 0x49C) }, + { ZYDIS_DEFINITION(0x1, 0x49B), ZYDIS_DEFINITION(0x1, 0x49D) }, + { ZYDIS_DEFINITION(0x1, 0x48C), ZYDIS_DEFINITION(0x1, 0x48E) }, + { ZYDIS_DEFINITION(0x1, 0x48D), ZYDIS_DEFINITION(0x1, 0x48F) }, + { ZYDIS_DEFINITION(0x1, 0x484), ZYDIS_DEFINITION(0x1, 0x486) }, + { ZYDIS_DEFINITION(0x1, 0x485), ZYDIS_DEFINITION(0x1, 0x487) }, + { ZYDIS_DEFINITION(0x1, 0x488), ZYDIS_DEFINITION(0x1, 0x48A) }, + { ZYDIS_DEFINITION(0x1, 0x489), ZYDIS_DEFINITION(0x1, 0x48B) }, + { ZYDIS_DEFINITION(0x1, 0x548), ZYDIS_DEFINITION(0x1, 0x54A) }, + { ZYDIS_DEFINITION(0x1, 0x549), ZYDIS_DEFINITION(0x1, 0x54B) }, + { ZYDIS_DEFINITION(0x1, 0x550), ZYDIS_DEFINITION(0x1, 0x552) }, + { ZYDIS_DEFINITION(0x1, 0x551), ZYDIS_DEFINITION(0x1, 0x553) }, + { ZYDIS_DEFINITION(0x1, 0x54C), ZYDIS_DEFINITION(0x1, 0x54E) }, + { ZYDIS_DEFINITION(0x1, 0x54D), ZYDIS_DEFINITION(0x1, 0x54F) }, + { ZYDIS_DEFINITION(0x1, 0x510), ZYDIS_DEFINITION(0x1, 0x512) }, + { ZYDIS_DEFINITION(0x1, 0x511), ZYDIS_DEFINITION(0x1, 0x513) }, + { 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x536) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x537), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x538) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x539), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x53F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x540) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x541), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x542) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x543), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x544) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x545), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x546) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x547), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x548) }, + { ZYDIS_DEFINITION(0x1, 0x5BC), ZYDIS_DEFINITION(0x1, 0x5BE) }, + { ZYDIS_DEFINITION(0x1, 0x5BD), ZYDIS_DEFINITION(0x1, 0x5BF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x549), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x54A) }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x54F) }, + { ZYDIS_DEFINITION(0x1, 0x389), ZYDIS_DEFINITION(0x1, 0x38B) }, + { ZYDIS_DEFINITION(0x1, 0x38A), ZYDIS_DEFINITION(0x1, 0x38C) }, + { ZYDIS_DEFINITION(0x1, 0x391), ZYDIS_DEFINITION(0x1, 0x393) }, + { ZYDIS_DEFINITION(0x1, 0x392), ZYDIS_DEFINITION(0x1, 0x394) }, + { ZYDIS_DEFINITION(0x1, 0x38D), ZYDIS_DEFINITION(0x1, 0x38F) }, + { ZYDIS_DEFINITION(0x1, 0x38E), ZYDIS_DEFINITION(0x1, 0x390) }, + { ZYDIS_DEFINITION(0x1, 0x4E4), ZYDIS_DEFINITION(0x1, 0x4E6) }, + { ZYDIS_DEFINITION(0x1, 0x4E5), ZYDIS_DEFINITION(0x1, 0x4E7) }, + { ZYDIS_DEFINITION(0x1, 0x4DC), ZYDIS_DEFINITION(0x1, 0x4DE) }, + { ZYDIS_DEFINITION(0x1, 0x4DD), ZYDIS_DEFINITION(0x1, 0x4DF) }, + { ZYDIS_DEFINITION(0x1, 0x4E0), ZYDIS_DEFINITION(0x1, 0x4E2) }, + { ZYDIS_DEFINITION(0x1, 0x4E1), ZYDIS_DEFINITION(0x1, 0x4E3) }, + { ZYDIS_DEFINITION(0x1, 0x4EC), ZYDIS_DEFINITION(0x1, 0x4EE) }, + { ZYDIS_DEFINITION(0x1, 0x4ED), ZYDIS_DEFINITION(0x1, 0x4EF) }, + { ZYDIS_DEFINITION(0x1, 0x4F0), ZYDIS_DEFINITION(0x1, 0x4F2) }, + { ZYDIS_DEFINITION(0x1, 0x4F1), ZYDIS_DEFINITION(0x1, 0x4F3) }, + { ZYDIS_DEFINITION(0x1, 0x4E8), ZYDIS_DEFINITION(0x1, 0x4EA) }, + { ZYDIS_DEFINITION(0x1, 0x4E9), ZYDIS_DEFINITION(0x1, 0x4EB) }, + { ZYDIS_DEFINITION(0x1, 0x50C), ZYDIS_DEFINITION(0x1, 0x50E) }, + { ZYDIS_DEFINITION(0x1, 0x50D), ZYDIS_DEFINITION(0x1, 0x50F) }, + { ZYDIS_DEFINITION(0x1, 0x401), ZYDIS_DEFINITION(0x1, 0x403) }, + { ZYDIS_DEFINITION(0x1, 0x402), ZYDIS_DEFINITION(0x1, 0x404) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x343) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x344) }, + { ZYDIS_DEFINITION(0x1, 0x39D), ZYDIS_DEFINITION(0x1, 0x39F) }, + { ZYDIS_DEFINITION(0x1, 0x39E), ZYDIS_DEFINITION(0x1, 0x3A0) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x550) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x551) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x552) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x553) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x554) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x555) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x556) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x557) }, + { ZYDIS_DEFINITION(0x1, 0x4FC), ZYDIS_DEFINITION(0x1, 0x4FE) }, + { ZYDIS_DEFINITION(0x1, 0x4FD), ZYDIS_DEFINITION(0x1, 0x4FF) }, + { 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, 0x504), ZYDIS_DEFINITION(0x1, 0x506) }, + { ZYDIS_DEFINITION(0x1, 0x505), ZYDIS_DEFINITION(0x1, 0x507) }, + { ZYDIS_DEFINITION(0x1, 0x508), ZYDIS_DEFINITION(0x1, 0x50A) }, + { ZYDIS_DEFINITION(0x1, 0x509), ZYDIS_DEFINITION(0x1, 0x50B) }, + { ZYDIS_DEFINITION(0x1, 0x500), ZYDIS_DEFINITION(0x1, 0x502) }, + { ZYDIS_DEFINITION(0x1, 0x501), ZYDIS_DEFINITION(0x1, 0x503) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x558), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x559) }, + { ZYDIS_DEFINITION(0x1, 0x41B), ZYDIS_DEFINITION(0x1, 0x41D) }, + { ZYDIS_DEFINITION(0x1, 0x41C), ZYDIS_DEFINITION(0x1, 0x41E) }, + { ZYDIS_DEFINITION(0x1, 0x4C2), ZYDIS_DEFINITION(0x1, 0x4C4) }, + { ZYDIS_DEFINITION(0x1, 0x4C3), ZYDIS_DEFINITION(0x1, 0x4C5) }, + { ZYDIS_DEFINITION(0x1, 0x4C6), ZYDIS_DEFINITION(0x1, 0x4C8) }, + { ZYDIS_DEFINITION(0x1, 0x4C7), ZYDIS_DEFINITION(0x1, 0x4C9) }, + { ZYDIS_DEFINITION(0x1, 0x4D6), ZYDIS_DEFINITION(0x1, 0x4D8) }, + { ZYDIS_DEFINITION(0x1, 0x4D7), ZYDIS_DEFINITION(0x1, 0x4D9) }, + { ZYDIS_DEFINITION(0x1, 0x4D2), ZYDIS_DEFINITION(0x1, 0x4D4) }, + { ZYDIS_DEFINITION(0x1, 0x4D3), ZYDIS_DEFINITION(0x1, 0x4D5) }, + { ZYDIS_DEFINITION(0x1, 0x4AA), ZYDIS_DEFINITION(0x1, 0x4AC) }, + { ZYDIS_DEFINITION(0x1, 0x4AB), ZYDIS_DEFINITION(0x1, 0x4AD) }, + { ZYDIS_DEFINITION(0x1, 0x4AE), ZYDIS_DEFINITION(0x1, 0x4B0) }, + { ZYDIS_DEFINITION(0x1, 0x4AF), ZYDIS_DEFINITION(0x1, 0x4B1) }, + { ZYDIS_DEFINITION(0x1, 0x4BE), ZYDIS_DEFINITION(0x1, 0x4C0) }, + { ZYDIS_DEFINITION(0x1, 0x4BF), ZYDIS_DEFINITION(0x1, 0x4C1) }, + { ZYDIS_DEFINITION(0x1, 0x4BA), ZYDIS_DEFINITION(0x1, 0x4BC) }, + { ZYDIS_DEFINITION(0x1, 0x4BB), ZYDIS_DEFINITION(0x1, 0x4BD) }, + { ZYDIS_DEFINITION(0x1, 0x51C), ZYDIS_DEFINITION(0x1, 0x51E) }, + { ZYDIS_DEFINITION(0x1, 0x51D), ZYDIS_DEFINITION(0x1, 0x51F) }, + { ZYDIS_DEFINITION(0x1, 0x482), ZYDIS_DEFINITION(0x1, 0x483) }, + { 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_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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x566) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x567) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x568), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x569) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x56F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x570), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x571) }, + { 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x57E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x57F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x580) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x581), ZYDIS_INVALID }, + { 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58C) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x58F) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x590) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x591) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x592) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x593) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x594) }, + { ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x598), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x599) }, + { 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A3) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A7) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5A9) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5AA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5AB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5AC), 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5EE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5EF) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5F0), 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_DEFINITION(0x1, 0xD5), ZYDIS_DEFINITION(0x1, 0xD6) }, + { ZYDIS_DEFINITION(0x1, 0xCD), ZYDIS_DEFINITION(0x1, 0xCF) }, + { ZYDIS_DEFINITION(0x1, 0xCE), ZYDIS_DEFINITION(0x1, 0xD0) }, + { ZYDIS_DEFINITION(0x1, 0xD1), ZYDIS_DEFINITION(0x1, 0xD3) }, + { ZYDIS_DEFINITION(0x1, 0xD2), ZYDIS_DEFINITION(0x1, 0xD4) }, + { ZYDIS_DEFINITION(0x1, 0xC5), ZYDIS_DEFINITION(0x1, 0xC7) }, + { ZYDIS_DEFINITION(0x1, 0xC6), ZYDIS_DEFINITION(0x1, 0xC8) }, + { ZYDIS_DEFINITION(0x1, 0xC9), ZYDIS_DEFINITION(0x1, 0xCB) }, + { ZYDIS_DEFINITION(0x1, 0xCA), ZYDIS_DEFINITION(0x1, 0xCC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5FB) }, + { ZYDIS_DEFINITION(0x1, 0x98), ZYDIS_DEFINITION(0x1, 0x99) }, + { 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_DEFINITION(0xB, 0x5EE), ZYDIS_DEFINITION(0xB, 0x5F0) }, + { ZYDIS_DEFINITION(0xB, 0x5EF), ZYDIS_DEFINITION(0xB, 0x5F1) }, + { ZYDIS_DEFINITION(0xB, 0x5EA), ZYDIS_DEFINITION(0xB, 0x5EC) }, + { ZYDIS_DEFINITION(0xB, 0x5EB), ZYDIS_DEFINITION(0xB, 0x5ED) }, + { ZYDIS_DEFINITION(0xB, 0x5F4), ZYDIS_DEFINITION(0xB, 0x5F5) }, + { ZYDIS_DEFINITION(0xB, 0x5F2), ZYDIS_DEFINITION(0xB, 0x5F3) }, + { ZYDIS_DEFINITION(0xB, 0xED), ZYDIS_DEFINITION(0xB, 0xEF) }, + { ZYDIS_DEFINITION(0xB, 0xEE), ZYDIS_DEFINITION(0xB, 0xF0) }, + { ZYDIS_DEFINITION(0xB, 0xE9), ZYDIS_DEFINITION(0xB, 0xEB) }, + { ZYDIS_DEFINITION(0xB, 0xEA), ZYDIS_DEFINITION(0xB, 0xEC) }, + { ZYDIS_DEFINITION(0xB, 0x3E1), ZYDIS_DEFINITION(0xB, 0x3E3) }, + { ZYDIS_DEFINITION(0xB, 0x3E2), ZYDIS_DEFINITION(0xB, 0x3E4) }, + { ZYDIS_DEFINITION(0xB, 0x3C5), ZYDIS_DEFINITION(0xB, 0x3C7) }, + { ZYDIS_DEFINITION(0xB, 0x3C6), ZYDIS_DEFINITION(0xB, 0x3C8) }, + { ZYDIS_DEFINITION(0xB, 0x463), ZYDIS_DEFINITION(0xB, 0x464) }, + { ZYDIS_DEFINITION(0xB, 0x46C), ZYDIS_DEFINITION(0xB, 0x46D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x60E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x60F) }, + { ZYDIS_DEFINITION(0xB, 0x467), ZYDIS_DEFINITION(0xB, 0x468) }, + { ZYDIS_DEFINITION(0xB, 0x177), ZYDIS_DEFINITION(0xB, 0x178) }, + { 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_DEFINITION(0xB, 0x490), ZYDIS_DEFINITION(0xB, 0x491) }, + { ZYDIS_DEFINITION(0xB, 0x2E1), ZYDIS_DEFINITION(0xB, 0x2E2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x618), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x619) }, + { ZYDIS_DEFINITION(0xB, 0x494), ZYDIS_DEFINITION(0xB, 0x495) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x61D), ZYDIS_INVALID }, + { 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_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x16F), ZYDIS_DEFINITION(0xB, 0x171) }, + { ZYDIS_DEFINITION(0xB, 0x170), ZYDIS_DEFINITION(0xB, 0x172) }, + { ZYDIS_DEFINITION(0xB, 0x16D), ZYDIS_DEFINITION(0xB, 0x16E) }, + { ZYDIS_DEFINITION(0xB, 0x371), ZYDIS_DEFINITION(0xB, 0x373) }, + { ZYDIS_DEFINITION(0xB, 0x372), ZYDIS_DEFINITION(0xB, 0x374) }, + { ZYDIS_DEFINITION(0xB, 0x3F5), ZYDIS_DEFINITION(0xB, 0x3F7) }, + { ZYDIS_DEFINITION(0xB, 0x3F6), ZYDIS_DEFINITION(0xB, 0x3F8) }, + { 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x628) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x629), 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x63C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x63D), 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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x646) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x647), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x648) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x649), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64A) }, + { ZYDIS_DEFINITION(0xB, 0x411), ZYDIS_DEFINITION(0xB, 0x412) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x64C) }, + { ZYDIS_DEFINITION(0xB, 0x425), ZYDIS_DEFINITION(0xB, 0x426) }, + { ZYDIS_DEFINITION(0xB, 0x423), ZYDIS_DEFINITION(0xB, 0x424) }, + { 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_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_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x679), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x67A) }, + { 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_DEFINITION(0xB, 0xD7), ZYDIS_DEFINITION(0xB, 0xD8) }, + { ZYDIS_DEFINITION(0x1, 0x35D), ZYDIS_DEFINITION(0x1, 0x35E) }, + { ZYDIS_DEFINITION(0x1, 0x35F), ZYDIS_DEFINITION(0x1, 0x360) }, + { ZYDIS_DEFINITION(0x1, 0x359), ZYDIS_DEFINITION(0x1, 0x35B) }, + { ZYDIS_DEFINITION(0x1, 0x35A), ZYDIS_DEFINITION(0x1, 0x35C) }, + { ZYDIS_DEFINITION(0x1, 0x355), ZYDIS_DEFINITION(0x1, 0x357) }, + { ZYDIS_DEFINITION(0x1, 0x356), ZYDIS_DEFINITION(0x1, 0x358) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x685), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x686) }, + { ZYDIS_DEFINITION(0x1, 0x143), ZYDIS_DEFINITION(0x1, 0x144) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x687), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x688) }, + { ZYDIS_DEFINITION(0x1, 0x15F), ZYDIS_DEFINITION(0x1, 0x160) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x689), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68A) }, + { ZYDIS_DEFINITION(0x1, 0x14B), ZYDIS_DEFINITION(0x1, 0x14C) }, + { ZYDIS_DEFINITION(0x1, 0x60E), ZYDIS_DEFINITION(0x1, 0x60F) }, + { ZYDIS_DEFINITION(0x1, 0x5FA), ZYDIS_DEFINITION(0x1, 0x5FB) }, + { ZYDIS_DEFINITION(0x1, 0x5E8), ZYDIS_DEFINITION(0x1, 0x5E9) }, + { ZYDIS_DEFINITION(0x1, 0xBB), ZYDIS_DEFINITION(0x1, 0xBC) }, + { ZYDIS_DEFINITION(0x1, 0x37F), ZYDIS_DEFINITION(0x1, 0x380) }, + { ZYDIS_DEFINITION(0x1, 0x145), ZYDIS_DEFINITION(0x1, 0x146) }, + { ZYDIS_DEFINITION(0x1, 0x151), ZYDIS_DEFINITION(0x1, 0x153) }, + { ZYDIS_DEFINITION(0x1, 0x152), ZYDIS_DEFINITION(0x1, 0x154) }, + { ZYDIS_DEFINITION(0x1, 0x61B), ZYDIS_DEFINITION(0x1, 0x61C) }, + { ZYDIS_DEFINITION(0x1, 0x305), ZYDIS_DEFINITION(0x1, 0x306) }, + { ZYDIS_DEFINITION(0x1, 0x16B), ZYDIS_DEFINITION(0x1, 0x16C) }, + { ZYDIS_DEFINITION(0x1, 0x2F9), ZYDIS_DEFINITION(0x1, 0x2FA) }, + { ZYDIS_DEFINITION(0x1, 0x32B), ZYDIS_DEFINITION(0x1, 0x32D) }, + { ZYDIS_DEFINITION(0x1, 0x32C), ZYDIS_DEFINITION(0x1, 0x32E) }, + { ZYDIS_DEFINITION(0xB, 0x540), ZYDIS_DEFINITION(0xB, 0x542) }, + { ZYDIS_DEFINITION(0xB, 0x541), ZYDIS_DEFINITION(0xB, 0x543) }, + { ZYDIS_DEFINITION(0x1, 0x34D), ZYDIS_DEFINITION(0x1, 0x34E) }, + { ZYDIS_DEFINITION(0x1, 0x32F), ZYDIS_DEFINITION(0x1, 0x331) }, + { ZYDIS_DEFINITION(0x1, 0x330), ZYDIS_DEFINITION(0x1, 0x332) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x15) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x10B), ZYDIS_DEFINITION(0xB, 0x10C) }, + { ZYDIS_DEFINITION(0x1, 0x111), ZYDIS_DEFINITION(0x1, 0x113) }, + { ZYDIS_DEFINITION(0x1, 0x112), ZYDIS_DEFINITION(0x1, 0x114) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x68F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x690), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x691), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x692), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x693) }, + { ZYDIS_DEFINITION(0x1, 0x84), ZYDIS_DEFINITION(0x1, 0x85) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x694), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x695) }, + { ZYDIS_DEFINITION(0x1, 0x92), ZYDIS_DEFINITION(0x1, 0x93) }, + { ZYDIS_DEFINITION(0x1, 0x351), ZYDIS_DEFINITION(0x1, 0x352) }, + { ZYDIS_DEFINITION(0x1, 0x353), ZYDIS_DEFINITION(0x1, 0x354) }, + { ZYDIS_DEFINITION(0x1, 0x31F), ZYDIS_DEFINITION(0x1, 0x321) }, + { ZYDIS_DEFINITION(0x1, 0x320), ZYDIS_DEFINITION(0x1, 0x322) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x696), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x697) }, + { ZYDIS_DEFINITION(0x1, 0x13D), ZYDIS_DEFINITION(0x1, 0x13E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x698), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x699) }, + { ZYDIS_DEFINITION(0x1, 0x159), ZYDIS_DEFINITION(0x1, 0x15A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69B) }, + { ZYDIS_DEFINITION(0x1, 0x135), ZYDIS_DEFINITION(0x1, 0x136) }, + { ZYDIS_DEFINITION(0x1, 0x60C), ZYDIS_DEFINITION(0x1, 0x60D) }, + { ZYDIS_DEFINITION(0x1, 0xB9), ZYDIS_DEFINITION(0x1, 0xBA) }, + { ZYDIS_DEFINITION(0x1, 0x37D), ZYDIS_DEFINITION(0x1, 0x37E) }, + { ZYDIS_DEFINITION(0x1, 0x137), ZYDIS_DEFINITION(0x1, 0x138) }, + { ZYDIS_DEFINITION(0x1, 0x619), ZYDIS_DEFINITION(0x1, 0x61A) }, + { ZYDIS_DEFINITION(0x1, 0x303), ZYDIS_DEFINITION(0x1, 0x304) }, + { ZYDIS_DEFINITION(0x1, 0x169), ZYDIS_DEFINITION(0x1, 0x16A) }, + { ZYDIS_DEFINITION(0x1, 0x2F7), ZYDIS_DEFINITION(0x1, 0x2F8) }, + { ZYDIS_DEFINITION(0xB, 0x544), ZYDIS_DEFINITION(0xB, 0x546) }, + { ZYDIS_DEFINITION(0xB, 0x545), ZYDIS_DEFINITION(0xB, 0x547) }, + { ZYDIS_DEFINITION(0x1, 0x2D1), ZYDIS_DEFINITION(0x1, 0x2D3) }, + { ZYDIS_DEFINITION(0x1, 0x2D2), ZYDIS_DEFINITION(0x1, 0x2D4) }, + { ZYDIS_DEFINITION(0x1, 0x2D9), ZYDIS_DEFINITION(0x1, 0x2DB) }, + { ZYDIS_DEFINITION(0x1, 0x2DA), ZYDIS_DEFINITION(0x1, 0x2DC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x14) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x69F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x109), ZYDIS_DEFINITION(0xB, 0x10A) }, + { ZYDIS_DEFINITION(0x1, 0xC1), ZYDIS_DEFINITION(0x1, 0xC3) }, + { ZYDIS_DEFINITION(0x1, 0xC2), ZYDIS_DEFINITION(0x1, 0xC4) }, + { ZYDIS_DEFINITION(0x1, 0x119), ZYDIS_DEFINITION(0x1, 0x11B) }, + { ZYDIS_DEFINITION(0x1, 0x11A), ZYDIS_DEFINITION(0x1, 0x11C) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2E3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2E4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A0), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A4) }, + { ZYDIS_DEFINITION(0x1, 0x7E), ZYDIS_DEFINITION(0x1, 0x7F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A6) }, + { ZYDIS_DEFINITION(0x1, 0x78), ZYDIS_DEFINITION(0x1, 0x79) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A8) }, + { ZYDIS_DEFINITION(0x1, 0x9E), ZYDIS_DEFINITION(0x1, 0x9F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6A9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6AA) }, + { ZYDIS_DEFINITION(0xB, 0x8C), ZYDIS_DEFINITION(0xB, 0x8D) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11C) }, + { 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, 0x6C0), ZYDIS_DEFINITION(0x1, 0x6DE), ZYDIS_DEFINITION(0x1, 0x2CD), ZYDIS_DEFINITION(0x1, 0x2E4), ZYDIS_DEFINITION(0x1, 0x72E), ZYDIS_DEFINITION(0x1, 0x730), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x6C1), ZYDIS_DEFINITION(0x1, 0x6DF), ZYDIS_DEFINITION(0x1, 0x2CE), ZYDIS_DEFINITION(0x1, 0x2E5), ZYDIS_DEFINITION(0x1, 0x72F), ZYDIS_DEFINITION(0x1, 0x731), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x0), ZYDIS_DEFINITION(0x1, 0x6C2), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2CF), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x8), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x9) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xA), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xB) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x17), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x18), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x19), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1A), ZYDIS_DEFINITION(0x1, 0x6C3), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2D0), ZYDIS_DEFINITION(0x1, 0x256) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x628), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x528), ZYDIS_DEFINITION(0x1, 0x52D), ZYDIS_DEFINITION(0x1, 0x52E), ZYDIS_DEFINITION(0x1, 0x528), ZYDIS_DEFINITION(0x1, 0x528), ZYDIS_DEFINITION(0x1, 0x528), ZYDIS_DEFINITION(0x1, 0x528), ZYDIS_DEFINITION(0x1, 0x528) }, + { 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, 0x3B6), ZYDIS_DEFINITION(0x1, 0x3B7) }, + { ZYDIS_DEFINITION(0x1, 0x529), ZYDIS_DEFINITION(0x1, 0x52A), ZYDIS_DEFINITION(0x1, 0x52B), ZYDIS_DEFINITION(0x1, 0x52C), ZYDIS_DEFINITION(0x1, 0x3B8), ZYDIS_DEFINITION(0x1, 0x3B9), ZYDIS_DEFINITION(0x1, 0x3BA), ZYDIS_DEFINITION(0x1, 0x3BB) }, + { ZYDIS_DEFINITION(0x1, 0xB4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x28), ZYDIS_DEFINITION(0x1, 0x3CE), ZYDIS_DEFINITION(0x1, 0x3CF), ZYDIS_DEFINITION(0x1, 0x3D0), ZYDIS_DEFINITION(0x1, 0x3D1), ZYDIS_DEFINITION(0x1, 0x3D2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xC) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_KNC, 0x0), ZYDIS_DEFINITION(0x1, 0x3DE), ZYDIS_DEFINITION(0x1, 0x3DE), ZYDIS_DEFINITION(0x1, 0x3DE), ZYDIS_DEFINITION(0x1, 0x3DE), ZYDIS_DEFINITION(0x1, 0x3DE), ZYDIS_DEFINITION(0x1, 0x3DE), ZYDIS_DEFINITION(0x1, 0x3DE) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_KNC, 0x1), ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E0) }, + { ZYDIS_DEFINITION(0x1, 0x4A), ZYDIS_DEFINITION(0x1, 0x42), ZYDIS_DEFINITION(0x1, 0x4B), ZYDIS_DEFINITION(0x1, 0x43), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x578), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x565), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x558), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x579), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x566), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x559), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x56B), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x55F), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x54B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x56C), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x560), ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x54C), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x572), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x552), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x573), ZYDIS_DEFINITION(0xB, 0x571), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x553), ZYDIS_DEFINITION(0xB, 0x551) }, + { ZYDIS_DEFINITION(0x13, 0x177), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0xF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x10), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x11), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x13), 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_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2C6), ZYDIS_DEFINITION(0x1, 0x2F3), ZYDIS_DEFINITION(0x1, 0x67C) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x717), ZYDIS_INVALID }, + { 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_MODE_COMPACT, 0x52), ZYDIS_DEFINITION(0x1, 0x5A0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x25), ZYDIS_DEFINITION(0x1, 0x724), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x725), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x26), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x27), ZYDIS_DEFINITION(0x1, 0x2C1), ZYDIS_DEFINITION(0x1, 0x6D1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x28), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x29), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2A), ZYDIS_DEFINITION(0x1, 0xB5) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xBC), ZYDIS_DEFINITION(0x1, 0xB6) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5A1), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xB9), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x99), ZYDIS_DEFINITION(0xB, 0xA5), ZYDIS_DEFINITION(0xB, 0xA1), ZYDIS_DEFINITION(0xB, 0x9B) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x9A), ZYDIS_DEFINITION(0xB, 0xA6), ZYDIS_DEFINITION(0xB, 0xA2), ZYDIS_DEFINITION(0xB, 0x9C) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5F7), ZYDIS_DEFINITION(0x1, 0x5F8) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x53), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x54) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x55), 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, 0x2C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2E), ZYDIS_DEFINITION(0x1, 0x738), ZYDIS_DEFINITION(0x1, 0x739) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x733), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x746), 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, 0xDD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xDE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xDF), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE0), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE3), 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_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9E) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xE9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x9F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xEA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xA0) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x20), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x21), ZYDIS_INVALID, 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_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, 0x3C8), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3C9), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CA), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3CB), 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_MODRM_RM, 0x2C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2E), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x2F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x30), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x31), 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, 0x24), ZYDIS_DEFINITION(0xD, 0x3F0), ZYDIS_DEFINITION(0xD, 0xE), ZYDIS_DEFINITION(0xD, 0x642), ZYDIS_DEFINITION(0xB, 0x5A), ZYDIS_DEFINITION(0xD, 0x6EB), ZYDIS_DEFINITION(0xB, 0x76E), ZYDIS_DEFINITION(0xD, 0xE9) }, + { ZYDIS_DEFINITION(0xD, 0x25), ZYDIS_DEFINITION(0xD, 0x3F1), ZYDIS_DEFINITION(0xD, 0xF), ZYDIS_DEFINITION(0xD, 0x643), ZYDIS_DEFINITION(0xB, 0x5B), ZYDIS_DEFINITION(0xD, 0x6EC), ZYDIS_DEFINITION(0xB, 0x76F), ZYDIS_DEFINITION(0xD, 0xEA) }, + { ZYDIS_DEFINITION(0xE, 0x26), ZYDIS_DEFINITION(0xE, 0x3F2), ZYDIS_DEFINITION(0xE, 0x10), ZYDIS_DEFINITION(0xE, 0x644), ZYDIS_DEFINITION(0xE, 0x5C), ZYDIS_DEFINITION(0xE, 0x6ED), ZYDIS_DEFINITION(0xE, 0x770), ZYDIS_DEFINITION(0xE, 0xEB) }, + { ZYDIS_DEFINITION(0xE, 0x27), ZYDIS_DEFINITION(0xE, 0x3F3), ZYDIS_DEFINITION(0xE, 0x11), ZYDIS_DEFINITION(0xE, 0x645), ZYDIS_DEFINITION(0xE, 0x5D), ZYDIS_DEFINITION(0xE, 0x6EE), ZYDIS_DEFINITION(0xE, 0x771), ZYDIS_DEFINITION(0xE, 0xEC) }, + { 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_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_DEFINITION(0xD, 0x2A), ZYDIS_DEFINITION(0xD, 0x3F6), ZYDIS_DEFINITION(0xD, 0x14), ZYDIS_DEFINITION(0xD, 0x648), ZYDIS_DEFINITION(0xD, 0x60), ZYDIS_DEFINITION(0xD, 0x6F1), ZYDIS_DEFINITION(0xD, 0x774), ZYDIS_DEFINITION(0xD, 0xEF) }, + { ZYDIS_DEFINITION(0xD, 0x2B), ZYDIS_DEFINITION(0xD, 0x3F7), ZYDIS_DEFINITION(0xD, 0x15), ZYDIS_DEFINITION(0xD, 0x649), ZYDIS_DEFINITION(0xD, 0x61), ZYDIS_DEFINITION(0xD, 0x6F2), ZYDIS_DEFINITION(0xD, 0x775), ZYDIS_DEFINITION(0xD, 0xF0) }, + { ZYDIS_DEFINITION(0x1, 0x519), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x51A), 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, 0x603), ZYDIS_DEFINITION(0xB, 0x60F), ZYDIS_DEFINITION(0xB, 0x5D3), ZYDIS_DEFINITION(0xB, 0x5E3), ZYDIS_DEFINITION(0xB, 0x68D), ZYDIS_DEFINITION(0xB, 0x6A9), ZYDIS_DEFINITION(0xB, 0x68E), ZYDIS_DEFINITION(0xB, 0x62B) }, + { ZYDIS_DEFINITION(0xB, 0x604), ZYDIS_DEFINITION(0xB, 0x610), ZYDIS_DEFINITION(0xB, 0x5D4), ZYDIS_DEFINITION(0xB, 0x5E4), ZYDIS_DEFINITION(0xB, 0x68F), ZYDIS_DEFINITION(0xB, 0x6AA), ZYDIS_DEFINITION(0xB, 0x690), ZYDIS_DEFINITION(0xB, 0x62C) }, + { ZYDIS_DEFINITION(0xB, 0x605), ZYDIS_DEFINITION(0xB, 0x611), ZYDIS_DEFINITION(0xB, 0x5D5), ZYDIS_DEFINITION(0xB, 0x5E5), ZYDIS_DEFINITION(0xB, 0x691), ZYDIS_DEFINITION(0xB, 0x6AB), ZYDIS_DEFINITION(0xB, 0x692), ZYDIS_DEFINITION(0xB, 0x62D) }, + { ZYDIS_DEFINITION(0xB, 0x606), ZYDIS_DEFINITION(0xB, 0x612), ZYDIS_DEFINITION(0xB, 0x5D6), ZYDIS_DEFINITION(0xB, 0x5E6), ZYDIS_DEFINITION(0xB, 0x693), ZYDIS_DEFINITION(0xB, 0x6AC), ZYDIS_DEFINITION(0xB, 0x694), ZYDIS_DEFINITION(0xB, 0x62E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x497), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x498), 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_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4C7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x32), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4D6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50B), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50C), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50D), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50E), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x50F), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x510), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x511), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x512), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x513), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x514) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x590), ZYDIS_INVALID, ZYDIS_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, 0x5FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5FD) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x60E) }, + { ZYDIS_DEFINITION(0xB, 0x313), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3B) }, + { ZYDIS_DEFINITION(0xB, 0x314), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xE, 0x315), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3C) }, + { ZYDIS_DEFINITION(0xE, 0x316), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x607), ZYDIS_DEFINITION(0x1, 0x613), ZYDIS_DEFINITION(0x1, 0x5D7), ZYDIS_DEFINITION(0x1, 0x5E7), ZYDIS_DEFINITION(0x1, 0x695), ZYDIS_DEFINITION(0x1, 0x6AD), ZYDIS_DEFINITION(0x1, 0x696), ZYDIS_DEFINITION(0x1, 0x62F) }, + { ZYDIS_DEFINITION(0x1, 0x608), ZYDIS_DEFINITION(0x1, 0x614), ZYDIS_DEFINITION(0x1, 0x5D8), ZYDIS_DEFINITION(0x1, 0x5E8), ZYDIS_DEFINITION(0x1, 0x697), ZYDIS_DEFINITION(0x1, 0x6AE), ZYDIS_DEFINITION(0x1, 0x698), ZYDIS_DEFINITION(0x1, 0x630) }, + { ZYDIS_DEFINITION(0x1, 0x609), ZYDIS_DEFINITION(0x1, 0x615), ZYDIS_DEFINITION(0x1, 0x5D9), ZYDIS_DEFINITION(0x1, 0x5E9), ZYDIS_DEFINITION(0x1, 0x699), ZYDIS_DEFINITION(0x1, 0x6AF), ZYDIS_DEFINITION(0x1, 0x69A), ZYDIS_DEFINITION(0x1, 0x631) }, + { ZYDIS_DEFINITION(0x1, 0x60A), ZYDIS_DEFINITION(0x1, 0x616), ZYDIS_DEFINITION(0x1, 0x5DA), ZYDIS_DEFINITION(0x1, 0x5EA), ZYDIS_DEFINITION(0x1, 0x69B), ZYDIS_DEFINITION(0x1, 0x6B0), ZYDIS_DEFINITION(0x1, 0x69C), ZYDIS_DEFINITION(0x1, 0x632) }, + { ZYDIS_DEFINITION(0x1, 0x60B), ZYDIS_DEFINITION(0x1, 0x617), ZYDIS_DEFINITION(0x1, 0x5DB), ZYDIS_DEFINITION(0x1, 0x5EB), ZYDIS_DEFINITION(0x1, 0x69D), ZYDIS_DEFINITION(0x1, 0x6B1), ZYDIS_DEFINITION(0x1, 0x69E), ZYDIS_DEFINITION(0x1, 0x633) }, + { ZYDIS_DEFINITION(0x1, 0x60C), ZYDIS_DEFINITION(0x1, 0x618), ZYDIS_DEFINITION(0x1, 0x5DC), ZYDIS_DEFINITION(0x1, 0x5EC), ZYDIS_DEFINITION(0x1, 0x69F), ZYDIS_DEFINITION(0x1, 0x6B2), ZYDIS_DEFINITION(0x1, 0x6A0), ZYDIS_DEFINITION(0x1, 0x634) }, + { ZYDIS_DEFINITION(0x1, 0x60D), ZYDIS_DEFINITION(0x1, 0x619), ZYDIS_DEFINITION(0x1, 0x5DD), ZYDIS_DEFINITION(0x1, 0x5ED), ZYDIS_DEFINITION(0x1, 0x6A1), ZYDIS_DEFINITION(0x1, 0x6B3), ZYDIS_DEFINITION(0x1, 0x6A2), ZYDIS_DEFINITION(0x1, 0x635) }, + { ZYDIS_DEFINITION(0x1, 0x60E), ZYDIS_DEFINITION(0x1, 0x61A), ZYDIS_DEFINITION(0x1, 0x5DE), ZYDIS_DEFINITION(0x1, 0x5EE), ZYDIS_DEFINITION(0x1, 0x6A3), ZYDIS_DEFINITION(0x1, 0x6B4), ZYDIS_DEFINITION(0x1, 0x6A4), ZYDIS_DEFINITION(0x1, 0x636) }, + { ZYDIS_DEFINITION(0x1, 0x17B), ZYDIS_DEFINITION(0x1, 0x1D2), ZYDIS_DEFINITION(0x1, 0x18B), ZYDIS_DEFINITION(0x1, 0x191), ZYDIS_DEFINITION(0x1, 0x1F7), ZYDIS_DEFINITION(0x1, 0x1FC), ZYDIS_DEFINITION(0x1, 0x19A), ZYDIS_DEFINITION(0x1, 0x19F) }, + { ZYDIS_DEFINITION(0x1, 0x17C), ZYDIS_DEFINITION(0x1, 0x1D3), ZYDIS_DEFINITION(0x1, 0x18C), ZYDIS_DEFINITION(0x1, 0x192), ZYDIS_DEFINITION(0x1, 0x1F8), ZYDIS_DEFINITION(0x1, 0x1FD), ZYDIS_DEFINITION(0x1, 0x19B), ZYDIS_DEFINITION(0x1, 0x1A0) }, + { ZYDIS_DEFINITION(0x1, 0x1C4), ZYDIS_DEFINITION(0x1, 0x209), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3D), ZYDIS_DEFINITION(0x1, 0x1F6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x3F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x40), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x41) }, + { ZYDIS_DEFINITION(0x1, 0x1C5), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1ED), ZYDIS_DEFINITION(0x1, 0x1F0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x21), ZYDIS_DEFINITION(0x1, 0x1C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x22), ZYDIS_DEFINITION(0x1, 0x1DC) }, + { ZYDIS_DEFINITION(0x1, 0x183), ZYDIS_DEFINITION(0x1, 0x185), ZYDIS_DEFINITION(0x1, 0x184), ZYDIS_DEFINITION(0x1, 0x18A), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x42), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1A8), ZYDIS_DEFINITION(0x1, 0x1B5), ZYDIS_DEFINITION(0x1, 0x1AA), ZYDIS_DEFINITION(0x1, 0x1AC), ZYDIS_DEFINITION(0x1, 0x1C0), ZYDIS_DEFINITION(0x1, 0x1C2), ZYDIS_DEFINITION(0x1, 0x1AE), ZYDIS_DEFINITION(0x1, 0x1B0) }, + { ZYDIS_DEFINITION(0x1, 0x186), ZYDIS_DEFINITION(0x1, 0x188), ZYDIS_DEFINITION(0x1, 0x187), ZYDIS_DEFINITION(0x1, 0x189), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x43), ZYDIS_DEFINITION(0x1, 0x203), ZYDIS_DEFINITION(0x1, 0x18F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1B2), ZYDIS_DEFINITION(0x1, 0x1BD), ZYDIS_DEFINITION(0x1, 0x1B8), ZYDIS_DEFINITION(0x1, 0x1BA), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1C6), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x1F1) }, + { ZYDIS_DEFINITION(0x1, 0x17D), ZYDIS_DEFINITION(0x1, 0x1D4), ZYDIS_DEFINITION(0x1, 0x18D), ZYDIS_DEFINITION(0x1, 0x193), ZYDIS_DEFINITION(0x1, 0x1FE), ZYDIS_DEFINITION(0x1, 0x1F9), ZYDIS_DEFINITION(0x1, 0x1A1), ZYDIS_DEFINITION(0x1, 0x19C) }, + { ZYDIS_DEFINITION(0x1, 0x17E), ZYDIS_DEFINITION(0x1, 0x1D5), ZYDIS_DEFINITION(0x1, 0x18E), ZYDIS_DEFINITION(0x1, 0x194), ZYDIS_DEFINITION(0x1, 0x1FA), ZYDIS_DEFINITION(0x1, 0x1FF), ZYDIS_DEFINITION(0x1, 0x19D), ZYDIS_DEFINITION(0x1, 0x1A2) }, + { ZYDIS_DEFINITION(0x1, 0x1A6), ZYDIS_DEFINITION(0x1, 0x20A), ZYDIS_DEFINITION(0x1, 0x1EE), ZYDIS_DEFINITION(0x1, 0x1F2), ZYDIS_DEFINITION(0x1, 0x202), ZYDIS_DEFINITION(0x1, 0x205), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1C7), ZYDIS_DEFINITION(0x1, 0x1BE), ZYDIS_DEFINITION(0x1, 0x1EF), ZYDIS_DEFINITION(0x1, 0x1F3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x23), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x24), ZYDIS_DEFINITION(0x1, 0x1DF) }, + { ZYDIS_DEFINITION(0x1, 0x17F), ZYDIS_DEFINITION(0x1, 0x1D6), ZYDIS_DEFINITION(0x1, 0x195), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x44), ZYDIS_DEFINITION(0x1, 0x200), ZYDIS_DEFINITION(0x1, 0x1FB), ZYDIS_DEFINITION(0x1, 0x1A3), ZYDIS_DEFINITION(0x1, 0x19E) }, + { ZYDIS_DEFINITION(0x1, 0x1A9), ZYDIS_DEFINITION(0x1, 0x1B6), ZYDIS_DEFINITION(0x1, 0x1AB), ZYDIS_DEFINITION(0x1, 0x1AD), ZYDIS_DEFINITION(0x1, 0x1C1), ZYDIS_DEFINITION(0x1, 0x1C3), ZYDIS_DEFINITION(0x1, 0x1AF), ZYDIS_DEFINITION(0x1, 0x1B1) }, + { ZYDIS_DEFINITION(0x1, 0x1A7), ZYDIS_DEFINITION(0x1, 0x20B), ZYDIS_DEFINITION(0x1, 0x1F4), ZYDIS_DEFINITION(0x1, 0x1F5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_RM, 0x45), ZYDIS_DEFINITION(0x1, 0x204), ZYDIS_DEFINITION(0x1, 0x190), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1B3), ZYDIS_DEFINITION(0x1, 0x1BF), ZYDIS_DEFINITION(0x1, 0x1B9), ZYDIS_DEFINITION(0x1, 0x1BB), ZYDIS_DEFINITION(0x1, 0x180), ZYDIS_DEFINITION(0x1, 0x1B4), ZYDIS_DEFINITION(0x1, 0x181), ZYDIS_DEFINITION(0x1, 0x1BC) }, + { ZYDIS_DEFINITION(0xD, 0x70D), ZYDIS_DEFINITION(0xD, 0x70E), ZYDIS_DEFINITION(0x1, 0x3E2), ZYDIS_DEFINITION(0x1, 0x3AA), ZYDIS_DEFINITION(0x1, 0x39A), ZYDIS_DEFINITION(0x1, 0x22C), ZYDIS_DEFINITION(0x1, 0x157), ZYDIS_DEFINITION(0x1, 0x224) }, + { ZYDIS_DEFINITION(0xD, 0x70F), ZYDIS_DEFINITION(0xD, 0x710), ZYDIS_DEFINITION(0x1, 0x3E3), ZYDIS_DEFINITION(0x1, 0x3AB), ZYDIS_DEFINITION(0x1, 0x39B), ZYDIS_DEFINITION(0x1, 0x22D), ZYDIS_DEFINITION(0x1, 0x158), ZYDIS_DEFINITION(0x1, 0x225) }, + { ZYDIS_DEFINITION(0xE, 0x711), ZYDIS_DEFINITION(0xE, 0x712), ZYDIS_DEFINITION(0x1, 0x3E4), ZYDIS_DEFINITION(0x1, 0x3AC), ZYDIS_DEFINITION(0x1, 0x39C), ZYDIS_DEFINITION(0x1, 0x22E), ZYDIS_DEFINITION(0x1, 0x159), ZYDIS_DEFINITION(0x1, 0x226) }, + { ZYDIS_DEFINITION(0xE, 0x713), ZYDIS_DEFINITION(0xE, 0x714), ZYDIS_DEFINITION(0x1, 0x3E5), ZYDIS_DEFINITION(0x1, 0x3AD), ZYDIS_DEFINITION(0x1, 0x39D), ZYDIS_DEFINITION(0x1, 0x22F), ZYDIS_DEFINITION(0x1, 0x15A), ZYDIS_DEFINITION(0x1, 0x227) }, + { ZYDIS_DEFINITION(0x1, 0x239), ZYDIS_DEFINITION(0x1, 0x153), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x23A), ZYDIS_DEFINITION(0x1, 0x154), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x23B), ZYDIS_DEFINITION(0x1, 0x155), ZYDIS_DEFINITION(0x1, 0xAB), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x27D), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5C5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x23C), ZYDIS_DEFINITION(0x1, 0x156), ZYDIS_DEFINITION(0x1, 0xAC), ZYDIS_DEFINITION(0x1, 0xAD), ZYDIS_DEFINITION(0x1, 0x27E), ZYDIS_DEFINITION(0x1, 0x27F), ZYDIS_DEFINITION(0x1, 0x5C6), ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODRM_RM[][8] = +{ + { ZYDIS_DEFINITION(0x1, 0x73F), ZYDIS_DEFINITION(0x1, 0x737), ZYDIS_DEFINITION(0x1, 0x736), ZYDIS_DEFINITION(0x1, 0x740), ZYDIS_DEFINITION(0x1, 0x6CF), ZYDIS_DEFINITION(0x1, 0xB7), ZYDIS_DEFINITION(0x1, 0x6BF), ZYDIS_DEFINITION(0x1, 0x257) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3), ZYDIS_DEFINITION(0x1, 0x5FC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0xBD), ZYDIS_DEFINITION(0x1, 0x5F6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x4), ZYDIS_DEFINITION(0x1, 0x732), ZYDIS_DEFINITION(0x1, 0x735), ZYDIS_DEFINITION(0x1, 0x73E), ZYDIS_DEFINITION(0x1, 0x745), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7), ZYDIS_DEFINITION(0x1, 0xB1), ZYDIS_DEFINITION(0x1, 0x6CC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x8) }, + { ZYDIS_DEFINITION(0x1, 0x762), ZYDIS_DEFINITION(0x1, 0x787), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x734), ZYDIS_DEFINITION(0x1, 0x761), ZYDIS_DEFINITION(0x1, 0x78D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x9) }, + { ZYDIS_DEFINITION(0x1, 0x65A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5F4), ZYDIS_DEFINITION(0x1, 0x74B) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x258), ZYDIS_DEFINITION(0x1, 0x716) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xC), 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_DEFINITION(0x1, 0x679), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x637), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x11), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x13) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x14), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x15) }, + { ZYDIS_DEFINITION(0x1, 0x78C), ZYDIS_DEFINITION(0x1, 0x77A), ZYDIS_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, 0x16), ZYDIS_DEFINITION(0x1, 0x5CE) }, + { ZYDIS_DEFINITION(0x1, 0x3D3), ZYDIS_DEFINITION(0x1, 0x3D4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_CET, 0x3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_CET, 0x4), ZYDIS_DEFINITION(0x1, 0x3D7), ZYDIS_DEFINITION(0x1, 0x3D8), ZYDIS_DEFINITION(0x1, 0x3D9), ZYDIS_DEFINITION(0x1, 0x3DA) }, + { ZYDIS_DEFINITION(0xB, 0x21F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x300), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x788), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x789), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x78A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x78B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x75F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x75C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x75E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x75D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x760), 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, 0x1B4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B6), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1B7), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CD), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1CF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1FE), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x1FF), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x200), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x201), 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, 0x423), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x424), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x42D), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x42E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x445), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x446), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x447), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x448), 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_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x4CD), 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_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x591), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x59F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x5A1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x602), 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_FILTER(ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH, 0x614), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x750), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xF, 0x755), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1D9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x182), ZYDIS_DEFINITION(0x1, 0x17A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x201), ZYDIS_DEFINITION(0x1, 0x208), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1C8), ZYDIS_DEFINITION(0x1, 0x1CD), ZYDIS_DEFINITION(0x1, 0x1CC), ZYDIS_DEFINITION(0x1, 0x1D0), ZYDIS_DEFINITION(0x1, 0x1CE), ZYDIS_DEFINITION(0x1, 0x1CF), ZYDIS_DEFINITION(0x1, 0x1D1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x179), ZYDIS_DEFINITION(0x1, 0x211), ZYDIS_DEFINITION(0x1, 0x1E4), ZYDIS_DEFINITION(0x1, 0x1E1), ZYDIS_DEFINITION(0x1, 0x210), ZYDIS_DEFINITION(0x1, 0x1E3), ZYDIS_DEFINITION(0x1, 0x198), ZYDIS_DEFINITION(0x1, 0x1B7) }, + { ZYDIS_DEFINITION(0x1, 0x1E2), ZYDIS_DEFINITION(0x1, 0x212), ZYDIS_DEFINITION(0x1, 0x1EC), ZYDIS_DEFINITION(0x1, 0x1EB), ZYDIS_DEFINITION(0x1, 0x1E5), ZYDIS_DEFINITION(0x1, 0x1E8), ZYDIS_DEFINITION(0x1, 0x1EA), ZYDIS_DEFINITION(0x1, 0x197) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x206), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1A5), ZYDIS_DEFINITION(0x1, 0x199), ZYDIS_DEFINITION(0x1, 0x1D7), ZYDIS_DEFINITION(0x1, 0x1D8), ZYDIS_DEFINITION(0x1, 0x1E9), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x196), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x1E0), 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, 0x390), ZYDIS_DEFINITION(0x1, 0x38C), ZYDIS_DEFINITION(0x1, 0x37F), ZYDIS_DEFINITION(0x1, 0x374) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x391), ZYDIS_DEFINITION(0x1, 0x38D), ZYDIS_DEFINITION(0x1, 0x380), ZYDIS_DEFINITION(0x1, 0x375) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x392), ZYDIS_DEFINITION(0x1, 0x38E), ZYDIS_DEFINITION(0x1, 0x381), ZYDIS_DEFINITION(0x1, 0x376) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x393), ZYDIS_DEFINITION(0x1, 0x38F), ZYDIS_DEFINITION(0x1, 0x382), ZYDIS_DEFINITION(0x1, 0x377) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x348), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x37A), ZYDIS_DEFINITION(0x1, 0x339) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x350), ZYDIS_DEFINITION(0x1, 0x34E), ZYDIS_DEFINITION(0x1, 0x37B), ZYDIS_DEFINITION(0x1, 0x33A) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x351), ZYDIS_DEFINITION(0x1, 0x34F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x72C), ZYDIS_DEFINITION(0x1, 0x72A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x72D), ZYDIS_DEFINITION(0x1, 0x72B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x728), ZYDIS_DEFINITION(0x1, 0x726), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x729), ZYDIS_DEFINITION(0x1, 0x727), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x34D), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x378), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x34B), ZYDIS_DEFINITION(0x1, 0x349), ZYDIS_DEFINITION(0x1, 0x379), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x34C), ZYDIS_DEFINITION(0x1, 0x34A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3C0), ZYDIS_DEFINITION(0x1, 0x84), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1E) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x1F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x20), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x21), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x22) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3C3), ZYDIS_DEFINITION(0x1, 0x87), ZYDIS_DEFINITION(0x1, 0x3C4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x23) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x24), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x25), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x26), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x27) }, + { ZYDIS_DEFINITION(0x1, 0x3C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0xC), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3CA), ZYDIS_DEFINITION(0x1, 0x3CB), ZYDIS_DEFINITION(0x1, 0x3CC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0xD), ZYDIS_DEFINITION(0x1, 0x3DD) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x323), ZYDIS_DEFINITION(0x1, 0x31F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x324), ZYDIS_DEFINITION(0x1, 0x320), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x325), ZYDIS_DEFINITION(0x1, 0x321), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x326), ZYDIS_DEFINITION(0x1, 0x322), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x122), ZYDIS_DEFINITION(0x1, 0x120), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x123), ZYDIS_DEFINITION(0x1, 0x121), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x359), ZYDIS_DEFINITION(0x1, 0x358), ZYDIS_DEFINITION(0x1, 0x35C), ZYDIS_DEFINITION(0x1, 0x35B) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x144), ZYDIS_DEFINITION(0x1, 0x140), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x145), ZYDIS_DEFINITION(0x1, 0x141), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x9) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x128), ZYDIS_DEFINITION(0x1, 0x11C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xB) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x129), ZYDIS_DEFINITION(0x1, 0x11D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0xD) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x71C), ZYDIS_DEFINITION(0x1, 0x71A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x71D), ZYDIS_DEFINITION(0x1, 0x71B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x10E), ZYDIS_DEFINITION(0x1, 0x10C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x10F), ZYDIS_DEFINITION(0x1, 0x10D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x213), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x533), ZYDIS_DEFINITION(0x1, 0x535), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x534), ZYDIS_DEFINITION(0x1, 0x536), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x49F), ZYDIS_DEFINITION(0x1, 0x4A1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4A0), ZYDIS_DEFINITION(0x1, 0x4A2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x497), ZYDIS_DEFINITION(0x1, 0x499), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x498), ZYDIS_DEFINITION(0x1, 0x49A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x49B), ZYDIS_DEFINITION(0x1, 0x49D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x49C), ZYDIS_DEFINITION(0x1, 0x49E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4BB), ZYDIS_DEFINITION(0x1, 0x4BD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4BC), ZYDIS_DEFINITION(0x1, 0x4BE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4AD), ZYDIS_DEFINITION(0x1, 0x4AF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4AE), ZYDIS_DEFINITION(0x1, 0x4B0), 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, 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, 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, 0x547), ZYDIS_DEFINITION(0x1, 0x549), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x548), ZYDIS_DEFINITION(0x1, 0x54A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x543), ZYDIS_DEFINITION(0x1, 0x545), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x544), ZYDIS_DEFINITION(0x1, 0x546), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4FF), ZYDIS_DEFINITION(0x1, 0x501), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x500), ZYDIS_DEFINITION(0x1, 0x502), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x45D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x45E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x72), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x73), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x70), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x59E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x59F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x40E), ZYDIS_DEFINITION(0x1, 0x410), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x40F), ZYDIS_DEFINITION(0x1, 0x411), 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, 0x412), ZYDIS_DEFINITION(0x1, 0x414), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x413), ZYDIS_DEFINITION(0x1, 0x415), 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, 0x4E5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4ED), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4EE), 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, 0x4EB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4EC), 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, 0x46B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x46C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x355), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x422), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x423), 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, 0x4F1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F2), 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, 0x4F9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4FA), 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, 0x4F7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4F8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x481), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x482), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E2), 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, 0x4C3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4C4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4C5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4C6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D2), 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, 0x50B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x50C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4A3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4A4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x2F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x30), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x31), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x683), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x684), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x67F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x680), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x681), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x682), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x68B), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x68C), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x687), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x688), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x689), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x68A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x218), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x219), 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, 0x4C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x44), ZYDIS_DEFINITION(0x1, 0x2D1), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x45), ZYDIS_DEFINITION(0x1, 0x46), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x48), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x49), ZYDIS_DEFINITION(0x1, 0x3E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3D), ZYDIS_DEFINITION(0x1, 0x47), 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, 0x3F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x112) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x113) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x114) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x115) }, + { 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, 0x32), ZYDIS_DEFINITION(0x1, 0x173), ZYDIS_DEFINITION(0x1, 0x172) }, + { 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, 0x16E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x16F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x61D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x61E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x61B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x61C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x621), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x622), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x61F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x620), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x6E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x6F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x6C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x6D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x45F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x460), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x448), ZYDIS_DEFINITION(0xB, 0x44A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x449), ZYDIS_DEFINITION(0xB, 0x44B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x48D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x48E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x495), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x496), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x15), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x16), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x175), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x176), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4B1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4B2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x248), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x249), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x17), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x18), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x165), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x166), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x163), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x164), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x398), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x399), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x461), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x462), 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_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, 0x489), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x48A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x487), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x488), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x685), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x686), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x216), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x217), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x214), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x215), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4F), 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, 0x353), ZYDIS_DEFINITION(0x1, 0x352), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6C6), ZYDIS_DEFINITION(0x1, 0x6C4), ZYDIS_DEFINITION(0x1, 0x6CA), ZYDIS_DEFINITION(0x1, 0x6C8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6C7), ZYDIS_DEFINITION(0x1, 0x6C5), ZYDIS_DEFINITION(0x1, 0x6CB), ZYDIS_DEFINITION(0x1, 0x6C9) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x624), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x626), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x625), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x627), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5DF), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5E1), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5E0), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5E2), 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, 0x64), ZYDIS_DEFINITION(0x1, 0x62), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x65), ZYDIS_DEFINITION(0x1, 0x63), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3FA), ZYDIS_DEFINITION(0x1, 0x3F8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3FB), ZYDIS_DEFINITION(0x1, 0x3F9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x778), ZYDIS_DEFINITION(0x1, 0x776), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x779), ZYDIS_DEFINITION(0x1, 0x777), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2E), ZYDIS_DEFINITION(0x1, 0x2C), ZYDIS_DEFINITION(0x1, 0x32), ZYDIS_DEFINITION(0x1, 0x30) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F), ZYDIS_DEFINITION(0x1, 0x2D), ZYDIS_DEFINITION(0x1, 0x33), ZYDIS_DEFINITION(0x1, 0x31) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3A0), ZYDIS_DEFINITION(0x1, 0x39E), ZYDIS_DEFINITION(0x1, 0x3A4), ZYDIS_DEFINITION(0x1, 0x3A2) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x3A1), ZYDIS_DEFINITION(0x1, 0x39F), ZYDIS_DEFINITION(0x1, 0x3A5), ZYDIS_DEFINITION(0x1, 0x3A3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x126), ZYDIS_DEFINITION(0x1, 0x11E), ZYDIS_DEFINITION(0x1, 0x138), ZYDIS_DEFINITION(0x1, 0x12E) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x127), ZYDIS_DEFINITION(0x1, 0x11F), ZYDIS_DEFINITION(0x1, 0x139), ZYDIS_DEFINITION(0x1, 0x12F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x118), ZYDIS_DEFINITION(0x1, 0x124), ZYDIS_DEFINITION(0x1, 0x142), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x119), ZYDIS_DEFINITION(0x1, 0x125), ZYDIS_DEFINITION(0x1, 0x143), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6F5), ZYDIS_DEFINITION(0x1, 0x6F3), ZYDIS_DEFINITION(0x1, 0x6F9), ZYDIS_DEFINITION(0x1, 0x6F7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x6F6), ZYDIS_DEFINITION(0x1, 0x6F4), ZYDIS_DEFINITION(0x1, 0x6FA), ZYDIS_DEFINITION(0x1, 0x6F8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F6), ZYDIS_DEFINITION(0x1, 0x2F4), ZYDIS_DEFINITION(0x1, 0x2FA), ZYDIS_DEFINITION(0x1, 0x2F8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2F7), ZYDIS_DEFINITION(0x1, 0x2F5), ZYDIS_DEFINITION(0x1, 0x2FB), ZYDIS_DEFINITION(0x1, 0x2F9) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x15D), ZYDIS_DEFINITION(0x1, 0x15B), ZYDIS_DEFINITION(0x1, 0x161), ZYDIS_DEFINITION(0x1, 0x15F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x15E), ZYDIS_DEFINITION(0x1, 0x15C), ZYDIS_DEFINITION(0x1, 0x162), ZYDIS_DEFINITION(0x1, 0x160) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2EC), ZYDIS_DEFINITION(0x1, 0x2EA), ZYDIS_DEFINITION(0x1, 0x2F0), ZYDIS_DEFINITION(0x1, 0x2EE) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2ED), ZYDIS_DEFINITION(0x1, 0x2EB), ZYDIS_DEFINITION(0x1, 0x2F1), ZYDIS_DEFINITION(0x1, 0x2EF) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B0), ZYDIS_DEFINITION(0x1, 0x5B2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B1), ZYDIS_DEFINITION(0x1, 0x5B3), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5BA), ZYDIS_DEFINITION(0x1, 0x5BC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5BB), ZYDIS_DEFINITION(0x1, 0x5BD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B4), ZYDIS_DEFINITION(0x1, 0x5B6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B5), ZYDIS_DEFINITION(0x1, 0x5B7), 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, 0x479), ZYDIS_DEFINITION(0x1, 0x47B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x47A), ZYDIS_DEFINITION(0x1, 0x47C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x483), ZYDIS_DEFINITION(0x1, 0x485), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x484), ZYDIS_DEFINITION(0x1, 0x486), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x47D), ZYDIS_DEFINITION(0x1, 0x47F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x47E), ZYDIS_DEFINITION(0x1, 0x480), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x424), ZYDIS_DEFINITION(0x1, 0x426), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x425), ZYDIS_DEFINITION(0x1, 0x427), 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, 0x5AC), ZYDIS_DEFINITION(0x1, 0x5AE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5AD), ZYDIS_DEFINITION(0x1, 0x5AF), 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, 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, 0x5B8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5B9), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x33), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x34), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x35), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x36), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x361), ZYDIS_DEFINITION(0x1, 0x340), ZYDIS_DEFINITION(0x1, 0x344), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x362), ZYDIS_DEFINITION(0x1, 0x341), ZYDIS_DEFINITION(0x1, 0x345), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x53D), ZYDIS_DEFINITION(0xB, 0x537), ZYDIS_DEFINITION(0xB, 0x539), ZYDIS_DEFINITION(0xB, 0x53B) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x53E), ZYDIS_DEFINITION(0xB, 0x538), ZYDIS_DEFINITION(0xB, 0x53A), ZYDIS_DEFINITION(0xB, 0x53C) }, + { 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, 0x463), ZYDIS_DEFINITION(0x1, 0x465), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x464), ZYDIS_DEFINITION(0x1, 0x466), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x46D), ZYDIS_DEFINITION(0x1, 0x46F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x46E), ZYDIS_DEFINITION(0x1, 0x470), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x467), ZYDIS_DEFINITION(0x1, 0x469), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x468), ZYDIS_DEFINITION(0x1, 0x46A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x167), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x37), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_REG, 0x18), ZYDIS_INVALID, ZYDIS_DEFINITION(0x13, 0x24A) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x38), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x39), ZYDIS_DEFINITION(0x1, 0x178), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x24B) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x21A), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x21C) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x21B), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x21D) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x220), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x222) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x221), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x223) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3C), ZYDIS_DEFINITION(0x1, 0x367), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x3E), ZYDIS_DEFINITION(0x1, 0x368), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x369), ZYDIS_DEFINITION(0x1, 0x342), ZYDIS_DEFINITION(0x1, 0x346), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x36A), ZYDIS_DEFINITION(0x1, 0x343), ZYDIS_DEFINITION(0x1, 0x347), 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, 0x51F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x520), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x8E), ZYDIS_DEFINITION(0x1, 0x90), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_TZCNT, 0x0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x8F), ZYDIS_DEFINITION(0x1, 0x91), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_TZCNT, 0x1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x92), ZYDIS_DEFINITION(0x1, 0x94), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_LZCNT, 0x0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x93), ZYDIS_DEFINITION(0x1, 0x95), ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_LZCNT, 0x1), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xF3), ZYDIS_DEFINITION(0xB, 0xF1), ZYDIS_DEFINITION(0xB, 0x100), ZYDIS_DEFINITION(0xB, 0xFB) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0xF4), ZYDIS_DEFINITION(0xB, 0xF2), ZYDIS_DEFINITION(0xB, 0x101), ZYDIS_DEFINITION(0xB, 0xFC) }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x1), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4B7), ZYDIS_DEFINITION(0xB, 0x4B9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x4B8), ZYDIS_DEFINITION(0xB, 0x4BA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x493), ZYDIS_DEFINITION(0xB, 0x494), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x6BB), ZYDIS_DEFINITION(0xB, 0x6B9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x6BC), ZYDIS_DEFINITION(0xB, 0x6BA), 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, 0x34), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x36) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x35), ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x37) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x57A), ZYDIS_DEFINITION(0x1, 0x57C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x57B), ZYDIS_DEFINITION(0x1, 0x57D), 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, 0x574), ZYDIS_DEFINITION(0x1, 0x576), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x575), ZYDIS_DEFINITION(0x1, 0x577), 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, 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_INVALID, ZYDIS_DEFINITION(0x1, 0x36B), ZYDIS_DEFINITION(0x1, 0x36D), ZYDIS_DEFINITION(0x1, 0x33F) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x36C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4E3), ZYDIS_DEFINITION(0x1, 0x4E4), 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, 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, 0x4DB), ZYDIS_DEFINITION(0x1, 0x4DD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4DC), ZYDIS_DEFINITION(0x1, 0x4DE), 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, 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, 0x4CB), ZYDIS_DEFINITION(0x1, 0x4CD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4CC), ZYDIS_DEFINITION(0x1, 0x4CE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x450), ZYDIS_DEFINITION(0x1, 0x452), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x451), ZYDIS_DEFINITION(0x1, 0x453), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x455), ZYDIS_DEFINITION(0x1, 0x457), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x456), ZYDIS_DEFINITION(0x1, 0x458), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x567), ZYDIS_DEFINITION(0x1, 0x569), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x568), ZYDIS_DEFINITION(0x1, 0x56A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x561), ZYDIS_DEFINITION(0x1, 0x563), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x562), ZYDIS_DEFINITION(0x1, 0x564), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x459), ZYDIS_DEFINITION(0x1, 0x45B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x45A), ZYDIS_DEFINITION(0x1, 0x45C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x503), ZYDIS_DEFINITION(0x1, 0x505), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x504), ZYDIS_DEFINITION(0x1, 0x506), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x507), ZYDIS_DEFINITION(0x1, 0x509), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x508), ZYDIS_DEFINITION(0x1, 0x50A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x13E), ZYDIS_DEFINITION(0x1, 0x116), ZYDIS_DEFINITION(0x1, 0x11A) }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x13F), ZYDIS_DEFINITION(0x1, 0x117), ZYDIS_DEFINITION(0x1, 0x11B) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x35A), ZYDIS_DEFINITION(0x1, 0x354), 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, 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, 0x4D7), ZYDIS_DEFINITION(0x1, 0x4D9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4D8), ZYDIS_DEFINITION(0x1, 0x4DA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x524), ZYDIS_DEFINITION(0x1, 0x526), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x525), ZYDIS_DEFINITION(0x1, 0x527), 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_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, 0x4C7), ZYDIS_DEFINITION(0x1, 0x4C9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4C8), ZYDIS_DEFINITION(0x1, 0x4CA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5CF), ZYDIS_DEFINITION(0x1, 0x5D1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x5D0), ZYDIS_DEFINITION(0x1, 0x5D2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2C0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x55A), ZYDIS_DEFINITION(0x1, 0x55C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x55B), ZYDIS_DEFINITION(0x1, 0x55D), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x54D), ZYDIS_DEFINITION(0x1, 0x54F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x54E), ZYDIS_DEFINITION(0x1, 0x550), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x554), ZYDIS_DEFINITION(0x1, 0x556), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x555), ZYDIS_DEFINITION(0x1, 0x557), 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_DEFINITION(0x1, 0x4BF), ZYDIS_DEFINITION(0x1, 0x4C1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x4C0), ZYDIS_DEFINITION(0x1, 0x4C2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x52F), ZYDIS_DEFINITION(0x1, 0x531), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x530), ZYDIS_DEFINITION(0x1, 0x532), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2E9), ZYDIS_DEFINITION(0x1, 0x2E8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x57E), ZYDIS_DEFINITION(0x1, 0x580), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x57F), ZYDIS_DEFINITION(0x1, 0x581), 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, 0x582), ZYDIS_DEFINITION(0x1, 0x584), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x583), ZYDIS_DEFINITION(0x1, 0x585), ZYDIS_INVALID, ZYDIS_INVALID }, + { 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, 0x428), ZYDIS_DEFINITION(0x1, 0x42A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x429), ZYDIS_DEFINITION(0x1, 0x42B), 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, 0x42C), ZYDIS_DEFINITION(0x1, 0x42E), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x42D), ZYDIS_DEFINITION(0x1, 0x42F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x23F), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x240), ZYDIS_DEFINITION(0x0, 0x241) }, + { 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, 0x402), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x403), ZYDIS_DEFINITION(0x0, 0x404) }, + { 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, 0x454), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x36E), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x36F), ZYDIS_DEFINITION(0x0, 0x370) }, + { 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, 0xF5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0xF6), ZYDIS_DEFINITION(0x0, 0xF7) }, + { 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, 0x6D2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x6D3), ZYDIS_DEFINITION(0x0, 0x6D4) }, + { 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, 0x2D2), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x2D3), ZYDIS_DEFINITION(0x0, 0x2D4) }, + { 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, 0x64A), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x64B), ZYDIS_DEFINITION(0x0, 0x64C) }, + { 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, 0x703), ZYDIS_DEFINITION(0x0, 0x703), ZYDIS_DEFINITION(0x0, 0x702) }, + { ZYDIS_DEFINITION(0x1, 0x357), ZYDIS_DEFINITION(0x1, 0x357), ZYDIS_DEFINITION(0x1, 0x356) }, + { ZYDIS_DEFINITION(0x0, 0x5C9), ZYDIS_DEFINITION(0x0, 0x5CA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x51D), ZYDIS_DEFINITION(0x0, 0x51E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x8C), ZYDIS_DEFINITION(0x1, 0x8D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x24C), ZYDIS_DEFINITION(0x0, 0x242), ZYDIS_DEFINITION(0x0, 0x243) }, + { ZYDIS_DEFINITION(0x0, 0x24D), ZYDIS_DEFINITION(0x0, 0x244), ZYDIS_DEFINITION(0x0, 0x245) }, + { ZYDIS_DEFINITION(0x0, 0x24E), ZYDIS_DEFINITION(0x0, 0x246), ZYDIS_DEFINITION(0x0, 0x247) }, + { ZYDIS_DEFINITION(0x0, 0x40B), ZYDIS_DEFINITION(0x0, 0x405), ZYDIS_DEFINITION(0x0, 0x406) }, + { ZYDIS_DEFINITION(0x0, 0x40C), ZYDIS_DEFINITION(0x0, 0x407), ZYDIS_DEFINITION(0x0, 0x408) }, + { ZYDIS_DEFINITION(0x0, 0x40D), ZYDIS_DEFINITION(0x0, 0x409), ZYDIS_DEFINITION(0x0, 0x40A) }, + { ZYDIS_DEFINITION(0x0, 0xAE), ZYDIS_DEFINITION(0x0, 0x14F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4ED) }, + { ZYDIS_DEFINITION(0x0, 0x14E), ZYDIS_DEFINITION(0x0, 0xAF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_W, 0x4EE) }, + { ZYDIS_DEFINITION(0x0, 0x5CB), ZYDIS_DEFINITION(0x0, 0x5CD), ZYDIS_DEFINITION(0x0, 0x5CD) }, + { ZYDIS_DEFINITION(0x0, 0x5CB), ZYDIS_DEFINITION(0x0, 0x5CC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x521), ZYDIS_DEFINITION(0x0, 0x523), ZYDIS_DEFINITION(0x0, 0x523) }, + { ZYDIS_DEFINITION(0x0, 0x521), ZYDIS_DEFINITION(0x0, 0x522), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x383), ZYDIS_DEFINITION(0x0, 0x371), ZYDIS_DEFINITION(0x0, 0x37C) }, + { ZYDIS_DEFINITION(0x0, 0x384), ZYDIS_DEFINITION(0x0, 0x372), ZYDIS_DEFINITION(0x0, 0x37D) }, + { ZYDIS_DEFINITION(0x0, 0x385), ZYDIS_DEFINITION(0x0, 0x373), ZYDIS_DEFINITION(0x0, 0x37E) }, + { ZYDIS_DEFINITION(0x0, 0x102), ZYDIS_DEFINITION(0x0, 0xF8), ZYDIS_DEFINITION(0x0, 0xFD) }, + { ZYDIS_DEFINITION(0x0, 0x103), ZYDIS_DEFINITION(0x0, 0xF9), ZYDIS_DEFINITION(0x0, 0xFE) }, + { ZYDIS_DEFINITION(0x0, 0x104), ZYDIS_DEFINITION(0x0, 0xFA), ZYDIS_DEFINITION(0x0, 0xFF) }, + { ZYDIS_DEFINITION(0x0, 0x6DB), ZYDIS_DEFINITION(0x0, 0x6D5), ZYDIS_DEFINITION(0x0, 0x6D8) }, + { ZYDIS_DEFINITION(0x0, 0x6DC), ZYDIS_DEFINITION(0x0, 0x6D6), ZYDIS_DEFINITION(0x0, 0x6D9) }, + { ZYDIS_DEFINITION(0x0, 0x6DD), ZYDIS_DEFINITION(0x0, 0x6D7), ZYDIS_DEFINITION(0x0, 0x6DA) }, + { ZYDIS_DEFINITION(0x0, 0x2DB), ZYDIS_DEFINITION(0x0, 0x2D5), ZYDIS_DEFINITION(0x0, 0x2D8) }, + { ZYDIS_DEFINITION(0x0, 0x2DC), ZYDIS_DEFINITION(0x0, 0x2D6), ZYDIS_DEFINITION(0x0, 0x2D9) }, + { ZYDIS_DEFINITION(0x0, 0x2DD), ZYDIS_DEFINITION(0x0, 0x2D7), ZYDIS_DEFINITION(0x0, 0x2DA) }, + { ZYDIS_DEFINITION(0x0, 0x653), ZYDIS_DEFINITION(0x0, 0x64D), ZYDIS_DEFINITION(0x0, 0x650) }, + { ZYDIS_DEFINITION(0x0, 0x654), ZYDIS_DEFINITION(0x0, 0x64E), ZYDIS_DEFINITION(0x0, 0x651) }, + { ZYDIS_DEFINITION(0x0, 0x655), ZYDIS_DEFINITION(0x0, 0x64F), ZYDIS_DEFINITION(0x0, 0x652) }, + { ZYDIS_DEFINITION(0x0, 0x25D), ZYDIS_DEFINITION(0x0, 0x25E), ZYDIS_DEFINITION(0x0, 0x25F) }, + { ZYDIS_DEFINITION(0x1, 0x1CA), ZYDIS_DEFINITION(0x1, 0x1CB), ZYDIS_DEFINITION(0x1, 0x1CB) }, + { ZYDIS_DEFINITION(0x1, 0x1DD), ZYDIS_DEFINITION(0x1, 0x1DE), ZYDIS_DEFINITION(0x1, 0x1DE) }, + { ZYDIS_DEFINITION(0x1, 0x1E6), ZYDIS_DEFINITION(0x1, 0x1E7), ZYDIS_DEFINITION(0x1, 0x1E7) }, + { ZYDIS_DEFINITION(0x1, 0x1DA), ZYDIS_DEFINITION(0x1, 0x1DB), ZYDIS_DEFINITION(0x1, 0x1DB) }, + { ZYDIS_DEFINITION(0x3, 0x233), ZYDIS_DEFINITION(0x3, 0x234), ZYDIS_DEFINITION(0x3, 0x234) }, + { ZYDIS_DEFINITION(0x3, 0x3FD), ZYDIS_DEFINITION(0x3, 0x3FE), ZYDIS_DEFINITION(0x3, 0x3FE) }, + { ZYDIS_DEFINITION(0x0, 0x236), ZYDIS_DEFINITION(0x0, 0x237), ZYDIS_DEFINITION(0x0, 0x237) }, + { ZYDIS_DEFINITION(0x0, 0x400), ZYDIS_DEFINITION(0x0, 0x401), ZYDIS_DEFINITION(0x0, 0x401) } +}; + +const ZydisDecoderTreeNode FILTERS_ADDRESS_SIZE[][3] = +{ + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x81), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x86), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x77), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x7F), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x8B), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x89), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x83), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x7B), 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, 0x46E), ZYDIS_DEFINITION(0x1, 0x46E) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x470), ZYDIS_DEFINITION(0x1, 0x470) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x46F), ZYDIS_DEFINITION(0x1, 0x46F) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x471), ZYDIS_DEFINITION(0x1, 0x471) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x472), ZYDIS_DEFINITION(0x1, 0x472) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x474), ZYDIS_DEFINITION(0x1, 0x474) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x473), ZYDIS_DEFINITION(0x1, 0x473) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x475), ZYDIS_DEFINITION(0x1, 0x475) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2BB), ZYDIS_DEFINITION(0x1, 0x2BB) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2B9), ZYDIS_DEFINITION(0x1, 0x2B9) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2BC), ZYDIS_DEFINITION(0x1, 0x2BC) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2BA), ZYDIS_DEFINITION(0x1, 0x2BA) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2BF), ZYDIS_DEFINITION(0x1, 0x2BF) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2BD), ZYDIS_DEFINITION(0x1, 0x2BD) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2C0), ZYDIS_DEFINITION(0x1, 0x2C0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2BE), ZYDIS_DEFINITION(0x1, 0x2BE) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x8, 0x26B), ZYDIS_DEFINITION(0x8, 0x2B2) }, + { ZYDIS_DEFINITION(0x8, 0x26A), ZYDIS_DEFINITION(0x8, 0x26C), 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, 0x3EE), ZYDIS_INVALID, ZYDIS_INVALID }, + { 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3F9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x3FA), ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x415), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x416), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x417), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x418), ZYDIS_INVALID, 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, 0x43B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43C), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x43F), ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x442), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x443), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x444), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x445), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x446), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xD2), 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_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_MODRM_MOD_COMPACT, 0x44F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x450), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x451), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x452), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x453), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x454), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x458), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x45F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xDF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x461), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x463), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE1), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE2), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x466), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x467), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x468), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x469), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x46F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x470), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x471), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x472), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x473), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x474), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x475), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x476), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x477), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x478), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x479), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x47F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x480), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x481), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x482), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x483), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x484), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x485), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x486), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x487), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x0, 0x642), ZYDIS_DEFINITION(0x0, 0x641), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xE5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x48A), ZYDIS_INVALID, 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_MODE_COMPACT, 0xE9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xEA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x493), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x497), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x498), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x499), 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_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_MODRM_MOD_COMPACT, 0x4A5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4A7), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AA), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4AF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B3), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4B5), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4BC), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4BF), ZYDIS_INVALID }, + { ZYDIS_INVALID, 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C2), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C3), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C4), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C5), ZYDIS_INVALID }, + { ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4C9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CD), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4CF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x4D1), 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_MODE_COMPACT, 0xF6), ZYDIS_INVALID, 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_MODRM_MOD_COMPACT, 0x50B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x50C), 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_MODE_COMPACT, 0xF7), ZYDIS_INVALID, 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_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x528), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x529), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52A), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x52C), ZYDIS_INVALID, 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_MODRM_MOD_COMPACT, 0x52F), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x530), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x534), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x535), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x536), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x537), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x538), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x53C), 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_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x540), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x541), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x542), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x543), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x544), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x545), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x546), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x547), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x548), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x549), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x54A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x54B), 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_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x57F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x580), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x581), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x582), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x583), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x584), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x585), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x586), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x587), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x588), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x589), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x58A), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5AF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B2), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B3), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B4), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B8), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5B9), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5BA), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5C0), 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_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E4), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E5), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E6), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E7), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E8), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5ED), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EE), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5EF), 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_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FA), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FB), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x5FF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF8), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xF9), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x602), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x603), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x604), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x605), 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_MODRM_MOD_COMPACT, 0x60C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60D), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x60E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFA), ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x61A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x61B), 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, 0x627), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x628), 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, 0x62D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x62E), 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, 0x632), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x633), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x634), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x635), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x637), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x638), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x63E), 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, 0x642), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x643), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x644), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x645), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x647), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x648), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x64E), 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_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x653), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x654), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x655), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x656), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x657), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x658), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x659), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFB), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65D), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65E), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x65F), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x660), 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, 0x663), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x664), ZYDIS_INVALID }, + { ZYDIS_INVALID, 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, 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_MODRM_MOD_COMPACT, 0x674), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x675), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFC), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x678), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x679), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67A), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67B), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x67C), ZYDIS_INVALID }, + { 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_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFD), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x681), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x682), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x683), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x684), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x685), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x686), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFE), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x688), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x689), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68A), ZYDIS_INVALID, 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68E), ZYDIS_INVALID }, + { ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x68F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x690), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x691), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x692), 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_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x697), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x698), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x699), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69B), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69D), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x69F), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A0), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A1), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xFF), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A4), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A5), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A6), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6A7), 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, 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, 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, 0x6B9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BA), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BB), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BC), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6BF), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C0), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6C3), ZYDIS_INVALID, 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, 0x6D6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6D7), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DC), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DD), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6DF), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E0), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6E2), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x103), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x104), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x105), ZYDIS_INVALID, 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_MODRM_MOD_COMPACT, 0x6E9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6EA), 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_MODE_COMPACT, 0x10B), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x10C), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F4), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x6F5), ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x704), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT, 0x705), 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, 0x110), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x111), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x112), ZYDIS_INVALID, 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_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, 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_MODE_COMPACT, 0x118), ZYDIS_INVALID, ZYDIS_INVALID }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x119), ZYDIS_INVALID, 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 } +}; + +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, 0x134), ZYDIS_DEFINITION(0x1, 0x135) }, + { ZYDIS_DEFINITION(0x1, 0x130), ZYDIS_DEFINITION(0x1, 0x131) }, + { ZYDIS_DEFINITION(0x1, 0x136), ZYDIS_DEFINITION(0x1, 0x137) }, + { ZYDIS_DEFINITION(0x1, 0x132), ZYDIS_DEFINITION(0x1, 0x133) }, + { ZYDIS_DEFINITION(0x1, 0x14A), ZYDIS_DEFINITION(0x1, 0x14B) }, + { ZYDIS_DEFINITION(0x1, 0x146), ZYDIS_DEFINITION(0x1, 0x147) }, + { ZYDIS_DEFINITION(0x1, 0x14C), ZYDIS_DEFINITION(0x1, 0x14D) }, + { ZYDIS_DEFINITION(0x1, 0x148), ZYDIS_DEFINITION(0x1, 0x149) }, + { ZYDIS_DEFINITION(0x1, 0x13A), ZYDIS_DEFINITION(0x1, 0x13B) }, + { ZYDIS_DEFINITION(0x1, 0x12A), ZYDIS_DEFINITION(0x1, 0x12B) }, + { ZYDIS_DEFINITION(0x1, 0x13C), ZYDIS_DEFINITION(0x1, 0x13D) }, + { ZYDIS_DEFINITION(0x1, 0x12C), ZYDIS_DEFINITION(0x1, 0x12D) }, + { ZYDIS_DEFINITION(0x1, 0x74E), ZYDIS_DEFINITION(0x1, 0x74F) }, + { ZYDIS_DEFINITION(0x1, 0x16), ZYDIS_DEFINITION(0x1, 0x17) }, + { ZYDIS_DEFINITION(0x1, 0x38), ZYDIS_DEFINITION(0x1, 0x39) }, + { ZYDIS_DEFINITION(0x1, 0x74C), ZYDIS_DEFINITION(0x1, 0x74D) }, + { ZYDIS_DEFINITION(0x1, 0x18), ZYDIS_DEFINITION(0x1, 0x19) }, + { ZYDIS_DEFINITION(0x1, 0x3A), ZYDIS_DEFINITION(0x1, 0x3B) }, + { ZYDIS_DEFINITION(0x1, 0x33D), ZYDIS_DEFINITION(0x1, 0x33E) }, + { ZYDIS_DEFINITION(0xB, 0x48F), ZYDIS_DEFINITION(0xB, 0x491) }, + { ZYDIS_DEFINITION(0xB, 0x490), ZYDIS_DEFINITION(0xB, 0x492) }, + { ZYDIS_DEFINITION(0xB, 0x4B3), ZYDIS_DEFINITION(0xB, 0x4B5) }, + { ZYDIS_DEFINITION(0xB, 0x4B4), ZYDIS_DEFINITION(0xB, 0x4B6) }, + { ZYDIS_DEFINITION(0xB, 0x475), ZYDIS_DEFINITION(0xB, 0x476) }, + { ZYDIS_DEFINITION(0xB, 0x477), ZYDIS_DEFINITION(0xB, 0x478) }, + { ZYDIS_DEFINITION(0xB, 0x471), ZYDIS_DEFINITION(0xB, 0x472) }, + { ZYDIS_DEFINITION(0xB, 0x473), ZYDIS_DEFINITION(0xB, 0x474) }, + { ZYDIS_DEFINITION(0x1, 0x329), ZYDIS_DEFINITION(0x1, 0x35D) }, + { ZYDIS_DEFINITION(0x1, 0x32D), ZYDIS_DEFINITION(0x1, 0x35F) }, + { ZYDIS_DEFINITION(0x1, 0x32A), ZYDIS_DEFINITION(0x1, 0x35E) }, + { ZYDIS_DEFINITION(0x1, 0x32E), ZYDIS_DEFINITION(0x1, 0x360) }, + { ZYDIS_DEFINITION(0x1, 0x331), ZYDIS_DEFINITION(0x1, 0x363) }, + { ZYDIS_DEFINITION(0x1, 0x335), ZYDIS_DEFINITION(0x1, 0x365) }, + { ZYDIS_DEFINITION(0x1, 0x332), ZYDIS_DEFINITION(0x1, 0x364) }, + { ZYDIS_DEFINITION(0x1, 0x336), ZYDIS_DEFINITION(0x1, 0x366) }, + { ZYDIS_DEFINITION(0x1, 0x23D), ZYDIS_DEFINITION(0x1, 0x23E) }, + { ZYDIS_DEFINITION(0x1, 0x20E), ZYDIS_DEFINITION(0x1, 0x20F) }, + { ZYDIS_DEFINITION(0x1, 0x20C), ZYDIS_DEFINITION(0x1, 0x20D) }, + { ZYDIS_DEFINITION(0x1, 0x77F), ZYDIS_DEFINITION(0x1, 0x780) }, + { ZYDIS_DEFINITION(0x1, 0x77B), ZYDIS_DEFINITION(0x1, 0x77C) }, + { ZYDIS_DEFINITION(0x1, 0x783), ZYDIS_DEFINITION(0x1, 0x784) }, + { ZYDIS_DEFINITION(0x1, 0x10A), ZYDIS_DEFINITION(0x1, 0x109) }, + { ZYDIS_DEFINITION(0x1, 0x77D), ZYDIS_DEFINITION(0x1, 0x77E) }, + { ZYDIS_DEFINITION(0x1, 0x781), ZYDIS_DEFINITION(0x1, 0x782) }, + { ZYDIS_DEFINITION(0x1, 0x785), ZYDIS_DEFINITION(0x1, 0x786) }, + { 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, 0x71) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x85), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x72) }, + { 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, 0x73) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0xB1), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x74) }, + { 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, 0x75) }, + { 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, 0x76) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x28C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x77) }, + { 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, 0x78) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x2AE), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x79) }, + { 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, 0x7A) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x34A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7B) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x34D), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7C) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x350), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7D) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x353), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x356), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x7F) }, + { 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, 0x80) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x373), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x81) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x376), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x82) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x379), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x83) }, + { 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, 0x84) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x381), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x85) }, + { 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, 0x86), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x87) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x88), 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_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, 0x92), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x93) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x94), 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_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, 0x9E) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x40E), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0x9F) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x411), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA0) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x414), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA1) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x417), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA2) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x41A), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA3) }, + { 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, 0xA4) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x436), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA5) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x439), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA6) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x43C), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA7) }, + { 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, 0xA8) }, + { ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_EVEX_B, 0x443), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MODE_COMPACT, 0xA9) }, + { 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, 0xB0) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x111) }, + { 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, 0xAA), 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, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x71), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA7), 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, 0x317), ZYDIS_DEFINITION(0x1, 0x349) }, + { ZYDIS_DEFINITION(0x1, 0x318), ZYDIS_DEFINITION(0x1, 0x34A) }, + { ZYDIS_DEFINITION(0x1, 0x31B), ZYDIS_DEFINITION(0x1, 0x34B) }, + { ZYDIS_DEFINITION(0x1, 0x31C), ZYDIS_DEFINITION(0x1, 0x34C) }, + { 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, 0x455), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x457), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x456), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x458), 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, 0x621), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x623), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x622), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x624), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x61D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x61F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x61E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x620), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x121), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x123), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x122), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x124), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x45F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x460), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xFD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xFF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xFE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x100), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xFB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xFC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xF9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2EB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2EC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2E7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2E8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2ED), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2EE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2E9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2EA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x43B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x43C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x58E), ZYDIS_DEFINITION(0x1, 0x592) }, + { ZYDIS_DEFINITION(0x1, 0x590), ZYDIS_DEFINITION(0x1, 0x594) }, + { ZYDIS_DEFINITION(0x1, 0x58F), ZYDIS_DEFINITION(0x1, 0x593) }, + { ZYDIS_DEFINITION(0x1, 0x591), ZYDIS_DEFINITION(0x1, 0x595) }, + { ZYDIS_DEFINITION(0x1, 0x576), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x578), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x577), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x579), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x562), ZYDIS_DEFINITION(0x1, 0x566) }, + { ZYDIS_DEFINITION(0x1, 0x564), ZYDIS_DEFINITION(0x1, 0x568) }, + { ZYDIS_DEFINITION(0x1, 0x563), ZYDIS_DEFINITION(0x1, 0x567) }, + { ZYDIS_DEFINITION(0x1, 0x565), ZYDIS_DEFINITION(0x1, 0x569) }, + { ZYDIS_DEFINITION(0x1, 0xA2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x427), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x429), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x428), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x42A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x42B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x42D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x42C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x42E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x42F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x431), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x430), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x432), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x433), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x435), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x434), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x436), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3E9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3EB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3EA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3EC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3ED), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3EF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3EE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xFA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3E5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3E7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3E6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3E8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x3F4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x4A2), ZYDIS_DEFINITION(0x1, 0x4A6) }, + { ZYDIS_DEFINITION(0x1, 0x4A3), ZYDIS_DEFINITION(0x1, 0x4A7) }, + { ZYDIS_DEFINITION(0x1, 0x4A4), ZYDIS_DEFINITION(0x1, 0x4A8) }, + { ZYDIS_DEFINITION(0x1, 0x4A5), ZYDIS_DEFINITION(0x1, 0x4A9) }, + { 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, 0x1B9), ZYDIS_DEFINITION(0x1, 0x1B5) }, + { ZYDIS_DEFINITION(0x1, 0x1BB), ZYDIS_DEFINITION(0x1, 0x1B7) }, + { ZYDIS_DEFINITION(0x1, 0x1BA), ZYDIS_DEFINITION(0x1, 0x1B6) }, + { ZYDIS_DEFINITION(0x1, 0x1BC), ZYDIS_DEFINITION(0x1, 0x1B8) }, + { ZYDIS_DEFINITION(0x1, 0x205), ZYDIS_DEFINITION(0x1, 0x201) }, + { ZYDIS_DEFINITION(0x1, 0x207), ZYDIS_DEFINITION(0x1, 0x203) }, + { ZYDIS_DEFINITION(0x1, 0x206), ZYDIS_DEFINITION(0x1, 0x202) }, + { ZYDIS_DEFINITION(0x1, 0x208), ZYDIS_DEFINITION(0x1, 0x204) }, + { ZYDIS_DEFINITION(0x1, 0x17D), ZYDIS_DEFINITION(0x1, 0x179) }, + { ZYDIS_DEFINITION(0x1, 0x17F), ZYDIS_DEFINITION(0x1, 0x17B) }, + { ZYDIS_DEFINITION(0x1, 0x17E), ZYDIS_DEFINITION(0x1, 0x17A) }, + { ZYDIS_DEFINITION(0x1, 0x180), ZYDIS_DEFINITION(0x1, 0x17C) }, + { ZYDIS_DEFINITION(0x1, 0x183), ZYDIS_DEFINITION(0x1, 0x181) }, + { ZYDIS_DEFINITION(0x1, 0x184), ZYDIS_DEFINITION(0x1, 0x182) }, + { ZYDIS_DEFINITION(0x1, 0x1E1), ZYDIS_DEFINITION(0x1, 0x1DD) }, + { ZYDIS_DEFINITION(0x1, 0x1E3), ZYDIS_DEFINITION(0x1, 0x1DF) }, + { ZYDIS_DEFINITION(0x1, 0x1E2), ZYDIS_DEFINITION(0x1, 0x1DE) }, + { ZYDIS_DEFINITION(0x1, 0x1E4), ZYDIS_DEFINITION(0x1, 0x1E0) }, + { ZYDIS_DEFINITION(0x1, 0x1E7), ZYDIS_DEFINITION(0x1, 0x1E5) }, + { ZYDIS_DEFINITION(0x1, 0x1E8), ZYDIS_DEFINITION(0x1, 0x1E6) }, + { ZYDIS_DEFINITION(0x1, 0x245), ZYDIS_DEFINITION(0x1, 0x241) }, + { ZYDIS_DEFINITION(0x1, 0x247), ZYDIS_DEFINITION(0x1, 0x243) }, + { ZYDIS_DEFINITION(0x1, 0x246), ZYDIS_DEFINITION(0x1, 0x242) }, + { ZYDIS_DEFINITION(0x1, 0x248), ZYDIS_DEFINITION(0x1, 0x244) }, + { ZYDIS_DEFINITION(0x1, 0x24B), ZYDIS_DEFINITION(0x1, 0x249) }, + { ZYDIS_DEFINITION(0x1, 0x24C), ZYDIS_DEFINITION(0x1, 0x24A) }, + { ZYDIS_DEFINITION(0x1, 0x281), ZYDIS_DEFINITION(0x1, 0x27D) }, + { ZYDIS_DEFINITION(0x1, 0x283), ZYDIS_DEFINITION(0x1, 0x27F) }, + { ZYDIS_DEFINITION(0x1, 0x282), ZYDIS_DEFINITION(0x1, 0x27E) }, + { ZYDIS_DEFINITION(0x1, 0x284), ZYDIS_DEFINITION(0x1, 0x280) }, + { ZYDIS_DEFINITION(0x1, 0x287), ZYDIS_DEFINITION(0x1, 0x285) }, + { ZYDIS_DEFINITION(0x1, 0x288), ZYDIS_DEFINITION(0x1, 0x286) }, + { ZYDIS_DEFINITION(0x1, 0x1C1), ZYDIS_DEFINITION(0x1, 0x1BD) }, + { ZYDIS_DEFINITION(0x1, 0x1C3), ZYDIS_DEFINITION(0x1, 0x1BF) }, + { ZYDIS_DEFINITION(0x1, 0x1C2), ZYDIS_DEFINITION(0x1, 0x1BE) }, + { ZYDIS_DEFINITION(0x1, 0x1C4), ZYDIS_DEFINITION(0x1, 0x1C0) }, + { ZYDIS_DEFINITION(0x1, 0x20D), ZYDIS_DEFINITION(0x1, 0x209) }, + { ZYDIS_DEFINITION(0x1, 0x20F), ZYDIS_DEFINITION(0x1, 0x20B) }, + { ZYDIS_DEFINITION(0x1, 0x20E), ZYDIS_DEFINITION(0x1, 0x20A) }, + { ZYDIS_DEFINITION(0x1, 0x210), ZYDIS_DEFINITION(0x1, 0x20C) }, + { ZYDIS_DEFINITION(0x1, 0x189), ZYDIS_DEFINITION(0x1, 0x185) }, + { ZYDIS_DEFINITION(0x1, 0x18B), ZYDIS_DEFINITION(0x1, 0x187) }, + { ZYDIS_DEFINITION(0x1, 0x18A), ZYDIS_DEFINITION(0x1, 0x186) }, + { ZYDIS_DEFINITION(0x1, 0x18C), ZYDIS_DEFINITION(0x1, 0x188) }, + { ZYDIS_DEFINITION(0x1, 0x18F), ZYDIS_DEFINITION(0x1, 0x18D) }, + { ZYDIS_DEFINITION(0x1, 0x190), ZYDIS_DEFINITION(0x1, 0x18E) }, + { ZYDIS_DEFINITION(0x1, 0x1ED), ZYDIS_DEFINITION(0x1, 0x1E9) }, + { ZYDIS_DEFINITION(0x1, 0x1EF), ZYDIS_DEFINITION(0x1, 0x1EB) }, + { ZYDIS_DEFINITION(0x1, 0x1EE), ZYDIS_DEFINITION(0x1, 0x1EA) }, + { ZYDIS_DEFINITION(0x1, 0x1F0), ZYDIS_DEFINITION(0x1, 0x1EC) }, + { ZYDIS_DEFINITION(0x1, 0x1F3), ZYDIS_DEFINITION(0x1, 0x1F1) }, + { ZYDIS_DEFINITION(0x1, 0x1F4), ZYDIS_DEFINITION(0x1, 0x1F2) }, + { ZYDIS_DEFINITION(0x1, 0x251), ZYDIS_DEFINITION(0x1, 0x24D) }, + { ZYDIS_DEFINITION(0x1, 0x253), ZYDIS_DEFINITION(0x1, 0x24F) }, + { ZYDIS_DEFINITION(0x1, 0x252), ZYDIS_DEFINITION(0x1, 0x24E) }, + { ZYDIS_DEFINITION(0x1, 0x254), ZYDIS_DEFINITION(0x1, 0x250) }, + { ZYDIS_DEFINITION(0x1, 0x257), ZYDIS_DEFINITION(0x1, 0x255) }, + { ZYDIS_DEFINITION(0x1, 0x258), ZYDIS_DEFINITION(0x1, 0x256) }, + { ZYDIS_DEFINITION(0x1, 0x28D), ZYDIS_DEFINITION(0x1, 0x289) }, + { ZYDIS_DEFINITION(0x1, 0x28F), ZYDIS_DEFINITION(0x1, 0x28B) }, + { ZYDIS_DEFINITION(0x1, 0x28E), ZYDIS_DEFINITION(0x1, 0x28A) }, + { ZYDIS_DEFINITION(0x1, 0x290), ZYDIS_DEFINITION(0x1, 0x28C) }, + { ZYDIS_DEFINITION(0x1, 0x293), ZYDIS_DEFINITION(0x1, 0x291) }, + { ZYDIS_DEFINITION(0x1, 0x294), ZYDIS_DEFINITION(0x1, 0x292) }, + { ZYDIS_DEFINITION(0x1, 0x1C9), ZYDIS_DEFINITION(0x1, 0x1C5) }, + { ZYDIS_DEFINITION(0x1, 0x1CB), ZYDIS_DEFINITION(0x1, 0x1C7) }, + { ZYDIS_DEFINITION(0x1, 0x1CA), ZYDIS_DEFINITION(0x1, 0x1C6) }, + { ZYDIS_DEFINITION(0x1, 0x1CC), ZYDIS_DEFINITION(0x1, 0x1C8) }, + { ZYDIS_DEFINITION(0x1, 0x215), ZYDIS_DEFINITION(0x1, 0x211) }, + { ZYDIS_DEFINITION(0x1, 0x217), ZYDIS_DEFINITION(0x1, 0x213) }, + { ZYDIS_DEFINITION(0x1, 0x216), ZYDIS_DEFINITION(0x1, 0x212) }, + { ZYDIS_DEFINITION(0x1, 0x218), ZYDIS_DEFINITION(0x1, 0x214) }, + { ZYDIS_DEFINITION(0x1, 0x195), ZYDIS_DEFINITION(0x1, 0x191) }, + { ZYDIS_DEFINITION(0x1, 0x197), ZYDIS_DEFINITION(0x1, 0x193) }, + { ZYDIS_DEFINITION(0x1, 0x196), ZYDIS_DEFINITION(0x1, 0x192) }, + { ZYDIS_DEFINITION(0x1, 0x198), ZYDIS_DEFINITION(0x1, 0x194) }, + { ZYDIS_DEFINITION(0x1, 0x19B), ZYDIS_DEFINITION(0x1, 0x199) }, + { ZYDIS_DEFINITION(0x1, 0x19C), ZYDIS_DEFINITION(0x1, 0x19A) }, + { ZYDIS_DEFINITION(0x1, 0x1F9), ZYDIS_DEFINITION(0x1, 0x1F5) }, + { ZYDIS_DEFINITION(0x1, 0x1FB), ZYDIS_DEFINITION(0x1, 0x1F7) }, + { ZYDIS_DEFINITION(0x1, 0x1FA), ZYDIS_DEFINITION(0x1, 0x1F6) }, + { ZYDIS_DEFINITION(0x1, 0x1FC), ZYDIS_DEFINITION(0x1, 0x1F8) }, + { ZYDIS_DEFINITION(0x1, 0x1FF), ZYDIS_DEFINITION(0x1, 0x1FD) }, + { ZYDIS_DEFINITION(0x1, 0x200), ZYDIS_DEFINITION(0x1, 0x1FE) }, + { ZYDIS_DEFINITION(0x1, 0x25D), ZYDIS_DEFINITION(0x1, 0x259) }, + { ZYDIS_DEFINITION(0x1, 0x25F), ZYDIS_DEFINITION(0x1, 0x25B) }, + { ZYDIS_DEFINITION(0x1, 0x25E), ZYDIS_DEFINITION(0x1, 0x25A) }, + { ZYDIS_DEFINITION(0x1, 0x260), ZYDIS_DEFINITION(0x1, 0x25C) }, + { ZYDIS_DEFINITION(0x1, 0x263), ZYDIS_DEFINITION(0x1, 0x261) }, + { ZYDIS_DEFINITION(0x1, 0x264), ZYDIS_DEFINITION(0x1, 0x262) }, + { ZYDIS_DEFINITION(0x1, 0x299), ZYDIS_DEFINITION(0x1, 0x295) }, + { ZYDIS_DEFINITION(0x1, 0x29B), ZYDIS_DEFINITION(0x1, 0x297) }, + { ZYDIS_DEFINITION(0x1, 0x29A), ZYDIS_DEFINITION(0x1, 0x296) }, + { ZYDIS_DEFINITION(0x1, 0x29C), ZYDIS_DEFINITION(0x1, 0x298) }, + { ZYDIS_DEFINITION(0x1, 0x29F), ZYDIS_DEFINITION(0x1, 0x29D) }, + { ZYDIS_DEFINITION(0x1, 0x2A0), ZYDIS_DEFINITION(0x1, 0x29E) }, + { ZYDIS_DEFINITION(0x1, 0x2C9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2CB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2CA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x2CC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x94), ZYDIS_DEFINITION(0x1, 0x95) }, + { ZYDIS_DEFINITION(0x1, 0x96), ZYDIS_DEFINITION(0x1, 0x97) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x461) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x462) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x45D) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x45E) }, + { ZYDIS_DEFINITION(0xB, 0x3D9), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3DB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3DA), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3DC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x459), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x45B), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x45A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x45C), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x451), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x453), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x452), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x454), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x437), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x438), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x465), ZYDIS_DEFINITION(0xB, 0x469) }, + { ZYDIS_DEFINITION(0xB, 0x466), ZYDIS_DEFINITION(0xB, 0x46A) }, + { ZYDIS_DEFINITION(0xB, 0x2DD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x2DE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x173), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x174), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x12D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x12F), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x12E), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x130), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x492), ZYDIS_DEFINITION(0xB, 0x496) }, + { ZYDIS_DEFINITION(0xB, 0x493), ZYDIS_DEFINITION(0xB, 0x497) }, + { 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, 0x2DF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x2E0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x175), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x176), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x2D), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x439), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x43A), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x445), ZYDIS_DEFINITION(0xB, 0x446) }, + { ZYDIS_DEFINITION(0xB, 0x449), ZYDIS_DEFINITION(0xB, 0x44A) }, + { ZYDIS_DEFINITION(0xB, 0x447), ZYDIS_DEFINITION(0xB, 0x448) }, + { ZYDIS_DEFINITION(0xB, 0x44B), ZYDIS_DEFINITION(0xB, 0x44C) }, + { ZYDIS_DEFINITION(0xB, 0x43D), ZYDIS_DEFINITION(0xB, 0x43E) }, + { ZYDIS_DEFINITION(0xB, 0x441), ZYDIS_DEFINITION(0xB, 0x442) }, + { ZYDIS_DEFINITION(0xB, 0x43F), ZYDIS_DEFINITION(0xB, 0x440) }, + { ZYDIS_DEFINITION(0xB, 0x443), ZYDIS_DEFINITION(0xB, 0x444) }, + { ZYDIS_DEFINITION(0xB, 0xF5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF7), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF6), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF1), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF2), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0xF4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3DD), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3DF), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3DE), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x3E0), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0xB, 0x1D5), ZYDIS_DEFINITION(0xB, 0x1D6) }, + { ZYDIS_DEFINITION(0xB, 0x1D9), ZYDIS_DEFINITION(0xB, 0x1DA) }, + { ZYDIS_DEFINITION(0xB, 0x1D7), ZYDIS_DEFINITION(0xB, 0x1D8) }, + { ZYDIS_DEFINITION(0xB, 0x1DB), ZYDIS_DEFINITION(0xB, 0x1DC) }, + { ZYDIS_DEFINITION(0xB, 0x1CD), ZYDIS_DEFINITION(0xB, 0x1CE) }, + { ZYDIS_DEFINITION(0xB, 0x1D1), ZYDIS_DEFINITION(0xB, 0x1D2) }, + { ZYDIS_DEFINITION(0xB, 0x1CF), ZYDIS_DEFINITION(0xB, 0x1D0) }, + { ZYDIS_DEFINITION(0xB, 0x1D3), ZYDIS_DEFINITION(0xB, 0x1D4) }, + { ZYDIS_DEFINITION(0xB, 0x221), ZYDIS_DEFINITION(0xB, 0x222) }, + { ZYDIS_DEFINITION(0xB, 0x225), ZYDIS_DEFINITION(0xB, 0x226) }, + { ZYDIS_DEFINITION(0xB, 0x223), ZYDIS_DEFINITION(0xB, 0x224) }, + { ZYDIS_DEFINITION(0xB, 0x227), ZYDIS_DEFINITION(0xB, 0x228) }, + { ZYDIS_DEFINITION(0xB, 0x219), ZYDIS_DEFINITION(0xB, 0x21A) }, + { ZYDIS_DEFINITION(0xB, 0x21D), ZYDIS_DEFINITION(0xB, 0x21E) }, + { ZYDIS_DEFINITION(0xB, 0x21B), ZYDIS_DEFINITION(0xB, 0x21C) }, + { ZYDIS_DEFINITION(0xB, 0x21F), ZYDIS_DEFINITION(0xB, 0x220) }, + { ZYDIS_DEFINITION(0xB, 0x40D), ZYDIS_DEFINITION(0xB, 0x40E) }, + { ZYDIS_DEFINITION(0xB, 0x40F), ZYDIS_DEFINITION(0xB, 0x410) }, + { ZYDIS_DEFINITION(0xB, 0x409), ZYDIS_DEFINITION(0xB, 0x40A) }, + { ZYDIS_DEFINITION(0xB, 0x40B), ZYDIS_DEFINITION(0xB, 0x40C) }, + { ZYDIS_DEFINITION(0xB, 0x1A5), ZYDIS_DEFINITION(0xB, 0x1A6) }, + { ZYDIS_DEFINITION(0xB, 0x1A9), ZYDIS_DEFINITION(0xB, 0x1AA) }, + { ZYDIS_DEFINITION(0xB, 0x1A7), ZYDIS_DEFINITION(0xB, 0x1A8) }, + { ZYDIS_DEFINITION(0xB, 0x1AB), ZYDIS_DEFINITION(0xB, 0x1AC) }, + { ZYDIS_DEFINITION(0xB, 0x19D), ZYDIS_DEFINITION(0xB, 0x19E) }, + { ZYDIS_DEFINITION(0xB, 0x1A1), ZYDIS_DEFINITION(0xB, 0x1A2) }, + { ZYDIS_DEFINITION(0xB, 0x19F), ZYDIS_DEFINITION(0xB, 0x1A0) }, + { ZYDIS_DEFINITION(0xB, 0x1A3), ZYDIS_DEFINITION(0xB, 0x1A4) }, + { ZYDIS_DEFINITION(0xB, 0x1B1), ZYDIS_DEFINITION(0xB, 0x1B2) }, + { ZYDIS_DEFINITION(0xB, 0x1B3), ZYDIS_DEFINITION(0xB, 0x1B4) }, + { ZYDIS_DEFINITION(0xB, 0x1AD), ZYDIS_DEFINITION(0xB, 0x1AE) }, + { ZYDIS_DEFINITION(0xB, 0x1AF), ZYDIS_DEFINITION(0xB, 0x1B0) }, + { ZYDIS_DEFINITION(0xB, 0x231), ZYDIS_DEFINITION(0xB, 0x232) }, + { ZYDIS_DEFINITION(0xB, 0x235), ZYDIS_DEFINITION(0xB, 0x236) }, + { ZYDIS_DEFINITION(0xB, 0x233), ZYDIS_DEFINITION(0xB, 0x234) }, + { ZYDIS_DEFINITION(0xB, 0x237), ZYDIS_DEFINITION(0xB, 0x238) }, + { ZYDIS_DEFINITION(0xB, 0x229), ZYDIS_DEFINITION(0xB, 0x22A) }, + { ZYDIS_DEFINITION(0xB, 0x22D), ZYDIS_DEFINITION(0xB, 0x22E) }, + { ZYDIS_DEFINITION(0xB, 0x22B), ZYDIS_DEFINITION(0xB, 0x22C) }, + { ZYDIS_DEFINITION(0xB, 0x22F), ZYDIS_DEFINITION(0xB, 0x230) }, + { ZYDIS_DEFINITION(0xB, 0x23D), ZYDIS_DEFINITION(0xB, 0x23E) }, + { ZYDIS_DEFINITION(0xB, 0x23F), ZYDIS_DEFINITION(0xB, 0x240) }, + { ZYDIS_DEFINITION(0xB, 0x239), ZYDIS_DEFINITION(0xB, 0x23A) }, + { ZYDIS_DEFINITION(0xB, 0x23B), ZYDIS_DEFINITION(0xB, 0x23C) }, + { ZYDIS_DEFINITION(0xB, 0x26D), ZYDIS_DEFINITION(0xB, 0x26E) }, + { ZYDIS_DEFINITION(0xB, 0x271), ZYDIS_DEFINITION(0xB, 0x272) }, + { ZYDIS_DEFINITION(0xB, 0x26F), ZYDIS_DEFINITION(0xB, 0x270) }, + { ZYDIS_DEFINITION(0xB, 0x273), ZYDIS_DEFINITION(0xB, 0x274) }, + { ZYDIS_DEFINITION(0xB, 0x265), ZYDIS_DEFINITION(0xB, 0x266) }, + { ZYDIS_DEFINITION(0xB, 0x269), ZYDIS_DEFINITION(0xB, 0x26A) }, + { ZYDIS_DEFINITION(0xB, 0x267), ZYDIS_DEFINITION(0xB, 0x268) }, + { ZYDIS_DEFINITION(0xB, 0x26B), ZYDIS_DEFINITION(0xB, 0x26C) }, + { ZYDIS_DEFINITION(0xB, 0x279), ZYDIS_DEFINITION(0xB, 0x27A) }, + { ZYDIS_DEFINITION(0xB, 0x27B), ZYDIS_DEFINITION(0xB, 0x27C) }, + { ZYDIS_DEFINITION(0xB, 0x275), ZYDIS_DEFINITION(0xB, 0x276) }, + { ZYDIS_DEFINITION(0xB, 0x277), ZYDIS_DEFINITION(0xB, 0x278) }, + { ZYDIS_DEFINITION(0xB, 0x2A9), ZYDIS_DEFINITION(0xB, 0x2AA) }, + { ZYDIS_DEFINITION(0xB, 0x2AD), ZYDIS_DEFINITION(0xB, 0x2AE) }, + { ZYDIS_DEFINITION(0xB, 0x2AB), ZYDIS_DEFINITION(0xB, 0x2AC) }, + { ZYDIS_DEFINITION(0xB, 0x2AF), ZYDIS_DEFINITION(0xB, 0x2B0) }, + { ZYDIS_DEFINITION(0xB, 0x2A1), ZYDIS_DEFINITION(0xB, 0x2A2) }, + { ZYDIS_DEFINITION(0xB, 0x2A5), ZYDIS_DEFINITION(0xB, 0x2A6) }, + { ZYDIS_DEFINITION(0xB, 0x2A3), ZYDIS_DEFINITION(0xB, 0x2A4) }, + { ZYDIS_DEFINITION(0xB, 0x2A7), ZYDIS_DEFINITION(0xB, 0x2A8) }, + { ZYDIS_DEFINITION(0xB, 0x2B5), ZYDIS_DEFINITION(0xB, 0x2B6) }, + { ZYDIS_DEFINITION(0xB, 0x2B7), ZYDIS_DEFINITION(0xB, 0x2B8) }, + { ZYDIS_DEFINITION(0xB, 0x2B1), ZYDIS_DEFINITION(0xB, 0x2B2) }, + { ZYDIS_DEFINITION(0xB, 0x2B3), ZYDIS_DEFINITION(0xB, 0x2B4) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2C5) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2C7) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2C6) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2C8) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2C1) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2C3) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2C2) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0xB, 0x2C4) }, + { ZYDIS_DEFINITION(0x1, 0x13F), ZYDIS_DEFINITION(0x1, 0x140) }, + { ZYDIS_DEFINITION(0x1, 0x141), ZYDIS_DEFINITION(0x1, 0x142) }, + { ZYDIS_DEFINITION(0x1, 0x15B), ZYDIS_DEFINITION(0x1, 0x15C) }, + { ZYDIS_DEFINITION(0x1, 0x15D), ZYDIS_DEFINITION(0x1, 0x15E) }, + { ZYDIS_DEFINITION(0x1, 0x147), ZYDIS_DEFINITION(0x1, 0x148) }, + { ZYDIS_DEFINITION(0x1, 0x149), ZYDIS_DEFINITION(0x1, 0x14A) }, + { ZYDIS_DEFINITION(0x1, 0x16), ZYDIS_DEFINITION(0x1, 0x17) }, + { ZYDIS_DEFINITION(0x1, 0x86), ZYDIS_DEFINITION(0x1, 0x87) }, + { ZYDIS_DEFINITION(0x1, 0xAD), ZYDIS_DEFINITION(0x1, 0xAE) }, + { ZYDIS_DEFINITION(0x1, 0x72), ZYDIS_DEFINITION(0x1, 0x73) }, + { ZYDIS_DEFINITION(0x1, 0xAB), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA3), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA5), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x80), ZYDIS_DEFINITION(0x1, 0x81) }, + { ZYDIS_DEFINITION(0x1, 0x82), ZYDIS_DEFINITION(0x1, 0x83) }, + { ZYDIS_DEFINITION(0x1, 0x8E), ZYDIS_DEFINITION(0x1, 0x8F) }, + { ZYDIS_DEFINITION(0x1, 0x90), ZYDIS_DEFINITION(0x1, 0x91) }, + { ZYDIS_DEFINITION(0x1, 0x139), ZYDIS_DEFINITION(0x1, 0x13A) }, + { ZYDIS_DEFINITION(0x1, 0x13B), ZYDIS_DEFINITION(0x1, 0x13C) }, + { ZYDIS_DEFINITION(0x1, 0x155), ZYDIS_DEFINITION(0x1, 0x156) }, + { ZYDIS_DEFINITION(0x1, 0x157), ZYDIS_DEFINITION(0x1, 0x158) }, + { ZYDIS_DEFINITION(0x1, 0x131), ZYDIS_DEFINITION(0x1, 0x132) }, + { ZYDIS_DEFINITION(0x1, 0x133), ZYDIS_DEFINITION(0x1, 0x134) }, + { ZYDIS_DEFINITION(0x1, 0x3B), ZYDIS_DEFINITION(0x1, 0x42) }, + { ZYDIS_DEFINITION(0x1, 0x3D), ZYDIS_DEFINITION(0x1, 0x43) }, + { ZYDIS_DEFINITION(0x1, 0xA0), ZYDIS_DEFINITION(0x1, 0xA1) }, + { ZYDIS_DEFINITION(0x1, 0xAF), ZYDIS_DEFINITION(0x1, 0xB0) }, + { ZYDIS_DEFINITION(0x1, 0xAC), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA8), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0xA4), ZYDIS_INVALID }, + { ZYDIS_DEFINITION(0x1, 0x7A), ZYDIS_DEFINITION(0x1, 0x7B) }, + { ZYDIS_DEFINITION(0x1, 0x7C), ZYDIS_DEFINITION(0x1, 0x7D) }, + { ZYDIS_DEFINITION(0x1, 0x74), ZYDIS_DEFINITION(0x1, 0x75) }, + { ZYDIS_DEFINITION(0x1, 0x76), ZYDIS_DEFINITION(0x1, 0x77) }, + { ZYDIS_DEFINITION(0x1, 0x9A), ZYDIS_DEFINITION(0x1, 0x9B) }, + { ZYDIS_DEFINITION(0x1, 0x9C), ZYDIS_DEFINITION(0x1, 0x9D) }, + { ZYDIS_DEFINITION(0xB, 0x88), ZYDIS_DEFINITION(0xB, 0x89) }, + { ZYDIS_DEFINITION(0xB, 0x8A), ZYDIS_DEFINITION(0xB, 0x8B) } +}; + +const ZydisDecoderTreeNode FILTERS_REX_B[][2] = +{ + { ZYDIS_DEFINITION(0x0, 0x3AE), ZYDIS_DEFINITION(0x0, 0x75A) } +}; + +#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, 0x2AA), ZYDIS_DEFINITION(0x9, 0x2AB) }, + { ZYDIS_DEFINITION(0xA, 0x296), ZYDIS_DEFINITION(0x9, 0x297) }, + { ZYDIS_DEFINITION(0xA, 0x262), ZYDIS_DEFINITION(0x9, 0x263) }, + { ZYDIS_DEFINITION(0xA, 0x282), ZYDIS_DEFINITION(0x9, 0x283) }, + { ZYDIS_DEFINITION(0xA, 0x2BA), ZYDIS_DEFINITION(0x9, 0x2BB) }, + { ZYDIS_DEFINITION(0xA, 0x2A5), ZYDIS_DEFINITION(0x9, 0x2A6) }, + { ZYDIS_DEFINITION(0xA, 0x267), ZYDIS_DEFINITION(0x9, 0x268) }, + { ZYDIS_DEFINITION(0xA, 0x287), ZYDIS_DEFINITION(0x9, 0x288) }, + { ZYDIS_DEFINITION(0xA, 0x2B5), ZYDIS_DEFINITION(0x9, 0x2B6) }, + { ZYDIS_DEFINITION(0xA, 0x2A0), ZYDIS_DEFINITION(0x9, 0x2A1) }, + { ZYDIS_DEFINITION(0xA, 0x2AF), ZYDIS_DEFINITION(0x9, 0x2B0) }, + { ZYDIS_DEFINITION(0xA, 0x29B), ZYDIS_DEFINITION(0x9, 0x29C) }, + { ZYDIS_DEFINITION(0xA, 0x26F), ZYDIS_DEFINITION(0x9, 0x270) }, + { ZYDIS_DEFINITION(0xA, 0x28C), ZYDIS_DEFINITION(0x9, 0x28D) }, + { ZYDIS_DEFINITION(0xA, 0x274), ZYDIS_DEFINITION(0x9, 0x275) }, + { ZYDIS_DEFINITION(0xA, 0x291), ZYDIS_DEFINITION(0x9, 0x292) }, + { ZYDIS_DEFINITION(0xA, 0xA8), ZYDIS_DEFINITION(0x9, 0xA9) }, + { ZYDIS_DEFINITION(0xA, 0x277), ZYDIS_DEFINITION(0x9, 0x278) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_KNC[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x3DE), ZYDIS_DEFINITION(0x1, 0x3DF) }, + { ZYDIS_DEFINITION(0x1, 0x3E0), ZYDIS_DEFINITION(0x1, 0x3E1) }, + { 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, 0x3DB), ZYDIS_DEFINITION(0x1, 0x5F9) }, + { ZYDIS_DEFINITION(0x1, 0x3DB), ZYDIS_DEFINITION(0x1, 0x5FA) }, + { ZYDIS_DEFINITION(0x1, 0x3DC), ZYDIS_DEFINITION(0x1, 0x5F9) }, + { ZYDIS_DEFINITION(0x1, 0x3D5), ZYDIS_DEFINITION(0x1, 0x171) }, + { ZYDIS_DEFINITION(0x1, 0x3D6), ZYDIS_DEFINITION(0x1, 0x170) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_LZCNT[][2] = +{ + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2E6) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x2E7) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_TZCNT[][2] = +{ + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x718) }, + { ZYDIS_INVALID, ZYDIS_DEFINITION(0x1, 0x719) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_WBNOINVD[][2] = +{ + { ZYDIS_INVALID, ZYDIS_INVALID } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_CLDEMOTE[][2] = +{ + { ZYDIS_DEFINITION(0x1, 0x3C6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX, 0x14) } +}; + +const ZydisDecoderTreeNode FILTERS_MODE_CENTAUR[][2] = +{ + { ZYDIS_INVALID, ZYDIS_INVALID } +}; diff --git a/3rdparty/zydis/src/Generated/EnumISAExt.inc b/3rdparty/zydis/src/Generated/EnumISAExt.inc new file mode 100644 index 0000000000..b2631fae70 --- /dev/null +++ b/3rdparty/zydis/src/Generated/EnumISAExt.inc @@ -0,0 +1,92 @@ +static const char* STR_ISAEXT[] = +{ + "INVALID", + "ADOX_ADCX", + "AES", + "AMD3DNOW", + "AMD3DNOW_PREFETCH", + "AMD_INVLPGB", + "AMX_BF16", + "AMX_INT8", + "AMX_TILE", + "AVX", + "AVX2", + "AVX2GATHER", + "AVX512EVEX", + "AVX512VEX", + "AVXAES", + "AVX_VNNI", + "BASE", + "BMI1", + "BMI2", + "CET", + "CLDEMOTE", + "CLFLUSHOPT", + "CLFSH", + "CLWB", + "CLZERO", + "ENQCMD", + "F16C", + "FMA", + "FMA4", + "GFNI", + "HRESET", + "INVPCID", + "KEYLOCKER", + "KEYLOCKER_WIDE", + "KNC", + "KNCE", + "KNCV", + "LONGMODE", + "LZCNT", + "MCOMMIT", + "MMX", + "MONITOR", + "MONITORX", + "MOVBE", + "MOVDIR", + "MPX", + "PADLOCK", + "PAUSE", + "PCLMULQDQ", + "PCONFIG", + "PKU", + "PREFETCHWT1", + "PT", + "RDPID", + "RDPRU", + "RDRAND", + "RDSEED", + "RDTSCP", + "RDWRFSGS", + "RTM", + "SERIALIZE", + "SGX", + "SGX_ENCLV", + "SHA", + "SMAP", + "SMX", + "SNP", + "SSE", + "SSE2", + "SSE3", + "SSE4", + "SSE4A", + "SSSE3", + "SVM", + "TBM", + "TDX", + "TSX_LDTRK", + "UINTR", + "VAES", + "VMFUNC", + "VPCLMULQDQ", + "VTX", + "WAITPKG", + "X87", + "XOP", + "XSAVE", + "XSAVEC", + "XSAVEOPT", + "XSAVES" +}; diff --git a/3rdparty/zydis/src/Generated/EnumISASet.inc b/3rdparty/zydis/src/Generated/EnumISASet.inc new file mode 100644 index 0000000000..99acd3d4ea --- /dev/null +++ b/3rdparty/zydis/src/Generated/EnumISASet.inc @@ -0,0 +1,184 @@ +static const char* STR_ISASET[] = +{ + "INVALID", + "ADOX_ADCX", + "AES", + "AMD", + "AMD3DNOW", + "AMX_BF16", + "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_VNNI", + "BMI1", + "BMI2", + "CET", + "CLDEMOTE", + "CLFLUSHOPT", + "CLFSH", + "CLWB", + "CLZERO", + "CMOV", + "CMPXCHG16B", + "ENQCMD", + "F16C", + "FAT_NOP", + "FCMOV", + "FMA", + "FMA4", + "FXSAVE", + "FXSAVE64", + "GFNI", + "HRESET", + "I186", + "I286PROTECTED", + "I286REAL", + "I386", + "I486", + "I486REAL", + "I86", + "INVPCID", + "KEYLOCKER", + "KEYLOCKER_WIDE", + "KNCE", + "KNCJKBR", + "KNCSTREAM", + "KNCV", + "KNC_MISC", + "KNC_PF_HINT", + "LAHF", + "LONGMODE", + "LWP", + "LZCNT", + "MCOMMIT", + "MONITOR", + "MONITORX", + "MOVBE", + "MOVDIR", + "MPX", + "PADLOCK_ACE", + "PADLOCK_PHE", + "PADLOCK_PMM", + "PADLOCK_RNG", + "PAUSE", + "PCLMULQDQ", + "PCONFIG", + "PENTIUMMMX", + "PENTIUMREAL", + "PKU", + "POPCNT", + "PPRO", + "PREFETCHWT1", + "PREFETCH_NOP", + "PT", + "RDPID", + "RDPMC", + "RDPRU", + "RDRAND", + "RDSEED", + "RDTSCP", + "RDWRFSGS", + "RTM", + "SERIALIZE", + "SGX", + "SGX_ENCLV", + "SHA", + "SMAP", + "SMX", + "SSE", + "SSE2", + "SSE2MMX", + "SSE3", + "SSE3X87", + "SSE4", + "SSE42", + "SSE4A", + "SSEMXCSR", + "SSE_PREFETCH", + "SSSE3", + "SSSE3MMX", + "SVM", + "TBM", + "TDX", + "TSX_LDTRK", + "UINTR", + "VAES", + "VMFUNC", + "VPCLMULQDQ", + "VTX", + "WAITPKG", + "X87", + "XOP", + "XSAVE", + "XSAVEC", + "XSAVEOPT", + "XSAVES" +}; diff --git a/3rdparty/zydis/src/Generated/EnumInstructionCategory.inc b/3rdparty/zydis/src/Generated/EnumInstructionCategory.inc new file mode 100644 index 0000000000..39a8c718ca --- /dev/null +++ b/3rdparty/zydis/src/Generated/EnumInstructionCategory.inc @@ -0,0 +1,112 @@ +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", + "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", + "NOP", + "PADLOCK", + "PCLMULQDQ", + "PCONFIG", + "PKU", + "POP", + "PREFETCH", + "PREFETCHWT1", + "PT", + "PUSH", + "RDPID", + "RDPRU", + "RDRAND", + "RDSEED", + "RDWRFSGS", + "RET", + "ROTATE", + "SCATTER", + "SEGOP", + "SEMAPHORE", + "SERIALIZE", + "SETCC", + "SGX", + "SHA", + "SHIFT", + "SMAP", + "SSE", + "STRINGOP", + "STTNI", + "SYSCALL", + "SYSRET", + "SYSTEM", + "TBM", + "TSX_LDTRK", + "UFMA", + "UINTR", + "UNCOND_BR", + "VAES", + "VBMI2", + "VEX", + "VFMA", + "VPCLMULQDQ", + "VTX", + "WAITPKG", + "WIDENOP", + "X87_ALU", + "XOP", + "XSAVE", + "XSAVEOPT" +}; diff --git a/3rdparty/zydis/src/Generated/EnumMnemonic.inc b/3rdparty/zydis/src/Generated/EnumMnemonic.inc new file mode 100644 index 0000000000..c07ba787eb --- /dev/null +++ b/3rdparty/zydis/src/Generated/EnumMnemonic.inc @@ -0,0 +1,1758 @@ +static const ZydisShortString STR_MNEMONIC[] = +{ + ZYDIS_MAKE_SHORTSTRING("invalid"), + ZYDIS_MAKE_SHORTSTRING("aaa"), + ZYDIS_MAKE_SHORTSTRING("aad"), + ZYDIS_MAKE_SHORTSTRING("aam"), + 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("arpl"), + 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("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("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("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("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("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("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("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("vpdpbusd"), + ZYDIS_MAKE_SHORTSTRING("vpdpbusds"), + ZYDIS_MAKE_SHORTSTRING("vpdpwssd"), + ZYDIS_MAKE_SHORTSTRING("vpdpwssds"), + 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("vshuff32x4"), + ZYDIS_MAKE_SHORTSTRING("vshuff64x2"), + ZYDIS_MAKE_SHORTSTRING("vshufi32x4"), + ZYDIS_MAKE_SHORTSTRING("vshufi64x2"), + ZYDIS_MAKE_SHORTSTRING("vshufpd"), + ZYDIS_MAKE_SHORTSTRING("vshufps"), + 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("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") +}; diff --git a/3rdparty/zydis/src/Generated/EnumRegister.inc b/3rdparty/zydis/src/Generated/EnumRegister.inc new file mode 100644 index 0000000000..68ccdd3596 --- /dev/null +++ b/3rdparty/zydis/src/Generated/EnumRegister.inc @@ -0,0 +1,290 @@ +static const ZydisShortString STR_REGISTER[] = +{ + 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") +}; diff --git a/3rdparty/zydis/src/Generated/FormatterStrings.inc b/3rdparty/zydis/src/Generated/FormatterStrings.inc new file mode 100644 index 0000000000..3f8500f18e --- /dev/null +++ b/3rdparty/zydis/src/Generated/FormatterStrings.inc @@ -0,0 +1,816 @@ +#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) \ No newline at end of file diff --git a/3rdparty/zydis/src/Generated/InstructionDefinitions.inc b/3rdparty/zydis/src/Generated/InstructionDefinitions.inc new file mode 100644 index 0000000000..a1ae7a518b --- /dev/null +++ b/3rdparty/zydis/src/Generated/InstructionDefinitions.inc @@ -0,0 +1,7839 @@ +const ZydisInstructionDefinitionLEGACY ISTR_DEFINITIONS_LEGACY[] = +{ + { ZYDIS_MNEMONIC_AAA ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xC90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC93), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC96), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xC99), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC9C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xC9F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCA2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCA5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCAB), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCAE), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCB1), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCB4), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCB7), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCBA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCB1), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCB4), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCBD), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCC0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCC3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCC6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCC9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCCF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCDB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCDE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE7), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCEA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCED), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCF3), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF6), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCF9), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCFC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCFF), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD83), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD89), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCC3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCC6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCC9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD02), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD05), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD02), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD05), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCCF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCDB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCDE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE7), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCEA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0E), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCF3), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF6), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD0E), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCFC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCFF), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD17), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD26), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD29), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD2F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x18FC), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x18FE), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1900), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x18FE), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x18FC), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x18FE), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1900), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x18FE), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x18FC), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x18FE), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1900), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x18FE), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1902), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NO_REL ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1904), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NO_REL ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1906), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NO_REL ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1906), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NO_REL ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1908), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_BND ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x190A), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x190C), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x190E), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_BND ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1910), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1912), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1914), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NO_REL ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1916), 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_REG_CONSTRAINTS_BND, ZYDIS_REG_CONSTRAINTS_NO_REL ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1918), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x191A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD32), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD35), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD32), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD35), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD32), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD35), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD32), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD35), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1984), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD3B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD3E), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD41), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD44), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD47), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD44), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD47), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD44), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD47), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x191C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x191E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1920), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5A8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1CFA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1CFA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5C7), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1CFB), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x1CFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1CFA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE3D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD4D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD50), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD53), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD3B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD56), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD59), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD5C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD5F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD62), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD65), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD68), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD6B), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x595), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x599), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD68), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD6B), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD6E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD71), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD74), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD77), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD7A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0xD7D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0xD80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD83), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD86), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0xD89), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD8F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD92), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD95), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD98), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD9B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1922), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1924), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1926), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1928), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x192A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x192C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x192E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1930), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1932), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1934), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1936), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1938), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x193A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x193C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x193E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1940), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x192E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1942), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1944), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1946), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1948), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x194A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x194C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x194E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1950), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1952), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1954), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1956), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1958), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x195A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x195C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x195E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1960), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1962), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1964), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1966), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1968), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x196A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x196C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x196E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1970), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1972), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1974), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1976), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1978), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1934), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1936), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1938), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x193A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1946), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1948), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x197A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x197C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1952), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1954), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1956), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1958), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1972), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1974), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1976), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1978), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x197E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1980), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1982), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1982), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1984), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1986), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1988), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0x198A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x198C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDA1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD83), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD89), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED 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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDA4), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDA4), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDA7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDAA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDAD), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x198E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1990), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1990), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDBC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDBF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1990), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC5), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x590), 0, 0 ZYDIS_NOTMIN(0x34), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x590), 0, 0 ZYDIS_NOTMIN(0x34), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC5), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDCB), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1990), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED 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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDCE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD7), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD7), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDCE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDCE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDDA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDDD), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDE0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDCE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDE3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDE6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDE3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDE6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDE9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDE3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDE9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDE6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDCE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDCE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDD1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDEC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDEF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDF2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDF5), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1992), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1994), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1996), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1998), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1992), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1992), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1992), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1992), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1992), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1992), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED 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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x199A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x199C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x199E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19A0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19A2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x199E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19A4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDF8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDFB), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDFB), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDFE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1990), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19A6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x19A8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0xDFB), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1990), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDFE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1990), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE01), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE04), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE07), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE01), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE0A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE04), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE07), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE04), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE04), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE04), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDB6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1990), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x590), 0, 0 ZYDIS_NOTMIN(0x34), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x590), 0, 0 ZYDIS_NOTMIN(0x34), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_X87_ALU) ZYDIS_NOTMIN(ZYDIS_ISA_SET_PPRO) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_X87) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDC2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDCB), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1990), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE0D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE0D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE0D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1CFD), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x1CFD), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x1CFE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x1CFE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0xDFE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDF8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDF8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19AA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE13), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE13), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE91), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE94), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x19AC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDA1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x594), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x598), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5A4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5A8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5AC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5B0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE16), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE19), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE1C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE1F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE22), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE25), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1984), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1986), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1988), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0x198A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x198C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1CFF), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE28), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5B4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5B4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE2B), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE2B), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5B8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5B8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5B8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5B8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE2E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x198E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE31), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5C0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5C0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE34), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE35), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19AE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xE37), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xE3A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x5A8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x19B0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xE3D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_INVALID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD_INVLPGB) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xE37), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xE3A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xE37), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xE3A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x5C4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED 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(0x5C4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED 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(0x5C8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED 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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE52), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE55), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19B2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x19B4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE58), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE43), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE49), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xE4C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x19B6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE5B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE5E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19B8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19BA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE61), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE64), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE67), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE6A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19BE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19C0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE6D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19C2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x19C4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x19C6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x19C8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x19CA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x19CC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x5CC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5D0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5D4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5D8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5DC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5DC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5DC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE73), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE76), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19CE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x19D0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xE79), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE7F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE82), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD83), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD89), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD83), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD89), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE85), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xE88), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xE85), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE88), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x19D2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_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(0x19D6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_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(0x19DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x594), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x598), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19DE), 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_REG_CONSTRAINTS_SR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19E0), 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_REG_CONSTRAINTS_SR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19E2), 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_REG_CONSTRAINTS_SR_DEST, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19E4), 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_REG_CONSTRAINTS_SR_DEST, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19E6), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19E8), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19EA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19EC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19EE), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19F0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19F2), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19F4), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_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(0x19F6), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19F8), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_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(0x19FA), 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_REG_CONSTRAINTS_CR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x19FC), 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_REG_CONSTRAINTS_CR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x19FE), 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_REG_CONSTRAINTS_DR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x1A00), 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_REG_CONSTRAINTS_DR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x1A02), 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_REG_CONSTRAINTS_CR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x1A04), 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_REG_CONSTRAINTS_CR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x1A06), 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_REG_CONSTRAINTS_DR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x1A08), 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_REG_CONSTRAINTS_DR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xFA5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A0A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A0E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x598), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x19D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A12), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A12), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A16), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A16), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A1E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A1E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A22), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE8B), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE8E), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A26), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A2A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A2E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A2E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A32), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A36), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A32), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A36), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A3A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A3C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A3E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A2E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFDB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A40), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A42), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A46), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A48), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A4E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A50), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A52), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A46), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A22), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A54), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A56), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A46), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A58), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x1A5A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A5C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A5E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A60), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x1A62), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A66), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x1A6A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A6E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A72), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A74), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A0A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A0E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A6A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A6E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE91), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE94), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5A4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5A8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5AC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5B0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD83), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD89), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A76), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x1A76), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1986), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1988), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0x198A), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x198C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD3B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A78), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A78), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD3B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD3B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD3B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD3B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC93), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC96), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xC99), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCCF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCDB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCDE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE97), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCEA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF9), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCF3), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF6), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCF9), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCFC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCFF), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE9A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE9D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEA0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEA3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEA6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEA9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEAC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5E0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5E0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xEAF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xEAF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5E4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5E4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5E4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5E4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0xEB2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5E8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5E8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x1A4E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A4E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A4E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A82), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A84), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A82), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A84), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A86), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A88), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A82), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A84), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A8A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE91), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE94), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A8E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEC1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEC4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A8A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A90), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A92), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A94), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A82), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A84), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A8A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A90), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A92), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A94), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A82), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A84), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xDA7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEC7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xDA7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xECA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xECD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xED0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xED3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xED6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xED9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEDC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEDF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEE2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEDF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEE5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEE8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEEB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEEE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEF1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEF7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A8A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A90), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A92), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A94), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A82), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A84), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A96), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A98), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A9A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A9C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A9E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AA0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AA2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AA4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AA6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AAA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AAC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AB0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AB2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AB4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AB6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ABA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ABC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ABE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AC0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AC2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AC4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AC6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AC8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ACA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ACC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A8E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A82), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A84), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A7E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ACE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEFA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEFD), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF03), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF06), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF09), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF0C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF0F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE79), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF12), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF15), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF18), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5A8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF1B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF1E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF21), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF21), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF27), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF2A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AD2), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AD4), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AD6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ADA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ADC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ADE), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AE0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AE2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AE6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AE8), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AEA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AEE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AF2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AF4), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_INVALID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SNP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x1AF6), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AF8), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AFA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AFC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AFE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B02), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B04), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B06), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B0A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AD2), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AD4), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AD6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ADA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ADC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1ADE), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AE0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AE2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AE8), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AEA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1AEE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF2D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D01), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x65D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B0E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B0E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B0E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B12), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B16), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF33), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF36), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF39), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF3C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF3F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF42), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF45), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF48), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF4B), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF4E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF51), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF54), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF57), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF5A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5EC), 0, 0 ZYDIS_NOTMIN(0x2B), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_INVALID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SNP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF5D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF60), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF63), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF66), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF69), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF6C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF6F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF72), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF75), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF78), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF7B), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF7E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A62), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B1E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF5D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF60), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF63), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF66), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF69), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF6C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF6F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF72), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF75), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF78), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF7B), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF7E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D02), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D02), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF81), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x16FB), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x16F5), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5F0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF81), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF84), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B20), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B20), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x16F5), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x16FB), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF81), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF87), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5F4), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5F5), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x5F8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5F9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5FC), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_INVALID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SNP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xF8A), 0, 0 ZYDIS_NOTMIN(0x1A), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_INVALID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_SNP) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xD0E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD44), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD47), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF8D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF93), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF96), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF99), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD44), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD47), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF8D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF93), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF96), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF99), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFB1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFB4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFB7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B22), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A62), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B1E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1CFB), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B24), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B26), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD44), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD47), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF8D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF93), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF96), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF99), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC93), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC96), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xC99), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xC9C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xC9F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCA2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCA5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCAB), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCAE), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCB1), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCB4), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCB7), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCBA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCB1), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCB4), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCBD), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCC0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xFBA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0x600), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0x600), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0xFBD), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0x604), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0x604), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0xFC0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0x608), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0x608), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0xFC3), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0x60C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0x60C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_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(0x1B28), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x1B28), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x638), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x1B2A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B2E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B30), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFC6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFC9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD44), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD44), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD47), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD47), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF8D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF8D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF93), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF93), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF96), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF96), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF99), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF99), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x610), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x614), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x618), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x61C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD44), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD47), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF8D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF93), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF96), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF99), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xF9F), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA2), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x610), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x614), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x618), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x61C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B32), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B34), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xEA1), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B36), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B38), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B3A), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B3C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A5A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B3E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A62), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B1E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x5C7), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B40), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x620), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x624), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x628), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x62C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x1B42), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B44), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1CFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCCF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCDB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCDE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE7), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCEA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF9), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCF3), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF6), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCF9), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCFC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCFF), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD83), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD89), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0) ZYDIS_NOTMIN(0x0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFCC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFCF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x630), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x634), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x1D03), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x1D04), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xD50), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD53), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD3B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD62), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD65), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD68), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD68), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD6B), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD6B), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x595), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x595), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x599), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x599), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B46), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_SYSTEM) ZYDIS_NOTMIN(ZYDIS_ISA_SET_INVALID) ZYDIS_NOTMIN(ZYDIS_ISA_EXT_AMD_INVLPGB) ZYDIS_NOTMIN(ZYDIS_BRANCH_TYPE_NONE) ZYDIS_NOTMIN(ZYDIS_EXCEPTION_CLASS_NONE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x638), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD32), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD35), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD92), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD95), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD98), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD9B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFE7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFE7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B22), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D05), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x638), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B48), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B4E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B48), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B4A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B50), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B4E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B52), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE5F), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B52), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE5F), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x6FE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xE3D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x6FE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x1B54), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xFD2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xFD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xFD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xFDB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0xE3D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE3D), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFDE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xFE1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xFE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0xFE7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x6FE), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x1D01), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1D01), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFEA), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(0x63C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A26), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1A26), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x1A28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_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(0x1B56), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFED), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xFF3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFF6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xFF9), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFED), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xFF3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xFF6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0x1B58), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B58), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x640), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x1B5A), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCCF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCD5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCDB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCDE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xE97), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCEA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD0E), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCF3), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCF6), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD0E), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD11), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xCFC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xCFF), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_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(0xD1A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD1D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0xD23), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(0x644), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x644), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x644), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x644), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x648), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x648), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x64C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x64C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x648), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x648), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x64C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x64C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE 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(0x650), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(0x654), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYAN_FALSE ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) ZYDIS_NOTMIN(ZYAN_FALSE) 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0xEB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE 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(0x658), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_BEXTR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x65C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_BLCFILL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLCFILL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLCI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLCI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLCIC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLCIC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLCMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLCMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLCS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLCS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLSFILL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLSFILL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLSIC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_BLSIC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_LLWPCB ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D06), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_LWPINS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x660), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_LWPINS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x664), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_LWPVAL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x660), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_LWPVAL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x664), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_SLWPCB ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D06), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_T1MSKC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_T1MSKC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_TZMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_TZMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VFRCZPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFA5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1191), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1194), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A5C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VFRCZSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x668), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x66C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x670), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x674), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x678), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x67C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCMOV ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x680), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCMOV 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMUB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMUB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMUD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMUD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMUQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMUQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPCOMW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPHADDBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B60), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B62), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B66), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1026), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1029), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B6A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B6E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B72), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B74), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B76), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B7A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B7E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B80), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDUWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B82), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B84), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B86), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B88), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHADDWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B8A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHSUBBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHSUBBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B8E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHSUBDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHSUBDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B6A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHSUBWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B84), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPHSUBWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B86), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPMACSDD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSDD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSDQH 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSDQH 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSDQL 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSDQL 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSDD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSDD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSDQH 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSDQH 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSDQL 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSDQL 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSWW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSSWW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSWW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMACSWW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMADCSSWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMADCSSWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMADCSWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPMADCSWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPPERM 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPPERM 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPPERM 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPPERM 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1002), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1005), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1008), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x100B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF1B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF1E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x100E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1011), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1014), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1017), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x101A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x101D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF21), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1020), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1023), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPROTW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1026), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAB ZYDIS_NOTMIN(3) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1029), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAB ZYDIS_NOTMIN(3) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x102C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAD ZYDIS_NOTMIN(3) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x102F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAD ZYDIS_NOTMIN(3) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1032), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAQ ZYDIS_NOTMIN(3) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1035), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAQ ZYDIS_NOTMIN(3) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1038), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHAW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1008), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLB ZYDIS_NOTMIN(3) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x100B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x100E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1011), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x101A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x101D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1020), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1023), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE }, + { ZYDIS_MNEMONIC_VPSHLW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE } +}; + +const ZydisInstructionDefinitionVEX ISTR_DEFINITIONS_VEX[] = +{ + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_ANDN ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BEXTR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x700), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BEXTR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x704), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSMSK ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFC), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BLSR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFFF), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x708), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x70C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x710), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x714), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x708), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_BZHI ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x710), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_CLEVICT0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_CLEVICT1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_DELAY ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x661), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_DELAY ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x6F6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_JKNZD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_JKNZD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B92), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_JKZD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B90), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_JKZD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B92), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KADDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KAND ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDN ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDNQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDNR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDNW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KANDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KCONCATH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1041), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KCONCATL ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1041), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KEXTRACT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1044), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMERGE2L1H ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMERGE2L1L ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B96), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOV ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B98), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B9A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B9C), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B9E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA4), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA6), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA8), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BAA), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BAC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BAE), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BB0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BB2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BB4), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BB6), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BB8), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KMOVW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BA2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOT ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KNOTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1047), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTESTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTESTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTESTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORTESTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KORW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTLB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KSHIFTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104D), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KTESTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KTESTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KTESTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KTESTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x104A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KUNPCKBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KUNPCKDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KUNPCKWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNORB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNORD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNORQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXNORW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXOR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B94), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXORB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXORD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXORQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_KXORW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x103E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_LDTILECFG ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x502), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_LZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1050), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_LZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1053), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x71C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x720), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_MULX ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x720), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PDEP ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_PEXT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_POPCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1050), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_POPCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1053), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1056), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1059), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x105C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x105F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1056), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_RORX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x105C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x708), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x708), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SARX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x708), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x708), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHLX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x708), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x708), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SHRX 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SPFLT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x661), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_SPFLT ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x6F6), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_STTILECFG ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D07), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBF16PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1062), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1065), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBSUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1065), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1065), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TDPBUUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1068), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILELOADD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BBA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILELOADDT1 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BBA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILERELEASE 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILESTORED ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BBC), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TILEZERO ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1BBA), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1050), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TZCNT ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1053), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TZCNTI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x106B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_TZCNTI ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x106E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDEC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESDECLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENC ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESENCLAST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x828), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESIMC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESIMC ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESKEYGENASSIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VAESKEYGENASSIST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1071), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1074), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDNPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1071), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1074), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VANDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x728), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x730), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x734), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x738), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x73C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x740), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBLENDVPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VBROADCASTF128 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTI128 ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VBROADCASTSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BC8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VCMPPD 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_AVX2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD 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_AVX2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD 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_AVX2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPD 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_AVX2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS 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_AVX2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS 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_AVX2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS 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_AVX2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSD 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSD 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSS 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCMPSS 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD92), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD95), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD98), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD9B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x192C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BCA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x192E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1930), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BCE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1932), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTDQ2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1934), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1936), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x193C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x193E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPD2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BDA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BDC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BDE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPH2PS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1946), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1948), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x194A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x194C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1080), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1083), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTPS2PH ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1086), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1952), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1954), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1956), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1958), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1952), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1956), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1089), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSD2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x108C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x108F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1092), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1095), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1098), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x108F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1095), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x109B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x109E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10A1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x109B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSI2SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10A1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10A7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10AA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1972), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1974), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1976), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1978), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1972), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1976), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1934), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1936), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPD2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1946), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1948), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTPS2DQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1952), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1954), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1956), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1958), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1952), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSD2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1956), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1972), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1974), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1976), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1978), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1972), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VCVTTSS2SI ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1976), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDIVSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x728), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x730), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x738), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x73C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x740), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VDPPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF128 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10AD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTF128 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10B0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI128 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10B3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTI128 ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10B6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10B9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VEXTRACTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADD231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x798), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x79C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7AC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMADDSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUB231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x798), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x79C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7AC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFMSUBSS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADD231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x798), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x79C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7AC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMADDSS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB132SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB213SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231PS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUB231SS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x798), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x79C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7AC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VFNMSUBSS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10E3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10EF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10F2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGATHERQPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10F5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7B8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8AFFINEQB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VGF2P8MULB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHADDPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VHSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTF128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7C8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VINSERTF128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7CC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_2_TO_4) }, + { ZYDIS_MNEMONIC_VINSERTI128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTI128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x738), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VINSERTPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLDDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD0B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLDDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VLDMXCSR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x19BA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVDQU ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10FB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x10FE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1101), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1104), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1107), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x110A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x110D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMASKMOVPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1110), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMAXSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMINSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFA5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1191), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1194), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A0A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A0E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVAPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B5C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1191), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A5C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1194), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A2E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A2E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVDQU ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHLPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1113), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1116), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVHPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLHPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1119), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x78C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A60), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x111C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVLPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A3A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVMSKPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVMSKPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C02), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVMSKPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVMSKPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C06), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A2E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BFC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xD0B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTDQA ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVNTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A46), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A22), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A56), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A46), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x788), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A5C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x111F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A60), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSHDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSLDUP ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x790), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1122), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVSS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFA5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1191), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1194), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A0A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BEE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A0E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMOVUPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1BF2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMPSADBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMPSADBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMPSADBW 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMPSADBW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VMULSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1071), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1074), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C0E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C10), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C12), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C14), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C16), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C18), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C1E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPABSW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C22), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1125), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1128), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x112B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x112E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1131), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1134), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1137), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKSSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x113A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x113D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1140), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1143), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1146), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1149), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x114C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x114F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPACKUSWB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x688), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x68C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x698), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x115B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x69C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x115E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x688), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x68C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDUSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR ZYDIS_NOTMIN(4) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPALIGNR 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1167), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1170), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1167), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPANDN ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1170), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPAVGW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6A8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDVB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7FC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDVB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x800), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDVB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x804), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDVB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDW ZYDIS_NOTMIN(4) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBLENDW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C26), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_32) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C2E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C32), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_2) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C36), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_2) }, + { ZYDIS_MNEMONIC_VPBROADCASTQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C3A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_4) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C3C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C3E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C40), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_8) }, + { ZYDIS_MNEMONIC_VPBROADCASTW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C42), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_1_TO_16) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x814), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x818), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x81C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCLMULQDQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x820), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1071), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1074), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPEQW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRI ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRI ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRI ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRI ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPESTRM ZYDIS_NOTMIN(7) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x688), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x68C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1173), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x115B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1176), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x115E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPGTW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPISTRI ZYDIS_NOTMIN(5) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPISTRI ZYDIS_NOTMIN(5) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPISTRM ZYDIS_NOTMIN(5) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPCMPISTRM ZYDIS_NOTMIN(5) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1182), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPBUSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1182), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1182), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1179), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x117F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPDPWSSDS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1182), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERM2F128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERM2F128 ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x734), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERM2I128 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_AVX6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERM2I128 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_AVX6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMIL2PS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1185), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1188), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1191), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS 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_AVX6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS 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_AVX6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x119D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFAB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFAE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMILPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPD 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A9), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPERMQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11AF), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11B8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11BE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11C1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11C4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPEXTRW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11C7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11D6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11D9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPGATHERQQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_TRUE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHADDW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHMINPOSUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF21), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHMINPOSUW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xF24), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPHSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRB ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x82C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRB 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_AVX5), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x834), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD 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_AVX5), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x834), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRD 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_AVX5), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x83C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRQ ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x840), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRW ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x844), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPINSRW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11E2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11EB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMADDWD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11EE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6AC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11F1), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1074), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11F7), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMASKMOVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11FA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x688), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x68C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMAXUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x688), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x68C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMINUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVMSKB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C44), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVMSKB ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C46), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A9A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C48), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A9C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1A9E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AA0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C4E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AA2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C50), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AA4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C52), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AA6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C54), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C56), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AAA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C58), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AAC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C5A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AAE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C5C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AB0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVSXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C5E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AB2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C60), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AB4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C62), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AB6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C64), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AB8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C66), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ABA), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ABC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXBW ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1ABE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AC0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXDQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C6E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AC2), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C70), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AC4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C72), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AC6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1AC8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMOVZXWQ ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1C76), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11FD), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1200), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHRSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHUW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1203), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1206), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1209), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPMULUDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x120C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1167), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1170), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCH0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCH1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCH2 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHE0 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHE1 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHE2 ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHENTA ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPREFETCHNTA ZYDIS_NOTMIN(1) ZYDIS_NOTMIN(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7E0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSADBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7E8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD0B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1212), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD0B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFHW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1218), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD08), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xD0B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSHUFLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1218), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x688), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x68C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGND ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSIGNW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x121B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x121E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1221), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1224), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1227), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x122A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x122D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLDQ 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_AVX7), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1233), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ 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_AVX7), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ 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_AVX7), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ 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_AVX7), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1245), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1248), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW 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_AVX7), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSLLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x124E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1251), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1254), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1257), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x125A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x125D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1260), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1263), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1266), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1269), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x126C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x126F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRAW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1272), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x121B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x121E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1221), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1224), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1227), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x122A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x122D), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLDQ 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_AVX7), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1233), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ 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_AVX7), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ 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_AVX7), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ 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_AVX7), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLVQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x123F), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1242), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1245), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1248), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW 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_AVX7), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSRLW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x124E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x688), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x68C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x698), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x115B), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x69C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x115E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x688), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x68C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBSW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSB ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBUSW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1161), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPSUBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1164), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF2D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1275), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xF30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPTEST ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1278), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHBW ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1071), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1074), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKHWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6A0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLBW ZYDIS_NOTMIN(3) 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_AVX4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x7F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1071), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLQDQ ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1074), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPUNPCKLWD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1167), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x116D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VPXOR ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1170), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPSS ZYDIS_NOTMIN(3) 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_AVX5), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRCPSS ZYDIS_NOTMIN(3) 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_AVX5), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1191), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFAB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0xFAE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDSD 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDSD 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDSS 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VROUNDSS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x7D8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTSS ZYDIS_NOTMIN(3) 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_AVX5), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VRSQRTSS ZYDIS_NOTMIN(3) 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_AVX5), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x728), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x72C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x730), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPD ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x734), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x738), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x73C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS ZYDIS_NOTMIN(4) ZYDIS_NOTMIN(0x740), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSHUFPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFA5), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1191), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFA8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPD ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1194), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAB), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A3), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0xFAE), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTPS ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x11A6), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSQRTSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSTMXCSR ZYDIS_NOTMIN(2) ZYDIS_NOTMIN(0x1B40), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSD ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VSUBSS ZYDIS_NOTMIN(3) 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_AVX3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x127B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x127E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1281), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1284), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1287), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x128A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x128D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VTESTPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1290), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1293), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1296), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1299), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUCOMISS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x129C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKHPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VUNPCKLPS 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1071), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x6B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPD ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1074), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x690), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x1077), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x694), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VXORPS ZYDIS_NOTMIN(3) ZYDIS_NOTMIN(0x107A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VZEROALL 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_VEX_STATIC_BROADCAST_NONE) }, + { ZYDIS_MNEMONIC_VZEROUPPER 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_UNUSED ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_WRITE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x858), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x85C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x858), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x85C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x864), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x868), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x86C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x870), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1167), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x129F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x116D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x828), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x12A2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1167), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x129F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x116D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x828), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x12A2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1167), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x129F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x116D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x828), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x12A2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1167), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x129F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x116D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x828), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x12A2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(0x12A5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12AB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12AE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12B1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12B7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12BA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12BD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12C3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12C6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12C9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12CC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12CF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12D2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12D5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12DB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12DE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12E1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12E7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12EA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12ED), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12A5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12F3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12F6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x127B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x127B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1296), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12F9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x12F9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x12FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1287), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1287), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x129C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12FF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1302), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1305), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1308), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x130B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x130E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1311), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1314), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1317), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x131A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x131D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1320), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1323), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1326), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1329), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1323), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x132C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x132F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1332), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1335), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1338), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x133B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1335), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x133E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x133E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1341), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1344), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1347), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x134A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1344), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x134D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1350), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1353), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x874), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x878), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x87C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x880), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x884), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x888), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1356), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1359), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x135C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x135F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x135F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1362), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1365), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1368), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x136B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1365), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x136E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x136E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x1371), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x1374), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1377), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x137A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1374), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x137D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x137D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x137D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x1380), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1383), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1386), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1380), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1389), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x1389), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x138C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x138F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1392), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1395), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x138F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1398), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x139B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x139E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13A1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13A7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13A1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13AA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13AA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13AD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13B3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13B6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13B9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13E3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13E6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13E9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13E6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13EF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13F2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13F5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13E6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13E9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13E6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13FB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13FE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1401), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1404), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1407), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1401), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x140A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x140D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1410), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1413), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1416), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1419), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1413), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x141C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x141F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1422), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1425), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1428), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x142B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1425), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x142E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1431), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1434), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1437), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x143A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x143D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1437), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1440), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1443), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1446), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1449), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x144C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x144F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1449), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1452), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1455), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1458), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x145B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x145E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1461), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x145B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1464), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1467), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x146A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x146D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1470), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1473), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x146D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1476), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1479), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x147C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x88C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x890), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x894), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x88C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x898), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x89C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x8A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x147F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1482), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1485), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x147F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1488), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1488), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x148B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x148E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1491), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1494), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x148E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1497), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x149A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x149D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14A3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14A6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x14AF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x14B2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14B5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14B8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14B2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14BB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14BE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14C1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x138F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1392), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1395), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x138F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1398), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x139B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x139E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14C4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14C7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14CA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14C4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14CD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14CD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14CD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14D9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x8A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1C00), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C00), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1956), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C78), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C78), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1958), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C00), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C00), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1956), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x8AC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8AC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1C7A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7C), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C7E), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7E), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C80), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C7A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7C), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x8B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8B8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1C82), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C82), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C84), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C84), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C86), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C88), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C82), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C82), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C86), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x8BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1C8A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8C), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8C), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8E), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C90), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C8A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8E), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x108F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1095), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1092), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1092), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1098), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x108F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1095), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x14DF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x14DF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x14E2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x14E2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x14E5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x14E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x14DF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x14DF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x14E5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x109B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x109B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x10A1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x109E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x109E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x10A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x109B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x109B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x10A1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x8C4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8C4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x8D0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1C04), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C04), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1976), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C92), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C92), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1978), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C04), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C04), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1976), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C94), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C94), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C96), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C98), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C98), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C9A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C94), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C94), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C96), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1365), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1368), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x136B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1365), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x136E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x136E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x1371), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x138F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1392), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1395), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x138F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1398), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x139B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x139E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13A1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13A7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13A1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13AA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13AA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13AD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13B3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13B6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13B9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x13C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x13CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x13D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1401), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1404), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1407), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1401), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x140A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x140D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1410), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1413), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1416), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1419), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1413), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x141C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x141F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1422), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1425), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1428), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x142B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1425), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x142E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1431), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1434), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1437), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x143A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x143D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1437), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1440), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1443), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1446), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1449), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x144C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x144F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1449), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1452), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1455), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1458), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x145B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x145E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1461), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x145B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1464), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1467), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x146A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x148E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1491), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1494), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x148E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1497), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x149A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x149D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14A3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14A6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x14AF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x14B2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14B5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14B8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14B2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14BB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14BE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14C1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C00), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C00), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1956), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C78), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C78), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1958), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C00), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C00), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1956), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C7A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7C), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C7E), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7E), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C80), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C7A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C7C), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C82), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C82), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C84), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C84), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C86), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C88), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C82), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C82), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C86), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C8A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8C), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8C), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8E), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C90), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C8A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C8E), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C04), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C04), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1976), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C92), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C92), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1978), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C04), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C04), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1976), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C94), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C94), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C96), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C98), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C98), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C9A), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C94), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C94), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1C96), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14EB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14EE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14F1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14EB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14F7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14FA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14FD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1500), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1503), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14FD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1506), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1509), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x150C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x150F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1512), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x150C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1515), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1518), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x151B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x151E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1521), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1524), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x151E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1527), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x152A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x152D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14C4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x14C7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14CA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14C4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x14CD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14CD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14CD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14D9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x14DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x1530), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1533), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1536), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1536), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1539), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1530), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1533), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x153C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x153C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x153F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x153F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1542), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1545), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x153C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x153C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1542), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1548), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1548), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x154B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x154E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x154E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1551), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1548), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1548), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x154B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x864), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x868), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x86C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x870), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x8D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x8D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x8DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x8E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x8E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x8E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1578), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x157B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x157E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1581), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1584), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1587), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x8EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x8F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x8F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x8F8), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x8FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x900), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x904), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x908), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x90C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x910), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x918), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x91C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x920), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x924), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x928), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x930), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x934), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x938), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x93C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x940), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x948), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x158A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x10BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x94C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x950), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x954), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x94C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x958), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x95C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x960), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x950), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x950), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x964), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x968), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x96C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x970), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x968), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x97C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x96C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x96C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x980), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x94C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x950), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x954), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x94C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x958), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x95C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x960), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x950), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x950), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x964), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x968), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x96C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x970), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x968), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x97C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x96C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x96C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(0x980), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_TRUE 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x988), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x98C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x998), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_E3), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x99C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9A0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9A4), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9A8), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9AC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9AC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9AC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9B0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9B4), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9B8), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9BC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9BC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E4), ZYDIS_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9C0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9C4), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9C8), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9CC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9CC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0x9A0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x9D0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9B0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9C0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x9D8), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x158D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1590), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1593), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1596), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1599), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x159C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1C9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1C9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1CA0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1C9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1C9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1C9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1CA0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1C9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x158D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x159F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x15A2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1596), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x15A5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x15A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x738), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x7D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x864), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x868), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x86C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x870), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x864), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x868), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x86C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x870), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1578), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x157B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x157E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12FF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1302), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1305), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1308), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x130B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x130E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1581), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1584), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1587), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1311), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1314), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1317), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x131A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x131D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1320), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CA2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1C30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CA2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1C30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16F5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x16F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16F5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x16F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15AB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x157B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x157E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15AE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15B1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15B7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15BA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15BD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15C3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15C6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15C9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15CC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15CF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15D2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15D5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15DB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15DE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15E1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBE8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15E7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15EA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15ED), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15F3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15F6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15AE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15B1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15B7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15BA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15BD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15C3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15C6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15C9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15CC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15CF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15D2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15D5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15DB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15DE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15E1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15F9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15FF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1602), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1605), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1608), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x160B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x160E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1611), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1614), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1617), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x161A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1113), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1BFE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1116), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1A38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1119), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x78C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1A60), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x111C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1A3A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CA4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CA6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CA8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xF1E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1212), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CAA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1A0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1BEE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CAC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1A10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1BF2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CAE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CB0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1C38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16FB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x16FE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1014), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1C38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CB2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x16FE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x15AB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x161D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1620), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1623), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1581), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1584), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1587), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1581), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1584), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1587), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x12F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(0x1626), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1578), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x157B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x157E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12FF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1302), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1305), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1308), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x130B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x130E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1581), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1584), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1587), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1311), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1314), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1317), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x131A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x131D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1320), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CB4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CB6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CB8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CBA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x864), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x868), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x86C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x870), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1629), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x162C), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x162F), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1632), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1635), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1638), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x163B), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x163E), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1641), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1644), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1647), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x164A), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0xA30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xA30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x164D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1650), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1653), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1656), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1659), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x165C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x165F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1662), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1665), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1668), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x166B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x166E), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x1671), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1674), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1677), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x167A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x167D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x1680), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x1683), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1686), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1689), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x168C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x168F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1692), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA3C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA40), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA48), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA50), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA54), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x15F9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x1695), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x1698), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x169B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x169E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16A1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16A4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16A7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16AA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0xBCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12C3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x12C6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16AD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16B0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16B3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16B6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16B9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16B6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16B9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16BC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x1CBC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CBE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CC0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CC2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CC4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CC6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x15C9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16BF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16C2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16C5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16C8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16CB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16CE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16D1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16D4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0xBE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16D7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16DA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16DD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16E3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16E6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16E9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x16EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) 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(0x814), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x818), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0xAC4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x81C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x820), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xAC8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x160B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x160E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1611), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1614), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1617), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x161A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15B7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15BA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15BD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15C3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15C6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15D5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15DB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15DE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15E1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15E7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15EA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15ED), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15F3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15F6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xBDC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xBE0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x15C9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x16EF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xACC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xADC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xAE0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xACC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xADC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xAE0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xAE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAE8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xAF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xAF8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xAE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAE8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xAF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xAF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xAF8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xAFC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB30), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB38), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xAFC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x15F9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15FF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1602), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1605), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1608), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15AE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15B1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15C9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15CC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15CF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x15D2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBE8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16F2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x11B2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16F5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x16F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16F5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x16F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x16FB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x16FE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1701), 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_REG_CONSTRAINTS_GPR, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1704), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1707), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x170A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x170D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1710), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1713), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1716), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1719), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x170A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x171C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x171F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1713), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1722), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x1725), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_TRUE, 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(0x82C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x830), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x834), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x838), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x834), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x838), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x83C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x840), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x844), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xBCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xBDC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xBE0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x15C9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x16EF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB3C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB40), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB48), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB50), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB54), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB58), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB5C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB60), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB54), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB58), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB5C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB60), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB68), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1CC8), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CCA), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CCC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CCE), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CD0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CD2), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1728), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x172B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x172E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1731), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1734), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1737), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x173A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x173D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1740), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1743), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1746), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1749), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CD6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CDA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CDC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CDE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CE0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CE2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CE6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CE8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CEA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CEC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CEE), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CF0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x174C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x174F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1752), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1755), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1758), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x175B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x175E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1761), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1764), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E6NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E6NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1782), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1785), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1788), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x178B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x178E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1791), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1794), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1797), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x179A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x179D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17A0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17A3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17A6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17A9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17AC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17AF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17B2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17B5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17B8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17BB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17BE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17C1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17C4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17C7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17CA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17CD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17D0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17D3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17D6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17D9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17DF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17E2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17E5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17EB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17EE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17F1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17F7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17FA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17FD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1800), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1803), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1806), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1809), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x180C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x180F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1812), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1815), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1818), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x181B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x181E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1821), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1827), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x182A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x182D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1830), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1833), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1836), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1839), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x183C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x183F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1842), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1845), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1848), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x184B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x184E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1851), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1854), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1857), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1728), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x172B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x172E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1731), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1734), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1737), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x173A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x173D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1740), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1743), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1746), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1749), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x174C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x174F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1752), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1755), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1758), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x175B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x175E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1761), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1764), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E6NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E6NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_E6), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x185A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x185D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1863), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1866), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1869), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CF2), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CF4), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1CF6), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x185A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x185D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1863), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1866), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1869), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17EE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17F1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x17F7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17FA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x17FD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1800), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1803), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1806), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1809), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x180C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x180F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1812), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1815), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1818), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x181B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x181E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1821), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1824), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1827), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x182A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x182D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1830), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1833), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1836), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1839), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x183C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x183F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1842), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1845), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1848), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x184B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x184E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1851), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1854), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1857), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xB6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB74), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB80), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x15F9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x15FF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x1602), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1605), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1608), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBCC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xBDC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xBE0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x15C9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x16EF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB84), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB90), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB94), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB98), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB9C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB84), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB90), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB94), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB98), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB9C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x7DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x7E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x186C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x7E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x7E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x186F), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1872), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1875), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1878), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x187B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x187E), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1881), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1872), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1884), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1887), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x187B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x188A), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x188D), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xB14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xBB4), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0xBB8), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0xBBC), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(0xBC0), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xBC4), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xBC8), 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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4NF), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBD8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xBDC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xBE0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xBE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBE8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBE4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBE8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBEC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBF0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xBF8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xB84), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB90), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB94), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB98), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1890), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1893), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1896), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1899), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x189C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x189F), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB9C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC04), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC08), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC0C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC10), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC14), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC18), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB84), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB90), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB94), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB98), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB9C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC04), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC08), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC0C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC10), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC14), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC18), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB84), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xB90), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB94), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xB98), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1890), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1893), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1896), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(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(0x1899), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x189C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x189F), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xB9C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA0), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xBA4), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC04), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC08), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC0C), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC10), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC14), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC18), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xC20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC24), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC28), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_E4), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_E2), ZYDIS_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9DC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA0C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x9F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x864), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x868), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x86C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x870), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x18A2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18A5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18A8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18AB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18AE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18B1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CA0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C9C), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CA0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1C9E), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18A2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18B4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18B7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18AB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18BA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18BD), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9E0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9DC), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9E8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9EC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F0), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x9F8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x9F4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA00), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA04), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA08), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xA10), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA14), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA0C), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0xA18), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA1C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(0xA20), 0, 0 ZYDIS_NOTMIN(0x0), ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_CATEGORY_AVX512) 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x864), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x860), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(0x868), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x86C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x870), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x127B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x127B), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1296), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x12F9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x12F9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x12FC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1287), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x1287), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYAN_FALSE, ZYAN_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(0x129C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_64) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_INVALID) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_INVALID) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_NOTMIN(ZYDIS_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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, ZYAN_FALSE, ZYAN_FALSE ZYDIS_NOTMIN(ZYDIS_IVECTOR_LENGTH_DEFAULT) ZYDIS_NOTMIN(ZYDIS_TUPLETYPE_FV) ZYDIS_NOTMIN(ZYDIS_IELEMENT_SIZE_32) ZYDIS_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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC3C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC40), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC40), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC48), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC48), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC50), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC50), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC54), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC58), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC58), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC5C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC5C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC54), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC60), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC60), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x18C9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18CC), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CF8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CF8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CF8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1CF8), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18CF), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18D2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18D5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18D8), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18DB), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18DE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18E1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18DE), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18E1), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x18D5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18D2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18E7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18D5), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18E4), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18D2), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18E7), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC74), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_MASK, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC74), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC38), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC3C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC4C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18C0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18EA), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18ED), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x1D00), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC74), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC74), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0x18F0), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18F3), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC80), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC80), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC84), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC88), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC88), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC80), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC80), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC84), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC88), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC88), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC80), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC80), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC84), 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_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC88), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC88), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC8C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC74), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC70), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_MASK, 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(0xC74), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_MASK, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_MASK, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC64), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC68), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC6C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC44), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC78), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC7C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0x18F6), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18F9), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18F0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18F0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18F0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0x18F0), 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), ZYDIS_REG_CONSTRAINTS_UNUSED, ZYDIS_REG_CONSTRAINTS_VSIB ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_UNUSED, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC2C), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC30), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_FALSE), ZYDIS_REG_CONSTRAINTS_NONE, 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(0xC34), 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_REG_CONSTRAINTS_NONE, ZYDIS_REG_CONSTRAINTS_NONE ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYDIS_RW_ACTION_NONE) ZYDIS_NOTMIN(ZYAN_TRUE), ZYDIS_REG_CONSTRAINTS_NONE, 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 diff --git a/3rdparty/zydis/src/Generated/InstructionEncodings.inc b/3rdparty/zydis/src/Generated/InstructionEncodings.inc new file mode 100644 index 0000000000..b550f685dc --- /dev/null +++ b/3rdparty/zydis/src/Generated/InstructionEncodings.inc @@ -0,0 +1,23 @@ +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 } }, { { { 16, 32, 64 }, 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 } }, { { { 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 } } } +}; diff --git a/3rdparty/zydis/src/Generated/OperandDefinitions.inc b/3rdparty/zydis/src/Generated/OperandDefinitions.inc new file mode 100644 index 0000000000..72e188a862 --- /dev/null +++ b/3rdparty/zydis/src/Generated/OperandDefinitions.inc @@ -0,0 +1,7437 @@ +#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_INT16, { .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_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_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_UINT8, { .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_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_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_FLOAT80, { .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_FLOAT80, { .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_FLOAT80, { .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_FLOAT80, { .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_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_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_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_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_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_INT16, { .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_INT16, { .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_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_IMM, ZYDIS_OPERAND_VISIBILITY_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_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_IMM, ZYDIS_OPERAND_VISIBILITY_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_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_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .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_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_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 0, 0, 0 }, ZYDIS_IELEMENT_TYPE_INVALID, { .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_INT32, { .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_INT32, { .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_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_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, 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_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_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_YMM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 32, 32, 32 }, 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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, { 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_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_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_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_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_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, { 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_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_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_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_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_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, { 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_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_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_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_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_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, { 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_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_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_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_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_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_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_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_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_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_UINT8, { .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_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_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_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_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_UINT8, { .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_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_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_UINT8, { .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_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_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_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_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_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_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, 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_UINT8, { .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_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_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_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_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_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_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_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_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_FLOAT80, { .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_FLOAT80, { .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_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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_FLOAT80, { .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_FLOAT80, { .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_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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, { 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_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_FLOAT80, { .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_FLOAT80, { .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_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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_FLOAT80, { .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_FLOAT80, { .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_IMPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_FLOAT80, { .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, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_MEM, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, 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_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_FLOAT80, { .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_FLOAT80, { .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_FLOAT80, { .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_FLOAT80, { .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_FLOAT80, { .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_FLOAT80, { .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_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_FLOAT80, { .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_FLOAT80, { .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_IMPLICIT, ZYDIS_OPERAND_ACTION_READ, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_FLOAT80, { .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_FLOAT80, { .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_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ST0 } } }, ZYAN_FALSE, ZYAN_FALSE }, + { ZYDIS_SEMANTIC_OPTYPE_FPR, ZYDIS_OPERAND_VISIBILITY_EXPLICIT, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_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_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_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_MEM, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_WRITE, { 16, 16, 16 }, ZYDIS_IELEMENT_TYPE_INT32, { .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_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_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_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_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_IMM, ZYDIS_OPERAND_VISIBILITY_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_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_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_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_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_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_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_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_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_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, { 2, 2, 2 }, 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_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_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_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, { 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_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_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_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_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, { 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_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_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_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_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_IMM, ZYDIS_OPERAND_VISIBILITY_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, { 2, 2, 2 }, 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_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_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_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_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_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_INVALID, { .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_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_INVALID, { .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_INVALID, { .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_INVALID, { .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_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_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_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_INVALID, { .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_INVALID, { .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_INVALID, { .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_INVALID, { .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_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_XMM, 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_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, { 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_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_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_UINT8, { .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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_UINT32, { .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_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_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_UINT32, { .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_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_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_UINT64, { .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_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_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_UINT64, { .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_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_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_UINT32, { .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_UINT32, { .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_UINT32, { .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_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_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_UINT64, { .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_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_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_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_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_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_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_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_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, { 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_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_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_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_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_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_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_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_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_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_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_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_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_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, { 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_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_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_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, { 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_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_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_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_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, { 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_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_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_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_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, { 4, 4, 4 }, 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, { 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_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_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_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_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_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_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_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_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_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, { 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_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_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, { 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_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_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_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_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_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_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_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_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, { 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_UINT8, { .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_UINT8, { .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_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_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_IMPLICIT_REG, ZYDIS_OPERAND_VISIBILITY_HIDDEN, ZYDIS_OPERAND_ACTION_READWRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_WRITE, { 10, 10, 10 }, ZYDIS_IELEMENT_TYPE_FLOAT80, { .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_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_UINT8, { .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_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_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_UINT8, { .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_UINT8, { .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_UINT8, { .encoding = ZYDIS_OPERAND_ENCODING_UIMM8 }, 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_UIMM16_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_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_IMM, ZYDIS_OPERAND_VISIBILITY_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_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_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_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, { 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, { 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_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_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, 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, 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_INT32, { .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_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_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_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_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_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_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_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_UINT8, { .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_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_UINT8, { .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_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, { 4, 4, 4 }, 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, { 4, 4, 4 }, 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_UINT16, { .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_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, { 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, { 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_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_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, { 8, 8, 8 }, 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, { 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_UINT8, { .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_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_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_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_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, { 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_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_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, { 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_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_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_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_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_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_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, { 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_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_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_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_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_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_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_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_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_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_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_UINT64, { .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_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_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_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_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_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_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_READ, { 4, 4, 4 }, ZYDIS_IELEMENT_TYPE_UINT32, { .reg = { ZYDIS_IMPLREG_TYPE_STATIC, { .reg = ZYDIS_REGISTER_ECX } } }, 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_WRITE, { 64, 64, 64 }, ZYDIS_IELEMENT_TYPE_INT32, { .encoding = ZYDIS_OPERAND_ENCODING_MODRM_RM }, ZYAN_FALSE, ZYAN_FALSE } +}; +#endif diff --git a/3rdparty/zydis/src/MetaInfo.c b/3rdparty/zydis/src/MetaInfo.c new file mode 100644 index 0000000000..025d95b786 --- /dev/null +++ b/3rdparty/zydis/src/MetaInfo.c @@ -0,0 +1,68 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +/* ============================================================================================== */ +/* Enum strings */ +/* ============================================================================================== */ + +#include +#include +#include + +/* ============================================================================================== */ +/* 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]; +} + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/Mnemonic.c b/3rdparty/zydis/src/Mnemonic.c new file mode 100644 index 0000000000..b9e2eba361 --- /dev/null +++ b/3rdparty/zydis/src/Mnemonic.c @@ -0,0 +1,52 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* 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]; +} + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/Register.c b/3rdparty/zydis/src/Register.c new file mode 100644 index 0000000000..f9807e2428 --- /dev/null +++ b/3rdparty/zydis/src/Register.c @@ -0,0 +1,303 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +/* ============================================================================================== */ +/* Register strings */ +/* ============================================================================================== */ + +#include + +/* ============================================================================================== */ +/* Register-class mapping */ +/* ============================================================================================== */ + +/** + * Defines the `ZydisRegisterMapItem` struct. + */ +typedef struct ZydisRegisterMapItem_ +{ + /** + * The register class. + */ + ZydisRegisterClass class; + /** + * 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; +} ZydisRegisterMapItem; + +/** + * Provides register to register-class and register-class + id to register mappings. + */ +static const ZydisRegisterMapItem REGISTER_MAP[] = +{ + { ZYDIS_REGCLASS_INVALID , ZYDIS_REGISTER_NONE , ZYDIS_REGISTER_NONE , 0 , 0 }, + { ZYDIS_REGCLASS_GPR8 , ZYDIS_REGISTER_AL , ZYDIS_REGISTER_R15B , 8 , 8 }, + { ZYDIS_REGCLASS_GPR16 , ZYDIS_REGISTER_AX , ZYDIS_REGISTER_R15W , 16 , 16 }, + { ZYDIS_REGCLASS_GPR32 , ZYDIS_REGISTER_EAX , ZYDIS_REGISTER_R15D , 32 , 32 }, + { ZYDIS_REGCLASS_GPR64 , ZYDIS_REGISTER_RAX , ZYDIS_REGISTER_R15 , 0 , 64 }, + { ZYDIS_REGCLASS_X87 , ZYDIS_REGISTER_ST0 , ZYDIS_REGISTER_ST7 , 80 , 80 }, + { ZYDIS_REGCLASS_MMX , ZYDIS_REGISTER_MM0 , ZYDIS_REGISTER_MM7 , 64 , 64 }, + { ZYDIS_REGCLASS_XMM , ZYDIS_REGISTER_XMM0 , ZYDIS_REGISTER_XMM31 , 128 , 128 }, + { ZYDIS_REGCLASS_YMM , ZYDIS_REGISTER_YMM0 , ZYDIS_REGISTER_YMM31 , 256 , 256 }, + { ZYDIS_REGCLASS_ZMM , ZYDIS_REGISTER_ZMM0 , ZYDIS_REGISTER_ZMM31 , 512 , 512 }, + { ZYDIS_REGCLASS_TMM , ZYDIS_REGISTER_TMM0 , ZYDIS_REGISTER_TMM7 , 8192 , 8192 }, + { ZYDIS_REGCLASS_FLAGS , ZYDIS_REGISTER_FLAGS , ZYDIS_REGISTER_RFLAGS , 0 , 0 }, + { ZYDIS_REGCLASS_IP , ZYDIS_REGISTER_IP , ZYDIS_REGISTER_RIP , 0 , 0 }, + { ZYDIS_REGCLASS_SEGMENT , ZYDIS_REGISTER_ES , ZYDIS_REGISTER_GS , 16 , 16 }, + { ZYDIS_REGCLASS_TEST , ZYDIS_REGISTER_TR0 , ZYDIS_REGISTER_TR7 , 32 , 32 }, + { ZYDIS_REGCLASS_CONTROL , ZYDIS_REGISTER_CR0 , ZYDIS_REGISTER_CR15 , 32 , 64 }, + { ZYDIS_REGCLASS_DEBUG , ZYDIS_REGISTER_DR0 , ZYDIS_REGISTER_DR15 , 32 , 64 }, + { ZYDIS_REGCLASS_MASK , ZYDIS_REGISTER_K0 , ZYDIS_REGISTER_K7 , 0 , 0 }, + { ZYDIS_REGCLASS_BOUND , ZYDIS_REGISTER_BND0 , ZYDIS_REGISTER_BND3 , 128 , 128 } +}; + +/* ============================================================================================== */ +/* Exported functions */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Register */ +/* ---------------------------------------------------------------------------------------------- */ + +ZydisRegister ZydisRegisterEncode(ZydisRegisterClass register_class, ZyanU8 id) +{ + switch (register_class) + { + case ZYDIS_REGCLASS_INVALID: + case ZYDIS_REGCLASS_FLAGS: + case ZYDIS_REGCLASS_IP: + break; + default: + if (((ZyanUSize)register_class < ZYAN_ARRAY_LENGTH(REGISTER_MAP)) && + (id <= (REGISTER_MAP[register_class].hi - REGISTER_MAP[register_class].lo))) + { + return REGISTER_MAP[register_class].lo + id; + } + } + return ZYDIS_REGISTER_NONE; +} + +ZyanI8 ZydisRegisterGetId(ZydisRegister reg) +{ + for (ZyanUSize i = 0; i < ZYAN_ARRAY_LENGTH(REGISTER_MAP); ++i) + { + switch (REGISTER_MAP[i].class) + { + case ZYDIS_REGCLASS_INVALID: + case ZYDIS_REGCLASS_FLAGS: + case ZYDIS_REGCLASS_IP: + break; + default: + if ((reg >= REGISTER_MAP[i].lo) && (reg <= REGISTER_MAP[i].hi)) + { + return (ZyanU8)(reg - REGISTER_MAP[i].lo); + } + } + } + return -1; +} + +ZydisRegisterClass ZydisRegisterGetClass(ZydisRegister reg) +{ + for (ZyanUSize i = 0; i < ZYAN_ARRAY_LENGTH(REGISTER_MAP); ++i) + { + if ((reg >= REGISTER_MAP[i].lo) && (reg <= REGISTER_MAP[i].hi)) + { + return REGISTER_MAP[i].class; + } + } + return ZYDIS_REGCLASS_INVALID; +} + +ZydisRegisterWidth ZydisRegisterGetWidth(ZydisMachineMode mode, ZydisRegister reg) +{ + // Special cases + switch (reg) + { + case ZYDIS_REGISTER_X87CONTROL: + case ZYDIS_REGISTER_X87STATUS: + case ZYDIS_REGISTER_X87TAG: + return 16; + case ZYDIS_REGISTER_IP: + case ZYDIS_REGISTER_FLAGS: + return 16; + case ZYDIS_REGISTER_EIP: + case ZYDIS_REGISTER_EFLAGS: + return 32; + case ZYDIS_REGISTER_RIP: + case ZYDIS_REGISTER_RFLAGS: + return (mode == ZYDIS_MACHINE_MODE_LONG_64) ? 64 : 0; + case ZYDIS_REGISTER_BNDCFG: + case ZYDIS_REGISTER_BNDSTATUS: + return 64; + case ZYDIS_REGISTER_XCR0: + return 64; + case ZYDIS_REGISTER_PKRU: + case ZYDIS_REGISTER_MXCSR: + return 32; + default: + break; + } + + // Register classes + for (ZyanUSize i = 0; i < ZYAN_ARRAY_LENGTH(REGISTER_MAP); ++i) + { + if ((reg >= REGISTER_MAP[i].lo) && (reg <= REGISTER_MAP[i].hi)) + { + return (mode == ZYDIS_MACHINE_MODE_LONG_64) ? + REGISTER_MAP[i].width64 : REGISTER_MAP[i].width; + } + } + return 0; +} + +ZydisRegister ZydisRegisterGetLargestEnclosing(ZydisMachineMode mode, ZydisRegister 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, + }; + + for (ZyanUSize i = 0; i < ZYAN_ARRAY_LENGTH(REGISTER_MAP); ++i) + { + if ((reg >= REGISTER_MAP[i].lo) && (reg <= REGISTER_MAP[i].hi)) + { + const ZydisRegisterClass reg_class = REGISTER_MAP[i].class; + if ((reg_class == ZYDIS_REGCLASS_GPR64) && (mode != ZYDIS_MACHINE_MODE_LONG_64)) + { + return ZYDIS_REGISTER_NONE; + } + + ZyanU8 reg_id = (ZyanU8)(reg - REGISTER_MAP[reg_class].lo); + 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) + { + case ZYDIS_MACHINE_MODE_LONG_64: + return REGISTER_MAP[ZYDIS_REGCLASS_GPR64].lo + reg_id; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_32: + case ZYDIS_MACHINE_MODE_LEGACY_32: + return REGISTER_MAP[ZYDIS_REGCLASS_GPR32].lo + reg_id; + case ZYDIS_MACHINE_MODE_LONG_COMPAT_16: + case ZYDIS_MACHINE_MODE_LEGACY_16: + case ZYDIS_MACHINE_MODE_REAL_16: + return REGISTER_MAP[ZYDIS_REGCLASS_GPR16].lo + reg_id; + default: + return ZYDIS_REGISTER_NONE; + } + case ZYDIS_REGCLASS_XMM: + case ZYDIS_REGCLASS_YMM: + case ZYDIS_REGCLASS_ZMM: +#if defined(ZYDIS_DISABLE_AVX512) && defined(ZYDIS_DISABLE_KNC) + return REGISTER_MAP[ZYDIS_REGCLASS_YMM].lo + reg_id; +#else + return REGISTER_MAP[ZYDIS_REGCLASS_ZMM].lo + reg_id; +#endif + default: + return ZYDIS_REGISTER_NONE; + } + } + } + + return ZYDIS_REGISTER_NONE; +} + +const char* ZydisRegisterGetString(ZydisRegister reg) +{ + if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(STR_REGISTER)) + { + return ZYAN_NULL; + } + return STR_REGISTER[reg].data; +} + +const ZydisShortString* ZydisRegisterGetStringWrapped(ZydisRegister reg) +{ + if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(STR_REGISTER)) + { + return ZYAN_NULL; + } + return &STR_REGISTER[reg]; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Register class */ +/* ---------------------------------------------------------------------------------------------- */ + +ZydisRegisterWidth ZydisRegisterClassGetWidth(ZydisMachineMode mode, + ZydisRegisterClass register_class) +{ + if ((ZyanUSize)register_class < ZYAN_ARRAY_LENGTH(REGISTER_MAP)) + { + return (mode == ZYDIS_MACHINE_MODE_LONG_64) ? + REGISTER_MAP[register_class].width64 : REGISTER_MAP[register_class].width; + } + return 0; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/SharedData.c b/3rdparty/zydis/src/SharedData.c new file mode 100644 index 0000000000..89b3ef39e0 --- /dev/null +++ b/3rdparty/zydis/src/SharedData.c @@ -0,0 +1,188 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +/* ============================================================================================== */ +/* Data tables */ +/* ============================================================================================== */ + +/* ---------------------------------------------------------------------------------------------- */ +/* Instruction definitions */ +/* ---------------------------------------------------------------------------------------------- */ + +#ifdef ZYDIS_MINIMAL_MODE +# define ZYDIS_NOTMIN(x) +#else +# define ZYDIS_NOTMIN(x) , x +#endif + +#include + +#undef ZYDIS_NOTMIN + +/* ---------------------------------------------------------------------------------------------- */ +/* Operand definitions */ +/* ---------------------------------------------------------------------------------------------- */ + +#define ZYDIS_OPERAND_DEFINITION(type, encoding, access) \ + { type, encoding, access } + +#include + +#undef ZYDIS_OPERAND_DEFINITION + +/* ---------------------------------------------------------------------------------------------- */ +/* Accessed CPU flags */ +/* ---------------------------------------------------------------------------------------------- */ + +#include + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ +/* 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 +ZyanU8 ZydisGetOperandDefinitions(const ZydisInstructionDefinition* definition, + const ZydisOperandDefinition** operand) +{ + if (definition->operand_count == 0) + { + *operand = ZYAN_NULL; + return 0; + } + ZYAN_ASSERT(definition->operand_reference != 0xFFFF); + *operand = &OPERAND_DEFINITIONS[definition->operand_reference]; + return definition->operand_count; +} +#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 , 16 }, + { ZYDIS_ELEMENT_TYPE_INT , 32 }, + { ZYDIS_ELEMENT_TYPE_INT , 64 }, + { ZYDIS_ELEMENT_TYPE_UINT , 8 }, + { ZYDIS_ELEMENT_TYPE_UINT , 16 }, + { 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_FLOAT80 , 80 }, + { ZYDIS_ELEMENT_TYPE_LONGBCD , 80 }, + { ZYDIS_ELEMENT_TYPE_CC , 3 }, + { ZYDIS_ELEMENT_TYPE_CC , 5 } + }; + + ZYAN_ASSERT(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 ZydisAccessedFlags** flags) +{ + ZYAN_ASSERT(definition->flags_reference < ZYAN_ARRAY_LENGTH(ACCESSED_FLAGS)); + *flags = &ACCESSED_FLAGS[definition->flags_reference]; + return (definition->flags_reference != 0); +} +#endif + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/String.c b/3rdparty/zydis/src/String.c new file mode 100644 index 0000000000..ad78df630c --- /dev/null +++ b/3rdparty/zydis/src/String.c @@ -0,0 +1,362 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +/* ============================================================================================== */ +/* 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) +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 + +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; + 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) +ZyanStatus ZydisStringAppendHexU32(ZyanString* string, ZyanU32 value, ZyanU8 padding_length, + 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; + } + if (remaining <= (ZyanU8)i) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + buffer = (char*)string->vector.data + len - 1; + 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 + +ZyanStatus ZydisStringAppendHexU64(ZyanString* string, ZyanU64 value, ZyanU8 padding_length, + 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; + } + if (remaining <= (ZyanU8)i) + { + return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE; + } + buffer = (char*)string->vector.data + len - 1; + 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) + 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 uppercase, const ZyanStringView* prefix, const ZyanStringView* suffix) +{ + if (prefix) + { + ZYAN_CHECK(ZydisStringAppend(string, prefix)); + } + +#if defined(ZYAN_X64) || defined(ZYAN_AARCH64) + ZYAN_CHECK(ZydisStringAppendHexU64(string, value, padding_length, uppercase)); +#else + if (value & 0xFFFFFFFF00000000) + { + ZYAN_CHECK(ZydisStringAppendHexU64(string, value, padding_length, uppercase)); + } + else + { + ZYAN_CHECK(ZydisStringAppendHexU32(string, (ZyanU32)value, padding_length, uppercase)); + } +#endif + + if (suffix) + { + return ZydisStringAppend(string, suffix); + } + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/Utils.c b/3rdparty/zydis/src/Utils.c new file mode 100644 index 0000000000..53268fa670 --- /dev/null +++ b/3rdparty/zydis/src/Utils.c @@ -0,0 +1,373 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include +#include + +/* ============================================================================================== */ +/* 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; + } +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Accessed CPU flags */ +/* ---------------------------------------------------------------------------------------------- */ + +ZyanStatus ZydisGetAccessedFlagsByAction(const ZydisDecodedInstruction* instruction, + ZydisCPUFlagAction action, ZydisCPUFlags* flags) +{ + if (!instruction || !flags) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *flags = 0; + for (ZyanUSize i = 0; i < ZYAN_ARRAY_LENGTH(instruction->accessed_flags); ++i) + { + if (instruction->accessed_flags[i].action == action) + { + *flags |= (1 << i); + } + } + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisGetAccessedFlagsRead(const ZydisDecodedInstruction* instruction, + ZydisCPUFlags* flags) +{ + if (!instruction || !flags) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *flags = instruction->cpu_flags_read; + + return ZYAN_STATUS_SUCCESS; +} + +ZyanStatus ZydisGetAccessedFlagsWritten(const ZydisDecodedInstruction* instruction, + ZydisCPUFlags* flags) +{ + if (!instruction || !flags) + { + return ZYAN_STATUS_INVALID_ARGUMENT; + } + + *flags = instruction->cpu_flags_written; + + return ZYAN_STATUS_SUCCESS; +} + +/* ---------------------------------------------------------------------------------------------- */ +/* Instruction segments */ +/* ---------------------------------------------------------------------------------------------- */ + +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; +} + +/* ---------------------------------------------------------------------------------------------- */ + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/src/Zydis.c b/3rdparty/zydis/src/Zydis.c new file mode 100644 index 0000000000..bd670dd9e2 --- /dev/null +++ b/3rdparty/zydis/src/Zydis.c @@ -0,0 +1,73 @@ +/*************************************************************************************************** + + 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. + +***************************************************************************************************/ + +#include + +/* ============================================================================================== */ +/* 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_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 + + default: + return ZYAN_STATUS_INVALID_ARGUMENT; + } +} + +/* ============================================================================================== */ diff --git a/3rdparty/zydis/zydis.vcxproj b/3rdparty/zydis/zydis.vcxproj new file mode 100644 index 0000000000..c1009a3098 --- /dev/null +++ b/3rdparty/zydis/zydis.vcxproj @@ -0,0 +1,130 @@ + + + + + + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF} + + + + StaticLibrary + $(DefaultPlatformToolset) + MultiByte + true + true + false + + + + + + + + + + + + + + AllRules.ruleset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ZYCORE_STATIC_DEFINE;ZYDIS_STATIC_DEFINE;%(PreprocessorDefinitions) + TurnOffAllWarnings + $(ProjectDir)src;$(ProjectDir)include;$(ProjectDir)dependencies\zycore\include;%(AdditionalIncludeDirectories) + $(IntDir)%(RelativeDir) + + + + + \ No newline at end of file diff --git a/3rdparty/zydis/zydis.vcxproj.filters b/3rdparty/zydis/zydis.vcxproj.filters new file mode 100644 index 0000000000..55414e57f8 --- /dev/null +++ b/3rdparty/zydis/zydis.vcxproj.filters @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 91a2c67569..6a2a121714 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,13 +71,12 @@ if(PACKAGE_MODE) INSTALL(FILES "${CMAKE_BINARY_DIR}/linux_various/PCSX2.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") INSTALL(FILES "${CMAKE_SOURCE_DIR}/linux_various/PCSX2.xpm" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/pixmaps") INSTALL(FILES "${CMAKE_SOURCE_DIR}/bin/docs/PCSX2_FAQ.pdf" DESTINATION "${CMAKE_INSTALL_DOCDIR}") - INSTALL(FILES "${CMAKE_SOURCE_DIR}/bin/docs/Configuration_Guide.pdf" DESTINATION "${CMAKE_INSTALL_DOCDIR}") + # INSTALL(FILES "${CMAKE_SOURCE_DIR}/bin/docs/Configuration_Guide.pdf" DESTINATION "${CMAKE_INSTALL_DOCDIR}") INSTALL(FILES "${CMAKE_SOURCE_DIR}/bin/docs/PCSX2.1" DESTINATION "${CMAKE_INSTALL_MANDIR}/man1") if(NOT DISABLE_PCSX2_WRAPPER) INSTALL(FILES "${CMAKE_SOURCE_DIR}/linux_various/PCSX2-linux.sh" DESTINATION "${CMAKE_INSTALL_BINDIR}") endif() - -else() +elseif(NOT WIN32) if(NOT DISABLE_PCSX2_WRAPPER) # special case to avoid having linux files in windows INSTALL(FILES "${CMAKE_SOURCE_DIR}/linux_various/PCSX2-linux.sh" DESTINATION "${CMAKE_SOURCE_DIR}/bin") diff --git a/PCSX2_qt.sln b/PCSX2_qt.sln index e6625ab273..f8c614abb8 100644 --- a/PCSX2_qt.sln +++ b/PCSX2_qt.sln @@ -21,8 +21,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblzma", "3rdparty\xz\libl EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fmt", "3rdparty\fmt\fmt.vcxproj", "{449AD25E-424A-4714-BABC-68706CDCC33B}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsamplerate", "3rdparty\libsamplerate\libsamplerate.vcxproj", "{47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libchdr", "3rdparty\libchdr\libchdr.vcxproj", "{A0D2B3AD-1F72-4EE3-8B5C-F2C358DA35F0}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpgd", "3rdparty\jpgd\jpgd.vcxproj", "{ED2F21FD-0A36-4A8F-9B90-E7D92A2ACB63}" @@ -57,6 +55,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "updater", "updater\updater. EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpuinfo", "3rdparty\cpuinfo\cpuinfo.vcxproj", "{7E183337-A7E9-460C-9D3D-568BC9F9BCC1}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rcheevos", "3rdparty\rcheevos\rcheevos.vcxproj", "{6D5B5AD9-1525-459B-939F-A5E1082AF6B3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rainterface", "3rdparty\rainterface\rainterface.vcxproj", "{95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "discord-rpc", "3rdparty\discord-rpc\discord-rpc.vcxproj", "{E960DFDF-1BD3-4C29-B251-D1A0919C9B09}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pcsx2-gsrunner", "pcsx2-gsrunner\pcsx2-gsrunner.vcxproj", "{BB98BF81-A132-444A-BB81-96D510F433A8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zydis", "3rdparty\zydis\zydis.vcxproj", "{67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug AVX2|x64 = Debug AVX2|x64 @@ -163,18 +171,6 @@ Global {449AD25E-424A-4714-BABC-68706CDCC33B}.Release AVX2|x64.Build.0 = Release|x64 {449AD25E-424A-4714-BABC-68706CDCC33B}.Release|x64.ActiveCfg = Release|x64 {449AD25E-424A-4714-BABC-68706CDCC33B}.Release|x64.Build.0 = Release|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Debug AVX2|x64.ActiveCfg = Debug|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Debug AVX2|x64.Build.0 = Debug|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Debug|x64.ActiveCfg = Debug|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Debug|x64.Build.0 = Debug|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Devel AVX2|x64.ActiveCfg = Devel|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Devel AVX2|x64.Build.0 = Devel|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Devel|x64.ActiveCfg = Devel|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Devel|x64.Build.0 = Devel|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Release AVX2|x64.ActiveCfg = Release|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Release AVX2|x64.Build.0 = Release|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Release|x64.ActiveCfg = Release|x64 - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F}.Release|x64.Build.0 = Release|x64 {A0D2B3AD-1F72-4EE3-8B5C-F2C358DA35F0}.Debug AVX2|x64.ActiveCfg = Debug|x64 {A0D2B3AD-1F72-4EE3-8B5C-F2C358DA35F0}.Debug AVX2|x64.Build.0 = Debug|x64 {A0D2B3AD-1F72-4EE3-8B5C-F2C358DA35F0}.Debug|x64.ActiveCfg = Debug|x64 @@ -199,16 +195,16 @@ Global {ED2F21FD-0A36-4A8F-9B90-E7D92A2ACB63}.Release AVX2|x64.Build.0 = Release|x64 {ED2F21FD-0A36-4A8F-9B90-E7D92A2ACB63}.Release|x64.ActiveCfg = Release|x64 {ED2F21FD-0A36-4A8F-9B90-E7D92A2ACB63}.Release|x64.Build.0 = Release|x64 - {4639972E-424E-4E13-8B07-CA403C481346}.Debug AVX2|x64.ActiveCfg = Debug|x64 - {4639972E-424E-4E13-8B07-CA403C481346}.Debug AVX2|x64.Build.0 = Debug|x64 + {4639972E-424E-4E13-8B07-CA403C481346}.Debug AVX2|x64.ActiveCfg = Debug AVX2|x64 + {4639972E-424E-4E13-8B07-CA403C481346}.Debug AVX2|x64.Build.0 = Debug AVX2|x64 {4639972E-424E-4E13-8B07-CA403C481346}.Debug|x64.ActiveCfg = Debug|x64 {4639972E-424E-4E13-8B07-CA403C481346}.Debug|x64.Build.0 = Debug|x64 - {4639972E-424E-4E13-8B07-CA403C481346}.Devel AVX2|x64.ActiveCfg = Devel|x64 - {4639972E-424E-4E13-8B07-CA403C481346}.Devel AVX2|x64.Build.0 = Devel|x64 + {4639972E-424E-4E13-8B07-CA403C481346}.Devel AVX2|x64.ActiveCfg = Devel AVX2|x64 + {4639972E-424E-4E13-8B07-CA403C481346}.Devel AVX2|x64.Build.0 = Devel AVX2|x64 {4639972E-424E-4E13-8B07-CA403C481346}.Devel|x64.ActiveCfg = Devel|x64 {4639972E-424E-4E13-8B07-CA403C481346}.Devel|x64.Build.0 = Devel|x64 - {4639972E-424E-4E13-8B07-CA403C481346}.Release AVX2|x64.ActiveCfg = Release|x64 - {4639972E-424E-4E13-8B07-CA403C481346}.Release AVX2|x64.Build.0 = Release|x64 + {4639972E-424E-4E13-8B07-CA403C481346}.Release AVX2|x64.ActiveCfg = Release AVX2|x64 + {4639972E-424E-4E13-8B07-CA403C481346}.Release AVX2|x64.Build.0 = Release AVX2|x64 {4639972E-424E-4E13-8B07-CA403C481346}.Release|x64.ActiveCfg = Release|x64 {4639972E-424E-4E13-8B07-CA403C481346}.Release|x64.Build.0 = Release|x64 {6C7986C4-3E4D-4DCC-B3C6-6BB12B238995}.Debug AVX2|x64.ActiveCfg = Debug AVX2|x64 @@ -379,6 +375,60 @@ Global {7E183337-A7E9-460C-9D3D-568BC9F9BCC1}.Release AVX2|x64.Build.0 = Release|x64 {7E183337-A7E9-460C-9D3D-568BC9F9BCC1}.Release|x64.ActiveCfg = Release|x64 {7E183337-A7E9-460C-9D3D-568BC9F9BCC1}.Release|x64.Build.0 = Release|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Debug AVX2|x64.ActiveCfg = Debug|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Debug AVX2|x64.Build.0 = Debug|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Debug|x64.ActiveCfg = Debug|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Debug|x64.Build.0 = Debug|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Devel AVX2|x64.ActiveCfg = Devel|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Devel AVX2|x64.Build.0 = Devel|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Devel|x64.ActiveCfg = Devel|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Devel|x64.Build.0 = Devel|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Release AVX2|x64.ActiveCfg = Release|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Release AVX2|x64.Build.0 = Release|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Release|x64.ActiveCfg = Release|x64 + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3}.Release|x64.Build.0 = Release|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Debug AVX2|x64.ActiveCfg = Debug|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Debug AVX2|x64.Build.0 = Debug|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Debug|x64.ActiveCfg = Debug|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Debug|x64.Build.0 = Debug|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Devel AVX2|x64.ActiveCfg = Devel|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Devel AVX2|x64.Build.0 = Devel|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Devel|x64.ActiveCfg = Devel|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Devel|x64.Build.0 = Devel|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Release AVX2|x64.ActiveCfg = Release|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Release AVX2|x64.Build.0 = Release|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Release|x64.ActiveCfg = Release|x64 + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8}.Release|x64.Build.0 = Release|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Debug AVX2|x64.ActiveCfg = Debug|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Debug AVX2|x64.Build.0 = Debug|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Debug|x64.ActiveCfg = Debug|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Debug|x64.Build.0 = Debug|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Devel AVX2|x64.ActiveCfg = Devel|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Devel AVX2|x64.Build.0 = Devel|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Devel|x64.ActiveCfg = Devel|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Devel|x64.Build.0 = Devel|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Release AVX2|x64.ActiveCfg = Release|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Release AVX2|x64.Build.0 = Release|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Release|x64.ActiveCfg = Release|x64 + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09}.Release|x64.Build.0 = Release|x64 + {BB98BF81-A132-444A-BB81-96D510F433A8}.Debug AVX2|x64.ActiveCfg = Debug AVX2|x64 + {BB98BF81-A132-444A-BB81-96D510F433A8}.Debug|x64.ActiveCfg = Debug|x64 + {BB98BF81-A132-444A-BB81-96D510F433A8}.Devel AVX2|x64.ActiveCfg = Devel AVX2|x64 + {BB98BF81-A132-444A-BB81-96D510F433A8}.Devel|x64.ActiveCfg = Devel|x64 + {BB98BF81-A132-444A-BB81-96D510F433A8}.Release AVX2|x64.ActiveCfg = Release AVX2|x64 + {BB98BF81-A132-444A-BB81-96D510F433A8}.Release|x64.ActiveCfg = Release|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Debug AVX2|x64.ActiveCfg = Debug|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Debug AVX2|x64.Build.0 = Debug|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Debug|x64.ActiveCfg = Debug|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Debug|x64.Build.0 = Debug|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Devel AVX2|x64.ActiveCfg = Devel|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Devel AVX2|x64.Build.0 = Devel|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Devel|x64.ActiveCfg = Devel|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Devel|x64.Build.0 = Devel|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Release AVX2|x64.ActiveCfg = Release|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Release AVX2|x64.Build.0 = Release|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Release|x64.ActiveCfg = Release|x64 + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -391,7 +441,6 @@ Global {27F17499-A372-4408-8AFA-4F9F4584FBD3} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} {12728250-16EC-4DC6-94D7-E21DD88947F8} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} {449AD25E-424A-4714-BABC-68706CDCC33B} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} - {47AFDBEF-F15F-4BC0-B436-5BE443C3F80F} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} {A0D2B3AD-1F72-4EE3-8B5C-F2C358DA35F0} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} {ED2F21FD-0A36-4A8F-9B90-E7D92A2ACB63} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} {C0293B32-5ACF-40F0-AA6C-E6DA6F3BF33A} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} @@ -406,6 +455,10 @@ Global {D45CEC7A-3171-40DD-975D-E1544CF16139} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} {A4323327-3F2B-4271-83D9-7F9A3C66B6B2} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} {7E183337-A7E9-460C-9D3D-568BC9F9BCC1} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} + {6D5B5AD9-1525-459B-939F-A5E1082AF6B3} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} + {95DD0A0C-D14D-4CFF-A593-820EF26EFCC8} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} + {E960DFDF-1BD3-4C29-B251-D1A0919C9B09} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} + {67D0160C-0FE4-44B9-AC2E-82BBCF4104DF} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0BC474EA-3628-45D3-9DBC-E22D0B7E0F77} diff --git a/README.md b/README.md index e8e488fdd9..7347c4410a 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ Installers and binaries for both stable and development builds are available fro | Operating System | CPU | GPU | RAM | | ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- | -| - Windows 8.1 or newer (64-bit)
- Ubuntu 18.04/Debian or newer, Arch Linux, or other distro (64-bit)
- macOS 10.13 | - Supports SSE4.1
- [PassMark Single Thread Performance](https://www.cpubenchmark.net/singleThread.html) rating near or greater than 1600
- Two physical cores, with hyperthreading | - Direct3D10 support
- OpenGL 3.x support
- Vulkan 1.1 support
- Metal support
- [PassMark G3D Mark](https://www.videocardbenchmark.net/high_end_gpus.html) rating around 3000 (GeForce GTX 750)
- 2 GB Video Memory | 4 GB | +| - Windows 10 21H2 (1809 or later) (64-bit)
- Ubuntu 20.04/Debian or newer, Arch Linux, or other distro (64-bit)
- macOS 10.13 | - Supports SSE4.1
- [PassMark Single Thread Performance](https://www.cpubenchmark.net/singleThread.html) rating near or greater than 1600
- Two physical cores, with hyperthreading | - Direct3D10 support
- OpenGL 3.x support
- Vulkan 1.1 support
- Metal support
- [PassMark G3D Mark](https://www.videocardbenchmark.net/high_end_gpus.html) rating around 3000 (GeForce GTX 750)
- 2 GB Video Memory | 4 GB | _Note: Recommended Single Thread Performance is based on moderately complex games. Games that pushed the PS2 hardware to its limits will struggle on CPUs at this level. Some release titles and 2D games which underutilized the PS2 hardware may run on CPUs rated as low as 1200. A quick reference for CPU **intensive games**: [Wiki](https://wiki.pcsx2.net/Category:CPU_intensive_games), [Forum](https://forums.pcsx2.net/Thread-LIST-The-Most-CPU-Intensive-Games) and CPU **light** games: [Forum](https://forums.pcsx2.net/Thread-LIST-Games-that-don-t-need-a-strong-CPU-to-emulate)_ @@ -119,7 +119,7 @@ _Note: Recommended Single Thread Performance is based on moderately complex game | Operating System | CPU | GPU | RAM | | ----------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- | -| - Windows 10 (64-bit) or newer
- Ubuntu 22.04/Debian or newer, Arch Linux, or other distro (64-bit)
- macOS 10.13 | - Supports AVX2
- [PassMark Single Thread Performance](https://www.cpubenchmark.net/singleThread.html) rating near or greater than 2100
- Four physical cores, with or without hyperthreading | - Direct3D12 support
- OpenGL 4.6 support
- Vulkan 1.3 support
- Metal support
- [PassMark G3D Mark](https://www.videocardbenchmark.net/high_end_gpus.html) rating around 6000 (GeForce GTX 1050 Ti)
- 4 GB Video Memory | 8 GB | +| - Windows 10 21H2 (1809 or later) (64-bit)
- Ubuntu 22.04/Debian or newer, Arch Linux, or other distro (64-bit)
- macOS 10.13 | - Supports AVX2
- [PassMark Single Thread Performance](https://www.cpubenchmark.net/singleThread.html) rating near or greater than 2100
- Four physical cores, with or without hyperthreading | - Direct3D12 support
- OpenGL 4.6 support
- Vulkan 1.3 support
- Metal support
- [PassMark G3D Mark](https://www.videocardbenchmark.net/high_end_gpus.html) rating around 6000 (GeForce GTX 1050 Ti)
- 4 GB Video Memory | 8 GB | _Note: Recommended GPU is based on 3x Internal, ~1080p resolution requirements. Higher resolutions will require stronger cards; 6x Internal, ~4K resolution will require a [PassMark G3D Mark](https://www.videocardbenchmark.net/high_end_gpus.html) rating around 12000 (GeForce GTX 1070 Ti). Just like CPU requirements, this is also highly game dependent. A quick reference for GPU **intensive games**: [Wiki](https://wiki.pcsx2.net/Category:GPU_intensive_games)_ @@ -127,9 +127,8 @@ _Note: Recommended GPU is based on 3x Internal, ~1080p resolution requirements. - You need the [Visual C++ 2019 x64 Redistributables](https://support.microsoft.com/en-us/help/2977003/) to run PCSX2. - Windows XP and Direct3D9 support was dropped after stable release 1.4.0. -- Windows 7 and Windows 8.0 support was dropped after stable release 1.6.0. +- Windows 7, Windows 8.0, and Windows 8.1 support was dropped after stable release 1.6.0. - 32-bit support was dropped after stable release 1.6.0. -- The Qt version is only supported on Windows 10 or newer, Ubuntu/Debian 20.04 or equivalent and newer. - Make sure to update your operating system and drivers to ensure you have the best experience possible. Having a newer GPU is also recommended so you have the latest supported drivers. - Because of copyright issues, and the complexity of trying to work around it, you need a BIOS dump extracted from a legitimately-owned PS2 console to use the emulator. For more information about the BIOS and how to get it from your console, visit [this page](pcsx2/Docs/PCSX2_FAQ.md#question-13-where-do-i-get-a-ps2-bios). - PCSX2 uses two CPU cores for emulation by default. A third core can be used via the MTVU speed hack, which is compatible with most games. This can be a significant speedup on CPUs with 3+ cores, but it may be a slowdown on GS-limited games (or on CPUs with fewer than 2 cores). Software renderers will then additionally use however many rendering threads it is set to and will need higher core counts to run efficiently. diff --git a/bin/PCSX2_keys.ini.default b/bin/PCSX2_keys.ini.default index d478349827..ef8a05f83c 100644 --- a/bin/PCSX2_keys.ini.default +++ b/bin/PCSX2_keys.ini.default @@ -9,7 +9,7 @@ # best to completely avoid them at this file. GS uses: # F5 - Deinterlace modes # PAGE_UP - FXAA antialiasing (HW and SW) -# PAGE_DOWN - Cycles through dither modes (HW) +# PAGE_DOWN - Cycles through dither modes (HW) # DELETE - Software Antialiasing (AA1) # HOME - FX shader # INSERT - Hardware mipmapping diff --git a/bin/docs/Configuration_Guide.pdf b/bin/docs/Configuration_Guide.pdf deleted file mode 100644 index cadafc5827..0000000000 Binary files a/bin/docs/Configuration_Guide.pdf and /dev/null differ diff --git a/bin/docs/GPL.html b/bin/docs/GPL.html index eb79356afb..8a099cf12e 100644 --- a/bin/docs/GPL.html +++ b/bin/docs/GPL.html @@ -1,9 +1,9 @@ - + GNU General Public License - GNU Project - Free Software Foundation (FSF) - +

GNU GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

@@ -84,7 +84,7 @@ modification follow.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

- +

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

@@ -523,7 +523,7 @@ actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

- +

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties @@ -690,4 +690,4 @@ Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.

- \ No newline at end of file + diff --git a/bin/docs/GameIndex.pdf b/bin/docs/GameIndex.pdf index af2b096627..1da6ce7e2e 100644 Binary files a/bin/docs/GameIndex.pdf and b/bin/docs/GameIndex.pdf differ diff --git a/bin/docs/debugger.txt b/bin/docs/debugger.txt index d98d1dbf60..631b5f534d 100644 --- a/bin/docs/debugger.txt +++ b/bin/docs/debugger.txt @@ -2,57 +2,57 @@ †---------------------† Disassembly view: - -†---------------------† - - Ctrl + G Goto - Ctrl + E Edit Breakpoint - Ctrl + D Enable/disable breakpoint - Ctrl + B Add breakpoint - Left Go back one branch level/goto pc - Right Follow branch/position memory view to accessed address - Up Move cursor up one line - Down Move cursor down one line - Page Up Move visible area up one page - Page Down Move visible area down one page - F10 Step over - F11 Step into - Tab Toggle display symbols - Left Click Select line/toggle breakpoint if line is already highlighted - Right Click Open context menu †---------------------† - + + Ctrl + G Goto + Ctrl + E Edit Breakpoint + Ctrl + D Enable/disable breakpoint + Ctrl + B Add breakpoint + Left Go back one branch level/goto pc + Right Follow branch/position memory view to accessed address + Up Move cursor up one line + Down Move cursor down one line + Page Up Move visible area up one page + Page Down Move visible area down one page + F10 Step over + F11 Step into + Tab Toggle display symbols + Left Click Select line/toggle breakpoint if line is already highlighted + Right Click Open context menu + +†---------------------† + Memory View: - -†---------------------† - - Ctrl + G Goto - Ctrl + B Add breakpoint - Left Move cursor back one byte/nibble - Right Move cursor ahead one byte/nibble - Up Move cursor up one line - Down Move cursor down one line - Page Up Move cursor up one page - Page Down Move cursor down one page - 0-9,A-F Overwrite hex nibble - Any Overwrite ansi byte - Left Click Select byte/nibble - Right Click Open context menu - Ctrl+Wheel Zoom memory view - Esc Return to previous goto address - Ctrl+V Paste a hex string into memory †---------------------† - + + Ctrl + G Goto + Ctrl + B Add breakpoint + Left Move cursor back one byte/nibble + Right Move cursor ahead one byte/nibble + Up Move cursor up one line + Down Move cursor down one line + Page Up Move cursor up one page + Page Down Move cursor down one page + 0-9,A-F Overwrite hex nibble + Any Overwrite ansi byte + Left Click Select byte/nibble + Right Click Open context menu + Ctrl+Wheel Zoom memory view + Esc Return to previous goto address + Ctrl+V Paste a hex string into memory + +†---------------------† + Breakpoint List: - + †---------------------† - Up Select previous item - Down Select next item - Delete Remove selected breakpoint - Return Edit selected breakpoint - Space Toggle enable state of selected breakpoint + Up Select previous item + Down Select next item + Delete Remove selected breakpoint + Return Edit selected breakpoint + Space Toggle enable state of selected breakpoint -†---------------------† \ No newline at end of file +†---------------------† diff --git a/bin/resources/GameIndex.yaml b/bin/resources/GameIndex.yaml index a872841be7..87846859bc 100644 --- a/bin/resources/GameIndex.yaml +++ b/bin/resources/GameIndex.yaml @@ -45,7 +45,7 @@ ALCH-00007: name: "Parfait - Chocolat Second Style [Limited Edition]" region: "NTSC-J" ALCH-00008: - name: "Aria - The Natural ~Tooi Yume no Mirage~ [Limited Edition]" + name: "Aria - The Natural - Tooi Yume no Mirage [Limited Edition]" region: "NTSC-J" ALCH-00009: name: "Higurashi no Naku Koro ni Matsuri [First Print Limited Edition]" @@ -81,7 +81,7 @@ ALCH-0004: name: "Duel Savior Destiny [Messiah Box]" region: "NTSC-J" CPCS-01005: - name: "Gun Survivor 4 - Biohazard - Heroes Never Die [with GunCon2]" + name: "Gun Survivor 4 - BioHazard - Heroes Never Die [with GunCon2]" region: "NTSC-J" gsHWFixes: halfPixelOffset: 1 # Fixes character offset with flashlight and blurriness. @@ -113,7 +113,7 @@ PAPX-90203: name: "Gran Turismo 2000 [Trial]" region: "NTSC-J" PAPX-90215: - name: "Ka (Mosquito) [Trial]" + name: "Ka [Trial]" region: "NTSC-J" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. @@ -137,6 +137,9 @@ PAPX-90231: PAPX-90504: name: "Gran Turismo Concept - Airtrek Turbo Special Edition [Demo]" region: "NTSC-J" +PAPX-90505: + name: "2002 Natsu no Osusume Soft Otameshi Disc" + region: "NTSC-J" PAPX-90506: name: "Dark Chronicle [Demo, Taikenban]" region: "NTSC-J" @@ -151,6 +154,8 @@ PAPX-90512: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. # Comments from old GameIndex.dbf for this Game. # eeClampMode = 3 Text in races works. @@ -159,15 +164,14 @@ PAPX-90516: region: "NTSC-J" gsHWFixes: roundSprite: 1 # Fix line in the sky. - mipmap: 1 - textureInsideRT: 1 - autoFlush: 1 + mipmap: 1 # Fixes broken textures. + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. PAPX-90517: name: "Prince of Persia - Jikan no Suna [Trial]" region: "NTSC-J" gsHWFixes: autoFlush: 1 # Reduces post-processing misalignment. - roundSprite: 2 # Reduces post-processing misalignment. PBGP-0061: name: "Suika A.S+ Eternal Name [First Press Limited Edition]" region: "NTSC-J" @@ -191,10 +195,10 @@ PBPX-95203: name: "HDD Utility Disc [Version 1.01]" region: "NTSC-J" PBPX-95204: - name: "Playstation 2 - Demo Disc 2000" + name: "PlayStation 2 - Demo Disc 2000" region: "PAL-M5" PBPX-95205: - name: "Playstation 2 - Demo Disc 2000" + name: "PlayStation 2 - Demo Disc 2000" region: "PAL-M5" PBPX-95206: name: "DVD Player Version 2.01" @@ -266,7 +270,7 @@ PBPX-95503: - "PBPX-95503" - "SCUS-97102" PBPX-95506: - name: "Playstation 2 - Demo Disc 2001" + name: "PlayStation 2 - Demo Disc 2001" region: "PAL-M5" patches: default: @@ -279,7 +283,7 @@ PBPX-95509: name: "Linux Release 1.0 Runtime Environment [Disc 1]" region: "PAL-E" PBPX-95514: - name: "Playstation 2 - Demo Disc 2002" + name: "PlayStation 2 - Demo Disc 2002" region: "PAL-M5" PBPX-95516: name: "Ratchet & Clank - [Trial Edition]" @@ -294,13 +298,15 @@ PBPX-95517: name: "Network Adapter Start-Up Disc" region: "NTSC-U" PBPX-95520: - name: "Playstation 2 - Demo Disc 2002" + name: "PlayStation 2 - Demo Disc 2002" region: "PAL-M5" PBPX-95524: name: "Gran Turismo 4 - Prologue" region: "NTSC-Unk" compat: 5 gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. # Comments from old GameIndex.dbf for this Game. # eeClampMode = 3 Text in races works. @@ -312,6 +318,8 @@ PBPX-95601: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: - "SCAJ-20066" @@ -326,11 +334,14 @@ PBPX-95601: - "SCPS-55007" # Comments from old GameIndex.dbf for this Game. # eeClampMode = 3 Text in races works. +PCPX-96303: + name: "6-gatsu Hatsubai Title Promotion Disc (Aconcagua - Boku no Natsuyasumi - TVDJ)" + region: "NTSC-J" PCPX-96311: name: "Gran Turismo 3 Trial Disk Volume 1" region: "NTSC-J" PCPX-96317: - name: "Ka (Mosquito) [Trial]" + name: "Ka [Trial]" region: "NTSC-J" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. @@ -348,12 +359,18 @@ PCPX-96322: gsHWFixes: mipmap: 1 halfPixelOffset: 1 # Fixes effect misalignment. +PCPX-96328: + name: "3 Title Special Disc (Saru! Get You! 2 - PoPoLoCrois: Hajimari no Bouken - Boku no Natsuyasumi 2)" + region: "NTSC-J" PCPX-96554: name: "Games of Our Style - Tokyo Game Show 2003 Disc" region: "NTSC-J" PCPX-96616: name: "PurePure 2 Volume 2" region: "NTSC-J" +PCPX-96627: + name: "2002 Natsu no Osusume Soft Otameshi Disc" + region: "NTSC-J" PCPX-96649: name: "Gran Turismo 4 [Demo]" region: "NTSC-J" @@ -361,6 +378,8 @@ PCPX-96649: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. # Comments from old GameIndex.dbf for this Game. # eeClampMode = 3 Text in races works. @@ -376,6 +395,8 @@ PCPX-98017: - EETimingHack # Fixes SPR errors while going in-game. gsHWFixes: mipmap: 1 + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. PDPX-99109: name: "DVD Player Version 3.04" region: "NTSC-J" @@ -390,26 +411,20 @@ SCAJ-10001: SCAJ-10003: name: "Taiko no Tatsujin - Doki! Shinkyoku Darake no Haru Matsuri" region: "NTSC-Unk" - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SCAJ-10004: name: "Time Crisis 2 [PlayStation 2 The Best]" region: "NTSC-Unk" SCAJ-10006: name: "Taiko no Tatsujin - Appare Sandaime" region: "NTSC-Unk" - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SCAJ-10007: name: "Taiko no Tatsujin - Waku Waku Anime Matsuri" region: "NTSC-Unk" - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SCAJ-10008: name: "Taiko no Tatsujin - Atsumare! Matsuri da!! Yondaime" region: "NTSC-Unk" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SCAJ-10009: name: "Psikyo Shooting Collection Vol.1 - Strikers 1-2" @@ -424,31 +439,31 @@ SCAJ-10011: name: "Taiko no Tatsujin - Go! Go! Godaime" region: "NTSC-Unk" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SCAJ-10012: name: "Taiko Drum Master" region: "NTSC-Unk" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SCAJ-10013: name: "Taiko no Tatsujin - Tobikkiri! Anime Special" region: "NTSC-Unk" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SCAJ-10014: name: "Taiko no Tatsujin - Wai Wai Happy! Rokudaime" region: "NTSC-Unk" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SCAJ-10015: name: "Taiko no Tatsujin - Doka! to Oomori Nanadaime" region: "NTSC-Unk" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SCAJ-20001: name: "Ratchet & Clank" @@ -486,16 +501,18 @@ SCAJ-20006: name: "Gunbarl Collection with Time Crisis" region: "NTSC-Unk" SCAJ-20007: - name: "Xi(sai) Go" + name: "Xi[sai] Go" region: "NTSC-Unk" SCAJ-20008: name: "V-Rally 3" region: "NTSC-Unk" + gsHWFixes: + preloadFrameData: 1 # Fixes fog and make lights on cars work again. SCAJ-20009: name: "Herdy Gerdy" region: "NTSC-Unk" SCAJ-20010: - name: "Bakusou Dekotora Densetsu 3" + name: "Bakusou Dekotora Densetsu - Otoko Hanamichi Yume Roman" region: "NTSC-Unk" SCAJ-20011: name: "Armored Core 3 - Silent Line" @@ -540,10 +557,16 @@ SCAJ-20019: region: "NTSC-J" SCAJ-20020: name: "Drag-on Dragoon" - region: "NTSC-Unk" + region: "NTSC-Ch-J" + clampModes: + eeClampMode: 3 # Characters are visible in-game. + gsHWFixes: + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SCAJ-20021: name: "Metal Slug 3" region: "NTSC-Unk" + gsHWFixes: + gpuPaletteConversion: 2 # Stops excessive VRAM usage with preloading on. SCAJ-20022: name: "Super Robot Wars - Alpha 2nd" region: "NTSC-Unk" @@ -589,7 +612,7 @@ SCAJ-20029: region: "NTSC-Unk" compat: 5 SCAJ-20032: - name: "Mosquito - Let's Go Hawaiian" + name: "Ka 2 - Let's Go Hawaiian" region: "NTSC-Unk" SCAJ-20033: name: "Guilty Gear XX #Reload" @@ -618,6 +641,8 @@ SCAJ-20040: SCAJ-20041: name: "Energy Airforce - Aim Strike!" region: "NTSC-Unk" + gsHWFixes: + autoFlush: 1 # Corrects post-processing effect on jet exhausts. SCAJ-20043: name: "ChainDive" region: "NTSC-Unk" @@ -626,6 +651,8 @@ SCAJ-20044: region: "NTSC-Unk" gameFixes: - SoftwareRendererFMVHack # Fixes garbage pixels. + gsHWFixes: + autoFlush: 1 # Fixes lava effect. SCAJ-20045: name: "Shadow Tower Abyss" region: "NTSC-Unk" @@ -686,6 +713,8 @@ SCAJ-20066: region: "NTSC-Unk" compat: 5 gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: #vuClampMode = 2 Text in GT mode works. - "SCAJ-20066" @@ -732,9 +761,9 @@ SCAJ-20073: region: "NTSC-Unk" gsHWFixes: roundSprite: 1 # Fix line in the sky. - mipmap: 1 - textureInsideRT: 1 - autoFlush: 1 + mipmap: 1 # Fixes broken textures. + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. SCAJ-20074: name: "King of Fighters 2002, The" region: "NTSC-Unk" @@ -800,13 +829,13 @@ SCAJ-20085: name: "Sakurazaka Shouboutai" region: "NTSC-Unk" SCAJ-20086: - name: "Xenosaga Episode II - Jenseits von Gut und Bose [Disc1of2]" + name: "Xenosaga Episode II - Jenseits von Gut und Bose [Disc 1 of 2]" region: "NTSC-Unk" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. - texturePreloading: 0 + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: - "SLPS-29001" - "SLPS-29002" @@ -815,13 +844,13 @@ SCAJ-20086: - "SLPS-25353" - "SLPS-73224" SCAJ-20087: - name: "Xenosaga Episode II - Jenseits von Gut und Bose [Disc2of2]" + name: "Xenosaga Episode II - Jenseits von Gut und Bose [Disc 2 of 2]" region: "NTSC-Unk" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. - texturePreloading: 0 + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: - "SLPS-29001" - "SLPS-29002" @@ -830,8 +859,8 @@ SCAJ-20087: - "SLPS-25353" - "SLPS-73224" SCAJ-20088: - name: "UO Nanatsu no Mizu to Densetsu no Nushi" - region: "NTSC-Unk" + name: "Yu Zi - Qiang Jiu Shui Tang Da Zuo Zhan" + region: "NTSC-Ch" SCAJ-20089: name: "Athens 2004" region: "NTSC-Unk" @@ -891,8 +920,12 @@ SCAJ-20104: region: "NTSC-Unk" gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. + texturePreloading: 1 # Performs better than full. + cpuCLUTRender: 1 # Fixes sun occlusion. SCAJ-20105: name: "Armored Core - Nine breaker" region: "NTSC-Unk" @@ -910,6 +943,8 @@ SCAJ-20109: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCAJ-20110: name: "Dragon Quest VIII - Sora to Daichi to Norowareshi Himegimi" region: "NTSC-Unk" @@ -938,6 +973,8 @@ SCAJ-20115: SCAJ-20116: name: "Death by Degrees - Tekken - Nina Williams" region: "NTSC-Ch-J" + gsHWFixes: + alignSprite: 1 # Fixes FMV lines. SCAJ-20117: name: "Fu-un Bakumatsu-den" region: "NTSC-Unk" @@ -951,10 +988,11 @@ SCAJ-20118: halfPixelOffset: 2 # Fixes misalignment bloom effects. SCAJ-20119: name: "Gladiator - Road to Freedom" - region: "NTSC-Unk" + region: "NTSC-J" gsHWFixes: halfPixelOffset: 3 # Fixes bloom misalignment still a bit misaligned. roundSprite: 1 # Fixes bloom misalignment still a bit misaligned. + cpuCLUTRender: 1 # Fixes sun background on the windows when selecting your 'race'. SCAJ-20120: name: "Digital Devil Saga - Avatar Tuner 2" region: "NTSC-Unk" @@ -1024,10 +1062,14 @@ SCAJ-20131: name: "namCollection - Namco 50th Anniversary" region: "NTSC-Unk" SCAJ-20132: - name: "Drag-On Dragon 2 - Fuuin no Kurenai (Love Red, Ambivalence Black)" + name: "Drag-on Dragoon 2 - Fuuin no Aka, Haitoku no Kuro" region: "NTSC-J" clampModes: eeClampMode: 2 # Fixes wrong color on some characters and breakable objects. + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting characters. + mergeSprite: 1 # Align sprite fixes FMVs but not garbage in-game, so needs merge sprite instead. + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SCAJ-20133: name: "Kagero 2 - Dark Illusion" region: "NTSC-Unk" @@ -1056,8 +1098,12 @@ SCAJ-20136: region: "NTSC-Unk" gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. + texturePreloading: 1 # Performs better than full. + cpuCLUTRender: 1 # Fixes sun occlusion. SCAJ-20137: name: "Musashiden II - Blademaster" region: "NTSC-Unk" @@ -1068,6 +1114,10 @@ SCAJ-20138: region: "NTSC-Unk" gsHWFixes: preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. + halfPixelOffset: 2 # Fixes misaligned blur. + autoFlush: 1 # Fixes corruption in cutscenes and brightens the image. SCAJ-20139: name: "Zero - Shisei no Koe" # Fatal Frame - Rei - Irezumi no Sei region: "NTSC-Unk" @@ -1086,19 +1136,25 @@ SCAJ-20143: preloadFrameData: 1 # Fixes black screen while in a mech. roundSprite: 2 # Fixes HUD artifacts. SCAJ-20144: - name: "Saru Gechu 3 (Ape Escape 3)" - region: "NTSC-Ch-J" + name: "Zhuo Hou La 3" + region: "NTSC-Ch" gsHWFixes: preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. + halfPixelOffset: 2 # Fixes misaligned blur. + autoFlush: 1 # Fixes corruption in cutscenes and brightens the image. SCAJ-20145: name: "Tales of Legendia" region: "NTSC-J" gameFixes: - SoftwareRendererFMVHack # Fixes garbage textures presumably from texture cache issue. SCAJ-20146: - name: "Shadow of the Colossus" - region: "NTSC-Ch-E-J" + name: "Wang Da Yu Ju Xiang" + region: "NTSC-Ch" compat: 5 + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. gsHWFixes: mipmap: 1 halfPixelOffset: 1 # Fixes misalignments and borders on side. @@ -1132,6 +1188,8 @@ SCAJ-20152: - EETimingHack # Mitigates bounciness of vertical shaking but better fix with EE cyclerate +1. gsHWFixes: alignSprite: 1 # Fixes vertical lines. + textureInsideRT: 1 # Fixes corruption. + texturePreloading: 1 # Performs much better with partial preload. SCAJ-20153: name: "Code Age Commanders" region: "NTSC-J" @@ -1155,14 +1213,19 @@ SCAJ-20157: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCAJ-20158: name: "Ikusa Gami" region: "NTSC-Unk" gameFixes: - VIF1StallHack # Fixes black screen on boot. + gsHWFixes: + autoFlush: 1 # Fixes missing bloom effects. + halfPixelOffset: 2 # Fixes misaligned lighting and bloom. SCAJ-20159: name: "Soul Calibur III" - region: "NTSC-Ch-E-J" + region: "NTSC-Ch" gameFixes: - EETimingHack # Fixes bad colours on character select when in Progressive Scan. clampModes: @@ -1170,6 +1233,7 @@ SCAJ-20159: gsHWFixes: alignSprite: 1 # Fixes vertical lines. halfPixelOffset: 1 # Fixes blurriness. + texturePreloading: 1 # Improves performance. SCAJ-20160: name: "Yoshitsuneki" region: "NTSC-Unk" @@ -1194,11 +1258,13 @@ SCAJ-20163: region: "NTSC-Unk" gsHWFixes: halfPixelOffset: 2 # Fixes ghosting. + autoFlush: 1 # Fixes post lighting. SCAJ-20164: name: "Kingdom Hearts II" region: "NTSC-Unk" gsHWFixes: autoFlush: 1 # Fixes effects. + halfPixelOffset: 1 # Fixes upscaling artifacts. SCAJ-20165: name: "Bleach - Hanatareshi Yabou" region: "NTSC-Unk" @@ -1230,6 +1296,8 @@ SCAJ-20170: SCAJ-20171: name: "Zettai Zetsumei Toshi 2 - Itetsuita Kioku Tachi" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 1 # Fixes some shading/shadows. SCAJ-20172: name: "Final Fantasy XII" region: "NTSC-Unk" @@ -1238,6 +1306,7 @@ SCAJ-20173: region: "NTSC-Unk" gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes HUD artifacts. alignSprite: 1 # Fixes vertical lines. mergeSprite: 1 # Better aligns main menu strips, improving font readability. @@ -1257,7 +1326,7 @@ SCAJ-20175: region: "NTSC-J" SCAJ-20176: name: "Curious George" - region: "NTSC-Unk" + region: "NTSC-HK" SCAJ-20177: name: "Valkyrie Profile 2 - Silmeria" region: "NTSC-Unk" @@ -1272,7 +1341,7 @@ SCAJ-20178: region: "NTSC-Unk" compat: 5 SCAJ-20179: - name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc1of2]" + name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc 1 of 2]" region: "NTSC-Unk" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. @@ -1280,7 +1349,7 @@ SCAJ-20179: roundSprite: 2 # Fixes font artifacts. texturePreloading: 0 # Performs much better with it off. SCAJ-20180: - name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc2of2]" + name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc 2 of 2]" region: "NTSC-Unk" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. @@ -1295,12 +1364,14 @@ SCAJ-20182: region: "NTSC-Unk" gameFixes: - FpuMulHack + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SCAJ-20183: name: "Wild ARMs - The Vth Vanguard" region: "NTSC-J" gsHWFixes: - wildArmsHack: 1 # Fixes font artifacts and out-of-bound 2D textures. roundSprite: 1 # Fixes font sizes. + cpuFramebufferConversion: 1 # Fixes sepia-tone flashback sequences. SCAJ-20184: name: "Seiken Densetsu 4" region: "NTSC-Unk" @@ -1317,6 +1388,7 @@ SCAJ-20190: alignSprite: 1 # Fixes water vertical lines. halfPixelOffset: 2 # Fixes misaligned bloom. roundSprite: 1 # Fixes chromatic effect. + autoFlush: 1 # Fixes sun occlusion. SCAJ-20191: name: "Super Robot Taisen OG - Original Generations Gaiden [Limited Edition]" region: "NTSC-Unk" @@ -1325,9 +1397,11 @@ SCAJ-20192: region: "NTSC-Unk" SCAJ-20193: name: "Tales of Destiny [Director's Cut] [Premium Box]" - region: "NTSC-Unk" + region: "NTSC-Ch-J" gameFixes: - FpuMulHack + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SCAJ-20194: name: "Minna no Golf 4 [PlayStation 2 The Best]" region: "NTSC-Unk" @@ -1336,9 +1410,15 @@ SCAJ-20195: region: "NTSC-Ch" gsHWFixes: preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. + halfPixelOffset: 2 # Fixes misaligned blur. + autoFlush: 1 # Fixes corruption in cutscenes and brightens the image. SCAJ-20196: - name: "Shadow of the Colossus [PlayStation 2 The Best]" + name: "Wang Da Yu Ju Xiang [PlayStation 2 The Best]" region: "NTSC-Ch" + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. gsHWFixes: mipmap: 1 halfPixelOffset: 1 # Fixes misalignments and borders on side. @@ -1417,8 +1497,8 @@ SCAJ-30003: name: "Siren" region: "NTSC-Unk" SCAJ-30004: - name: "Waga Ryuu o Miyo - Pride of the Dragon Peace" - region: "NTSC-Unk" + name: "Kan Wo Long Xian Shen Wei" + region: "NTSC-CH" SCAJ-30005: name: "Gacha Mecha Stadium - Saru Battle" region: "NTSC-Unk" @@ -1430,6 +1510,8 @@ SCAJ-30006: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: - "SCAJ-20066" @@ -1451,6 +1533,8 @@ SCAJ-30007: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. # Comments from old GameIndex.dbf for this Game. # eeClampMode = 3 Text in races works. @@ -1460,6 +1544,8 @@ SCAJ-30008: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: - "SCAJ-20066" @@ -1479,9 +1565,9 @@ SCAJ-30010: region: "NTSC-E" gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SCAJ-30011: name: "God of War II" region: "NTSC-E" @@ -1489,11 +1575,13 @@ SCAJ-30011: alignSprite: 1 # Fixes water vertical lines. halfPixelOffset: 2 # Fixes misaligned bloom. roundSprite: 1 # Fixes chromatic effect. + autoFlush: 1 # Fixes sun occlusion. SCCS-40001: name: "Ape Escape 2" region: "NTSC-C" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SCCS-40002: name: "Devil May Cry 2 - Disc 1" region: "NTSC-C" @@ -1516,7 +1604,7 @@ SCCS-40005: mipmap: 1 halfPixelOffset: 1 # Fixes effect misalignment. SCCS-40006: - name: "Shin Sangoku Musou 2" + name: "Zhen Sanguo Wushuang 2" region: "NTSC-C" SCCS-40007: name: "Arc the Lad - Seirei no Tasogare" @@ -1560,6 +1648,8 @@ SCCS-60002: name: "Gran Turismo 4 [Review Copy]" region: "NTSC-C" gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. SCED-50041: name: "Tekken Tag Tournament [Demo]" @@ -1694,6 +1784,7 @@ SCED-50642: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SCED-50675: name: "Official PlayStation 2 Magazine Demo 16" region: "PAL-M5" @@ -1751,6 +1842,8 @@ SCED-50750: SCED-50781: name: "Destruction Derby Arenas [Beta]" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 2 # Corrects shadow position. SCED-50825: name: "Official PlayStation 2 Magazine Demo 18" region: "PAL-M5" @@ -1761,6 +1854,7 @@ SCED-50907: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SCED-50945: name: "Official PlayStation 2 Magazine Demo 20" region: "PAL-M5" @@ -1919,7 +2013,7 @@ SCED-51575: name: "Official PlayStation 2 Magazine Demo 40" # German region: "PAL-E-G" SCED-51657: - name: "Official Playstation Magazine Demo 33" + name: "Official PlayStation Magazine Demo 33" region: "PAL-Unk" compat: 5 patches: @@ -1931,9 +2025,9 @@ SCED-51700: region: "PAL-M5" gsHWFixes: roundSprite: 1 # Fix line in the sky. - mipmap: 1 - textureInsideRT: 1 - autoFlush: 1 + mipmap: 1 # Fixes broken textures. + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. SCED-51922: name: "Ghosthunter [Demo]" @@ -1947,7 +2041,7 @@ SCED-51940: name: "Bonus Demo 5" region: "PAL-M5" SCED-51941: - name: "Bonus Demo 5 (Alternate)" + name: "Bonus Demo 5" region: "PAL-M5" SCED-52037: name: "Official PlayStation 2 Magazine Demo 39" # German @@ -1961,6 +2055,7 @@ SCED-52049: gsHWFixes: preloadFrameData: 1 # Fixes bad textures on Jake. halfPixelOffset: 1 # Fixes double image. + cpuCLUTRender: 1 # Fixes Jake going black in Smellovision. SCED-52051: name: "Official PlayStation 2 Magazine Demo 43" region: "PAL-M5" @@ -1968,13 +2063,13 @@ SCED-52052: name: "Official PlayStation 2 Magazine Demo 44" region: "PAL-M5" SCED-52053: - name: "Official Playstation 2 Magazine Demo 40" + name: "Official PlayStation 2 Magazine Demo 40" region: "PAL-PT" SCED-52054: name: "Official PlayStation 2 Magazine Demo 40" region: "PAL-M5" SCED-52057: - name: "Official Playstation Magazine Demo Disc 40" + name: "Official PlayStation Magazine Demo Disc 40" region: "PAL-IT" SCED-52260: name: "Forbidden Siren [Demo]" @@ -2093,14 +2188,14 @@ SCED-52390: name: "Bonus Demo 6" region: "PAL-M5" SCED-52391: - name: "Bonus Demo 6 (Alternate)" + name: "Bonus Demo 6" region: "PAL-M5" SCED-52436: name: "Bonus Demo 7" region: "PAL-M5" compat: 5 SCED-52437: - name: "Bonus Demo 7 (alternate)" + name: "Bonus Demo 7" region: "PAL-M5" SCED-52442: name: "Official PlayStation 2 Magazine Demo 45" @@ -2118,6 +2213,8 @@ SCED-52578: name: "Gran Turismo 4 BMW 1 Series Virtual Drive Dealership [Demo]" region: "PAL-M5" gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. SCED-52619: name: "Official PlayStation 2 Magazine Demo 48" @@ -2126,6 +2223,8 @@ SCED-52681: name: "Gran Turismo 4 BMW 1 Series Virtual Drive [Demo]" region: "PAL-M11" gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. SCED-52687: name: "Formula One 04 [Demo]" @@ -2133,6 +2232,13 @@ SCED-52687: SCED-52728: name: "Official PlayStation 2 Magazine Demo 49" region: "PAL-M5" +SCED-52759: + name: "Killzone [Demo]" + region: "PAL-M5" + clampModes: + vuClampMode: 0 # Resolves I Reg Clamping / performance impact and yellow graphics in certain areas. + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness. SCED-52785: name: "Official PlayStation 2 Magazine Demo 50" region: "PAL-M5" @@ -2145,11 +2251,57 @@ SCED-52796: SCED-52818: name: "EyeToy - Chat [Light]" region: "PAL-M11" +SCED-52846: + name: "Killzone [Demo]" + region: "PAL-E" + clampModes: + vuClampMode: 0 # Resolves I Reg Clamping / performance impact and yellow graphics in certain areas. + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness. +SCED-52869: + name: "WRC 4 [Demo]" + region: "PAL-M5" + gameFixes: + - XGKickHack # Fixes SPS. + patches: + default: + content: |- + author=kozarovv + // Proper patch for WRC 4. CRC independent. + // I wrote a small runtime that moves unpacker higher right after emulator boot. + // Seems little bit extensive, but there is no way to make it smaller. + // Solves TLB miss errors which prevented the game from booting. + patch=0,EE,0040000C,double,3c0500603cc70054 + patch=0,EE,00400014,double,24a5001024840010 + patch=0,EE,0040001C,double,7ca6000078860000 + patch=0,EE,00400024,double,000000001487fffb + patch=0,EE,0040002c,double,000000000817fff5 + patch=0,EE,005fffd4,double,3c1c70003c040060 + patch=0,EE,005fffdc,double,3c0700003c067000 + patch=0,EE,005fffe4,double,279c000024840800 + patch=0,EE,005fffec,double,24e7100024c60080 + patch=0,EE,005ffff4,double,00c7e8200818000c + gsHWFixes: + autoFlush: 1 # Fixes car shadows. + roundSprite: 1 # Fixes misalgined text. + halfPixelOffset: 1 # Fixes minor ghosting on objects. +SCED-52880: + name: "WRC 4 - The Official Game of the FIA World Rally Championship [Demo]" + region: "PAL-E" + gameFixes: + - XGKickHack # Fixes SPS. + gsHWFixes: + autoFlush: 1 # Fixes car shadows. + roundSprite: 1 # Fixes misalgined text. + halfPixelOffset: 1 # Fixes minor ghosting on objects. +SCED-52899: + name: "Killzone [Bonus Disc]" + region: "PAL-M5" SCED-52932: - name: "Bonus Demo 8 (old)" + name: "Bonus Demo 8" region: "PAL-M5" SCED-52933: - name: "Bonus Demo 8 (you)" + name: "Bonus Demo 8" region: "PAL-M5" SCED-52935: name: "SingStar Party [Demo]" @@ -2199,16 +2351,6 @@ SCED-53160: SCED-53161: name: "Official PlayStation 2 Magazine Demo 58" region: "PAL-M5" - patches: - 38174DD2: - content: |- - comment=Patch by refraction. Fixes R&C 3 shadows, disable automatic fixes for other games - patch=1,EE,0047df64,word,48418800 - patch=1,EE,0047df68,word,4A39D86C - patch=1,EE,0047df6c,word,48428800 - patch=1,EE,0047df70,word,4A7503BC - patch=1,EE,0047df74,word,4A0002FF - patch=1,EE,0047df78,word,4A0002FF SCED-53162: name: "Official PlayStation 2 Magazine Demo 59" region: "PAL-M5" @@ -2321,13 +2463,13 @@ SCED-53448: name: "Formula One 05 [Demo]" region: "PAL-E" SCED-53513: - name: "Bonus Demo 10 (old)" + name: "Bonus Demo 10" region: "PAL-M5" SCED-53514: - name: "Bonus Demo 10 (you)" + name: "Bonus Demo 10" region: "PAL-M5" SCED-53515: - name: "Bonus Demo 10 (Retail)" + name: "Bonus Demo 10" region: "PAL-M5" SCED-53622: name: "24 - The Game [Demo]" @@ -2337,6 +2479,9 @@ SCED-53622: gsHWFixes: autoFlush: 1 # Fixes pause menu backgrounds. roundSprite: 1 # Corrects proportions of fonts and pause-screen lines, adjusts display closer to software. +SCED-53660: + name: "Jak X & Ratchet Gladiator [Demo]" + region: "PAL" SCED-53679: name: "Fire It Up Lads [Demo]" region: "PAL-E" @@ -2362,6 +2507,15 @@ SCED-53932: SCED-53939: name: "Official PlayStation 2 Magazine Demo 67" # Australian region: "PAL-E" +SCED-53962: + name: "Shadow of the Colossus [Demo]" + region: "PAL-M5" + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. + gsHWFixes: + mipmap: 2 # Fixes Water with Trilinear. + trilinearFiltering: 1 # Fixes Water with Mipmap (Full). + halfPixelOffset: 1 # Fixes misalignments and borders on side. SCED-53978: name: "Official PlayStation 2 Magazine Demo 69" region: "PAL-M5" @@ -2376,7 +2530,7 @@ SCED-54024: content: |- comment=- Castlevania needs VU clamping none and EEclamping extra. SCED-54036: - name: "Official PlayStation 2 Magazine Demo 69/70" + name: "Official PlayStation 2 Magazine Demo 69-70" region: "PAL-M5" SCED-54037: name: "Official PlayStation 2 Magazine Demo 70" @@ -2445,10 +2599,10 @@ SCED-54101: name: "Bonus Demo 11" region: "PAL-M5" SCED-54102: - name: "Bonus Demo 11 (Mature)" + name: "Bonus Demo 11" region: "PAL-M5" SCED-54105: - name: "Bonus Demo 11 (Retail)" + name: "Bonus Demo 11" region: "PAL-M5" SCED-54144: name: "Official PlayStation 2 Magazine Demo 72" # French @@ -2463,7 +2617,7 @@ SCED-54207: name: "Formula One 06 [Demo]" region: "PAL-E" SCED-54338: - name: "Bonus Demo 11 (Teen)" + name: "Bonus Demo 11" region: "PAL-M5" SCED-54403: name: "Official PlayStation 2 Magazine Demo 78" @@ -2528,6 +2682,9 @@ SCED-54605: SCED-54642: name: "Official PlayStation 2 Magazine Demo 82" # German region: "PAL-M5" +SCED-54682: + name: "UPS2 Speciale Platinum 2007" + region: "PAL-M5" SCED-54692: name: "Official PlayStation 2 Magazine Demo 83" # German region: "PAL-E-G" @@ -2567,6 +2724,10 @@ SCES-50000: gsHWFixes: cpuFramebufferConversion: 1 textureInsideRT: 1 + halfPixelOffset: 2 # Fixes title screen and some intro post processing alignment. + roundSprite: 1 # Fixes ui and hud alignment. + gpuPaletteConversion: 2 # Lots of CLUTs in large textures. + cpuCLUTRender: 1 # Fixes car textures. SCES-50001: name: "Tekken Tag Tournament" region: "PAL-M5" @@ -2626,6 +2787,8 @@ SCES-50139: SCES-50240: name: "Extermination" region: "PAL-M5" + gameFixes: + - SoftwareRendererFMVHack # Black FMV. SCES-50241: name: "Bouncer, The" region: "PAL-M6" @@ -2638,7 +2801,7 @@ SCES-50246: region: "PAL-M5" compat: 5 SCES-50293: - name: "ATV Off-Road" + name: "ATV Offroad - All Terrain Vehicle" region: "PAL-M5" SCES-50294: name: "Gran Turismo 3 - A-Spec" @@ -2664,6 +2827,8 @@ SCES-50354: vuClampMode: 2 # Fixes water reflection. gameFixes: - EETimingHack # Fixes flickering graphics. + gsHWFixes: + cpuCLUTRender: 1 # Fixes shadows, object and enemy colours, platform transitions. SCES-50360: name: "Twisted Metal - Black" region: "PAL-M5" @@ -2693,6 +2858,7 @@ SCES-50410: mipmap: 1 roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. SCES-50411: name: "Vampire Night" region: "PAL-M5" @@ -2712,6 +2878,7 @@ SCES-50490: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SCES-50491: name: "Final Fantasy X" region: "PAL-F" @@ -2719,6 +2886,7 @@ SCES-50491: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SCES-50492: name: "Final Fantasy X" region: "PAL-G" @@ -2727,6 +2895,7 @@ SCES-50492: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters.. SCES-50493: name: "Final Fantasy X" region: "PAL-I" @@ -2734,6 +2903,7 @@ SCES-50493: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SCES-50494: name: "Final Fantasy X" region: "PAL-S" @@ -2741,6 +2911,7 @@ SCES-50494: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SCES-50499: name: "Ecco the Dolphin - Defender of the Future" region: "PAL-M5" @@ -2835,9 +3006,11 @@ SCES-50760: mipmap: 1 halfPixelOffset: 1 # Fixes effect misalignment. SCES-50781: - name: "Destruction Derby Arena [Beta, Promo, & Full Retail]" + name: "Destruction Derby Arenas [Beta, Promo, & Full Retail]" region: "PAL-M6" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Corrects shadow position. SCES-50791: name: "Frequency" region: "PAL-M5" @@ -2865,11 +3038,14 @@ SCES-50885: name: "Ape Escape 2" region: "PAL-E" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SCES-50887: name: "Alpine Racer 3" region: "PAL-M5" compat: 5 + gsHWFixes: + deinterlace: 9 # Game requires Adaptive BFF deinterlacing when auto. SCES-50888: name: "Pac-Man World 2" region: "PAL-M5" @@ -2890,7 +3066,7 @@ SCES-50916: gsHWFixes: mipmap: 1 SCES-50917: - name: "Sly Racoon" + name: "Sly Raccoon" region: "PAL-M5" SCES-50928: name: "SOCOM - U.S. Navy SEALs [Beta & Full Release]" @@ -2916,6 +3092,8 @@ SCES-50956: name: "Ferrari F355 Challenge" region: "PAL-M5" compat: 5 + gsHWFixes: + roundSprite: 1 # Fixes text alignment. SCES-50960: name: "Disney's Stitch - Experiment 626" region: "PAL-F-G" @@ -2967,22 +3145,26 @@ SCES-51102: name: "Ape Escape 2" region: "PAL-F" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SCES-51103: name: "Ape Escape 2" region: "PAL-I" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SCES-51104: name: "Ape Escape 2" region: "PAL-G" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SCES-51105: name: "Ape Escape 2" region: "PAL-S" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SCES-51135: name: "Primal" region: "PAL-M5" @@ -2999,11 +3181,12 @@ SCES-51159: gsHWFixes: textureInsideRT: 1 texturePreloading: 1 # Performs much better with partial preload. + halfPixelOffset: 2 # Fixes outlines around characters. SCES-51164: name: "Mark of Kri, The" region: "PAL-M5" gsHWFixes: - deinterlace: 3 # Game requires bob deinterlacing when auto. + deinterlace: 4 # Game requires bob deinterlacing when auto. SCES-51176: name: "Disney's Treasure Planet" region: "PAL-M4" @@ -3041,12 +3224,14 @@ SCES-51248: roundSprite: 1 # Fix line in the sky. preloadFrameData: 1 # Fixes bad textures on Jake. halfPixelOffset: 1 # Fixes double image. + cpuCLUTRender: 1 # Fixes Jake going black in Smellovision. SCES-51426: name: "Getaway, The" region: "PAL-M5" gsHWFixes: textureInsideRT: 1 texturePreloading: 1 # Performs much better with partial preload. + halfPixelOffset: 2 # Fixes outlines around characters. SCES-51428: name: "Shinobi" region: "PAL-M5" @@ -3068,9 +3253,9 @@ SCES-51533: region: "PAL-Unk" gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SCES-51578: name: "Network Access Disc [v1.03 - v6.00]" region: "PAL-M7" @@ -3084,7 +3269,7 @@ SCES-51593: name: "Hardware Online Arena [Beta, Promo & Full Release]" region: "PAL-M4" patches: - 81797E77: + "81797E77": content: |- comment=Reduces chance of game hanging going in-game comment=caused by VU0 integer register being set twice causing bad COP2 timing @@ -3109,12 +3294,12 @@ SCES-51608: compat: 5 gsHWFixes: roundSprite: 1 # Fix line in the sky. - mipmap: 1 - textureInsideRT: 1 - autoFlush: 1 + mipmap: 1 # Fixes broken textures. + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. SCES-51610: - name: "This is Football 2004 (Red Devils 2004)" + name: "This is Football 2004 [Red Devils 2004]" region: "PAL-BE" SCES-51611: name: "This is Football 2004" @@ -3173,6 +3358,8 @@ SCES-51719: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: - "SCES-51719" @@ -3198,7 +3385,7 @@ SCES-51904: - EETimingHack # Get rids of DMA8/9 non-fatal errors. - VIF1StallHack # Fixes broken HUD. SCES-51910: - name: "Arc the Lad - Twilight of the Spirits" + name: "Arc - Twilight of the Spirits" region: "PAL-M5" compat: 5 SCES-51920: @@ -3214,6 +3401,8 @@ SCES-51977: SCES-51979: name: "Destruction Derby Arenas" region: "PAL-M6" + gsHWFixes: + halfPixelOffset: 2 # Corrects shadow position. SCES-52004: name: "Killzone" region: "PAL-M6" @@ -3250,6 +3439,9 @@ SCES-52124: SCES-52154: name: "EyeToy - Chat" region: "PAL-M11" +SCES-52155: + name: "Eredita, L'" + region: "PAL-I" SCES-52156: name: "Ghosthunter - Hunter on the spectres" region: "PAL-M3" @@ -3284,7 +3476,7 @@ SCES-52330: SCES-52389: name: "WRC 4" region: "PAL-M8" - compat: 1 + compat: 5 gameFixes: - XGKickHack # Fixes SPS. patches: @@ -3305,6 +3497,10 @@ SCES-52389: patch=0,EE,005fffe4,double,279c000024840800 patch=0,EE,005fffec,double,24e7100024c60080 patch=0,EE,005ffff4,double,00c7e8200818000c + gsHWFixes: + autoFlush: 1 # Fixes car shadows. + roundSprite: 1 # Fixes misalgined text. + halfPixelOffset: 1 # Fixes minor ghosting on objects. SCES-52405: name: "DJ - Decks & FX - House Edition" region: "PAL-M9" @@ -3327,8 +3523,11 @@ SCES-52424: compat: 5 gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. + texturePreloading: 1 # Performs better than full. patches: 1D54FEA9: content: |- @@ -3362,6 +3561,8 @@ SCES-52438: region: "PAL-M5" compat: 5 gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: #vuClampMode = 2 Text in GT mode works. - "SCES-51719" @@ -3378,6 +3579,8 @@ SCES-52456: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. memcardFilters: # Reads Ratchet 1 & 2 data. - "SCES-52456" - "SCES-51607" @@ -3393,9 +3596,11 @@ SCES-52460: autoFlush: 1 preloadFrameData: 1 # Fixes Sony splash at boot. SCES-52529: - name: "Sly Racoon 2 - Band of Thieves" + name: "Sly 2 - Band of Thieves" region: "PAL-M11" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes chromatic effect. SCES-52530: name: "Crisis Zone" region: "PAL-M5" @@ -3418,6 +3623,8 @@ SCES-52586: name: "Death by Degrees" region: "PAL-E-S" compat: 5 + gsHWFixes: + alignSprite: 1 # Fixes FMV lines. SCES-52596: name: "This is Football 2005" region: "PAL-Unk" @@ -3439,6 +3646,7 @@ SCES-52758: region: "PAL-M6" gsHWFixes: textureInsideRT: 1 + halfPixelOffset: 2 # Fixes outlines on screen edges. SCES-52762: name: "DJ Decks & FX" region: "PAL-F" @@ -3466,7 +3674,7 @@ SCES-52830: SCES-52883: name: "EyeToy - Kinetic" region: "PAL-M7" - compat: 2 + compat: 5 SCES-52892: name: "MotoGP 4" region: "PAL-M5" @@ -3481,12 +3689,13 @@ SCES-52893: SCES-52930: name: "EyeToy - Monkey Mania" region: "PAL-M5" - compat: 2 + compat: 5 SCES-52948: name: "Getaway, The - Black Monday" region: "PAL-M4" gsHWFixes: textureInsideRT: 1 + halfPixelOffset: 2 # Fixes outlines on screen edges. SCES-53033: name: "Formula One 2005" region: "PAL-M7" @@ -3494,10 +3703,14 @@ SCES-53033: SCES-53053: name: "Death by Degrees" region: "PAL-F-I" + gsHWFixes: + alignSprite: 1 # Fixes FMV lines. SCES-53054: name: "Death by Degrees" region: "PAL-E-G" compat: 5 + gsHWFixes: + alignSprite: 1 # Fixes FMV lines. SCES-53055: name: "Eyetoy - Antigrav" region: "PAL-M5" @@ -3507,9 +3720,9 @@ SCES-53133: compat: 5 gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SCES-53178: name: "SingStar Pop" region: "PAL-E" @@ -3548,6 +3761,15 @@ SCES-53247: compat: 5 gameFixes: - XGKickHack # Fixes SPS. + clampModes: + eeClampMode: 2 # Fixes rare bug causing player to respawn when starting the race or during certain car crashes. + patches: + CBBC2E7F: + content: |- + // https://forums.pcsx2.net/Thread-WRC-Rally-Evolved-run-problem?pid=617145#pid617145 + // Fix "Branch 19e00047 in delay slot" which causes extreme slowdowns + // when you crash your car or interact with physics objects + patch=1,EE,003CC894,word,00000000 SCES-53285: name: "Ratchet - Gladiator" region: "PAL-M5" @@ -3557,12 +3779,15 @@ SCES-53285: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCES-53286: name: "Jak X - Combat Racing" region: "PAL-M7" gsHWFixes: roundSprite: 1 # Fix line in the sky. - textureInsideRT: 1 + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. memcardFilters: # Reads Ratchet Gladiator data. - "SCES-53286" @@ -3599,6 +3824,7 @@ SCES-53312: gsHWFixes: alignSprite: 1 # Fixes vertical lines. halfPixelOffset: 1 # Fixes blurriness. + texturePreloading: 1 # Improves performance. SCES-53315: name: "EyeToy - Play 3" region: "PAL-M12" @@ -3609,8 +3835,11 @@ SCES-53326: name: "Shadow of the Colossus" region: "PAL-E" compat: 5 + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes Water with Trilinear. + trilinearFiltering: 1 # Fixes Water with Mipmap (Full). halfPixelOffset: 1 # Fixes misalignments and borders on side. memcardFilters: - "SCES-53326" @@ -3640,7 +3869,7 @@ SCES-53397: name: "SingStar Pop - World Events Code" region: "PAL-Unk" SCES-53409: - name: "Sly 3" + name: "Sly 3 - Honour Among Thieves" region: "PAL-M11" compat: 5 roundModes: @@ -3691,6 +3920,10 @@ SCES-53642: compat: 5 gsHWFixes: preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. + halfPixelOffset: 2 # Fixes misaligned blur. + autoFlush: 1 # Fixes corruption in cutscenes and brightens the image. SCES-53663: name: "Buzz! The Music Quiz" region: "PAL-M3" @@ -3717,6 +3950,8 @@ SCES-53688: - EETimingHack # Mitigates bounciness of vertical shaking but better fix with EE cyclerate +1. gsHWFixes: alignSprite: 1 # Fixes vertical lines. + textureInsideRT: 1 # Fixes corruption. + texturePreloading: 1 # Performs much better with partial preload. SCES-53795: name: "SingStar '80s" region: "PAL-Unk" @@ -3743,7 +3978,7 @@ SCES-53880: name: "Buzz! The Big Quiz" region: "PAL-E" SCES-53881: - name: "Buzz! The Big Quiz" + name: "Buzz! Le Grand Quiz" region: "PAL-F" SCES-53882: name: "Buzz! The Big Quiz" @@ -3802,6 +4037,8 @@ SCES-53931: name: "Shinobido - Way of the Ninja" region: "PAL-M5" compat: 5 + clampModes: + eeClampMode: 3 # Fixes hang going in to the gardens. SCES-53950: name: "F1 '06" region: "PAL-M7" @@ -3817,8 +4054,10 @@ SCES-54041: region: "PAL-M5" gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. memcardFilters: # Reads AC4 and 5 saves for bonus unlockables. - "SCES-54041" - "SCES-50410" @@ -3883,6 +4122,7 @@ SCES-54206: alignSprite: 1 # Fixes water vertical lines. halfPixelOffset: 2 # Fixes misaligned bloom. roundSprite: 1 # Fixes chromatic effect. + autoFlush: 1 # Fixes sun occlusion. SCES-54219: name: "Buzz! Junior - Jungle Party" region: "PAL-M7" @@ -3899,7 +4139,7 @@ SCES-54259: name: "Buzz! The Sports Quiz" region: "PAL-G" SCES-54260: - name: "Buzz! The Sports Quiz" + name: "Buzz! Le Quiz du Sport" region: "PAL-F" SCES-54261: name: "Buzz! The Sports Quiz" @@ -4046,7 +4286,7 @@ SCES-54625: region: "PAL-M7" SCES-54637: name: "Gaelic Games - Hurling" - region: "PAL-M2" + region: "PAL-E-GA" SCES-54638: name: "Gaelic Games - Football 2" region: "PAL-E-GA" @@ -4475,8 +4715,11 @@ SCKA-10006: SCKA-10007: name: "EyeToy - Tales" region: "NTSC-K" +SCKA-20001: + name: "XI Go" + region: "NTSC-K" SCKA-20003: - name: "War of the Monsters - Kaijuu Daigekisen" + name: "War of the Monsters" region: "NTSC-K" SCKA-20004: name: "Sly Cooper and the Thievius Raccoonus" @@ -4506,9 +4749,9 @@ SCKA-20010: region: "NTSC-K" gsHWFixes: roundSprite: 1 # Fix line in the sky. - mipmap: 1 - textureInsideRT: 1 - autoFlush: 1 + mipmap: 1 # Fixes broken textures. + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. SCKA-20011: name: "Ratchet & Clank 2" @@ -4549,6 +4792,7 @@ SCKA-20018: gsHWFixes: textureInsideRT: 1 texturePreloading: 1 # Performs much better with partial preload. + halfPixelOffset: 2 # Fixes outlines around characters. SCKA-20019: name: "Siren" region: "NTSC-K" @@ -4563,6 +4807,8 @@ SCKA-20022: name: "Gran Turismo 4 Prologue" region: "NTSC-K" gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. # Comments from old GameIndex.dbf for this Game. # eeClampMode = 3 Text in races works. @@ -4646,6 +4892,8 @@ SCKA-20037: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. memcardFilters: - "SCKA-20037" - "SCKA-20011" @@ -4673,9 +4921,11 @@ SCKA-20043: name: "Magna Carta" region: "NTSC-K" SCKA-20044: - name: "Sly Cooper 2 Band of Thieves" + name: "Sly 2 - Band of Thieves" region: "NTSC-K" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes chromatic effect. SCKA-20047: name: "Armored Core Nine Breaker" region: "NTSC-K" @@ -4752,6 +5002,7 @@ SCKA-20059: gsHWFixes: alignSprite: 1 # Fixes vertical lines. halfPixelOffset: 1 # Fixes blurriness. + texturePreloading: 1 # Improves performance. SCKA-20060: name: "Ratchet - Deadlocked" region: "NTSC-K" @@ -4760,10 +5011,14 @@ SCKA-20060: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCKA-20061: - name: "Wanda to Kyozou (Shadow of the Colossus)" + name: "Wanda to Kyozou" region: "NTSC-K" compat: 5 + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. gsHWFixes: mipmap: 1 halfPixelOffset: 1 # Fixes misalignments and borders on side. @@ -4778,10 +5033,20 @@ SCKA-20062: region: "NTSC-K" gsHWFixes: preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. + halfPixelOffset: 2 # Fixes misaligned blur. + autoFlush: 1 # Fixes corruption in cutscenes and brightens the image. SCKA-20063: - name: "Sly Cooper 3 Honor Among Thieves" + name: "Sly 3 - Honor Among Thieves" region: "NTSC-K" compat: 5 + roundModes: + vuRoundMode: 0 # Fixes game engine issue with bombs and ladders. + clampModes: + vuClampMode: 2 # Fixes bugged camera. + gsHWFixes: + halfPixelOffset: 2 # Fixes chromatic effect. SCKA-20064: name: "SOCOM 3 - U.S. Navy SEALs" region: "NTSC-K" @@ -4794,6 +5059,8 @@ SCKA-20065: - EETimingHack # Mitigates bounciness of vertical shaking but better fix with EE cyclerate +1. gsHWFixes: alignSprite: 1 # Fixes vertical lines. + textureInsideRT: 1 # Fixes corruption. + texturePreloading: 1 # Performs much better with partial preload. SCKA-20066: name: "EyeToy - Play 3" region: "NTSC-K" @@ -4816,6 +5083,7 @@ SCKA-20070: region: "NTSC-K" gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes HUD artifacts. alignSprite: 1 # Fixes vertical lines. mergeSprite: 1 # Better aligns main menu strips, improving font readability. @@ -4835,7 +5103,7 @@ SCKA-20072: region: "NTSC-K" SCKA-20073: name: "Final Fantasy XII" - region: "NTSC-J" + region: "NTSC-K" SCKA-20078: name: "Killzone [PlayStation 2 Big Hit Series]" region: "NTSC-K" @@ -4860,21 +5128,28 @@ SCKA-20081: gsHWFixes: alignSprite: 1 SCKA-20086: - name: "Shin Onimusha - Dawn of Dreams [Disc1of2]" + name: "Shin Onimusha - Dawn of Dreams [Disc 1 of 2]" region: "NTSC-K" gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. SCKA-20087: - name: "Shin Onimusha - Dawn of Dreams [Disc2of2]" + name: "Shin Onimusha - Dawn of Dreams [Disc 2 of 2]" region: "NTSC-K" gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. memcardFilters: - "SCKA-20086" +SCKA-20089: + name: "BioHazard 4" + region: "NTSC-K" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness. SCKA-20090: name: "God Hand" region: "NTSC-K" @@ -4885,6 +5160,8 @@ SCKA-20090: SCKA-20092: name: "K-1 World Grand Prix 2006" region: "NTSC-K" + gsHWFixes: + deinterlace: 9 # Game requires AdaptiveBFF deinterlacing when auto. speedHacks: InstantVU1SpeedHack: 0 # Fixes random black frames from happening when in a fight session. MTVUSpeedHack: 0 @@ -4898,21 +5175,30 @@ SCKA-20093: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. +SCKA-20095: + name: "Okami" + region: "NTSC-K" + gsHWFixes: + roundSprite: 2 # Reduces misalignment issues but the game is just bad for upscaling. SCKA-20096: name: "Barnyard" region: "NTSC-K" gsHWFixes: - mipmap: 1 + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. SCKA-20098: - name: "Spongebob Squarepants - Creature from the Krusty Krab" + name: "Nickelodeon SpongeBob SquarePants - Creature from the Krusty Krab" region: "NTSC-K" + compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. SCKA-20099: name: "Persona 3" region: "NTSC-K" gsHWFixes: mipmap: 1 SCKA-20101: - name: "Seiken Densetsu 4 (Dawn of Mana)" + name: "Seiken Densetsu 4" region: "NTSC-K" compat: 5 SCKA-20107: @@ -4922,7 +5208,7 @@ SCKA-20109: name: "Persona 3 FES [Independent Starting Version]" region: "NTSC-K" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes flashing windows. memcardFilters: - "SCKA-20109" - "SCKA-20099" @@ -4952,6 +5238,8 @@ SCKA-30001: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. # Comments from old GameIndex.dbf for this Game. # eeClampMode = 3 Text in races works. @@ -4961,9 +5249,9 @@ SCKA-30002: compat: 5 gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SCKA-30006: name: "God of War 2" region: "NTSC-K" @@ -5000,7 +5288,7 @@ SCPN-60160: name: "PlayStation BB Navigator - Version 0.32" region: "NTSC-J" SCPS-11001: - name: "I.Q. Remix" + name: "I.Q. Remix+ - Intelligent Qube" region: "NTSC-J" compat: 5 SCPS-11002: @@ -5038,7 +5326,7 @@ SCPS-11008: region: "NTSC-J" compat: 5 SCPS-11009: - name: "Ka (Mosquito)" + name: "Ka" region: "NTSC-J" compat: 5 gsHWFixes: @@ -5058,11 +5346,11 @@ SCPS-11013: region: "NTSC-J" compat: 5 SCPS-11014: - name: "Pipo Saru (Ape Escape) 2001" + name: "Pipo Saru 2001" region: "NTSC-J" compat: 5 SCPS-11015: - name: "Check-i-TV" + name: "Check-i-TV [Kyou kara Check! Pack]" region: "NTSC-J" SCPS-11016: name: "Seigi no Mikata" @@ -5074,19 +5362,15 @@ SCPS-11018: name: "Yoake no Mariko" region: "NTSC-J" SCPS-11019: - name: "Bravo Music - Chou-Meikyokuban [Limited Edition] [Disc1of2]" + name: "Bravo Music - Chou-Meikyokuban [Genteiban]" region: "NTSC-J" memcardFilters: - "SCPS-11023" - "SCPS-11019" - "SCPS-11020" SCPS-11020: - name: "Bravo Music - Chou-Meikyokuban [Limited Edition] [Disc2of2]" + name: "Otostaz [Taikenban]" region: "NTSC-J" - memcardFilters: - - "SCPS-11023" - - "SCPS-11019" - - "SCPS-11020" SCPS-11021: name: "Yoake no Mariko 2nd Act" region: "NTSC-J" @@ -5181,6 +5465,8 @@ SCPS-15010: SCPS-15011: name: "Extermination" region: "NTSC-J" + gameFixes: + - SoftwareRendererFMVHack # Black FMV. SCPS-15012: name: "Surveillance" region: "NTSC-J" @@ -5241,7 +5527,7 @@ SCPS-15025: region: "NTSC-J" compat: 5 SCPS-15026: - name: "Boku no Natsuyasumi 2" + name: "Boku no Natsuyasumi 2 - Umi no Bouken-hen" region: "NTSC-J" SCPS-15027: name: "PoPoLoCrois - Hajimari no Bouken [Limited]" @@ -5259,6 +5545,8 @@ SCPS-15030: SCPS-15031: name: "Train Simulator Real, The" region: "NTSC-J" + gsHWFixes: + texturePreloading: 1 # Increases performance due to massive hash cache size. SCPS-15032: name: "Formula One 2002" region: "NTSC-J" @@ -5277,6 +5565,8 @@ SCPS-15034: SCPS-15035: name: "Train Simulator Real, The - Keihin Keikyu" region: "NTSC-J" + gsHWFixes: + texturePreloading: 1 # Increases performance due to massive hash cache size. SCPS-15036: name: "Kaitou Sly Cooper" region: "NTSC-J" @@ -5316,7 +5606,7 @@ SCPS-15044: clampModes: vuClampMode: 2 # Fixes bad shadows. SCPS-15045: - name: "Ka (Mosquito) - Let's Go Hawaiian" + name: "Ka 2- Let's Go Hawaiian" region: "NTSC-J" compat: 5 SCPS-15046: @@ -5355,6 +5645,8 @@ SCPS-15055: name: "Gran Turismo 4 - Prologue" region: "NTSC-J" gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: #vuClampMode = 2 Text in GT mode works. - "SCAJ-20066" @@ -5459,7 +5751,6 @@ SCPS-15066: region: "NTSC-J" gsHWFixes: autoFlush: 1 # Reduces post-processing misalignment. - roundSprite: 2 # Reduces post-processing misalignment. SCPS-15067: name: "Dokodemo Issyo - Toro to Nagare Boshi" region: "NTSC-J" @@ -5500,7 +5791,7 @@ SCPS-15078: name: "EyeToy - Uki Uki Panic [Game Only]" region: "NTSC-J" SCPS-15079: - name: "Bakufuu Slash! Kizna Arashi [with Camera]" + name: "Bakufuu Slash! Kizna Arashi [EyeToy Camera Doukonban]" region: "NTSC-J" SCPS-15080: name: "Waga Ryuomiyo - Pride of the Dragon Peace" @@ -5522,6 +5813,8 @@ SCPS-15084: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. memcardFilters: - "SCPS-15084" - "SCPS-15056" @@ -5535,18 +5828,21 @@ SCPS-15086: name: "Bakufuu Slash! Kizna Arashi [Game Only]" region: "NTSC-J" SCPS-15087: - name: "Bleach - Erabareshi Tamashi" + name: "Bleach - Erabareshi Tamashii" region: "NTSC-J" SCPS-15088: - name: "Bokura no Kazoku" + name: "Bokura no Kazoku - My Family Growing Up in the 21st Century" region: "NTSC-J" compat: 5 SCPS-15089: name: "EyeToy - Play 2 [With Camera]" region: "NTSC-J" SCPS-15090: - name: "Sly Racoon 2" + name: "Kaitou Sly Cooper 2" region: "NTSC-J" + compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes chromatic effect. SCPS-15091: name: "Wild ARMs - The 4th Detonator" region: "NTSC-J" @@ -5595,10 +5891,18 @@ SCPS-15096: name: "Saru Get You! 3" region: "NTSC-J" compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. + halfPixelOffset: 2 # Fixes misaligned blur. + autoFlush: 1 # Fixes corruption in cutscenes and brightens the image. SCPS-15097: - name: "Wanda to Kyozou (Shadow of the Colossus)" + name: "Wanda to Kyozou" region: "NTSC-J" compat: 5 + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. gsHWFixes: mipmap: 1 halfPixelOffset: 1 # Fixes misalignments and borders on side. @@ -5621,6 +5925,8 @@ SCPS-15099: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCPS-15100: name: "Ratchet & Clank 4th - GiriGiri Ginga no Giga Battle" region: "NTSC-J" @@ -5629,6 +5935,8 @@ SCPS-15100: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCPS-15101: name: "Bleach - Hanatareshi Yabou" region: "NTSC-J" @@ -5682,15 +5990,17 @@ SCPS-15111: name: "Brave Story - Wataru no Bouken" region: "NTSC-J" SCPS-15112: - name: "Blood+ Souyoku Battle Rinbukyoku" + name: "Blood+ - Souyoku no Battle Rondo" region: "NTSC-J" compat: 5 SCPS-15113: name: "Minna no Tennis" region: "NTSC-J" SCPS-15114: - name: "Soukou Kihei Armodyne" + name: "Kikou Souhei Armodyne" region: "NTSC-J" + speedHacks: + mvuFlagSpeedHack: 0 # Fixes bad graphics. SCPS-15115: name: "Saru Get You - Million Monkeys" region: "NTSC-J" @@ -5706,7 +6016,7 @@ SCPS-15118: name: "Wild ARMs - The Vth Vanguard" region: "NTSC-J" gsHWFixes: - wildArmsHack: 1 # Fixes font artifacts and out-of-bound 2D textures. + cpuFramebufferConversion: 1 # Fixes sepia-tone flashback sequences. SCPS-15119: name: "Bleach - Blade Battlers 2nd" region: "NTSC-J" @@ -5727,6 +6037,8 @@ SCPS-17001: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: - "SCAJ-20066" @@ -5825,6 +6137,8 @@ SCPS-19201: SCPS-19202: name: "Extermination [PlayStation 2 The Best]" region: "NTSC-J" + gameFixes: + - SoftwareRendererFMVHack # Black FMV. SCPS-19203: name: "Dark Cloud [PlayStation 2 The Best]" region: "NTSC-J" @@ -5843,7 +6157,8 @@ SCPS-19206: name: "Ape Escape 2 [PlayStation 2 The Best]" region: "NTSC-J" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SCPS-19207: name: "Popolocrois Story - Hajime no Bouken [PlayStation 2 The Best]" region: "NTSC-J" @@ -5895,6 +6210,8 @@ SCPS-19252: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: - "SCAJ-20066" @@ -5931,6 +6248,8 @@ SCPS-19304: name: "Gran Turismo 4 - Prologue [PlayStation 2 The Best]" region: "NTSC-J" gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: - "SCAJ-20066" @@ -5970,6 +6289,8 @@ SCPS-19309: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCPS-19310: name: "Ratchet & Clank [PlayStation 2 The Best]" region: "NTSC-J" @@ -5980,6 +6301,12 @@ SCPS-19310: SCPS-19311: name: "Saru Get You 3 [PlayStation 2 The Best]" region: "NTSC-J" + gsHWFixes: + preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. + halfPixelOffset: 2 # Fixes misaligned blur. + autoFlush: 1 # Fixes corruption in cutscenes and brightens the image. SCPS-19312: name: "Siren [PlayStation 2 The Best]" region: "NTSC-J" @@ -6024,8 +6351,10 @@ SCPS-19319: name: "Minna no Golf 4 [PlayStation 2 The Best]" region: "NTSC-J" SCPS-19320: - name: "Wanda to Kyozou (Shadow of the Colossus) [PlayStation 2 The Best]" + name: "Wanda to Kyozou [PlayStation 2 The Best]" region: "NTSC-J" + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. gsHWFixes: mipmap: 1 halfPixelOffset: 1 # Fixes misalignments and borders on side. @@ -6037,6 +6366,14 @@ SCPS-19320: - "SCPS-19103" - "SCPS-19151" - "SCPS-55001" +SCPS-19335: + name: "Wanda to Kyozou [PlayStation 2 The Best Reprint]" + region: "NTSC-J" + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. + gsHWFixes: + mipmap: 1 + halfPixelOffset: 1 # Fixes misalignments and borders on side. SCPS-19321: name: "Ratchet & Clank 4th - GiriGiri Ginga no Giga Battle [PlayStation 2 The Best]" region: "NTSC-J" @@ -6045,6 +6382,8 @@ SCPS-19321: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCPS-19322: name: "Wild ARMs - The 4th Detonator [PlayStation 2 The Best - Reprint]" region: "NTSC-J" @@ -6098,6 +6437,8 @@ SCPS-19327: region: "NTSC-J" gsHWFixes: preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SCPS-19328: name: "Ratchet & Clank 4th - GiriGiri Ginga no Giga Battle [PlayStation 2 the Best - Reprint]" region: "NTSC-J" @@ -6106,6 +6447,8 @@ SCPS-19328: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCPS-19329: name: "Bleach - Blade Battlers [PlayStation 2 The Best]" region: "NTSC-J" @@ -6134,6 +6477,8 @@ SCPS-51005: SCPS-51006: name: "Alpine Racer 3" region: "NTSC-J" + gsHWFixes: + deinterlace: 9 # Game requires Adaptive BFF deinterlacing when auto. SCPS-51008: name: "Wave Rally" region: "NTSC-J" @@ -6148,7 +6493,7 @@ SCPS-51011: region: "NTSC-J" compat: 5 gsHWFixes: - deinterlace: 6 # Fixes blurriness. + deinterlace: 7 # Fixes blurriness. SCPS-51012: name: "Gigantic Drive" region: "NTSC-J" @@ -6213,8 +6558,6 @@ SCPS-55008: SCPS-55010: name: "Grandia Xtreme" region: "NTSC-J" - gameFixes: - - SoftwareRendererFMVHack # Flickering in FMV. SCPS-55011: name: "Dual Hearts" region: "NTSC-J" @@ -6239,6 +6582,8 @@ SCPS-55014: SCPS-55015: name: "Zettai Zetsumei Toshi" region: "NTSC-J" + gsHWFixes: + autoFlush: 1 # Fixes incorrect blur effect. SCPS-55016: name: "Jet de Go! 2" region: "NTSC-J" @@ -6298,6 +6643,8 @@ SCPS-55028: SCPS-55029: name: "dot hack - Infection Part 1" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Sharpens world in far distances. memcardFilters: - "SCPS-55029" - "SCPS-55042" @@ -6319,12 +6666,13 @@ SCPS-55031: region: "NTSC-J" SCPS-55032: name: "Fantavision - For You and Me" - region: "NTSC-J" + region: "NTSC-Ch" SCPS-55035: name: "Ape Escape 2" region: "NTSC-J" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SCPS-55038: name: "Pac-Man World 2" region: "NTSC-J" @@ -6462,12 +6810,21 @@ SCPS-56008: SCPS-56009: name: "Smash Court Pro Tournament" region: "NTSC-K" +SCPS-56010: + name: "Downhill Racer" + region: "NTSC-K" SCPS-56011: name: "U - Underwater Unit" region: "NTSC-K" SCPS-56012: name: "Raw Danger" region: "NTSC-K" + gsHWFixes: + cpuCLUTRender: 1 # Fixes some shading/shadows. + autoFlush: 1 # Fixes incorrect blur effect. +SCPS-56013: + name: "This is Football 2003" + region: "NTSC-K" SCPS-56014: name: "Gungrave" region: "NTSC-K" @@ -6498,13 +6855,16 @@ SCUS-21494: halfPixelOffset: 2 # Fixes blurriness. roundSprite: 2 # Fixes blurriness. SCUS-90174: - name: "Toy Story 3 (PlayStation 2 Bundle)" + name: "Toy Story 3 [PlayStation 2 Bundle]" region: "NTSC-U" roundModes: vuRoundMode: 2 # Fixes very minor lines appearing at certain points during the game. SCUS-94346: name: "SingStar Latino" region: "NTSC-U" +SCUS-94677: + name: "989 Sports 2003 Demo Disc" + region: "NTSC-U" SCUS-97097: name: "Network Adapter Start-Up Disc" region: "NTSC-U" @@ -6517,7 +6877,7 @@ SCUS-97102: region: "NTSC-U" compat: 5 SCUS-97104: - name: "ATV Off-Road Fury" + name: "ATV Offroad Fury" region: "NTSC-U" compat: 5 SCUS-97105: @@ -6551,6 +6911,8 @@ SCUS-97112: name: "Extermination" region: "NTSC-U" compat: 5 + gameFixes: + - SoftwareRendererFMVHack # Black FMV. SCUS-97113: name: "ICO" region: "NTSC-U" @@ -6581,10 +6943,10 @@ SCUS-97118: name: "NFL GameDay 2001 [Demo]" region: "NTSC-U" SCUS-97121: - name: "PlayStation Underground 4.4 [Disc2]" + name: "PlayStation Underground 4.4 [Disc 2]" region: "NTSC-U" SCUS-97122: - name: "ATV Off-Road Fury [Demo]" + name: "ATV Offroad Fury [Demo]" region: "NTSC-U" SCUS-97123: name: "Disney's Monsters Inc." @@ -6631,12 +6993,15 @@ SCUS-97132: name: "Kinetica" region: "NTSC-U" compat: 5 + gsHWFixes: + roundSprite: 1 # Fixes vertical lines and minor ghosting. SCUS-97133: name: "Getaway, The" region: "NTSC-U" gsHWFixes: textureInsideRT: 1 texturePreloading: 1 # Performs much better with partial preload. + halfPixelOffset: 2 # Fixes outlines around characters. SCUS-97134: name: "SOCOM - U.S. Navy SEALs" region: "NTSC-U" @@ -6651,7 +7016,7 @@ SCUS-97140: region: "NTSC-U" compat: 5 gsHWFixes: - deinterlace: 3 # Game requires bob deinterlacing when auto. + deinterlace: 4 # Game requires bob deinterlacing when auto. patches: DBD09DD4: content: |- @@ -6743,9 +7108,13 @@ SCUS-97159: SCUS-97160: name: "Extermination [Demo]" region: "NTSC-U" + gameFixes: + - SoftwareRendererFMVHack # Black FMV. SCUS-97161: name: "Kinetica [Demo]" region: "NTSC-U" + gsHWFixes: + roundSprite: 1 # Fixes vertical lines and minor ghosting. SCUS-97163: name: "Jampack Demo Disc - Winter 2001" region: "NTSC-U" @@ -6875,7 +7244,7 @@ SCUS-97201: name: "Mark of Kri, The" region: "NTSC-U" gsHWFixes: - deinterlace: 3 # Game requires bob deinterlacing when auto. + deinterlace: 4 # Game requires bob deinterlacing when auto. SCUS-97203: name: "Wild ARMs 3" region: "NTSC-U" @@ -6913,11 +7282,11 @@ SCUS-97210: name: "Sly Cooper and the Thievius Raccoonus [Demo]" region: "NTSC-U" SCUS-97211: - name: "ATV Off-Road Fury 2" + name: "ATV Offroad Fury 2" region: "NTSC-U" compat: 5 SCUS-97212: - name: "My Street (Online)" + name: "My Street" region: "NTSC-U" compat: 4 gameFixes: @@ -6957,7 +7326,7 @@ SCUS-97222: name: "Mark of Kri [Demo]" region: "NTSC-U" gsHWFixes: - deinterlace: 3 # Game requires bob deinterlacing when auto. + deinterlace: 4 # Game requires bob deinterlacing when auto. SCUS-97223: name: "NFL GameDay 2003 [Demo]" region: "NTSC-U" @@ -6988,7 +7357,7 @@ SCUS-97229: gsHWFixes: roundSprite: 2 # Fixes font artifacts. SCUS-97230: - name: "SOCOM - U.S. Navy SEALs (Online)" + name: "SOCOM - U.S. Navy SEALs" region: "NTSC-U" clampModes: vuClampMode: 2 # Fixes bad shadows. @@ -7001,6 +7370,7 @@ SCUS-97232: region: "NTSC-U" gsHWFixes: textureInsideRT: 1 + halfPixelOffset: 2 # Fixes outlines around characters. SCUS-97233: name: "World Tour Soccer 2003" region: "NTSC-U" @@ -7014,7 +7384,7 @@ SCUS-97236: name: "World Tour Soccer 2003 [Demo]" region: "NTSC-U" SCUS-97238: - name: "ATV Off-Road Fury 2 [Demo]" + name: "ATV Offroad Fury 2 [Demo]" region: "NTSC-U" SCUS-97239: name: "Jet X2O [Demo]" @@ -7113,12 +7483,12 @@ SCUS-97265: compat: 5 gsHWFixes: roundSprite: 1 # Fix line in the sky. - mipmap: 1 - textureInsideRT: 1 - autoFlush: 1 + mipmap: 1 # Fixes broken textures. + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. SCUS-97266: - name: "Final Fantasy XI [Disc1of2]" + name: "Final Fantasy XI [Disc 1 of 2]" region: "NTSC-U" compat: 3 SCUS-97268: @@ -7134,26 +7504,26 @@ SCUS-97268: - "SCUS-97268" - "SCUS-97199" SCUS-97269: - name: "Final Fantasy XI [Disc2of2]" + name: "Final Fantasy XI [Disc 2 of 2]" region: "NTSC-U" compat: 3 SCUS-97270: name: "Kiosk Demo Disc 2.09" region: "NTSC-U" SCUS-97271: - name: "Final Fantasy XI - Online [Beta Version] [Disc1of2]" + name: "Final Fantasy XI - Online [Beta Version] [Disc 1 of 2]" region: "NTSC-U" SCUS-97272: - name: "Final Fantasy XI - Online [Beta Version] [Disc2of2]" + name: "Final Fantasy XI - Online [Beta Version] [Disc 2 of 2]" region: "NTSC-U" SCUS-97273: name: "Jak II [Demo]" region: "NTSC-U" gsHWFixes: roundSprite: 1 # Fix line in the sky. - mipmap: 1 - textureInsideRT: 1 - autoFlush: 1 + mipmap: 1 # Fixes broken textures. + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. SCUS-97274: name: "Jak II [Video Demo]" @@ -7217,7 +7587,7 @@ SCUS-97318: SCUS-97319: name: "EyeToy - Play" region: "NTSC-U" - compat: 2 + compat: 5 SCUS-97321: name: "Kiosk Demo Disc 2.10" region: "NTSC-U" @@ -7260,6 +7630,8 @@ SCUS-97328: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: # Allows car imports from GT3 or something. - "SCUS-97328" @@ -7321,7 +7693,7 @@ SCUS-97342: SCUS-97345: name: "EyeToy - Groove" region: "NTSC-U" - compat: 2 + compat: 5 SCUS-97347: name: "MLB 2006" region: "NTSC-U" @@ -7337,6 +7709,8 @@ SCUS-97353: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. memcardFilters: - "SCUS-97353" - "SCUS-97268" @@ -7383,7 +7757,7 @@ SCUS-97368: - EETimingHack # Get rids of DMA8/9 non-fatal errors. - VIF1StallHack # Fixes broken HUD. SCUS-97369: - name: "ATV Off-Road Fury 2" + name: "ATV Offroad Fury 2" region: "NTSC-U" compat: 5 SCUS-97372: @@ -7399,9 +7773,9 @@ SCUS-97374: - EETimingHack # Fixes SPR errors while going in-game. gsHWFixes: roundSprite: 1 # Fix line in the sky. - mipmap: 1 - textureInsideRT: 1 - autoFlush: 1 + mipmap: 1 # Fixes broken textures. + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. SCUS-97377: name: "Syphon Filter - The Omega Strain [Regular Demo]" @@ -7454,9 +7828,9 @@ SCUS-97399: compat: 5 gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SCUS-97400: name: "EyeToy - Groove" region: "NTSC-U" @@ -7479,9 +7853,11 @@ SCUS-97403: name: "Athens 2004 [Demo]" region: "NTSC-U" SCUS-97405: - name: "ATV Off-Road Fury 3" + name: "ATV Offroad Fury 3" region: "NTSC-U" compat: 5 + speedHacks: + MTVUSpeedHack: 0 # Increases FPS drastically. SCUS-97406: name: "Jampack Demo Disc Vol.10 - Summer 2004 [M-Rated]" region: "NTSC-U" @@ -7494,6 +7870,7 @@ SCUS-97408: compat: 5 gsHWFixes: textureInsideRT: 1 + halfPixelOffset: 2 # Fixes outlines on screen edges. SCUS-97409: name: "Gretzky NHL 2005" region: "NTSC-U" @@ -7510,6 +7887,8 @@ SCUS-97411: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCUS-97412: name: "Jak 3 [Demo]" region: "NTSC-U" @@ -7527,10 +7906,12 @@ SCUS-97413: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCUS-97414: name: "EyeToy - AntiGrav" region: "NTSC-U" - compat: 2 + compat: 5 SCUS-97415: name: "Sly 2 - Band of Thieves [E3 Demo]" region: "NTSC-U" @@ -7582,7 +7963,8 @@ SCUS-97429: compat: 5 gsHWFixes: roundSprite: 1 # Fix line in the sky. - textureInsideRT: 1 + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. memcardFilters: - "SCUS-97429" @@ -7613,6 +7995,8 @@ SCUS-97436: clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. memcardFilters: - "SCUS-97328" @@ -7623,8 +8007,10 @@ SCUS-97436: # Comments from old GameIndex.dbf for this Game. # eeClampMode = 3 Text in races works. SCUS-97437: - name: "ATV Off-Road Fury 3 [Demo]" + name: "ATV Offroad Fury 3 [Demo]" region: "NTSC-U" + speedHacks: + MTVUSpeedHack: 0 # Increases FPS drastically. SCUS-97438: name: "EyeToy - Antigrav [Demo]" region: "NTSC-U" @@ -7641,6 +8027,7 @@ SCUS-97441: region: "NTSC-U" gsHWFixes: textureInsideRT: 1 + halfPixelOffset: 2 # Fixes outlines on screen edges. SCUS-97442: name: "Official U.S. PlayStation Magazine Demo Disc 090" region: "NTSC-U" @@ -7720,6 +8107,8 @@ SCUS-97465: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCUS-97466: name: "Gretzky NHL '06" region: "NTSC-U" @@ -7729,9 +8118,9 @@ SCUS-97467: region: "NTSC-U" gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SCUS-97468: name: "EyeToy - Play 2" region: "NTSC-U" @@ -7747,8 +8136,11 @@ SCUS-97472: name: "Shadow of the Colossus" region: "NTSC-U" compat: 5 + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes Water with Trilinear. + trilinearFiltering: 1 # Fixes Water with Mipmap (Full). halfPixelOffset: 1 # Fixes misalignments and borders on side. memcardFilters: - "SCUS-97472" @@ -7787,7 +8179,7 @@ SCUS-97478: name: "EyeToy - Kinetic" region: "NTSC-U" SCUS-97479: - name: "ATV Off-Road Fury 4" + name: "ATV Offroad Fury 4" region: "NTSC-U" compat: 5 SCUS-97481: @@ -7798,6 +8190,7 @@ SCUS-97481: alignSprite: 1 # Fixes water vertical lines. halfPixelOffset: 2 # Fixes misaligned bloom. roundSprite: 1 # Fixes chromatic effect. + autoFlush: 1 # Fixes sun occlusion. SCUS-97482: name: "God of War II - The Colossus Battle [Demo]" region: "NTSC-U" @@ -7805,12 +8198,15 @@ SCUS-97482: alignSprite: 1 # Fixes water vertical lines. halfPixelOffset: 2 # Fixes misaligned bloom. roundSprite: 1 # Fixes chromatic effect. + autoFlush: 1 # Fixes sun occlusion. SCUS-97483: name: "Gran Turismo 4 MX-5 Edition [Demo]" region: "NTSC-U" clampModes: vuClampMode: 2 # Text in GT mode works. gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 halfPixelOffset: 1 # Fixes weird edge shadows and depth bleed which happens on the edge as well. # Comments from old GameIndex.dbf for this Game. # eeClampMode = 3 Text in races works. @@ -7831,12 +8227,15 @@ SCUS-97485: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCUS-97486: name: "Jak X - Combat Racing [Regular Demo]" region: "NTSC-U" gsHWFixes: roundSprite: 1 # Fix line in the sky. - textureInsideRT: 1 + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. SCUS-97487: name: "Ratchet - Deadlocked [Public Beta v.1]" @@ -7846,13 +8245,16 @@ SCUS-97487: gsHWFixes: mipmap: 1 # Fixes broken textures. disablePartialInvalidation: 1 # Prevents world geometry and some models from vanishing when pausing or opening vendor. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCUS-97488: name: "Jak X - Combat Racing [Public Beta v.1]" region: "NTSC-U" compat: 5 gsHWFixes: roundSprite: 1 # Fix line in the sky. - textureInsideRT: 1 + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. SCUS-97489: name: "SOCOM 3 - U.S. Navy SEALs [Public Beta v.1]" @@ -7904,6 +8306,10 @@ SCUS-97501: compat: 5 gsHWFixes: preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. + halfPixelOffset: 2 # Fixes misaligned blur. + autoFlush: 1 # Fixes corruption in cutscenes and brightens the image. SCUS-97502: name: "Tourist Trophy" region: "NTSC-U" @@ -7919,8 +8325,11 @@ SCUS-97504: SCUS-97505: name: "Shadow of the Colossus [Demo]" region: "NTSC-U" + speedHacks: + InstantVU1SpeedHack: 0 # Alleviates excessive VU load. gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes Water with Trilinear. + trilinearFiltering: 1 # Fixes Water with Mipmap (Full). halfPixelOffset: 1 # Fixes misalignments and borders on side. SCUS-97506: name: "Gretzky NHL '06 [Demo]" @@ -7933,12 +8342,12 @@ SCUS-97509: region: "NTSC-U" gsHWFixes: roundSprite: 1 # Fix line in the sky. - mipmap: 1 - textureInsideRT: 1 - autoFlush: 1 + mipmap: 1 # Fixes broken textures. + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. SCUS-97510: - name: "ATV Off-Road Fury 2 [Greatest Hits]" + name: "ATV Offroad Fury 2 [Greatest Hits]" region: "NTSC-U" SCUS-97511: name: "SOCOM II - U.S. Navy SEALs [Greatest Hits]" @@ -7962,8 +8371,10 @@ SCUS-97513: mipmap: 1 autoFlush: 1 SCUS-97514: - name: "ATV Off-Road Fury 3 [Greatest Hits]" + name: "ATV Offroad Fury 3 [Greatest Hits]" region: "NTSC-U" + speedHacks: + MTVUSpeedHack: 0 # Increases FPS drastically. SCUS-97515: name: "Hot Shots Golf FORE! [Greatest Hits]" region: "NTSC-U" @@ -7985,7 +8396,7 @@ SCUS-97517: clampModes: vuClampMode: 0 # Resolves I Reg Clamping / performance impact and yellow graphics in certain areas. gsHWFixes: - halfPixelOffset: 2 # Fixes blurriness.. + halfPixelOffset: 2 # Fixes blurriness. SCUS-97518: name: "Ratchet & Clank - Up Your Arsenal [Greatest Hits]" region: "NTSC-U" @@ -7994,6 +8405,8 @@ SCUS-97518: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. SCUS-97519: name: "Sly 2 - Band of Thieves [Greatest Hits]" region: "NTSC-U" @@ -8073,6 +8486,10 @@ SCUS-97548: region: "NTSC-U" gsHWFixes: preloadFrameData: 1 # Fixes black background in the pause menu. + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. + halfPixelOffset: 2 # Fixes misaligned blur. + autoFlush: 1 # Fixes corruption in cutscenes and brightens the image. SCUS-97554: name: "NBA '07 featuring The Life Vol.2 [Demo]" region: "NTSC-U" @@ -8122,7 +8539,7 @@ SCUS-97572: preloadFrameData: 1 # Fixes corrupt textures especially on water. disablePartialInvalidation: 1 # Prevents UI and subtitles from disappearing. SCUS-97579: - name: "ATV Off-Road Fury 4 [Demo]" + name: "ATV Offroad Fury 4 [Demo]" region: "NTSC-U" SCUS-97580: name: "SingStar Pop" @@ -8203,6 +8620,8 @@ SCUS-97621: name: "Twisted Metal - Head-On [Extra Twisted Edition]" region: "NTSC-U" compat: 5 + gameFixes: + - VUSyncHack # Fixes black doors on vehicles. patches: 3DC2FE45: content: |- @@ -8363,7 +8782,7 @@ SLAJ-25042: name: "Virtua Fighter - Cyber Generation" region: "NTSC-Unk" SLAJ-25045: - name: "Sakura Taisen V - Episode 0" + name: "Yinghua Dazhan V Episode 0 - Huangye de Shaonu Wushi" region: "NTSC-Ch-J" SLAJ-25046: name: "NBA Live 2005" @@ -8378,19 +8797,27 @@ SLAJ-25049: name: "Kengo 3" region: "NTSC-Unk" SLAJ-25051: - name: "Lord of the Rings - The Third Age" + name: "Lord of the Rings, The - The Third Age" region: "NTSC-Unk" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting in cutscenes. SLAJ-25052: name: "Urbz, The - Sims in the City" region: "NTSC-Unk" + gsHWFixes: + halfPixelOffset: 2 # Fixes upscaling lines. SLAJ-25053: name: "Burnout 3 - Takedown" region: "NTSC-Unk" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLAJ-25055: name: "Def Jam - Fight for N.Y." region: "NTSC-Unk" @@ -8419,10 +8846,14 @@ SLAJ-25066: name: "Burnout Revenge - Battle Racing Ignited" region: "NTSC-Unk" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 0 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLAJ-25066" - "SLPM-66108" @@ -8442,7 +8873,7 @@ SLAJ-25072: halfPixelOffset: 2 # Fix effects upscaling. SLAJ-25073: name: "Resident Evil 4" - region: "NTSC-Unk" + region: "NTSC-J" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: @@ -8452,6 +8883,7 @@ SLAJ-25075: region: "NTSC-Unk" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLAJ-25075" - "SLPM-66232" @@ -8488,12 +8920,16 @@ SLAJ-25078: gsHWFixes: autoFlush: 1 # Properly diffuses light instead of strips of light. roundSprite: 1 # Fixes lighting misalignment such as the street poles and the sun. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. SLAJ-25079: name: "Shin Sangoku Musou 4 - Empires" region: "NTSC-Unk" SLAJ-25080: name: "Godfather, The" region: "NTSC-Unk" + gsHWFixes: + cpuCLUTRender: 1 # Fixes light occlusion. SLAJ-25081: name: "FIFA World Cup - Germany 2006" region: "NTSC-Unk" @@ -8524,10 +8960,14 @@ SLAJ-25094: name: "Burnout Dominator" region: "NTSC-Unk" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLAJ-25095: name: "Medal of Honor - Vanguard" region: "NTSC-Unk" @@ -8554,6 +8994,11 @@ SLED-50117: region: "PAL-E" gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. +SLED-50286: + name: "Red Faction [Demo]" + region: "PAL-E" SLED-50359: name: "Devil May Cry [Demo]" region: "PAL-E" @@ -8561,6 +9006,9 @@ SLED-50359: vuClampMode: 3 # Fixes out of place polys (COP2). gsHWFixes: disablePartialInvalidation: 1 # Fixes corrupt textures. +SLED-50439: + name: "MX 2002 featuring Ricky Carmichael [Demo]" + region: "PAL-E" SLED-50478: name: "WWF Smackdown! - Just Bring It [Demo]" region: "PAL-E" @@ -8572,11 +9020,28 @@ SLED-50488: region: "PAL-E" gameFixes: - VIF1StallHack # Fixes loading hang. +SLED-50489: + name: "Stuntman [Demo]" + region: "PAL-E" + gsHWFixes: + cpuSpriteRenderBW: 4 # Fixes textures. +SLED-50587: + name: "Top Gun - Combat Zones [Demo]" + region: "PAL-E" +SLED-50617: + name: "Burnout [Demo]" + region: "PAL-E" +SLED-50762: + name: "Maximo [Demo]" + region: "PAL-E" SLED-50884: name: "TimeSplitters 2 [Demo]" region: "PAL-E" gsHWFixes: halfPixelOffset: 1 # Fixes texture slight misalignment. +SLED-50895: + name: "Medal of Honor - Frontline [Demo]" + region: "PAL-E" SLED-51062: name: "Fireblade [Demo]" region: "PAL-E" @@ -8585,12 +9050,20 @@ SLED-51211: region: "PAL-Unk" roundModes: vuRoundMode: 1 # Bright lights in cars. +SLED-51212: + name: "V-Rally 3" + region: "PAL-E" + gsHWFixes: + preloadFrameData: 1 # Fixes fog and make lights on cars work again. SLED-51225: name: "Rayman 3 [Demo]" region: "PAL-E" SLED-51281: name: "Haven - Call of the King [Demo]" region: "PAL-E" + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLED-51342: name: "FIFA Soccer 2003 [Demo]" region: "PAL-E" @@ -8603,6 +9076,9 @@ SLED-51901: vuClampMode: 2 # Respawn issues, Fixes SPS, avoids teleporting characters. gsHWFixes: alignSprite: 1 # Fixes vertical lines. +SLED-52326: + name: "007 - Everything or Nothing [Demo]" + region: "PAL-E" SLED-52375: name: "Fight Night 2004 [Demo]" region: "PAL-E" @@ -8633,6 +9109,8 @@ SLED-52476: SLED-52485: name: "Alias [Demo]" region: "PAL-E" + gsHWFixes: + cpuCLUTRender: 1 # Fixes lights penetrating objects. SLED-52488: name: "Suffering, The [Demo]" region: "PAL-E" @@ -8641,9 +9119,23 @@ SLED-52488: SLED-52597: name: "Burnout 3 - Takedown [Demo]" region: "PAL-E" + clampModes: + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). +SLED-52852: + name: "Forgotten Realms - Demon Stone [Demo]" + region: "PAL-E" + clampModes: + vuClampMode: 3 # Removes occasional SPS where the head goes into nightmare fuel. + gsHWFixes: + halfPixelOffset: 1 # Reduces ghosting. + roundSprite: 1 # Reduces ghosting even more. SLED-52875: name: "Sega Superstars [Demo]" region: "PAL-E" @@ -8654,6 +9146,13 @@ SLED-52890: - GIFFIFOHack # Partially fixes graphical issues also needs EE cycle rate + 3. gsHWFixes: mipmap: 1 +SLED-52899: + name: "Killzone [Bonus Disc]" + region: "PAL-M5" + clampModes: + vuClampMode: 0 # Resolves I Reg Clamping / performance impact and yellow graphics in certain areas. + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness. SLED-52929: name: "Prince of Persia - Warrior Within [Demo]" region: "PAL-M5" @@ -8665,9 +9164,38 @@ SLED-53083: region: "PAL-M5" clampModes: vuClampMode: 3 # Fixes lighting on character models as caves and other locations don't turn mobs into glow-in-the-dark creatures by themselves. +SLED-53097: + name: "Worms 4 - Mayhem [Demo]" + region: "PAL-M5" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLED-53109: name: "Juiced [Demo]" region: "PAL-M5" + speedHacks: + InstantVU1SpeedHack: 0 # Significantly improves game speed. +SLED-53445: + name: "Incredible Hulk, The - Ultimate Destruction [Demo]" + region: "PAL-M3" + gsHWFixes: + mipmap: 2 # Mipmap + trilinear, fixes textures. + trilinearFiltering: 1 +SLED-53512: + name: "Burnout Revenge [Demo]" + region: "PAL-E" + compat: 5 + clampModes: + vuClampMode: 0 # Fixes buggy lighting in the garage. + gsHWFixes: + halfPixelOffset: 2 # Fixes depth lines. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). +SLED-53537: + name: "187 - Ride or Die [Demo]" + region: "PAL-E" SLED-53673: name: "007 - From Russia with Love [Demo]" region: "PAL-E" @@ -8708,6 +9236,8 @@ SLED-53937: gsHWFixes: autoFlush: 1 # Properly diffuses light instead of strips of light. roundSprite: 1 # Fixes lighting misalignment such as the street poles and the sun. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. SLED-53951: name: "Honda Demo [Demo]" region: "PAL-E" @@ -8721,6 +9251,9 @@ SLED-53983: region: "PAL" gameFixes: - GIFFIFOHack # Fixes flag corruption. +SLED-54032: + name: "Sonic Riders [Demo]" + region: "PAL-E" SLED-54035: name: "Play the Best Demos from Atari [Demo]" region: "PAL-M5" @@ -8736,7 +9269,7 @@ SLES-50003: name: "Swap Magic DVD Disc v2.0" region: "PAL-Unk" SLES-50009: - name: "Action Replay MAX" + name: "Wild Wild Racing" region: "PAL-M5" compat: 5 SLES-50010: @@ -8866,6 +9399,27 @@ SLES-50048: name: "Donald Duck - Quack Attack" region: "PAL-M5" compat: 5 + patches: + F34ECBDC: + content: |- + author=refraction + comment=fixes lighting problems due to COP2 instruction order. + patch=1,EE,0032FD44,word,4BE09DDC + patch=1,EE,0032FD48,word,4A0303BD + patch=1,EE,0032FD60,word,4B000120 + patch=1,EE,0032FD64,word,4A0903BD + patch=1,EE,0032FD7C,word,4B0002A0 + patch=1,EE,0032FD80,word,4A6403BC + patch=1,EE,0032FD98,word,4BE0095C + patch=1,EE,0032FD9C,word,4A6A03BC + patch=1,EE,0032FDB4,word,4BE03ADC + patch=1,EE,0032FDB8,word,4A0F03BD + patch=1,EE,0032FDD0,word,4B000420 + patch=1,EE,0032FDD4,word,4A1503BD + patch=1,EE,0032FDEC,word,4B0005A0 + patch=1,EE,0032FDF0,word,4A7003BC + patch=1,EE,0032FE08,word,4BE06C5C + patch=1,EE,0032FE0C,word,4A7603BC SLES-50050: name: "Evergrace" region: "PAL-M5" @@ -8875,6 +9429,8 @@ SLES-50051: region: "PAL-E" roundModes: eeRoundMode: 0 # Fixes FPU errors causing instant death in Limestone Cave. + gsHWFixes: + disablePartialInvalidation: 1 # Fixes graphics issues. SLES-50052: name: "Pool Master" region: "PAL-M3" @@ -8944,6 +9500,7 @@ SLES-50073: region: "PAL-M5" gsHWFixes: textureInsideRT: 1 + roundSprite: 1 # Fixes font misalignment when upscaling. SLES-50074: name: "Unreal Tournament" region: "PAL-M5" @@ -8989,6 +9546,8 @@ SLES-50110: SLES-50111: name: "Zone of the Enders" region: "PAL-M4" + gsHWFixes: + gpuPaletteConversion: 2 # Improves FPS and reduces HC size. SLES-50112: name: "Shadow of Memories" region: "PAL-M5" @@ -9147,12 +9706,14 @@ SLES-50179: SLES-50182: name: "MTV Music Generator 2" region: "PAL-M5" + gsHWFixes: + roundSprite: 1 # Fixes font artifacts. SLES-50183: name: "Wacky Races" region: "PAL-M5" compat: 5 SLES-50185: - name: "Alone in the Dark 4" + name: "Alone in the Dark - The New Nightmare" region: "PAL-M5" compat: 5 SLES-50186: @@ -9166,7 +9727,7 @@ SLES-50191: name: "Army Men - Green Rogue" region: "PAL-M5" SLES-50192: - name: "Army Men - Sarges Heroes 2" + name: "Army Men - Sarge's Heroes 2" region: "PAL-M5" compat: 5 SLES-50193: @@ -9174,7 +9735,7 @@ SLES-50193: region: "PAL-E" compat: 5 SLES-50194: - name: "4x4 Evolution" + name: "4x4 Evo" region: "PAL-M3" SLES-50195: name: "UEFA Challenge" @@ -9233,7 +9794,7 @@ SLES-50213: name: "NFL Quarterback Club 2002" region: "PAL-E" SLES-50214: - name: "18 Wheeler" + name: "18 Wheeler - American Pro Trucker" region: "PAL-M4" compat: 5 SLES-50215: @@ -9268,7 +9829,7 @@ SLES-50226: name: "Escape from Monkey Island 4" region: "PAL-F" SLES-50227: - name: "Escape from Monkey Island (Flucht von Monkey Island)" + name: "Flucht von Monkey Island" region: "PAL-G" compat: 5 SLES-50228: @@ -9283,6 +9844,8 @@ SLES-50230: compat: 5 gameFixes: - XGKickHack # Fixes SPS. + gsHWFixes: + roundSprite: 1 # Fixes gaps in menu. SLES-50231: name: "International League Soccer" region: "PAL-M5" @@ -9302,6 +9865,8 @@ SLES-50247: name: "Onimusha - Warlords" region: "PAL-M3" compat: 5 + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLES-50248: name: "MDK 2 - Armageddon" region: "PAL-M5" @@ -9535,7 +10100,7 @@ SLES-50351: region: "PAL-M3" compat: 5 SLES-50355: - name: "Batman Vengeance" + name: "Batman - Vengeance" region: "PAL-M6" gameFixes: - EETimingHack # Fixes video speed. @@ -9597,18 +10162,24 @@ SLES-50383: compat: 5 gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. SLES-50384: name: "Metal Gear Solid 2 - Sons of Liberty" region: "PAL-I" gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. SLES-50385: name: "Metal Gear Solid 2 - Sons of Liberty" region: "PAL-S" gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. SLES-50386: - name: "Crash Bandicoot - Wrath of Cortex" + name: "Crash Bandicoot - The Wrath of Cortex" region: "PAL-M6" compat: 5 gsHWFixes: @@ -9664,6 +10235,8 @@ SLES-50423: name: "F1 2001" region: "PAL-M4" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLES-50424: name: "Cricket 2002" region: "PAL-E" @@ -9689,6 +10262,8 @@ SLES-50430: SLES-50431: name: "F1 2001" region: "PAL-S" + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLES-50432: name: "Tony Hawk Pro Skater 3" region: "PAL-Unk" @@ -9731,7 +10306,7 @@ SLES-50446: InstantVU1SpeedHack: 0 # Fixes SPS. MTVUSpeedHack: 0 SLES-50447: - name: "All-Star Baseball 2003" + name: "All-Star Baseball 2003 featuring Derek Jeter" region: "PAL-E" SLES-50451: name: "NHL Hitz 2002" @@ -9784,7 +10359,7 @@ SLES-50479: gsHWFixes: textureInsideRT: 1 # Fixes underwater levels. SLES-50480: - name: "Aggressive Inline Skating" + name: "Aggressive Inline" region: "PAL-M4" compat: 5 SLES-50481: @@ -9810,7 +10385,7 @@ SLES-50496: name: "Qui veut gagner des millions – Seconde Edition" region: "PAL-F" SLES-50497: - name: "Who Wants to be a Millionaire 2 (Wer wird Millionar 2)" + name: "Wer wird Millionaer 2" region: "PAL-G" SLES-50498: name: "Grandia II" @@ -9873,7 +10448,7 @@ SLES-50538: name: "NBA Live 2002" region: "PAL-S" SLES-50539: - name: "James Bond 007 - Agent Under Fire" + name: "007 - Agent Under Fire" region: "PAL-M6" clampModes: vuClampMode: 2 # Fixes corrupt textures. @@ -9881,7 +10456,7 @@ SLES-50540: name: "Simpsons Road Rage" region: "PAL-E" SLES-50541: - name: "Capcom vs. SNK 2 - Mark of the Millennium" + name: "Capcom vs. SNK 2 - Mark of the Millennium 2001" region: "PAL-E" SLES-50544: name: "Jet Ion GP" @@ -9986,6 +10561,9 @@ SLES-50591: SLES-50592: name: "No One Lives Forever" region: "PAL-M5" + gsHWFixes: + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending and also needs Full Blending to fix the lighting. SLES-50606: name: "State of Emergency" region: "PAL-M4" @@ -10020,9 +10598,6 @@ SLES-50631: SLES-50632: name: "Dragon Rage" region: "PAL-I-S" -SLES-50633: - name: "Gitaroo Man" - region: "PAL-Unk" SLES-50636: name: "Centre Court - Hard Hitter" region: "PAL-M3" @@ -10070,11 +10645,21 @@ SLES-50652: SLES-50653: name: "Gitaroo Man" region: "PAL-M3" + compat: 5 + roundModes: + eeRoundMode: 1 + vuRoundMode: 3 + patches: + default: + content: |- + author=boringhexi + // fix stage 4 flashing triangles + patch=0,EE,00102dd0,word,00000000 SLES-50654: name: "Dune, Frank Herbert's" region: "PAL-M5" SLES-50661: - name: "Atlantis III" + name: "Atlantis III - The New World" region: "PAL-M3" gsHWFixes: roundSprite: 1 # Fixes font artifacts. @@ -10130,10 +10715,10 @@ SLES-50705: name: "GoDai - Elemental Force" region: "PAL-I-S" SLES-50706: - name: "Army Men - Real Time Strategy" + name: "Army Men - RTS" region: "PAL-M4" SLES-50709: - name: "Weakest Link (Le Maillon Fable)" + name: "Le Maillon Fable" region: "PAL-F" SLES-50710: name: "Dr. Muto" @@ -10158,6 +10743,8 @@ SLES-50713: SLES-50714: name: "Defender" region: "PAL-M5" + gameFixes: + - InstantDMAHack # Fixes bad UI positioning. SLES-50715: name: "Gravity Games Bike Street - Vertical Dirt" region: "PAL-M5" @@ -10189,6 +10776,8 @@ SLES-50725: name: "V-Rally 3" region: "PAL-M5" compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes fog and make lights on cars work again. SLES-50726: name: "Myst III - Exile" region: "PAL-M6" @@ -10224,6 +10813,7 @@ SLES-50731: vuClampMode: 2 # White textures. gsHWFixes: halfPixelOffset: 1 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes "Busted" scenes. SLES-50735: name: "Jade Cocoon 2" region: "PAL-E" @@ -10284,9 +10874,13 @@ SLES-50771: name: "Blood Omen 2 - Legend of Kain" region: "PAL-E" compat: 5 + gsHWFixes: + mipmap: 1 # Fixes glitching textures. SLES-50772: name: "Blood Omen 2 - Legend of Kain" region: "PAL-M3" + gsHWFixes: + mipmap: 1 # Fixes glitching textures. SLES-50773: name: "Donald Duck Phantomias Platyrhynchos Kineticus" region: "PAL-M5" @@ -10346,22 +10940,22 @@ SLES-50795: name: "Superman - Shadow of Apokolips" region: "PAL-M5" SLES-50796: - name: "FIFA World Cup 2002" + name: "2002 FIFA World Cup" region: "PAL-E-SW" SLES-50797: - name: "FIFA World Cup 2002" + name: "Coupe du Monde FIFA 2002" region: "PAL-F" SLES-50798: - name: "FIFA World Cup 2002" + name: "FIFA Fussball Weltmeisterschaft 2002" region: "PAL-G" compat: 5 gameFixes: - EETimingHack SLES-50799: - name: "FIFA World Cup 2002" + name: "Mondiali FIFA 2002" region: "PAL-I" SLES-50800: - name: "FIFA World Cup 2002" + name: "Mundial FIFA 2002" region: "PAL-S" SLES-50801: name: "FIFA World Cup 2002" @@ -10375,18 +10969,38 @@ SLES-50803: SLES-50804: name: "Deus Ex" region: "PAL-E" + gsHWFixes: + roundSprite: 1 # Fixes lines in HUD and text boxes. + texturePreloading: 1 # Performs much better with partial. + preloadFrameData: 1 # Fixes loading screen images being cut off two thirds. SLES-50805: name: "Deus Ex" region: "PAL-G" + gsHWFixes: + roundSprite: 1 # Fixes lines in HUD and text boxes. + texturePreloading: 1 # Performs much better with partial. + preloadFrameData: 1 # Fixes loading screen images being cut off two thirds. SLES-50806: name: "Deus Ex" region: "PAL-F" + gsHWFixes: + roundSprite: 1 # Fixes lines in HUD and text boxes. + texturePreloading: 1 # Performs much better with partial. + preloadFrameData: 1 # Fixes loading screen images being cut off two thirds. SLES-50807: name: "Deus Ex" region: "PAL-I" + gsHWFixes: + roundSprite: 1 # Fixes lines in HUD and text boxes. + texturePreloading: 1 # Performs much better with partial. + preloadFrameData: 1 # Fixes loading screen images being cut off two thirds. SLES-50808: name: "Deus Ex" region: "PAL-S" + gsHWFixes: + roundSprite: 1 # Fixes lines in HUD and text boxes. + texturePreloading: 1 # Performs much better with partial. + preloadFrameData: 1 # Fixes loading screen images being cut off two thirds. SLES-50809: name: "Next Generation Tennis" region: "PAL-M6" @@ -10403,6 +11017,8 @@ SLES-50814: SLES-50815: name: "Blood Omen 2 - Legend of Kain" region: "PAL-G" + gsHWFixes: + mipmap: 1 # Fixes glitching textures. SLES-50816: name: "DTM Race Driver" region: "PAL-M3" @@ -10552,7 +11168,7 @@ SLES-50849: name: "Urban Freestyle Soccer" region: "PAL-M5" SLES-50850: - name: "ATV Off-Road 2" + name: "ATV - Quad Power Racing 2" region: "PAL-M5" SLES-50852: name: "Sven-Goran Eriksson's World Challenge" @@ -10594,9 +11210,13 @@ SLES-50874: name: "F1 2002" region: "PAL-M4" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLES-50875: name: "F1 2002" region: "PAL-I" + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLES-50876: name: "Driv3r" region: "PAL-M5" @@ -10605,6 +11225,8 @@ SLES-50876: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: autoFlush: 1 + halfPixelOffset: 2 # Fixes misaligned lighting. + cpuCLUTRender: 1 # Fixes janky coloured cars. SLES-50877: name: "TimeSplitters 2" region: "PAL-M5" @@ -10616,7 +11238,7 @@ SLES-50879: region: "PAL-M5" compat: 5 gameFixes: - - FpuNegDivHack # Fixes sky being shown over the 3d. + - FpuNegDivHack # Fixes sky being shown over the 3D. SLES-50880: name: "BMX XXX" region: "PAL-M4" @@ -10639,6 +11261,9 @@ SLES-50897: name: "Super Trucks" region: "PAL-M6" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Gets rid of fog line. + roundSprite: 1 # Fixes lines in FMVs. SLES-50898: name: "X-Men - The Next Dimension" region: "PAL-E" @@ -10681,6 +11306,9 @@ SLES-50920: name: "King's Field IV" region: "PAL-M5" compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes invisible lava, there is another issue that needs skipdraw 1 for blurry font but it removes much brightness. + halfPixelOffset: 2 # Fixes font rendering. patches: 401F4726: content: |- @@ -10731,8 +11359,10 @@ SLES-50948: name: "Britney's Dance Beat" region: "PAL-M3" SLES-50953: - name: "Air Rescue Ranger" + name: "Air Ranger - Rescue Helicopter" region: "PAL-E" + gameFixes: + - VUSyncHack # Fixes graphics. SLES-50954: name: "Tokyo Road Race" region: "PAL-E" @@ -10767,7 +11397,7 @@ SLES-50975: region: "PAL-M4" compat: 5 SLES-50976: - name: "Thing, The (Das Ding)" + name: "Das Ding" region: "PAL-G" compat: 5 SLES-50978: @@ -10781,10 +11411,14 @@ SLES-50984: name: "Gumball 3000" region: "PAL-E" compat: 5 + speedHacks: + MTVUSpeedHack: 0 # Stops crashing and terrible speeds. SLES-50985: name: "Gumball 3000" region: "PAL-M5" compat: 5 + speedHacks: + MTVUSpeedHack: 0 # Stops crashing and terrible speeds. SLES-50986: name: "Twin Caliber" region: "PAL-M4" @@ -10793,7 +11427,7 @@ SLES-50987: name: "Scorpion King, The - Rise of an Akkadian" region: "PAL-M5" SLES-50988: - name: "Lord of the Rings, The - The Fellowship of the Ring (Der Herr der Ringe - Die Gefahrten)" + name: "Lord of the Rings, The - The Fellowship of the Ring" region: "PAL-M5" SLES-50992: name: "Hitman 2 - Silent Assassin" @@ -10916,7 +11550,7 @@ SLES-51058: speedHacks: mvuFlagSpeedHack: 0 SLES-51060: - name: "Butt Ugly Martians" + name: "Butt-Ugly Martians - Zoom or Doom!" region: "PAL-M5" clampModes: vuClampMode: 0 # Fixes SPS. @@ -10927,6 +11561,8 @@ SLES-51061: SLES-51063: name: "Hot Wheels - Velocity X - Maximum Justice" region: "PAL-E" + gsHWFixes: + halfPixelOffset: 2 # Fixes the fog line. SLES-51064: name: "Gladius" region: "PAL-M3" @@ -10953,44 +11589,44 @@ SLES-51073: name: "RTX Red Rock" region: "PAL-S" SLES-51076: - name: "Liverpool FC - Club Football" + name: "Club Football - Liverpool FC" region: "PAL-E" SLES-51077: - name: "Club Football Real Madrid" + name: "Club Football - Real Madrid" region: "PAL-M6" SLES-51078: - name: "FC Barcelona - Club Football" + name: "Club Football - FC Barcelona" region: "PAL-M4" compat: 5 SLES-51079: - name: "Ajax Club Football" + name: "Club Football - Ajax Amsterdam" region: "PAL-M4" SLES-51080: - name: "AC Milan Club Football" + name: "Club Football - AC Milan" region: "PAL-M3" SLES-51081: - name: "Club Football - Juventus 2003-2004 Season" + name: "Club Football - Juventus" region: "PAL-M3" SLES-51082: - name: "Hamburger SV Club Football - Saison 2003-2004" + name: "Club Football - Hamburger SV" region: "PAL-G" SLES-51083: - name: "Borussia Dortmund Club Football - Saison 2003-2004" + name: "Club Football - Borussia Dortmund" region: "PAL-G" SLES-51084: - name: "BDFL Manager 2004" + name: "Club Football - FC Bayern München" region: "PAL-M3" SLES-51085: - name: "Aston Villa - Club Football" + name: "Club Football - Aston Villa" region: "PAL-E" SLES-51086: - name: "Club Football - Chelsea" + name: "Club Football - Chelsea FC" region: "PAL-E" SLES-51087: - name: "Leeds United - Club Football" + name: "Club Football - Leeds United" region: "PAL-E" SLES-51088: - name: "Club Football - Rangers" + name: "Club Football - Rangers FC" region: "PAL-E" SLES-51089: name: "Club Football - Arsenal" @@ -11003,7 +11639,7 @@ SLES-51093: region: "PAL-M4" compat: 5 SLES-51094: - name: "FC Internazionale - Club Football" + name: "Club Football - FC Internazionale" region: "PAL-M3" SLES-51095: name: "Dino Stalker" @@ -11012,7 +11648,7 @@ SLES-51096: name: "Dino Stalker" region: "PAL-G" SLES-51100: - name: "Club Football - Liverpool - 2003-2004 Season" + name: "Club Football - Liverpool FC" region: "PAL-M6" SLES-51101: name: "Eggo Mania" @@ -11156,7 +11792,7 @@ SLES-51162: name: "Metropolismania" region: "PAL-E" SLES-51168: - name: "AFL Live 2004 - Aussie Rules Football" + name: "AFL Live 2003" region: "PAL-E" compat: 5 SLES-51174: @@ -11239,7 +11875,7 @@ SLES-51198: clampModes: vuClampMode: 2 # Missing geometry with microVU. SLES-51199: - name: "4x4 Evolution II" + name: "4x4 Evo 2" region: "PAL-M3" SLES-51200: name: "Kelly Slater's Pro Surfer" @@ -11267,6 +11903,9 @@ SLES-51209: name: "Haven - Call of the King" region: "PAL-M5" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLES-51214: name: "Harry Potter og Hemmelighedernes Kammer" region: "PAL-D" @@ -11316,9 +11955,11 @@ SLES-51219: mipmap: 1 cpuFramebufferConversion: 1 # Fixes right side of the screen from garbage textures. SLES-51220: - name: "Ty - The Tazmanian Tiger" + name: "TY the Tasmanian Tiger" region: "PAL-M5" compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLES-51222: name: "Rayman 3 - Hoodlum Havoc" region: "PAL-M5" @@ -11343,6 +11984,8 @@ SLES-51227: patch=1,EE,001db3a4,word,4bc529ff gameFixes: - SoftwareRendererFMVHack # Fixes garbage pixels. + gsHWFixes: + autoFlush: 1 # Fixes lava effect. SLES-51229: name: "Virtua Cop - Elite Edition" region: "PAL-M5" @@ -11350,14 +11993,19 @@ SLES-51229: SLES-51230: name: "Minority Report" region: "PAL-E" + gsHWFixes: + cpuCLUTRender: 1 # Fixes light bleed through objects. SLES-51232: name: "Virtua Tennis 2" region: "PAL-M4" compat: 5 gameFixes: - XGKickHack # Fixes black models on certain games in World Tour. + gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 SLES-51233: - name: "DragonBall Z - Budokai" + name: "Dragon Ball Z - Budokai" region: "PAL-M4" compat: 5 gsHWFixes: @@ -11367,7 +12015,7 @@ SLES-51235: region: "PAL-M5" compat: 5 gsHWFixes: - deinterlace: 6 # Fixes blurriness. + deinterlace: 7 # Fixes blurriness. SLES-51236: name: "Gungrave" region: "PAL-M3" @@ -11401,12 +12049,12 @@ SLES-51252: clampModes: vuClampMode: 3 # Fix white shiny weapons. SLES-51253: - name: "Lord of the Rings, The - The Two Towers (Seigneur des Anneaux - Les Deux Tours)" + name: "Seigneur des Anneaux - Les Deux Tours" region: "PAL-F" clampModes: vuClampMode: 3 # Fix white shiny weapons. SLES-51254: - name: "Lord of the Rings, The - The Two Towers (Der Herr der Ringe - Die Zwei Turme)" + name: "Der Herr der Ringe - Die Zwei Tuerme" region: "PAL-G" clampModes: vuClampMode: 3 # Fix white shiny weapons. @@ -11416,28 +12064,32 @@ SLES-51255: clampModes: vuClampMode: 3 # Fix white shiny weapons. SLES-51256: - name: "Lord of the Rings, The - The Two Towers (El Senor de Los Anillos - Las Dos Torres)" + name: "El Senor de Los Anillos - Las Dos Torres" region: "PAL-S" compat: 5 clampModes: vuClampMode: 3 # Fix white shiny weapons. SLES-51257: - name: "Sims, The (Die Sims)" + name: "Die Sims" region: "PAL-G" compat: 3 speedHacks: MTVUSpeedHack: 0 # Fixes bad graphics due to bad T-Bit handling. SLES-51258: - name: "James Bond 007 - Nightfire" + name: "007 - Nightfire" region: "PAL-M5" clampModes: vuClampMode: 2 # Fixes polygon clipping in driving missions. + gsHWFixes: + halfPixelOffset: 2 # Fixes fog lines in the distance. SLES-51260: - name: "James Bond 007 - Nightfire" + name: "007 - Nightfire" region: "PAL-G-S" compat: 5 clampModes: vuClampMode: 2 # Fixes polygon clipping in driving missions. + gsHWFixes: + halfPixelOffset: 2 # Fixes fog lines in the distance. SLES-51265: name: "Dynasty Warriors Tactics" region: "PAL-E" @@ -11501,7 +12153,7 @@ SLES-51292: region: "PAL-M5" compat: 4 patches: - 9fccacb5: + 9FCCACB5: content: |- author=PSI // The game allocates a VIF DMA buffer on the stack and sends it, returns from the function, then calls another function to wait for the transfer to end. @@ -11527,6 +12179,8 @@ SLES-51298: SLES-51301: name: "SOS - The Final Escape" region: "PAL-M3" + gsHWFixes: + autoFlush: 1 # Fixes incorrect blur effect. SLES-51302: name: "Bomberman Kart" region: "PAL-M3" @@ -11561,9 +12215,13 @@ SLES-51316: SLES-51317: name: "Minority Report" region: "PAL-F" + gsHWFixes: + cpuCLUTRender: 1 # Fixes light bleed through objects. SLES-51318: name: "Minority Report" region: "PAL-G" + gsHWFixes: + cpuCLUTRender: 1 # Fixes light bleed through objects. SLES-51322: name: "Robotech Battlecry" region: "PAL-M5" @@ -11602,25 +12260,29 @@ SLES-51347: region: "PAL-M4" compat: 5 gsHWFixes: - mipmap: 1 # Reduces noisey textures. + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 SLES-51348: name: "Die Hard - Vendetta" region: "PAL-E-G" compat: 5 gsHWFixes: - mipmap: 1 # Reduces noisey textures. + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 SLES-51349: name: "Evolution Skateboarding" region: "PAL-M3" SLES-51350: - name: "Ben Hur" + name: "Ben Hur - Blood of Braves" region: "PAL-M5" SLES-51354: name: "Jurassic Park - Operation Genesis" region: "PAL-M5" compat: 5 gsHWFixes: - mipmap: 1 + autoFlush: 1 # Fixes glows. + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. + textureInsideRT: 1 # Fixes rainbow lighting for some areas. SLES-51355: name: "Big Mutha Truckers" region: "PAL-M5" @@ -11724,9 +12386,12 @@ SLES-51392: patches: C24C7FE3: content: |- - author=kozarovv - // Skip PSS movies, workaround for EE Cache requirement. - patch=1,EE,001233e0,word,100000d7 + author=Goatman13 + // Fix issues caused by PSS video playback. + // Extend stack to avoid sending bad data to VIF1. + // Required due to lack of data cache emulation. + patch=1,EE,00122E60,word,27BDFD00 + patch=1,EE,001231C4,word,27BD0300 SLES-51393: name: "Syberia" region: "PAL-M5" @@ -11766,7 +12431,7 @@ SLES-51418: region: "PAL-M3" compat: 5 SLES-51423: - name: "Celtic - Club Football" + name: "Club Football - Celtic FC" region: "PAL-E" SLES-51425: name: "Fatman & Slim" # Beta @@ -11871,9 +12536,11 @@ SLES-51473: gameFixes: - EETimingHack # Fixes smoke effects. gsHWFixes: - halfPixelOffset: 1 # Fixes fog misalignment. + halfPixelOffset: 2 # Fixes fog misalignment and depth line. + autoFlush: 1 # Fixes sun going through objects. + preloadFrameData: 1 # Fixes missing sun and sky. SLES-51474: - name: "Blood Rayne" + name: "BloodRayne" region: "PAL-M4" compat: 5 SLES-51476: @@ -11944,6 +12611,8 @@ SLES-51523: name: "Conflict - Desert Storm II" region: "PAL-M5" compat: 5 + gameFixes: + - SoftwareRendererFMVHack # Fixes seizure inducing FMVs. SLES-51525: name: "Fallout - Brotherhood of Steel" region: "PAL-M3" @@ -11959,6 +12628,8 @@ SLES-51526: SLES-51541: name: "Grand Theft Auto - San Andreas" region: "PAL-Unk" + clampModes: + eeClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. gsHWFixes: autoFlush: 1 SLES-51547: @@ -11969,7 +12640,7 @@ SLES-51547: gameFixes: - VUSyncHack # Fixes SPS in game. SLES-51548: - name: "This is Football" + name: "X-Men 2 - Wolverine's Revenge" region: "PAL-M3" SLES-51553: name: "Chaos Legion" @@ -12013,8 +12684,10 @@ SLES-51584: name: "F1 Career Challenge" region: "PAL-M4" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLES-51588: - name: "Evil Dead - A Fistful of Boomstick (with Bonus DVD Movie)" + name: "Evil Dead - A Fistful of Boomstick [with Bonus DVD Movie]" region: "PAL-E" SLES-51589: name: "Resident Evil - Outbreak" @@ -12032,7 +12705,7 @@ SLES-51600: name: "WWE Crush Hour" region: "PAL-E" SLES-51602: - name: "All-Stars Baseball 2004" + name: "All-Star Baseball 2004 featuring Derek Jeter" region: "PAL-E" SLES-51603: name: "Seek & Destroy" @@ -12173,6 +12846,8 @@ SLES-51681: SLES-51682: name: "Headhunter - Redemption" region: "PAL-E" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting. SLES-51686: name: "Pitfall - The Lost Expedition" region: "PAL-E" @@ -12221,7 +12896,7 @@ SLES-51699: name: "Virtua Fighter - 10th Anniversary Edition" region: "PAL-M5" SLES-51702: - name: "Battlestar Galactica - Apostasy" + name: "Battlestar Galactica" region: "PAL-M5" SLES-51704: name: "XII Stag" @@ -12310,6 +12985,8 @@ SLES-51750: name: "Charlie's Angels" region: "PAL-M3" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Helps blur. SLES-51752: name: "Tony Hawks Underground" region: "PAL-Unk" @@ -12326,9 +13003,10 @@ SLES-51755: name: "Disney-Pixar's Finding Nemo" region: "PAL-E" gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. alignSprite: 1 # Fixes vertical lines. SLES-51756: - name: "Batman 2 - The Rise of Sin Tzu" + name: "Batman - Rise of Sin Tzu" region: "PAL-M5" SLES-51757: name: "Dancing Stage Fever" @@ -12343,6 +13021,8 @@ SLES-51758: SLES-51759: name: "Maximo vs. Army of Zin" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 2 # Fixes outlines around environmental objects. SLES-51761: name: "Italian Job, The - L.A. Heist" region: "PAL-M5" @@ -12353,6 +13033,9 @@ SLES-51765: SLES-51766: name: "Gladiator - Sword of Vengeance" region: "PAL-M5" + gsHWFixes: + roundSprite: 2 # Helps glow misalignment. + halfPixelOffset: 1 # Helps glow misalignment. SLES-51772: name: "Bad Boys II" region: "PAL-E" @@ -12375,7 +13058,7 @@ SLES-51787: name: "Harry Potter - Quidditch World Cup" region: "PAL-M10" SLES-51792: - name: "Aliens vs. Predator - Extinction" + name: "Aliens Versus Predator - Extinction" region: "PAL-E" SLES-51794: name: "Looney Toons - Back in Action" @@ -12410,7 +13093,7 @@ SLES-51813: name: "European Tennis Pro" region: "PAL-E" SLES-51814: - name: "ATV Off-Road Fury 2" + name: "ATV Offroad Fury 2" region: "PAL-E" SLES-51815: name: "Final Fantasy X-2" @@ -12456,12 +13139,17 @@ SLES-51820: gsHWFixes: autoFlush: 1 # Fixes bloom misalignment. halfPixelOffset: 2 # Fixes bloom misalignment. + textureInsideRT: 1 # Fixes sky bloom. SLES-51821: name: "Alias" region: "PAL-M5" + gsHWFixes: + cpuCLUTRender: 1 # Fixes lights penetrating objects. SLES-51822: name: "Alias" region: "PAL-I" + gsHWFixes: + cpuCLUTRender: 1 # Fixes lights penetrating objects. SLES-51823: name: "Hunter - The Reckoning Wayward" region: "PAL-M3" @@ -12479,9 +13167,15 @@ SLES-51826: SLES-51827: name: "Gladiator - Sword of Vengeance" region: "PAL-E-FR" + gsHWFixes: + roundSprite: 2 # Helps glow misalignment. + halfPixelOffset: 1 # Helps glow misalignment. SLES-51828: name: "Gladiator - Sword of Vengeance" region: "PAL-G" + gsHWFixes: + roundSprite: 2 # Helps glow misalignment. + halfPixelOffset: 1 # Helps glow misalignment. SLES-51831: name: "Sphinx and The Cursed Mummy" region: "PAL-M5" @@ -12492,10 +13186,10 @@ SLES-51834: name: "Premier Manager 2003-2004" region: "PAL-F" SLES-51838: - name: "Asterix & Obelix XXL2" + name: "Astérix & Obélix XXL" region: "PAL-M5" SLES-51839: - name: "DragonBall Z - Budokai 2" + name: "Dragon Ball Z - Budokai 2" region: "PAL-M5" compat: 5 SLES-51840: @@ -12516,7 +13210,7 @@ SLES-51843: content: |- comment=You need to set the EE cycle speed to -1 to be able to load the game. SLES-51845: - name: "Barbie - Horse Adventure" + name: "Barbie Horse Adventures - Wild Horse Rescue" region: "PAL-M6" SLES-51846: name: "Deutschland sucht den Superstar" @@ -12595,17 +13289,20 @@ SLES-51870: name: "Disney-Pixar's Finding Nemo" region: "PAL-FI-S" gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. alignSprite: 1 # Fixes vertical lines. SLES-51871: name: "Disney-Pixar's Finding Nemo" region: "PAL-F-G" compat: 5 gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. alignSprite: 1 # Fixes vertical lines. SLES-51872: name: "Disney-Pixar's Finding Nemo" region: "PAL-M3" gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. alignSprite: 1 # Fixes vertical lines. SLES-51873: name: "Medal of Honor - Rising Sun" @@ -12660,7 +13357,7 @@ SLES-51893: name: "Naval Ops - Warship Gunner" region: "PAL-E" SLES-51896: - name: "Gallop Racer" + name: "Attheraces Presents Gallop Racer" region: "PAL-E" SLES-51897: name: "Simpsons, The - Hit & Run" @@ -12668,6 +13365,8 @@ SLES-51897: compat: 5 gameFixes: - FpuNegDivHack # Lens flare appears even when behind objects. + gsHWFixes: + autoFlush: 1 # Fixes missing lens flare. SLES-51903: name: "AFL Live 2004 - Aussie Rules Football" region: "PAL-E" @@ -12677,6 +13376,9 @@ SLES-51906: SLES-51907: name: "Disney-Pixar Alla Ricerca di Nemo" region: "PAL-I" + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLES-51908: name: "Van Helsing" region: "PAL-M5" @@ -12721,13 +13423,13 @@ SLES-51917: textureInsideRT: 1 # Fixes the shape of shadows. autoFlush: 1 # Fixes water rendering. halfPixelOffset: 3 # Fixes bloom misalignment, needs this harsh offset for autoflush. + cpuFramebufferConversion: 1 # Fixes shield rendering. SLES-51918: name: "Prince of Persia - The Sands of Time" region: "PAL-M5" compat: 5 gsHWFixes: autoFlush: 1 # Reduces post-processing misalignment. - roundSprite: 2 # Reduces post-processing misalignment. SLES-51924: name: "World War Zero - Ironstorm" region: "PAL-M5" @@ -12749,8 +13451,10 @@ SLES-51931: region: "PAL-M5" compat: 5 SLES-51932: - name: "Jimmy Neutron - Jet Fusion" + name: "Adventures of Jimmy Neutron, The - Boy Genius - Jet Fusion" region: "PAL-E" + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLES-51933: name: "Gregory Horror Show" region: "PAL-M3" @@ -12796,7 +13500,7 @@ SLES-51954: vuClampMode: 3 # Fixes rainbow coloured graphics. eeClampMode: 3 # Fixes bullet holes. SLES-51956: - name: "Bionicle - The Game" + name: "Bionicle" region: "PAL-M6" SLES-51957: name: "Terminator 3 - Rise of the Machines" @@ -12813,12 +13517,14 @@ SLES-51959: SLES-51960: name: "Disney-Pixar À Procura de Nemo" region: "PAL-P" + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLES-51961: name: "Prince of Persia - The Sands of Time" # Pre-order Demo region: "PAL-E" gsHWFixes: autoFlush: 1 # Reduces post-processing misalignment. - roundSprite: 2 # Reduces post-processing misalignment. SLES-51963: name: "FIFA 2004" region: "PAL-F-G" @@ -12846,7 +13552,7 @@ SLES-51967: gsHWFixes: halfPixelOffset: 2 # Fixes misaligned post-processing. SLES-51968: - name: "Spongebob SquarePants - Battle for Bikini Bottom" + name: "SpongeBob SquarePants - Battle for Bikini Bottom" region: "PAL-E" SLES-51970: name: "Spongebob Schwammkopf - Schlacht um Bikini Bottom" @@ -12876,11 +13582,15 @@ SLES-51981: region: "PAL-E" clampModes: vuClampMode: 0 # Resolves I Reg Clamping / performance impact and yellow graphics in certain areas. + gsHWFixes: + roundSprite: 1 # Fixes slight blur. SLES-51982: name: "ShellShock - Nam '67" region: "PAL-M3" clampModes: vuClampMode: 0 # Resolves I Reg Clamping / performance impact and yellow graphics in certain areas. + gsHWFixes: + roundSprite: 1 # Fixes slight blur. SLES-51986: name: "Backyard Wrestling - Don't Try This At Home" region: "PAL-M5" @@ -12916,7 +13626,7 @@ SLES-52002: name: "Rogue Ops" region: "PAL-M6" SLES-52005: - name: "James Bond 007 - Everything or Nothing" + name: "007 - Everything or Nothing" region: "PAL-M5" compat: 5 SLES-52008: @@ -12929,14 +13639,14 @@ SLES-52011: region: "PAL-E" compat: 5 SLES-52015: - name: "Les Chevaliers de Baphomet" + name: "Chevaliers de Baphomet, Les - Le Manuscrit de Voynich" region: "PAL-F" SLES-52017: name: "Lord of the Rings, The - Return of the King" region: "PAL-M5" compat: 5 SLES-52018: - name: "Lord of the Rings, The - Return of the King (Der Herr der Ringe, Die Ruckkehr des Konigs)" + name: "Der Herr der Ringe, Die Rueckkehr des Koenigs" region: "PAL-G" SLES-52019: name: "Lord of the Rings, The - Return of the King" @@ -12968,7 +13678,7 @@ SLES-52028: name: "Junior Sports Basketball" region: "PAL-M5" SLES-52034: - name: "Dr. Seuss' The Cat in the Hat" + name: "Cat in the Hat, The" region: "PAL-M5" gsHWFixes: autoFlush: 1 @@ -13003,9 +13713,11 @@ SLES-52045: name: "GTR 400" region: "PAL-E" compat: 5 + gameFixes: + - XGKickHack # Fixes bad Geometry. SLES-52046: - name: "James Bond 007 - Everything or Nothing (Alles oder Nichts)" - region: "PAL-G" + name: "007 - Everything or Nothing" + region: "PAL-F-G" compat: 5 SLES-52047: name: "Sims, The - Bustin' Out" @@ -13025,7 +13737,7 @@ SLES-52055: gameFixes: - EETimingHack SLES-52056: - name: "Harry Potter and The Philosopher's Stone" + name: "Harry Potter and the Philosopher's Stone" region: "PAL-M11" gameFixes: - EETimingHack @@ -13042,7 +13754,7 @@ SLES-52062: name: "Pop Star Academy" region: "PAL-M5" SLES-52063: - name: "Alarm for Cobra 11 Autobahn" + name: "Alarm for Cobra 11" region: "PAL-E-G" SLES-52065: name: "Flipnic" @@ -13100,7 +13812,7 @@ SLES-52117: name: "Go Go Copter" region: "PAL-M3" SLES-52118: - name: "Castlevania - Lament of Innocence" + name: "Castlevania" region: "PAL-M5" compat: 5 clampModes: @@ -13121,19 +13833,29 @@ SLES-52125: SLES-52132: name: "Hitman - Contracts" region: "PAL-E" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLES-52133: name: "Hitman - Contracts" region: "PAL-F" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLES-52134: name: "Hitman - Contracts" region: "PAL-I" compat: 4 + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLES-52135: name: "Hitman - Contracts" region: "PAL-G" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLES-52136: name: "Hitman - Contracts" region: "PAL-S" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLES-52143: name: "Carmen Sandiego - The Secret of the Stolen Drums" region: "PAL-M4" @@ -13160,6 +13882,8 @@ SLES-52153: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: autoFlush: 1 + halfPixelOffset: 2 # Fixes misaligned lighting. + cpuCLUTRender: 1 # Fixes janky coloured cars. SLES-52155: name: "EyeToy - L'Eredita" region: "PAL-I" @@ -13240,14 +13964,23 @@ SLES-52219: name: "Corvette" region: "PAL-M3" compat: 5 + speedHacks: + InstantVU1SpeedHack: 1 # Increases FPS drastically. + MTVUSpeedHack: 0 + gsHWFixes: + halfPixelOffset: 3 # Reduces ghosting. SLES-52230: name: "Muppets Party Cruise" region: "PAL-E-F" + speedHacks: + mvuFlagSpeedHack: 0 # Fixes bad graphics. gameFixes: - OPHFlagHack # Fixes some hanging throughout the game. SLES-52237: name: "dot hack - Infection Part 1" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 1 # Sharpens world in far distances. memcardFilters: - "SLES-52237" - "SLES-52467" @@ -13301,12 +14034,18 @@ SLES-52259: SLES-52265: name: "Energy Airforce - Aim Strike!" region: "PAL-E" + gsHWFixes: + autoFlush: 1 # Corrects post-processing effect on jet exhausts. SLES-52266: name: "Energy Airforce - Aim Strike!" region: "PAL-F" + gsHWFixes: + autoFlush: 1 # Corrects post-processing effect on jet exhausts. SLES-52267: name: "Energy Airforce - Aim Strike!" region: "PAL-I" + gsHWFixes: + autoFlush: 1 # Corrects post-processing effect on jet exhausts. SLES-52275: name: "Way of the Samurai 2" region: "PAL-M3" @@ -13454,6 +14193,8 @@ SLES-52322: compat: 5 clampModes: eeClampMode: 3 # Characters are visible in-game. + gsHWFixes: + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLES-52323: name: "Richard Burns Rally" region: "PAL-M5" @@ -13548,6 +14289,9 @@ SLES-52372: region: "PAL-M5" gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. + autoFlush: 1 # Fixes the position of the shadow and makes it not blocky. + halfPixelOffset: 1 # Fixes shadows. + gpuPaletteConversion: 0 # Stops potential crashes from too many palette textures. SLES-52373: name: "Champions of Norrath" region: "PAL-E-S" @@ -13564,18 +14308,28 @@ SLES-52379: name: "Shrek 2" region: "PAL-E" compat: 5 + gsHWFixes: + mipmap: 1 # Partially fixes the sun effects, but the game suffers from depth/blending issues. SLES-52380: name: "Shrek 2" region: "PAL-F" + gsHWFixes: + mipmap: 1 # Partially fixes the sun effects, but the game suffers from depth/blending issues. SLES-52381: name: "Shrek 2" region: "PAL-G" + gsHWFixes: + mipmap: 1 # Partially fixes the sun effects, but the game suffers from depth/blending issues. SLES-52382: name: "Shrek 2" region: "PAL-S" + gsHWFixes: + mipmap: 1 # Partially fixes the sun effects, but the game suffers from depth/blending issues. SLES-52383: name: "Shrek 2" region: "PAL-I" + gsHWFixes: + mipmap: 1 # Partially fixes the sun effects, but the game suffers from depth/blending issues. SLES-52384: name: "Project Zero 2 - Crimson Butterfly" region: "PAL-M5" @@ -13686,6 +14440,8 @@ SLES-52445: name: "Silent Hill 4 - The Room" region: "PAL-M5" compat: 5 + speedHacks: + mvuFlagSpeedHack: 0 # Fixes invisible wall in front of the door leading to East 3F in the 2nd visit of Apartment world preventing Eileen's Nurse Outfit. gsHWFixes: halfPixelOffset: 1 # Fixes dark sides. SLES-52446: @@ -13696,6 +14452,9 @@ SLES-52447: region: "PAL-I" gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. + autoFlush: 1 # Fixes the position of the shadow and makes it not blocky. + halfPixelOffset: 1 # Fixes shadows. + gpuPaletteConversion: 0 # Stops potential crashes from too many palette textures. SLES-52448: name: "Knights of the Temple" region: "PAL-M4" @@ -13713,6 +14472,8 @@ SLES-52451: SLES-52457: name: "Shrek 2" region: "PAL-SW" + gsHWFixes: + mipmap: 1 # Partially fixes the sun effects, but the game suffers from depth/blending issues. SLES-52458: name: "Disgaea - Hour of Darkness" region: "PAL-E" @@ -13782,6 +14543,8 @@ SLES-52482: name: "Steel Dragon EX" region: "PAL-M4" compat: 5 + gsHWFixes: + gpuPaletteConversion: 2 # Fixes hashcache exploding. SLES-52483: name: "World Championship Pool 2004" region: "PAL-UM3" @@ -13798,6 +14561,9 @@ SLES-52493: region: "PAL-E" gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. + autoFlush: 1 # Fixes the position of the shadow and makes it not blocky. + halfPixelOffset: 1 # Fixes shadows. + gpuPaletteConversion: 0 # Stops potential crashes from too many palette textures. SLES-52495: name: "Bujingai - Swordmaster" region: "PAL-M5" @@ -13828,11 +14594,15 @@ SLES-52510: clampModes: eeClampMode: 2 SLES-52511: - name: "Headhunter - Redemption (EX)" + name: "Headhunter - Redemption" region: "PAL-E" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting. SLES-52512: name: "Headhunter - Redemption" region: "PAL-M4" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting. SLES-52515: name: "Ultimate Casino" region: "PAL-E" @@ -13861,7 +14631,7 @@ SLES-52521: name: "Adibou & Les Voleurs d'Energie" region: "PAL-M6" SLES-52523: - name: "Cocoto - Platform Jumper - Griffin's Story" + name: "Cocoto Platform Jumper" region: "PAL-M5" SLES-52525: name: "Mouse Trophy" @@ -13887,6 +14657,10 @@ SLES-52533: SLES-52534: name: "Crimson Tears" region: "PAL-M3" + gsHWFixes: + wildArmsHack: 1 # Fixes blurriness. + roundSprite: 2 # Reduces misalignment bloom effects. +# deinterlace: 6 # Game requires blend tff deinterlacing when auto for 'fixing' shimmer on character models and more flickering or half weaved, though the game suffers from the field order. SLES-52535: name: "Rumble Roses" region: "PAL-M5" @@ -13912,7 +14686,7 @@ SLES-52541: region: "PAL-M5" compat: 5 clampModes: - vuClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. + eeClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. gsHWFixes: autoFlush: 1 SLES-52542: @@ -14011,6 +14785,8 @@ SLES-52570: name: "Area 51" region: "PAL-M5" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes misaligned lighting and other effects. SLES-52571: name: "Pacific Air Warriors 2 - Dogfight" region: "PAL-E" @@ -14023,6 +14799,13 @@ SLES-52573: region: "PAL-M5" roundModes: eeRoundMode: 2 # Fixes abnormal character behaviour. +SLED-52574: + name: "Crash Twinsanity & Spyro - A Hero's Tail [Demo]" + region: "PAL-E" + gameFixes: + - XGKickHack # Fixes bad geometry. + gsHWFixes: + halfPixelOffset: 2 # Fixes depth lines. SLES-52576: name: "Yu-Gi-Oh! Capsule Monster Coliseum" region: "PAL-M5" @@ -14039,40 +14822,51 @@ SLES-52584: region: "PAL-M4" compat: 5 clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLES-52585: name: "Burnout 3 - Takedown" region: "PAL-F-G-I" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLES-52587: name: "Army Men - Sarge's War" region: "PAL-M5" compat: 5 SLES-52588: - name: "Mercenaries" + name: "Mercenaries - Playground of Destruction" region: "PAL-E" gsHWFixes: halfBottomOverride: 1 # Bottom screen has wrong colors. - halfPixelOffset: 1 # Fixes bloom misalignment. + autoFlush: 1 # Fixes missing lighting. + # halfPixelOffset: 1 # Fixes lighting misalignment. Do not enable this, it breaks a lot of graphics. SLES-52589: - name: "Mercenaries" + name: "Mercenaries - Playground of Destruction" region: "PAL-F" gsHWFixes: halfBottomOverride: 1 # Bottom screen has wrong colors. - halfPixelOffset: 1 # Fixes bloom misalignment. + autoFlush: 1 # Fixes missing lighting. + # halfPixelOffset: 1 # Fixes lighting misalignment. Do not enable this, it breaks a lot of graphics. SLES-52590: - name: "Mercenaries" + name: "Mercenaries - Playground of Destruction" region: "PAL-G" gsHWFixes: halfBottomOverride: 1 # Bottom screen has wrong colors. - halfPixelOffset: 1 # Fixes bloom misalignment. + autoFlush: 1 # Fixes missing lighting. + # halfPixelOffset: 1 # Fixes lighting misalignment. Do not enable this, it breaks a lot of graphics. SLES-52591: name: "Dynasty Warriors 4 - Empires" region: "PAL-E" @@ -14092,8 +14886,10 @@ SLES-52598: SLES-52599: name: "Metal Slug 3" region: "PAL-M5" + gsHWFixes: + gpuPaletteConversion: 2 # Stops excessive VRAM usage with preloading on. SLES-52600: - name: "Harry Potter and The Prisoner of Azkaban" + name: "Harry Potter and the Prisoner of Azkaban" region: "PAL-PL" gsHWFixes: mipmap: 1 @@ -14176,7 +14972,7 @@ SLES-52640: name: "Dance-UK XL" region: "PAL-UK" SLES-52641: - name: "Leisure Suit Larry - Magna Cum Laude (Uncut)" + name: "Leisure Suit Larry - Magna Cum Laude [Uncut]" region: "PAL-E" SLES-52642: name: "Leisure Suit Larry - Magna cum Laude" @@ -14194,77 +14990,80 @@ SLES-52646: name: "Tom Clancy's Ghost Recon 2" region: "PAL-M5" SLES-52647: - name: "Club Football - Manchester United 2005" + name: "Club Football 2005 - Manchester United" region: "PAL-M6" SLES-52648: - name: "BVB 09 - Club Football 2005 - Borussia Dortmund" + name: "Club Football 2005 - Borussia Dortmund" region: "PAL-G" SLES-52649: - name: "Om Droit au Bit - Club Football 2005" + name: "Club Football 2005 - Olympique de Marseille" region: "PAL-E-F" SLES-52650: - name: "Juventus - Club Football 2005" + name: "Club Football 2005 - Juventus" region: "PAL-M3" SLES-52651: - name: "FC Barcelona - Club Football 2005" + name: "Club Football 2005 - FC Barcelona" region: "PAL-M4" SLES-52652: - name: "Liverpool FC - Club Football 2005" + name: "Club Football 2005 - Liverpool FC" region: "PAL-E" SLES-52653: - name: "Liverpool FC - Club Football 2005" + name: "Club Football 2005 - Liverpool FC" region: "PAL-M3" SLES-52654: - name: "Club Football - Real Madri 2005" + name: "Club Football 2005 - Real Madrid" region: "PAL-M5" SLES-52655: - name: "FC Bayern Munich - Club Football 2005" + name: "Club Football 2005 - FC Bayern München" region: "PAL-M3" SLES-52656: - name: "AC Milan Club Football 2005" + name: "Club Football 2005 - AC Milan" region: "PAL-M3" SLES-52657: - name: "Arsenal FC - Club Football 2005" + name: "Club Football 2005 - Arsenal" region: "PAL-E-F" SLES-52658: - name: "Hamburg SV - Club Football 2005" + name: "Club Football 2005 - Hamburger SV" region: "PAL-G" SLES-52659: - name: "Paris Saint-Germain Club Football 2005" + name: "Club Football 2005 - Paris Saint-Germain" region: "PAL-E-F" SLES-52660: - name: "Inter - Club Football 2005" + name: "Club Football 2005 - FC Internazionale" region: "PAL-M3" SLES-52661: - name: "Ajax Club Football 2005" + name: "Club Football 2005 - Ajax Amsterdam" region: "PAL-M4" SLES-52662: - name: "Newcastle United - Club Football 2005" + name: "Club Football 2005 - Newcastle United" region: "PAL-E" SLES-52663: - name: "Chelsea FC - Club Football 2005" + name: "Club Football 2005 - Chelsea FC" region: "PAL-E" SLES-52664: - name: "Rangers FC - Club Football 2005" + name: "Club Football 2005 - Rangers FC" region: "PAL-E" SLES-52665: - name: "Celtic FC - Club Football 2005" + name: "Club Football 2005 - Celtic FC" region: "PAL-E" SLES-52666: - name: "Tottenham Hotspur - Club Football 2005" + name: "Club Football 2005 - Tottenham Hotspur" region: "PAL-E" SLES-52667: - name: "Birmingham City - Club Football 2005" + name: "Club Football 2005 - Birmingham City" region: "PAL-E" SLES-52668: - name: "Aston Villa FC - Club Football 2005" + name: "Club Football 2005 - Aston Villa" region: "PAL-E" SLES-52669: name: "Forgotten Realms - Demon Stone" region: "PAL-M5" compat: 5 + clampModes: + vuClampMode: 3 # Removes occasional SPS where the head goes into nightmare fuel. gsHWFixes: halfPixelOffset: 1 # Reduces ghosting. + roundSprite: 1 # Reduces ghosting even more. SLES-52670: name: "Second Sight" region: "PAL-M5" @@ -14316,7 +15115,7 @@ SLES-52697: name: "Manager de la Liga 2005" region: "PAL-S" SLES-52700: - name: "Jimmy Neutron - Attack of the Twonkies" + name: "Adventures of Jimmy Neutron, The - Boy Genius - Attack of the Twonkies" region: "PAL-E" SLES-52701: name: "Future Tactics - The Uprising" @@ -14345,8 +15144,12 @@ SLES-52707: clampModes: vuClampMode: 3 # Fixes lighting on character models as caves and other locations don't turn mobs into glow-in-the-dark creatures by themselves. SLES-52709: - name: "Ty the Tazmanian Tiger 2 - Bush Rescue" + name: "TY the Tasmanian Tiger 2 - Bush Rescue" region: "PAL-M7" + compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. + halfPixelOffset: 1 # Fixes visible lines in water textures. SLES-52710: name: "McFarlane's Evil Prophecy" region: "PAL-M5" @@ -14357,7 +15160,7 @@ SLES-52711: gameFixes: - GIFFIFOHack # Fixes corrupted textures. patches: - 958e5086: + "958E5086": content: |- comment=Patch by refraction // Game has a bug in it, where it's supposed to wait for the GS transfers/drawing to finish @@ -14374,7 +15177,7 @@ SLES-52716: name: "Energy Thieves, The" region: "PAL-E" SLES-52717: - name: "Brian Lara Cricket 2005" + name: "Brian Lara International Cricket 2005" region: "PAL-E" compat: 5 SLES-52718: @@ -14407,7 +15210,7 @@ SLES-52729: region: "PAL-M5" compat: 5 SLES-52730: - name: "DragonBall Z - Budokai 3" + name: "Dragon Ball Z - Budokai 3" region: "PAL-M5" compat: 5 SLES-52731: @@ -14459,7 +15262,7 @@ SLES-52754: name: "FlatOut" region: "PAL-G" SLES-52755: - name: "Blood Will Tell" + name: "Blood Will Tell - Tezuka Osamu's Dororo" region: "PAL-M5" SLES-52760: name: "Pro Evolution Soccer 4" @@ -14508,8 +15311,8 @@ SLES-52782: gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. SLES-52783: - name: "Call of Duty - Le Jour de Gloire" - region: "PAL-F" + name: "Call of Duty - Finest Hour" + region: "PAL-F-S-I" gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. patches: @@ -14535,18 +15338,26 @@ SLES-52800: SLES-52801: name: "Lord of the Rings, The - The Third Age" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting in cutscenes. SLES-52802: name: "Lord of the Rings, The - The Third Age" region: "PAL-F" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting in cutscenes. SLES-52803: - name: "Lord of the Rings, The - The Third Age (Der Herr der Ringe - Das dritte Zeitalter)" + name: "Der Herr der Ringe - Das dritte Zeitalter" region: "PAL-G" SLES-52804: name: "Lord of the Rings, The - The Third Age" region: "PAL-I" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting in cutscenes. SLES-52805: name: "Lord of the Rings, The - The Third Age" region: "PAL-S" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting in cutscenes. SLES-52807: name: "Lemony Snicket's A Series of Unfortunate Events" region: "PAL-E" @@ -14628,7 +15439,7 @@ SLES-52832: SLES-52834: name: "Sega Superstars Eyetoy Bundle" region: "PAL-M4" - compat: 1 + compat: 5 SLES-52835: name: "Mummy, The" region: "PAL-M6" @@ -14658,7 +15469,7 @@ SLES-52854: compat: 5 SLES-52856: name: "10 Most Wanted" - region: "PAL-F" + region: "PAL-M5" SLES-52857: name: "Fairly OddParents, The - Shadow Showdown" region: "PAL-E" @@ -14673,6 +15484,9 @@ SLES-52859: SLES-52861: name: "King Arthur" region: "PAL-M5" + compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLES-52863: name: "Pinball Hall of Fame" region: "PAL-M6" @@ -14757,7 +15571,7 @@ SLES-52900: name: "Rapala Pro Fishing" region: "PAL-E" SLES-52902: - name: "Arcade Classics Vol.1" + name: "Arcade Classics Volume 1" region: "PAL-E" SLES-52906: name: "Nickelodeon SpongeBob SquarePants - Movin' with Friends" @@ -14769,6 +15583,8 @@ SLES-52908: name: "Urbz, The - Sims in the City" region: "PAL-M11" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes upscaling lines. SLES-52909: name: "UEFA Champions League 2004-2005" region: "PAL-E-G" @@ -14820,7 +15636,7 @@ SLES-52927: name: "Grand Theft Auto - San Andreas" region: "PAL-G" clampModes: - vuClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. + eeClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. gsHWFixes: autoFlush: 1 SLES-52931: @@ -14856,6 +15672,8 @@ SLES-52942: // for VU1 to finish, which reduces the advantage of MTVU to basically zero. patch=1,EE,D0525A1C,extended,00000800 patch=1,EE,20525A1C,extended,00000000 + gsHWFixes: + texturePreloading: 1 # Improves performance and prevents it disabling itself regardless. SLES-52943: name: "ESPN NFL 2K5" region: "PAL-E" @@ -14875,6 +15693,8 @@ SLES-52950: name: "Shadow of Rome" region: "PAL-M5" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness and misalgined garbage when upscaling. SLES-52951: name: "Phantom Brave" region: "PAL-E" @@ -14956,7 +15776,7 @@ SLES-52978: name: "La Pucelle Tactics" region: "PAL-E" SLES-52980: - name: "Big Mutha Truckers 2" + name: "Big Mutha Truckers 2 - Truck Me Harder" region: "PAL-M5" SLES-52982: name: "NFL Street 2" @@ -14981,6 +15801,7 @@ SLES-52988: gsHWFixes: autoFlush: 1 # Fixes bloom. roundSprite: 1 # Fixes misalliged bloom. + deinterlace: 6 # Game requires blend tff deinterlacing when auto for 'fixing' subtitles flickering or half weaved. memcardFilters: # Reads Command Mission save for bonus boss. - "SLES-52988" - "SLES-52832" @@ -15028,11 +15849,12 @@ SLES-53007: region: "PAL-M5" compat: 5 SLES-53008: - name: "Mercenaries" + name: "Mercenaries - Playground of Destruction" region: "PAL-I-S" gsHWFixes: halfBottomOverride: 1 # Bottom screen has wrong colors. - halfPixelOffset: 1 # Fixes bloom misalignment. + autoFlush: 1 # Fixes missing lighting. + # halfPixelOffset: 1 # Fixes lighting misalignment. Do not enable this, it breaks a lot of graphics. SLES-53009: name: "Dance Factory" region: "PAL-M5" @@ -15171,6 +15993,7 @@ SLES-53038: eeRoundMode: 0 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but still an issue compared to native. + roundSprite: 2 # Clears up much of the blurring that HPO Special does not. SLES-53039: name: "Champions - Return to Arms" # aka "Champions of Norrath 2" region: "PAL-M4" @@ -15190,12 +16013,14 @@ SLES-53044: name: "Juiced" region: "PAL-M4" compat: 5 + speedHacks: + InstantVU1SpeedHack: 0 # Significantly improves game speed. SLES-53045: name: "Street Racing Syndicate" region: "PAL-M5" compat: 5 SLES-53046: - name: "CT Special Forces - Fire for Effect" + name: "Counter Terrorist Special Forces - Fire for Effect" region: "PAL-M5" SLES-53047: name: "Punisher, The" @@ -15221,7 +16046,7 @@ SLES-53059: region: "PAL-E" compat: 5 SLES-53060: - name: "Asterix & Obelix XXL 2 - Mission Las Vegum" + name: "Astérix & Obélix XXL 2 - Mission - Las Vegum" region: "PAL-M3" SLES-53061: name: "Atari Anthology" @@ -15247,6 +16072,8 @@ SLES-53074: SLES-53075: name: "Area 51" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 1 # Fixes misaligned lighting and other effects. SLES-53076: name: "Triggerman" region: "PAL-M5" @@ -15289,6 +16116,8 @@ SLES-53091: SLES-53092: name: "Motocross Mania 3" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 1 # Fixes bloom misalignment. SLES-53093: name: "Cold Winter" region: "PAL-G" @@ -15304,6 +16133,8 @@ SLES-53096: name: "Worms 4 - Mayhem" region: "PAL-M5" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLES-53098: name: "Conspiracy - Weapons of Mass Destruction" region: "PAL-M5" @@ -15414,11 +16245,13 @@ SLES-53148: name: "Fruitfall" region: "PAL-E" SLES-53150: - name: "10 Pin - Champions' Alley" + name: "10 Pin - Champions Alley" region: "PAL-M6" SLES-53151: name: "Juiced" region: "PAL-I" + speedHacks: + InstantVU1SpeedHack: 0 # Significantly improves game speed. SLES-53152: name: "Mashed Fully Loaded" region: "PAL-M5" @@ -15483,6 +16316,9 @@ SLES-53190: SLES-53191: name: "Kaido Racer" region: "PAL-M5" + gsHWFixes: + alignSprite: 1 # Fixes vertical lines. + wildArmsHack: 1 # De-blurs the 3D image. SLES-53192: name: "Nightmare Before Christmas, The - Tim Burton's" region: "PAL-M5" @@ -15495,6 +16331,8 @@ SLES-53193: SLES-53194: name: "LEGO Star Wars" region: "PAL-M7" + clampModes: + vuClampMode: 3 # Fixes bad coordinate spam. SLES-53195: name: "Punisher, The" region: "PAL-E" @@ -15514,9 +16352,12 @@ SLES-53199: name: "25 to Life" region: "PAL-E" SLES-53200: - name: "DragonBall Z - Budokai Tenkaichi" + name: "Dragon Ball Z - Budokai Tenkaichi" region: "PAL-M6" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes lines when powering up. + cpuCLUTRender: 1 # Reduces the bloomy blur of characters. SLES-53201: name: "Saint Seiya Chapter Sanctuary" region: "PAL-M5" @@ -15545,15 +16386,24 @@ SLES-53224: name: "Championship Manager 5" region: "PAL-S" SLES-53225: - name: "Dreamworks' Madagascar" + name: "Dreamworks Madagascar" region: "PAL-E" + gsHWFixes: + roundSprite: 2 # Improves bloom alignment and clarity. + halfPixelOffset: 2 # Improves bloom alignment and clarity. SLES-53226: - name: "Dreamworks' Madagascar" + name: "Dreamworks Madagascar" region: "PAL-F-G" compat: 5 + gsHWFixes: + roundSprite: 2 # Improves bloom alignment and clarity. + halfPixelOffset: 2 # Improves bloom alignment and clarity. SLES-53227: - name: "Dreamworks' Madagascar" + name: "Dreamworks Madagascar" region: "PAL-M3" + gsHWFixes: + roundSprite: 2 # Improves bloom alignment and clarity. + halfPixelOffset: 2 # Improves bloom alignment and clarity. SLES-53231: name: "Le Avventure di Lupin III - Il Tesoro del Re Stregone" region: "PAL-I" @@ -15578,11 +16428,17 @@ SLES-53238: name: "Premier Manager 2005-2006" region: "PAL-M4" SLES-53242: - name: "Madagascar" + name: "Dreamworks Madagascar" region: "PAL-P" + gsHWFixes: + roundSprite: 2 # Improves bloom alignment and clarity. + halfPixelOffset: 2 # Improves bloom alignment and clarity. SLES-53246: - name: "Madagascar" + name: "Dreamworks Madagascar" region: "PAL-S" + gsHWFixes: + roundSprite: 2 # Improves bloom alignment and clarity. + halfPixelOffset: 2 # Improves bloom alignment and clarity. SLES-53280: name: "7 Sins" region: "PAL-M3" @@ -15703,7 +16559,7 @@ SLES-53345: name: "Shadow of Ganymede" region: "PAL-E" SLES-53346: - name: "DragonBall Z - Budokai 3 [Collector's Edition]" + name: "Dragon Ball Z - Budokai 3 [Collector's Edition]" region: "PAL-M5" compat: 5 SLES-53350: @@ -15712,6 +16568,8 @@ SLES-53350: compat: 5 roundModes: vuRoundMode: 0 # Prevents only backgrounds from appearing in Sonic R's multiplayer modes. + gsHWFixes: + cpuCLUTRender: 2 # Fixes CLUT colour in Sonic Fighters. memcardFilters: # Vectorman unlocks by having a Mega Collection or Heroes save. - "SLES-53350" - "SLES-52998" @@ -15735,6 +16593,7 @@ SLES-53356: gsHWFixes: halfPixelOffset: 3 # Fixes bloom misalignment still a bit misaligned. roundSprite: 1 # Fixes bloom misalignment still a bit misaligned. + cpuCLUTRender: 1 # Fixes sun background on the windows when selecting your 'race'. SLES-53357: name: "21 Card Games" region: "PAL-E" @@ -15780,8 +16639,11 @@ SLES-53371: name: "Real World Golf [with Gametrak]" region: "PAL-E" SLES-53373: - name: "Madagascar" + name: "Dreamworks Madagascar" region: "PAL-NL" + gsHWFixes: + roundSprite: 2 # Improves bloom alignment and clarity. + halfPixelOffset: 2 # Improves bloom alignment and clarity. SLES-53374: name: "X-Men Legends II - Rise of Apocalypse" region: "PAL-M3" @@ -15905,6 +16767,7 @@ SLES-53415: compat: 5 gameFixes: - SoftwareRendererFMVHack # Right side of the FMV is not rendering correctly. + - IbitHack # Fixes lights. gsHWFixes: roundSprite: 1 # Fixes lines in sprites. cpuSpriteRenderBW: 1 # Fixes textures. @@ -15913,6 +16776,7 @@ SLES-53416: region: "PAL-M3" gameFixes: - SoftwareRendererFMVHack # Right side of the FMV is not rendering correctly. + - IbitHack # Fixes lights. gsHWFixes: roundSprite: 1 # Fixes lines in sprites. cpuSpriteRenderBW: 1 # Fixes textures. @@ -15921,6 +16785,7 @@ SLES-53417: region: "PAL-G" gameFixes: - SoftwareRendererFMVHack # Right side of the FMV is not rendering correctly. + - IbitHack # Fixes lights. gsHWFixes: roundSprite: 1 # Fixes lines in sprites. cpuSpriteRenderBW: 1 # Fixes textures. @@ -15940,10 +16805,11 @@ SLES-53424: name: "Dead to Rights 2" region: "PAL-M4" SLES-53430: - name: "Incredible Hulk 2, The - Ultimate Destruction" + name: "Incredible Hulk, The - Ultimate Destruction" region: "PAL-M4" gsHWFixes: - mipmap: 1 + mipmap: 2 # Mipmap + trilinear, fixes textures. + trilinearFiltering: 1 SLES-53433: name: "NHL '06" region: "PAL-M6" @@ -15977,6 +16843,8 @@ SLES-53444: region: "PAL-M5" gameFixes: - VUSyncHack # Partly fixes SPS still needs EE+3. + gsHWFixes: + halfPixelOffset: 1 # Fixes misaligned bloom. SLES-53446: name: "Arcade USA" region: "PAL-E" @@ -16036,7 +16904,7 @@ SLES-53480: name: "Harvest Moon - A Wonderful Life [Special Edition]" region: "PAL-E" SLES-53481: - name: "10,000 Bullets" + name: "10.000 Bullets" region: "PAL-M5" compat: 5 SLES-53483: @@ -16049,6 +16917,8 @@ SLES-53484: SLES-53485: name: "Car Racing Challenge" region: "PAL-E" + gameFixes: + - XGKickHack # Fixes distant car textures. SLES-53487: name: "Forty 4 Party" region: "PAL-E" @@ -16114,10 +16984,14 @@ SLES-53506: region: "PAL-M5" compat: 5 clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 0 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLES-53506" - "SLES-53507" @@ -16129,10 +17003,14 @@ SLES-53507: region: "PAL-M3" compat: 5 clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 0 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLES-53506" - "SLES-53507" @@ -16174,6 +17052,8 @@ SLES-53525: SLES-53526: name: "Suffering, The - Ties that Bind" region: "PAL-E-F" + gsHWFixes: + autoFlush: 1 # Fixes debris and blending on lower part of screen during monster transformation. memcardFilters: - "SLES-53526" - "SLES-53527" @@ -16185,6 +17065,8 @@ SLES-53526: SLES-53527: name: "Suffering, The - Ties that Bind" region: "PAL-E-I-S" + gsHWFixes: + autoFlush: 1 # Fixes debris and blending on lower part of screen during monster transformation. memcardFilters: - "SLES-53526" - "SLES-53527" @@ -16196,6 +17078,8 @@ SLES-53527: SLES-53528: name: "Suffering, The - Ties that Bind" region: "PAL-G" + gsHWFixes: + autoFlush: 1 # Fixes debris and blending on lower part of screen during monster transformation. memcardFilters: - "SLES-53526" - "SLES-53527" @@ -16238,6 +17122,8 @@ SLES-53539: name: "Fahrenheit" region: "PAL-M4" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Slight lighting misalignment. patches: default: content: |- @@ -16263,6 +17149,8 @@ SLES-53540: name: "Fahrenheit" region: "PAL-M4" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Slight lighting misalignment. patches: default: content: |- @@ -16292,6 +17180,8 @@ SLES-53541: SLES-53542: name: "Shadow the Hedgehog" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 2 # Fixes misaligned lighting. SLES-53544: name: "Pro Evolution Soccer 5" region: "PAL-M4" @@ -16315,19 +17205,23 @@ SLES-53552: name: "SSX On Tour" region: "PAL-M8" SLES-53553: - name: "James Bond 007 - From Russia with Love" + name: "007 - From Russia with Love" region: "PAL-M7" SLES-53556: name: "Driver - Parallel Lines" region: "PAL-M3" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + cpuSpriteRenderBW: 2 # Fixes some bad textures. + cpuCLUTRender: 1 # Fixes the rest of the bad textures. SLES-53557: name: "Need for Speed - Most Wanted" region: "PAL-E" compat: 5 gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: # Reads Underground 2 save for extra money. - "SLES-53557" - "SLES-53558" @@ -16339,6 +17233,7 @@ SLES-53558: region: "PAL-M8" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLES-53557" - "SLES-53558" @@ -16350,6 +17245,7 @@ SLES-53559: region: "PAL-M3" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLES-53557" - "SLES-53558" @@ -16369,8 +17265,12 @@ SLES-53561: wildArmsHack: 1 # Reduces depth ghosting. roundSprite: 2 # Reduces depth ghosting. SLES-53563: - name: "Spongebob SquarePants and Friends - Unite!" + name: "Nickelodeon SpongeBob SquarePants and Friends Unite!" region: "PAL-M6" + gsHWFixes: + autoFlush: 1 # Fixes glows. + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. + textureInsideRT: 1 # Fixes rainbow lighting for lamps, computer and other areas. SLES-53564: name: "Darkwatch" region: "PAL-M5" @@ -16471,6 +17371,19 @@ SLES-53616: cpuSpriteRenderBW: 1 # Fixes textures. preloadFrameData: 1 # Fixes static text screens. roundSprite: 1 # Fixes lines in some post-effects. + cpuCLUTRender: 1 # Fixes light occlusion. +SLES-53617: + name: "True Crime - New York City" + region: "PAL-G" + clampModes: + eeClampMode: 2 # Fixes SPS on highway. + roundModes: + eeRoundMode: 0 # Fixes scene switching in intro. + gsHWFixes: + cpuSpriteRenderBW: 1 # Fixes textures. + preloadFrameData: 1 # Fixes static text screens. + roundSprite: 1 # Fixes lines in some post-effects. + cpuCLUTRender: 1 # Fixes light occlusion. SLES-53618: name: "True Crime - New York City" region: "PAL-S" @@ -16482,14 +17395,16 @@ SLES-53618: cpuSpriteRenderBW: 1 # Fixes textures. preloadFrameData: 1 # Fixes static text screens. roundSprite: 1 # Fixes lines in some post-effects. + cpuCLUTRender: 1 # Fixes light occlusion. SLES-53621: - name: "Wallace & Grommit - The Curse of the Were Rabbit" + name: "Wallace & Gromit - The Curse of the Were-Rabbit" region: "PAL-M5" compat: 5 gsHWFixes: - deinterlace: 3 # Game requires bob deinterlacing when auto. + deinterlace: 4 # Game requires bob deinterlacing when auto. + halfPixelOffset: 1 # Fixes misalignment/bloom when upscaling. SLES-53623: - name: "Spongebob SquarePants - Battle for Bikini Bottom" + name: "SpongeBob SquarePants - Battle for Bikini Bottom" region: "PAL-F" SLES-53624: name: "Disney-Pixar's Cars" @@ -16516,6 +17431,7 @@ SLES-53634: name: "Nicktoons Unite!" region: "PAL-A" gsHWFixes: + autoFlush: 1 # Fixes glows. mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. textureInsideRT: 1 # Fixes rainbow lighting for lamps, computer and other areas. SLES-53635: @@ -16524,6 +17440,12 @@ SLES-53635: SLES-53636: name: "TY the Tasmanian Tiger 3 - Night of the Quinkan" region: "PAL-A" + compat: 5 + roundModes: + eeRoundMode: 0 # Fixes story mission to make it completable. + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. + halfPixelOffset: 1 # Fixes visible lines in water textures. SLES-53638: name: "Ski Racing 2006" region: "PAL-M5" @@ -16599,6 +17521,8 @@ SLES-53667: SLES-53668: name: "Micro Machines V4" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 1 # Fixes bloom misalignment. SLES-53672: name: "Ultimate Spider-Man [Limited]" region: "PAL-E" @@ -16628,7 +17552,7 @@ SLES-53686: name: "NHL 2K6" region: "PAL-M3" patches: - 98ec4d86: + 98EC4D86: content: |- author=Prafull comment=Patched by Prafull @@ -16746,6 +17670,8 @@ SLES-53717: // for VU1 to finish, which reduces the advantage of MTVU to basically zero. patch=1,EE,D0529074,extended,00000800 patch=1,EE,20529074,extended,00000000 + gsHWFixes: + texturePreloading: 1 # Improves performance and prevents it disabling itself regardless. SLES-53718: name: "Sims 2, The" region: "PAL-M10" @@ -16757,6 +17683,7 @@ SLES-53722: region: "PAL-E" gameFixes: - SoftwareRendererFMVHack # Right side of the FMV is not rendering correctly. + - IbitHack # Fixes lights. gsHWFixes: roundSprite: 1 # Fixes lines in sprites. cpuSpriteRenderBW: 1 # Fixes textures. @@ -16764,20 +17691,20 @@ SLES-53724: name: "World Series of Poker" region: "PAL-E" SLES-53725: - name: "Asterix & Obelix XXL2" + name: "Astérix & Obélix XXL 2 - Mission - Las Vegum" region: "PAL-M5" SLES-53726: - name: "Harry Potter and The Goblet of Fire" + name: "Harry Potter and the Goblet of Fire" region: "PAL-E" gsHWFixes: mipmap: 1 SLES-53727: - name: "Harry Potter and The Goblet of Fire" + name: "Harry Potter and the Goblet of Fire" region: "PAL-M7" gsHWFixes: mipmap: 1 SLES-53728: - name: "Harry Potter and The Goblet of Fire" + name: "Harry Potter and the Goblet of Fire" region: "PAL-M5" gsHWFixes: mipmap: 1 @@ -16855,8 +17782,10 @@ SLES-53753: halfPixelOffset: 1 # Fixes bloom misalignment. preloadFrameData: 1 # Fixes car reflections and brightness. SLES-53754: - name: "ATV Off-Road Fury 3" + name: "ATV Offroad Fury 3" region: "PAL-M6" + speedHacks: + MTVUSpeedHack: 0 # Increases FPS drastically. SLES-53755: name: "Castlevania - Curse of Darkness" region: "PAL-M5" @@ -16864,6 +17793,8 @@ SLES-53755: clampModes: vuClampMode: 0 # Fixes SPS with microVU. eeClampMode: 2 # Fixes missing blade. + gsHWFixes: + roundSprite: 1 # Fixes font sizes to be bigger. memcardFilters: # Reads Lament of Innocence save for easter egg. - "SLES-53755" - "SLES-52118" @@ -16878,6 +17809,7 @@ SLES-53758: gsHWFixes: autoFlush: 1 # Fixes bloom misalignment. halfPixelOffset: 2 # Fixes bloom misalignment. + textureInsideRT: 1 # Fixes sky bloom. SLES-53759: name: "Matrix, The - Path of Neo" region: "PAL-M5" @@ -16922,6 +17854,8 @@ SLES-53775: region: "PAL-M4" gameFixes: - EETimingHack + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. SLES-53777: name: "Prince of Persia - The Two Thrones" region: "PAL-M5" @@ -16947,6 +17881,7 @@ SLES-53794: gsHWFixes: halfPixelOffset: 1 # Fixes ghosting characters. mergeSprite: 1 # Align sprite fixes FMVs but not garbage in-game, so needs merge sprite instead. + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLES-53796: name: "FIFA Street 2" region: "PAL-E" @@ -16983,6 +17918,9 @@ SLES-53809: region: "PAL-E" gameFixes: - XGKickHack # Fixes black and white fighters. + speedHacks: + MTVUSpeedHack: 0 # Fixes game from crashing. + InstantVU1SpeedHack: 0 # Fixes graphical issues. patches: B6F9C8D3: content: |- @@ -17068,7 +18006,7 @@ SLES-53848: region: "PAL-M5" compat: 5 SLES-53849: - name: "Asterix & Obelix XXL2" + name: "Astérix & Obélix XXL 2 - Mission - Las Vegum" region: "PAL-M4" SLES-53850: name: "Teenage Mutant Ninja Turtles 3 - Mutant Nightmare" @@ -17088,6 +18026,7 @@ SLES-53857: region: "PAL-M3" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLES-53557" - "SLES-53558" @@ -17125,6 +18064,8 @@ SLES-53870: name: "Devil Kings" region: "PAL-M5" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes misaligned bloom. SLES-53871: name: "Tengai" region: "PAL-E" @@ -17153,6 +18094,8 @@ SLES-53886: gsHWFixes: autoFlush: 1 # Properly diffuses light instead of strips of light. roundSprite: 1 # Fixes lighting misalignment such as the street poles and the sun. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. patches: ADDFF505: content: |- @@ -17173,6 +18116,7 @@ SLES-53900: region: "PAL-M3" gsHWFixes: alignSprite: 1 # Fixes black lines when upscaling. + wildArmsHack: 1 # De-blurs the 3D image. SLES-53901: name: "Torino 2006" region: "PAL-M5" @@ -17236,10 +18180,10 @@ SLES-53920: name: "Speed Machines 3" region: "PAL-E" SLES-53921: - name: "Sim Chemist" + name: "Chemist Tycoon" region: "PAL-E" SLES-53922: - name: "Car Wash Tycoon" + name: "Carwash Tycoon" region: "PAL-E" SLES-53923: name: "London Cab Challenge" @@ -17312,17 +18256,19 @@ SLES-53966: SLES-53967: name: "Godfather, The" region: "PAL-M6" + gsHWFixes: + cpuCLUTRender: 1 # Fixes light occlusion. SLES-53968: - name: "Godfather, The (Le Parrain)" + name: "Parrain, Le" region: "PAL-F" SLES-53969: - name: "Godfather, The (Der Pate)" + name: "Pate, Der" region: "PAL-G" SLES-53970: - name: "Godfather, The" + name: "Padrino, Il" region: "PAL-I" SLES-53971: - name: "Godfather, The" + name: "Padrino, El" region: "PAL-S" SLES-53972: name: "Stock Car Crash" @@ -17387,6 +18333,8 @@ SLES-53989: SLES-53991: name: "Urban Chaos - Riot Response" region: "PAL-M5" + gsHWFixes: + roundSprite: 1 # Fixes edge garbage and thin lines. SLES-53994: name: "50 Cent - Bulletproof" region: "PAL-E" @@ -17460,7 +18408,7 @@ SLES-54021: gameFixes: - EETimingHack # Fixes game engine errors when going ingame. patches: - b02c81e5: + B02C81E5: content: |- // Fixes random hangs when going ingame. patch=1,EE,001128e0,word,00000000 @@ -17472,6 +18420,9 @@ SLES-54027: region: "PAL-M3" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + cpuSpriteRenderBW: 2 # Fixes some bad textures. + cpuCLUTRender: 1 # Fixes the rest of the bad textures. SLES-54030: name: "Black" region: "PAL-E" @@ -17481,6 +18432,8 @@ SLES-54030: gsHWFixes: autoFlush: 1 # Properly diffuses light instead of strips of light. roundSprite: 1 # Fixes lighting misalignment such as the street poles and the sun. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. patches: CAA04879: content: |- @@ -17590,6 +18543,7 @@ SLES-54114: region: "PAL-E" gsHWFixes: autoFlush: 1 # Fixes effects. + halfPixelOffset: 1 # Fixes upscaling artifacts. compat: 5 SLES-54115: name: "Delta Force - Black Hawk Down - Team Sabre" @@ -17650,6 +18604,8 @@ SLES-54136: SLES-54137: name: "Just Cause" region: "PAL-M3" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting. SLES-54138: name: "Steambot Chronicles" region: "PAL-E" @@ -17682,6 +18638,8 @@ SLES-54147: SLES-54150: name: "Bionicle Heroes" region: "PAL-M6" + gsHWFixes: + cpuCLUTRender: 1 # Fixes ghosting on objects and people. SLES-54151: name: "Let's Make a Soccer Team!" region: "PAL-M5" @@ -17722,7 +18680,7 @@ SLES-54160: name: "Eragon" region: "PAL-R" SLES-54161: - name: "Super DragonBall Z" + name: "Super Dragon Ball Z" region: "PAL-E" SLES-54162: name: "Saint Seiya - The Hades" @@ -17732,11 +18690,11 @@ SLES-54163: name: "Naruto - Ultimate Ninja" region: "PAL-F" SLES-54164: - name: "DragonBall Z Budokai - Tenkaichi 2" + name: "Dragon Ball Z Budokai - Tenkaichi 2" region: "PAL-M6" compat: 5 gsHWFixes: - roundSprite: 2 # Fixes font artifacts. + halfPixelOffset: 1 # Fixes extreme ghosting. SLES-54165: name: "One Piece - Grand Adventure" region: "PAL-E" @@ -17747,6 +18705,7 @@ SLES-54166: eeClampMode: 3 gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. + halfPixelOffset: 2 # Fixes fog misplacement. SLES-54167: name: "Call of Duty 3" region: "PAL-M3" @@ -17754,6 +18713,7 @@ SLES-54167: eeClampMode: 3 gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. + halfPixelOffset: 2 # Fixes fog misplacement. SLES-54168: name: "Call of Duty 3" region: "PAL-G" @@ -17761,6 +18721,7 @@ SLES-54168: eeClampMode: 3 gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. + halfPixelOffset: 2 # Fixes fog misplacement. SLES-54169: name: "Aeon Flux" region: "PAL-M4" @@ -17833,6 +18794,7 @@ SLES-54186: eeRoundMode: 0 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but still an issue compared to native. + roundSprite: 2 # Clears up much of the blurring that HPO Special does not. SLES-54187: name: "Real World Golf 2007" region: "PAL-M3" @@ -17840,10 +18802,10 @@ SLES-54188: name: "Nickelodeon Avatar - The Legend of Aang" region: "PAL-M4" SLES-54193: - name: "Sudoku, Carol Vonderman's" + name: "Carol Vorderman's Sudoku" region: "PAL-E" SLES-54194: - name: "Sudoku, Carol Vonderman's" + name: "Carol Vorderman's Sudoku" region: "PAL-M5" SLES-54195: name: "Turbo Trucks" @@ -17854,6 +18816,8 @@ SLES-54199: SLES-54200: name: "Just Cause" region: "PAL-F-G" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting. SLES-54203: name: "Pro Evolution Soccer 6" region: "PAL-E" @@ -17881,7 +18845,7 @@ SLES-54211: name: "NHL 2K7" region: "PAL-M5" patches: - 1ad6efd1: + 1AD6EFD1: content: |- author=Prafull comment=Patched by Prafull @@ -17909,6 +18873,8 @@ SLES-54218: SLES-54221: name: "LEGO Star Wars II - The Original Trilogy" region: "PAL-M6" + gsHWFixes: + cpuCLUTRender: 1 # Fixes ghosting on objects and people. memcardFilters: # Allows import of characters from Lego Star Wars 1. - "SLES-54221" - "SLES-53194" @@ -17938,21 +18904,25 @@ SLES-54232: region: "PAL-F" gsHWFixes: autoFlush: 1 # Fixes effects. + halfPixelOffset: 1 # Fixes upscaling artifacts. SLES-54233: name: "Kingdom Hearts II" region: "PAL-G" gsHWFixes: autoFlush: 1 # Fixes effects. + halfPixelOffset: 1 # Fixes upscaling artifacts. SLES-54234: name: "Kingdom Hearts II" region: "PAL-I" gsHWFixes: autoFlush: 1 # Fixes effects. + halfPixelOffset: 1 # Fixes upscaling artifacts. SLES-54235: name: "Kingdom Hearts II" region: "PAL-S" gsHWFixes: autoFlush: 1 # Fixes effects. + halfPixelOffset: 1 # Fixes upscaling artifacts. SLES-54237: name: "Pirates of the Caribbean - The Legend of Jack Sparrow" region: "PAL-M5" @@ -18025,6 +18995,9 @@ SLES-54305: compat: 5 gameFixes: - VIF1StallHack # Fixes black screen on boot. + gsHWFixes: + autoFlush: 1 # Fixes missing bloom effects. + halfPixelOffset: 2 # Fixes misaligned lighting and bloom. SLES-54306: name: "Cartoon Network Racing" region: "PAL-E" @@ -18196,6 +19169,7 @@ SLES-54358: SLES-54359: name: "Legend of Spyro, The - A New Beginning" region: "PAL-M6" + compat: 5 patches: 0EE5646B: content: |- @@ -18203,6 +19177,7 @@ SLES-54359: // Fixes HUD and menu display. patch=1,EE,001849b8,word,00000000 gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. halfPixelOffset: 2 # Fixes lighting on mushrooms + others. SLES-54360: name: "Pro Evolution Soccer 6" @@ -18217,7 +19192,7 @@ SLES-54364: name: "Curious George" region: "PAL-M7" SLES-54365: - name: "AMF Xtreme bowling 2006" + name: "AMF Xtreme Bowling 2006" region: "PAL-M6" SLES-54366: name: "David Douillet Judo" @@ -18246,17 +19221,17 @@ SLES-54376: name: "Barnyard" region: "PAL-E" gsHWFixes: - mipmap: 1 + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. SLES-54377: name: "Barnyard" region: "PAL-G" gsHWFixes: - mipmap: 1 + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. SLES-54378: name: "Barnyard" region: "PAL-M4" gsHWFixes: - mipmap: 1 + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. SLES-54379: name: "NFL Street 3" region: "PAL-E" @@ -18312,8 +19287,11 @@ SLES-54396: region: "PAL-E" compat: 5 SLES-54400: - name: "SpongeBob SquarePants - Creature from the Krusty Krab" + name: "Nickelodeon SpongeBob SquarePants - Creature from the Krusty Krab" region: "PAL-M7" + compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. SLES-54402: name: "Need for Speed - Carbon [Collector's Edition]" region: "PAL-F" @@ -18323,7 +19301,7 @@ SLES-54402: halfPixelOffset: 2 # Fixes blurriness. roundSprite: 2 # Fixes blurriness. SLES-54420: - name: "Arthur & The Minimoys" + name: "Arthur and the Minimoys" region: "PAL-M7" SLES-54421: name: "Happy Feet" @@ -18380,6 +19358,8 @@ SLES-54437: SLES-54439: name: "Okami" region: "PAL-M3" + gsHWFixes: + roundSprite: 2 # Reduces misalignment issues but the game is just bad for upscaling. SLES-54440: name: "GT-R Touring" region: "PAL-E" @@ -18430,8 +19410,9 @@ SLES-54455: region: "PAL-E" gsHWFixes: halfPixelOffset: 1 # Fixes misaligned bloom effects. - mergeSprite: 1 # Fixes blurriness but removes bloom. + mergeSprite: 1 # Fixes blurriness but removes bloom + Recommended to use Shadeboost brightness 80. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLES-54456: name: "Beverly Hills Cop" region: "PAL-M11" @@ -18440,7 +19421,7 @@ SLES-54458: name: "Party Carnival" region: "PAL-E" SLES-54459: - name: "All Star Fighters" + name: "All-Star Fighters" region: "PAL-E" SLES-54460: name: "Dragon Sisters" @@ -18582,13 +19563,13 @@ SLES-54510: name: "Disney's Meet the Robinsons" region: "PAL-M3" SLES-54511: - name: "UEFA Champions League" + name: "UEFA Champions League 2006-2007" region: "PAL-E" SLES-54512: - name: "UEFA Champions League" + name: "UEFA Champions League 2006-2007" region: "PAL-F-G" SLES-54513: - name: "UEFA Champions League" + name: "UEFA Champions League 2006-2007" region: "PAL-I-S" SLES-54516: name: "Thrillville" @@ -18597,6 +19578,7 @@ SLES-54516: halfPixelOffset: 1 # Fixes misaligned bloom effects. mergeSprite: 1 # Fixes blurriness but removes bloom + Recommended to use Shadeboost brightness 80. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLES-54517: name: "Thrillville" region: "PAL-M3" @@ -18604,6 +19586,7 @@ SLES-54517: halfPixelOffset: 1 # Fixes misaligned bloom effects. mergeSprite: 1 # Fixes blurriness but removes bloom + Recommended to use Shadeboost brightness 80. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLES-54518: name: "Clumsy Shumsy" region: "PAL-E" @@ -18613,6 +19596,8 @@ SLES-54519: SLES-54521: name: "Nickelodeon SpongeBob and Friends - Battle for Volcano Island" region: "PAL-M5" + gsHWFixes: + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. SLES-54527: name: "Flushed Away" region: "PAL-M5" @@ -18658,6 +19643,9 @@ SLES-54547: SLES-54548: name: "Cocoto Fishing Master" region: "PAL-M4" + gsHWFixes: + deinterlace: 7 # Fixes blurriness. + halfPixelOffset: 1 # Fixes blur. SLES-54549: name: "Crazy Frog Racer 2" region: "PAL-M5" @@ -18692,7 +19680,7 @@ SLES-54559: autoFlush: 1 # Reduces post-processing misalignment. halfPixelOffset: 1 # Reduces lighting misalignment but doesn't fully fix it. patches: - d6a0a3ef: + D6A0A3EF: content: |- author=Prafull // Fix character falling through floor. @@ -18707,7 +19695,7 @@ SLES-54559: patch=1,EE,001de5c8,word,4a0002ff patch=1,EE,001de5cc,word,4a0002ff SLES-54560: - name: "Alpine Ski Racing 2007" + name: "Alpine Ski Racing 2007 - Bode Miller vs. Hermann Maier" region: "PAL-M3" clampModes: vuClampMode: 3 # Fixes SPS. @@ -18754,6 +19742,8 @@ SLES-54586: SLES-54587: name: "Raw Danger" region: "PAL-E" + gsHWFixes: + cpuCLUTRender: 1 # Fixes some shading/shadows. SLES-54588: name: "Brunswick Pro Bowling" region: "PAL-E" @@ -18777,7 +19767,7 @@ SLES-54596: name: "Heatseeker" region: "PAL-M3" SLES-54604: - name: "'Que pasa Neng! El Videojuego" + name: "¡Qué Pasa Neng! El Videojuego" region: "PAL-S" SLES-54606: name: "Harley-Davidson - Race to the Rally" @@ -18828,17 +19818,21 @@ SLES-54624: name: "Samurai Warriors 2 - Empires" region: "PAL-E" SLES-54626: - name: "An American Tail" + name: "American Tail, An" region: "PAL-M11" SLES-54627: name: "Burnout Dominator" region: "PAL-M5" compat: 5 clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLES-54628: name: "Skate Attack [Promo]" region: "PAL-E" @@ -18924,6 +19918,7 @@ SLES-54657: SLES-54658: name: "Star Wars - The Force Unleashed" region: "PAL-M5" + compat: 5 patches: 87109051: content: |- @@ -18932,9 +19927,12 @@ SLES-54658: // Patch replace values passed to FPU to workaround x86 rounding issues. patch=1,EE,0017cb84,word,3464fff0 patch=1,EE,0017cb90,word,3463fffc + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLES-54659: name: "Star Wars - The Force Unleashed" region: "PAL-M4" + compat: 5 patches: DAF2145C: content: |- @@ -18943,10 +19941,14 @@ SLES-54659: // Patch replace values passed to FPU to workaround x86 rounding issues. patch=1,EE,0017cb84,word,3464fff0 patch=1,EE,0017cb90,word,3463fffc + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLES-54663: name: "Jackass - The Game" region: "PAL-M5" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes misaligned textures. SLES-54664: name: "Top Gun" region: "PAL-M11" @@ -18994,10 +19996,14 @@ SLES-54681: name: "Burnout Dominator" region: "PAL-E" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLES-54683: name: "Medal of Honor - Vanguard" region: "PAL-M9" @@ -19110,6 +20116,7 @@ SLES-54733: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLES-54734: name: "Disney-Pixar Ratatouille" region: "PAL-F" @@ -19118,6 +20125,7 @@ SLES-54734: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLES-54735: name: "Disney-Pixar Ratatouille" region: "PAL-G" @@ -19127,6 +20135,7 @@ SLES-54735: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLES-54736: name: "Disney-Pixar Ratatouille" region: "PAL-S" @@ -19136,6 +20145,7 @@ SLES-54736: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLES-54737: name: "Disney-Pixar Ratatouille" region: "PAL-R" @@ -19145,6 +20155,7 @@ SLES-54737: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLES-54738: name: "Thunderbirds" region: "PAL-M11" @@ -19157,6 +20168,7 @@ SLES-54744: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLES-54745: name: "Disney-Pixar Ratatouille" region: "PAL-I" @@ -19166,6 +20178,7 @@ SLES-54745: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLES-54746: name: "Disney-Pixar Ratatouille" region: "PAL-G" @@ -19175,6 +20188,7 @@ SLES-54746: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLES-54747: name: "Disney-Pixar Ratatouille" region: "PAL-P-S" @@ -19184,6 +20198,7 @@ SLES-54747: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLES-54755: name: "Transformers - The Game" region: "PAL-E" @@ -19229,21 +20244,29 @@ SLES-54778: region: "PAL-E" gsHWFixes: mipmap: 1 + halfPixelOffset: 1 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLES-54779: name: "Harry Potter and the Order of the Phoenix" region: "PAL-M5" gsHWFixes: mipmap: 1 + halfPixelOffset: 1 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLES-54780: name: "Harry Potter and the Order of the Phoenix" region: "PAL-M6" gsHWFixes: mipmap: 1 + halfPixelOffset: 1 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLES-54781: name: "Harry Potter and the Order of the Phoenix" region: "PAL-M5" gsHWFixes: mipmap: 1 + halfPixelOffset: 1 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLES-54782: name: "Obscure 2" region: "PAL-M5" @@ -19291,12 +20314,14 @@ SLES-54806: gsHWFixes: halfPixelOffset: 2 # Fixes misaligned bloom effects, 1 is technically more correct compared to software but looks worse. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLES-54807: name: "Thrillville - Off the Rails" region: "PAL-F" gsHWFixes: halfPixelOffset: 2 # Fixes misaligned bloom effects, 1 is technically more correct compared to software but looks worse. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLES-54809: name: "Charlotte's Web" region: "PAL-A" @@ -19328,6 +20353,7 @@ SLES-54815: // Fixes HUD and menu display. patch=1,EE,00173c38,word,00000000 gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. halfPixelOffset: 2 # Fixes lighting on mushrooms + others. SLES-54816: name: "Legend of Spyro, The - The Eternal Night" @@ -19340,6 +20366,7 @@ SLES-54816: // Fixes HUD and menu display. patch=1,EE,00173bb8,word,00000000 gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. halfPixelOffset: 2 # Fixes lighting on mushrooms + others. SLES-54817: name: "Garfield - Lasagna World Tour" @@ -19363,7 +20390,7 @@ SLES-54822: gsHWFixes: roundSprite: 1 # Fixes vertical lines in FMVs, character portraits and other sprites. SLES-54825: - name: "EyeToy - Bob the Builder" + name: "Bob the Builder" region: "PAL-M3" SLES-54826: name: "Surf's Up" @@ -19505,8 +20532,9 @@ SLES-54887: name: "Thrillville - Verrückte Achterbahn" region: "PAL-G" gsHWFixes: - halfPixelOffset: 2 # Fixes misaligned bloom effects. + halfPixelOffset: 2 # Fixes misaligned bloom effects, 1 is technically more correct compared to software but looks worse. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLES-54888: name: "Pro Biker 2" region: "PAL-E" @@ -19559,18 +20587,21 @@ SLES-54904: region: "PAL-M4" compat: 5 gsHWFixes: - halfPixelOffset: 1 # Reduces misaligned cel shading but still an issue compared to native. + halfPixelOffset: 2 # Corrects misaligned cel shading. + roundSprite: 1 # Further corrects misaligned cel shading. SLES-54905: name: "Simpsons Game, The" region: "PAL-F" compat: 5 gsHWFixes: - halfPixelOffset: 1 # Reduces misaligned cel shading but still an issue compared to native. + halfPixelOffset: 2 # Corrects misaligned cel shading. + roundSprite: 1 # Further corrects misaligned cel shading. SLES-54906: name: "Simpsons Game, The" region: "PAL-I-S" gsHWFixes: - halfPixelOffset: 1 # Reduces misaligned cel shading but still an issue compared to native. + halfPixelOffset: 2 # Corrects misaligned cel shading. + roundSprite: 1 # Further corrects misaligned cel shading. SLES-54913: name: "Pro Evolution Soccer 2008" region: "PAL-E-S" @@ -19608,6 +20639,8 @@ SLES-54930: SLES-54931: name: "Looney Tunes - ACME Arsenal" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 2 # Fixes bloom positioning. SLES-54933: name: "NBA Live 08" region: "PAL-S" @@ -19641,9 +20674,11 @@ SLES-54944: name: "Disney Princess - Enchanted Journey" region: "PAL-FI-SW" SLES-54945: - name: "Dragonball Z Budokai Tenkaichi 3" + name: "Dragon Ball Z Budokai Tenkaichi 3" region: "PAL-M6" compat: 5 + gsHWFixes: + cpuCLUTRender: 1 # Reduces the bloomy blur of characters. SLES-54946: name: "Sega Superstars Tennis" region: "PAL-M5" @@ -19719,9 +20754,9 @@ SLES-54972: name: "Wild Arms 5" region: "PAL-M3" gsHWFixes: - wildArmsHack: 1 # Fixes font artifacts and out-of-bound 2D textures. + cpuFramebufferConversion: 1 # Fixes sepia-tone flashback sequences. SLES-54973: - name: "Le Avventure di Lupin III - Lupin la Morte, Zenigata l'Amore" + name: "Avventure di Lupin III, Le - Lupin la Morte, Zenigata l'Amore" region: "PAL-I" SLES-54974: name: "Guitar Hero III - Legends of Rock" @@ -19765,12 +20800,21 @@ SLES-54989: SLES-54990: name: "Nicktoons - Attack of the Toybots" region: "PAL-A" + gsHWFixes: + mipmap: 1 # Fixes garbage textures in the distance. + halfPixelOffset: 2 # Corrects most vertical lines. SLES-54991: name: "Nickelodeon SpongeBob and Friends - Attack of the Toybots" region: "PAL-M6" + gsHWFixes: + mipmap: 1 # Fixes garbage textures in the distance. + halfPixelOffset: 2 # Corrects most vertical lines. SLES-54992: name: "PDC World Championship Darts 2008" region: "PAL-M6" + gsHWFixes: + autoFlush: 1 # Fixes lights not appearing. + cpuCLUTRender: 1 # Fixes lights going through darts players. SLES-54994: name: "Pippa Funnell - Ranch Rescue" region: "PAL-M11" @@ -19811,18 +20855,28 @@ SLES-55001: SLES-55002: name: "Need for Speed - ProStreet" region: "PAL-E" + gsHWFixes: + halfPixelOffset: 2 # Fixes depth line. SLES-55003: name: "Need for Speed - ProStreet" region: "PAL-F-G" + gsHWFixes: + halfPixelOffset: 2 # Fixes depth line. SLES-55004: name: "Need for Speed - ProStreet" region: "PAL-I-S" + gsHWFixes: + halfPixelOffset: 2 # Fixes depth line. SLES-55005: name: "Need for Speed - ProStreet" region: "PAL-M8" + gsHWFixes: + halfPixelOffset: 2 # Fixes depth line. SLES-55006: name: "Need for Speed - ProStreet" region: "PAL-R" + gsHWFixes: + halfPixelOffset: 2 # Fixes depth line. SLES-55007: name: "Boogie" region: "PAL-M7" @@ -19834,14 +20888,16 @@ SLES-55010: name: "Thrillville - Fuori dai Binari" region: "PAL-I" gsHWFixes: - halfPixelOffset: 2 # Fixes misaligned bloom effects. + halfPixelOffset: 2 # Fixes misaligned bloom effects, 1 is technically more correct compared to software but looks worse. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLES-55011: name: "Thrillville - Fuera de Control" region: "PAL-S" gsHWFixes: - halfPixelOffset: 2 # Fixes misaligned bloom effects. + halfPixelOffset: 2 # Fixes misaligned bloom effects, 1 is technically more correct compared to software but looks worse. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLES-55012: name: "Golden Compass, The" region: "PAL-M5" @@ -19850,6 +20906,8 @@ SLES-55013: region: "PAL-M5" gameFixes: - EETimingHack # Fixes game engine errors when going ingame. + gsHWFixes: + halfPixelOffset: 1 # Fixes light/bloom positioning. patches: 304497e5: content: |- @@ -19879,7 +20937,8 @@ SLES-55020: name: "Die Simpsons - Das Spiel" region: "PAL-G" gsHWFixes: - halfPixelOffset: 1 # Reduces misaligned cel shading but still an issue compared to native. + halfPixelOffset: 2 # Corrects misaligned cel shading. + roundSprite: 1 # Further corrects misaligned cel shading. SLES-55021: name: "Pro Evolution Soccer 2008" region: "PAL-F-G" @@ -19889,6 +20948,9 @@ SLES-55023: SLES-55024: name: "Nickelodeon SpongeBob's Atlantis SquarePantis" region: "PAL-M4" + compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. SLES-55025: name: "Disney-Pixar Cars - Mater-National Championship" region: "PAL-E-A" @@ -19905,7 +20967,7 @@ SLES-55029: name: "Disney-Pixar Cars - La Copa Internacional de Mate" region: "PAL-S" SLES-55030: - name: "Nickelodeon SpongeBob's Atlantis SquarePantis" + name: "Disney-Pixar Cars - Mater-National Championship" region: "PAL-M4" SLES-55031: name: "Kung Fu Panda" @@ -20005,9 +21067,14 @@ SLES-55079: SLES-55080: name: "Nickelodeon SpongeBob's Atlantis SquarePantis" region: "PAL-A" + compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. SLES-55081: name: "Jackass - The Game" region: "PAL-E" + gsHWFixes: + halfPixelOffset: 1 # Fixes misaligned textures. SLES-55082: name: "Urban Constructor" region: "PAL-E" @@ -20099,26 +21166,33 @@ SLES-55136: SLES-55138: name: "Nickelodeon El Tigre - The Adventures of Manny Rivera" region: "PAL-E" + gsHWFixes: + mipmap: 1 # Fixes garbage textures in the distance. + halfPixelOffset: 2 # Corrects most vertical lines. SLES-55143: name: "Chronicles of Narnia, The - Prince Caspian" region: "PAL-G-I" gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but on normal vertex is less ghosting but causes corruption at the sides. + cpuCLUTRender: 1 # Fixes title-screen bloom and church windows on new game and other locations. SLES-55144: name: "Chronicles of Narnia, The - Prince Caspian" region: "PAL-M6" gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but on normal vertex is less ghosting but causes corruption at the sides. + cpuCLUTRender: 1 # Fixes title-screen bloom and church windows on new game and other locations. SLES-55145: name: "Chronicles of Narnia, The - Prince Caspian" region: "PAL-F-DU" gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but on normal vertex is less ghosting but causes corruption at the sides. + cpuCLUTRender: 1 # Fixes title-screen bloom and church windows on new game and other locations. SLES-55146: name: "Chronicles of Narnia, The - Prince Caspian" region: "PAL-UK" gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but on normal vertex is less ghosting but causes corruption at the sides. + cpuCLUTRender: 1 # Fixes title-screen bloom and church windows on new game and other locations. SLES-55147: name: "Silent Hill - Origins" region: "PAL-M5" @@ -20140,8 +21214,11 @@ SLES-55152: SLES-55163: name: "Legend of Spyro, The - Dawn of the Dragon" region: "PAL-M6" + compat: 5 gsHWFixes: halfPixelOffset: 2 # Fixes ghosting and bloom misalignment. + cpuSpriteRenderBW: 1 # Rainbow spots if alone applied but needs cpuCLUTrender to look like software mode. + cpuCLUTRender: 1 # Blue horizontal lines on it's own but needs cpuSpriteRenderBW to look like software mode. SLES-55165: name: "Mummy, The - Tomb of the Dragon Emperor" region: "PAL-M6" @@ -20159,6 +21236,7 @@ SLES-55169: region: "PAL-M5" gsHWFixes: cpuFramebufferConversion: 1 # Fixes black with rainbow screen. + gpuPaletteConversion: 2 # Fixes micro stuttering. SLES-55170: name: "Margot's Word Brain" region: "PAL-M5" @@ -20278,8 +21356,9 @@ SLES-55214: SLES-55215: name: "Growlanser - Heritage of War" region: "PAL-E" - gsHWFixes: - preloadFrameData: 1 # Fixes layers where characters should be visually behind an object. + compat: 5 + # gsHWFixes: Disabled because of GitHub Issue #6797 + # preloadFrameData: 1 # Fixes layers where characters should be visually behind an object. SLES-55216: name: "Baroque" region: "PAL-E" @@ -20297,8 +21376,11 @@ SLES-55220: SLES-55227: name: "Legend of Spyro, The - Dawn of the Dragon" region: "PAL-M5" + compat: 5 gsHWFixes: halfPixelOffset: 2 # Fixes ghosting and bloom misalignment. + cpuSpriteRenderBW: 1 # Rainbow spots if alone applied but needs cpuCLUTrender to look like software mode. + cpuCLUTRender: 1 # Blue horizontal lines on it's own but needs cpuSpriteRenderBW to look like software mode. SLES-55231: name: "Fatal Fury - Battle Archives Volume 1" region: "PAL-E" @@ -20393,7 +21475,7 @@ SLES-55252: name: "NHL 2K9" region: "PAL-M5" patches: - 5d981df2: + 5D981DF2: content: |- author=Prafull comment=Patched by Prafull @@ -20414,8 +21496,11 @@ SLES-55264: SLES-55265: name: "Legend of Spyro, The - Dawn of the Dragon" region: "PAL-R-E" + compat: 5 gsHWFixes: halfPixelOffset: 2 # Fixes ghosting and bloom misalignment. + cpuSpriteRenderBW: 1 # Rainbow spots if alone applied but needs cpuCLUTrender to look like software mode. + cpuCLUTRender: 1 # Blue horizontal lines on it's own but needs cpuSpriteRenderBW to look like software mode. SLES-55266: name: "MotoGP 08" region: "PAL-M5" @@ -20423,15 +21508,21 @@ SLES-55266: SLES-55271: name: "Spongebob SquarePants Featuring Nicktoons - Globs of Doom" region: "PAL-E-F" + gsHWFixes: + mipmap: 2 # Fixes graphical errors video. SLES-55272: name: "Spongebob SquarePants Featuring Nicktoons - Globs of Doom" region: "PAL-M3" + gsHWFixes: + mipmap: 2 # Fixes graphical errors. SLES-55274: name: "Diabolik - The Original Sin" region: "PAL-M6" SLES-55275: name: "Jeep Thrills" region: "PAL-M5" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLES-55276: name: "Jello" region: "PAL-E" @@ -20514,7 +21605,7 @@ SLES-55344: name: "Rock Band - Song Back 1" region: "PAL-M5" SLES-55345: - name: "James Bond - Quantum of Solace" + name: "007 - Quantum of Solace" region: "PAL-M5" compat: 5 SLES-55346: @@ -20567,13 +21658,17 @@ SLES-55354: name: "Shin Megami Tensei - Persona 3 FES" region: "PAL-E" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes flashing windows. memcardFilters: - "SLES-55354" - "SLES-55018" SLES-55355: name: "Guitar Hero - World Tour" region: "PAL-M5" + speedHacks: + InstantVU1SpeedHack: 0 # Corrects note board position. + roundModes: + vuRoundMode: 0 # Fixes graphical issues ingame. SLES-55356: name: "Bratz - Girlz Really Rock" region: "PAL-M3" @@ -20614,6 +21709,8 @@ SLES-55372: name: "Spiderman - Web of Shadows" region: "PAL-M5" compat: 5 + clampModes: + eeClampMode: 3 # Connect hits, able to summon... etc... SLES-55373: name: "King of Fighters Collection, The - The Orochi Saga" region: "PAL-E" @@ -20753,6 +21850,8 @@ SLES-55444: SLES-55448: name: "Indiana Jones and the Staff of Kings" region: "PAL-M5" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting. SLES-55451: name: "Rock Band 2" region: "PAL-M5" @@ -20763,7 +21862,7 @@ SLES-55453: name: "SingStar Queen" region: "PAL-Unk" SLES-55457: - name: "AC-DC LIVE - Rock Band Track Pack" + name: "AC-DC LIVE - Rock Band" region: "PAL-M5" SLES-55458: name: "Rock Band - Song Pack 2" @@ -20817,11 +21916,15 @@ SLES-55481: region: "PAL-E-F" gameFixes: - SoftwareRendererFMVHack # Fixes vertical lines in FMVs. + gsHWFixes: + cpuCLUTRender: 1 # Reduces the bloomy blur of characters. SLES-55482: name: "Naruto Shippuden - Ultimate Ninja 4" region: "PAL-G-I-S" gameFixes: - SoftwareRendererFMVHack # Fixes vertical lines in FMVs. + gsHWFixes: + cpuCLUTRender: 1 # Reduces the bloomy blur of characters. SLES-55483: name: "Guilty Gear XX Accent Core Plus" region: "PAL-E" @@ -20885,8 +21988,10 @@ SLES-55518: SLES-55520: name: "Transformers - Revenge of the Fallen" region: "PAL-M5" + compat: 5 gsHWFixes: cpuSpriteRenderBW: 2 # Fixes textures. + preloadFrameData: 1 # Fixes missing splash logo at boot. SLES-55522: name: "Disney-Pixar Up" region: "PAL-E" @@ -20917,6 +22022,8 @@ SLES-55532: SLES-55533: name: "Guitar Hero 5" region: "PAL-M5" + roundModes: + vuRoundMode: 0 # Fixes SPS and VU size spam. SLES-55536: name: "Disney-Pixar Cars - Race-O-Rama" region: "PAL-M5" @@ -20978,6 +22085,8 @@ SLES-55579: eeRoundMode: 1 clampModes: vuClampMode: 0 + gsHWFixes: + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the FMVs. SLES-55581: name: "FIFA 10" region: "PAL-M5" @@ -21029,6 +22138,8 @@ SLES-55605: compat: 5 gameFixes: - SoftwareRendererFMVHack # Fixes vertical lines in FMVs. + gsHWFixes: + halfPixelOffset: 1 # Corrects post processing position. SLES-55609: name: "Scooby-Doo! and the Spooky Swamp" region: "PAL-M5" @@ -21162,6 +22273,7 @@ SLES-82009: gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. roundSprite: 2 # Fixes font artifacts. SLES-82010: name: "Metal Gear Solid 2, Document of" @@ -21188,10 +22300,10 @@ SLES-82013: gsHWFixes: halfPixelOffset: 2 # Fixes blurry characters. SLES-82018: - name: "Cy Girls [Disc 1]" + name: "Cy Girls [Ice Disc]" region: "PAL-E-F-S" SLES-82019: - name: "Cy Girls [Disc 2]" + name: "Cy Girls [Aska Disc]" region: "PAL-E-F-S" memcardFilters: - "SLES-82018" @@ -21218,7 +22330,7 @@ SLES-82026: gsHWFixes: halfPixelOffset: 2 # Fixes blurry characters. SLES-82028: - name: "Star Ocean 3 - Till the End of Time [Disc1of2]" + name: "Star Ocean 3 - Till the End of Time [Disc 1 of 2]" region: "PAL-E" compat: 5 gameFixes: @@ -21227,7 +22339,7 @@ SLES-82028: halfPixelOffset: 2 # Fixes bloom and ghosting in certain areas. roundSprite: 1 # Fixes door transition vertical lines and minimap artifacts. SLES-82029: - name: "Star Ocean 3 - Till the End of Time [Disc2of2]" + name: "Star Ocean 3 - Till the End of Time [Disc 2 of 2]" region: "PAL-E" compat: 5 gameFixes: @@ -21238,17 +22350,21 @@ SLES-82029: memcardFilters: - "SLES-82028" SLES-82030: - name: "Shadow Hearts - Covenant [Disc1of2]" + name: "Shadow Hearts - Covenant [Disc 1 of 2]" region: "PAL-M3" gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. SLES-82031: - name: "Shadow Hearts - Covenant [Disc2of2]" + name: "Shadow Hearts - Covenant [Disc 2 of 2]" region: "PAL-M3" gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. memcardFilters: - "SLES-82030" SLES-82032: @@ -21259,64 +22375,66 @@ SLES-82032: gsHWFixes: halfPixelOffset: 2 # Fixes blurry characters. SLES-82034: - name: "Xenosaga Episode II [Disc1of2]" + name: "Xenosaga Episode II [Disc 1 of 2]" region: "PAL-M3" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: - "SLES-82034" - "SCES-82034" SLES-82035: - name: "Xenosaga Episode II [Disc2of2]" + name: "Xenosaga Episode II [Disc 2 of 2]" region: "PAL-M3" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: - "SLES-82034" - "SCES-82034" SLES-82036: - name: "Armored Core - Nexus [Evolution Disc]" + name: "Armored Core - Nexus [Disc 1 of 2 - Evolution Disc]" region: "PAL-M5" memcardFilters: - "SLES-82036" - "SLES-82037" SLES-82037: - name: "Armored Core - Nexus [Revolution Disc]" + name: "Armored Core - Nexus [Disc 2 of 2 - Revolution Disc]" region: "PAL-M5" memcardFilters: - "SLES-82036" - "SLES-82037" SLES-82038: - name: "Onimusha - Dawn of Dreams [Disc1of2]" + name: "Onimusha - Dawn of Dreams [Disc 1 of 2]" region: "PAL-M5" compat: 5 gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. SLES-82039: - name: "Onimusha - Dawn of Dreams [Disc2of2]" + name: "Onimusha - Dawn of Dreams [Disc 2 of 2]" region: "PAL-M5" compat: 5 gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. memcardFilters: - "SLES-82038" SLES-82042: - name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 1 of 3]" region: "PAL-E-F" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLES-82043: - name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 2 of 3]" region: "PAL-E-F" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -21325,14 +22443,14 @@ SLES-82043: memcardFilters: - "SLES-82042" SLES-82044: - name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 1 of 3]" region: "PAL-I" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLES-82045: - name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 2 of 3]" region: "PAL-I" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -21341,14 +22459,14 @@ SLES-82045: memcardFilters: - "SLES-82044" SLES-82046: - name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 1 of 3]" region: "PAL-G" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLES-82047: - name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 2 of 3]" region: "PAL-G" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -21357,14 +22475,14 @@ SLES-82047: memcardFilters: - "SLES-82046" SLES-82048: - name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 1 of 3]" region: "PAL-S" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLES-82049: - name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 2 of 3]" region: "PAL-S" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -21373,7 +22491,7 @@ SLES-82049: memcardFilters: - "SLES-82048" SLES-82050: - name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 3 of 3]" region: "PAL-E-F" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -21382,7 +22500,7 @@ SLES-82050: memcardFilters: - "SLES-82042" SLES-82051: - name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 3 of 3]" region: "PAL-I" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -21391,7 +22509,7 @@ SLES-82051: memcardFilters: - "SLES-82044" SLES-82052: - name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 3 of 3]" region: "PAL-G" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -21400,7 +22518,7 @@ SLES-82052: memcardFilters: - "SLES-82046" SLES-82053: - name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 3 of 3]" region: "PAL-S" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -21430,7 +22548,7 @@ SLKA-15007: gameFixes: - OPHFlagHack SLKA-15008: - name: "Choro Q HG2" + name: "Choro Q HG 2" region: "NTSC-K" gsHWFixes: roundSprite: 2 # Fixes sprite ghosting. @@ -21443,6 +22561,12 @@ SLKA-15011: SLKA-15013: name: "Grand Slam 2003 Tennis" # Hard Hitter 2 region: "NTSC-K" +SLKA-15015: + name: "Ichigeki Sacchuu!! HoiHoi-San" + region: "NTSC-K" +SLKA-15016: + name: "Harry Potter - Quidditch World Cup" + region: "NTSC-K" SLKA-15018: name: "Kidou Senshi Gundam Seed" region: "NTSC-K" @@ -21450,12 +22574,23 @@ SLKA-15018: eeRoundMode: 1 # Fixes camera issue. gameFixes: - FpuNegDivHack # Fixes target loss issue. +SLKA-15019: + name: "F1 Career Challenge" + region: "NTSC-K" + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLKA-15021: name: "GrowLanser3" region: "NTSC-K" compat: 5 gameFixes: - OPHFlagHack +SLKA-15023: + name: "Assault Suits Valken" + region: "NTSC-K" +SLKA-15025: + name: "Space Invaders Anniversary" + region: "NTSC-K" SLKA-15028: name: "Simple 2000 Series Ultimate Vol. 6 - Love - Upper!" region: "NTSC-K" @@ -21465,6 +22600,9 @@ SLKA-15029: SLKA-15030: name: "Simple 2000 Series Vol. 5 - The Block Kuzushi Hyper" region: "NTSC-K" +SLKA-15031: + name: "Princess Maker" + region: "NTSC-K" SLKA-15032: name: "Gradius V" region: "NTSC-K" @@ -21472,9 +22610,17 @@ SLKA-15032: SLKA-15033: name: "Princess Maker 2" region: "NTSC-K" +SLKA-15043: + name: "Super Puzzle Bobble Collection Vol 1" + region: "NTSC-K" SLKA-15044: name: "Super Puzzle Bobble 2" region: "NTSC-K" +SLKA-25004: + name: "007 - Nightfire" + region: "NTSC-K" + gsHWFixes: + halfPixelOffset: 2 # Fixes fog lines in the distance. SLKA-25006: name: "Twin Caliber" region: "NTSC-K" @@ -21482,7 +22628,7 @@ SLKA-25009: name: "Kengo 2" region: "NTSC-K" SLKA-25010: - name: "Mystic Heroes" + name: "Super Battle Bongsin" region: "NTSC-K" SLKA-25012: name: "Devil May Cry 2 Dante" @@ -21496,7 +22642,7 @@ SLKA-25013: - "SLKA-25012" SLKA-25014: name: "Evolution Snowboarding" - region: "NTSC-J" + region: "NTSC-K" SLKA-25015: name: "Evolution Skateboarding" region: "NTSC-K" @@ -21505,10 +22651,10 @@ SLKA-25018: region: "NTSC-K" SLKA-25021: name: "Shinobi" - region: "NTSC-M3" + region: "NTSC-K" compat: 5 SLKA-25024: - name: "Lilo & Stitch Experiment" + name: "Disney's Stitch - Experiment 626" region: "NTSC-K" SLKA-25026: name: "Chaos Legion" @@ -21549,13 +22695,18 @@ SLKA-25035: name: "Mobile Suit Gundam - Lost War Chronicles" region: "NTSC-K" SLKA-25038: - name: "Gun Survivor 4 - Biohazard - Heroes Never Die" + name: "Gun Survivor 4 - BioHazard - Heroes Never Die" region: "NTSC-K" gsHWFixes: halfPixelOffset: 1 # Fixes character offset with flashlight and blurriness. alignSprite: 1 # Fixes vertical lines. roundSprite: 2 # Fixes font artifacts. mergeSprite: 1 # Fixes flame-like bleeding. +SLKA-25039: + name: "Burnout 2 - Point of Impact" + region: "NTSC-K" + roundModes: + vuRoundMode: 1 # Bright lights in cars. SLKA-25041: name: "Armored Core 3 Silent Line" region: "NTSC-K" @@ -21592,6 +22743,8 @@ SLKA-25048: SLKA-25049: name: "Metal Slug 3" region: "NTSC-K" + gsHWFixes: + gpuPaletteConversion: 2 # Stops excessive VRAM usage with preloading on. SLKA-25050: name: "Shin Sangoku Musou 3" region: "NTSC-K" @@ -21609,6 +22762,7 @@ SLKA-25056: name: "Finding Nemo" region: "NTSC-K" gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. alignSprite: 1 # Fixes vertical lines. SLKA-25060: name: "I.Q. Remix+ - Intelligent Qube" @@ -21623,6 +22777,9 @@ SLKA-25062: SLKA-25063: name: "Kaido Battle" region: "NTSC-K" + gsHWFixes: + alignSprite: 1 # Fixes vertical lines. + wildArmsHack: 1 # De-blurs the 3D image. SLKA-25064: name: "Tenchu 3 Wrath of Heaven" region: "NTSC-K" @@ -21643,16 +22800,23 @@ SLKA-25067: region: "NTSC-K" SLKA-25070: name: "Guilty Gear XX Reload - The Midnight Carnival" - region: "NTSC-J-K" + region: "NTSC-K" SLKA-25071: name: "Tantei Jinguji Saburo 8 Innocent Black" region: "NTSC-K" compat: 5 +SLKA-25072: + name: "Maximo vs. Army of Zin" + region: "NTSC-K" + gsHWFixes: + halfPixelOffset: 2 # Fixes outlines around environmental objects. SLKA-25073: name: "Tomb Raider - The Angel of Darkness" region: "NTSC-K" gameFixes: - SoftwareRendererFMVHack # Fixes garbage pixels. + gsHWFixes: + autoFlush: 1 # Fixes lava effect. SLKA-25076: name: "Shin Megami Tensei 3" region: "NTSC-K" @@ -21666,11 +22830,13 @@ SLKA-25078: SLKA-25080: name: "dot hack - Infection" region: "NTSC-K" + gsHWFixes: + halfPixelOffset: 1 # Sharpens world in far distances. SLKA-25081: name: "SD Gundam G Generation Neo" region: "NTSC-K" SLKA-25082: - name: "Castlevania - Lament of Innocence" + name: "Castlevania" region: "NTSC-K" compat: 5 clampModes: @@ -21686,17 +22852,25 @@ SLKA-25084: SLKA-25085: name: "Shin Sangoku Musou 3 - Mushouden" region: "NTSC-K" +SLKA-25086: + name: "NBA Live 2004" + region: "NTSC-K" + clampModes: + vuClampMode: 2 # Missing geometry with microVU. SLKA-25087: name: "FIFA Soccer 2004" - region: "NTSC-J" + region: "NTSC-K" compat: 5 clampModes: vuClampMode: 2 # Missing geometry with microVU. +SLKA-25088: + name: "Sangokushi Senki 2" + region: "NTSC-K" SLKA-25090: name: "Starsky & Hutch" region: "NTSC-K" SLKA-25091: - name: "Hanjuku Hero vs. 3D" + name: "Bansug Yeongung vs. 3D" region: "NTSC-K" SLKA-25092: name: "Onimusha Buraiden" @@ -21735,6 +22909,9 @@ SLKA-25108: SLKA-25109: name: "Shirachuu Tankenbu" region: "NTSC-K" +SLKA-25110: + name: "NBA Live 2005" + region: "NTSC-K" SLKA-25111: name: "King of Fighters 2001, The" region: "NTSC-K" @@ -21763,7 +22940,6 @@ SLKA-25120: region: "NTSC-K" gsHWFixes: autoFlush: 1 # Reduces post-processing misalignment. - roundSprite: 2 # Reduces post-processing misalignment. SLKA-25122: name: "Sonic Heroes" region: "NTSC-K" @@ -21831,10 +23007,15 @@ SLKA-25145: SLKA-25146: name: "Kaido Battle 2 - Chain Reaction" region: "NTSC-K" + gsHWFixes: + alignSprite: 1 # Fixes vertical lines. + wildArmsHack: 1 # De-blurs the 3D image. SLKA-25149: - name: "Silent Hill 4 The Room" + name: "Silent Hill 4 - The Room" region: "NTSC-K" compat: 5 + speedHacks: + mvuFlagSpeedHack: 0 # Fixes invisible wall in front of the door leading to East 3F in the 2nd visit of Apartment world preventing Eileen's Nurse Outfit. gsHWFixes: halfPixelOffset: 1 # Fixes dark sides. SLKA-25150: @@ -21891,7 +23072,7 @@ SLKA-25171: halfPixelOffset: 2 # Reduces ghosting. preloadFrameData: 1 # Fixes red cracklines on walls. SLKA-25172: - name: "Harry Potter and The Prisoner of Azkaban" + name: "Harry Potter and the Prisoner of Azkaban" region: "NTSC-K" gsHWFixes: mipmap: 1 @@ -21912,6 +23093,8 @@ SLKA-25180: SLKA-25181: name: "Energy Airforce Aim Strike" region: "NTSC-K" + gsHWFixes: + autoFlush: 1 # Corrects post-processing effect on jet exhausts. SLKA-25182: name: "Hajime no Ippo2 Victorious Road" region: "NTSC-K" @@ -21925,12 +23108,14 @@ SLKA-25187: name: "Shin Sangoku Musou 3 - Empires" region: "NTSC-K" SLKA-25196: - name: "DRIV3R" + name: "Driv3r" region: "NTSC-K" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: autoFlush: 1 + halfPixelOffset: 2 # Fixes misaligned lighting. + cpuCLUTRender: 1 # Fixes janky coloured cars. SLKA-25198: name: "Tenchu Kurenai" region: "NTSC-K" @@ -21946,13 +23131,13 @@ SLKA-25200: textureInsideRT: 1 # Fixes rainbow effect in the pause menu before a jump. halfPixelOffset: 2 # Fixes depth lines. SLKA-25201: - name: "Armored Core Nexus Evolution DISC1" + name: "Armored Core Nexus Evolution [Disc 1]" region: "NTSC-K" memcardFilters: - "SLKA-25201" - "SLKA-25202" SLKA-25202: - name: "Armored Core Nexus Revolution DISC2" + name: "Armored Core Nexus Revolution [Disc 2]" region: "NTSC-K" memcardFilters: - "SLKA-25201" @@ -21969,9 +23154,15 @@ SLKA-25205: SLKA-25206: name: "Burnout 3 - Takedown" region: "NTSC-K" + clampModes: + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLKA-25207: name: "Sakura Taisen V - Episode 0 - Samurai Girl of Wild" region: "NTSC-K" @@ -21995,6 +23186,7 @@ SLKA-25213: compat: 5 gsHWFixes: preloadFrameData: 1 # Partially fixes HUD elements. + halfPixelOffset: 1 # Fixes misaligned blur around objects and enemies. SLKA-25214: name: "Final Fantasy X - International [PlayStation 2 - Big Hit Series]" region: "NTSC-K" @@ -22002,13 +23194,14 @@ SLKA-25214: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SLKA-25215: name: "Shining Wind" region: "NTSC-K" gameFixes: - DMABusyHack -SLKA-25216: - name: "Gitaroo-Man [PlayStation 2 - Big Hit Series]" +SLKA-25216: #serial used on printed labels only, internal serial is always SLPM-67508 + name: "Gitaroo-Man [BigHit Series]" region: "NTSC-K" SLKA-25217: name: "Shining Tears" @@ -22016,6 +23209,8 @@ SLKA-25217: SLKA-25218: name: "Hitman - Contracts" region: "NTSC-K" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLKA-25219: name: "Monster Hunter G" region: "NTSC-K" @@ -22023,15 +23218,21 @@ SLKA-25219: clampModes: vuClampMode: 3 # Fixes lighting on character models as caves and other locations don't turn mobs into glow-in-the-dark creatures by themselves. SLKA-25221: - name: "Busin Zero - Wizardry Alternative Neo" + name: "Busin 0 - Wizardry Alternative Neo" region: "NTSC-K" compat: 5 + gsHWFixes: + autoFlush: 1 # Corrects blur effects in menus. + roundSprite: 2 # Aligns some text/graphics when upscaling. SLKA-25222: name: "Rockman X8" region: "NTSC-K" gsHWFixes: autoFlush: 1 # Fixes bloom. roundSprite: 1 # Fixes misalliged bloom. +SLKA-25223: + name: "K.League - Winning Eleven 8 - Asia Championship" + region: "NTSC-K" SLKA-25224: name: "Detective Saburo Jinguji 9 - Kind of Blue" region: "NTSC-K" @@ -22056,6 +23257,8 @@ SLKA-25233: SLKA-25237: name: "Lord of the Rings, The - The Third Age" region: "NTSC-K" + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting in cutscenes. SLKA-25241: name: "Need for Speed - Underground 2" region: "NTSC-K" @@ -22091,8 +23294,11 @@ SLKA-25251: SLKA-25252: name: "Forgotten Realms - Demon Stone" region: "NTSC-K" + clampModes: + vuClampMode: 3 # Removes occasional SPS where the head goes into nightmare fuel. gsHWFixes: halfPixelOffset: 1 # Reduces ghosting. + roundSprite: 1 # Reduces ghosting even more. SLKA-25254: name: "Digimon Rumble Arena 2" region: "NTSC-K" @@ -22120,7 +23326,7 @@ SLKA-25262: region: "NTSC-K" SLKA-25263: name: "NanoBreaker" - region: "NTSC-J" + region: "NTSC-K" compat: 5 SLKA-25264: name: "Full Spectrum Warrior" @@ -22134,6 +23340,7 @@ SLKA-25265: eeRoundMode: 0 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but still an issue compared to native. + roundSprite: 2 # Clears up much of the blurring that HPO Special does not. SLKA-25266: name: "Sangokushi IX [PlayStation 2 - Big Hit Series]" region: "NTSC-K" @@ -22143,20 +23350,28 @@ SLKA-25268: SLKA-25270: name: "Armored Core - Formula Front" region: "NTSC-K" +SLKA-25274: + name: "Princess Maker 4" + region: "NTSC-K" SLKA-25275: name: "King of Fighters 2002-2003, The" region: "NTSC-K" +SLKA-25277: + name: "Brothers In Arms - Road to Hill 30" + region: "NTSC-K" + gsHWFixes: + halfPixelOffset: 2 # Reduces blurriness, there are still ghosting issues for like lighting poles. SLKA-25279: name: "Hello Kitty - Rescue Mission" region: "NTSC-K" SLKA-25280: - name: "Ryu ga Gotoku 2 [Disc1of2]" + name: "Ryu ga Gotoku 2 [Disc 1 of 2]" region: "NTSC-K" memcardFilters: - "SLKA-25280" - "SLKA-25342" SLKA-25281: - name: "Ryu ga Gotoku 2 [Disc2of2]" + name: "Ryu ga Gotoku 2 [Disc 2 of 2]" region: "NTSC-K" memcardFilters: - "SLKA-25280" @@ -22215,14 +23430,21 @@ SLKA-25304: name: "Burnout Revenge" region: "NTSC-K" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 0 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLKA-25307: name: "Dragon Ball Z Sparking" region: "NTSC-K" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes lines when powering up. + roundSprite: 2 # Fixes misaligned bloom. SLKA-25311: name: "Marvel Nemesis - Rise of the Imperfects" region: "NTSC-K" @@ -22259,6 +23481,9 @@ SLKA-25320: compat: 5 gameFixes: - VIF1StallHack # Fixes black screen on boot. + gsHWFixes: + autoFlush: 1 # Fixes missing bloom effects. + halfPixelOffset: 2 # Fixes misaligned lighting and bloom. SLKA-25321: name: "K.League - Winning Eleven 9 - Asia Championship" region: "NTSC-K" @@ -22271,6 +23496,11 @@ SLKA-25323: SLKA-25325: name: "SSX On Tour" region: "NTSC-K" +SLKA-25327: + name: "Harry Potter and the Goblet of Fire" + region: "NTSC-K" + gsHWFixes: + mipmap: 1 SLKA-25328: name: "Castlevania - Curse of Darkness" region: "NTSC-K" @@ -22278,6 +23508,8 @@ SLKA-25328: clampModes: vuClampMode: 0 # Fixes SPS with microVU. eeClampMode: 2 # Fixes missing blade. + gsHWFixes: + roundSprite: 1 # Fixes font sizes to be bigger. memcardFilters: - "SLKA-25328" - "SLKA-25082" @@ -22298,14 +23530,20 @@ SLKA-25334: region: "NTSC-K" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLKA-25335: name: "Shadow the Hedgehog" region: "NTSC-K" + gsHWFixes: + halfPixelOffset: 2 # Fixes misaligned lighting. SLKA-25341: name: "Driver - Parallel Lines" region: "NTSC-K" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + cpuSpriteRenderBW: 2 # Fixes some bad textures. + cpuCLUTRender: 1 # Fixes the rest of the bad textures. SLKA-25342: name: "Ryu ga Gotoku" region: "NTSC-K" @@ -22322,7 +23560,7 @@ SLKA-25352: name: "Full Metal Alchemist - Dream Carnival" region: "NTSC-K" SLKA-25353: - name: "Metal Gear Solid 3 - Subsistence [Limited Edition] [Disc1of2]" + name: "Metal Gear Solid 3 - Subsistence [Limited Edition] [Disc 1 of 2]" region: "NTSC-K" compat: 5 gameFixes: @@ -22330,7 +23568,7 @@ SLKA-25353: gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLKA-25354: - name: "Metal Gear Solid 3 - Subsistence [Limited Edition] [Disc2of2]" + name: "Metal Gear Solid 3 - Subsistence [Limited Edition] [Disc 2 of 2]" region: "NTSC-K" compat: 5 gameFixes: @@ -22406,6 +23644,8 @@ SLKA-25397: name: "Dragon Ball Z Sparking NEO" region: "NTSC-K" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes extreme ghosting. SLKA-25401: name: "FlatOut 2" region: "NTSC-K" @@ -22420,6 +23660,13 @@ SLKA-25407: name: "Dragon Ball Z - Sparkling! Meteor" region: "NTSC-K" compat: 5 +SLKA-25410: + name: "BioHazard 4" + region: "NTSC-K" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness. SLKA-25413: name: "SD Gundam G - Generation Spirits" region: "NTSC-K" @@ -22437,6 +23684,13 @@ SLKA-25443: name: "Musou Orochi Maou Sairin" region: "NTSC-K" compat: 5 +SLKA-25459: + name: "Transformers - Revenge of the Fallen" + region: "NTSC-K" + compat: 5 + gsHWFixes: + cpuSpriteRenderBW: 2 # Fixes textures. + preloadFrameData: 1 # Fixes missing splash logo at boot. SLKA-25477: name: "World Soccer Winning Eleven 2011" region: "NTSC-K" @@ -22450,6 +23704,7 @@ SLKA-35001: gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. roundSprite: 2 # Fixes font artifacts. SLKA-35003: name: "Sakura Taisen - Atsuki Chishioni" @@ -22470,6 +23725,18 @@ SLPM-20436: name: "Sakigake!! Otokojuku" region: "NTSC-J" compat: 5 +SLPM-55004: + name: "Burnout Revenge (EASY 1980)" + region: "NTSC-J" + clampModes: + vuClampMode: 0 # Fixes buggy lighting in the garage. + gsHWFixes: + halfPixelOffset: 2 # Fixes depth lines. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLPM-55005: name: "Mana Khemia 2 - Ochita Gakuen to Renkinjutsushi Tachi" region: "NTSC-J" @@ -22497,14 +23764,32 @@ SLPM-55024: SLPM-55033: name: "J. League Winning Eleven 2008 - Club Championship" region: "NTSC-J" +SLPM-55036: + name: "Burnout Dominator (EASY 1980)" + region: "NTSC-J" + clampModes: + vuClampMode: 3 # Fixes buggy lighting in the garage. + gsHWFixes: + halfPixelOffset: 2 # Fixes depth lines. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLPM-55039: name: "Soukoku no Kusabi - Hiiro no Kakera 3 [Limited Edition]" region: "NTSC-J" SLPM-55040: name: "Soukoku no Kusabi - Hiiro no Kakera 3" region: "NTSC-J" +SLPM-55041: + name: "Kanokon Esuii" + region: "NTSC-J" SLPM-55042: - name: "Suika A.S Eternal Name - Sweet So Sweet [Best Edition]" + name: "Suika A.S+ Eternal Name - Sweet So Sweet [Best Edition]" + region: "NTSC-J" +SLPM-55044: + name: "Heart no Kuni no Alice - Wonderful Wonder World" region: "NTSC-J" SLPM-55047: name: "Sugar+Spice! - Anoko no Suteki na Nanimokamo" @@ -22512,6 +23797,12 @@ SLPM-55047: SLPM-55051: name: "Will o' Wisp - Easter no Kiseki" region: "NTSC-J" +SLPM-55057: + name: "Hakushaku to Yousei - Yume to Kizuna ni Omoi o Hasete" + region: "NTSC-J" +SLPM-55059: + name: "Kanuchi - Shiroki Tsubasa no Shou" + region: "NTSC-J" SLPM-55060: name: "D.Gray-man - Sousha no Shikaku" region: "NTSC-J" @@ -22551,11 +23842,23 @@ SLPM-55070: SLPM-55071: name: "Yumemi Hakusho - Second Dream" region: "NTSC-J" +SLPM-55080: + name: "Drag-on Dragoon [Ultimate Hits]" + region: "NTSC-J" + compat: 5 + clampModes: + eeClampMode: 3 # Characters are visible in-game. + gsHWFixes: + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLPM-55081: - name: "Drag-on Dragoon 2 - Fuuin no Kurenai (Ultimate Hits)" + name: "Drag-on Dragoon 2 - Fuuin no Aka, Haitoku no Kuro [Ultimate Hits]" region: "NTSC-J" clampModes: eeClampMode: 2 # Fixes wrong color on some characters and breakable objects. + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting characters. + mergeSprite: 1 # Align sprite fixes FMVs but not garbage in-game, so needs merge sprite instead. + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLPM-55086: name: "Ever17 The Out of Infinity [Renai Game Selection]" region: "NTSC-J" @@ -22572,7 +23875,7 @@ SLPM-55092: name: "Grand Theft Auto - San Andreas [Best Price]" region: "NTSC-J" clampModes: - vuClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. + eeClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. gsHWFixes: autoFlush: 1 SLPM-55096: @@ -22608,15 +23911,20 @@ SLPM-55117: name: "beatmania IIDX 15 DJ TROOPERS" region: "NTSC-J" SLPM-55118: - name: "Galaxy Angel II - Eigou Kaiki no Koku [Disc1of2]" + name: "Galaxy Angel II - Eigou Kaiki no Koku [Disc 1 of 2]" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Reduces misaligned lighting and other effects. SLPM-55119: - name: "Galaxy Angel II - Eigou Kaiki no Koku [Disc2of2]" + name: "Galaxy Angel II - Eigou Kaiki no Koku [Disc 2 of 2]" region: "NTSC-J" memcardFilters: - "SLPM-55118" SLPM-55120: - name: "Fukakutei Sekai no Tantei Shinshi - Akugyou Futaasa no Jiken File [Limited Edition]" + name: "Fukakutei Sekai no Tantei Shinshi - Akugyou Souma no Jiken File [Limited Edition]" + region: "NTSC-J" +SLPM-55121: + name: "Fukakutei Sekai no Tantei Shinshi - Akugyou Souma no Jiken File" region: "NTSC-J" SLPM-55122: name: "Sengoku Musou 2" @@ -22647,6 +23955,13 @@ SLPM-55131: SLPM-55138: name: "Harukanaru Toki no Naka de - Yume no Ukihashi Special" region: "NTSC-J" +SLPM-55140: + name: "Silent Hill 4 - The Room [Konami Dendou Selection]" + region: "NTSC-J" + speedHacks: + mvuFlagSpeedHack: 0 # Fixes invisible wall in front of the door leading to East 3F in the 2nd visit of Apartment world preventing Eileen's Nurse Outfit. + gsHWFixes: + halfPixelOffset: 1 # Fixes dark sides. SLPM-55146: name: "Jikkyou Powerful Pro Yakyuu 2009" region: "NTSC-J" @@ -22675,6 +23990,9 @@ SLPM-55159: name: "Hyakko - Yorozuya Jikenbo!" region: "NTSC-J" SLPM-55160: + name: "Kanuchi - Kuroki Tsubasa no Shou [Limited Edition]" + region: "NTSC-J" +SLPM-55161: name: "Kanuchi - Kuroki Tsubasa no Shou" region: "NTSC-J" SLPM-55162: @@ -22778,11 +24096,30 @@ SLPM-55211: SLPM-55212: name: "Jigoku Shoujo Mioyosuga [Limited Edition]" region: "NTSC-J" +SLPM-55213: + name: "Jigoku Shoujo Mioyosuga" + region: "NTSC-J" +SLPM-55215: + name: "Hiiro no Kakera - Shin Tamayori-hime Denshou" + region: "NTSC-J" +SLPM-55216: + name: "Hiiro no Kakera - Tamayori-hime Kitan [Aizou-ban]" + region: "NTSC-J" +SLPM-55219: + name: "Osouji Sentai Clean Keeper H [Limited Edition]" + region: "NTSC-J" + gsHWFixes: + texturePreloading: 1 # Fixes poor performance. +SLPM-55220: + name: "Osouji Sentai Clean Keeper H" + region: "NTSC-J" + gsHWFixes: + texturePreloading: 1 # Fixes poor performance. SLPM-55221: - name: "beatmania IIDX 16 EMPRESS + PREMIUM BEST [EMPRESS DISC]" + name: "beatmania IIDX 16 EMPRESS + PREMIUM BEST [Disc 1 of 2 - EMPRESS DISC]" region: "NTSC-J" SLPM-55222: - name: "beatmania IIDX 16 EMPRESS + PREMIUM BEST [PREMIUM BEST DISC]" + name: "beatmania IIDX 16 EMPRESS + PREMIUM BEST [Disc 2 of 2 - PREMIUM BEST DISC]" region: "NTSC-J" SLPM-55226: name: "FIFA 10 - World Class Soccer" @@ -22790,6 +24127,9 @@ SLPM-55226: SLPM-55239: name: "Death Connection" region: "NTSC-J" +SLPM-55240: + name: "ef - A Fairy Tale of the Two. [Shokai Gentei Tokubetsu Doukonban]" + region: "NTSC-J" SLPM-55243: name: "Suzunone Seven - Rebirth Knot" region: "NTSC-J" @@ -22800,6 +24140,9 @@ SLPM-55244: halfPixelOffset: 2 # Fixes blurriness. skipDrawStart: 1 # Removes even more blurriness and garbage texture like on top left. skipDrawEnd: 1 # Removes even more blurriness and garbage texture like on top left. +SLPM-55245: + name: "Himawari - Pebble in the Sky" + region: "NTSC-J" SLPM-55246: name: "Wand of Fortune - Mirai e no Prologue" region: "NTSC-J" @@ -22844,8 +24187,11 @@ SLPM-55269: region: "NTSC-J" gameFixes: - SoftwareRendererFMVHack # Vertical and horizontal lines in FMV. +SLPM-55270: + name: "Shinkyoku Soukai Polyphonica - After School" + region: "NTSC-J" SLPM-55271: - name: "FIFA 10 - World Class Soccer (Ea -SY! 1980)" + name: "FIFA 10 - World Class Soccer [Ea -SY! 1980]" region: "NTSC-J" SLPM-55273: name: "Hakuouki - Reimeiroku" @@ -22871,15 +24217,24 @@ SLPM-55283: SLPM-55285: name: "Crimson Empire" region: "NTSC-J" +SLPM-55288: + name: "Shin Koihime Musou - Otome Ryouran - Sangokushi Engi" + region: "NTSC-J" SLPM-55292: name: "Grand Theft Auto - San Andreas [Rockstar Classics]" region: "NTSC-J" clampModes: - vuClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. + eeClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. gsHWFixes: autoFlush: 1 +SLPM-55294: + name: "World Soccer Winning Eleven 2012" + region: "NTSC-J" +SLPM-55298: + name: "Final Fantasy XI - Adoulin no Makyou" + region: "NTSC-J" SLPM-60101: - name: "0 Story [Demo]" + name: "0 Story [Taikenban]" region: "NTSC-J" gameFixes: - SoftwareRendererFMVHack # Fixes removed bloom in FMV. @@ -22906,6 +24261,10 @@ SLPM-60109: gsHWFixes: cpuFramebufferConversion: 1 textureInsideRT: 1 + halfPixelOffset: 2 # Fixes title screen and some intro post processing alignment. + roundSprite: 1 # Fixes ui and hud alignment. + gpuPaletteConversion: 2 # Lots of CLUTs in large textures. + cpuCLUTRender: 1 # Fixes car textures. SLPM-60123: name: "Gekikuukan Pro Baseball - The End of the Century 1999 [Trial]" region: "NTSC-J" @@ -22926,12 +24285,22 @@ SLPM-60138: vuClampMode: 2 # Fixes water reflection. gameFixes: - EETimingHack # Fixes flickering graphics. + gsHWFixes: + cpuCLUTRender: 1 # Fixes shadows, object and enemy colours, platform transitions. SLPM-60167: name: "Zero [Trial]" region: "NTSC-J" gsHWFixes: halfPixelOffset: 2 # Reduces blurriness. disablePartialInvalidation: 1 # Fixes ghost rendering. +SLPM-60149: + name: "Ace Combat 04 - Shattered Skies [Trial]" + region: "NTSC-J" + gsHWFixes: + mipmap: 1 + roundSprite: 2 # Fixes font and HUD artifacts. + alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. SLPM-60172: name: "Itadaki Street 3 - Okuman Chouja ni Shiteageru" region: "NTSC-J" @@ -22964,10 +24333,14 @@ SLPM-60246: name: "Burnout 3 - Takedown [Trial]" region: "NTSC-J" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLPM-60251: name: "Devil May Cry 3 [Trial Version]" region: "NTSC-J" @@ -22975,12 +24348,20 @@ SLPM-60251: eeRoundMode: 0 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but still an issue compared to native. + roundSprite: 2 # Clears up much of the blurring that HPO Special does not. SLPM-60254: name: "Zettai Zetsumei Toshi 2 - Itetsuita Kioku-tachi [Trial A]" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 1 # Fixes some shading/shadows. SLPM-60256: name: "Dengeki D73 demo" region: "NTSC-J" +SLPM-60257: + name: "Death by Degrees" + region: "NTSC-J" + gsHWFixes: + alignSprite: 1 # Fixes FMV lines. SLPM-60260: name: "D1 Professional Drift Grand Prix Series [Taikenban]" region: "NTSC-J" @@ -23015,9 +24396,13 @@ SLPM-60272: - EETimingHack # Mitigates bounciness of vertical shaking but better fix with EE cyclerate +1. gsHWFixes: alignSprite: 1 # Fixes vertical lines. + textureInsideRT: 1 # Fixes corruption. + texturePreloading: 1 # Performs much better with partial preload. SLPM-60273: name: "Zettai Zetsumei Toshi 2 - Itetsuita Kioku-tachi [Trial B]" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 1 # Fixes some shading/shadows. SLPM-60274: name: "Full House Kiss 2 [Trial]" region: "NTSC-J" @@ -23027,6 +24412,11 @@ SLPM-60277: SLPM-60282: name: "Lucky Star - RAvish Romance [Trial]" region: "NTSC-J" +SLPM-61001: + name: "Onimusha [Trial]" + region: "NTSC-J" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLPM-61007: name: "Maken Shao [Trial]" region: "NTSC-J" @@ -23058,7 +24448,7 @@ SLPM-61018: name: "Abarenbou Princess [Trial]" region: "NTSC-J" SLPM-61039: - name: "Gun Survivor 4 - Biohazard - Heroes Never Die [Demo]" + name: "Gun Survivor 4 - BioHazard - Heroes Never Die [Demo]" region: "NTSC-J" gsHWFixes: halfPixelOffset: 1 # Fixes character offset with flashlight and blurriness. @@ -23068,6 +24458,8 @@ SLPM-61039: SLPM-61046: name: "Dennou Senki - Virtual-On Marz [Trial]" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 2 # Fixes CLUT colours. SLPM-61051: name: "Dengeki PS2 D61" region: "NTSC-J" @@ -23086,10 +24478,14 @@ SLPM-61117: gameFixes: - EETimingHack # Fixes garbled character animation. SLPM-61120: - name: "Drag-on Dragoon 2 - Fuuin no Kurenai [Trial Version]" + name: "Drag-on Dragoon 2 - Fuuin no Aka, Haitoku no Kuro [Trial Version]" region: "NTSC-J" clampModes: eeClampMode: 2 # Fixes wrong color on some characters and breakable objects. + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting characters. + mergeSprite: 1 # Align sprite fixes FMVs but not garbage in-game, so needs merge sprite instead. + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLPM-61127: name: "FlatOut [Trial]" region: "NTSC-J" @@ -23098,11 +24494,17 @@ SLPM-61130: region: "NTSC-J" gameFixes: - VIF1StallHack # Fixes black screen on boot. + gsHWFixes: + autoFlush: 1 # Fixes missing bloom effects. + halfPixelOffset: 2 # Fixes misaligned lighting and bloom. SLPM-61132: name: "Ikusa Gami [Trial Version]" region: "NTSC-J" gameFixes: - VIF1StallHack # Fixes black screen on boot. + gsHWFixes: + autoFlush: 1 # Fixes missing bloom effects. + halfPixelOffset: 2 # Fixes misaligned lighting and bloom. SLPM-61133: name: "Soul Calibur III [Trial Version]" region: "NTSC-J" @@ -23113,6 +24515,7 @@ SLPM-61133: gsHWFixes: alignSprite: 1 # Fixes vertical lines. halfPixelOffset: 1 # Fixes blurriness. + texturePreloading: 1 # Improves performance. SLPM-61135: name: "Naruto - Narutimett Hero 3 [Trial Version]" region: "NTSC-J" @@ -23179,6 +24582,9 @@ SLPM-62016: name: "Super Bust-A-Move" region: "NTSC-J" compat: 5 +SLPM-62020: + name: "GI Jockey 2" + region: "NTSC-J" SLPM-62021: name: "Angelique Trois [Premium Box]" region: "NTSC-J" @@ -23203,7 +24609,7 @@ SLPM-62028: name: "Greatest Striker" region: "NTSC-J" SLPM-62029: - name: "Dance Summit 2001" + name: "Bust A Move - Dance Summit 2001" region: "NTSC-J" compat: 5 SLPM-62031: @@ -23216,7 +24622,7 @@ SLPM-62034: name: "Jikkyou Powerful Pro Yakyuu 7 Ketteiban" region: "NTSC-J" SLPM-62035: - name: "Got to Do! Hot Spring Table Tennis" + name: "Iku ze! Onsen Takkyuu!!" region: "NTSC-J" SLPM-62036: name: "Chou Kousoku Reversi" @@ -23244,7 +24650,7 @@ SLPM-62046: region: "NTSC-J" compat: 5 SLPM-62047: - name: "Endnesia" + name: "Endonesia" region: "NTSC-J" SLPM-62048: name: "Battle Gear 2" @@ -23274,6 +24680,8 @@ SLPM-62056: SLPM-62060: name: "Winning Post 4 Maximum 2001" region: "NTSC-J" + gsHWFixes: + mipmap: 1 # Improves ground textures to match sw renderer. SLPM-62062: name: "Gitaroo Man One" region: "NTSC-J" @@ -23352,10 +24760,10 @@ SLPM-62096: name: "Flying Circus" region: "NTSC-J" SLPM-62097: - name: "Keisusaikan, The - Shinjuku 24 Hours" + name: "Keisatsukan, The - Shinjuku 24-ji" region: "NTSC-J" SLPM-62098: - name: "Busin Zero - Wizardry Alternative" + name: "Busin - Wizardry Alternative" region: "NTSC-J" SLPM-62100: name: "Rez [Special Package]" @@ -23367,8 +24775,11 @@ SLPM-62101: SLPM-62102: name: "Crazy Taxi" region: "NTSC-J" +SLPM-62103: + name: "EX Okuman Chouja Game - The Money Battle" + region: "NTSC-J" SLPM-62104: - name: "Choro-Q HG2" + name: "Choro Q HG 2" region: "NTSC-J" gsHWFixes: roundSprite: 2 # Fixes sprite ghosting. @@ -23395,6 +24806,9 @@ SLPM-62114: gsHWFixes: preloadFrameData: 1 # Fixes random texture corruptions such as horizontal lines. cpuFramebufferConversion: 1 # Fixes fog wall. +SLPM-62115: + name: "EX Jinsei Game [Doukonban]" + region: "NTSC-J" SLPM-62117: name: "Momotaro Train X" region: "NTSC-J" @@ -23423,6 +24837,9 @@ SLPM-62124: SLPM-62125: name: "Gauntlet - Dark Legacy" region: "NTSC-J" +SLPM-62126: + name: "Hyper Sports 2002 Winter" + region: "NTSC-J" SLPM-62127: name: "Maximo" region: "NTSC-J" @@ -23431,7 +24848,7 @@ SLPM-62128: name: "Le Mans 24 Hours" region: "NTSC-J" SLPM-62129: - name: "Climax Tennis - WTA Tour Edition" + name: "Climax Tennis" region: "NTSC-J" SLPM-62130: name: "Virtua Fighter 4" @@ -23465,6 +24882,9 @@ SLPM-62139: SLPM-62140: name: "Cyber Jansou - Toufuusou-hen" region: "NTSC-J" +SLPM-62141: + name: "Eisei Meijin VI - Tsuushin Shougi Club" + region: "NTSC-J" SLPM-62142: name: "World Grand Prix" region: "NTSC-J" @@ -23494,10 +24914,10 @@ SLPM-62154: region: "NTSC-J" compat: 5 SLPM-62155: - name: "Baseball 2002, The" + name: "Baseball 2002, The - Battle Ball Park Sengen" region: "NTSC-J" SLPM-62157: - name: "Building Baku" + name: "Buile Baku" region: "NTSC-J" SLPM-62158: name: "Virtua Fighter 4" @@ -23525,6 +24945,9 @@ SLPM-62168: SLPM-62169: name: "Live World Soccer 2002" region: "NTSC-J" +SLPM-62170: + name: "Internet Mahjong - Toufuusou de Asobou" + region: "NTSC-J" SLPM-62171: name: "Simple 2000 Series Vol. 5 - The Block Kuzushi Hyper" region: "NTSC-J" @@ -23590,6 +25013,8 @@ SLPM-62201: SLPM-62202: name: "Winning Post 4 Maximum 2001" region: "NTSC-J" + gsHWFixes: + mipmap: 1 # Improves ground textures to match sw renderer. SLPM-62203: name: "Dog of Bay" region: "NTSC-J" @@ -23613,10 +25038,10 @@ SLPM-62209: name: "Gigantic Drive" region: "NTSC-J" SLPM-62211: - name: "18 Wheeler" + name: "18 Wheeler - American Pro Trucker" region: "NTSC-J" SLPM-62212: - name: "Critical Bullet - Seventh Target" + name: "Critical Bullet - 7th Target" region: "NTSC-J" SLPM-62213: name: "Ultimate Fighting Championship 2 - Tap-Out" @@ -23644,6 +25069,8 @@ SLPM-62219: SLPM-62221: name: "Winning Post 5 - Max 2002" region: "NTSC-J" + gsHWFixes: + mipmap: 1 # Improves ground textures to match sw renderer. SLPM-62223: name: "Simple 2000 Series Vol. 11 - The Off-Road Buggy" region: "NTSC-J" @@ -23677,7 +25104,7 @@ SLPM-62233: name: "Simple 2000 Series Ultimate Vol. 4 - Urawaza Ikasa Mahjong Machi" region: "NTSC-J" SLPM-62234: - name: "Simple2000 Vol.13 The Renai Adv Garasu No Mori" + name: "Simple 2000 Series Vol. 13 - Onna no Ko no Tame no - The Renai Adventure - Garasu no Mori" region: "NTSC-J" SLPM-62235: name: "GetBass Battle" @@ -23688,6 +25115,9 @@ SLPM-62236: compat: 5 gameFixes: - XGKickHack # Fixes black models on certain games in World Tour. + gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 SLPM-62237: name: "Gakuen Toshi Vara Noir [Limited Edition]" region: "NTSC-J" @@ -23706,10 +25136,10 @@ SLPM-62241: mipmap: 1 cpuFramebufferConversion: 1 # Fixes right side of the screen from garbage textures. SLPM-62244: - name: "Choro Q - High Grade 3" + name: "Choro Q HG 3" region: "NTSC-J" SLPM-62245: - name: "Yuusei Kara no Buutai - Episode 2" + name: "Yuusei kara no Buttai X - Episode II" region: "NTSC-J" SLPM-62247: name: "Shin Contra" @@ -23743,6 +25173,9 @@ SLPM-62255: SLPM-62256: name: "Super Trucks" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Gets rid of fog line. + roundSprite: 1 # Fixes lines in FMVs. SLPM-62257: name: "Rally Championship" region: "NTSC-J" @@ -23767,6 +25200,11 @@ SLPM-62264: SLPM-62265: name: "Power Smash 2" region: "NTSC-J" + gameFixes: + - XGKickHack # Fixes black models on certain games in World Tour. + gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 SLPM-62266: name: "Momotaro Densetsu XI" region: "NTSC-J" @@ -23807,7 +25245,10 @@ SLPM-62278: name: "Hunter x Hunter" region: "NTSC-J" SLPM-62279: - name: "Winning Post 5 - Maximum 2002" + name: "GI Jockey 3 [Premium Pack]" + region: "NTSC-J" +SLPM-62280: + name: "Winning Post 5 Maximum 2002 [Premium Pack]" region: "NTSC-J" SLPM-62282: name: "Silent Scope 2 - Innocent Sweeper" @@ -23822,15 +25263,23 @@ SLPM-62285: SLPM-62287: name: "Fire Pro Wrestling Z [Limited Edition]" region: "NTSC-J" + gameFixes: + - InstantDMAHack # Fixes bad ring/UI textures. SLPM-62288: name: "pop'n music Best Hits!" region: "NTSC-J" +SLPM-62290: + name: "TV Kuraemon" + region: "NTSC-J" SLPM-62291: - name: "Bomberman Land 2" + name: "Bomberman Land 2 - Game Shijou Saidai no Theme Park" region: "NTSC-J" SLPM-62292: name: "Warrior Blade - Rastan vs. Barbarian" region: "NTSC-J" +SLPM-62293: + name: "Magical Pachinko Cotton - Pachinko Jikki Simulation" + region: "NTSC-J" SLPM-62294: name: "Simple 2000 Series Vol. 21 - The Moonlight Tale RPG" region: "NTSC-J" @@ -23858,6 +25307,9 @@ SLPM-62300: SLPM-62301: name: "Aerobics Revolution" region: "NTSC-J" +SLPM-62302: + name: "Eisei Meijin 7 - Tsuushin Shougi Club" + region: "NTSC-J" SLPM-62305: name: "Othello [SuperLite 2000]" region: "NTSC-J" @@ -23900,7 +25352,7 @@ SLPM-62321: name: "Robocop" region: "NTSC-J" SLPM-62322: - name: "Conveni 3, The" + name: "Conveni 3, The - Ano Machi o Dokusen seyo" region: "NTSC-J" SLPM-62323: name: "AI Shougi 2003" @@ -23949,12 +25401,14 @@ SLPM-62340: name: "Apprentice Magician" region: "NTSC-J" SLPM-62341: - name: "Alice's Adventures in Wonderland" + name: "Fushigi no Kuni no Alice" region: "NTSC-J" SLPM-62342: name: "Fire Pro Wrestling Z" region: "NTSC-J" compat: 5 + gameFixes: + - InstantDMAHack # Fixes bad ring/UI textures. SLPM-62343: name: "Simple 2000 Series Vol. 34 - The Renai Horror Adventure - Hyouryuu Shoujo" region: "NTSC-J" @@ -23964,6 +25418,9 @@ SLPM-62344: SLPM-62345: name: "Simple 2000 Series Vol. 32 - The Sensha" region: "NTSC-J" +SLPM-62346: + name: "Keiei Simulation - Jurassic Park [Konami the Best]" + region: "NTSC-J" SLPM-62348: name: "Mechsmith, The - Rum" region: "NTSC-J" @@ -23983,7 +25440,7 @@ SLPM-62354: name: "Space Invaders 25th Anniversary" region: "NTSC-J" SLPM-62355: - name: "Choro Q - High Grade 2" + name: "Choro Q HG 2" region: "NTSC-J" gsHWFixes: roundSprite: 2 # Fixes sprite ghosting. @@ -24061,6 +25518,9 @@ SLPM-62385: name: "Sega Ages 2500 Series Vol.05 - Golden Axe" region: "NTSC-J" compat: 5 +SLPM-62386: + name: "Ishikura Noboru Kudan no Igo Kouza - Chuukyuu-hen - Jitsuryoku 5-kyuu o Mezasu Hito e" + region: "NTSC-J" SLPM-62389: name: "Big Bass - Bass Tsuri Kanzen Kouryaku [SuperLite 2000 Series]" region: "NTSC-J" @@ -24073,13 +25533,23 @@ SLPM-62391: SLPM-62392: name: "G1 Jockey 3 2003" region: "NTSC-J" +SLPM-62393: + name: "GI Jockey 3 2003 [Premium Pack]" + region: "NTSC-J" SLPM-62394: name: "Power Smash 2 [Sega The Best - 2800 Series]" region: "NTSC-J" + gameFixes: + - XGKickHack # Fixes black models on certain games in World Tour. + gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 SLPM-62395: name: "Simple 2000 Series Vol. 37 - The Shooting - Double Shienryu" region: "NTSC-J" compat: 5 + gsHWFixes: + gpuPaletteConversion: 2 # Fixes hashcache from exploding. SLPM-62396: name: "Simple 2000 Honkaku Shikou Series Vol. 6 - The Card" region: "NTSC-J" @@ -24109,8 +25579,10 @@ SLPM-62406: name: "Kurogane no Houkou - Warship Commander [Koei The Best]" region: "NTSC-J" SLPM-62407: - name: "Hisako Takahashi's Let's Marathon!" + name: "Takahashi Naoko no Marathon Shiyou yo!" region: "NTSC-J" + gsHWFixes: + preloadFrameData: 1 # Fixes missing text. SLPM-62408: name: "Harry Potter - Quidditch World Cup" region: "NTSC-J" @@ -24184,7 +25656,7 @@ SLPM-62433: region: "NTSC-J" compat: 5 SLPM-62437: - name: "Suisui Sweet - Amai Ai no Mitsukekata" + name: "Sui Sui Sweet - Amai Koi no Mitsuke-kata" region: "NTSC-J" SLPM-62438: name: "Growlanser Collection - The Dual Darkness" @@ -24422,7 +25894,9 @@ SLPM-62512: name: "Keiei Simulation - Jurassic Park [Konami The Best]" region: "NTSC-J" gsHWFixes: - mipmap: 1 + autoFlush: 1 # Fixes glows. + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. + textureInsideRT: 1 # Fixes rainbow lighting for some areas. SLPM-62513: name: "Harry Potter and the Chamber of Secrets [EA Best Hits]" region: "NTSC-J" @@ -24527,6 +26001,8 @@ SLPM-62547: name: "Sega Ages 2500 Series Vol.16 - Virtua Fighter 2" region: "NTSC-J" compat: 5 + gsHWFixes: + cpuCLUTRender: 2 # Fixes CLUT colours. SLPM-62548: name: "Heisei Bakutoden [SuperLite 2000 Series]" region: "NTSC-J" @@ -24585,8 +26061,10 @@ SLPM-62563: SLPM-62564: name: "Simple 2000 Series Vol. 68 - The Tousou Highway - Nagoya - Tokyo" region: "NTSC-J" + gameFixes: + - XGKickHack # Fixes distant car textures. SLPM-62565: - name: "Boboboubo Boubobo - Shuumare! Taikan Boubobo [with Camera]" + name: "Boboboubo Boubobo - Atsumare!! Taikan Boubobo [Doukonban]" region: "NTSC-J" SLPM-62566: name: "Typing of the Dead - Zombie Panic" @@ -24610,7 +26088,7 @@ SLPM-62571: region: "NTSC-J" compat: 5 SLPM-62572: - name: "Boboboubo Boubobo - Shuumare! Taikan Boubobo" + name: "Boboboubo Boubobo - Atsumare!! Taikan Boubobo" region: "NTSC-J" SLPM-62574: name: "Gambler Densetsu Tetsuya Digest [Athena Best Collection Vol.3]" @@ -24636,6 +26114,9 @@ SLPM-62581: region: "NTSC-J" gameFixes: - XGKickHack # Fixes black and white fighters. + speedHacks: + MTVUSpeedHack: 0 # Fixes game from crashing. + InstantVU1SpeedHack: 0 # Fixes graphical issues. patches: 0A1042EE: content: |- @@ -24674,7 +26155,7 @@ SLPM-62594: name: "Hot Gimmick Cosplay Mahjong - Pure" region: "NTSC-J" SLPM-62595: - name: "Choro Q - HG 3 [Takara The Best]" + name: "Choro Q HG 3 [Takara The Best]" region: "NTSC-J" SLPM-62596: name: "EX Okuman Chouja Game [Takara The Best]" @@ -24692,7 +26173,7 @@ SLPM-62601: name: "Conveti 3, The [Hamster The Best]" region: "NTSC-J" SLPM-62602: - name: "Yokushin - Giga Wing Generations" + name: "Yokushin - GigaWing Generations" region: "NTSC-J" SLPM-62603: name: "Wizardry Summoner" @@ -24707,6 +26188,8 @@ SLPM-62606: name: "Sega Ages 2500 Series Vol.19 - Fighting Vipers" region: "NTSC-J" compat: 5 + gsHWFixes: + cpuCLUTRender: 2 # Fixes CLUT colours. SLPM-62607: name: "Shikigami no Shiro III [Taito The Best]" region: "NTSC-J" @@ -24758,6 +26241,8 @@ SLPM-62623: name: "Elemental Gerad" region: "NTSC-J" compat: 5 + gsHWFixes: + deinterlace: 9 # Game requires AdaptiveBFF deinterlacing when auto. gameFixes: - XGKickHack # Fixes chocolate coloured characters. patches: @@ -24789,16 +26274,16 @@ SLPM-62630: name: "Sukusuku Inufuku [Hamster The Best]" region: "NTSC-J" SLPM-62631: - name: "Simple 2000 Series 2-in-1 Vol. 3 - The Puzzle Collection 2000 Toi & The Touyou Sandai Senjitsu Fusui, Seimeidanhan, Ekisen [Disc1of2]" + name: "Simple 2000 Series 2-in-1 Vol. 3 - The Puzzle Collection 2000 Toi & The Touyou Sandai Senjitsu Fusui, Seimeidanhan, Ekisen [Disc 1 of 2]" region: "NTSC-J" SLPM-62632: - name: "Simple 2000 Series 2-in-1 Vol. 3 - The Puzzle Collection 2000 Toi & The Touyou Sandai Senjitsu Fusui, Seimeidanhan, Ekisen [Disc2of2]" + name: "Simple 2000 Series 2-in-1 Vol. 3 - The Puzzle Collection 2000 Toi & The Touyou Sandai Senjitsu Fusui, Seimeidanhan, Ekisen [Disc 2 of 2]" region: "NTSC-J" SLPM-62633: - name: "Simple 2000 Series 2-in-1 Vol. 2 - The Bass Fishing & The Bowling Hyper [Disc1of2]" + name: "Simple 2000 Series 2-in-1 Vol. 2 - The Bass Fishing & The Bowling Hyper [Disc 1 of 2]" region: "NTSC-J" SLPM-62634: - name: "Simple 2000 Series 2-in-1 Vol. 2 - The Bass Fishing & The Bowling Hyper [Disc2of2]" + name: "Simple 2000 Series 2-in-1 Vol. 2 - The Bass Fishing & The Bowling Hyper [Disc 2 of 2]" region: "NTSC-J" SLPM-62635: name: "Simple 2000 Series Ultimate Vol. 26 - Love - Smash! 5.1 - Tennis Robo no Gyakushuu" @@ -24806,12 +26291,12 @@ SLPM-62635: gameFixes: - XGKickHack # Fixes bad Geometry. SLPM-62636: - name: "Simple 2000 Series 2-in-1 Vol. 1 - The Tennis & The Snowboard [Disc1of2]" + name: "Simple 2000 Series 2-in-1 Vol. 1 - The Tennis & The Snowboard [Disc 1 of 2]" region: "NTSC-J" gameFixes: - XGKickHack # Fixes SPS and console spam (The Tennis). SLPM-62637: - name: "Simple 2000 Series 2-in-1 Vol. 1 - The Tennis & The Snowboard [Disc2of2]" + name: "Simple 2000 Series 2-in-1 Vol. 1 - The Tennis & The Snowboard [Disc 2 of 2]" region: "NTSC-J" SLPM-62638: name: "Simple 2000 Series Vol. 80 - The OneeChanPuruu" @@ -24880,16 +26365,16 @@ SLPM-62661: name: "Oretachi Geasen Zoku Sono - Terra Cresta" region: "NTSC-J" SLPM-62662: - name: "Simple 2000 Series 2-in-1 Vol. 5 - The Shooting & The Helicopter [Disc1of2]" + name: "Simple 2000 Series 2-in-1 Vol. 5 - The Shooting & The Helicopter [Disc 1 of 2]" region: "NTSC-J" SLPM-62663: - name: "Simple 2000 Series 2-in-1 Vol. 5 - The Shooting & The Helicopter [Disc2of2]" + name: "Simple 2000 Series 2-in-1 Vol. 5 - The Shooting & The Helicopter [Disc 2 of 2]" region: "NTSC-J" SLPM-62664: - name: "Simple 2000 Series 2-in-1 Vol. 4 - The Bushidou & The Sniper 2 [Disc1of2]" + name: "Simple 2000 Series 2-in-1 Vol. 4 - The Bushidou & The Sniper 2 [Disc 1 of 2]" region: "NTSC-J" SLPM-62665: - name: "Simple 2000 Series 2-in-1 Vol. 4 - The Bushidou & The Sniper 2 [Disc2of2]" + name: "Simple 2000 Series 2-in-1 Vol. 4 - The Bushidou & The Sniper 2 [Disc 2 of 2]" region: "NTSC-J" SLPM-62666: name: "Sega Ages 2500 Series Vol.01 - Phantasy Star Generation 1" @@ -24940,6 +26425,8 @@ SLPM-62686: SLPM-62687: name: "Sega Ages 2500 Series Vol.24 - Last Bronx" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 2 # Fixes CLUT colours. SLPM-62689: name: "Langrisser III" region: "NTSC-J" @@ -24987,6 +26474,8 @@ SLPM-62703: name: "Sega Rally Championship '95" region: "NTSC-J" compat: 5 + gsHWFixes: + cpuCLUTRender: 2 # Fixes CLUT colours. SLPM-62704: name: "Oretachi Geasen Zoku Sono Vol.10 - Quarth" region: "NTSC-J" @@ -25041,7 +26530,7 @@ SLPM-62722: name: "Jissen Pachi-Slot Hisshouhou! Ore no Sora" region: "NTSC-J" SLPM-62724: - name: "Conveti 4, The" + name: "Conveni 4, The - Ano Machi o Dokusen seyo" region: "NTSC-J" SLPM-62725: name: "Mahjong Hoah - Shinken Battle II" @@ -25057,6 +26546,11 @@ SLPM-62729: name: "Oretachi Geasen Zoku Sono Vol.15 - Akumajou Dracula" region: "NTSC-J" compat: 5 + clampModes: + vuClampMode: 0 # Fixes SPS with microVU. + eeClampMode: 2 # Fixes missing blade. + gsHWFixes: + roundSprite: 1 # Fixes font sizes to be bigger. SLPM-62730: name: "Oretachi Geasen Zoku Sono Vol.16 - Contra" region: "NTSC-J" @@ -25078,6 +26572,9 @@ SLPM-62739: SLPM-62740: name: "Saikyo Shogi Gekisashi Special" region: "NTSC-J" +SLPM-62742: + name: "Wizardry Gaiden - Sentou no Kangoku - Prisoners of the Battles" + region: "NTSC-J" SLPM-62743: name: "School Heaven Okawari [The Best]" region: "NTSC-J" @@ -25132,7 +26629,7 @@ SLPM-62760: region: "NTSC-J" compat: 5 SLPM-62761: - name: "Choro Q - HG 2 [Atlus Best Collection]" + name: "Choro Q HG 2 [Atlus Best Collection]" region: "NTSC-J" gsHWFixes: roundSprite: 2 # Fixes sprite ghosting. @@ -25172,6 +26669,9 @@ SLPM-62774: SLPM-62775: name: "Sega Ages 2500 Vol.32 - Phantasy Star Complete Collection" region: "NTSC-J" +SLPM-62777: + name: "Harukaze P. S. - Plus Situation" + region: "NTSC-J" SLPM-62778: name: "Slotter Up Mania 10 - Pioneer Special 3" region: "NTSC-J" @@ -25186,7 +26686,7 @@ SLPM-62784: name: "Kao no nai Tsuki Select Story" region: "NTSC-J" SLPM-64501: - name: "Shin Sangoku Musou" + name: "Jin Samguk Mussang" region: "NTSC-K" SLPM-64502: name: "Winback" @@ -25196,6 +26696,9 @@ SLPM-64502: SLPM-64504: name: "Maximo" region: "NTSC-K" +SLPM-64507: + name: "Wave Rally" + region: "NTSC-K" SLPM-64509: name: "Crash Bandicoot - Return of the Demon King [English Dub Edition]" # Wrath of Cortex region: "NTSC-K" @@ -25203,7 +26706,7 @@ SLPM-64509: preloadFrameData: 1 # Fixes random texture corruptions such as horizontal lines. cpuFramebufferConversion: 1 # Fixes fog wall. SLPM-64513: - name: "Crash Bandicoot - Return of the Demon King" # Wrath of Cortex + name: "Crash Bandicoot - Mawangui Buwhal" # Wrath of Cortex region: "NTSC-K" gsHWFixes: preloadFrameData: 1 # Fixes random texture corruptions such as horizontal lines. @@ -25216,7 +26719,7 @@ SLPM-64521: region: "NTSC-K" compat: 5 gsHWFixes: - deinterlace: 6 # Fixes blurriness. + deinterlace: 7 # Fixes blurriness. SLPM-64522: name: "La Pucelle" region: "NTSC-K" @@ -25239,6 +26742,11 @@ SLPM-64528: SLPM-64532: name: "Digital Holmes" region: "NTSC-K" +SLPM-64533: + name: "F1 2002" + region: "NTSC-K" + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLPM-64534: name: "Psyvariar - Complete Edition" region: "NTSC-K" @@ -25247,21 +26755,24 @@ SLPM-64540: region: "NTSC-K" speedHacks: MTVUSpeedHack: 0 # Fixes bad graphics due to bad T-Bit handling. +SLPM-64544: + name: "Tetsu 1 - Densha de Battle! World Grand Prix" + region: "NTSC-K" SLPM-64549: - name: "Shikigami no Shiro" + name: "Siksin-ui Seong" region: "NTSC-K" SLPM-65001: name: "Kessen" region: "NTSC-J" compat: 5 SLPM-65002: - name: "Love-0 Story [Disc1of2]" + name: "0 Story [Disc 1 of 2]" region: "NTSC-J" compat: 5 gameFixes: - SoftwareRendererFMVHack # Fixes removed bloom in FMV. SLPM-65003: - name: "Love-0 Story [Disc2of2]" + name: "0 Story [Disc 2 of 2]" region: "NTSC-J" compat: 5 gameFixes: @@ -25290,6 +26801,8 @@ SLPM-65010: name: "Onimusha" region: "NTSC-J" compat: 5 + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLPM-65011: name: "GUITAR FREAKS 3rd MIX & drummania 2nd MIX" region: "NTSC-J" @@ -25301,6 +26814,15 @@ SLPM-65012: roundModes: eeRoundMode: 1 vuRoundMode: 3 + memcardFilters: + - "SLPM-65012" + - "SLPM-62062" #Gitaroo Man One bonus save data + patches: + default: + content: |- + author=boringhexi + // fix stage 4 flashing triangles + patch=0,EE,00104140,word,00000000 SLPM-65013: name: "Shadow of Memories" region: "NTSC-J" @@ -25319,10 +26841,10 @@ SLPM-65015: content: |- comment=COP2 flag instance patch by refraction // A mac flag check just after a vsub which gets in the way, rearranging. - patch=0,EE,00170F20,word,48438800 - patch=0,EE,00170F24,word,4BE521AC - patch=0,EE,00170F28,word,30848000 - patch=0,EE,00170F2C,word,4BE72B3C + patch=0,EE,0016ae90,word,48438800 + patch=0,EE,0016ae94,word,4BE521AC + patch=0,EE,0016ae98,word,30848000 + patch=0,EE,0016ae9c,word,4BE72B3C SLPM-65016: name: "Love Songs [Limited Edition]" region: "NTSC-J" @@ -25332,10 +26854,14 @@ SLPM-65017: SLPM-65018: name: "Z.O.E. - Zone of the Enders [Limited Edition]" region: "NTSC-J" + gsHWFixes: + gpuPaletteConversion: 2 # Improves FPS and reduces HC size. SLPM-65019: name: "Z.O.E. - Zone of the Enders" region: "NTSC-J" compat: 5 + gsHWFixes: + gpuPaletteConversion: 2 # Improves FPS and reduces HC size. SLPM-65020: name: "ParaParaParadise" region: "NTSC-J" @@ -25352,10 +26878,10 @@ SLPM-65023: gsHWFixes: disablePartialInvalidation: 1 # Fixes corrupt textures. SLPM-65024: - name: "BioHazard - 5th Anniversary Package - Nightmare Returns [Disc1of2]" + name: "BioHazard - 5th Anniversary Package - Nightmare Returns [Disc 1 of 2]" region: "NTSC-J" SLPM-65025: - name: "BioHazard - 5th Anniversary Package - Nightmare Returns [Disc2of2]" + name: "BioHazard - 5th Anniversary Package - Nightmare Returns [Disc 2 of 2]" region: "NTSC-J" SLPM-65026: name: "beatmania IIDX 4th style -new songs collection-" @@ -25383,7 +26909,7 @@ SLPM-65039: name: "Densha de Go! Shinkansen" region: "NTSC-J" SLPM-65040: - name: "Fear, The [Disc1of4]" + name: "Fear, The [Disc 1 of 4]" region: "NTSC-J" memcardFilters: - "SLPM-65040" @@ -25391,7 +26917,7 @@ SLPM-65040: - "SLPM-65042" - "SLPM-65043" SLPM-65041: - name: "Fear, The [Disc2of4]" + name: "Fear, The [Disc 2 of 4]" region: "NTSC-J" memcardFilters: - "SLPM-65040" @@ -25399,7 +26925,7 @@ SLPM-65041: - "SLPM-65042" - "SLPM-65043" SLPM-65042: - name: "Fear, The [Disc3of4]" + name: "Fear, The [Disc 3of 4]" region: "NTSC-J" compat: 5 memcardFilters: @@ -25408,7 +26934,7 @@ SLPM-65042: - "SLPM-65042" - "SLPM-65043" SLPM-65043: - name: "Fear, The [Disc4of4]" + name: "Fear, The [Disc 4 of 4]" region: "NTSC-J" memcardFilters: - "SLPM-65040" @@ -25418,6 +26944,9 @@ SLPM-65043: SLPM-65044: name: "Aizouban Angelique Trois [Koei The Best]" region: "NTSC-J" +SLPM-65046: + name: "Gofungo no Sekai" + region: "NTSC-J" SLPM-65047: name: "Capcom vs. SNK 2" region: "NTSC-J" @@ -25465,7 +26994,7 @@ SLPM-65060: name: "BioHazard Gun Survivor 2 - CODE - Veronica" region: "NTSC-J" SLPM-65061: - name: "Adventure of Tokyo Disney Sea" + name: "Adventure of Tokyo Disney Sea - Ushinawareta Houseki no Himitsu" region: "NTSC-J" SLPM-65065: name: "Sorcerous Stabber Orphen [Kadokawa The Best]" @@ -25477,10 +27006,10 @@ SLPM-65070: name: "Shadow of Memories" region: "NTSC-J" SLPM-65071: - name: "Drift Champ" + name: "Zero 4 Champ Series - Drift Champ" region: "NTSC-J" patches: - 8449ffe1: + 8449FFE1: content: |- comment=Patch by Prafull // Fixes the hang at start of chapter 2. @@ -25534,6 +27063,8 @@ SLPM-65077: region: "NTSC-J" gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. memcardFilters: - "SLPM-65078" - "SLPM-65077" @@ -25542,6 +27073,8 @@ SLPM-65078: region: "NTSC-J" gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. memcardFilters: - "SLPM-65078" - "SLPM-65077" @@ -25552,8 +27085,6 @@ SLPM-65080: SLPM-65082: name: "Grandia Xtreme [Limited Edition]" region: "NTSC-J" - gameFixes: - - SoftwareRendererFMVHack # Flickering in FMV. SLPM-65083: name: "Houshin Engi 2" region: "NTSC-J" @@ -25561,7 +27092,7 @@ SLPM-65085: name: "Alone in the Dark - The New Nightmare" region: "NTSC-J" SLPM-65086: - name: "Ayumi Hamasaki Dome Tour 2001 - A Visual Mix [Disc1of2]" + name: "Visual Mix - Ayumi Hamasaki Dome Tour 2001 [Disc 1 of 2]" region: "NTSC-J" compat: 5 memcardFilters: @@ -25570,7 +27101,7 @@ SLPM-65086: - "SLPM-65086" - "SLPM-65087" SLPM-65087: - name: "Ayumi Hamasaki Dome Tour 2001 - A Visual Mix [Disc2of2]" + name: "Visual Mix - Ayumi Hamasaki Dome Tour 2001 [Disc 2 of 2]" region: "NTSC-J" compat: 5 memcardFilters: @@ -25581,8 +27112,6 @@ SLPM-65087: SLPM-65089: name: "Grandia Xtreme" region: "NTSC-J" - gameFixes: - - SoftwareRendererFMVHack # Flickering in FMV. SLPM-65090: name: "Spy Hunter" region: "NTSC-J" @@ -25653,6 +27182,7 @@ SLPM-65115: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SLPM-65116: name: "Lilie no Atelier Plus - Salburg no Renkinjutsushi 3" region: "NTSC-J" @@ -25713,7 +27243,7 @@ SLPM-65139: region: "NTSC-J" compat: 5 SLPM-65140: - name: "Jojo's Bizarre Adventure 5" + name: "Jojo no Kimyou na Bouken - Ougon no Kaze" region: "NTSC-J" SLPM-65141: name: "Tsuzuse Gareijiri" @@ -25757,14 +27287,14 @@ SLPM-65156: SLPM-65158: name: "Riding Spirits" region: "NTSC-J" -SLPM-65160: - name: "Gitaroo Man [The Best]" +SLPM-65160: #serial used on printed labels only, internal serial is always SLPM-65012 + name: "Gitaroo Man [Koei Summer Chance 2002]" region: "NTSC-J" SLPM-65161: name: "Aero Dancing 4" region: "NTSC-J" SLPM-65163: - name: "Dynasty Warriors 3" + name: "Zhen San Guo Wu Shuang 2" region: "NTSC-C" patches: 397F3835: @@ -25801,6 +27331,8 @@ SLPM-65174: SLPM-65176: name: "King of Colosseum - Red" region: "NTSC-J" + gameFixes: + - InstantDMAHack # Fixes hang on opening. SLPM-65177: name: "Energy Airforce" region: "NTSC-J" @@ -25808,11 +27340,13 @@ SLPM-65177: SLPM-65178: name: "Ferrari F355 Challenge" region: "NTSC-J" + gsHWFixes: + roundSprite: 1 # Fixes text alignment. SLPM-65179: name: "Culdcept 2 - Expansion" region: "NTSC-J" SLPM-65180: - name: "Baseball 2003, The" + name: "Baseball 2003, The - Battle Ball Park Sengen - Perfect Play Pro Yakyuu" region: "NTSC-J" SLPM-65183: name: "Auto Modellista" @@ -25820,9 +27354,13 @@ SLPM-65183: SLPM-65184: name: "Document of Metal Gear Solid 2, The" region: "NTSC-J" + gameFixes: + - EETimingHack # Fixes corrupted or missing menu fonts. SLPM-65185: name: "Ferrari F355 Challenge" region: "NTSC-J" + gsHWFixes: + roundSprite: 1 # Fixes text alignment. SLPM-65186: name: "Thread Colors [Limited Edition]" region: "NTSC-J" @@ -25835,6 +27373,8 @@ SLPM-65190: SLPM-65191: name: "V-Rally 3" region: "NTSC-J" + gsHWFixes: + preloadFrameData: 1 # Fixes fog and make lights on cars work again. SLPM-65192: name: "NBA Live 2003" region: "NTSC-J" @@ -25878,7 +27418,7 @@ SLPM-65206: name: "King of Colosseum - Green" region: "NTSC-J" gameFixes: - - EETimingHack # Fixes hang on opening. + - InstantDMAHack # Fixes hang on opening. SLPM-65207: name: "Chou Battle Houshin" region: "NTSC-J" @@ -26008,9 +27548,12 @@ SLPM-65231: patches: F96A2390: content: |- - author=kozarovv - // Skip PSS movies, workaround for EE Cache requirement. - patch=1,EE,00122d00,word,100000d9 + author=Goatman13 + // Fix issues caused by PSS video playback. + // Extend stack to avoid sending bad data to VIF1. + // Required due to lack of data cache emulation. + patch=1,EE,00122780,word,27BDFD00 + patch=1,EE,00122AE8,word,27BD0300 SLPM-65232: name: "Devil May Cry 2 [Dante Disc]" region: "NTSC-J" @@ -26039,6 +27582,8 @@ SLPM-65236: SLPM-65237: name: "Z.O.E. - Zone of the Enders [PlayStation 2 The Best]" region: "NTSC-J" + gsHWFixes: + gpuPaletteConversion: 2 # Improves FPS and reduces HC size. SLPM-65238: name: "Angelic Concert [Limited Edition]" region: "NTSC-J" @@ -26074,8 +27619,11 @@ SLPM-65245: roundSprite: 2 # Fixes font artifacts. mergeSprite: 1 # Fixes flame-like bleeding. SLPM-65246: - name: "Kaidou Battle" + name: "Kaido Battle - Nikko, Haruna, Rokko, Hakone" region: "NTSC-J" + gsHWFixes: + alignSprite: 1 # Fixes vertical lines. + wildArmsHack: 1 # De-blurs the 3D image. SLPM-65247: name: "Sangokushi Senki 2" region: "NTSC-J" @@ -26099,7 +27647,7 @@ SLPM-65254: name: "Galaxy Angel" region: "NTSC-J" SLPM-65255: - name: "Chobits" + name: "Chobits - Chii dake no Hito" region: "NTSC-J" gsHWFixes: roundSprite: 2 # Reduces font artifacts. @@ -26123,23 +27671,27 @@ SLPM-65257: - "SLPM-65341" - "SLPM-65631" SLPM-65260: - name: "Air Land Force" + name: "Gaika no Gouhou - Air Land Force" region: "NTSC-J" SLPM-65261: name: "TBS All-Star Kansha-sai Vol .1 - Chou Gouka! Quiz Ketteiban" region: "NTSC-J" SLPM-65262: - name: "Boboboubo Boubobo Hajike Matsuri" + name: "Boboboubo Boubobo - Hajike Matsuri" region: "NTSC-J" SLPM-65263: - name: "Shin Sangoku Musou 2 & Shin Sangoku Musou 2 Mushoden [Koei Mega Pack] [Disc1of2]" + name: "Shin Sangoku Musou 2 & Shin Sangoku Musou 2 Mushoden [Koei Mega Pack] [Disc 1 of 2]" region: "NTSC-J" SLPM-65264: - name: "Shin Sangoku Musou 2 & Shin Sangoku Musou 2 Mushoden [Koei Mega Pack] [Disc2of2]" + name: "Shin Sangoku Musou 2 & Shin Sangoku Musou 2 Mushoden [Koei Mega Pack] [Disc 2 of 2]" region: "NTSC-J" SLPM-65266: name: "Drag-on Dragoon" region: "NTSC-J" + clampModes: + eeClampMode: 3 # Characters are visible in-game. + gsHWFixes: + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLPM-65267: name: "Kurogane no Houkou 2 - Warship Gunner" region: "NTSC-J" @@ -26245,7 +27797,7 @@ SLPM-65299: name: "Konohana 3" region: "NTSC-J" SLPM-65300: - name: "All-Star Pro Wrestling 3" + name: "All-Star Pro Wrestling III" region: "NTSC-J" compat: 5 SLPM-65301: @@ -26257,6 +27809,8 @@ SLPM-65302: SLPM-65303: name: "Dennou Senki - Virtual-On Marz" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 2 # Fixes CLUT colours. SLPM-65305: name: "Genso Suikoden 3" region: "NTSC-J" @@ -26295,7 +27849,7 @@ SLPM-65310: name: "Mark of Kri, The" region: "NTSC-J" gsHWFixes: - deinterlace: 3 # Game requires bob deinterlacing when auto. + deinterlace: 4 # Game requires bob deinterlacing when auto. SLPM-65311: name: "Violet no Atelier - Gramnad no Renkinjutsushi" region: "NTSC-J" @@ -26352,7 +27906,7 @@ SLPM-65329: name: "Makai Tensei" region: "NTSC-J" SLPM-65330: - name: "Akudaikan 2" + name: "Akudaikan 2 - Mousouden" region: "NTSC-J" SLPM-65331: name: "Rockman X7" @@ -26378,6 +27932,8 @@ SLPM-65335: SLPM-65336: name: "K-1 World Grand Prix - The Beast Attack!" region: "NTSC-J" + gsHWFixes: + alignSprite: 1 # Fixes upscaling lines. SLPM-65337: name: "Gegege no Kitaro - Ibun Youkaitan" region: "NTSC-J" @@ -26413,7 +27969,7 @@ SLPM-65346: name: "Winning Post 6" region: "NTSC-J" SLPM-65347: - name: "Bistro Cupid 2 [Limited Edition]" + name: "Bistro Cupid 2 [Tokubetsu-ban]" region: "NTSC-J" SLPM-65348: name: "Bistro Cupid 2" @@ -26463,6 +28019,8 @@ SLPM-65367: name: "Makai Eiyuuki Maximo - Machine Monster no Yabou" region: "NTSC-J" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes outlines around environmental objects. SLPM-65368: name: "D.N. Angel - TV Animation Series" region: "NTSC-J" @@ -26482,6 +28040,8 @@ SLPM-65374: speedHacks: InstantVU1SpeedHack: 0 # Fixes hanging while going ingame. MTVUSpeedHack: 0 + gsHWFixes: + autoFlush: 1 # Corrects post-processing effect on jet exhausts. SLPM-65375: name: "Shin Sangoku Musou 3 - Mushoden [Premium Pack]" region: "NTSC-J" @@ -26491,8 +28051,11 @@ SLPM-65377: SLPM-65378: name: "Busin 0 - Wizardry Alternative Neo" region: "NTSC-J" + gsHWFixes: + autoFlush: 1 # Corrects blur effects in menus. + roundSprite: 2 # Aligns some text/graphics when upscaling. SLPM-65379: - name: "Baseball 2003 - Akikigou" + name: "Baseball 2003, The - Battle Ball Park Sengen - Perfect Play Pro Yakyuu - Shuukigou" region: "NTSC-J" SLPM-65380: name: "Samurai Michi 2" @@ -26561,11 +28124,13 @@ SLPM-65404: name: "Kita He - Diamond Dust" region: "NTSC-J" SLPM-65405: - name: "Hyper Dimension Fortress Macross" + name: "Chou Jikuu Yousai Macross" region: "NTSC-J" compat: 5 + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLPM-65406: - name: "Castlevania - Lament of Innocence [Limited Edition]" + name: "Castlevania [Limited Edition]" region: "NTSC-J" clampModes: eeClampMode: 3 # Fixes cutscene freezes. @@ -26577,7 +28142,7 @@ SLPM-65408: name: "Growlanser IV - Wayfarer of the Time" region: "NTSC-J" SLPM-65409: - name: "Air Ranger 2 - Rescue Helicopter - Plus" + name: "Air Ranger 2 Plus - Rescue Helicopter" region: "NTSC-J" SLPM-65410: name: "Getaway, The" @@ -26585,6 +28150,7 @@ SLPM-65410: gsHWFixes: textureInsideRT: 1 texturePreloading: 1 # Performs much better with partial preload. + halfPixelOffset: 2 # Fixes outlines around characters. SLPM-65411: name: "Onimusha Buraiden" region: "NTSC-J" @@ -26610,6 +28176,9 @@ SLPM-65413: SLPM-65414: name: "Simple 2000 Series Vol. 45 - The Koi to Namida to, Tsuioku to..." region: "NTSC-J" +SLPM-65415: + name: "EX Jinsei Game II" + region: "NTSC-J" SLPM-65416: name: "Pride Grand Prix 2003" region: "NTSC-J" @@ -26665,6 +28234,8 @@ SLPM-65432: SLPM-65433: name: "K-1 World Grand Prix 2003" region: "NTSC-J" + gsHWFixes: + alignSprite: 1 # Fixes upscaling lines. SLPM-65434: name: "Battle Gear 3" region: "NTSC-J" @@ -26674,7 +28245,7 @@ SLPM-65435: name: "Diamond Dust" region: "NTSC-J" SLPM-65438: - name: "Star Ocean 3 [Director's Cut] [Disc1of2]" + name: "Star Ocean 3 [Director's Cut] [Disc 1 of 2]" region: "NTSC-J" compat: 5 gameFixes: @@ -26683,7 +28254,7 @@ SLPM-65438: halfPixelOffset: 2 # Fixes bloom and ghosting in certain areas. roundSprite: 1 # Fixes door transition vertical lines and minimap artifacts. SLPM-65439: - name: "Star Ocean 3 [Director's Cut] [Disc2of2]" + name: "Star Ocean 3 [Director's Cut] [Disc 2 of 2]" region: "NTSC-J" compat: 5 gameFixes: @@ -26694,7 +28265,7 @@ SLPM-65439: memcardFilters: - "SLPM-65438" SLPM-65441: - name: "Ashita no Joe - Masshiro ni Moetsukuru" + name: "Ashita no Joe - Masshiro ni Moe Tsukiro!" region: "NTSC-J" SLPM-65442: name: "Terminator 3, The - Rise of the Machines" @@ -26706,7 +28277,7 @@ SLPM-65443: preloadFrameData: 1 # Fixes mech shadows. roundSprite: 2 # Fixes font artifacts. SLPM-65444: - name: "Castlevania - Lament of Innocence" + name: "Castlevania" region: "NTSC-J" compat: 5 clampModes: @@ -26715,7 +28286,7 @@ SLPM-65445: name: "Jikkyou Powerful Pro Yakyuu 10 Chou Ketteiban - 2003 Memorial" region: "NTSC-J" SLPM-65446: - name: "James Bond 007 - Everything or Nothing" + name: "007 - Everything or Nothing" region: "NTSC-J" SLPM-65447: name: "Kunoichi" @@ -26783,7 +28354,7 @@ SLPM-65465: gameFixes: - EETimingHack SLPM-65466: - name: "Kousen Gaeri - Refrain" + name: "Yomigaeri - Refrain" region: "NTSC-J" SLPM-65468: name: "Roommate Asami - D-Collection" @@ -26824,7 +28395,7 @@ SLPM-65480: name: "Michigan" region: "NTSC-J" SLPM-65481: - name: "After... [Limited Edition]" + name: "After... Wasureenu Kizuna [Shokai Genteiban]" region: "NTSC-J" SLPM-65482: name: "After..." @@ -26881,8 +28452,10 @@ SLPM-65500: name: "Anubis - Zone of the Enders Special Edition" region: "NTSC-J" SLPM-65501: - name: "Frogger - The Great Quest" + name: "Onimusha [Mega Hits!]" region: "NTSC-J" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLPM-65502: name: "GunGrave [Red Best Collection]" region: "NTSC-J" @@ -26891,7 +28464,7 @@ SLPM-65503: region: "NTSC-J" compat: 5 SLPM-65504: - name: "Cool Girl [Limited Edition] [Disc1of2]" + name: "Cool Girl [Limited Edition] [Disc 1 of 2]" region: "NTSC-J" memcardFilters: - "SLPM-65504" @@ -26899,7 +28472,7 @@ SLPM-65504: - "SLPM-65506" - "SLPM-65742" SLPM-65505: - name: "Cool Girl [Limited Edition] [Disc2of2]" + name: "Cool Girl [Limited Edition] [Disc 2 of 2]" region: "NTSC-J" memcardFilters: - "SLPM-65504" @@ -26932,6 +28505,9 @@ SLPM-65513: SLPM-65514: name: "Kaido Battle 2 - Chain Reaction" region: "NTSC-J" + gsHWFixes: + alignSprite: 1 # Fixes vertical lines. + wildArmsHack: 1 # De-blurs the 3D image. SLPM-65515: name: "Sakura Taisen - Mysterious Paris" region: "NTSC-J" @@ -26993,13 +28569,17 @@ SLPM-65537: name: "Chou Battle Houshin [Koei The Best]" region: "NTSC-J" SLPM-65538: - name: "James Bond 007 - Nightfire [EA Best Hits]" + name: "007 - Nightfire [EA Best Hits]" region: "NTSC-J" clampModes: vuClampMode: 2 # Fixes polygon clipping in driving missions. + gsHWFixes: + halfPixelOffset: 2 # Fixes fog lines in the distance. SLPM-65539: name: "V-Rally 3" region: "NTSC-J" + gsHWFixes: + preloadFrameData: 1 # Fixes fog and make lights on cars work again. SLPM-65540: name: "Galaxy Angel - Moonlit Lovers [First Limited Edition]" region: "NTSC-J" @@ -27042,7 +28622,7 @@ SLPM-65553: name: "Metal Wolf Rev" region: "NTSC-J" SLPM-65554: - name: "Croket Ban - King no Kiki wo Sukuu" + name: "Croket! Ban-King no Kiki o Sukue" region: "NTSC-J" SLPM-65555: name: "Dragon Quest V - Bride of the Sky" @@ -27099,17 +28679,23 @@ SLPM-65574: name: "Silent Hill 4 - The Room" region: "NTSC-J" compat: 5 + speedHacks: + mvuFlagSpeedHack: 0 # Fixes invisible wall in front of the door leading to East 3F in the 2nd visit of Apartment world preventing Eileen's Nurse Outfit. gsHWFixes: halfPixelOffset: 1 # Fixes dark sides. SLPM-65575: name: "Crimson Tears" region: "NTSC-J" compat: 5 + gsHWFixes: + wildArmsHack: 1 # Fixes blurriness. + roundSprite: 2 # Reduces misalignment bloom effects. +# deinterlace: 6 # Game requires blend tff deinterlacing when auto for 'fixing' shimmer on character models and more flickering or half weaved, though the game suffers from the field order. SLPM-65576: name: "Tantei Jinguuji Saburou - Kind of Blue" region: "NTSC-J" SLPM-65579: - name: "After School Love Beat" + name: "Houkago no Love Beat" region: "NTSC-J" SLPM-65580: name: "Crash Bandicoot - Bakuso! Nitro Kart" @@ -27189,14 +28775,14 @@ SLPM-65603: name: "Run Like Hell" region: "NTSC-J" SLPM-65604: - name: "Animation Battle - Recca no Honou" + name: "Anime Battle - Rekka no Honoo - Flame of Recca - Final Burning" region: "NTSC-J" compat: 5 SLPM-65607: - name: "3LDK - Shiawase ni Narouyo [Limited Edition]" + name: "3LDK - Shiawase ni Narou yo [Limited Edition]" region: "NTSC-J" SLPM-65608: - name: "3LDK - Shiawase ni Narouyo" + name: "3LDK - Shiawase ni Narou yo" region: "NTSC-J" SLPM-65609: name: "Memories Off... - Sorekara [Limited Edition]" @@ -27238,7 +28824,7 @@ SLPM-65619: name: "Tom Clancy's Ghost Recon - Jungle Storm" region: "NTSC-J" SLPM-65620: - name: "Akudaikan 2 [Global The Best]" + name: "Akudaikan 2 - Mousouden [Global The Best]" region: "NTSC-J" SLPM-65621: name: "Street Fighter III - 3rd Strike" @@ -27332,7 +28918,7 @@ SLPM-65644: name: "Guilty Gear Isuka" region: "NTSC-J" SLPM-65647: - name: "Yu-Gi-Oh! 2 (Konami Dendou Collection)" + name: "Yu-Gi-Oh! 2 [Konami Dendou Collection]" region: "NTSC-J" roundModes: eeRoundMode: 2 # Partially fixes battle animation. @@ -27345,7 +28931,7 @@ SLPM-65649: name: "NBA Street Vol. 2 [EA Best Hits]" region: "NTSC-J" SLPM-65650: - name: "Harry Potter and The Sorcerer's Stone [EA Best Hits]" + name: "Harry Potter and the Sorcerer's Stone [EA Best Hits]" region: "NTSC-J" SLPM-65651: name: "Kowloon Youma Gakuenki [Limited Edition]" @@ -27363,6 +28949,7 @@ SLPM-65655: name: "Finding Nemo [Yuke's The Best]" region: "NTSC-J" gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. alignSprite: 1 # Fixes vertical lines. SLPM-65657: name: "World Soccer Winning Eleven 8" @@ -27441,19 +29028,21 @@ SLPM-65685: name: "Stella Deus" region: "NTSC-J" SLPM-65686: - name: "Berserk [Branded Box]" + name: "Berserk - Millennium Falcon-hen - Seima Senki no Shou [Branded Box]" region: "NTSC-J" gsHWFixes: preloadFrameData: 1 # Partially fixes HUD elements. + halfPixelOffset: 1 # Fixes misaligned blur around objects and enemies. SLPM-65687: name: "Star Wars - Battlefront" region: "NTSC-J" SLPM-65688: - name: "Berserk" + name: "Berserk - Millennium Falcon-hen - Seima Senki no Shou" region: "NTSC-J" compat: 5 gsHWFixes: preloadFrameData: 1 # Partially fixes HUD elements. + halfPixelOffset: 1 # Fixes misaligned blur around objects and enemies. SLPM-65689: name: "Never 7 - The End of Infinity [SuperLite 2000 Series]" region: "NTSC-J" @@ -27501,6 +29090,8 @@ SLPM-65696: SLPM-65697: name: "Shrek 2" region: "NTSC-J" + gsHWFixes: + mipmap: 1 # Partially fixes the sun effects, but the game suffers from depth/blending issues. SLPM-65698: name: "Love Songs - ADV Futaba Riho 14-sai Natsu" region: "NTSC-J" @@ -27534,7 +29125,7 @@ SLPM-65708: name: "Hagane no Renkinjutsushi - Akaki Elixir no Akuma" region: "NTSC-J" SLPM-65710: - name: "Apocripha Zero" + name: "Apocripha-0" region: "NTSC-J" SLPM-65714: name: "Angelique Etoile [Premium Box]" @@ -27555,10 +29146,14 @@ SLPM-65719: name: "Burnout 3 - Takedown" region: "NTSC-J" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLPM-65720: name: "Shin Sangoku Musou 2 Mushoden [Koei the Best]" region: "NTSC-J" @@ -27575,7 +29170,7 @@ SLPM-65724: name: "Choro Q Works" region: "NTSC-J" SLPM-65725: - name: "James Bond 007 - Everything or Nothing [EA Best Hits]" + name: "007 - Everything or Nothing [EA Best Hits]" region: "NTSC-J" SLPM-65726: name: "Star Wars - Jango Fett [EA Best Hits]" @@ -27610,7 +29205,7 @@ SLPM-65731: name: "Tom Clancy's Rainbow Six 3" region: "NTSC-J" SLPM-65732: - name: "Akaiito" + name: "Akai Ito" region: "NTSC-J" compat: 5 SLPM-65734: @@ -27645,6 +29240,8 @@ SLPM-65741: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: autoFlush: 1 + halfPixelOffset: 2 # Fixes misaligned lighting. + cpuCLUTRender: 1 # Fixes janky coloured cars. SLPM-65742: name: "Cool Girl [Konami the Best]" region: "NTSC-J" @@ -27833,15 +29430,6 @@ SLPM-65797: name: "Dragon Quest & Final Fantasy in Itadaki Street" region: "NTSC-J" compat: 5 - patches: - 4CE7FB04: - content: |- - author=refraction - // Game seems to have problems with alpha values being zero in some instances - // this patches the results from FPU to be an alpha of 2 - // Fixes missing board - patch=1,EE,00143CBC,word,3C030200 - patch=1,EE,00143CC0,word,00831825 SLPM-65798: name: "Madden NFL Superbowl 2005" region: "NTSC-J" @@ -27882,6 +29470,8 @@ SLPM-65806: SLPM-65807: name: "Urbz, The - Sims in the City" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Fixes upscaling lines. SLPM-65808: name: "Derby Tsuku 4 - Derby Uma o Tsukurou!" region: "NTSC-J" @@ -27940,7 +29530,7 @@ SLPM-65826: region: "NTSC-J" compat: 5 SLPM-65828: - name: "Angel Wish" + name: "Angel Wish - Kimi no Egao ni Chu!" region: "NTSC-J" SLPM-65829: name: "Ys - The Ark of Napishtim [Limited Edition]" @@ -27965,7 +29555,7 @@ SLPM-65834: name: "Harukanaru Jikuu no Naka De 3" region: "NTSC-J" SLPM-65835: - name: "Bakumatsu Koihana - Shinsengumi" + name: "Bakumatsu Renka - Shinsengumi" region: "NTSC-J" SLPM-65836: name: "Ys - The Ark of Napishtim" @@ -27995,7 +29585,7 @@ SLPM-65843: name: "120 Yen no Haru - 120 Yen Stories" region: "NTSC-J" gsHWFixes: - pointListPalette: 1 + cpuCLUTRender: 1 # Fixes CLUT generation. SLPM-65844: name: "Air [Best]" region: "NTSC-J" @@ -28015,6 +29605,9 @@ SLPM-65847: SLPM-65848: name: "Soriaro no Fuukin Remix" region: "NTSC-J" +SLPM-65850: + name: "Harukanaru Toki no Naka de 3 [Triple Pack]" + region: "NTSC-J" SLPM-65853: name: "Let's Make a Baseball Team 3" region: "NTSC-J" @@ -28093,6 +29686,9 @@ SLPM-65875: SLPM-65876: name: "Busin 0 - Wizardry Alternative Neo [Atlus Best Collection]" region: "NTSC-J" + gsHWFixes: + autoFlush: 1 # Corrects blur effects in menus. + roundSprite: 2 # Aligns some text/graphics when upscaling. SLPM-65878: name: "Galaxy Angel - Eternal Lovers" region: "NTSC-J" @@ -28107,6 +29703,7 @@ SLPM-65880: eeRoundMode: 0 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but still an issue compared to native. + roundSprite: 2 # Clears up much of the blurring that HPO Special does not. SLPM-65881: name: "SmackDown vs. Raw - Exciting Professional Wrestling 6" region: "NTSC-J" @@ -28116,6 +29713,8 @@ SLPM-65882: SLPM-65883: name: "Shadow of Rome" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness and misalgined garbage when upscaling. SLPM-65884: name: "Remote Control Dandy SF" region: "NTSC-J" @@ -28165,6 +29764,7 @@ SLPM-65897: region: "NTSC-J" gsHWFixes: alignSprite: 1 # Fixes black lines when upscaling. + wildArmsHack: 1 # De-blurs the 3D image. SLPM-65898: name: "Castle Fantasia [Deluxe Pack]" region: "NTSC-J" @@ -28268,8 +29868,11 @@ SLPM-65926: SLPM-65927: name: "Forgotten Realms - Demon Stone" region: "NTSC-J" + clampModes: + vuClampMode: 3 # Removes occasional SPS where the head goes into nightmare fuel. gsHWFixes: halfPixelOffset: 1 # Reduces ghosting. + roundSprite: 1 # Reduces ghosting even more. SLPM-65928: name: "SuperLite 2000 Series - Memories Off Mix" region: "NTSC-J" @@ -28307,11 +29910,12 @@ SLPM-65941: name: "Mabino x Style" region: "NTSC-J" SLPM-65942: - name: "Mercenaries" + name: "Mercenaries - Playground of Destruction" region: "NTSC-J" gsHWFixes: halfBottomOverride: 1 # Bottom screen has wrong colors. - halfPixelOffset: 1 # Fixes bloom misalignment. + autoFlush: 1 # Fixes missing lighting. + # halfPixelOffset: 1 # Fixes lighting misalignment. Do not enable this, it breaks a lot of graphics. SLPM-65943: name: "Angel's Feather" region: "NTSC-J" @@ -28365,12 +29969,16 @@ SLPM-65958: name: "Burnout 3 - Takedown [EA Best Hits]" region: "NTSC-J" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLPM-65959: - name: "Standard Daisenryaku - Ushinawareta Shoeri" + name: "Standard Daisenryaku - Ushinawareta Shouri" region: "NTSC-J" SLPM-65960: name: "North Wind Promise Forever [Limited Edition]" @@ -28422,12 +30030,36 @@ SLPM-65974: SLPM-65975: name: "WRC 4" region: "NTSC-J" + gameFixes: + - XGKickHack # Fixes SPS. + patches: + default: + content: |- + author=kozarovv + // Proper patch for WRC 4. CRC independent. + // I wrote a small runtime that moves unpacker higher right after emulator boot. + // Seems little bit extensive, but there is no way to make it smaller. + // Solves TLB miss errors which prevented the game from booting. + patch=0,EE,0040000C,double,3c0500603cc70054 + patch=0,EE,00400014,double,24a5001024840010 + patch=0,EE,0040001C,double,7ca6000078860000 + patch=0,EE,00400024,double,000000001487fffb + patch=0,EE,0040002c,double,000000000817fff5 + patch=0,EE,005fffd4,double,3c1c70003c040060 + patch=0,EE,005fffdc,double,3c0700003c067000 + patch=0,EE,005fffe4,double,279c000024840800 + patch=0,EE,005fffec,double,24e7100024c60080 + patch=0,EE,005ffff4,double,00c7e8200818000c + gsHWFixes: + autoFlush: 1 # Fixes car shadows. + roundSprite: 1 # Fixes misalgined text. + halfPixelOffset: 1 # Fixes minor ghosting on objects. SLPM-65976: - name: "Grandia III [Disc1of2]" + name: "Grandia III [Disc 1 of 2]" region: "NTSC-J" compat: 5 SLPM-65977: - name: "Grandia III [Disc2of2]" + name: "Grandia III [Disc 2 of 2]" region: "NTSC-J" compat: 5 memcardFilters: @@ -28449,7 +30081,7 @@ SLPM-65984: name: "Grand Theft Auto - San Andreas" region: "NTSC-J" clampModes: - vuClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. + eeClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. gsHWFixes: autoFlush: 1 SLPM-65985: @@ -28488,24 +30120,31 @@ SLPM-65995: gsHWFixes: preloadFrameData: 1 # Fixes bad textures on Jake. halfPixelOffset: 1 # Fixes double image. + cpuCLUTRender: 1 # Fixes Jake going black in Smellovision. SLPM-65996: - name: "Mars of Destruction [Limited Edition]" + name: "Hametsu no Mars [Limited Edition]" region: "NTSC-J" SLPM-65997: - name: "Mars of Destruction" + name: "Hametsu no Mars" region: "NTSC-J" SLPM-65998: name: "Vampire Darkstalkers Collection" region: "NTSC-J" compat: 5 SLPM-65999: - name: "Drag-on Dragoon 2 - Fuuin no Kurenai" + name: "Drag-on Dragoon 2 - Fuuin no Aka, Haitoku no Kuro" region: "NTSC-J" clampModes: eeClampMode: 2 # Fixes wrong color on some characters and breakable objects. + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting characters. + mergeSprite: 1 # Align sprite fixes FMVs but not garbage in-game, so needs merge sprite instead. + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLPM-66000: name: "Conflict Delta II - Gulf War 1991" region: "NTSC-J" + gameFixes: + - SoftwareRendererFMVHack # Fixes seizure inducing FMVs. SLPM-66001: name: "Chocolat - Maid Cafe Curio" region: "NTSC-J" @@ -28582,6 +30221,7 @@ SLPM-66022: region: "NTSC-J" gsHWFixes: alignSprite: 1 # Fixes black lines when upscaling. + wildArmsHack: 1 # De-blurs the 3D image. SLPM-66023: name: "Fushigi Yuugi - ShigiYuugi Kurotake Kaiden Gaiden - Kagami no Fujo [Limited Edition]" region: "NTSC-J" @@ -28616,6 +30256,8 @@ SLPM-66031: SLPM-66032: name: "Silent Hill 4 [Konami The Best]" region: "NTSC-J" + speedHacks: + mvuFlagSpeedHack: 0 # Fixes invisible wall in front of the door leading to East 3F in the 2nd visit of Apartment world preventing Eileen's Nurse Outfit. gsHWFixes: halfPixelOffset: 1 # Fixes dark sides. SLPM-66033: @@ -28685,7 +30327,7 @@ SLPM-66055: name: "Generation of Chaos 5" region: "NTSC-J" SLPM-66056: - name: "Mushihime Sama" + name: "Mushihimesama" region: "NTSC-J" compat: 5 SLPM-66057: @@ -28748,6 +30390,8 @@ SLPM-66074: compat: 5 roundModes: vuRoundMode: 0 # Prevents only backgrounds from appearing in Sonic R's multiplayer modes. + gsHWFixes: + cpuCLUTRender: 2 # Fixes CLUT colour in Sonic Fighters. memcardFilters: - "SLPM-66074" - "SLPM-65758" @@ -28800,7 +30444,7 @@ SLPM-66087: name: "Winning Post 7" region: "NTSC-J" SLPM-66089: - name: "3-Nen B-Gumi Kinpachi Sensei - Densetsu no Kyoudan ni Tate! [Best]" + name: "3-nen B-gumi Kinpachi Sensei - Densetsu no Kyoudan ni Tate! Kanzenban" region: "NTSC-J" SLPM-66090: name: "Crash Bandicoot - Gacchanko World" @@ -28809,6 +30453,8 @@ SLPM-66091: name: "Shinobido Imashime" region: "NTSC-J" compat: 5 + clampModes: + eeClampMode: 3 # Fixes hang going in to the gardens. SLPM-66092: name: "Taito Memories Gekan" region: "NTSC-J" @@ -28827,6 +30473,9 @@ SLPM-66097: SLPM-66098: name: "True Crime - Streets of L.A. [CapKore]" region: "NTSC-J" +SLPM-66099: + name: "Harukanaru Toki no Naka de 3 - Izayoiki [Premium Box-Triple Pack]" + region: "NTSC-J" SLPM-66100: name: "Harukanaru Jikuu no Kade 3" region: "NTSC-J" @@ -28867,10 +30516,14 @@ SLPM-66108: name: "Burnout Revenge" region: "NTSC-J" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 0 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLAJ-25066" - "SLPM-66108" @@ -28881,11 +30534,14 @@ SLPM-66108: - "SLAJ-25053" - "SLPM-66204" SLPM-66109: - name: "Code Age Commanders" + name: "Code Age Commanders - Tsugumono Tsugarerumono" region: "NTSC-J" SLPM-66110: name: "Fushigi no Umi no Nadia - Inherit the Blue Water [Limited Edition]" region: "NTSC-J" +SLPM-66111: + name: "Fushigi no Umi no Nadia - Dennou Battle - Miss Nautilus Contest" + region: "NTSC-J" SLPM-66112: name: "Fushigi no Umi no Nadia - Inherit the Blue Water" region: "NTSC-J" @@ -28921,6 +30577,7 @@ SLPM-66124: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SLPM-66125: name: "Final Fantasy X-2 [Ultimate Hits]" region: "NTSC-J" @@ -28946,6 +30603,7 @@ SLPM-66132: gsHWFixes: halfPixelOffset: 3 # Fixes bloom misalignment still a bit misaligned. roundSprite: 1 # Fixes bloom misalignment still a bit misaligned. + cpuCLUTRender: 1 # Fixes sun background on the windows when selecting your 'race'. SLPM-66133: name: "Shuffle! On the Stage [Deluxe Pack]" region: "NTSC-J" @@ -28956,7 +30614,7 @@ SLPM-66135: name: "World Tank Museum For Game - Toubu Sensen Success" region: "NTSC-J" SLPM-66136: - name: "SuperLite 2000 Series - Akaiito" + name: "SuperLite 2000 Vol. 34 - Akai Ito" region: "NTSC-J" SLPM-66137: name: "Clover Heart's Looking for Happiness [The Best]" @@ -28970,7 +30628,7 @@ SLPM-66139: gsHWFixes: pointListPalette: 1 SLPM-66140: - name: "Atelier Marie + Elie - Salburg no Renkinjutsushi 1&2" + name: "Atelier Marie + Elie - Salburg no Renkinjutsushi 1 & 2" region: "NTSC-J" gsHWFixes: roundSprite: 2 # Fixes the sprites on textbox and characters. @@ -29051,6 +30709,7 @@ SLPM-66160: eeRoundMode: 0 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but still an issue compared to native. + roundSprite: 2 # Clears up much of the blurring that HPO Special does not. SLPM-66163: name: "Fuuraiki 2" region: "NTSC-J" @@ -29071,14 +30730,16 @@ SLPM-66165: SLPM-66166: name: "Shadow the Hedgehog" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Fixes misaligned lighting. SLPM-66167: name: "God of War" region: "NTSC-J" gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SLPM-66168: name: "Ryu Ga Gotoku" region: "NTSC-J" @@ -29097,6 +30758,9 @@ SLPM-66175: compat: 5 clampModes: vuClampMode: 0 # Fixes SPS with microVU. + eeClampMode: 2 # Fixes missing blade. + gsHWFixes: + roundSprite: 1 # Fixes font sizes to be bigger. memcardFilters: - "SLPM-66175" - "SLPM-66668" @@ -29132,16 +30796,27 @@ SLPM-66183: region: "NTSC-J" gsHWFixes: textureInsideRT: 1 + halfPixelOffset: 2 # Fixes outlines on screen edges. SLPM-66184: name: "Ikusa Gami" region: "NTSC-J" gameFixes: - VIF1StallHack # Fixes black screen on boot. + gsHWFixes: + autoFlush: 1 # Fixes missing bloom effects. + halfPixelOffset: 2 # Fixes misaligned lighting and bloom. SLPM-66185: - name: "Game ni Nattayo! Dokura-chan [Limited Edition]" + name: "Game ni Nattayo! Dokuro-chan [Limited Edition]" region: "NTSC-J" + patches: + 169099FC: + content: |- + author=PSI, kozarovv + // Game does weird stack manipulation, causing data sent to the IOP to be corrupted unless EE data cache is enabled. + // This patch skips over the stack code, allowing the game to boot. + patch=1,EE,00156608,word,10000003 SLPM-66186: - name: "Game ni Nattayo! Dokura-chan" + name: "Game ni Nattayo! Dokuro-chan" region: "NTSC-J" patches: 169099FC: @@ -29172,6 +30847,8 @@ SLPM-66192: SLPM-66193: name: "Fahrenheit" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Slight lighting misalignment. SLPM-66194: name: "Otona no Gal Jan 2" region: "NTSC-J" @@ -29229,10 +30906,14 @@ SLPM-66212: name: "Sega Rally 2006" region: "NTSC-J" compat: 5 + gsHWFixes: + cpuCLUTRender: 1 # Fixes rainbow textures. SLPM-66213: name: "BioHazard 4" region: "NTSC-J" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLPM-66214: @@ -29251,7 +30932,7 @@ SLPM-66219: name: "Tennis no Oji-Sama - Gakuensai no Oji-Sama" region: "NTSC-J" SLPM-66220: - name: "Metal Gear Solid 3 - Subsistence [First Print Limited Edition] [Disc1of3]" + name: "Metal Gear Solid 3 - Subsistence [First Print Limited Edition] [Disc 1 of 3]" region: "NTSC-J" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -29260,7 +30941,7 @@ SLPM-66220: memcardFilters: - "SLPM-66117" SLPM-66221: - name: "Metal Gear Solid 3 - Subsistence [First Print Limited Edition] [Disc2of3]" + name: "Metal Gear Solid 3 - Subsistence [First Print Limited Edition] [Disc 2 of 3]" region: "NTSC-J" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -29269,7 +30950,7 @@ SLPM-66221: memcardFilters: - "SLPM-66117" SLPM-66222: - name: "Metal Gear Solid 3 - Subsistence [First Print Limited Edition] [Disc3of3]" + name: "Metal Gear Solid 3 - Subsistence [First Print Limited Edition] [Disc 3 of 3]" region: "NTSC-J" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -29278,7 +30959,7 @@ SLPM-66222: memcardFilters: - "SLPM-66117" SLPM-66223: - name: "Metal Gear Solid 3 - Subsistence [Disc1of2]" + name: "Metal Gear Solid 3 - Subsistence [Disc 1 of 2]" region: "NTSC-J" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -29287,7 +30968,7 @@ SLPM-66223: memcardFilters: - "SLPM-66117" SLPM-66224: - name: "Metal Gear Solid 3 - Subsistence [Disc2of2]" + name: "Metal Gear Solid 3 - Subsistence [Disc 2 of 2]" region: "NTSC-J" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -29311,13 +30992,14 @@ SLPM-66229: name: "GI Jockey 4" region: "NTSC-J" SLPM-66231: - name: "Karutagura - Tamashii no Kunou" + name: "Cartagra - Tamashii no Kunou" region: "NTSC-J" SLPM-66232: name: "Need for Speed - Most Wanted" region: "NTSC-J" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLAJ-25075" - "SLPM-66232" @@ -29330,6 +31012,7 @@ SLPM-66233: region: "NTSC-J" gsHWFixes: autoFlush: 1 # Fixes effects. + halfPixelOffset: 1 # Fixes upscaling artifacts. compat: 5 SLPM-66234: name: "Wizardry X - Zensen no Gakufu [Wonder Price]" @@ -29360,6 +31043,8 @@ SLPM-66242: SLPM-66243: name: "Galaxy Angel II" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Reduces misaligned lighting and other effects. SLPM-66244: name: "Derby Tsuku 5 - Derby Uma o Tsukurou!" region: "NTSC-J" @@ -29379,8 +31064,11 @@ SLPM-66248: SLPM-66249: name: "Growlanser V - Generations [Limited Edition]" region: "NTSC-J" + compat: 5 + # gsHWFixes: Disabled because of GitHub Issue #6797 + # preloadFrameData: 1 # Fixes layers where characters should be visually behind an object. SLPM-66250: - name: "Choro Q - HG 4 [Takara Best]" + name: "Choro Q HG 4 [Takara Best]" region: "NTSC-J" SLPM-66251: name: "EX Jinsei Game II [Takara Best]" @@ -29423,10 +31111,10 @@ SLPM-66263: speedHacks: mvuFlagSpeedHack: 0 # Fixes bad graphics. SLPM-66264: - name: "Canvas 2 - Niji-iro no Sketch [Deluxe Pack]" + name: "Canvas 2 - Nijiiro no Sketch [DX Pack]" region: "NTSC-J" SLPM-66265: - name: "Canvas 2 - Niji-iro no Sketch" + name: "Canvas 2 - Nijiiro no Sketch" region: "NTSC-J" SLPM-66266: name: "Kurogane no Houkou 2 - Warship Commander [Koei The Best]" @@ -29457,26 +31145,28 @@ SLPM-66274: name: "Ninkyouden Toseinin Ichidaiki" region: "NTSC-J" SLPM-66275: - name: "Shin Onimusha - Dawn of Dreams [Disc1of2]" + name: "Shin Onimusha - Dawn of Dreams [Disc 1 of 2]" region: "NTSC-J" compat: 5 gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. SLPM-66276: - name: "Shin Onimusha - Dawn of Dreams [Disc2of2]" + name: "Shin Onimusha - Dawn of Dreams [Disc 2 of 2]" region: "NTSC-J" compat: 5 gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. memcardFilters: - "SLPM-66275" SLPM-66277: name: "Juiced" region: "NTSC-J" + speedHacks: + InstantVU1SpeedHack: 0 # Significantly improves game speed. SLPM-66278: name: "Shin Gouketuji Ichizoku - Bonnou Kaihou" region: "NTSC-J" @@ -29514,13 +31204,13 @@ SLPM-66288: name: "Full House Kiss 2" region: "NTSC-J" SLPM-66289: - name: "Black Cat" + name: "Black Cat - Kikai-jikake no Tenshi" region: "NTSC-J" SLPM-66290: name: "Galaxy Angel [The Best]" region: "NTSC-J" SLPM-66291: - name: "Tenkabito" + name: "Tenka-bito" region: "NTSC-J" SLPM-66292: name: "Jissen Pachi-Slot Hisshouhou! Ultraman Club ST" @@ -29528,6 +31218,8 @@ SLPM-66292: SLPM-66293: name: "Gakuen Alice - KiraKira Memory Kiss" region: "NTSC-J" + gsHWFixes: + alignSprite: 1 # Reduces vertical line issue in textbox. SLPM-66294: name: "Sotsugyou 2nd Generation" region: "NTSC-J" @@ -29571,7 +31263,7 @@ SLPM-66302: name: "Clannad" region: "NTSC-J" gsHWFixes: - pointListPalette: 1 + cpuCLUTRender: 1 # Fixes colours. SLPM-66307: name: "Sengoku Musou 2" region: "NTSC-J" @@ -29631,7 +31323,7 @@ SLPM-66321: name: "Kurogane no Houkou - Warship Gunner 2" region: "NTSC-J" SLPM-66322: - name: "James Bond 007 - From Russia With Love" + name: "007 - Russia yori Ai o Komete" region: "NTSC-J" SLPM-66323: name: "Princess Software Collection, The" @@ -29644,20 +31336,22 @@ SLPM-66324: - "SLPM-66316" - "SLPM-66442" SLPM-66325: - name: "Castlevania - Lament of Innocence [Konami Palace Selection]" + name: "Castlevania [Konami Palace Selection]" region: "NTSC-J" clampModes: eeClampMode: 3 # Fixes cutscene freezes. SLPM-66327: - name: "Wallace and Gromit - The Curse of the Were-Rabbit" + name: "Wallace & Gromit - The Curse of the Were-Rabbit" region: "NTSC-J" gsHWFixes: - deinterlace: 3 # Game requires bob deinterlacing when auto. + deinterlace: 4 # Game requires bob deinterlacing when auto. + halfPixelOffset: 1 # Fixes misalignment/bloom when upscaling. SLPM-66328: name: "Call of Duty 2 - Big Red One" region: "NTSC-J" gameFixes: - SoftwareRendererFMVHack # Right side of the FMV is not rendering correctly. + - IbitHack # Fixes lights. gsHWFixes: roundSprite: 1 # Fixes lines in sprites. cpuSpriteRenderBW: 1 # Fixes textures. @@ -29683,6 +31377,30 @@ SLPM-66333: SLPM-66334: name: "WRC 4 [Spike the Best]" region: "NTSC-J" + gameFixes: + - XGKickHack # Fixes SPS. + patches: + default: + content: |- + author=kozarovv + // Proper patch for WRC 4. CRC independent. + // I wrote a small runtime that moves unpacker higher right after emulator boot. + // Seems little bit extensive, but there is no way to make it smaller. + // Solves TLB miss errors which prevented the game from booting. + patch=0,EE,0040000C,double,3c0500603cc70054 + patch=0,EE,00400014,double,24a5001024840010 + patch=0,EE,0040001C,double,7ca6000078860000 + patch=0,EE,00400024,double,000000001487fffb + patch=0,EE,0040002c,double,000000000817fff5 + patch=0,EE,005fffd4,double,3c1c70003c040060 + patch=0,EE,005fffdc,double,3c0700003c067000 + patch=0,EE,005fffe4,double,279c000024840800 + patch=0,EE,005fffec,double,24e7100024c60080 + patch=0,EE,005ffff4,double,00c7e8200818000c + gsHWFixes: + autoFlush: 1 # Fixes car shadows. + roundSprite: 1 # Fixes misalgined text. + halfPixelOffset: 1 # Fixes minor ghosting on objects. SLPM-66336: name: "Shinseiki Evangelion - Koutetsu no Girlfriend [Special Edition]" region: "NTSC-J" @@ -29707,6 +31425,9 @@ SLPM-66342: SLPM-66343: name: "Shin Sangoku Musou 4 - Empires" region: "NTSC-J" +SLPM-66344: + name: "Harukanaru Toki no Naka de 3 - Unmei no Labyrinth [Triple Pack]" + region: "NTSC-J" SLPM-66347: name: "Harukanaru Jikuu no Kade 3 - Unmei no Meikyuu [Premium Box]" region: "NTSC-J" @@ -29737,6 +31458,8 @@ SLPM-66354: gsHWFixes: autoFlush: 1 # Properly diffuses light instead of strips of light. roundSprite: 1 # Fixes lighting misalignment such as the street poles and the sun. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. patches: B3A9F9ED: content: |- @@ -29797,6 +31520,8 @@ SLPM-66375: name: "Ookami" region: "NTSC-J" compat: 5 + gsHWFixes: + roundSprite: 2 # Reduces misalignment issues but the game is just bad for upscaling. SLPM-66376: name: "KimiStar - Kimi to Study [BGM Collection Package]" region: "NTSC-J" @@ -29844,7 +31569,7 @@ SLPM-66388: name: "Fire Pro Wrestling Returns [Spike The Best]" region: "NTSC-J" SLPM-66390: - name: "Shoubi no Ki ni Shoubi no Hanasaku - Das Versprechen" + name: "Bara no Ki ni Bara no Hanasaku - Das Versprechen" region: "NTSC-J" SLPM-66391: name: "Prince of Persia - The Two Thrones" @@ -29942,6 +31667,9 @@ SLPM-66417: SLPM-66418: name: "Growlanser V - Generations" region: "NTSC-J" + compat: 5 + # gsHWFixes: Disabled because of GitHub Issue #6797 + # preloadFrameData: 1 # Fixes layers where characters should be visually behind an object. SLPM-66419: name: "Valkyrie Profile 2 - Silmeria" region: "NTSC-J" @@ -30090,10 +31818,17 @@ SLPM-66455: name: "Spectral Force - Radical Elements [IF Collection]" region: "NTSC-J" SLPM-66456: - name: "Asobi ni Iku Yo! [Limited Edition]" + name: "Asobi ni Iku yo! Chikyuu Pinch no Kon'yaku Sengen [Genteiban]" region: "NTSC-J" + patches: + 87FFC318: + content: |- + author=PSI, Jelta + // Game does weird stack manipulation, causing data sent to the IOP to be corrupted unless EE data cache is enabled. + // This patch skips over the stack code, allowing the game to boot. + patch=1,EE,001579D8,word,10000003 SLPM-66457: - name: "Asobi ni Iku Yo! Chikyuu Pinchi no Konyaku Sengen" + name: "Asobi ni Iku yo! Chikyuu Pinch no Kon'yaku Sengen" region: "NTSC-J" patches: 87FFC318: @@ -30116,7 +31851,7 @@ SLPM-66459: name: "Zero Pilot - Zero" region: "NTSC-J" SLPM-66460: - name: "Summer ##" + name: "_summer ##" region: "NTSC-J" SLPM-66461: name: "Tom Clancy's Ghost Recon - Advanced Warfighter" @@ -30131,17 +31866,20 @@ SLPM-66464: name: "MVP Baseball 2005 [EA Best Hits]" region: "NTSC-J" SLPM-66465: - name: "Mercenaries [EA Best Hits]" + name: "Mercenaries - Playground of Destruction [EA Best Hits]" region: "NTSC-J" gsHWFixes: halfBottomOverride: 1 # Bottom screen has wrong colors. - halfPixelOffset: 1 # Fixes bloom misalignment. + autoFlush: 1 # Fixes missing lighting. + # halfPixelOffset: 1 # Fixes lighting misalignment. Do not enable this, it breaks a lot of graphics. SLPM-66467: name: "Midway Arcade Treasures - The Game Center of USA" region: "NTSC-J" SLPM-66468: name: "Area 51" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Fixes misaligned lighting and other effects. SLPM-66469: name: "Love-Com - Punch de Court [Limited Edition]" region: "NTSC-J" @@ -30166,6 +31904,7 @@ SLPM-66473: cpuSpriteRenderBW: 1 # Fixes textures. preloadFrameData: 1 # Fixes static text screens. roundSprite: 1 # Fixes lines in some post-effects. + cpuCLUTRender: 1 # Fixes light occlusion. SLPM-66474: name: "Odin Sphere" region: "NTSC-J" @@ -30180,7 +31919,7 @@ SLPM-66477: name: "Kamiwaza" region: "NTSC-J" SLPM-66478: - name: "Star Ocean 3 - Till the End of Time [Ultimate Hits] [Disc1of2]" + name: "Star Ocean 3 - Till the End of Time [Ultimate Hits] [Disc 1 of 2]" region: "NTSC-J" compat: 5 gameFixes: @@ -30189,7 +31928,7 @@ SLPM-66478: halfPixelOffset: 2 # Fixes bloom and ghosting in certain areas. roundSprite: 1 # Fixes door transition vertical lines and minimap artifacts. SLPM-66479: - name: "Star Ocean 3 - Till the End of Time [Ultimate Hits] [Disc2of2]" + name: "Star Ocean 3 - Till the End of Time [Ultimate Hits] [Disc 2 of 2]" region: "NTSC-J" compat: 5 gameFixes: @@ -30237,7 +31976,7 @@ SLPM-66489: name: "Mabino x Style [2800 Collection]" region: "NTSC-J" SLPM-66491: - name: "Ayaka Shibito" + name: "Ayakashi-bito - Gen'you Ibunroku" region: "NTSC-J" SLPM-66492: name: "Commandos Strike Force" @@ -30296,6 +32035,8 @@ SLPM-66503: region: "NTSC-J" gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. SLPM-66504: name: "Onimusha 2 [Mega Hits]" region: "NTSC-J" @@ -30340,6 +32081,8 @@ SLPM-66515: SLPM-66516: name: "Sims, The & The Urbz - Sims in the City [EA Best Hits]" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Fixes upscaling lines. SLPM-66518: name: "Teikoku Sensenki [Best Version]" region: "NTSC-J" @@ -30396,7 +32139,7 @@ SLPM-66535: name: "Ryu Koku" region: "NTSC-J" SLPM-66536: - name: "Aria - The Natural ~Tooi Yume no Mirage~" + name: "Aria - The Natural - Tooi Yume no Mirage" region: "NTSC-J" SLPM-66537: name: "Iris no Atelier - Eternal Mana 2 [Gust Best Price]" @@ -30447,6 +32190,8 @@ SLPM-66555: SLPM-66556: name: "Shinobido Imashime [Spike The Best]" region: "NTSC-J" + clampModes: + eeClampMode: 3 # Fixes hang going in to the gardens. SLPM-66557: name: "FIFA Street [EA Best Hits]" region: "NTSC-J" @@ -30471,6 +32216,7 @@ SLPM-66562: region: "NTSC-J" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLAJ-25075" - "SLPM-66232" @@ -30502,6 +32248,9 @@ SLPM-66567: region: "NTSC-J" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + cpuSpriteRenderBW: 2 # Fixes some bad textures. + cpuCLUTRender: 1 # Fixes the rest of the bad textures. SLPM-66568: name: "Brothers In Arms - Road to Hill 30 [Ubisoft Best]" region: "NTSC-J" @@ -30521,6 +32270,8 @@ SLPM-66571: SLPM-66572: name: "LEGO Star Wars II - The Original Trilogy" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 1 # Fixes ghosting on objects and people. memcardFilters: - "SLPM-66572" - "SLPS-20423" @@ -30543,6 +32294,7 @@ SLPM-66577: gsHWFixes: halfPixelOffset: 3 # Fixes bloom misalignment still a bit misaligned. roundSprite: 1 # Fixes bloom misalignment still a bit misaligned. + cpuCLUTRender: 1 # Fixes sun background on the windows when selecting your 'race'. SLPM-66582: name: "Kohitsuji Hokaku Keikaku! Sweet Boys Life [Limited Edition]" region: "NTSC-J" @@ -30624,7 +32376,7 @@ SLPM-66601: name: "SSX On Tour [EA Best Hits]" region: "NTSC-J" SLPM-66602: - name: "Ryu ga Gotoku 2 [Disc1of2]" + name: "Ryu ga Gotoku 2 [Disc 1 of 2]" region: "NTSC-J" memcardFilters: - "SLPM-66602" @@ -30633,7 +32385,7 @@ SLPM-66602: - "SLPM-74234" - "SLPM-74253" SLPM-66603: - name: "Ryu ga Gotoku 2 [Disc2of2]" + name: "Ryu ga Gotoku 2 [Disc 2 of 2]" region: "NTSC-J" memcardFilters: - "SLPM-66602" @@ -30666,7 +32418,7 @@ SLPM-66611: name: "Tomoyo After - It's Wonderful Life [CS Edition]" region: "NTSC-J" gsHWFixes: - pointListPalette: 1 + cpuCLUTRender: 1 # Fixes Colours. SLPM-66612: name: "School Love [Limited Edition]" region: "NTSC-J" @@ -30674,7 +32426,10 @@ SLPM-66613: name: "Medal of Honor - Rising Sun & Frontline [EA Best Hits]" region: "NTSC-J" SLPM-66615: - name: "James Bond 007 - Everything or Nothing & Nightfire [EA Best Hits]" + name: "007 - Nightfire [EA Best Hits Dual Pack]" + region: "NTSC-J" +SLPM-66616: + name: "007 - Everything or Nothing [EA Best Hits Dual Pack]" region: "NTSC-J" SLPM-66617: name: "Need for Speed - Carbon" @@ -30779,6 +32534,8 @@ SLPM-66644: SLPM-66645: name: "Bionicle Heroes" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 1 # Fixes ghosting on objects and people. SLPM-66646: name: "Shining Force EXA" region: "NTSC-J" @@ -30795,10 +32552,14 @@ SLPM-66652: name: "Burnout Revenge [EA Best Hits]" region: "NTSC-J" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 0 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLAJ-25066" - "SLPM-66108" @@ -30859,6 +32620,9 @@ SLPM-66668: region: "NTSC-J" clampModes: vuClampMode: 0 # Fixes SPS with microVU. + eeClampMode: 2 # Fixes missing blade. + gsHWFixes: + roundSprite: 1 # Fixes font sizes to be bigger. memcardFilters: - "SLPM-66175" - "SLPM-66668" @@ -30895,6 +32659,7 @@ SLPM-66675: region: "NTSC-J" gsHWFixes: autoFlush: 1 # Fixes effects. + halfPixelOffset: 1 # Fixes upscaling artifacts. compat: 5 memcardFilters: # Reads Re:Chain data and vice-versa. - "SLPM-66675" @@ -30903,6 +32668,9 @@ SLPM-66676: name: "Kingdom Hearts Re-Chain of Memories" region: "NTSC-J" compat: 5 + gsHWFixes: + autoFlush: 1 # Fixes double image. + halfPixelOffset: 1 # Fixes misaligned bloom. memcardFilters: - "SLPM-66675" - "SLPM-66676" @@ -30913,6 +32681,7 @@ SLPM-66677: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SLPM-66678: name: "Final Fantasy X-2 - International + Last Mission [Ultimate Hits]" region: "NTSC-J" @@ -30953,7 +32722,7 @@ SLPM-66687: name: "Hiiro no Kakera - Ano Sora no Shita de" region: "NTSC-J" patches: - 8365E603: + "8365E603": content: |- author=PSI, Jelta // Game does weird stack manipulation, causing data sent to the IOP to be corrupted unless EE data cache is enabled. @@ -30966,7 +32735,7 @@ SLPM-66689: name: "Persona 3 FES [Append Edition]" region: "NTSC-J" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes flashing windows. memcardFilters: - "SLPM-66445" - "SLPM-66689" @@ -30975,7 +32744,7 @@ SLPM-66690: name: "Persona 3 FES [Independent Starting Version]" region: "NTSC-J" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes flashing windows. memcardFilters: - "SLPM-66445" - "SLPM-66689" @@ -30990,8 +32759,10 @@ SLPM-66693: name: "Princess Maker 4 [Best Version]" region: "NTSC-J" SLPM-66694: - name: "Spongebob" + name: "Nickelodeon SpongeBob SquarePants" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. SLPM-66695: name: "Kono Aozora ni Yakusoku o - Melody of the Sun and Sea" region: "NTSC-J" @@ -31032,12 +32803,17 @@ SLPM-66708: region: "NTSC-J" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. +SLPM-66707: + name: "Yukinko Daisenpuu - Sayuki to Koyuki no Hie Hie Daisoudou" + region: "NTSC-J" SLPM-66709: name: "Angel Profile" region: "NTSC-J" SLPM-66710: name: "Godfather, The" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 1 # Fixes light occlusion. SLPM-66712: name: "Rozen Maiden - Geppetto Garden [Limited Edition]" region: "NTSC-J" @@ -31058,6 +32834,9 @@ SLPM-66715: SLPM-66716: name: "Growlanser VI" region: "NTSC-J" + compat: 5 + # gsHWFixes: Disabled because of GitHub Issue #6797 + # preloadFrameData: 1 # Fixes layers where characters should be visually behind an object. SLPM-66717: name: "Standard Daisenryaku - Dengekisen [Sega the Best]" region: "NTSC-J" @@ -31108,6 +32887,8 @@ SLPM-66731: gsHWFixes: autoFlush: 1 # Properly diffuses light instead of strips of light. roundSprite: 1 # Fixes lighting misalignment such as the street poles and the sun. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. SLPM-66732: name: "Iinazuke [Limited Edition]" region: "NTSC-J" @@ -31147,10 +32928,14 @@ SLPM-66739: name: "Burnout Dominator" region: "NTSC-J" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLPM-66740: name: "Sentou Kokka Kai - Legend [DX Pack]" region: "NTSC-J" @@ -31170,6 +32955,8 @@ SLPM-66744: SLPM-66745: name: "Shadow of Rome [CapKore]" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness and misalgined garbage when upscaling. SLPM-66746: name: "Guilty Gear XX - Accent Core" region: "NTSC-J" @@ -31212,6 +32999,8 @@ SLPM-66754: SLPM-66755: name: "Majo-musume - A La Mode II" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 1 # Fixes bad colour rendering. SLPM-66756: name: "Que - Ancient Leaf no Yousei [Limited Edition]" region: "NTSC-J" @@ -31249,6 +33038,8 @@ SLPM-66766: SLPM-66767: name: "Urban Chaos - Riot Response" region: "NTSC-J" + gsHWFixes: + roundSprite: 1 # Fixes edge garbage and thin lines. SLPM-66768: name: "Missing Parts - The Tantei Stories - Side A [Best Version]" region: "NTSC-J" @@ -31283,11 +33074,15 @@ SLPM-66778: name: "Galaxy Angel - Eternal Lovers [Broccoli The Best Quality]" region: "NTSC-J" SLPM-66779: - name: "Galaxy Angel II - Mugen Kairou no Kagi [Disc1of2]" + name: "Galaxy Angel II - Mugen Kairou no Kagi [Disc 1 of 2]" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Reduces misaligned lighting and other effects. SLPM-66780: - name: "Galaxy Angel II - Mugen Kairou no Kagi [Disc2of2]" + name: "Galaxy Angel II - Mugen Kairou no Kagi [Disc 2 of 2]" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Reduces misaligned lighting and other effects. memcardFilters: - "SLPM-66779" SLPM-66781: @@ -31305,6 +33100,9 @@ SLPM-66782: SLPM-66783: name: "Idol Janshi Suchie-Pai 4 [Limited Edition]" region: "NTSC-J" +SLPM-66784: + name: "Idol Janshi Suchie-Pai III Remix " + region: "NTSC-J" SLPM-66785: name: "Idol Janshi Suchie-Pai 4" region: "NTSC-J" @@ -31312,13 +33110,13 @@ SLPM-66786: name: "Gift - Prism [Broccoli Best Quality]" region: "NTSC-J" SLPM-66787: - name: "Tsuika AS+ Eternal Name" + name: "Suika A.S+ Eternal Name" region: "NTSC-J" SLPM-66788: name: "Grand Theft Auto - San Andreas [Best Price]" region: "NTSC-J" clampModes: - vuClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. + eeClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. gsHWFixes: autoFlush: 1 SLPM-66789: @@ -31335,6 +33133,8 @@ SLPM-66792: region: "NTSC-J" gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. SLPM-66794: name: "Metal Gear Solid 3 - Snake Eater [20th Anniversary Edition]" region: "NTSC-J" @@ -31367,7 +33167,7 @@ SLPM-66806: name: "Shuffle! On the Stage [Kadokawa the Best]" region: "NTSC-J" SLPM-66807: - name: "Disney-Pixar's Remy no Oishii Restaurant (Ratatouille)" + name: "Disney-Pixar's Remy no Oishii Restaurant" region: "NTSC-J" compat: 5 roundModes: @@ -31375,6 +33175,7 @@ SLPM-66807: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLPM-66808: name: "Tom Clancy's Ghost Recon - Advanced Warfighter [Ubisoft the Best]" region: "NTSC-J" @@ -31442,7 +33243,7 @@ SLPM-66829: name: "Major League Baseball 2K7" region: "NTSC-J" SLPM-66830: - name: "Disney's Lewis to Mirai Dorobou (Meet the Robinsons)" + name: "Disney's Lewis to Mirai Dorobou" region: "NTSC-J" SLPM-66835: name: "Kiniro no Corda 2 Anchor" @@ -31539,6 +33340,8 @@ SLPM-66863: SLPM-66864: name: "Umisho" region: "NTSC-J" + gsHWFixes: + alignSprite: 1 # Reduces misaligned line distortian when in QTE. SLPM-66866: name: "Jissen Pachi-Slot Hisshouhou! Hokuto no Ken 2" region: "NTSC-J" @@ -31579,7 +33382,7 @@ SLPM-66876: name: "Izumo 2 [GN Software Best]" region: "NTSC-J" SLPM-66877: - name: "Summer## [GN Software Best]" + name: "_summer ## [GNsoftware Best]" region: "NTSC-J" SLPM-66878: name: "Dokapon Kingdom" @@ -31612,6 +33415,8 @@ SLPM-66886: region: "NTSC-J" gsHWFixes: mipmap: 1 + halfPixelOffset: 1 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLPM-66887: name: "Harukanaru Jikuu no Kade 3 - Unmei no Meikyuu [Koei the Best]" region: "NTSC-J" @@ -31647,6 +33452,7 @@ SLPM-66897: region: "NTSC-J" gsHWFixes: halfPixelOffset: 2 # Fixes ghosting. + autoFlush: 1 # Fixes post lighting. SLPM-66898: name: "Spectral Gene [Limited Edition]" region: "NTSC-J" @@ -31757,6 +33563,8 @@ SLPM-66931: SLPM-66932: name: "Need for Speed - ProStreet" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Fixes depth line. SLPM-66933: name: "Kimi ga Aruji de Shitsuji ga Ore de - Oshie Nikki [Limited Edition]" region: "NTSC-J" @@ -31782,7 +33590,7 @@ SLPM-66940: name: "Gundam Musou Special" region: "NTSC-J" SLPM-66941: - name: "Hokuto no Ken (Fist of the North Star) [Sega the Best]" + name: "Hokuto no Ken [Sega the Best]" region: "NTSC-J" SLPM-66942: name: "Final Approach 2 - 1st Priority [First Print Limited Edition]" @@ -31824,7 +33632,7 @@ SLPM-66957: name: "Neon Genesis Evangelion - Battle Orchestra [Broccoli Best Quality]" region: "NTSC-J" SLPM-66958: - name: "Aoishiro [Limited Edition]" + name: "Aoi Shiro [Genteiban]" region: "NTSC-J" SLPM-66959: name: "Aoishiro" @@ -31842,14 +33650,20 @@ SLPM-66961: gsHWFixes: autoFlush: 1 # Properly diffuses light instead of strips of light. roundSprite: 1 # Fixes lighting misalignment such as the street poles and the sun. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. SLPM-66962: name: "Burnout 3 - Takedown [EA-SY! 1980]" region: "NTSC-J" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLPM-66963: name: "Medal of Honor - Frontline [EA-SY! 1980]" region: "NTSC-J" @@ -31863,8 +33677,10 @@ SLPM-66965: SLPM-66966: name: "Godfather, The [EA-SY! 1980]" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 1 # Fixes light occlusion. SLPM-66967: - name: "Aria - The Natural ~Tooi Yume no Mirage~ [Alchemist Best Collection]" + name: "Aria - The Natural - Tooi Yume no Mirage [Alchemist Best Collection]" region: "NTSC-J" SLPM-66968: name: "Kamiwaza [Acquire the Best]" @@ -31887,6 +33703,9 @@ SLPM-66973: SLPM-66974: name: "Slotter Up Core 10 - Mach GoGoGo" region: "NTSC-J" +SLPM-66975: + name: "Edel Blume [Genteiban]" + region: "NTSC-J" SLPM-66977: name: "Shinkyoku Soukai Polyphonica 0-4 Hanashi Full Pack" region: "NTSC-J" @@ -31952,6 +33771,7 @@ SLPM-67002: gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. roundSprite: 2 # Fixes font artifacts. SLPM-67003: name: "Sakura Taisen - Atsuki Chishioni" @@ -31961,7 +33781,7 @@ SLPM-67004: name: "Medal of Honor - Rising Sun" region: "NTSC-J" SLPM-67005: - name: "Lord of the Rings, The - The Two Towers (EA Best Hits)" + name: "Lord of the Rings, The - The Two Towers [EA Best Hits]" region: "NTSC-J" clampModes: vuClampMode: 3 # Fix white shiny weapons. @@ -31975,6 +33795,7 @@ SLPM-67008: name: "Metal Gear Solid 2 - Substance [Konami Dendou Collection]" region: "NTSC-J" gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. roundSprite: 2 # Fixes font artifacts. SLPM-67009: name: "Sakura Taisen V - Saraba Itoshiki Hito Yo" @@ -31984,25 +33805,25 @@ SLPM-67010: region: "NTSC-J" gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SLPM-67011: name: "God of War [CapKore]" region: "NTSC-J" gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SLPM-67012: name: "God of War [Best Price]" region: "NTSC-J" gsHWFixes: alignSprite: 1 # Fixes water vertical lines. - halfPixelOffset: 2 # Fixes depth lines and vertical lines and green fog bloom effect. roundSprite: 1 # Fixes vertical lines and minor ghosting. wrapGSMem: 1 # Fixes FMV when in progressive mode. + autoFlush: 1 # Fixes sun going through walls. SLPM-67013: name: "God of War II - The End Begins" region: "NTSC-J" @@ -32010,6 +33831,7 @@ SLPM-67013: alignSprite: 1 # Fixes water vertical lines. halfPixelOffset: 2 # Fixes misaligned bloom. roundSprite: 1 # Fixes chromatic effect. + autoFlush: 1 # Fixes sun occlusion. SLPM-67015: name: "School Days LxH" region: "NTSC-J" @@ -32028,14 +33850,16 @@ SLPM-67504: roundModes: eeRoundMode: 0 # Fixes riders vanish into the floor. SLPM-67505: - name: "James Bond 007 - Agent Under Fire" + name: "007 - Agent Under Fire" region: "NTSC-K" compat: 5 clampModes: vuClampMode: 2 # Fixes corrupt textures. SLPM-67507: - name: "Onimusha Warlords" + name: "Onimusha - Warlords" region: "NTSC-K" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLPM-67508: name: "Gitaroo Man" region: "NTSC-K" @@ -32043,8 +33867,14 @@ SLPM-67508: roundModes: eeRoundMode: 1 vuRoundMode: 3 + patches: + default: + content: |- + author=boringhexi + // fix stage 4 flashing triangles + patch=0,EE,00102d40,word,00000000 SLPM-67512: - name: "FIFA World Cup 2002" + name: "2002 FIFA World Cup" region: "NTSC-K" SLPM-67513: name: "Final Fantasy X International" @@ -32053,9 +33883,17 @@ SLPM-67513: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SLPM-67514: name: "Kessen" region: "NTSC-K" +SLPM-67515: + name: "Metal Gear Solid 2 - Sons of Liberty" + region: "NTSC-K" + gameFixes: + - DMABusyHack # Fixes broken half-bottom artifacts + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. SLPM-67518: name: "Onimusha 2 Samurai's Destiny" region: "NTSC-K" @@ -32092,6 +33930,7 @@ SLPM-67527: vuClampMode: 2 # White textures. gsHWFixes: halfPixelOffset: 1 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes "Busted" scenes. SLPM-67528: name: "Hajime no Ippo - Victorious Boxers [Championship Edition]" region: "NTSC-K" @@ -32160,6 +33999,8 @@ SLPM-68019: region: "NTSC-J" gameFixes: - SoftwareRendererFMVHack # Fixes vertical lines in FMVs. + gsHWFixes: + halfPixelOffset: 1 # Corrects post processing position. SLPM-68503: name: "Metal Gear Solid 2 - Sons of Liberty [Shareholder Edition]" region: "NTSC-J" @@ -32231,7 +34072,7 @@ SLPM-74104: name: "Momotarou Densetsu 15 [PlayStation 2 The Best]" region: "NTSC-J" SLPM-74201: - name: "Biohazard Outbreak [PlayStation 2 The Best]" + name: "BioHazard Outbreak [PlayStation 2 The Best]" region: "NTSC-J" SLPM-74202: name: "Fuuun Shinsengumi [PlayStation 2 The Best]" @@ -32252,6 +34093,8 @@ SLPM-74205: SLPM-74206: name: "Onimusha [PlayStation 2 The Best]" region: "NTSC-J" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLPM-74208: name: "Tengai Makyou 2 - Manjimaru [PlayStation 2 The Best]" region: "NTSC-J" @@ -32302,12 +34145,17 @@ SLPM-74227: region: "NTSC-J" gameFixes: - VIF1StallHack # Fixes black screen on boot. + gsHWFixes: + autoFlush: 1 # Fixes missing bloom effects. + halfPixelOffset: 2 # Fixes misaligned lighting and bloom. SLPM-74228: name: "Fuuun Bakumatsu-den [PlayStation 2 The Best]" region: "NTSC-J" SLPM-74229: name: "BioHazard 4 [PlayStation 2 The Best]" region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLPM-74230: @@ -32324,14 +34172,14 @@ SLPM-74232: gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. SLPM-74233: name: "Shin Onimusha - Dawn of Dreams [PlayStation 2 The Best][Disc 2]" region: "NTSC-J" gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. memcardFilters: - "SLPM-74232" SLPM-74234: @@ -32352,6 +34200,8 @@ SLPM-74238: SLPM-74239: name: "Okami [PlayStation 2 The Best]" region: "NTSC-J" + gsHWFixes: + roundSprite: 2 # Reduces misalignment issues but the game is just bad for upscaling. SLPM-74240: name: "Tengai Makyou III - Namida [Best Version]" region: "NTSC-J" @@ -32368,6 +34218,7 @@ SLPM-74242: eeRoundMode: 0 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but still an issue compared to native. + roundSprite: 2 # Clears up much of the blurring that HPO Special does not. SLPM-74243: name: "True Crime - New York City [PlayStation 2 The Best]" region: "NTSC-J" @@ -32379,6 +34230,7 @@ SLPM-74243: cpuSpriteRenderBW: 1 # Fixes textures. preloadFrameData: 1 # Fixes static text screens. roundSprite: 1 # Fixes lines in some post-effects. + cpuCLUTRender: 1 # Fixes light occlusion. SLPM-74244: name: "Phantasy Star Universe [PlayStation 2 The Best]" region: "NTSC-J" @@ -32425,14 +34277,14 @@ SLPM-74251: gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. SLPM-74252: - name: "Shin Onimusha - Dawn of Dreams [Playstation 2 the Best - Reprint Disc 2]" + name: "Shin Onimusha - Dawn of Dreams [PlayStation 2 the Best - Reprint Disc 2]" region: "NTSC-J" gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. memcardFilters: - "SLPM-74251" SLPM-74253: @@ -32460,13 +34312,20 @@ SLPM-74277: region: "NTSC-J" compat: 5 gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes flashing windows. SLPM-74278: name: "Persona 4 [PlayStation 2 The Best]" region: "NTSC-J" SLPM-74286: name: "Shin Sangoku Musou 5 Special [PlayStation 2 The Best]" region: "NTSC-J" +SLPM-74288: + name: "BioHazard 4" + region: "NTSC-J" + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness. SLPM-74301: name: "Ryu ga Gotoku 2 [PlayStation 2 The Best]" region: "NTSC-J" @@ -32491,6 +34350,10 @@ SLPM-74405: SLPM-74406: name: "World Rally Championship [PlayStation 2 The Best]" region: "NTSC-J" + roundModes: + eeRoundMode: 0 # Fixes crash when using the Subaru. + gameFixes: + - XGKickHack # Fixes SPS while ingame. SLPM-74407: name: "Jet de Go! 2 [PlayStation 2 The Best]" region: "NTSC-J" @@ -32498,7 +34361,7 @@ SLPM-74408: name: "Rakugaki Kingdom [PlayStation 2 The Best]" region: "NTSC-J" SLPM-74409: - name: "Gun Survivor 2 - Biohazard Code - Veronica [PlayStation 2 The Best]" + name: "Gun Survivor 2 - BioHazard Code - Veronica [PlayStation 2 The Best]" region: "NTSC-J" SLPM-74410: name: "Breath of Fire V - Dragon Quarter [PlayStation 2 The Best]" @@ -32524,6 +34387,8 @@ SLPM-74420: SLPM-74421: name: "Dennou Senki - Virtual-On Marz [PlayStation 2 The Best]" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 2 # Fixes CLUT colours. SLPS-20001: name: "Ridge Racer V" region: "NTSC-J" @@ -32533,6 +34398,10 @@ SLPS-20001: gsHWFixes: cpuFramebufferConversion: 1 textureInsideRT: 1 + halfPixelOffset: 2 # Fixes title screen and some intro post processing alignment. + roundSprite: 1 # Fixes ui and hud alignment. + gpuPaletteConversion: 2 # Lots of CLUTs in large textures. + cpuCLUTRender: 1 # Fixes car textures. SLPS-20002: name: "Doukyu Billiards" region: "NTSC-J" @@ -32550,10 +34419,14 @@ SLPS-20007: name: "Driving Emotion Type S" region: "NTSC-J" compat: 5 + clampModes: + vuClampMode: 3 # Fixes missing geometry. gameFixes: - EETimingHack # Garbage in FMVs. + - VUSyncHack # Fixes missing geometry. gsHWFixes: textureInsideRT: 1 + roundSprite: 1 # Fixes font misalignment when upscaling. SLPS-20009: name: "Golf Paradise" region: "NTSC-J" @@ -32583,13 +34456,13 @@ SLPS-20017: name: "Street Mahjong Trance 2" region: "NTSC-J" SLPS-20018: - name: "Stepping Selection [Disc1of2]" + name: "Stepping Selection [Disc 1 of 2]" region: "NTSC-J" memcardFilters: - "SLPS-20018" - "SLPS-20019" SLPS-20019: - name: "Stepping Selection [Disc2of2]" + name: "Stepping Selection [Disc 2 of 2]" region: "NTSC-J" memcardFilters: - "SLPS-20018" @@ -32649,6 +34522,9 @@ SLPS-20038: region: "NTSC-J" gameFixes: - EETimingHack # Fixes hang at menu. +SLPS-20039: + name: "Ide Yousuke no Mahjong Kazoku 2" + region: "NTSC-J" SLPS-20040: name: "MotoGP" region: "NTSC-J" @@ -32757,6 +34633,8 @@ SLPS-20082: SLPS-20083: name: "Air Ranger Rescue Helicopter" region: "NTSC-J" + gameFixes: + - VUSyncHack # Fixes graphics. SLPS-20084: name: "Basic Studio [Disc 1]" region: "NTSC-J" @@ -32836,6 +34714,9 @@ SLPS-20108: region: "NTSC-J" gsHWFixes: mipmap: 1 +SLPS-20110: + name: "Mezase! Meimon Yakyuubu 2" + region: "NTSC-J" SLPS-20111: name: "Magical Sports - Pro Baseball 2001" region: "NTSC-J" @@ -32849,10 +34730,10 @@ SLPS-20115: name: "Gendai Yougo no Kiso Chishiki 2001" region: "NTSC-J" SLPS-20120: - name: "Formula One 2001" + name: "F1 2001" region: "NTSC-J" - gameFixes: - - XGKickHack + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLPS-20121: name: "Kanon" region: "NTSC-J" @@ -32879,7 +34760,7 @@ SLPS-20131: name: "Jissen Pachi-Slot Hisshouhou! Juuou" region: "NTSC-J" SLPS-20132: - name: "Chenuen no San Goku Shi (Chen Wen's Romance of the Three Kingdoms)" + name: "Chenuen no San Goku Shi" region: "NTSC-J" SLPS-20135: name: "Pai Chenjan" @@ -32916,6 +34797,9 @@ SLPS-20149: SLPS-20150: name: "Akira Psycho Ball" region: "NTSC-J" +SLPS-20158: + name: "Yamasa Digi World 2 LCD Edition - Time Cross, Qlogos, Trigger Zone" + region: "NTSC-J" SLPS-20161: name: "Saikyou Toudai Shogi Special" region: "NTSC-J" @@ -32927,10 +34811,10 @@ SLPS-20163: name: "Typing Kengo 634" region: "NTSC-J" SLPS-20165: - name: "La Pucelle" + name: "La Pucelle - Hikari no Seijo Densetsu [Limited Edition]" region: "NTSC-J" SLPS-20167: - name: "La Pucelle" + name: "La Pucelle - Hikari no Seijo Densetsu" region: "NTSC-J" SLPS-20168: name: "NHL 2002" @@ -32959,15 +34843,23 @@ SLPS-20177: SLPS-20178: name: "Samurai" region: "NTSC-J" +SLPS-20181: + name: "Alpine Racer 3" + region: "NTSC-J" + gsHWFixes: + deinterlace: 9 # Game requires Adaptive BFF deinterlacing when auto. SLPS-20183: name: "Motto Golful Golf" region: "NTSC-J" +SLPS-20184: + name: "Eikan wa Kimi ni 2002 - Koushien no Kodou" + region: "NTSC-J" SLPS-20185: name: "Wangan Midnight" region: "NTSC-J" compat: 5 SLPS-20187: - name: "Black Matrix 2" + name: "Black-Matrix II" region: "NTSC-J" compat: 5 SLPS-20190: @@ -32989,7 +34881,7 @@ SLPS-20194: name: "Underwater Unit" region: "NTSC-J" SLPS-20196: - name: "Akagawa Jiro - Tsuki no Hikari - Shizumeru Kane no Satsujin" + name: "Akagawa Jirou - Tsuki no Hikari - Shizumeru Kane no Satsujin" region: "NTSC-J" SLPS-20197: name: "Surfing Air Show with RatBoy" @@ -32999,10 +34891,12 @@ SLPS-20198: region: "NTSC-J" compat: 5 gsHWFixes: - deinterlace: 6 # Fixes blurriness. + deinterlace: 7 # Fixes blurriness. SLPS-20199: name: "F1 2002" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLPS-20202: name: "Coloball 2002" region: "NTSC-J" @@ -33010,14 +34904,20 @@ SLPS-20207: name: "Usagi - Yasei no Topai" region: "NTSC-J" SLPS-20208: - name: "I am Small!" + name: "Boku wa Chiisai" region: "NTSC-J" compat: 5 SLPS-20209: name: "Jissen Pachi-Slot Hisshouhou! Aladdin A [Limited Edition]" region: "NTSC-J" +SLPS-20211: + name: "Yamasa Digi World 3 - Time Park, King Pulsar, Cyber Dragon" + region: "NTSC-J" +SLPS-20213: + name: "Hissatsu Pachinko Station V4 - Drumtic Mahjong" + region: "NTSC-J" SLPS-20214: - name: "3-D Fighting School 2" + name: "3D Kakutou Tkool 2" region: "NTSC-J" SLPS-20215: name: "Jissen Pachi-Slot Hisshouhou! Aladdin A" @@ -33025,6 +34925,8 @@ SLPS-20215: SLPS-20216: name: "Air Ranger - Rescue Helicopter" region: "NTSC-J" + gameFixes: + - VUSyncHack # Fixes graphics. SLPS-20217: name: "Hokka Hoka Sentou" region: "NTSC-J" @@ -33044,19 +34946,20 @@ SLPS-20219: patch=1,EE,0011836C,word,00000000 patch=1,EE,00118374,word,00000000 SLPS-20220: - name: "Pachi-Slot Aruze Oukoku 7 (Disc 1) (Ekishou Disc)" + name: "Pachi-Slot Aruze Oukoku 7 [Disc 1][Ekishou Disc]" region: "NTSC-J" SLPS-20221: name: "Taiko no Tatsujin - Tatacon de Dodon ga Don [with Tatacon]" region: "NTSC-J" compat: 5 - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SLPS-20222: name: "Inaka Kurasi - Nan no Shima no Monogatari" region: "NTSC-J" SLPS-20226: - name: "Yamasa Digital Slot World SP DX" + name: "Yamasa Digi World SP DX - Neo Planett XX" + region: "NTSC-J" +SLPS-20227: + name: "Yamasa Digi World SP - Neo Planett XX" region: "NTSC-J" SLPS-20230: name: "Chulip" @@ -33096,15 +34999,11 @@ SLPS-20256: region: "NTSC-J" compat: 5 SLPS-20257: - name: "Yamasa Digi World 4DX" + name: "Yamasa Digi World 4 DX - Penguin Paradise, Crazy Shaman R, Zakzak Senryoubako R, Destroyer XX, King Pulsar" region: "NTSC-J" - gameFixes: - - SoftwareRendererFMVHack # Fix flickering and bad textures in FMV. SLPS-20258: - name: "Yamasa Digi World 4" + name: "Yamasa Digi World 4 - Penguin Paradise, Crazy Shaman R, Zakzak Senryoubako R, Destroyer XX, King Pulsar" region: "NTSC-J" - gameFixes: - - SoftwareRendererFMVHack # Fix flickering and bad textures in FMV. SLPS-20259: name: "Kotoba no Puzzle - Mojipittan" region: "NTSC-J" @@ -33112,7 +35011,7 @@ SLPS-20260: name: "Sakigake!! Kuromati Koukou" region: "NTSC-J" SLPS-20262: - name: "Slot Pro DX - Fujiko 2" + name: "Slot! Pro DX - Fujiko 2" region: "NTSC-J" SLPS-20263: name: "J.League Tactics Manager - Realtime Soccer Simulation" @@ -33133,13 +35032,11 @@ SLPS-20272: name: "Taiko no Tatsujin - Doki! Shinkyoku Darake no Haru Matsuri" region: "NTSC-J" compat: 5 - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SLPS-20273: name: "Netsu Chu! Pro Yakyuu 2003" region: "NTSC-J" patches: - 34fb1fb7: + 34FB1FB7: content: |- author=Prafull // Fixes game hanging before going ingame. @@ -33158,8 +35055,6 @@ SLPS-20281: SLPS-20282: name: "Taiko no Tatsujin - Tatacon de Dodon ga Don" region: "NTSC-J" - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SLPS-20284: name: "Marl de Jigsaw" region: "NTSC-J" @@ -33188,9 +35083,17 @@ SLPS-20293: SLPS-20294: name: "Hanabi Shokunin Ninarou 2" region: "NTSC-J" +SLPS-20295: + name: "F1 Career Challenge" + region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLPS-20296: name: "Dugout '03 - The Turning Point" region: "NTSC-J" +SLPS-20298: + name: "Fever 8 - Sankyo Koushiki Pachinko Simulation" + region: "NTSC-J" SLPS-20299: name: "Black Matrix 2" region: "NTSC-J" @@ -33200,18 +35103,30 @@ SLPS-20300: SLPS-20301: name: "Gachinko Professional Baseball" region: "NTSC-J" +SLPS-20302: + name: "Gokuraku-jong Premium" + region: "NTSC-J" SLPS-20303: name: "Inaka Kurasi [Best Collection]" region: "NTSC-J" SLPS-20305: name: "Real Sports Professional Baseball" region: "NTSC-J" +SLPS-20308: + name: "Hanabi Hyakkei [Tokutenban]" + region: "NTSC-J" SLPS-20311: name: "Primopuel - My Special Partner [Limited Edition]" region: "NTSC-J" SLPS-20312: name: "Primopuel - My Special Partner" region: "NTSC-J" +SLPS-20314: + name: "Gold X" + region: "NTSC-J" +SLPS-20315: + name: "Yamasa Digi World SP - Neo Magic Pulsar XX" + region: "NTSC-J" SLPS-20316: name: "Hissatsu Pachinko Station v8" region: "NTSC-J" @@ -33219,17 +35134,16 @@ SLPS-20317: name: "Jissen Pachi-Slot Hisshouhou! King Camel" region: "NTSC-J" compat: 5 +SLPS-20318: + name: "3D Kakutou Tkool 2 [ebKore]" + region: "NTSC-J" SLPS-20320: name: "Taiko no Tatsujin - Appare Sandaime [with Tatacon]" region: "NTSC-J" - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SLPS-20321: name: "Taiko no Tatsujin - Appare Sandaime" region: "NTSC-J" compat: 5 - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SLPS-20322: name: "Netsu Chu! Pro Yakyuu 2003 - Aki no Night Matsuri" region: "NTSC-J" @@ -33254,8 +35168,6 @@ SLPS-20330: name: "Taiko no Tatsujin - Waku Waku Anime Matsuri" region: "NTSC-J" compat: 5 - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SLPS-20331: name: "Fever 9 - Sankyo" region: "NTSC-J" @@ -33296,7 +35208,7 @@ SLPS-20349: name: "Mahjong Party - Duel with The Idol" region: "NTSC-J" SLPS-20350: - name: "Soccer Life" + name: "Soccer Life! We are Challengers to Europe" region: "NTSC-J" SLPS-20351: name: "Slotter UP - Mania 4" @@ -33308,7 +35220,7 @@ SLPS-20354: name: "Yamasa Digi World 3 [Best of Best]" region: "NTSC-J" SLPS-20355: - name: "Yamasa Digi World SP - Neo Magic Pulsar XX [Best of Best]" + name: "Yamasa Digi World SP - Neo Planett XX [Best of Best]" region: "NTSC-J" SLPS-20356: name: "Yamasa Digi World 4 [Best of Best]" @@ -33332,7 +35244,7 @@ SLPS-20366: name: "CR Kamen Rider Pachi-Slot Expert 5" region: "NTSC-J" SLPS-20367: - name: "Curry House Coco Ichibanya" + name: "Curry House CoCo Ichiban'ya - Kyou mo Genki da! Curry ga Umai!!" region: "NTSC-J" compat: 5 SLPS-20368: @@ -33382,13 +35294,13 @@ SLPS-20382: name: "Taiko no Tatsujin - Atsumare! Matsuri da!! Yondaime [with Tatacon]" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20383: name: "Taiko no Tatsujin - Atsumare! Matsuri da!! Yondaime" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20384: name: "Hayarigami - Keishichou Kaii Jiken File" @@ -33424,19 +35336,19 @@ SLPS-20397: name: "Pachitte Chonmage Tatsujin 7 - CR Pachinko Dokaben" region: "NTSC-J" SLPS-20398: - name: "La Pucelle - Hikari no Seijyo Densetsu Nijuu" + name: "La Pucelle - Hikari no Seijo Densetsu - 2-shuume Hajimemashita" region: "NTSC-J" SLPS-20399: name: "Taiko no Tatsujin - Go! Go! Godaime [with Tatacon]" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20400: name: "Taiko no Tatsujin - Go! Go! Godaime" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20401: name: "Tecmo Hit Parade" @@ -33477,14 +35389,14 @@ SLPS-20413: name: "Taiko no Tatsujin - Taiko Drum Master [with Tatacon]" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20414: name: "Taiko no Tatsujin - Taiko Drum Master" region: "NTSC-J" compat: 5 gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20416: name: "Inyou Taisenki - Byakko Enbu [with EyeToy]" @@ -33507,21 +35419,26 @@ SLPS-20422: SLPS-20423: name: "LEGO Star Wars - The Video Game" region: "NTSC-J" + clampModes: + vuClampMode: 3 # Fixes bad coordinate spam. SLPS-20424: name: "Taiko no Tatsujin - Tobikkiri! Anime Special [with Tatacon]" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20425: name: "Taiko no Tatsujin - Tobikkiri! Anime Special" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20426: - name: "Madagascar" + name: "Dreamworks Madagascar" region: "NTSC-J" + gsHWFixes: + roundSprite: 2 # Improves bloom alignment and clarity. + halfPixelOffset: 2 # Improves bloom alignment and clarity. SLPS-20428: name: "Monkey Turn V [Bandai the Best]" region: "NTSC-J" @@ -33576,13 +35493,13 @@ SLPS-20450: name: "Taiko no Tatsujin - Wai Wai Happy! Rokudaime [with Tatacon]" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20451: name: "Taiko no Tatsujin - Wai Wai Happy! Rokudaime" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20452: name: "Simple 2000 Series Ultimate Vol. 30 - Kourin! Zokusha Goddo!" @@ -33593,6 +35510,9 @@ SLPS-20453: compat: 5 gameFixes: - XGKickHack # Fixes black and white fighters. + speedHacks: + MTVUSpeedHack: 0 # Fixes game from crashing. + InstantVU1SpeedHack: 0 # Fixes graphical issues. patches: 602B7A48: content: |- @@ -33631,7 +35551,7 @@ SLPS-20463: name: "Ougon Kishi Garo" region: "NTSC-J" SLPS-20464: - name: "Simple 2000 Series Vol. 105 - The Maid Fuku to Kikanjuu" + name: "Simple 2000 Series Vol. 105 - The Maid-Fuku to Kikanjuu" region: "NTSC-J" SLPS-20465: name: "Simple 2000 Series Vol. 100 - The Otoko Tachi no Kijuu Houza" @@ -33688,7 +35608,7 @@ SLPS-20481: name: "Simple 2000 Series Vol. 112 - The Tousou Highway 2 - Road Warrior 2050" region: "NTSC-J" SLPS-20482: - name: "3-D Mahjong + Suzume Paitori" + name: "3D Mahjong + Janpai Tori" region: "NTSC-J" SLPS-20483: name: "Kamen Rider Kabuto" @@ -33700,13 +35620,13 @@ SLPS-20485: name: "Taiko no Tatsujin - Doka! to Oomori Nanadaime [with Tatacon]" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20486: name: "Taiko no Tatsujin - Doka! to Oomori Nanadaime" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-20487: name: "Pachi-Slot King! Kagaku Ninja-Tai Gatchaman" @@ -33768,6 +35688,8 @@ SLPS-25001: compat: 5 roundModes: eeRoundMode: 0 # Fixes FPU errors causing instant death in Limestone Cave. + gsHWFixes: + disablePartialInvalidation: 1 # Fixes raphics issues. SLPS-25002: name: "Dead or Alive 2" region: "NTSC-J" @@ -33835,7 +35757,7 @@ SLPS-25013: speedHacks: MTVUSpeedHack: 0 # Prevents broken textures and graphics. SLPS-25014: - name: "Choro Q - High Grade [Limited Edition]" + name: "Choro Q HG [Jenny Hi-Grade Box]" region: "NTSC-J" patches: 6F9C4D7C: @@ -33847,7 +35769,7 @@ SLPS-25014: // Before removing this patch, check initial loading with unformatted memory card. patch=1,EE,0017B2A8,word,00000000 SLPS-25015: - name: "Choro Q - High Grade" + name: "Choro Q HG" region: "NTSC-J" patches: 6F9C4D7C: @@ -33862,7 +35784,7 @@ SLPS-25016: name: "Neo Atlas 3" region: "NTSC-J" SLPS-25017: - name: "A-Train 2001" + name: "A Ressha de Ikou 2001" region: "NTSC-J" SLPS-25018: name: "Sidewinder Max" @@ -33870,6 +35792,9 @@ SLPS-25018: SLPS-25020: name: "Mobile Suit Gundam" region: "NTSC-J" +SLPS-25021: + name: "Jitsumei Jikkyou Keiba - Dream Classic 2001 Spring" + region: "NTSC-J" SLPS-25022: name: "Cool Boarders - Code Alien" region: "NTSC-J" @@ -33877,13 +35802,13 @@ SLPS-25023: name: "Bouncer, The" region: "NTSC-J" SLPS-25025: - name: "Seven Lance Moromos - Cavalryman Corps" + name: "7 (Seven) - Molmorth no Kiheitai" region: "NTSC-J" compat: 5 gameFixes: - EETimingHack # Correct graphics after changing scene. SLPS-25026: - name: "Dead or Alive 2 - Hardcore" + name: "DOA 2 - Hardcore" region: "NTSC-J" compat: 5 patches: @@ -33896,6 +35821,9 @@ SLPS-25026: patch=1,IOP,001D77E4,word,27C40010 patch=1,IOP,001D77E8,word,0C0032B7 patch=1,IOP,001D77EC,word,00000000 +SLPS-25027: + name: "Golf Paradise DX" + region: "NTSC-J" SLPS-25028: name: "Shutokou Battle 0" region: "NTSC-J" @@ -33920,6 +35848,8 @@ SLPS-25033: vuClampMode: 2 # Fixes water reflection. gameFixes: - EETimingHack # Fixes flickering graphics. + gsHWFixes: + cpuCLUTRender: 1 # Fixes shadows, object and enemy colours, platform transitions. SLPS-25034: name: "Flower, Sun and Rain" region: "NTSC-J" @@ -33990,17 +35920,19 @@ SLPS-25050: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SLPS-25051: name: "Missing Blue" region: "NTSC-J" SLPS-25052: - name: "Ace Combat 4 - Shattered Skies" + name: "Ace Combat 04 - Shattered Skies" region: "NTSC-J" compat: 5 gsHWFixes: mipmap: 1 roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. SLPS-25053: name: "Eikan wa Kimi ni - Koushien no Hasha" region: "NTSC-J" @@ -34013,6 +35945,9 @@ SLPS-25055: SLPS-25057: name: "King's Field IV" region: "NTSC-J" + gsHWFixes: + preloadFrameData: 1 # Fixes invisible lava, there is another issue that needs skipdraw 1 for blurry font but it removes much brightness. + halfPixelOffset: 2 # Fixes font rendering. patches: 04C3765E: content: |- @@ -34032,6 +35967,9 @@ SLPS-25062: SLPS-25064: name: "Sea-Man" region: "NTSC-J" +SLPS-25068: + name: "Jitsumei Jikkyou Keiba - Dream Classic - 2001 Autumn" + region: "NTSC-J" SLPS-25069: name: "FIFA 2002 - Road to World Cup" region: "NTSC-J" @@ -34039,7 +35977,7 @@ SLPS-25070: name: "Tales of the Sunrise Heroes 2" region: "NTSC-J" SLPS-25071: - name: "Visual Mix - Ayumi Hamasaki Dome Tour 2001 [Disc1of2]" + name: "Visual Mix - Ayumi Hamasaki Dome Tour 2001 [Disc 1 of 2]" region: "NTSC-J" memcardFilters: - "SLPS-25071" @@ -34047,7 +35985,7 @@ SLPS-25071: - "SLPM-65086" - "SLPM-65087" SLPS-25072: - name: "Visual Mix - Ayumi Hamasaki Dome Tour 2001 [Disc2of2]" + name: "Visual Mix - Ayumi Hamasaki Dome Tour 2001 [Disc 2 of 2]" region: "NTSC-J" memcardFilters: - "SLPS-25071" @@ -34090,6 +36028,9 @@ SLPS-25080: SLPS-25081: name: "Saishuu Densha" region: "NTSC-J" +SLPS-25083: + name: "Exciting Pro Wres 3 [Genteiban]" + region: "NTSC-J" SLPS-25084: name: "Thunder Strike - Operation Phoenix" region: "NTSC-J" @@ -34106,6 +36047,7 @@ SLPS-25088: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SLPS-25094: name: "Reveal Fantasia" region: "NTSC-J" @@ -34126,12 +36068,14 @@ SLPS-25099: region: "NTSC-J" roundModes: eeRoundMode: 0 # Fixes crash when using the Subaru. + gameFixes: + - XGKickHack # Fixes SPS while ingame. SLPS-25100: name: "Tekken 4" region: "NTSC-J" compat: 5 gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLPS-25102: name: "Project Arms" region: "NTSC-J" @@ -34145,7 +36089,7 @@ SLPS-25105: name: "Kingdom Hearts" region: "NTSC-J" SLPS-25106: - name: "America Oudan Ultra-Quiz" + name: "America Oudan Ultra Quiz" region: "NTSC-J" SLPS-25107: name: "Kengo 2" @@ -34170,6 +36114,8 @@ SLPS-25113: name: "Zettai Zetsumei Toshi" region: "NTSC-J" compat: 5 + gsHWFixes: + autoFlush: 1 # Fixes incorrect blur effect. SLPS-25114: name: "G-Breaker - Daisanshi Cloudia Taisen" region: "NTSC-J" @@ -34180,7 +36126,7 @@ SLPS-25117: name: "Sankyo Fever 6" region: "NTSC-J" SLPS-25118: - name: "FIFA 2002" + name: "2002 FIFA World Cup" region: "NTSC-J" SLPS-25119: name: "Galerians 2" @@ -34191,6 +36137,8 @@ SLPS-25120: SLPS-25121: name: "dot hack - Infection Part 1" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Sharpens world in far distances. memcardFilters: - "SCPS-55029" - "SCPS-55042" @@ -34477,6 +36425,11 @@ SLPS-25202: - "SLPS-73231" - "SLPS-73232" - "SLPS-73233" +SLPS-25203: + name: "007 - Nightfire" + region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Fixes fog lines in the distance. SLPS-25204: name: "MotoGP3" region: "NTSC-J" @@ -34490,6 +36443,8 @@ SLPS-25209: name: "Metal Slug 3" region: "NTSC-J" compat: 5 + gsHWFixes: + gpuPaletteConversion: 2 # Stops excessive VRAM usage with preloading on. SLPS-25212: name: "Giren no Yabou - Zeon Dokuritsu Sensouden" region: "NTSC-J" @@ -34520,10 +36475,10 @@ SLPS-25221: name: "Pia - Welcome to Carrot 3" region: "NTSC-J" SLPS-25223: - name: "Canvas" + name: "Canvas - Sepia-iro no Motif" region: "NTSC-J" SLPS-25224: - name: "Ai Yori Aoshi [Limited Edition]" + name: "Ai yori Aoshi [Shokai Genteiban]" region: "NTSC-J" SLPS-25225: name: "Ai Yori Aoshi" @@ -34559,6 +36514,8 @@ SLPS-25235: name: "Yumeria" region: "NTSC-J" compat: 5 + gsHWFixes: + autoFlush: 1 # Fixes double image. SLPS-25236: name: "Fantastic Fortune 2" region: "NTSC-J" @@ -34597,6 +36554,8 @@ SLPS-25246: region: "NTSC-J" gameFixes: - SoftwareRendererFMVHack # Fixes garbage pixels. + gsHWFixes: + autoFlush: 1 # Fixes lava effect. SLPS-25247: name: "R-Type Final" region: "NTSC-J" @@ -34698,7 +36657,7 @@ SLPS-25278: name: "Memories Off - Mix" region: "NTSC-J" SLPS-25279: - name: "Adventure Boy Club Magazine" + name: "Bouken Shounen Club Gahou" region: "NTSC-J" SLPS-25281: name: "True Love Story 3 [Enterbrain collection]" @@ -34787,6 +36746,7 @@ SLPS-25310: name: "Disney-Pixar's Finding Nemo" region: "NTSC-J" gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. alignSprite: 1 # Fixes vertical lines. SLPS-25311: name: "Spy Fiction" @@ -34810,17 +36770,21 @@ SLPS-25316: region: "NTSC-J" compat: 5 SLPS-25317: - name: "Shadow Hearts 2 [Deluxe Pack] [Disc1of2]" + name: "Shadow Hearts 2 [Deluxe Pack] [Disc 1 of 2]" region: "NTSC-J" gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. SLPS-25318: - name: "Shadow Hearts 2 [Deluxe Pack] [Disc2of2]" + name: "Shadow Hearts 2 [Deluxe Pack] [Disc 2 of 2]" region: "NTSC-J" gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. memcardFilters: - "SLPS-25317" SLPS-25319: @@ -34863,17 +36827,21 @@ SLPS-25333: name: "Gallop Racer Lucky 7" region: "NTSC-J" SLPS-25334: - name: "Shadow Hearts 2 [Disc1of2]" + name: "Shadow Hearts 2 [Disc 1 of 2]" region: "NTSC-J" gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. SLPS-25335: - name: "Shadow Hearts 2 [Disc1of2]" + name: "Shadow Hearts 2 [Disc 2 of 2]" region: "NTSC-J" gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. memcardFilters: - "SLPS-25334" SLPS-25336: @@ -34946,6 +36914,8 @@ SLPS-25352: name: "Espgaluda" region: "NTSC-J" compat: 5 + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLPS-25353: name: "Xenosaga Freaks" region: "NTSC-J" @@ -34959,7 +36929,7 @@ SLPS-25356: name: "Broken Sword - Nenereru Ryuu no Densetsu" region: "NTSC-J" SLPS-25357: - name: "3-Nen B-Gumi Kinpachi Sensei - Densetsu no Kyoudan ni Tate!" + name: "3-nen B-gumi Kinpachi Sensei - Densetsu no Kyoudan ni Tate!" region: "NTSC-J" SLPS-25358: name: "Gold Gasho Bell! - Friendship Tag Battle" @@ -34993,12 +36963,13 @@ SLPS-25365: name: "Missing Blue [Best Price]" region: "NTSC-J" SLPS-25366: - name: "Xenosaga Episode II - Jenseits von Gut und Bose [Premium Box] [Disc1of2]" + name: "Xenosaga Episode II - Jenseits von Gut und Bose [Premium Box] [Disc 1 of 2]" region: "NTSC-J" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: - "SLPS-29001" - "SLPS-29002" @@ -35007,12 +36978,13 @@ SLPS-25366: - "SLPS-25353" - "SLPS-73224" SLPS-25367: - name: "Xenosaga Episode II - Jenseits von Gut und Bose [Premium Box] [Disc2of2]" + name: "Xenosaga Episode II - Jenseits von Gut und Bose [Premium Box] [Disc 2 of 2]" region: "NTSC-J" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: - "SLPS-29001" - "SLPS-29002" @@ -35021,12 +36993,13 @@ SLPS-25367: - "SLPS-25353" - "SLPS-73224" SLPS-25368: - name: "Xenosaga Episode II - Jenseits von Gut und Bose [Disc1of2]" + name: "Xenosaga Episode II - Jenseits von Gut und Bose [Disc 1 of 2]" region: "NTSC-J" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: # Allows import of Xenosaga I, Xenosaga I Reloaded, and Xenosaga Freaks data. - "SLPS-29001" - "SLPS-29002" @@ -35035,12 +37008,13 @@ SLPS-25368: - "SLPS-25353" - "SLPS-73224" SLPS-25369: - name: "Xenosaga Episode II - Jenseits von Gut und Bose [Disc2of2]" + name: "Xenosaga Episode II - Jenseits von Gut und Bose [Disc 2 of 2]" region: "NTSC-J" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: - "SLPS-29001" - "SLPS-29002" @@ -35167,6 +37141,8 @@ SLPS-25405: SLPS-25406: name: "Hitman - Contracts" region: "NTSC-J" + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLPS-25407: name: "King of Fighters 2003, The" region: "NTSC-J" @@ -35197,10 +37173,10 @@ SLPS-25414: name: "To Heart 2" region: "NTSC-J" SLPS-25415: - name: "Chu-Kana Janshi [Collector's Edition]" + name: "Chuuka na Janshi - Tenhoo Painyan [Collector's Edition]" region: "NTSC-J" SLPS-25416: - name: "Chu Kana Janshi Tenho Pai-Nyan" + name: "Chuuka na Janshi - Tenhoo Painyan" region: "NTSC-J" SLPS-25417: name: "Panzer Front Ausf.B [Enterbrain Collection]" @@ -35211,8 +37187,12 @@ SLPS-25418: compat: 5 gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. + texturePreloading: 1 # Performs better than full. + cpuCLUTRender: 1 # Fixes sun occlusion. patches: 86089F31: content: |- @@ -35224,8 +37204,11 @@ SLPS-25418: SLPS-25419: name: "Mobile Suit Gundam - Gundam vs. Z-Gundam" region: "NTSC-J" +SLPS-25420: + name: "Sinbad Adventure wa Enomoto Kanako de Dou desu ka" + region: "NTSC-J" SLPS-25421: - name: "Bokujou Monogatari - Oh! Wonderful Life (First Print Limited Edition)" + name: "Bokujou Monogatari - Oh! Wonderful Life [First Print Limited Edition]" region: "NTSC-J" patches: D2F0DC73: @@ -35236,6 +37219,8 @@ SLPS-25421: SLPS-25422: name: "Death by Degrees - Tekken - Nina Williams" region: "NTSC-J" + gsHWFixes: + alignSprite: 1 # Fixes FMV lines. SLPS-25423: name: "Kaitou Apricot - Complete Edition [Limited Edition]" region: "NTSC-J" @@ -35257,6 +37242,8 @@ SLPS-25427: SLPS-25428: name: "Metal Slug 3 [SNK Best Collection]" region: "NTSC-J" + gsHWFixes: + gpuPaletteConversion: 2 # Stops excessive VRAM usage with preloading on. SLPS-25429: name: "King of Fighters 2000, The [SNK Best Collection]" region: "NTSC-J" @@ -35338,6 +37325,7 @@ SLPS-25456: gsHWFixes: halfPixelOffset: 3 # Fixes bloom misalignment still a bit misaligned. roundSprite: 1 # Fixes bloom misalignment still a bit misaligned. + cpuCLUTRender: 1 # Fixes sun background on the windows when selecting your 'race'. SLPS-25457: name: "Ponkotsu Roeman Daikatsugeki Bumpy Trot" region: "NTSC-J" @@ -35359,6 +37347,14 @@ SLPS-25462: gsHWFixes: preloadFrameData: 1 # Fixes black screen while in a mech. roundSprite: 2 # Fixes HUD artifacts. + memcardFilters: + - SLPS-25338 + - SLPS-25339 + - SLPS-73202 + - SLPS-73203 + - SLPS-25408 + - SLPS-25462 + - SLPS-73247 SLPS-25463: name: "My Home o Tsukurou 2! Takumi" region: "NTSC-J" @@ -35396,13 +37392,13 @@ SLPS-25469: name: "Baseball Live 2005" region: "NTSC-J" SLPS-25470: - name: "Bouken-ou Beat - Dark Next Century" + name: "Bouken-ou Beet - Darkness Century" region: "NTSC-J" SLPS-25471: name: "Gakkou o Tsukurou - Happy Days!!" region: "NTSC-J" SLPS-25472: - name: "XIII (Thirteen) [Best Collection]" + name: "XIII [Best Collection]" region: "NTSC-J" SLPS-25473: name: "One Piece - Grand Battle! Combat Rush" @@ -35518,15 +37514,15 @@ SLPS-25510: clampModes: eeClampMode: 2 # Fixes camera and stops constant coin noises on Pirates Cove. gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLPS-25511: name: "Rasetsu Alternative" region: "NTSC-J" SLPS-25513: - name: "Aoi Umi no Tristia [Limited Edition]" + name: "Aoi Umi no Tristia - Nanoca Flanka Hatsumei Koubouki [Shokai Genteiban]" region: "NTSC-J" SLPS-25514: - name: "Aoi Umi no Tristia" + name: "Aoi Umi no Tristia - Nanoca Flanka Hatsumei Koubouki" region: "NTSC-J" SLPS-25515: name: "Futakoi Alternative [Limited Edition]" @@ -35642,12 +37638,12 @@ SLPS-25549: name: "Gundam Seed Destiny - Generation of C.E." region: "NTSC-J" SLPS-25550: - name: "Cowboy Bebop - Tsuitou no Yakyoku [Limited Edition]" + name: "Cowboy Bebop - Tsuioku no Serenade [Limited Edition]" region: "NTSC-J" clampModes: eeClampMode: 0 # Fixes HUD going black. SLPS-25551: - name: "Cowboy Bebop - Tsuitou no Yakyoku" + name: "Cowboy Bebop - Tsuioku no Serenade" region: "NTSC-J" clampModes: eeClampMode: 0 # Fixes HUD going black. @@ -35671,6 +37667,8 @@ SLPS-25557: - EETimingHack # Mitigates bounciness of vertical shaking but better fix with EE cyclerate +1. gsHWFixes: alignSprite: 1 # Fixes vertical lines. + textureInsideRT: 1 # Fixes corruption. + texturePreloading: 1 # Performs much better with partial preload. SLPS-25558: name: "NeoGeo Battle Coliseum" region: "NTSC-J" @@ -35682,6 +37680,9 @@ SLPS-25559: SLPS-25560: name: "Dragon Ball Z - Sparking!" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 2 # Fixes lines when powering up. + roundSprite: 2 # Fixes misaligned bloom. SLPS-25561: name: "MotoGP 4" region: "NTSC-J" @@ -35740,11 +37741,15 @@ SLPS-25577: gsHWFixes: alignSprite: 1 # Fixes vertical lines. halfPixelOffset: 1 # Fixes blurriness. + texturePreloading: 1 # Improves performance. SLPS-25578: name: "K-1 World Grand Prix 2005" region: "NTSC-J" gameFixes: - XGKickHack # Fixes black and white fighters. + speedHacks: + MTVUSpeedHack: 0 # Fixes game from crashing. + InstantVU1SpeedHack: 0 # Fixes graphical issues. patches: F8664E20: content: |- @@ -35775,6 +37780,7 @@ SLPS-25586: compat: 5 gsHWFixes: halfPixelOffset: 2 # Fixes ghosting. + autoFlush: 1 # Fixes post lighting. SLPS-25587: name: "Sugar Sugar Rune - Koi mo Oshare mo Pick-Up" region: "NTSC-J" @@ -35840,6 +37846,8 @@ SLPS-25606: name: "Zettai Zetsumei Toshi 2 - Itetsuita Kioutachi" region: "NTSC-J" compat: 5 + gsHWFixes: + cpuCLUTRender: 1 # Fixes some shading/shadows. SLPS-25607: name: "Makai Senki Disgaea 2 [Limited Edition]" region: "NTSC-J" @@ -35851,7 +37859,7 @@ SLPS-25609: name: "King of Fighters, The - Maximum Impact 2" region: "NTSC-J" SLPS-25610: - name: "Ryuuko no Ken - Ten-Chi-Jin (Art of Fighting Collection)" + name: "Ryuuko no Ken - Ten-Chi-Jin [Art of Fighting Collection]" region: "NTSC-J" SLPS-25611: name: "Strawberry Panic [Limited Edition]" @@ -35912,6 +37920,7 @@ SLPS-25629: region: "NTSC-J" gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes HUD artifacts. alignSprite: 1 # Fixes vertical lines. mergeSprite: 1 # Better aligns main menu strips, improving font readability. @@ -35962,7 +37971,7 @@ SLPS-25639: name: "Plus Plum 2 Again" region: "NTSC-J" SLPS-25640: - name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc1of2]" + name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc 1 of 2]" region: "NTSC-J" compat: 5 gsHWFixes: @@ -35974,7 +37983,7 @@ SLPS-25640: - "SLPS-25640" - "SLPS-25368" SLPS-25641: - name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc2of2]" + name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc 2 of 2]" region: "NTSC-J" compat: 5 gsHWFixes: @@ -36041,13 +38050,13 @@ SLPS-25651: - "SLPS-25656" - "SLPS-25756" SLPS-25652: - name: "dot hack G.U. Vol. 1 - Saitan (Terminal Disc - The End of the World)" + name: "dot hack G.U. Vol. 1 - Saitan [Terminal Disc - The End of the World]" region: "NTSC-J" SLPS-25653: name: "Cluster Edge [Limited Edition]" region: "NTSC-J" SLPS-25654: - name: "Cluster Edge" + name: "Cluster Edge - Kimi o Matsu Mirai e no Akashi" region: "NTSC-J" SLPS-25655: name: "dot hack G.U. Vol.2 - Kimi Omou Koe" @@ -36094,7 +38103,7 @@ SLPS-25657: region: "NTSC-J" compat: 5 SLPS-25658: - name: "Binchou-Tan - Shiwase Koyomi [Limited Edition]" + name: "Binchou-Tan - Shiwase Goyomi [Shokai Genteiban]" region: "NTSC-J" SLPS-25659: name: "Binchou-Tan - Shiwase Koyomi" @@ -36151,14 +38160,14 @@ SLPS-25674: region: "NTSC-J" compat: 5 SLPS-25675: - name: "Battle Stadium D.O.N." + name: "Battle Stadium D.O.N" region: "NTSC-J" compat: 5 SLPS-25676: name: "Kinnikuman Muscle Grand Prix Max" region: "NTSC-J" SLPS-25677: - name: "Blood+ One Night Kiss" + name: "Blood+ - One Night Kiss" region: "NTSC-J" compat: 5 SLPS-25678: @@ -36201,6 +38210,8 @@ SLPS-25689: SLPS-25690: name: "Dragon Ball Z - Sparking Neo" region: "NTSC-J" + gsHWFixes: + halfPixelOffset: 1 # Fixes extreme ghosting. SLPS-25691: name: "Captain Tsubasa" region: "NTSC-J" @@ -36254,6 +38265,8 @@ SLPS-25710: name: "K-1 World Grand Prix 2006" region: "NTSC-J" compat: 4 + gsHWFixes: + deinterlace: 9 # Game requires AdaptiveBFF deinterlacing when auto. speedHacks: InstantVU1SpeedHack: 0 # Fixes random black frames from happening when in a fight session. MTVUSpeedHack: 0 @@ -36285,6 +38298,8 @@ SLPS-25715: region: "NTSC-J" gameFixes: - FpuMulHack + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLPS-25716: name: "Digimon Savers - Another Mission" region: "NTSC-J" @@ -36299,6 +38314,12 @@ SLPS-25718: eeRoundMode: 1 # Fix camera issue. gameFixes: - FpuNegDivHack # Fix target loss issue. + patches: + F616C207: + content: |- + comment=Swapping COP2 codes around + patch=0,EE,00252824,word,48488000 + patch=0,EE,00252828,word,4B040183 SLPS-25719: name: "Happiness! Deluxe [First Print Limited Edition]" region: "NTSC-J" @@ -36339,7 +38360,7 @@ SLPS-25733: name: "Super Robot Taisen OG - Original Generations" region: "NTSC-J" SLPS-25734: - name: "Battle of Yu Yu Hakushou - Shitou! Ankoku Bujutsukai 120%" + name: "Battle of Yuu Yuu Hakusho, The - Shitou! Ankoku Bujutsukai - 120% Full Power" region: "NTSC-J" SLPS-25735: name: "Dragon Shadow Spell" @@ -36379,10 +38400,10 @@ SLPS-25747: name: "Garouden Break Blow - Fist or Twist" region: "NTSC-J" SLPS-25748: - name: "Aoi Sora no Neosphere - Nanoka Franka no Hatsumei Koubouki 2 [Limited Edition]" + name: "Aoi Sora no Neosphere - Nanoca Flanka Hatsumei Koubouki 2 [Shokai Genteiban]" region: "NTSC-J" SLPS-25749: - name: "Aoi Sora no Neosphere - Nanoka Franka no Hatsumei Koubouki 2" + name: "Aoi Sora no Neosphere - Nanoca Flanka Hatsumei Koubouki 2" region: "NTSC-J" SLPS-25750: name: "Super Robot Taisen - Scramble Commander The 2nd" @@ -36443,7 +38464,7 @@ SLPS-25763: region: "NTSC-J" compat: 5 SLPS-25764: - name: "Busou Renkin" + name: "Busou Renkin - Youkoso Papillon Park e" region: "NTSC-J" SLPS-25765: name: "King of Fighters, The - Maximum Impact Regulation A" @@ -36485,7 +38506,7 @@ SLPS-25777: name: "Sumomomomomo - Chijou Saikyou no Yome [Limited Edition]" region: "NTSC-J" SLPS-25778: - name: "Sumomomomomo - Chijou Saikyou no Yome" + name: "Sumomomo Momomo - Chijou Saikyou no Yome - Keishou Shimasho! Koi no Hanamuko Soudatsu-sen!!" region: "NTSC-J" SLPS-25779: name: "King of Fighters, The - Maximum Impact 2 [SNK Best Collection]" @@ -36549,10 +38570,14 @@ SLPS-25796: SLPS-25797: name: "Ikki Tousen - Shining Dragon [Limited Edition]" region: "NTSC-J" + gsHWFixes: + roundSprite: 1 # Aligns bloom effect. SLPS-25798: name: "Ikki Tousen - Shining Dragon" region: "NTSC-J" compat: 5 + gsHWFixes: + roundSprite: 1 # Aligns bloom effect. SLPS-25799: name: "Ultraman Fighting Evolution 3 [Banpresto Best]" region: "NTSC-J" @@ -36582,7 +38607,7 @@ SLPS-25808: name: "Saint Beast - Rasen no Shou" region: "NTSC-J" SLPS-25809: - name: "Gintama Gin-San to Issho! Boku no Kabuki Machi Nikki" + name: "Gintama - Gin-san to Issho! Boku no Kabuki-chou Nikki" region: "NTSC-J" SLPS-25810: name: "Dear My Sun" @@ -36606,7 +38631,7 @@ SLPS-25816: name: "Yamasa Digi World - Collaboration SP Pachi-Slot Ridge Racer" region: "NTSC-J" SLPS-25817: - name: "Bakumatsu Renka - Karyuu Kenshiden [Limited Edition]" + name: "Bakumatsu Renka - Karyuu Kenshiden [Genteiban]" region: "NTSC-J" SLPS-25818: name: "Bakumatsu Renka - Karyuu Kenshiden" @@ -36650,7 +38675,7 @@ SLPS-25828: name: "Pachitte Chonmage Tatsujin 13 - Pachinko Hissatsu Shigotonin III" region: "NTSC-J" SLPS-25829: - name: "A.C.E. Another Century's Episode 2 [Special Vocal Version]" + name: "Another Century's Episode 2 [Special Vocal Version]" region: "NTSC-J" SLPS-25830: name: "Zero no Tsukaima - Muma ga Tsumugu Yokaze no Gensoukyoku [Limited Edition]" @@ -36678,6 +38703,8 @@ SLPS-25837: region: "NTSC-J" gameFixes: - SoftwareRendererFMVHack # Fixes vertical lines in FMVs. + gsHWFixes: + halfPixelOffset: 1 # Corrects post processing position. SLPS-25838: name: "Taiheiyou no Arashi - Senkan Yamato, Akatsuki ni Shutsugeki su" region: "NTSC-J" @@ -36694,6 +38721,8 @@ SLPS-25841: region: "NTSC-J" gameFixes: - FpuMulHack + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. memcardFilters: # Allows import of non-DC Tales of Destiny data. - "SLPS-25841" - "SLPS-25842" @@ -36704,6 +38733,8 @@ SLPS-25842: compat: 5 gameFixes: - FpuMulHack + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. memcardFilters: - "SLPS-25841" - "SLPS-25842" @@ -36735,6 +38766,8 @@ SLPS-25850: SLPS-25851: name: "Zettai Zetsumei Toshi 2 - Itetsuita Kioku Tachi [Irem Collection]" region: "NTSC-J" + gsHWFixes: + cpuCLUTRender: 1 # Fixes some shading/shadows. SLPS-25852: name: "Sanyo Pachinko Paradise 13 [Irem Collection]" region: "NTSC-J" @@ -36746,6 +38779,8 @@ SLPS-25854: region: "NTSC-J" clampModes: eeClampMode: 0 # In-game background visible. + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness when upscaling. SLPS-25855: name: "Battle of Sunrise" region: "NTSC-J" @@ -36818,6 +38853,8 @@ SLPS-25881: SLPS-25882: name: "Ikki Tousen - Shining Dragon [Best Collection]" region: "NTSC-J" + gsHWFixes: + roundSprite: 1 # Aligns bloom effect. SLPS-25883: name: "Katekyoo Hitman Reborn! Nerae! Ring x Vongola Trainers" region: "NTSC-J" @@ -36838,6 +38875,7 @@ SLPS-25887: SLPS-25888: name: "Star Wars - The Force Unleashed" region: "NTSC-J" + compat: 5 patches: CC9BFDE3: content: |- @@ -36846,6 +38884,8 @@ SLPS-25888: // Patch replace values passed to FPU to workaround x86 rounding issues. patch=1,EE,0017d454,word,3464fff0 patch=1,EE,0017d460,word,3463fffc + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLPS-25889: name: "Guitar Hero - Aerosmith" region: "NTSC-J" @@ -36876,6 +38916,9 @@ SLPS-25899: region: "NTSC-J" gsHWFixes: roundSprite: 2 # Reduces font artifacts but characters still have major artifacts. +SLPS-25902: + name: "Junjou Romantica - Koi no Doki Doki Daisakusen" + region: "NTSC-J" SLPS-25905: name: "Dragon Ball Z - Infinite World" region: "NTSC-J" @@ -36883,6 +38926,9 @@ SLPS-25906: name: "ADK Tamashii" region: "NTSC-J" compat: 5 +SLPS-25909: + name: "Hisshou Pachinko Pachi-Slot Kouryaku Series Vol. 13 - Shin Seiki Evangelion - Yakusoku no Toki" + region: "NTSC-J" SLPS-25912: name: "Soul Eater - Battle Resonance" region: "NTSC-J" @@ -36908,6 +38954,9 @@ SLPS-25918: region: "NTSC-J" gsHWFixes: roundSprite: 1 # Fixes character sprites. +SLPS-25919: + name: "Sengoku Tenka Touitsu" + region: "NTSC-J" SLPS-25927: name: "Tomb Raider - Underworld" region: "NTSC-J" @@ -36928,7 +38977,13 @@ SLPS-25934: name: "Samurai Spirits - Rokuban Shoubu [NeoGeo Online Collection the Best]" region: "NTSC-J" SLPS-25935: - name: "King of Fighters '98 Ultimate Match, The (NeoGeo Online Collection the Best)" + name: "King of Fighters '98 Ultimate Match, The [NeoGeo Online Collection the Best]" + region: "NTSC-J" +SLPS-25939: + name: "Himehibi - New Princess Days!! Zoku! Nigakki" + region: "NTSC-J" +SLPS-25943: + name: "Hisshou Pachinko Pachi-Slot Kouryaku Series Vol. 14 - CR Shin Seiki Evangelion - Saigo no Shisha [Gentei Special Box]" region: "NTSC-J" SLPS-25944: name: "Kamen Rider Climax Heroes" @@ -36963,6 +39018,9 @@ SLPS-25961: eeRoundMode: 1 # Fixes camera issue. gameFixes: - FpuNegDivHack # Fixes target loss issue. +SLPS-25978: + name: "Shin Master of Monsters Final EX" + region: "NTSC-J" SLPS-25983: name: "King of Fighters 2002, The - Unlimited Match" region: "NTSC-J" @@ -37053,6 +39111,7 @@ SLPS-72501: eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SLPS-72502: name: "Tales of Destiny 2 [Mega Hits]" region: "NTSC-J" @@ -37079,7 +39138,7 @@ SLPS-73104: name: "Tekken Tag Tournament [PlayStation 2 The Best]" region: "NTSC-J" gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLPS-73105: name: "Kinnikuman Generations [PlayStation 2 The Best]" region: "NTSC-J" @@ -37090,7 +39149,7 @@ SLPS-73107: name: "Taiko no Tatsujin - Go! Go! Godaime [PlayStation 2 The Best]" region: "NTSC-J" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLPS-73108: name: "Phantom Brave [PlayStation 2 The Best]" @@ -37102,13 +39161,9 @@ SLPS-73109: SLPS-73110: name: "Taiko no Tatsujin - Appare Sandaime [PlayStation 2 The Best]" region: "NTSC-J" - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SLPS-73111: name: "Taiko no Tatsujin - Waku Waku Anime Matsuri [PlayStation 2 The Best]" region: "NTSC-J" - gameFixes: - - SoftwareRendererFMVHack # Fixes errors on right side of screen in FMV. SLPS-73201: name: "Fatal Frame II - Crimson Butterfly [PlayStation 2 The Best]" region: "NTSC-J" @@ -37133,15 +39188,18 @@ SLPS-73203: - "SLPS-73202" - "SLPS-73203" SLPS-73204: - name: "Zettai Zetsumi Toshi [PlayStation 2 The Best]" + name: "Zettai Zetsumei Toshi [PlayStation 2 The Best]" region: "NTSC-J" + gsHWFixes: + autoFlush: 1 # Fixes incorrect blur effect. SLPS-73205: - name: "Ace Combat 4 - Shattered Skies [PlayStation 2 The Best]" + name: "Ace Combat 04 - Shattered Skies [PlayStation 2 The Best]" region: "NTSC-J" gsHWFixes: mipmap: 1 roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. SLPS-73206: name: "Super Robot Taisen Alpha 2nd [PlayStation 2 The Best]" region: "NTSC-J" @@ -37157,7 +39215,7 @@ SLPS-73209: name: "Tekken 4 [PlayStation 2 The Best]" region: "NTSC-J" gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLPS-73210: name: "Katamari Damacy [PlayStation 2 The Best]" region: "NTSC-J" @@ -37174,17 +39232,21 @@ SLPS-73212: name: "Naruto Narutimett Hero [PlayStation 2 The Best]" region: "NTSC-J" SLPS-73214: - name: "Shadow Hearts 2 [Director's Cut] [PlayStation 2 The Best] [Disc1of2]" + name: "Shadow Hearts 2 [Director's Cut] [PlayStation 2 The Best] [Disc 1 of 2]" region: "NTSC-J" gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. SLPS-73215: - name: "Shadow Hearts 2 [Director's Cut] [PlayStation 2 The Best] [Disc2of2]" + name: "Shadow Hearts 2 [Director's Cut] [PlayStation 2 The Best] [Disc 2 of 2]" region: "NTSC-J" gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. memcardFilters: - "SLPS-73214" SLPS-73216: @@ -37200,8 +39262,12 @@ SLPS-73218: region: "NTSC-J" gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. + texturePreloading: 1 # Performs better than full. + cpuCLUTRender: 1 # Fixes sun occlusion. SLPS-73219: name: "Tales of Destiny 2 [PlayStation 2 The Best]" region: "NTSC-J" @@ -37222,14 +39288,15 @@ SLPS-73223: clampModes: eeClampMode: 2 # Fixes camera and stops constant coin noises on Pirates Cove. gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLPS-73224: - name: "Xenosaga Episode II - Jenseits von Gut und Bose [PlayStation 2 The Best] [Disc1of2]" + name: "Xenosaga Episode II - Jenseits von Gut und Bose [PlayStation 2 The Best] [Disc 1 of 2]" region: "NTSC-J" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: - "SLPS-29001" - "SLPS-29002" @@ -37238,12 +39305,13 @@ SLPS-73224: - "SLPS-25353" - "SLPS-73224" SLPS-73225: - name: "Xenosaga Episode II - Jenseits von Gut und Bose [PlayStation 2 The Best] [Disc2of2]" + name: "Xenosaga Episode II - Jenseits von Gut und Bose [PlayStation 2 The Best] [Disc 2 of 2]" region: "NTSC-J" gsHWFixes: autoFlush: 1 # Fixes shadows in cutscenes. halfPixelOffset: 2 # Fixes lighting misalignment and shadows. roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: - "SLPS-29001" - "SLPS-29002" @@ -37395,6 +39463,14 @@ SLPS-73247: gsHWFixes: preloadFrameData: 1 # Fixes black screen while in a mech. roundSprite: 2 # Fixes HUD artifacts. + memcardFilters: + - SLPS-25338 + - SLPS-25339 + - SLPS-73202 + - SLPS-73203 + - SLPS-25408 + - SLPS-25462 + - SLPS-73247 SLPS-73248: name: "Kagero 2 - Dark Illusion [PlayStation 2 The Best]" region: "NTSC-J" @@ -37408,6 +39484,7 @@ SLPS-73250: region: "NTSC-J" gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes HUD artifacts. alignSprite: 1 # Fixes vertical lines. mergeSprite: 1 # Better aligns main menu strips, improving font readability. @@ -37434,6 +39511,7 @@ SLPS-73252: region: "NTSC-J" gsHWFixes: halfPixelOffset: 2 # Fixes ghosting. + autoFlush: 1 # Fixes post lighting. SLPS-73253: name: "Rurouni Kenshin - Enjou! Kyoto Rinne [PlayStation 2 The Best]" region: "NTSC-J" @@ -37491,6 +39569,8 @@ SLPS-73404: vuClampMode: 2 # Fixes water reflection. gameFixes: - EETimingHack # Fixes flickering graphics. + gsHWFixes: + cpuCLUTRender: 1 # Fixes shadows, object and enemy colours, platform transitions. SLPS-73405: name: "Zero [PlayStation 2 The Best]" region: "NTSC-J" @@ -37498,19 +39578,23 @@ SLPS-73405: halfPixelOffset: 2 # Reduces blurriness. disablePartialInvalidation: 1 # Fixes ghost rendering. SLPS-73406: - name: "Dead or Alive 2 - Hardcore [PlayStation 2 The Best]" + name: "DOA 2 - Hardcore [PlayStation 2 The Best]" region: "NTSC-J" compat: 5 SLPS-73407: name: "Sidewinder MAX [PlayStation 2 The Best]" region: "NTSC-J" +SLPS-73408: + name: "7 (Seven) - Molmorth no Kiheitai [PlayStation 2 the Best]" + region: "NTSC-J" SLPS-73410: - name: "Ace Combat 4 [PlayStation 2 The Best]" + name: "Ace Combat 04 - Shattered Skies [PlayStation 2 The Best]" region: "NTSC-J" gsHWFixes: mipmap: 1 roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. SLPS-73411: name: "Armored Core 2 - Another Age [PlayStation 2 The Best]" region: "NTSC-J" @@ -37606,7 +39690,7 @@ SLUS-20001: region: "NTSC-U" compat: 5 gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLUS-20002: name: "Ridge Racer V" region: "NTSC-U" @@ -37616,6 +39700,10 @@ SLUS-20002: gsHWFixes: cpuFramebufferConversion: 1 textureInsideRT: 1 + halfPixelOffset: 2 # Fixes title screen and some intro post processing alignment. + roundSprite: 1 # Fixes ui and hud alignment. + gpuPaletteConversion: 2 # Lots of CLUTs in large textures. + cpuCLUTRender: 1 # Fixes car textures. SLUS-20003: name: "Portal Runner" region: "NTSC-U" @@ -37665,6 +39753,8 @@ SLUS-20015: compat: 5 roundModes: eeRoundMode: 0 # Fixes FPU errors causing instant death in Limestone Cave. + gsHWFixes: + disablePartialInvalidation: 1 # Fixes graphics issues. SLUS-20016: name: "Evergrace" region: "NTSC-U" @@ -37677,6 +39767,8 @@ SLUS-20018: name: "Onimusha - Warlords" region: "NTSC-U" compat: 5 + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLUS-20021: name: "Kengo - Master of Bushido" region: "NTSC-U" @@ -37685,10 +39777,15 @@ SLUS-20024: name: "Legacy of Kain - Blood Omen 2" region: "NTSC-U" compat: 5 + gsHWFixes: + mipmap: 1 # Fixes glitching textures. SLUS-20028: name: "No One Lives Forever" region: "NTSC-U" compat: 5 + gsHWFixes: + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending and also needs Full Blending to fix the lighting. SLUS-20029: name: "Top Gear Daredevil" region: "NTSC-U" @@ -37744,7 +39841,7 @@ SLUS-20043: region: "NTSC-U" compat: 5 SLUS-20044: - name: "Star Wars - StarFighter" + name: "Star Wars - Starfighter" region: "NTSC-U" compat: 5 SLUS-20045: @@ -37822,7 +39919,7 @@ SLUS-20070: name: "Q-Ball Billiards Master" region: "NTSC-U" SLUS-20071: - name: "Dead or Alive 2" + name: "DOA 2 - Hardcore" region: "NTSC-U" compat: 5 patches: @@ -37861,6 +39958,27 @@ SLUS-20077: name: "Donald Duck Goin' Quackers" region: "NTSC-U" compat: 5 + patches: + C573F3A2: + content: |- + author=refraction + comment=fixes lighting problems due to COP2 instruction order. + patch=1,EE,0032F5A4,word,4BE09DDC + patch=1,EE,0032F5A8,word,4A0303BD + patch=1,EE,0032F5C0,word,4B000120 + patch=1,EE,0032F5C4,word,4A0903BD + patch=1,EE,0032F5DC,word,4B0002A0 + patch=1,EE,0032F5E0,word,4A6403BC + patch=1,EE,0032F5F8,word,4BE0095C + patch=1,EE,0032F5FC,word,4A6A03BC + patch=1,EE,0032F614,word,4BE03ADC + patch=1,EE,0032F618,word,4A0F03BD + patch=1,EE,0032F630,word,4B000420 + patch=1,EE,0032F634,word,4A1503BD + patch=1,EE,0032F64C,word,4B0005A0 + patch=1,EE,0032F650,word,4A7003BC + patch=1,EE,0032F668,word,4BE06C5C + patch=1,EE,0032F66C,word,4A7603BC SLUS-20078: name: "Silent Scope" region: "NTSC-U" @@ -37900,7 +40018,7 @@ SLUS-20090: region: "NTSC-U" compat: 5 SLUS-20091: - name: "4x4 Evolution" + name: "4x4 Evo" region: "NTSC-U" compat: 5 SLUS-20092: @@ -37972,6 +40090,10 @@ SLUS-20111: name: "Deus Ex - The Conspiracy" region: "NTSC-U" compat: 5 + gsHWFixes: + roundSprite: 1 # Fixes lines in HUD and text boxes. + texturePreloading: 1 # Performs much better with partial. + preloadFrameData: 1 # Fixes loading screen images being cut off two thirds. SLUS-20112: name: "Star Trek - Shattered Universe" region: "NTSC-U" @@ -37982,6 +40104,7 @@ SLUS-20113: compat: 4 gsHWFixes: textureInsideRT: 1 + roundSprite: 1 # Fixes font misalignment when upscaling. SLUS-20114: name: "Simpsons, The - Skateboarding" region: "NTSC-U" @@ -38051,6 +40174,8 @@ SLUS-20144: compat: 5 gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. SLUS-20145: name: "Ring of Red" region: "NTSC-U" @@ -38067,6 +40192,8 @@ SLUS-20148: name: "Zone of the Enders" region: "NTSC-U" compat: 5 + gsHWFixes: + gpuPaletteConversion: 2 # Improves FPS and reduces HC size. SLUS-20149: name: "Tribes - Aerial Assault" region: "NTSC-U" @@ -38089,14 +40216,17 @@ SLUS-20151: vuClampMode: 2 # Fixes water reflection. gameFixes: - EETimingHack # Fixes flickering graphics. + gsHWFixes: + cpuCLUTRender: 1 # Fixes shadows, object and enemy colours, platform transitions. SLUS-20152: - name: "Ace Combat 4 - Shattered Skies" + name: "Ace Combat 04 - Shattered Skies" region: "NTSC-U" compat: 5 gsHWFixes: mipmap: 1 roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. patches: A32F7CD0: content: |- @@ -38116,9 +40246,6 @@ SLUS-20153: SLUS-20154: name: "NFL Quarterback Club 2002" region: "NTSC-U" -SLUS-20157: - name: "Haven - Call of the King" - region: "NTSC-U" SLUS-20158: name: "Heroes of Might and Magic" region: "NTSC-U" @@ -38240,6 +40367,8 @@ SLUS-20191: name: "Defender" region: "NTSC-U" compat: 5 + gameFixes: + - InstantDMAHack # Fixes bad UI positioning. SLUS-20194: name: "Grandia II" region: "NTSC-U" @@ -38386,6 +40515,8 @@ SLUS-20222: name: "MTV - Music Generator 2" region: "NTSC-U" compat: 5 + gsHWFixes: + roundSprite: 1 # Fixes font artifacts. SLUS-20223: name: "Splashdown" region: "NTSC-U" @@ -38558,8 +40689,10 @@ SLUS-20263: SLUS-20264: name: "F1 2001" region: "NTSC-U" + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLUS-20265: - name: "James Bond 007 - Agent Under Fire" + name: "007 - Agent Under Fire" region: "NTSC-U" compat: 5 clampModes: @@ -38572,6 +40705,8 @@ SLUS-20267: name: "dot hack - Infection Part 1" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Sharpens world in far distances. memcardFilters: - "SLUS-20267" - "SLUS-20562" @@ -38657,7 +40792,7 @@ SLUS-20284: roundModes: vuRoundMode: 1 # Fixes some bad effects. patches: - 9d1ba44d: + 9D1BA44D: content: |- author=Prafull // Fix hanging problem & SPS. @@ -38700,6 +40835,12 @@ SLUS-20294: roundModes: eeRoundMode: 1 vuRoundMode: 3 + patches: + default: + content: |- + author=boringhexi + // fix stage 4 flashing triangles + patch=0,EE,00102db0,word,00000000 SLUS-20296: name: "Kao the Kangaroo - Round 2" region: "NTSC-U" @@ -38760,9 +40901,10 @@ SLUS-20312: region: "NTSC-U" compat: 5 roundModes: - eeRoundMode: 1 # Fix reverse control and boss in some places. + eeRoundMode: 1 # Fixes reverse control and boss in some places. gsHWFixes: roundSprite: 2 # Fixes font artifacts. + textureInsideRT: 1 # Fixes wrong visuals for the summon Anima and The (Triple) Magus Sisters. SLUS-20313: name: "Wave Rally" region: "NTSC-U" @@ -38792,6 +40934,7 @@ SLUS-20318: compat: 5 gsHWFixes: preloadFrameData: 1 # Fixes invisible lava, there is another issue that needs skipdraw 1 for blurry font but it removes much brightness. + halfPixelOffset: 2 # Fixes font rendering. patches: 36E02E91: content: |- @@ -38840,7 +40983,7 @@ SLUS-20328: region: "NTSC-U" compat: 5 gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLUS-20329: name: "Pro Race Driver" region: "NTSC-U" @@ -38852,6 +40995,8 @@ SLUS-20331: name: "Minority Report - Everybody Runs" region: "NTSC-U" compat: 5 + gsHWFixes: + cpuCLUTRender: 1 # Fixes light bleed through objects. SLUS-20332: name: "NCAA March Madness 2002" region: "NTSC-U" @@ -38939,6 +41084,7 @@ SLUS-20353: region: "NTSC-U" gsHWFixes: preloadFrameData: 1 # Fixes invisible lava, there is another issue that needs skipdraw 1 for blurry font but it removes much brightness. + halfPixelOffset: 2 # Fixes font rendering. SLUS-20354: name: "Red Card Soccer 2003" region: "NTSC-U" @@ -38974,6 +41120,7 @@ SLUS-20362: vuClampMode: 2 # White textures. gsHWFixes: halfPixelOffset: 1 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes "Busted" scenes. SLUS-20363: name: "Sled Storm" region: "NTSC-U" @@ -39040,7 +41187,7 @@ SLUS-20378: name: "Salt Lake 2002" region: "NTSC-U" patches: - 466d1c13: + 466D1C13: content: |- author=Prafull // Fix ingame texture problems. @@ -39056,7 +41203,9 @@ SLUS-20380: name: "Jurassic Park - Operation Genesis" region: "NTSC-U" gsHWFixes: - mipmap: 1 + autoFlush: 1 # Fixes glows. + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. + textureInsideRT: 1 # Fixes rainbow lighting for some areas. SLUS-20381: name: "MX SuperFly" region: "NTSC-U" @@ -39163,7 +41312,7 @@ SLUS-20403: region: "NTSC-U" compat: 5 SLUS-20404: - name: "FIFA World Cup 2002" + name: "2002 FIFA World Cup" region: "NTSC-U" SLUS-20405: name: "Downforce" @@ -39193,6 +41342,8 @@ SLUS-20412: name: "Hot Wheels - Velocity X" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes the fog line. patches: E7273BFA: content: |- @@ -39228,8 +41379,6 @@ SLUS-20417: name: "Grandia Xtreme" region: "NTSC-U" compat: 5 - gameFixes: - - SoftwareRendererFMVHack # Flickering in FMV. SLUS-20418: name: "Wakeboarding Unleashed featuring Shaun Murray" region: "NTSC-U" @@ -39289,7 +41438,7 @@ SLUS-20430: region: "NTSC-U" compat: 5 patches: - d195b670: + D195B670: content: |- author=PSI // The game allocates a VIF DMA buffer on the stack and sends it, returns from the function, then calls another function to wait for the transfer to end. @@ -39353,7 +41502,9 @@ SLUS-20440: gameFixes: - EETimingHack # Fixes smoke effects. gsHWFixes: - halfPixelOffset: 1 # Fixes fog misalignment. + halfPixelOffset: 2 # Fixes fog misalignment and depth line. + autoFlush: 1 # Fixes sun going through objects. + preloadFrameData: 1 # Fixes missing sun and sky. SLUS-20441: name: "NASCAR - Dirt to Daytona" region: "NTSC-U" @@ -39388,7 +41539,7 @@ SLUS-20452: region: "NTSC-U" compat: 5 patches: - Ba056DDD: + BA056DDD: content: |- author=kr_ps2 //SFX/Background Music Fix. @@ -39406,6 +41557,8 @@ SLUS-20454: SLUS-20455: name: "F1 2002" region: "NTSC-U" + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLUS-20456: name: "Soccer Mania" region: "NTSC-U" @@ -39460,7 +41613,7 @@ SLUS-20467: region: "NTSC-U" compat: 5 patches: - 3baebcc3: + 3BAEBCC3: content: |- author=Prafull // Fix ingame SPS by interchanging vclipw.xyz vf5, vf5w with cfc2. @@ -39468,6 +41621,8 @@ SLUS-20467: patch=1,EE,001d90e4,word,4bc529ff gameFixes: - SoftwareRendererFMVHack # Fixes garbage pixels. + gsHWFixes: + autoFlush: 1 # Fixes lava effect. SLUS-20468: name: "Dynasty Tactics" region: "NTSC-U" @@ -39517,6 +41672,8 @@ SLUS-20474: SLUS-20475: name: "Dual Hearts" region: "NTSC-U" + gsHWFixes: + deinterlace: 6 # Game requires blend tff deinterlacing when auto. compat: 5 SLUS-20476: name: "NBA 2K3 - Sega Sports" @@ -39534,6 +41691,9 @@ SLUS-20480: compat: 5 gameFixes: - XGKickHack # Fixes black models on certain games in World Tour. + gsHWFixes: + mipmap: 2 # Mipmap + trilinear, improves ground textures to match sw renderer. + trilinearFiltering: 1 SLUS-20482: name: "Sphinx and the Cursed Mummy" region: "NTSC-U" @@ -39543,7 +41703,7 @@ SLUS-20483: region: "NTSC-U" compat: 5 SLUS-20484: - name: "Devil May Cry 2 [Disc1of2]" + name: "Devil May Cry 2 [Disc 1 of 2]" region: "NTSC-U" compat: 5 patches: @@ -39566,7 +41726,7 @@ SLUS-20487: clampModes: eeClampMode: 3 # For camera issues in some scenes. SLUS-20488: - name: "Star Ocean 3 - Till the End of Time [Disc1of2]" + name: "Star Ocean 3 - Till the End of Time [Disc 1 of 2]" region: "NTSC-U" compat: 5 gameFixes: @@ -39610,6 +41770,8 @@ SLUS-20496: name: "V-Rally 3" region: "NTSC-U" compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes fog and make lights on cars work again. SLUS-20497: name: "Burnout 2 - Point of Impact" region: "NTSC-U" @@ -39699,6 +41861,9 @@ SLUS-20517: name: "Haven - Call of the King" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLUS-20519: name: "Tak and The Power of Juju" region: "NTSC-U" @@ -39803,6 +41968,8 @@ SLUS-20543: name: "Document of Metal Gear Solid 2, The" region: "NTSC-U" compat: 5 + gameFixes: + - EETimingHack # Fixes corrupted or missing menu fonts. SLUS-20544: name: "Malice" region: "NTSC-U" @@ -39817,11 +41984,14 @@ SLUS-20546: patches: D3F68D3F: content: |- - author=kozarovv - // Skip PSS movies, workaround for EE Cache requirement. - patch=1,EE,00122d00,word,100000d9 + author=Goatman13 + // Fix issues caused by PSS video playback. + // Extend stack to avoid sending bad data to VIF1. + // Required due to lack of data cache emulation. + patch=1,EE,00122780,word,27BDFD00 + patch=1,EE,00122AE8,word,27BD0300 SLUS-20547: - name: "Cubix Showdown" + name: "Cubix Robots for Everyone - Showdown" region: "NTSC-U" compat: 5 SLUS-20548: @@ -39850,6 +42020,7 @@ SLUS-20554: gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. roundSprite: 2 # Fixes font artifacts. SLUS-20555: name: "Reel Fishing 3" @@ -39861,6 +42032,8 @@ SLUS-20556: SLUS-20558: name: "Ferrari F355 Challenge" region: "NTSC-U" + gsHWFixes: + roundSprite: 1 # Fixes text alignment. SLUS-20559: name: "Rocky" region: "NTSC-U" @@ -39888,6 +42061,8 @@ SLUS-20561: name: "Disaster Report" region: "NTSC-U" compat: 5 + gsHWFixes: + autoFlush: 1 # Fixes incorrect blur effect. SLUS-20562: name: "dot hack - Mutation Part 2" region: "NTSC-U" @@ -39941,9 +42116,11 @@ SLUS-20570: region: "NTSC-U" compat: 5 SLUS-20571: - name: "Ty the Tasmanian Tiger" + name: "TY the Tasmanian Tiger" region: "NTSC-U" compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLUS-20572: name: "Tiger Woods PGA Tour 2003" region: "NTSC-U" @@ -39964,7 +42141,7 @@ SLUS-20575: region: "NTSC-U" compat: 5 SLUS-20576: - name: "Harry Potter and The Chamber of Secrets" + name: "Harry Potter and the Chamber of Secrets" region: "NTSC-U" compat: 2 gameFixes: @@ -39983,11 +42160,13 @@ SLUS-20578: clampModes: vuClampMode: 3 # Fix white shiny weapons. SLUS-20579: - name: "James Bond 007 - Nightfire" + name: "007 - Nightfire" region: "NTSC-U" compat: 5 clampModes: vuClampMode: 2 # Fixes polygon clipping in driving missions. + gsHWFixes: + halfPixelOffset: 2 # Fixes fog lines in the distance. SLUS-20580: name: "FIFA Soccer 2003" region: "NTSC-U" @@ -40026,6 +42205,8 @@ SLUS-20587: - BlitInternalFPSHack # Fixes internal FPS detection. gsHWFixes: autoFlush: 1 + halfPixelOffset: 2 # Fixes misaligned lighting. + cpuCLUTRender: 1 # Fixes janky coloured cars. SLUS-20588: name: "Activision Anthology" region: "NTSC-U" @@ -40052,6 +42233,8 @@ SLUS-20595: name: "Area 51" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes misaligned lighting and other effects. SLUS-20596: name: "UFC - Ultimate Fighting Championship - Sudden Impact" region: "NTSC-U" @@ -40181,6 +42364,8 @@ SLUS-20624: compat: 5 gameFixes: - FpuNegDivHack # Lens flare appears even when behind objects. + gsHWFixes: + autoFlush: 1 # Fixes missing lens flare. SLUS-20625: name: "MotoGP 3" region: "NTSC-U" @@ -40188,7 +42373,7 @@ SLUS-20626: name: "Deer Hunter" region: "NTSC-U" SLUS-20627: - name: "Devil May Cry 2 [Disc2of2]" + name: "Devil May Cry 2 [Disc 2 of 2]" region: "NTSC-U" compat: 5 memcardFilters: @@ -40197,6 +42382,7 @@ SLUS-20628: name: "Disney's Finding Nemo" region: "NTSC-U" gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. alignSprite: 1 # Fixes vertical lines. SLUS-20630: name: "Grand Prix Challenge" @@ -40223,6 +42409,8 @@ SLUS-20635: name: "Muppets Party Cruise, Jim Henson's" region: "NTSC-U" compat: 5 + speedHacks: + mvuFlagSpeedHack: 0 # Fixes bad graphics. gameFixes: - OPHFlagHack # Fixes some hanging throughout the game. SLUS-20636: @@ -40230,7 +42418,7 @@ SLUS-20636: region: "NTSC-U" compat: 5 SLUS-20637: - name: "Chessmaster (Online)" + name: "Chessmaster" region: "NTSC-U" compat: 5 SLUS-20638: @@ -40409,6 +42597,8 @@ SLUS-20673: name: "Alias" region: "NTSC-U" compat: 5 + gsHWFixes: + cpuCLUTRender: 1 # Fixes lights penetrating objects. SLUS-20674: name: "Cyber Troopers - Virtual-On Marz" region: "NTSC-U" @@ -40435,7 +42625,7 @@ SLUS-20678: region: "NTSC-U" compat: 5 SLUS-20680: - name: "SpongeBob SquarePants - The Battle for Bikini Bottoms" + name: "SpongeBob SquarePants - Battle for Bikini Bottom" region: "NTSC-U" compat: 5 SLUS-20681: @@ -40461,7 +42651,8 @@ SLUS-20685: region: "NTSC-U" compat: 5 gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes miptrick texture effects. + trilinearFiltering: 1 # Fixes miptrick blending. SLUS-20686: name: "Splashdown - Rides Gone Wild" region: "NTSC-U" @@ -40479,6 +42670,8 @@ SLUS-20688: SLUS-20689: name: "Conflict - Desert Storm 2 - Back to Baghdad" region: "NTSC-U" + gameFixes: + - SoftwareRendererFMVHack # Fixes seizure inducing FMVs. SLUS-20690: name: "G1 Jockey 3" region: "NTSC-U" @@ -40489,6 +42682,8 @@ SLUS-20691: SLUS-20693: name: "F1 Career Challenge" region: "NTSC-U" + gsHWFixes: + halfPixelOffset: 1 # Fixes black void when upscaling. SLUS-20694: name: "Onimusha 3 - Demon Siege" region: "NTSC-U" @@ -40513,10 +42708,12 @@ SLUS-20695: alignSprite: 1 # Fixes green vertical lines. roundSprite: 2 # Fixes vertical lines and some font artifacts but not completely fixed. SLUS-20696: - name: "Jimmy Neutron - Boy Genius - Jet Fusion" + name: "Adventures of Jimmy Neutron, The - Boy Genius - Jet Fusion" region: "NTSC-U" + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLUS-20697: - name: "Cy Girls [Disc1of2]" + name: "Cy Girls [Disc 1 of 2]" region: "NTSC-U" compat: 5 SLUS-20698: @@ -40526,7 +42723,7 @@ SLUS-20698: clampModes: eeClampMode: 2 # Needed for SPS on some characters. SLUS-20699: - name: "Cowboy Bebop" + name: "Cowboy Bebop - Tsuioku no Serenade" region: "NTSC-U" SLUS-20701: name: "Scooby-Doo! Mystery Mayhem" @@ -40617,6 +42814,8 @@ SLUS-20722: name: "Maximo vs. Army of Zin" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes outlines around environmental objects. SLUS-20723: name: "Robin Hood - Defender of the Crown" region: "NTSC-U" @@ -40672,6 +42871,8 @@ SLUS-20732: compat: 5 clampModes: eeClampMode: 3 # Characters are visible in-game. + gsHWFixes: + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLUS-20733: name: "Castlevania - Lament of Innocence" region: "NTSC-U" @@ -40717,7 +42918,6 @@ SLUS-20743: compat: 5 gsHWFixes: autoFlush: 1 # Reduces post-processing misalignment. - roundSprite: 2 # Reduces post-processing misalignment. SLUS-20744: name: "EverQuest - Online Adventures - Frontiers" region: "NTSC-U" @@ -40726,6 +42926,8 @@ SLUS-20745: name: "Shrek 2" region: "NTSC-U" compat: 5 + gsHWFixes: + mipmap: 1 # Partially fixes the sun effects, but the game suffers from depth/blending issues. SLUS-20746: name: "Rogue Ops" region: "NTSC-U" @@ -40734,6 +42936,9 @@ SLUS-20748: name: "Super Trucks Racing" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Gets rid of fog line. + roundSprite: 1 # Fixes lines in FMVs. SLUS-20749: name: "Rugby 2004" region: "NTSC-U" @@ -40747,7 +42952,7 @@ SLUS-20750: - "PSCD10088" # Enables EA Sports BIO. - "SLUS-20750" SLUS-20751: - name: "James Bond 007 - Everything or Nothing" + name: "007 - Everything or Nothing" region: "NTSC-U" compat: 5 SLUS-20752: @@ -40792,7 +42997,7 @@ SLUS-20757: - "PSCD10088" # Enables EA Sports BIO. - "SLUS-20757" SLUS-20758: - name: "Growlanser Generations [Disc1of2] - Growlanser II - The Sense of Justice" + name: "Growlanser Generations [Disc 1 of 2] - Growlanser II - The Sense of Justice" region: "NTSC-U" compat: 5 patches: @@ -40806,7 +43011,7 @@ SLUS-20758: comment=IPU freeze fix patch=0,EE,00109d04,word,00000000 SLUS-20759: - name: "Growlanser Generations [Disc2of2] - Growlanser III - The Dual Darkness" + name: "Growlanser Generations [Disc 2 of 2] - Growlanser III - The Dual Darkness" region: "NTSC-U" compat: 5 patches: @@ -40842,6 +43047,7 @@ SLUS-20763: textureInsideRT: 1 # Fixes the shape of shadows. autoFlush: 1 # Fixes water rendering. halfPixelOffset: 3 # Fixes bloom misalignment, needs this harsh offset for autoflush. + cpuFramebufferConversion: 1 # Fixes shield rendering. SLUS-20764: name: "Bombastic" region: "NTSC-U" @@ -40903,6 +43109,9 @@ SLUS-20776: compat: 5 gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. + autoFlush: 1 # Fixes the position of the shadow and makes it not blocky. + halfPixelOffset: 1 # Fixes shadows. + gpuPaletteConversion: 0 # Stops potential crashes from too many palette textures. SLUS-20777: name: "Obscure" region: "NTSC-U" @@ -40964,6 +43173,9 @@ SLUS-20793: name: "Gladiator - Sword of Vengeance" region: "NTSC-U" compat: 5 + gsHWFixes: + roundSprite: 2 # Helps glow misalignment. + halfPixelOffset: 1 # Helps glow misalignment. SLUS-20794: name: "ESPN - Major League Baseball" region: "NTSC-U" @@ -40991,7 +43203,7 @@ SLUS-20800: name: "Taiko Drum Master" region: "NTSC-U" gsHWFixes: - deinterlace: 4 # Game requires bob bff deinterlacing when auto. + deinterlace: 5 # Game requires bob bff deinterlacing when auto. alignSprite: 1 # Fixes vertical lines. SLUS-20801: name: "Midway Arcade Treasures" @@ -41007,8 +43219,11 @@ SLUS-20804: name: "Forgotten Realms - Demon Stone" region: "NTSC-U" compat: 5 + clampModes: + vuClampMode: 3 # Removes occasional SPS where the head goes into nightmare fuel. gsHWFixes: halfPixelOffset: 1 # Reduces ghosting. + roundSprite: 1 # Reduces ghosting even more. SLUS-20805: name: "Yu Yu Hakusho - Dark Tournament" region: "NTSC-U" @@ -41057,6 +43272,8 @@ SLUS-20817: name: "Headhunter - Redemption" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting. SLUS-20818: name: "Bionicle" region: "NTSC-U" @@ -41084,7 +43301,7 @@ SLUS-20824: - "PSCD10088" # Enables EA Sports BIO. - "SLUS-20824" SLUS-20826: - name: "Harry Potter & the Sorcerer's Stone" + name: "Harry Potter and the Sorcerer's Stone" region: "NTSC-U" gameFixes: - EETimingHack @@ -41098,6 +43315,8 @@ SLUS-20828: compat: 5 clampModes: vuClampMode: 0 # Resolves I Reg Clamping / performance impact and yellow graphics in certain areas. + gsHWFixes: + roundSprite: 1 # Fixes slight blur. SLUS-20830: name: "Intellivision Lives!" region: "NTSC-U" @@ -41115,7 +43334,7 @@ SLUS-20833: region: "NTSC-U" compat: 5 SLUS-20834: - name: "King of Fighters 2000 & 2001 [Disc1of2]" + name: "King of Fighters 2000 & 2001 [Disc 1 of 2]" region: "NTSC-U" compat: 5 SLUS-20836: @@ -41129,7 +43348,7 @@ SLUS-20838: name: "All-Star Baseball 2005 featuring Derek Jeter" region: "NTSC-U" SLUS-20839: - name: "King of Fighters 2000 & 2001 [Disc2of2]" + name: "King of Fighters 2000 & 2001 [Disc 2 of 2]" region: "NTSC-U" compat: 5 SLUS-20840: @@ -41186,8 +43405,12 @@ SLUS-20851: compat: 5 gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes font and HUD artifacts. alignSprite: 1 # Fixes vertical lines. + mergeSprite: 1 # Fixes vertical lines. + texturePreloading: 1 # Performs better than full. + cpuCLUTRender: 1 # Fixes sun occlusion. patches: 39B574F0: content: |- @@ -41207,7 +43430,7 @@ SLUS-20853: region: "NTSC-U" compat: 5 SLUS-20854: - name: "Cy Girls [Disc2of2]" + name: "Cy Girls [Disc 2 of 2]" region: "NTSC-U" compat: 5 memcardFilters: @@ -41216,6 +43439,8 @@ SLUS-20855: name: "Destruction Derby Arenas" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Corrects shadow position. SLUS-20856: name: "Spy Fiction" region: "NTSC-U" @@ -41225,9 +43450,14 @@ SLUS-20857: region: "NTSC-U" compat: 5 SLUS-20858: - name: "Corvette 50th Anniversary" + name: "Corvette" region: "NTSC-U" compat: 5 + speedHacks: + InstantVU1SpeedHack: 1 # Increases FPS drastically. + MTVUSpeedHack: 0 + gsHWFixes: + halfPixelOffset: 3 # Reduces ghosting. SLUS-20859: name: "Future Tactics - The Uprising" region: "NTSC-U" @@ -41263,7 +43493,7 @@ SLUS-20865: - "SLUS-20865" - "SLUS-20704" SLUS-20866: - name: "Asterix & Obelix XXL - Kick Buttix" + name: "Asterix & Obelix - Kick Buttix" region: "NTSC-U" compat: 5 SLUS-20867: @@ -41298,10 +43528,14 @@ SLUS-20872: name: "Juiced" region: "NTSC-U" compat: 5 + speedHacks: + InstantVU1SpeedHack: 0 # Significantly improves game speed. SLUS-20873: name: "Silent Hill 4 - The Room" region: "NTSC-U" compat: 5 + speedHacks: + mvuFlagSpeedHack: 0 # Fixes invisible wall in front of the door leading to East 3F in the 2nd visit of Apartment world preventing Eileen's Nurse Outfit. gsHWFixes: halfPixelOffset: 1 # Fixes dark sides. SLUS-20874: @@ -41339,7 +43573,9 @@ SLUS-20881: SLUS-20882: name: "Hitman - Contracts" region: "NTSC-U" - compat: 3 + compat: 4 + gsHWFixes: + texturePreloading: 1 # Performs much better with partial preload. SLUS-20883: name: "Tom Clancy's Rainbow Six 3" region: "NTSC-U" @@ -41348,6 +43584,8 @@ SLUS-20884: name: "Spyro - A Hero's Tail" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes misaligned bloom effects that streak on-screen, causes occasional trash shadows at places. SLUS-20885: name: "Red Star, The" region: "NTSC-U" @@ -41356,7 +43594,7 @@ SLUS-20886: name: "Sitting Ducks" region: "NTSC-U" SLUS-20887: - name: "Adventures of Jimmy Neutron, The - Attack of the Twonkies" + name: "Adventures of Jimmy Neutron, The - Boy Genius - Attack of the Twonkies" region: "NTSC-U" SLUS-20888: name: "Front Mission 4" @@ -41376,7 +43614,7 @@ SLUS-20890: region: "NTSC-U" compat: 5 SLUS-20891: - name: "Star Ocean 3 - Till the End of Time [Disc2of2]" + name: "Star Ocean 3 - Till the End of Time [Disc 2 of 2]" region: "NTSC-U" compat: 5 gameFixes: @@ -41387,11 +43625,14 @@ SLUS-20891: memcardFilters: - "SLUS-20488" SLUS-20892: - name: "Xenosaga - Episode II - Jenseits von Gut und Bose [Disc1of2]" + name: "Xenosaga - Episode II - Jenseits von Gut und Bose [Disc 1 of 2]" region: "NTSC-U" compat: 5 gsHWFixes: - autoFlush: 1 + autoFlush: 1 # Fixes shadows in cutscenes. + halfPixelOffset: 2 # Fixes lighting misalignment and shadows. + roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. memcardFilters: # Allows import of Xenosaga I data. - "SLUS-20469" - "SLUS-20892" @@ -41436,6 +43677,8 @@ SLUS-20902: name: "Shadow of Rome" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness and misalgined garbage when upscaling. SLUS-20903: name: "Mega Man X - Command Mission" region: "NTSC-U" @@ -41548,7 +43791,7 @@ SLUS-20922: region: "NTSC-U" compat: 2 patches: - 2b54d3e5: + 2B54D3E5: content: |- comment=Patch by Prafull // Avoids hang at loading. @@ -41568,7 +43811,7 @@ SLUS-20925: speedHacks: MTVUSpeedHack: 0 # Fixes bad graphics due to bad T-Bit handling. SLUS-20926: - name: "Harry Potter and The Prisoner of Azkaban" + name: "Harry Potter and the Prisoner of Azkaban" region: "NTSC-U" gsHWFixes: mipmap: 1 @@ -41583,9 +43826,11 @@ SLUS-20928: region: "NTSC-U" compat: 5 SLUS-20929: - name: "Gundam Battle Assault 3 featuring Gundam Seed" + name: "Battle Assault 3 featuring Gundam Seed" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Improves clarity of the UI when upscaling. SLUS-20930: name: "Choro Q" region: "NTSC-U" @@ -41600,7 +43845,8 @@ SLUS-20932: compat: 5 gsHWFixes: halfBottomOverride: 1 # Bottom screen has wrong colors. - halfPixelOffset: 1 # Fixes bloom misalignment. + autoFlush: 1 # Fixes missing lighting. + # halfPixelOffset: 1 # Fixes lighting misalignment. Do not enable this, it breaks a lot of graphics. SLUS-20933: name: "Smash Court Pro Tournament Tennis 2" region: "NTSC-U" @@ -41609,6 +43855,8 @@ SLUS-20934: name: "Death by Degrees" region: "NTSC-U" compat: 5 + gsHWFixes: + alignSprite: 1 # Fixes FMV lines. SLUS-20935: name: "IHRA Professional Drag Racing 2005" region: "NTSC-U" @@ -41638,7 +43886,8 @@ SLUS-20941: region: "NTSC-U" compat: 5 gsHWFixes: - mipmap: 1 + mipmap: 2 # Mipmap + trilinear, fixes textures. + trilinearFiltering: 1 SLUS-20942: name: "Robots" region: "NTSC-U" @@ -41662,7 +43911,7 @@ SLUS-20946: region: "NTSC-U" compat: 5 clampModes: - vuClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. + eeClampMode: 2 # Fixes Game freezes during "Reuniting The Families" mission. gsHWFixes: autoFlush: 1 SLUS-20947: @@ -41673,6 +43922,10 @@ SLUS-20948: name: "Crimson Tears" region: "NTSC-U" compat: 5 + gsHWFixes: + wildArmsHack: 1 # Fixes blurriness. + roundSprite: 2 # Reduces misalignment bloom effects. +# deinterlace: 6 # Game requires blend tff deinterlacing when auto for 'fixing' shimmer on character models and more flickering or half weaved, though the game suffers from the field order. SLUS-20949: name: "Street Fighter Anniversary Collection" region: "NTSC-U" @@ -41726,6 +43979,7 @@ SLUS-20960: gsHWFixes: autoFlush: 1 # Fixes bloom. roundSprite: 1 # Fixes misalliged bloom. + deinterlace: 6 # Game requires blend tff deinterlacing when auto for 'fixing' subtitles flickering or half weaved. memcardFilters: - "SLUS-20960" - "SLUS-20903" @@ -41753,6 +44007,7 @@ SLUS-20964: eeRoundMode: 0 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but still an issue compared to native. + roundSprite: 2 # Clears up much of the blurring that HPO Special does not. SLUS-20965: name: "Tony Hawk's Underground 2" region: "NTSC-U" @@ -41784,7 +44039,7 @@ SLUS-20970: region: "NTSC-U" compat: 5 SLUS-20971: - name: "Metal Slug 4 & 5 [Disc1of2]" + name: "Metal Slug 4 & 5 [Disc 1 of 2]" region: "NTSC-U" compat: 5 SLUS-20972: @@ -41883,7 +44138,7 @@ SLUS-20989: region: "NTSC-U" compat: 5 SLUS-20990: - name: "Metal Slug 4 & 5 [Disc2of2]" + name: "Metal Slug 4 & 5 [Disc 2 of 2]" region: "NTSC-U" compat: 5 SLUS-20991: @@ -41904,10 +44159,10 @@ SLUS-20994: region: "NTSC-U" compat: 5 SLUS-20995: - name: "King of Fighters 2002 & 2003 [Disc1of2]" + name: "King of Fighters 2002 & 2003 [Disc 1 of 2]" region: "NTSC-U" SLUS-20996: - name: "King of Fighters 2002 & 2003 [Disc2of2]" + name: "King of Fighters 2002 & 2003 [Disc 2 of 2]" region: "NTSC-U" SLUS-20997: name: "Midway Arcade Treasures 2" @@ -41948,6 +44203,7 @@ SLUS-21005: region: "NTSC-U" gsHWFixes: autoFlush: 1 # Fixes effects. + halfPixelOffset: 1 # Fixes upscaling artifacts. compat: 5 SLUS-21006: name: "Ghost in the Shell - Stand Alone Complex" @@ -42035,9 +44291,12 @@ SLUS-21014: region: "NTSC-U" compat: 5 SLUS-21015: - name: "Madagascar" + name: "Dreamworks Madagascar" region: "NTSC-U" compat: 5 + gsHWFixes: + roundSprite: 2 # Improves bloom alignment and clarity. + halfPixelOffset: 2 # Improves bloom alignment and clarity. SLUS-21016: name: "25 to Life" region: "NTSC-U" @@ -42054,7 +44313,8 @@ SLUS-21018: vuClampMode: 3 # Fixes minor SPS on characters. gsHWFixes: preloadFrameData: 1 # Fixes bad textures on Jake. - halfPixelOffset: 1 # Fixes double image. + halfPixelOffset: 1 # Fixes double image.gsHWFixes: + cpuCLUTRender: 1 # Fixes Jake going black in Smellovision. SLUS-21019: name: "Technic Beat" region: "NTSC-U" @@ -42064,7 +44324,7 @@ SLUS-21020: region: "NTSC-U" compat: 5 SLUS-21021: - name: "Cabela's Deer Hunt - 2005 Season" + name: "Cabela's Big Game Hunter 2005 Adventures" region: "NTSC-U" SLUS-21022: name: "Prince of Persia - Warrior Within" @@ -42088,6 +44348,8 @@ SLUS-21027: name: "Lord of the Rings, The - The Third Age" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting in cutscenes. SLUS-21028: name: "World Championship Poker" region: "NTSC-U" @@ -42115,6 +44377,8 @@ SLUS-21029: // for VU1 to finish, which reduces the advantage of MTVU to basically zero. patch=1,EE,D05257FC,extended,00000800 patch=1,EE,205257FC,extended,00000000 + gsHWFixes: + texturePreloading: 1 # Improves performance and prevents it disabling itself regardless. SLUS-21030: name: "Outlaw Golf 2" region: "NTSC-U" @@ -42136,8 +44400,12 @@ SLUS-21034: SLUS-21035: name: "Major League Baseball 2K5" region: "NTSC-U" + clampModes: + eeClampMode: 2 # Fixes hang when the baseball hits the ground. + gsHWFixes: + texturePreloading: 1 # Performs much better and stops freezing and or stuttering. patches: - 2243ce1d: + 2243CE1D: content: |- author=Prafull comment=Patched by Prafull @@ -42167,12 +44435,14 @@ SLUS-21040: region: "NTSC-U" compat: 5 SLUS-21041: - name: "Shadow Hearts - Covenant [Disc1of2]" + name: "Shadow Hearts - Covenant [Disc 1 of 2]" region: "NTSC-U" compat: 5 gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. SLUS-21042: name: "Darkwatch" region: "NTSC-U" @@ -42182,12 +44452,14 @@ SLUS-21043: region: "NTSC-U" compat: 5 SLUS-21044: - name: "Shadow Hearts - Covenant [Disc2of2]" + name: "Shadow Hearts - Covenant [Disc 2 of 2]" region: "NTSC-U" compat: 5 gsHWFixes: - halfPixelOffset: 1 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. + halfPixelOffset: 2 # Fixes blurrines, preload frame for FMV breaks visuals with this setting. disablePartialInvalidation: 1 # Fixes shadows when upscaling. + roundSprite: 2 # Fixes the position of monster sprites and reduces garbage in the UI. + autoFlush: 1 # Makes the shadow monsters appear. memcardFilters: - "SLUS-21041" SLUS-21045: @@ -42198,6 +44470,8 @@ SLUS-21046: name: "King Arthur" region: "NTSC-U" compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLUS-21047: name: "Cold Fear" region: "NTSC-U" @@ -42215,10 +44489,14 @@ SLUS-21050: region: "NTSC-U" compat: 5 clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLUS-21051: name: "FIFA 2005" region: "NTSC-U" @@ -42234,7 +44512,7 @@ SLUS-21053: name: "Disney's Stitch - Experiment 626" region: "NTSC-U" SLUS-21054: - name: "Disney's Treasure Planet (Disney Classics)" + name: "Disney's Treasure Planet [Disney Classics]" region: "NTSC-U" clampModes: vuClampMode: 3 # Fixes SPS when the solar surfer's engines are inactive. @@ -42244,8 +44522,12 @@ SLUS-21056: name: "Cabal, The ~~CANCELLED~~" region: "NTSC-U" SLUS-21057: - name: "Ty the Tasmanian Tiger 2 - Bush Rescue" + name: "TY the Tasmanian Tiger 2 - Bush Rescue" region: "NTSC-U" + compat: 5 + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. + halfPixelOffset: 1 # Fixes visible lines in water textures. SLUS-21058: name: "NBA Live 2005" region: "NTSC-U" @@ -42256,7 +44538,7 @@ SLUS-21059: clampModes: eeClampMode: 2 # Fixes camera and stops constant coin noises on Pirates Cove. gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLUS-21060: name: "WWE SmackDown! vs. RAW" region: "NTSC-U" @@ -42285,6 +44567,8 @@ SLUS-21066: name: "Urbz, The - Sims in the City" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes upscaling lines. SLUS-21067: name: "Digimon Rumble Arena 2" region: "NTSC-U" @@ -42361,6 +44645,8 @@ SLUS-21083: name: "LEGO Star Wars - The Video Game" region: "NTSC-U" compat: 5 + clampModes: + vuClampMode: 3 # Fixes bad coordinate spam. SLUS-21084: name: "Winnie the Pooh's Rumbly Tumbly Adventure" region: "NTSC-U" @@ -42465,6 +44751,7 @@ SLUS-21106: cpuSpriteRenderBW: 1 # Fixes textures. preloadFrameData: 1 # Fixes static text screens. roundSprite: 1 # Fixes lines in some post-effects. + cpuCLUTRender: 1 # Fixes light occlusion. SLUS-21107: name: "X-Men - The Official Game" region: "NTSC-U" @@ -42510,6 +44797,8 @@ SLUS-21115: name: "Okami" region: "NTSC-U" compat: 5 + gsHWFixes: + roundSprite: 2 # Reduces misalignment issues but the game is just bad for upscaling. SLUS-21116: name: "187 - Ride or Die" region: "NTSC-U" @@ -42579,13 +44868,15 @@ SLUS-21132: region: "NTSC-U" compat: 5 SLUS-21133: - name: "Xenosaga - Episode II - Jenseits von Gut und Bose [Disc2of2]" + name: "Xenosaga - Episode II - Jenseits von Gut und Bose [Disc 2 of 2]" region: "NTSC-U" compat: 5 gsHWFixes: - autoFlush: 1 - texturePreloading: 0 - memcardFilters: + autoFlush: 1 # Fixes shadows in cutscenes. + halfPixelOffset: 2 # Fixes lighting misalignment and shadows. + roundSprite: 2 # Fixes font artifacts. + texturePreloading: 0 # Fix slowdown due to large textures. + memcardFilters: # Allows import of Xenosaga I data. - "SLUS-20469" - "SLUS-20892" SLUS-21134: @@ -42634,10 +44925,10 @@ SLUS-21143: name: "Star Wars - Episode III - Revenge of the Sith" region: "NTSC-U" compat: 5 - gsHWFixes: - halfPixelOffset: 1 # Fixes bloom misalignment. gameFixes: - SoftwareRendererFMVHack # Fixes FMVs. + gsHWFixes: + halfPixelOffset: 1 # Fixes bloom misalignment. SLUS-21144: name: "Tom Clancy's Rainbow Six - Lockdown" region: "NTSC-U" @@ -42719,7 +45010,7 @@ SLUS-21160: clampModes: eeClampMode: 2 # Fixes camera and stops constant coin noises on Pirates Cove. gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLUS-21161: name: "Fight Night - Round 2" region: "NTSC-U" @@ -42751,6 +45042,8 @@ SLUS-21168: clampModes: vuClampMode: 0 # Fixes SPS with microVU. eeClampMode: 2 # Fixes missing blade. + gsHWFixes: + roundSprite: 1 # Fixes font sizes to be bigger. memcardFilters: - "SLUS-21168" - "SLUS-20733" @@ -42766,7 +45059,7 @@ SLUS-21171: region: "NTSC-U" compat: 5 patches: - 304c115c: + 304C115C: content: |- comment=Patch by Prafull // Fix hang at shipping shed. @@ -42806,12 +45099,15 @@ SLUS-21179: gsHWFixes: halfPixelOffset: 3 # Fixes bloom misalignment still a bit misaligned. roundSprite: 1 # Fixes bloom misalignment still a bit misaligned. + cpuCLUTRender: 1 # Fixes sun background on the windows when selecting your 'race'. SLUS-21180: - name: "Onimusha - Dawn of Dreams [Disc1of2]" + name: "Onimusha - Dawn of Dreams [Disc 1 of 2]" region: "NTSC-U" compat: 5 gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. + gsHWFixes: + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. SLUS-21181: name: "D.I.C.E. - DNA Integrated Cybernetic Enterprises" region: "NTSC-U" @@ -42849,6 +45145,8 @@ SLUS-21189: compat: 5 speedHacks: InstantVU1SpeedHack: 1 # Fixes SPS. + gsHWFixes: + autoFlush: 1 # Fixes debris and blending on lower part of screen during monster transformation. memcardFilters: - "SLUS-21189" - "SLUS-20636" @@ -42962,6 +45260,8 @@ SLUS-21209: - EETimingHack # Mitigates bounciness of vertical shaking but better fix with EE cyclerate +1. gsHWFixes: alignSprite: 1 # Fixes vertical lines. + textureInsideRT: 1 # Fixes corruption. + texturePreloading: 1 # Performs much better with partial preload. SLUS-21212: name: "Spartan - Total Warrior" region: "NTSC-U" @@ -42994,6 +45294,7 @@ SLUS-21216: gsHWFixes: alignSprite: 1 # Fixes vertical lines. halfPixelOffset: 1 # Fixes blurriness. + texturePreloading: 1 # Improves performance. SLUS-21217: name: "Incredibles, The - Rise of the Underminers" region: "NTSC-U" @@ -43040,12 +45341,16 @@ SLUS-21227: name: "Dragon Ball Z - Budokai Tenkaichi" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes lines when powering up. + cpuCLUTRender: 1 # Reduces the bloomy blur of characters. SLUS-21228: name: "Call of Duty 2 - Big Red One" region: "NTSC-U" compat: 5 gameFixes: - SoftwareRendererFMVHack # Right side of the FMV is not rendering correctly. + - IbitHack # Fixes lights. gsHWFixes: roundSprite: 1 # Fixes lines in sprites. cpuSpriteRenderBW: 1 # Fixes textures. @@ -43053,6 +45358,8 @@ SLUS-21229: name: "Motocross Mania 3" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes bloom misalignment. SLUS-21230: name: "We Love Katamari" region: "NTSC-U" @@ -43073,6 +45380,7 @@ SLUS-21231: gsHWFixes: autoFlush: 1 # Fixes bloom misalignment. halfPixelOffset: 2 # Fixes bloom misalignment. + textureInsideRT: 1 # Fixes sky bloom. SLUS-21232: name: "College Hoops 2K6" region: "NTSC-U" @@ -43116,6 +45424,8 @@ SLUS-21236: name: "Tokyo Xtreme Racer Drift" region: "NTSC-U" compat: 5 + gsHWFixes: + alignSprite: 1 # Fixes vertical lines. SLUS-21237: name: "AND 1 Streetball" region: "NTSC-U" @@ -43143,16 +45453,20 @@ SLUS-21242: region: "NTSC-U" compat: 5 clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 0 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: # Reads Burnout 3 and NFL 06 saves for unlockables. - "SLUS-21242" - "SLUS-21050" - "SLUS-21213" SLUS-21243: - name: "Metal Gear Solid 3 - Subsistence [Disc2of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 2 of 3]" region: "NTSC-U" compat: 5 gameFixes: @@ -43210,9 +45524,14 @@ SLUS-21252: region: "NTSC-U" compat: 4 SLUS-21253: - name: "Ty the Tasmanian Tiger 3" + name: "TY the Tasmanian Tiger 3 - Night of the Quinkan" region: "NTSC-U" compat: 5 + roundModes: + eeRoundMode: 0 # Fixes story mission to make it completable. + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. + halfPixelOffset: 1 # Fixes visible lines in water textures. SLUS-21254: name: "Zatch Bell! Mamodo Battles" region: "NTSC-U" @@ -43255,6 +45574,8 @@ SLUS-21261: name: "Shadow the Hedgehog" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes misaligned lighting. SLUS-21262: name: "Radiata Stories" region: "NTSC-U" @@ -43290,6 +45611,7 @@ SLUS-21267: compat: 5 gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLUS-21267" - "SLUS-21351" @@ -43322,6 +45644,9 @@ SLUS-21271: compat: 5 gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + cpuSpriteRenderBW: 2 # Fixes some bad textures. + cpuCLUTRender: 1 # Fixes the rest of the bad textures. SLUS-21272: name: "Super Monkey Ball Adventure" region: "NTSC-U" @@ -43355,7 +45680,7 @@ SLUS-21277: region: "NTSC-U" compat: 5 gsHWFixes: - mipmap: 1 + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. SLUS-21278: name: "SSX on Tour" region: "NTSC-U" @@ -43371,7 +45696,7 @@ SLUS-21281: region: "NTSC-U" compat: 3 SLUS-21282: - name: "James Bond 007 - From Russia with Love" + name: "007 - From Russia with Love" region: "NTSC-U" compat: 5 SLUS-21283: @@ -43382,6 +45707,7 @@ SLUS-21284: name: "Nicktoons Unite!" region: "NTSC-U" gsHWFixes: + autoFlush: 1 # Fixes glows. mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. textureInsideRT: 1 # Fixes rainbow lighting for lamps, computer and other areas. SLUS-21285: @@ -43453,6 +45779,8 @@ SLUS-21297: name: "Devil Kings" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes misaligned bloom. SLUS-21298: name: "NCAA March Madness '06" region: "NTSC-U" @@ -43525,7 +45853,8 @@ SLUS-21312: region: "NTSC-U" compat: 5 gsHWFixes: - deinterlace: 3 # Game requires bob deinterlacing when auto. + deinterlace: 4 # Game requires bob deinterlacing when auto. + halfPixelOffset: 1 # Fixes misalignment/bloom when upscaling. SLUS-21313: name: "Friends - The One with all the Trivia" region: "NTSC-U" @@ -43537,7 +45866,7 @@ SLUS-21314: gameFixes: - EETimingHack # Needed to go ingame. patches: - f73488d5: + F73488D5: content: |- comment=Patch by Prafull // Fixes random hangs when going ingame. @@ -43561,6 +45890,7 @@ SLUS-21318: compat: 5 gameFixes: - SoftwareRendererFMVHack # Right side of the FMV is not rendering correctly. + - IbitHack # Fixes lights. gsHWFixes: roundSprite: 1 # Fixes lines in sprites. cpuSpriteRenderBW: 1 # Fixes textures. @@ -43589,6 +45919,10 @@ SLUS-21323: SLUS-21324: name: "Major League Baseball 2K5 [World Series Edition]" region: "NTSC-U" + clampModes: + eeClampMode: 2 # Fixes hang when the baseball hits the ground. + gsHWFixes: + texturePreloading: 1 # Performs much better and stops freezing and or stuttering. patches: D592B291: content: |- @@ -43596,7 +45930,7 @@ SLUS-21324: // Skip hang at start. patch=1,EE,0036b220,word,00000000 //1040fffd SLUS-21325: - name: "Harry Potter and The Goblet of Fire" + name: "Harry Potter and the Goblet of Fire" region: "NTSC-U" compat: 5 gsHWFixes: @@ -43627,7 +45961,7 @@ SLUS-21328: patch=1,EE,0016DDD0,word,4B00A29C patch=1,EE,0016DDD8,word,4AF103BC SLUS-21329: - name: "Karaoke Revolution Country - CMT Presents" + name: "CMT Presents - Karaoke Revolution - Country" region: "NTSC-U" compat: 3 SLUS-21330: @@ -43649,7 +45983,7 @@ SLUS-21333: region: "NTSC-U" compat: 5 SLUS-21334: - name: "Grandia III [Disc1of2]" + name: "Grandia III [Disc 1 of 2]" region: "NTSC-U" compat: 5 SLUS-21335: @@ -43698,7 +46032,7 @@ SLUS-21344: region: "NTSC-U" compat: 5 SLUS-21345: - name: "Grandia III [Disc2of2]" + name: "Grandia III [Disc 2 of 2]" region: "NTSC-U" compat: 5 memcardFilters: @@ -43709,6 +46043,7 @@ SLUS-21346: compat: 5 gsHWFixes: mipmap: 1 + halfPixelOffset: 3 # Fixes ghosting in foggy maps. roundSprite: 2 # Fixes HUD artifacts. alignSprite: 1 # Fixes vertical lines. mergeSprite: 1 # Better aligns main menu strips, improving font readability. @@ -43747,6 +46082,7 @@ SLUS-21351: compat: 5 gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). memcardFilters: - "SLUS-21267" - "SLUS-21351" @@ -43776,6 +46112,8 @@ SLUS-21355: // for VU1 to finish, which reduces the advantage of MTVU to basically zero. patch=1,EE,D052907C,extended,00000800 patch=1,EE,2052907C,extended,00000000 + gsHWFixes: + texturePreloading: 1 # Improves performance and prevents it disabling itself regardless. SLUS-21356: name: "Tom Clancy's Splinter Cell - Double Agent" region: "NTSC-U" @@ -43789,7 +46127,7 @@ SLUS-21358: region: "NTSC-U" compat: 5 SLUS-21359: - name: "Metal Gear Solid 3 - Subsistence [Disc1of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 1 of 3]" region: "NTSC-U" compat: 5 gameFixes: @@ -43797,7 +46135,7 @@ SLUS-21359: gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLUS-21360: - name: "Metal Gear Solid 3 - Subsistence [Disc3of3]" + name: "Metal Gear Solid 3 - Subsistence [Disc 3 of 3]" region: "NTSC-U" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. @@ -43813,14 +46151,15 @@ SLUS-21361: eeRoundMode: 0 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but still an issue compared to native. + roundSprite: 2 # Clears up much of the blurring that HPO Special does not. SLUS-21362: - name: "Onimusha - Dawn of Dreams [Disc2of2]" + name: "Onimusha - Dawn of Dreams [Disc 2 of 2]" region: "NTSC-U" compat: 5 gameFixes: - SoftwareRendererFMVHack # Wrong white textures in FMV. gsHWFixes: - halfPixelOffset: 1 # Fixes upscaling lines. + halfPixelOffset: 2 # Fixes misalignment and upscaling lines. memcardFilters: - "SLUS-21180" SLUS-21363: @@ -43869,6 +46208,7 @@ SLUS-21372: // Fixes HUD and menu display. patch=1,EE,001849b8,word,00000000 gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. halfPixelOffset: 2 # Fixes lighting on mushrooms + others. SLUS-21373: name: "Drakengard 2" @@ -43879,6 +46219,7 @@ SLUS-21373: gsHWFixes: halfPixelOffset: 1 # Fixes ghosting characters. mergeSprite: 1 # Align sprite fixes FMVs but not garbage in-game, so needs merge sprite instead. + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLUS-21374: name: "Marvel - Ultimate Alliance" region: "NTSC-U" @@ -43898,6 +46239,8 @@ SLUS-21376: gsHWFixes: autoFlush: 1 # Properly diffuses light instead of strips of light. roundSprite: 1 # Fixes lighting misalignment such as the street poles and the sun. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. patches: 5C891FF1: content: |- @@ -43957,12 +46300,15 @@ SLUS-21385: name: "Godfather, The" region: "NTSC-U" compat: 5 + gsHWFixes: + cpuCLUTRender: 1 # Fixes light occlusion. SLUS-21386: name: "Tales of the Abyss" region: "NTSC-U" compat: 5 gsHWFixes: halfPixelOffset: 2 # Fixes ghosting. + autoFlush: 1 # Fixes post lighting. SLUS-21387: name: "Warship Gunner 2" region: "NTSC-U" @@ -43974,7 +46320,7 @@ SLUS-21388: gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but doesn't fully fix it. SLUS-21389: - name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc1of2]" + name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc 1 of 2]" region: "NTSC-U" compat: 5 gsHWFixes: @@ -43989,10 +46335,14 @@ SLUS-21390: name: "Urban Chaos - Riot Response" region: "NTSC-U" compat: 4 + gsHWFixes: + roundSprite: 1 # Fixes edge garbage and thin lines. SLUS-21391: - name: "SpongeBob SquarePants - Creature from the Krusty Krab" + name: "Nickelodeon SpongeBob SquarePants - Creature from the Krusty Krab" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. SLUS-21392: name: "Shrek Smash and Crash" region: "NTSC-U" @@ -44028,6 +46378,9 @@ SLUS-21399: region: "NTSC-U" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + cpuSpriteRenderBW: 2 # Fixes some bad textures. + cpuCLUTRender: 1 # Fixes the rest of the bad textures. SLUS-21400: name: "Monster House" region: "NTSC-U" @@ -44040,6 +46393,8 @@ SLUS-21402: name: "Micro Machines V4" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes bloom misalignment. SLUS-21403: name: "Backyard Sports - Baseball 2007" region: "NTSC-U" @@ -44059,6 +46414,8 @@ SLUS-21407: compat: 5 clampModes: vuClampMode: 3 # Missing geometry with microVU. + gsHWFixes: + cpuCLUTRender: 1 # Fixes light occlusion. SLUS-21408: name: "FIFA World Cup Germany '06" region: "NTSC-U" @@ -44066,6 +46423,8 @@ SLUS-21408: SLUS-21409: name: "LEGO Star Wars II - The Original Trilogy" region: "NTSC-U" + gsHWFixes: + cpuCLUTRender: 1 # Fixes ghosting on objects and people. memcardFilters: - "SLUS-21409" - "SLUS-21083" @@ -44088,6 +46447,7 @@ SLUS-21413: halfPixelOffset: 1 # Fixes misaligned bloom effects. mergeSprite: 1 # Fixes blurriness but removes bloom + Recommended to use Shadeboost brightness 80. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLUS-21414: name: "Delta Force - Black Hawk Down - Team Sabre" region: "NTSC-U" @@ -44103,7 +46463,7 @@ SLUS-21416: clampModes: eeClampMode: 3 # Fixes black screen. SLUS-21417: - name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc2of2]" + name: "Xenosaga Episode III - Also Sprach Zarathustra [Disc 2 of 2]" region: "NTSC-U" compat: 5 gsHWFixes: @@ -44186,6 +46546,7 @@ SLUS-21426: eeClampMode: 3 gsHWFixes: cpuSpriteRenderBW: 1 # Fixes textures. + halfPixelOffset: 2 # Fixes fog misplacement. SLUS-21427: name: "WWE SmackDown! vs. RAW 2007" region: "NTSC-U" @@ -44194,6 +46555,8 @@ SLUS-21428: name: "Bionicle Heroes" region: "NTSC-U" compat: 5 + gsHWFixes: + cpuCLUTRender: 1 # Fixes ghosting on objects and people. SLUS-21430: name: "IGPX - Immortal Grand Prix" region: "NTSC-U" @@ -44223,6 +46586,8 @@ SLUS-21436: name: "Just Cause" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting. SLUS-21437: name: "Disney's Kim Possible - What's the Switch" region: "NTSC-U" @@ -44241,14 +46606,14 @@ SLUS-21439: gsHWFixes: mipmap: 1 SLUS-21440: - name: "LarryBoy and the Bad Apple" + name: "Big Idea's VeggieTales - LarryBoy and the Bad Apple" region: "NTSC-U" SLUS-21441: name: "Dragon Ball Z - Budokai Tenkaichi 2" region: "NTSC-U" compat: 5 gsHWFixes: - roundSprite: 2 # Fixes font artifacts. + halfPixelOffset: 1 # Fixes extreme ghosting. SLUS-21442: name: "Super Dragon Ball Z" region: "NTSC-U" @@ -44385,6 +46750,8 @@ SLUS-21469: name: "Nicktoons - Battle for Volcano Island" region: "NTSC-U" compat: 5 + gsHWFixes: + mipmap: 1 # Better characters and environment but has a texture cache issue that makes it worse. SLUS-21470: name: "Bratz - Forever Diamondz" region: "NTSC-U" @@ -44428,6 +46795,8 @@ SLUS-21479: compat: 5 gameFixes: - EETimingHack + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. SLUS-21480: name: "dot hack GU Volume 1 - Rebirth - Terminal Disc" region: "NTSC-U" @@ -44461,7 +46830,7 @@ SLUS-21484: region: "NTSC-U" compat: 5 SLUS-21485: - name: "Backyard Basketball '07" + name: "Backyard Sports - Basketball 2007" region: "NTSC-U" SLUS-21486: name: "Eagle Eye Golf" @@ -44566,6 +46935,8 @@ SLUS-21501: name: "Raw Danger" region: "NTSC-U" compat: 5 + gsHWFixes: + cpuCLUTRender: 1 # Fixes some shading/shadows. SLUS-21503: name: "God Hand" region: "NTSC-U" @@ -44580,7 +46951,7 @@ SLUS-21536: gsHWFixes: halfPixelOffset: 1 # Fixes misaligned textures. SLUS-21537: - name: "NeoGeo Fatal Fury Collection" + name: "Fatal Fury Battle Archives Vol.1" region: "NTSC-U" compat: 5 SLUS-21538: @@ -44603,6 +46974,7 @@ SLUS-21541: gsHWFixes: halfPixelOffset: 2 # Reduces blooming misalignment. wildArmsHack: 1 # Reduces blooming misalignment. + autoFlush: 1 # Fixes glows. SLUS-21542: name: "Sega Genesis Collection" region: "NTSC-U" @@ -44718,6 +47090,8 @@ SLUS-21567: SLUS-21568: name: "Arena Football - Road to Glory" region: "NTSC-U" + clampModes: + vuClampMode: 3 # Fixes missing crowds. SLUS-21569: name: "Shin Megami Tensei - Persona 3" region: "NTSC-U" @@ -44732,8 +47106,8 @@ SLUS-21571: name: "Growlanser - Heritage of War" region: "NTSC-U" compat: 5 - gsHWFixes: - preloadFrameData: 1 # Fixes layers where characters should be visually behind an object. + # gsHWFixes: Disabled because of GitHub Issue #6797 + # preloadFrameData: 1 # Fixes layers where characters should be visually behind an object. SLUS-21572: name: "Surf's Up" region: "NTSC-U" @@ -44840,10 +47214,14 @@ SLUS-21596: region: "NTSC-U" compat: 5 clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLUS-21597: name: "Medal of Honor - Vanguard" region: "NTSC-U" @@ -44900,6 +47278,9 @@ SLUS-21604: SLUS-21605: name: "Nicktoons - Attack of the Toybots" region: "NTSC-U" + gsHWFixes: + mipmap: 1 # Fixes garbage textures in the distance. + halfPixelOffset: 2 # Corrects most vertical lines. SLUS-21606: name: "Metropolismania 2" region: "NTSC-U" @@ -44915,6 +47296,7 @@ SLUS-21607: // Fixes HUD and menu display. patch=1,EE,00173cb8,word,00000000 gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. halfPixelOffset: 2 # Fixes lighting on mushrooms + others. SLUS-21608: name: "Dance Dance Revolution SuperNOVA 2" @@ -44931,6 +47313,7 @@ SLUS-21611: gsHWFixes: halfPixelOffset: 2 # Fixes misaligned bloom effects, 1 is technically more correct compared to software but looks worse. wrapGSMem: 1 # Fixes FMVs missing video pieces. + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the whole game. SLUS-21612: name: "Legend of the Dragon" region: "NTSC-U" @@ -44942,7 +47325,7 @@ SLUS-21613: SLUS-21614: name: "Star Wars - The Force Unleashed" region: "NTSC-U" - compat: 4 + compat: 5 patches: 879CDA5E: content: |- @@ -44951,13 +47334,14 @@ SLUS-21614: // Patch replace values passed to FPU to workaround x86 rounding issues. patch=1,EE,0017cf24,word,3464fff0 patch=1,EE,0017cf30,word,3463fffc + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLUS-21615: name: "Wild ARMs 5" region: "NTSC-U" compat: 5 gsHWFixes: - wildArmsHack: 1 # Fixes font artifacts and out-of-bound 2D textures. - roundSprite: 1 # Fixes font sizes. + cpuFramebufferConversion: 1 # Fixes sepia-tone flashback sequences. SLUS-21616: name: "Tony Hawk's Proving Ground" region: "NTSC-U" @@ -44973,11 +47357,13 @@ SLUS-21618: name: "Plan, The" region: "NTSC-U" SLUS-21619: - name: "Harry Potter and The Order of the Phoenix" + name: "Harry Potter and the Order of the Phoenix" region: "NTSC-U" compat: 5 gsHWFixes: mipmap: 1 + halfPixelOffset: 1 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLUS-21620: name: "NCAA Football '08" region: "NTSC-U" @@ -44988,7 +47374,7 @@ SLUS-21621: region: "NTSC-U" compat: 5 gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes flashing windows. memcardFilters: - "SLUS-21621" - "SLUS-21569" @@ -45018,6 +47404,8 @@ SLUS-21627: name: "Jackass - The Game" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes misaligned textures. SLUS-21628: name: "Hot Wheels - Beat That!" region: "NTSC-U" @@ -45065,6 +47453,8 @@ SLUS-21636: name: "Looney Tunes - Acme Arsenal" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes bloom positioning. SLUS-21637: name: "Disney-Pixar's Cars - Mater-National Championship" region: "NTSC-U" @@ -45095,9 +47485,11 @@ SLUS-21643: name: "Bratz - The Movie" region: "NTSC-U" SLUS-21644: - name: "SpongeBob's Atlantis SquarePantis" + name: "Nickelodeon SpongeBob's Atlantis SquarePantis" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. SLUS-21645: name: "WWE SmackDown! vs. Raw 2008" region: "NTSC-U" @@ -45150,6 +47542,8 @@ SLUS-21658: name: "Need for Speed - ProStreet" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 2 # Fixes depth line. SLUS-21660: name: "Disney Princess - Enchanted Journey" region: "NTSC-U" @@ -45166,6 +47560,9 @@ SLUS-21663: name: "Cocoto - Fishing Master" region: "NTSC-U" compat: 5 + gsHWFixes: + deinterlace: 7 # Fixes blurriness. + halfPixelOffset: 1 # Fixes blur. SLUS-21664: name: "Sims 2, The - Castaway" region: "NTSC-U" @@ -45177,20 +47574,21 @@ SLUS-21665: region: "NTSC-U" compat: 5 gsHWFixes: - halfPixelOffset: 1 # Reduces misaligned cel shading but still an issue compared to native. + halfPixelOffset: 2 # Corrects misaligned cel shading. + roundSprite: 1 # Further corrects misaligned cel shading. SLUS-21666: name: "Mountain Bike Adrenaline" region: "NTSC-U" compat: 5 SLUS-21668: - name: "George of the Jungle" + name: "George of the Jungle and the Search for the Secret" region: "NTSC-U" compat: 5 SLUS-21669: name: "NBA 2K8" region: "NTSC-U" SLUS-21670: - name: "Backyard Football 2008" + name: "Backyard Football '08" region: "NTSC-U" compat: 5 SLUS-21671: @@ -45227,6 +47625,8 @@ SLUS-21678: name: "Dragon Ball Z - Budokai Tenkaichi 3" region: "NTSC-U" compat: 5 + gsHWFixes: + cpuCLUTRender: 1 # Reduces the bloomy blur of characters. SLUS-21679: name: "Power Rangers - Super Legends" region: "NTSC-U" @@ -45308,6 +47708,8 @@ SLUS-21697: compat: 3 gameFixes: - EETimingHack # Fixes game engine errors when going ingame. + gsHWFixes: + halfPixelOffset: 1 # Fixes light/bloom positioning. patches: 304497e5: content: |- @@ -45450,7 +47852,7 @@ SLUS-21729: name: "Major League Baseball 2K8" region: "NTSC-U" patches: - 0be24520: + 0BE24520: content: |- author=Prafull // Fixes hanging at start. @@ -45477,6 +47879,9 @@ SLUS-21731: SLUS-21732: name: "El Tigre - The Adventures of Manny Rivera" region: "NTSC-U" + gsHWFixes: + mipmap: 1 # Fixes garbage textures in the distance. + halfPixelOffset: 2 # Corrects most vertical lines. SLUS-21733: name: "Sega Superstars Tennis" region: "NTSC-U" @@ -45563,7 +47968,7 @@ SLUS-21750: name: "Hannah Montana - Spotlight World Tour" region: "NTSC-U" SLUS-21751: - name: "Backyard Football 2009" + name: "Backyard Baseball '09" region: "NTSC-U" compat: 5 SLUS-21752: @@ -45590,6 +47995,7 @@ SLUS-21756: compat: 5 gsHWFixes: halfPixelOffset: 2 # Reduces ghosting but on normal vertex is less ghosting but causes corruption at the sides. + cpuCLUTRender: 1 # Fixes title-screen bloom and church windows on new game and other locations. SLUS-21757: name: "Kung Fu Panda" region: "NTSC-U" @@ -45610,6 +48016,8 @@ SLUS-21760: name: "Jeep Thrills" region: "NTSC-U" compat: 5 + gameFixes: + - BlitInternalFPSHack # Fixes internal FPS detection. SLUS-21761: name: "B-Boy" region: "NTSC-U" @@ -45619,7 +48027,7 @@ SLUS-21763: region: "NTSC-U" compat: 2 patches: - 29fdcbf7: + 29FDCBF7: content: |- author=Prafull // Avoid hang at start. @@ -45673,6 +48081,9 @@ SLUS-21773: name: "PDC World Championship Darts 2008" region: "NTSC-U" compat: 5 + gsHWFixes: + autoFlush: 1 # Fixes lights not appearing. + cpuCLUTRender: 1 # Fixes lights going through darts players. SLUS-21774: name: "Dynasty Warriors 6" region: "NTSC-U" @@ -45699,6 +48110,8 @@ SLUS-21779: compat: 5 clampModes: eeClampMode: 0 # In-game background visible. + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness when upscaling. SLUS-21780: name: "Ferrari Challenge" region: "NTSC-U" @@ -45707,6 +48120,10 @@ SLUS-21781: name: "Guitar Hero - World Tour" region: "NTSC-U" compat: 5 + speedHacks: + InstantVU1SpeedHack: 0 # Corrects note board position. + roundModes: + vuRoundMode: 0 # Fixes graphical issues ingame. SLUS-21782: name: "Shin Megami Tensei - Persona 4" region: "NTSC-U" @@ -45733,7 +48150,7 @@ SLUS-21787: gameFixes: - EETimingHack SLUS-21788: - name: "Ar tonelico II - Melody Of Metafalica" + name: "Ar tonelico II - Melody of Metafalica" region: "NTSC-U" compat: 5 roundModes: @@ -45767,7 +48184,7 @@ SLUS-21796: name: "Dora the Explorer - Dora Saves the Snow Princess" region: "NTSC-U" SLUS-21797: - name: "Tak - Guardians Of Gross" + name: "Nickelodeon Tak and the Guardians of Gross" region: "NTSC-U" compat: 5 gsHWFixes: @@ -45780,6 +48197,9 @@ SLUS-21799: name: "Kingdom Hearts Re-Chain of Memories" region: "NTSC-U" compat: 5 + gsHWFixes: + autoFlush: 1 # Fixes double image. + halfPixelOffset: 1 # Fixes misaligned bloom. SLUS-21800: name: "Rock Band 2" region: "NTSC-U" @@ -45822,7 +48242,7 @@ SLUS-21808: mipmap: 1 halfPixelOffset: 1 # Reduces ghosting and vertical lines. SLUS-21809: - name: "Backyard Football 2009" + name: "Backyard Football '09" region: "NTSC-U" compat: 5 SLUS-21810: @@ -45840,7 +48260,7 @@ SLUS-21812: gsHWFixes: halfPixelOffset: 2 # Fixes lighting misalignment, still missing vibrant colors compared to Software. SLUS-21813: - name: "James Bond 007 - Quantum of Solace" + name: "007 - Quantum of Solace" region: "NTSC-U" compat: 5 SLUS-21814: @@ -45863,6 +48283,8 @@ SLUS-21818: name: "Spongebob SquarePants Featuring Nicktoons - Globs of Doom" region: "NTSC-U" compat: 5 + gsHWFixes: + mipmap: 2 # Fixes graphical errors. SLUS-21819: name: "High School Musical 3 - Senior Year Dance!" region: "NTSC-U" @@ -45873,6 +48295,8 @@ SLUS-21820: compat: 5 gsHWFixes: halfPixelOffset: 2 # Fixes ghosting and bloom misalignment. + cpuSpriteRenderBW: 1 # Rainbow spots if alone applied but needs cpuCLUTrender to look like software mode. + cpuCLUTRender: 1 # Blue horizontal lines on it's own but needs cpuSpriteRenderBW to look like software mode. SLUS-21821: name: "Pro Evolution Soccer 2009" region: "NTSC-U" @@ -45898,7 +48322,7 @@ SLUS-21830: region: "NTSC-U" compat: 3 SLUS-21831: - name: "Army Men - Soldiers Of Misfortune" + name: "Army Men - Soldiers of Misfortune" region: "NTSC-U" compat: 5 SLUS-21834: @@ -45919,11 +48343,12 @@ SLUS-21838: compat: 5 gsHWFixes: cpuFramebufferConversion: 1 # Fixes black with rainbow screen. + gpuPaletteConversion: 2 # Fixes micro stuttering. SLUS-21839: name: "Ski and Shoot" region: "NTSC-U" SLUS-21840: - name: "Madagascar - Escape 2 Africa" + name: "DreamWorks Madagascar 2 - Escape 2 Africa" region: "NTSC-U" compat: 5 SLUS-21841: @@ -45940,6 +48365,8 @@ SLUS-21843: compat: 5 roundModes: vuRoundMode: 0 # Crashes without. + gsHWFixes: + cpuCLUTRender: 1 # Fixes bad colours during play. SLUS-21844: name: "Bolt" region: "NTSC-U" @@ -46011,6 +48438,8 @@ SLUS-21862: compat: 5 gameFixes: - SoftwareRendererFMVHack # Fixes vertical lines in FMVs. + gsHWFixes: + cpuCLUTRender: 1 # Reduces the bloomy blur of characters. SLUS-21863: name: "Suzuki TT Superbikes - Real Road Racing Championship" region: "NTSC-U" @@ -46022,6 +48451,8 @@ SLUS-21865: name: "Guitar Hero 5" region: "NTSC-U" compat: 5 + roundModes: + vuRoundMode: 0 # Fixes SPS and VU size spam. SLUS-21866: name: "Guitar Hero - Smash Hits" region: "NTSC-U" @@ -46095,6 +48526,7 @@ SLUS-21881: compat: 5 gsHWFixes: cpuSpriteRenderBW: 2 # Fixes textures. + preloadFrameData: 1 # Fixes missing splash logo at boot. patches: 137C792E: content: |- @@ -46115,6 +48547,8 @@ SLUS-21885: name: "Indiana Jones and the Staff of Kings" region: "NTSC-U" compat: 5 + gsHWFixes: + halfPixelOffset: 1 # Fixes ghosting. SLUS-21886: name: "G.I. Joe - The Rise of Cobra" region: "NTSC-U" @@ -46188,6 +48622,8 @@ SLUS-21902: eeRoundMode: 1 clampModes: vuClampMode: 0 + gsHWFixes: + deinterlace: 8 # Game requires adaptive (or blend) tff deinterlacing instead of auto for the FMVs. SLUS-21904: name: "Teenage Mutant Ninja Turtles - Smash-Up" region: "NTSC-U" @@ -46228,6 +48664,8 @@ SLUS-21913: // This can be fixed on the GS side but the software renderer is impossible to fix. // So this patch corrects the issue on the EE side. patch=1,EE,00173328,word,3464fffd + gsHWFixes: + preloadFrameData: 1 # Fixes missing splash logo at boot. SLUS-21914: name: "NHL 2K10" region: "NTSC-U" @@ -46250,7 +48688,7 @@ SLUS-21918: region: "NTSC-U" compat: 5 SLUS-21919: - name: "Backyard Football 2010" + name: "Backyard Football '10" region: "NTSC-U" SLUS-21920: name: "Disney Sing It - Pop Hits" @@ -46406,6 +48844,8 @@ SLUS-28004: vuClampMode: 2 # Fixes water reflection. gameFixes: - EETimingHack # Fixes flickering graphics. + gsHWFixes: + cpuCLUTRender: 1 # Fixes shadows, object and enemy colours, platform transitions. SLUS-28006: name: "Burnout [Trade Demo]" region: "NTSC-U" @@ -46427,7 +48867,7 @@ SLUS-28012: name: "Tekken 4 [Trade Demo]" region: "NTSC-U" gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLUS-28013: name: "Dual Hearts [Trade Demo]" region: "NTSC-U" @@ -46443,6 +48883,9 @@ SLUS-28016: SLUS-28019: name: "Haven - Call of the King [Trade Demo]" region: "NTSC-U" + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLUS-28020: name: "Everquest Online Adventures [Beta Vol.1.0]" region: "NTSC-U" @@ -46452,9 +48895,13 @@ SLUS-28021: SLUS-28023: name: "dot hack - Infection Part 1 [Trade Demo]" region: "NTSC-U" + gsHWFixes: + halfPixelOffset: 1 # Sharpens world in far distances. SLUS-28025: name: "Disaster Report [Trade Demo]" region: "NTSC-U" + gsHWFixes: + autoFlush: 1 # Fixes incorrect blur effect. SLUS-28026: name: "Everquest Online Adventures [Beta Vol.3.0]" region: "NTSC-U" @@ -46479,7 +48926,9 @@ SLUS-28037: gameFixes: - EETimingHack # Fixes smoke effects. gsHWFixes: - halfPixelOffset: 1 # Fixes fog misalignment. + halfPixelOffset: 2 # Fixes fog misalignment and depth line. + autoFlush: 1 # Fixes sun going through objects. + preloadFrameData: 1 # Fixes missing sun and sky. SLUS-28039: name: "Rogue Ops [Trade Demo]" region: "NTSC-U" @@ -46494,7 +48943,7 @@ SLUS-28043: name: "Test Drive - Eve of Destruction [Trade Demo]" region: "NTSC-U" SLUS-28044: - name: "ChoroQ [Trade Demo]" + name: "Choro Q [Trade Demo]" region: "NTSC-U" SLUS-28045: name: "Shin Megami Tensei - Nocturne [Trade Demo]" @@ -46555,7 +49004,7 @@ SLUS-28068: name: "Shin Megami Tensei - Persona 3 FES [Trade Demo]" region: "NTSC-U" gsHWFixes: - mipmap: 1 + mipmap: 2 # Fixes flashing windows. SLUS-28069: name: "Shin Megami Tensei - Persona 4 [Trade Demo]" region: "NTSC-U" @@ -46568,6 +49017,8 @@ SLUS-29003: compat: 5 gameFixes: - DMABusyHack # Fixes broken half-bottom artifacts. + gsHWFixes: + gpuPaletteConversion: 2 # Fixes micro stuttering. SLUS-29004: name: "Unison & Dead or Alive 2 Hardcore [Demo]" region: "NTSC-U" @@ -46661,7 +49112,7 @@ SLUS-29034: name: "Tekken 4 [Regular Demo]" region: "NTSC-U" gsHWFixes: - alignSprite: 1 + alignSprite: 1 # Fixes vertical lines. SLUS-29035: name: "Eidos Demo Disc" region: "NTSC-U" @@ -46674,12 +49125,17 @@ SLUS-29037: SLUS-29038: name: "Haven - Call of the King [Regular Demo]" region: "NTSC-U" + gsHWFixes: + halfPixelOffset: 2 # Fixes ghosting. + alignSprite: 1 # Fixes vertical lines. SLUS-29040: name: "Dr. Muto [Demo]" region: "NTSC-U" SLUS-29042: name: "dot hack - Infection Part 1 [Regular Demo]" region: "NTSC-U" + gsHWFixes: + halfPixelOffset: 1 # Sharpens world in far distances. SLUS-29044: name: "Pride FC - Fighting Championships [Demo]" region: "NTSC-U" @@ -46753,7 +49209,6 @@ SLUS-29069: region: "NTSC-U" gsHWFixes: autoFlush: 1 # Reduces post-processing misalignment. - roundSprite: 2 # Reduces post-processing misalignment. SLUS-29070: name: "XIII [Demo]" region: "NTSC-U" @@ -46799,9 +49254,12 @@ SLUS-29082: textureInsideRT: 1 # Fixes the shape of shadows. autoFlush: 1 # Fixes water rendering. halfPixelOffset: 3 # Fixes bloom misalignment, needs this harsh offset for autoflush. + cpuFramebufferConversion: 1 # Fixes shield rendering. SLUS-29083: name: "Maximo vs. The Army of Zin [Demo]" region: "NTSC-U" + gsHWFixes: + halfPixelOffset: 2 # Fixes outlines around environmental objects. SLUS-29084: name: "dot hack - Quarantine Part 4 [Demo]" region: "NTSC-U" @@ -46813,6 +49271,10 @@ SLUS-29086: SLUS-29087: name: "Square Enix Sampler Disc Vol.1 - Drakengard Playable Demo" region: "NTSC-U" + clampModes: + eeClampMode: 3 # Characters are visible in-game. + gsHWFixes: + texturePreloading: 1 # Performs better with partial preload because it is slow on locations outside gameplay foremost. SLUS-29088: name: "Champions of Norrath - Realms of EverQuest [Demo]" region: "NTSC-U" @@ -46831,7 +49293,7 @@ SLUS-29093: clampModes: vuClampMode: 3 # Missing geometry with microVU. SLUS-29095: - name: "James Bond 007 - Everything or Nothing [Demo]" + name: "007 - Everything or Nothing [Demo]" region: "NTSC-U" SLUS-29096: name: "Final Night 2004 [Demo]" @@ -46850,6 +49312,8 @@ SLUS-29101: region: "NTSC-U" gameFixes: - XGKickHack # Fixes bad geometry. + gsHWFixes: + halfPixelOffset: 2 # Fixes depth lines. SLUS-29104: name: "Galactic Wrestling - Featuring Ultimate Muscle [Demo]" region: "NTSC-U" @@ -46869,16 +49333,20 @@ SLUS-29110: clampModes: vuClampMode: 3 # Fixes lighting on character models as caves and other locations don't turn mobs into glow-in-the-dark creatures by themselves. SLUS-29111: - name: "Asterix & Obelix XXL - Kick Buttix [Demo]" + name: "Asterix & Obelix - Kick Buttix [Demo]" region: "NTSC-U" SLUS-29113: name: "Burnout 3 [Demo]" region: "NTSC-U" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 3 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLUS-29116: name: "WWE SmackDown! vs. RAW [Public Beta Vol.1.0]" region: "NTSC-U" @@ -46935,8 +49403,12 @@ SLUS-29135: name: "NCAA March Madness 2005 [Demo]" region: "NTSC-U" SLUS-29137: - name: "Mercenaries [Demo]" + name: "Mercenaries - Playground of Destruction [Demo]" region: "NTSC-U" + gsHWFixes: + halfBottomOverride: 1 # Bottom screen has wrong colors. + autoFlush: 1 # Fixes missing lighting. + # halfPixelOffset: 1 # Fixes lighting misalignment. Do not enable this, it breaks a lot of graphics. SLUS-29138: name: "Punisher, The [Demo]" region: "NTSC-U" @@ -46945,6 +49417,8 @@ SLUS-29138: SLUS-29139: name: "Shadow of Rome [Demo]" region: "NTSC-U" + gsHWFixes: + halfPixelOffset: 2 # Fixes blurriness and misalgined garbage when upscaling. SLUS-29140: name: "MX vs. ATV Unleashed [Demo]" region: "NTSC-U" @@ -46958,7 +49432,8 @@ SLUS-29148: name: "Incredible Hulk, The - Ultimate Destruction [Demo]" region: "NTSC-U" gsHWFixes: - mipmap: 1 + mipmap: 2 # Mipmap + trilinear, fixes textures. + trilinearFiltering: 1 SLUS-29149: name: "Flipnic - Ultimate Pinball [Demo]" region: "NTSC-U" @@ -46976,10 +49451,14 @@ SLUS-29153: name: "Burnout Revenge [Demo]" region: "NTSC-U" clampModes: - vuClampMode: 0 # Fixes buggy lighting on certain objects. + vuClampMode: 0 # Fixes buggy lighting in the garage. gsHWFixes: halfPixelOffset: 2 # Fixes depth lines. - autoFlush: 1 # Fixes blur. + autoFlush: 1 # Fixes blur and obscures sun behind objects. + preloadFrameData: 1 # Makes sun appear. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLUS-29154: name: "NHL '06 [Demo]" region: "NTSC-U" @@ -46988,6 +49467,7 @@ SLUS-29155: region: "NTSC-U" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. + cpuCLUTRender: 1 # Fixes sun penetrating bridges (along with HPO special). SLUS-29156: name: "Marvel Nemesis - Rise of the Imperfects [Demo]" region: "NTSC-U" @@ -47020,12 +49500,12 @@ SLUS-29164: gsHWFixes: halfPixelOffset: 1 # Fixes bloom misalignment. SLUS-29167: - name: "James Bond 007 - From Russia with Love, Need for Speed - Most Wanted, SSX World Tour [Demo]" + name: "007 - From Russia with Love, Need for Speed - Most Wanted, SSX World Tour [Demo]" region: "NTSC-U" gsHWFixes: halfPixelOffset: 2 # Fixes blurriness. SLUS-29168: - name: "James Bond 007 - From Russia with Love [Demo]" + name: "007 - From Russia with Love [Demo]" region: "NTSC-U" SLUS-29169: name: "Resident Evil 4 [Demo]" @@ -47072,6 +49552,8 @@ SLUS-29180: gsHWFixes: autoFlush: 1 # Properly diffuses light instead of strips of light. roundSprite: 1 # Fixes lighting misalignment such as the street poles and the sun. + mipmap: 2 # Fixes over sharpening. + trilinearFiltering: 1 # Smoothes out mipmapping. SLUS-29183: name: "Fight Night - Round 3 [Demo]" region: "NTSC-U" @@ -47080,6 +49562,9 @@ SLUS-29185: region: "NTSC-U" gameFixes: - BlitInternalFPSHack # Fixes internal FPS detection. + gsHWFixes: + cpuSpriteRenderBW: 2 # Fixes some bad textures. + cpuCLUTRender: 1 # Fixes the rest of the bad textures. SLUS-29188: name: "Steambot Chronicles [Regular Demo]" region: "NTSC-U" @@ -47145,9 +49630,12 @@ SLUS-97133: gsHWFixes: textureInsideRT: 1 texturePreloading: 1 # Performs much better with partial preload. + halfPixelOffset: 2 # Fixes outlines around characters. SLUS-97405: name: "ATV Offroad Fury 3 [Greatest Hits]" region: "NTSC-U" + speedHacks: + MTVUSpeedHack: 0 # Increases FPS drastically. SLUS-97657: name: "MLB 11 - The Show" region: "NTSC-U" @@ -47183,6 +49671,9 @@ TCES-52042: TCES-52389: name: "World Rally Championship 4 Beta Trial Code" region: "PAL-E" + gsHWFixes: + autoFlush: 1 # Fixes car shadows. + roundSprite: 1 # Fixes misalgined text. TCES-52456: name: "Ratchet and Clank 3 Beta Trial Code" region: "PAL-E" @@ -47191,6 +49682,8 @@ TCES-52456: gsHWFixes: mipmap: 1 # Fixes garbage textures in the distance. disablePartialInvalidation: 1 # Prevents the situation that a level (Aquatos) doesn't render characters and geometry. + halfPixelOffset: 2 # Fixes misaligned bloom. + autoFlush: 1 # Helps fix misaligned bloom. TCES-52582: name: "Everybody's Golf 4 Beta Trial Code" region: "PAL-E" @@ -47208,7 +49701,8 @@ TCES-53286: compat: 5 gsHWFixes: roundSprite: 1 # Fix line in the sky. - textureInsideRT: 1 + textureInsideRT: 1 # Fixes broken character models. + autoFlush: 1 # Fixes lighting. preloadFrameData: 1 # Fixes Sony splash at boot. TCPS-10058: name: "Densha de Go! Shinkansen [with Controller]" @@ -47219,6 +49713,11 @@ TCPS-10068: TCPS-10074: name: "Space Invaders 25th Anniversary Bundle" region: "NTSC-J" +TCPS-10075: + name: "Takahashi Naoko no Marathon Shiyou yo!" + region: "NTSC-J" + gsHWFixes: + preloadFrameData: 1 # Fixes missing text. TCPS-10084: name: "Zero Shinkikan Josentoki" region: "NTSC-J" @@ -47322,7 +49821,7 @@ TLES-52149: name: "Splinter Cell - Pandora Tomorrow Beta Trial Code" region: "PAL-E" TLES-52339: - name: "Crash ‘N’ Burn Beta Trial Code" + name: "Crash 'N' Burn Beta Trial Code" region: "PAL-E" TLES-52707: name: "Monster Hunter Beta Trial Code" diff --git a/bin/resources/cheats_ni.zip b/bin/resources/cheats_ni.zip deleted file mode 100644 index f034765359..0000000000 Binary files a/bin/resources/cheats_ni.zip and /dev/null differ diff --git a/bin/resources/cheats_ws.zip b/bin/resources/cheats_ws.zip deleted file mode 100644 index b41ec10ad8..0000000000 Binary files a/bin/resources/cheats_ws.zip and /dev/null differ diff --git a/bin/resources/fullscreenui/applications-system.png b/bin/resources/fullscreenui/applications-system.png new file mode 100644 index 0000000000..2007dbb7d6 Binary files /dev/null and b/bin/resources/fullscreenui/applications-system.png differ diff --git a/bin/resources/fullscreenui/media-cdrom.png b/bin/resources/fullscreenui/media-cdrom.png new file mode 100644 index 0000000000..a85334c7ec Binary files /dev/null and b/bin/resources/fullscreenui/media-cdrom.png differ diff --git a/bin/resources/fullscreenui/placeholder.png b/bin/resources/fullscreenui/placeholder.png new file mode 100644 index 0000000000..064082d2c8 Binary files /dev/null and b/bin/resources/fullscreenui/placeholder.png differ diff --git a/bin/resources/game_controller_db.txt b/bin/resources/game_controller_db.txt index 3c2df5059d..95c8330b6a 100644 --- a/bin/resources/game_controller_db.txt +++ b/bin/resources/game_controller_db.txt @@ -11,7 +11,7 @@ 03000000d0160000600a000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, 03000000c82d00000031000000000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000531000000000000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000951000000000000,8BitDo Dogbone Modkit,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows, +03000000c82d00000951000000000000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, 03000000008000000210000000000000,8BitDo F30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 030000003512000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000c82d00001028000000000000,8BitDo F30 Arcade Joystick,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, @@ -19,14 +19,17 @@ 03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001251000000000000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001151000000000000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000150000000000000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000151000000000000,8BitDo M30 Modkit,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000451000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, 03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d0000e002000000000000,8BitDo N30,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b6,platform:Windows, -03000000c82d00000451000000000000,8BitDo N30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,start:b11,platform:Windows, 03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, @@ -37,7 +40,8 @@ 03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000203800000900000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000851000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000361000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000660000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, @@ -45,7 +49,7 @@ 03000000c82d00000231000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000331000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000431000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00002867000000000000,8BitDo S30 Modkit,a:b0,b:b1,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00002867000000000000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b10,x:b3,y:b4,platform:Windows, 03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, @@ -54,17 +58,20 @@ 03000000c82d00003028000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 030000003512000020ab000000000000,8BitDo SN30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000351000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a2,rightshoulder:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000351000000000000,8BitDo SN30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001230000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, 03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, @@ -96,6 +103,8 @@ 03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000050b00000579000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000050b00000679000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 03000000d6200000e557000000000000,Batarang PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, @@ -120,6 +129,7 @@ 030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, 03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f10e000000000000,Brook PS2 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000310c000000000000,Brook Super Converter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000d81d00000b00000000000000,Buffalo BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, 030000005b1c00002400000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, @@ -208,6 +218,7 @@ 03000000300f00000b01000000000000,GGE909 Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, 03000000f0250000c283000000000000,Gioteck PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f025000031c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 03000000f0250000c383000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 03000000f0250000c483000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 030000004f04000026b3000000000000,GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, @@ -234,14 +245,14 @@ 030000000d0f00005100000000000000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00008600000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000000d0f0000ba00000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008800000000000000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +030000000d0f00008700000000000000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00001000000000000000,Hori Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00003200000000000000,Hori Fightstick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000c000000000000000,Hori Fightstick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000000d0f00000d00000000000000,Hori Fightstick EX2,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, 030000000d0f00003701000000000000,Hori Fightstick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Windows, 030000000d0f00004000000000000000,Hori Fightstick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008700000000000000,Hori Fightstick Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008800000000000000,Hori Fightstick Mini 4,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, 030000000d0f00002100000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00002700000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows, @@ -273,7 +284,7 @@ 030000000d0f00005c00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000af00000000000000,Hori Real Arcade Pro VHS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00001b00000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b07,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b08,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows, +03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows, 030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -287,7 +298,8 @@ 030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000008f0e00001330000000000000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Windows, +03000000242e00000b20000000000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Windows, +03000000242e0000ff0b000000000000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Windows, 03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows, 03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows, 03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, @@ -360,6 +372,8 @@ 030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, 030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, +030000008f0e00001330000000000000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, @@ -367,8 +381,9 @@ 03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, 0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows, 030000008f0e00001030000000000000,Mayflash Sega Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, -0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, 03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, 03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000790000002418000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows, @@ -432,6 +447,8 @@ 03000000790000002201000000000000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 030000006f0e00008501000000000000,PDP Fightpad Pro,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows, 030000006f0e00000901000000000000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows, +03000000666600006706000000000000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, 03000000e30500009605000000000000,PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000632500002306000000000000,PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, @@ -439,7 +456,7 @@ 03000000d9040000160f000000000000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, 030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, 03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0300000062060000d570000000000000,PowerA PS3 Contoller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +0300000062060000d570000000000000,PowerA PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000d620000013a7000000000000,PowerA Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, 03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -453,9 +470,9 @@ 03000000250900000088000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000250900006888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b6,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000666600006706000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, 030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000151a00006222000000000000,PS2 Dual Plus Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000120a00000100000000000000,PS3 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000120c00001307000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c00001cf1000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, @@ -482,7 +499,6 @@ 03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000f10e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, @@ -494,7 +510,8 @@ 030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000f20d000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 03000000830500005020000000000000,PSX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Windows, 03000000300f00000111000000000000,Qanba 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000300f00000211000000000000,Qanba 2P,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, @@ -538,7 +555,6 @@ 03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000632500008005000000010000,Redgear,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,guide:b12,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X, 03000000921200004547000000000000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b6,x:b3,y:b4,platform:Windows, 03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, 03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, @@ -648,6 +664,7 @@ 030000004f04000003d0000000000000,ThrustMaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000004f04000009d0000000000000,ThrustMaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000006d04000088ca000000000000,Thunderpad,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000666600000288000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000666600000488000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 030000004f04000007d0000000000000,TMini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000571d00002100000000000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Windows, @@ -666,7 +683,6 @@ 03000000300f00000701000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, 03000000341a00002308000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 03000000666600000188000000000000,USB Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000666600000288000000000000,USB Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 030000006b1400000203000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 03000000790000000a00000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, 03000000b404000081c6000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, @@ -730,22 +746,32 @@ 03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 03000000450c00002043000000000000,Xeox SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000172700004431000000000000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000172700004431000000000000,Xiaomi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000172700003350000000000000,Xiaomi XMGP01YM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000bc2000005060000000000000,Xiaomi XMGP01YM,+lefty:+a2,+righty:+a5,-lefty:-a1,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, 03000000786901006e70000000000000,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000007d0400000340000000000000,Xterminator Digital Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:-a4,lefttrigger:+a4,leftx:a0,lefty:a1,paddle1:b7,paddle2:b6,rightshoulder:b5,rightstick:b9,righttrigger:b2,rightx:a3,righty:a5,start:b8,x:b3,y:b4,platform:Windows, 03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000120c00000500000000000000,Zeroplus Adapter,a:b2,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, 03000000120c0000101e000000000000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, # Mac OS X 030000008f0e00000300000009010000,2 In 1 Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000c82d00000031000001000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00000531000000020000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, 03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001251000000020000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001151000000020000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000a30c00002400000006020000,8BitDo M30,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,guide:b9,leftshoulder:b6,lefttrigger:b5,rightshoulder:b4,righttrigger:b7,start:b8,x:b3,y:b0,platform:Mac OS X, +03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00005106000000010000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,lefttrigger:a5,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, 03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, @@ -754,19 +780,25 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000022000000090000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000190000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000660000000020000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000131000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000231000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000331000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000431000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Mac OS X, 03000000102800000900000000000000,8BitDo SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00001290000001000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00004028000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000a00500003232000009010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, @@ -776,6 +808,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000a30c00002700000003030000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000a30c00002800000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000050b00000579000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b42,paddle1:b9,paddle2:b11,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b23,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, 03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, 03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -786,6 +820,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X, 03000000a306000022f6000001030000,Cyborg V3 Rumble Pad PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000791d00000103000009010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006e0500000720000010020000,Elecom JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Mac OS X, 030000006f0e00008401000003010000,Faceoff Premiere Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle3:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Mac OS X, @@ -804,6 +839,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008800000000010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X, 030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -811,7 +848,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000008f0e00001330000011010000,HuiJia SNES Controller,a:b4,b:b2,back:b16,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b12,rightshoulder:b14,start:b18,x:b6,y:b0,platform:Mac OS X, +03000000242e0000ff0b000000010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Mac OS X, 03000000790000004e95000000010000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Mac OS X, 03000000830500006020000000000000,iBuffalo Gamepad,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, 03000000ef0500000300000000020000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X, @@ -829,10 +866,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000008f0e00001330000011010000,Mayflash Controller Adapter,a:b2,b:b4,back:b16,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b12,lefttrigger:b16,leftx:a0,lefty:a2,rightshoulder:b14,rightx:a6~,righty:a4,start:b18,x:b0,y:b6,platform:Mac OS X, 03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, 03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, @@ -859,6 +897,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000550900001472000025050000,NVIDIA Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X, 030000006f0e00000901000002010000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000666600006706000088020000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X, 030000004c050000da0c000000010000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, 030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -870,8 +909,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 03000000222c00000225000000010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000222c00000020000000010000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, @@ -883,6 +924,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, 030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, 0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000632500008005000000010000,Redgear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 030000000d0f0000c100000072050000,Retro Bit Sega Genesis 6B Controller,a:b2,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b8,rightshoulder:b6,righttrigger:b7,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000921200004547000000020000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b2,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,lefttrigger:b14,rightshoulder:b10,righttrigger:b4,start:b12,x:b6,y:b8,platform:Mac OS X, 03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -907,14 +949,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, 05000000484944204465766963650000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, 050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, -050000004e696d6275732b008b000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, -05000000556e6b6e6f776e2048494400,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, 03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, 03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, 030000000d0f0000f600000000010000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000001c18000003100000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, 030000004f0400000ed0000000020000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, @@ -924,6 +965,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000571d00002000000021000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X, 030000005f140000c501000000020000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, +03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, @@ -942,23 +984,33 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000013050000,Xbox One Controller,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X, 03000000c62400003a54000000000000,Xbox One PowerA Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000120c0000100e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000120c0000101e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000ff1100003133000007010000,GameWare PC Control Pad,a:b2,b:b1,x:b3,y:b0,back:b10,start:b11,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Mac OS X, # Linux 030000005e0400008e02000020010000,8BitDo Adapter,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c82d00000031000011010000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, 03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001251000011010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001151000011010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Linux, 05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, 03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -968,12 +1020,15 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000431000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Linux, 05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 030000003512000012ab000010010000,8BitDo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, @@ -981,15 +1036,21 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, 05000000102800000900000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00003028000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001030000011010000,8BitDo 8BitDo Pro 2,a:b1,b:b0,x:b4,y:b3,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux, 05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux, +03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, 05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, @@ -1008,13 +1069,15 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 03000000a30c00002700000011010000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 03000000a30c00002800000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, -05000000050b00000045000031000000,Asus Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, -05000000050b00000045000040000000,Asus Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, -03000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -03000000503200000110000011010000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -05000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -05000000503200000110000044010000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, -05000000503200000110000046010000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, +05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +03000000050b00000579000011010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b36,paddle1:b52,paddle2:b53,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b21,paddle1:b22,paddle2:b23,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000503200000110000000000000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +03000000503200000110000011010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000000000000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000044010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000046010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, 03000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, 03000000503200000210000011010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, 05000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, @@ -1026,10 +1089,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000c31100000791000011010000,Be1 GC101 Controller 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000bc2000004d50000011010000,BEITONG A1T2 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000bc2000000055000001000000,BETOP AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b30,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000666600006706000000010000,Boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, 03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -1047,6 +1110,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux, 03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, @@ -1056,6 +1120,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +190000004b4800000010000000010000,GO-Advance Controller,a:b1,b:b0,back:b10,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,leftshoulder:b4,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b13,start:b15,x:b2,y:b3,platform:Linux, +190000004b4800000010000001010000,GO-Advance Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b13,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b16,righttrigger:b15,start:b17,x:b2,y:b3,platform:Linux, +190000004b4800000011000000010000,GO-Super Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b2,y:b3,platform:Linux, 03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -1075,9 +1142,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00008800000011010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 03000000ad1b000003f5000033050000,Hori Fightstick VX,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b8,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, -030000000d0f00004d00000011010000,HORI Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00004d00000011010000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux, 030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -1092,9 +1161,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000000d0f0000c100000011010000,Horipad S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -050000000d0f0000f600000001000000,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, -030000008f0e00001330000010010000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Linux, +05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux, +03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux, 03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, 050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, @@ -1146,6 +1216,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000380700003847000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +030000008f0e00001330000010010000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Linux, 03000000790000004318000010010000,Mayflash GameCube Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, @@ -1195,20 +1266,21 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000790000004518000010010000,Nexilux GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Linux, 060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +030000009b2800008000000020020000,Nintendo Classic Controller,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux, 030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux, 03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux, -060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, -060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, -050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux, 03000000d620000013a7000011010000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000d620000011a7000011010000,Nintendo Switch PowerA Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, -050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, 050000007e0500000720000001800000,Nintendo Switch Right Joy-Con,a:b1,b:b2,back:b9,leftshoulder:b4,leftstick:b10,leftx:a1~,lefty:a0,rightshoulder:b6,start:b8,x:b0,y:b3,platform:Linux, 05000000010000000100000003000000,Nintendo Wii Remote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +050000007e0500003003000001000000,Nintendo Wii U Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, 030000000d0500000308000010010000,Nostromo n45 Dual Analog,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux, 050000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Linux, 050000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, @@ -1216,14 +1288,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, 05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, 03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -19000000010000000100000001010000,odroidgo2 joypad,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux, -19000000010000000200000011000000,odroidgo2 joypad v11,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux, +19000000010000000100000001010000,ODROID Go 2,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux, +19000000010000000200000011000000,ODROID Go 2,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux, 03000000c0160000dc27000001010000,OnyxSoft Dual JoyDivision,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:Linux, 05000000362800000100000002010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, 05000000362800000100000003010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, 05000000362800000100000004010000,OUYA Controller,a:b0,b:b3,back:b14,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,start:b16,x:b1,y:b2,platform:Linux, 03000000830500005020000010010000,Padix Rockfire PlayStation Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux, -03000000790000001c18000011010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000ff1100003133000010010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000006f0e0000b802000001010000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006f0e0000b802000013020000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1238,18 +1309,20 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006f0e00000901000011010000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000666600006706000000010000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, 030000004c050000da0c000011010000,PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 03000000d9040000160f000000010000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, 030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, 03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000d62000000220000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, 03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c62400001a54000001010000,PowerA Xbox One Mini Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, +03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, @@ -1280,10 +1353,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, 050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 030000004c050000e60c000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000f20d000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 050000004c050000e60c000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux, 03000000222c00000225000011010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, @@ -1295,7 +1370,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, 030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, 030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000008916000000fd000024010000,Razer Onza Tournament Edition,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, @@ -1310,6 +1384,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, 0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux, +190000004b4800000111000000010000,RetroGame Joypad,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux, 0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, 00000000526574726f53746f6e653200,RetroStone 2 Controller,a:b1,b:b0,back:b10,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,platform:Linux, @@ -1356,6 +1431,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, 05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, 05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000512000010010000,Steam Deck,a:b3,b:b4,back:b11,dpdown:b17,dpleft:b18,dpright:b19,dpup:b16,guide:b13,leftshoulder:b7,leftstick:b14,lefttrigger:a9,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b15,righttrigger:a8,rightx:a2,righty:a3,start:b12,x:b5,y:b6,platform:Linux, 03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b10,guide:b11,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Linux, 03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1367,9 +1443,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, 0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, 030000008f0e00000d31000010010000,SZMY Power 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000457500000401000011010000,SZMY Power DS4 Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 03000000457500002211000010010000,SZMY Power Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000008f0e00001431000010010000,SZMY Power PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux, +03000000790000001c18000011010000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000004f04000015b3000001010000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, 030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, 030000004f04000020b3000010010000,Thrustmaster Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, @@ -1390,6 +1468,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000d814000007cd000011010000,Toodles 2008 Chimp PC PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, 030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000680a00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +03000000780300000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +03000000e00d00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +03000000f00600000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, 030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, 03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, @@ -1398,6 +1480,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006f0e00000302000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 030000006f0e00000702000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +05000000434f4d4d414e440000000000,VX Gaming Command Series,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 0000000058626f782033363020576900,Xbox 360 Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, 030000005e0400001907000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1421,8 +1504,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 060000005e040000120b000007050000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000220b000013050000,Xbox One Elite 2 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000ea0200000d050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000120b000005050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1432,8 +1517,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000007050000,Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000130b000007050000,Xbox Series X Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 050000005e040000130b000011050000,Xbox Series X Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -050000005e040000130b000007050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000200b000013050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, 03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, diff --git a/bin/resources/shaders/common/ffx_a.h b/bin/resources/shaders/common/ffx_a.h new file mode 100644 index 0000000000..6e9af9fc31 --- /dev/null +++ b/bin/resources/shaders/common/ffx_a.h @@ -0,0 +1,2412 @@ +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// [A] SHADER PORTABILITY 1.20190530 +// +//============================================================================================================================== +// LICENSE +// ======= +// Copyright (c) 2017-2019 Advanced Micro Devices, Inc. All rights reserved. +// Copyright (c) <2014> +// ------- +// 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. +//------------------------------------------------------------------------------------------------------------------------------ +// ABOUT +// ===== +// Common central point for high-level shading language and C portability for various shader headers. +//------------------------------------------------------------------------------------------------------------------------------ +// DEFINES +// ======= +// A_CPU ..... Include the CPU related code. +// A_GPU ..... Include the GPU related code. +// A_GLSL .... Using GLSL. +// A_HLSL .... Using HLSL. +// A_GCC ..... Using a GCC compatible compiler (else assume MSVC compatible compiler by default). +// ======= +// A_BYTE .... Support 8-bit integer. +// A_HALF .... Support 16-bit integer and floating point. +// A_LONG .... Support 64-bit integer. +// A_DUBL .... Support 64-bit floating point. +// ======= +// A_WAVE .... Support wave-wide operations. +//------------------------------------------------------------------------------------------------------------------------------ +// To get #include "ffx_a.h" working in GLSL use '#extension GL_GOOGLE_include_directive:require'. +//------------------------------------------------------------------------------------------------------------------------------ +// SIMPLIFIED TYPE SYSTEM +// ====================== +// - All ints will be unsigned with exception of when signed is required. +// - Type naming simplified and shortened "A<#components>", +// - H = 16-bit float (half) +// - F = 32-bit float (float) +// - D = 64-bit float (double) +// - P = 1-bit integer (predicate, not using bool because 'B' is used for byte) +// - B = 8-bit integer (byte) +// - W = 16-bit integer (word) +// - U = 32-bit integer (unsigned) +// - L = 64-bit integer (long) +// - Using "AS<#components>" for signed when required. +//------------------------------------------------------------------------------------------------------------------------------ +// TODO +// ==== +// - Make sure 'ALerp*(a,b,m)' does 'b*m+(-a*m+a)' (2 ops). +// - Add subgroup ops. +//------------------------------------------------------------------------------------------------------------------------------ +// CHANGE LOG +// ========== +// 20190531 - Fixed changed to llabs() because long is int on Windows. +// 20190530 - Updated for new CPU/GPU portability. +// 20190528 - Fix AU1_AH2_x() on HLSL (had incorrectly swapped x and y), fixed asuint() cases. +// 20190527 - Added min3/max3 for low precision for HLSL. +// 20190526 - Updated with half approximations, added ARsq*(), and ASat*() for CPU. +// 20190519 - Added more approximations. +// 20190514 - Added long conversions. +// 20190513 - Added the real BFI moved the other one to ABfiM(). +// 20190507 - Added extra remap useful for 2D reductions. +// 20190507 - Started adding wave ops, add parabolic sin/cos. +// 20190505 - Added ASigned*() and friends, setup more auto-typecast, GLSL extensions, etc. +// 20190504 - Added min3/max3 for 32-bit integers. +// 20190503 - Added type reinterpretation for half. +// 20190416 - Added min3/max3 for half. +// 20190405 - Misc bug fixing. +// 20190404 - Cleaned up color conversion code. Switched "splat" to shorter naming "type_". Misc bug fixing. +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// COMMON +//============================================================================================================================== +#define A_2PI 6.28318530718 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// CPU +// +// +//============================================================================================================================== +// Requires standard C types: stdint.h +// Requires a collection of standard math intrinsics. +// - Requires VS2013 when not using GCC to get exp2() and log2(). +// - https://blogs.msdn.microsoft.com/vcblog/2013/07/19/c99-library-support-in-visual-studio-2013/ +//------------------------------------------------------------------------------------------------------------------------------ +// This provides a minimum subset of functionality compared to the GPU parts. +//============================================================================================================================== +#ifdef A_CPU + // Supporting user defined overrides. + #ifndef A_RESTRICT + #define A_RESTRICT __restrict + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifndef A_STATIC + #define A_STATIC static + #endif +//------------------------------------------------------------------------------------------------------------------------------ + // Same types across CPU and GPU. + // Predicate uses 32-bit integer (C friendly bool). + typedef uint32_t AP1; + typedef float AF1; + typedef double AD1; + typedef uint8_t AB1; + typedef uint16_t AW1; + typedef uint32_t AU1; + typedef uint64_t AL1; + typedef int8_t ASB1; + typedef int16_t ASW1; + typedef int32_t ASU1; + typedef int64_t ASL1; +//------------------------------------------------------------------------------------------------------------------------------ + #define AD1_(a) ((AD1)(a)) + #define AF1_(a) ((AF1)(a)) + #define AL1_(a) ((AL1)(a)) + #define AU1_(a) ((AU1)(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ASL1_(a) ((ASL1)(a)) + #define ASU1_(a) ((ASU1)(a)) +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AU1_AF1(AF1 a){union{AF1 f;AU1 u;}bits;bits.f=a;return bits.u;} +//------------------------------------------------------------------------------------------------------------------------------ + #define A_TRUE 1 + #define A_FALSE 0 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// CPU/GPU PORTING +// +//------------------------------------------------------------------------------------------------------------------------------ +// Hackary to get CPU and GPU to share all setup code, without duplicate code paths. +// Unfortunately this is the level of "ugly" that is required since the languages are very different. +// This uses a lower-case prefix for special vector constructs. +// - In C restrict pointers are used. +// - In the shading language, in/inout/out arguments are used. +// This depends on the ability to access a vector value in both languages via array syntax (aka color[2]). +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR ARGUMENT/RETURN/INITIALIZATION PORTABILITY +//============================================================================================================================== + #define retAD2 AD1 *A_RESTRICT + #define retAD3 AD1 *A_RESTRICT + #define retAD4 AD1 *A_RESTRICT + #define retAF2 AF1 *A_RESTRICT + #define retAF3 AF1 *A_RESTRICT + #define retAF4 AF1 *A_RESTRICT + #define retAL2 AL1 *A_RESTRICT + #define retAL3 AL1 *A_RESTRICT + #define retAL4 AL1 *A_RESTRICT + #define retAU2 AU1 *A_RESTRICT + #define retAU3 AU1 *A_RESTRICT + #define retAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define inAD2 AD1 *A_RESTRICT + #define inAD3 AD1 *A_RESTRICT + #define inAD4 AD1 *A_RESTRICT + #define inAF2 AF1 *A_RESTRICT + #define inAF3 AF1 *A_RESTRICT + #define inAF4 AF1 *A_RESTRICT + #define inAL2 AL1 *A_RESTRICT + #define inAL3 AL1 *A_RESTRICT + #define inAL4 AL1 *A_RESTRICT + #define inAU2 AU1 *A_RESTRICT + #define inAU3 AU1 *A_RESTRICT + #define inAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define inoutAD2 AD1 *A_RESTRICT + #define inoutAD3 AD1 *A_RESTRICT + #define inoutAD4 AD1 *A_RESTRICT + #define inoutAF2 AF1 *A_RESTRICT + #define inoutAF3 AF1 *A_RESTRICT + #define inoutAF4 AF1 *A_RESTRICT + #define inoutAL2 AL1 *A_RESTRICT + #define inoutAL3 AL1 *A_RESTRICT + #define inoutAL4 AL1 *A_RESTRICT + #define inoutAU2 AU1 *A_RESTRICT + #define inoutAU3 AU1 *A_RESTRICT + #define inoutAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define outAD2 AD1 *A_RESTRICT + #define outAD3 AD1 *A_RESTRICT + #define outAD4 AD1 *A_RESTRICT + #define outAF2 AF1 *A_RESTRICT + #define outAF3 AF1 *A_RESTRICT + #define outAF4 AF1 *A_RESTRICT + #define outAL2 AL1 *A_RESTRICT + #define outAL3 AL1 *A_RESTRICT + #define outAL4 AL1 *A_RESTRICT + #define outAU2 AU1 *A_RESTRICT + #define outAU3 AU1 *A_RESTRICT + #define outAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define varAD2(x) AD1 x[2] + #define varAD3(x) AD1 x[3] + #define varAD4(x) AD1 x[4] + #define varAF2(x) AF1 x[2] + #define varAF3(x) AF1 x[3] + #define varAF4(x) AF1 x[4] + #define varAL2(x) AL1 x[2] + #define varAL3(x) AL1 x[3] + #define varAL4(x) AL1 x[4] + #define varAU2(x) AU1 x[2] + #define varAU3(x) AU1 x[3] + #define varAU4(x) AU1 x[4] +//------------------------------------------------------------------------------------------------------------------------------ + #define initAD2(x,y) {x,y} + #define initAD3(x,y,z) {x,y,z} + #define initAD4(x,y,z,w) {x,y,z,w} + #define initAF2(x,y) {x,y} + #define initAF3(x,y,z) {x,y,z} + #define initAF4(x,y,z,w) {x,y,z,w} + #define initAL2(x,y) {x,y} + #define initAL3(x,y,z) {x,y,z} + #define initAL4(x,y,z,w) {x,y,z,w} + #define initAU2(x,y) {x,y} + #define initAU3(x,y,z) {x,y,z} + #define initAU4(x,y,z,w) {x,y,z,w} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS +//------------------------------------------------------------------------------------------------------------------------------ +// TODO +// ==== +// - Replace transcendentals with manual versions. +//============================================================================================================================== + #ifdef A_GCC + A_STATIC AD1 AAbsD1(AD1 a){return __builtin_fabs(a);} + A_STATIC AF1 AAbsF1(AF1 a){return __builtin_fabsf(a);} + A_STATIC AU1 AAbsSU1(AU1 a){return AU1_(__builtin_abs(ASU1_(a)));} + A_STATIC AL1 AAbsSL1(AL1 a){return AL1_(__builtin_labs(ASL1_(a)));} + #else + A_STATIC AD1 AAbsD1(AD1 a){return fabs(a);} + A_STATIC AF1 AAbsF1(AF1 a){return fabsf(a);} + A_STATIC AU1 AAbsSU1(AU1 a){return AU1_(abs(ASU1_(a)));} + A_STATIC AL1 AAbsSL1(AL1 a){return AL1_(llabs(ASL1_(a)));} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ACosD1(AD1 a){return __builtin_cos(a);} + A_STATIC AF1 ACosF1(AF1 a){return __builtin_cosf(a);} + #else + A_STATIC AD1 ACosD1(AD1 a){return cos(a);} + A_STATIC AF1 ACosF1(AF1 a){return cosf(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ADotD2(inAD2 a,inAD2 b){return a[0]*b[0]+a[1]*b[1];} + A_STATIC AD1 ADotD3(inAD3 a,inAD3 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];} + A_STATIC AD1 ADotD4(inAD4 a,inAD4 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];} + A_STATIC AF1 ADotF2(inAF2 a,inAF2 b){return a[0]*b[0]+a[1]*b[1];} + A_STATIC AF1 ADotF3(inAF3 a,inAF3 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];} + A_STATIC AF1 ADotF4(inAF4 a,inAF4 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 AExp2D1(AD1 a){return __builtin_exp2(a);} + A_STATIC AF1 AExp2F1(AF1 a){return __builtin_exp2f(a);} + #else + A_STATIC AD1 AExp2D1(AD1 a){return exp2(a);} + A_STATIC AF1 AExp2F1(AF1 a){return exp2f(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 AFloorD1(AD1 a){return __builtin_floor(a);} + A_STATIC AF1 AFloorF1(AF1 a){return __builtin_floorf(a);} + #else + A_STATIC AD1 AFloorD1(AD1 a){return floor(a);} + A_STATIC AF1 AFloorF1(AF1 a){return floorf(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ALerpD1(AD1 a,AD1 b,AD1 c){return b*c+(-a*c+a);} + A_STATIC AF1 ALerpF1(AF1 a,AF1 b,AF1 c){return b*c+(-a*c+a);} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ALog2D1(AD1 a){return __builtin_log2(a);} + A_STATIC AF1 ALog2F1(AF1 a){return __builtin_log2f(a);} + #else + A_STATIC AD1 ALog2D1(AD1 a){return log2(a);} + A_STATIC AF1 ALog2F1(AF1 a){return log2f(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 AMaxD1(AD1 a,AD1 b){return a>b?a:b;} + A_STATIC AF1 AMaxF1(AF1 a,AF1 b){return a>b?a:b;} + A_STATIC AL1 AMaxL1(AL1 a,AL1 b){return a>b?a:b;} + A_STATIC AU1 AMaxU1(AU1 a,AU1 b){return a>b?a:b;} +//------------------------------------------------------------------------------------------------------------------------------ + // These follow the convention that A integer types don't have signage, until they are operated on. + A_STATIC AL1 AMaxSL1(AL1 a,AL1 b){return (ASL1_(a)>ASL1_(b))?a:b;} + A_STATIC AU1 AMaxSU1(AU1 a,AU1 b){return (ASU1_(a)>ASU1_(b))?a:b;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 AMinD1(AD1 a,AD1 b){return a>ASL1_(b));} + A_STATIC AU1 AShrSU1(AU1 a,AU1 b){return AU1_(ASU1_(a)>>ASU1_(b));} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ASinD1(AD1 a){return __builtin_sin(a);} + A_STATIC AF1 ASinF1(AF1 a){return __builtin_sinf(a);} + #else + A_STATIC AD1 ASinD1(AD1 a){return sin(a);} + A_STATIC AF1 ASinF1(AF1 a){return sinf(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ASqrtD1(AD1 a){return __builtin_sqrt(a);} + A_STATIC AF1 ASqrtF1(AF1 a){return __builtin_sqrtf(a);} + #else + A_STATIC AD1 ASqrtD1(AD1 a){return sqrt(a);} + A_STATIC AF1 ASqrtF1(AF1 a){return sqrtf(a);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS - DEPENDENT +//============================================================================================================================== + A_STATIC AD1 AFractD1(AD1 a){return a-AFloorD1(a);} + A_STATIC AF1 AFractF1(AF1 a){return a-AFloorF1(a);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 APowD1(AD1 a,AD1 b){return AExp2D1(b*ALog2D1(a));} + A_STATIC AF1 APowF1(AF1 a,AF1 b){return AExp2F1(b*ALog2F1(a));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ARsqD1(AD1 a){return ARcpD1(ASqrtD1(a));} + A_STATIC AF1 ARsqF1(AF1 a){return ARcpF1(ASqrtF1(a));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ASatD1(AD1 a){return AMinD1(1.0,AMaxD1(0.0,a));} + A_STATIC AF1 ASatF1(AF1 a){return AMinF1(1.0f,AMaxF1(0.0f,a));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR OPS +//------------------------------------------------------------------------------------------------------------------------------ +// These are added as needed for production or prototyping, so not necessarily a complete set. +// They follow a convention of taking in a destination and also returning the destination value to increase utility. +//============================================================================================================================== + A_STATIC retAD2 opAAbsD2(outAD2 d,inAD2 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);return d;} + A_STATIC retAD3 opAAbsD3(outAD3 d,inAD3 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);d[2]=AAbsD1(a[2]);return d;} + A_STATIC retAD4 opAAbsD4(outAD4 d,inAD4 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);d[2]=AAbsD1(a[2]);d[3]=AAbsD1(a[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAAbsF2(outAF2 d,inAF2 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);return d;} + A_STATIC retAF3 opAAbsF3(outAF3 d,inAF3 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);d[2]=AAbsF1(a[2]);return d;} + A_STATIC retAF4 opAAbsF4(outAF4 d,inAF4 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);d[2]=AAbsF1(a[2]);d[3]=AAbsF1(a[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAAddD2(outAD2 d,inAD2 a,inAD2 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];return d;} + A_STATIC retAD3 opAAddD3(outAD3 d,inAD3 a,inAD3 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];return d;} + A_STATIC retAD4 opAAddD4(outAD4 d,inAD4 a,inAD4 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];d[3]=a[3]+b[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAAddF2(outAF2 d,inAF2 a,inAF2 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];return d;} + A_STATIC retAF3 opAAddF3(outAF3 d,inAF3 a,inAF3 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];return d;} + A_STATIC retAF4 opAAddF4(outAF4 d,inAF4 a,inAF4 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];d[3]=a[3]+b[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opACpyD2(outAD2 d,inAD2 a){d[0]=a[0];d[1]=a[1];return d;} + A_STATIC retAD3 opACpyD3(outAD3 d,inAD3 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];return d;} + A_STATIC retAD4 opACpyD4(outAD4 d,inAD4 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];d[3]=a[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opACpyF2(outAF2 d,inAF2 a){d[0]=a[0];d[1]=a[1];return d;} + A_STATIC retAF3 opACpyF3(outAF3 d,inAF3 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];return d;} + A_STATIC retAF4 opACpyF4(outAF4 d,inAF4 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];d[3]=a[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opALerpD2(outAD2 d,inAD2 a,inAD2 b,inAD2 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);return d;} + A_STATIC retAD3 opALerpD3(outAD3 d,inAD3 a,inAD3 b,inAD3 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);d[2]=ALerpD1(a[2],b[2],c[2]);return d;} + A_STATIC retAD4 opALerpD4(outAD4 d,inAD4 a,inAD4 b,inAD4 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);d[2]=ALerpD1(a[2],b[2],c[2]);d[3]=ALerpD1(a[3],b[3],c[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opALerpF2(outAF2 d,inAF2 a,inAF2 b,inAF2 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);return d;} + A_STATIC retAF3 opALerpF3(outAF3 d,inAF3 a,inAF3 b,inAF3 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);d[2]=ALerpF1(a[2],b[2],c[2]);return d;} + A_STATIC retAF4 opALerpF4(outAF4 d,inAF4 a,inAF4 b,inAF4 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);d[2]=ALerpF1(a[2],b[2],c[2]);d[3]=ALerpF1(a[3],b[3],c[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opALerpOneD2(outAD2 d,inAD2 a,inAD2 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);return d;} + A_STATIC retAD3 opALerpOneD3(outAD3 d,inAD3 a,inAD3 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);d[2]=ALerpD1(a[2],b[2],c);return d;} + A_STATIC retAD4 opALerpOneD4(outAD4 d,inAD4 a,inAD4 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);d[2]=ALerpD1(a[2],b[2],c);d[3]=ALerpD1(a[3],b[3],c);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opALerpOneF2(outAF2 d,inAF2 a,inAF2 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);return d;} + A_STATIC retAF3 opALerpOneF3(outAF3 d,inAF3 a,inAF3 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);d[2]=ALerpF1(a[2],b[2],c);return d;} + A_STATIC retAF4 opALerpOneF4(outAF4 d,inAF4 a,inAF4 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);d[2]=ALerpF1(a[2],b[2],c);d[3]=ALerpF1(a[3],b[3],c);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMaxD2(outAD2 d,inAD2 a,inAD2 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);return d;} + A_STATIC retAD3 opAMaxD3(outAD3 d,inAD3 a,inAD3 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);d[2]=AMaxD1(a[2],b[2]);return d;} + A_STATIC retAD4 opAMaxD4(outAD4 d,inAD4 a,inAD4 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);d[2]=AMaxD1(a[2],b[2]);d[3]=AMaxD1(a[3],b[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMaxF2(outAF2 d,inAF2 a,inAF2 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);return d;} + A_STATIC retAF3 opAMaxF3(outAF3 d,inAF3 a,inAF3 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);d[2]=AMaxF1(a[2],b[2]);return d;} + A_STATIC retAF4 opAMaxF4(outAF4 d,inAF4 a,inAF4 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);d[2]=AMaxF1(a[2],b[2]);d[3]=AMaxF1(a[3],b[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMinD2(outAD2 d,inAD2 a,inAD2 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);return d;} + A_STATIC retAD3 opAMinD3(outAD3 d,inAD3 a,inAD3 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);d[2]=AMinD1(a[2],b[2]);return d;} + A_STATIC retAD4 opAMinD4(outAD4 d,inAD4 a,inAD4 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);d[2]=AMinD1(a[2],b[2]);d[3]=AMinD1(a[3],b[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMinF2(outAF2 d,inAF2 a,inAF2 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);return d;} + A_STATIC retAF3 opAMinF3(outAF3 d,inAF3 a,inAF3 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);d[2]=AMinF1(a[2],b[2]);return d;} + A_STATIC retAF4 opAMinF4(outAF4 d,inAF4 a,inAF4 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);d[2]=AMinF1(a[2],b[2]);d[3]=AMinF1(a[3],b[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMulD2(outAD2 d,inAD2 a,inAD2 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];return d;} + A_STATIC retAD3 opAMulD3(outAD3 d,inAD3 a,inAD3 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];return d;} + A_STATIC retAD4 opAMulD4(outAD4 d,inAD4 a,inAD4 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];d[3]=a[3]*b[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMulF2(outAF2 d,inAF2 a,inAF2 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];return d;} + A_STATIC retAF3 opAMulF3(outAF3 d,inAF3 a,inAF3 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];return d;} + A_STATIC retAF4 opAMulF4(outAF4 d,inAF4 a,inAF4 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];d[3]=a[3]*b[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMulOneD2(outAD2 d,inAD2 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;return d;} + A_STATIC retAD3 opAMulOneD3(outAD3 d,inAD3 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;return d;} + A_STATIC retAD4 opAMulOneD4(outAD4 d,inAD4 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;d[3]=a[3]*b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMulOneF2(outAF2 d,inAF2 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;return d;} + A_STATIC retAF3 opAMulOneF3(outAF3 d,inAF3 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;return d;} + A_STATIC retAF4 opAMulOneF4(outAF4 d,inAF4 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;d[3]=a[3]*b;return d;} +//============================================================================================================================== + A_STATIC retAD2 opANegD2(outAD2 d,inAD2 a){d[0]=-a[0];d[1]=-a[1];return d;} + A_STATIC retAD3 opANegD3(outAD3 d,inAD3 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];return d;} + A_STATIC retAD4 opANegD4(outAD4 d,inAD4 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];d[3]=-a[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opANegF2(outAF2 d,inAF2 a){d[0]=-a[0];d[1]=-a[1];return d;} + A_STATIC retAF3 opANegF3(outAF3 d,inAF3 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];return d;} + A_STATIC retAF4 opANegF4(outAF4 d,inAF4 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];d[3]=-a[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opARcpD2(outAD2 d,inAD2 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);return d;} + A_STATIC retAD3 opARcpD3(outAD3 d,inAD3 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);d[2]=ARcpD1(a[2]);return d;} + A_STATIC retAD4 opARcpD4(outAD4 d,inAD4 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);d[2]=ARcpD1(a[2]);d[3]=ARcpD1(a[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opARcpF2(outAF2 d,inAF2 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);return d;} + A_STATIC retAF3 opARcpF3(outAF3 d,inAF3 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);d[2]=ARcpF1(a[2]);return d;} + A_STATIC retAF4 opARcpF4(outAF4 d,inAF4 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);d[2]=ARcpF1(a[2]);d[3]=ARcpF1(a[3]);return d;} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HALF FLOAT PACKING +//============================================================================================================================== + // Convert float to half (in lower 16-bits of output). + // Same fast technique as documented here: ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf + // Supports denormals. + // Conversion rules are to make computations possibly "safer" on the GPU, + // -INF & -NaN -> -65504 + // +INF & +NaN -> +65504 + A_STATIC AU1 AU1_AH1_AF1(AF1 f){ + static AW1 base[512]={ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100, + 0x0200,0x0400,0x0800,0x0c00,0x1000,0x1400,0x1800,0x1c00,0x2000,0x2400,0x2800,0x2c00,0x3000,0x3400,0x3800,0x3c00, + 0x4000,0x4400,0x4800,0x4c00,0x5000,0x5400,0x5800,0x5c00,0x6000,0x6400,0x6800,0x6c00,0x7000,0x7400,0x7800,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8001,0x8002,0x8004,0x8008,0x8010,0x8020,0x8040,0x8080,0x8100, + 0x8200,0x8400,0x8800,0x8c00,0x9000,0x9400,0x9800,0x9c00,0xa000,0xa400,0xa800,0xac00,0xb000,0xb400,0xb800,0xbc00, + 0xc000,0xc400,0xc800,0xcc00,0xd000,0xd400,0xd800,0xdc00,0xe000,0xe400,0xe800,0xec00,0xf000,0xf400,0xf800,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff}; + static AB1 shift[512]={ + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f, + 0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, + 0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f, + 0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, + 0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}; + union{AF1 f;AU1 u;}bits;bits.f=f;AU1 u=bits.u;AU1 i=u>>23;return (AU1)(base[i])+((u&0x7fffff)>>shift[i]);} +//------------------------------------------------------------------------------------------------------------------------------ + // Used to output packed constant. + A_STATIC AU1 AU1_AH2_AF2(inAF2 a){return AU1_AH1_AF1(a[0])+(AU1_AH1_AF1(a[1])<<16);} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// GLSL +// +// +//============================================================================================================================== +#if defined(A_GLSL) && defined(A_GPU) + #ifndef A_SKIP_EXT + #ifdef A_HALF + #extension GL_EXT_shader_16bit_storage:require + #extension GL_EXT_shader_explicit_arithmetic_types:require + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_LONG + #extension GL_ARB_gpu_shader_int64:require + // TODO: Fixme to more portable extension!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + #extension GL_NV_shader_atomic_int64:require + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_WAVE + #extension GL_KHR_shader_subgroup_arithmetic:require + #extension GL_KHR_shader_subgroup_ballot:require + #extension GL_KHR_shader_subgroup_quad:require + #extension GL_KHR_shader_subgroup_shuffle:require + #endif + #endif +//============================================================================================================================== + #define AP1 bool + #define AP2 bvec2 + #define AP3 bvec3 + #define AP4 bvec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF1 float + #define AF2 vec2 + #define AF3 vec3 + #define AF4 vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1 uint + #define AU2 uvec2 + #define AU3 uvec3 + #define AU4 uvec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASU1 int + #define ASU2 ivec2 + #define ASU3 ivec3 + #define ASU4 ivec4 +//============================================================================================================================== + #define AF1_AU1(x) uintBitsToFloat(AU1(x)) + #define AF2_AU2(x) uintBitsToFloat(AU2(x)) + #define AF3_AU3(x) uintBitsToFloat(AU3(x)) + #define AF4_AU4(x) uintBitsToFloat(AU4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AF1(x) floatBitsToUint(AF1(x)) + #define AU2_AF2(x) floatBitsToUint(AF2(x)) + #define AU3_AF3(x) floatBitsToUint(AF3(x)) + #define AU4_AF4(x) floatBitsToUint(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AH2_AF2 packHalf2x16 + #define AU1_AW2Unorm_AF2 packUnorm2x16 + #define AU1_AB4Unorm_AF4 packUnorm4x8 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF2_AH2_AU1 unpackHalf2x16 + #define AF2_AW2Unorm_AU1 unpackUnorm2x16 + #define AF4_AB4Unorm_AU1 unpackUnorm4x8 +//============================================================================================================================== + AF1 AF1_x(AF1 a){return AF1(a);} + AF2 AF2_x(AF1 a){return AF2(a,a);} + AF3 AF3_x(AF1 a){return AF3(a,a,a);} + AF4 AF4_x(AF1 a){return AF4(a,a,a,a);} + #define AF1_(a) AF1_x(AF1(a)) + #define AF2_(a) AF2_x(AF1(a)) + #define AF3_(a) AF3_x(AF1(a)) + #define AF4_(a) AF4_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_x(AU1 a){return AU1(a);} + AU2 AU2_x(AU1 a){return AU2(a,a);} + AU3 AU3_x(AU1 a){return AU3(a,a,a);} + AU4 AU4_x(AU1 a){return AU4(a,a,a,a);} + #define AU1_(a) AU1_x(AU1(a)) + #define AU2_(a) AU2_x(AU1(a)) + #define AU3_(a) AU3_x(AU1(a)) + #define AU4_(a) AU4_x(AU1(a)) +//============================================================================================================================== + AU1 AAbsSU1(AU1 a){return AU1(abs(ASU1(a)));} + AU2 AAbsSU2(AU2 a){return AU2(abs(ASU2(a)));} + AU3 AAbsSU3(AU3 a){return AU3(abs(ASU3(a)));} + AU4 AAbsSU4(AU4 a){return AU4(abs(ASU4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 ABfe(AU1 src,AU1 off,AU1 bits){return bitfieldExtract(src,ASU1(off),ASU1(bits));} + AU1 ABfi(AU1 src,AU1 ins,AU1 mask){return (ins&mask)|(src&(~mask));} + // Proxy for V_BFI_B32 where the 'mask' is set as 'bits', 'mask=(1<>ASU1(b));} + AU2 AShrSU2(AU2 a,AU2 b){return AU2(ASU2(a)>>ASU2(b));} + AU3 AShrSU3(AU3 a,AU3 b){return AU3(ASU3(a)>>ASU3(b));} + AU4 AShrSU4(AU4 a,AU4 b){return AU4(ASU4(a)>>ASU4(b));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL BYTE +//============================================================================================================================== + #ifdef A_BYTE + #define AB1 uint8_t + #define AB2 u8vec2 + #define AB3 u8vec3 + #define AB4 u8vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASB1 int8_t + #define ASB2 i8vec2 + #define ASB3 i8vec3 + #define ASB4 i8vec4 +//------------------------------------------------------------------------------------------------------------------------------ + AB1 AB1_x(AB1 a){return AB1(a);} + AB2 AB2_x(AB1 a){return AB2(a,a);} + AB3 AB3_x(AB1 a){return AB3(a,a,a);} + AB4 AB4_x(AB1 a){return AB4(a,a,a,a);} + #define AB1_(a) AB1_x(AB1(a)) + #define AB2_(a) AB2_x(AB1(a)) + #define AB3_(a) AB3_x(AB1(a)) + #define AB4_(a) AB4_x(AB1(a)) + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL HALF +//============================================================================================================================== + #ifdef A_HALF + #define AH1 float16_t + #define AH2 f16vec2 + #define AH3 f16vec3 + #define AH4 f16vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1 uint16_t + #define AW2 u16vec2 + #define AW3 u16vec3 + #define AW4 u16vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASW1 int16_t + #define ASW2 i16vec2 + #define ASW3 i16vec3 + #define ASW4 i16vec4 +//============================================================================================================================== + #define AH2_AU1(x) unpackFloat2x16(AU1(x)) + AH4 AH4_AU2_x(AU2 x){return AH4(unpackFloat2x16(x.x),unpackFloat2x16(x.y));} + #define AH4_AU2(x) AH4_AU2_x(AU2(x)) + #define AW2_AU1(x) unpackUint2x16(AU1(x)) + #define AW4_AU2(x) unpackUint4x16(pack64(AU2(x))) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AH2(x) packFloat2x16(AH2(x)) + AU2 AU2_AH4_x(AH4 x){return AU2(packFloat2x16(x.xy),packFloat2x16(x.zw));} + #define AU2_AH4(x) AU2_AH4_x(AH4(x)) + #define AU1_AW2(x) packUint2x16(AW2(x)) + #define AU2_AW4(x) unpack32(packUint4x16(AW4(x))) +//============================================================================================================================== + #define AW1_AH1(x) halfBitsToUint16(AH1(x)) + #define AW2_AH2(x) halfBitsToUint16(AH2(x)) + #define AW3_AH3(x) halfBitsToUint16(AH3(x)) + #define AW4_AH4(x) halfBitsToUint16(AH4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AH1_AW1(x) uint16BitsToHalf(AW1(x)) + #define AH2_AW2(x) uint16BitsToHalf(AW2(x)) + #define AH3_AW3(x) uint16BitsToHalf(AW3(x)) + #define AH4_AW4(x) uint16BitsToHalf(AW4(x)) +//============================================================================================================================== + AH1 AH1_x(AH1 a){return AH1(a);} + AH2 AH2_x(AH1 a){return AH2(a,a);} + AH3 AH3_x(AH1 a){return AH3(a,a,a);} + AH4 AH4_x(AH1 a){return AH4(a,a,a,a);} + #define AH1_(a) AH1_x(AH1(a)) + #define AH2_(a) AH2_x(AH1(a)) + #define AH3_(a) AH3_x(AH1(a)) + #define AH4_(a) AH4_x(AH1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AW1_x(AW1 a){return AW1(a);} + AW2 AW2_x(AW1 a){return AW2(a,a);} + AW3 AW3_x(AW1 a){return AW3(a,a,a);} + AW4 AW4_x(AW1 a){return AW4(a,a,a,a);} + #define AW1_(a) AW1_x(AW1(a)) + #define AW2_(a) AW2_x(AW1(a)) + #define AW3_(a) AW3_x(AW1(a)) + #define AW4_(a) AW4_x(AW1(a)) +//============================================================================================================================== + AW1 AAbsSW1(AW1 a){return AW1(abs(ASW1(a)));} + AW2 AAbsSW2(AW2 a){return AW2(abs(ASW2(a)));} + AW3 AAbsSW3(AW3 a){return AW3(abs(ASW3(a)));} + AW4 AAbsSW4(AW4 a){return AW4(abs(ASW4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AFractH1(AH1 x){return fract(x);} + AH2 AFractH2(AH2 x){return fract(x);} + AH3 AFractH3(AH3 x){return fract(x);} + AH4 AFractH4(AH4 x){return fract(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ALerpH1(AH1 x,AH1 y,AH1 a){return mix(x,y,a);} + AH2 ALerpH2(AH2 x,AH2 y,AH2 a){return mix(x,y,a);} + AH3 ALerpH3(AH3 x,AH3 y,AH3 a){return mix(x,y,a);} + AH4 ALerpH4(AH4 x,AH4 y,AH4 a){return mix(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + // No packed version of max3. + AH1 AMax3H1(AH1 x,AH1 y,AH1 z){return max(x,max(y,z));} + AH2 AMax3H2(AH2 x,AH2 y,AH2 z){return max(x,max(y,z));} + AH3 AMax3H3(AH3 x,AH3 y,AH3 z){return max(x,max(y,z));} + AH4 AMax3H4(AH4 x,AH4 y,AH4 z){return max(x,max(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMaxSW1(AW1 a,AW1 b){return AW1(max(ASU1(a),ASU1(b)));} + AW2 AMaxSW2(AW2 a,AW2 b){return AW2(max(ASU2(a),ASU2(b)));} + AW3 AMaxSW3(AW3 a,AW3 b){return AW3(max(ASU3(a),ASU3(b)));} + AW4 AMaxSW4(AW4 a,AW4 b){return AW4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + // No packed version of min3. + AH1 AMin3H1(AH1 x,AH1 y,AH1 z){return min(x,min(y,z));} + AH2 AMin3H2(AH2 x,AH2 y,AH2 z){return min(x,min(y,z));} + AH3 AMin3H3(AH3 x,AH3 y,AH3 z){return min(x,min(y,z));} + AH4 AMin3H4(AH4 x,AH4 y,AH4 z){return min(x,min(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMinSW1(AW1 a,AW1 b){return AW1(min(ASU1(a),ASU1(b)));} + AW2 AMinSW2(AW2 a,AW2 b){return AW2(min(ASU2(a),ASU2(b)));} + AW3 AMinSW3(AW3 a,AW3 b){return AW3(min(ASU3(a),ASU3(b)));} + AW4 AMinSW4(AW4 a,AW4 b){return AW4(min(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARcpH1(AH1 x){return AH1_(1.0)/x;} + AH2 ARcpH2(AH2 x){return AH2_(1.0)/x;} + AH3 ARcpH3(AH3 x){return AH3_(1.0)/x;} + AH4 ARcpH4(AH4 x){return AH4_(1.0)/x;} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARsqH1(AH1 x){return AH1_(1.0)/sqrt(x);} + AH2 ARsqH2(AH2 x){return AH2_(1.0)/sqrt(x);} + AH3 ARsqH3(AH3 x){return AH3_(1.0)/sqrt(x);} + AH4 ARsqH4(AH4 x){return AH4_(1.0)/sqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASatH1(AH1 x){return clamp(x,AH1_(0.0),AH1_(1.0));} + AH2 ASatH2(AH2 x){return clamp(x,AH2_(0.0),AH2_(1.0));} + AH3 ASatH3(AH3 x){return clamp(x,AH3_(0.0),AH3_(1.0));} + AH4 ASatH4(AH4 x){return clamp(x,AH4_(0.0),AH4_(1.0));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AShrSW1(AW1 a,AW1 b){return AW1(ASW1(a)>>ASW1(b));} + AW2 AShrSW2(AW2 a,AW2 b){return AW2(ASW2(a)>>ASW2(b));} + AW3 AShrSW3(AW3 a,AW3 b){return AW3(ASW3(a)>>ASW3(b));} + AW4 AShrSW4(AW4 a,AW4 b){return AW4(ASW4(a)>>ASW4(b));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL DOUBLE +//============================================================================================================================== + #ifdef A_DUBL + #define AD1 double + #define AD2 dvec2 + #define AD3 dvec3 + #define AD4 dvec4 +//------------------------------------------------------------------------------------------------------------------------------ + AD1 AD1_x(AD1 a){return AD1(a);} + AD2 AD2_x(AD1 a){return AD2(a,a);} + AD3 AD3_x(AD1 a){return AD3(a,a,a);} + AD4 AD4_x(AD1 a){return AD4(a,a,a,a);} + #define AD1_(a) AD1_x(AD1(a)) + #define AD2_(a) AD2_x(AD1(a)) + #define AD3_(a) AD3_x(AD1(a)) + #define AD4_(a) AD4_x(AD1(a)) +//============================================================================================================================== + AD1 AFractD1(AD1 x){return fract(x);} + AD2 AFractD2(AD2 x){return fract(x);} + AD3 AFractD3(AD3 x){return fract(x);} + AD4 AFractD4(AD4 x){return fract(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ALerpD1(AD1 x,AD1 y,AD1 a){return mix(x,y,a);} + AD2 ALerpD2(AD2 x,AD2 y,AD2 a){return mix(x,y,a);} + AD3 ALerpD3(AD3 x,AD3 y,AD3 a){return mix(x,y,a);} + AD4 ALerpD4(AD4 x,AD4 y,AD4 a){return mix(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARcpD1(AD1 x){return AD1_(1.0)/x;} + AD2 ARcpD2(AD2 x){return AD2_(1.0)/x;} + AD3 ARcpD3(AD3 x){return AD3_(1.0)/x;} + AD4 ARcpD4(AD4 x){return AD4_(1.0)/x;} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARsqD1(AD1 x){return AD1_(1.0)/sqrt(x);} + AD2 ARsqD2(AD2 x){return AD2_(1.0)/sqrt(x);} + AD3 ARsqD3(AD3 x){return AD3_(1.0)/sqrt(x);} + AD4 ARsqD4(AD4 x){return AD4_(1.0)/sqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ASatD1(AD1 x){return clamp(x,AD1_(0.0),AD1_(1.0));} + AD2 ASatD2(AD2 x){return clamp(x,AD2_(0.0),AD2_(1.0));} + AD3 ASatD3(AD3 x){return clamp(x,AD3_(0.0),AD3_(1.0));} + AD4 ASatD4(AD4 x){return clamp(x,AD4_(0.0),AD4_(1.0));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL LONG +//============================================================================================================================== + #ifdef A_LONG + #define AL1 uint64_t + #define AL2 u64vec2 + #define AL3 u64vec3 + #define AL4 u64vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASL1 int64_t + #define ASL2 i64vec2 + #define ASL3 i64vec3 + #define ASL4 i64vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AL1_AU2(x) packUint2x32(AU2(x)) + #define AU2_AL1(x) unpackUint2x32(AL1(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AL1 AL1_x(AL1 a){return AL1(a);} + AL2 AL2_x(AL1 a){return AL2(a,a);} + AL3 AL3_x(AL1 a){return AL3(a,a,a);} + AL4 AL4_x(AL1 a){return AL4(a,a,a,a);} + #define AL1_(a) AL1_x(AL1(a)) + #define AL2_(a) AL2_x(AL1(a)) + #define AL3_(a) AL3_x(AL1(a)) + #define AL4_(a) AL4_x(AL1(a)) +//============================================================================================================================== + AL1 AAbsSL1(AL1 a){return AL1(abs(ASL1(a)));} + AL2 AAbsSL2(AL2 a){return AL2(abs(ASL2(a)));} + AL3 AAbsSL3(AL3 a){return AL3(abs(ASL3(a)));} + AL4 AAbsSL4(AL4 a){return AL4(abs(ASL4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AL1 AMaxSL1(AL1 a,AL1 b){return AL1(max(ASU1(a),ASU1(b)));} + AL2 AMaxSL2(AL2 a,AL2 b){return AL2(max(ASU2(a),ASU2(b)));} + AL3 AMaxSL3(AL3 a,AL3 b){return AL3(max(ASU3(a),ASU3(b)));} + AL4 AMaxSL4(AL4 a,AL4 b){return AL4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AL1 AMinSL1(AL1 a,AL1 b){return AL1(min(ASU1(a),ASU1(b)));} + AL2 AMinSL2(AL2 a,AL2 b){return AL2(min(ASU2(a),ASU2(b)));} + AL3 AMinSL3(AL3 a,AL3 b){return AL3(min(ASU3(a),ASU3(b)));} + AL4 AMinSL4(AL4 a,AL4 b){return AL4(min(ASU4(a),ASU4(b)));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// WAVE OPERATIONS +//============================================================================================================================== + #ifdef A_WAVE + AF1 AWaveAdd(AF1 v){return subgroupAdd(v);} + AF2 AWaveAdd(AF2 v){return subgroupAdd(v);} + AF3 AWaveAdd(AF3 v){return subgroupAdd(v);} + AF4 AWaveAdd(AF4 v){return subgroupAdd(v);} + #endif +//============================================================================================================================== +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// HLSL +// +// +//============================================================================================================================== +#if defined(A_HLSL) && defined(A_GPU) + #define AP1 bool + #define AP2 bool2 + #define AP3 bool3 + #define AP4 bool4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF1 float + #define AF2 float2 + #define AF3 float3 + #define AF4 float4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1 uint + #define AU2 uint2 + #define AU3 uint3 + #define AU4 uint4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASU1 int + #define ASU2 int2 + #define ASU3 int3 + #define ASU4 int4 +//============================================================================================================================== + #define AF1_AU1(x) asfloat(AU1(x)) + #define AF2_AU2(x) asfloat(AU2(x)) + #define AF3_AU3(x) asfloat(AU3(x)) + #define AF4_AU4(x) asfloat(AU4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AF1(x) asuint(AF1(x)) + #define AU2_AF2(x) asuint(AF2(x)) + #define AU3_AF3(x) asuint(AF3(x)) + #define AU4_AF4(x) asuint(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH2_AF2_x(AF2 a){return f32tof16(a.x)|(f32tof16(a.y)<<16);} + #define AU1_AH2_AF2(a) AU1_AH2_AF2_x(AF2(a)) + #define AU1_AB4Unorm_AF4(x) D3DCOLORtoUBYTE4(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AF2 AF2_AH2_AU1_x(AU1 x){return AF2(f16tof32(x&0xFFFF),f16tof32(x>>16));} + #define AF2_AH2_AU1(x) AF2_AH2_AU1_x(AU1(x)) +//============================================================================================================================== + AF1 AF1_x(AF1 a){return AF1(a);} + AF2 AF2_x(AF1 a){return AF2(a,a);} + AF3 AF3_x(AF1 a){return AF3(a,a,a);} + AF4 AF4_x(AF1 a){return AF4(a,a,a,a);} + #define AF1_(a) AF1_x(AF1(a)) + #define AF2_(a) AF2_x(AF1(a)) + #define AF3_(a) AF3_x(AF1(a)) + #define AF4_(a) AF4_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_x(AU1 a){return AU1(a);} + AU2 AU2_x(AU1 a){return AU2(a,a);} + AU3 AU3_x(AU1 a){return AU3(a,a,a);} + AU4 AU4_x(AU1 a){return AU4(a,a,a,a);} + #define AU1_(a) AU1_x(AU1(a)) + #define AU2_(a) AU2_x(AU1(a)) + #define AU3_(a) AU3_x(AU1(a)) + #define AU4_(a) AU4_x(AU1(a)) +//============================================================================================================================== + AU1 AAbsSU1(AU1 a){return AU1(abs(ASU1(a)));} + AU2 AAbsSU2(AU2 a){return AU2(abs(ASU2(a)));} + AU3 AAbsSU3(AU3 a){return AU3(abs(ASU3(a)));} + AU4 AAbsSU4(AU4 a){return AU4(abs(ASU4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 ABfe(AU1 src,AU1 off,AU1 bits){AU1 mask=(1<>off)&mask;} + AU1 ABfi(AU1 src,AU1 ins,AU1 mask){return (ins&mask)|(src&(~mask));} + AU1 ABfiM(AU1 src,AU1 ins,AU1 bits){AU1 mask=(1<>ASU1(b));} + AU2 AShrSU2(AU2 a,AU2 b){return AU2(ASU2(a)>>ASU2(b));} + AU3 AShrSU3(AU3 a,AU3 b){return AU3(ASU3(a)>>ASU3(b));} + AU4 AShrSU4(AU4 a,AU4 b){return AU4(ASU4(a)>>ASU4(b));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL BYTE +//============================================================================================================================== + #ifdef A_BYTE + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL HALF +//============================================================================================================================== + #ifdef A_HALF + #define AH1 min16float + #define AH2 min16float2 + #define AH3 min16float3 + #define AH4 min16float4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1 min16uint + #define AW2 min16uint2 + #define AW3 min16uint3 + #define AW4 min16uint4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASW1 min16int + #define ASW2 min16int2 + #define ASW3 min16int3 + #define ASW4 min16int4 +//============================================================================================================================== + // Need to use manual unpack to get optimal execution (don't use packed types in buffers directly). + // Unpack requires this pattern: https://gpuopen.com/first-steps-implementing-fp16/ + AH2 AH2_AU1_x(AU1 x){AF2 t=f16tof32(AU2(x&0xFFFF,x>>16));return AH2(t);} + AH4 AH4_AU2_x(AU2 x){return AH4(AH2_AU1_x(x.x),AH2_AU1_x(x.y));} + AW2 AW2_AU1_x(AU1 x){AU2 t=AU2(x&0xFFFF,x>>16);return AW2(t);} + AW4 AW4_AU2_x(AU2 x){return AW4(AW2_AU1_x(x.x),AW2_AU1_x(x.y));} + #define AH2_AU1(x) AH2_AU1_x(AU1(x)) + #define AH4_AU2(x) AH4_AU2_x(AU2(x)) + #define AW2_AU1(x) AW2_AU1_x(AU1(x)) + #define AW4_AU2(x) AW4_AU2_x(AU2(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH2_x(AH2 x){return f32tof16(x.x)+(f32tof16(x.y)<<16);} + AU2 AU2_AH4_x(AH4 x){return AU2(AU1_AH2_x(x.xy),AU1_AH2_x(x.zw));} + AU1 AU1_AW2_x(AW2 x){return AU1(x.x)+(AU1(x.y)<<16);} + AU2 AU2_AW4_x(AW4 x){return AU2(AU1_AW2_x(x.xy),AU1_AW2_x(x.zw));} + #define AU1_AH2(x) AU1_AH2_x(AH2(x)) + #define AU2_AH4(x) AU2_AH4_x(AH4(x)) + #define AU1_AW2(x) AU1_AW2_x(AW2(x)) + #define AU2_AW4(x) AU2_AW4_x(AW4(x)) +//============================================================================================================================== + // TODO: These are broken!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + #define AW1_AH1(x) AW1(asuint(AF1(x))) + #define AW2_AH2(x) AW2(asuint(AF2(x))) + #define AW3_AH3(x) AW3(asuint(AF3(x))) + #define AW4_AH4(x) AW4(asuint(AF4(x))) +//------------------------------------------------------------------------------------------------------------------------------ + // TODO: These are broken!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + #define AH1_AW1(x) AH1(asfloat(AU1(x))) + #define AH2_AW2(x) AH2(asfloat(AU2(x))) + #define AH3_AW3(x) AH3(asfloat(AU3(x))) + #define AH4_AW4(x) AH4(asfloat(AU4(x))) +//============================================================================================================================== + AH1 AH1_x(AH1 a){return AH1(a);} + AH2 AH2_x(AH1 a){return AH2(a,a);} + AH3 AH3_x(AH1 a){return AH3(a,a,a);} + AH4 AH4_x(AH1 a){return AH4(a,a,a,a);} + #define AH1_(a) AH1_x(AH1(a)) + #define AH2_(a) AH2_x(AH1(a)) + #define AH3_(a) AH3_x(AH1(a)) + #define AH4_(a) AH4_x(AH1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AW1_x(AW1 a){return AW1(a);} + AW2 AW2_x(AW1 a){return AW2(a,a);} + AW3 AW3_x(AW1 a){return AW3(a,a,a);} + AW4 AW4_x(AW1 a){return AW4(a,a,a,a);} + #define AW1_(a) AW1_x(AW1(a)) + #define AW2_(a) AW2_x(AW1(a)) + #define AW3_(a) AW3_x(AW1(a)) + #define AW4_(a) AW4_x(AW1(a)) +//============================================================================================================================== + AW1 AAbsSW1(AW1 a){return AW1(abs(ASW1(a)));} + AW2 AAbsSW2(AW2 a){return AW2(abs(ASW2(a)));} + AW3 AAbsSW3(AW3 a){return AW3(abs(ASW3(a)));} + AW4 AAbsSW4(AW4 a){return AW4(abs(ASW4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + // V_FRACT_F16 (note DX frac() is different). + AH1 AFractH1(AH1 x){return x-floor(x);} + AH2 AFractH2(AH2 x){return x-floor(x);} + AH3 AFractH3(AH3 x){return x-floor(x);} + AH4 AFractH4(AH4 x){return x-floor(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ALerpH1(AH1 x,AH1 y,AH1 a){return lerp(x,y,a);} + AH2 ALerpH2(AH2 x,AH2 y,AH2 a){return lerp(x,y,a);} + AH3 ALerpH3(AH3 x,AH3 y,AH3 a){return lerp(x,y,a);} + AH4 ALerpH4(AH4 x,AH4 y,AH4 a){return lerp(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AMax3H1(AH1 x,AH1 y,AH1 z){return max(x,max(y,z));} + AH2 AMax3H2(AH2 x,AH2 y,AH2 z){return max(x,max(y,z));} + AH3 AMax3H3(AH3 x,AH3 y,AH3 z){return max(x,max(y,z));} + AH4 AMax3H4(AH4 x,AH4 y,AH4 z){return max(x,max(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMaxSW1(AW1 a,AW1 b){return AW1(max(ASU1(a),ASU1(b)));} + AW2 AMaxSW2(AW2 a,AW2 b){return AW2(max(ASU2(a),ASU2(b)));} + AW3 AMaxSW3(AW3 a,AW3 b){return AW3(max(ASU3(a),ASU3(b)));} + AW4 AMaxSW4(AW4 a,AW4 b){return AW4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AMin3H1(AH1 x,AH1 y,AH1 z){return min(x,min(y,z));} + AH2 AMin3H2(AH2 x,AH2 y,AH2 z){return min(x,min(y,z));} + AH3 AMin3H3(AH3 x,AH3 y,AH3 z){return min(x,min(y,z));} + AH4 AMin3H4(AH4 x,AH4 y,AH4 z){return min(x,min(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMinSW1(AW1 a,AW1 b){return AW1(min(ASU1(a),ASU1(b)));} + AW2 AMinSW2(AW2 a,AW2 b){return AW2(min(ASU2(a),ASU2(b)));} + AW3 AMinSW3(AW3 a,AW3 b){return AW3(min(ASU3(a),ASU3(b)));} + AW4 AMinSW4(AW4 a,AW4 b){return AW4(min(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARcpH1(AH1 x){return rcp(x);} + AH2 ARcpH2(AH2 x){return rcp(x);} + AH3 ARcpH3(AH3 x){return rcp(x);} + AH4 ARcpH4(AH4 x){return rcp(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARsqH1(AH1 x){return rsqrt(x);} + AH2 ARsqH2(AH2 x){return rsqrt(x);} + AH3 ARsqH3(AH3 x){return rsqrt(x);} + AH4 ARsqH4(AH4 x){return rsqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASatH1(AH1 x){return saturate(x);} + AH2 ASatH2(AH2 x){return saturate(x);} + AH3 ASatH3(AH3 x){return saturate(x);} + AH4 ASatH4(AH4 x){return saturate(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AShrSW1(AW1 a,AW1 b){return AW1(ASW1(a)>>ASW1(b));} + AW2 AShrSW2(AW2 a,AW2 b){return AW2(ASW2(a)>>ASW2(b));} + AW3 AShrSW3(AW3 a,AW3 b){return AW3(ASW3(a)>>ASW3(b));} + AW4 AShrSW4(AW4 a,AW4 b){return AW4(ASW4(a)>>ASW4(b));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL DOUBLE +//============================================================================================================================== + #ifdef A_DUBL + #define AD1 double + #define AD2 double2 + #define AD3 double3 + #define AD4 double4 +//------------------------------------------------------------------------------------------------------------------------------ + AD1 AD1_x(AD1 a){return AD1(a);} + AD2 AD2_x(AD1 a){return AD2(a,a);} + AD3 AD3_x(AD1 a){return AD3(a,a,a);} + AD4 AD4_x(AD1 a){return AD4(a,a,a,a);} + #define AD1_(a) AD1_x(AD1(a)) + #define AD2_(a) AD2_x(AD1(a)) + #define AD3_(a) AD3_x(AD1(a)) + #define AD4_(a) AD4_x(AD1(a)) +//============================================================================================================================== + AD1 AFractD1(AD1 a){return a-floor(a);} + AD2 AFractD2(AD2 a){return a-floor(a);} + AD3 AFractD3(AD3 a){return a-floor(a);} + AD4 AFractD4(AD4 a){return a-floor(a);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ALerpD1(AD1 x,AD1 y,AD1 a){return lerp(x,y,a);} + AD2 ALerpD2(AD2 x,AD2 y,AD2 a){return lerp(x,y,a);} + AD3 ALerpD3(AD3 x,AD3 y,AD3 a){return lerp(x,y,a);} + AD4 ALerpD4(AD4 x,AD4 y,AD4 a){return lerp(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARcpD1(AD1 x){return rcp(x);} + AD2 ARcpD2(AD2 x){return rcp(x);} + AD3 ARcpD3(AD3 x){return rcp(x);} + AD4 ARcpD4(AD4 x){return rcp(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARsqD1(AD1 x){return rsqrt(x);} + AD2 ARsqD2(AD2 x){return rsqrt(x);} + AD3 ARsqD3(AD3 x){return rsqrt(x);} + AD4 ARsqD4(AD4 x){return rsqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ASatD1(AD1 x){return saturate(x);} + AD2 ASatD2(AD2 x){return saturate(x);} + AD3 ASatD3(AD3 x){return saturate(x);} + AD4 ASatD4(AD4 x){return saturate(x);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL LONG +//============================================================================================================================== + #ifdef A_LONG + #endif +//============================================================================================================================== +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// MSL +// +// +//============================================================================================================================== +#if defined(A_MSL) && defined(A_GPU) + #include + using namespace metal; + // Older metal versions are missing a few functions, fill them in here + #ifndef __HAVE_MEDIAN3__ + #define median3(x,y,z) max(min(x,y),min(max(x,y),z)) + #endif + #ifndef __HAVE_MIN3__ + #define min3(x,y,z) min(x,min(y,z)) + #endif + #ifndef __HAVE_MAX3__ + #define max3(x,y,z) max(x,max(y,z)) + #endif + #define A_STATIC static inline + #define A_MAYBE_UNUSED [[maybe_unused]] +//------------------------------------------------------------------------------------------------------------------------------ + #define AP1 bool + #define AP2 bool2 + #define AP3 bool3 + #define AP4 bool4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF1 float + #define AF2 float2 + #define AF3 float3 + #define AF4 float4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1 uint + #define AU2 uint2 + #define AU3 uint3 + #define AU4 uint4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASU1 int + #define ASU2 int2 + #define ASU3 int3 + #define ASU4 int4 +//============================================================================================================================== + #define AF1_AU1(x) as_type(AU1(x)) + #define AF2_AU2(x) as_type(AU2(x)) + #define AF3_AU3(x) as_type(AU3(x)) + #define AF4_AU4(x) as_type(AU4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AF1(x) as_type(AF1(x)) + #define AU2_AF2(x) as_type(AF2(x)) + #define AU3_AF3(x) as_type(AF3(x)) + #define AU4_AF4(x) as_type(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AU1_AH2_AF2_x(AF2 a){return as_type(half2(a));} + #define AU1_AH2_AF2(a) AU1_AH2_AF2_x(AF2(a)) + #define AU1_AB4Unorm_AF4(x) pack_float_to_unorm4x8(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 AF2_AH2_AU1_x(AU1 x){return float2(as_type(x));} + #define AF2_AH2_AU1(x) AF2_AH2_AU1_x(AU1(x)) +//============================================================================================================================== + #define AF1_(a) AF1(AF1(a)) + #define AF2_(a) AF2(AF1(a)) + #define AF3_(a) AF3(AF1(a)) + #define AF4_(a) AF4(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_(a) AU1(AU1(a)) + #define AU2_(a) AU2(AU1(a)) + #define AU3_(a) AU3(AU1(a)) + #define AU4_(a) AU4(AU1(a)) +//============================================================================================================================== + A_STATIC AU1 AAbsSU1(AU1 a){return AU1(abs(ASU1(a)));} + A_STATIC AU2 AAbsSU2(AU2 a){return AU2(abs(ASU2(a)));} + A_STATIC AU3 AAbsSU3(AU3 a){return AU3(abs(ASU3(a)));} + A_STATIC AU4 AAbsSU4(AU4 a){return AU4(abs(ASU4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 ABfe(AU1 src,AU1 off,AU1 bits){return extract_bits(src, off, bits);} + A_STATIC AU1 ABfi(AU1 src,AU1 ins,AU1 mask){return (ins&mask)|(src&(~mask));} + A_STATIC AU1 ABfiM(AU1 src,AU1 ins,AU1 bits){return insert_bits(src,ins,0,bits);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AFractF1(AF1 x){return fract(x);} + A_STATIC AF2 AFractF2(AF2 x){return fract(x);} + A_STATIC AF3 AFractF3(AF3 x){return fract(x);} + A_STATIC AF4 AFractF4(AF4 x){return fract(x);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 ALerpF1(AF1 x,AF1 y,AF1 a){return mix(x,y,a);} + A_STATIC AF2 ALerpF2(AF2 x,AF2 y,AF2 a){return mix(x,y,a);} + A_STATIC AF3 ALerpF3(AF3 x,AF3 y,AF3 a){return mix(x,y,a);} + A_STATIC AF4 ALerpF4(AF4 x,AF4 y,AF4 a){return mix(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AMax3F1(AF1 x,AF1 y,AF1 z){return max(x,max(y,z));} + A_STATIC AF2 AMax3F2(AF2 x,AF2 y,AF2 z){return max(x,max(y,z));} + A_STATIC AF3 AMax3F3(AF3 x,AF3 y,AF3 z){return max(x,max(y,z));} + A_STATIC AF4 AMax3F4(AF4 x,AF4 y,AF4 z){return max(x,max(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AMax3SU1(AU1 x,AU1 y,AU1 z){return AU1(max3(ASU1(x),ASU1(y),ASU1(z)));} + A_STATIC AU2 AMax3SU2(AU2 x,AU2 y,AU2 z){return AU2(max3(ASU2(x),ASU2(y),ASU2(z)));} + A_STATIC AU3 AMax3SU3(AU3 x,AU3 y,AU3 z){return AU3(max3(ASU3(x),ASU3(y),ASU3(z)));} + A_STATIC AU4 AMax3SU4(AU4 x,AU4 y,AU4 z){return AU4(max3(ASU4(x),ASU4(y),ASU4(z)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AMax3U1(AU1 x,AU1 y,AU1 z){return max3(x,y,z);} + A_STATIC AU2 AMax3U2(AU2 x,AU2 y,AU2 z){return max3(x,y,z);} + A_STATIC AU3 AMax3U3(AU3 x,AU3 y,AU3 z){return max3(x,y,z);} + A_STATIC AU4 AMax3U4(AU4 x,AU4 y,AU4 z){return max3(x,y,z);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AMaxSU1(AU1 a,AU1 b){return AU1(max(ASU1(a),ASU1(b)));} + A_STATIC AU2 AMaxSU2(AU2 a,AU2 b){return AU2(max(ASU2(a),ASU2(b)));} + A_STATIC AU3 AMaxSU3(AU3 a,AU3 b){return AU3(max(ASU3(a),ASU3(b)));} + A_STATIC AU4 AMaxSU4(AU4 a,AU4 b){return AU4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AMed3F1(AF1 x,AF1 y,AF1 z){return median3(x,y,z);} + A_STATIC AF2 AMed3F2(AF2 x,AF2 y,AF2 z){return median3(x,y,z);} + A_STATIC AF3 AMed3F3(AF3 x,AF3 y,AF3 z){return median3(x,y,z);} + A_STATIC AF4 AMed3F4(AF4 x,AF4 y,AF4 z){return median3(x,y,z);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AMin3F1(AF1 x,AF1 y,AF1 z){return min3(x,y,z);} + A_STATIC AF2 AMin3F2(AF2 x,AF2 y,AF2 z){return min3(x,y,z);} + A_STATIC AF3 AMin3F3(AF3 x,AF3 y,AF3 z){return min3(x,y,z);} + A_STATIC AF4 AMin3F4(AF4 x,AF4 y,AF4 z){return min3(x,y,z);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AMin3SU1(AU1 x,AU1 y,AU1 z){return AU1(min3(ASU1(x),ASU1(y),ASU1(z)));} + A_STATIC AU2 AMin3SU2(AU2 x,AU2 y,AU2 z){return AU2(min3(ASU2(x),ASU2(y),ASU2(z)));} + A_STATIC AU3 AMin3SU3(AU3 x,AU3 y,AU3 z){return AU3(min3(ASU3(x),ASU3(y),ASU3(z)));} + A_STATIC AU4 AMin3SU4(AU4 x,AU4 y,AU4 z){return AU4(min3(ASU4(x),ASU4(y),ASU4(z)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AMin3U1(AU1 x,AU1 y,AU1 z){return min3(x,y,z);} + A_STATIC AU2 AMin3U2(AU2 x,AU2 y,AU2 z){return min3(x,y,z);} + A_STATIC AU3 AMin3U3(AU3 x,AU3 y,AU3 z){return min3(x,y,z);} + A_STATIC AU4 AMin3U4(AU4 x,AU4 y,AU4 z){return min3(x,y,z);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AMinSU1(AU1 a,AU1 b){return AU1(min(ASU1(a),ASU1(b)));} + A_STATIC AU2 AMinSU2(AU2 a,AU2 b){return AU2(min(ASU2(a),ASU2(b)));} + A_STATIC AU3 AMinSU3(AU3 a,AU3 b){return AU3(min(ASU3(a),ASU3(b)));} + A_STATIC AU4 AMinSU4(AU4 a,AU4 b){return AU4(min(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 ANCosF1(AF1 x){return cos(x*A_2PI);} + A_STATIC AF2 ANCosF2(AF2 x){return cos(x*A_2PI);} + A_STATIC AF3 ANCosF3(AF3 x){return cos(x*A_2PI);} + A_STATIC AF4 ANCosF4(AF4 x){return cos(x*A_2PI);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 ANSinF1(AF1 x){return sin(x*A_2PI);} + A_STATIC AF2 ANSinF2(AF2 x){return sin(x*A_2PI);} + A_STATIC AF3 ANSinF3(AF3 x){return sin(x*A_2PI);} + A_STATIC AF4 ANSinF4(AF4 x){return sin(x*A_2PI);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 ARcpF1(AF1 x){return 1.f/x;} + A_STATIC AF2 ARcpF2(AF2 x){return 1.f/x;} + A_STATIC AF3 ARcpF3(AF3 x){return 1.f/x;} + A_STATIC AF4 ARcpF4(AF4 x){return 1.f/x;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 ARsqF1(AF1 x){return rsqrt(x);} + A_STATIC AF2 ARsqF2(AF2 x){return rsqrt(x);} + A_STATIC AF3 ARsqF3(AF3 x){return rsqrt(x);} + A_STATIC AF4 ARsqF4(AF4 x){return rsqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 ASatF1(AF1 x){return saturate(x);} + A_STATIC AF2 ASatF2(AF2 x){return saturate(x);} + A_STATIC AF3 ASatF3(AF3 x){return saturate(x);} + A_STATIC AF4 ASatF4(AF4 x){return saturate(x);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AShrSU1(AU1 a,AU1 b){return AU1(ASU1(a)>>ASU1(b));} + A_STATIC AU2 AShrSU2(AU2 a,AU2 b){return AU2(ASU2(a)>>ASU2(b));} + A_STATIC AU3 AShrSU3(AU3 a,AU3 b){return AU3(ASU3(a)>>ASU3(b));} + A_STATIC AU4 AShrSU4(AU4 a,AU4 b){return AU4(ASU4(a)>>ASU4(b));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// MSL BYTE +//============================================================================================================================== + #ifdef A_BYTE + #define AB1 uchar + #define AB2 uchar2 + #define AB3 uchar3 + #define AB4 uchar4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASB1 char + #define ASB2 char2 + #define ASB3 char3 + #define ASB4 char4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AB1_(a) AB1(AB1(a)) + #define AB2_(a) AB2(AB1(a)) + #define AB3_(a) AB3(AB1(a)) + #define AB4_(a) AB4(AB1(a)) + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// MSL HALF +//============================================================================================================================== + #ifdef A_HALF + #define AH1 half + #define AH2 half2 + #define AH3 half3 + #define AH4 half4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1 ushort + #define AW2 ushort2 + #define AW3 ushort3 + #define AW4 ushort4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASW1 short + #define ASW2 short2 + #define ASW3 short3 + #define ASW4 short4 +//============================================================================================================================== + A_STATIC AH2 AH2_AU1_x(AU1 x){return as_type(x);} + A_STATIC AH4 AH4_AU2_x(AU2 x){return as_type(x);} + A_STATIC AW2 AW2_AU1_x(AU1 x){return as_type(x);} + A_STATIC AW4 AW4_AU2_x(AU2 x){return as_type(x);} + #define AH2_AU1(x) AH2_AU1_x(AU1(x)) + #define AH4_AU2(x) AH4_AU2_x(AU2(x)) + #define AW2_AU1(x) AW2_AU1_x(AU1(x)) + #define AW4_AU2(x) AW4_AU2_x(AU2(x)) +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AU1_AH2_x(AH2 x){return as_type(x);} + A_STATIC AU2 AU2_AH4_x(AH4 x){return as_type(x);} + A_STATIC AU1 AU1_AW2_x(AW2 x){return as_type(x);} + A_STATIC AU2 AU2_AW4_x(AW4 x){return as_type(x);} + #define AU1_AH2(x) AU1_AH2_x(AH2(x)) + #define AU2_AH4(x) AU2_AH4_x(AH4(x)) + #define AU1_AW2(x) AU1_AW2_x(AW2(x)) + #define AU2_AW4(x) AU2_AW4_x(AW4(x)) +//============================================================================================================================== + #define AW1_AH1(x) as_type(AH1(x)) + #define AW2_AH2(x) as_type(AH2(x)) + #define AW3_AH3(x) as_type(AH3(x)) + #define AW4_AH4(x) as_type(AH4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AH1_AW1(x) as_type(AW1(x)) + #define AH2_AW2(x) as_type(AW2(x)) + #define AH3_AW3(x) as_type(AW3(x)) + #define AH4_AW4(x) as_type(AW4(x)) +//============================================================================================================================== + #define AH1_(a) AH1(AH1(a)) + #define AH2_(a) AH2(AH1(a)) + #define AH3_(a) AH3(AH1(a)) + #define AH4_(a) AH4(AH1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1_(a) AW1(AW1(a)) + #define AW2_(a) AW2(AW1(a)) + #define AW3_(a) AW3(AW1(a)) + #define AW4_(a) AW4(AW1(a)) +//============================================================================================================================== + A_STATIC AW1 AAbsSW1(AW1 a){return AW1(abs(ASW1(a)));} + A_STATIC AW2 AAbsSW2(AW2 a){return AW2(abs(ASW2(a)));} + A_STATIC AW3 AAbsSW3(AW3 a){return AW3(abs(ASW3(a)));} + A_STATIC AW4 AAbsSW4(AW4 a){return AW4(abs(ASW4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH1 AFractH1(AH1 x){return fract(x);} + A_STATIC AH2 AFractH2(AH2 x){return fract(x);} + A_STATIC AH3 AFractH3(AH3 x){return fract(x);} + A_STATIC AH4 AFractH4(AH4 x){return fract(x);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH1 ALerpH1(AH1 x,AH1 y,AH1 a){return mix(x,y,a);} + A_STATIC AH2 ALerpH2(AH2 x,AH2 y,AH2 a){return mix(x,y,a);} + A_STATIC AH3 ALerpH3(AH3 x,AH3 y,AH3 a){return mix(x,y,a);} + A_STATIC AH4 ALerpH4(AH4 x,AH4 y,AH4 a){return mix(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH1 AMax3H1(AH1 x,AH1 y,AH1 z){return max3(x,y,z);} + A_STATIC AH2 AMax3H2(AH2 x,AH2 y,AH2 z){return max3(x,y,z);} + A_STATIC AH3 AMax3H3(AH3 x,AH3 y,AH3 z){return max3(x,y,z);} + A_STATIC AH4 AMax3H4(AH4 x,AH4 y,AH4 z){return max3(x,y,z);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AW1 AMaxSW1(AW1 a,AW1 b){return AW1(max(ASU1(a),ASU1(b)));} + A_STATIC AW2 AMaxSW2(AW2 a,AW2 b){return AW2(max(ASU2(a),ASU2(b)));} + A_STATIC AW3 AMaxSW3(AW3 a,AW3 b){return AW3(max(ASU3(a),ASU3(b)));} + A_STATIC AW4 AMaxSW4(AW4 a,AW4 b){return AW4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH1 AMin3H1(AH1 x,AH1 y,AH1 z){return min3(x,y,z);} + A_STATIC AH2 AMin3H2(AH2 x,AH2 y,AH2 z){return min3(x,y,z);} + A_STATIC AH3 AMin3H3(AH3 x,AH3 y,AH3 z){return min3(x,y,z);} + A_STATIC AH4 AMin3H4(AH4 x,AH4 y,AH4 z){return min3(x,y,z);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AW1 AMinSW1(AW1 a,AW1 b){return AW1(min(ASU1(a),ASU1(b)));} + A_STATIC AW2 AMinSW2(AW2 a,AW2 b){return AW2(min(ASU2(a),ASU2(b)));} + A_STATIC AW3 AMinSW3(AW3 a,AW3 b){return AW3(min(ASU3(a),ASU3(b)));} + A_STATIC AW4 AMinSW4(AW4 a,AW4 b){return AW4(min(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH1 ARcpH1(AH1 x){return 1.h/x;} + A_STATIC AH2 ARcpH2(AH2 x){return 1.h/x;} + A_STATIC AH3 ARcpH3(AH3 x){return 1.h/x;} + A_STATIC AH4 ARcpH4(AH4 x){return 1.h/x;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH1 ARsqH1(AH1 x){return rsqrt(x);} + A_STATIC AH2 ARsqH2(AH2 x){return rsqrt(x);} + A_STATIC AH3 ARsqH3(AH3 x){return rsqrt(x);} + A_STATIC AH4 ARsqH4(AH4 x){return rsqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH1 ASatH1(AH1 x){return saturate(x);} + A_STATIC AH2 ASatH2(AH2 x){return saturate(x);} + A_STATIC AH3 ASatH3(AH3 x){return saturate(x);} + A_STATIC AH4 ASatH4(AH4 x){return saturate(x);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AW1 AShrSW1(AW1 a,AW1 b){return AW1(ASW1(a)>>ASW1(b));} + A_STATIC AW2 AShrSW2(AW2 a,AW2 b){return AW2(ASW2(a)>>ASW2(b));} + A_STATIC AW3 AShrSW3(AW3 a,AW3 b){return AW3(ASW3(a)>>ASW3(b));} + A_STATIC AW4 AShrSW4(AW4 a,AW4 b){return AW4(ASW4(a)>>ASW4(b));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// MSL DOUBLE +//============================================================================================================================== + #if defined(A_DUBL) && defined(__HAVE_NATIVE_DOUBLE__) // Not currently supported in MSL + #define AD1 double + #define AD2 double2 + #define AD3 double3 + #define AD4 double4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AD1_(a) AD1(AD1(a)) + #define AD2_(a) AD2(AD1(a)) + #define AD3_(a) AD3(AD1(a)) + #define AD4_(a) AD4(AD1(a)) +//============================================================================================================================== + A_STATIC AD1 AFractD1(AD1 a){return fract(a);} + A_STATIC AD2 AFractD2(AD2 a){return fract(a);} + A_STATIC AD3 AFractD3(AD3 a){return fract(a);} + A_STATIC AD4 AFractD4(AD4 a){return fract(a);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ALerpD1(AD1 x,AD1 y,AD1 a){return mix(x,y,a);} + A_STATIC AD2 ALerpD2(AD2 x,AD2 y,AD2 a){return mix(x,y,a);} + A_STATIC AD3 ALerpD3(AD3 x,AD3 y,AD3 a){return mix(x,y,a);} + A_STATIC AD4 ALerpD4(AD4 x,AD4 y,AD4 a){return mix(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ARcpD1(AD1 x){return 1.0/x;} + A_STATIC AD2 ARcpD2(AD2 x){return 1.0/x;} + A_STATIC AD3 ARcpD3(AD3 x){return 1.0/x;} + A_STATIC AD4 ARcpD4(AD4 x){return 1.0/x;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ARsqD1(AD1 x){return rsqrt(x);} + A_STATIC AD2 ARsqD2(AD2 x){return rsqrt(x);} + A_STATIC AD3 ARsqD3(AD3 x){return rsqrt(x);} + A_STATIC AD4 ARsqD4(AD4 x){return rsqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ASatD1(AD1 x){return saturate(x);} + A_STATIC AD2 ASatD2(AD2 x){return saturate(x);} + A_STATIC AD3 ASatD3(AD3 x){return saturate(x);} + A_STATIC AD4 ASatD4(AD4 x){return saturate(x);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// MSL LONG +//============================================================================================================================== + #ifdef A_LONG + #define AL1 ulong + #define AL2 ulong2 + #define AL3 ulong3 + #define AL4 ulong4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASL1 long + #define ASL2 long2 + #define ASL3 long3 + #define ASL4 long4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AL1_AU2(x) as_type(AU2(x)) + #define AU2_AL1(x) as_type(AL1(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AL1_(a) AL1(AL1(a)) + #define AL2_(a) AL2(AL1(a)) + #define AL3_(a) AL3(AL1(a)) + #define AL4_(a) AL4(AL1(a)) +//============================================================================================================================== + A_STATIC AL1 AAbsSL1(AL1 a){return AL1(abs(ASL1(a)));} + A_STATIC AL2 AAbsSL2(AL2 a){return AL2(abs(ASL2(a)));} + A_STATIC AL3 AAbsSL3(AL3 a){return AL3(abs(ASL3(a)));} + A_STATIC AL4 AAbsSL4(AL4 a){return AL4(abs(ASL4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AL1 AMaxSL1(AL1 a,AL1 b){return AL1(max(ASU1(a),ASU1(b)));} + A_STATIC AL2 AMaxSL2(AL2 a,AL2 b){return AL2(max(ASU2(a),ASU2(b)));} + A_STATIC AL3 AMaxSL3(AL3 a,AL3 b){return AL3(max(ASU3(a),ASU3(b)));} + A_STATIC AL4 AMaxSL4(AL4 a,AL4 b){return AL4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AL1 AMinSL1(AL1 a,AL1 b){return AL1(min(ASU1(a),ASU1(b)));} + A_STATIC AL2 AMinSL2(AL2 a,AL2 b){return AL2(min(ASU2(a),ASU2(b)));} + A_STATIC AL3 AMinSL3(AL3 a,AL3 b){return AL3(min(ASU3(a),ASU3(b)));} + A_STATIC AL4 AMinSL4(AL4 a,AL4 b){return AL4(min(ASU4(a),ASU4(b)));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// WAVE OPERATIONS +//============================================================================================================================== + #ifdef A_WAVE + A_STATIC AF1 AWaveAdd(AF1 v){return simd_sum(v);} + A_STATIC AF2 AWaveAdd(AF2 v){return simd_sum(v);} + A_STATIC AF3 AWaveAdd(AF3 v){return simd_sum(v);} + A_STATIC AF4 AWaveAdd(AF4 v){return simd_sum(v);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// MSL END +//============================================================================================================================== + // Clear the replacement macros we defined earlier + #ifndef __HAVE_MEDIAN3__ + #define median3(x,y,z) max(min(x,y),min(max(x,y),z)) + #endif + #ifndef __HAVE_MIN3__ + #define min3(x,y,z) min(x,min(y,z)) + #endif + #ifndef __HAVE_MAX3__ + #define max3(x,y,z) max(x,max(y,z)) + #endif +//============================================================================================================================== +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// GPU COMMON +// +// +//============================================================================================================================== +#ifdef A_GPU + #ifndef A_MSL + #define A_STATIC + #define A_MAYBE_UNUSED + #endif + // Negative and positive infinity. + #define A_INFN_F AF1_AU1(0x7f800000u) + #define A_INFP_F AF1_AU1(0xff800000u) +//------------------------------------------------------------------------------------------------------------------------------ + // Copy sign from 's' to positive 'd'. + A_STATIC AF1 ACpySgnF1(AF1 d,AF1 s){return AF1_AU1(AU1_AF1(d)|(AU1_AF1(s)&AU1_(0x80000000u)));} + A_STATIC AF2 ACpySgnF2(AF2 d,AF2 s){return AF2_AU2(AU2_AF2(d)|(AU2_AF2(s)&AU2_(0x80000000u)));} + A_STATIC AF3 ACpySgnF3(AF3 d,AF3 s){return AF3_AU3(AU3_AF3(d)|(AU3_AF3(s)&AU3_(0x80000000u)));} + A_STATIC AF4 ACpySgnF4(AF4 d,AF4 s){return AF4_AU4(AU4_AF4(d)|(AU4_AF4(s)&AU4_(0x80000000u)));} +//------------------------------------------------------------------------------------------------------------------------------ + // Single operation to return (useful to create a mask to use in lerp for branch free logic), + // m=NaN := 0 + // m>=0 := 0 + // m<0 := 1 + // Uses the following useful floating point logic, + // saturate(+a*(-INF)==-INF) := 0 + // saturate( 0*(-INF)== NaN) := 0 + // saturate(-a*(-INF)==+INF) := 1 + A_STATIC AF1 ASignedF1(AF1 m){return ASatF1(m*AF1_(A_INFN_F));} + A_STATIC AF2 ASignedF2(AF2 m){return ASatF2(m*AF2_(A_INFN_F));} + A_STATIC AF3 ASignedF3(AF3 m){return ASatF3(m*AF3_(A_INFN_F));} + A_STATIC AF4 ASignedF4(AF4 m){return ASatF4(m*AF4_(A_INFN_F));} +//============================================================================================================================== + #ifdef A_HALF + #define A_INFN_H AH1_AW1(0x7c00u) + #define A_INFP_H AH1_AW1(0xfc00u) +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH1 ACpySgnH1(AH1 d,AH1 s){return AH1_AW1(AW1_AH1(d)|(AW1_AH1(s)&AW1_(0x8000u)));} + A_STATIC AH2 ACpySgnH2(AH2 d,AH2 s){return AH2_AW2(AW2_AH2(d)|(AW2_AH2(s)&AW2_(0x8000u)));} + A_STATIC AH3 ACpySgnH3(AH3 d,AH3 s){return AH3_AW3(AW3_AH3(d)|(AW3_AH3(s)&AW3_(0x8000u)));} + A_STATIC AH4 ACpySgnH4(AH4 d,AH4 s){return AH4_AW4(AW4_AH4(d)|(AW4_AH4(s)&AW4_(0x8000u)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH1 ASignedH1(AH1 m){return ASatH1(m*AH1_(A_INFN_H));} + A_STATIC AH2 ASignedH2(AH2 m){return ASatH2(m*AH2_(A_INFN_H));} + A_STATIC AH3 ASignedH3(AH3 m){return ASatH3(m*AH3_(A_INFN_H));} + A_STATIC AH4 ASignedH4(AH4 m){return ASatH4(m*AH4_(A_INFN_H));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HALF APPROXIMATIONS +//------------------------------------------------------------------------------------------------------------------------------ +// These support only positive inputs. +// Did not see value yet in specialization for range. +// Using quick testing, ended up mostly getting the same "best" approximation for various ranges. +// With hardware that can co-execute transcendentals, the value in approximations could be less than expected. +// However from a latency perspective, if execution of a transcendental is 4 clk, with no packed support, -> 8 clk total. +// And co-execution would require a compiler interleaving a lot of independent work for packed usage. +//------------------------------------------------------------------------------------------------------------------------------ +// The one Newton Raphson iteration form of rsq() was skipped (requires 6 ops total). +// Same with sqrt(), as this could be x*rsq() (7 ops). +//------------------------------------------------------------------------------------------------------------------------------ +// IDEAS +// ===== +// - Polaris hardware has 16-bit support, but non-double rate. +// Could be possible still get part double rate for some of this logic, +// by clearing out the lower half's sign when necessary and using 32-bit ops... +//============================================================================================================================== + #ifdef A_HALF + // Minimize squared error across full positive range, 2 ops. + // The 0x1de2 based approximation maps {0 to 1} input maps to < 1 output. + A_STATIC AH1 APrxLoSqrtH1(AH1 a){return AH1_AW1((AW1_AH1(a)>>AW1_(1))+AW1_(0x1de2));} + A_STATIC AH2 APrxLoSqrtH2(AH2 a){return AH2_AW2((AW2_AH2(a)>>AW2_(1))+AW2_(0x1de2));} +//------------------------------------------------------------------------------------------------------------------------------ + // Lower precision estimation, 1 op. + // Minimize squared error across {smallest normal to 16384.0}. + A_STATIC AH1 APrxLoRcpH1(AH1 a){return AH1_AW1(AW1_(0x7784)-AW1_AH1(a));} + A_STATIC AH2 APrxLoRcpH2(AH2 a){return AH2_AW2(AW2_(0x7784)-AW2_AH2(a));} +//------------------------------------------------------------------------------------------------------------------------------ + // Medium precision estimation, one Newton Raphson iteration, 3 ops. + A_STATIC AH1 APrxMedRcpH1(AH1 a){AH1 b=AH1_AW1(AW1_(0x778d)-AW1_AH1(a));return b*(-b*a+AH1_(2.0));} + A_STATIC AH2 APrxMedRcpH2(AH2 a){AH2 b=AH2_AW2(AW2_(0x778d)-AW2_AH2(a));return b*(-b*a+AH2_(2.0));} +//------------------------------------------------------------------------------------------------------------------------------ + // Minimize squared error across {smallest normal to 16384.0}, 2 ops. + A_STATIC AH1 APrxLoRsqH1(AH1 a){return AH1_AW1(AW1_(0x59a3)-(AW1_AH1(a)>>AW1_(1)));} + A_STATIC AH2 APrxLoRsqH2(AH2 a){return AH2_AW2(AW2_(0x59a3)-(AW2_AH2(a)>>AW2_(1)));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// FLOAT APPROXIMATIONS +//------------------------------------------------------------------------------------------------------------------------------ +// Michal Drobot has an excellent presentation on these: "Low Level Optimizations For GCN", +// - Idea dates back to SGI, then to Quake 3, etc. +// - https://michaldrobot.files.wordpress.com/2014/05/gcn_alu_opt_digitaldragons2014.pdf +// - sqrt(x)=rsqrt(x)*x +// - rcp(x)=rsqrt(x)*rsqrt(x) for positive x +// - https://github.com/michaldrobot/ShaderFastLibs/blob/master/ShaderFastMathLib.h +//------------------------------------------------------------------------------------------------------------------------------ +// These below are from perhaps less complete searching for optimal. +// Used FP16 normal range for testing with +4096 32-bit step size for sampling error. +// So these match up well with the half approximations. +//============================================================================================================================== + A_STATIC AF1 APrxLoSqrtF1(AF1 a){return AF1_AU1((AU1_AF1(a)>>AU1_(1))+AU1_(0x1fbc4639));} + A_STATIC AF1 APrxLoRcpF1(AF1 a){return AF1_AU1(AU1_(0x7ef07ebb)-AU1_AF1(a));} + A_STATIC AF1 APrxMedRcpF1(AF1 a){AF1 b=AF1_AU1(AU1_(0x7ef19fff)-AU1_AF1(a));return b*(-b*a+AF1_(2.0));} + A_STATIC AF1 APrxLoRsqF1(AF1 a){return AF1_AU1(AU1_(0x5f347d74)-(AU1_AF1(a)>>AU1_(1)));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// PARABOLIC SIN & COS +//------------------------------------------------------------------------------------------------------------------------------ +// Approximate answers to transcendental questions. +//------------------------------------------------------------------------------------------------------------------------------ +// TODO +// ==== +// - Verify packed math ABS is correctly doing an AND. +//============================================================================================================================== + // Valid input range is {-1 to 1} representing {0 to 2 pi}. + // Output range is {-1/4 to -1/4} representing {-1 to 1}. + A_STATIC AF1 APSinF1(AF1 x){return x*abs(x)-x;} // MAD. + A_STATIC AF1 APCosF1(AF1 x){x=AFractF1(x*AF1_(0.5)+AF1_(0.75));x=x*AF1_(2.0)-AF1_(1.0);return APSinF1(x);} // 3x MAD, FRACT +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_HALF + // For a packed {sin,cos} pair, + // - Native takes 16 clocks and 4 issue slots (no packed transcendentals). + // - Parabolic takes 8 clocks and 8 issue slots (only fract is non-packed). + A_STATIC AH2 APSinH2(AH2 x){return x*abs(x)-x;} // AND,FMA + A_STATIC AH2 APCosH2(AH2 x){x=AFractH2(x*AH2_(0.5)+AH2_(0.75));x=x*AH2_(2.0)-AH2_(1.0);return APSinH2(x);} // 3x FMA, 2xFRACT, AND + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// COLOR CONVERSIONS +//------------------------------------------------------------------------------------------------------------------------------ +// These are all linear to/from some other space (where 'linear' has been shortened out of the function name). +// So 'ToGamma' is 'LinearToGamma', and 'FromGamma' is 'LinearFromGamma'. +// These are branch free implementations. +// The AToSrgbF1() function is useful for stores for compute shaders for GPUs without hardware linear->sRGB store conversion. +//------------------------------------------------------------------------------------------------------------------------------ +// TRANSFER FUNCTIONS +// ================== +// 709 ..... Rec709 used for some HDTVs +// Gamma ... Typically 2.2 for some PC displays, or 2.4-2.5 for CRTs, or 2.2 FreeSync2 native +// Pq ...... PQ native for HDR10 +// Srgb .... The sRGB output, typical of PC displays, useful for 10-bit output, or storing to 8-bit UNORM without SRGB type +// Two ..... Gamma 2.0, fastest conversion (useful for intermediate pass approximations) +//------------------------------------------------------------------------------------------------------------------------------ +// FOR PQ +// ====== +// Both input and output is {0.0-1.0}, and where output 1.0 represents 10000.0 cd/m^2. +// All constants are only specified to FP32 precision. +// External PQ source reference, +// - https://github.com/ampas/aces-dev/blob/master/transforms/ctl/utilities/ACESlib.Utilities_Color.a1.0.1.ctl +//------------------------------------------------------------------------------------------------------------------------------ +// PACKED VERSIONS +// =============== +// These are the A*H2() functions. +// There is no PQ functions as FP16 seemed to not have enough precision for the conversion. +// The remaining functions are "good enough" for 8-bit, and maybe 10-bit if not concerned about a few 1-bit errors. +// Precision is lowest in the 709 conversion, higher in sRGB, higher still in Two and Gamma (when using 2.2 at least). +//------------------------------------------------------------------------------------------------------------------------------ +// NOTES +// ===== +// Could be faster for PQ conversions to be in ALU or a texture lookup depending on usage case. +//============================================================================================================================== + A_STATIC AF1 ATo709F1(AF1 c){return max(min(c*AF1_(4.5),AF1_(0.018)),AF1_(1.099)*pow(c,AF1_(0.45))-AF1_(0.099));} +//------------------------------------------------------------------------------------------------------------------------------ + // Note 'rcpX' is '1/x', where the 'x' is what would be used in AFromGamma(). + A_STATIC AF1 AToGammaF1(AF1 c,AF1 rcpX){return pow(c,rcpX);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AToPqF1(AF1 x){AF1 p=pow(x,AF1_(0.159302)); + return pow((AF1_(0.835938)+AF1_(18.8516)*p)/(AF1_(1.0)+AF1_(18.6875)*p),AF1_(78.8438));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AToSrgbF1(AF1 c){return max(min(c*AF1_(12.92),AF1_(0.0031308)),AF1_(1.055)*pow(c,AF1_(0.41666))-AF1_(0.055));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AToTwoF1(AF1 c){return sqrt(c);} +//============================================================================================================================== + A_STATIC AF1 AFrom709F1(AF1 c){return max(min(c*AF1_(1.0/4.5),AF1_(0.081)), + pow((c+AF1_(0.099))*(AF1_(1.0)/(AF1_(1.099))),AF1_(1.0/0.45)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AFromGammaF1(AF1 c,AF1 x){return pow(c,x);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AFromPqF1(AF1 x){AF1 p=pow(x,AF1_(0.0126833)); + return pow(ASatF1(p-AF1_(0.835938))/(AF1_(18.8516)-AF1_(18.6875)*p),AF1_(6.27739));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AFromSrgbF1(AF1 c){return max(min(c*AF1_(1.0/12.92),AF1_(0.04045)), + pow((c+AF1_(0.055))*(AF1_(1.0)/AF1_(1.055)),AF1_(2.4)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF1 AFromTwoF1(AF1 c){return c*c;} +//============================================================================================================================== + #ifdef A_HALF + A_STATIC AH2 ATo709H2(AH2 c){return max(min(c*AH2_(4.5),AH2_(0.018)),AH2_(1.099)*pow(c,AH2_(0.45))-AH2_(0.099));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH2 AToGammaH2(AH2 c,AH1 rcpX){return pow(c,AH2_(rcpX));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH2 AToSrgbH2(AH2 c){return max(min(c*AH2_(12.92),AH2_(0.0031308)),AH2_(1.055)*pow(c,AH2_(0.41666))-AH2_(0.055));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH2 AToTwoH2(AH2 c){return sqrt(c);} + #endif +//============================================================================================================================== + #ifdef A_HALF + A_STATIC AH2 AFrom709H2(AH2 c){return max(min(c*AH2_(1.0/4.5),AH2_(0.081)), + pow((c+AH2_(0.099))*(AH2_(1.0)/(AH2_(1.099))),AH2_(1.0/0.45)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH2 AFromGammaH2(AH2 c,AH1 x){return pow(c,AH2_(x));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH2 AFromSrgbH2(AH2 c){return max(min(c*AH2_(1.0/12.92),AH2_(0.04045)), + pow((c+AH2_(0.055))*(AH2_(1.0)/AH2_(1.055)),AH2_(2.4)));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AH2 AFromTwoH2(AH2 c){return c*c;} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// CS REMAP +//============================================================================================================================== + // Simple remap 64x1 to 8x8 with rotated 2x2 pixel quads in quad linear. + // 543210 + // ====== + // ..xxx. + // yy...y + A_STATIC AU2 ARmp8x8(AU1 a){return AU2(ABfe(a,1u,3u),ABfiM(ABfe(a,3u,3u),a,1u));} +//============================================================================================================================== + // More complex remap 64x1 to 8x8 which is necessary for 2D wave reductions. + // 543210 + // ====== + // .xx..x + // y..yy. + // Details, + // LANE TO 8x8 MAPPING + // =================== + // 00 01 08 09 10 11 18 19 + // 02 03 0a 0b 12 13 1a 1b + // 04 05 0c 0d 14 15 1c 1d + // 06 07 0e 0f 16 17 1e 1f + // 20 21 28 29 30 31 38 39 + // 22 23 2a 2b 32 33 3a 3b + // 24 25 2c 2d 34 35 3c 3d + // 26 27 2e 2f 36 37 3e 3f + A_STATIC AU2 ARmpRed8x8(AU1 a){return AU2(ABfiM(ABfe(a,2u,3u),a,1u),ABfiM(ABfe(a,3u,3u),ABfe(a,1u,2u),2u));} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// REFERENCE +// +//------------------------------------------------------------------------------------------------------------------------------ +// IEEE FLOAT RULES +// ================ +// - saturate(NaN)=0, saturate(-INF)=0, saturate(+INF)=1 +// - {+/-}0 * {+/-}INF = NaN +// - -INF + (+INF) = NaN +// - {+/-}0 / {+/-}0 = NaN +// - {+/-}INF / {+/-}INF = NaN +// - a<(-0) := sqrt(a) = NaN (a=-0.0 won't NaN) +// - 0 == -0 +// - 4/0 = +INF +// - 4/-0 = -INF +// - 4+INF = +INF +// - 4-INF = -INF +// - 4*(+INF) = +INF +// - 4*(-INF) = -INF +// - -4*(+INF) = -INF +// - sqrt(+INF) = +INF +//------------------------------------------------------------------------------------------------------------------------------ +// FP16 ENCODING +// ============= +// fedcba9876543210 +// ---------------- +// ......mmmmmmmmmm 10-bit mantissa (encodes 11-bit 0.5 to 1.0 except for denormals) +// .eeeee.......... 5-bit exponent +// .00000.......... denormals +// .00001.......... -14 exponent +// .11110.......... 15 exponent +// .111110000000000 infinity +// .11111nnnnnnnnnn NaN with n!=0 +// s............... sign +//------------------------------------------------------------------------------------------------------------------------------ +// FP16/INT16 ALIASING DENORMAL +// ============================ +// 11-bit unsigned integers alias with half float denormal/normal values, +// 1 = 2^(-24) = 1/16777216 ....................... first denormal value +// 2 = 2^(-23) +// ... +// 1023 = 2^(-14)*(1-2^(-10)) = 2^(-14)*(1-1/1024) ... last denormal value +// 1024 = 2^(-14) = 1/16384 .......................... first normal value that still maps to integers +// 2047 .............................................. last normal value that still maps to integers +// Scaling limits, +// 2^15 = 32768 ...................................... largest power of 2 scaling +// Largest pow2 conversion mapping is at *32768, +// 1 : 2^(-9) = 1/128 +// 1024 : 8 +// 2047 : a little less than 16 +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// GPU/CPU PORTABILITY +// +// +//------------------------------------------------------------------------------------------------------------------------------ +// This is the GPU implementation. +// See the CPU implementation for docs. +//============================================================================================================================== +#ifdef A_GPU + #define A_TRUE true + #define A_FALSE false +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR ARGUMENT/RETURN/INITIALIZATION PORTABILITY +//============================================================================================================================== + #define retAD2 AD2 + #define retAD3 AD3 + #define retAD4 AD4 + #define retAF2 AF2 + #define retAF3 AF3 + #define retAF4 AF4 + #define retAL2 AL2 + #define retAL3 AL3 + #define retAL4 AL4 + #define retAU2 AU2 + #define retAU3 AU3 + #define retAU4 AU4 + + #ifdef A_MSL +//------------------------------------------------------------------------------------------------------------------------------ + #define inAD1 AD2 + #define inAD2 AD2 + #define inAD3 AD3 + #define inAD4 AD4 + #define inAF1 AF1 + #define inAF2 AF2 + #define inAF3 AF3 + #define inAF4 AF4 + #define inAL1 AL1 + #define inAL2 AL2 + #define inAL3 AL3 + #define inAL4 AL4 + #define inAU1 AU1 + #define inAU2 AU2 + #define inAU3 AU3 + #define inAU4 AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define inoutAD1 thread AD1& + #define inoutAD2 thread AD2& + #define inoutAD3 thread AD3& + #define inoutAD4 thread AD4& + #define inoutAF1 thread AF1& + #define inoutAF2 thread AF2& + #define inoutAF3 thread AF3& + #define inoutAF4 thread AF4& + #define inoutAH1 thread AH1& + #define inoutAH2 thread AH2& + #define inoutAH3 thread AH3& + #define inoutAH4 thread AH4& + #define inoutAL1 thread AL1& + #define inoutAL2 thread AL2& + #define inoutAL3 thread AL3& + #define inoutAL4 thread AL4& + #define inoutAU1 thread AU1& + #define inoutAU2 thread AU2& + #define inoutAU3 thread AU3& + #define inoutAU4 thread AU4& +//------------------------------------------------------------------------------------------------------------------------------ + #define outAD1 thread AD1& + #define outAD2 thread AD2& + #define outAD3 thread AD3& + #define outAD4 thread AD4& + #define outAF1 thread AF1& + #define outAF2 thread AF2& + #define outAF3 thread AF3& + #define outAF4 thread AF4& + #define outAH1 thread AH1& + #define outAH2 thread AH2& + #define outAH3 thread AH3& + #define outAH4 thread AH4& + #define outAL1 thread AL1& + #define outAL2 thread AL2& + #define outAL3 thread AL3& + #define outAL4 thread AL4& + #define outAU1 thread AU1& + #define outAU2 thread AU2& + #define outAU3 thread AU3& + #define outAU4 thread AU4& + #else +//------------------------------------------------------------------------------------------------------------------------------ + #define inAD1 in AD2 + #define inAD2 in AD2 + #define inAD3 in AD3 + #define inAD4 in AD4 + #define inAF1 in AF1 + #define inAF2 in AF2 + #define inAF3 in AF3 + #define inAF4 in AF4 + #define inAL1 in AL1 + #define inAL2 in AL2 + #define inAL3 in AL3 + #define inAL4 in AL4 + #define inAU1 in AU1 + #define inAU2 in AU2 + #define inAU3 in AU3 + #define inAU4 in AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define inoutAD1 inout AD1 + #define inoutAD2 inout AD2 + #define inoutAD3 inout AD3 + #define inoutAD4 inout AD4 + #define inoutAF1 inout AF1 + #define inoutAF2 inout AF2 + #define inoutAF3 inout AF3 + #define inoutAF4 inout AF4 + #define inoutAH1 inout AH1 + #define inoutAH2 inout AH2 + #define inoutAH3 inout AH3 + #define inoutAH4 inout AH4 + #define inoutAL1 inout AL1 + #define inoutAL2 inout AL2 + #define inoutAL3 inout AL3 + #define inoutAL4 inout AL4 + #define inoutAU1 inout AU1 + #define inoutAU2 inout AU2 + #define inoutAU3 inout AU3 + #define inoutAU4 inout AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define outAD1 out AD1 + #define outAD2 out AD2 + #define outAD3 out AD3 + #define outAD4 out AD4 + #define outAF1 out AF1 + #define outAF2 out AF2 + #define outAF3 out AF3 + #define outAF4 out AF4 + #define outAH1 out AH1 + #define outAH2 out AH2 + #define outAH3 out AH3 + #define outAH4 out AH4 + #define outAL1 out AL1 + #define outAL2 out AL2 + #define outAL3 out AL3 + #define outAL4 out AL4 + #define outAU1 out AU1 + #define outAU2 out AU2 + #define outAU3 out AU3 + #define outAU4 out AU4 + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #define varAD2(x) AD2 x + #define varAD3(x) AD3 x + #define varAD4(x) AD4 x + #define varAF2(x) AF2 x + #define varAF3(x) AF3 x + #define varAF4(x) AF4 x + #define varAL2(x) AL2 x + #define varAL3(x) AL3 x + #define varAL4(x) AL4 x + #define varAU2(x) AU2 x + #define varAU3(x) AU3 x + #define varAU4(x) AU4 x +//------------------------------------------------------------------------------------------------------------------------------ + #define initAD2(x,y) AD2(x,y) + #define initAD3(x,y,z) AD3(x,y,z) + #define initAD4(x,y,z,w) AD4(x,y,z,w) + #define initAF2(x,y) AF2(x,y) + #define initAF3(x,y,z) AF3(x,y,z) + #define initAF4(x,y,z,w) AF4(x,y,z,w) + #define initAL2(x,y) AL2(x,y) + #define initAL3(x,y,z) AL3(x,y,z) + #define initAL4(x,y,z,w) AL4(x,y,z,w) + #define initAU2(x,y) AU2(x,y) + #define initAU3(x,y,z) AU3(x,y,z) + #define initAU4(x,y,z,w) AU4(x,y,z,w) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS +//============================================================================================================================== + #define AAbsD1(a) abs(AD1(a)) + #define AAbsF1(a) abs(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ACosD1(a) cos(AD1(a)) + #define ACosF1(a) cos(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ADotD2(a,b) dot(AD2(a),AD2(b)) + #define ADotD3(a,b) dot(AD3(a),AD3(b)) + #define ADotD4(a,b) dot(AD4(a),AD4(b)) + #define ADotF2(a,b) dot(AF2(a),AF2(b)) + #define ADotF3(a,b) dot(AF3(a),AF3(b)) + #define ADotF4(a,b) dot(AF4(a),AF4(b)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AExp2D1(a) exp2(AD1(a)) + #define AExp2F1(a) exp2(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AFloorD1(a) floor(AD1(a)) + #define AFloorF1(a) floor(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ALog2D1(a) log2(AD1(a)) + #define ALog2F1(a) log2(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AMaxD1(a,b) min(a,b) + #define AMaxF1(a,b) min(a,b) + #define AMaxL1(a,b) min(a,b) + #define AMaxU1(a,b) min(a,b) +//------------------------------------------------------------------------------------------------------------------------------ + #define AMinD1(a,b) min(a,b) + #define AMinF1(a,b) min(a,b) + #define AMinL1(a,b) min(a,b) + #define AMinU1(a,b) min(a,b) +//------------------------------------------------------------------------------------------------------------------------------ + #define ASinD1(a) sin(AD1(a)) + #define ASinF1(a) sin(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ASqrtD1(a) sqrt(AD1(a)) + #define ASqrtF1(a) sqrt(AF1(a)) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS - DEPENDENT +//============================================================================================================================== + #define APowD1(a,b) pow(AD1(a),AF1(b)) + #define APowF1(a,b) pow(AF1(a),AF1(b)) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR OPS +//------------------------------------------------------------------------------------------------------------------------------ +// These are added as needed for production or prototyping, so not necessarily a complete set. +// They follow a convention of taking in a destination and also returning the destination value to increase utility. +//============================================================================================================================== + #ifdef A_DUBL + A_STATIC AD2 opAAbsD2(outAD2 d,inAD2 a){d=abs(a);return d;} + A_STATIC AD3 opAAbsD3(outAD3 d,inAD3 a){d=abs(a);return d;} + A_STATIC AD4 opAAbsD4(outAD4 d,inAD4 a){d=abs(a);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opAAddD2(outAD2 d,inAD2 a,inAD2 b){d=a+b;return d;} + A_STATIC AD3 opAAddD3(outAD3 d,inAD3 a,inAD3 b){d=a+b;return d;} + A_STATIC AD4 opAAddD4(outAD4 d,inAD4 a,inAD4 b){d=a+b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opACpyD2(outAD2 d,inAD2 a){d=a;return d;} + A_STATIC AD3 opACpyD3(outAD3 d,inAD3 a){d=a;return d;} + A_STATIC AD4 opACpyD4(outAD4 d,inAD4 a){d=a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opALerpD2(outAD2 d,inAD2 a,inAD2 b,inAD2 c){d=ALerpD2(a,b,c);return d;} + A_STATIC AD3 opALerpD3(outAD3 d,inAD3 a,inAD3 b,inAD3 c){d=ALerpD3(a,b,c);return d;} + A_STATIC AD4 opALerpD4(outAD4 d,inAD4 a,inAD4 b,inAD4 c){d=ALerpD4(a,b,c);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opALerpOneD2(outAD2 d,inAD2 a,inAD2 b,AD1 c){d=ALerpD2(a,b,AD2_(c));return d;} + A_STATIC AD3 opALerpOneD3(outAD3 d,inAD3 a,inAD3 b,AD1 c){d=ALerpD3(a,b,AD3_(c));return d;} + A_STATIC AD4 opALerpOneD4(outAD4 d,inAD4 a,inAD4 b,AD1 c){d=ALerpD4(a,b,AD4_(c));return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opAMaxD2(outAD2 d,inAD2 a,inAD2 b){d=max(a,b);return d;} + A_STATIC AD3 opAMaxD3(outAD3 d,inAD3 a,inAD3 b){d=max(a,b);return d;} + A_STATIC AD4 opAMaxD4(outAD4 d,inAD4 a,inAD4 b){d=max(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opAMinD2(outAD2 d,inAD2 a,inAD2 b){d=min(a,b);return d;} + A_STATIC AD3 opAMinD3(outAD3 d,inAD3 a,inAD3 b){d=min(a,b);return d;} + A_STATIC AD4 opAMinD4(outAD4 d,inAD4 a,inAD4 b){d=min(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opAMulD2(outAD2 d,inAD2 a,inAD2 b){d=a*b;return d;} + A_STATIC AD3 opAMulD3(outAD3 d,inAD3 a,inAD3 b){d=a*b;return d;} + A_STATIC AD4 opAMulD4(outAD4 d,inAD4 a,inAD4 b){d=a*b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opAMulOneD2(outAD2 d,inAD2 a,AD1 b){d=a*AD2_(b);return d;} + A_STATIC AD3 opAMulOneD3(outAD3 d,inAD3 a,AD1 b){d=a*AD3_(b);return d;} + A_STATIC AD4 opAMulOneD4(outAD4 d,inAD4 a,AD1 b){d=a*AD4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opANegD2(outAD2 d,inAD2 a){d=-a;return d;} + A_STATIC AD3 opANegD3(outAD3 d,inAD3 a){d=-a;return d;} + A_STATIC AD4 opANegD4(outAD4 d,inAD4 a){d=-a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD2 opARcpD2(outAD2 d,inAD2 a){d=ARcpD2(a);return d;} + A_STATIC AD3 opARcpD3(outAD3 d,inAD3 a){d=ARcpD3(a);return d;} + A_STATIC AD4 opARcpD4(outAD4 d,inAD4 a){d=ARcpD4(a);return d;} + #endif +//============================================================================================================================== + A_STATIC AF2 opAAbsF2(outAF2 d,inAF2 a){d=abs(a);return d;} + A_STATIC AF3 opAAbsF3(outAF3 d,inAF3 a){d=abs(a);return d;} + A_STATIC AF4 opAAbsF4(outAF4 d,inAF4 a){d=abs(a);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opAAddF2(outAF2 d,inAF2 a,inAF2 b){d=a+b;return d;} + A_STATIC AF3 opAAddF3(outAF3 d,inAF3 a,inAF3 b){d=a+b;return d;} + A_STATIC AF4 opAAddF4(outAF4 d,inAF4 a,inAF4 b){d=a+b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opACpyF2(outAF2 d,inAF2 a){d=a;return d;} + A_STATIC AF3 opACpyF3(outAF3 d,inAF3 a){d=a;return d;} + A_STATIC AF4 opACpyF4(outAF4 d,inAF4 a){d=a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opALerpF2(outAF2 d,inAF2 a,inAF2 b,inAF2 c){d=ALerpF2(a,b,c);return d;} + A_STATIC AF3 opALerpF3(outAF3 d,inAF3 a,inAF3 b,inAF3 c){d=ALerpF3(a,b,c);return d;} + A_STATIC AF4 opALerpF4(outAF4 d,inAF4 a,inAF4 b,inAF4 c){d=ALerpF4(a,b,c);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opALerpOneF2(outAF2 d,inAF2 a,inAF2 b,AF1 c){d=ALerpF2(a,b,AF2_(c));return d;} + A_STATIC AF3 opALerpOneF3(outAF3 d,inAF3 a,inAF3 b,AF1 c){d=ALerpF3(a,b,AF3_(c));return d;} + A_STATIC AF4 opALerpOneF4(outAF4 d,inAF4 a,inAF4 b,AF1 c){d=ALerpF4(a,b,AF4_(c));return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opAMaxF2(outAF2 d,inAF2 a,inAF2 b){d=max(a,b);return d;} + A_STATIC AF3 opAMaxF3(outAF3 d,inAF3 a,inAF3 b){d=max(a,b);return d;} + A_STATIC AF4 opAMaxF4(outAF4 d,inAF4 a,inAF4 b){d=max(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opAMinF2(outAF2 d,inAF2 a,inAF2 b){d=min(a,b);return d;} + A_STATIC AF3 opAMinF3(outAF3 d,inAF3 a,inAF3 b){d=min(a,b);return d;} + A_STATIC AF4 opAMinF4(outAF4 d,inAF4 a,inAF4 b){d=min(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opAMulF2(outAF2 d,inAF2 a,inAF2 b){d=a*b;return d;} + A_STATIC AF3 opAMulF3(outAF3 d,inAF3 a,inAF3 b){d=a*b;return d;} + A_STATIC AF4 opAMulF4(outAF4 d,inAF4 a,inAF4 b){d=a*b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opAMulOneF2(outAF2 d,inAF2 a,AF1 b){d=a*AF2_(b);return d;} + A_STATIC AF3 opAMulOneF3(outAF3 d,inAF3 a,AF1 b){d=a*AF3_(b);return d;} + A_STATIC AF4 opAMulOneF4(outAF4 d,inAF4 a,AF1 b){d=a*AF4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opANegF2(outAF2 d,inAF2 a){d=-a;return d;} + A_STATIC AF3 opANegF3(outAF3 d,inAF3 a){d=-a;return d;} + A_STATIC AF4 opANegF4(outAF4 d,inAF4 a){d=-a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AF2 opARcpF2(outAF2 d,inAF2 a){d=ARcpF2(a);return d;} + A_STATIC AF3 opARcpF3(outAF3 d,inAF3 a){d=ARcpF3(a);return d;} + A_STATIC AF4 opARcpF4(outAF4 d,inAF4 a){d=ARcpF4(a);return d;} +#endif diff --git a/bin/resources/shaders/common/ffx_cas.h b/bin/resources/shaders/common/ffx_cas.h new file mode 100644 index 0000000000..7a43be03ce --- /dev/null +++ b/bin/resources/shaders/common/ffx_cas.h @@ -0,0 +1,1476 @@ +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// [CAS] FIDELITY FX - CONSTRAST ADAPTIVE SHARPENING 1.20190610 +// +//============================================================================================================================== +// LICENSE +// ======= +// Copyright (c) 2017-2019 Advanced Micro Devices, Inc. All rights reserved. +// ------- +// 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. +//------------------------------------------------------------------------------------------------------------------------------ +// ABOUT +// ===== +// CAS is a spatial only filter. +// CAS takes RGB color input. +// CAS enchances sharpness and local high-frequency contrast, and with or without added upsampling. +// CAS outputs RGB color. +//------------------------------------------------------------------------------------------------------------------------------ +// SUGGESTIONS FOR INTEGRATION +// =========================== +// Best for performance, run CAS in sharpen-only mode, choose a video mode to have scan-out or the display scale. +// - Sharpen-only mode is faster, and provides a better quality sharpening. +// The scaling support in CAS was designed for when the application wants to do Dynamic Resolution Scaling (DRS). +// - With DRS, the render resolution can change per frame. +// - Use CAS to sharpen and upsample to the fixed output resolution, then composite the full resolution UI over CAS output. +// - This can all happen in one compute dispatch. +// It is likely better to reduce the amount of film grain which happens before CAS (as CAS will amplify grain). +// - An alternative would be to add grain after CAS. +// It is best to run CAS after tonemapping. +// - CAS needs to have input value 1.0 at the peak of the display output. +// It is ok to run CAS after compositing UI (it won't harm the UI). +//------------------------------------------------------------------------------------------------------------------------------ +// EXECUTION +// ========= +// CAS runs as a compute shader. +// CAS is designed to be run either in a 32-bit, CasFilter(), or packed 16-bit, CasFilterH(), form. +// The 32-bit form works on 8x8 tiles via one {64,1,1} workgroup. +// The 16-bit form works on a pair of 8x8 tiles in a 16x8 configuration via one {64,1,1} workgroup. +// CAS is designed to work best in semi-persistent form if running not async with graphics. +// For 32-bit this means looping across a collection of 4 8x8 tiles in a 2x2 tile foot-print. +// For 16-bit this means looping 2 times, once for the top 16x8 region and once for the bottom 16x8 region. +//------------------------------------------------------------------------------------------------------------------------------ +// INTEGRATION SUMMARY FOR CPU +// =========================== +// // Make sure has already been included. +// // Setup pre-portability-header defines. +// #define A_CPU 1 +// // Include the portability header (requires version 1.20190530 or later which is backwards compatible). +// #include "ffx_a.h" +// // Include the CAS header. +// #include "ffx_cas.h" +// ... +// // Call the setup function to build out the constants for the shader, pass these to the shader. +// // The 'varAU4(const0);' expands into 'uint32_t const0[4];' on the CPU. +// varAU4(const0); +// varAU4(const1); +// CasSetup(const0,const1, +// 0.0f, // Sharpness tuning knob (0.0 to 1.0). +// 1920.0f,1080.0f, // Example input size. +// 2560.0f,1440.0f); // Example output size. +// ... +// // Later dispatch the shader based on the amount of semi-persistent loop unrolling. +// // Here is an example for running with the 16x16 (4-way unroll for 32-bit or 2-way unroll for 16-bit) +// vkCmdDispatch(cmdBuf,(widthInPixels+15)>>4,(heightInPixels+15)>>4,1); +//------------------------------------------------------------------------------------------------------------------------------ +// INTEGRATION SUMMARY FOR GPU +// =========================== +// // Setup layout. Example below for VK_FORMAT_R16G16B16A16_SFLOAT. +// layout(set=0,binding=0,rgba16f)uniform image2D imgSrc; +// layout(set=0,binding=1,rgba16f)uniform image2D imgDst; +// ... +// // Setup pre-portability-header defines (sets up GLSL/HLSL path, packed math support, etc) +// #define A_GPU 1 +// #define A_GLSL 1 +// #define A_HALF 1 +// ... +// // Include the portability header (or copy it in without an include). +// #include "ffx_a.h" +// ... +// // Define the fetch function(s). +// // CasLoad() takes a 32-bit unsigned integer 2D coordinate and loads color. +// AF3 CasLoad(ASU2 p){return imageLoad(imgSrc,p).rgb;} +// // CasLoadH() is the 16-bit version taking 16-bit unsigned integer 2D coordinate and loading 16-bit float color. +// // The ASU2() typecast back to 32-bit is a NO-OP, the compiler pattern matches and uses A16 opcode support instead. +// // The AH3() typecast to 16-bit float is a NO-OP, the compiler pattern matches and uses D16 opcode support instead. +// AH3 CasLoadH(ASW2 p){return AH3(imageLoad(imgSrc,ASU2(p)).rgb);} +// // If you define CAS_TEXTURE and/or CAS_TEXTUREH to a type, a value of that type will be added as the first input to CasFilter and forwarded to CasLoad +// // This is useful for forwarding extra data to the load functions, and is required by MSL, which doesn't use global textures +// ... +// // Define the input modifiers as nop's initially. +// // See "INPUT FORMAT SPECIFIC CASES" below for specifics on what to place in these functions. +// void CasInput(inout AF1 r,inout AF1 g,inout AF1 b){} +// void CasInputH(inout AH2 r,inout AH2 g,inout AH2 b){} +// ... +// // Include this CAS header file (or copy it in without an include). +// #include "ffx_cas.h" +// ... +// // Example in shader integration for loop-unrolled 16x16 case for 32-bit. +// layout(local_size_x=64)in; +// void main(){ +// // Fetch constants from CasSetup(). +// AU4 const0=cb.const0; +// AU4 const1=cb.const1; +// // Do remapping of local xy in workgroup for a more PS-like swizzle pattern. +// AU2 gxy=ARmp8x8(gl_LocalInvocationID.x)+AU2(gl_WorkGroupID.x<<4u,gl_WorkGroupID.y<<4u); +// // Filter. +// AF4 c; +// CasFilter(c.r,c.g,c.b,gxy,const0,const1,false);imageStore(imgDst,ASU2(gxy),c); +// gxy.x+=8u; +// CasFilter(c.r,c.g,c.b,gxy,const0,const1,false);imageStore(imgDst,ASU2(gxy),c); +// gxy.y+=8u; +// CasFilter(c.r,c.g,c.b,gxy,const0,const1,false);imageStore(imgDst,ASU2(gxy),c); +// gxy.x-=8u; +// CasFilter(c.r,c.g,c.b,gxy,const0,const1,false);imageStore(imgDst,ASU2(gxy),c);} +// ... +// // Example for semi-persistent 16x16 but this time for packed math. +// // Use this before including 'cas.h' if not using the non-packed filter function. +// #define CAS_PACKED_ONLY 1 +// ... +// layout(local_size_x=64)in; +// void main(){ +// // Fetch constants from CasSetup(). +// AU4 const0=cb.const0; +// AU4 const1=cb.const1; +// // Do remapping of local xy in workgroup for a more PS-like swizzle pattern. +// AU2 gxy=ARmp8x8(gl_LocalInvocationID.x)+AU2(gl_WorkGroupID.x<<4u,gl_WorkGroupID.y<<4u); +// // Filter. +// AH4 c0,c1;AH2 cR,cG,cB; +// CasFilterH(cR,cG,cB,gxy,const0,const1,false); +// // Extra work integrated after CAS would go here. +// ... +// // Suggest only running CasDepack() right before stores, to maintain packed math for any work after CasFilterH(). +// CasDepack(c0,c1,cR,cG,cB); +// imageStore(imgDst,ASU2(gxy),AF4(c0)); +// imageStore(imgDst,ASU2(gxy)+ASU2(8,0),AF4(c1)); +// gxy.y+=8u; +// CasFilterH(cR,cG,cB,gxy,const0,const1,false); +// ... +// CasDepack(c0,c1,cR,cG,cB); +// imageStore(imgDst,ASU2(gxy),AF4(c0)); +// imageStore(imgDst,ASU2(gxy)+ASU2(8,0),AF4(c1));} +//------------------------------------------------------------------------------------------------------------------------------ +// CAS FILTERING LOGIC +// =================== +// CAS uses the minimal nearest 3x3 source texel window for filtering. +// The filter coefficients are radially symmetric (phase adaptive, computed per pixel based on output pixel center). +// The filter kernel adapts to local contrast (adjusting the negative lobe strength of the filter kernel). +//------------------------------------------------------------------------------------------------------------------------------ +// CAS INPUT REQUIREMENTS +// ====================== +// This is designed to be a linear filter. +// Running CAS on perceptual inputs will yield over-sharpening. +// Input must range between {0 to 1} for each color channel. +// CAS output will be {0 to 1} ranged as well. +// CAS does 5 loads, so any conversion applied during CasLoad() or CasInput() has a 5 load * 3 channel = 15x cost amplifier. +// - So input conversions need to be factored into the prior pass's output. +// - But if necessary use CasInput() instead of CasLoad(), as CasInput() works with packed color. +// - For CAS with scaling the amplifier is 12 load * 3 channel = 36x cost amplifier. +// Any conversion applied to output has a 3x cost amplifier (3 color channels). +// - Output conversions are substantially less expensive. +// Added VALU ops due to conversions will have visible cost as this shader is already quite VALU heavy. +// This filter does not function well on sRGB or gamma 2.2 non-linear data. +// This filter does not function on PQ non-linear data. +// - Due to the shape of PQ, the positive side of the ring created by the negative lobe tends to become over-bright. +//------------------------------------------------------------------------------------------------------------------------------ +// INPUT FORMAT SPECIFIC CASES +// =========================== +// - FP16 with all non-negative values ranging {0 to 1}. +// - Use as is, filter is designed for linear input and output ranging {0 to 1}. +// --------------------------- +// - UNORM with linear conversion approximation. +// - This could be used for both sRGB or FreeSync2 native (gamma 2.2) cases. +// - Load/store with either 10:10:10:2 UNORM or 8:8:8:8 UNORM (aka VK_FORMAT_R8G8B8A8_UNORM). +// - Use gamma 2.0 conversion in CasInput(), as an approximation. +// - Modifications: +// // Change the CasInput*() function to square the inputs. +// void CasInput(inout AF1 r,inout AF1 g,inout AF1 b){r*=r;g*=g;b*=b;} +// void CasInputH(inout AH2 r,inout AH2 g,inout AH2 b){r*=r;g*=g;b*=b;} +// ... +// // Do linear to gamma 2.0 before store. +// // Since it will be common to do processing after CAS, the filter function returns linear. +// c.r=sqrt(c.r);c.g=sqrt(c.g);c.b=sqrt(c.b); +// imageStore(imgDst,ASU2(gxy),c); +// ... +// // And for packed. +// CasFilterH(cR,cG,cB,gxy,const0,const1,true); +// cR=sqrt(cR);cG=sqrt(cG);cB=sqrt(cB); +// CasDepack(c0,c1,cR,cG,cB); +// imageStore(img[0],ASU2(gxy),AF4(c0)); +// imageStore(img[0],ASU2(gxy+AU2(8,0)),AF4(c1)); +// --------------------------- +// - sRGB with slightly better quality and higher cost. +// - Use texelFetch() with sRGB format (VK_FORMAT_R8G8B8A8_SRGB) for loads (gets linear into shader). +// - Store to destination using UNORM (not sRGB) stores and do the linear to sRGB conversion in the shader. +// - Modifications: +// // Use texel fetch instead of image load (on GCN this will translate into an image load in the driver). +// // Hardware has sRGB to linear on loads (but in API only for read-only, aka texture instead of UAV/image). +// AF3 CasLoad(ASU2 p){return texelFetch(texSrc,p,0).rgb;} +// ... +// // Do linear to sRGB before store (GPU lacking hardware conversion support for linear to sRGB on store). +// c.r=AToSrgbF1(c.r);c.g=AToSrgbF1(c.g);c.b=AToSrgbF1(c.b); +// imageStore(imgDst,ASU2(gxy),c); +// ... +// // And for packed. +// CasFilterH(cR,cG,cB,gxy,const0,const1,true); +// cR=AToSrgbH2(cR);cG=AToSrgbH2(cG);cB=AToSrgbH2(cB); +// CasDepack(c0,c1,cR,cG,cB); +// imageStore(img[0],ASU2(gxy),AF4(c0)); +// imageStore(img[0],ASU2(gxy+AU2(8,0)),AF4(c1)); +// --------------------------- +// - HDR10 output via scRGB. +// - Pass before CAS needs to write out linear Rec.2020 colorspace output (all positive values). +// - Write to FP16 with {0 to 1} mapped to {0 to maxNits} nits. +// - Where 'maxNits' is typically not 10000. +// - Instead set 'maxNits' to the nits level that the HDR TV starts to clip white. +// - This can be even as low as 1000 nits on some HDR TVs. +// - After CAS do matrix multiply to take Rec.2020 back to sRGB and multiply by 'maxNits/80.0'. +// - Showing GPU code below to generate constants, likely most need to use CPU code instead. +// - Keeping the GPU code here because it is easier to read in these docs. +// - Can use 'lpm.h' source to generate the conversion matrix for Rec.2020 to sRGB: +// // Output conversion matrix from sRGB to Rec.2020. +// AF3 conR,conG,conB; +// // Working space temporaries (Rec.2020). +// AF3 rgbToXyzXW;AF3 rgbToXyzYW;AF3 rgbToXyzZW; +// LpmColRgbToXyz(rgbToXyzXW,rgbToXyzYW,rgbToXyzZW,lpmCol2020R,lpmCol2020G,lpmCol2020B,lpmColD65); +// // Output space temporaries (Rec.709, same as sRGB primaries). +// AF3 rgbToXyzXO;AF3 rgbToXyzYO;AF3 rgbToXyzZO; +// LpmColRgbToXyz(rgbToXyzXO,rgbToXyzYO,rgbToXyzZO,lpmCol709R,lpmCol709G,lpmCol709B,lpmColD65); +// AF3 xyzToRgbRO;AF3 xyzToRgbGO;AF3 xyzToRgbBO; +// LpmMatInv3x3(xyzToRgbRO,xyzToRgbGO,xyzToRgbBO,rgbToXyzXO,rgbToXyzYO,rgbToXyzZO); +// // Generate the matrix. +// LpmMatMul3x3(conR,conG,conB,xyzToRgbRO,xyzToRgbGO,xyzToRgbBO,rgbToXyzXW,rgbToXyzYW,rgbToXyzZW); +// - Adjust the conversion matrix for the multiply by 'maxNits/80.0'. +// // After this the constants can be stored into a constant buffer. +// AF1 conScale=maxNits*ARcpF1(80.0); +// conR*=conScale;conG*=conScale;conB*=conScale; +// - After CAS do the matrix multiply (passing the fetched constants into the shader). +// outputR=dot(AF3(colorR,colorG,colorB),conR); +// outputG=dot(AF3(colorR,colorG,colorB),conG); +// outputB=dot(AF3(colorR,colorG,colorB),conB); +// - Hopefully no developer is taking scRGB as input to CAS. +// - If that was the case, the conversion matrix from sRGB to Rec.2020 can be built changing the above code. +// - Swap the 'lpmCol709*' and 'lpmCol2020*' inputs to LpmColRgbToXyz(). +// - Then scale by '80.0/maxNits' instead of 'maxNits/80.0'. +// --------------------------- +// - HDR10 output via native 10:10:10:2. +// - Pass before CAS needs to write out linear Rec.2020 colorspace output (all positive values). +// - Write to FP16 with {0 to 1} mapped to {0 to maxNits} nits. +// - Where 'maxNits' is typically not 10000. +// - Instead set 'maxNits' to the nits level that the HDR TV starts to clip white. +// - This can be even as low as 1000 nits on some HDR TVs. +// - Hopefully no developer needs to take PQ as input here, but if so can use A to convert PQ to linear: +// // Where 'k0' is a constant of 'maxNits/10000.0'. +// colorR=AFromPqF1(colorR*k0); +// colorG=AFromPqF1(colorG*k0); +// colorB=AFromPqF1(colorB*k0); +// - After CAS convert from linear to PQ. +// // Where 'k1' is a constant of '10000.0/maxNits'. +// colorR=AToPqF1(colorR*k1); +// colorG=AToPqF1(colorG*k1); +// colorB=AToPqF1(colorB*k1); +// --------------------------- +// - Example of a bad idea for CAS input design. +// - Have the pass before CAS store out in 10:10:10:2 UNORM with gamma 2.0. +// - Store the output of CAS with sRGB to linear conversion, or with a gamma 2.2 conversion for FreeSync2 native. +// - This will drop precision because the inputs had been quantized to 10-bit, +// and the output is using a different tonal transform, +// so inputs and outputs won't align for similar values. +// - It might be "ok" for 8-bit/channel CAS output, but definately not a good idea for 10-bit/channel output. +//------------------------------------------------------------------------------------------------------------------------------ +// ALGORITHM DESCRIPTION +// ===================== +// This describes the algorithm with CAS_BETTER_DIAGONALS defined. +// The default is with CAS_BETTER_DIAGONALS not defined (which is faster). +// Starting with no scaling. +// CAS fetches a 3x3 neighborhood around the pixel 'e', +// a b c +// d(e)f +// g h i +// It then computes a 'soft' minimum and maximum, +// a b c b +// d e f * 0.5 + d e f * 0.5 +// g h i h +// The minimum and maximums give an idea of local contrast. +// --- 1.0 ^ +// | | <-- This minimum distance to the signal limit is divided by MAX to get a base sharpening amount 'A'. +// --- MAX v +// | +// | +// --- MIN ^ +// | | <-- The MIN side is more distant in this example so it is not used, but for dark colors it would be used. +// | | +// --- 0.0 v +// The base sharpening amount 'A' from above is shaped with a sqrt(). +// This 'A' ranges from 0 := no sharpening, to 1 := full sharpening. +// Then 'A' is scaled by the sharpness knob while being transformed to a negative lobe (values from -1/5 to -1/8 for A=1). +// The final filter kernel looks like this, +// 0 A 0 +// A 1 A <-- Center is always 1.0, followed by the negative lobe 'A' in a ring, and windowed into a circle with the 0.0s. +// 0 A 0 +// The local neighborhood is then multiplied by the kernel weights, summed and divided by the sum of the kernel weights. +// The high quality path computes filter weights per channel. +// The low quality path uses the green channel's filter weights to compute the 'A' factor for all channels. +// --------------------- +// The scaling path is a little more complex. +// It starts by fetching the 4x4 neighborhood around the pixel centered between centers of pixels {f,g,j,k}, +// a b c d +// e(f g)h +// i(j k)l +// m n o p +// The algorithm then computes the no-scaling result for {f,g,j,k}. +// It then interpolates between those no-scaling results. +// The interpolation is adaptive. +// To hide bilinear interpolation and restore diagonals, it weights bilinear weights by 1/(const+contrast). +// Where 'contrast' is the soft 'max-min'. +// This makes edges thin out a little. +// --------------------- +// Without CAS_BETTER_DIAGONALS defined, the algorithm is a little faster. +// Instead of using the 3x3 "box" with the 5-tap "circle" this uses just the "circle". +// Drops to 5 texture fetches for no-scaling. +// Drops to 12 texture fetches for scaling. +// Drops a bunch of math. +//------------------------------------------------------------------------------------------------------------------------------ +// IDEAS FOR FUTURE +// ================ +// - Avoid V_CVT's by using denormals. +// - Manually pack FP16 literals. +//------------------------------------------------------------------------------------------------------------------------------ +// CHANGE LOG +// ========== +// 20190610 - Misc documentation cleanup. +// 20190609 - Removed lowQuality bool, improved scaling logic. +// 20190530 - Unified CPU/GPU setup code, using new ffx_a.h, faster, define CAS_BETTER_DIAGONALS to get older slower one. +// 20190529 - Missing a good way to re-interpret packed in HLSL, so disabling approximation optimizations for now. +// 20190528 - Fixed so GPU CasSetup() generates half data all the time. +// 20190527 - Implemented approximations for rcp() and sqrt(). +// 20190524 - New algorithm, adjustable sharpness, scaling to 4x area. Fixed checker debug for no-scaling only. +// 20190521 - Updated file naming. +// 20190516 - Updated docs, fixed workaround, fixed no-scaling quality issue, removed gamma2 and generalized as CasInput*(). +// 20190510 - Made the dispatch example safely round up for images that are not a multiple of 16x16. +// 20190507 - Fixed typo bug in CAS_DEBUG_CHECKER, fixed sign typo in the docs. +// 20190503 - Setup temporary workaround for compiler bug. +// 20190502 - Added argument for 'gamma2' path so input transform in that case runs packed. +// 20190426 - Improved documentation on format specific cases, etc. +// 20190425 - Updated/corrected documentation. +// 20190405 - Added CAS_PACKED_ONLY, misc bug fixes. +// 20190404 - Updated for the new a.h header. +//============================================================================================================================== +// This is the practical limit for the algorithm's scaling ability (quality is limited by 3x3 taps). Example resolutions, +// 1280x720 -> 1080p = 2.25x area +// 1536x864 -> 1080p = 1.56x area +// 1792x1008 -> 1440p = 2.04x area +// 1920x1080 -> 1440p = 1.78x area +// 1920x1080 -> 4K = 4.0x area +// 2048x1152 -> 1440p = 1.56x area +// 2560x1440 -> 4K = 2.25x area +// 3072x1728 -> 4K = 1.56x area +#define CAS_AREA_LIMIT 4.0 +//------------------------------------------------------------------------------------------------------------------------------ +// Pass in output and input resolution in pixels. +// This returns true if CAS supports scaling in the given configuration. +AP1 CasSupportScaling(AF1 outX,AF1 outY,AF1 inX,AF1 inY){return ((outX*outY)*ARcpF1(inX*inY))<=CAS_AREA_LIMIT;} +//============================================================================================================================== +// Call to setup required constant values (works on CPU or GPU). +A_STATIC void CasSetup( + outAU4 const0, + outAU4 const1, + AF1 sharpness, // 0 := default (lower ringing), 1 := maximum (higest ringing) + AF1 inputSizeInPixelsX, + AF1 inputSizeInPixelsY, + AF1 outputSizeInPixelsX, + AF1 outputSizeInPixelsY){ + // Scaling terms. + const0[0]=AU1_AF1(inputSizeInPixelsX*ARcpF1(outputSizeInPixelsX)); + const0[1]=AU1_AF1(inputSizeInPixelsY*ARcpF1(outputSizeInPixelsY)); + const0[2]=AU1_AF1(AF1_(0.5)*inputSizeInPixelsX*ARcpF1(outputSizeInPixelsX)-AF1_(0.5)); + const0[3]=AU1_AF1(AF1_(0.5)*inputSizeInPixelsY*ARcpF1(outputSizeInPixelsY)-AF1_(0.5)); + // Sharpness value. + AF1 sharp=-ARcpF1(ALerpF1(8.0,5.0,ASatF1(sharpness))); + varAF2(hSharp)=initAF2(sharp,0.0); + const1[0]=AU1_AF1(sharp); + const1[1]=AU1_AH2_AF2(hSharp); + const1[2]=AU1_AF1(AF1_(8.0)*inputSizeInPixelsX*ARcpF1(outputSizeInPixelsX)); + const1[3]=0;} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// NON-PACKED VERSION +//============================================================================================================================== +#ifdef A_GPU + #if defined(A_MSL) && !defined(CAS_TEXTURE) + #define CAS_TEXTURE texture2d + #endif + #ifdef CAS_TEXTURE + #define TEXCALL tex, + #define TEXINPUT CAS_TEXTURE tex, + #else + #define TEXCALL + #define TEXINPUT + #endif + #ifdef CAS_PACKED_ONLY + // Avoid compiler error. + A_STATIC AF3 CasLoad(ASU2 p){return AF3(0.0,0.0,0.0);} + // MSL Doesn't let you inout vector elements, so use a macro + #define CasInput(r,g,b) + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC void CasFilter( + TEXINPUT + outAF1 pixR, // Output values, non-vector so port between CasFilter() and CasFilterH() is easy. + outAF1 pixG, + outAF1 pixB, + AU2 ip, // Integer pixel position in output. + AU4 const0, // Constants generated by CasSetup(). + AU4 const1, + AP1 noScaling){ // Must be a compile-time literal value, true = sharpen only (no resize). +//------------------------------------------------------------------------------------------------------------------------------ + // Debug a checker pattern of on/off tiles for visual inspection. + #ifdef CAS_DEBUG_CHECKER + if((((ip.x^ip.y)>>8u)&1u)==0u){AF3 pix0=CasLoad(ASU2(ip)); + pixR=pix0.r;pixG=pix0.g;pixB=pix0.b;CasInput(pixR,pixG,pixB);return;} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + // No scaling algorithm uses minimal 3x3 pixel neighborhood. + if(noScaling){ + // a b c + // d e f + // g h i + ASU2 sp=ASU2(ip); + A_MAYBE_UNUSED AF3 a=CasLoad(TEXCALL sp+ASU2(-1,-1)); + A_MAYBE_UNUSED AF3 b=CasLoad(TEXCALL sp+ASU2( 0,-1)); + A_MAYBE_UNUSED AF3 c=CasLoad(TEXCALL sp+ASU2( 1,-1)); + A_MAYBE_UNUSED AF3 d=CasLoad(TEXCALL sp+ASU2(-1, 0)); + A_MAYBE_UNUSED AF3 e=CasLoad(TEXCALL sp); + A_MAYBE_UNUSED AF3 f=CasLoad(TEXCALL sp+ASU2( 1, 0)); + A_MAYBE_UNUSED AF3 g=CasLoad(TEXCALL sp+ASU2(-1, 1)); + A_MAYBE_UNUSED AF3 h=CasLoad(TEXCALL sp+ASU2( 0, 1)); + A_MAYBE_UNUSED AF3 i=CasLoad(TEXCALL sp+ASU2( 1, 1)); + // Run optional input transform. + CasInput(a.r,a.g,a.b); + CasInput(b.r,b.g,b.b); + CasInput(c.r,c.g,c.b); + CasInput(d.r,d.g,d.b); + CasInput(e.r,e.g,e.b); + CasInput(f.r,f.g,f.b); + CasInput(g.r,g.g,g.b); + CasInput(h.r,h.g,h.b); + CasInput(i.r,i.g,i.b); + // Soft min and max. + // a b c b + // d e f * 0.5 + d e f * 0.5 + // g h i h + // These are 2.0x bigger (factored out the extra multiply). + AF1 mnR=AMin3F1(AMin3F1(d.r,e.r,f.r),b.r,h.r); + AF1 mnG=AMin3F1(AMin3F1(d.g,e.g,f.g),b.g,h.g); + AF1 mnB=AMin3F1(AMin3F1(d.b,e.b,f.b),b.b,h.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mnR2=AMin3F1(AMin3F1(mnR,a.r,c.r),g.r,i.r); + AF1 mnG2=AMin3F1(AMin3F1(mnG,a.g,c.g),g.g,i.g); + AF1 mnB2=AMin3F1(AMin3F1(mnB,a.b,c.b),g.b,i.b); + mnR=mnR+mnR2; + mnG=mnG+mnG2; + mnB=mnB+mnB2; + #endif + AF1 mxR=AMax3F1(AMax3F1(d.r,e.r,f.r),b.r,h.r); + AF1 mxG=AMax3F1(AMax3F1(d.g,e.g,f.g),b.g,h.g); + AF1 mxB=AMax3F1(AMax3F1(d.b,e.b,f.b),b.b,h.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mxR2=AMax3F1(AMax3F1(mxR,a.r,c.r),g.r,i.r); + AF1 mxG2=AMax3F1(AMax3F1(mxG,a.g,c.g),g.g,i.g); + AF1 mxB2=AMax3F1(AMax3F1(mxB,a.b,c.b),g.b,i.b); + mxR=mxR+mxR2; + mxG=mxG+mxG2; + mxB=mxB+mxB2; + #endif + // Smooth minimum distance to signal limit divided by smooth max. + #ifdef CAS_GO_SLOWER + AF1 rcpMR=ARcpF1(mxR); + AF1 rcpMG=ARcpF1(mxG); + AF1 rcpMB=ARcpF1(mxB); + #else + AF1 rcpMR=APrxLoRcpF1(mxR); + AF1 rcpMG=APrxLoRcpF1(mxG); + AF1 rcpMB=APrxLoRcpF1(mxB); + #endif + #ifdef CAS_BETTER_DIAGONALS + AF1 ampR=ASatF1(min(mnR,AF1_(2.0)-mxR)*rcpMR); + AF1 ampG=ASatF1(min(mnG,AF1_(2.0)-mxG)*rcpMG); + AF1 ampB=ASatF1(min(mnB,AF1_(2.0)-mxB)*rcpMB); + #else + AF1 ampR=ASatF1(min(mnR,AF1_(1.0)-mxR)*rcpMR); + AF1 ampG=ASatF1(min(mnG,AF1_(1.0)-mxG)*rcpMG); + AF1 ampB=ASatF1(min(mnB,AF1_(1.0)-mxB)*rcpMB); + #endif + // Shaping amount of sharpening. + #ifdef CAS_GO_SLOWER + ampR=sqrt(ampR); + ampG=sqrt(ampG); + ampB=sqrt(ampB); + #else + ampR=APrxLoSqrtF1(ampR); + ampG=APrxLoSqrtF1(ampG); + ampB=APrxLoSqrtF1(ampB); + #endif + // Filter shape. + // 0 w 0 + // w 1 w + // 0 w 0 + A_MAYBE_UNUSED AF1 peak=AF1_AU1(const1.x); + A_MAYBE_UNUSED AF1 wR=ampR*peak; + A_MAYBE_UNUSED AF1 wG=ampG*peak; + A_MAYBE_UNUSED AF1 wB=ampB*peak; + // Filter. + #ifndef CAS_SLOW + // Using green coef only, depending on dead code removal to strip out the extra overhead. + #ifdef CAS_GO_SLOWER + AF1 rcpWeight=ARcpF1(AF1_(1.0)+AF1_(4.0)*wG); + #else + AF1 rcpWeight=APrxMedRcpF1(AF1_(1.0)+AF1_(4.0)*wG); + #endif + pixR=ASatF1((b.r*wG+d.r*wG+f.r*wG+h.r*wG+e.r)*rcpWeight); + pixG=ASatF1((b.g*wG+d.g*wG+f.g*wG+h.g*wG+e.g)*rcpWeight); + pixB=ASatF1((b.b*wG+d.b*wG+f.b*wG+h.b*wG+e.b)*rcpWeight); + #else + #ifdef CAS_GO_SLOWER + AF1 rcpWeightR=ARcpF1(AF1_(1.0)+AF1_(4.0)*wR); + AF1 rcpWeightG=ARcpF1(AF1_(1.0)+AF1_(4.0)*wG); + AF1 rcpWeightB=ARcpF1(AF1_(1.0)+AF1_(4.0)*wB); + #else + AF1 rcpWeightR=APrxMedRcpF1(AF1_(1.0)+AF1_(4.0)*wR); + AF1 rcpWeightG=APrxMedRcpF1(AF1_(1.0)+AF1_(4.0)*wG); + AF1 rcpWeightB=APrxMedRcpF1(AF1_(1.0)+AF1_(4.0)*wB); + #endif + pixR=ASatF1((b.r*wR+d.r*wR+f.r*wR+h.r*wR+e.r)*rcpWeightR); + pixG=ASatF1((b.g*wG+d.g*wG+f.g*wG+h.g*wG+e.g)*rcpWeightG); + pixB=ASatF1((b.b*wB+d.b*wB+f.b*wB+h.b*wB+e.b)*rcpWeightB); + #endif + return;} +//------------------------------------------------------------------------------------------------------------------------------ + // Scaling algorithm adaptively interpolates between nearest 4 results of the non-scaling algorithm. + // a b c d + // e f g h + // i j k l + // m n o p + // Working these 4 results. + // +-----+-----+ + // | | | + // | f..|..g | + // | . | . | + // +-----+-----+ + // | . | . | + // | j..|..k | + // | | | + // +-----+-----+ + AF2 pp=AF2(ip)*AF2_AU2(const0.xy)+AF2_AU2(const0.zw); + AF2 fp=floor(pp); + pp-=fp; + ASU2 sp=ASU2(fp); + A_MAYBE_UNUSED AF3 a=CasLoad(TEXCALL sp+ASU2(-1,-1)); + A_MAYBE_UNUSED AF3 b=CasLoad(TEXCALL sp+ASU2( 0,-1)); + A_MAYBE_UNUSED AF3 e=CasLoad(TEXCALL sp+ASU2(-1, 0)); + A_MAYBE_UNUSED AF3 f=CasLoad(TEXCALL sp); + A_MAYBE_UNUSED AF3 c=CasLoad(TEXCALL sp+ASU2( 1,-1)); + A_MAYBE_UNUSED AF3 d=CasLoad(TEXCALL sp+ASU2( 2,-1)); + A_MAYBE_UNUSED AF3 g=CasLoad(TEXCALL sp+ASU2( 1, 0)); + A_MAYBE_UNUSED AF3 h=CasLoad(TEXCALL sp+ASU2( 2, 0)); + A_MAYBE_UNUSED AF3 i=CasLoad(TEXCALL sp+ASU2(-1, 1)); + A_MAYBE_UNUSED AF3 j=CasLoad(TEXCALL sp+ASU2( 0, 1)); + A_MAYBE_UNUSED AF3 m=CasLoad(TEXCALL sp+ASU2(-1, 2)); + A_MAYBE_UNUSED AF3 n=CasLoad(TEXCALL sp+ASU2( 0, 2)); + A_MAYBE_UNUSED AF3 k=CasLoad(TEXCALL sp+ASU2( 1, 1)); + A_MAYBE_UNUSED AF3 l=CasLoad(TEXCALL sp+ASU2( 2, 1)); + A_MAYBE_UNUSED AF3 o=CasLoad(TEXCALL sp+ASU2( 1, 2)); + A_MAYBE_UNUSED AF3 p=CasLoad(TEXCALL sp+ASU2( 2, 2)); + // Run optional input transform. + CasInput(a.r,a.g,a.b); + CasInput(b.r,b.g,b.b); + CasInput(c.r,c.g,c.b); + CasInput(d.r,d.g,d.b); + CasInput(e.r,e.g,e.b); + CasInput(f.r,f.g,f.b); + CasInput(g.r,g.g,g.b); + CasInput(h.r,h.g,h.b); + CasInput(i.r,i.g,i.b); + CasInput(j.r,j.g,j.b); + CasInput(k.r,k.g,k.b); + CasInput(l.r,l.g,l.b); + CasInput(m.r,m.g,m.b); + CasInput(n.r,n.g,n.b); + CasInput(o.r,o.g,o.b); + CasInput(p.r,p.g,p.b); + // Soft min and max. + // These are 2.0x bigger (factored out the extra multiply). + // a b c b + // e f g * 0.5 + e f g * 0.5 [F] + // i j k j + AF1 mnfR=AMin3F1(AMin3F1(b.r,e.r,f.r),g.r,j.r); + AF1 mnfG=AMin3F1(AMin3F1(b.g,e.g,f.g),g.g,j.g); + AF1 mnfB=AMin3F1(AMin3F1(b.b,e.b,f.b),g.b,j.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mnfR2=AMin3F1(AMin3F1(mnfR,a.r,c.r),i.r,k.r); + AF1 mnfG2=AMin3F1(AMin3F1(mnfG,a.g,c.g),i.g,k.g); + AF1 mnfB2=AMin3F1(AMin3F1(mnfB,a.b,c.b),i.b,k.b); + mnfR=mnfR+mnfR2; + mnfG=mnfG+mnfG2; + mnfB=mnfB+mnfB2; + #endif + AF1 mxfR=AMax3F1(AMax3F1(b.r,e.r,f.r),g.r,j.r); + AF1 mxfG=AMax3F1(AMax3F1(b.g,e.g,f.g),g.g,j.g); + AF1 mxfB=AMax3F1(AMax3F1(b.b,e.b,f.b),g.b,j.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mxfR2=AMax3F1(AMax3F1(mxfR,a.r,c.r),i.r,k.r); + AF1 mxfG2=AMax3F1(AMax3F1(mxfG,a.g,c.g),i.g,k.g); + AF1 mxfB2=AMax3F1(AMax3F1(mxfB,a.b,c.b),i.b,k.b); + mxfR=mxfR+mxfR2; + mxfG=mxfG+mxfG2; + mxfB=mxfB+mxfB2; + #endif + // b c d c + // f g h * 0.5 + f g h * 0.5 [G] + // j k l k + AF1 mngR=AMin3F1(AMin3F1(c.r,f.r,g.r),h.r,k.r); + AF1 mngG=AMin3F1(AMin3F1(c.g,f.g,g.g),h.g,k.g); + AF1 mngB=AMin3F1(AMin3F1(c.b,f.b,g.b),h.b,k.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mngR2=AMin3F1(AMin3F1(mngR,b.r,d.r),j.r,l.r); + AF1 mngG2=AMin3F1(AMin3F1(mngG,b.g,d.g),j.g,l.g); + AF1 mngB2=AMin3F1(AMin3F1(mngB,b.b,d.b),j.b,l.b); + mngR=mngR+mngR2; + mngG=mngG+mngG2; + mngB=mngB+mngB2; + #endif + AF1 mxgR=AMax3F1(AMax3F1(c.r,f.r,g.r),h.r,k.r); + AF1 mxgG=AMax3F1(AMax3F1(c.g,f.g,g.g),h.g,k.g); + AF1 mxgB=AMax3F1(AMax3F1(c.b,f.b,g.b),h.b,k.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mxgR2=AMax3F1(AMax3F1(mxgR,b.r,d.r),j.r,l.r); + AF1 mxgG2=AMax3F1(AMax3F1(mxgG,b.g,d.g),j.g,l.g); + AF1 mxgB2=AMax3F1(AMax3F1(mxgB,b.b,d.b),j.b,l.b); + mxgR=mxgR+mxgR2; + mxgG=mxgG+mxgG2; + mxgB=mxgB+mxgB2; + #endif + // e f g f + // i j k * 0.5 + i j k * 0.5 [J] + // m n o n + AF1 mnjR=AMin3F1(AMin3F1(f.r,i.r,j.r),k.r,n.r); + AF1 mnjG=AMin3F1(AMin3F1(f.g,i.g,j.g),k.g,n.g); + AF1 mnjB=AMin3F1(AMin3F1(f.b,i.b,j.b),k.b,n.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mnjR2=AMin3F1(AMin3F1(mnjR,e.r,g.r),m.r,o.r); + AF1 mnjG2=AMin3F1(AMin3F1(mnjG,e.g,g.g),m.g,o.g); + AF1 mnjB2=AMin3F1(AMin3F1(mnjB,e.b,g.b),m.b,o.b); + mnjR=mnjR+mnjR2; + mnjG=mnjG+mnjG2; + mnjB=mnjB+mnjB2; + #endif + AF1 mxjR=AMax3F1(AMax3F1(f.r,i.r,j.r),k.r,n.r); + AF1 mxjG=AMax3F1(AMax3F1(f.g,i.g,j.g),k.g,n.g); + AF1 mxjB=AMax3F1(AMax3F1(f.b,i.b,j.b),k.b,n.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mxjR2=AMax3F1(AMax3F1(mxjR,e.r,g.r),m.r,o.r); + AF1 mxjG2=AMax3F1(AMax3F1(mxjG,e.g,g.g),m.g,o.g); + AF1 mxjB2=AMax3F1(AMax3F1(mxjB,e.b,g.b),m.b,o.b); + mxjR=mxjR+mxjR2; + mxjG=mxjG+mxjG2; + mxjB=mxjB+mxjB2; + #endif + // f g h g + // j k l * 0.5 + j k l * 0.5 [K] + // n o p o + AF1 mnkR=AMin3F1(AMin3F1(g.r,j.r,k.r),l.r,o.r); + AF1 mnkG=AMin3F1(AMin3F1(g.g,j.g,k.g),l.g,o.g); + AF1 mnkB=AMin3F1(AMin3F1(g.b,j.b,k.b),l.b,o.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mnkR2=AMin3F1(AMin3F1(mnkR,f.r,h.r),n.r,p.r); + AF1 mnkG2=AMin3F1(AMin3F1(mnkG,f.g,h.g),n.g,p.g); + AF1 mnkB2=AMin3F1(AMin3F1(mnkB,f.b,h.b),n.b,p.b); + mnkR=mnkR+mnkR2; + mnkG=mnkG+mnkG2; + mnkB=mnkB+mnkB2; + #endif + AF1 mxkR=AMax3F1(AMax3F1(g.r,j.r,k.r),l.r,o.r); + AF1 mxkG=AMax3F1(AMax3F1(g.g,j.g,k.g),l.g,o.g); + AF1 mxkB=AMax3F1(AMax3F1(g.b,j.b,k.b),l.b,o.b); + #ifdef CAS_BETTER_DIAGONALS + AF1 mxkR2=AMax3F1(AMax3F1(mxkR,f.r,h.r),n.r,p.r); + AF1 mxkG2=AMax3F1(AMax3F1(mxkG,f.g,h.g),n.g,p.g); + AF1 mxkB2=AMax3F1(AMax3F1(mxkB,f.b,h.b),n.b,p.b); + mxkR=mxkR+mxkR2; + mxkG=mxkG+mxkG2; + mxkB=mxkB+mxkB2; + #endif + // Smooth minimum distance to signal limit divided by smooth max. + #ifdef CAS_GO_SLOWER + AF1 rcpMfR=ARcpF1(mxfR); + AF1 rcpMfG=ARcpF1(mxfG); + AF1 rcpMfB=ARcpF1(mxfB); + AF1 rcpMgR=ARcpF1(mxgR); + AF1 rcpMgG=ARcpF1(mxgG); + AF1 rcpMgB=ARcpF1(mxgB); + AF1 rcpMjR=ARcpF1(mxjR); + AF1 rcpMjG=ARcpF1(mxjG); + AF1 rcpMjB=ARcpF1(mxjB); + AF1 rcpMkR=ARcpF1(mxkR); + AF1 rcpMkG=ARcpF1(mxkG); + AF1 rcpMkB=ARcpF1(mxkB); + #else + AF1 rcpMfR=APrxLoRcpF1(mxfR); + AF1 rcpMfG=APrxLoRcpF1(mxfG); + AF1 rcpMfB=APrxLoRcpF1(mxfB); + AF1 rcpMgR=APrxLoRcpF1(mxgR); + AF1 rcpMgG=APrxLoRcpF1(mxgG); + AF1 rcpMgB=APrxLoRcpF1(mxgB); + AF1 rcpMjR=APrxLoRcpF1(mxjR); + AF1 rcpMjG=APrxLoRcpF1(mxjG); + AF1 rcpMjB=APrxLoRcpF1(mxjB); + AF1 rcpMkR=APrxLoRcpF1(mxkR); + AF1 rcpMkG=APrxLoRcpF1(mxkG); + AF1 rcpMkB=APrxLoRcpF1(mxkB); + #endif + #ifdef CAS_BETTER_DIAGONALS + AF1 ampfR=ASatF1(min(mnfR,AF1_(2.0)-mxfR)*rcpMfR); + AF1 ampfG=ASatF1(min(mnfG,AF1_(2.0)-mxfG)*rcpMfG); + AF1 ampfB=ASatF1(min(mnfB,AF1_(2.0)-mxfB)*rcpMfB); + AF1 ampgR=ASatF1(min(mngR,AF1_(2.0)-mxgR)*rcpMgR); + AF1 ampgG=ASatF1(min(mngG,AF1_(2.0)-mxgG)*rcpMgG); + AF1 ampgB=ASatF1(min(mngB,AF1_(2.0)-mxgB)*rcpMgB); + AF1 ampjR=ASatF1(min(mnjR,AF1_(2.0)-mxjR)*rcpMjR); + AF1 ampjG=ASatF1(min(mnjG,AF1_(2.0)-mxjG)*rcpMjG); + AF1 ampjB=ASatF1(min(mnjB,AF1_(2.0)-mxjB)*rcpMjB); + AF1 ampkR=ASatF1(min(mnkR,AF1_(2.0)-mxkR)*rcpMkR); + AF1 ampkG=ASatF1(min(mnkG,AF1_(2.0)-mxkG)*rcpMkG); + AF1 ampkB=ASatF1(min(mnkB,AF1_(2.0)-mxkB)*rcpMkB); + #else + AF1 ampfR=ASatF1(min(mnfR,AF1_(1.0)-mxfR)*rcpMfR); + AF1 ampfG=ASatF1(min(mnfG,AF1_(1.0)-mxfG)*rcpMfG); + AF1 ampfB=ASatF1(min(mnfB,AF1_(1.0)-mxfB)*rcpMfB); + AF1 ampgR=ASatF1(min(mngR,AF1_(1.0)-mxgR)*rcpMgR); + AF1 ampgG=ASatF1(min(mngG,AF1_(1.0)-mxgG)*rcpMgG); + AF1 ampgB=ASatF1(min(mngB,AF1_(1.0)-mxgB)*rcpMgB); + AF1 ampjR=ASatF1(min(mnjR,AF1_(1.0)-mxjR)*rcpMjR); + AF1 ampjG=ASatF1(min(mnjG,AF1_(1.0)-mxjG)*rcpMjG); + AF1 ampjB=ASatF1(min(mnjB,AF1_(1.0)-mxjB)*rcpMjB); + AF1 ampkR=ASatF1(min(mnkR,AF1_(1.0)-mxkR)*rcpMkR); + AF1 ampkG=ASatF1(min(mnkG,AF1_(1.0)-mxkG)*rcpMkG); + AF1 ampkB=ASatF1(min(mnkB,AF1_(1.0)-mxkB)*rcpMkB); + #endif + // Shaping amount of sharpening. + #ifdef CAS_GO_SLOWER + ampfR=sqrt(ampfR); + ampfG=sqrt(ampfG); + ampfB=sqrt(ampfB); + ampgR=sqrt(ampgR); + ampgG=sqrt(ampgG); + ampgB=sqrt(ampgB); + ampjR=sqrt(ampjR); + ampjG=sqrt(ampjG); + ampjB=sqrt(ampjB); + ampkR=sqrt(ampkR); + ampkG=sqrt(ampkG); + ampkB=sqrt(ampkB); + #else + ampfR=APrxLoSqrtF1(ampfR); + ampfG=APrxLoSqrtF1(ampfG); + ampfB=APrxLoSqrtF1(ampfB); + ampgR=APrxLoSqrtF1(ampgR); + ampgG=APrxLoSqrtF1(ampgG); + ampgB=APrxLoSqrtF1(ampgB); + ampjR=APrxLoSqrtF1(ampjR); + ampjG=APrxLoSqrtF1(ampjG); + ampjB=APrxLoSqrtF1(ampjB); + ampkR=APrxLoSqrtF1(ampkR); + ampkG=APrxLoSqrtF1(ampkG); + ampkB=APrxLoSqrtF1(ampkB); + #endif + // Filter shape. + // 0 w 0 + // w 1 w + // 0 w 0 + AF1 peak=AF1_AU1(const1.x); + AF1 wfR=ampfR*peak; + AF1 wfG=ampfG*peak; + AF1 wfB=ampfB*peak; + AF1 wgR=ampgR*peak; + AF1 wgG=ampgG*peak; + AF1 wgB=ampgB*peak; + AF1 wjR=ampjR*peak; + AF1 wjG=ampjG*peak; + AF1 wjB=ampjB*peak; + AF1 wkR=ampkR*peak; + AF1 wkG=ampkG*peak; + AF1 wkB=ampkB*peak; + // Blend between 4 results. + // s t + // u v + AF1 s=(AF1_(1.0)-pp.x)*(AF1_(1.0)-pp.y); + AF1 t= pp.x *(AF1_(1.0)-pp.y); + AF1 u=(AF1_(1.0)-pp.x)* pp.y ; + AF1 v= pp.x * pp.y ; + // Thin edges to hide bilinear interpolation (helps diagonals). + AF1 thinB=1.0/32.0; + #ifdef CAS_GO_SLOWER + s*=ARcpF1(thinB+(mxfG-mnfG)); + t*=ARcpF1(thinB+(mxgG-mngG)); + u*=ARcpF1(thinB+(mxjG-mnjG)); + v*=ARcpF1(thinB+(mxkG-mnkG)); + #else + s*=APrxLoRcpF1(thinB+(mxfG-mnfG)); + t*=APrxLoRcpF1(thinB+(mxgG-mngG)); + u*=APrxLoRcpF1(thinB+(mxjG-mnjG)); + v*=APrxLoRcpF1(thinB+(mxkG-mnkG)); + #endif + // Final weighting. + // b c + // e f g h + // i j k l + // n o + // _____ _____ _____ _____ + // fs gt + // + // _____ _____ _____ _____ + // fs s gt fs t gt + // ju kv + // _____ _____ _____ _____ + // fs gt + // ju u kv ju v kv + // _____ _____ _____ _____ + // + // ju kv + A_MAYBE_UNUSED AF1 qbeR=wfR*s; + A_MAYBE_UNUSED AF1 qbeG=wfG*s; + A_MAYBE_UNUSED AF1 qbeB=wfB*s; + A_MAYBE_UNUSED AF1 qchR=wgR*t; + A_MAYBE_UNUSED AF1 qchG=wgG*t; + A_MAYBE_UNUSED AF1 qchB=wgB*t; + A_MAYBE_UNUSED AF1 qfR=wgR*t+wjR*u+s; + A_MAYBE_UNUSED AF1 qfG=wgG*t+wjG*u+s; + A_MAYBE_UNUSED AF1 qfB=wgB*t+wjB*u+s; + A_MAYBE_UNUSED AF1 qgR=wfR*s+wkR*v+t; + A_MAYBE_UNUSED AF1 qgG=wfG*s+wkG*v+t; + A_MAYBE_UNUSED AF1 qgB=wfB*s+wkB*v+t; + A_MAYBE_UNUSED AF1 qjR=wfR*s+wkR*v+u; + A_MAYBE_UNUSED AF1 qjG=wfG*s+wkG*v+u; + A_MAYBE_UNUSED AF1 qjB=wfB*s+wkB*v+u; + A_MAYBE_UNUSED AF1 qkR=wgR*t+wjR*u+v; + A_MAYBE_UNUSED AF1 qkG=wgG*t+wjG*u+v; + A_MAYBE_UNUSED AF1 qkB=wgB*t+wjB*u+v; + A_MAYBE_UNUSED AF1 qinR=wjR*u; + A_MAYBE_UNUSED AF1 qinG=wjG*u; + A_MAYBE_UNUSED AF1 qinB=wjB*u; + A_MAYBE_UNUSED AF1 qloR=wkR*v; + A_MAYBE_UNUSED AF1 qloG=wkG*v; + A_MAYBE_UNUSED AF1 qloB=wkB*v; + // Filter. + #ifndef CAS_SLOW + // Using green coef only, depending on dead code removal to strip out the extra overhead. + #ifdef CAS_GO_SLOWER + AF1 rcpWG=ARcpF1(AF1_(2.0)*qbeG+AF1_(2.0)*qchG+AF1_(2.0)*qinG+AF1_(2.0)*qloG+qfG+qgG+qjG+qkG); + #else + AF1 rcpWG=APrxMedRcpF1(AF1_(2.0)*qbeG+AF1_(2.0)*qchG+AF1_(2.0)*qinG+AF1_(2.0)*qloG+qfG+qgG+qjG+qkG); + #endif + pixR=ASatF1((b.r*qbeG+e.r*qbeG+c.r*qchG+h.r*qchG+i.r*qinG+n.r*qinG+l.r*qloG+o.r*qloG+f.r*qfG+g.r*qgG+j.r*qjG+k.r*qkG)*rcpWG); + pixG=ASatF1((b.g*qbeG+e.g*qbeG+c.g*qchG+h.g*qchG+i.g*qinG+n.g*qinG+l.g*qloG+o.g*qloG+f.g*qfG+g.g*qgG+j.g*qjG+k.g*qkG)*rcpWG); + pixB=ASatF1((b.b*qbeG+e.b*qbeG+c.b*qchG+h.b*qchG+i.b*qinG+n.b*qinG+l.b*qloG+o.b*qloG+f.b*qfG+g.b*qgG+j.b*qjG+k.b*qkG)*rcpWG); + #else + #ifdef CAS_GO_SLOWER + AF1 rcpWR=ARcpF1(AF1_(2.0)*qbeR+AF1_(2.0)*qchR+AF1_(2.0)*qinR+AF1_(2.0)*qloR+qfR+qgR+qjR+qkR); + AF1 rcpWG=ARcpF1(AF1_(2.0)*qbeG+AF1_(2.0)*qchG+AF1_(2.0)*qinG+AF1_(2.0)*qloG+qfG+qgG+qjG+qkG); + AF1 rcpWB=ARcpF1(AF1_(2.0)*qbeB+AF1_(2.0)*qchB+AF1_(2.0)*qinB+AF1_(2.0)*qloB+qfB+qgB+qjB+qkB); + #else + AF1 rcpWR=APrxMedRcpF1(AF1_(2.0)*qbeR+AF1_(2.0)*qchR+AF1_(2.0)*qinR+AF1_(2.0)*qloR+qfR+qgR+qjR+qkR); + AF1 rcpWG=APrxMedRcpF1(AF1_(2.0)*qbeG+AF1_(2.0)*qchG+AF1_(2.0)*qinG+AF1_(2.0)*qloG+qfG+qgG+qjG+qkG); + AF1 rcpWB=APrxMedRcpF1(AF1_(2.0)*qbeB+AF1_(2.0)*qchB+AF1_(2.0)*qinB+AF1_(2.0)*qloB+qfB+qgB+qjB+qkB); + #endif + pixR=ASatF1((b.r*qbeR+e.r*qbeR+c.r*qchR+h.r*qchR+i.r*qinR+n.r*qinR+l.r*qloR+o.r*qloR+f.r*qfR+g.r*qgR+j.r*qjR+k.r*qkR)*rcpWR); + pixG=ASatF1((b.g*qbeG+e.g*qbeG+c.g*qchG+h.g*qchG+i.g*qinG+n.g*qinG+l.g*qloG+o.g*qloG+f.g*qfG+g.g*qgG+j.g*qjG+k.g*qkG)*rcpWG); + pixB=ASatF1((b.b*qbeB+e.b*qbeB+c.b*qchB+h.b*qchB+i.b*qinB+n.b*qinB+l.b*qloB+o.b*qloB+f.b*qfB+g.b*qgB+j.b*qjB+k.b*qkB)*rcpWB); + #endif + } + + #undef TEXINPUT + #undef TEXCALL +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// PACKED VERSION +//============================================================================================================================== +#if defined(A_GPU) && defined(A_HALF) + #if defined(A_MSL) && !defined(CAS_TEXTUREH) + #define CAS_TEXTUREH texture2d + #endif + #ifdef CAS_TEXTUREH + #define TEXCALL tex, + #define TEXINPUT CAS_TEXTUREH tex, + #else + #define TEXCALL + #define TEXINPUT + #endif + // Missing a way to do packed re-interpetation, so must disable approximation optimizations. + #ifdef A_HLSL + #ifndef CAS_GO_SLOWER + #define CAS_GO_SLOWER 1 + #endif + #endif +//============================================================================================================================== + // Can be used to convert from packed SOA to AOS for store. + void CasDepack(outAH4 pix0,outAH4 pix1,AH2 pixR,AH2 pixG,AH2 pixB){ + #ifdef A_HLSL + // Invoke a slower path for DX only, since it won't allow uninitialized values. + pix0.a=pix1.a=0.0; + #endif + pix0.rgb=AH3(pixR.x,pixG.x,pixB.x); + pix1.rgb=AH3(pixR.y,pixG.y,pixB.y);} +//============================================================================================================================== + void CasFilterH( + TEXINPUT + // Output values are for 2 8x8 tiles in a 16x8 region. + // pix.x = right 8x8 tile + // pix.y = left 8x8 tile + // This enables later processing to easily be packed as well. + outAH2 pixR, + outAH2 pixG, + outAH2 pixB, + AU2 ip, // Integer pixel position in output. + AU4 const0, // Constants generated by CasSetup(). + AU4 const1, + AP1 noScaling){ // Must be a compile-time literal value, true = sharpen only (no resize). +//------------------------------------------------------------------------------------------------------------------------------ + // Debug a checker pattern of on/off tiles for visual inspection. + #ifdef CAS_DEBUG_CHECKER + if((((ip.x^ip.y)>>8u)&1u)==0u){AH3 pix0=CasLoadH(ASW2(ip));AH3 pix1=CasLoadH(ASW2(ip)+ASW2(8,0)); + pixR=AH2(pix0.r,pix1.r);pixG=AH2(pix0.g,pix1.g);pixB=AH2(pix0.b,pix1.b);CasInputH(pixR,pixG,pixB);return;} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + // No scaling algorithm uses minimal 3x3 pixel neighborhood. + if(noScaling){ + ASW2 sp0=ASW2(ip); + AH3 a0=CasLoadH(TEXCALL sp0+ASW2(-1,-1)); + AH3 b0=CasLoadH(TEXCALL sp0+ASW2( 0,-1)); + AH3 c0=CasLoadH(TEXCALL sp0+ASW2( 1,-1)); + AH3 d0=CasLoadH(TEXCALL sp0+ASW2(-1, 0)); + AH3 e0=CasLoadH(TEXCALL sp0); + AH3 f0=CasLoadH(TEXCALL sp0+ASW2( 1, 0)); + AH3 g0=CasLoadH(TEXCALL sp0+ASW2(-1, 1)); + AH3 h0=CasLoadH(TEXCALL sp0+ASW2( 0, 1)); + AH3 i0=CasLoadH(TEXCALL sp0+ASW2( 1, 1)); + ASW2 sp1=sp0+ASW2(8,0); + AH3 a1=CasLoadH(TEXCALL sp1+ASW2(-1,-1)); + AH3 b1=CasLoadH(TEXCALL sp1+ASW2( 0,-1)); + AH3 c1=CasLoadH(TEXCALL sp1+ASW2( 1,-1)); + AH3 d1=CasLoadH(TEXCALL sp1+ASW2(-1, 0)); + AH3 e1=CasLoadH(TEXCALL sp1); + AH3 f1=CasLoadH(TEXCALL sp1+ASW2( 1, 0)); + AH3 g1=CasLoadH(TEXCALL sp1+ASW2(-1, 1)); + AH3 h1=CasLoadH(TEXCALL sp1+ASW2( 0, 1)); + AH3 i1=CasLoadH(TEXCALL sp1+ASW2( 1, 1)); + // AOS to SOA conversion. + AH2 aR=AH2(a0.r,a1.r); + AH2 aG=AH2(a0.g,a1.g); + AH2 aB=AH2(a0.b,a1.b); + AH2 bR=AH2(b0.r,b1.r); + AH2 bG=AH2(b0.g,b1.g); + AH2 bB=AH2(b0.b,b1.b); + AH2 cR=AH2(c0.r,c1.r); + AH2 cG=AH2(c0.g,c1.g); + AH2 cB=AH2(c0.b,c1.b); + AH2 dR=AH2(d0.r,d1.r); + AH2 dG=AH2(d0.g,d1.g); + AH2 dB=AH2(d0.b,d1.b); + AH2 eR=AH2(e0.r,e1.r); + AH2 eG=AH2(e0.g,e1.g); + AH2 eB=AH2(e0.b,e1.b); + AH2 fR=AH2(f0.r,f1.r); + AH2 fG=AH2(f0.g,f1.g); + AH2 fB=AH2(f0.b,f1.b); + AH2 gR=AH2(g0.r,g1.r); + AH2 gG=AH2(g0.g,g1.g); + AH2 gB=AH2(g0.b,g1.b); + AH2 hR=AH2(h0.r,h1.r); + AH2 hG=AH2(h0.g,h1.g); + AH2 hB=AH2(h0.b,h1.b); + AH2 iR=AH2(i0.r,i1.r); + AH2 iG=AH2(i0.g,i1.g); + AH2 iB=AH2(i0.b,i1.b); + // Run optional input transform. + CasInputH(aR,aG,aB); + CasInputH(bR,bG,bB); + CasInputH(cR,cG,cB); + CasInputH(dR,dG,dB); + CasInputH(eR,eG,eB); + CasInputH(fR,fG,fB); + CasInputH(gR,gG,gB); + CasInputH(hR,hG,hB); + CasInputH(iR,iG,iB); + // Soft min and max. + AH2 mnR=min(min(fR,hR),min(min(bR,dR),eR)); + AH2 mnG=min(min(fG,hG),min(min(bG,dG),eG)); + AH2 mnB=min(min(fB,hB),min(min(bB,dB),eB)); + #ifdef CAS_BETTER_DIAGONALS + AH2 mnR2=min(min(gR,iR),min(min(aR,cR),mnR)); + AH2 mnG2=min(min(gG,iG),min(min(aG,cG),mnG)); + AH2 mnB2=min(min(gB,iB),min(min(aB,cB),mnB)); + mnR=mnR+mnR2; + mnG=mnG+mnG2; + mnB=mnB+mnB2; + #endif + AH2 mxR=max(max(fR,hR),max(max(bR,dR),eR)); + AH2 mxG=max(max(fG,hG),max(max(bG,dG),eG)); + AH2 mxB=max(max(fB,hB),max(max(bB,dB),eB)); + #ifdef CAS_BETTER_DIAGONALS + AH2 mxR2=max(max(gR,iR),max(max(aR,cR),mxR)); + AH2 mxG2=max(max(gG,iG),max(max(aG,cG),mxG)); + AH2 mxB2=max(max(gB,iB),max(max(aB,cB),mxB)); + mxR=mxR+mxR2; + mxG=mxG+mxG2; + mxB=mxB+mxB2; + #endif + // Smooth minimum distance to signal limit divided by smooth max. + #ifdef CAS_GO_SLOWER + AH2 rcpMR=ARcpH2(mxR); + AH2 rcpMG=ARcpH2(mxG); + AH2 rcpMB=ARcpH2(mxB); + #else + AH2 rcpMR=APrxLoRcpH2(mxR); + AH2 rcpMG=APrxLoRcpH2(mxG); + AH2 rcpMB=APrxLoRcpH2(mxB); + #endif + #ifdef CAS_BETTER_DIAGONALS + AH2 ampR=ASatH2(min(mnR,AH2_(2.0)-mxR)*rcpMR); + AH2 ampG=ASatH2(min(mnG,AH2_(2.0)-mxG)*rcpMG); + AH2 ampB=ASatH2(min(mnB,AH2_(2.0)-mxB)*rcpMB); + #else + AH2 ampR=ASatH2(min(mnR,AH2_(1.0)-mxR)*rcpMR); + AH2 ampG=ASatH2(min(mnG,AH2_(1.0)-mxG)*rcpMG); + AH2 ampB=ASatH2(min(mnB,AH2_(1.0)-mxB)*rcpMB); + #endif + // Shaping amount of sharpening. + #ifdef CAS_GO_SLOWER + ampR=sqrt(ampR); + ampG=sqrt(ampG); + ampB=sqrt(ampB); + #else + ampR=APrxLoSqrtH2(ampR); + ampG=APrxLoSqrtH2(ampG); + ampB=APrxLoSqrtH2(ampB); + #endif + // Filter shape. + A_MAYBE_UNUSED AH1 peak=AH2_AU1(const1.y).x; + A_MAYBE_UNUSED AH2 wR=ampR*AH2_(peak); + A_MAYBE_UNUSED AH2 wG=ampG*AH2_(peak); + A_MAYBE_UNUSED AH2 wB=ampB*AH2_(peak); + // Filter. + #ifndef CAS_SLOW + #ifdef CAS_GO_SLOWER + AH2 rcpWeight=ARcpH2(AH2_(1.0)+AH2_(4.0)*wG); + #else + AH2 rcpWeight=APrxMedRcpH2(AH2_(1.0)+AH2_(4.0)*wG); + #endif + pixR=ASatH2((bR*wG+dR*wG+fR*wG+hR*wG+eR)*rcpWeight); + pixG=ASatH2((bG*wG+dG*wG+fG*wG+hG*wG+eG)*rcpWeight); + pixB=ASatH2((bB*wG+dB*wG+fB*wG+hB*wG+eB)*rcpWeight); + #else + #ifdef CAS_GO_SLOWER + AH2 rcpWeightR=ARcpH2(AH2_(1.0)+AH2_(4.0)*wR); + AH2 rcpWeightG=ARcpH2(AH2_(1.0)+AH2_(4.0)*wG); + AH2 rcpWeightB=ARcpH2(AH2_(1.0)+AH2_(4.0)*wB); + #else + AH2 rcpWeightR=APrxMedRcpH2(AH2_(1.0)+AH2_(4.0)*wR); + AH2 rcpWeightG=APrxMedRcpH2(AH2_(1.0)+AH2_(4.0)*wG); + AH2 rcpWeightB=APrxMedRcpH2(AH2_(1.0)+AH2_(4.0)*wB); + #endif + pixR=ASatH2((bR*wR+dR*wR+fR*wR+hR*wR+eR)*rcpWeightR); + pixG=ASatH2((bG*wG+dG*wG+fG*wG+hG*wG+eG)*rcpWeightG); + pixB=ASatH2((bB*wB+dB*wB+fB*wB+hB*wB+eB)*rcpWeightB); + #endif + return;} +//------------------------------------------------------------------------------------------------------------------------------ + // Scaling algorithm adaptively interpolates between nearest 4 results of the non-scaling algorithm. + AF2 pp=AF2(ip)*AF2_AU2(const0.xy)+AF2_AU2(const0.zw); + // Tile 0. + // Fractional position is needed in high precision here. + AF2 fp0=floor(pp); + AH2 ppX; + ppX.x=AH1(pp.x-fp0.x); + AH1 ppY=AH1(pp.y-fp0.y); + ASW2 sp0=ASW2(fp0); + AH3 a0=CasLoadH(TEXCALL sp0+ASW2(-1,-1)); + AH3 b0=CasLoadH(TEXCALL sp0+ASW2( 0,-1)); + AH3 e0=CasLoadH(TEXCALL sp0+ASW2(-1, 0)); + AH3 f0=CasLoadH(TEXCALL sp0); + AH3 c0=CasLoadH(TEXCALL sp0+ASW2( 1,-1)); + AH3 d0=CasLoadH(TEXCALL sp0+ASW2( 2,-1)); + AH3 g0=CasLoadH(TEXCALL sp0+ASW2( 1, 0)); + AH3 h0=CasLoadH(TEXCALL sp0+ASW2( 2, 0)); + AH3 i0=CasLoadH(TEXCALL sp0+ASW2(-1, 1)); + AH3 j0=CasLoadH(TEXCALL sp0+ASW2( 0, 1)); + AH3 m0=CasLoadH(TEXCALL sp0+ASW2(-1, 2)); + AH3 n0=CasLoadH(TEXCALL sp0+ASW2( 0, 2)); + AH3 k0=CasLoadH(TEXCALL sp0+ASW2( 1, 1)); + AH3 l0=CasLoadH(TEXCALL sp0+ASW2( 2, 1)); + AH3 o0=CasLoadH(TEXCALL sp0+ASW2( 1, 2)); + AH3 p0=CasLoadH(TEXCALL sp0+ASW2( 2, 2)); + // Tile 1 (offset only in x). + AF1 pp1=pp.x+AF1_AU1(const1.z); + AF1 fp1=floor(pp1); + ppX.y=AH1(pp1-fp1); + ASW2 sp1=ASW2(fp1,sp0.y); + AH3 a1=CasLoadH(TEXCALL sp1+ASW2(-1,-1)); + AH3 b1=CasLoadH(TEXCALL sp1+ASW2( 0,-1)); + AH3 e1=CasLoadH(TEXCALL sp1+ASW2(-1, 0)); + AH3 f1=CasLoadH(TEXCALL sp1); + AH3 c1=CasLoadH(TEXCALL sp1+ASW2( 1,-1)); + AH3 d1=CasLoadH(TEXCALL sp1+ASW2( 2,-1)); + AH3 g1=CasLoadH(TEXCALL sp1+ASW2( 1, 0)); + AH3 h1=CasLoadH(TEXCALL sp1+ASW2( 2, 0)); + AH3 i1=CasLoadH(TEXCALL sp1+ASW2(-1, 1)); + AH3 j1=CasLoadH(TEXCALL sp1+ASW2( 0, 1)); + AH3 m1=CasLoadH(TEXCALL sp1+ASW2(-1, 2)); + AH3 n1=CasLoadH(TEXCALL sp1+ASW2( 0, 2)); + AH3 k1=CasLoadH(TEXCALL sp1+ASW2( 1, 1)); + AH3 l1=CasLoadH(TEXCALL sp1+ASW2( 2, 1)); + AH3 o1=CasLoadH(TEXCALL sp1+ASW2( 1, 2)); + AH3 p1=CasLoadH(TEXCALL sp1+ASW2( 2, 2)); + // AOS to SOA conversion. + AH2 aR=AH2(a0.r,a1.r); + AH2 aG=AH2(a0.g,a1.g); + AH2 aB=AH2(a0.b,a1.b); + AH2 bR=AH2(b0.r,b1.r); + AH2 bG=AH2(b0.g,b1.g); + AH2 bB=AH2(b0.b,b1.b); + AH2 cR=AH2(c0.r,c1.r); + AH2 cG=AH2(c0.g,c1.g); + AH2 cB=AH2(c0.b,c1.b); + AH2 dR=AH2(d0.r,d1.r); + AH2 dG=AH2(d0.g,d1.g); + AH2 dB=AH2(d0.b,d1.b); + AH2 eR=AH2(e0.r,e1.r); + AH2 eG=AH2(e0.g,e1.g); + AH2 eB=AH2(e0.b,e1.b); + AH2 fR=AH2(f0.r,f1.r); + AH2 fG=AH2(f0.g,f1.g); + AH2 fB=AH2(f0.b,f1.b); + AH2 gR=AH2(g0.r,g1.r); + AH2 gG=AH2(g0.g,g1.g); + AH2 gB=AH2(g0.b,g1.b); + AH2 hR=AH2(h0.r,h1.r); + AH2 hG=AH2(h0.g,h1.g); + AH2 hB=AH2(h0.b,h1.b); + AH2 iR=AH2(i0.r,i1.r); + AH2 iG=AH2(i0.g,i1.g); + AH2 iB=AH2(i0.b,i1.b); + AH2 jR=AH2(j0.r,j1.r); + AH2 jG=AH2(j0.g,j1.g); + AH2 jB=AH2(j0.b,j1.b); + AH2 kR=AH2(k0.r,k1.r); + AH2 kG=AH2(k0.g,k1.g); + AH2 kB=AH2(k0.b,k1.b); + AH2 lR=AH2(l0.r,l1.r); + AH2 lG=AH2(l0.g,l1.g); + AH2 lB=AH2(l0.b,l1.b); + AH2 mR=AH2(m0.r,m1.r); + AH2 mG=AH2(m0.g,m1.g); + AH2 mB=AH2(m0.b,m1.b); + AH2 nR=AH2(n0.r,n1.r); + AH2 nG=AH2(n0.g,n1.g); + AH2 nB=AH2(n0.b,n1.b); + AH2 oR=AH2(o0.r,o1.r); + AH2 oG=AH2(o0.g,o1.g); + AH2 oB=AH2(o0.b,o1.b); + AH2 pR=AH2(p0.r,p1.r); + AH2 pG=AH2(p0.g,p1.g); + AH2 pB=AH2(p0.b,p1.b); + // Run optional input transform. + CasInputH(aR,aG,aB); + CasInputH(bR,bG,bB); + CasInputH(cR,cG,cB); + CasInputH(dR,dG,dB); + CasInputH(eR,eG,eB); + CasInputH(fR,fG,fB); + CasInputH(gR,gG,gB); + CasInputH(hR,hG,hB); + CasInputH(iR,iG,iB); + CasInputH(jR,jG,jB); + CasInputH(kR,kG,kB); + CasInputH(lR,lG,lB); + CasInputH(mR,mG,mB); + CasInputH(nR,nG,nB); + CasInputH(oR,oG,oB); + CasInputH(pR,pG,pB); + // Soft min and max. + // These are 2.0x bigger (factored out the extra multiply). + // a b c b + // e f g * 0.5 + e f g * 0.5 [F] + // i j k j + AH2 mnfR=AMin3H2(AMin3H2(bR,eR,fR),gR,jR); + AH2 mnfG=AMin3H2(AMin3H2(bG,eG,fG),gG,jG); + AH2 mnfB=AMin3H2(AMin3H2(bB,eB,fB),gB,jB); + #ifdef CAS_BETTER_DIAGONALS + AH2 mnfR2=AMin3H2(AMin3H2(mnfR,aR,cR),iR,kR); + AH2 mnfG2=AMin3H2(AMin3H2(mnfG,aG,cG),iG,kG); + AH2 mnfB2=AMin3H2(AMin3H2(mnfB,aB,cB),iB,kB); + mnfR=mnfR+mnfR2; + mnfG=mnfG+mnfG2; + mnfB=mnfB+mnfB2; + #endif + AH2 mxfR=AMax3H2(AMax3H2(bR,eR,fR),gR,jR); + AH2 mxfG=AMax3H2(AMax3H2(bG,eG,fG),gG,jG); + AH2 mxfB=AMax3H2(AMax3H2(bB,eB,fB),gB,jB); + #ifdef CAS_BETTER_DIAGONALS + AH2 mxfR2=AMax3H2(AMax3H2(mxfR,aR,cR),iR,kR); + AH2 mxfG2=AMax3H2(AMax3H2(mxfG,aG,cG),iG,kG); + AH2 mxfB2=AMax3H2(AMax3H2(mxfB,aB,cB),iB,kB); + mxfR=mxfR+mxfR2; + mxfG=mxfG+mxfG2; + mxfB=mxfB+mxfB2; + #endif + // b c d c + // f g h * 0.5 + f g h * 0.5 [G] + // j k l k + AH2 mngR=AMin3H2(AMin3H2(cR,fR,gR),hR,kR); + AH2 mngG=AMin3H2(AMin3H2(cG,fG,gG),hG,kG); + AH2 mngB=AMin3H2(AMin3H2(cB,fB,gB),hB,kB); + #ifdef CAS_BETTER_DIAGONALS + AH2 mngR2=AMin3H2(AMin3H2(mngR,bR,dR),jR,lR); + AH2 mngG2=AMin3H2(AMin3H2(mngG,bG,dG),jG,lG); + AH2 mngB2=AMin3H2(AMin3H2(mngB,bB,dB),jB,lB); + mngR=mngR+mngR2; + mngG=mngG+mngG2; + mngB=mngB+mngB2; + #endif + AH2 mxgR=AMax3H2(AMax3H2(cR,fR,gR),hR,kR); + AH2 mxgG=AMax3H2(AMax3H2(cG,fG,gG),hG,kG); + AH2 mxgB=AMax3H2(AMax3H2(cB,fB,gB),hB,kB); + #ifdef CAS_BETTER_DIAGONALS + AH2 mxgR2=AMax3H2(AMax3H2(mxgR,bR,dR),jR,lR); + AH2 mxgG2=AMax3H2(AMax3H2(mxgG,bG,dG),jG,lG); + AH2 mxgB2=AMax3H2(AMax3H2(mxgB,bB,dB),jB,lB); + mxgR=mxgR+mxgR2; + mxgG=mxgG+mxgG2; + mxgB=mxgB+mxgB2; + #endif + // e f g f + // i j k * 0.5 + i j k * 0.5 [J] + // m n o n + AH2 mnjR=AMin3H2(AMin3H2(fR,iR,jR),kR,nR); + AH2 mnjG=AMin3H2(AMin3H2(fG,iG,jG),kG,nG); + AH2 mnjB=AMin3H2(AMin3H2(fB,iB,jB),kB,nB); + #ifdef CAS_BETTER_DIAGONALS + AH2 mnjR2=AMin3H2(AMin3H2(mnjR,eR,gR),mR,oR); + AH2 mnjG2=AMin3H2(AMin3H2(mnjG,eG,gG),mG,oG); + AH2 mnjB2=AMin3H2(AMin3H2(mnjB,eB,gB),mB,oB); + mnjR=mnjR+mnjR2; + mnjG=mnjG+mnjG2; + mnjB=mnjB+mnjB2; + #endif + AH2 mxjR=AMax3H2(AMax3H2(fR,iR,jR),kR,nR); + AH2 mxjG=AMax3H2(AMax3H2(fG,iG,jG),kG,nG); + AH2 mxjB=AMax3H2(AMax3H2(fB,iB,jB),kB,nB); + #ifdef CAS_BETTER_DIAGONALS + AH2 mxjR2=AMax3H2(AMax3H2(mxjR,eR,gR),mR,oR); + AH2 mxjG2=AMax3H2(AMax3H2(mxjG,eG,gG),mG,oG); + AH2 mxjB2=AMax3H2(AMax3H2(mxjB,eB,gB),mB,oB); + mxjR=mxjR+mxjR2; + mxjG=mxjG+mxjG2; + mxjB=mxjB+mxjB2; + #endif + // f g h g + // j k l * 0.5 + j k l * 0.5 [K] + // n o p o + AH2 mnkR=AMin3H2(AMin3H2(gR,jR,kR),lR,oR); + AH2 mnkG=AMin3H2(AMin3H2(gG,jG,kG),lG,oG); + AH2 mnkB=AMin3H2(AMin3H2(gB,jB,kB),lB,oB); + #ifdef CAS_BETTER_DIAGONALS + AH2 mnkR2=AMin3H2(AMin3H2(mnkR,fR,hR),nR,pR); + AH2 mnkG2=AMin3H2(AMin3H2(mnkG,fG,hG),nG,pG); + AH2 mnkB2=AMin3H2(AMin3H2(mnkB,fB,hB),nB,pB); + mnkR=mnkR+mnkR2; + mnkG=mnkG+mnkG2; + mnkB=mnkB+mnkB2; + #endif + AH2 mxkR=AMax3H2(AMax3H2(gR,jR,kR),lR,oR); + AH2 mxkG=AMax3H2(AMax3H2(gG,jG,kG),lG,oG); + AH2 mxkB=AMax3H2(AMax3H2(gB,jB,kB),lB,oB); + #ifdef CAS_BETTER_DIAGONALS + AH2 mxkR2=AMax3H2(AMax3H2(mxkR,fR,hR),nR,pR); + AH2 mxkG2=AMax3H2(AMax3H2(mxkG,fG,hG),nG,pG); + AH2 mxkB2=AMax3H2(AMax3H2(mxkB,fB,hB),nB,pB); + mxkR=mxkR+mxkR2; + mxkG=mxkG+mxkG2; + mxkB=mxkB+mxkB2; + #endif + // Smooth minimum distance to signal limit divided by smooth max. + #ifdef CAS_GO_SLOWER + AH2 rcpMfR=ARcpH2(mxfR); + AH2 rcpMfG=ARcpH2(mxfG); + AH2 rcpMfB=ARcpH2(mxfB); + AH2 rcpMgR=ARcpH2(mxgR); + AH2 rcpMgG=ARcpH2(mxgG); + AH2 rcpMgB=ARcpH2(mxgB); + AH2 rcpMjR=ARcpH2(mxjR); + AH2 rcpMjG=ARcpH2(mxjG); + AH2 rcpMjB=ARcpH2(mxjB); + AH2 rcpMkR=ARcpH2(mxkR); + AH2 rcpMkG=ARcpH2(mxkG); + AH2 rcpMkB=ARcpH2(mxkB); + #else + AH2 rcpMfR=APrxLoRcpH2(mxfR); + AH2 rcpMfG=APrxLoRcpH2(mxfG); + AH2 rcpMfB=APrxLoRcpH2(mxfB); + AH2 rcpMgR=APrxLoRcpH2(mxgR); + AH2 rcpMgG=APrxLoRcpH2(mxgG); + AH2 rcpMgB=APrxLoRcpH2(mxgB); + AH2 rcpMjR=APrxLoRcpH2(mxjR); + AH2 rcpMjG=APrxLoRcpH2(mxjG); + AH2 rcpMjB=APrxLoRcpH2(mxjB); + AH2 rcpMkR=APrxLoRcpH2(mxkR); + AH2 rcpMkG=APrxLoRcpH2(mxkG); + AH2 rcpMkB=APrxLoRcpH2(mxkB); + #endif + #ifdef CAS_BETTER_DIAGONALS + AH2 ampfR=ASatH2(min(mnfR,AH2_(2.0)-mxfR)*rcpMfR); + AH2 ampfG=ASatH2(min(mnfG,AH2_(2.0)-mxfG)*rcpMfG); + AH2 ampfB=ASatH2(min(mnfB,AH2_(2.0)-mxfB)*rcpMfB); + AH2 ampgR=ASatH2(min(mngR,AH2_(2.0)-mxgR)*rcpMgR); + AH2 ampgG=ASatH2(min(mngG,AH2_(2.0)-mxgG)*rcpMgG); + AH2 ampgB=ASatH2(min(mngB,AH2_(2.0)-mxgB)*rcpMgB); + AH2 ampjR=ASatH2(min(mnjR,AH2_(2.0)-mxjR)*rcpMjR); + AH2 ampjG=ASatH2(min(mnjG,AH2_(2.0)-mxjG)*rcpMjG); + AH2 ampjB=ASatH2(min(mnjB,AH2_(2.0)-mxjB)*rcpMjB); + AH2 ampkR=ASatH2(min(mnkR,AH2_(2.0)-mxkR)*rcpMkR); + AH2 ampkG=ASatH2(min(mnkG,AH2_(2.0)-mxkG)*rcpMkG); + AH2 ampkB=ASatH2(min(mnkB,AH2_(2.0)-mxkB)*rcpMkB); + #else + AH2 ampfR=ASatH2(min(mnfR,AH2_(1.0)-mxfR)*rcpMfR); + AH2 ampfG=ASatH2(min(mnfG,AH2_(1.0)-mxfG)*rcpMfG); + AH2 ampfB=ASatH2(min(mnfB,AH2_(1.0)-mxfB)*rcpMfB); + AH2 ampgR=ASatH2(min(mngR,AH2_(1.0)-mxgR)*rcpMgR); + AH2 ampgG=ASatH2(min(mngG,AH2_(1.0)-mxgG)*rcpMgG); + AH2 ampgB=ASatH2(min(mngB,AH2_(1.0)-mxgB)*rcpMgB); + AH2 ampjR=ASatH2(min(mnjR,AH2_(1.0)-mxjR)*rcpMjR); + AH2 ampjG=ASatH2(min(mnjG,AH2_(1.0)-mxjG)*rcpMjG); + AH2 ampjB=ASatH2(min(mnjB,AH2_(1.0)-mxjB)*rcpMjB); + AH2 ampkR=ASatH2(min(mnkR,AH2_(1.0)-mxkR)*rcpMkR); + AH2 ampkG=ASatH2(min(mnkG,AH2_(1.0)-mxkG)*rcpMkG); + AH2 ampkB=ASatH2(min(mnkB,AH2_(1.0)-mxkB)*rcpMkB); + #endif + // Shaping amount of sharpening. + #ifdef CAS_GO_SLOWER + ampfR=sqrt(ampfR); + ampfG=sqrt(ampfG); + ampfB=sqrt(ampfB); + ampgR=sqrt(ampgR); + ampgG=sqrt(ampgG); + ampgB=sqrt(ampgB); + ampjR=sqrt(ampjR); + ampjG=sqrt(ampjG); + ampjB=sqrt(ampjB); + ampkR=sqrt(ampkR); + ampkG=sqrt(ampkG); + ampkB=sqrt(ampkB); + #else + ampfR=APrxLoSqrtH2(ampfR); + ampfG=APrxLoSqrtH2(ampfG); + ampfB=APrxLoSqrtH2(ampfB); + ampgR=APrxLoSqrtH2(ampgR); + ampgG=APrxLoSqrtH2(ampgG); + ampgB=APrxLoSqrtH2(ampgB); + ampjR=APrxLoSqrtH2(ampjR); + ampjG=APrxLoSqrtH2(ampjG); + ampjB=APrxLoSqrtH2(ampjB); + ampkR=APrxLoSqrtH2(ampkR); + ampkG=APrxLoSqrtH2(ampkG); + ampkB=APrxLoSqrtH2(ampkB); + #endif + // Filter shape. + AH1 peak=AH2_AU1(const1.y).x; + AH2 wfR=ampfR*AH2_(peak); + AH2 wfG=ampfG*AH2_(peak); + AH2 wfB=ampfB*AH2_(peak); + AH2 wgR=ampgR*AH2_(peak); + AH2 wgG=ampgG*AH2_(peak); + AH2 wgB=ampgB*AH2_(peak); + AH2 wjR=ampjR*AH2_(peak); + AH2 wjG=ampjG*AH2_(peak); + AH2 wjB=ampjB*AH2_(peak); + AH2 wkR=ampkR*AH2_(peak); + AH2 wkG=ampkG*AH2_(peak); + AH2 wkB=ampkB*AH2_(peak); + // Blend between 4 results. + AH2 s=(AH2_(1.0)-ppX)*(AH2_(1.0)-AH2_(ppY)); + AH2 t= ppX *(AH2_(1.0)-AH2_(ppY)); + AH2 u=(AH2_(1.0)-ppX)* AH2_(ppY) ; + AH2 v= ppX * AH2_(ppY) ; + // Thin edges to hide bilinear interpolation (helps diagonals). + AH2 thinB=AH2_(1.0/32.0); + #ifdef CAS_GO_SLOWER + s*=ARcpH2(thinB+(mxfG-mnfG)); + t*=ARcpH2(thinB+(mxgG-mngG)); + u*=ARcpH2(thinB+(mxjG-mnjG)); + v*=ARcpH2(thinB+(mxkG-mnkG)); + #else + s*=APrxLoRcpH2(thinB+(mxfG-mnfG)); + t*=APrxLoRcpH2(thinB+(mxgG-mngG)); + u*=APrxLoRcpH2(thinB+(mxjG-mnjG)); + v*=APrxLoRcpH2(thinB+(mxkG-mnkG)); + #endif + // Final weighting. + A_MAYBE_UNUSED AH2 qbeR=wfR*s; + A_MAYBE_UNUSED AH2 qbeG=wfG*s; + A_MAYBE_UNUSED AH2 qbeB=wfB*s; + A_MAYBE_UNUSED AH2 qchR=wgR*t; + A_MAYBE_UNUSED AH2 qchG=wgG*t; + A_MAYBE_UNUSED AH2 qchB=wgB*t; + A_MAYBE_UNUSED AH2 qfR=wgR*t+wjR*u+s; + A_MAYBE_UNUSED AH2 qfG=wgG*t+wjG*u+s; + A_MAYBE_UNUSED AH2 qfB=wgB*t+wjB*u+s; + A_MAYBE_UNUSED AH2 qgR=wfR*s+wkR*v+t; + A_MAYBE_UNUSED AH2 qgG=wfG*s+wkG*v+t; + A_MAYBE_UNUSED AH2 qgB=wfB*s+wkB*v+t; + A_MAYBE_UNUSED AH2 qjR=wfR*s+wkR*v+u; + A_MAYBE_UNUSED AH2 qjG=wfG*s+wkG*v+u; + A_MAYBE_UNUSED AH2 qjB=wfB*s+wkB*v+u; + A_MAYBE_UNUSED AH2 qkR=wgR*t+wjR*u+v; + A_MAYBE_UNUSED AH2 qkG=wgG*t+wjG*u+v; + A_MAYBE_UNUSED AH2 qkB=wgB*t+wjB*u+v; + A_MAYBE_UNUSED AH2 qinR=wjR*u; + A_MAYBE_UNUSED AH2 qinG=wjG*u; + A_MAYBE_UNUSED AH2 qinB=wjB*u; + A_MAYBE_UNUSED AH2 qloR=wkR*v; + A_MAYBE_UNUSED AH2 qloG=wkG*v; + A_MAYBE_UNUSED AH2 qloB=wkB*v; + // Filter. + #ifndef CAS_SLOW + #ifdef CAS_GO_SLOWER + AH2 rcpWG=ARcpH2(AH2_(2.0)*qbeG+AH2_(2.0)*qchG+AH2_(2.0)*qinG+AH2_(2.0)*qloG+qfG+qgG+qjG+qkG); + #else + AH2 rcpWG=APrxMedRcpH2(AH2_(2.0)*qbeG+AH2_(2.0)*qchG+AH2_(2.0)*qinG+AH2_(2.0)*qloG+qfG+qgG+qjG+qkG); + #endif + pixR=ASatH2((bR*qbeG+eR*qbeG+cR*qchG+hR*qchG+iR*qinG+nR*qinG+lR*qloG+oR*qloG+fR*qfG+gR*qgG+jR*qjG+kR*qkG)*rcpWG); + pixG=ASatH2((bG*qbeG+eG*qbeG+cG*qchG+hG*qchG+iG*qinG+nG*qinG+lG*qloG+oG*qloG+fG*qfG+gG*qgG+jG*qjG+kG*qkG)*rcpWG); + pixB=ASatH2((bB*qbeG+eB*qbeG+cB*qchG+hB*qchG+iB*qinG+nB*qinG+lB*qloG+oB*qloG+fB*qfG+gB*qgG+jB*qjG+kB*qkG)*rcpWG); + #else + #ifdef CAS_GO_SLOWER + AH2 rcpWR=ARcpH2(AH2_(2.0)*qbeR+AH2_(2.0)*qchR+AH2_(2.0)*qinR+AH2_(2.0)*qloR+qfR+qgR+qjR+qkR); + AH2 rcpWG=ARcpH2(AH2_(2.0)*qbeG+AH2_(2.0)*qchG+AH2_(2.0)*qinG+AH2_(2.0)*qloG+qfG+qgG+qjG+qkG); + AH2 rcpWB=ARcpH2(AH2_(2.0)*qbeB+AH2_(2.0)*qchB+AH2_(2.0)*qinB+AH2_(2.0)*qloB+qfB+qgB+qjB+qkB); + #else + AH2 rcpWR=APrxMedRcpH2(AH2_(2.0)*qbeR+AH2_(2.0)*qchR+AH2_(2.0)*qinR+AH2_(2.0)*qloR+qfR+qgR+qjR+qkR); + AH2 rcpWG=APrxMedRcpH2(AH2_(2.0)*qbeG+AH2_(2.0)*qchG+AH2_(2.0)*qinG+AH2_(2.0)*qloG+qfG+qgG+qjG+qkG); + AH2 rcpWB=APrxMedRcpH2(AH2_(2.0)*qbeB+AH2_(2.0)*qchB+AH2_(2.0)*qinB+AH2_(2.0)*qloB+qfB+qgB+qjB+qkB); + #endif + pixR=ASatH2((bR*qbeR+eR*qbeR+cR*qchR+hR*qchR+iR*qinR+nR*qinR+lR*qloR+oR*qloR+fR*qfR+gR*qgR+jR*qjR+kR*qkR)*rcpWR); + pixG=ASatH2((bG*qbeG+eG*qbeG+cG*qchG+hG*qchG+iG*qinG+nG*qinG+lG*qloG+oG*qloG+fG*qfG+gG*qgG+jG*qjG+kG*qkG)*rcpWG); + pixB=ASatH2((bB*qbeB+eB*qbeB+cB*qchB+hB*qchB+iB*qinB+nB*qinB+lB*qloB+oB*qloB+fB*qfB+gB*qgB+jB*qjB+kB*qkB)*rcpWB); + #endif + } + + #undef TEXINPUT + #undef TEXCALL +#endif diff --git a/bin/resources/shaders/dx11/cas.hlsl b/bin/resources/shaders/dx11/cas.hlsl new file mode 100644 index 0000000000..50b13c54f6 --- /dev/null +++ b/bin/resources/shaders/dx11/cas.hlsl @@ -0,0 +1,75 @@ +// Based on CAS_Shader.hlsl +// +// Copyright(c) 2019 Advanced Micro Devices, Inc.All rights reserved. +// 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. + +cbuffer cb : register(b0) +{ + uint4 const0; + uint4 const1; + int2 srcOffset; +}; + +Texture2D InputTexture : register(t0); +RWTexture2D OutputTexture : register(u0); + +#define A_GPU 1 +#define A_HLSL 1 + +#include "ffx_a.h" + +AF3 CasLoad(ASU2 p) +{ + return InputTexture.Load(int3(srcOffset, 0) + int3(p, 0)).rgb; +} + +// Lets you transform input from the load into a linear color space between 0 and 1. See ffx_cas.h +// In this case, our input is already linear and between 0 and 1 +void CasInput(inout AF1 r, inout AF1 g, inout AF1 b) {} + +#include "ffx_cas.h" + +[numthreads(64, 1, 1)] +void main(uint3 LocalThreadId : SV_GroupThreadID, uint3 WorkGroupId : SV_GroupID) +{ + // Do remapping of local xy in workgroup for a more PS-like swizzle pattern. + AU2 gxy = ARmp8x8(LocalThreadId.x) + AU2(WorkGroupId.x << 4u, WorkGroupId.y << 4u); + +#if CAS_SHARPEN_ONLY + const bool sharpenOnly = true; +#else + const bool sharpenOnly = false; +#endif + + // Filter. + AF3 c; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, sharpenOnly); + OutputTexture[ASU2(gxy)] = AF4(c, 1); + gxy.x += 8u; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, sharpenOnly); + OutputTexture[ASU2(gxy)] = AF4(c, 1); + gxy.y += 8u; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, sharpenOnly); + OutputTexture[ASU2(gxy)] = AF4(c, 1); + gxy.x -= 8u; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, sharpenOnly); + OutputTexture[ASU2(gxy)] = AF4(c, 1); +} diff --git a/bin/resources/shaders/dx11/convert.fx b/bin/resources/shaders/dx11/convert.fx index 463cb35d83..d4f1fd73a5 100644 --- a/bin/resources/shaders/dx11/convert.fx +++ b/bin/resources/shaders/dx11/convert.fx @@ -121,17 +121,19 @@ PS_OUTPUT ps_datm0(PS_INPUT input) return output; } -PS_OUTPUT ps_mod256(PS_INPUT input) +PS_OUTPUT ps_hdr_init(PS_INPUT input) { PS_OUTPUT output; + float4 value = sample_c(input.t); + output.c = float4(round(value.rgb * 255) / 65535, value.a); + return output; +} - float4 c = round(sample_c(input.t) * 255); - // We use 2 fmod to avoid negative value. - float4 fmod1 = fmod(c, 256) + 256; - float4 fmod2 = fmod(fmod1, 256); - - output.c = fmod2 / 255.0f; - +PS_OUTPUT ps_hdr_resolve(PS_INPUT input) +{ + PS_OUTPUT output; + float4 value = sample_c(input.t); + output.c = float4(float3(uint3(value.rgb * 65535.5) & 255) / 255, value.a); return output; } @@ -162,50 +164,104 @@ PS_OUTPUT ps_convert_float16_rgb5a1(PS_INPUT input) return output; } + +float rgba8_to_depth32(float4 val) +{ + uint4 c = uint4(val * 255.5f); + return float(c.r | (c.g << 8) | (c.b << 16) | (c.a << 24)) * exp2(-32.0f); +} + +float rgba8_to_depth24(float4 val) +{ + uint3 c = uint3(val.rgb * 255.5f); + return float(c.r | (c.g << 8) | (c.b << 16)) * exp2(-32.0f); +} + +float rgba8_to_depth16(float4 val) +{ + uint2 c = uint2(val.rg * 255.5f); + return float(c.r | (c.g << 8)) * exp2(-32.0f); +} + +float rgb5a1_to_depth16(float4 val) +{ + uint4 c = uint4(val * 255.5f); + return float(((c.r & 0xF8u) >> 3) | ((c.g & 0xF8u) << 2) | ((c.b & 0xF8u) << 7) | ((c.a & 0x80u) << 8)) * exp2(-32.0f); +} + float ps_convert_rgba8_float32(PS_INPUT input) : SV_Depth { - // Convert a RRGBA texture into a float depth texture - uint4 c = uint4(sample_c(input.t) * 255.0f + 0.5f); - return float(c.r | (c.g << 8) | (c.b << 16) | (c.a << 24)) * exp2(-32.0f); + // Convert an RGBA texture into a float depth texture + return rgba8_to_depth32(sample_c(input.t)); } float ps_convert_rgba8_float24(PS_INPUT input) : SV_Depth { // Same as above but without the alpha channel (24 bits Z) - // Convert a RRGBA texture into a float depth texture - uint3 c = uint3(sample_c(input.t).rgb * 255.0f + 0.5f); - return float(c.r | (c.g << 8) | (c.b << 16)) * exp2(-32.0f); + // Convert an RGBA texture into a float depth texture + return rgba8_to_depth24(sample_c(input.t)); } float ps_convert_rgba8_float16(PS_INPUT input) : SV_Depth { // Same as above but without the A/B channels (16 bits Z) - // Convert a RRGBA texture into a float depth texture - uint2 c = uint2(sample_c(input.t).rg * 255.0f + 0.5f); - return float(c.r | (c.g << 8)) * exp2(-32.0f); + // Convert an RGBA texture into a float depth texture + return rgba8_to_depth16(sample_c(input.t)); } float ps_convert_rgb5a1_float16(PS_INPUT input) : SV_Depth { - // Convert a RGB5A1 (saved as RGBA8) color to a 16 bit Z - uint4 c = uint4(sample_c(input.t) * 255.0f + 0.5f); - return float(((c.r & 0xF8u) >> 3) | ((c.g & 0xF8u) << 2) | ((c.b & 0xF8u) << 7) | ((c.a & 0x80u) << 8)) * exp2(-32.0f); + // Convert an RGB5A1 (saved as RGBA8) color to a 16 bit Z + return rgb5a1_to_depth16(sample_c(input.t)); +} + +#define SAMPLE_RGBA_DEPTH_BILN(CONVERT_FN) \ + uint width, height; \ + Texture.GetDimensions(width, height); \ + float2 top_left_f = input.t * float2(width, height) - 0.5f; \ + int2 top_left = int2(floor(top_left_f)); \ + int4 coords = clamp(int4(top_left, top_left + 1), int4(0, 0, 0, 0), int2(width - 1, height - 1).xyxy); \ + float2 mix_vals = frac(top_left_f); \ + float depthTL = CONVERT_FN(Texture.Load(int3(coords.xy, 0))); \ + float depthTR = CONVERT_FN(Texture.Load(int3(coords.zy, 0))); \ + float depthBL = CONVERT_FN(Texture.Load(int3(coords.xw, 0))); \ + float depthBR = CONVERT_FN(Texture.Load(int3(coords.zw, 0))); \ + return lerp(lerp(depthTL, depthTR, mix_vals.x), lerp(depthBL, depthBR, mix_vals.x), mix_vals.y); + +float ps_convert_rgba8_float32_biln(PS_INPUT input) : SV_Depth +{ + // Convert an RGBA texture into a float depth texture + SAMPLE_RGBA_DEPTH_BILN(rgba8_to_depth32); +} + +float ps_convert_rgba8_float24_biln(PS_INPUT input) : SV_Depth +{ + // Same as above but without the alpha channel (24 bits Z) + + // Convert an RGBA texture into a float depth texture + SAMPLE_RGBA_DEPTH_BILN(rgba8_to_depth24); +} + +float ps_convert_rgba8_float16_biln(PS_INPUT input) : SV_Depth +{ + // Same as above but without the A/B channels (16 bits Z) + + // Convert an RGBA texture into a float depth texture + SAMPLE_RGBA_DEPTH_BILN(rgba8_to_depth16); +} + +float ps_convert_rgb5a1_float16_biln(PS_INPUT input) : SV_Depth +{ + // Convert an RGB5A1 (saved as RGBA8) color to a 16 bit Z + SAMPLE_RGBA_DEPTH_BILN(rgb5a1_to_depth16); } PS_OUTPUT ps_convert_rgba_8i(PS_INPUT input) { PS_OUTPUT output; - // Potential speed optimization. There is a high probability that - // game only want to extract a single channel (blue). It will allow - // to remove most of the conditional operation and yield a +2/3 fps - // boost on MGS3 - // - // Hypothesis wrong in Prince of Persia ... Seriously WTF ! - //#define ONLY_BLUE; - // Convert a RGBA texture into a 8 bits packed texture // Input column: 8x2 RGBA pixels // 0: 8 RGBA @@ -215,73 +271,28 @@ PS_OUTPUT ps_convert_rgba_8i(PS_INPUT input) // 1: 8 R | 8 B // 2: 8 G | 8 A // 3: 8 G | 8 A - float c; + uint2 pos = uint2(input.p.xy); - uint2 sel = uint2(input.p.xy) % uint2(16u, 16u); - int2 tb = ((int2(input.p.xy) & ~int2(15, 3)) >> 1); + // Collapse separate R G B A areas into their base pixel + uint2 block = (pos & ~uint2(15u, 3u)) >> 1; + uint2 subblock = pos & uint2(7u, 1u); + uint2 coord = block | subblock; - int ty = tb.y | (int(input.p.y) & 1); - int txN = tb.x | (int(input.p.x) & 7); - int txH = tb.x | ((int(input.p.x) + 4) & 7); + // Apply offset to cols 1 and 2 + uint is_col23 = pos.y & 4u; + uint is_col13 = pos.y & 2u; + uint is_col12 = is_col23 ^ (is_col13 << 1); + coord.x ^= is_col12; // If cols 1 or 2, flip bit 3 of x - txN *= PS_SCALE_FACTOR; - txH *= PS_SCALE_FACTOR; - ty *= PS_SCALE_FACTOR; - - // TODO investigate texture gather - float4 cN = Texture.Load(int3(txN, ty, 0)); - float4 cH = Texture.Load(int3(txH, ty, 0)); - - - if ((sel.y & 4u) == 0u) - { -#ifdef ONLY_BLUE - c = cN.b; -#else - // Column 0 and 2 - if ((sel.y & 3u) < 2u) - { - // First 2 lines of the col - if (sel.x < 8u) - c = cN.r; - else - c = cN.b; - } - else - { - if (sel.x < 8u) - c = cH.g; - else - c = cH.a; - } -#endif - } + if (floor(PS_SCALE_FACTOR) != PS_SCALE_FACTOR) + coord = uint2(float2(coord) * PS_SCALE_FACTOR); else - { -#ifdef ONLY_BLUE - c = cH.b; -#else - // Column 1 and 3 - if ((sel.y & 3u) < 2u) - { - // First 2 lines of the col - if (sel.x < 8u) - c = cH.r; - else - c = cH.b; - } - else - { - if (sel.x < 8u) - c = cN.g; - else - c = cN.a; - } -#endif - } - - output.c = (float4)(c); // Divide by something here? + coord *= PS_SCALE_FACTOR; + float4 pixel = Texture.Load(int3(int2(coord), 0)); + float2 sel0 = (pos.y & 2u) == 0u ? pixel.rb : pixel.ga; + float sel1 = (pos.x & 8u) == 0u ? sel0.x : sel0.y; + output.c = (float4)(sel1); // Divide by something here? return output; } diff --git a/bin/resources/shaders/dx11/interlace.fx b/bin/resources/shaders/dx11/interlace.fx index 825751b659..da9d711b37 100644 --- a/bin/resources/shaders/dx11/interlace.fx +++ b/bin/resources/shaders/dx11/interlace.fx @@ -5,7 +5,7 @@ SamplerState Sampler; cbuffer cb0 { - float2 ZrH; + float4 ZrH; }; struct PS_INPUT @@ -14,33 +14,175 @@ struct PS_INPUT float2 t : TEXCOORD0; }; + +// Weave shader float4 ps_main0(PS_INPUT input) : SV_Target0 { - if ((int(input.p.y) & 1) == 0) + const int idx = int(ZrH.x); // buffer index passed from CPU + const int field = idx & 1; // current field + const int vpos = int(input.p.y); // vertical position of destination texture + + if ((vpos & 1) == field) + return Texture.Sample(Sampler, input.t); + else discard; - return Texture.Sample(Sampler, input.t); + return float4(0.0f, 0.0f, 0.0f, 0.0f); } + +// Bob shader float4 ps_main1(PS_INPUT input) : SV_Target0 { - if ((int(input.p.y) & 1) != 0) - discard; - return Texture.Sample(Sampler, input.t); } + +// Blend shader float4 ps_main2(PS_INPUT input) : SV_Target0 { - float4 c0 = Texture.Sample(Sampler, input.t - ZrH); + float2 vstep = float2(0.0f, ZrH.y); + float4 c0 = Texture.Sample(Sampler, input.t - vstep); float4 c1 = Texture.Sample(Sampler, input.t); - float4 c2 = Texture.Sample(Sampler, input.t + ZrH); + float4 c2 = Texture.Sample(Sampler, input.t + vstep); return (c0 + c1 * 2 + c2) / 4; } + +// MAD shader - buffering float4 ps_main3(PS_INPUT input) : SV_Target0 { - return Texture.Sample(Sampler, input.t); + // We take half the lines from the current frame and stores them in the MAD frame buffer. + // the MAD frame buffer is split in 2 consecutive banks of 2 fields each, the fields in each bank + // are interleaved (top field at even lines and bottom field at odd lines). + // When the source texture has an odd vres, the first line of bank 1 would be an odd index + // causing the wrong lines to be discarded, so a vertical offset (lofs) is added to the vertical + // position of the destination texture to force the proper field alignment + + const int idx = int(ZrH.x); // buffer index passed from CPU + const int bank = idx >> 1; // current bank + const int field = idx & 1; // current field + const int vres = int(ZrH.z) >> 1; // vertical resolution of source texture + const int lofs = ((((vres + 1) >> 1) << 1) - vres) & bank; // line alignment offset for bank 1 + const int vpos = int(input.p.y) + lofs; // vertical position of destination texture + const float2 bofs = float2(0.0f, 0.5f * bank); // vertical offset of the current bank relative to source texture size + const float2 vscale = float2(1.0f, 2.0f); // scaling factor from source to destination texture + const float2 optr = input.t - bofs; // used to check if the current destination line is within the current bank + const float2 iptr = optr * vscale; // pointer to the current pixel in the source texture + + // if the index of current destination line belongs to the current fiels we update it, otherwise + // we leave the old line in the destination buffer + if ((optr.y >= 0.0f) && (optr.y < 0.5f) && ((vpos & 1) == field)) + return Texture.Sample(Sampler, iptr); + else + discard; + + return float4(0.0f, 0.0f, 0.0f, 0.0f); } + + +// MAD shader - reconstruction +float4 ps_main4(PS_INPUT input) : SV_Target0 +{ + // we use the contents of the MAD frame buffer to reconstruct the missing lines from the current + // field. + + const int idx = int(ZrH.x); // buffer index passed from CPU + const int field = idx & 1; // current field + const int vpos = int(input.p.y); // vertical position of destination texture + const float sensitivity = ZrH.w; // passed from CPU, higher values mean more likely to use weave + const float3 motion_thr = float3(1.0, 1.0, 1.0) * sensitivity; // + const float2 bofs = float2(0.0f, 0.5f); // position of the bank 1 relative to source texture size + const float2 vscale = float2(1.0f, 0.5f); // scaling factor from source to destination texture + const float2 lofs = float2(0.0f, ZrH.y) * vscale; // distance between two adjacent lines relative to source texture size + const float2 iptr = input.t * vscale; // pointer to the current pixel in the source texture + + float2 p_t0; // pointer to current pixel (missing or not) from most recent frame + float2 p_t1; // pointer to current pixel (missing or not) from one frame back + float2 p_t2; // pointer to current pixel (missing or not) from two frames back + float2 p_t3; // pointer to current pixel (missing or not) from three frames back + + switch (idx) + { + case 1: + p_t0 = iptr; + p_t1 = iptr; + p_t2 = iptr + bofs; + p_t3 = iptr + bofs; + break; + case 2: + p_t0 = iptr + bofs; + p_t1 = iptr; + p_t2 = iptr; + p_t3 = iptr + bofs; + break; + case 3: + p_t0 = iptr + bofs; + p_t1 = iptr + bofs; + p_t2 = iptr; + p_t3 = iptr; + break; + default: + p_t0 = iptr; + p_t1 = iptr + bofs; + p_t2 = iptr + bofs; + p_t3 = iptr; + break; + } + + // calculating motion, only relevant for missing lines where the "center line" is pointed by p_t1 + + float4 hn = Texture.Sample(Sampler, p_t0 - lofs); // new high pixel + float4 cn = Texture.Sample(Sampler, p_t1); // new center pixel + float4 ln = Texture.Sample(Sampler, p_t0 + lofs); // new low pixel + + float4 ho = Texture.Sample(Sampler, p_t2 - lofs); // old high pixel + float4 co = Texture.Sample(Sampler, p_t3); // old center pixel + float4 lo = Texture.Sample(Sampler, p_t2 + lofs); // old low pixel + + float3 mh = hn.rgb - ho.rgb; // high pixel motion + float3 mc = cn.rgb - co.rgb; // center pixel motion + float3 ml = ln.rgb - lo.rgb; // low pixel motion + + mh = max(mh, -mh) - motion_thr; + mc = max(mc, -mc) - motion_thr; + ml = max(ml, -ml) - motion_thr; + + #if 1 // use this code to evaluate each color motion separately + float mh_max = max(max(mh.x, mh.y), mh.z); + float mc_max = max(max(mc.x, mc.y), mc.z); + float ml_max = max(max(ml.x, ml.y), ml.z); + #else // use this code to evaluate average color motion + float mh_max = mh.x + mh.y + mh.z; + float mc_max = mc.x + mc.y + mc.z; + float ml_max = ml.x + ml.y + ml.z; + #endif + + // selecting deinterlacing output + + if ((vpos & 1) == field) + { + // output coordinate present on current field + return Texture.Sample(Sampler, p_t0); + } + else if ((iptr.y > 0.5f - lofs.y) || (iptr.y < 0.0 + lofs.y)) + { + // top and bottom lines are always weaved + return cn; + } + else + { + // missing line needs to be reconstructed + if (((mh_max > 0.0f) || (ml_max > 0.0f)) || (mc_max > 0.0f)) + // high motion -> interpolate pixels above and below + return (hn + ln) / 2.0f; + else + // low motion -> weave + return cn; + } + + return float4(0.0f, 0.0f, 0.0f, 0.0f); +} + #endif diff --git a/bin/resources/shaders/dx11/tfx.fx b/bin/resources/shaders/dx11/tfx.fx index dbcbcf4440..8818faaf86 100644 --- a/bin/resources/shaders/dx11/tfx.fx +++ b/bin/resources/shaders/dx11/tfx.fx @@ -13,6 +13,7 @@ #ifndef GS_IIP #define GS_IIP 0 #define GS_PRIM 3 +#define GS_FORWARD_PRIMID 0 #endif #ifndef PS_FST @@ -42,7 +43,7 @@ #define PS_TALES_OF_ABYSS_HLE 0 #define PS_URBAN_CHAOS_HLE 0 #define PS_INVALID_TEX0 0 -#define PS_SCALE_FACTOR 1 +#define PS_SCALE_FACTOR 1.0 #define PS_HDR 0 #define PS_COLCLIP 0 #define PS_BLEND_A 0 @@ -50,6 +51,7 @@ #define PS_BLEND_C 0 #define PS_BLEND_D 0 #define PS_BLEND_MIX 0 +#define PS_FIXED_ONE_A 0 #define PS_PABE 0 #define PS_DITHER 0 #define PS_ZCLAMP 0 @@ -65,6 +67,7 @@ #endif #define SW_BLEND (PS_BLEND_A || PS_BLEND_B || PS_BLEND_D) +#define SW_BLEND_NEEDS_RT (SW_BLEND && (PS_BLEND_A == 1 || PS_BLEND_B == 1 || PS_BLEND_C == 1 || PS_BLEND_D == 1)) struct VS_INPUT { @@ -100,7 +103,7 @@ struct PS_INPUT #else nointerpolation float4 c : COLOR0; #endif -#if PS_DATE > 10 || PS_DATE == 3 +#if (PS_DATE >= 1 && PS_DATE <= 3) || GS_FORWARD_PRIMID uint primid : SV_PrimitiveID; #endif }; @@ -108,7 +111,7 @@ struct PS_INPUT struct PS_OUTPUT { #if !PS_NO_COLOR -#if PS_DATE > 10 +#if PS_DATE == 1 || PS_DATE == 2 float c : SV_Target; #else float4 c0 : SV_Target0; @@ -671,7 +674,7 @@ float4 ps_color(PS_INPUT input) #if PS_FST == 0 && PS_INVALID_TEX0 == 1 // Re-normalize coordinate from invalid GS to corrected texture size float2 st = (input.t.xy * WH.xy) / (input.t.w * WH.zw); - // no st_int yet + float2 st_int = (input.ti.zw * WH.xy) / (input.t.w * WH.zw); #elif PS_FST == 0 float2 st = input.t.xy / input.t.w; float2 st_int = input.ti.zw / input.t.w; @@ -742,14 +745,14 @@ void ps_color_clamp_wrap(inout float3 C) C = clamp(C, (float3)0.0f, (float3)255.0f); // In 16 bits format, only 5 bits of color are used. It impacts shadows computation of Castlevania - if (PS_DFMT == FMT_16 && (PS_HDR == 1 || PS_BLEND_MIX == 0)) + if (PS_DFMT == FMT_16 && PS_BLEND_MIX == 0) C = (float3)((int3)C & (int3)0xF8); - else if (PS_COLCLIP == 1 && PS_HDR == 0) + else if (PS_COLCLIP == 1 || PS_HDR == 1) C = (float3)((int3)C & (int3)0xFF); } } -void ps_blend(inout float4 Color, float As, float2 pos_xy) +void ps_blend(inout float4 Color, inout float As, float2 pos_xy) { if (SW_BLEND) { @@ -761,9 +764,9 @@ void ps_blend(inout float4 Color, float As, float2 pos_xy) return; } - float4 RT = trunc(RtTexture.Load(int3(pos_xy, 0)) * 255.0f + 0.1f); + float4 RT = SW_BLEND_NEEDS_RT ? trunc(RtTexture.Load(int3(pos_xy, 0)) * 255.0f + 0.1f) : (float4)0.0f; - float Ad = (PS_DFMT == FMT_24) ? 1.0f : RT.a / 128.0f; + float Ad = RT.a / 128.0f; float3 Cd = RT.rgb; float3 Cs = Color.rgb; @@ -774,10 +777,51 @@ void ps_blend(inout float4 Color, float As, float2 pos_xy) float3 D = (PS_BLEND_D == 0) ? Cs : ((PS_BLEND_D == 1) ? Cd : (float3)0.0f); // As/Af clamp alpha for Blend mix - if (PS_BLEND_MIX) - C = min(C, (float)1.0f); + // We shouldn't clamp blend mix with clr1 as we want alpha higher + float C_clamped = C; + if (PS_BLEND_MIX > 0 && PS_CLR_HW != 1) + C_clamped = min(C_clamped, 1.0f); - Color.rgb = (PS_BLEND_A == PS_BLEND_B) ? D : trunc(((A - B) * C) + D); + if (PS_BLEND_A == PS_BLEND_B) + Color.rgb = D; + // In blend_mix, HW adds on some alpha factor * dst. + // Truncating here wouldn't quite get the right result because it prevents the <1 bit here from combining with a <1 bit in dst to form a ≥1 amount that pushes over the truncation. + // Instead, apply an offset to convert HW's round to a floor. + // Since alpha is in 1/128 increments, subtracting (0.5 - 0.5/128 == 127/256) would get us what we want if GPUs blended in full precision. + // But they don't. Details here: https://github.com/PCSX2/pcsx2/pull/6809#issuecomment-1211473399 + // Based on the scripts at the above link, the ideal choice for Intel GPUs is 126/256, AMD 120/256. Nvidia is a lost cause. + // 124/256 seems like a reasonable compromise, providing the correct answer 99.3% of the time on Intel (vs 99.6% for 126/256), and 97% of the time on AMD (vs 97.4% for 120/256). + else if (PS_BLEND_MIX == 2) + Color.rgb = ((A - B) * C_clamped + D) + (124.0f / 256.0f); + else if (PS_BLEND_MIX == 1) + Color.rgb = ((A - B) * C_clamped + D) - (124.0f / 256.0f); + else + Color.rgb = trunc(((A - B) * C) + D); + + if (PS_CLR_HW == 1) + { + // Replace Af with As so we can do proper compensation for Alpha. + if (PS_BLEND_C == 2) + As = Af; + // Subtract 1 for alpha to compensate for the changed equation, + // if c.rgb > 255.0f then we further need to adjust alpha accordingly, + // we pick the lowest overflow from all colors because it's the safest, + // we divide by 255 the color because we don't know Cd value, + // changed alpha should only be done for hw blend. + float min_color = min(min(Color.r, Color.g), Color.b); + float alpha_compensate = max(1.0f, min_color / 255.0f); + As -= alpha_compensate; + } + else if (PS_CLR_HW == 2) + { + // Compensate slightly for Cd*(As + 1) - Cs*As. + // The initial factor we chose is 1 (0.00392) + // as that is the minimum color Cd can be, + // then we multiply by alpha to get the minimum + // blended value it can be. + float color_compensate = 1.0f * (C + 1.0f); + Color.rgb -= (float3)color_compensate; + } } else { @@ -847,11 +891,18 @@ PS_OUTPUT ps_main(PS_INPUT input) } // Must be done before alpha correction + + // AA (Fixed one) will output a coverage of 1.0 as alpha + if (PS_FIXED_ONE_A) + { + C.a = 128.0f; + } + float alpha_blend; if (PS_BLEND_C == 1 && PS_CLR_HW > 3) { float4 RT = trunc(RtTexture.Load(int3(input.p.xy, 0)) * 255.0f + 0.1f); - alpha_blend = (PS_DFMT == FMT_24) ? 1.0f : RT.a / 128.0f; + alpha_blend = RT.a / 128.0f; } else { @@ -879,12 +930,12 @@ PS_OUTPUT ps_main(PS_INPUT input) #endif // Get first primitive that will write a failling alpha value -#if PS_DATE == 11 +#if PS_DATE == 1 // DATM == 0 // Pixel with alpha equal to 1 will failed (128-255) output.c = (C.a > 127.5f) ? float(input.primid) : float(0x7FFFFFFF); -#elif PS_DATE == 12 +#elif PS_DATE == 2 // DATM == 1 // Pixel with alpha equal to 0 will failed (0-127) @@ -903,7 +954,7 @@ PS_OUTPUT ps_main(PS_INPUT input) ps_fbmask(C, input.p.xy); #if !PS_NO_COLOR - output.c0 = C / 255.0f; + output.c0 = PS_HDR ? float4(C.rgb / 65535.0f, C.a / 255.0f) : C / 255.0f; #if !PS_NO_COLOR1 output.c1 = (float4)(alpha_blend); #endif @@ -987,13 +1038,40 @@ VS_OUTPUT vs_main(VS_INPUT input) // Geometry Shader ////////////////////////////////////////////////////////////////////// +#if GS_FORWARD_PRIMID +#define PRIMID_IN , uint primid : SV_PrimitiveID +#define VS2PS(x) vs2ps_impl(x, primid) +PS_INPUT vs2ps_impl(VS_OUTPUT vs, uint primid) +{ + PS_INPUT o; + o.p = vs.p; + o.t = vs.t; + o.ti = vs.ti; + o.c = vs.c; + o.primid = primid; + return o; +} +#else +#define PRIMID_IN +#define VS2PS(x) vs2ps_impl(x) +PS_INPUT vs2ps_impl(VS_OUTPUT vs) +{ + PS_INPUT o; + o.p = vs.p; + o.t = vs.t; + o.ti = vs.ti; + o.c = vs.c; + return o; +} +#endif + #if GS_PRIM == 0 [maxvertexcount(6)] -void gs_main(point VS_OUTPUT input[1], inout TriangleStream stream) +void gs_main(point VS_OUTPUT input[1], inout TriangleStream stream PRIMID_IN) { // Transform a point to a NxN sprite - VS_OUTPUT Point = input[0]; + PS_INPUT Point = VS2PS(input[0]); // Get new position float4 lt_p = input[0].p; @@ -1027,11 +1105,11 @@ void gs_main(point VS_OUTPUT input[1], inout TriangleStream stream) #elif GS_PRIM == 1 [maxvertexcount(6)] -void gs_main(line VS_OUTPUT input[2], inout TriangleStream stream) +void gs_main(line VS_OUTPUT input[2], inout TriangleStream stream PRIMID_IN) { // Transform a line to a thick line-sprite - VS_OUTPUT left = input[0]; - VS_OUTPUT right = input[1]; + PS_INPUT left = VS2PS(input[0]); + PS_INPUT right = VS2PS(input[1]); float2 lt_p = input[0].p.xy; float2 rt_p = input[1].p.xy; @@ -1075,10 +1153,10 @@ void gs_main(line VS_OUTPUT input[2], inout TriangleStream stream) #elif GS_PRIM == 3 [maxvertexcount(4)] -void gs_main(line VS_OUTPUT input[2], inout TriangleStream stream) +void gs_main(line VS_OUTPUT input[2], inout TriangleStream stream PRIMID_IN) { - VS_OUTPUT lt = input[0]; - VS_OUTPUT rb = input[1]; + PS_INPUT lt = VS2PS(input[0]); + PS_INPUT rb = VS2PS(input[1]); // flat depth lt.p.z = rb.p.z; @@ -1089,13 +1167,13 @@ void gs_main(line VS_OUTPUT input[2], inout TriangleStream stream) lt.c = rb.c; // Swap texture and position coordinate - VS_OUTPUT lb = rb; + PS_INPUT lb = rb; lb.p.x = lt.p.x; lb.t.x = lt.t.x; lb.ti.x = lt.ti.x; lb.ti.z = lt.ti.z; - VS_OUTPUT rt = rb; + PS_INPUT rt = rb; rt.p.y = lt.p.y; rt.t.y = lt.t.y; rt.ti.y = lt.ti.y; diff --git a/bin/resources/shaders/opengl/cas.glsl b/bin/resources/shaders/opengl/cas.glsl new file mode 100644 index 0000000000..a11af28e0e --- /dev/null +++ b/bin/resources/shaders/opengl/cas.glsl @@ -0,0 +1,64 @@ +// Based on CAS_Shader.glsl +// Copyright(c) 2019 Advanced Micro Devices, Inc.All rights reserved. +// 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. + +uniform uvec4 const0; +uniform uvec4 const1; +uniform ivec2 srcOffset; + +layout(binding=0) uniform sampler2D imgSrc; +layout(binding=0, rgba8) uniform writeonly image2D imgDst; + +#define A_GPU 1 +#define A_GLSL 1 + +#include "ffx_a.h" + +AF3 CasLoad(ASU2 p) +{ + return texelFetch(imgSrc, srcOffset + ivec2(p), 0).rgb; +} + +// Lets you transform input from the load into a linear color space between 0 and 1. See ffx_cas.h +// In this case, our input is already linear and between 0 and 1 +void CasInput(inout AF1 r, inout AF1 g, inout AF1 b) {} + +#include "ffx_cas.h" + +layout(local_size_x=64) in; +void main() +{ + // Do remapping of local xy in workgroup for a more PS-like swizzle pattern. + AU2 gxy = ARmp8x8(gl_LocalInvocationID.x)+AU2(gl_WorkGroupID.x<<4u,gl_WorkGroupID.y<<4u); + + // Filter. + AF4 c; + CasFilter(c.r, c.g, c.b, gxy, const0, const1, CAS_SHARPEN_ONLY); + imageStore(imgDst, ASU2(gxy), c); + gxy.x += 8u; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, CAS_SHARPEN_ONLY); + imageStore(imgDst, ASU2(gxy), c); + gxy.y += 8u; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, CAS_SHARPEN_ONLY); + imageStore(imgDst, ASU2(gxy), c); + gxy.x -= 8u; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, CAS_SHARPEN_ONLY); + imageStore(imgDst, ASU2(gxy), c); +} diff --git a/bin/resources/shaders/opengl/convert.glsl b/bin/resources/shaders/opengl/convert.glsl index 257bd24dc3..1382324857 100644 --- a/bin/resources/shaders/opengl/convert.glsl +++ b/bin/resources/shaders/opengl/convert.glsl @@ -97,12 +97,35 @@ void ps_convert_float16_rgb5a1() } #endif +float rgba8_to_depth32(vec4 unorm) +{ + uvec4 c = uvec4(unorm * vec4(255.5f)); + return float(c.r | (c.g << 8) | (c.b << 16) | (c.a << 24)) * exp2(-32.0f); +} + +float rgba8_to_depth24(vec4 unorm) +{ + uvec3 c = uvec3(unorm.rgb * vec3(255.5f)); + return float(c.r | (c.g << 8) | (c.b << 16)) * exp2(-32.0f); +} + +float rgba8_to_depth16(vec4 unorm) +{ + uvec2 c = uvec2(unorm.rg * vec2(255.5f)); + return float(c.r | (c.g << 8)) * exp2(-32.0f); +} + +float rgb5a1_to_depth16(vec4 unorm) +{ + uvec4 c = uvec4(unorm * vec4(255.5f)); + return float(((c.r & 0xF8u) >> 3) | ((c.g & 0xF8u) << 2) | ((c.b & 0xF8u) << 7) | ((c.a & 0x80u) << 8)) * exp2(-32.0f); +} + #ifdef ps_convert_rgba8_float32 void ps_convert_rgba8_float32() { - // Convert a RRGBA texture into a float depth texture - uvec4 c = uvec4(sample_c() * vec4(255.0f) + vec4(0.5f)); - gl_FragDepth = float(c.r | (c.g << 8) | (c.b << 16) | (c.a << 24)) * exp2(-32.0f); + // Convert an RGBA texture into a float depth texture + gl_FragDepth = rgba8_to_depth32(sample_c()); } #endif @@ -111,9 +134,8 @@ void ps_convert_rgba8_float24() { // Same as above but without the alpha channel (24 bits Z) - // Convert a RRGBA texture into a float depth texture - uvec3 c = uvec3(sample_c().rgb * vec3(255.0f) + vec3(0.5f)); - gl_FragDepth = float(c.r | (c.g << 8) | (c.b << 16)) * exp2(-32.0f); + // Convert an RGBA texture into a float depth texture + gl_FragDepth = rgba8_to_depth24(sample_c()); } #endif @@ -122,33 +144,70 @@ void ps_convert_rgba8_float16() { // Same as above but without the A/B channels (16 bits Z) - // Convert a RRGBA texture into a float depth texture - uvec2 c = uvec2(sample_c().rg * vec2(255.0f) + vec2(0.5f)); - gl_FragDepth = float(c.r | (c.g << 8)) * exp2(-32.0f); + // Convert an RGBA texture into a float depth texture + gl_FragDepth = rgba8_to_depth16(sample_c()); } #endif #ifdef ps_convert_rgb5a1_float16 void ps_convert_rgb5a1_float16() { - // Convert a RGB5A1 (saved as RGBA8) color to a 16 bit Z - uvec4 c = uvec4(sample_c() * vec4(255.0f) + vec4(0.5f)); - gl_FragDepth = float(((c.r & 0xF8u) >> 3) | ((c.g & 0xF8u) << 2) | ((c.b & 0xF8u) << 7) | ((c.a & 0x80u) << 8)) * exp2(-32.0f); + // Convert an RGB5A1 (saved as RGBA8) color to a 16 bit Z + gl_FragDepth = rgb5a1_to_depth16(sample_c()); +} +#endif + +#define SAMPLE_RGBA_DEPTH_BILN(CONVERT_FN) \ + ivec2 dims = textureSize(TextureSampler, 0); \ + vec2 top_left_f = PSin_t * vec2(dims) - 0.5f; \ + ivec2 top_left = ivec2(floor(top_left_f)); \ + ivec4 coords = clamp(ivec4(top_left, top_left + 1), ivec4(0), dims.xyxy - 1); \ + vec2 mix_vals = fract(top_left_f); \ + float depthTL = CONVERT_FN(texelFetch(TextureSampler, coords.xy, 0)); \ + float depthTR = CONVERT_FN(texelFetch(TextureSampler, coords.zy, 0)); \ + float depthBL = CONVERT_FN(texelFetch(TextureSampler, coords.xw, 0)); \ + float depthBR = CONVERT_FN(texelFetch(TextureSampler, coords.zw, 0)); \ + gl_FragDepth = mix(mix(depthTL, depthTR, mix_vals.x), mix(depthBL, depthBR, mix_vals.x), mix_vals.y); + +#ifdef ps_convert_rgba8_float32_biln +void ps_convert_rgba8_float32_biln() +{ + // Convert an RGBA texture into a float depth texture + SAMPLE_RGBA_DEPTH_BILN(rgba8_to_depth32); +} +#endif + +#ifdef ps_convert_rgba8_float24_biln +void ps_convert_rgba8_float24_biln() +{ + // Same as above but without the alpha channel (24 bits Z) + + // Convert an RGBA texture into a float depth texture + SAMPLE_RGBA_DEPTH_BILN(rgba8_to_depth24); +} +#endif + +#ifdef ps_convert_rgba8_float16_biln +void ps_convert_rgba8_float16_biln() +{ + // Same as above but without the A/B channels (16 bits Z) + + // Convert an RGBA texture into a float depth texture + SAMPLE_RGBA_DEPTH_BILN(rgba8_to_depth16); +} +#endif + +#ifdef ps_convert_rgb5a1_float16_biln +void ps_convert_rgb5a1_float16_biln() +{ + // Convert an RGB5A1 (saved as RGBA8) color to a 16 bit Z + SAMPLE_RGBA_DEPTH_BILN(rgb5a1_to_depth16); } #endif #ifdef ps_convert_rgba_8i void ps_convert_rgba_8i() { - - // Potential speed optimization. There is a high probability that - // game only want to extract a single channel (blue). It will allow - // to remove most of the conditional operation and yield a +2/3 fps - // boost on MGS3 - // - // Hypothesis wrong in Prince of Persia ... Seriously WTF ! - //#define ONLY_BLUE; - // Convert a RGBA texture into a 8 bits packed texture // Input column: 8x2 RGBA pixels // 0: 8 RGBA @@ -158,64 +217,28 @@ void ps_convert_rgba_8i() // 1: 8 R | 8 B // 2: 8 G | 8 A // 3: 8 G | 8 A - float c; + uvec2 pos = uvec2(gl_FragCoord.xy); - uvec2 sel = uvec2(gl_FragCoord.xy) % uvec2(16u, 16u); - ivec2 tb = ((ivec2(gl_FragCoord.xy) & ~ivec2(15, 3)) >> 1); + // Collapse separate R G B A areas into their base pixel + uvec2 block = (pos & ~uvec2(15u, 3u)) >> 1; + uvec2 subblock = pos & uvec2(7u, 1u); + uvec2 coord = block | subblock; - int ty = tb.y | (int(gl_FragCoord.y) & 1); - int txN = tb.x | (int(gl_FragCoord.x) & 7); - int txH = tb.x | ((int(gl_FragCoord.x) + 4) & 7); + // Apply offset to cols 1 and 2 + uint is_col23 = pos.y & 4u; + uint is_col13 = pos.y & 2u; + uint is_col12 = is_col23 ^ (is_col13 << 1); + coord.x ^= is_col12; // If cols 1 or 2, flip bit 3 of x - txN *= PS_SCALE_FACTOR; - txH *= PS_SCALE_FACTOR; - ty *= PS_SCALE_FACTOR; + if (floor(PS_SCALE_FACTOR) != PS_SCALE_FACTOR) + coord = uvec2(vec2(coord) * PS_SCALE_FACTOR); + else + coord *= uvec2(PS_SCALE_FACTOR); - // TODO investigate texture gather - vec4 cN = texelFetch(TextureSampler, ivec2(txN, ty), 0); - vec4 cH = texelFetch(TextureSampler, ivec2(txH, ty), 0); - - - if ((sel.y & 4u) == 0u) { - // Column 0 and 2 -#ifdef ONLY_BLUE - c = cN.b; -#else - if ((sel.y & 3u) < 2u) { - // first 2 lines of the col - if (sel.x < 8u) - c = cN.r; - else - c = cN.b; - } else { - if (sel.x < 8u) - c = cH.g; - else - c = cH.a; - } -#endif - } else { -#ifdef ONLY_BLUE - c = cH.b; -#else - // Column 1 and 3 - if ((sel.y & 3u) < 2u) { - // first 2 lines of the col - if (sel.x < 8u) - c = cH.r; - else - c = cH.b; - } else { - if (sel.x < 8u) - c = cN.g; - else - c = cN.a; - } -#endif - } - - - SV_Target0 = vec4(c); + vec4 pixel = texelFetch(TextureSampler, ivec2(coord), 0); + vec2 sel0 = (pos.y & 2u) == 0u ? pixel.rb : pixel.ga; + float sel1 = (pos.x & 8u) == 0u ? sel0.x : sel0.y; + SV_Target0 = vec4(sel1); } #endif @@ -250,10 +273,19 @@ void ps_datm0() } #endif -#ifdef ps_mod256 -void ps_mod256() +#ifdef ps_hdr_init +void ps_hdr_init() { - SV_Target0 = mod(round(sample_c() * 255.0f), 256.0f) / 255.0f; + vec4 value = sample_c(); + SV_Target0 = vec4(round(value.rgb * 255.0f) / 65535.0f, value.a); +} +#endif + +#ifdef ps_hdr_resolve +void ps_hdr_resolve() +{ + vec4 value = sample_c(); + SV_Target0 = vec4(vec3(uvec3(value.rgb * 65535.0f) & 255u) / 255.0f, value.a); } #endif @@ -310,4 +342,21 @@ void ps_yuv() } #endif +#if defined(ps_stencil_image_init_0) || defined(ps_stencil_image_init_1) + +void main() +{ + SV_Target0 = vec4(0x7FFFFFFF); + + #ifdef ps_stencil_image_init_0 + if((127.5f / 255.0f) < sample_c().a) // < 0x80 pass (== 0x80 should not pass) + SV_Target0 = vec4(-1); + #endif + #ifdef ps_stencil_image_init_1 + if(sample_c().a < (127.5f / 255.0f)) // >= 0x80 pass + SV_Target0 = vec4(-1); + #endif +} +#endif + #endif diff --git a/bin/resources/shaders/opengl/interlace.glsl b/bin/resources/shaders/opengl/interlace.glsl index 46682ff7b7..1aca117952 100644 --- a/bin/resources/shaders/opengl/interlace.glsl +++ b/bin/resources/shaders/opengl/interlace.glsl @@ -6,45 +6,175 @@ in vec4 PSin_p; in vec2 PSin_t; in vec4 PSin_c; -uniform vec2 ZrH; +uniform vec4 ZrH; layout(location = 0) out vec4 SV_Target0; -// TODO ensure that clip (discard) is < 0 and not <= 0 ??? + +// Weave shader void ps_main0() { - if ((int(gl_FragCoord.y) & 1) == 0) - discard; - // I'm not sure it impact us but be safe to lookup texture before conditional if - // see: http://www.opengl.org/wiki/GLSL_Sampler#Non-uniform_flow_control - vec4 c = texture(TextureSampler, PSin_t); + const int idx = int(ZrH.x); // buffer index passed from CPU + const int field = idx & 1; // current field + const int vpos = int(gl_FragCoord.y); // vertical position of destination texture - SV_Target0 = c; + if ((vpos & 1) == field) + SV_Target0 = texture(TextureSampler, PSin_t); + else + discard; } + +// Bob shader void ps_main1() { - if ((int(gl_FragCoord.y) & 1) != 0) - discard; - // I'm not sure it impact us but be safe to lookup texture before conditional if - // see: http://www.opengl.org/wiki/GLSL_Sampler#Non-uniform_flow_control - vec4 c = texture(TextureSampler, PSin_t); - - SV_Target0 = c; + SV_Target0 = texture(TextureSampler, PSin_t); } + +// Blend shader void ps_main2() { - vec4 c0 = texture(TextureSampler, PSin_t - ZrH); - vec4 c1 = texture(TextureSampler, PSin_t); - vec4 c2 = texture(TextureSampler, PSin_t + ZrH); + vec2 vstep = vec2(0.0f, ZrH.y); + vec4 c0 = texture(TextureSampler, PSin_t - vstep); + vec4 c1 = texture(TextureSampler, PSin_t); + vec4 c2 = texture(TextureSampler, PSin_t + vstep); - SV_Target0 = (c0 + c1 * 2.0f + c2) / 4.0f; + SV_Target0 = (c0 + c1 * 2.0f + c2) / 4.0f; } + +// MAD shader - buffering void ps_main3() { - SV_Target0 = texture(TextureSampler, PSin_t); + // We take half the lines from the current frame and stores them in the MAD frame buffer. + // the MAD frame buffer is split in 2 consecutive banks of 2 fields each, the fields in each bank + // are interleaved (top field at even lines and bottom field at odd lines). + // When the source texture has an odd vres, the first line of bank 1 would be an odd index + // causing the wrong lines to be discarded, so a vertical offset (lofs) is added to the vertical + // position of the destination texture to force the proper field alignment + + const int idx = int(ZrH.x); // buffer index passed from CPU + const int bank = idx >> 1; // current bank + const int field = idx & 1; // current field + const int vres = int(ZrH.z) >> 1; // vertical resolution of source texture + const int lofs = ((((vres + 1) >> 1) << 1) - vres) & bank; // line alignment offset for bank 1 + const int vpos = int(gl_FragCoord.y) + lofs; // vertical position of destination texture + const vec2 bofs = vec2(0.0f, 0.5f * bank); // vertical offset of the current bank relative to source texture size + const vec2 vscale = vec2(1.0f, 2.0f); // scaling factor from source to destination texture + const vec2 optr = PSin_t - bofs; // used to check if the current destination line is within the current bank + const vec2 iptr = optr * vscale; // pointer to the current pixel in the source texture + + // if the index of current destination line belongs to the current fiels we update it, otherwise + // we leave the old line in the destination buffer + if ((optr.y >= 0.0f) && (optr.y < 0.5f) && ((vpos & 1) == field)) + SV_Target0 = texture(TextureSampler, iptr); + else + discard; +} + + +// MAD shader - reconstruction +void ps_main4() +{ + // we use the contents of the MAD frame buffer to reconstruct the missing lines from the current field. + + const int idx = int(ZrH.x); // buffer index passed from CPU + const int field = idx & 1; // current field + const int vpos = int(gl_FragCoord.y); // vertical position of destination texture + const float sensitivity = ZrH.w; // passed from CPU, higher values mean more likely to use weave + const vec3 motion_thr = vec3(1.0, 1.0, 1.0) * sensitivity; // + const vec2 bofs = vec2(0.0f, 0.5f); // position of the bank 1 relative to source texture size + const vec2 vscale = vec2(1.0f, 0.5f); // scaling factor from source to destination texture + const vec2 lofs = vec2(0.0f, ZrH.y) * vscale; // distance between two adjacent lines relative to source texture size + const vec2 iptr = PSin_t * vscale; // pointer to the current pixel in the source texture + + vec2 p_t0; // pointer to current pixel (missing or not) from most recent frame + vec2 p_t1; // pointer to current pixel (missing or not) from one frame back + vec2 p_t2; // pointer to current pixel (missing or not) from two frames back + vec2 p_t3; // pointer to current pixel (missing or not) from three frames back + + switch (idx) + { + case 1: + p_t0 = iptr; + p_t1 = iptr; + p_t2 = iptr + bofs; + p_t3 = iptr + bofs; + break; + case 2: + p_t0 = iptr + bofs; + p_t1 = iptr; + p_t2 = iptr; + p_t3 = iptr + bofs; + break; + case 3: + p_t0 = iptr + bofs; + p_t1 = iptr + bofs; + p_t2 = iptr; + p_t3 = iptr; + break; + default: + p_t0 = iptr; + p_t1 = iptr + bofs; + p_t2 = iptr + bofs; + p_t3 = iptr; + break; + } + + + // calculating motion, only relevant for missing lines where the "center line" is pointed + // by p_t1 + + vec4 hn = texture(TextureSampler, p_t0 - lofs); // new high pixel + vec4 cn = texture(TextureSampler, p_t1); // new center pixel + vec4 ln = texture(TextureSampler, p_t0 + lofs); // new low pixel + + vec4 ho = texture(TextureSampler, p_t2 - lofs); // old high pixel + vec4 co = texture(TextureSampler, p_t3); // old center pixel + vec4 lo = texture(TextureSampler, p_t2 + lofs); // old low pixel + + vec3 mh = hn.rgb - ho.rgb; // high pixel motion + vec3 mc = cn.rgb - co.rgb; // center pixel motion + vec3 ml = ln.rgb - lo.rgb; // low pixel motion + + mh = max(mh, -mh) - motion_thr; + mc = max(mc, -mc) - motion_thr; + ml = max(ml, -ml) - motion_thr; + + #if 1 // use this code to evaluate each color motion separately + float mh_max = max(max(mh.x, mh.y), mh.z); + float mc_max = max(max(mc.x, mc.y), mc.z); + float ml_max = max(max(ml.x, ml.y), ml.z); + #else // use this code to evaluate average color motion + float mh_max = mh.x + mh.y + mh.z; + float mc_max = mc.x + mc.y + mc.z; + float ml_max = ml.x + ml.y + ml.z; + #endif + + + // selecting deinterlacing output + + if ((vpos & 1) == field) + { + // output coordinate present on current field + SV_Target0 = texture(TextureSampler, p_t0); + } + else if ((iptr.y > 0.5f - lofs.y) || (iptr.y < 0.0 + lofs.y)) + { + // top and bottom lines are always weaved + SV_Target0 = cn; + } + else + { + // missing line needs to be reconstructed + if(((mh_max > 0.0f) || (ml_max > 0.0f)) || (mc_max > 0.0f)) + // high motion -> interpolate pixels above and below + SV_Target0 = (hn + ln) / 2.0f; + else + // low motion -> weave + SV_Target0 = cn; + } } #endif diff --git a/bin/resources/shaders/opengl/tfx_fs.glsl b/bin/resources/shaders/opengl/tfx_fs.glsl index 7d88226c91..3d0eb7806d 100644 --- a/bin/resources/shaders/opengl/tfx_fs.glsl +++ b/bin/resources/shaders/opengl/tfx_fs.glsl @@ -21,6 +21,10 @@ #define SW_BLEND (PS_BLEND_A || PS_BLEND_B || PS_BLEND_D) #define SW_BLEND_NEEDS_RT (SW_BLEND && (PS_BLEND_A == 1 || PS_BLEND_B == 1 || PS_BLEND_C == 1 || PS_BLEND_D == 1)) +#define SW_AD_TO_HW (PS_BLEND_C == 1 && PS_CLR_HW > 3) +#define PS_PRIMID_INIT (PS_DATE == 1 || PS_DATE == 2) +#define NEEDS_RT_EARLY (PS_TEX_IS_FB == 1 || PS_DATE >= 5) +#define NEEDS_RT (NEEDS_RT_EARLY || (!PS_PRIMID_INIT && (PS_FBMASK || SW_BLEND_NEEDS_RT || SW_AD_TO_HW))) #ifdef FRAGMENT_SHADER @@ -42,7 +46,7 @@ in SHADER #define TARGET_0_QUALIFIER out // Only enable framebuffer fetch when we actually need it. -#if HAS_FRAMEBUFFER_FETCH && (PS_TEX_IS_FB == 1 || PS_FBMASK || SW_BLEND_NEEDS_RT || PS_DATE != 0) +#if HAS_FRAMEBUFFER_FETCH && NEEDS_RT // We need to force the colour to be defined here, to read from it. // Basically the only scenario where this'll happen is RGBA masked and DATE is active. #undef PS_NO_COLOR @@ -66,49 +70,32 @@ in SHADER layout(binding = 1) uniform sampler2D PaletteSampler; -#if !HAS_FRAMEBUFFER_FETCH +#if !HAS_FRAMEBUFFER_FETCH && NEEDS_RT layout(binding = 2) uniform sampler2D RtSampler; // note 2 already use by the image below #endif -#ifndef DISABLE_GL42_image -#if PS_DATE > 0 -// Performance note: images mustn't be declared if they are unused. Otherwise it will -// require extra shader validation. - -// FIXME how to declare memory access -layout(r32i, binding = 3) uniform iimage2D img_prim_min; -// WARNING: -// You can't enable it if you discard the fragment. The depth is still -// updated (shadow in Shin Megami Tensei Nocturne) -// -// early_fragment_tests must still be enabled in the first pass of the 2 passes algo -// First pass search the first primitive that will write the bad alpha value. Value -// won't be written if the fragment fails the depth test. -// -// In theory the best solution will be do -// 1/ copy the depth buffer -// 2/ do the full depth (current depth writes are disabled) -// 3/ restore the depth buffer for 2nd pass -// Of course, it is likely too costly. -#if PS_DATE == 1 || PS_DATE == 2 -layout(early_fragment_tests) in; -#endif +#if PS_DATE == 3 +layout(binding = 3) uniform sampler2D img_prim_min; // I don't remember why I set this parameter but it is surely useless //layout(pixel_center_integer) in vec4 gl_FragCoord; #endif -#else -// use basic stencil -#endif -vec4 sample_c(vec2 uv) +vec4 fetch_rt() { -#if PS_TEX_IS_FB == 1 -#if HAS_FRAMEBUFFER_FETCH +#if !NEEDS_RT + return vec4(0.0); +#elif HAS_FRAMEBUFFER_FETCH return LAST_FRAG_COLOR; #else return texelFetch(RtSampler, ivec2(gl_FragCoord.xy), 0); #endif +} + +vec4 sample_c(vec2 uv) +{ +#if PS_TEX_IS_FB == 1 + return fetch_rt(); #else #if PS_POINT_SAMPLER @@ -263,11 +250,7 @@ mat4 sample_4p(vec4 u) int fetch_raw_depth() { #if PS_TEX_IS_FB == 1 -#if HAS_FRAMEBUFFER_FETCH - return int(LAST_FRAG_COLOR.r * exp2(32.0f)); -#else - return int(texelFetch(RtSampler, ivec2(gl_FragCoord.xy), 0).r * exp2(32.0f)); -#endif + return int(fetch_rt().r * exp2(32.0f)); #else return int(texelFetch(TextureSampler, ivec2(gl_FragCoord.xy), 0).r * exp2(32.0f)); #endif @@ -276,11 +259,7 @@ int fetch_raw_depth() vec4 fetch_raw_color() { #if PS_TEX_IS_FB == 1 -#if HAS_FRAMEBUFFER_FETCH - return LAST_FRAG_COLOR; -#else - return texelFetch(RtSampler, ivec2(gl_FragCoord.xy), 0); -#endif + return fetch_rt(); #else return texelFetch(TextureSampler, ivec2(gl_FragCoord.xy), 0); #endif @@ -598,7 +577,7 @@ vec4 ps_color() #if (PS_FST == 0) && (PS_INVALID_TEX0 == 1) // Re-normalize coordinate from invalid GS to corrected texture size vec2 st = (PSin.t_float.xy * WH.xy) / (vec2(PSin.t_float.w) * WH.zw); - // no st_int yet + vec2 st_int = (PSin.t_int.zw * WH.xy) / (vec2(PSin.t_float.w) * WH.zw); #elif (PS_FST == 0) vec2 st = PSin.t_float.xy / vec2(PSin.t_float.w); vec2 st_int = PSin.t_int.zw / vec2(PSin.t_float.w); @@ -640,11 +619,7 @@ void ps_fbmask(inout vec4 C) { // FIXME do I need special case for 16 bits #if PS_FBMASK -#if HAS_FRAMEBUFFER_FETCH - vec4 RT = trunc(LAST_FRAG_COLOR * 255.0f + 0.1f); -#else - vec4 RT = trunc(texelFetch(RtSampler, ivec2(gl_FragCoord.xy), 0) * 255.0f + 0.1f); -#endif + vec4 RT = trunc(fetch_rt() * 255.0f + 0.1f); C = vec4((uvec4(C) & ~FbMask) | (uvec4(RT) & FbMask)); #endif } @@ -679,17 +654,17 @@ void ps_color_clamp_wrap(inout vec3 C) // Warning: normally blending equation is mult(A, B) = A * B >> 7. GPU have the full accuracy // GS: Color = 1, Alpha = 255 => output 1 // GPU: Color = 1/255, Alpha = 255/255 * 255/128 => output 1.9921875 -#if PS_DFMT == FMT_16 && (PS_HDR == 1 || PS_BLEND_MIX == 0) +#if PS_DFMT == FMT_16 && PS_BLEND_MIX == 0 // In 16 bits format, only 5 bits of colors are used. It impacts shadows computation of Castlevania C = vec3(ivec3(C) & ivec3(0xF8)); -#elif PS_COLCLIP == 1 && PS_HDR == 0 +#elif PS_COLCLIP == 1 || PS_HDR == 1 C = vec3(ivec3(C) & ivec3(0xFF)); #endif #endif } -void ps_blend(inout vec4 Color, float As) +void ps_blend(inout vec4 Color, inout float As) { #if SW_BLEND @@ -703,19 +678,10 @@ void ps_blend(inout vec4 Color, float As) vec3 Cs = Color.rgb; #if SW_BLEND_NEEDS_RT -#if HAS_FRAMEBUFFER_FETCH - vec4 RT = trunc(LAST_FRAG_COLOR * 255.0f + 0.1f); -#else - vec4 RT = trunc(texelFetch(RtSampler, ivec2(gl_FragCoord.xy), 0) * 255.0f + 0.1f); -#endif - -#if PS_DFMT == FMT_24 - float Ad = 1.0f; -#else + vec4 RT = trunc(fetch_rt() * 255.0f + 0.1f); // FIXME FMT_16 case // FIXME Ad or Ad * 2? float Ad = RT.a / 128.0f; -#endif // Let the compiler do its jobs ! vec3 Cd = RT.rgb; @@ -754,16 +720,52 @@ void ps_blend(inout vec4 Color, float As) #endif // As/Af clamp alpha for Blend mix -#if PS_BLEND_MIX - C = min(C, float(1.0f)); + // We shouldn't clamp blend mix with clr1 as we want alpha higher + float C_clamped = C; +#if PS_BLEND_MIX > 0 && PS_CLR_HW != 1 + C_clamped = min(C_clamped, 1.0f); #endif #if PS_BLEND_A == PS_BLEND_B Color.rgb = D; +// In blend_mix, HW adds on some alpha factor * dst. +// Truncating here wouldn't quite get the right result because it prevents the <1 bit here from combining with a <1 bit in dst to form a ≥1 amount that pushes over the truncation. +// Instead, apply an offset to convert HW's round to a floor. +// Since alpha is in 1/128 increments, subtracting (0.5 - 0.5/128 == 127/256) would get us what we want if GPUs blended in full precision. +// But they don't. Details here: https://github.com/PCSX2/pcsx2/pull/6809#issuecomment-1211473399 +// Based on the scripts at the above link, the ideal choice for Intel GPUs is 126/256, AMD 120/256. Nvidia is a lost cause. +// 124/256 seems like a reasonable compromise, providing the correct answer 99.3% of the time on Intel (vs 99.6% for 126/256), and 97% of the time on AMD (vs 97.4% for 120/256). +#elif PS_BLEND_MIX == 2 + Color.rgb = ((A - B) * C_clamped + D) + (124.0f/256.0f); +#elif PS_BLEND_MIX == 1 + Color.rgb = ((A - B) * C_clamped + D) - (124.0f/256.0f); #else Color.rgb = trunc((A - B) * C + D); #endif +#if PS_CLR_HW == 1 + // Replace Af with As so we can do proper compensation for Alpha. +#if PS_BLEND_C == 2 + As = Af; +#endif + // Subtract 1 for alpha to compensate for the changed equation, + // if c.rgb > 255.0f then we further need to adjust alpha accordingly, + // we pick the lowest overflow from all colors because it's the safest, + // we divide by 255 the color because we don't know Cd value, + // changed alpha should only be done for hw blend. + float min_color = min(min(Color.r, Color.g), Color.b); + float alpha_compensate = max(1.0f, min_color / 255.0f); + As -= alpha_compensate; +#elif PS_CLR_HW == 2 + // Compensate slightly for Cd*(As + 1) - Cs*As. + // The initial factor we chose is 1 (0.00392) + // as that is the minimum color Cd can be, + // then we multiply by alpha to get the minimum + // blended value it can be. + float color_compensate = 1.0f * (C + 1.0f); + Color.rgb -= vec3(color_compensate); +#endif + #else // Needed for Cd * (As/Ad/F + 1) blending modes #if PS_CLR_HW == 1 || PS_CLR_HW == 5 @@ -797,22 +799,13 @@ void ps_main() discard; #endif -#if PS_DATE != 0 -#if ((PS_DATE & 3) == 1 || (PS_DATE & 3) == 2) +#if PS_DATE >= 5 #if PS_WRITE_RG == 1 // Pseudo 16 bits access. -#if HAS_FRAMEBUFFER_FETCH - float rt_a = LAST_FRAG_COLOR.g; + float rt_a = fetch_rt().g; #else - float rt_a = texelFetch(RtSampler, ivec2(gl_FragCoord.xy), 0).g; -#endif -#else -#if HAS_FRAMEBUFFER_FETCH - float rt_a = LAST_FRAG_COLOR.a; -#else - float rt_a = texelFetch(RtSampler, ivec2(gl_FragCoord.xy), 0).a; -#endif + float rt_a = fetch_rt().a; #endif #if (PS_DATE & 3) == 1 @@ -824,25 +817,19 @@ void ps_main() #endif if (bad) { -#if PS_DATE >= 5 || defined(DISABLE_GL42_image) discard; -#else - imageStore(img_prim_min, ivec2(gl_FragCoord.xy), ivec4(-1)); - return; -#endif } #endif -#if PS_DATE == 3 && !defined(DISABLE_GL42_image) - int stencil_ceil = imageLoad(img_prim_min, ivec2(gl_FragCoord.xy)).r; +#if PS_DATE == 3 + int stencil_ceil = int(texelFetch(img_prim_min, ivec2(gl_FragCoord.xy), 0).r); // Note gl_PrimitiveID == stencil_ceil will be the primitive that will update // the bad alpha value so we must keep it. if (gl_PrimitiveID > stencil_ceil) { discard; } -#endif #endif vec4 C = ps_color(); @@ -903,13 +890,15 @@ void ps_main() #endif // Must be done before alpha correction -#if (PS_BLEND_C == 1 && PS_CLR_HW > 3) -#if HAS_FRAMEBUFFER_FETCH - vec4 RT = trunc(LAST_FRAG_COLOR * 255.0f + 0.1f); -#else - vec4 RT = trunc(texelFetch(RtSampler, ivec2(gl_FragCoord.xy), 0) * 255.0f + 0.1f); + + // AA (Fixed one) will output a coverage of 1.0 as alpha +#if PS_FIXED_ONE_A + C.a = 128.0f; #endif - float alpha_blend = (PS_DFMT == FMT_24) ? 1.0f : RT.a / 128.0f; + +#if SW_AD_TO_HW + vec4 RT = trunc(fetch_rt() * 255.0f + 0.1f); + float alpha_blend = RT.a / 128.0f; #else float alpha_blend = C.a / 128.0f; #endif @@ -923,19 +912,15 @@ void ps_main() #endif // Get first primitive that will write a failling alpha value -#if PS_DATE == 1 && !defined(DISABLE_GL42_image) +#if PS_DATE == 1 // DATM == 0 // Pixel with alpha equal to 1 will failed (128-255) - if (C.a > 127.5f) { - imageAtomicMin(img_prim_min, ivec2(gl_FragCoord.xy), gl_PrimitiveID); - } + SV_Target0 = (C.a > 127.5f) ? vec4(gl_PrimitiveID) : vec4(0x7FFFFFFF); return; -#elif PS_DATE == 2 && !defined(DISABLE_GL42_image) +#elif PS_DATE == 2 // DATM == 1 // Pixel with alpha equal to 0 will failed (0-127) - if (C.a < 127.5f) { - imageAtomicMin(img_prim_min, ivec2(gl_FragCoord.xy), gl_PrimitiveID); - } + SV_Target0 = (C.a < 127.5f) ? vec4(gl_PrimitiveID) : vec4(0x7FFFFFFF); return; #endif @@ -949,7 +934,11 @@ void ps_main() ps_fbmask(C); #if !PS_NO_COLOR +#if PS_HDR == 1 + SV_Target0 = vec4(C.rgb / 65535.0f, C.a / 255.0f); +#else SV_Target0 = C / 255.0f; +#endif #if !defined(DISABLE_DUAL_SOURCE) && !PS_NO_COLOR1 SV_Target1 = vec4(alpha_blend); #endif @@ -966,7 +955,7 @@ void ps_main() #if PS_ZCLAMP gl_FragDepth = min(gl_FragCoord.z, MaxDepthPS); -#endif +#endif } #endif diff --git a/bin/resources/shaders/vulkan/cas.glsl b/bin/resources/shaders/vulkan/cas.glsl new file mode 100644 index 0000000000..4099852998 --- /dev/null +++ b/bin/resources/shaders/vulkan/cas.glsl @@ -0,0 +1,71 @@ +#version 460 core +#extension GL_EXT_samplerless_texture_functions : require + +// Based on CAS_Shader.glsl +// Copyright(c) 2019 Advanced Micro Devices, Inc.All rights reserved. +// 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. + +layout(push_constant) uniform const_buffer +{ + uvec4 const0; + uvec4 const1; + ivec2 srcOffset; +}; + +layout(set=0, binding=0) uniform texture2D imgSrc; +layout(set=0, binding=1, rgba8) uniform writeonly image2D imgDst; +layout(constant_id=0) const int sharpenOnly = 0; + +#define A_GPU 1 +#define A_GLSL 1 + +#include "ffx_a.h" + +AF3 CasLoad(ASU2 p) +{ + return texelFetch(imgSrc, srcOffset + ivec2(p), 0).rgb; +} + +// Lets you transform input from the load into a linear color space between 0 and 1. See ffx_cas.h +// In this case, our input is already linear and between 0 and 1 +void CasInput(inout AF1 r, inout AF1 g, inout AF1 b) {} + +#include "ffx_cas.h" + +layout(local_size_x=64) in; +void main() +{ + // Do remapping of local xy in workgroup for a more PS-like swizzle pattern. + AU2 gxy = ARmp8x8(gl_LocalInvocationID.x)+AU2(gl_WorkGroupID.x<<4u,gl_WorkGroupID.y<<4u); + + // Filter. + AF4 c; + CasFilter(c.r, c.g, c.b, gxy, const0, const1, sharpenOnly != 0); + imageStore(imgDst, ASU2(gxy), c); + gxy.x += 8u; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, sharpenOnly != 0); + imageStore(imgDst, ASU2(gxy), c); + gxy.y += 8u; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, sharpenOnly != 0); + imageStore(imgDst, ASU2(gxy), c); + gxy.x -= 8u; + + CasFilter(c.r, c.g, c.b, gxy, const0, const1, sharpenOnly != 0); + imageStore(imgDst, ASU2(gxy), c); +} diff --git a/bin/resources/shaders/vulkan/convert.glsl b/bin/resources/shaders/vulkan/convert.glsl index 96903b59cb..0201ace709 100644 --- a/bin/resources/shaders/vulkan/convert.glsl +++ b/bin/resources/shaders/vulkan/convert.glsl @@ -1,5 +1,5 @@ #ifndef PS_SCALE_FACTOR -#define PS_SCALE_FACTOR 1 +#define PS_SCALE_FACTOR 1.0 #endif #ifdef VERTEX_SHADER @@ -52,7 +52,7 @@ void ps_depth_copy() void ps_filter_transparency() { vec4 c = sample_c(v_tex); - + c.a = dot(c.rgb, vec3(0.299, 0.587, 0.114)); o_col0 = c; @@ -90,15 +90,19 @@ void ps_datm0() } #endif -#ifdef ps_mod256 -void ps_mod256() +#ifdef ps_hdr_init +void ps_hdr_init() { - vec4 c = roundEven(sample_c(v_tex) * 255); - // We use 2 fmod to avoid negative value. - vec4 fmod1 = mod(c, 256) + 256; - vec4 fmod2 = mod(fmod1, 256); + vec4 value = sample_c(v_tex); + o_col0 = vec4(roundEven(value.rgb * 255.0f) / 65535.0f, value.a); +} +#endif - o_col0 = fmod2 / 255.0f; +#ifdef ps_hdr_resolve +void ps_hdr_resolve() +{ + vec4 value = sample_c(v_tex); + o_col0 = vec4(vec3(uvec3(value.rgb * 65535.5f) & 255u) / 255.0f, value.a); } #endif @@ -128,12 +132,35 @@ void ps_convert_float16_rgb5a1() } #endif +float rgba8_to_depth32(vec4 unorm) +{ + uvec4 c = uvec4(unorm * vec4(255.5f)); + return float(c.r | (c.g << 8) | (c.b << 16) | (c.a << 24)) * exp2(-32.0f); +} + +float rgba8_to_depth24(vec4 unorm) +{ + uvec3 c = uvec3(unorm.rgb * vec3(255.5f)); + return float(c.r | (c.g << 8) | (c.b << 16)) * exp2(-32.0f); +} + +float rgba8_to_depth16(vec4 unorm) +{ + uvec2 c = uvec2(unorm.rg * vec2(255.5f)); + return float(c.r | (c.g << 8)) * exp2(-32.0f); +} + +float rgb5a1_to_depth16(vec4 unorm) +{ + uvec4 c = uvec4(unorm * vec4(255.5f)); + return float(((c.r & 0xF8u) >> 3) | ((c.g & 0xF8u) << 2) | ((c.b & 0xF8u) << 7) | ((c.a & 0x80u) << 8)) * exp2(-32.0f); +} + #ifdef ps_convert_rgba8_float32 void ps_convert_rgba8_float32() { - // Convert a RRGBA texture into a float depth texture - uvec4 c = uvec4(sample_c(v_tex) * vec4(255.0f) + vec4(0.5f)); - gl_FragDepth = float(c.r | (c.g << 8) | (c.b << 16) | (c.a << 24)) * exp2(-32.0f); + // Convert an RGBA texture into a float depth texture + gl_FragDepth = rgba8_to_depth32(sample_c(v_tex)); } #endif @@ -142,9 +169,8 @@ void ps_convert_rgba8_float24() { // Same as above but without the alpha channel (24 bits Z) - // Convert a RRGBA texture into a float depth texture - uvec3 c = uvec3(sample_c(v_tex).rgb * vec3(255.0f) + vec3(0.5f)); - gl_FragDepth = float(c.r | (c.g << 8) | (c.b << 16)) * exp2(-32.0f); + // Convert an RGBA texture into a float depth texture + gl_FragDepth = rgba8_to_depth24(sample_c(v_tex)); } #endif @@ -153,32 +179,70 @@ void ps_convert_rgba8_float16() { // Same as above but without the A/B channels (16 bits Z) - // Convert a RRGBA texture into a float depth texture - uvec2 c = uvec2(sample_c(v_tex).rg * vec2(255.0f) + vec2(0.5f)); - gl_FragDepth = float(c.r | (c.g << 8)) * exp2(-32.0f); + // Convert an RGBA texture into a float depth texture + gl_FragDepth = rgba8_to_depth16(sample_c(v_tex)); } #endif #ifdef ps_convert_rgb5a1_float16 void ps_convert_rgb5a1_float16() { - // Convert a RGB5A1 (saved as RGBA8) color to a 16 bit Z - uvec4 c = uvec4(sample_c(v_tex) * vec4(255.0f) + vec4(0.5f)); - gl_FragDepth = float(((c.r & 0xF8u) >> 3) | ((c.g & 0xF8u) << 2) | ((c.b & 0xF8u) << 7) | ((c.a & 0x80u) << 8)) * exp2(-32.0f); + // Convert an RGB5A1 (saved as RGBA8) color to a 16 bit Z + gl_FragDepth = rgb5a1_to_depth16(sample_c(v_tex)); +} +#endif + +#define SAMPLE_RGBA_DEPTH_BILN(CONVERT_FN) \ + ivec2 dims = textureSize(samp0, 0); \ + vec2 top_left_f = v_tex * vec2(dims) - 0.5f; \ + ivec2 top_left = ivec2(floor(top_left_f)); \ + ivec4 coords = clamp(ivec4(top_left, top_left + 1), ivec4(0), dims.xyxy - 1); \ + vec2 mix_vals = fract(top_left_f); \ + float depthTL = CONVERT_FN(texelFetch(samp0, coords.xy, 0)); \ + float depthTR = CONVERT_FN(texelFetch(samp0, coords.zy, 0)); \ + float depthBL = CONVERT_FN(texelFetch(samp0, coords.xw, 0)); \ + float depthBR = CONVERT_FN(texelFetch(samp0, coords.zw, 0)); \ + gl_FragDepth = mix(mix(depthTL, depthTR, mix_vals.x), mix(depthBL, depthBR, mix_vals.x), mix_vals.y); + +#ifdef ps_convert_rgba8_float32_biln +void ps_convert_rgba8_float32_biln() +{ + // Convert an RGBA texture into a float depth texture + SAMPLE_RGBA_DEPTH_BILN(rgba8_to_depth32); +} +#endif + +#ifdef ps_convert_rgba8_float24_biln +void ps_convert_rgba8_float24_biln() +{ + // Same as above but without the alpha channel (24 bits Z) + + // Convert an RGBA texture into a float depth texture + SAMPLE_RGBA_DEPTH_BILN(rgba8_to_depth24); +} +#endif + +#ifdef ps_convert_rgba8_float16_biln +void ps_convert_rgba8_float16_biln() +{ + // Same as above but without the A/B channels (16 bits Z) + + // Convert an RGBA texture into a float depth texture + SAMPLE_RGBA_DEPTH_BILN(rgba8_to_depth16); +} +#endif + +#ifdef ps_convert_rgb5a1_float16_biln +void ps_convert_rgb5a1_float16_biln() +{ + // Convert an RGB5A1 (saved as RGBA8) color to a 16 bit Z + SAMPLE_RGBA_DEPTH_BILN(rgb5a1_to_depth16); } #endif #ifdef ps_convert_rgba_8i void ps_convert_rgba_8i() { - // Potential speed optimization. There is a high probability that - // game only want to extract a single channel (blue). It will allow - // to remove most of the conditional operation and yield a +2/3 fps - // boost on MGS3 - // - // Hypothesis wrong in Prince of Persia ... Seriously WTF ! - //#define ONLY_BLUE; - // Convert a RGBA texture into a 8 bits packed texture // Input column: 8x2 RGBA pixels // 0: 8 RGBA @@ -188,72 +252,28 @@ void ps_convert_rgba_8i() // 1: 8 R | 8 B // 2: 8 G | 8 A // 3: 8 G | 8 A - float c; + uvec2 pos = uvec2(gl_FragCoord.xy); - uvec2 sel = uvec2(gl_FragCoord.xy) % uvec2(16u, 16u); - ivec2 tb = ((ivec2(gl_FragCoord.xy) & ~ivec2(15, 3)) >> 1); + // Collapse separate R G B A areas into their base pixel + uvec2 block = (pos & ~uvec2(15u, 3u)) >> 1; + uvec2 subblock = pos & uvec2(7u, 1u); + uvec2 coord = block | subblock; - int ty = tb.y | (int(gl_FragCoord.y) & 1); - int txN = tb.x | (int(gl_FragCoord.x) & 7); - int txH = tb.x | ((int(gl_FragCoord.x) + 4) & 7); + // Apply offset to cols 1 and 2 + uint is_col23 = pos.y & 4u; + uint is_col13 = pos.y & 2u; + uint is_col12 = is_col23 ^ (is_col13 << 1); + coord.x ^= is_col12; // If cols 1 or 2, flip bit 3 of x - txN *= PS_SCALE_FACTOR; - txH *= PS_SCALE_FACTOR; - ty *= PS_SCALE_FACTOR; + if (floor(PS_SCALE_FACTOR) != PS_SCALE_FACTOR) + coord = uvec2(vec2(coord) * PS_SCALE_FACTOR); + else + coord *= uvec2(PS_SCALE_FACTOR); - // TODO investigate texture gather - vec4 cN = texelFetch(samp0, ivec2(txN, ty), 0); - vec4 cH = texelFetch(samp0, ivec2(txH, ty), 0); - - - if ((sel.y & 4u) == 0u) - { -#ifdef ONLY_BLUE - c = cN.b; -#else - // Column 0 and 2 - if ((sel.y & 3u) < 2u) - { - // First 2 lines of the col - if (sel.x < 8u) - c = cN.r; - else - c = cN.b; - } - else - { - if (sel.x < 8u) - c = cH.g; - else - c = cH.a; - } -#endif - } - else - { -#ifdef ONLY_BLUE - c = cH.b; -#else - // Column 1 and 3 - if ((sel.y & 3u) < 2u) - { - // First 2 lines of the col - if (sel.x < 8u) - c = cH.r; - else - c = cH.b; - } - else - { - if (sel.x < 8u) - c = cN.g; - else - c = cN.a; - } -#endif - } - - o_col0 = vec4(c); // Divide by something here? + vec4 pixel = texelFetch(samp0, ivec2(coord), 0); + vec2 sel0 = (pos.y & 2u) == 0u ? pixel.rb : pixel.ga; + float sel1 = (pos.x & 8u) == 0u ? sel0.x : sel0.y; + o_col0 = vec4(sel1); // Divide by something here? } #endif @@ -266,21 +286,21 @@ layout(push_constant) uniform cb10 void ps_yuv() { - vec4 i = sample_c(v_tex); - vec4 o; + vec4 i = sample_c(v_tex); + vec4 o; - mat3 rgb2yuv; - rgb2yuv[0] = vec3(0.587, -0.311, -0.419); - rgb2yuv[1] = vec3(0.114, 0.500, -0.081); - rgb2yuv[2] = vec3(0.299, -0.169, 0.500); + mat3 rgb2yuv; + rgb2yuv[0] = vec3(0.587, -0.311, -0.419); + rgb2yuv[1] = vec3(0.114, 0.500, -0.081); + rgb2yuv[2] = vec3(0.299, -0.169, 0.500); - vec3 yuv = rgb2yuv * i.gbr; + vec3 yuv = rgb2yuv * i.gbr; - float Y = float(0xDB)/255.0f * yuv.x + float(0x10)/255.0f; - float Cr = float(0xE0)/255.0f * yuv.y + float(0x80)/255.0f; - float Cb = float(0xE0)/255.0f * yuv.z + float(0x80)/255.0f; + float Y = float(0xDB)/255.0f * yuv.x + float(0x10)/255.0f; + float Cr = float(0xE0)/255.0f * yuv.y + float(0x80)/255.0f; + float Cb = float(0xE0)/255.0f * yuv.z + float(0x80)/255.0f; - switch(EMODA) { + switch(EMODA) { case 0: o.a = i.a; break; @@ -293,22 +313,22 @@ void ps_yuv() case 3: o.a = 0.0f; break; - } + } - switch(EMODC) { - case 0: - o.rgb = i.rgb; - break; - case 1: - o.rgb = vec3(Y); - break; - case 2: - o.rgb = vec3(Y, Cb, Cr); - break; - case 3: - o.rgb = vec3(i.a); - break; - } + switch(EMODC) { + case 0: + o.rgb = i.rgb; + break; + case 1: + o.rgb = vec3(Y); + break; + case 2: + o.rgb = vec3(Y, Cb, Cr); + break; + case 3: + o.rgb = vec3(i.a); + break; + } o_col0 = o; } @@ -319,7 +339,7 @@ void ps_yuv() void main() { o_col0 = vec4(0x7FFFFFFF); - + #ifdef ps_stencil_image_init_0 if((127.5f / 255.0f) < sample_c(v_tex).a) // < 0x80 pass (== 0x80 should not pass) o_col0 = vec4(-1); @@ -331,4 +351,4 @@ void main() } #endif -#endif \ No newline at end of file +#endif diff --git a/bin/resources/shaders/vulkan/interlace.glsl b/bin/resources/shaders/vulkan/interlace.glsl index 1f024eb24f..cee958d4c4 100644 --- a/bin/resources/shaders/vulkan/interlace.glsl +++ b/bin/resources/shaders/vulkan/interlace.glsl @@ -20,44 +20,184 @@ layout(location = 0) out vec4 o_col0; layout(push_constant) uniform cb0 { - vec2 ZrH; + vec4 ZrH; }; layout(set = 0, binding = 0) uniform sampler2D samp0; + +// Weave shader #ifdef ps_main0 void ps_main0() { - o_col0 = texture(samp0, v_tex); - if ((int(gl_FragCoord.y) & 1) == 0) + const int idx = int(ZrH.x); // buffer index passed from CPU + const int field = idx & 1; // current field + const int vpos = int(gl_FragCoord.y); // vertical position of destination texture + + if ((vpos & 1) == field) + o_col0 = texture(samp0, v_tex); + else discard; } #endif + +// Bob shader #ifdef ps_main1 void ps_main1() { o_col0 = texture(samp0, v_tex); - if ((int(gl_FragCoord.y) & 1) != 0) - discard; } #endif + +// Blend shader #ifdef ps_main2 void ps_main2() { - vec4 c0 = texture(samp0, v_tex - ZrH); + vec2 vstep = vec2(0.0f, ZrH.y); + vec4 c0 = texture(samp0, v_tex - vstep); vec4 c1 = texture(samp0, v_tex); - vec4 c2 = texture(samp0, v_tex + ZrH); + vec4 c2 = texture(samp0, v_tex + vstep); o_col0 = (c0 + c1 * 2.0f + c2) / 4.0f; } #endif + +// MAD shader - buffering #ifdef ps_main3 void ps_main3() { - o_col0 = texture(samp0, v_tex); + // We take half the lines from the current frame and stores them in the MAD frame buffer. + // the MAD frame buffer is split in 2 consecutive banks of 2 fields each, the fields in each bank + // are interleaved (top field at even lines and bottom field at odd lines). + // When the source texture has an odd vres, the first line of bank 1 would be an odd index + // causing the wrong lines to be discarded, so a vertical offset (lofs) is added to the vertical + // position of the destination texture to force the proper field alignment + + const int idx = int(ZrH.x); // buffer index passed from CPU + const int bank = idx >> 1; // current bank + const int field = idx & 1; // current field + const int vres = int(ZrH.z) >> 1; // vertical resolution of source texture + const int lofs = ((((vres + 1) >> 1) << 1) - vres) & bank; // line alignment offset for bank 1 + const int vpos = int(gl_FragCoord.y) + lofs; // vertical position of destination texture + const vec2 bofs = vec2(0.0f, 0.5f * bank); // vertical offset of the current bank relative to source texture size + const vec2 vscale = vec2(1.0f, 2.0f); // scaling factor from source to destination texture + const vec2 optr = v_tex - bofs; // used to check if the current destination line is within the current bank + const vec2 iptr = optr * vscale; // pointer to the current pixel in the source texture + + // if the index of current destination line belongs to the current fiels we update it, otherwise + // we leave the old line in the destination buffer + if ((optr.y >= 0.0f) && (optr.y < 0.5f) && ((vpos & 1) == field)) + o_col0 = texture(samp0, iptr); + else + discard; +} +#endif + + +// MAD shader - reconstruction +#ifdef ps_main4 +void ps_main4() +{ + // we use the contents of the MAD frame buffer to reconstruct the missing lines from the current + // field. + + const int idx = int(ZrH.x); // buffer index passed from CPU + const int bank = idx >> 1; // current bank + const int field = idx & 1; // current field + const int vpos = int(gl_FragCoord.y); // vertical position of destination texture + const float sensitivity = ZrH.w; // passed from CPU, higher values mean more likely to use weave + const vec3 motion_thr = vec3(1.0, 1.0, 1.0) * sensitivity; // + const vec2 bofs = vec2(0.0f, 0.5f); // position of the bank 1 relative to source texture size + const vec2 vscale = vec2(1.0f, 0.5f); // scaling factor from source to destination texture + const vec2 lofs = vec2(0.0f, ZrH.y) * vscale; // distance between two adjacent lines relative to source texture size + const vec2 iptr = v_tex * vscale; // pointer to the current pixel in the source texture + + vec2 p_t0; // pointer to current pixel (missing or not) from most recent frame + vec2 p_t1; // pointer to current pixel (missing or not) from one frame back + vec2 p_t2; // pointer to current pixel (missing or not) from two frames back + vec2 p_t3; // pointer to current pixel (missing or not) from three frames back + + switch (idx) + { + case 1: + p_t0 = iptr; + p_t1 = iptr; + p_t2 = iptr + bofs; + p_t3 = iptr + bofs; + break; + case 2: + p_t0 = iptr + bofs; + p_t1 = iptr; + p_t2 = iptr; + p_t3 = iptr + bofs; + break; + case 3: + p_t0 = iptr + bofs; + p_t1 = iptr + bofs; + p_t2 = iptr; + p_t3 = iptr; + break; + default: + p_t0 = iptr; + p_t1 = iptr + bofs; + p_t2 = iptr + bofs; + p_t3 = iptr; + break; + } + + // calculating motion, only relevant for missing lines where the "center line" is pointed by p_t1 + + vec4 hn = texture(samp0, p_t0 - lofs); // new high pixel + vec4 cn = texture(samp0, p_t1); // new center pixel + vec4 ln = texture(samp0, p_t0 + lofs); // new low pixel + + vec4 ho = texture(samp0, p_t2 - lofs); // old high pixel + vec4 co = texture(samp0, p_t3); // old center pixel + vec4 lo = texture(samp0, p_t2 + lofs); // old low pixel + + vec3 mh = hn.rgb - ho.rgb; // high pixel motion + vec3 mc = cn.rgb - co.rgb; // center pixel motion + vec3 ml = ln.rgb - lo.rgb; // low pixel motion + + mh = max(mh, -mh) - motion_thr; + mc = max(mc, -mc) - motion_thr; + ml = max(ml, -ml) - motion_thr; + + #if 1 // use this code to evaluate each color motion separately + float mh_max = max(max(mh.x, mh.y), mh.z); + float mc_max = max(max(mc.x, mc.y), mc.z); + float ml_max = max(max(ml.x, ml.y), ml.z); + #else // use this code to evaluate average color motion + float mh_max = mh.x + mh.y + mh.z; + float mc_max = mc.x + mc.y + mc.z; + float ml_max = ml.x + ml.y + ml.z; + #endif + + // selecting deinterlacing output + + if ((vpos & 1) == field) // output coordinate present on current field + { + // output coordinate present on current field + o_col0 = texture(samp0, p_t0); + } + else if ((iptr.y > 0.5f - lofs.y) || (iptr.y < 0.0 + lofs.y)) + { + // top and bottom lines are always weaved + o_col0 = cn; + } + else + { + // missing line needs to be reconstructed + if(((mh_max > 0.0f) || (ml_max > 0.0f)) || (mc_max > 0.0f)) + // high motion -> interpolate pixels above and below + o_col0 = (hn + ln) / 2.0f; + else + // low motion -> weave + o_col0 = cn; + } } #endif diff --git a/bin/resources/shaders/vulkan/present.glsl b/bin/resources/shaders/vulkan/present.glsl index 33cd93d690..2f4687b7c8 100644 --- a/bin/resources/shaders/vulkan/present.glsl +++ b/bin/resources/shaders/vulkan/present.glsl @@ -1,7 +1,3 @@ -#ifndef PS_SCALE_FACTOR -#define PS_SCALE_FACTOR 1 -#endif - #ifdef VERTEX_SHADER layout(location = 0) in vec4 a_pos; @@ -103,7 +99,7 @@ void ps_filter_complex() // triangular { const float PI = 3.14159265359f; vec2 texdim = vec2(textureSize(samp0, 0)); - + o_col0 = (0.9 - 0.4 * cos(2 * PI * v_tex.y * texdim.y)) * sample_c(vec2(v_tex.x, (floor(v_tex.y * texdim.y) + 0.5) / texdim.y)); } #endif @@ -364,4 +360,4 @@ void ps_filter_lottes() #endif -#endif \ No newline at end of file +#endif diff --git a/bin/resources/shaders/vulkan/tfx.glsl b/bin/resources/shaders/vulkan/tfx.glsl index b15b176190..347805891c 100644 --- a/bin/resources/shaders/vulkan/tfx.glsl +++ b/bin/resources/shaders/vulkan/tfx.glsl @@ -97,7 +97,7 @@ layout(location = 0) in VSOutput vec4 c; #else flat vec4 c; - #endif + #endif } gsIn[]; layout(location = 0) out GSOutput @@ -113,6 +113,9 @@ layout(location = 0) out GSOutput void WriteVertex(vec4 pos, vec4 t, vec4 ti, vec4 c) { +#if GS_FORWARD_PRIMID + gl_PrimitiveID = gl_PrimitiveIDIn; +#endif gl_Position = pos; gsOut.t = t; gsOut.ti = ti; @@ -330,13 +333,14 @@ void main() #define PS_TALES_OF_ABYSS_HLE 0 #define PS_URBAN_CHAOS_HLE 0 #define PS_INVALID_TEX0 0 -#define PS_SCALE_FACTOR 1 +#define PS_SCALE_FACTOR 1.0 #define PS_HDR 0 #define PS_COLCLIP 0 #define PS_BLEND_A 0 #define PS_BLEND_B 0 #define PS_BLEND_C 0 #define PS_BLEND_D 0 +#define PS_FIXED_ONE_A 0 #define PS_PABE 0 #define PS_DITHER 0 #define PS_ZCLAMP 0 @@ -347,7 +351,7 @@ void main() #define SW_BLEND (PS_BLEND_A || PS_BLEND_B || PS_BLEND_D) #define SW_BLEND_NEEDS_RT (PS_BLEND_A == 1 || PS_BLEND_B == 1 || PS_BLEND_C == 1 || PS_BLEND_D == 1) -#define PS_FEEDBACK_LOOP_IS_NEEDED (PS_TEX_IS_FB == 1 || PS_FBMASK || SW_BLEND_NEEDS_RT || (PS_DATE < 10 && (((PS_DATE & 3) == 1 || (PS_DATE & 3) == 2)))) +#define PS_FEEDBACK_LOOP_IS_NEEDED (PS_TEX_IS_FB == 1 || PS_FBMASK || SW_BLEND_NEEDS_RT || (PS_DATE >= 5)) layout(std140, set = 0, binding = 1) uniform cb1 { @@ -902,7 +906,7 @@ vec4 ps_color() #if PS_FST == 0 && PS_INVALID_TEX0 == 1 // Re-normalize coordinate from invalid GS to corrected texture size vec2 st = (vsIn.t.xy * WH.xy) / (vsIn.t.w * WH.zw); - // no st_int yet + vec2 st_int = (vsIn.ti.zw * WH.xy) / (vsIn.t.w * WH.zw); #elif PS_FST == 0 vec2 st = vsIn.t.xy / vsIn.t.w; vec2 st_int = vsIn.ti.zw / vsIn.t.w; @@ -979,17 +983,17 @@ void ps_color_clamp_wrap(inout vec3 C) // Warning: normally blending equation is mult(A, B) = A * B >> 7. GPU have the full accuracy // GS: Color = 1, Alpha = 255 => output 1 // GPU: Color = 1/255, Alpha = 255/255 * 255/128 => output 1.9921875 -#if PS_DFMT == FMT_16 && (PS_HDR == 1 || PS_BLEND_MIX == 0) +#if PS_DFMT == FMT_16 && PS_BLEND_MIX == 0 // In 16 bits format, only 5 bits of colors are used. It impacts shadows computation of Castlevania C = vec3(ivec3(C) & ivec3(0xF8)); -#elif PS_COLCLIP == 1 && PS_HDR == 0 +#elif PS_COLCLIP == 1 || PS_HDR == 1 C = vec3(ivec3(C) & ivec3(0xFF)); #endif #endif } -void ps_blend(inout vec4 Color, float As) +void ps_blend(inout vec4 Color, inout float As) { #if SW_BLEND @@ -1007,13 +1011,9 @@ void ps_blend(inout vec4 Color, float As) vec4 RT = vec4(0.0f); #endif - #if PS_DFMT == FMT_24 - float Ad = 1.0f; - #else // FIXME FMT_16 case // FIXME Ad or Ad * 2? float Ad = RT.a / 128.0f; - #endif // Let the compiler do its jobs ! vec3 Cd = RT.rgb; @@ -1052,16 +1052,52 @@ void ps_blend(inout vec4 Color, float As) #endif // As/Af clamp alpha for Blend mix - #if PS_BLEND_MIX - C = min(C, 1.0f); + // We shouldn't clamp blend mix with clr1 as we want alpha higher + float C_clamped = C; + #if PS_BLEND_MIX > 0 && PS_CLR_HW != 1 + C_clamped = min(C_clamped, 1.0f); #endif #if PS_BLEND_A == PS_BLEND_B Color.rgb = D; + // In blend_mix, HW adds on some alpha factor * dst. + // Truncating here wouldn't quite get the right result because it prevents the <1 bit here from combining with a <1 bit in dst to form a ≥1 amount that pushes over the truncation. + // Instead, apply an offset to convert HW's round to a floor. + // Since alpha is in 1/128 increments, subtracting (0.5 - 0.5/128 == 127/256) would get us what we want if GPUs blended in full precision. + // But they don't. Details here: https://github.com/PCSX2/pcsx2/pull/6809#issuecomment-1211473399 + // Based on the scripts at the above link, the ideal choice for Intel GPUs is 126/256, AMD 120/256. Nvidia is a lost cause. + // 124/256 seems like a reasonable compromise, providing the correct answer 99.3% of the time on Intel (vs 99.6% for 126/256), and 97% of the time on AMD (vs 97.4% for 120/256). + #elif PS_BLEND_MIX == 2 + Color.rgb = ((A - B) * C_clamped + D) + (124.0f/256.0f); + #elif PS_BLEND_MIX == 1 + Color.rgb = ((A - B) * C_clamped + D) - (124.0f/256.0f); #else Color.rgb = trunc((A - B) * C + D); #endif + #if PS_CLR_HW == 1 + // Replace Af with As so we can do proper compensation for Alpha. + #if PS_BLEND_C == 2 + As = Af; + #endif + // Subtract 1 for alpha to compensate for the changed equation, + // if c.rgb > 255.0f then we further need to adjust alpha accordingly, + // we pick the lowest overflow from all colors because it's the safest, + // we divide by 255 the color because we don't know Cd value, + // changed alpha should only be done for hw blend. + float min_color = min(min(Color.r, Color.g), Color.b); + float alpha_compensate = max(1.0f, min_color / 255.0f); + As -= alpha_compensate; + #elif PS_CLR_HW == 2 + // Compensate slightly for Cd*(As + 1) - Cs*As. + // The initial factor we chose is 1 (0.00392) + // as that is the minimum color Cd can be, + // then we multiply by alpha to get the minimum + // blended value it can be. + float color_compensate = 1.0f * (C + 1.0f); + Color.rgb -= vec3(color_compensate); + #endif + #else #if PS_CLR_HW == 1 || PS_CLR_HW == 5 // Needed for Cd * (As/Ad/F + 1) blending modes @@ -1086,10 +1122,6 @@ void ps_blend(inout vec4 Color, float As) #endif } -#if PS_DATE == 1 || PS_DATE == 2 || PS_DATE == 11 || PS_DATE == 12 -layout(early_fragment_tests) in; -#endif - void main() { #if PS_SCANMSK & 2 @@ -1097,7 +1129,7 @@ void main() if ((int(gl_FragCoord.y) & 1) == (PS_SCANMSK & 1)) discard; #endif -#if PS_DATE < 10 && (((PS_DATE & 3) == 1 || (PS_DATE & 3) == 2)) +#if PS_DATE >= 5 #if PS_WRITE_RG == 1 // Pseudo 16 bits access. @@ -1115,15 +1147,10 @@ void main() #endif if (bad) { -#if PS_DATE >= 5 discard; -#else - // imageStore(img_prim_min, ivec2(gl_FragCoord.xy), ivec4(-1)); - return; -#endif } -#endif // PS_DATE < 10 && (((PS_DATE & 3) == 1 || (PS_DATE & 3) == 2)) +#endif // PS_DATE >= 5 #if PS_DATE == 3 int stencil_ceil = int(texelFetch(PrimMinTexture, ivec2(gl_FragCoord.xy), 0).r); @@ -1162,9 +1189,15 @@ void main() #endif // Must be done before alpha correction + + // AA (Fixed one) will output a coverage of 1.0 as alpha +#if PS_FIXED_ONE_A + C.a = 128.0f; +#endif + #if (PS_BLEND_C == 1 && PS_CLR_HW > 3) vec4 RT = trunc(subpassLoad(RtSampler) * 255.0f + 0.1f); - float alpha_blend = (PS_DFMT == FMT_24) ? 1.0f : RT.a / 128.0f; + float alpha_blend = RT.a / 128.0f; #else float alpha_blend = C.a / 128.0f; #endif @@ -1178,13 +1211,13 @@ void main() #endif // Get first primitive that will write a failling alpha value -#if PS_DATE == 1 || PS_DATE == 11 +#if PS_DATE == 1 // DATM == 0 // Pixel with alpha equal to 1 will failed (128-255) o_col0 = (C.a > 127.5f) ? vec4(gl_PrimitiveID) : vec4(0x7FFFFFFF); -#elif PS_DATE == 2 || PS_DATE == 12 +#elif PS_DATE == 2 // DATM == 1 // Pixel with alpha equal to 0 will failed (0-127) @@ -1202,7 +1235,11 @@ void main() ps_fbmask(C); #if !PS_NO_COLOR +#if PS_HDR == 1 + o_col0 = vec4(C.rgb / 65535.0f, C.a / 255.0f); +#else o_col0 = C / 255.0f; +#endif #if !defined(DISABLE_DUAL_SOURCE) && !PS_NO_COLOR1 o_col1 = vec4(alpha_blend); #endif diff --git a/bin/resources/sounds/achievements/README.txt b/bin/resources/sounds/achievements/README.txt new file mode 100644 index 0000000000..db96edd8ea --- /dev/null +++ b/bin/resources/sounds/achievements/README.txt @@ -0,0 +1,2 @@ +lbsubmit.wav: https://freesound.org/people/Eponn/sounds/636656/ +unlock.wav and message.wav are from https://github.com/RetroAchievements/RAInterface diff --git a/bin/resources/sounds/achievements/lbsubmit.wav b/bin/resources/sounds/achievements/lbsubmit.wav new file mode 100644 index 0000000000..218073d02b Binary files /dev/null and b/bin/resources/sounds/achievements/lbsubmit.wav differ diff --git a/bin/resources/sounds/achievements/message.wav b/bin/resources/sounds/achievements/message.wav new file mode 100644 index 0000000000..7146107f76 Binary files /dev/null and b/bin/resources/sounds/achievements/message.wav differ diff --git a/bin/resources/sounds/achievements/unlock.wav b/bin/resources/sounds/achievements/unlock.wav new file mode 100644 index 0000000000..2b0c3b1ea4 Binary files /dev/null and b/bin/resources/sounds/achievements/unlock.wav differ diff --git a/bin/shaders/GS.fx b/bin/shaders/GS.fx deleted file mode 100644 index b8a8daf922..0000000000 --- a/bin/shaders/GS.fx +++ /dev/null @@ -1,2525 +0,0 @@ -/*===============================================================================*\ -|######################## [GSdx FX Suite v2.40] ########################| -|########################## By Asmodean ##########################| -|| || -|| This program is free software; you can redistribute it and/or || -|| modify it under the terms of the GNU General Public License || -|| as published by the Free Software Foundation; either version 2 || -|| of the License, or (at your option) any later version. || -|| || -|| This program is distributed in the hope that it will be useful, || -|| but WITHOUT ANY WARRANTY; without even the implied warranty of || -|| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the || -|| GNU General Public License for more details. (c)2016 || -|| || -|#################################################################################| -\*===============================================================================*/ - -#ifndef SHADER_MODEL -#define GLSL 1 -#else -#define GLSL 0 -#endif - -/*------------------------------------------------------------------------------ - [GLOBALS|FUNCTIONS] -------------------------------------------------------------------------------*/ -#if GLSL == 1 -#define int2 ivec2 -#define float2 vec2 -#define float3 vec3 -#define float4 vec4 -#define float4x4 mat4 -#define float3x3 mat3 -#define float4x3 mat4x3 -#define static -#define fmod mod -#define frac fract -#define mul(x, y) (y * x) -#define lerp(x,y,s) mix(x,y,s) -#define saturate(x) clamp(x, 0.0, 1.0) -#define SamplerState sampler2D - -in vec4 PSin_p; -in vec2 PSin_t; - -layout(location = 0) out vec4 SV_Target0; - -uniform vec2 _xyFrame; -uniform vec4 _rcpFrame; - -#else - -Texture2D Texture : register(t0); -SamplerState TextureSampler : register(s0); - -cbuffer cb0 -{ - float2 _xyFrame; - float4 _rcpFrame; -}; - -struct VS_INPUT -{ - float4 p : POSITION; - float2 t : TEXCOORD0; -}; - -struct VS_OUTPUT -{ - float4 p : SV_Position; - float2 t : TEXCOORD0; -}; - -struct PS_OUTPUT -{ - float4 c : SV_Target0; -}; -#endif - -static float Epsilon = 1e-10; -static float2 pixelSize = _rcpFrame.xy; -static float2 screenSize = _xyFrame; -static const float3 lumCoeff = float3(0.2126729, 0.7151522, 0.0721750); - -//Conversion matrices -float3 RGBtoXYZ(float3 rgb) -{ - const float3x3 m = float3x3( - 0.4124564, 0.3575761, 0.1804375, - 0.2126729, 0.7151522, 0.0721750, - 0.0193339, 0.1191920, 0.9503041); - - return mul(m, rgb); -} - -float3 XYZtoRGB(float3 xyz) -{ - const float3x3 m = float3x3( - 3.2404542,-1.5371385,-0.4985314, - -0.9692660, 1.8760108, 0.0415560, - 0.0556434,-0.2040259, 1.0572252); - - return mul(m, xyz); -} - -float3 RGBtoYUV(float3 RGB) -{ - const float3x3 m = float3x3( - 0.2126, 0.7152, 0.0722, - -0.09991,-0.33609, 0.436, - 0.615, -0.55861, -0.05639); - - return mul(m, RGB); -} - -float3 YUVtoRGB(float3 YUV) -{ - const float3x3 m = float3x3( - 1.000, 0.000, 1.28033, - 1.000,-0.21482,-0.38059, - 1.000, 2.12798, 0.000); - - return mul(m, YUV); -} - -//Converting XYZ to Yxy -float3 XYZtoYxy(float3 xyz) -{ - float w = (xyz.r + xyz.g + xyz.b); - float3 Yxy; - - Yxy.r = xyz.g; - Yxy.g = xyz.r / w; - Yxy.b = xyz.g / w; - - return Yxy; -} - -//Converting Yxy to XYZ -float3 YxytoXYZ(float3 Yxy) -{ - float3 xyz; - xyz.g = Yxy.r; - xyz.r = Yxy.r * Yxy.g / Yxy.b; - xyz.b = Yxy.r * (1.0 - Yxy.g - Yxy.b) / Yxy.b; - - return xyz; -} - -//Average relative luminance -float AvgLuminance(float3 color) -{ - return sqrt(dot(color * color, lumCoeff)); -} - -float smootherstep(float a, float b, float x) -{ - x = saturate((x - a) / (b - a)); - return x*x*x*(x*(x * 6 - 15) + 10); -} - -/* -float4 DebugClipping(float4 color) -{ - if (color.x >= 0.99999 && color.y >= 0.99999 && - color.z >= 0.99999) color.xyz = float3(1.0f, 0.0f, 0.0f); - - if (color.x <= 0.00001 && color.y <= 0.00001 && - color.z <= 0.00001) color.xyz = float3(0.0f, 0.0f, 1.0f); - - return color; -} -*/ - -float4 sample_tex(SamplerState texSample, float2 texcoord) -{ -#if GLSL == 1 - return texture(texSample, texcoord); -#else - return Texture.Sample(texSample, texcoord); -#endif -} - -float4 sample_texLod(SamplerState texSample, float2 texcoord, float lod) -{ -#if GLSL == 1 - return textureLod(texSample, texcoord, lod); -#else - return Texture.SampleLevel(texSample, texcoord, lod); -#endif -} - -/*------------------------------------------------------------------------------ - [FXAA CODE SECTION] -------------------------------------------------------------------------------*/ - -#if UHQ_FXAA == 1 -#if SHADER_MODEL >= 0x500 -#define FXAA_HLSL_5 1 -#define FXAA_GATHER4_ALPHA 1 -#elif GLSL == 1 -#define FXAA_GATHER4_ALPHA 1 -#else -#define FXAA_HLSL_4 1 -#define FXAA_GATHER4_ALPHA 0 -#endif - -#if FxaaQuality == 4 -#define FxaaEdgeThreshold 0.063 -#define FxaaEdgeThresholdMin 0.000 -#elif FxaaQuality == 3 -#define FxaaEdgeThreshold 0.125 -#define FxaaEdgeThresholdMin 0.0312 -#elif FxaaQuality == 2 -#define FxaaEdgeThreshold 0.166 -#define FxaaEdgeThresholdMin 0.0625 -#elif FxaaQuality == 1 -#define FxaaEdgeThreshold 0.250 -#define FxaaEdgeThresholdMin 0.0833 -#endif - -#if FXAA_HLSL_5 == 1 -struct FxaaTex { SamplerState smpl; Texture2D tex; }; -#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) -#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) -#define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p) -#define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o) -#define FxaaDiscard clip(-1) -#define FxaaSat(x) saturate(x) - -#elif FXAA_HLSL_4 == 1 -struct FxaaTex { SamplerState smpl; Texture2D tex; }; -#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) -#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) -#define FxaaDiscard clip(-1) -#define FxaaSat(x) saturate(x) -#endif - -#if GLSL == 1 -#define FxaaBool bool -#define FxaaDiscard discard -#define FxaaSat(x) clamp(x, 0.0, 1.0) -#define FxaaTex sampler2D -#define FxaaTexTop(t, p) textureLod(t, p, 0.0) -#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o) -#if FXAA_GATHER4_ALPHA == 1 -#define FxaaTexAlpha4(t, p) textureGather(t, p, 3) -#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3) -#define FxaaTexGreen4(t, p) textureGather(t, p, 1) -#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1) -#endif -#endif - -#define FXAA_QUALITY__P0 1.0 -#define FXAA_QUALITY__P1 1.0 -#define FXAA_QUALITY__P2 1.0 -#define FXAA_QUALITY__P3 1.0 -#define FXAA_QUALITY__P4 1.0 -#define FXAA_QUALITY__P5 1.5 -#define FXAA_QUALITY__P6 2.0 -#define FXAA_QUALITY__P7 2.0 -#define FXAA_QUALITY__P8 2.0 -#define FXAA_QUALITY__P9 2.0 -#define FXAA_QUALITY__P10 4.0 -#define FXAA_QUALITY__P11 8.0 -#define FXAA_QUALITY__P12 8.0 - -float FxaaLuma(float4 rgba) -{ - rgba.w = AvgLuminance(rgba.xyz); - return rgba.w; -} - -float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaSubpix, float fxaaEdgeThreshold, float fxaaEdgeThresholdMin) -{ - float2 posM; - posM.x = pos.x; - posM.y = pos.y; - - #if FXAA_GATHER4_ALPHA == 1 - float4 rgbyM = FxaaTexTop(tex, posM); - float4 luma4A = FxaaTexAlpha4(tex, posM); - float4 luma4B = FxaaTexOffAlpha4(tex, posM, int2(-1, -1)); - rgbyM.w = AvgLuminance(rgbyM.xyz); - - #define lumaM rgbyM.w - #define lumaE luma4A.z - #define lumaS luma4A.x - #define lumaSE luma4A.y - #define lumaNW luma4B.w - #define lumaN luma4B.z - #define lumaW luma4B.x - - #else - float4 rgbyM = FxaaTexTop(tex, posM); - rgbyM.w = AvgLuminance(rgbyM.xyz); - #define lumaM rgbyM.w - - float lumaS = FxaaLuma(FxaaTexOff(tex, posM, int2( 0, 1), fxaaRcpFrame.xy)); - float lumaE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1, 0), fxaaRcpFrame.xy)); - float lumaN = FxaaLuma(FxaaTexOff(tex, posM, int2( 0,-1), fxaaRcpFrame.xy)); - float lumaW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1, 0), fxaaRcpFrame.xy)); - #endif - - float maxSM = max(lumaS, lumaM); - float minSM = min(lumaS, lumaM); - float maxESM = max(lumaE, maxSM); - float minESM = min(lumaE, minSM); - float maxWN = max(lumaN, lumaW); - float minWN = min(lumaN, lumaW); - - float rangeMax = max(maxWN, maxESM); - float rangeMin = min(minWN, minESM); - float range = rangeMax - rangeMin; - float rangeMaxScaled = rangeMax * fxaaEdgeThreshold; - float rangeMaxClamped = max(fxaaEdgeThresholdMin, rangeMaxScaled); - - bool earlyExit = range < rangeMaxClamped; - #if FxaaEarlyExit == 1 - if(earlyExit) { return rgbyM; } - #endif - - #if FXAA_GATHER4_ALPHA == 0 - float lumaNW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1,-1), fxaaRcpFrame.xy)); - float lumaSE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1, 1), fxaaRcpFrame.xy)); - float lumaNE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1,-1), fxaaRcpFrame.xy)); - float lumaSW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1, 1), fxaaRcpFrame.xy)); - #else - float lumaNE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1,-1), fxaaRcpFrame.xy)); - float lumaSW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1, 1), fxaaRcpFrame.xy)); - #endif - - float lumaNS = lumaN + lumaS; - float lumaWE = lumaW + lumaE; - float subpixRcpRange = 1.0/range; - float subpixNSWE = lumaNS + lumaWE; - float edgeHorz1 = (-2.0 * lumaM) + lumaNS; - float edgeVert1 = (-2.0 * lumaM) + lumaWE; - float lumaNESE = lumaNE + lumaSE; - float lumaNWNE = lumaNW + lumaNE; - float edgeHorz2 = (-2.0 * lumaE) + lumaNESE; - float edgeVert2 = (-2.0 * lumaN) + lumaNWNE; - - float lumaNWSW = lumaNW + lumaSW; - float lumaSWSE = lumaSW + lumaSE; - float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); - float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); - float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; - float edgeVert3 = (-2.0 * lumaS) + lumaSWSE; - float edgeHorz = abs(edgeHorz3) + edgeHorz4; - float edgeVert = abs(edgeVert3) + edgeVert4; - - float subpixNWSWNESE = lumaNWSW + lumaNESE; - float lengthSign = fxaaRcpFrame.x; - bool horzSpan = edgeHorz >= edgeVert; - float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; - if(!horzSpan) lumaN = lumaW; - if(!horzSpan) lumaS = lumaE; - if(horzSpan) lengthSign = fxaaRcpFrame.y; - float subpixB = (subpixA * (1.0/12.0)) - lumaM; - - float gradientN = lumaN - lumaM; - float gradientS = lumaS - lumaM; - float lumaNN = lumaN + lumaM; - float lumaSS = lumaS + lumaM; - bool pairN = abs(gradientN) >= abs(gradientS); - float gradient = max(abs(gradientN), abs(gradientS)); - if(pairN) lengthSign = -lengthSign; - float subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); - - float2 posB; - posB.x = posM.x; - posB.y = posM.y; - float2 offNP; - offNP.x = (!horzSpan) ? 0.0 : fxaaRcpFrame.x; - offNP.y = ( horzSpan) ? 0.0 : fxaaRcpFrame.y; - if(!horzSpan) posB.x += lengthSign * 0.5; - if( horzSpan) posB.y += lengthSign * 0.5; - - float2 posN; - posN.x = posB.x - offNP.x * FXAA_QUALITY__P0; - posN.y = posB.y - offNP.y * FXAA_QUALITY__P0; - float2 posP; - posP.x = posB.x + offNP.x * FXAA_QUALITY__P0; - posP.y = posB.y + offNP.y * FXAA_QUALITY__P0; - float subpixD = ((-2.0)*subpixC) + 3.0; - float lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); - float subpixE = subpixC * subpixC; - float lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); - - if(!pairN) lumaNN = lumaSS; - float gradientScaled = gradient * 1.0/4.0; - float lumaMM = lumaM - lumaNN * 0.5; - float subpixF = subpixD * subpixE; - bool lumaMLTZero = lumaMM < 0.0; - lumaEndN -= lumaNN * 0.5; - lumaEndP -= lumaNN * 0.5; - bool doneN = abs(lumaEndN) >= gradientScaled; - bool doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1; - bool doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11; - - if(doneNP) { - if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5; - if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5; - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12; - doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12; - }}}}}}}}}}} - - float dstN = posM.x - posN.x; - float dstP = posP.x - posM.x; - if(!horzSpan) dstN = posM.y - posN.y; - if(!horzSpan) dstP = posP.y - posM.y; - - bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; - float spanLength = (dstP + dstN); - bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; - float spanLengthRcp = 1.0/spanLength; - - bool directionN = dstN < dstP; - float dst = min(dstN, dstP); - bool goodSpan = directionN ? goodSpanN : goodSpanP; - float subpixG = subpixF * subpixF; - float pixelOffset = (dst * (-spanLengthRcp)) + 0.5; - float subpixH = subpixG * fxaaSubpix; - - float pixelOffsetGood = goodSpan ? pixelOffset : 0.0; - float pixelOffsetSubpix = max(pixelOffsetGood, subpixH); - if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; - if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; - - return float4(FxaaTexTop(tex, posM).xyz, lumaM); -} - -float4 FxaaPass(float4 FxaaColor, float2 texcoord) -{ - #if GLSL == 1 - FxaaColor = FxaaPixelShader(texcoord, TextureSampler, pixelSize.xy, FxaaSubpixMax, FxaaEdgeThreshold, FxaaEdgeThresholdMin); - #else - FxaaTex tex; - - tex.tex = Texture; - tex.smpl = TextureSampler; - FxaaColor = FxaaPixelShader(texcoord, tex, pixelSize.xy, FxaaSubpixMax, FxaaEdgeThreshold, FxaaEdgeThresholdMin); - #endif - - return FxaaColor; -} -#endif - -/*------------------------------------------------------------------------------ - [TEXTURE FILTERING FUNCTIONS] -------------------------------------------------------------------------------*/ - -float BSpline(float x) -{ - float f = x; - - if (f < 0.0) - { - f = -f; - } - if (f >= 0.0 && f <= 1.0) - { - return (2.0 / 3.0) + (0.5) * (f* f * f) - (f*f); - } - else if (f > 1.0 && f <= 2.0) - { - return 1.0 / 6.0 * pow((2.0 - f), 3.0); - } - return 1.0; -} - -float CatMullRom(float x) -{ - float b = 0.0; - float c = 0.5; - float f = x; - - if (f < 0.0) - { - f = -f; - } - if (f < 1.0) - { - return ((12.0 - 9.0 * b - 6.0 * c) * - (f * f * f) + (-18.0 + 12.0 * b + 6.0 * c) * - (f * f) + (6.0 - 2.0 * b)) / 6.0; - } - else if (f >= 1.0 && f < 2.0) - { - return ((-b - 6.0 * c) * (f * f * f) + - (6.0 * b + 30.0 * c) *(f *f) + - (-(12.0 * b) - 48.0 * c) * f + - 8.0 * b + 24.0 * c) / 6.0; - } - else - { - return 0.0; - } -} - -float Bell(float x) -{ - float f = (x / 2.0) * 1.5; - - if (f > -1.5 && f < -0.5) - { - return(0.5 * pow(f + 1.5, 2.0)); - } - else if (f > -0.5 && f < 0.5) - { - return 3.0 / 4.0 - (f * f); - } - else if ((f > 0.5 && f < 1.5)) - { - return(0.5 * pow(f - 1.5, 2.0)); - } - return 0.0; -} - -float Triangular(float x) -{ - x = x / 2.0; - - if (x < 0.0) - { - return (x + 1.0); - } - else - { - return (1.0 - x); - } - return 0.0; -} - -float Cubic(float coeff) -{ - float4 n = float4(1.0, 2.0, 3.0, 4.0) - coeff; - float4 s = n * n * n; - - float x = s.x; - float y = s.y - 4.0 * s.x; - float z = s.z - 4.0 * s.y + 6.0 * s.x; - float w = 6.0 - x - y - z; - - return (x + y + z + w) / 4.0; -} - -/*------------------------------------------------------------------------------ - [BILINEAR FILTERING CODE SECTION] -------------------------------------------------------------------------------*/ - -#if BILINEAR_FILTERING == 1 -float4 SampleBiLinear(SamplerState texSample, float2 texcoord) -{ - float texelSizeX = pixelSize.x; - float texelSizeY = pixelSize.y; - - int nX = int(texcoord.x * screenSize.x); - int nY = int(texcoord.y * screenSize.y); - - float2 uvCoord = float2((float(nX) + OffsetAmount) / screenSize.x, (float(nY) + OffsetAmount) / screenSize.y); - - // Take nearest two data in current row. - float4 SampleA = sample_tex(texSample, uvCoord); - float4 SampleB = sample_tex(texSample, uvCoord + float2(texelSizeX, 0.0)); - - // Take nearest two data in bottom row. - float4 SampleC = sample_tex(texSample, uvCoord + float2(0.0, texelSizeY)); - float4 SampleD = sample_tex(texSample, uvCoord + float2(texelSizeX, texelSizeY)); - - float LX = frac(texcoord.x * screenSize.x); //Get Interpolation factor for X direction. - - // Interpolate in X direction. - float4 InterpolateA = lerp(SampleA, SampleB, LX); //Top row in X direction. - float4 InterpolateB = lerp(SampleC, SampleD, LX); //Bottom row in X direction. - - float LY = frac(texcoord.y * screenSize.y); //Get Interpolation factor for Y direction. - - return lerp(InterpolateA, InterpolateB, LY); //Interpolate in Y direction. -} - -float4 BiLinearPass(float4 color, float2 texcoord) -{ - float4 bilinear = SampleBiLinear(TextureSampler, texcoord); - color = lerp(color, bilinear, FilterStrength); - - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [BICUBIC FILTERING CODE SECTION] -------------------------------------------------------------------------------*/ - -#if BICUBIC_FILTERING == 1 -float4 BicubicFilter(SamplerState texSample, float2 texcoord) -{ - float texelSizeX = pixelSize.x; - float texelSizeY = pixelSize.y; - - float4 nSum = float4(0.0, 0.0, 0.0, 0.0); - float4 nDenom = float4(0.0, 0.0, 0.0, 0.0); - - float a = frac(texcoord.x * screenSize.x); - float b = frac(texcoord.y * screenSize.y); - - int nX = int(texcoord.x * screenSize.x); - int nY = int(texcoord.y * screenSize.y); - - float2 uvCoord = float2(float(nX) / screenSize.x + PixelOffset / screenSize.x, - float(nY) / screenSize.y + PixelOffset / screenSize.y); - - for (int m = -1; m <= 2; m++) { - for (int n = -1; n <= 2; n++) { - - float4 Samples = sample_tex(texSample, uvCoord + - float2(texelSizeX * float(m), texelSizeY * float(n))); - - float vc1 = Interpolation(float(m) - a); - float4 vecCoeff1 = float4(vc1, vc1, vc1, vc1); - - float vc2 = Interpolation(-(float(n) - b)); - float4 vecCoeff2 = float4(vc2, vc2, vc2, vc2); - - nSum = nSum + (Samples * vecCoeff2 * vecCoeff1); - nDenom = nDenom + (vecCoeff2 * vecCoeff1); }} - return nSum / nDenom; -} - -float4 BiCubicPass(float4 color, float2 texcoord) -{ - float4 bicubic = BicubicFilter(TextureSampler, texcoord); - color = lerp(color, bicubic, BicubicStrength); - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [GAUSSIAN FILTERING CODE SECTION] -------------------------------------------------------------------------------*/ - -#if GAUSSIAN_FILTERING == 1 -float4 GaussianPass(float4 color, float2 texcoord) -{ - if (screenSize.x < 1024 || screenSize.y < 1024) - { - pixelSize.x /= 2.0; - pixelSize.y /= 2.0; - } - - float2 dx = float2(pixelSize.x * GaussianSpread, 0.0); - float2 dy = float2(0.0, pixelSize.y * GaussianSpread); - - float2 dx2 = 2.0 * dx; - float2 dy2 = 2.0 * dy; - - float4 gaussian = sample_tex(TextureSampler, texcoord); - - gaussian += sample_tex(TextureSampler, texcoord - dx2 + dy2); - gaussian += sample_tex(TextureSampler, texcoord - dx + dy2); - gaussian += sample_tex(TextureSampler, texcoord + dy2); - gaussian += sample_tex(TextureSampler, texcoord + dx + dy2); - gaussian += sample_tex(TextureSampler, texcoord + dx2 + dy2); - - gaussian += sample_tex(TextureSampler, texcoord - dx2 + dy); - gaussian += sample_tex(TextureSampler, texcoord - dx + dy); - gaussian += sample_tex(TextureSampler, texcoord + dy); - gaussian += sample_tex(TextureSampler, texcoord + dx + dy); - gaussian += sample_tex(TextureSampler, texcoord + dx2 + dy); - - gaussian += sample_tex(TextureSampler, texcoord - dx2); - gaussian += sample_tex(TextureSampler, texcoord - dx); - gaussian += sample_tex(TextureSampler, texcoord + dx); - gaussian += sample_tex(TextureSampler, texcoord + dx2); - - gaussian += sample_tex(TextureSampler, texcoord - dx2 - dy); - gaussian += sample_tex(TextureSampler, texcoord - dx - dy); - gaussian += sample_tex(TextureSampler, texcoord - dy); - gaussian += sample_tex(TextureSampler, texcoord + dx - dy); - gaussian += sample_tex(TextureSampler, texcoord + dx2 - dy); - - gaussian += sample_tex(TextureSampler, texcoord - dx2 - dy2); - gaussian += sample_tex(TextureSampler, texcoord - dx - dy2); - gaussian += sample_tex(TextureSampler, texcoord - dy2); - gaussian += sample_tex(TextureSampler, texcoord + dx - dy2); - gaussian += sample_tex(TextureSampler, texcoord + dx2 - dy2); - - gaussian /= 25.0; - - color = lerp(color, gaussian, FilterAmount); - - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [BICUBIC SCALER CODE SECTION] -------------------------------------------------------------------------------*/ - -#if BICUBLIC_SCALER == 1 -float4 BicubicScaler(SamplerState tex, float2 uv, float2 texSize) -{ - float2 inputSize = float2(1.0/texSize.x, 1.0/texSize.y); - - float2 coord_hg = uv * texSize - 0.5; - float2 index = floor(coord_hg); - float2 f = coord_hg - index; - - #if GLSL == 1 - mat4 M = mat4( -1.0, 3.0,-3.0, 1.0, 3.0,-6.0, 3.0, 0.0, - -3.0, 0.0, 3.0, 0.0, 1.0, 4.0, 1.0, 0.0 ); - #else - float4x4 M = { -1.0, 3.0,-3.0, 1.0, 3.0,-6.0, 3.0, 0.0, - -3.0, 0.0, 3.0, 0.0, 1.0, 4.0, 1.0, 0.0 }; - #endif - M /= 6.0; - - float4 wx = mul(float4(f.x*f.x*f.x, f.x*f.x, f.x, 1.0), M); - float4 wy = mul(float4(f.y*f.y*f.y, f.y*f.y, f.y, 1.0), M); - float2 w0 = float2(wx.x, wy.x); - float2 w1 = float2(wx.y, wy.y); - float2 w2 = float2(wx.z, wy.z); - float2 w3 = float2(wx.w, wy.w); - - float2 g0 = w0 + w1; - float2 g1 = w2 + w3; - float2 h0 = w1 / g0 - 1.0; - float2 h1 = w3 / g1 + 1.0; - - float2 coord00 = index + h0; - float2 coord10 = index + float2(h1.x, h0.y); - float2 coord01 = index + float2(h0.x, h1.y); - float2 coord11 = index + h1; - - coord00 = (coord00 + 0.5) * inputSize; - coord10 = (coord10 + 0.5) * inputSize; - coord01 = (coord01 + 0.5) * inputSize; - coord11 = (coord11 + 0.5) * inputSize; - - float4 tex00 = sample_texLod(tex, coord00, 0); - float4 tex10 = sample_texLod(tex, coord10, 0); - float4 tex01 = sample_texLod(tex, coord01, 0); - float4 tex11 = sample_texLod(tex, coord11, 0); - - tex00 = lerp(tex01, tex00, float4(g0.y, g0.y, g0.y, g0.y)); - tex10 = lerp(tex11, tex10, float4(g0.y, g0.y, g0.y, g0.y)); - - float4 res = lerp(tex10, tex00, float4(g0.x, g0.x, g0.x, g0.x)); - - return res; -} - -float4 BiCubicScalerPass(float4 color, float2 texcoord) -{ - color = BicubicScaler(TextureSampler, texcoord, screenSize); - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [LANCZOS SCALER CODE SECTION] -------------------------------------------------------------------------------*/ - -#if LANCZOS_SCALER == 1 -float3 PixelPos(float xpos, float ypos) -{ - return sample_tex(TextureSampler, float2(xpos, ypos)).rgb; -} - -float4 WeightQuad(float x) -{ - #define FIX(c) max(abs(c), 1e-5); - const float PI = 3.1415926535897932384626433832795; - - float4 weight = FIX(PI * float4(1.0 + x, x, 1.0 - x, 2.0 - x)); - float4 ret = sin(weight) * sin(weight / 2.0) / (weight * weight); - - return ret / dot(ret, float4(1.0, 1.0, 1.0, 1.0)); -} - -float3 LineRun(float ypos, float4 xpos, float4 linetaps) -{ - return mul(linetaps, float4x3( - PixelPos(xpos.x, ypos), - PixelPos(xpos.y, ypos), - PixelPos(xpos.z, ypos), - PixelPos(xpos.w, ypos))); -} - -float4 LanczosScaler(float2 texcoord, float2 inputSize) -{ - float2 stepxy = float2(1.0/inputSize.x, 1.0/inputSize.y); - float2 pos = texcoord + stepxy; - float2 f = frac(pos / stepxy); - - float2 xystart = (-2.0 - f) * stepxy + pos; - float4 xpos = float4(xystart.x, - xystart.x + stepxy.x, - xystart.x + stepxy.x * 2.0, - xystart.x + stepxy.x * 3.0); - - float4 linetaps = WeightQuad(f.x); - float4 columntaps = WeightQuad(f.y); - - // final sum and weight normalization - return float4(mul(columntaps, float4x3( - LineRun(xystart.y, xpos, linetaps), - LineRun(xystart.y + stepxy.y, xpos, linetaps), - LineRun(xystart.y + stepxy.y * 2.0, xpos, linetaps), - LineRun(xystart.y + stepxy.y * 3.0, xpos, linetaps))), 1.0); -} - -float4 LanczosScalerPass(float4 color, float2 texcoord) -{ - color = LanczosScaler(texcoord, screenSize); - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [GAMMA CORRECTION CODE SECTION] -------------------------------------------------------------------------------*/ - -float3 EncodeGamma(float3 color, float gamma) -{ - color = saturate(color); - color.r = (color.r <= 0.0404482362771082) ? - color.r / 12.92 : pow((color.r + 0.055) / 1.055, gamma); - color.g = (color.g <= 0.0404482362771082) ? - color.g / 12.92 : pow((color.g + 0.055) / 1.055, gamma); - color.b = (color.b <= 0.0404482362771082) ? - color.b / 12.92 : pow((color.b + 0.055) / 1.055, gamma); - - return color; -} - -float3 DecodeGamma(float3 color, float gamma) -{ - color = saturate(color); - color.r = (color.r <= 0.00313066844250063) ? - color.r * 12.92 : 1.055 * pow(color.r, 1.0 / gamma) - 0.055; - color.g = (color.g <= 0.00313066844250063) ? - color.g * 12.92 : 1.055 * pow(color.g, 1.0 / gamma) - 0.055; - color.b = (color.b <= 0.00313066844250063) ? - color.b * 12.92 : 1.055 * pow(color.b, 1.0 / gamma) - 0.055; - - return color; -} - -#if GAMMA_CORRECTION == 1 -float4 GammaPass(float4 color, float2 texcoord) -{ - static const float GammaConst = 2.233333; - color.rgb = EncodeGamma(color.rgb, GammaConst); - color.rgb = DecodeGamma(color.rgb, float(Gamma)); - color.a = AvgLuminance(color.rgb); - - return color; -} -#endif -/*------------------------------------------------------------------------------ - [TEXTURE SHARPEN CODE SECTION] -------------------------------------------------------------------------------*/ - -#if TEXTURE_SHARPEN == 1 -float4 SampleBicubic(SamplerState texSample, float2 texcoord) -{ - float texelSizeX = pixelSize.x * float(SharpenBias); - float texelSizeY = pixelSize.y * float(SharpenBias); - - float4 nSum = float4(0.0, 0.0, 0.0, 0.0); - float4 nDenom = float4(0.0, 0.0, 0.0, 0.0); - - float a = frac(texcoord.x * screenSize.x); - float b = frac(texcoord.y * screenSize.y); - - int nX = int(texcoord.x * screenSize.x); - int nY = int(texcoord.y * screenSize.y); - - float2 uvCoord = float2(float(nX) / screenSize.x, float(nY) / screenSize.y); - - for (int m = -1; m <= 2; m++) { - for (int n = -1; n <= 2; n++) { - - float4 Samples = sample_tex(texSample, uvCoord + - float2(texelSizeX * float(m), texelSizeY * float(n))); - - float vc1 = Cubic(float(m) - a); - float4 vecCoeff1 = float4(vc1, vc1, vc1, vc1); - - float vc2 = Cubic(-(float(n) - b)); - float4 vecCoeff2 = float4(vc2, vc2, vc2, vc2); - - nSum = nSum + (Samples * vecCoeff2 * vecCoeff1); - nDenom = nDenom + (vecCoeff2 * vecCoeff1); }} - return nSum / nDenom; -} - -float4 TexSharpenPass(float4 color, float2 texcoord) -{ - float3 calcSharpen = lumCoeff * float(SharpenStrength); - - float4 blurredColor = SampleBicubic(TextureSampler, texcoord); - float3 sharpenedColor = (color.rgb - blurredColor.rgb); - - float sharpenLuma = dot(sharpenedColor, calcSharpen); - sharpenLuma = clamp(sharpenLuma, -float(SharpenClamp), float(SharpenClamp)); - - color.rgb = color.rgb + sharpenLuma; - color.a = AvgLuminance(color.rgb); - - #if DebugSharpen == 1 - color = saturate(0.5f + (sharpenLuma * 4)).xxxx; - #endif - - return saturate(color); -} -#endif - -/*------------------------------------------------------------------------------ - [PIXEL VIBRANCE CODE SECTION] -------------------------------------------------------------------------------*/ - -#if PIXEL_VIBRANCE == 1 -float4 VibrancePass(float4 color, float2 texcoord) -{ - float vib = Vibrance; - - #if GLSL == 1 - float3 luma = float3(AvgLuminance(color.rgb)); - #else - float luma = AvgLuminance(color.rgb); - #endif - - float colorMax = max(color.r, max(color.g, color.b)); - float colorMin = min(color.r, min(color.g, color.b)); - - float colorSaturation = colorMax - colorMin; - float3 colorCoeff = float3(RedVibrance * vib, GreenVibrance * vib, BlueVibrance * vib); - - color.rgb = lerp(luma, color.rgb, (1.0 + (colorCoeff * (1.0 - (sign(colorCoeff) * colorSaturation))))); - color.a = AvgLuminance(color.rgb); - - return saturate(color); //Debug: return colorSaturation.xxxx; -} -#endif - -/*------------------------------------------------------------------------------ - [BLENDED BLOOM CODE SECTION] -------------------------------------------------------------------------------*/ - -#if BLENDED_BLOOM == 1 -float3 BlendAddLight(float3 bloom, float3 blend) -{ - return saturate(bloom + blend); -} - -float3 BlendScreen(float3 bloom, float3 blend) -{ - return (bloom + blend) - (bloom * blend); -} - -float3 BlendGlow(float3 bloom, float3 blend) -{ - float glow = AvgLuminance(bloom); - return lerp((bloom + blend) - (bloom * blend), - (blend + blend) - (blend * blend), glow); -} - -float3 BlendAddGlow(float3 bloom, float3 blend) -{ - float addglow = smootherstep(0.0, 1.0, AvgLuminance(bloom)); - return lerp(saturate(bloom + blend), - (blend + blend) - (blend * blend), addglow); -} - -float3 BlendLuma(float3 bloom, float3 blend) -{ - float lumavg = smootherstep(0.0, 1.0, AvgLuminance(bloom + blend)); - return lerp((bloom * blend), (1.0 - - ((1.0 - bloom) * (1.0 - blend))), lumavg); -} - -float3 BlendOverlay(float3 bloom, float3 blend) -{ - float3 overlay = step(0.5, bloom); - return lerp((bloom * blend * 2.0), (1.0 - (2.0 * - (1.0 - bloom) * (1.0 - blend))), overlay); -} - -float3 BloomCorrection(float3 color) -{ - float3 bloom = color; - - bloom.r = 2.0 / 3.0 * (1.0 - (bloom.r * bloom.r)); - bloom.g = 2.0 / 3.0 * (1.0 - (bloom.g * bloom.g)); - bloom.b = 2.0 / 3.0 * (1.0 - (bloom.b * bloom.b)); - - bloom.r = saturate(color.r + float(BloomReds) * bloom.r); - bloom.g = saturate(color.g + float(BloomGreens) * bloom.g); - bloom.b = saturate(color.b + float(BloomBlues) * bloom.b); - - color = bloom; - - return color; -} - -float4 DefocusFilter(SamplerState tex, float2 texcoord, float2 defocus) -{ - float2 texel = pixelSize * defocus; - - float4 sampleA = sample_tex(tex, texcoord + float2(0.5, 0.5) * texel); - float4 sampleB = sample_tex(tex, texcoord + float2(-0.5, 0.5) * texel); - float4 sampleC = sample_tex(tex, texcoord + float2(0.5, -0.5) * texel); - float4 sampleD = sample_tex(tex, texcoord + float2(-0.5, -0.5) * texel); - - float fx = frac(texcoord.x * screenSize.x); - float fy = frac(texcoord.y * screenSize.y); - - float4 interpolateA = lerp(sampleA, sampleB, fx); - float4 interpolateB = lerp(sampleC, sampleD, fx); - - return lerp(interpolateA, interpolateB, fy); -} - -float4 BloomPass(float4 color, float2 texcoord) -{ - float anflare = 4.0; - - float2 defocus = float2(BloomDefocus, BloomDefocus); - float4 bloom = DefocusFilter(TextureSampler, texcoord, defocus); - - float2 dx = float2(pixelSize.x * float(BloomWidth), 0.0); - float2 dy = float2(0.0, pixelSize.y * float(BloomWidth)); - - float2 mdx = float2(dx.x * defocus.x, 0.0); - float2 mdy = float2(0.0, dy.y * defocus.y); - - float4 blend = bloom * 0.22520613262190495; - - blend += 0.002589001911021066 * sample_tex(TextureSampler, texcoord - mdx + mdy); - blend += 0.010778807494659370 * sample_tex(TextureSampler, texcoord - dx + mdy); - blend += 0.024146616900339800 * sample_tex(TextureSampler, texcoord + mdy); - blend += 0.010778807494659370 * sample_tex(TextureSampler, texcoord + dx + mdy); - blend += 0.002589001911021066 * sample_tex(TextureSampler, texcoord + mdx + mdy); - - blend += 0.010778807494659370 * sample_tex(TextureSampler, texcoord - mdx + dy); - blend += 0.044875475183061630 * sample_tex(TextureSampler, texcoord - dx + dy); - blend += 0.100529757860782610 * sample_tex(TextureSampler, texcoord + dy); - blend += 0.044875475183061630 * sample_tex(TextureSampler, texcoord + dx + dy); - blend += 0.010778807494659370 * sample_tex(TextureSampler, texcoord + mdx + dy); - - blend += 0.024146616900339800 * sample_tex(TextureSampler, texcoord - mdx); - blend += 0.100529757860782610 * sample_tex(TextureSampler, texcoord - dx); - blend += 0.100529757860782610 * sample_tex(TextureSampler, texcoord + dx); - blend += 0.024146616900339800 * sample_tex(TextureSampler, texcoord + mdx); - - blend += 0.010778807494659370 * sample_tex(TextureSampler, texcoord - mdx - dy); - blend += 0.044875475183061630 * sample_tex(TextureSampler, texcoord - dx - dy); - blend += 0.100529757860782610 * sample_tex(TextureSampler, texcoord - dy); - blend += 0.044875475183061630 * sample_tex(TextureSampler, texcoord + dx - dy); - blend += 0.010778807494659370 * sample_tex(TextureSampler, texcoord + mdx - dy); - - blend += 0.002589001911021066 * sample_tex(TextureSampler, texcoord - mdx - mdy); - blend += 0.010778807494659370 * sample_tex(TextureSampler, texcoord - dx - mdy); - blend += 0.024146616900339800 * sample_tex(TextureSampler, texcoord - mdy); - blend += 0.010778807494659370 * sample_tex(TextureSampler, texcoord + dx - mdy); - blend += 0.002589001911021066 * sample_tex(TextureSampler, texcoord + mdx - mdy); - blend = lerp(color, blend, float(BlendStrength)); - - bloom.xyz = BloomType(bloom.xyz, blend.xyz); - bloom.xyz = BloomCorrection(bloom.xyz); - - color.w = AvgLuminance(color.xyz); - bloom.w = AvgLuminance(bloom.xyz); - bloom.w *= anflare; - - color = lerp(color, bloom, float(BloomStrength)); - - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [SCENE TONE MAPPING CODE SECTION] -------------------------------------------------------------------------------*/ - -#if SCENE_TONEMAPPING == 1 -float3 ScaleLuminance(float3 x) -{ - float W = 1.02; - float L = 0.06; - float C = 1.02; - - float N = clamp(0.76 + ToneAmount, 1.0, 2.0); - float K = (N - L * C) / C; - - float3 tone = L * C + (1.0 - L * C) * (1.0 + K * (x - L) / - ((W - L) * (W - L))) * (x - L) / (x - L + K); - - float3 color; - color.r = (x.r > L) ? tone.r : C * x.r; - color.g = (x.g > L) ? tone.g : C * x.g; - color.b = (x.b > L) ? tone.b : C * x.b; - - return color; -} - -float3 TmMask(float3 color) -{ - float3 tone = color; - - float highTone = 6.2; float greyTone = 0.4; - float midTone = 1.620; float lowTone = 0.06; - - tone.r = (tone.r * (highTone * tone.r + greyTone))/( - tone.r * (highTone * tone.r + midTone) + lowTone); - tone.g = (tone.g * (highTone * tone.g + greyTone))/( - tone.g * (highTone * tone.g + midTone) + lowTone); - tone.b = (tone.b * (highTone * tone.b + greyTone))/( - tone.b * (highTone * tone.b + midTone) + lowTone); - - static const float gamma = 2.42; - tone = EncodeGamma(tone, gamma); - - color = lerp(color, tone, float(MaskStrength)); - - return color; -} - -float3 TmCurve(float3 color) -{ - float3 T = color; - - float tnamn = ToneAmount; - float blevel = length(T); - float bmask = pow(blevel, 0.02); - - float A = 0.100; float B = 0.300; - float C = 0.100; float D = tnamn; - float E = 0.020; float F = 0.300; - - float W = 1.000; - - T.r = ((T.r*(A*T.r + C*B) + D*E) / (T.r*(A*T.r + B) + D*F)) - E / F; - T.g = ((T.g*(A*T.g + C*B) + D*E) / (T.g*(A*T.g + B) + D*F)) - E / F; - T.b = ((T.b*(A*T.b + C*B) + D*E) / (T.b*(A*T.b + B) + D*F)) - E / F; - - float denom = ((W*(A*W + C*B) + D*E) / (W*(A*W + B) + D*F)) - E / F; - - float3 black = float3(bmask, bmask, bmask); - float3 white = float3(denom, denom, denom); - - T = T / white; - T = T * black; - - color = saturate(T); - - return color; -} - -float4 TonemapPass(float4 color, float2 texcoord) -{ - float3 tonemap = color.rgb; - - float blackLevel = length(tonemap); - tonemap = ScaleLuminance(tonemap); - - #if GLSL == 1 - float luminanceAverage = AvgLuminance(float3(Luminance)); - #else - float luminanceAverage = AvgLuminance(Luminance); - #endif - - if (TonemapMask == 1) { tonemap = TmMask(tonemap); } - if (TonemapType == 1) { tonemap = TmCurve(tonemap); } - - // RGB -> XYZ conversion - const float3x3 RGB2XYZ = float3x3(0.4124564, 0.3575761, 0.1804375, - 0.2126729, 0.7151522, 0.0721750, - 0.0193339, 0.1191920, 0.9503041); - - float3 XYZ = mul(RGB2XYZ, tonemap); - - // XYZ -> Yxy conversion - float3 Yxy; - - Yxy.r = XYZ.g; // copy luminance Y - Yxy.g = XYZ.r / (XYZ.r + XYZ.g + XYZ.b); // x = X / (X + Y + Z) - Yxy.b = XYZ.g / (XYZ.r + XYZ.g + XYZ.b); // y = Y / (X + Y + Z) - - // (Wt) Tone mapped scaling of the initial wp before input modifiers - float Wt = saturate(Yxy.r / AvgLuminance(XYZ)); - - if (TonemapType == 2) { Yxy.r = TmCurve(Yxy).r; } - - // (Lp) Map average luminance to the middlegrey zone by scaling pixel luminance - float Lp = Yxy.r * float(Exposure) / (luminanceAverage + Epsilon); - - // (Wp) White point calculated, based on the toned white, and input modifier - float Wp = dot(abs(Wt), float(WhitePoint)); - - // (Ld) Scale all luminance within a displayable range of 0 to 1 - Yxy.r = (Lp * (1.0 + Lp / (Wp * Wp))) / (1.0 + Lp); - - // Yxy -> XYZ conversion - XYZ.r = Yxy.r * Yxy.g / Yxy.b; // X = Y * x / y - XYZ.g = Yxy.r; // copy luminance Y - XYZ.b = Yxy.r * (1.0 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y - - if (TonemapType == 3) { XYZ = TmCurve(XYZ); } - - // XYZ -> RGB conversion - const float3x3 XYZ2RGB = float3x3(3.2404542,-1.5371385,-0.4985314, - -0.9692660, 1.8760108, 0.0415560, - 0.0556434,-0.2040259, 1.0572252); - - tonemap = mul(XYZ2RGB, XYZ); - - float shadowmask = pow(saturate(blackLevel), float(BlackLevels)); - tonemap = tonemap * float3(shadowmask, shadowmask, shadowmask); - - color.rgb = tonemap; - color.a = AvgLuminance(color.rgb); - - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [CROSS PROCESSING CODE SECTION] -------------------------------------------------------------------------------*/ - -#if CROSS_PROCESSING == 1 -float3 CrossShift(float3 color) -{ - float3 cross; - - float2 CrossMatrix[3] = { - float2 (0.960, 0.040 * color.x), - float2 (0.980, 0.020 * color.y), - float2 (0.970, 0.030 * color.z), }; - - cross.x = float(RedShift) * CrossMatrix[0].x + CrossMatrix[0].y; - cross.y = float(GreenShift) * CrossMatrix[1].x + CrossMatrix[1].y; - cross.z = float(BlueShift) * CrossMatrix[2].x + CrossMatrix[2].y; - - float lum = AvgLuminance(color); - float3 black = float3(0.0, 0.0, 0.0); - float3 white = float3(1.0, 1.0, 1.0); - - cross = lerp(black, cross, saturate(lum * 2.0)); - cross = lerp(cross, white, saturate(lum - 0.5) * 2.0); - color = lerp(color, cross, saturate(lum * float(ShiftRatio))); - - return color; -} - -float4 CrossPass(float4 color, float2 texcoord) -{ - #if FilmicProcess == 1 - color.rgb = CrossShift(color.rgb); - - #elif FilmicProcess == 2 - float3 XYZ = RGBtoXYZ(color.rgb); - float3 Yxy = XYZtoYxy(XYZ); - - Yxy = CrossShift(Yxy); - XYZ = YxytoXYZ(Yxy); - - color.rgb = XYZtoRGB(XYZ); - - #elif FilmicProcess == 3 - float3 XYZ = RGBtoXYZ(color.rgb); - float3 Yxy = XYZtoYxy(XYZ); - - XYZ = YxytoXYZ(Yxy); - XYZ = CrossShift(XYZ); - - color.rgb = XYZtoRGB(XYZ); - #endif - - color.a = AvgLuminance(color.rgb); - - return saturate(color); -} -#endif - -/*------------------------------------------------------------------------------ - [COLOR CORRECTION CODE SECTION] -------------------------------------------------------------------------------*/ - -// Converting pure hue to RGB -float3 HUEtoRGB(float H) -{ - float R = abs(H * 6.0 - 3.0) - 1.0; - float G = 2.0 - abs(H * 6.0 - 2.0); - float B = 2.0 - abs(H * 6.0 - 4.0); - - return saturate(float3(R, G, B)); -} - -// Converting RGB to hue/chroma/value -float3 RGBtoHCV(float3 RGB) -{ - float4 BG = float4(RGB.bg,-1.0, 2.0 / 3.0); - float4 GB = float4(RGB.gb, 0.0,-1.0 / 3.0); - - float4 P = (RGB.g < RGB.b) ? BG : GB; - - float4 XY = float4(P.xyw, RGB.r); - float4 YZ = float4(RGB.r, P.yzx); - - float4 Q = (RGB.r < P.x) ? XY : YZ; - - float C = Q.x - min(Q.w, Q.y); - float H = abs((Q.w - Q.y) / (6.0 * C + Epsilon) + Q.z); - - return float3(H, C, Q.x); -} - -// Converting RGB to HSV -float3 RGBtoHSV(float3 RGB) -{ - float3 HCV = RGBtoHCV(RGB); - float S = HCV.y / (HCV.z + Epsilon); - - return float3(HCV.x, S, HCV.z); -} - -// Converting HSV to RGB -float3 HSVtoRGB(float3 HSV) -{ - float3 RGB = HUEtoRGB(HSV.x); - return ((RGB - 1.0) * HSV.y + 1.0) * HSV.z; -} - -#if COLOR_CORRECTION == 1 -// Pre correction color mask -float3 PreCorrection(float3 color) -{ - float3 RGB = color; - - RGB.r = 2.0 / 3.0 * (1.0 - (RGB.r * RGB.r)); - RGB.g = 2.0 / 3.0 * (1.0 - (RGB.g * RGB.g)); - RGB.b = 2.0 / 3.0 * (1.0 - (RGB.b * RGB.b)); - - RGB.r = saturate(color.r + (float(ChannelR) / 200.0) * RGB.r); - RGB.g = saturate(color.g + (float(ChannelG) / 200.0) * RGB.g); - RGB.b = saturate(color.b + (float(ChannelB) / 200.0) * RGB.b); - - color = saturate(RGB); - - return color; -} - -float3 ColorCorrection(float3 color) -{ - float X = 1.0 / (1.0 + exp(float(ChannelR) / 2.0)); - float Y = 1.0 / (1.0 + exp(float(ChannelG) / 2.0)); - float Z = 1.0 / (1.0 + exp(float(ChannelB) / 2.0)); - - color.r = (1.0 / (1.0 + exp(float(-ChannelR) * (color.r - 0.5))) - X) / (1.0 - 2.0 * X); - color.g = (1.0 / (1.0 + exp(float(-ChannelG) * (color.g - 0.5))) - Y) / (1.0 - 2.0 * Y); - color.b = (1.0 / (1.0 + exp(float(-ChannelB) * (color.b - 0.5))) - Z) / (1.0 - 2.0 * Z); - - return saturate(color); -} - -float4 CorrectionPass(float4 color, float2 texcoord) -{ - float3 colorspace = PreCorrection(color.rgb); - - #if CorrectionPalette == 1 - colorspace = ColorCorrection(colorspace); - - #elif CorrectionPalette == 2 - float3 XYZ = RGBtoXYZ(colorspace); - float3 Yxy = XYZtoYxy(XYZ); - - Yxy = ColorCorrection(Yxy); - XYZ = YxytoXYZ(Yxy); - colorspace = XYZtoRGB(XYZ); - - #elif CorrectionPalette == 3 - float3 XYZ = RGBtoXYZ(colorspace); - float3 Yxy = XYZtoYxy(XYZ); - - XYZ = YxytoXYZ(Yxy); - XYZ = ColorCorrection(XYZ); - colorspace = XYZtoRGB(XYZ); - - #elif CorrectionPalette == 4 - float3 hsv = RGBtoHSV(colorspace); - hsv = ColorCorrection(hsv); - colorspace = HSVtoRGB(hsv); - - #elif CorrectionPalette == 5 - float3 yuv = RGBtoYUV(colorspace); - yuv = ColorCorrection(yuv); - colorspace = YUVtoRGB(yuv); - #endif - - color.rgb = lerp(color.rgb, colorspace, float(PaletteStrength)); - color.a = AvgLuminance(color.rgb); - - return color; -} -#endif - - -/*------------------------------------------------------------------------------ - [S-CURVE CONTRAST CODE SECTION] -------------------------------------------------------------------------------*/ - -#if CURVE_CONTRAST == 1 -float4 ContrastPass(float4 color, float2 texcoord) -{ - float CurveBlend = CurvesContrast; - - #if CurveType != 2 - #if GLSL == 1 - float3 luma = float3(AvgLuminance(color.rgb)); - #else - float3 luma = (float3)AvgLuminance(color.rgb); - #endif - float3 chroma = color.rgb - luma; - #endif - - #if CurveType == 2 - float3 x = color.rgb; - #elif (CurveType == 1) - float3 x = chroma; - x = x * 0.5 + 0.5; - #else - float3 x = luma; - #endif - - //S-Curve - Cubic Bezier spline - float3 a = float3(0.00, 0.00, 0.00); //start point - float3 b = float3(0.25, 0.25, 0.25); //control point 1 - float3 c = float3(0.85, 0.85, 0.85); //control point 2 - float3 d = float3(1.00, 1.00, 1.00); //endpoint - - float3 ab = lerp(a, b, x); //point between a and b (green) - float3 bc = lerp(b, c, x); //point between b and c (green) - float3 cd = lerp(c, d, x); //point between c and d (green) - float3 abbc = lerp(ab, bc, x); //point between ab and bc (blue) - float3 bccd = lerp(bc, cd, x); //point between bc and cd (blue) - float3 dest = lerp(abbc, bccd, x); //point on the bezier-curve (black) - - x = dest; - - #if CurveType == 0 //Only Luma - x = lerp(luma, x, CurveBlend); - color.rgb = x + chroma; - #elif (CurveType == 1) //Only Chroma - x = x * 2 - 1; - float3 LColor = luma + x; - color.rgb = lerp(color.rgb, LColor, CurveBlend); - #elif (CurveType == 2) //Both Luma and Chroma - float3 LColor = x; - color.rgb = lerp(color.rgb, LColor, CurveBlend); - #endif - - color.a = AvgLuminance(color.rgb); - - return saturate(color); -} -#endif - -/*------------------------------------------------------------------------------ - [CEL SHADING CODE SECTION] -------------------------------------------------------------------------------*/ - -#if CEL_SHADING == 1 -float3 CelColor(in float3 RGB) -{ - float3 HSV = RGBtoHSV(RGB); - - float AW = 1.0; - float AB = 0.0; - float SL = 7.0; - float CR = 1.0 / SL; - float MS = 1.2; - float ML = fmod(HSV[2], CR); - - if (HSV[2] > AW) - { - HSV[1] = 1.0; HSV[2] = 1.0; - } - else if (HSV[2] > AB) - { - HSV[1] *= MS; HSV[2] += ((CR * (HSV[2] + 0.6)) - ML); - } - else - { - HSV[1] = 0.0; HSV[2] = 0.0; - } - - HSV[2] = clamp(HSV[2], float(int(HSV[2] / CR) - 1) * CR, float(int(HSV[2] / CR) + 1) * CR); - RGB = HSVtoRGB(HSV); - - return RGB; -} - -float4 CelPass(float4 color, float2 uv0) -{ - float3 yuv; - float3 sum = color.rgb; - - const int NUM = 9; - const float2 RoundingOffset = float2(0.15, 0.2); - const float3 thresholds = float3(9.0, 9.0, 9.0); - - float lum[NUM]; - float3 col[NUM]; - float2 set[NUM] = { - float2(-0.0078125, -0.0078125), - float2(0.00, -0.0078125), - float2(0.0078125, -0.0078125), - float2(-0.0078125, 0.00), - float2(0.00, 0.00), - float2(0.0078125, 0.00), - float2(-0.0078125, 0.0078125), - float2(0.00, 0.0078125), - float2(0.0078125, 0.0078125) }; - - for (int i = 0; i < NUM; i++) - { - col[i] = sample_tex(TextureSampler, uv0 + set[i] * RoundingOffset).rgb; - col[i] = CelColor(col[i]); - - #if ColorRounding == 1 - col[i].r = round(col[i].r * thresholds.r) / thresholds.r; - col[i].g = round(col[i].g * thresholds.g) / thresholds.g; - col[i].b = round(col[i].b * thresholds.b) / thresholds.b; - #endif - - lum[i] = AvgLuminance(col[i].xyz); - yuv = RGBtoYUV(col[i]); - - #if UseYuvLuma == 1 - yuv.r = round(yuv.r * thresholds.r) / thresholds.r; - #endif - - yuv = YUVtoRGB(yuv); - sum += yuv; - } - - float3 shaded = sum / NUM; - float3 shadedColor = lerp(color.rgb, shaded, 0.6); - - float cs; float4 offset; - float4 pos0 = uv0.xyxy; - - offset.xy = -(offset.zw = float2(pixelSize.x * float(EdgeThickness), 0.0)); - float4 pos1 = pos0 + offset; - - offset.xy = -(offset.zw = float2(0.0, pixelSize.y * float(EdgeThickness))); - float4 pos2 = pos0 + offset; - - float4 pos3 = pos1 + 2.0 * offset; - - float3 c0 = sample_tex(TextureSampler, pos3.xy).rgb; - float3 c1 = sample_tex(TextureSampler, pos2.xy).rgb; - float3 c2 = sample_tex(TextureSampler, pos3.zy).rgb; - float3 c3 = sample_tex(TextureSampler, pos1.xy).rgb; - float3 c5 = sample_tex(TextureSampler, pos1.zw).rgb; - float3 c6 = sample_tex(TextureSampler, pos3.xw).rgb; - float3 c7 = sample_tex(TextureSampler, pos2.zw).rgb; - float3 c8 = sample_tex(TextureSampler, pos3.zw).rgb; - - float3 o = float3(1.0, 1.0, 1.0); - float3 h = float3(0.02, 0.02, 0.02); - - float3 hz = h; float k = 0.02; float kz = 0.0035; - float3 cz = (color.rgb + h) / (dot(o, color.rgb) + k); - - hz = (cz - ((c0 + h) / (dot(o, c0) + k))); cs = kz / (dot(hz, hz) + kz); - hz = (cz - ((c1 + h) / (dot(o, c1) + k))); cs += kz / (dot(hz, hz) + kz); - hz = (cz - ((c2 + h) / (dot(o, c2) + k))); cs += kz / (dot(hz, hz) + kz); - hz = (cz - ((c3 + h) / (dot(o, c3) + k))); cs += kz / (dot(hz, hz) + kz); - hz = (cz - ((c5 + h) / (dot(o, c5) + k))); cs += kz / (dot(hz, hz) + kz); - hz = (cz - ((c6 + h) / (dot(o, c6) + k))); cs += kz / (dot(hz, hz) + kz); - hz = (cz - ((c7 + h) / (dot(o, c7) + k))); cs += kz / (dot(hz, hz) + kz); - hz = (cz - ((c8 + h) / (dot(o, c8) + k))); cs += kz / (dot(hz, hz) + kz); - - cs /= 8.0; - - color.rgb = lerp(color.rgb, shadedColor, AvgLuminance(color.rgb)) * pow(cs, EdgeStrength); - color.a = AvgLuminance(color.rgb); - - return saturate(color); -} -#endif - -/*------------------------------------------------------------------------------ - [PAINT SHADING CODE SECTION] -------------------------------------------------------------------------------*/ - -#if PAINT_SHADING == 1 -float3 PaintShading(float3 color, float2 texcoord) -{ - #if PaintMethod == 1 - float2 tex; - int k, j, lum, cmax = 0; - - float C0, C1, C2, C3, C4, C5, C6, C7, C8, C9; - float3 A, B, C, D, E, F, G, H, I, J, shade; - - for (k = int(-PaintRadius); k < (int(PaintRadius) + 1); k++){ - for (j = int(-PaintRadius); j < (int(PaintRadius) + 1); j++){ - - tex.x = texcoord.x + pixelSize.x * k; - tex.y = texcoord.y + pixelSize.y * j; - - shade = sample_tex(TextureSampler, tex).xyz; - - lum = AvgLuminance(shade) * 9.0; - - C0 = (lum == 0) ? C0 + 1 : C0; - C1 = (lum == 1) ? C1 + 1 : C1; - C2 = (lum == 2) ? C2 + 1 : C2; - C3 = (lum == 3) ? C3 + 1 : C3; - C4 = (lum == 4) ? C4 + 1 : C4; - C5 = (lum == 5) ? C5 + 1 : C5; - C6 = (lum == 6) ? C6 + 1 : C6; - C7 = (lum == 7) ? C7 + 1 : C7; - C8 = (lum == 8) ? C8 + 1 : C8; - C9 = (lum == 9) ? C9 + 1 : C9; - - A = (lum == 0) ? A + shade : A; - B = (lum == 1) ? B + shade : B; - C = (lum == 2) ? C + shade : C; - D = (lum == 3) ? D + shade : D; - E = (lum == 4) ? E + shade : E; - F = (lum == 5) ? F + shade : F; - G = (lum == 6) ? G + shade : G; - H = (lum == 7) ? H + shade : H; - I = (lum == 8) ? I + shade : I; - J = (lum == 9) ? J + shade : J; - }} - - if (C0 > cmax){ cmax = C0; color.xyz = A / cmax; } - if (C1 > cmax){ cmax = C1; color.xyz = B / cmax; } - if (C2 > cmax){ cmax = C2; color.xyz = C / cmax; } - if (C3 > cmax){ cmax = C3; color.xyz = D / cmax; } - if (C4 > cmax){ cmax = C4; color.xyz = E / cmax; } - if (C5 > cmax){ cmax = C5; color.xyz = F / cmax; } - if (C6 > cmax){ cmax = C6; color.xyz = G / cmax; } - if (C7 > cmax){ cmax = C7; color.xyz = H / cmax; } - if (C8 > cmax){ cmax = C8; color.xyz = I / cmax; } - if (C9 > cmax){ cmax = C9; color.xyz = J / cmax; } - - #else - int j, i; - - float3 m0, m1, m2, m3, k0, k1, k2, k3, shade; - float n = float((PaintRadius + 1.0) * (PaintRadius + 1.0)); - - for (j = int(-PaintRadius); j <= 0; ++j) { - for (i = int(-PaintRadius); i <= 0; ++i) { - - shade = sample_tex(TextureSampler, texcoord + float2(i, j) / screenSize).rgb; - m0 += shade; k0 += shade * shade; }} - - for (j = int(-PaintRadius); j <= 0; ++j) { - for (i = 0; i <= int(PaintRadius); ++i) { - shade = sample_tex(TextureSampler, texcoord + float2(i, j) / screenSize).rgb; - m1 += shade; k1 += shade * shade; }} - - for (j = 0; j <= int(PaintRadius); ++j) { - for (i = 0; i <= int(PaintRadius); ++i) { - shade = sample_tex(TextureSampler, texcoord + float2(i, j) / screenSize).rgb; - m2 += shade; k2 += shade * shade; }} - - float min_sigma2 = 1e+2; - m0 /= n; k0 = abs(k0 / n - m0 * m0); - - float sigma2 = k0.r + k0.g + k0.b; - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; color = m0; } - - m1 /= n; k1 = abs(k1 / n - m1 * m1); - sigma2 = k1.r + k1.g + k1.b; - - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - color = m1; } - - m2 /= n; k2 = abs(k2 / n - m2 * m2); - sigma2 = k2.r + k2.g + k2.b; - - if (sigma2 < min_sigma2) { - min_sigma2 = sigma2; - color = m2; } - #endif - - return color; -} - -float4 PaintPass(float4 color, float2 texcoord) -{ - float3 paint = PaintShading(color.rgb, texcoord); - color.rgb = lerp(color.rgb, paint, float(PaintStrength)); - color.a = AvgLuminance(color.rgb); - - return color; -} -#endif - - -/*------------------------------------------------------------------------------ - [COLOR GRADING CODE SECTION] -------------------------------------------------------------------------------*/ - -#if COLOR_GRADING == 1 -float RGBCVtoHUE(float3 RGB, float C, float V) -{ - float3 Delta = (V - RGB) / C; - - Delta.rgb -= Delta.brg; - Delta.rgb += float3(2.0, 4.0, 6.0); - Delta.brg = step(V, RGB) * Delta.brg; - - float H; - H = max(Delta.r, max(Delta.g, Delta.b)); - return frac(H / 6); -} - -float3 HSVComplement(float3 HSV) -{ - float3 complement = HSV; - complement.x -= 0.5; - - if (complement.x < 0.0) { complement.x += 1.0; } - return(complement); -} - -float HueLerp(float h1, float h2, float v) -{ - float d = abs(h1 - h2); - - if (d <= 0.5) - { return lerp(h1, h2, v); } - else if (h1 < h2) - { return frac(lerp((h1 + 1.0), h2, v)); } - else - { return frac(lerp(h1, (h2 + 1.0), v)); } -} - -float4 ColorGrading(float4 color, float2 texcoord) -{ - float3 guide = float3(RedGrading, GreenGrading, BlueGrading); - float amount = GradingStrength; - float correlation = Correlation; - float concentration = 2.00; - - float3 colorHSV = RGBtoHSV(color.rgb); - float3 huePoleA = RGBtoHSV(guide); - float3 huePoleB = HSVComplement(huePoleA); - - float dist1 = abs(colorHSV.x - huePoleA.x); if (dist1 > 0.5) dist1 = 1.0 - dist1; - float dist2 = abs(colorHSV.x - huePoleB.x); if (dist2 > 0.5) dist2 = 1.0 - dist2; - - float descent = smoothstep(0.0, correlation, colorHSV.y); - - float3 HSVColor = colorHSV; - - if (dist1 < dist2) - { - float c = descent * amount * (1.0 - pow((dist1 * 2.0), 1.0 / concentration)); - HSVColor.x = HueLerp(colorHSV.x, huePoleA.x, c); - HSVColor.y = lerp(colorHSV.y, huePoleA.y, c); - } - else - { - float c = descent * amount * (1.0 - pow((dist2 * 2.0), 1.0 / concentration)); - HSVColor.x = HueLerp(colorHSV.x, huePoleB.x, c); - HSVColor.y = lerp(colorHSV.y, huePoleB.y, c); - } - - color.rgb = HSVtoRGB(HSVColor); - color.a = AvgLuminance(color.rgb); - - return saturate(color); -} -#endif - - -/*------------------------------------------------------------------------------ - [COLOR_TEMPERATURE] -------------------------------------------------------------------------------*/ - -#if COLOR_TEMPERATURE == 1 -float4 TemperaturePass(float4 color, float2 texcoord) -{ - float temp = clamp(White_Point, 2000.0, 12000.0) / 100.0f; - - // all calculations assume a scale of 255. We'll normalize this at the end - float3 wp = float3(255.0,255.0,255.0); - - if (White_Point <= 6600.0) { - wp.r = 255.0; - wp.g = - 155.25485562709179 - 0.44596950469579133 * (temp - 2.0) + 104.49216199393888 * log(temp - 2.0); - wp.b = White_Point <= 1900 ? 0.0 : - 254.76935184120902 + 0.8274096064007395 * (temp - 10.0) + 115.67994401066147 * log(temp - 10.0) ; - } else { - wp.r = 351.97690566805693 + 0.114206453784165 * (temp - 55.0) - 40.25366309332127 * log(temp - 55.0); - wp.g = 325.4494125711974 + 0.07943456536662342 * (temp - 50.0) - 28.0852963507957 * log(temp - 50.0); - wp.b = 255.0; - } - - // clamp and normalize - wp.rgb = clamp(wp.rgb, 0.0, 255.0) / 255.0; - - float3 adjusted = color.rgb * wp; - float3 base_luma = XYZtoYxy(RGBtoXYZ(color.rgb)); - float3 adjusted_luma = XYZtoYxy(RGBtoXYZ(adjusted)); - adjusted = adjusted_luma + (float3(base_luma.r,0.0,0.0) - float3(adjusted_luma.r,0.0,0.0)); - color = float4(XYZtoRGB(YxytoXYZ(adjusted)), 1.0); - - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [SCANLINES CODE SECTION] -------------------------------------------------------------------------------*/ - -#if SCANLINES == 1 -float4 ScanlinesPass(float4 color, float2 texcoord, float4 fragcoord) -{ - float4 intensity; - - #if GLSL == 1 - fragcoord = gl_FragCoord; - #endif - - #if ScanlineType == 0 - if (frac(fragcoord.y * 0.25) > ScanlineScale) - #elif (ScanlineType == 1) - if (frac(fragcoord.x * 0.25) > ScanlineScale) - #elif (ScanlineType == 2) - if (frac(fragcoord.x * 0.25) > ScanlineScale && frac(fragcoord.y * 0.5) > ScanlineScale) - #endif - { - intensity = float4(0.0, 0.0, 0.0, 0.0); - } - else - { - intensity = smoothstep(0.2, ScanlineBrightness, color) + normalize(float4(color.xyz, AvgLuminance(color.xyz))); - } - - float level = (4.0 - texcoord.x) * ScanlineIntensity; - - color = intensity * (0.5 - level) + color * 1.1; - - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [VIGNETTE CODE SECTION] -------------------------------------------------------------------------------*/ - -#if VIGNETTE == 1 -float4 VignettePass(float4 color, float2 texcoord) -{ - const float2 VignetteCenter = float2(0.500, 0.500); - float2 tc = texcoord - VignetteCenter; - - tc *= float2((2560.0 / 1440.0), VignetteRatio); - tc /= VignetteRadius; - - float v = dot(tc, tc); - - color.rgb *= (1.0 + pow(v, VignetteSlope * 0.25) * -VignetteAmount); - - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [SUBPIXEL DITHERING CODE SECTION] -------------------------------------------------------------------------------*/ - -#if SP_DITHERING == 1 -float Randomize(float2 texcoord) -{ - float seed = dot(texcoord, float2(12.9898, 78.233)); - float sine = sin(seed); - float noise = frac(sine * 43758.5453); - - return noise; -} - -float4 DitherPass(float4 color, float2 texcoord) -{ - float ditherBits = 8.0; - - #if DitherMethod == 2 //random dithering - - float noise = Randomize(texcoord); - float ditherShift = (1.0 / (pow(2.0, ditherBits) - 1.0)); - float ditherHalfShift = (ditherShift * 0.5); - ditherShift = ditherShift * noise - ditherHalfShift; - - color.rgb += float3(-ditherShift, ditherShift, -ditherShift); - - #if ShowMethod == 1 - color.rgb = noise; - #endif - - #elif DitherMethod == 1 //ordered dithering - - float2 ditherSize = float2(1.0 / 16.0, 10.0 / 36.0); - float gridPosition = frac(dot(texcoord, (screenSize * ditherSize)) + 0.25); - float ditherShift = (0.25) * (1.0 / (pow(2.0, ditherBits) - 1.0)); - - float3 RGBShift = float3(ditherShift, -ditherShift, ditherShift); - RGBShift = lerp(2.0 * RGBShift, -2.0 * RGBShift, gridPosition); - - color.rgb += RGBShift; - - #if ShowMethod == 1 - color.rgb = gridPosition; - #endif - - #endif - - color.a = AvgLuminance(color.rgb); - - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [PX BORDER CODE SECTION] -------------------------------------------------------------------------------*/ - -#if PX_BORDER == 1 -float4 BorderPass(float4 colorInput, float2 tex) -{ - float3 border_color_float = BorderColor / 255.0; - - float2 border = (_rcpFrame.xy * BorderWidth); - float2 within_border = saturate((-tex * tex + tex) - (-border * border + border)); - - #if GLSL == 1 - // FIXME GLSL any only support bvec so try to mix it with notEqual - bvec2 cond = notEqual( within_border, vec2(0.0f) ); - colorInput.rgb = all(cond) ? colorInput.rgb : border_color_float; - #else - colorInput.rgb = all(within_border) ? colorInput.rgb : border_color_float; - #endif - - return colorInput; -} -#endif - -/*------------------------------------------------------------------------------ - [LOTTES CRT CODE SECTION] -------------------------------------------------------------------------------*/ - -#if LOTTES_CRT == 1 -float ToLinear1(float c) -{ - c = saturate(c); - return(c <= 0.04045) ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4); -} - -float3 ToLinear(float3 c) -{ - return float3(ToLinear1(c.r), ToLinear1(c.g), ToLinear1(c.b)); -} - -float ToSrgb1(float c) -{ - c = saturate(c); - return(c < 0.0031308 ? c * 12.92 : 1.055 * pow(c, 0.41666) -0.055); -} - -float3 ToSrgb(float3 c) -{ - return float3(ToSrgb1(c.r), ToSrgb1(c.g), ToSrgb1(c.b)); -} - -float3 Fetch(float2 pos, float2 off) -{ - float2 res = (screenSize * ResolutionScale); - pos = round(pos * res + off) / res; - if(max(abs(pos.x - 0.5), abs(pos.y - 0.5)) > 0.5) { return float3(0.0, 0.0, 0.0); } - - return ToLinear(sample_tex(TextureSampler, pos.xy).rgb); -} - -float2 Dist(float2 pos) -{ - float2 crtRes = float2(CRTSizeX, CRTSizeY); - float2 res = (crtRes * MaskResolutionScale); - pos = (pos * res); - - return -((pos - floor(pos)) - float2(0.5, 0.5)); -} - -float Gaus(float pos, float scale) -{ - return exp2(scale * pos * pos); -} - -float3 Horz3(float2 pos, float off) -{ - float3 b = Fetch(pos,float2(-1.0, off)); - float3 c = Fetch(pos,float2( 0.0, off)); - float3 d = Fetch(pos,float2( 1.0, off)); - float dst = Dist(pos).x; - - // Convert distance to weight. - float scale = FilterCRTAmount; - float wb = Gaus(dst-1.0, scale); - float wc = Gaus(dst+0.0, scale); - float wd = Gaus(dst+1.0, scale); - - return (b*wb+c*wc+d*wd)/(wb+wc+wd); -} - -float3 Horz5(float2 pos, float off) -{ - float3 a = Fetch(pos, float2(-2.0, off)); - float3 b = Fetch(pos, float2(-1.0, off)); - float3 c = Fetch(pos, float2( 0.0, off)); - float3 d = Fetch(pos, float2( 1.0, off)); - float3 e = Fetch(pos, float2( 2.0, off)); - float dst = Dist(pos).x; - - // Convert distance to weight. - float scale = FilterCRTAmount; - - float wa = Gaus(dst-2.0, scale); - float wb = Gaus(dst-1.0, scale); - float wc = Gaus(dst+0.0, scale); - float wd = Gaus(dst+1.0, scale); - float we = Gaus(dst+2.0, scale); - - return (a*wa+b*wb+c*wc+d*wd+e*we)/(wa+wb+wc+wd+we); -} - -// Return scanline weight. -float Scan(float2 pos, float off) -{ - float dst = Dist(pos).y; - return Gaus(dst+off, ScanBrightness); -} - -float3 Tri(float2 pos) -{ - float3 a = Horz3(pos,-1.0); - float3 b = Horz5(pos, 0.0); - float3 c = Horz3(pos, 1.0); - - float wa = Scan(pos,-1.0); - float wb = Scan(pos, 0.0); - float wc = Scan(pos, 1.0); - - return a*wa+b*wb+c*wc; -} - -float2 Warp(float2 pos) -{ - pos = pos * 2.0-1.0; - pos *= float2(1.0 + (pos.y*pos.y) * (HorizontalWarp), 1.0 + (pos.x*pos.x) * (VerticalWarp)); - return pos * 0.5 + 0.5; -} - -float3 Mask(float2 pos) -{ - #if MaskingType == 1 - // Very compressed TV style shadow mask. - float lines = MaskAmountLight; - float odd = 0.0; - - if(frac(pos.x/6.0) < 0.5) odd = 1.0; - if (frac((pos.y + odd) / 2.0) < 0.5) lines = MaskAmountDark; - pos.x = frac(pos.x/3.0); - float3 mask = float3(MaskAmountDark, MaskAmountDark, MaskAmountDark); - - if(pos.x < 0.333) mask.r = MaskAmountLight; - else if(pos.x < 0.666)mask.g = MaskAmountLight; - else mask.b = MaskAmountLight; - mask *= lines; - - return mask; - - #elif MaskingType == 2 - // Aperture-grille. - pos.x = frac(pos.x/3.0); - float3 mask = float3(MaskAmountDark, MaskAmountDark, MaskAmountDark); - - if(pos.x < 0.333)mask.r = MaskAmountLight; - else if(pos.x < 0.666)mask.g = MaskAmountLight; - else mask.b = MaskAmountLight; - - return mask; - - #elif MaskingType == 3 - // Stretched VGA style shadow mask (same as prior shaders). - pos.x += pos.y*3.0; - float3 mask = float3(MaskAmountDark, MaskAmountDark, MaskAmountDark); - pos.x = frac(pos.x/6.0); - - if(pos.x < 0.333)mask.r = MaskAmountLight; - else if(pos.x < 0.666)mask.g = MaskAmountLight; - else mask.b = MaskAmountLight; - - return mask; - - #else - // VGA style shadow mask. - pos.xy = floor(pos.xy*float2(1.0, 0.5)); - pos.x += pos.y*3.0; - - float3 mask = float3(MaskAmountDark, MaskAmountDark, MaskAmountDark); - pos.x = frac(pos.x/6.0); - - if(pos.x < 0.333)mask.r = MaskAmountLight; - else if(pos.x < 0.666)mask.g = MaskAmountLight; - else mask.b= MaskAmountLight; - return mask; - #endif -} - -float4 LottesCRTPass(float4 color, float2 texcoord, float4 fragcoord) -{ - #if GLSL == 1 - fragcoord = gl_FragCoord; - float2 inSize = textureSize(TextureSampler, 0); - #else - float2 inSize; - Texture.GetDimensions(inSize.x, inSize.y); - #endif - - float2 pos = Warp(fragcoord.xy / inSize); - - #if UseShadowMask == 0 - color.rgb = Tri(pos); - #else - color.rgb = Tri(pos) * Mask(fragcoord.xy); - #endif - color.rgb = ToSrgb(color.rgb); - color.a = 1.0; - - return color; -} -#endif - -/*------------------------------------------------------------------------------ - [DEBAND CODE SECTION] -------------------------------------------------------------------------------*/ - -#if DEBANDING == 1 -//Deband debug settings -#define DEBAND_SKIP_THRESHOLD_TEST 0 //[0:1] 1 = Skip threshold to see the unfiltered sampling pattern -#define DEBAND_OUTPUT_BOOST 1.0 //[-2.0:2.0] Default = 1.0. Any value other than the default activates debug mode. -#define DEBAND_OUTPUT_OFFSET 0.0 //[-1.0:3.0] Default = 0.0. Any value other than the default activates debug mode. - -float rand(float2 pos) -{ - return frac(sin(dot(pos, float2(12.9898, 78.233))) * 43758.5453); -} - -bool is_within_threshold(float3 original, float3 other) -{ - #if GLSL == 1 - bvec3 cond = notEqual(max(abs(original - other) - DebandThreshold, float3(0.0, 0.0, 0.0)), float3(0.0, 0.0, 0.0)); - return !any(cond).x; - #else - return !any(max(abs(original - other) - DebandThreshold, float3(0.0, 0.0, 0.0))).x; - #endif -} - -float4 DebandPass(float4 color, float2 texcoord) -{ - float2 step = pixelSize * DebandRadius; - float2 halfstep = step * 0.5; - - // Compute additional sample positions - float2 seed = texcoord; - #if (DebandOffsetMode == 1) - float2 offset = float2(rand(seed), 0.0); - #elif(DebandOffsetMode == 2) - float2 offset = float2(rand(seed).xx); - #elif(DebandOffsetMode == 3) - float2 offset = float2(rand(seed), rand(seed + float2(0.1, 0.2))); - #endif - - float2 on[8] = { - float2( offset.x, offset.y) * step, - float2( offset.y, -offset.x) * step, - float2(-offset.x, -offset.y) * step, - float2(-offset.y, offset.x) * step, - float2( offset.x, offset.y) * halfstep, - float2( offset.y, -offset.x) * halfstep, - float2(-offset.x, -offset.y) * halfstep, - float2(-offset.y, offset.x) * halfstep }; - - float3 col0 = color.rgb; - float4 accu = float4(col0, 1.0); - - for(int i=0; i < int(DebandSampleCount); i++) - { - float4 cn = float4(sample_tex(TextureSampler, texcoord + on[i]).rgb, 1.0); - - #if (DEBAND_SKIP_THRESHOLD_TEST == 0) - if(is_within_threshold(col0, cn.rgb)) - #endif - - accu += cn; - } - - accu.rgb /= accu.a; - - // Boost to make it easier to inspect the effect's output - if(DEBAND_OUTPUT_OFFSET != 0.0 || DEBAND_OUTPUT_BOOST != 1.0) - { - accu.rgb -= DEBAND_OUTPUT_OFFSET; - accu.rgb *= DEBAND_OUTPUT_BOOST; - } - - // Additional dithering - #if (DebandDithering == 1) - //Ordered dithering - float dither_bit = 8.0; - float grid_position = frac( dot(texcoord,(screenSize * float2(1.0/16.0,10.0/36.0))) + 0.25 ); - float dither_shift = (0.25) * (1.0 / (pow(2,dither_bit) - 1.0)); - float3 dither_shift_RGB = float3(dither_shift, -dither_shift, dither_shift); - dither_shift_RGB = lerp(2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position); - accu.rgb += dither_shift_RGB; - #elif (DebandDithering == 2) - //Random dithering - float dither_bit = 8.0; - float sine = sin(dot(texcoord, float2(12.9898,78.233))); - float noise = frac(sine * 43758.5453 + texcoord.x); - float dither_shift = (1.0 / (pow(2,dither_bit) - 1.0)); - float dither_shift_half = (dither_shift * 0.5); - dither_shift = dither_shift * noise - dither_shift_half; - accu.rgb += float3(-dither_shift, dither_shift, -dither_shift); - #elif (DebandDithering == 3) - float3 vDither = dot(float2(171.0, 231.0), texcoord * screenSize).xxx; - vDither.rgb = frac( vDither.rgb / float3( 103.0, 71.0, 97.0 ) ) - float3(0.5, 0.5, 0.5); - accu.rgb += (vDither.rgb / 255.0); - #endif - - return accu; -} -#endif - -/*------------------------------------------------------------------------------ - [MAIN() & COMBINE PASS CODE SECTION] -------------------------------------------------------------------------------*/ - -#if GLSL == 1 -void ps_main() -#else -PS_OUTPUT ps_main(VS_OUTPUT input) -#endif -{ - #if GLSL == 1 - float2 texcoord = PSin_t; - float4 position = PSin_p; - float4 color = texture(TextureSampler, texcoord); - #else - PS_OUTPUT output; - - float2 texcoord = input.t; - float4 position = input.p; - float4 color = sample_tex(TextureSampler, texcoord); - #endif - - #if BILINEAR_FILTERING == 1 - color = BiLinearPass(color, texcoord); - #endif - - #if GAUSSIAN_FILTERING == 1 - color = GaussianPass(color, texcoord); - #endif - - #if BICUBIC_FILTERING == 1 - color = BiCubicPass(color, texcoord); - #endif - - #if BICUBLIC_SCALER == 1 - color = BiCubicScalerPass(color, texcoord); - #endif - - #if LANCZOS_SCALER == 1 - color = LanczosScalerPass(color, texcoord); - #endif - - #if UHQ_FXAA == 1 - color = FxaaPass(color, texcoord); - #endif - - #if TEXTURE_SHARPEN == 1 - color = TexSharpenPass(color, texcoord); - #endif - - #if PAINT_SHADING == 1 - color = PaintPass(color, texcoord); - #endif - - #if CEL_SHADING == 1 - color = CelPass(color, texcoord); - #endif - - #if GAMMA_CORRECTION == 1 - color = GammaPass(color, texcoord); - #endif - - #if PIXEL_VIBRANCE == 1 - color = VibrancePass(color, texcoord); - #endif - - #if COLOR_GRADING == 1 - color = ColorGrading(color, texcoord); - #endif - - #if COLOR_CORRECTION == 1 - color = CorrectionPass(color, texcoord); - #endif - - #if CROSS_PROCESSING == 1 - color = CrossPass(color, texcoord); - #endif - - #if SCENE_TONEMAPPING == 1 - color = TonemapPass(color, texcoord); - #endif - - #if BLENDED_BLOOM == 1 - color = BloomPass(color, texcoord); - #endif - - #if CURVE_CONTRAST == 1 - color = ContrastPass(color, texcoord); - #endif - - #if COLOR_TEMPERATURE == 1 - color = TemperaturePass(color, texcoord); - #endif - - #if VIGNETTE == 1 - color = VignettePass(color, texcoord); - #endif - - #if LOTTES_CRT == 1 - color = LottesCRTPass(color, texcoord, position); - #endif - - #if SCANLINES == 1 - color = ScanlinesPass(color, texcoord, position); - #endif - - #if SP_DITHERING == 1 - color = DitherPass(color, texcoord); - #endif - - #if DEBANDING == 1 - color = DebandPass(color, texcoord); - #endif - - #if PX_BORDER == 1 - color = BorderPass(color, texcoord); - #endif - - #if GLSL == 1 - SV_Target0 = color; - #else - output.c = color; - - return output; - #endif -} diff --git a/bin/shaders/GS_FX_Settings.ini b/bin/shaders/GS_FX_Settings.ini deleted file mode 100644 index 8a6afaba07..0000000000 --- a/bin/shaders/GS_FX_Settings.ini +++ /dev/null @@ -1,195 +0,0 @@ -/*===============================================================================*\ -|######################## [GSdx FX Suite v2.40] ########################| -|########################## By Asmodean ##########################| -|| || -|| This program is free software; you can redistribute it and/or || -|| modify it under the terms of the GNU General Public License || -|| as published by the Free Software Foundation; either version 2 || -|| of the License, or (at your option) any later version. || -|| || -|| This program is distributed in the hope that it will be useful, || -|| but WITHOUT ANY WARRANTY; without even the implied warranty of || -|| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the || -|| GNU General Public License for more details. (c)2016 || -|| || -|#################################################################################| -\*===============================================================================*/ -//#NOTICE: GSdx FX is not compatible with GSdx9. Use GSdx OGL or DX10/11. - -/*------------------------------------------------------------------------------ - [DEFINITIONS & ON/OFF OPTIONS] -------------------------------------------------------------------------------*/ - -//--------------------------#[CHOOSE EFFECTS]#--------------------------------\\ - -//#[ANTIALIASING TECHNIQUES] [1=ON|0=OFF] #READ: For best results: Use gsdx fx antialiasing OR filtering. Not both together. -#define UHQ_FXAA 0 //# High Quality Fast Approximate Anti Aliasing. If GSdx's internal FXAA is also enabled, this equals FXAA2x.[3D] - -//#[FS SCALING TECHNIQUES] [1=ON|0=OFF] #READ: For best results: Only enable one type of filtering at one time. Use post antialiasing OR FS filtering, not both. -#define BILINEAR_FILTERING 0 //# Bilinear Fullscreen Texture Filtering. BiLinear filtering - light to medium filtering of textures.[2D] -#define BICUBIC_FILTERING 0 //# Bicubic Fullscreen Texture Filtering. BiCubic filtering - medium to strong filtering of textures.[2D] -#define GAUSSIAN_FILTERING 0 //# Gaussian Fullscreen Texture Filtering. Gaussian filtering - strong to extra strong filtering of textures.[2D] -#define BICUBLIC_SCALER 0 //# Bicubic Interpolation Scaling. Uses BCS on up scaling, and downsampling of games, for smoother scaling. -#define LANCZOS_SCALER 0 //# Lanczos Interpolation Scaling. Uses Lanczos on up scaling, and downsampling of games for smoother scaling. - -//#[LIGHTING & COLOUR] [1=ON|0=OFF] #READ: These can all be turned on & off independently of each other. [For High Dynamic Range(HDR) use Bloom & Tonemapping together] -#define BLENDED_BLOOM 1 //# High Quality SP Bloom. Soft lighting with blending techniques, for a natural looking bloom. -#define SCENE_TONEMAPPING 1 //# HDR Scene Tonemapping. Layered component conversion, and applies scene tone mapping. -#define COLOR_CORRECTION 0 //# Component Color Correction. Colorspace conversion, with correction curves, and multiple palette types. -#define CROSS_PROCESSING 0 //# Filmic Cross Processing. Alters the tone of the scene, crossing the game's color set, with another. -#define GAMMA_CORRECTION 0 //# RGB Gamma Correction. Fixed expansion to variable compression gamma correction curve. -#define PIXEL_VIBRANCE 0 //# Pixel Vibrance. Intelligently adjusts pixel vibrance depending on original color saturation. -#define COLOR_GRADING 0 //# Post-Complement Colour Grading. Alters individual colour components on a scene, to enhance selected colour tones. -#define TEXTURE_SHARPEN 0 //# Bicubic Texture Unsharpen Mask. Looks similar to a negative texture LOD bias. Enhances texture fidelity. -#define CURVE_CONTRAST 0 //# S-Curve Scene Contrast Enhancement. Locally adjusts contrast using a four-point cubic bezier spline. -#define CEL_SHADING 0 //# PX Cel Shading. Simulates the look of animation/toon. Typically best suited for animated style games. -#define PAINT_SHADING 0 //# Paint Shading. Creates the effect of a painted scene. Adapted from ENB series, it's pretty performance heavy. -#define COLOR_TEMPERATURE 0 //# White Point Temperature. Changes the temperature of the image from D65 white point reference. - -//#[TV EMU TECHNIQUES] [1=ON|0=OFF] #READ: These can all be turned on & off independently of each other. These effects are typically used to simulated older TVs/CRT etc. -#define LOTTES_CRT 0 //# Timothy Lottes CRT emulation effect. Similar to scanlines, but with more control options. Ported by request. -#define SCANLINES 0 //# Scanlines to simulate the look of a CRT TV. Typically suited to sprite games. Note: Works best at Native Res. -#define VIGNETTE 0 //# Darkens the edges of the screen, to make it look more like it was shot with a camera lens. -#define DEBANDING 0 //# Applies a debanding effect, to minimize banding artifacts. Which is usually very prevalent in skyboxes (for example). -#define SP_DITHERING 0 //# Subpixel Dithering to simulate more colors than your monitor can display. Smoothes gradiants, this can reduce color banding. -#define PX_BORDER 0 //# Creates a pixel border, as a workaround for the bright edge that using hardware antialiasing(MSAA) can cause. (Ported by request from SFX). - -/*------------------------------------------------------------------------------ - [EFFECT CONFIG OPTIONS] -------------------------------------------------------------------------------*/ - -//##[UHQ_FXAA] -#define FxaaSubpixMax 0.00 //[0.00 to 1.00] Amount of subpixel aliasing removal. Higher values: softer. Lower values: sharper. 0.00: Edge only. -#define FxaaQuality 4 //[1|2|3|4] Overall Fxaa quality preset (pixel coverage). 1: Low, 2: Medium, 3: High, 4: Ultra. -#define FxaaEarlyExit 1 //[0 or 1] Use Fxaa early exit pathing. When enabled: Only luma edge pixels are antialiased. When disabled: the entire scene is antialiased(FSAA). - -//##[BILINEAR_FILTERING] -#define FilterStrength 1.00 //[0.10 to 1.50] Bilinear filtering strength. Controls the overall strength of the filtering. -#define OffsetAmount 0.0 //[0.0 to 1.5] Pixel offset amount. If you want to use an st offset, 0.5 is generally recommended. 0.0 is off. - -//##[BICUBIC_FILTERING] -#define Interpolation Triangular //[CatMullRom, Bell, BSpline, Triangular, Cubic] Type of interpolation to use. From left to right is lighter<-->stronger filtering. -#define BicubicStrength 0.75 //[0.10 to 1.50] Bicubic filtering strength. Controls the overall strength of the filtering. -#define PixelOffset 0.0 //[0.0 to 1.5] Pixel offset amount. If you want to use an st offset, 0.5 is generally recommended. 0.0 is off. - -//##[GAUSSIAN_FILTERING] -#define FilterAmount 1.00 //[0.10 to 1.50] Gaussian filtering strength. Controls the overall strength of the filtering. -#define GaussianSpread 0.75 //[0.50 to 4.00] The filtering spread & offset levels. Controls the sampling spread of the filtering. - -//##[BLENDED BLOOM] -#define BloomType BlendGlow //[BlendGlow, BlendAddGlow, BlendAddLight, BlendScreen, BlendLuma, BlendOverlay] The type of blended bloom. Light<->Dark. -#define BloomStrength 0.220 //[0.000 to 1.000] Overall strength of the bloom. You may want to readjust for each blend type. -#define BlendStrength 1.000 //[0.000 to 1.000] Strength of the blending. This is a modifier based on bloom. 1.0 equates to 100% strength. -#define BloomDefocus 2.000 //[1.000 to 4.000] The initial bloom defocus value. Increases the softness of light, bright objects, etc. -#define BloomWidth 3.200 //[1.000 to 8.000] Width of the bloom. Adjusts the width of the spread and soft glow. Scales with BloomStrength. -#define BloomReds 0.040 //[0.000 to 1.000] Red channel correction of the bloom. Raising will increase the bloom of reds. -#define BloomGreens 0.030 //[0.000 to 1.000] Green channel correction of the bloom. Raising will increase the bloom of greens. -#define BloomBlues 0.020 //[0.000 to 1.000] Blue channel correction of the bloom. Raising will increase the bloom of blues. - -//##[SCENE TONEMAPPING] -#define TonemapType 1 //[0|1|2|3] The base tone mapping operator. 0 is LDR, 1 is HDR(original), 2 & 3 are Filmic HDR(slight grading). -#define TonemapMask 0 //[0 or 1] Enables an ALU tone masking curve. Produces a nice cinematic look. Suits some games more than others. -#define MaskStrength 0.25 //[0.000 to 1.000] Strength of the tone masking. Higher for a stronger effect. This is a dependency of TonemapMask. -#define ToneAmount 0.300 //[0.050 to 1.000] Tonemap strength (tone correction). Higher for stronger tone mapping, lower for lighter. -#define BlackLevels 0.060 //[0.000 to 1.000] Black level balance (shadow correction). Increase to deepen blacks, lower to lighten them. -#define Exposure 1.000 //[0.100 to 2.000] White correction (brightness). Higher values for more scene exposure, lower for less. -#define Luminance 1.000 //[0.100 to 2.000] Luminance average (luminance correction). Higher values will lower scene luminance average. -#define WhitePoint 1.000 //[0.100 to 2.000] Whitepoint average (wp lum correction). Higher values will lower the maximum scene white point. - -//##[COLOR CORRECTION] -#define CorrectionPalette 1 //[1|2|3|4|5] The colorspace palette type. 1: RGB, 2: YXY, 3: XYZ, 4: HSV, 5: YUV. Each one will produce a different combination of shades & hues. -#define ChannelR 1.20 //[0.00 to 8.00] R(1), Y(2), X(3), H(4), Y(5) component channel varies with the colorspace used. Higher values increase correction strength. -#define ChannelG 1.60 //[0.00 to 8.00] G(1), X(2), Y(3), S(4), U(5) component channel varies with the colorspace used. Higher values increase correction strength. -#define ChannelB 1.80 //[0.00 to 8.00] B(1), Y(2), Z(3), V(4), V(5) component channel varies with the colorspace used. Higher values increase correction strength. -#define PaletteStrength 2.00 //[0.00 to 4.00] The interpolated strength ratio between the base color, and the corrected color. Raise to increase saturation. - -//##[CROSS PROCESSING] -#define FilmicProcess 1 //[1|2|3] The color conversion type for the cross process. 1: cool, 2: warm, 3: dusk. You can achieve different results with each. -#define RedShift 0.50 //[0.10 to 1.00] Red color component shift of the filmic processing. Alters the red balance of the shift. -#define GreenShift 0.50 //[0.10 to 1.00] Green color component shift of the filmic processing. Alters the green balance of the shift. -#define BlueShift 0.50 //[0.10 to 1.00] Blue color component shift of the filmic processing. Alters the blue balance of the shift. -#define ShiftRatio 0.50 //[0.10 to 2.00] The blending ratio for the base color and the color shift. Higher for a stronger effect. - -//##[TEXTURE SHARPEN] -#define SharpenStrength 0.75 //[0.10 to 2.00] Strength of the texture sharpening effect. This is the maximum strength that will be used. -#define SharpenClamp 0.015 //[0.005 to 0.500] Reduces the clamping/limiting on the maximum amount of sharpening each pixel recieves. Raise this to reduce the clamping. -#define SharpenBias 1.20 //[0.50 to 4.00] Sharpening edge bias. Lower values for clean subtle sharpen, and higher values for a deeper textured sharpen. -#define DebugSharpen 0 //[0 or 1] Visualize the sharpening effect. Useful for fine-tuning. Best to disable other effects, to see edge detection clearly. - -//##[PIXEL VIBRANCE] -#define Vibrance 0.10 //[-1.00 to 1.00] Overall vibrance strength. Locally adjusts the vibrance of pixels depending on their original saturation. -#define RedVibrance 1.00 //[-8.00 to 8.00] Red channel coefficient of the vibrance strength. Adjusting the vibrance of the red channel independently. -#define GreenVibrance 1.00 //[-8.00 to 8.00] Green channel coefficient of the vibrance strength. Adjusting the vibrance of the green channel independently. -#define BlueVibrance 1.00 //[-8.00 to 8.00] Blue channel coefficient of the vibrance strength. Adjusting the vibrance of the blue channel independently. - -//##[COLOR_GRADING] -#define RedGrading 1.20 //[0.00 to 3.00] Red colour grading coefficient. Adjust to influence the red channel coefficients of the grading, and highlight tones. -#define GreenGrading 1.10 //[0.00 to 3.00] Green colour grading coefficient. Adjust to influence the Green channel coefficients of the grading, and highlight tones. -#define BlueGrading 1.10 //[0.00 to 3.00] Blue colour grading coefficient. Adjust to influence the Blue channel coefficients of the grading, and highlight tones. -#define GradingStrength 0.25 //[0.00 to 1.00] The overall max strength of the colour grading effect. Raise to increase, lower to decrease the amount. -#define Correlation 1.00 //[0.10 to 1.00] Correlation between the base colour, and the grading influence. Lower = more of the scene is graded, Higher = less of the scene is graded. - -//##[COLOR TEMPERATURE] -#define White_Point 6500.0 //[2000.0 to 12000.0] Temperature value given in Kelvin. A typical CRT has a target white point temperature of D93 (9300K) - -//##[CEL SHADING] -#define EdgeStrength 1.00 //[0.00 to 4.00] Overall strength of the cel edge outline effect. Affects the overall density. 0.00: no outlines. -#define EdgeFilter 0.75 //[0.10 to 2.00] Filters out fainter cel edges. Use it for balancing the cel edge density. EG: for faces, foliage, etc. -#define EdgeThickness 1.20 //[0.50 to 2.00] Thickness of the cel edges. Increase for thicker outlining. Note: when downsampling, raise this to keep the same thickness. -#define UseYuvLuma 0 //[0 or 1] Uses YUV luma calculations, or base color luma calculations. Yuv luma can produce a better shaded look. -#define ColorRounding 0 //[0 or 1] Uses rounding methods on colors. This can emphasise shaded toon colors. Looks good in some games, and odd in others. - -//##[PAINT SHADING] -#define PaintMethod 2 //[1 or 2] The algorithm used for paint effect. 1: water painting, 2: oil painting. You may want to readjust the radius between the two. -#define PaintRadius 4 //[2 to 8] Radius of the painted effect, increasing the radius also requires longer loops, so higher values require more performance. -#define PaintStrength 1.00 //[0.00 to 1.00] The overall interpolated strength of the paint effect. Where 1.0 equates to 100% strength. - -//##[CURVE_CONTRAST] -#define CurveType 0 //[0|1|2] Choose what to apply contrast to. 0 = Luma, 1 = Chroma, 2 = both Luma and Chroma. Default is 0 (Luma) -#define CurvesContrast 0.35 //[0.00 to 2.00] The amount of contrast you want. Controls the overall strength of the texture sharpening. - -//##[GAMMA_CORRECTION] -#define Gamma 2.20 //[1.5 to 4.0] Gamma correction. Decrease for lower gamma(darker). Increase for higher gamma(brighter). (Default: 2.2) - -//##[LOTTES_CRT] -#define MaskingType 1 //[1|2|3|4] The type of CRT shadow masking used. 1: compressed TV style, 2: Aperture-grille, 3: Stretched VGA style, 4: VGA style. -#define CRTSizeX 512.0 //[128 to 2048] A workaround for arbitrary render target scaling. Either set it to a fixed width, or set it to screenSize.x -#define CRTSizeY 448.0 //[128 to 2048] A workaround for arbitrary render target scaling. Either set it to a fixed height, or set it to screenSize.y -#define ScanBrightness -8.00 //[-16.0 to 1.0] The overall brightness of the scanline effect. Lower for darker, higher for brighter. -#define FilterCRTAmount -1.00 //[-4.0 to 1.0] The amount of filtering used, to replicate the TV CRT look. Lower for less, higher for more. -#define HorizontalWarp 0.00 //[0.0 to 0.1] The distortion warping effect for the horizontal (x) axis of the screen. Use small increments. -#define VerticalWarp 0.00 //[0.0 to 0.1] The distortion warping effect for the verticle (y) axis of the screen. Use small increments. -#define MaskAmountDark 0.80 //[0.0 to 1.0] The value of the dark masking line effect used. Lower for darker lower end masking, higher for brighter. -#define MaskAmountLight 1.50 //[0.0 to 2.0] The value of the light masking line effect used. Lower for darker higher end masking, higher for brighter. -#define ResolutionScale 2.00 //[0.1 to 4.0] The scale of the image resolution. Lowering this can give off a nice retro TV look. Raising it can clear up the image. -#define MaskResolutionScale 0.80 //[0.1 to 2.0] The scale of the CRT mask resolution. Use this for balancing the scanline mask scale for difference resolution scaling. -#define UseShadowMask 1 //[0 or 1] Enables, or disables the use of the CRT shadow mask. 0 is disabled, 1 is enabled. - -//##[SCANLINES] -#define ScanlineType 0 //[0|1|2] The type & orientation of the scanlines. 0 is x(horizontal), 1 is y(vertical), 2 is both(xy) -#define ScanlineScale 0.50 //[0.20 to 2.00] The scaling & thickness of the scanlines. Changing this can help with PCSX2 IR scaling problems. -#define ScanlineIntensity 0.18 //[0.10 to 1.00] The intensity of the scanlines. Defaults: 0.18 for ScanlineType 0|1|2, 0.50 for ScanlineType 3. -#define ScanlineBrightness 1.02 //[0.50 to 2.00] The brightness of the scanlines. Defaults: 2.00 for ScanlineType 0|1|2, 1.50 for ScanlineType 3. - -//##[VIGNETTE] -#define VignetteRatio 1.77 //[0.15 to 6.00] Sets the espect ratio of the vignette. 1.77 for 16:9, 1.60 for 16:10, 1.33 for 4:3, 1.00 for 1:1. -#define VignetteRadius 1.10 //[0.50 to 3.00] Radius of the vignette effect. Lower values for stronger radial effect from center -#define VignetteAmount 0.25 //[0.00 to 1.00] Strength of black edge occlusion. Increase for higher strength, decrease for lower. -#define VignetteSlope 12 //[2|4|8|10|12|16] How far away from the center the vignetting will start. - -//##[SUBPIXEL DITHERING] -#define DitherMethod 2 //[1 or 2] 1: Ordered grid dithering(faster), 2: random dithering(higher quality). Hardware dithering is also enabled by default. -#define ShowMethod 0 //[0 or 1] Shows the dithering method, based of the type of dithering selected. Useful for debugging, and confirmation of working order. - -//##[DEBANDING] -#define DebandRadius 32.0 //[0.0 to 1024.0] Sampling radius, higher values will reduce further banding but might also reduce details. -#define DebandThreshold 0.017 //[0.000 to 0.100] Threshold, higher values will reduce further banding but might also reduce details and increase noise. -#define DebandSampleCount 4 //[1 to 8] Sample count, higher values are better. But also have a higher performance cost. -#define DebandOffsetMode 3 //[1|2|3] 1 = cross (axis aligned, fast), 2 = diagonal (45 degrees, slower), 3 = box (fully random, slower). -#define DebandDithering 1 //[0|1|2|3] Additional dithering options to smoothen the output. 0 = No dithering 1 = Ordered dithering, 2 = Random dithering, 3 = Iestyn's RGB dither (Valve). - -//##[PX_BORDER] -#define BorderWidth float2(2, 2) //[0 to 2048, 0 to 2048] (X,Y)-width of the border. Measured in pixels. -#define BorderColor float3(0, 0, 0) //[0 to 255, 0 to 255, 0 to 255] What color the border should be. In integer RGB colors, meaning 0,0,0 is black and 255,255,255 is full white. - -//[END OF USER OPTIONS] diff --git a/build.sh b/build.sh index 30ccc70a90..830df500f0 100755 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/bin/sh # PCSX2 - PS2 Emulator for PCs -# Copyright (C) 2002-2014 PCSX2 Dev Team +# Copyright (C) 2002-2022 PCSX2 Dev Team # # PCSX2 is free software: you can redistribute it and/or modify it under the terms # of the GNU Lesser General Public License as published by the Free Software Found- @@ -118,13 +118,6 @@ run_clangtidy() exit 0 } -run_coverity() -{ - cov-build --dir "$coverity_dir" $make 2>&1 | tee -a "$log" - # Warning: $coverity_dir must be the root directory - (cd "$build"; tar caf $coverity_result "$coverity_dir") - exit 0 -} # Main script flags="-DCMAKE_BUILD_PO=FALSE" @@ -133,15 +126,12 @@ cleanBuild=0 useClang=0 useIcc=0 -CoverityBuild=0 cppcheck=0 clangTidy=0 root=$PWD/$(dirname "$0") log="$root/install_log.txt" build="$root/build" -coverity_dir="cov-int" -coverity_result=pcsx2-coverity.xz set_make @@ -169,7 +159,6 @@ for ARG in "$@"; do --no-portaudio ) flags="$flags -DPORTAUDIO_API=FALSE" ;; --no-simd ) flags="$flags -DDISABLE_ADVANCE_SIMD=TRUE" ;; --no-trans ) flags="$flags -DNO_TRANSLATION=TRUE" ;; - --coverity ) CoverityBuild=1; cleanBuild=1; ;; --vtune ) flags="$flags -DUSE_VTUNE=TRUE" ;; -D* ) flags="$flags $ARG" ;; @@ -206,7 +195,6 @@ for ARG in "$@"; do echo "--asan : Enable Address sanitizer." echo "--clang-tidy : Do a clang-tidy analysis. Results can be found in build directory." echo "--cppcheck : Do a cppcheck analysis. Results can be found in build directory." - echo "--coverity : Do a build for coverity." echo "--vtune : Plug GS with VTUNE." echo "--ftime-trace : Analyse build time. Clang only." @@ -245,10 +233,6 @@ if [ "$clangTidy" -eq 1 ] && command -v clang-tidy >/dev/null ; then run_clangtidy fi -if [ "$CoverityBuild" -eq 1 ] && command -v cov-build >/dev/null ; then - run_coverity -fi - $make 2>&1 | tee -a "$log" $make install 2>&1 | tee -a "$log" diff --git a/buildbot.xml b/buildbot.xml deleted file mode 100644 index e43ca3af11..0000000000 --- a/buildbot.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - true - BuildInParallel=True; - CreateHardLinksForCopyFilesToOutputDirectoryIfPossible=$(CreateHardLinksIfPossible); - CreateHardLinksForCopyAdditionalFilesIfPossible=$(CreateHardLinksIfPossible); - CreateHardLinksForCopyLocalIfPossible=$(CreateHardLinksIfPossible); - CreateHardLinksForPublishFilesIfPossible=$(CreateHardLinksIfPossible); - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Debug - - - - - - - - Devel - - - - - - - - Release - - - - - - diff --git a/cmake/ApiValidation.cmake b/cmake/ApiValidation.cmake index deb103d999..69451b7db2 100644 --- a/cmake/ApiValidation.cmake +++ b/cmake/ApiValidation.cmake @@ -84,38 +84,6 @@ int main() } ") -if (NOT PCSX2_CORE) - function(WX_vs_SDL) - file(WRITE "${CMAKE_BINARY_DIR}/wx_sdl.c" "${wx_sdl_c_code}") - enable_language(C) - - try_compile( - wx_linked_to_sdl - "${CMAKE_BINARY_DIR}" - "${CMAKE_BINARY_DIR}/wx_sdl.c" - CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${wxWidgets_INCLUDE_DIRS}" - LINK_LIBRARIES "${wxWidgets_LIBRARIES}" - COPY_FILE "${CMAKE_BINARY_DIR}/wx_sdl" - ) - - if (NOT wx_linked_to_sdl) - return() - endif() - - execute_process( - COMMAND ldd "${CMAKE_BINARY_DIR}/wx_sdl" - COMMAND grep -c SDL2 - OUTPUT_VARIABLE sdl2_count - ) - - if (SDL2_API AND sdl2_count STREQUAL "0") - message(FATAL_ERROR "wxWidgets is linked to SDL1.2. Please use -DSDL2_API=FALSE.") - elseif (NOT SDL2_API AND NOT sdl2_count STREQUAL "0") - message(FATAL_ERROR "wxWidgets is linked to SDL2. Please use -DSDL2_API=TRUE") - endif() - endfunction() -endif() - function(GCC7_BUG) # try_run doesn't work when cross-compiling is enabled. It is completely silly in our case # as i386 binaries are 100% fine on x64. diff --git a/cmake/BuildParameters.cmake b/cmake/BuildParameters.cmake index df05c46e30..a47da25817 100644 --- a/cmake/BuildParameters.cmake +++ b/cmake/BuildParameters.cmake @@ -38,6 +38,8 @@ if(DISABLE_BUILD_DATE OR openSUSE) endif() option(USE_VTUNE "Plug VTUNE to profile GS JIT.") +option(USE_ACHIEVEMENTS "Build with RetroAchievements support" ON) +option(USE_DISCORD_PRESENCE "Enable support for Discord Rich Presence" ON) #------------------------------------------------------------------------------- # Graphical option @@ -197,17 +199,30 @@ else() add_compile_options($<$:-fno-operator-names>) endif() +set(CONFIG_REL_NO_DEB $,$>) +set(CONFIG_ANY_REL $,$,$>) + if(WIN32) add_compile_definitions( $<$:_ITERATOR_DEBUG_LEVEL=2> $<$:_ITERATOR_DEBUG_LEVEL=1> - $<$:_ITERATOR_DEBUG_LEVEL=0> - $<$:_ITERATOR_DEBUG_LEVEL=0> - $<$:_ITERATOR_DEBUG_LEVEL=0> + $<${CONFIG_ANY_REL}:_ITERATOR_DEBUG_LEVEL=0> ) list(APPEND PCSX2_DEFS TIXML_USE_STL _SCL_SECURE_NO_WARNINGS _UNICODE UNICODE) endif() +if(MSVC) + # Enable PDB generation in release builds + add_compile_options( + $<${CONFIG_REL_NO_DEB}:/Zi> + ) + add_link_options( + $<${CONFIG_REL_NO_DEB}:/DEBUG> + $<${CONFIG_REL_NO_DEB}:/OPT:REF> + $<${CONFIG_REL_NO_DEB}:/OPT:ICF> + ) +endif() + if(USE_VTUNE) list(APPEND PCSX2_DEFS ENABLE_VTUNE) endif() diff --git a/cmake/FindLibc.cmake b/cmake/FindLibc.cmake index 81921280c0..d081fa326f 100644 --- a/cmake/FindLibc.cmake +++ b/cmake/FindLibc.cmake @@ -1,6 +1,6 @@ # Once done, this will define # -# LIBC_FOUND - system has libc +# LIBC_FOUND - system has libc # LIBC_LIBRARIES - link these to use libc if(LIBC_LIBRARIES) @@ -12,7 +12,7 @@ find_library(libm NAMES m) # OSX doesn't have rt. On Linux timer and aio dependency. if(APPLE) find_library(libdl NAMES dl) - set(LIBC_LIBRARIES ${librt} ${libdl} ${libm}) + set(LIBC_LIBRARIES ${librt} ${libdl} ${libm}) elseif(Linux) find_library(libdl NAMES dl) find_library(librt NAMES rt) @@ -23,7 +23,7 @@ else() set(LIBC_LIBRARIES ${librt} ${libm}) endif() -# handle the QUIETLY and REQUIRED arguments and set LIBC_FOUND to TRUE if +# handle the QUIETLY and REQUIRED arguments and set LIBC_FOUND to TRUE if # all listed variables are TRUE include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Libc DEFAULT_MSG LIBC_LIBRARIES) diff --git a/cmake/SearchForStuff.cmake b/cmake/SearchForStuff.cmake index 7047d4e981..c2f9aa61c0 100644 --- a/cmake/SearchForStuff.cmake +++ b/cmake/SearchForStuff.cmake @@ -31,7 +31,12 @@ else() set(OpenGL_GL_PREFERENCE GLVND) find_package(OpenGL REQUIRED) endif() + # On macOS, Mono.framework contains an ancient version of libpng. We don't want that. + # Avoid it by telling cmake to avoid finding frameworks while we search for libpng. + set(FIND_FRAMEWORK_BACKUP ${CMAKE_FIND_FRAMEWORK}) + set(CMAKE_FIND_FRAMEWORK NEVER) find_package(PNG REQUIRED) + set(CMAKE_FIND_FRAMEWORK ${FIND_FRAMEWORK_BACKUP}) find_package(Vtune) if(NOT PCSX2_CORE) @@ -81,7 +86,12 @@ else() endif() else() if (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") - set(wxWidgets_CONFIG_EXECUTABLE "/usr/local/bin/wxgtk3u-3.0-config") + if(EXISTS "/usr/local/bin/wxgtk3u-3.1-config") + set(wxWidgets_CONFIG_EXECUTABLE "/usr/local/bin/wxgtk3u-3.1-config") + endif() + if(EXISTS "/usr/local/bin/wxgtk3u-3.0-config") + set(wxWidgets_CONFIG_EXECUTABLE "/usr/local/bin/wxgtk3u-3.0-config") + endif() endif() if(EXISTS "/usr/bin/wx-config-3.2") set(wxWidgets_CONFIG_EXECUTABLE "/usr/bin/wx-config-3.2") @@ -123,7 +133,7 @@ else() if(X11_API) check_lib(X11_XCB X11-xcb X11/Xlib-xcb.h) check_lib(XCB xcb xcb/xcb.h) - check_lib(XRANDR xrandr) + check_lib(XRANDR Xrandr X11/extensions/Xrandr.h) endif() if(Linux) @@ -188,10 +198,6 @@ endif() #---------------------------------------- include(ApiValidation) -if(NOT PCSX2_CORE) - WX_vs_SDL() -endif() - # Blacklist bad GCC if(GCC_VERSION VERSION_EQUAL "7.0" OR GCC_VERSION VERSION_EQUAL "7.1") GCC7_BUG() @@ -218,7 +224,7 @@ find_optional_system_library(libzip 3rdparty/libzip 1.8.0) if(QT_BUILD) # Default to bundled Qt6 for Windows. if(WIN32 AND NOT DEFINED Qt6_DIR) - set(Qt6_DIR ${CMAKE_SOURCE_DIR}/3rdparty/qt/6.3.0/msvc2019_64/lib/cmake/Qt6) + set(Qt6_DIR ${CMAKE_SOURCE_DIR}/3rdparty/qt/6.4.0/msvc2022_64/lib/cmake/Qt6) endif() # Find the Qt components that we need. @@ -234,6 +240,21 @@ if(QT_BUILD) # We use the bundled (latest) SDL version for Qt. find_optional_system_library(SDL2 3rdparty/sdl2 2.0.22) + + # rcheevos backend for RetroAchievements. + if(USE_ACHIEVEMENTS) + add_subdirectory(3rdparty/rcheevos EXCLUDE_FROM_ALL) + endif() + + # Discord-RPC library for rich presence. + if(USE_DISCORD_PRESENCE) + add_subdirectory(3rdparty/rapidjson EXCLUDE_FROM_ALL) + add_subdirectory(3rdparty/discord-rpc EXCLUDE_FROM_ALL) + endif() +endif() + +if(NOT WIN32 AND QT_BUILD) + find_package(CURL REQUIRED) endif() add_subdirectory(3rdparty/lzma EXCLUDE_FROM_ALL) @@ -248,9 +269,19 @@ else() set(BIN2CPPDEP ${CMAKE_SOURCE_DIR}/linux_various/hex2h.pl) endif() +# rapidyaml includes fast_float as a submodule, saves us pulling it in directly. +# Normally, we'd just pull in the cmake project, and link to it, but... it seems to enable +# permissive mode, which breaks other parts of PCSX2. So, we'll just create a target here +# for now. +#add_subdirectory(3rdparty/rapidyaml/rapidyaml/ext/c4core/src/c4/ext/fast_float EXCLUDE_FROM_ALL) +add_library(fast_float INTERFACE) +target_include_directories(fast_float INTERFACE 3rdparty/rapidyaml/rapidyaml/ext/c4core/src/c4/ext/fast_float/include) + +add_subdirectory(3rdparty/jpgd EXCLUDE_FROM_ALL) add_subdirectory(3rdparty/simpleini EXCLUDE_FROM_ALL) add_subdirectory(3rdparty/imgui EXCLUDE_FROM_ALL) add_subdirectory(3rdparty/cpuinfo EXCLUDE_FROM_ALL) +add_subdirectory(3rdparty/zydis EXCLUDE_FROM_ALL) if(USE_OPENGL) add_subdirectory(3rdparty/glad EXCLUDE_FROM_ALL) diff --git a/common/Align.h b/common/Align.h index 9ddc0b15bc..1794476db9 100644 --- a/common/Align.h +++ b/common/Align.h @@ -89,4 +89,11 @@ namespace Common value++; return value; } + + template + static constexpr T PageAlign(T size) + { + static_assert(Common::IsPow2(__pagesize), "Page size is a power of 2"); + return Common::AlignUpPow2(size, __pagesize); + } } // namespace Common diff --git a/common/AlignedMalloc.cpp b/common/AlignedMalloc.cpp index adc76fdb8e..5db3b40246 100644 --- a/common/AlignedMalloc.cpp +++ b/common/AlignedMalloc.cpp @@ -28,6 +28,11 @@ void* _aligned_malloc(size_t size, size_t align) #if defined(__USE_ISOC11) && !defined(ASAN_WORKAROUND) // not supported yet on gcc 4.9 return aligned_alloc(align, size); #else +#ifdef __APPLE__ + // MacOS has a bug where posix_memalign is ridiculously slow on unaligned sizes + // This especially bad on M1s for some reason + size = (size + align - 1) & ~(align - 1); +#endif void* result = 0; posix_memalign(&result, align, size); return result; diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 2295beeca5..4925935237 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -19,16 +19,22 @@ target_sources(common PRIVATE Exceptions.cpp FastJmp.cpp FileSystem.cpp + Image.cpp + HTTPDownloader.cpp + MemorySettingsInterface.cpp Misc.cpp MD5Digest.cpp PrecompiledHeader.cpp Perf.cpp ProgressCallback.cpp + ReadbackSpinManager.cpp Semaphore.cpp SettingsWrapper.cpp StringUtil.cpp Timer.cpp + ThreadPool.cpp WindowInfo.cpp + emitter/avx.cpp emitter/bmi.cpp emitter/cpudetect.cpp emitter/fpu.cpp @@ -60,6 +66,7 @@ target_sources(common PRIVATE boost_spsc_queue.hpp Console.h CrashHandler.h + Easing.h EnumOps.h EventSource.h Exceptions.h @@ -67,7 +74,12 @@ target_sources(common PRIVATE FileSystem.h General.h HashCombine.h + HeterogeneousContainers.h + Image.h + LRUCache.h + HTTPDownloader.h MemcpyFast.h + MemorySettingsInterface.h MemsetFast.inl MD5Digest.h MRCHelpers.h @@ -75,6 +87,7 @@ target_sources(common PRIVATE PageFaultSource.h PrecompiledHeader.h ProgressCallback.h + ReadbackSpinManager.h RedtapeWindows.h SafeArray.h ScopedGuard.h @@ -83,6 +96,7 @@ target_sources(common PRIVATE StringUtil.h Timer.h Threading.h + ThreadPool.h TraceLog.h WindowInfo.h emitter/cpudetect_internal.h @@ -163,11 +177,13 @@ endif() if(WIN32) enable_language(ASM_MASM) target_sources(common PRIVATE FastJmp.asm) - target_link_libraries(common PUBLIC WIL::WIL D3D12MemAlloc Winmm.lib) + target_link_libraries(common PUBLIC WIL::WIL D3D12MemAlloc winmm) target_sources(common PRIVATE CrashHandler.cpp CrashHandler.h FastJmp.asm + HTTPDownloaderWinHTTP.cpp + HTTPDownloaderWinHTTP.h StackWalker.cpp StackWalker.h D3D11/ShaderCache.cpp @@ -261,12 +277,24 @@ if (USE_GCC AND CMAKE_INTERPROCEDURAL_OPTIMIZATION) set_source_files_properties(FastJmp.cpp PROPERTIES COMPILE_FLAGS -fno-lto) endif() +if(NOT WIN32 AND (QT_BUILD OR NOGUI_BUILD)) + # libcurl-based HTTPDownloader + target_sources(common PRIVATE + HTTPDownloaderCurl.cpp + HTTPDownloaderCurl.h + ) + target_link_libraries(common PRIVATE CURL::libcurl) +endif() + target_link_libraries(common PRIVATE ${LIBC_LIBRARIES} + PNG::PNG + jpgd ) target_link_libraries(common PUBLIC fmt::fmt + fast_float ) fixup_file_properties(common) diff --git a/common/CocoaTools.mm b/common/CocoaTools.mm index e81d2aaf21..90e1fedc2f 100644 --- a/common/CocoaTools.mm +++ b/common/CocoaTools.mm @@ -19,6 +19,7 @@ #include "CocoaTools.h" #include "Console.h" +#include "General.h" #include "WindowInfo.h" #include #include @@ -125,3 +126,12 @@ void CocoaTools::RemoveThemeChangeHandler(void* ctx) assert([NSThread isMainThread]); [s_themeChangeHandler removeCallback:ctx]; } + +// MARK: - Sound playback + +bool Common::PlaySoundAsync(const char* path) +{ + NSString* nspath = [[NSString alloc] initWithUTF8String:path]; + NSSound* sound = [[NSSound alloc] initWithContentsOfFile:nspath byReference:YES]; + return [sound play]; +} diff --git a/common/CrashHandler.cpp b/common/CrashHandler.cpp index 70269efa8b..9ee1c49230 100644 --- a/common/CrashHandler.cpp +++ b/common/CrashHandler.cpp @@ -21,7 +21,7 @@ #include #include -#if defined(_WIN32) && !defined(_UWP) +#if defined(_WIN32) #include "RedtapeWindows.h" #include "StackWalker.h" diff --git a/common/D3D12/Builders.cpp b/common/D3D12/Builders.cpp index b48c2d6677..7e0431f5f4 100644 --- a/common/D3D12/Builders.cpp +++ b/common/D3D12/Builders.cpp @@ -223,6 +223,56 @@ void GraphicsPipelineBuilder::SetDepthStencilFormat(DXGI_FORMAT format) m_desc.DSVFormat = format; } + +ComputePipelineBuilder::ComputePipelineBuilder() +{ + Clear(); +} + +void ComputePipelineBuilder::Clear() +{ + std::memset(&m_desc, 0, sizeof(m_desc)); +} + +wil::com_ptr_nothrow ComputePipelineBuilder::Create(ID3D12Device* device, bool clear /*= true*/) +{ + wil::com_ptr_nothrow ps; + HRESULT hr = device->CreateComputePipelineState(&m_desc, IID_PPV_ARGS(ps.put())); + if (FAILED(hr)) + { + Console.Error("CreateComputePipelineState() failed: %08X", hr); + return {}; + } + + if (clear) + Clear(); + + return ps; +} + +wil::com_ptr_nothrow ComputePipelineBuilder::Create(ID3D12Device* device, ShaderCache& cache, bool clear /*= true*/) +{ + wil::com_ptr_nothrow pso = cache.GetPipelineState(device, m_desc); + if (!pso) + return {}; + + if (clear) + Clear(); + + return pso; +} + +void ComputePipelineBuilder::SetRootSignature(ID3D12RootSignature* rs) +{ + m_desc.pRootSignature = rs; +} + +void ComputePipelineBuilder::SetShader(const void* data, u32 data_size) +{ + m_desc.CS.pShaderBytecode = data; + m_desc.CS.BytecodeLength = data_size; +} + RootSignatureBuilder::RootSignatureBuilder() { Clear(); diff --git a/common/D3D12/Builders.h b/common/D3D12/Builders.h index fe111a7358..625b1c0706 100644 --- a/common/D3D12/Builders.h +++ b/common/D3D12/Builders.h @@ -114,8 +114,26 @@ namespace D3D12 void SetDepthStencilFormat(DXGI_FORMAT format); private: - D3D12_GRAPHICS_PIPELINE_STATE_DESC m_desc{}; - std::array m_input_elements{}; + D3D12_GRAPHICS_PIPELINE_STATE_DESC m_desc; + std::array m_input_elements; + }; + + class ComputePipelineBuilder + { + public: + ComputePipelineBuilder(); + ~ComputePipelineBuilder() = default; + + void Clear(); + + wil::com_ptr_nothrow Create(ID3D12Device* device, bool clear = true); + wil::com_ptr_nothrow Create(ID3D12Device* device, ShaderCache& cache, bool clear = true); + + void SetRootSignature(ID3D12RootSignature* rs); + + void SetShader(const void* data, u32 data_size); + private: + D3D12_COMPUTE_PIPELINE_STATE_DESC m_desc; }; } // namespace D3D12 \ No newline at end of file diff --git a/common/D3D12/Context.cpp b/common/D3D12/Context.cpp index 4545dd5baa..b903cb904b 100644 --- a/common/D3D12/Context.cpp +++ b/common/D3D12/Context.cpp @@ -17,6 +17,7 @@ #include "common/D3D12/Context.h" #include "common/Assertions.h" +#include "common/General.h" #include "common/ScopedGuard.h" #include "common/Console.h" #include "D3D12MemAlloc.h" @@ -31,8 +32,6 @@ std::unique_ptr g_d3d12_context; using namespace D3D12; -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - // Private D3D12 state static HMODULE s_d3d12_library; static PFN_D3D12_CREATE_DEVICE s_d3d12_create_device; @@ -74,21 +73,6 @@ static void UnloadD3D12Library() } } -#else - -static const PFN_D3D12_CREATE_DEVICE s_d3d12_create_device = D3D12CreateDevice; -static const PFN_D3D12_GET_DEBUG_INTERFACE s_d3d12_get_debug_interface = D3D12GetDebugInterface; -static const PFN_D3D12_SERIALIZE_ROOT_SIGNATURE s_d3d12_serialize_root_signature = D3D12SerializeRootSignature; - -static bool LoadD3D12Library() -{ - return true; -} - -static void UnloadD3D12Library() {} - -#endif - Context::Context() = default; Context::~Context() @@ -399,7 +383,7 @@ void Context::MoveToNextCommandList() // We may have to wait if this command list hasn't finished on the GPU. CommandListResources& res = m_command_lists[m_current_command_list]; - WaitForFence(res.ready_fence_value); + WaitForFence(res.ready_fence_value, false); res.ready_fence_value = m_current_fence_value; res.init_command_list_used = false; @@ -462,7 +446,7 @@ ID3D12GraphicsCommandList4* Context::GetInitCommandList() return res.command_lists[0].get(); } -void Context::ExecuteCommandList(bool wait_for_completion) +void Context::ExecuteCommandList(WaitType wait_for_completion) { CommandListResources& res = m_command_lists[m_current_command_list]; HRESULT hr; @@ -502,8 +486,8 @@ void Context::ExecuteCommandList(bool wait_for_completion) pxAssertRel(SUCCEEDED(hr), "Signal fence"); MoveToNextCommandList(); - if (wait_for_completion) - WaitForFence(res.ready_fence_value); + if (wait_for_completion != WaitType::None) + WaitForFence(res.ready_fence_value, wait_for_completion == WaitType::Spin); } void Context::InvalidateSamplerGroups() @@ -564,7 +548,7 @@ void Context::DestroyPendingResources(CommandListResources& cmdlist) void Context::DestroyResources() { - ExecuteCommandList(true); + ExecuteCommandList(WaitType::Sleep); m_texture_stream_buffer.Destroy(false); m_descriptor_heap_manager.Free(&m_null_srv_descriptor); @@ -590,20 +574,30 @@ void Context::DestroyResources() m_device.reset(); } -void Context::WaitForFence(u64 fence) +void Context::WaitForFence(u64 fence, bool spin) { if (m_completed_fence_value >= fence) return; - // Try non-blocking check. - m_completed_fence_value = m_fence->GetCompletedValue(); - if (m_completed_fence_value < fence) + if (spin) { - // Fall back to event. - HRESULT hr = m_fence->SetEventOnCompletion(fence, m_fence_event); - pxAssertRel(SUCCEEDED(hr), "Set fence event on completion"); - WaitForSingleObject(m_fence_event, INFINITE); + u64 value; + while ((value = m_fence->GetCompletedValue()) < fence) + ShortSpin(); + m_completed_fence_value = value; + } + else + { + // Try non-blocking check. m_completed_fence_value = m_fence->GetCompletedValue(); + if (m_completed_fence_value < fence) + { + // Fall back to event. + HRESULT hr = m_fence->SetEventOnCompletion(fence, m_fence_event); + pxAssertRel(SUCCEEDED(hr), "Set fence event on completion"); + WaitForSingleObject(m_fence_event, INFINITE); + m_completed_fence_value = m_fence->GetCompletedValue(); + } } // Release resources for as many command lists which have completed. @@ -624,7 +618,7 @@ void Context::WaitForGPUIdle() u32 index = (m_current_command_list + 1) % NUM_COMMAND_LISTS; for (u32 i = 0; i < (NUM_COMMAND_LISTS - 1); i++) { - WaitForFence(m_command_lists[index].ready_fence_value); + WaitForFence(m_command_lists[index].ready_fence_value, false); index = (index + 1) % NUM_COMMAND_LISTS; } } diff --git a/common/D3D12/Context.h b/common/D3D12/Context.h index e58a4e9f77..d64be71dd7 100644 --- a/common/D3D12/Context.h +++ b/common/D3D12/Context.h @@ -122,11 +122,18 @@ namespace D3D12 /// Test for support for the specified texture format. bool SupportsTextureFormat(DXGI_FORMAT format); + enum class WaitType + { + None, ///< Don't wait (async) + Sleep, ///< Wait normally + Spin, ///< Wait by spinning + }; + /// Executes the current command list. - void ExecuteCommandList(bool wait_for_completion); + void ExecuteCommandList(WaitType wait_for_completion); /// Waits for a specific fence. - void WaitForFence(u64 fence); + void WaitForFence(u64 fence, bool spin); /// Waits for any in-flight command buffers to complete. void WaitForGPUIdle(); diff --git a/common/D3D12/ShaderCache.cpp b/common/D3D12/ShaderCache.cpp index 3690ed0aeb..f145ab6e08 100644 --- a/common/D3D12/ShaderCache.cpp +++ b/common/D3D12/ShaderCache.cpp @@ -23,10 +23,6 @@ #include -#ifdef _UWP -#include -#endif - using namespace D3D12; #pragma pack(push, 1) @@ -45,22 +41,7 @@ struct CacheIndexEntry }; #pragma pack(pop) -static bool CanUsePipelineCache() -{ -#ifdef _UWP - // GetCachedBlob crashes on XBox UWP for some reason... - const auto version_info = winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo(); - const auto device_family = version_info.DeviceFamily(); - return (device_family != L"Windows.Xbox"); -#else - return true; -#endif -} - -ShaderCache::ShaderCache() - : m_use_pipeline_cache(CanUsePipelineCache()) -{ -} +ShaderCache::ShaderCache() = default; ShaderCache::~ShaderCache() { @@ -111,7 +92,7 @@ bool ShaderCache::Open(std::string_view base_path, D3D_FEATURE_LEVEL feature_lev result = CreateNew(shader_index_filename, shader_blob_filename, m_shader_index_file, m_shader_blob_file); } - if (m_use_pipeline_cache && result) + if (result) { const std::string base_pipelines_filename = GetCacheBaseFileName(base_path, "pipelines", feature_level, debug); const std::string pipelines_index_filename = base_pipelines_filename + ".idx"; @@ -143,14 +124,11 @@ void ShaderCache::InvalidatePipelineCache() m_pipeline_index_file = nullptr; } - if (m_use_pipeline_cache) - { - const std::string base_pipelines_filename = - GetCacheBaseFileName(m_base_path, "pipelines", m_feature_level, m_debug); - const std::string pipelines_index_filename = base_pipelines_filename + ".idx"; - const std::string pipelines_blob_filename = base_pipelines_filename + ".bin"; - CreateNew(pipelines_index_filename, pipelines_blob_filename, m_pipeline_index_file, m_pipeline_blob_file); - } + const std::string base_pipelines_filename = + GetCacheBaseFileName(m_base_path, "pipelines", m_feature_level, m_debug); + const std::string pipelines_index_filename = base_pipelines_filename + ".idx"; + const std::string pipelines_blob_filename = base_pipelines_filename + ".bin"; + CreateNew(pipelines_index_filename, pipelines_blob_filename, m_pipeline_index_file, m_pipeline_blob_file); } bool ShaderCache::CreateNew(const std::string& index_filename, const std::string& blob_filename, std::FILE*& index_file, @@ -409,6 +387,23 @@ ShaderCache::CacheIndexKey ShaderCache::GetPipelineCacheKey(const D3D12_GRAPHICS return CacheIndexKey{h.low, h.high, 0, 0, 0, 0, length, EntryType::GraphicsPipeline}; } +ShaderCache::CacheIndexKey ShaderCache::GetPipelineCacheKey(const D3D12_COMPUTE_PIPELINE_STATE_DESC& gpdesc) +{ + MD5Digest digest; + u32 length = sizeof(D3D12_GRAPHICS_PIPELINE_STATE_DESC); + + if (gpdesc.CS.BytecodeLength > 0) + { + digest.Update(gpdesc.CS.pShaderBytecode, static_cast(gpdesc.CS.BytecodeLength)); + length += static_cast(gpdesc.CS.BytecodeLength); + } + + MD5Hash h; + digest.Final(h.hash); + + return CacheIndexKey{h.low, h.high, 0, 0, 0, 0, length, EntryType::ComputePipeline}; +} + ShaderCache::ComPtr ShaderCache::GetShaderBlob(EntryType type, std::string_view shader_code, const D3D_SHADER_MACRO* macros /* = nullptr */, const char* entry_point /* = "main" */) { @@ -463,6 +458,40 @@ ShaderCache::ComPtr ShaderCache::GetPipelineState(ID3D12Dev return pso; } +ShaderCache::ComPtr ShaderCache::GetPipelineState(ID3D12Device* device, + const D3D12_COMPUTE_PIPELINE_STATE_DESC& desc) +{ + const auto key = GetPipelineCacheKey(desc); + + auto iter = m_pipeline_index.find(key); + if (iter == m_pipeline_index.end()) + return CompileAndAddPipeline(device, key, desc); + + ComPtr blob; + HRESULT hr = D3DCreateBlob(iter->second.blob_size, blob.put()); + if (FAILED(hr) || std::fseek(m_pipeline_blob_file, iter->second.file_offset, SEEK_SET) != 0 || + std::fread(blob->GetBufferPointer(), 1, iter->second.blob_size, m_pipeline_blob_file) != iter->second.blob_size) + { + Console.Error("Read blob from file failed"); + return {}; + } + + D3D12_COMPUTE_PIPELINE_STATE_DESC desc_with_blob(desc); + desc_with_blob.CachedPSO.pCachedBlob = blob->GetBufferPointer(); + desc_with_blob.CachedPSO.CachedBlobSizeInBytes = blob->GetBufferSize(); + + ComPtr pso; + hr = device->CreateComputePipelineState(&desc_with_blob, IID_PPV_ARGS(pso.put())); + if (FAILED(hr)) + { + Console.Warning("Creating cached PSO failed: %08X. Invalidating cache.", hr); + InvalidatePipelineCache(); + pso = CompileAndAddPipeline(device, key, desc); + } + + return pso; +} + ShaderCache::ComPtr ShaderCache::CompileAndAddShaderBlob(const CacheIndexKey& key, std::string_view shader_code, const D3D_SHADER_MACRO* macros, const char* entry_point) { @@ -479,6 +508,9 @@ ShaderCache::ComPtr ShaderCache::CompileAndAddShaderBlob(const CacheIn case EntryType::PixelShader: blob = D3D11::ShaderCompiler::CompileShader(D3D11::ShaderCompiler::Type::Pixel, m_feature_level, m_debug, shader_code, macros, entry_point); break; + case EntryType::ComputeShader: + blob = D3D11::ShaderCompiler::CompileShader(D3D11::ShaderCompiler::Type::Compute, m_feature_level, m_debug, shader_code, macros, entry_point); + break; default: break; } @@ -529,15 +561,37 @@ ShaderCache::CompileAndAddPipeline(ID3D12Device* device, const CacheIndexKey& ke return {}; } + AddPipelineToBlob(key, pso.get()); + return pso; +} + +ShaderCache::ComPtr +ShaderCache::CompileAndAddPipeline(ID3D12Device* device, const CacheIndexKey& key, + const D3D12_COMPUTE_PIPELINE_STATE_DESC& gpdesc) +{ + ComPtr pso; + HRESULT hr = device->CreateComputePipelineState(&gpdesc, IID_PPV_ARGS(pso.put())); + if (FAILED(hr)) + { + Console.Error("Creating cached compute PSO failed: %08X", hr); + return {}; + } + + AddPipelineToBlob(key, pso.get()); + return pso; +} + +bool ShaderCache::AddPipelineToBlob(const CacheIndexKey& key, ID3D12PipelineState* pso) +{ if (!m_pipeline_blob_file || std::fseek(m_pipeline_blob_file, 0, SEEK_END) != 0) - return pso; + return false; ComPtr blob; - hr = pso->GetCachedBlob(blob.put()); + HRESULT hr = pso->GetCachedBlob(blob.put()); if (FAILED(hr)) { Console.Warning("Failed to get cached PSO data: %08X", hr); - return pso; + return false; } CacheIndexData data; @@ -557,9 +611,9 @@ ShaderCache::CompileAndAddPipeline(ID3D12Device* device, const CacheIndexKey& ke std::fflush(m_pipeline_index_file) != 0) { Console.Error("Failed to write pipeline blob to file"); - return pso; + return false; } m_shader_index.emplace(key, data); - return pso; + return true; } diff --git a/common/D3D12/ShaderCache.h b/common/D3D12/ShaderCache.h index 1d4aaec84a..48f5b9afa9 100644 --- a/common/D3D12/ShaderCache.h +++ b/common/D3D12/ShaderCache.h @@ -41,6 +41,7 @@ namespace D3D12 PixelShader, ComputeShader, GraphicsPipeline, + ComputePipeline, }; ShaderCache(); @@ -48,7 +49,6 @@ namespace D3D12 __fi D3D_FEATURE_LEVEL GetFeatureLevel() const { return m_feature_level; } __fi u32 GetDataVersion() const { return m_data_version; } - __fi bool UsingPipelineCache() const { return m_use_pipeline_cache; } __fi bool UsingDebugShaders() const { return m_debug; } bool Open(std::string_view base_path, D3D_FEATURE_LEVEL feature_level, u32 version, bool debug); @@ -78,6 +78,7 @@ namespace D3D12 const D3D_SHADER_MACRO* macros = nullptr, const char* entry_point = "main"); ComPtr GetPipelineState(ID3D12Device* device, const D3D12_GRAPHICS_PIPELINE_STATE_DESC& desc); + ComPtr GetPipelineState(ID3D12Device* device, const D3D12_COMPUTE_PIPELINE_STATE_DESC& desc); private: static constexpr u32 FILE_VERSION = 1; @@ -121,6 +122,7 @@ namespace D3D12 static CacheIndexKey GetShaderCacheKey(EntryType type, const std::string_view& shader_code, const D3D_SHADER_MACRO* macros, const char* entry_point); static CacheIndexKey GetPipelineCacheKey(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& gpdesc); + static CacheIndexKey GetPipelineCacheKey(const D3D12_COMPUTE_PIPELINE_STATE_DESC& gpdesc); bool CreateNew(const std::string& index_filename, const std::string& blob_filename, std::FILE*& index_file, std::FILE*& blob_file); @@ -133,6 +135,9 @@ namespace D3D12 const D3D_SHADER_MACRO* macros, const char* entry_point); ComPtr CompileAndAddPipeline(ID3D12Device* device, const CacheIndexKey& key, const D3D12_GRAPHICS_PIPELINE_STATE_DESC& gpdesc); + ComPtr CompileAndAddPipeline(ID3D12Device* device, const CacheIndexKey& key, + const D3D12_COMPUTE_PIPELINE_STATE_DESC& gpdesc); + bool AddPipelineToBlob(const CacheIndexKey& key, ID3D12PipelineState* pso); std::string m_base_path; @@ -146,7 +151,6 @@ namespace D3D12 D3D_FEATURE_LEVEL m_feature_level = D3D_FEATURE_LEVEL_11_0; u32 m_data_version = 0; - bool m_use_pipeline_cache = false; bool m_debug = false; }; } // namespace D3D12 diff --git a/common/D3D12/StreamBuffer.cpp b/common/D3D12/StreamBuffer.cpp index 971158d368..692e04c620 100644 --- a/common/D3D12/StreamBuffer.cpp +++ b/common/D3D12/StreamBuffer.cpp @@ -273,7 +273,7 @@ bool StreamBuffer::WaitForClearSpace(u32 num_bytes) return false; // Wait until this fence is signaled. This will fire the callback, updating the GPU position. - g_d3d12_context->WaitForFence(iter->first); + g_d3d12_context->WaitForFence(iter->first, false); m_tracked_fences.erase(m_tracked_fences.begin(), m_current_offset == iter->second ? m_tracked_fences.end() : ++iter); m_current_offset = new_offset; m_current_space = new_space; diff --git a/common/D3D12/Texture.cpp b/common/D3D12/Texture.cpp index 322eedf1cb..62b5da9b15 100644 --- a/common/D3D12/Texture.cpp +++ b/common/D3D12/Texture.cpp @@ -47,22 +47,22 @@ Texture::Texture(Texture&& texture) : m_resource(std::move(texture.m_resource)) , m_allocation(std::move(texture.m_allocation)) , m_srv_descriptor(texture.m_srv_descriptor) - , m_rtv_or_dsv_descriptor(texture.m_rtv_or_dsv_descriptor) + , m_write_descriptor(texture.m_write_descriptor) , m_width(texture.m_width) , m_height(texture.m_height) , m_levels(texture.m_levels) , m_format(texture.m_format) , m_state(texture.m_state) - , m_is_depth_view(texture.m_is_depth_view) + , m_write_descriptor_type(texture.m_write_descriptor_type) { texture.m_srv_descriptor = {}; - texture.m_rtv_or_dsv_descriptor = {}; + texture.m_write_descriptor = {}; texture.m_width = 0; texture.m_height = 0; texture.m_levels = 0; texture.m_format = DXGI_FORMAT_UNKNOWN; texture.m_state = D3D12_RESOURCE_STATE_COMMON; - texture.m_is_depth_view = false; + texture.m_write_descriptor_type = WriteDescriptorType::None; } Texture::~Texture() @@ -76,21 +76,21 @@ Texture& Texture::operator=(Texture&& texture) m_resource = std::move(texture.m_resource); m_allocation = std::move(texture.m_allocation); m_srv_descriptor = texture.m_srv_descriptor; - m_rtv_or_dsv_descriptor = texture.m_rtv_or_dsv_descriptor; + m_write_descriptor = texture.m_write_descriptor; m_width = texture.m_width; m_height = texture.m_height; m_levels = texture.m_levels; m_format = texture.m_format; m_state = texture.m_state; - m_is_depth_view = texture.m_is_depth_view; + m_write_descriptor_type = texture.m_write_descriptor_type; texture.m_srv_descriptor = {}; - texture.m_rtv_or_dsv_descriptor = {}; + texture.m_write_descriptor = {}; texture.m_width = 0; texture.m_height = 0; texture.m_levels = 0; texture.m_format = DXGI_FORMAT_UNKNOWN; texture.m_state = D3D12_RESOURCE_STATE_COMMON; - texture.m_is_depth_view = false; + texture.m_write_descriptor_type = WriteDescriptorType::None; return *this; } @@ -149,8 +149,8 @@ bool Texture::Create(u32 width, u32 height, u32 levels, DXGI_FORMAT format, DXGI return false; } - DescriptorHandle srv_descriptor, rtv_descriptor; - bool is_depth_view = false; + DescriptorHandle srv_descriptor, write_descriptor; + WriteDescriptorType write_descriptor_type = WriteDescriptorType::None; if (srv_format != DXGI_FORMAT_UNKNOWN) { if (!CreateSRVDescriptor(resource.get(), levels, srv_format, &srv_descriptor)) @@ -159,22 +159,32 @@ bool Texture::Create(u32 width, u32 height, u32 levels, DXGI_FORMAT format, DXGI if (rtv_format != DXGI_FORMAT_UNKNOWN) { - pxAssert(dsv_format == DXGI_FORMAT_UNKNOWN); - if (!CreateRTVDescriptor(resource.get(), rtv_format, &rtv_descriptor)) + pxAssert(dsv_format == DXGI_FORMAT_UNKNOWN && !(flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS)); + write_descriptor_type = Texture::WriteDescriptorType::RTV; + if (!CreateRTVDescriptor(resource.get(), rtv_format, &write_descriptor)) { - g_d3d12_context->GetDescriptorHeapManager().Free(&srv_descriptor); - return false; - } - } - else if (dsv_format != DXGI_FORMAT_UNKNOWN) - { - if (!CreateDSVDescriptor(resource.get(), dsv_format, &rtv_descriptor)) - { - g_d3d12_context->GetDescriptorHeapManager().Free(&srv_descriptor); + g_d3d12_context->GetRTVHeapManager().Free(&srv_descriptor); return false; } - is_depth_view = true; + } + else if (dsv_format != DXGI_FORMAT_UNKNOWN && !(flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS)) + { + write_descriptor_type = Texture::WriteDescriptorType::DSV; + if (!CreateDSVDescriptor(resource.get(), dsv_format, &write_descriptor)) + { + g_d3d12_context->GetDSVHeapManager().Free(&srv_descriptor); + return false; + } + } + else if (flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS) + { + write_descriptor_type = Texture::WriteDescriptorType::UAV; + if (!CreateUAVDescriptor(resource.get(), dsv_format, &write_descriptor)) + { + g_d3d12_context->GetDescriptorHeapManager().Free(&srv_descriptor); + return false; + } } Destroy(true); @@ -182,13 +192,13 @@ bool Texture::Create(u32 width, u32 height, u32 levels, DXGI_FORMAT format, DXGI m_resource = std::move(resource); m_allocation = std::move(allocation); m_srv_descriptor = std::move(srv_descriptor); - m_rtv_or_dsv_descriptor = std::move(rtv_descriptor); + m_write_descriptor = std::move(write_descriptor); m_width = width; m_height = height; m_levels = levels; m_format = format; m_state = state; - m_is_depth_view = is_depth_view; + m_write_descriptor_type = write_descriptor_type; return true; } @@ -197,7 +207,8 @@ bool Texture::Adopt(ComPtr texture, DXGI_FORMAT srv_format, DXGI { const D3D12_RESOURCE_DESC desc(texture->GetDesc()); - DescriptorHandle srv_descriptor, rtv_descriptor; + DescriptorHandle srv_descriptor, write_descriptor; + WriteDescriptorType write_descriptor_type = WriteDescriptorType::None; if (srv_format != DXGI_FORMAT_UNKNOWN) { if (!CreateSRVDescriptor(texture.get(), desc.MipLevels, srv_format, &srv_descriptor)) @@ -207,15 +218,26 @@ bool Texture::Adopt(ComPtr texture, DXGI_FORMAT srv_format, DXGI if (rtv_format != DXGI_FORMAT_UNKNOWN) { pxAssert(dsv_format == DXGI_FORMAT_UNKNOWN); - if (!CreateRTVDescriptor(texture.get(), rtv_format, &rtv_descriptor)) + write_descriptor_type = Texture::WriteDescriptorType::RTV; + if (!CreateRTVDescriptor(texture.get(), rtv_format, &write_descriptor)) { - g_d3d12_context->GetDescriptorHeapManager().Free(&srv_descriptor); + g_d3d12_context->GetRTVHeapManager().Free(&srv_descriptor); return false; } } else if (dsv_format != DXGI_FORMAT_UNKNOWN) { - if (!CreateDSVDescriptor(texture.get(), dsv_format, &rtv_descriptor)) + write_descriptor_type = Texture::WriteDescriptorType::DSV; + if (!CreateDSVDescriptor(texture.get(), dsv_format, &write_descriptor)) + { + g_d3d12_context->GetDSVHeapManager().Free(&srv_descriptor); + return false; + } + } + else if (desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS) + { + write_descriptor_type = Texture::WriteDescriptorType::UAV; + if (!CreateUAVDescriptor(texture.get(), srv_format, &write_descriptor)) { g_d3d12_context->GetDescriptorHeapManager().Free(&srv_descriptor); return false; @@ -225,7 +247,8 @@ bool Texture::Adopt(ComPtr texture, DXGI_FORMAT srv_format, DXGI m_resource = std::move(texture); m_allocation.reset(); m_srv_descriptor = std::move(srv_descriptor); - m_rtv_or_dsv_descriptor = std::move(rtv_descriptor); + m_write_descriptor = std::move(write_descriptor); + m_write_descriptor_type = write_descriptor_type; m_width = static_cast(desc.Width); m_height = desc.Height; m_levels = desc.MipLevels; @@ -239,10 +262,23 @@ void Texture::Destroy(bool defer /* = true */) if (defer) { g_d3d12_context->DeferDescriptorDestruction(g_d3d12_context->GetDescriptorHeapManager(), &m_srv_descriptor); - if (m_is_depth_view) - g_d3d12_context->DeferDescriptorDestruction(g_d3d12_context->GetDSVHeapManager(), &m_rtv_or_dsv_descriptor); - else - g_d3d12_context->DeferDescriptorDestruction(g_d3d12_context->GetRTVHeapManager(), &m_rtv_or_dsv_descriptor); + + switch (m_write_descriptor_type) + { + case Texture::WriteDescriptorType::RTV: + g_d3d12_context->DeferDescriptorDestruction(g_d3d12_context->GetRTVHeapManager(), &m_write_descriptor); + break; + case Texture::WriteDescriptorType::DSV: + g_d3d12_context->DeferDescriptorDestruction(g_d3d12_context->GetDSVHeapManager(), &m_write_descriptor); + break; + case Texture::WriteDescriptorType::UAV: + g_d3d12_context->DeferDescriptorDestruction(g_d3d12_context->GetDescriptorHeapManager(), &m_write_descriptor); + break; + case Texture::WriteDescriptorType::None: + default: + break; + } + g_d3d12_context->DeferResourceDestruction(m_allocation.get(), m_resource.get()); m_resource.reset(); m_allocation.reset(); @@ -250,10 +286,22 @@ void Texture::Destroy(bool defer /* = true */) else { g_d3d12_context->GetDescriptorHeapManager().Free(&m_srv_descriptor); - if (m_is_depth_view) - g_d3d12_context->GetDSVHeapManager().Free(&m_rtv_or_dsv_descriptor); - else - g_d3d12_context->GetRTVHeapManager().Free(&m_rtv_or_dsv_descriptor); + + switch (m_write_descriptor_type) + { + case Texture::WriteDescriptorType::RTV: + g_d3d12_context->GetRTVHeapManager().Free(&m_write_descriptor); + break; + case Texture::WriteDescriptorType::DSV: + g_d3d12_context->GetDSVHeapManager().Free(&m_write_descriptor); + break; + case Texture::WriteDescriptorType::UAV: + g_d3d12_context->GetDescriptorHeapManager().Free(&m_write_descriptor); + break; + case Texture::WriteDescriptorType::None: + default: + break; + } m_resource.reset(); m_allocation.reset(); @@ -263,7 +311,7 @@ void Texture::Destroy(bool defer /* = true */) m_height = 0; m_levels = 0; m_format = DXGI_FORMAT_UNKNOWN; - m_is_depth_view = false; + m_write_descriptor_type = WriteDescriptorType::None; } void Texture::TransitionToState(ID3D12GraphicsCommandList* cmdlist, D3D12_RESOURCE_STATES state) @@ -293,7 +341,7 @@ ID3D12GraphicsCommandList* Texture::BeginStreamUpdate(ID3D12GraphicsCommandList* { DevCon.WriteLn("Executing command buffer while waiting for %u bytes (%ux%u) in upload buffer", upload_size, width, height); - g_d3d12_context->ExecuteCommandList(false); + g_d3d12_context->ExecuteCommandList(Context::WaitType::None); if (!g_d3d12_context->GetTextureStreamBuffer().ReserveMemory(upload_size, D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT)) { Console.Error("Failed to reserve %u bytes for %ux%u upload", upload_size, width, height); @@ -448,3 +496,16 @@ bool Texture::CreateDSVDescriptor(ID3D12Resource* resource, DXGI_FORMAT format, g_d3d12_context->GetDevice()->CreateDepthStencilView(resource, &desc, dh->cpu_handle); return true; } + +bool Texture::CreateUAVDescriptor(ID3D12Resource* resource, DXGI_FORMAT format, DescriptorHandle* dh) +{ + if (!g_d3d12_context->GetDescriptorHeapManager().Allocate(dh)) + { + Console.Error("Failed to allocate UAV descriptor"); + return false; + } + + const D3D12_UNORDERED_ACCESS_VIEW_DESC desc = {format, D3D12_UAV_DIMENSION_TEXTURE2D}; + g_d3d12_context->GetDevice()->CreateUnorderedAccessView(resource, nullptr, &desc, dh->cpu_handle); + return true; +} \ No newline at end of file diff --git a/common/D3D12/Texture.h b/common/D3D12/Texture.h index 1e1a608110..8f936cd195 100644 --- a/common/D3D12/Texture.h +++ b/common/D3D12/Texture.h @@ -46,7 +46,7 @@ namespace D3D12 __fi ID3D12Resource* GetResource() const { return m_resource.get(); } __fi D3D12MA::Allocation* GetAllocation() const { return m_allocation.get(); } __fi const DescriptorHandle& GetSRVDescriptor() const { return m_srv_descriptor; } - __fi const DescriptorHandle& GetRTVOrDSVDescriptor() const { return m_rtv_or_dsv_descriptor; } + __fi const DescriptorHandle& GetWriteDescriptor() const { return m_write_descriptor; } __fi D3D12_RESOURCE_STATES GetState() const { return m_state; } __fi u32 GetWidth() const { return m_width; } @@ -83,11 +83,20 @@ namespace D3D12 static bool CreateSRVDescriptor(ID3D12Resource* resource, u32 levels, DXGI_FORMAT format, DescriptorHandle* dh); static bool CreateRTVDescriptor(ID3D12Resource* resource, DXGI_FORMAT format, DescriptorHandle* dh); static bool CreateDSVDescriptor(ID3D12Resource* resource, DXGI_FORMAT format, DescriptorHandle* dh); + static bool CreateUAVDescriptor(ID3D12Resource* resource, DXGI_FORMAT format, DescriptorHandle* dh); + + enum class WriteDescriptorType : u8 + { + None, + RTV, + DSV, + UAV + }; ComPtr m_resource; ComPtr m_allocation; DescriptorHandle m_srv_descriptor = {}; - DescriptorHandle m_rtv_or_dsv_descriptor = {}; + DescriptorHandle m_write_descriptor = {}; u32 m_width = 0; u32 m_height = 0; u32 m_levels = 0; @@ -95,6 +104,6 @@ namespace D3D12 D3D12_RESOURCE_STATES m_state = D3D12_RESOURCE_STATE_COMMON; - bool m_is_depth_view = false; + WriteDescriptorType m_write_descriptor_type = WriteDescriptorType::None; }; } // namespace D3D12 \ No newline at end of file diff --git a/common/Darwin/DarwinMisc.cpp b/common/Darwin/DarwinMisc.cpp index cad0cb42be..401d40e46f 100644 --- a/common/Darwin/DarwinMisc.cpp +++ b/common/Darwin/DarwinMisc.cpp @@ -24,6 +24,7 @@ #include "common/Pcsx2Types.h" #include "common/General.h" +#include "common/WindowInfo.h" // Darwin (OSX) is a bit different from Linux when requesting properties of // the OS because of its BSD/Mach heritage. Helpfully, most of this code @@ -96,7 +97,7 @@ std::string GetOSVersionString() static IOPMAssertionID s_pm_assertion; -void ScreensaverAllow(bool allow) +bool WindowInfo::InhibitScreensaver(const WindowInfo& wi, bool inhibit) { if (s_pm_assertion) { @@ -104,7 +105,9 @@ void ScreensaverAllow(bool allow) s_pm_assertion = 0; } - if (!allow) + if (inhibit) IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, kIOPMAssertionLevelOn, CFSTR("Playing a game"), &s_pm_assertion); + + return true; } #endif diff --git a/common/Darwin/DarwinSemaphore.cpp b/common/Darwin/DarwinSemaphore.cpp index d3642e69bd..3d0c544abb 100644 --- a/common/Darwin/DarwinSemaphore.cpp +++ b/common/Darwin/DarwinSemaphore.cpp @@ -42,16 +42,10 @@ static void MACH_CHECK(kern_return_t mach_retval) { - switch (mach_retval) + if (mach_retval != KERN_SUCCESS) { - case KERN_SUCCESS: - break; - case KERN_ABORTED: // Awoken due reason unrelated to semaphore (e.g. pthread_cancel) - pthread_testcancel(); // Unlike sem_wait, mach semaphore ops aren't cancellation points - // fallthrough - default: - fprintf(stderr, "mach error: %s", mach_error_string(mach_retval)); - assert(mach_retval == KERN_SUCCESS); + fprintf(stderr, "mach error: %s", mach_error_string(mach_retval)); + assert(mach_retval == KERN_SUCCESS); } } diff --git a/common/Easing.h b/common/Easing.h new file mode 100644 index 0000000000..8284ccfccb --- /dev/null +++ b/common/Easing.h @@ -0,0 +1,258 @@ +#pragma once +#include "Pcsx2Defs.h" +#include + +// From https://github.com/nicolausYes/easing-functions/blob/master/src/easing.cpp + +namespace Easing { +static constexpr float pi = 3.1415926545f; + +template +__ri static T InSine(T t) +{ + return std::sin(1.5707963f * t); +} + +template +__ri static T OutSine(T t) +{ + return 1 + std::sin(1.5707963f * (--t)); +} + +template +__ri static T InOutSine(T t) +{ + return 0.5f * (1 + std::sin(3.1415926f * (t - 0.5f))); +} + +template +__ri static T InQuad(T t) +{ + return t * t; +} + +template +__ri static T OutQuad(T t) +{ + return t * (2 - t); +} + +template +__ri static T InOutQuad(T t) +{ + return t < 0.5f ? 2 * t * t : t * (4 - 2 * t) - 1; +} + +template +__ri static T InCubic(T t) +{ + return t * t * t; +} + +template +__ri static T OutCubic(T t) +{ + return 1 + (--t) * t * t; +} + +template +__ri static T InOutCubic(T t) +{ + return t < 0.5f ? 4 * t * t * t : 1 + (--t) * (2 * (--t)) * (2 * t); +} + +template +__ri static T InQuart(T t) +{ + t *= t; + return t * t; +} + +template +__ri static T OutQuart(T t) +{ + t = (--t) * t; + return 1 - t * t; +} + +template +__ri static T InOutQuart(T t) +{ + if (t < 0.5) + { + t *= t; + return 8 * t * t; + } + else + { + t = (--t) * t; + return 1 - 8 * t * t; + } +} + +template +__ri static T InQuint(T t) +{ + T t2 = t * t; + return t * t2 * t2; +} + +template +__ri static T OutQuint(T t) +{ + T t2 = (--t) * t; + return 1 + t * t2 * t2; +} + +template +__ri static T InOutQuint(T t) +{ + T t2; + if (t < 0.5) + { + t2 = t * t; + return 16 * t * t2 * t2; + } + else + { + t2 = (--t) * t; + return 1 + 16 * t * t2 * t2; + } +} + +template +__ri static T InExpo(T t) +{ + return (std::pow(2, 8 * t) - 1) / 255; +} + +template +__ri static T OutExpo(T t) +{ + return 1 - std::pow(2, -8 * t); +} + +template +__ri static T InOutExpo(T t) +{ + if (t < 0.5f) + { + return (std::pow(2, 16 * t) - 1) / 510; + } + else + { + return 1 - 0.5f * std::pow(2, -16 * (t - 0.5f)); + } +} + +template +__ri static T InCirc(T t) +{ + return 1 - std::sqrt(1 - t); +} + +template +__ri static T OutCirc(T t) +{ + return std::sqrt(t); +} + +template +__ri static T InOutCirc(T t) +{ + if (t < 0.5f) + { + return (1 - std::sqrt(1 - 2 * t)) * 0.5f; + } + else + { + return (1 + std::sqrt(2 * t - 1)) * 0.5f; + } +} + +template +__ri static T InBack(T t) +{ + return t * t * (2.70158f * t - 1.70158f); +} + +template +static T OutBack(T t) +{ + t -= 1; + return 1 + t * t * (2.70158f * t + 1.70158f); +} + +template +__ri static T InOutBack(T t) +{ + if (t < 0.5f) + { + return t * t * (7 * t - 2.5f) * 2; + } + else + { + return 1 + (--t) * t * 2 * (7 * t + 2.5f); + } +} + +template +__ri static T InElastic(T t) +{ + T t2 = t * t; + return t2 * t2 * std::sin(t * pi * 4.5f); +} + +template +__ri static T OutElastic(T t) +{ + T t2 = (t - 1) * (t - 1); + return 1 - t2 * t2 * std::cos(t * pi * 4.5f); +} + +template +__ri static T InOutElastic(T t) +{ + T t2; + if (t < 0.45f) + { + t2 = t * t; + return 8 * t2 * t2 * std::sin(t * pi * 9); + } + else if (t < 0.55f) + { + return 0.5f + 0.75f * std::sin(t * pi * 4); + } + else + { + t2 = (t - 1) * (t - 1); + return 1 - 8 * t2 * t2 * std::sin(t * pi * 9); + } +} + +template +__ri static T InBounce(T t) +{ + return std::pow(2, 6 * (t - 1)) * std::abs(sin(t * pi * 3.5f)); +} + +template +__ri static T OutBounce(T t) +{ + return 1 - std::pow(2, -6 * t) * std::abs(std::cos(t * pi * 3.5f)); +} + +template +__ri static T InOutBounce(T t) +{ + if (t < 0.5f) + { + return 8 * std::pow(2, 8 * (t - 1)) * std::abs(std::sin(t * pi * 7)); + } + else + { + return 1 - 8 * std::pow(2, -8 * t) * std::abs(std::sin(t * pi * 7)); + } +} + +} // namespace Easing diff --git a/common/Exceptions.cpp b/common/Exceptions.cpp index f756068330..67df17be42 100644 --- a/common/Exceptions.cpp +++ b/common/Exceptions.cpp @@ -47,7 +47,7 @@ static std::mutex s_assertion_failed_mutex; static inline void FreezeThreads(void** handle) { -#if defined(_WIN32) && !defined(_UWP) +#if defined(_WIN32) HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (snapshot != INVALID_HANDLE_VALUE) { @@ -77,7 +77,7 @@ static inline void FreezeThreads(void** handle) static inline void ResumeThreads(void* handle) { -#if defined(_WIN32) && !defined(_UWP) +#if defined(_WIN32) if (handle != INVALID_HANDLE_VALUE) { THREADENTRY32 threadEntry; @@ -112,7 +112,7 @@ void pxOnAssertFail(const char* file, int line, const char* func, const char* ms char full_msg[512]; std::snprintf(full_msg, sizeof(full_msg), "%s:%d: assertion failed in function %s: %s\n", file, line, func, msg); -#if defined(_WIN32) && !defined(_UWP) +#if defined(_WIN32) HANDLE error_handle = GetStdHandle(STD_ERROR_HANDLE); if (error_handle != INVALID_HANDLE_VALUE) WriteConsoleA(GetStdHandle(STD_ERROR_HANDLE), full_msg, static_cast(std::strlen(full_msg)), NULL, NULL); @@ -201,84 +201,6 @@ Exception::RuntimeError::RuntimeError(const std::exception& ex, const char* pref ex.what())); } -// -------------------------------------------------------------------------------------- -// Exception::OutOfMemory (implementations) -// -------------------------------------------------------------------------------------- -Exception::OutOfMemory::OutOfMemory(std::string allocdesc) - : AllocDescription(std::move(allocdesc)) -{ -} - -std::string Exception::OutOfMemory::FormatDiagnosticMessage() const -{ - std::string retmsg; - retmsg = "Out of memory"; - if (!AllocDescription.empty()) - fmt::format_to(std::back_inserter(retmsg), " while allocating '{}'", AllocDescription); - - if (!m_message_diag.empty()) - fmt::format_to(std::back_inserter(retmsg), ":\n{}", m_message_diag); - - return retmsg; -} - -std::string Exception::OutOfMemory::FormatDisplayMessage() const -{ - std::string retmsg; - retmsg = "Oh noes! Out of memory!"; - - if (!m_message_user.empty()) - fmt::format_to(std::back_inserter(retmsg), "\n\n{}", m_message_user); - - return retmsg; -} - - -// -------------------------------------------------------------------------------------- -// Exception::VirtualMemoryMapConflict (implementations) -// -------------------------------------------------------------------------------------- -Exception::VirtualMemoryMapConflict::VirtualMemoryMapConflict(std::string allocdesc) -{ - AllocDescription = std::move(allocdesc); - m_message_user = "Virtual memory mapping failure! Your system may have conflicting device drivers, services, or may simply have insufficient memory or resources to meet PCSX2's lofty needs."; -} - -std::string Exception::VirtualMemoryMapConflict::FormatDiagnosticMessage() const -{ - std::string retmsg; - retmsg = "Virtual memory map failed"; - if (!AllocDescription.empty()) - fmt::format_to(std::back_inserter(retmsg), " while reserving '{}'", AllocDescription); - - if (!m_message_diag.empty()) - fmt::format_to(std::back_inserter(retmsg), ":\n{}", m_message_diag); - - return retmsg; -} - -std::string Exception::VirtualMemoryMapConflict::FormatDisplayMessage() const -{ - std::string retmsg; - retmsg = "There is not enough virtual memory available, or necessary virtual memory mappings have already been reserved by other processes, services, or DLLs."; - - if (!m_message_diag.empty()) - fmt::format_to(std::back_inserter(retmsg), "\n\n{}", m_message_diag); - - return retmsg; -} - - -// ------------------------------------------------------------------------ -std::string Exception::CancelEvent::FormatDiagnosticMessage() const -{ - return "Action canceled: " + m_message_diag; -} - -std::string Exception::CancelEvent::FormatDisplayMessage() const -{ - return "Action canceled: " + m_message_diag; -} - // -------------------------------------------------------------------------------------- // Exception::BadStream (implementations) // -------------------------------------------------------------------------------------- @@ -402,7 +324,7 @@ std::string Exception::EndOfStream::FormatDisplayMessage() const // Translates an Errno code into an exception. // Throws an exception based on the given error code (usually taken from ANSI C's errno) -BaseException* Exception::FromErrno(std::string streamname, int errcode) +std::unique_ptr Exception::FromErrno(std::string streamname, int errcode) { pxAssumeDev(errcode != 0, "Invalid NULL error code? (errno)"); @@ -410,27 +332,27 @@ BaseException* Exception::FromErrno(std::string streamname, int errcode) { case EINVAL: pxFailDev("Invalid argument"); - return &(new Exception::BadStream(streamname))->SetDiagMsg("Invalid argument? (likely caused by an unforgivable programmer error!)"); + return std::unique_ptr(&(new Exception::BadStream(streamname))->SetDiagMsg("Invalid argument? (likely caused by an unforgivable programmer error!)")); case EACCES: // Access denied! - return new Exception::AccessDenied(streamname); + return std::unique_ptr(new Exception::AccessDenied(streamname)); case EMFILE: // Too many open files! - return &(new Exception::CannotCreateStream(streamname))->SetDiagMsg("Too many open files"); // File handle allocation failure + return std::unique_ptr(&(new Exception::CannotCreateStream(streamname))->SetDiagMsg("Too many open files")); // File handle allocation failure case EEXIST: - return &(new Exception::CannotCreateStream(streamname))->SetDiagMsg("File already exists"); + return std::unique_ptr(&(new Exception::CannotCreateStream(streamname))->SetDiagMsg("File already exists")); case ENOENT: // File not found! - return new Exception::FileNotFound(streamname); + return std::unique_ptr(new Exception::FileNotFound(streamname)); case EPIPE: - return &(new Exception::BadStream(streamname))->SetDiagMsg("Broken pipe"); + return std::unique_ptr(&(new Exception::BadStream(streamname))->SetDiagMsg("Broken pipe")); case EBADF: - return &(new Exception::BadStream(streamname))->SetDiagMsg("Bad file number"); + return std::unique_ptr(&(new Exception::BadStream(streamname))->SetDiagMsg("Bad file number")); default: - return &(new Exception::BadStream(streamname))->SetDiagMsg(fmt::format("General file/stream error [errno: {}]", errcode)); + return std::unique_ptr(&(new Exception::BadStream(streamname))->SetDiagMsg(fmt::format("General file/stream error [errno: {}]", errcode))); } } diff --git a/common/Exceptions.h b/common/Exceptions.h index 9b2b2570ef..580c41e6eb 100644 --- a/common/Exceptions.h +++ b/common/Exceptions.h @@ -23,53 +23,11 @@ // Because wxTrap isn't available on Linux builds of wxWidgets (non-Debug, typically) void pxTrap(); -// -------------------------------------------------------------------------------------- -// DESTRUCTOR_CATCHALL - safe destructor helper -// -------------------------------------------------------------------------------------- -// In C++ destructors *really* need to be "nothrow" garaunteed, otherwise you can have -// disasterous nested exception throws during the unwinding process of an originating -// exception. Use this macro to dispose of these dangerous exceptions, and generate a -// friendly error log in their wake. -// -// Note: Console can also fire an Exception::OutOfMemory -#define __DESTRUCTOR_CATCHALL(funcname) \ - catch (BaseException & ex) \ - { \ - try \ - { \ - Console.Error("Unhandled BaseException in %s (ignored!):", funcname); \ - Console.Error(ex.FormatDiagnosticMessage()); \ - } \ - catch (...) \ - { \ - fprintf(stderr, "ERROR: (out of memory?)\n"); \ - } \ - } \ - catch (std::exception & ex) \ - { \ - try \ - { \ - Console.Error("Unhandled std::exception in %s (ignored!):", funcname); \ - Console.Error(ex.what()); \ - } \ - catch (...) \ - { \ - fprintf(stderr, "ERROR: (out of memory?)\n"); \ - } \ - } \ - catch (...) \ - { \ - /* Unreachable code */ \ - } - -#define DESTRUCTOR_CATCHALL __DESTRUCTOR_CATCHALL(__pxFUNCTION__) - namespace Exception { class BaseException; - int MakeNewType(); - BaseException* FromErrno(std::string streamname, int errcode); + std::unique_ptr FromErrno(std::string streamname, int errcode); // -------------------------------------------------------------------------------------- // BaseException @@ -119,8 +77,6 @@ namespace Exception virtual BaseException* Clone() const = 0; }; - typedef std::unique_ptr ScopedExcept; - // -------------------------------------------------------------------------------------- // Ps2Generic Exception // -------------------------------------------------------------------------------------- @@ -225,83 +181,6 @@ public: \ RuntimeError(const std::exception& ex, const char* prefix = nullptr); }; - // -------------------------------------------------------------------------------------- - // CancelAppEvent - Exception for canceling an event in a non-verbose fashion - // -------------------------------------------------------------------------------------- - // Typically the PCSX2 interface issues popup dialogs for runtime errors. This exception - // instead issues a "silent" cancelation that is handled by the app gracefully (generates - // log, and resumes messages queue processing). - // - // I chose to have this exception derive from RuntimeError, since if one is thrown from outside - // an App message loop we'll still want it to be handled in a reasonably graceful manner. - class CancelEvent : public RuntimeError - { - DEFINE_RUNTIME_EXCEPTION(CancelEvent, RuntimeError, "No reason given.") - - public: - explicit CancelEvent(std::string logmsg) - { - m_message_diag = std::move(logmsg); - // overridden message formatters only use the diagnostic version... - } - - virtual std::string FormatDisplayMessage() const override; - virtual std::string FormatDiagnosticMessage() const override; - }; - - // --------------------------------------------------------------------------------------- - // OutOfMemory - // --------------------------------------------------------------------------------------- - // This exception has a custom-formatted Diagnostic string. The parameter give when constructing - // the exception is a block/alloc name, which is used as a formatting parameter in the diagnostic - // output. The default diagnostic message is "Out of memory exception, while allocating the %s." - // where %s is filled in with the block name. - // - // The user string is not custom-formatted, and should contain *NO* %s tags. - // - class OutOfMemory : public RuntimeError - { - DEFINE_RUNTIME_EXCEPTION(OutOfMemory, RuntimeError, "") - - public: - std::string AllocDescription; - - public: - OutOfMemory(std::string allocdesc); - - virtual std::string FormatDisplayMessage() const override; - virtual std::string FormatDiagnosticMessage() const override; - }; - - class ParseError : public RuntimeError - { - DEFINE_RUNTIME_EXCEPTION(ParseError, RuntimeError, "Parse error"); - }; - - // --------------------------------------------------------------------------------------- - // Hardware/OS Exceptions: - // HardwareDeficiency / VirtualMemoryMapConflict - // --------------------------------------------------------------------------------------- - - // This exception is a specific type of OutOfMemory error that isn't "really" an out of - // memory error. More likely it's caused by a plugin or driver reserving a range of memory - // we'd really like to have access to. - class VirtualMemoryMapConflict : public OutOfMemory - { - DEFINE_RUNTIME_EXCEPTION(VirtualMemoryMapConflict, OutOfMemory, "") - - VirtualMemoryMapConflict(std::string allocdesc); - - virtual std::string FormatDisplayMessage() const override; - virtual std::string FormatDiagnosticMessage() const override; - }; - - class HardwareDeficiency : public RuntimeError - { - public: - DEFINE_RUNTIME_EXCEPTION(HardwareDeficiency, RuntimeError, "Your machine's hardware is incapable of running PCSX2. Sorry dood."); - }; - // --------------------------------------------------------------------------------------- // Streaming (file) Exceptions: // Stream / BadStream / CannotCreateStream / FileNotFound / AccessDenied / EndOfStream @@ -401,28 +280,6 @@ public: \ virtual std::string FormatDiagnosticMessage() const override; virtual std::string FormatDisplayMessage() const override; }; - -#ifdef _WIN32 - // -------------------------------------------------------------------------------------- - // Exception::WinApiError - // -------------------------------------------------------------------------------------- - class WinApiError : public RuntimeError - { - DEFINE_EXCEPTION_COPYTORS(WinApiError, RuntimeError) - DEFINE_EXCEPTION_MESSAGES(WinApiError) - - public: - int ErrorId; - - public: - WinApiError(); - - std::string GetMsgFromWindows() const; - virtual std::string FormatDisplayMessage() const override; - virtual std::string FormatDiagnosticMessage() const override; - }; -#endif } // namespace Exception using Exception::BaseException; -using Exception::ScopedExcept; diff --git a/common/FileSystem.cpp b/common/FileSystem.cpp index 61873579f7..a700e68bcb 100644 --- a/common/FileSystem.cpp +++ b/common/FileSystem.cpp @@ -39,19 +39,6 @@ #include #include #include - -#if defined(_UWP) -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif - #else #include #include @@ -74,21 +61,37 @@ static std::time_t ConvertFileTimeToUnixTime(const FILETIME& ft) } #endif -static inline bool FileSystemCharacterIsSane(char c, bool StripSlashes) +static inline bool FileSystemCharacterIsSane(char c, bool strip_slashes) { - if (!(c >= 'a' && c <= 'z') && !(c >= 'A' && c <= 'Z') && !(c >= '0' && c <= '9') && c != ' ' && c != ' ' && - c != '_' && c != '-' && c != '.') - { - if (!StripSlashes && (c == '/' || c == '\\')) - return true; +#ifdef _WIN32 + // https://docs.microsoft.com/en-gb/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#naming-conventions + if ((c == U'/' || c == U'\\') && strip_slashes) + return false; + if (c == U'<' || c == U'>' || c == U':' || c == U'"' || c == U'|' || c == U'?' || c == U'*' || c == 0 || + c <= static_cast(31)) + { return false; } +#else + if (c == '/' && strip_slashes) + return false; + + // drop asterisks too, they make globbing annoying + if (c == '*') + return false; + + // macos doesn't allow colons, apparently +#ifdef __APPLE__ + if (c == U':') + return false; +#endif +#endif return true; } -template +template static inline void PathAppendString(std::string& dst, const T& src) { if (dst.capacity() < (dst.length() + src.length())) @@ -97,7 +100,7 @@ static inline void PathAppendString(std::string& dst, const T& src) bool last_separator = (!dst.empty() && dst.back() == FS_OSPATH_SEPARATOR_CHARACTER); size_t index = 0; - + #ifdef _WIN32 // special case for UNC paths here if (dst.empty() && src.length() >= 3 && src[0] == '\\' && src[1] == '\\' && src[2] != '\\') @@ -131,46 +134,66 @@ static inline void PathAppendString(std::string& dst, const T& src) } } -void Path::SanitizeFileName(char* Destination, u32 cbDestination, const char* FileName, bool StripSlashes /* = true */) +std::string Path::SanitizeFileName(const std::string_view& str, bool strip_slashes /* = true */) { - u32 i; - u32 fileNameLength = static_cast(std::strlen(FileName)); + std::string ret; + ret.reserve(str.length()); - if (FileName == Destination) + size_t pos = 0; + while (pos < str.length()) { - for (i = 0; i < fileNameLength; i++) - { - if (!FileSystemCharacterIsSane(FileName[i], StripSlashes)) - Destination[i] = '_'; - } - } - else - { - for (i = 0; i < fileNameLength && i < cbDestination; i++) - { - if (FileSystemCharacterIsSane(FileName[i], StripSlashes)) - Destination[i] = FileName[i]; - else - Destination[i] = '_'; - } + char32_t ch; + pos += StringUtil::DecodeUTF8(str, pos, &ch); + ch = FileSystemCharacterIsSane(ch, strip_slashes) ? ch : U'_'; + StringUtil::EncodeAndAppendUTF8(ret, ch); } + +#ifdef _WIN32 + // Windows: Can't end filename with a period. + if (ret.length() > 0 && ret.back() == '.') + ret.back() = '_'; +#endif + + return ret; } -void Path::SanitizeFileName(std::string& Destination, bool StripSlashes /* = true*/) +void Path::SanitizeFileName(std::string* str, bool strip_slashes /* = true */) { - const std::size_t len = Destination.length(); - for (std::size_t i = 0; i < len; i++) + const size_t len = str->length(); + + char small_buf[128]; + std::unique_ptr large_buf; + char* str_copy = small_buf; + if (len >= std::size(small_buf)) { - if (!FileSystemCharacterIsSane(Destination[i], StripSlashes)) - Destination[i] = '_'; + large_buf = std::make_unique(len + 1); + str_copy = large_buf.get(); } + std::memcpy(str_copy, str->c_str(), sizeof(char) * (len + 1)); + str->clear(); + + size_t pos = 0; + while (pos < len) + { + char32_t ch; + pos += StringUtil::DecodeUTF8(str_copy + pos, pos - len, &ch); + ch = FileSystemCharacterIsSane(ch, strip_slashes) ? ch : U'_'; + StringUtil::EncodeAndAppendUTF8(*str, ch); + } + +#ifdef _WIN32 + // Windows: Can't end filename with a period. + if (str->length() > 0 && str->back() == '.') + str->back() = '_'; +#endif } bool Path::IsAbsolute(const std::string_view& path) { #ifdef _WIN32 return (path.length() >= 3 && ((path[0] >= 'A' && path[0] <= 'Z') || (path[0] >= 'a' && path[0] <= 'z')) && - path[1] == ':' && (path[2] == '/' || path[2] == '\\')) || (path.length() >= 3 && path[0] == '\\' && path[1] == '\\'); + path[1] == ':' && (path[2] == '/' || path[2] == '\\')) || + (path.length() >= 3 && path[0] == '\\' && path[1] == '\\'); #else return (path.length() >= 1 && path[0] == '/'); #endif @@ -180,7 +203,7 @@ std::string Path::ToNativePath(const std::string_view& path) { std::string ret; PathAppendString(ret, path); - + // remove trailing slashes if (ret.length() > 1) { @@ -521,7 +544,7 @@ std::vector FileSystem::GetRootDirectoryList() { std::vector results; -#if defined(_WIN32) && !defined(_UWP) +#if defined(_WIN32) char buf[256]; const DWORD size = GetLogicalDriveStringsA(sizeof(buf), buf); if (size != 0 && size < (sizeof(buf) - 1)) @@ -534,28 +557,6 @@ std::vector FileSystem::GetRootDirectoryList() ptr += len + 1u; } } -#elif defined(_UWP) - if (const auto install_location = winrt::Windows::ApplicationModel::Package::Current().InstalledLocation(); - install_location) - { - if (const auto path = install_location.Path(); !path.empty()) - results.push_back(StringUtil::WideStringToUTF8String(path)); - } - - if (const auto local_location = winrt::Windows::Storage::ApplicationData::Current().LocalFolder(); local_location) - { - if (const auto path = local_location.Path(); !path.empty()) - results.push_back(StringUtil::WideStringToUTF8String(path)); - } - - const auto devices = winrt::Windows::Storage::KnownFolders::RemovableDevices(); - const auto folders_task(devices.GetFoldersAsync()); - for (const auto& storage_folder : folders_task.get()) - { - const auto path = storage_folder.Path(); - if (!path.empty()) - results.push_back(StringUtil::WideStringToUTF8String(path)); - } #else const char* home_path = std::getenv("HOME"); if (home_path) @@ -595,127 +596,6 @@ std::string Path::Combine(const std::string_view& base, const std::string_view& return ret; } -#ifdef _UWP -static std::FILE* OpenCFileUWP(const wchar_t* wfilename, const wchar_t* mode, FileSystem::FileShareMode share_mode) -{ - DWORD access = 0; - DWORD share = 0; - DWORD disposition = 0; - - switch (share_mode) - { - case FileSystem::FileShareMode::DenyNone: - share = FILE_SHARE_READ | FILE_SHARE_WRITE; - break; - case FileSystem::FileShareMode::DenyRead: - share = FILE_SHARE_WRITE; - break; - case FileSystem::FileShareMode::DenyWrite: - share = FILE_SHARE_READ; - break; - case FileSystem::FileShareMode::DenyReadWrite: - default: - share = 0; - break; - } - - int flags = 0; - const wchar_t* tmode = mode; - while (*tmode) - { - if (*tmode == L'r' && *(tmode + 1) == L'+') - { - access = GENERIC_READ | GENERIC_WRITE; - disposition = OPEN_EXISTING; - flags |= _O_RDWR; - tmode += 2; - } - else if (*tmode == L'w' && *(tmode + 1) == L'+') - { - access = GENERIC_READ | GENERIC_WRITE; - disposition = CREATE_ALWAYS; - flags |= _O_RDWR | _O_CREAT | _O_TRUNC; - tmode += 2; - } - else if (*tmode == L'a' && *(tmode + 1) == L'+') - { - access = GENERIC_READ | GENERIC_WRITE; - disposition = CREATE_ALWAYS; - flags |= _O_RDWR | _O_APPEND | _O_CREAT | _O_TRUNC; - tmode += 2; - } - else if (*tmode == L'r') - { - access = GENERIC_READ; - disposition = OPEN_EXISTING; - flags |= _O_RDONLY; - tmode++; - } - else if (*tmode == L'w') - { - access = GENERIC_WRITE; - disposition = CREATE_ALWAYS; - flags |= _O_WRONLY | _O_CREAT | _O_TRUNC; - tmode++; - } - else if (*tmode == L'a') - { - access = GENERIC_READ | GENERIC_WRITE; - disposition = CREATE_ALWAYS; - flags |= _O_WRONLY | _O_APPEND | _O_CREAT | _O_TRUNC; - tmode++; - } - else if (*tmode == L'b') - { - flags |= _O_BINARY; - tmode++; - } - else if (*tmode == L'S') - { - flags |= _O_SEQUENTIAL; - tmode++; - } - else if (*tmode == L'R') - { - flags |= _O_RANDOM; - tmode++; - } - else - { - Console.Error("Unknown mode flags: '%s'", StringUtil::WideStringToUTF8String(mode).c_str()); - return nullptr; - } - } - - HANDLE hFile = CreateFileFromAppW(wfilename, access, share, nullptr, disposition, 0, nullptr); - if (hFile == INVALID_HANDLE_VALUE) - return nullptr; - - if (flags & _O_APPEND && !SetFilePointerEx(hFile, LARGE_INTEGER{}, nullptr, FILE_END)) - { - Console.Error("SetFilePointerEx() failed: %08X", GetLastError()); - CloseHandle(hFile); - return nullptr; - } - - int fd = _open_osfhandle(reinterpret_cast(hFile), flags); - if (fd < 0) - { - CloseHandle(hFile); - return nullptr; - } - - std::FILE* fp = _wfdopen(fd, mode); - if (!fp) - { - _close(fd); - return nullptr; - } - - return fp; -} -#endif // _UWP - std::FILE* FileSystem::OpenCFile(const char* filename, const char* mode) { #ifdef _WIN32 @@ -725,13 +605,7 @@ std::FILE* FileSystem::OpenCFile(const char* filename, const char* mode) { std::FILE* fp; if (_wfopen_s(&fp, wfilename.c_str(), wmode.c_str()) != 0) - { -#ifdef _UWP - return OpenCFileUWP(wfilename.c_str(), wmode.c_str(), FileShareMode::DenyReadWrite); -#else return nullptr; -#endif - } return fp; } @@ -751,10 +625,7 @@ int FileSystem::OpenFDFile(const char* filename, int flags, int mode) #ifdef _WIN32 const std::wstring wfilename(StringUtil::UTF8StringToWideString(filename)); if (!wfilename.empty()) - { - // TODO: UWP return _wopen(wfilename.c_str(), flags, mode); - } return -1; #else @@ -797,11 +668,7 @@ std::FILE* FileSystem::OpenSharedCFile(const char* filename, const char* mode, F if (fp) return fp; -#ifdef _UWP - return OpenCFileUWP(wfilename.c_str(), wmode.c_str(), share_mode); -#else return nullptr; -#endif #else return std::fopen(filename, mode); #endif @@ -1027,19 +894,6 @@ static u32 TranslateWin32Attributes(u32 Win32Attributes) return r; } -static DWORD WrapGetFileAttributes(const wchar_t* path) -{ -#ifndef _UWP - return GetFileAttributesW(path); -#else - WIN32_FILE_ATTRIBUTE_DATA fad; - if (!GetFileAttributesExFromAppW(path, GetFileExInfoStandard, &fad)) - return INVALID_FILE_ATTRIBUTES; - - return fad.dwFileAttributes; -#endif -} - static u32 RecursiveFindFiles(const char* origin_path, const char* parent_path, const char* path, const char* pattern, u32 flags, FileSystem::FindResultsArray* results) { @@ -1061,13 +915,7 @@ static u32 RecursiveFindFiles(const char* origin_path, const char* parent_path, std::string utf8_filename; utf8_filename.reserve((sizeof(wfd.cFileName) / sizeof(wfd.cFileName[0])) * 2); -#ifndef _UWP HANDLE hFind = FindFirstFileW(StringUtil::UTF8StringToWideString(tempStr).c_str(), &wfd); -#else - HANDLE hFind = FindFirstFileExFromAppW(StringUtil::UTF8StringToWideString(tempStr).c_str(), FindExInfoBasic, &wfd, - FindExSearchNameMatch, nullptr, 0); -#endif - if (hFind == INVALID_HANDLE_VALUE) return 0; @@ -1217,7 +1065,7 @@ bool FileSystem::StatFile(const char* path, struct stat* st) return false; struct _stat64 st64; - if (_wstati64(wpath.c_str(), &st64) != 0) + if (_wstat64(wpath.c_str(), &st64) != 0) return false; TranslateStat64(st, st64); @@ -1231,7 +1079,7 @@ bool FileSystem::StatFile(std::FILE* fp, struct stat* st) return false; struct _stat64 st64; - if (_fstati64(fd, &st64) != 0) + if (_fstat64(fd, &st64) != 0) return false; TranslateStat64(st, st64); @@ -1249,7 +1097,6 @@ bool FileSystem::StatFile(const char* path, FILESYSTEM_STAT_DATA* sd) if (wpath.empty()) return false; -#ifndef _UWP // determine attributes for the path. if it's a directory, things have to be handled differently.. DWORD fileAttributes = GetFileAttributesW(wpath.c_str()); if (fileAttributes == INVALID_FILE_ATTRIBUTES) @@ -1289,17 +1136,6 @@ bool FileSystem::StatFile(const char* path, FILESYSTEM_STAT_DATA* sd) sd->ModificationTime = ConvertFileTimeToUnixTime(bhfi.ftLastWriteTime); sd->Size = static_cast(((u64)bhfi.nFileSizeHigh) << 32 | (u64)bhfi.nFileSizeLow); return true; -#else - WIN32_FILE_ATTRIBUTE_DATA fad; - if (!GetFileAttributesExFromAppW(wpath, GetFileExInfoStandard, &fad)) - return false; - - sd->Attributes = TranslateWin32Attributes(fad.dwFileAttributes); - sd->CreationTime = ConvertFileTimeToUnixTime(fad.ftCreationTime); - sd->ModificationTime = ConvertFileTimeToUnixTime(fad.ftLastWriteTime); - sd->Size = static_cast(((u64)fad.nFileSizeHigh) << 32 | (u64)fad.nFileSizeLow); - return true; -#endif } bool FileSystem::StatFile(std::FILE* fp, FILESYSTEM_STAT_DATA* sd) @@ -1309,7 +1145,7 @@ bool FileSystem::StatFile(std::FILE* fp, FILESYSTEM_STAT_DATA* sd) return false; struct _stat64 st; - if (_fstati64(fd, &st) != 0) + if (_fstat64(fd, &st) != 0) return false; // parse attributes @@ -1340,7 +1176,7 @@ bool FileSystem::FileExists(const char* path) return false; // determine attributes for the path. if it's a directory, things have to be handled differently.. - DWORD fileAttributes = WrapGetFileAttributes(wpath.c_str()); + DWORD fileAttributes = GetFileAttributesW(wpath.c_str()); if (fileAttributes == INVALID_FILE_ATTRIBUTES) return false; @@ -1362,7 +1198,7 @@ bool FileSystem::DirectoryExists(const char* path) return false; // determine attributes for the path. if it's a directory, things have to be handled differently.. - DWORD fileAttributes = WrapGetFileAttributes(wpath.c_str()); + DWORD fileAttributes = GetFileAttributesW(wpath.c_str()); if (fileAttributes == INVALID_FILE_ATTRIBUTES) return false; @@ -1378,11 +1214,7 @@ bool FileSystem::DirectoryIsEmpty(const char* path) wpath += L"\\*"; WIN32_FIND_DATAW wfd; -#ifndef _UWP HANDLE hFind = FindFirstFileW(wpath.c_str(), &wfd); -#else - HANDLE hFind = FindFirstFileExFromAppW(wpath.c_str(), FindExInfoBasic, &wfd, FindExSearchNameMatch, nullptr, 0); -#endif if (hFind == INVALID_HANDLE_VALUE) return true; @@ -1411,14 +1243,9 @@ bool FileSystem::CreateDirectoryPath(const char* Path, bool Recursive) if (wpath.empty()) return false; - // try just flat-out, might work if there's no other segments that have to be made -#ifndef _UWP + // try just flat-out, might work if there's no other segments that have to be made if (CreateDirectoryW(wpath.c_str(), nullptr)) return true; -#else - if (CreateDirectoryFromAppW(wpath.c_str(), nullptr)) - return true; -#endif if (!Recursive) return false; @@ -1428,7 +1255,7 @@ bool FileSystem::CreateDirectoryPath(const char* Path, bool Recursive) if (lastError == ERROR_ALREADY_EXISTS) { // check the attributes - u32 Attributes = WrapGetFileAttributes(wpath.c_str()); + u32 Attributes = GetFileAttributesW(wpath.c_str()); if (Attributes != INVALID_FILE_ATTRIBUTES && Attributes & FILE_ATTRIBUTE_DIRECTORY) return true; else @@ -1447,11 +1274,7 @@ bool FileSystem::CreateDirectoryPath(const char* Path, bool Recursive) { if (wpath[i] == L'\\' || wpath[i] == L'/') { -#ifndef _UWP const BOOL result = CreateDirectoryW(tempPath.c_str(), nullptr); -#else - const BOOL result = CreateDirectoryFromAppW(tempPath.c_str(), nullptr); -#endif if (!result) { lastError = GetLastError(); @@ -1471,11 +1294,7 @@ bool FileSystem::CreateDirectoryPath(const char* Path, bool Recursive) // re-create the end if it's not a separator, check / as well because windows can interpret them if (wpath[pathLength - 1] != L'\\' && wpath[pathLength - 1] != L'/') { -#ifndef _UWP const BOOL result = CreateDirectoryW(wpath.c_str(), nullptr); -#else - const BOOL result = CreateDirectoryFromAppW(wpath.c_str(), nullptr); -#endif if (!result) { lastError = GetLastError(); @@ -1500,15 +1319,11 @@ bool FileSystem::DeleteFilePath(const char* path) return false; const std::wstring wpath(StringUtil::UTF8StringToWideString(path)); - const DWORD fileAttributes = WrapGetFileAttributes(wpath.c_str()); + const DWORD fileAttributes = GetFileAttributesW(wpath.c_str()); if (fileAttributes == INVALID_FILE_ATTRIBUTES || fileAttributes & FILE_ATTRIBUTE_DIRECTORY) return false; -#ifndef _UWP return (DeleteFileW(wpath.c_str()) == TRUE); -#else - return (DeleteFileFromAppW(wpath.c_str()) == TRUE); -#endif } bool FileSystem::RenamePath(const char* old_path, const char* new_path) @@ -1516,29 +1331,11 @@ bool FileSystem::RenamePath(const char* old_path, const char* new_path) const std::wstring old_wpath(StringUtil::UTF8StringToWideString(old_path)); const std::wstring new_wpath(StringUtil::UTF8StringToWideString(new_path)); -#ifndef _UWP if (!MoveFileExW(old_wpath.c_str(), new_wpath.c_str(), MOVEFILE_REPLACE_EXISTING)) { Console.Error("MoveFileEx('%s', '%s') failed: %08X", old_path, new_path, GetLastError()); return false; } -#else - // try moving if it doesn't exist, since ReplaceFile fails on non-existing destinations - if (WrapGetFileAttributes(new_wpath.c_str()) != INVALID_FILE_ATTRIBUTES) - { - if (!DeleteFileFromAppW(new_wpath.c_str())) - { - Log_ErrorPrintf("DeleteFileFromAppW('%s') failed: %08X", new_wpath.c_str(), GetLastError()); - return false; - } - } - - if (!MoveFileFromAppW(old_wpath.c_str(), new_wpath.c_str())) - { - Log_ErrorPrintf("MoveFileFromAppW('%s', '%s') failed: %08X", old_path, new_path, GetLastError()); - return false; - } -#endif return true; } @@ -1556,10 +1353,8 @@ std::string FileSystem::GetProgramPath() // Fall back to the main module if this fails. HMODULE module = nullptr; -#ifndef _UWP GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast(&GetProgramPath), &module); -#endif for (;;) { @@ -2136,4 +1931,36 @@ bool FileSystem::SetPathCompression(const char* path, bool enable) return false; } +FileSystem::POSIXLock::POSIXLock(int fd) +{ + if (lockf(fd, F_LOCK, 0) == 0) + { + m_fd = fd; + } + else + { + Console.Error("lockf() failed: %d", errno); + m_fd = -1; + } +} + +FileSystem::POSIXLock::POSIXLock(std::FILE* fp) +{ + m_fd = fileno(fp); + if (m_fd >= 0) + { + if (lockf(m_fd, F_LOCK, 0) != 0) + { + Console.Error("lockf() failed: %d", errno); + m_fd = -1; + } + } +} + +FileSystem::POSIXLock::~POSIXLock() +{ + if (m_fd >= 0) + lockf(m_fd, F_ULOCK, m_fd); +} + #endif diff --git a/common/FileSystem.h b/common/FileSystem.h index 958e09ad55..5804507bdc 100644 --- a/common/FileSystem.h +++ b/common/FileSystem.h @@ -164,4 +164,17 @@ namespace FileSystem /// Does nothing and returns false on non-Windows platforms. bool SetPathCompression(const char* path, bool enable); + /// Abstracts a POSIX file lock. +#ifndef _WIN32 + class POSIXLock + { + public: + POSIXLock(int fd); + POSIXLock(std::FILE* fp); + ~POSIXLock(); + + private: + int m_fd; + }; +#endif }; // namespace FileSystem diff --git a/common/GL/Context.cpp b/common/GL/Context.cpp index 9f4542aaf6..3ded7675f8 100644 --- a/common/GL/Context.cpp +++ b/common/GL/Context.cpp @@ -79,42 +79,41 @@ namespace GL return {}; } - std::unique_ptr Context::Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try) + std::unique_ptr Context::Create(const WindowInfo& wi, gsl::span versions_to_try) { if (ShouldPreferESContext()) { // move ES versions to the front - Version* new_versions_to_try = static_cast(alloca(sizeof(Version) * num_versions_to_try)); + Version* new_versions_to_try = static_cast(alloca(sizeof(Version) * versions_to_try.size())); size_t count = 0; - for (size_t i = 0; i < num_versions_to_try; i++) + for (size_t i = 0; i < versions_to_try.size(); i++) { if (versions_to_try[i].profile == Profile::ES) new_versions_to_try[count++] = versions_to_try[i]; } - for (size_t i = 0; i < num_versions_to_try; i++) + for (size_t i = 0; i < versions_to_try.size(); i++) { if (versions_to_try[i].profile != Profile::ES) new_versions_to_try[count++] = versions_to_try[i]; } - versions_to_try = new_versions_to_try; + versions_to_try = gsl::span(new_versions_to_try, versions_to_try.size()); } std::unique_ptr context; #if defined(_WIN32) && !defined(_M_ARM64) - context = ContextWGL::Create(wi, versions_to_try, num_versions_to_try); + context = ContextWGL::Create(wi, versions_to_try); #elif defined(__APPLE__) - context = ContextAGL::Create(wi, versions_to_try, num_versions_to_try); + context = ContextAGL::Create(wi, versions_to_try); #endif #if defined(X11_API) if (wi.type == WindowInfo::Type::X11) - context = ContextEGLX11::Create(wi, versions_to_try, num_versions_to_try); + context = ContextEGLX11::Create(wi, versions_to_try); #endif #if defined(WAYLAND_API) if (wi.type == WindowInfo::Type::Wayland) - context = ContextEGLWayland::Create(wi, versions_to_try, num_versions_to_try); + context = ContextEGLWayland::Create(wi, versions_to_try); #endif if (!context) @@ -160,9 +159,10 @@ namespace GL return context; } - const std::array& Context::GetAllVersionsList() + gsl::span Context::GetAllVersionsList() { - static constexpr std::array vlist = {{{Profile::Core, 4, 6}, + static constexpr Version vlist[] = { + {Profile::Core, 4, 6}, {Profile::Core, 4, 5}, {Profile::Core, 4, 4}, {Profile::Core, 4, 3}, @@ -177,7 +177,8 @@ namespace GL {Profile::ES, 3, 1}, {Profile::ES, 3, 0}, {Profile::ES, 2, 0}, - {Profile::NoProfile, 0, 0}}}; + {Profile::NoProfile, 0, 0} + }; return vlist; } } // namespace GL diff --git a/common/GL/Context.h b/common/GL/Context.h index 613c71e014..21ea1b2acb 100644 --- a/common/GL/Context.h +++ b/common/GL/Context.h @@ -18,69 +18,63 @@ #include "common/Pcsx2Defs.h" #include "common/WindowInfo.h" +#include #include #include #include namespace GL { -class Context -{ -public: - Context(const WindowInfo& wi); - virtual ~Context(); + class Context + { + public: + Context(const WindowInfo& wi); + virtual ~Context(); - enum class Profile - { - NoProfile, - Core, - ES - }; + enum class Profile + { + NoProfile, + Core, + ES + }; - struct Version - { - Profile profile; - int major_version; - int minor_version; - }; + struct Version + { + Profile profile; + int major_version; + int minor_version; + }; - struct FullscreenModeInfo - { - u32 width; - u32 height; - float refresh_rate; - }; + struct FullscreenModeInfo + { + u32 width; + u32 height; + float refresh_rate; + }; - __fi const WindowInfo& GetWindowInfo() const { return m_wi; } - __fi bool IsGLES() const { return (m_version.profile == Profile::ES); } - __fi u32 GetSurfaceWidth() const { return m_wi.surface_width; } - __fi u32 GetSurfaceHeight() const { return m_wi.surface_height; } + __fi const WindowInfo& GetWindowInfo() const { return m_wi; } + __fi bool IsGLES() const { return (m_version.profile == Profile::ES); } + __fi u32 GetSurfaceWidth() const { return m_wi.surface_width; } + __fi u32 GetSurfaceHeight() const { return m_wi.surface_height; } - virtual void* GetProcAddress(const char* name) = 0; - virtual bool ChangeSurface(const WindowInfo& new_wi) = 0; - virtual void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) = 0; - virtual bool SwapBuffers() = 0; - virtual bool MakeCurrent() = 0; - virtual bool DoneCurrent() = 0; - virtual bool SetSwapInterval(s32 interval) = 0; - virtual std::unique_ptr CreateSharedContext(const WindowInfo& wi) = 0; + virtual void* GetProcAddress(const char* name) = 0; + virtual bool ChangeSurface(const WindowInfo& new_wi) = 0; + virtual void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) = 0; + virtual bool SwapBuffers() = 0; + virtual bool MakeCurrent() = 0; + virtual bool DoneCurrent() = 0; + virtual bool SetSwapInterval(s32 interval) = 0; + virtual std::unique_ptr CreateSharedContext(const WindowInfo& wi) = 0; - virtual std::vector EnumerateFullscreenModes(); + virtual std::vector EnumerateFullscreenModes(); - static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try); + static std::unique_ptr Create(const WindowInfo& wi, gsl::span versions_to_try); - template - static std::unique_ptr Create(const WindowInfo& wi, const std::array& versions_to_try) - { - return Create(wi, versions_to_try.data(), versions_to_try.size()); - } + static std::unique_ptr Create(const WindowInfo& wi) { return Create(wi, GetAllVersionsList()); } - static std::unique_ptr Create(const WindowInfo& wi) { return Create(wi, GetAllVersionsList()); } + static gsl::span GetAllVersionsList(); - static const std::array& GetAllVersionsList(); - -protected: - WindowInfo m_wi; - Version m_version = {}; -}; + protected: + WindowInfo m_wi; + Version m_version = {}; + }; } // namespace GL diff --git a/common/GL/ContextAGL.h b/common/GL/ContextAGL.h index 8694ce2cc7..3504a34263 100644 --- a/common/GL/ContextAGL.h +++ b/common/GL/ContextAGL.h @@ -33,8 +33,7 @@ namespace GL ContextAGL(const WindowInfo& wi); ~ContextAGL() override; - static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try); + static std::unique_ptr Create(const WindowInfo& wi, gsl::span versions_to_try); void* GetProcAddress(const char* name) override; bool ChangeSurface(const WindowInfo& new_wi) override; @@ -46,7 +45,7 @@ namespace GL std::unique_ptr CreateSharedContext(const WindowInfo& wi) override; private: - bool Initialize(const Version* versions_to_try, size_t num_versions_to_try); + bool Initialize(gsl::span versions_to_try); bool CreateContext(NSOpenGLContext* share_context, int profile, bool make_current); void BindContextToView(); void CleanupView(); diff --git a/common/GL/ContextAGL.mm b/common/GL/ContextAGL.mm index 4705bc97f8..944d5002e9 100644 --- a/common/GL/ContextAGL.mm +++ b/common/GL/ContextAGL.mm @@ -44,21 +44,19 @@ namespace GL dlclose(m_opengl_module_handle); } - std::unique_ptr ContextAGL::Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try) + std::unique_ptr ContextAGL::Create(const WindowInfo& wi, gsl::span versions_to_try) { std::unique_ptr context = std::make_unique(wi); - if (!context->Initialize(versions_to_try, num_versions_to_try)) + if (!context->Initialize(versions_to_try)) return nullptr; return context; } - bool ContextAGL::Initialize(const Version* versions_to_try, size_t num_versions_to_try) + bool ContextAGL::Initialize(gsl::span versions_to_try) { - for (size_t i = 0; i < num_versions_to_try; i++) + for (const Version& cv : versions_to_try) { - const Version& cv = versions_to_try[i]; if (cv.profile == Profile::NoProfile && CreateContext(nullptr, NSOpenGLProfileVersionLegacy, true)) { // we already have the dummy context, so just use that diff --git a/common/GL/ContextEGL.cpp b/common/GL/ContextEGL.cpp index 70aa414daf..face6ac709 100644 --- a/common/GL/ContextEGL.cpp +++ b/common/GL/ContextEGL.cpp @@ -35,17 +35,16 @@ namespace GL DestroyContext(); } - std::unique_ptr ContextEGL::Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try) + std::unique_ptr ContextEGL::Create(const WindowInfo& wi, gsl::span versions_to_try) { std::unique_ptr context = std::make_unique(wi); - if (!context->Initialize(versions_to_try, num_versions_to_try)) + if (!context->Initialize(versions_to_try)) return nullptr; return context; } - bool ContextEGL::Initialize(const Version* versions_to_try, size_t num_versions_to_try) + bool ContextEGL::Initialize(gsl::span versions_to_try) { if (!gladLoadEGL()) { @@ -73,9 +72,9 @@ namespace GL if (!m_supports_surfaceless) Console.Warning("EGL implementation does not support surfaceless contexts, emulating with pbuffers"); - for (size_t i = 0; i < num_versions_to_try; i++) + for (const Version& version : versions_to_try) { - if (CreateContextAndSurface(versions_to_try[i], nullptr, true)) + if (CreateContextAndSurface(version, nullptr, true)) return true; } diff --git a/common/GL/ContextEGL.h b/common/GL/ContextEGL.h index 035bbdc534..5fa808efd1 100644 --- a/common/GL/ContextEGL.h +++ b/common/GL/ContextEGL.h @@ -26,8 +26,7 @@ namespace GL ContextEGL(const WindowInfo& wi); ~ContextEGL() override; - static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try); + static std::unique_ptr Create(const WindowInfo& wi, gsl::span versions_to_try); void* GetProcAddress(const char* name) override; virtual bool ChangeSurface(const WindowInfo& new_wi) override; @@ -42,7 +41,7 @@ namespace GL virtual bool SetDisplay(); virtual EGLNativeWindowType GetNativeWindow(EGLConfig config); - bool Initialize(const Version* versions_to_try, size_t num_versions_to_try); + bool Initialize(gsl::span versions_to_try); bool CreateDisplay(); bool CreateContext(const Version& version, EGLContext share_context); bool CreateContextAndSurface(const Version& version, EGLContext share_context, bool make_current); diff --git a/common/GL/ContextEGLWayland.cpp b/common/GL/ContextEGLWayland.cpp index 8141fdf56b..a010db1164 100644 --- a/common/GL/ContextEGLWayland.cpp +++ b/common/GL/ContextEGLWayland.cpp @@ -37,11 +37,10 @@ namespace GL dlclose(m_wl_module); } - std::unique_ptr ContextEGLWayland::Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try) + std::unique_ptr ContextEGLWayland::Create(const WindowInfo& wi, gsl::span versions_to_try) { std::unique_ptr context = std::make_unique(wi); - if (!context->LoadModule() || !context->Initialize(versions_to_try, num_versions_to_try)) + if (!context->LoadModule() || !context->Initialize(versions_to_try)) return nullptr; return context; diff --git a/common/GL/ContextEGLWayland.h b/common/GL/ContextEGLWayland.h index e17662025a..156c79fec3 100644 --- a/common/GL/ContextEGLWayland.h +++ b/common/GL/ContextEGLWayland.h @@ -28,8 +28,7 @@ namespace GL ContextEGLWayland(const WindowInfo& wi); ~ContextEGLWayland() override; - static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try); + static std::unique_ptr Create(const WindowInfo& wi, gsl::span versions_to_try); std::unique_ptr CreateSharedContext(const WindowInfo& wi) override; void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) override; diff --git a/common/GL/ContextEGLX11.cpp b/common/GL/ContextEGLX11.cpp index e2ee142895..c4c4322573 100644 --- a/common/GL/ContextEGLX11.cpp +++ b/common/GL/ContextEGLX11.cpp @@ -27,11 +27,10 @@ namespace GL } ContextEGLX11::~ContextEGLX11() = default; - std::unique_ptr ContextEGLX11::Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try) + std::unique_ptr ContextEGLX11::Create(const WindowInfo& wi, gsl::span versions_to_try) { std::unique_ptr context = std::make_unique(wi); - if (!context->Initialize(versions_to_try, num_versions_to_try)) + if (!context->Initialize(versions_to_try)) return nullptr; return context; diff --git a/common/GL/ContextEGLX11.h b/common/GL/ContextEGLX11.h index 65d0fe362f..e1ee5263a6 100644 --- a/common/GL/ContextEGLX11.h +++ b/common/GL/ContextEGLX11.h @@ -25,8 +25,7 @@ namespace GL ContextEGLX11(const WindowInfo& wi); ~ContextEGLX11() override; - static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try); + static std::unique_ptr Create(const WindowInfo& wi, gsl::span versions_to_try); std::unique_ptr CreateSharedContext(const WindowInfo& wi) override; void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) override; diff --git a/common/GL/ContextWGL.cpp b/common/GL/ContextWGL.cpp index 8da0e766b0..5e6a73f8eb 100644 --- a/common/GL/ContextWGL.cpp +++ b/common/GL/ContextWGL.cpp @@ -28,6 +28,17 @@ static void* GetProcAddressCallback(const char* name) return ::GetProcAddress(GetModuleHandleA("opengl32.dll"), name); } +static bool ReloadWGL(HDC dc) +{ + if (!gladLoadWGLLoader([](const char* name) -> void* { return wglGetProcAddress(name); }, dc)) + { + Console.Error("Loading GLAD WGL functions failed"); + return false; + } + + return true; +} + namespace GL { ContextWGL::ContextWGL(const WindowInfo& wi) @@ -46,17 +57,16 @@ namespace GL ReleaseDC(); } - std::unique_ptr ContextWGL::Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try) + std::unique_ptr ContextWGL::Create(const WindowInfo& wi, gsl::span versions_to_try) { std::unique_ptr context = std::make_unique(wi); - if (!context->Initialize(versions_to_try, num_versions_to_try)) + if (!context->Initialize(versions_to_try)) return nullptr; return context; } - bool ContextWGL::Initialize(const Version* versions_to_try, size_t num_versions_to_try) + bool ContextWGL::Initialize(gsl::span versions_to_try) { if (m_wi.type == WindowInfo::Type::Win32) { @@ -65,17 +75,16 @@ namespace GL } else { - Console.Error("ContextWGL must always start with a valid surface."); - return false; + if (!CreatePBuffer()) + return false; } // Everything including core/ES requires a dummy profile to load the WGL extensions. if (!CreateAnyContext(nullptr, true)) return false; - for (size_t i = 0; i < num_versions_to_try; i++) + for (const Version& cv : versions_to_try) { - const Version& cv = versions_to_try[i]; if (cv.profile == Profile::NoProfile) { // we already have the dummy context, so just use that @@ -163,8 +172,8 @@ namespace GL } else { - Console.Error("PBuffer not implemented"); - return nullptr; + if (!context->CreatePBuffer()) + return nullptr; } if (m_version.profile == Profile::NoProfile) @@ -319,6 +328,29 @@ namespace GL static constexpr const int pb_attribs[] = {0, 0}; + HGLRC temp_rc = nullptr; + ScopedGuard temp_rc_guard([&temp_rc, hdc]() { if (temp_rc) { + wglMakeCurrent(hdc, nullptr); + wglDeleteContext(temp_rc); + } }); + + if (!GLAD_WGL_ARB_pbuffer) + { + // we're probably running completely surfaceless... need a temporary context. + temp_rc = wglCreateContext(hdc); + if (!temp_rc || !wglMakeCurrent(hdc, temp_rc)) + { + Console.Error("Failed to create temporary context to load WGL for pbuffer."); + return false; + } + + if (!ReloadWGL(hdc) || !GLAD_WGL_ARB_pbuffer) + { + Console.Error("Missing WGL_ARB_pbuffer"); + return false; + } + } + pxAssertRel(m_pixel_format.has_value(), "Has pixel format for pbuffer"); HPBUFFERARB pbuffer = wglCreatePbufferARB(hdc, m_pixel_format.value(), 1, 1, pb_attribs); if (!pbuffer) @@ -340,6 +372,7 @@ namespace GL m_dummy_dc = hdc; m_pbuffer = pbuffer; + temp_rc_guard.Run(); pbuffer_guard.Cancel(); hdc_guard.Cancel(); hwnd_guard.Cancel(); @@ -442,11 +475,8 @@ namespace GL } // re-init glad-wgl - if (make_current && !gladLoadWGLLoader([](const char* name) -> void* { return wglGetProcAddress(name); }, m_dc)) - { - Console.Error("Loading GLAD WGL functions failed"); + if (make_current && !ReloadWGL(m_dc)) return false; - } wglDeleteContext(m_rc); } diff --git a/common/GL/ContextWGL.h b/common/GL/ContextWGL.h index df0add38b2..789c8bc9e0 100644 --- a/common/GL/ContextWGL.h +++ b/common/GL/ContextWGL.h @@ -34,8 +34,7 @@ namespace GL ContextWGL(const WindowInfo& wi); ~ContextWGL() override; - static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try, - size_t num_versions_to_try); + static std::unique_ptr Create(const WindowInfo& wi, gsl::span versions_to_try); void* GetProcAddress(const char* name) override; bool ChangeSurface(const WindowInfo& new_wi) override; @@ -51,7 +50,7 @@ namespace GL HDC GetDCAndSetPixelFormat(HWND hwnd); - bool Initialize(const Version* versions_to_try, size_t num_versions_to_try); + bool Initialize(gsl::span versions_to_try); bool InitializeDC(); void ReleaseDC(); bool CreatePBuffer(); diff --git a/common/GL/Program.cpp b/common/GL/Program.cpp index 5163844a45..ce0169c80a 100644 --- a/common/GL/Program.cpp +++ b/common/GL/Program.cpp @@ -137,6 +137,17 @@ namespace GL return true; } + bool Program::CompileCompute(const std::string_view glsl) + { + GLuint id = CompileShader(GL_COMPUTE_SHADER, glsl); + if (id == 0) + return false; + + m_program_id = glCreateProgram(); + glAttachShader(m_program_id, id); + return true; + } + bool Program::CreateFromBinary(const void* data, u32 data_length, u32 data_format) { GLuint prog = glCreateProgram(); diff --git a/common/GL/Program.h b/common/GL/Program.h index 77563995be..0d1e9afe49 100644 --- a/common/GL/Program.h +++ b/common/GL/Program.h @@ -37,6 +37,8 @@ namespace GL bool Compile(const std::string_view vertex_shader, const std::string_view geometry_shader, const std::string_view fragment_shader); + bool CompileCompute(const std::string_view glsl); + bool CreateFromBinary(const void* data, u32 data_length, u32 data_format); bool GetBinary(std::vector* out_data, u32* out_data_format); diff --git a/common/GL/ShaderCache.cpp b/common/GL/ShaderCache.cpp index 84cb264ce2..c2fca6af58 100644 --- a/common/GL/ShaderCache.cpp +++ b/common/GL/ShaderCache.cpp @@ -352,6 +352,42 @@ namespace GL return true; } + bool ShaderCache::WriteToBlobFile(const CacheIndexKey& key, const std::vector& prog_data, u32 prog_format) + { + if (!m_blob_file || std::fseek(m_blob_file, 0, SEEK_END) != 0) + return false; + + CacheIndexData data; + data.file_offset = static_cast(std::ftell(m_blob_file)); + data.blob_size = static_cast(prog_data.size()); + data.blob_format = prog_format; + + CacheIndexEntry entry = {}; + entry.vertex_source_hash_low = key.vertex_source_hash_low; + entry.vertex_source_hash_high = key.vertex_source_hash_high; + entry.vertex_source_length = key.vertex_source_length; + entry.geometry_source_hash_low = key.geometry_source_hash_low; + entry.geometry_source_hash_high = key.geometry_source_hash_high; + entry.geometry_source_length = key.geometry_source_length; + entry.fragment_source_hash_low = key.fragment_source_hash_low; + entry.fragment_source_hash_high = key.fragment_source_hash_high; + entry.fragment_source_length = key.fragment_source_length; + entry.file_offset = data.file_offset; + entry.blob_size = data.blob_size; + entry.blob_format = data.blob_format; + + if (std::fwrite(prog_data.data(), 1, entry.blob_size, m_blob_file) != entry.blob_size || + std::fflush(m_blob_file) != 0 || std::fwrite(&entry, sizeof(entry), 1, m_index_file) != 1 || + std::fflush(m_index_file) != 0) + { + Console.Error("Failed to write shader blob to file"); + return false; + } + + m_index.emplace(key, data); + return true; + } + std::optional ShaderCache::CompileProgram(const std::string_view& vertex_shader, const std::string_view& geometry_shader, const std::string_view& fragment_shader, @@ -373,6 +409,25 @@ namespace GL return std::optional(std::move(prog)); } + std::optional ShaderCache::CompileComputeProgram(const std::string_view& glsl, + const PreLinkCallback& callback, bool set_retrievable) + { + Program prog; + if (!prog.CompileCompute(glsl)) + return std::nullopt; + + if (callback) + callback(prog); + + if (set_retrievable) + prog.SetBinaryRetrievableHint(); + + if (!prog.Link()) + return std::nullopt; + + return std::optional(std::move(prog)); + } + std::optional ShaderCache::CompileAndAddProgram(const CacheIndexKey& key, const std::string_view& vertex_shader, const std::string_view& geometry_shader, @@ -401,43 +456,111 @@ namespace GL const float binary_time = timer.GetTimeMilliseconds(); timer.Reset(); #endif - - if (!m_blob_file || std::fseek(m_blob_file, 0, SEEK_END) != 0) - return prog; - - CacheIndexData data; - data.file_offset = static_cast(std::ftell(m_blob_file)); - data.blob_size = static_cast(prog_data.size()); - data.blob_format = prog_format; - - CacheIndexEntry entry = {}; - entry.vertex_source_hash_low = key.vertex_source_hash_low; - entry.vertex_source_hash_high = key.vertex_source_hash_high; - entry.vertex_source_length = key.vertex_source_length; - entry.geometry_source_hash_low = key.geometry_source_hash_low; - entry.geometry_source_hash_high = key.geometry_source_hash_high; - entry.geometry_source_length = key.geometry_source_length; - entry.fragment_source_hash_low = key.fragment_source_hash_low; - entry.fragment_source_hash_high = key.fragment_source_hash_high; - entry.fragment_source_length = key.fragment_source_length; - entry.file_offset = data.file_offset; - entry.blob_size = data.blob_size; - entry.blob_format = data.blob_format; - - if (std::fwrite(prog_data.data(), 1, entry.blob_size, m_blob_file) != entry.blob_size || - std::fflush(m_blob_file) != 0 || std::fwrite(&entry, sizeof(entry), 1, m_index_file) != 1 || - std::fflush(m_index_file) != 0) - { - Console.Error("Failed to write shader blob to file"); - return prog; - } + + WriteToBlobFile(key, prog_data, prog_format); #ifdef PCSX2_DEVBUILD const float write_time = timer.GetTimeMilliseconds(); Console.WriteLn("Compiled and cached shader: Compile: %.2fms, Binary: %.2fms, Write: %.2fms", compile_time, binary_time, write_time); #endif - m_index.emplace(key, data); + return prog; + } + + std::optional ShaderCache::GetComputeProgram(const std::string_view glsl, const PreLinkCallback& callback) + { + if (!m_program_binary_supported || !m_blob_file) + { +#ifdef PCSX2_DEVBUILD + Common::Timer timer; +#endif + + std::optional res = CompileComputeProgram(glsl, callback, false); + +#ifdef PCSX2_DEVBUILD + Console.WriteLn("Time to compile shader without caching: %.2fms", timer.GetTimeMilliseconds()); +#endif + return res; + } + + const auto key = GetCacheKey(glsl, std::string_view(), std::string_view()); + auto iter = m_index.find(key); + if (iter == m_index.end()) + return CompileAndAddComputeProgram(key, glsl, callback); + + std::vector data(iter->second.blob_size); + if (std::fseek(m_blob_file, iter->second.file_offset, SEEK_SET) != 0 || + std::fread(data.data(), 1, iter->second.blob_size, m_blob_file) != iter->second.blob_size) + { + Console.Error("Read blob from file failed"); + return {}; + } + +#ifdef PCSX2_DEVBUILD + Common::Timer timer; +#endif + + Program prog; + if (prog.CreateFromBinary(data.data(), static_cast(data.size()), iter->second.blob_format)) + { +#ifdef PCSX2_DEVBUILD + Console.WriteLn("Time to create program from binary: %.2fms", timer.GetTimeMilliseconds()); +#endif + + return std::optional(std::move(prog)); + } + + Console.Warning( + "Failed to create program from binary, this may be due to a driver or GPU Change. Recreating cache."); + if (!Recreate()) + return CompileComputeProgram(glsl, callback, false); + else + return CompileAndAddComputeProgram(key, glsl, callback); + } + + bool ShaderCache::GetComputeProgram(Program* out_program, const std::string_view glsl, const PreLinkCallback& callback) + { + auto prog = GetComputeProgram(glsl, callback); + if (!prog) + return false; + + *out_program = std::move(*prog); + return true; + } + + std::optional ShaderCache::CompileAndAddComputeProgram( + const CacheIndexKey& key, const std::string_view& glsl, const PreLinkCallback& callback) + { +#ifdef PCSX2_DEVBUILD + Common::Timer timer; +#endif + + std::optional prog = CompileComputeProgram(glsl, callback, true); + if (!prog) + return std::nullopt; + +#ifdef PCSX2_DEVBUILD + const float compile_time = timer.GetTimeMilliseconds(); + timer.Reset(); +#endif + + std::vector prog_data; + u32 prog_format = 0; + if (!prog->GetBinary(&prog_data, &prog_format)) + return std::nullopt; + +#ifdef PCSX2_DEVBUILD + const float binary_time = timer.GetTimeMilliseconds(); + timer.Reset(); +#endif + + WriteToBlobFile(key, prog_data, prog_format); + +#ifdef PCSX2_DEVBUILD + const float write_time = timer.GetTimeMilliseconds(); + Console.WriteLn("Compiled and cached compute shader: Compile: %.2fms, Binary: %.2fms, Write: %.2fms", compile_time, binary_time, write_time); +#endif + return prog; } } // namespace GL diff --git a/common/GL/ShaderCache.h b/common/GL/ShaderCache.h index 20a04841c5..31dba488bf 100644 --- a/common/GL/ShaderCache.h +++ b/common/GL/ShaderCache.h @@ -42,6 +42,9 @@ namespace GL bool GetProgram(Program* out_program, const std::string_view vertex_shader, const std::string_view geometry_shader, const std::string_view fragment_shader, const PreLinkCallback& callback = {}); + std::optional GetComputeProgram(const std::string_view glsl, const PreLinkCallback& callback = {}); + bool GetComputeProgram(Program* out_program, const std::string_view glsl, const PreLinkCallback& callback = {}); + private: static constexpr u32 FILE_VERSION = 1; @@ -94,6 +97,8 @@ namespace GL void Close(); bool Recreate(); + bool WriteToBlobFile(const CacheIndexKey& key, const std::vector& prog_data, u32 prog_format); + std::optional CompileProgram(const std::string_view& vertex_shader, const std::string_view& geometry_shader, const std::string_view& fragment_shader, const PreLinkCallback& callback, bool set_retrievable); @@ -101,6 +106,9 @@ namespace GL const std::string_view& geometry_shader, const std::string_view& fragment_shader, const PreLinkCallback& callback); + std::optional CompileComputeProgram(const std::string_view& glsl, const PreLinkCallback& callback, bool set_retrievable); + std::optional CompileAndAddComputeProgram(const CacheIndexKey& key, const std::string_view& glsl, const PreLinkCallback& callback); + std::string m_base_path; std::FILE* m_index_file = nullptr; std::FILE* m_blob_file = nullptr; diff --git a/common/General.h b/common/General.h index 8c62763d89..7e69236999 100644 --- a/common/General.h +++ b/common/General.h @@ -16,6 +16,8 @@ #pragma once #include +#include +#include #include #include "common/Pcsx2Defs.h" @@ -121,35 +123,66 @@ static __fi PageProtectionMode PageAccess_Any() // platform prior to wxWidgets .. it should prolly be removed -- air) namespace HostSys { - void* MmapReserve(uptr base, size_t size); - bool MmapCommit(uptr base, size_t size, const PageProtectionMode& mode); - void MmapReset(uptr base, size_t size); - - void* MmapReservePtr(void* base, size_t size); - bool MmapCommitPtr(void* base, size_t size, const PageProtectionMode& mode); - void MmapResetPtr(void* base, size_t size); - // Maps a block of memory for use as a recompiled code buffer. // Returns NULL on allocation failure. - extern void* Mmap(uptr base, size_t size); + extern void* Mmap(void* base, size_t size, const PageProtectionMode& mode); // Unmaps a block allocated by SysMmap - extern void Munmap(uptr base, size_t size); + extern void Munmap(void* base, size_t size); extern void MemProtect(void* baseaddr, size_t size, const PageProtectionMode& mode); - extern void Munmap(void* base, size_t size); - template void MemProtectStatic(u8 (&arr)[size], const PageProtectionMode& mode) { MemProtect(arr, size, mode); } -} // namespace HostSys + + extern std::string GetFileMappingName(const char* prefix); + extern void* CreateSharedMemory(const char* name, size_t size); + extern void DestroySharedMemory(void* ptr); + extern void* MapSharedMemory(void* handle, size_t offset, void* baseaddr, size_t size, const PageProtectionMode& mode); + extern void UnmapSharedMemory(void* baseaddr, size_t size); +} + +class SharedMemoryMappingArea +{ +public: + static std::unique_ptr Create(size_t size); + + ~SharedMemoryMappingArea(); + + __fi size_t GetSize() const { return m_size; } + __fi size_t GetNumPages() const { return m_num_pages; } + + __fi u8* BasePointer() const { return m_base_ptr; } + __fi u8* OffsetPointer(size_t offset) const { return m_base_ptr + offset; } + __fi u8* PagePointer(size_t page) const { return m_base_ptr + __pagesize * page; } + + u8* Map(void* file_handle, size_t file_offset, void* map_base, size_t map_size, const PageProtectionMode& mode); + bool Unmap(void* map_base, size_t map_size); + +private: + SharedMemoryMappingArea(u8* base_ptr, size_t size, size_t num_pages); + + u8* m_base_ptr; + size_t m_size; + size_t m_num_pages; + size_t m_num_mappings = 0; + +#ifdef _WIN32 + using PlaceholderMap = std::map; + + PlaceholderMap::iterator FindPlaceholder(size_t page); + + PlaceholderMap m_placeholder_ranges; +#endif +}; + // Safe version of Munmap -- NULLs the pointer variable immediately after free'ing it. #define SafeSysMunmap(ptr, size) \ - ((void)(HostSys::Munmap((uptr)(ptr), size), (ptr) = 0)) + ((void)(HostSys::Munmap(ptr, size), (ptr) = 0)) extern void InitCPUTicks(); extern u64 GetTickFrequency(); @@ -165,4 +198,9 @@ extern const u32 SPIN_TIME_NS; extern std::string GetOSVersionString(); -void ScreensaverAllow(bool allow); +namespace Common +{ + /// Abstracts platform-specific code for asynchronously playing a sound. + /// On Windows, this will use PlaySound(). On Linux, it will shell out to aplay. On MacOS, it uses NSSound. + bool PlaySoundAsync(const char* path); +} // namespace Common diff --git a/common/HTTPDownloader.cpp b/common/HTTPDownloader.cpp new file mode 100644 index 0000000000..205f80e6b2 --- /dev/null +++ b/common/HTTPDownloader.cpp @@ -0,0 +1,364 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "common/PrecompiledHeader.h" + +#include "common/HTTPDownloader.h" +#include "common/Assertions.h" +#include "common/Console.h" +#include "common/StringUtil.h" +#include "common/Timer.h" + +using namespace Common; + +static constexpr float DEFAULT_TIMEOUT_IN_SECONDS = 30; +static constexpr u32 DEFAULT_MAX_ACTIVE_REQUESTS = 4; + +const char HTTPDownloader::DEFAULT_USER_AGENT[] = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0"; + +HTTPDownloader::HTTPDownloader() + : m_timeout(DEFAULT_TIMEOUT_IN_SECONDS) + , m_max_active_requests(DEFAULT_MAX_ACTIVE_REQUESTS) +{ +} + +HTTPDownloader::~HTTPDownloader() = default; + +void HTTPDownloader::SetTimeout(float timeout) +{ + m_timeout = timeout; +} + +void HTTPDownloader::SetMaxActiveRequests(u32 max_active_requests) +{ + pxAssert(max_active_requests > 0); + m_max_active_requests = max_active_requests; +} + +void HTTPDownloader::CreateRequest(std::string url, Request::Callback callback) +{ + Request* req = InternalCreateRequest(); + req->parent = this; + req->type = Request::Type::Get; + req->url = std::move(url); + req->callback = std::move(callback); + req->start_time = Timer::GetCurrentValue(); + + std::unique_lock lock(m_pending_http_request_lock); + if (LockedGetActiveRequestCount() < m_max_active_requests) + { + if (!StartRequest(req)) + return; + } + + LockedAddRequest(req); +} + +void HTTPDownloader::CreatePostRequest(std::string url, std::string post_data, Request::Callback callback) +{ + Request* req = InternalCreateRequest(); + req->parent = this; + req->type = Request::Type::Post; + req->url = std::move(url); + req->post_data = std::move(post_data); + req->callback = std::move(callback); + req->start_time = Timer::GetCurrentValue(); + + std::unique_lock lock(m_pending_http_request_lock); + if (LockedGetActiveRequestCount() < m_max_active_requests) + { + if (!StartRequest(req)) + return; + } + + LockedAddRequest(req); +} + +void HTTPDownloader::LockedPollRequests(std::unique_lock& lock) +{ + if (m_pending_http_requests.empty()) + return; + + InternalPollRequests(); + + const Common::Timer::Value current_time = Timer::GetCurrentValue(); + u32 active_requests = 0; + u32 unstarted_requests = 0; + + for (size_t index = 0; index < m_pending_http_requests.size();) + { + Request* req = m_pending_http_requests[index]; + if (req->state == Request::State::Pending) + { + unstarted_requests++; + index++; + continue; + } + + if (req->state == Request::State::Started && current_time >= req->start_time && + Common::Timer::ConvertValueToSeconds(current_time - req->start_time) >= m_timeout) + { + // request timed out + Console.Error("Request for '%s' timed out", req->url.c_str()); + + req->state.store(Request::State::Cancelled); + m_pending_http_requests.erase(m_pending_http_requests.begin() + index); + lock.unlock(); + + req->callback(-1, req->content_type, Request::Data()); + + CloseRequest(req); + + lock.lock(); + continue; + } + + if (req->state != Request::State::Complete) + { + active_requests++; + index++; + continue; + } + + // request complete + DevCon.WriteLn("Request for '%s' complete, returned status code %u and %zu bytes", req->url.c_str(), + req->status_code, req->data.size()); + m_pending_http_requests.erase(m_pending_http_requests.begin() + index); + + // run callback with lock unheld + lock.unlock(); + req->callback(req->status_code, req->content_type, std::move(req->data)); + CloseRequest(req); + lock.lock(); + } + + // start new requests when we finished some + if (unstarted_requests > 0 && active_requests < m_max_active_requests) + { + for (size_t index = 0; index < m_pending_http_requests.size();) + { + Request* req = m_pending_http_requests[index]; + if (req->state != Request::State::Pending) + { + index++; + continue; + } + + if (!StartRequest(req)) + { + m_pending_http_requests.erase(m_pending_http_requests.begin() + index); + continue; + } + + active_requests++; + index++; + + if (active_requests >= m_max_active_requests) + break; + } + } +} + +void HTTPDownloader::PollRequests() +{ + std::unique_lock lock(m_pending_http_request_lock); + LockedPollRequests(lock); +} + +void HTTPDownloader::WaitForAllRequests() +{ + std::unique_lock lock(m_pending_http_request_lock); + while (!m_pending_http_requests.empty()) + LockedPollRequests(lock); +} + +void HTTPDownloader::LockedAddRequest(Request* request) +{ + m_pending_http_requests.push_back(request); +} + +u32 HTTPDownloader::LockedGetActiveRequestCount() +{ + u32 count = 0; + for (Request* req : m_pending_http_requests) + { + if (req->state == Request::State::Started || req->state == Request::State::Receiving) + count++; + } + return count; +} + +bool HTTPDownloader::HasAnyRequests() +{ + std::unique_lock lock(m_pending_http_request_lock); + return !m_pending_http_requests.empty(); +} + +std::string HTTPDownloader::URLEncode(const std::string_view& str) +{ + std::string ret; + ret.reserve(str.length() + ((str.length() + 3) / 4) * 3); + + for (size_t i = 0, l = str.size(); i < l; i++) + { + const char c = str[i]; + if ((c >= '0' && c <= '9') || + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + c == '-' || c == '_' || c == '.' || c == '!' || c == '~' || + c == '*' || c == '\'' || c == '(' || c == ')') + { + ret.push_back(c); + } + else + { + ret.push_back('%'); + + const unsigned char n1 = static_cast(c) >> 4; + const unsigned char n2 = static_cast(c) & 0x0F; + ret.push_back((n1 >= 10) ? ('a' + (n1 - 10)) : ('0' + n1)); + ret.push_back((n2 >= 10) ? ('a' + (n2 - 10)) : ('0' + n2)); + } + } + + return ret; +} + +std::string HTTPDownloader::URLDecode(const std::string_view& str) +{ + std::string ret; + ret.reserve(str.length()); + + for (size_t i = 0, l = str.size(); i < l; i++) + { + const char c = str[i]; + if (c == '+') + { + ret.push_back(c); + } + else if (c == '%') + { + if ((i + 2) >= str.length()) + break; + + const char clower = str[i + 1]; + const char cupper = str[i + 2]; + const unsigned char lower = (clower >= '0' && clower <= '9') ? static_cast(clower - '0') : ((clower >= 'a' && clower <= 'f') ? static_cast(clower - 'a') : ((clower >= 'A' && clower <= 'F') ? static_cast(clower - 'A') : 0)); + const unsigned char upper = (cupper >= '0' && cupper <= '9') ? static_cast(cupper - '0') : ((cupper >= 'a' && cupper <= 'f') ? static_cast(cupper - 'a') : ((cupper >= 'A' && cupper <= 'F') ? static_cast(cupper - 'A') : 0)); + const char dch = static_cast(lower | (upper << 4)); + ret.push_back(dch); + } + else + { + ret.push_back(c); + } + } + + return std::string(str); +} + +std::string HTTPDownloader::GetExtensionForContentType(const std::string& content_type) +{ + // Based on https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types + static constexpr const char* table[][2] = { + {"audio/aac", "aac"}, + {"application/x-abiword", "abw"}, + {"application/x-freearc", "arc"}, + {"image/avif", "avif"}, + {"video/x-msvideo", "avi"}, + {"application/vnd.amazon.ebook", "azw"}, + {"application/octet-stream", "bin"}, + {"image/bmp", "bmp"}, + {"application/x-bzip", "bz"}, + {"application/x-bzip2", "bz2"}, + {"application/x-cdf", "cda"}, + {"application/x-csh", "csh"}, + {"text/css", "css"}, + {"text/csv", "csv"}, + {"application/msword", "doc"}, + {"application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx"}, + {"application/vnd.ms-fontobject", "eot"}, + {"application/epub+zip", "epub"}, + {"application/gzip", "gz"}, + {"image/gif", "gif"}, + {"text/html", "htm"}, + {"image/vnd.microsoft.icon", "ico"}, + {"text/calendar", "ics"}, + {"application/java-archive", "jar"}, + {"image/jpeg", "jpg"}, + {"text/javascript", "js"}, + {"application/json", "json"}, + {"application/ld+json", "jsonld"}, + {"audio/midi audio/x-midi", "mid"}, + {"text/javascript", "mjs"}, + {"audio/mpeg", "mp3"}, + {"video/mp4", "mp4"}, + {"video/mpeg", "mpeg"}, + {"application/vnd.apple.installer+xml", "mpkg"}, + {"application/vnd.oasis.opendocument.presentation", "odp"}, + {"application/vnd.oasis.opendocument.spreadsheet", "ods"}, + {"application/vnd.oasis.opendocument.text", "odt"}, + {"audio/ogg", "oga"}, + {"video/ogg", "ogv"}, + {"application/ogg", "ogx"}, + {"audio/opus", "opus"}, + {"font/otf", "otf"}, + {"image/png", "png"}, + {"application/pdf", "pdf"}, + {"application/x-httpd-php", "php"}, + {"application/vnd.ms-powerpoint", "ppt"}, + {"application/vnd.openxmlformats-officedocument.presentationml.presentation", "pptx"}, + {"application/vnd.rar", "rar"}, + {"application/rtf", "rtf"}, + {"application/x-sh", "sh"}, + {"image/svg+xml", "svg"}, + {"application/x-tar", "tar"}, + {"image/tiff", "tif"}, + {"video/mp2t", "ts"}, + {"font/ttf", "ttf"}, + {"text/plain", "txt"}, + {"application/vnd.visio", "vsd"}, + {"audio/wav", "wav"}, + {"audio/webm", "weba"}, + {"video/webm", "webm"}, + {"image/webp", "webp"}, + {"font/woff", "woff"}, + {"font/woff2", "woff2"}, + {"application/xhtml+xml", "xhtml"}, + {"application/vnd.ms-excel", "xls"}, + {"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xlsx"}, + {"application/xml", "xml"}, + {"text/xml", "xml"}, + {"application/vnd.mozilla.xul+xml", "xul"}, + {"application/zip", "zip"}, + {"video/3gpp", "3gp"}, + {"audio/3gpp", "3gp"}, + {"video/3gpp2", "3g2"}, + {"audio/3gpp2", "3g2"}, + {"application/x-7z-compressed", "7z"}, + }; + + std::string ret; + for (size_t i = 0; i < std::size(table); i++) + { + if (StringUtil::compareNoCase(table[i][0], content_type)) + { + ret = table[i][1]; + break; + } + } + return ret; +} diff --git a/common/HTTPDownloader.h b/common/HTTPDownloader.h new file mode 100644 index 0000000000..e8306c3474 --- /dev/null +++ b/common/HTTPDownloader.h @@ -0,0 +1,106 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "common/Pcsx2Defs.h" +#include +#include +#include +#include +#include +#include +#include + +namespace Common +{ + class HTTPDownloader + { + public: + enum : s32 + { + HTTP_OK = 200 + }; + + struct Request + { + using Data = std::vector; + using Callback = std::function; + + enum class Type + { + Get, + Post, + }; + + enum class State + { + Pending, + Cancelled, + Started, + Receiving, + Complete, + }; + + HTTPDownloader* parent; + Callback callback; + std::string url; + std::string post_data; + std::string content_type; + Data data; + u64 start_time; + s32 status_code = 0; + u32 content_length = 0; + Type type = Type::Get; + std::atomic state{State::Pending}; + }; + + HTTPDownloader(); + virtual ~HTTPDownloader(); + + static std::unique_ptr Create(const char* user_agent = DEFAULT_USER_AGENT); + static std::string URLEncode(const std::string_view& str); + static std::string URLDecode(const std::string_view& str); + static std::string GetExtensionForContentType(const std::string& content_type); + + void SetTimeout(float timeout); + void SetMaxActiveRequests(u32 max_active_requests); + + void CreateRequest(std::string url, Request::Callback callback); + void CreatePostRequest(std::string url, std::string post_data, Request::Callback callback); + void PollRequests(); + void WaitForAllRequests(); + bool HasAnyRequests(); + + static const char DEFAULT_USER_AGENT[]; + + protected: + virtual Request* InternalCreateRequest() = 0; + virtual void InternalPollRequests() = 0; + + virtual bool StartRequest(Request* request) = 0; + virtual void CloseRequest(Request* request) = 0; + + void LockedAddRequest(Request* request); + u32 LockedGetActiveRequestCount(); + void LockedPollRequests(std::unique_lock& lock); + + float m_timeout; + u32 m_max_active_requests; + + std::mutex m_pending_http_request_lock; + std::vector m_pending_http_requests; + }; + +} // namespace Common \ No newline at end of file diff --git a/common/HTTPDownloaderCurl.cpp b/common/HTTPDownloaderCurl.cpp new file mode 100644 index 0000000000..8d20a3a36a --- /dev/null +++ b/common/HTTPDownloaderCurl.cpp @@ -0,0 +1,185 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "common/PrecompiledHeader.h" + +#include "common/HTTPDownloaderCurl.h" +#include "common/Assertions.h" +#include "common/Console.h" +#include "common/StringUtil.h" +#include "common/Timer.h" + +#include +#include +#include +#include + +using namespace Common; + +HTTPDownloaderCurl::HTTPDownloaderCurl() + : HTTPDownloader() +{ +} + +HTTPDownloaderCurl::~HTTPDownloaderCurl() = default; + +std::unique_ptr HTTPDownloader::Create(const char* user_agent) +{ + std::unique_ptr instance(std::make_unique()); + if (!instance->Initialize(user_agent)) + return {}; + + return instance; +} + +static bool s_curl_initialized = false; +static std::once_flag s_curl_initialized_once_flag; + +bool HTTPDownloaderCurl::Initialize(const char* user_agent) +{ + if (!s_curl_initialized) + { + std::call_once(s_curl_initialized_once_flag, []() { + s_curl_initialized = curl_global_init(CURL_GLOBAL_ALL) == CURLE_OK; + if (s_curl_initialized) + { + std::atexit([]() { + curl_global_cleanup(); + s_curl_initialized = false; + }); + } + }); + if (!s_curl_initialized) + { + Console.Error("curl_global_init() failed"); + return false; + } + } + + m_user_agent = user_agent; + m_thread_pool = std::make_unique(m_max_active_requests); + return true; +} + +size_t HTTPDownloaderCurl::WriteCallback(char* ptr, size_t size, size_t nmemb, void* userdata) +{ + Request* req = static_cast(userdata); + const size_t current_size = req->data.size(); + const size_t transfer_size = size * nmemb; + const size_t new_size = current_size + transfer_size; + req->data.resize(new_size); + std::memcpy(&req->data[current_size], ptr, transfer_size); + return nmemb; +} + +void HTTPDownloaderCurl::ProcessRequest(Request* req) +{ + std::unique_lock cancel_lock(m_cancel_mutex); + if (req->closed.load()) + return; + + cancel_lock.unlock(); + + // Apparently OpenSSL can fire SIGPIPE... + sigset_t old_block_mask = {}; + sigset_t new_block_mask = {}; + sigemptyset(&old_block_mask); + sigemptyset(&new_block_mask); + sigaddset(&new_block_mask, SIGPIPE); + if (pthread_sigmask(SIG_BLOCK, &new_block_mask, &old_block_mask) != 0) + Console.Warning("Failed to block SIGPIPE"); + + req->start_time = Common::Timer::GetCurrentValue(); + int ret = curl_easy_perform(req->handle); + if (ret == CURLE_OK) + { + long response_code = 0; + curl_easy_getinfo(req->handle, CURLINFO_RESPONSE_CODE, &response_code); + req->status_code = static_cast(response_code); + + char* content_type = nullptr; + if (!curl_easy_getinfo(req->handle, CURLINFO_CONTENT_TYPE, &content_type) && content_type) + req->content_type = content_type; + + DevCon.WriteLn("Request for '%s' returned status code %d and %zu bytes", req->url.c_str(), req->status_code, + req->data.size()); + } + else + { + Console.Error("Request for '%s' returned %d", req->url.c_str(), ret); + } + + curl_easy_cleanup(req->handle); + + if (pthread_sigmask(SIG_UNBLOCK, &new_block_mask, &old_block_mask) != 0) + Console.Warning("Failed to unblock SIGPIPE"); + + cancel_lock.lock(); + req->state = Request::State::Complete; + if (req->closed.load()) + delete req; + else + req->closed.store(true); +} + +HTTPDownloader::Request* HTTPDownloaderCurl::InternalCreateRequest() +{ + Request* req = new Request(); + req->handle = curl_easy_init(); + if (!req->handle) + { + delete req; + return nullptr; + } + + return req; +} + +void HTTPDownloaderCurl::InternalPollRequests() +{ + // noop - uses thread pool +} + +bool HTTPDownloaderCurl::StartRequest(HTTPDownloader::Request* request) +{ + Request* req = static_cast(request); + curl_easy_setopt(req->handle, CURLOPT_URL, request->url.c_str()); + curl_easy_setopt(req->handle, CURLOPT_USERAGENT, m_user_agent.c_str()); + curl_easy_setopt(req->handle, CURLOPT_WRITEFUNCTION, &HTTPDownloaderCurl::WriteCallback); + curl_easy_setopt(req->handle, CURLOPT_WRITEDATA, req); + curl_easy_setopt(req->handle, CURLOPT_NOSIGNAL, 1); + + if (request->type == Request::Type::Post) + { + curl_easy_setopt(req->handle, CURLOPT_POST, 1L); + curl_easy_setopt(req->handle, CURLOPT_POSTFIELDS, request->post_data.c_str()); + } + + DbgCon.WriteLn("Started HTTP request for '%s'", req->url.c_str()); + req->state = Request::State::Started; + req->start_time = Common::Timer::GetCurrentValue(); + m_thread_pool->Schedule(std::bind(&HTTPDownloaderCurl::ProcessRequest, this, req)); + return true; +} + +void HTTPDownloaderCurl::CloseRequest(HTTPDownloader::Request* request) +{ + std::unique_lock cancel_lock(m_cancel_mutex); + Request* req = static_cast(request); + if (req->closed.load()) + delete req; + else + req->closed.store(true); +} diff --git a/common/HTTPDownloaderCurl.h b/common/HTTPDownloaderCurl.h new file mode 100644 index 0000000000..79877c40b7 --- /dev/null +++ b/common/HTTPDownloaderCurl.h @@ -0,0 +1,54 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "common/HTTPDownloader.h" +#include "common/ThreadPool.h" +#include +#include +#include +#include + +namespace Common +{ + class HTTPDownloaderCurl final : public HTTPDownloader + { + public: + HTTPDownloaderCurl(); + ~HTTPDownloaderCurl() override; + + bool Initialize(const char* user_agent); + + protected: + Request* InternalCreateRequest() override; + void InternalPollRequests() override; + bool StartRequest(HTTPDownloader::Request* request) override; + void CloseRequest(HTTPDownloader::Request* request) override; + + private: + struct Request : HTTPDownloader::Request + { + CURL* handle = nullptr; + std::atomic_bool closed{false}; + }; + + static size_t WriteCallback(char* ptr, size_t size, size_t nmemb, void* userdata); + void ProcessRequest(Request* req); + + std::string m_user_agent; + std::unique_ptr m_thread_pool; + std::mutex m_cancel_mutex; + }; +} // namespace Common diff --git a/common/HTTPDownloaderWinHTTP.cpp b/common/HTTPDownloaderWinHTTP.cpp new file mode 100644 index 0000000000..340a34e5fc --- /dev/null +++ b/common/HTTPDownloaderWinHTTP.cpp @@ -0,0 +1,331 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "common/PrecompiledHeader.h" + +#include "common/HTTPDownloaderWinHTTP.h" +#include "common/Assertions.h" +#include "common/Console.h" +#include "common/StringUtil.h" +#include "common/Timer.h" +#include +#include + +#pragma comment(lib, "winhttp.lib") + +using namespace Common; + +HTTPDownloaderWinHttp::HTTPDownloaderWinHttp() + : HTTPDownloader() +{ +} + +HTTPDownloaderWinHttp::~HTTPDownloaderWinHttp() +{ + if (m_hSession) + { + WinHttpSetStatusCallback(m_hSession, nullptr, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, NULL); + WinHttpCloseHandle(m_hSession); + } +} + +std::unique_ptr HTTPDownloader::Create(const char* user_agent) +{ + std::unique_ptr instance(std::make_unique()); + if (!instance->Initialize(user_agent)) + return {}; + + return instance; +} + +bool HTTPDownloaderWinHttp::Initialize(const char* user_agent) +{ + const DWORD dwAccessType = WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY; + + m_hSession = WinHttpOpen(StringUtil::UTF8StringToWideString(user_agent).c_str(), dwAccessType, nullptr, nullptr, + WINHTTP_FLAG_ASYNC); + if (m_hSession == NULL) + { + Console.Error("WinHttpOpen() failed: %u", GetLastError()); + return false; + } + + const DWORD notification_flags = WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | WINHTTP_CALLBACK_FLAG_REQUEST_ERROR | + WINHTTP_CALLBACK_FLAG_HANDLES | WINHTTP_CALLBACK_FLAG_SECURE_FAILURE; + if (WinHttpSetStatusCallback(m_hSession, HTTPStatusCallback, notification_flags, NULL) == + WINHTTP_INVALID_STATUS_CALLBACK) + { + Console.Error("WinHttpSetStatusCallback() failed: %u", GetLastError()); + return false; + } + + return true; +} + +void CALLBACK HTTPDownloaderWinHttp::HTTPStatusCallback(HINTERNET hRequest, DWORD_PTR dwContext, DWORD dwInternetStatus, + LPVOID lpvStatusInformation, DWORD dwStatusInformationLength) +{ + Request* req = reinterpret_cast(dwContext); + switch (dwInternetStatus) + { + case WINHTTP_CALLBACK_STATUS_HANDLE_CREATED: + return; + + case WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING: + { + if (!req) + return; + + pxAssert(hRequest == req->hRequest); + + HTTPDownloaderWinHttp* parent = static_cast(req->parent); + std::unique_lock lock(parent->m_pending_http_request_lock); + pxAssertRel(std::none_of(parent->m_pending_http_requests.begin(), parent->m_pending_http_requests.end(), + [req](HTTPDownloader::Request* it) { return it == req; }), + "Request is not pending at close time"); + + // we can clean up the connection as well + pxAssert(req->hConnection != NULL); + WinHttpCloseHandle(req->hConnection); + delete req; + return; + } + + case WINHTTP_CALLBACK_STATUS_REQUEST_ERROR: + { + const WINHTTP_ASYNC_RESULT* res = reinterpret_cast(lpvStatusInformation); + Console.Error("WinHttp async function %p returned error %u", res->dwResult, res->dwError); + req->status_code = -1; + req->state.store(Request::State::Complete); + return; + } + case WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE: + { + DbgCon.WriteLn("SendRequest complete"); + if (!WinHttpReceiveResponse(hRequest, nullptr)) + { + Console.Error("WinHttpReceiveResponse() failed: %u", GetLastError()); + req->status_code = -1; + req->state.store(Request::State::Complete); + } + + return; + } + case WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE: + { + DbgCon.WriteLn("Headers available"); + + DWORD buffer_size = sizeof(req->status_code); + if (!WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, + WINHTTP_HEADER_NAME_BY_INDEX, &req->status_code, &buffer_size, WINHTTP_NO_HEADER_INDEX)) + { + Console.Error("WinHttpQueryHeaders() for status code failed: %u", GetLastError()); + req->status_code = -1; + req->state.store(Request::State::Complete); + return; + } + + buffer_size = sizeof(req->content_length); + if (!WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, + WINHTTP_HEADER_NAME_BY_INDEX, &req->content_length, &buffer_size, + WINHTTP_NO_HEADER_INDEX)) + { + if (GetLastError() != ERROR_WINHTTP_HEADER_NOT_FOUND) + Console.Warning("WinHttpQueryHeaders() for content length failed: %u", GetLastError()); + + req->content_length = 0; + } + + DWORD content_type_length = 0; + if (!WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_CONTENT_TYPE, WINHTTP_HEADER_NAME_BY_INDEX, + WINHTTP_NO_OUTPUT_BUFFER, &content_type_length, WINHTTP_NO_HEADER_INDEX) && + GetLastError() == ERROR_INSUFFICIENT_BUFFER && content_type_length >= sizeof(content_type_length)) + { + std::wstring content_type_wstring; + content_type_wstring.resize((content_type_length / sizeof(wchar_t)) - 1); + if (WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_CONTENT_TYPE, WINHTTP_HEADER_NAME_BY_INDEX, + content_type_wstring.data(), &content_type_length, WINHTTP_NO_HEADER_INDEX)) + { + req->content_type = StringUtil::WideStringToUTF8String(content_type_wstring); + } + } + + DbgCon.WriteLn("Status code %d, content-length is %u, content-type is %s", req->status_code, req->content_length, + req->content_type.c_str()); + req->data.reserve(req->content_length); + req->state = Request::State::Receiving; + + // start reading + if (!WinHttpQueryDataAvailable(hRequest, nullptr) && GetLastError() != ERROR_IO_PENDING) + { + Console.Error("WinHttpQueryDataAvailable() failed: %u", GetLastError()); + req->status_code = -1; + req->state.store(Request::State::Complete); + } + + return; + } + case WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE: + { + DWORD bytes_available; + std::memcpy(&bytes_available, lpvStatusInformation, sizeof(bytes_available)); + if (bytes_available == 0) + { + // end of request + DbgCon.WriteLn("End of request '%s', %zu bytes received", req->url.c_str(), req->data.size()); + req->state.store(Request::State::Complete); + return; + } + + // start the transfer + DbgCon.WriteLn("%u bytes available", bytes_available); + req->io_position = static_cast(req->data.size()); + req->data.resize(req->io_position + bytes_available); + if (!WinHttpReadData(hRequest, req->data.data() + req->io_position, bytes_available, nullptr) && + GetLastError() != ERROR_IO_PENDING) + { + Console.Error("WinHttpReadData() failed: %u", GetLastError()); + req->status_code = -1; + req->state.store(Request::State::Complete); + } + + return; + } + case WINHTTP_CALLBACK_STATUS_READ_COMPLETE: + { + DbgCon.WriteLn("Read of %u complete", dwStatusInformationLength); + + const u32 new_size = req->io_position + dwStatusInformationLength; + pxAssertRel(new_size <= req->data.size(), "HTTP overread occurred"); + req->data.resize(new_size); + req->start_time = Common::Timer::GetCurrentValue(); + + if (!WinHttpQueryDataAvailable(hRequest, nullptr) && GetLastError() != ERROR_IO_PENDING) + { + Console.Error("WinHttpQueryDataAvailable() failed: %u", GetLastError()); + req->status_code = -1; + req->state.store(Request::State::Complete); + } + + return; + } + default: + // unhandled, ignore + return; + } +} + +HTTPDownloader::Request* HTTPDownloaderWinHttp::InternalCreateRequest() +{ + Request* req = new Request(); + return req; +} + +void HTTPDownloaderWinHttp::InternalPollRequests() +{ + // noop - it uses windows's worker threads +} + +bool HTTPDownloaderWinHttp::StartRequest(HTTPDownloader::Request* request) +{ + Request* req = static_cast(request); + + std::wstring host_name; + host_name.resize(req->url.size()); + req->object_name.resize(req->url.size()); + + URL_COMPONENTSW uc = {}; + uc.dwStructSize = sizeof(uc); + uc.lpszHostName = host_name.data(); + uc.dwHostNameLength = static_cast(host_name.size()); + uc.lpszUrlPath = req->object_name.data(); + uc.dwUrlPathLength = static_cast(req->object_name.size()); + + const std::wstring url_wide(StringUtil::UTF8StringToWideString(req->url)); + if (!WinHttpCrackUrl(url_wide.c_str(), static_cast(url_wide.size()), 0, &uc)) + { + Console.Error("WinHttpCrackUrl() failed: %u", GetLastError()); + req->callback(-1, req->content_type, Request::Data()); + delete req; + return false; + } + + host_name.resize(uc.dwHostNameLength); + req->object_name.resize(uc.dwUrlPathLength); + + req->hConnection = WinHttpConnect(m_hSession, host_name.c_str(), uc.nPort, 0); + if (!req->hConnection) + { + Console.Error("Failed to start HTTP request for '%s': %u", req->url.c_str(), GetLastError()); + req->callback(-1, req->content_type, Request::Data()); + delete req; + return false; + } + + const DWORD request_flags = uc.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0; + req->hRequest = + WinHttpOpenRequest(req->hConnection, (req->type == HTTPDownloader::Request::Type::Post) ? L"POST" : L"GET", + req->object_name.c_str(), NULL, NULL, NULL, request_flags); + if (!req->hRequest) + { + Console.Error("WinHttpOpenRequest() failed: %u", GetLastError()); + WinHttpCloseHandle(req->hConnection); + return false; + } + + BOOL result; + if (req->type == HTTPDownloader::Request::Type::Post) + { + const std::wstring_view additional_headers(L"Content-Type: application/x-www-form-urlencoded\r\n"); + result = WinHttpSendRequest(req->hRequest, additional_headers.data(), static_cast(additional_headers.size()), + req->post_data.data(), static_cast(req->post_data.size()), + static_cast(req->post_data.size()), reinterpret_cast(req)); + } + else + { + result = WinHttpSendRequest(req->hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, + reinterpret_cast(req)); + } + + if (!result && GetLastError() != ERROR_IO_PENDING) + { + Console.Error("WinHttpSendRequest() failed: %u", GetLastError()); + req->status_code = -1; + req->state.store(Request::State::Complete); + } + + DevCon.WriteLn("Started HTTP request for '%s'", req->url.c_str()); + req->state = Request::State::Started; + req->start_time = Common::Timer::GetCurrentValue(); + return true; +} + +void HTTPDownloaderWinHttp::CloseRequest(HTTPDownloader::Request* request) +{ + Request* req = static_cast(request); + + if (req->hRequest != NULL) + { + // req will be freed by the callback. + // the callback can fire immediately here if there's nothing running async, so don't touch req afterwards + WinHttpCloseHandle(req->hRequest); + return; + } + + if (req->hConnection != NULL) + WinHttpCloseHandle(req->hConnection); + + delete req; +} diff --git a/common/HTTPDownloaderWinHTTP.h b/common/HTTPDownloaderWinHTTP.h new file mode 100644 index 0000000000..5200cfea01 --- /dev/null +++ b/common/HTTPDownloaderWinHTTP.h @@ -0,0 +1,53 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +#include "common/HTTPDownloader.h" +#include "common/RedtapeWindows.h" + +#include + +namespace Common +{ + class HTTPDownloaderWinHttp final : public HTTPDownloader + { + public: + HTTPDownloaderWinHttp(); + ~HTTPDownloaderWinHttp() override; + + bool Initialize(const char* user_agent); + + protected: + Request* InternalCreateRequest() override; + void InternalPollRequests() override; + bool StartRequest(HTTPDownloader::Request* request) override; + void CloseRequest(HTTPDownloader::Request* request) override; + + private: + struct Request : HTTPDownloader::Request + { + std::wstring object_name; + HINTERNET hConnection = NULL; + HINTERNET hRequest = NULL; + u32 io_position = 0; + }; + + static void CALLBACK HTTPStatusCallback(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, + LPVOID lpvStatusInformation, DWORD dwStatusInformationLength); + + HINTERNET m_hSession = NULL; + }; +} // namespace Common \ No newline at end of file diff --git a/common/HeterogeneousContainers.h b/common/HeterogeneousContainers.h new file mode 100644 index 0000000000..133fa37c1f --- /dev/null +++ b/common/HeterogeneousContainers.h @@ -0,0 +1,113 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2010 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +/** + * Provides a map template which doesn't require heap allocations for lookups. + */ + +#pragma once + +#include "Pcsx2Defs.h" +#include +#include +#include +#include +#include + +namespace detail +{ + struct transparent_string_hash + { + using is_transparent = void; + + std::size_t operator()(const std::string_view& v) const { return std::hash{}(v); } + std::size_t operator()(const std::string& s) const { return std::hash{}(s); } + std::size_t operator()(const char* s) const { return operator()(std::string_view(s)); } + }; + + struct transparent_string_equal + { + using is_transparent = void; + + bool operator()(const std::string& lhs, const std::string_view& rhs) const { return lhs == rhs; } + bool operator()(const std::string& lhs, const std::string& rhs) const { return lhs == rhs; } + bool operator()(const std::string& lhs, const char* rhs) const { return lhs == rhs; } + bool operator()(const std::string_view& lhs, const std::string& rhs) const { return lhs == rhs; } + bool operator()(const char* lhs, const std::string& rhs) const { return lhs == rhs; } + }; + + struct transparent_string_less + { + using is_transparent = void; + + bool operator()(const std::string& lhs, const std::string_view& rhs) const { return lhs < rhs; } + bool operator()(const std::string& lhs, const std::string& rhs) const { return lhs < rhs; } + bool operator()(const std::string& lhs, const char* rhs) const { return lhs < rhs; } + bool operator()(const std::string_view& lhs, const std::string& rhs) const { return lhs < rhs; } + bool operator()(const char* lhs, const std::string& rhs) const { return lhs < rhs; } + }; +} // namespace detail + +// This requires C++20, so fallback to ugly heap allocations if we don't have it. +#if __cplusplus >= 202002L +template +using UnorderedStringMap = + std::unordered_map; +template +using UnorderedStringMultimap = + std::unordered_multimap; +using UnorderedStringSet = + std::unordered_set; +using UnorderedStringMultiSet = + std::unordered_multiset; + +template +__fi typename UnorderedStringMap::const_iterator +UnorderedStringMapFind(const UnorderedStringMap& map, const KeyType& key) +{ + return map.find(key); +} +template +__fi typename UnorderedStringMap::iterator +UnorderedStringMapFind(UnorderedStringMap& map, const KeyType& key) +{ + return map.find(key); +} +#else +template +using UnorderedStringMap = std::unordered_map; +template +using UnorderedStringMultimap = std::unordered_multimap; +using UnorderedStringSet = std::unordered_set; +using UnorderedStringMultiSet = std::unordered_multiset; + +template +__fi typename UnorderedStringMap::const_iterator UnorderedStringMapFind(const UnorderedStringMap& map, const KeyType& key) +{ + return map.find(std::string(key)); +} +template +__fi typename UnorderedStringMap::iterator UnorderedStringMapFind(UnorderedStringMap& map, const KeyType& key) +{ + return map.find(std::string(key)); +} +#endif + +template +using StringMap = std::map; +template +using StringMultiMap = std::multimap; +using StringSet = std::set; +using StringMultiSet = std::multiset; diff --git a/common/Image.cpp b/common/Image.cpp new file mode 100644 index 0000000000..100f3ff749 --- /dev/null +++ b/common/Image.cpp @@ -0,0 +1,545 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" +#include "Image.h" +#include "FileSystem.h" +#include "Console.h" +#include "Path.h" +#include "ScopedGuard.h" +#include "StringUtil.h" + +#include "jpgd.h" +#include "jpge.h" +#include + +using namespace Common; + +static bool PNGBufferLoader(RGBA8Image* image, const void* buffer, size_t buffer_size); +static bool PNGBufferSaver(const RGBA8Image& image, std::vector* buffer, int quality); +static bool PNGFileLoader(RGBA8Image* image, const char* filename, std::FILE* fp); +static bool PNGFileSaver(const RGBA8Image& image, const char* filename, std::FILE* fp, int quality); + +static bool JPEGBufferLoader(RGBA8Image* image, const void* buffer, size_t buffer_size); +static bool JPEGBufferSaver(const RGBA8Image& image, std::vector* buffer, int quality); +static bool JPEGFileLoader(RGBA8Image* image, const char* filename, std::FILE* fp); +static bool JPEGFileSaver(const RGBA8Image& image, const char* filename, std::FILE* fp, int quality); + +struct FormatHandler +{ + const char* extension; + bool (*buffer_loader)(RGBA8Image*, const void*, size_t); + bool (*buffer_saver)(const RGBA8Image&, std::vector*, int); + bool (*file_loader)(RGBA8Image*, const char*, std::FILE*); + bool (*file_saver)(const RGBA8Image&, const char*, std::FILE*, int); +}; + +static constexpr FormatHandler s_format_handlers[] = { + {"png", PNGBufferLoader, PNGBufferSaver, PNGFileLoader, PNGFileSaver}, + {"jpg", JPEGBufferLoader, JPEGBufferSaver, JPEGFileLoader, JPEGFileSaver}, + {"jpeg", JPEGBufferLoader, JPEGBufferSaver, JPEGFileLoader, JPEGFileSaver}, +}; + +static const FormatHandler* GetFormatHandler(const std::string_view& extension) +{ + for (const FormatHandler& handler : s_format_handlers) + { + if (StringUtil::compareNoCase(extension, handler.extension)) + return &handler; + } + + return nullptr; +} + +RGBA8Image::RGBA8Image() = default; + +RGBA8Image::RGBA8Image(const RGBA8Image& copy) + : Image(copy) +{ +} + +RGBA8Image::RGBA8Image(u32 width, u32 height, const u32* pixels) + : Image(width, height, pixels) +{ +} + +RGBA8Image::RGBA8Image(RGBA8Image&& move) + : Image(move) +{ +} + +RGBA8Image& RGBA8Image::operator=(const RGBA8Image& copy) +{ + Image::operator=(copy); + return *this; +} + +RGBA8Image& RGBA8Image::operator=(RGBA8Image&& move) +{ + Image::operator=(move); + return *this; +} + +bool RGBA8Image::LoadFromFile(const char* filename) +{ + auto fp = FileSystem::OpenManagedCFile(filename, "rb"); + if (!fp) + return false; + + return LoadFromFile(filename, fp.get()); +} + +bool RGBA8Image::SaveToFile(const char* filename, int quality) const +{ + auto fp = FileSystem::OpenManagedCFile(filename, "wb"); + if (!fp) + return false; + + if (SaveToFile(filename, fp.get(), quality)) + return true; + + // save failed + fp.reset(); + FileSystem::DeleteFilePath(filename); + return false; +} + +bool RGBA8Image::LoadFromFile(const char* filename, std::FILE* fp) +{ + const std::string_view extension(Path::GetExtension(filename)); + const FormatHandler* handler = GetFormatHandler(extension); + if (!handler || !handler->file_loader) + { + Console.Error("(RGBA8Image::LoadFromFile) Unknown extension '%.*s'", + static_cast(extension.size()), extension.data()); + return false; + } + + return handler->file_loader(this, filename, fp); +} + +bool RGBA8Image::LoadFromBuffer(const char* filename, const void* buffer, size_t buffer_size) +{ + const std::string_view extension(Path::GetExtension(filename)); + const FormatHandler* handler = GetFormatHandler(extension); + if (!handler || !handler->buffer_loader) + { + Console.Error("(RGBA8Image::LoadFromBuffer) Unknown extension '%.*s'", + static_cast(extension.size()), extension.data()); + return false; + } + + return handler->buffer_loader(this, buffer, buffer_size); +} + +bool RGBA8Image::SaveToFile(const char* filename, std::FILE* fp, int quality) const +{ + const std::string_view extension(Path::GetExtension(filename)); + const FormatHandler* handler = GetFormatHandler(extension); + if (!handler || !handler->file_saver) + { + Console.Error("(RGBA8Image::SaveToFile) Unknown extension '%.*s'", + static_cast(extension.size()), extension.data()); + return false; + } + + if (!handler->file_saver(*this, filename, fp, quality)) + return false; + + return (std::fflush(fp) == 0); +} + +std::optional> RGBA8Image::SaveToBuffer(const char* filename, int quality) const +{ + std::optional> ret; + + const std::string_view extension(Path::GetExtension(filename)); + const FormatHandler* handler = GetFormatHandler(extension); + if (!handler || !handler->file_saver) + { + Console.Error("(RGBA8Image::SaveToBuffer) Unknown extension '%.*s'", + static_cast(extension.size()), extension.data()); + return ret; + } + + ret = std::vector(); + if (!handler->buffer_saver(*this, &ret.value(), quality)) + ret.reset(); + + return ret; +} + +static bool PNGCommonLoader(RGBA8Image* image, png_structp png_ptr, png_infop info_ptr, + std::vector& new_data, std::vector& row_pointers) +{ + png_read_info(png_ptr, info_ptr); + + const u32 width = png_get_image_width(png_ptr, info_ptr); + const u32 height = png_get_image_height(png_ptr, info_ptr); + const png_byte color_type = png_get_color_type(png_ptr, info_ptr); + const png_byte bit_depth = png_get_bit_depth(png_ptr, info_ptr); + + // Read any color_type into 8bit depth, RGBA format. + // See http://www.libpng.org/pub/png/libpng-manual.txt + + if (bit_depth == 16) + png_set_strip_16(png_ptr); + + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png_ptr); + + // PNG_COLOR_TYPE_GRAY_ALPHA is always 8 or 16bit depth. + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand_gray_1_2_4_to_8(png_ptr); + + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(png_ptr); + + // These color_type don't have an alpha channel then fill it with 0xff. + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_PALETTE) + png_set_filler(png_ptr, 0xFF, PNG_FILLER_AFTER); + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png_ptr); + + png_read_update_info(png_ptr, info_ptr); + + new_data.resize(width * height); + row_pointers.reserve(height); + for (u32 y = 0; y < height; y++) + row_pointers.push_back(reinterpret_cast(new_data.data() + y * width)); + + png_read_image(png_ptr, row_pointers.data()); + image->SetPixels(width, height, std::move(new_data)); + return true; +} + +bool PNGFileLoader(RGBA8Image* image, const char* filename, std::FILE* fp) +{ + png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + if (!png_ptr) + return false; + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, nullptr, nullptr); + return false; + } + + ScopedGuard cleanup([&png_ptr, &info_ptr]() { + png_destroy_read_struct(&png_ptr, &info_ptr, nullptr); + }); + + std::vector new_data; + std::vector row_pointers; + + if (setjmp(png_jmpbuf(png_ptr))) + return false; + + png_init_io(png_ptr, fp); + return PNGCommonLoader(image, png_ptr, info_ptr, new_data, row_pointers); +} + +bool PNGBufferLoader(RGBA8Image* image, const void* buffer, size_t buffer_size) +{ + png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + if (!png_ptr) + return false; + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, nullptr, nullptr); + return false; + } + + ScopedGuard cleanup([&png_ptr, &info_ptr]() { + png_destroy_read_struct(&png_ptr, &info_ptr, nullptr); + }); + + std::vector new_data; + std::vector row_pointers; + + if (setjmp(png_jmpbuf(png_ptr))) + return false; + + struct IOData + { + const u8* buffer; + size_t buffer_size; + size_t buffer_pos; + }; + IOData data = {static_cast(buffer), buffer_size, 0}; + + png_set_read_fn(png_ptr, &data, [](png_structp png_ptr, png_bytep data_ptr, png_size_t size) { + IOData* data = static_cast(png_get_io_ptr(png_ptr)); + const size_t read_size = std::min(data->buffer_size - data->buffer_pos, size); + if (read_size > 0) + { + std::memcpy(data_ptr, data->buffer + data->buffer_pos, read_size); + data->buffer_pos += read_size; + } + }); + + return PNGCommonLoader(image, png_ptr, info_ptr, new_data, row_pointers); +} + +static void PNGSaveCommon(const RGBA8Image& image, png_structp png_ptr, png_infop info_ptr, int quality) +{ + png_set_compression_level(png_ptr, std::clamp(quality / 10, 0, 9)); + png_set_IHDR(png_ptr, info_ptr, image.GetWidth(), image.GetHeight(), 8, PNG_COLOR_TYPE_RGBA, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + png_write_info(png_ptr, info_ptr); + + for (u32 y = 0; y < image.GetHeight(); ++y) + png_write_row(png_ptr, (png_bytep)image.GetRowPixels(y)); + + png_write_end(png_ptr, nullptr); +} + +bool PNGFileSaver(const RGBA8Image& image, const char* filename, std::FILE* fp, int quality) +{ + png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + png_infop info_ptr = nullptr; + if (!png_ptr) + return false; + + ScopedGuard cleanup([&png_ptr, &info_ptr]() { + if (png_ptr) + png_destroy_write_struct(&png_ptr, info_ptr ? &info_ptr : nullptr); + }); + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + return false; + + if (setjmp(png_jmpbuf(png_ptr))) + return false; + + png_set_write_fn( + png_ptr, fp, [](png_structp png_ptr, png_bytep data_ptr, png_size_t size) { + if (std::fwrite(data_ptr, size, 1, static_cast(png_get_io_ptr(png_ptr))) != 1) + png_error(png_ptr, "file write error"); }, [](png_structp png_ptr) {}); + + PNGSaveCommon(image, png_ptr, info_ptr, quality); + return true; +} + +bool PNGBufferSaver(const RGBA8Image& image, std::vector* buffer, int quality) +{ + png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + png_infop info_ptr = nullptr; + if (!png_ptr) + return false; + + ScopedGuard cleanup([&png_ptr, &info_ptr]() { + if (png_ptr) + png_destroy_write_struct(&png_ptr, info_ptr ? &info_ptr : nullptr); + }); + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + return false; + + buffer->reserve(image.GetWidth() * image.GetHeight() * 2); + + if (setjmp(png_jmpbuf(png_ptr))) + return false; + + png_set_write_fn( + png_ptr, buffer, [](png_structp png_ptr, png_bytep data_ptr, png_size_t size) { + std::vector* buffer = static_cast*>(png_get_io_ptr(png_ptr)); + const size_t old_pos = buffer->size(); + buffer->resize(old_pos + size); + std::memcpy(buffer->data() + old_pos, data_ptr, size); }, [](png_structp png_ptr) {}); + + PNGSaveCommon(image, png_ptr, info_ptr, quality); + return true; +} + +bool JPEGBufferLoader(RGBA8Image* image, const void* buffer, size_t buffer_size) +{ + int width, height, file_comps; + u8* data = jpgd::decompress_jpeg_image_from_memory(static_cast(buffer), static_cast(buffer_size), + &width, &height, &file_comps, 4, 0); + if (!data) + { + Console.Error("jpgd::decompress_jpeg_image_from_memory() failed"); + return false; + } + + image->SetPixels(static_cast(width), static_cast(height), reinterpret_cast(data)); + std::free(data); + return true; +} + +bool JPEGFileLoader(RGBA8Image* image, const char* filename, std::FILE* fp) +{ + class FileStream : public jpgd::jpeg_decoder_stream + { + std::FILE* m_fp; + bool m_error_flag = false; + bool m_eof_flag = false; + + public: + explicit FileStream(std::FILE* fp_) + : m_fp(fp_) + { + } + + int read(jpgd::uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag) override + { + if (m_eof_flag) + { + *pEOF_flag = true; + return 0; + } + + if (m_error_flag) + return -1; + + int bytes_read = static_cast(std::fread(pBuf, 1, max_bytes_to_read, m_fp)); + if (bytes_read < max_bytes_to_read) + { + if (std::ferror(m_fp)) + { + m_error_flag = true; + return -1; + } + + m_eof_flag = true; + *pEOF_flag = true; + } + + return bytes_read; + } + }; + + FileStream stream(fp); + int width, height, file_comps; + u8* data = jpgd::decompress_jpeg_image_from_stream(&stream, &width, &height, &file_comps, 4, 0); + if (!data) + { + Console.Error("jpgd::decompress_jpeg_image_from_stream() failed"); + return false; + } + + image->SetPixels(static_cast(width), static_cast(height), reinterpret_cast(data)); + std::free(data); + return true; +} + +static bool JPEGCommonSaver(const RGBA8Image& image, jpge::output_stream& stream, int quality) +{ + jpge::params params; + params.m_quality = quality; + + jpge::jpeg_encoder dst_image; + if (!dst_image.init(&stream, image.GetWidth(), image.GetHeight(), 3, params)) + return false; + + // for RGBA->RGB + std::vector row; + row.resize(image.GetWidth() * 3); + + for (uint pass_index = 0; pass_index < dst_image.get_total_passes(); pass_index++) + { + for (u32 i = 0; i < image.GetHeight(); i++) + { + const u8* row_in = reinterpret_cast(image.GetRowPixels(i)); + u8* row_out = row.data(); + for (u32 j = 0; j < image.GetWidth(); j++) + { + *(row_out++) = *(row_in++); + *(row_out++) = *(row_in++); + *(row_out++) = *(row_in++); + row_in++; + } + + if (!dst_image.process_scanline(row.data())) + return false; + } + if (!dst_image.process_scanline(NULL)) + return false; + } + + dst_image.deinit(); + + return true; +} + +bool JPEGBufferSaver(const RGBA8Image& image, std::vector* buffer, int quality) +{ + class BufferStream : public jpge::output_stream + { + std::vector* buffer; + + public: + explicit BufferStream(std::vector* buffer_) + : buffer(buffer_) + { + } + + bool put_buf(const void* Pbuf, int len) override + { + const size_t old_size = buffer->size(); + buffer->resize(buffer->size() + static_cast(len)); + std::memcpy(buffer->data() + old_size, Pbuf, static_cast(len)); + return true; + } + }; + + // give enough space to avoid reallocs + buffer->reserve(image.GetWidth() * image.GetHeight() * 2); + + BufferStream stream(buffer); + return JPEGCommonSaver(image, stream, quality); +} + +bool JPEGFileSaver(const RGBA8Image& image, const char* filename, std::FILE* fp, int quality) +{ + class FileStream : public jpge::output_stream + { + std::FILE* m_fp; + bool m_error_flag = false; + + public: + explicit FileStream(std::FILE* fp_) + : m_fp(fp_) + { + } + + bool put_buf(const void* Pbuf, int len) override + { + if (m_error_flag) + return false; + + if (std::fwrite(Pbuf, len, 1, m_fp) != 1) + { + m_error_flag = true; + return false; + } + + return true; + } + }; + + FileStream stream(fp); + return JPEGCommonSaver(image, stream, quality); +} diff --git a/common/Image.h b/common/Image.h new file mode 100644 index 0000000000..b2cb769141 --- /dev/null +++ b/common/Image.h @@ -0,0 +1,144 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "Pcsx2Defs.h" +#include +#include +#include +#include +#include + +namespace Common +{ + template + class Image + { + public: + Image() = default; + Image(u32 width, u32 height, const PixelType* pixels) { SetPixels(width, height, pixels); } + Image(const Image& copy) + { + m_width = copy.m_width; + m_height = copy.m_height; + m_pixels = copy.m_pixels; + } + Image(Image&& move) + { + m_width = move.m_width; + m_height = move.m_height; + m_pixels = std::move(move.m_pixels); + move.m_width = 0; + move.m_height = 0; + } + + Image& operator=(const Image& copy) + { + m_width = copy.m_width; + m_height = copy.m_height; + m_pixels = copy.m_pixels; + return *this; + } + Image& operator=(Image&& move) + { + m_width = move.m_width; + m_height = move.m_height; + m_pixels = std::move(move.m_pixels); + move.m_width = 0; + move.m_height = 0; + return *this; + } + + __fi bool IsValid() const { return (m_width > 0 && m_height > 0); } + __fi u32 GetWidth() const { return m_width; } + __fi u32 GetHeight() const { return m_height; } + __fi u32 GetByteStride() const { return (sizeof(PixelType) * m_width); } + __fi const PixelType* GetPixels() const { return m_pixels.data(); } + __fi PixelType* GetPixels() { return m_pixels.data(); } + __fi const PixelType* GetRowPixels(u32 y) const { return &m_pixels[y * m_width]; } + __fi PixelType* GetRowPixels(u32 y) { return &m_pixels[y * m_width]; } + __fi void SetPixel(u32 x, u32 y, PixelType pixel) { m_pixels[y * m_width + x] = pixel; } + __fi PixelType GetPixel(u32 x, u32 y) const { return m_pixels[y * m_width + x]; } + + void Clear(PixelType fill_value = static_cast(0)) + { + std::fill(m_pixels.begin(), m_pixels.end(), fill_value); + } + + void Invalidate() + { + m_width = 0; + m_height = 0; + m_pixels.clear(); + } + + void SetSize(u32 new_width, u32 new_height, PixelType fill_value = static_cast(0)) + { + m_width = new_width; + m_height = new_height; + m_pixels.resize(new_width * new_height); + Clear(fill_value); + } + + void SetPixels(u32 width, u32 height, const PixelType* pixels) + { + m_width = width; + m_height = height; + m_pixels.resize(width * height); + std::memcpy(m_pixels.data(), pixels, width * height * sizeof(PixelType)); + } + + void SetPixels(u32 width, u32 height, std::vector pixels) + { + m_width = width; + m_height = height; + m_pixels = std::move(pixels); + } + + std::vector TakePixels() + { + m_width = 0; + m_height = 0; + return std::move(m_pixels); + } + + protected: + u32 m_width = 0; + u32 m_height = 0; + std::vector m_pixels; + }; + + class RGBA8Image : public Image + { + public: + static constexpr int DEFAULT_SAVE_QUALITY = 85; + + RGBA8Image(); + RGBA8Image(u32 width, u32 height, const u32* pixels); + RGBA8Image(const RGBA8Image& copy); + RGBA8Image(RGBA8Image&& move); + + RGBA8Image& operator=(const RGBA8Image& copy); + RGBA8Image& operator=(RGBA8Image&& move); + + bool LoadFromFile(const char* filename); + bool LoadFromFile(const char* filename, std::FILE* fp); + bool LoadFromBuffer(const char* filename, const void* buffer, size_t buffer_size); + + bool SaveToFile(const char* filename, int quality = DEFAULT_SAVE_QUALITY) const; + bool SaveToFile(const char* filename, std::FILE* fp, int quality = DEFAULT_SAVE_QUALITY) const; + std::optional> SaveToBuffer(const char* filename, int quality = DEFAULT_SAVE_QUALITY) const; + }; +} // namespace Common \ No newline at end of file diff --git a/common/LRUCache.h b/common/LRUCache.h new file mode 100644 index 0000000000..f5bf26ee1a --- /dev/null +++ b/common/LRUCache.h @@ -0,0 +1,138 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include +#include + +template +class LRUCache +{ + using CounterType = std::uint64_t; + + struct Item + { + V value; + CounterType last_access; + }; + + using MapType = std::map; + +public: + LRUCache(std::size_t max_capacity = 16, bool manual_evict = false) + : m_max_capacity(max_capacity) + , m_manual_evict(manual_evict) + { + } + ~LRUCache() = default; + + std::size_t GetSize() const { return m_items.size(); } + std::size_t GetMaxCapacity() const { return m_max_capacity; } + + void Clear() { m_items.clear(); } + + void SetMaxCapacity(std::size_t capacity) + { + m_max_capacity = capacity; + if (m_items.size() > m_max_capacity) + Evict(m_items.size() - m_max_capacity); + } + + template + V* Lookup(const KeyT& key) + { + auto iter = m_items.find(key); + if (iter == m_items.end()) + return nullptr; + + iter->second.last_access = ++m_last_counter; + return &iter->second.value; + } + + V* Insert(K key, V value) + { + ShrinkForNewItem(); + + auto iter = m_items.find(key); + if (iter != m_items.end()) + { + iter->second.value = std::move(value); + iter->second.last_access = ++m_last_counter; + return &iter->second.value; + } + else + { + Item it; + it.last_access = ++m_last_counter; + it.value = std::move(value); + auto ip = m_items.emplace(std::move(key), std::move(it)); + return &ip.first->second.value; + } + } + + void Evict(std::size_t count = 1) + { + while (!m_items.empty() && count > 0) + { + typename MapType::iterator lowest = m_items.end(); + for (auto iter = m_items.begin(); iter != m_items.end(); ++iter) + { + if (lowest == m_items.end() || iter->second.last_access < lowest->second.last_access) + lowest = iter; + } + m_items.erase(lowest); + count--; + } + } + + template + bool Remove(const KeyT& key) + { + auto iter = m_items.find(key); + if (iter == m_items.end()) + return false; + + m_items.erase(iter); + return true; + } + + void SetManualEvict(bool block) + { + m_manual_evict = block; + if (!m_manual_evict) + ManualEvict(); + } + + void ManualEvict() + { + // evict if we went over + while (m_items.size() > m_max_capacity) + Evict(m_items.size() - m_max_capacity); + } + +private: + void ShrinkForNewItem() + { + if (m_items.size() < m_max_capacity) + return; + + Evict(m_items.size() - (m_max_capacity - 1)); + } + + MapType m_items; + CounterType m_last_counter = 0; + std::size_t m_max_capacity = 0; + bool m_manual_evict = false; +}; \ No newline at end of file diff --git a/common/Linux/LnxHostSys.cpp b/common/Linux/LnxHostSys.cpp index f83f238f09..9be82957e1 100644 --- a/common/Linux/LnxHostSys.cpp +++ b/common/Linux/LnxHostSys.cpp @@ -18,10 +18,12 @@ #include #include #include +#include #include #include "fmt/core.h" +#include "common/Align.h" #include "common/PageFaultSource.h" #include "common/Assertions.h" #include "common/Console.h" @@ -33,12 +35,27 @@ #define MAP_ANONYMOUS MAP_ANON #endif +#include +#include +#include +#include + +#ifndef __APPLE__ +#include +#endif + extern void SignalExit(int sig); static const uptr m_pagemask = getpagesize() - 1; +#if defined(__APPLE__) +static struct sigaction s_old_sigbus_action; +#else +static struct sigaction s_old_sigsegv_action; +#endif + // Linux implementation of SIGSEGV handler. Bind it using sigaction(). -static void SysPageFaultSignalFilter(int signal, siginfo_t* siginfo, void*) +static void SysPageFaultSignalFilter(int signal, siginfo_t* siginfo, void* ctx) { // [TODO] : Add a thread ID filter to the Linux Signal handler here. // Rationale: On windows, the __try/__except model allows per-thread specific behavior @@ -56,13 +73,20 @@ static void SysPageFaultSignalFilter(int signal, siginfo_t* siginfo, void*) // Note: Use of stdio functions isn't safe here. Avoid console logs, // assertions, file logs, or just about anything else useful. +#if defined(__APPLE__) && defined(__x86_64__) + void* const exception_pc = reinterpret_cast(static_cast(ctx)->uc_mcontext->__ss.__rip); +#elif defined(__x86_64__) + void* const exception_pc = reinterpret_cast(static_cast(ctx)->uc_mcontext.gregs[REG_RIP]); +#else + void* const exception_pc = nullptr; +#endif // Note: This signal can be accessed by the EE or MTVU thread // Source_PageFault is a global variable with its own state information // so for now we lock this exception code unless someone can fix this better... std::unique_lock lock(PageFault_Mutex); - Source_PageFault->Dispatch(PageFaultInfo((uptr)siginfo->si_addr & ~m_pagemask)); + Source_PageFault->Dispatch(PageFaultInfo((uptr)exception_pc, (uptr)siginfo->si_addr & ~m_pagemask)); // resumes execution right where we left off (re-executes instruction that // caused the SIGSEGV). @@ -88,22 +112,17 @@ void _platform_InstallSignalHandler() sigemptyset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = SysPageFaultSignalFilter; -#ifdef __APPLE__ +#if defined(__APPLE__) // MacOS uses SIGBUS for memory permission violations - sigaction(SIGBUS, &sa, NULL); + sigaction(SIGBUS, &sa, &s_old_sigbus_action); #else - sigaction(SIGSEGV, &sa, NULL); + sigaction(SIGSEGV, &sa, &s_old_sigsegv_action); #endif } -// returns FALSE if the mprotect call fails with an ENOMEM. -// Raises assertions on other types of POSIX errors (since those typically reflect invalid object -// or memory states). -static bool _memprotect(void* baseaddr, size_t size, const PageProtectionMode& mode) +static __ri uint LinuxProt(const PageProtectionMode& mode) { - pxAssertDev((size & (__pagesize - 1)) == 0, "Size is page aligned"); - - uint lnxmode = 0; + u32 lnxmode = 0; if (mode.CanWrite()) lnxmode |= PROT_WRITE; @@ -112,109 +131,158 @@ static bool _memprotect(void* baseaddr, size_t size, const PageProtectionMode& m if (mode.CanExecute()) lnxmode |= PROT_EXEC | PROT_READ; - const int result = mprotect(baseaddr, size, lnxmode); - - if (result == 0) - return true; - - switch (errno) - { - case EINVAL: - pxFailDev(fmt::format("mprotect returned EINVAL @ 0x{:X} -> 0x{:X} (mode={})", - baseaddr, (uptr)baseaddr + size, mode.ToString()).c_str()); - break; - - case EACCES: - pxFailDev(fmt::format("mprotect returned EACCES @ 0x{:X} -> 0x{:X} (mode={})", - baseaddr, (uptr)baseaddr + size, mode.ToString()).c_str()); - break; - - case ENOMEM: - // caller handles assertion or exception, or whatever. - break; - } - return false; + return lnxmode; } -void* HostSys::MmapReservePtr(void* base, size_t size) +void* HostSys::Mmap(void* base, size_t size, const PageProtectionMode& mode) { pxAssertDev((size & (__pagesize - 1)) == 0, "Size is page aligned"); - // On linux a reserve-without-commit is performed by using mmap on a read-only - // or anonymous source, with PROT_NONE (no-access) permission. Since the mapping - // is completely inaccessible, the OS will simply reserve it and will not put it - // against the commit table. - void* result = mmap(base, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); - - if (result == MAP_FAILED) - result = nullptr; - - return result; -} - -bool HostSys::MmapCommitPtr(void* base, size_t size, const PageProtectionMode& mode) -{ - // In linux, reserved memory is automatically committed when its permissions are - // changed to something other than PROT_NONE. If the user is committing memory - // as PROT_NONE, then just ignore this call (memory will be committed automatically - // later when the user changes permissions to something useful via calls to MemProtect). - if (mode.IsNone()) - return false; + return nullptr; - if (_memprotect(base, size, mode)) - return true; + const u32 prot = LinuxProt(mode); - return false; + u32 flags = MAP_PRIVATE | MAP_ANONYMOUS; + if (base) + flags |= MAP_FIXED; + + void* res = mmap(base, size, prot, flags, -1, 0); + if (res == MAP_FAILED) + return nullptr; + + return res; } -void HostSys::MmapResetPtr(void* base, size_t size) -{ - pxAssertDev((size & (__pagesize - 1)) == 0, "Size is page aligned"); - - void* result = mmap(base, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); - - pxAssertRel((uptr)result == (uptr)base, "Virtual memory decommit failed"); -} - -void* HostSys::MmapReserve(uptr base, size_t size) -{ - return MmapReservePtr((void*)base, size); -} - -bool HostSys::MmapCommit(uptr base, size_t size, const PageProtectionMode& mode) -{ - return MmapCommitPtr((void*)base, size, mode); -} - -void HostSys::MmapReset(uptr base, size_t size) -{ - MmapResetPtr((void*)base, size); -} - -void* HostSys::Mmap(uptr base, size_t size) -{ - pxAssertDev((size & (__pagesize - 1)) == 0, "Size is page aligned"); - - // MAP_ANONYMOUS - means we have no associated file handle (or device). - - return mmap((void*)base, size, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -} - -void HostSys::Munmap(uptr base, size_t size) +void HostSys::Munmap(void* base, size_t size) { if (!base) return; + munmap((void*)base, size); } void HostSys::MemProtect(void* baseaddr, size_t size, const PageProtectionMode& mode) { - if (!_memprotect(baseaddr, size, mode)) - { - throw Exception::OutOfMemory("MemProtect") - .SetDiagMsg(fmt::format("mprotect failed @ 0x{:X} -> 0x{:X} (mode={})", - baseaddr, (uptr)baseaddr + size, mode.ToString())); - } + pxAssertDev((size & (__pagesize - 1)) == 0, "Size is page aligned"); + + const u32 lnxmode = LinuxProt(mode); + + const int result = mprotect(baseaddr, size, lnxmode); + if (result != 0) + pxFail("mprotect() failed"); } + +std::string HostSys::GetFileMappingName(const char* prefix) +{ + const unsigned pid = static_cast(getpid()); +#if defined(__FreeBSD__) + // FreeBSD's shm_open(3) requires name to be absolute + return fmt::format("/tmp/{}_{}", prefix, pid); +#else + return fmt::format("{}_{}", prefix, pid); +#endif +} + +void* HostSys::CreateSharedMemory(const char* name, size_t size) +{ + const int fd = shm_open(name, O_CREAT | O_EXCL | O_RDWR, 0600); + if (fd < 0) + { + std::fprintf(stderr, "shm_open failed: %d\n", errno); + return nullptr; + } + + // we're not going to be opening this mapping in other processes, so remove the file + shm_unlink(name); + + // ensure it's the correct size +#if !defined(__APPLE__) && !defined(__FreeBSD__) + if (ftruncate64(fd, static_cast(size)) < 0) +#else + if (ftruncate(fd, static_cast(size)) < 0) +#endif + { + std::fprintf(stderr, "ftruncate64(%zu) failed: %d\n", size, errno); + return nullptr; + } + + return reinterpret_cast(static_cast(fd)); +} + +void HostSys::DestroySharedMemory(void* ptr) +{ + close(static_cast(reinterpret_cast(ptr))); +} + +void* HostSys::MapSharedMemory(void* handle, size_t offset, void* baseaddr, size_t size, const PageProtectionMode& mode) +{ + const uint lnxmode = LinuxProt(mode); + + const int flags = (baseaddr != nullptr) ? (MAP_SHARED | MAP_FIXED) : MAP_SHARED; + void* ptr = mmap(baseaddr, size, lnxmode, flags, static_cast(reinterpret_cast(handle)), static_cast(offset)); + if (ptr == MAP_FAILED) + return nullptr; + + return ptr; +} + +void HostSys::UnmapSharedMemory(void* baseaddr, size_t size) +{ + if (mmap(baseaddr, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0) == MAP_FAILED) + pxFailRel("Failed to unmap shared memory"); +} + +SharedMemoryMappingArea::SharedMemoryMappingArea(u8* base_ptr, size_t size, size_t num_pages) + : m_base_ptr(base_ptr) + , m_size(size) + , m_num_pages(num_pages) +{ +} + +SharedMemoryMappingArea::~SharedMemoryMappingArea() +{ + pxAssertRel(m_num_mappings == 0, "No mappings left"); + + if (munmap(m_base_ptr, m_size) != 0) + pxFailRel("Failed to release shared memory area"); +} + + +std::unique_ptr SharedMemoryMappingArea::Create(size_t size) +{ + pxAssertRel(Common::IsAlignedPow2(size, __pagesize), "Size is page aligned"); + + void* alloc = mmap(nullptr, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (alloc == MAP_FAILED) + return nullptr; + + return std::unique_ptr(new SharedMemoryMappingArea(static_cast(alloc), size, size / __pagesize)); +} + +u8* SharedMemoryMappingArea::Map(void* file_handle, size_t file_offset, void* map_base, size_t map_size, const PageProtectionMode& mode) +{ + pxAssert(static_cast(map_base) >= m_base_ptr && static_cast(map_base) < (m_base_ptr + m_size)); + + const uint lnxmode = LinuxProt(mode); + void* const ptr = mmap(map_base, map_size, lnxmode, MAP_SHARED | MAP_FIXED, + static_cast(reinterpret_cast(file_handle)), static_cast(file_offset)); + if (ptr == MAP_FAILED) + return nullptr; + + m_num_mappings++; + return static_cast(ptr); +} + +bool SharedMemoryMappingArea::Unmap(void* map_base, size_t map_size) +{ + pxAssert(static_cast(map_base) >= m_base_ptr && static_cast(map_base) < (m_base_ptr + m_size)); + + if (mmap(map_base, map_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0) == MAP_FAILED) + return false; + + m_num_mappings--; + return true; +} + #endif diff --git a/common/Linux/LnxMisc.cpp b/common/Linux/LnxMisc.cpp index a7f8a8546e..2e3d4307a1 100644 --- a/common/Linux/LnxMisc.cpp +++ b/common/Linux/LnxMisc.cpp @@ -17,10 +17,18 @@ #include #include #include +#include +#include #include +#include +#include + +#include "fmt/core.h" #include "common/Pcsx2Types.h" #include "common/General.h" +#include "common/StringUtil.h" +#include "common/WindowInfo.h" // Returns 0 on failure (not supported by the operating system). u64 GetPhysicalMemory() @@ -41,7 +49,7 @@ void InitCPUTicks() u64 GetTickFrequency() { - return 1000000000;// unix measures in nanoseconds + return 1000000000; // unix measures in nanoseconds } u64 GetCPUTicks() @@ -60,8 +68,85 @@ std::string GetOSVersionString() #endif } -void ScreensaverAllow(bool allow) +#ifdef X11_API + +static bool SetScreensaverInhibitX11(const WindowInfo& wi, bool inhibit) { - // no-op + extern char **environ; + + const char* command = "xdg-screensaver"; + const char* operation = inhibit ? "suspend" : "resume"; + std::string id = fmt::format("0x{:X}", static_cast(reinterpret_cast(wi.window_handle))); + + char* argv[4] = {const_cast(command), const_cast(operation), const_cast(id.c_str()), + nullptr}; + + // Since we set SA_NOCLDWAIT in Qt, we don't need to wait here. + pid_t pid; + int res = posix_spawnp(&pid, "xdg-screensaver", nullptr, nullptr, argv, environ); + return (res == 0); } + +#endif + +static bool SetScreensaverInhibit(const WindowInfo& wi, bool inhibit) +{ + switch (wi.type) + { +#ifdef X11_API + case WindowInfo::Type::X11: + return SetScreensaverInhibitX11(wi, inhibit); +#endif + + default: + return false; + } +} + +static std::optional s_inhibit_window_info; + +bool WindowInfo::InhibitScreensaver(const WindowInfo& wi, bool inhibit) +{ + if (s_inhibit_window_info.has_value()) + { + // Bit of extra logic here, because wx spams it and we don't want to + // spawn processes unnecessarily. + if (s_inhibit_window_info->type == wi.type && + s_inhibit_window_info->window_handle == wi.window_handle && + s_inhibit_window_info->surface_handle == wi.surface_handle) + { + return true; + } + // Clear the old. + SetScreensaverInhibit(s_inhibit_window_info.value(), false); + s_inhibit_window_info.reset(); + } + + if (!inhibit) + return true; + + // New window. + if (!SetScreensaverInhibit(wi, true)) + return false; + + s_inhibit_window_info = wi; + return true; +} + +bool Common::PlaySoundAsync(const char* path) +{ +#ifdef __linux__ + // This is... pretty awful. But I can't think of a better way without linking to e.g. gstreamer. + const char* cmdname = "aplay"; + const char* argv[] = {cmdname, path, nullptr}; + pid_t pid; + + // Since we set SA_NOCLDWAIT in Qt, we don't need to wait here. + int res = posix_spawnp(&pid, cmdname, nullptr, nullptr, const_cast(argv), environ); + return (res == 0); +#else + return false; +#endif +} + #endif diff --git a/common/MemorySettingsInterface.cpp b/common/MemorySettingsInterface.cpp new file mode 100644 index 0000000000..8414a49ff5 --- /dev/null +++ b/common/MemorySettingsInterface.cpp @@ -0,0 +1,290 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "common/MemorySettingsInterface.h" +#include "common/StringUtil.h" + +MemorySettingsInterface::MemorySettingsInterface() = default; + +MemorySettingsInterface::~MemorySettingsInterface() = default; + +bool MemorySettingsInterface::Save() +{ + return false; +} + +void MemorySettingsInterface::Clear() +{ + m_sections.clear(); +} + +bool MemorySettingsInterface::GetIntValue(const char* section, const char* key, s32* value) const +{ + const auto sit = m_sections.find(section); + if (sit == m_sections.end()) + return false; + + const auto iter = sit->second.find(key); + if (iter == sit->second.end()) + return false; + + std::optional parsed = StringUtil::FromChars(iter->second, 10); + if (!parsed.has_value()) + return false; + + *value = parsed.value(); + return true; +} + +bool MemorySettingsInterface::GetUIntValue(const char* section, const char* key, u32* value) const +{ + const auto sit = m_sections.find(section); + if (sit == m_sections.end()) + return false; + + const auto iter = sit->second.find(key); + if (iter == sit->second.end()) + return false; + + std::optional parsed = StringUtil::FromChars(iter->second, 10); + if (!parsed.has_value()) + return false; + + *value = parsed.value(); + return true; +} + +bool MemorySettingsInterface::GetFloatValue(const char* section, const char* key, float* value) const +{ + const auto sit = m_sections.find(section); + if (sit == m_sections.end()) + return false; + + const auto iter = sit->second.find(key); + if (iter == sit->second.end()) + return false; + + std::optional parsed = StringUtil::FromChars(iter->second); + if (!parsed.has_value()) + return false; + + *value = parsed.value(); + return true; +} + +bool MemorySettingsInterface::GetDoubleValue(const char* section, const char* key, double* value) const +{ + const auto sit = m_sections.find(section); + if (sit == m_sections.end()) + return false; + + const auto iter = sit->second.find(key); + if (iter == sit->second.end()) + return false; + + std::optional parsed = StringUtil::FromChars(iter->second); + if (!parsed.has_value()) + return false; + + *value = parsed.value(); + return true; +} + +bool MemorySettingsInterface::GetBoolValue(const char* section, const char* key, bool* value) const +{ + const auto sit = m_sections.find(section); + if (sit == m_sections.end()) + return false; + + const auto iter = sit->second.find(key); + if (iter == sit->second.end()) + return false; + + std::optional parsed = StringUtil::FromChars(iter->second); + if (!parsed.has_value()) + return false; + + *value = parsed.value(); + return true; +} + +bool MemorySettingsInterface::GetStringValue(const char* section, const char* key, std::string* value) const +{ + const auto sit = m_sections.find(section); + if (sit == m_sections.end()) + return false; + + const auto iter = sit->second.find(key); + if (iter == sit->second.end()) + return false; + + *value = iter->second; + return true; +} + +void MemorySettingsInterface::SetIntValue(const char* section, const char* key, s32 value) +{ + SetValue(section, key, std::to_string(value)); +} + +void MemorySettingsInterface::SetUIntValue(const char* section, const char* key, u32 value) +{ + SetValue(section, key, std::to_string(value)); +} + +void MemorySettingsInterface::SetFloatValue(const char* section, const char* key, float value) +{ + SetValue(section, key, std::to_string(value)); +} + +void MemorySettingsInterface::SetDoubleValue(const char* section, const char* key, double value) +{ + SetValue(section, key, std::to_string(value)); +} + +void MemorySettingsInterface::SetBoolValue(const char* section, const char* key, bool value) +{ + SetValue(section, key, std::to_string(value)); +} + +void MemorySettingsInterface::SetStringValue(const char* section, const char* key, const char* value) +{ + SetValue(section, key, value); +} + +void MemorySettingsInterface::SetValue(const char* section, const char* key, std::string value) +{ + auto sit = m_sections.find(section); + if (sit == m_sections.end()) + sit = m_sections.emplace(std::make_pair(std::string(section), KeyMap())).first; + + const auto range = sit->second.equal_range(key); + if (range.first == sit->second.end()) + { + sit->second.emplace(std::string(key), std::move(value)); + return; + } + + auto iter = range.first; + iter->second = std::move(value); + ++iter; + + // remove other values + while (iter != range.second) + { + auto remove = iter++; + sit->second.erase(remove); + } +} + +std::vector MemorySettingsInterface::GetStringList(const char* section, const char* key) const +{ + std::vector ret; + + const auto sit = m_sections.find(section); + if (sit != m_sections.end()) + { + const auto range = sit->second.equal_range(key); + for (auto iter = range.first; iter != range.second; ++iter) + ret.emplace_back(iter->second); + } + + return ret; +} + +void MemorySettingsInterface::SetStringList(const char* section, const char* key, const std::vector& items) +{ + auto sit = m_sections.find(section); + if (sit == m_sections.end()) + sit = m_sections.emplace(std::make_pair(std::string(section), KeyMap())).first; + + const auto range = sit->second.equal_range(key); + for (auto iter = range.first; iter != range.second;) + sit->second.erase(iter++); + + std::string_view keysv(key); + for (const std::string& value : items) + sit->second.emplace(keysv, value); +} + +bool MemorySettingsInterface::RemoveFromStringList(const char* section, const char* key, const char* item) +{ + auto sit = m_sections.find(section); + if (sit == m_sections.end()) + sit = m_sections.emplace(std::make_pair(std::string(section), KeyMap())).first; + + const auto range = sit->second.equal_range(key); + bool result = false; + for (auto iter = range.first; iter != range.second;) + { + if (iter->second == item) + { + sit->second.erase(iter++); + result = true; + } + else + { + ++iter; + } + } + + return result; +} + +bool MemorySettingsInterface::AddToStringList(const char* section, const char* key, const char* item) +{ + auto sit = m_sections.find(section); + if (sit == m_sections.end()) + sit = m_sections.emplace(std::make_pair(std::string(section), KeyMap())).first; + + const auto range = sit->second.equal_range(key); + for (auto iter = range.first; iter != range.second; ++iter) + { + if (iter->second == item) + return false; + } + + sit->second.emplace(std::string(key), std::string(item)); + return true; +} + +bool MemorySettingsInterface::ContainsValue(const char* section, const char* key) const +{ + const auto sit = m_sections.find(section); + if (sit == m_sections.end()) + return false; + + return (sit->second.find(key) != sit->second.end()); +} + +void MemorySettingsInterface::DeleteValue(const char* section, const char* key) +{ + auto sit = m_sections.find(section); + if (sit == m_sections.end()) + return; + + const auto range = sit->second.equal_range(key); + for (auto iter = range.first; iter != range.second;) + sit->second.erase(iter++); +} + +void MemorySettingsInterface::ClearSection(const char* section) +{ + auto sit = m_sections.find(section); + if (sit == m_sections.end()) + return; + + m_sections.erase(sit); +} diff --git a/common/MemorySettingsInterface.h b/common/MemorySettingsInterface.h new file mode 100644 index 0000000000..c1fc1926c1 --- /dev/null +++ b/common/MemorySettingsInterface.h @@ -0,0 +1,68 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "HeterogeneousContainers.h" +#include "SettingsInterface.h" +#include + +class MemorySettingsInterface final : public SettingsInterface +{ +public: + MemorySettingsInterface(); + ~MemorySettingsInterface(); + + bool Save() override; + + void Clear() override; + + bool GetIntValue(const char* section, const char* key, s32* value) const override; + bool GetUIntValue(const char* section, const char* key, u32* value) const override; + bool GetFloatValue(const char* section, const char* key, float* value) const override; + bool GetDoubleValue(const char* section, const char* key, double* value) const override; + bool GetBoolValue(const char* section, const char* key, bool* value) const override; + bool GetStringValue(const char* section, const char* key, std::string* value) const override; + + void SetIntValue(const char* section, const char* key, s32 value) override; + void SetUIntValue(const char* section, const char* key, u32 value) override; + void SetFloatValue(const char* section, const char* key, float value) override; + void SetDoubleValue(const char* section, const char* key, double value) override; + void SetBoolValue(const char* section, const char* key, bool value) override; + void SetStringValue(const char* section, const char* key, const char* value) override; + bool ContainsValue(const char* section, const char* key) const override; + void DeleteValue(const char* section, const char* key) override; + void ClearSection(const char* section) override; + + std::vector GetStringList(const char* section, const char* key) const override; + void SetStringList(const char* section, const char* key, const std::vector& items) override; + bool RemoveFromStringList(const char* section, const char* key, const char* item) override; + bool AddToStringList(const char* section, const char* key, const char* item) override; + + // default parameter overloads + using SettingsInterface::GetBoolValue; + using SettingsInterface::GetDoubleValue; + using SettingsInterface::GetFloatValue; + using SettingsInterface::GetIntValue; + using SettingsInterface::GetStringValue; + using SettingsInterface::GetUIntValue; + +private: + using KeyMap = UnorderedStringMultimap; + using SectionMap = UnorderedStringMap; + + void SetValue(const char* section, const char* key, std::string value); + + SectionMap m_sections; +}; \ No newline at end of file diff --git a/common/Misc.cpp b/common/Misc.cpp index 2f0247837e..388a77d510 100644 --- a/common/Misc.cpp +++ b/common/Misc.cpp @@ -14,6 +14,7 @@ */ #include "General.h" +#include "Console.h" static u32 PAUSE_TIME = 0; @@ -29,16 +30,40 @@ static void MultiPause() _mm_pause(); } +static u32 MeasurePauseTime() +{ + // GetCPUTicks may have resolution as low as 1µs + // One call to MultiPause could take anywhere from 20ns (fast Haswell) to 400ns (slow Skylake) + // We want a measurement of reasonable resolution, but don't want to take too long + // So start at a fairly small number and increase it if it's too fast + for (int testcnt = 64; true; testcnt *= 2) + { + u64 start = GetCPUTicks(); + for (int i = 0; i < testcnt; i++) + { + MultiPause(); + } + u64 time = GetCPUTicks() - start; + if (time > 100) + { + u64 nanos = (time * 1000000000) / GetTickFrequency(); + return (nanos / testcnt) + 1; + } + } +} + __noinline static void UpdatePauseTime() { - u64 start = GetCPUTicks(); - for (int i = 0; i < 64; i++) - { - MultiPause(); - } - u64 time = GetCPUTicks() - start; - u64 nanos = (time * 1000000000) / GetTickFrequency(); - PAUSE_TIME = (nanos / 64) + 1; + u64 wait = GetCPUTicks() + GetTickFrequency() / 100; // Wake up processor (spin for 10ms) + while (GetCPUTicks() < wait) + ; + u32 pause = MeasurePauseTime(); + // Take a few measurements in case something weird happens during one + // (e.g. OS interrupt) + for (int i = 0; i < 4; i++) + pause = std::min(pause, MeasurePauseTime()); + PAUSE_TIME = pause; + DevCon.WriteLn("MultiPause time: %uns", pause); } u32 ShortSpin() diff --git a/common/PageFaultSource.h b/common/PageFaultSource.h index 4fae1c11a9..861d6a1539 100644 --- a/common/PageFaultSource.h +++ b/common/PageFaultSource.h @@ -34,10 +34,12 @@ struct PageFaultInfo { + uptr pc; uptr addr; - PageFaultInfo(uptr address) + PageFaultInfo(uptr pc_, uptr address) { + pc = pc_; addr = address; } }; @@ -138,7 +140,8 @@ class VirtualMemoryManager std::string m_name; - uptr m_baseptr; + void* m_file_handle; + u8* m_baseptr; // An array to track page usage (to trigger asserts if things try to overlap) std::atomic* m_pageuse; @@ -150,18 +153,21 @@ public: // If upper_bounds is nonzero and the OS fails to allocate memory that is below it, // calls to IsOk() will return false and Alloc() will always return null pointers // strict indicates that the allocation should quietly fail if the memory can't be mapped at `base` - VirtualMemoryManager(std::string name, uptr base, size_t size, uptr upper_bounds = 0, bool strict = false); + VirtualMemoryManager(std::string name, const char* file_mapping_name, uptr base, size_t size, uptr upper_bounds = 0, bool strict = false); ~VirtualMemoryManager(); - void* GetBase() const { return (void*)m_baseptr; } + bool IsSharedMemory() const { return (m_file_handle != nullptr); } + void* GetFileHandle() const { return m_file_handle; } + u8* GetBase() const { return m_baseptr; } + u8* GetEnd() const { return (m_baseptr + m_pages_reserved * __pagesize); } // Request the use of the memory at offsetLocation bytes from the start of the reserved memory area // offsetLocation must be page-aligned - void* Alloc(uptr offsetLocation, size_t size) const; + u8* Alloc(uptr offsetLocation, size_t size) const; - void* AllocAtAddress(void* address, size_t size) const + u8* AllocAtAddress(void* address, size_t size) const { - return Alloc(size, (uptr)address - m_baseptr); + return Alloc(size, static_cast(address) - m_baseptr); } void Free(void* address, size_t size) const; @@ -179,12 +185,12 @@ typedef std::shared_ptr VirtualMemoryManagerPtr; class VirtualMemoryBumpAllocator { const VirtualMemoryManagerPtr m_allocator; - std::atomic m_baseptr{0}; - const uptr m_endptr = 0; + std::atomic m_baseptr{0}; + const u8* m_endptr = 0; public: VirtualMemoryBumpAllocator(VirtualMemoryManagerPtr allocator, size_t size, uptr offsetLocation); - void* Alloc(size_t size); + u8* Alloc(size_t size); const VirtualMemoryManagerPtr& GetAllocator() { return m_allocator; } }; @@ -201,79 +207,31 @@ protected: // Where the memory came from (so we can return it) VirtualMemoryManagerPtr m_allocator; - // Default size of the reserve, in bytes. Can be specified when the object is constructed. - // Is used as the reserve size when Reserve() is called, unless an override is specified - // in the Reserve parameters. - size_t m_defsize; - - void* m_baseptr; - - // reserved memory (in pages). - uptr m_pages_reserved; - - // Records the number of pages committed to memory. - // (metric for analysis of buffer usage) - uptr m_pages_commited; - - // Protection mode to be applied to committed blocks. - PageProtectionMode m_prot_mode; - - // Controls write access to the entire reserve. When true (the default), the reserve - // operates normally. When set to false, all committed blocks are re-protected with - // write disabled, and accesses to uncommitted blocks (read or write) will cause a GPF - // as well. - bool m_allow_writes; - - // Allows the implementation to decide how much memory it needs to allocate if someone requests the given size - // Should translate requests of size 0 to m_defsize - virtual size_t GetSize(size_t requestedSize); + u8* m_baseptr = nullptr; + size_t m_size = 0; public: - VirtualMemoryReserve(std::string name, size_t size = 0); - virtual ~VirtualMemoryReserve() - { - Release(); - } + VirtualMemoryReserve(std::string name); + virtual ~VirtualMemoryReserve(); // Initialize with the given piece of memory // Note: The memory is already allocated, the allocator is for future use to free the region // It may be null in which case there is no way to free the memory in a way it will be usable again - virtual void* Assign(VirtualMemoryManagerPtr allocator, void* baseptr, size_t size); + void Assign(VirtualMemoryManagerPtr allocator, u8* baseptr, size_t size); - void* Reserve(VirtualMemoryManagerPtr allocator, uptr baseOffset, size_t size = 0) - { - size = GetSize(size); - void* allocation = allocator->Alloc(baseOffset, size); - return Assign(std::move(allocator), allocation, size); - } - void* Reserve(VirtualMemoryBumpAllocator& allocator, size_t size = 0) - { - size = GetSize(size); - return Assign(allocator.GetAllocator(), allocator.Alloc(size), size); - } + u8* BumpAllocate(VirtualMemoryBumpAllocator& allocator, size_t size); - virtual void Reset(); - virtual void Release(); - virtual bool TryResize(uint newsize); - virtual bool Commit(); - - virtual void ForbidModification(); - virtual void AllowModification(); + void Release(); bool IsOk() const { return m_baseptr != NULL; } const std::string& GetName() const { return m_name; } - uptr GetReserveSizeInBytes() const { return m_pages_reserved * __pagesize; } - uptr GetReserveSizeInPages() const { return m_pages_reserved; } - uint GetCommittedPageCount() const { return m_pages_commited; } - uint GetCommittedBytes() const { return m_pages_commited * __pagesize; } + u8* GetPtr() { return m_baseptr; } + const u8* GetPtr() const { return m_baseptr; } + u8* GetPtrEnd() { return m_baseptr + m_size; } + const u8* GetPtrEnd() const { return m_baseptr + m_size; } - u8* GetPtr() { return (u8*)m_baseptr; } - const u8* GetPtr() const { return (u8*)m_baseptr; } - u8* GetPtrEnd() { return (u8*)m_baseptr + (m_pages_reserved * __pagesize); } - const u8* GetPtrEnd() const { return (u8*)m_baseptr + (m_pages_reserved * __pagesize); } - - VirtualMemoryReserve& SetPageAccessOnCommit(const PageProtectionMode& mode); + size_t GetSize() const { return m_size; } operator void*() { return m_baseptr; } operator const void*() const { return m_baseptr; } @@ -283,18 +241,15 @@ public: u8& operator[](uint idx) { - pxAssert(idx < (m_pages_reserved * __pagesize)); + pxAssert(idx < m_size); return *((u8*)m_baseptr + idx); } const u8& operator[](uint idx) const { - pxAssert(idx < (m_pages_reserved * __pagesize)); + pxAssert(idx < m_size); return *((u8*)m_baseptr + idx); } - -protected: - virtual void ReprotectCommittedBlocks(const PageProtectionMode& newmode); }; #ifdef __POSIX__ diff --git a/common/Path.h b/common/Path.h index 08ea6af293..564d0ec174 100644 --- a/common/Path.h +++ b/common/Path.h @@ -38,8 +38,8 @@ namespace Path void Canonicalize(std::string* path); /// Sanitizes a filename for use in a filesystem. - void SanitizeFileName(char* Destination, u32 cbDestination, const char* FileName, bool StripSlashes /* = true */); - void SanitizeFileName(std::string& Destination, bool StripSlashes = true); + std::string SanitizeFileName(const std::string_view& str, bool strip_slashes = true); + void SanitizeFileName(std::string* str, bool strip_slashes = true); /// Returns true if the specified path is an absolute path (C:\Path on Windows or /path on Unix). bool IsAbsolute(const std::string_view& path); diff --git a/common/Pcsx2Defs.h b/common/Pcsx2Defs.h index 51361fbedb..40f70f87a6 100644 --- a/common/Pcsx2Defs.h +++ b/common/Pcsx2Defs.h @@ -30,6 +30,7 @@ #endif #include "Pcsx2Types.h" +#include #include "common/emitter/x86_intrin.h" @@ -80,7 +81,9 @@ // Defines the memory page size for the target platform at compilation. All supported platforms // (which means Intel only right now) have a 4k granularity. #define PCSX2_PAGESIZE 0x1000 -static const int __pagesize = PCSX2_PAGESIZE; +static constexpr int __pagesize = PCSX2_PAGESIZE; +static constexpr int __pageshift = 12; +static constexpr size_t __pagemask = PCSX2_PAGESIZE - 1; // -------------------------------------------------------------------------------------- // Microsoft Visual Studio diff --git a/common/Perf.cpp b/common/Perf.cpp index 52ef826918..60a2b4d779 100644 --- a/common/Perf.cpp +++ b/common/Perf.cpp @@ -20,6 +20,10 @@ #endif #ifdef ENABLE_VTUNE #include "jitprofiling.h" + +#include // std::string +#include // strncpy +#include // std::remove_if #endif //#define ProfileWithPerf diff --git a/common/ReadbackSpinManager.cpp b/common/ReadbackSpinManager.cpp new file mode 100644 index 0000000000..90505a8e08 --- /dev/null +++ b/common/ReadbackSpinManager.cpp @@ -0,0 +1,230 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "ReadbackSpinManager.h" + +#include + +static bool EventIsReadback(const ReadbackSpinManager::Event& event) +{ + return event.size < 0; +} + +static bool EventIsDraw(const ReadbackSpinManager::Event& event) +{ + return !EventIsReadback(event); +} + +static bool IsCompleted(const ReadbackSpinManager::Event& event) +{ + return event.begin != event.end; +} + +static int Similarity(const std::vector& a, std::vector& b) +{ + u32 a_num_readbacks = std::count_if(a.begin(), a.end(), EventIsReadback); + u32 b_num_readbacks = std::count_if(b.begin(), b.end(), EventIsReadback); + + int score = 0x10 - abs(static_cast(a.size() - b.size())); + + if (a_num_readbacks == b_num_readbacks) + score += 0x10000; + + auto a_idx = a.begin(); + auto b_idx = b.begin(); + while (a_idx != a.end() && b_idx != b.end()) + { + if (EventIsReadback(*a_idx) && EventIsReadback(*b_idx)) + { + // Same number of events between readbacks + score += 0x1000; + } + // Try to match up on readbacks + else if (EventIsReadback(*a_idx)) + { + b_idx++; + continue; + } + else if (EventIsReadback(*b_idx)) + { + a_idx++; + continue; + } + else if (a_idx->size == b_idx->size) + { + // Same size + score += 0x100; + } + else if (a_idx->size / 2 <= b_idx->size && b_idx->size / 2 <= a_idx->size) + { + // Similar size + score += 0x10; + } + a_idx++; + b_idx++; + continue; + } + // Both hit the end at the same time + if (a_idx == a.end() && b_idx == b.end()) + score += 0x1000; + + return score; +} + +static u32 PrevFrameNo(u32 frame, size_t total_frames) +{ + s32 prev_frame = frame - 1; + if (prev_frame < 0) + prev_frame = total_frames - 1; + return prev_frame; +} + +static u32 NextFrameNo(u32 frame, size_t total_frames) +{ + u32 next_frame = frame + 1; + if (next_frame >= total_frames) + next_frame = 0; + return next_frame; +} + +void ReadbackSpinManager::ReadbackRequested() +{ + Event ev = {}; + ev.size = -1; + m_frames[m_current_frame].push_back(ev); + + // Advance reference frame idx to the next readback + while (m_frames[m_reference_frame].size() > m_reference_frame_idx && + !EventIsReadback(m_frames[m_reference_frame][m_reference_frame_idx])) + { + m_reference_frame_idx++; + } + // ...and past it + if (m_frames[m_reference_frame].size() > m_reference_frame_idx) + m_reference_frame_idx++; +} + +void ReadbackSpinManager::NextFrame() +{ + u32 prev_frame_0 = PrevFrameNo(m_current_frame, std::size(m_frames)); + u32 prev_frame_1 = PrevFrameNo(prev_frame_0, std::size(m_frames)); + int similarity_0 = Similarity(m_frames[m_current_frame], m_frames[prev_frame_0]); + int similarity_1 = Similarity(m_frames[m_current_frame], m_frames[prev_frame_1]); + + if (similarity_1 > similarity_0) + m_reference_frame = prev_frame_0; + else + m_reference_frame = m_current_frame; + m_reference_frame_idx = 0; + + m_current_frame = NextFrameNo(m_current_frame, std::size(m_frames)); + m_frames[m_current_frame].clear(); +} + +ReadbackSpinManager::DrawSubmittedReturn ReadbackSpinManager::DrawSubmitted(u64 size) +{ + DrawSubmittedReturn out = {}; + u32 idx = m_frames[m_current_frame].size(); + out.id = idx | m_current_frame << 28; + Event ev = {}; + ev.size = size; + m_frames[m_current_frame].push_back(ev); + + if (m_reference_frame != m_current_frame && + m_frames[m_reference_frame].size() > m_reference_frame_idx && + EventIsDraw(m_frames[m_reference_frame][m_reference_frame_idx])) + { + auto find_next_draw = [this](u32 frame) -> Event* { + auto next = std::find_if(m_frames[frame].begin() + m_reference_frame_idx + 1, + m_frames[frame].end(), + EventIsDraw); + bool found = next != m_frames[frame].end(); + if (!found) + { + u32 next_frame = NextFrameNo(frame, std::size(m_frames)); + next = std::find_if(m_frames[next_frame].begin(), m_frames[next_frame].end(), EventIsDraw); + found = next != m_frames[next_frame].end(); + } + return found ? &*next : nullptr; + }; + Event* cur_draw = &m_frames[m_reference_frame][m_reference_frame_idx]; + Event* next_draw = find_next_draw(m_reference_frame); + const bool is_one_frame_back = m_reference_frame == PrevFrameNo(m_current_frame, std::size(m_frames)); + if ((!next_draw || !IsCompleted(*cur_draw) || !IsCompleted(*next_draw)) && is_one_frame_back) + { + // Last frame's timing data hasn't arrived, try the same spot in the frame before + u32 two_back = PrevFrameNo(m_reference_frame, std::size(m_frames)); + if (m_frames[two_back].size() > m_reference_frame_idx && + EventIsDraw(m_frames[two_back][m_reference_frame_idx])) + { + cur_draw = &m_frames[two_back][m_reference_frame_idx]; + next_draw = find_next_draw(two_back); + } + } + if (next_draw && IsCompleted(*cur_draw) && IsCompleted(*next_draw) && m_spins_per_unit_time != 0) + { + u64 cur_size = cur_draw->size; + bool is_similar = cur_size / 2 <= size && size / 2 <= cur_size; + if (is_similar) // Only recommend spins if we're somewhat confident in what's going on + { + s32 current_draw_time = cur_draw->end - cur_draw->begin; + s32 gap = next_draw->begin - cur_draw->end; + // Give an extra bit of space for the draw to take a bit longer (we'll go with 1/8 longer) + s32 fill = gap - (current_draw_time >> 3); + if (fill > 0) + out.recommended_spin = static_cast(static_cast(fill) * m_spins_per_unit_time); + } + } + + m_reference_frame_idx++; + } + + if (m_spins_per_unit_time == 0) + { + // Recommend some spinning so that we can get timing data + out.recommended_spin = 128; + } + + return out; +} + +void ReadbackSpinManager::DrawCompleted(u32 id, u32 begin_time, u32 end_time) +{ + u32 frame_id = id >> 28; + u32 frame_off = id & ((1 << 28) - 1); + if (frame_id < std::size(m_frames) && frame_off < m_frames[frame_id].size()) + { + Event& ev = m_frames[frame_id][frame_off]; + ev.begin = begin_time; + ev.end = end_time; + } +} + +void ReadbackSpinManager::SpinCompleted(u32 cycles, u32 begin_time, u32 end_time) +{ + double elapsed = static_cast(end_time - begin_time); + constexpr double decay = 15.0 / 16.0; + + // Obviously it'll vary from GPU to GPU, but in my testing, + // both a Radeon Pro 5600M and Intel UHD 630 spin at about 100ns/cycle + + // Note: We assume spin time is some constant times the number of cycles + // Obviously as the number of cycles gets really low, a constant offset may start being noticeable + // But this is not the case as low as 512 cycles (~50µs) on the GPUs listed above + + m_total_spin_cycles = m_total_spin_cycles * decay + cycles; + m_total_spin_time = m_total_spin_time * decay + elapsed; + m_spins_per_unit_time = m_total_spin_cycles / m_total_spin_time; +} diff --git a/common/ReadbackSpinManager.h b/common/ReadbackSpinManager.h new file mode 100644 index 0000000000..52b3a46850 --- /dev/null +++ b/common/ReadbackSpinManager.h @@ -0,0 +1,65 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +#include "Pcsx2Defs.h" + +#include + +/// A class for calculating optimal spin values to trick OSes into not powering down GPUs while waiting for readbacks +class ReadbackSpinManager +{ +public: + struct Event + { + s64 size; + u32 begin; + u32 end; + }; + +private: + double m_spins_per_unit_time = 0; + double m_total_spin_time = 0; + double m_total_spin_cycles = 0; + std::vector m_frames[3]; + u32 m_current_frame = 0; + u32 m_reference_frame = 0; + u32 m_reference_frame_idx = 0; + +public: + struct DrawSubmittedReturn + { + u32 id; + u32 recommended_spin; + }; + + /// Call when a readback is requested + void ReadbackRequested(); + /// Call at the end of a frame + void NextFrame(); + /// Call when a command buffer is submitted to the GPU + /// `size` is used to attempt to find patterns in submissions, and can be any metric that approximates the amount of work in a submission (draw calls, command encoders, etc) + /// Returns an id to be passed to `DrawCompleted`, and the recommended number of spin cycles to perform on the GPU in order to keep it busy + DrawSubmittedReturn DrawSubmitted(u64 size); + /// Call once a draw has been finished by the GPU and you have begin/end data for it + /// `begin_time` and `end_time` can be in any unit as long as it's consistent. It's okay if they roll over, as long as it happens less than once every few frames. + void DrawCompleted(u32 id, u32 begin_time, u32 end_time); + /// Call when a spin completes to help the manager figure out how quickly your GPU spins + void SpinCompleted(u32 cycles, u32 begin_time, u32 end_time); + /// Get the calculated number of spins per unit of time + /// Note: May be zero when there's insufficient data + double SpinsPerUnitTime() const { return m_spins_per_unit_time; } +}; diff --git a/common/RedtapeWindows.h b/common/RedtapeWindows.h index 6d83ce7c9c..8507b73fd6 100644 --- a/common/RedtapeWindows.h +++ b/common/RedtapeWindows.h @@ -24,19 +24,12 @@ #define NOMINMAX #endif -// Qt build requires Windows 10+, WX Windows 8.1+. -#ifndef _WIN32_WINNT -#ifdef PCSX2_CORE +// We require Windows 10+. +#ifdef _WIN32_WINNT +#undef _WIN32_WINNT +#endif #define _WIN32_WINNT 0x0A00 // Windows 10 -#else -#define _WIN32_WINNT 0x0603 // Windows 8.1 -#endif -#endif -#include -#include -#include -#include -#include +#include #endif diff --git a/common/SafeArray.inl b/common/SafeArray.inl index 599e7b5973..8da05be8db 100644 --- a/common/SafeArray.inl +++ b/common/SafeArray.inl @@ -35,8 +35,7 @@ SafeArray::SafeArray(std::string name, T* allocated_mem, int initSize) m_size = initSize; if (m_ptr == NULL) - throw Exception::OutOfMemory(name) - .SetDiagMsg(fmt::format("Called from 'SafeArray::ctor' [size={}]", initSize)); + pxFailRel("SafeArray memory assignment failed"); } template @@ -84,8 +83,7 @@ SafeArray::SafeArray(int initialSize, std::string name) m_size = initialSize; if ((initialSize != 0) && (m_ptr == NULL)) - throw Exception::OutOfMemory(name) - .SetDiagMsg(fmt::format("Called from 'SafeArray::ctor' [size={}]", initialSize)); + pxFailRel("SafeArray memory allocation failed"); } // Clears the contents of the array to zero, and frees all memory allocations. @@ -113,8 +111,7 @@ void SafeArray::ExactAlloc(int newsize) m_ptr = _virtual_realloc(newsize); if (m_ptr == NULL) - throw Exception::OutOfMemory(Name) - .SetDiagMsg(fmt::format("Called from 'SafeArray::ExactAlloc' [oldsize={}] [newsize={}]", m_size, newsize)); + pxFailRel("SafeArray exact alloc failed"); m_size = newsize; } @@ -203,8 +200,7 @@ SafeList::SafeList(int initialSize, const char* name) m_ptr = (T*)malloc(initialSize * sizeof(T)); if (m_ptr == NULL) - throw Exception::OutOfMemory(Name) - .SetDiagMsg(fmt::format("called from 'SafeList::ctor' [length={}]", m_length)); + pxFailRel("SafeList exact alloc failed"); for (int i = 0; i < m_allocsize; ++i) { @@ -229,8 +225,7 @@ void SafeList::MakeRoomFor(int blockSize) const int newalloc = blockSize + ChunkSize; m_ptr = _virtual_realloc(newalloc); if (m_ptr == NULL) - throw Exception::OutOfMemory(Name) - .SetDiagMsg(fmt::format("Called from 'SafeList::MakeRoomFor' [oldlen={}] [newlen={}]", m_length, blockSize)); + pxFailRel("SafeList MakeRoomFor failed"); for (; m_allocsize < newalloc; ++m_allocsize) { diff --git a/common/ScopedGuard.h b/common/ScopedGuard.h index 1ad9abd216..0304e77624 100644 --- a/common/ScopedGuard.h +++ b/common/ScopedGuard.h @@ -36,6 +36,15 @@ public: } __fi ~ScopedGuard() + { + Run(); + } + + ScopedGuard(const ScopedGuard&) = delete; + void operator=(const ScopedGuard&) = delete; + + /// Runs the destructor function now instead of when we go out of scope. + __fi void Run() { if (!m_func.has_value()) return; @@ -44,9 +53,6 @@ public: m_func.reset(); } - ScopedGuard(const ScopedGuard&) = delete; - void operator=(const ScopedGuard&) = delete; - /// Prevents the function from being invoked when we go out of scope. __fi void Cancel() { diff --git a/common/Semaphore.cpp b/common/Semaphore.cpp index e961793637..5e24bc6960 100644 --- a/common/Semaphore.cpp +++ b/common/Semaphore.cpp @@ -26,6 +26,30 @@ // Semaphore Implementations // -------------------------------------------------------------------------------------- +bool Threading::WorkSema::CheckForWork() +{ + s32 value = m_state.load(std::memory_order_relaxed); + pxAssert(!IsDead(value)); + + // we want to switch to the running state, but preserve the waiting empty bit for RUNNING_N -> RUNNING_0 + // otherwise, we clear the waiting flag (since we're notifying the waiter that we're empty below) + while (!m_state.compare_exchange_weak(value, + IsReadyForSleep(value) ? STATE_RUNNING_0 : (value & STATE_FLAG_WAITING_EMPTY), + std::memory_order_acq_rel, std::memory_order_relaxed)) + { + } + + // if we're not empty, we have work to do + if (!IsReadyForSleep(value)) + return true; + + // this means we're empty, so notify any waiters + if (value & STATE_FLAG_WAITING_EMPTY) + m_empty_sema.Post(); + + // no work to do + return false; +} void Threading::WorkSema::WaitForWork() { diff --git a/common/SettingsWrapper.cpp b/common/SettingsWrapper.cpp index 6656715066..a2f5b08090 100644 --- a/common/SettingsWrapper.cpp +++ b/common/SettingsWrapper.cpp @@ -67,9 +67,9 @@ void SettingsLoadWrapper::Entry(const char* section, const char* var, bool& valu value = m_si.GetBoolValue(section, var, defvalue); } -void SettingsLoadWrapper::Entry(const char* section, const char* var, double& value, const double defvalue /*= 0.0*/) +void SettingsLoadWrapper::Entry(const char* section, const char* var, float& value, const float defvalue /*= 0.0*/) { - value = m_si.GetDoubleValue(section, var, defvalue); + value = m_si.GetFloatValue(section, var, defvalue); } void SettingsLoadWrapper::Entry(const char* section, const char* var, std::string& value, const std::string& default_value /*= std::string()*/) @@ -141,9 +141,9 @@ void SettingsSaveWrapper::Entry(const char* section, const char* var, bool& valu m_si.SetBoolValue(section, var, value); } -void SettingsSaveWrapper::Entry(const char* section, const char* var, double& value, const double defvalue /*= 0.0*/) +void SettingsSaveWrapper::Entry(const char* section, const char* var, float& value, const float defvalue /*= 0.0*/) { - m_si.SetDoubleValue(section, var, value); + m_si.SetFloatValue(section, var, value); } void SettingsSaveWrapper::Entry(const char* section, const char* var, std::string& value, const std::string& default_value /*= std::string()*/) diff --git a/common/SettingsWrapper.h b/common/SettingsWrapper.h index 60710b7525..4294c24c44 100644 --- a/common/SettingsWrapper.h +++ b/common/SettingsWrapper.h @@ -29,7 +29,7 @@ public: virtual void Entry(const char* section, const char* var, int& value, const int defvalue = 0) = 0; virtual void Entry(const char* section, const char* var, uint& value, const uint defvalue = 0) = 0; virtual void Entry(const char* section, const char* var, bool& value, const bool defvalue = false) = 0; - virtual void Entry(const char* section, const char* var, double& value, const double defvalue = 0.0) = 0; + virtual void Entry(const char* section, const char* var, float& value, const float defvalue = 0.0) = 0; virtual void Entry(const char* section, const char* var, std::string& value, const std::string& default_value = std::string()) = 0; // This special form of Entry is provided for bitfields, which cannot be passed by reference. @@ -65,7 +65,7 @@ public: void Entry(const char* section, const char* var, int& value, const int defvalue = 0) override; void Entry(const char* section, const char* var, uint& value, const uint defvalue = 0) override; void Entry(const char* section, const char* var, bool& value, const bool defvalue = false) override; - void Entry(const char* section, const char* var, double& value, const double defvalue = 0.0) override; + void Entry(const char* section, const char* var, float& value, const float defvalue = 0.0) override; void Entry(const char* section, const char* var, std::string& value, const std::string& default_value = std::string()) override; bool EntryBitBool(const char* section, const char* var, bool value, const bool defvalue = false) override; @@ -86,7 +86,7 @@ public: void Entry(const char* section, const char* var, int& value, const int defvalue = 0) override; void Entry(const char* section, const char* var, uint& value, const uint defvalue = 0) override; void Entry(const char* section, const char* var, bool& value, const bool defvalue = false) override; - void Entry(const char* section, const char* var, double& value, const double defvalue = 0.0) override; + void Entry(const char* section, const char* var, float& value, const float defvalue = 0.0) override; void Entry(const char* section, const char* var, std::string& value, const std::string& default_value = std::string()) override; bool EntryBitBool(const char* section, const char* var, bool value, const bool defvalue = false) override; diff --git a/common/StringUtil.cpp b/common/StringUtil.cpp index b5388aff85..ad9cfc1e25 100644 --- a/common/StringUtil.cpp +++ b/common/StringUtil.cpp @@ -370,6 +370,88 @@ namespace StringUtil } } + void EncodeAndAppendUTF8(std::string& s, char32_t ch) + { + if (ch <= 0x7F) + { + s.push_back(static_cast(static_cast(ch))); + } + else if (ch <= 0x07FF) + { + s.push_back(static_cast(static_cast(0xc0 | static_cast((ch >> 6) & 0x1f)))); + s.push_back(static_cast(static_cast(0x80 | static_cast((ch & 0x3f))))); + } + else if (ch <= 0xFFFF) + { + s.push_back(static_cast(static_cast(0xe0 | static_cast(((ch >> 12) & 0x0f))))); + s.push_back(static_cast(static_cast(0x80 | static_cast(((ch >> 6) & 0x3f))))); + s.push_back(static_cast(static_cast(0x80 | static_cast((ch & 0x3f))))); + } + else if (ch <= 0x10FFFF) + { + s.push_back(static_cast(static_cast(0xf0 | static_cast(((ch >> 18) & 0x07))))); + s.push_back(static_cast(static_cast(0x80 | static_cast(((ch >> 12) & 0x3f))))); + s.push_back(static_cast(static_cast(0x80 | static_cast(((ch >> 6) & 0x3f))))); + s.push_back(static_cast(static_cast(0x80 | static_cast((ch & 0x3f))))); + } + else + { + s.push_back(static_cast(0xefu)); + s.push_back(static_cast(0xbfu)); + s.push_back(static_cast(0xbdu)); + } + } + + size_t DecodeUTF8(const void* bytes, size_t length, char32_t* ch) + { + const u8* s = reinterpret_cast(bytes); + if (s[0] < 0x80) + { + *ch = s[0]; + return 1; + } + else if ((s[0] & 0xe0) == 0xc0) + { + if (length < 2) + goto invalid; + + *ch = static_cast((static_cast(s[0] & 0x1f) << 6) | (static_cast(s[1] & 0x3f) << 0)); + return 2; + } + else if ((s[0] & 0xf0) == 0xe0) + { + if (length < 3) + goto invalid; + + *ch = static_cast((static_cast(s[0] & 0x0f) << 12) | (static_cast(s[1] & 0x3f) << 6) | + (static_cast(s[2] & 0x3f) << 0)); + return 3; + } + else if ((s[0] & 0xf8) == 0xf0 && (s[0] <= 0xf4)) + { + if (length < 4) + goto invalid; + + *ch = static_cast((static_cast(s[0] & 0x07) << 18) | (static_cast(s[1] & 0x3f) << 12) | + (static_cast(s[2] & 0x3f) << 6) | (static_cast(s[3] & 0x3f) << 0)); + return 4; + } + + invalid: + *ch = 0xFFFFFFFFu; + return 1; + } + + size_t DecodeUTF8(const std::string_view& str, size_t offset, char32_t* ch) + { + return DecodeUTF8(str.data() + offset, str.length() - offset, ch); + } + + size_t DecodeUTF8(const std::string& str, size_t offset, char32_t* ch) + { + return DecodeUTF8(str.data() + offset, str.length() - offset, ch); + } + #ifdef _WIN32 std::wstring UTF8StringToWideString(const std::string_view& str) { diff --git a/common/StringUtil.h b/common/StringUtil.h index f2b684b0d7..b9db36b8f8 100644 --- a/common/StringUtil.h +++ b/common/StringUtil.h @@ -15,6 +15,7 @@ #pragma once #include "Pcsx2Types.h" +#include #include #include #include @@ -24,13 +25,16 @@ #include #include -#if defined(__has_include) && __has_include() -#include -#ifndef _MSC_VER +#include "fast_float/fast_float.h" + +// Older versions of libstdc++ are missing support for from_chars() with floats, and was only recently +// merged in libc++. So, just fall back to stringstream (yuck!) on everywhere except MSVC. +#if !defined(_MSC_VER) +#include #include +#ifdef __APPLE__ +#include #endif -#else -#include #endif namespace StringUtil @@ -72,23 +76,15 @@ namespace StringUtil #endif } - /// Wrapper arond std::from_chars + /// Wrapper around std::from_chars template ::value, bool> = true> inline std::optional FromChars(const std::string_view& str, int base = 10) { T value; -#if defined(__has_include) && __has_include() const std::from_chars_result result = std::from_chars(str.data(), str.data() + str.length(), value, base); if (result.ec != std::errc()) return std::nullopt; -#else - std::string temp(str); - std::istringstream ss(temp); - ss >> std::setbase(base) >> value; - if (ss.fail()) - return std::nullopt; -#endif return value; } @@ -98,22 +94,57 @@ namespace StringUtil { T value; -#if defined(__has_include) && __has_include() && defined(_MSC_VER) - const std::from_chars_result result = std::from_chars(str.data(), str.data() + str.length(), value); + const fast_float::from_chars_result result = fast_float::from_chars(str.data(), str.data() + str.length(), value); if (result.ec != std::errc()) return std::nullopt; -#else - /// libstdc++ does not support from_chars with floats yet - std::string temp(str); - std::istringstream ss(temp); - ss >> value; - if (ss.fail()) - return std::nullopt; -#endif return value; } + /// Wrapper around std::to_chars + template ::value, bool> = true> + inline std::string ToChars(T value, int base = 10) + { + // to_chars() requires macOS 10.15+. +#if !defined(__APPLE__) || MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_15 + constexpr size_t MAX_SIZE = 32; + char buf[MAX_SIZE]; + std::string ret; + + const std::to_chars_result result = std::to_chars(buf, buf + MAX_SIZE, value, base); + if (result.ec == std::errc()) + ret.append(buf, result.ptr - buf); + + return ret; +#else + std::ostringstream ss; + ss.imbue(std::locale::classic()); + ss << std::setbase(base) << value; + return ss.str(); +#endif + } + + template ::value, bool> = true> + inline std::string ToChars(T value) + { + // No to_chars() in older versions of libstdc++/libc++. +#ifdef _MSC_VER + constexpr size_t MAX_SIZE = 64; + char buf[MAX_SIZE]; + std::string ret; + const std::to_chars_result result = std::to_chars(buf, buf + MAX_SIZE, value); + if (result.ec == std::errc()) + ret.append(buf, result.ptr - buf); + return ret; +#else + std::ostringstream ss; + ss.imbue(std::locale::classic()); + ss << value; + return ss.str(); +#endif + } + + /// Explicit override for booleans template <> inline std::optional FromChars(const std::string_view& str, int base) @@ -135,6 +166,12 @@ namespace StringUtil return std::nullopt; } + template <> + inline std::string ToChars(bool value, int base) + { + return std::string(value ? "true" : "false"); + } + /// Encode/decode hexadecimal byte buffers std::optional> DecodeHex(const std::string_view& str); std::string EncodeHex(const u8* data, int length); @@ -169,7 +206,7 @@ namespace StringUtil std::vector SplitString(const std::string_view& str, char delimiter, bool skip_empty = true); /// Joins a string together using the specified delimiter. - template + template static inline std::string JoinString(const T& start, const T& end, char delimiter) { std::string ret; @@ -204,6 +241,15 @@ namespace StringUtil /// Appends a UTF-16/UTF-32 codepoint to a UTF-8 string. void AppendUTF16CharacterToUTF8(std::string& s, u16 ch); + /// Appends a UTF-16/UTF-32 codepoint to a UTF-8 string. + void EncodeAndAppendUTF8(std::string& s, char32_t ch); + + /// Decodes UTF-8 to a single codepoint, updating the position parameter. + /// Returns the number of bytes the codepoint took in the original string. + size_t DecodeUTF8(const void* bytes, size_t length, char32_t* ch); + size_t DecodeUTF8(const std::string_view& str, size_t offset, char32_t* ch); + size_t DecodeUTF8(const std::string& str, size_t offset, char32_t* ch); + /// Strided memcpy/memcmp. static inline void StrideMemCpy(void* dst, std::size_t dst_stride, const void* src, std::size_t src_stride, std::size_t copy_size, std::size_t count) diff --git a/common/ThreadPool.cpp b/common/ThreadPool.cpp new file mode 100644 index 0000000000..a5819a8ad9 --- /dev/null +++ b/common/ThreadPool.cpp @@ -0,0 +1,137 @@ +/* + * MIT License + * + * Copyright (c) 2022 Colion Braley + * + * 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. + */ + +// From https://raw.githubusercontent.com/cbraley/threadpool/master/src/thread_pool.cc + +#include "common/PrecompiledHeader.h" + +#include "common/ThreadPool.h" + +#include + +namespace cb { + +// static +unsigned int ThreadPool::GetNumLogicalCores() { + // TODO(cbraley): Apparently this is broken in some older stdlib + // implementations? + const unsigned int dflt = std::thread::hardware_concurrency(); + if (dflt == 0) { + // TODO(cbraley): Return some error code instead. + return 16; + } else { + return dflt; + } +} + +ThreadPool::~ThreadPool() { + // TODO(cbraley): The current thread could help out to drain the work_ queue + // faster - for example, if there is work that hasn't yet been scheduled this + // thread could "pitch in" to help finish faster. + + { + std::lock_guard scoped_lock(mu_); + exit_ = true; + } + condvar_.notify_all(); // Tell *all* workers we are ready. + + for (std::thread& thread : workers_) { + thread.join(); + } +} + +void ThreadPool::Wait() { + std::unique_lock lock(mu_); + if (!work_.empty()) { + work_done_condvar_.wait(lock, [this] { return work_.empty(); }); + } +} + +ThreadPool::ThreadPool(int num_workers) + : num_workers_(num_workers), exit_(false) { + assert(num_workers_ > 0); + // TODO(cbraley): Handle thread construction exceptions. + workers_.reserve(num_workers_); + for (int i = 0; i < num_workers_; ++i) { + workers_.emplace_back(&ThreadPool::ThreadLoop, this); + } +} + +void ThreadPool::Schedule(std::function func) { + ScheduleAndGetFuture(std::move(func)); // We ignore the returned std::future. +} + +void ThreadPool::ThreadLoop() { + // Wait until the ThreadPool sends us work. + while (true) { + WorkItem work_item; + + int prev_work_size = -1; + { + std::unique_lock lock(mu_); + condvar_.wait(lock, [this] { return exit_ || (!work_.empty()); }); + // ...after the wait(), we hold the lock. + + // If all the work is done and exit_ is true, break out of the loop. + if (exit_ && work_.empty()) { + break; + } + + // Pop the work off of the queue - we are careful to execute the + // work_item.func callback only after we have released the lock. + prev_work_size = work_.size(); + work_item = std::move(work_.front()); + work_.pop(); + } + + // We are careful to do the work without the lock held! + // TODO(cbraley): Handle exceptions properly. + work_item.func(); // Do work. + + if (work_done_callback_) { + work_done_callback_(prev_work_size - 1); + } + + // Notify a condvar is all work is done. + { + std::unique_lock lock(mu_); + if (work_.empty() && prev_work_size == 1) { + work_done_condvar_.notify_all(); + } + } + } +} + +int ThreadPool::OutstandingWorkSize() const { + std::lock_guard scoped_lock(mu_); + return work_.size(); +} + +int ThreadPool::NumWorkers() const { return num_workers_; } + +void ThreadPool::SetWorkDoneCallback(std::function func) { + work_done_callback_ = std::move(func); +} + +} // namespace cb diff --git a/common/ThreadPool.h b/common/ThreadPool.h new file mode 100644 index 0000000000..83a0664d6a --- /dev/null +++ b/common/ThreadPool.h @@ -0,0 +1,255 @@ +/* + * MIT License + * + * Copyright (c) 2022 Colion Braley + * + * 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. + */ + +// From https://raw.githubusercontent.com/cbraley/threadpool/master/src/thread_pool.h + +#pragma once + +// A simple thread pool class. +// Usage examples: +// +// { +// ThreadPool pool(16); // 16 worker threads. +// for (int i = 0; i < 100; ++i) { +// pool.Schedule([i]() { +// DoSlowExpensiveOperation(i); +// }); +// } +// +// // `pool` goes out of scope here - the code will block in the ~ThreadPool +// // destructor until all work is complete. +// } +// +// // TODO(cbraley): Add examples with std::future. + +#include +#include +#include +#include +#include +#include +#include + +// We want to use std::invoke if C++17 is available, and fallback to "hand +// crafted" code if std::invoke isn't available. +#if __cplusplus >= 201703L || defined(_MSC_VER) + #define INVOKE_MACRO(CALLABLE, ARGS_TYPE, ARGS) std::invoke(CALLABLE, std::forward(ARGS)...) +#elif __cplusplus >= 201103L + // Update this with http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4169.html. + #define INVOKE_MACRO(CALLABLE, ARGS_TYPE, ARGS) CALLABLE(std::forward(ARGS)...) +#else + #error ("C++ version is too old! C++98 is not supported.") +#endif + +namespace cb { + +class ThreadPool { + public: + // Create a thread pool with `num_workers` dedicated worker threads. + explicit ThreadPool(int num_workers); + + // Default construction is disallowed. + ThreadPool() = delete; + + // Get the number of logical cores on the CPU. This is implemented using + // std::thread::hardware_concurrency(). + // https://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency + static unsigned int GetNumLogicalCores(); + + // The `ThreadPool` destructor blocks until all outstanding work is complete. + ~ThreadPool(); + + // No copying, assigning, or std::move-ing. + ThreadPool& operator=(const ThreadPool&) = delete; + ThreadPool(const ThreadPool&) = delete; + ThreadPool(ThreadPool&&) = delete; + ThreadPool& operator=(ThreadPool&&) = delete; + + // Add the function `func` to the thread pool. `func` will be executed at some + // point in the future on an arbitrary thread. + void Schedule(std::function func); + + // Add `func` to the thread pool, and return a std::future that can be used to + // access the function's return value. + // + // *** Usage example *** + // Don't be alarmed by this function's tricky looking signature - this is + // very easy to use. Here's an example: + // + // int ComputeSum(std::vector& values) { + // int sum = 0; + // for (const int& v : values) { + // sum += v; + // } + // return sum; + // } + // + // ThreadPool pool = ...; + // std::vector numbers = ...; + // + // std::future sum_future = ScheduleAndGetFuture( + // []() { + // return ComputeSum(numbers); + // }); + // + // // Do other work... + // + // std::cout << "The sum is " << sum_future.get() << std::endl; + // + // *** Details *** + // Given a callable `func` that returns a value of type `RetT`, this + // function returns a std::future that can be used to access + // `func`'s results. + template + auto ScheduleAndGetFuture(FuncT&& func, ArgsT&&... args) + -> std::future; + + // Wait for all outstanding work to be completed. + void Wait(); + + // Return the number of outstanding functions to be executed. + int OutstandingWorkSize() const; + + // Return the number of threads in the pool. + int NumWorkers() const; + + void SetWorkDoneCallback(std::function func); + + private: + void ThreadLoop(); + + // Number of worker threads - fixed at construction time. + int num_workers_; + + // The destructor sets `exit_` to true and then notifies all workers. `exit_` + // causes each thread to break out of their work loop. + bool exit_; + + mutable std::mutex mu_; + + // Work queue. Guarded by `mu_`. + struct WorkItem { + std::function func; + }; + std::queue work_; + + // Condition variable used to notify worker threads that new work is + // available. + std::condition_variable condvar_; + + // Worker threads. + std::vector workers_; + + // Condition variable used to notify that all work is complete - the work + // queue has "run dry". + std::condition_variable work_done_condvar_; + + // Whenever a work item is complete, we call this callback. If this is empty, + // nothing is done. + std::function work_done_callback_; +}; + +namespace impl { + +// This helper class simply returns a std::function that executes: +// ReturnT x = func(); +// promise->set_value(x); +// However, this is tricky in the case where T == void. The code above won't +// compile if ReturnT == void, and neither will +// promise->set_value(func()); +// To workaround this, we use a template specialization for the case where +// ReturnT is void. If the "regular void" proposal is accepted, this could be +// simpler: +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0146r1.html. + +// The non-specialized `FuncWrapper` implementation handles callables that +// return a non-void value. +template +struct FuncWrapper { + template + std::function GetWrapped( + FuncT&& func, std::shared_ptr> promise, + ArgsT&&... args) { + // TODO(cbraley): Capturing by value is inefficient. It would be more + // efficient to move-capture everything, but we can't do this until C++14 + // generalized lambda capture is available. Can we use std::bind instead to + // make this more efficient and still use C++11? + return [promise, func, args...]() mutable { + promise->set_value(INVOKE_MACRO(func, ArgsT, args)); + }; + } +}; + +template +void InvokeVoidRet(FuncT&& func, std::shared_ptr> promise, + ArgsT&&... args) { + INVOKE_MACRO(func, ArgsT, args); + promise->set_value(); +} + +// This `FuncWrapper` specialization handles callables that return void. +template <> +struct FuncWrapper { + template + std::function GetWrapped(FuncT&& func, + std::shared_ptr> promise, + ArgsT&&... args) { + return [promise, func, args...]() mutable { + INVOKE_MACRO(func, ArgsT, args); + promise->set_value(); + }; + } +}; + +} // namespace impl + +template +auto ThreadPool::ScheduleAndGetFuture(FuncT&& func, ArgsT&&... args) + -> std::future { + using ReturnT = decltype(INVOKE_MACRO(func, ArgsT, args)); + + // We are only allocating this std::promise in a shared_ptr because + // std::promise is non-copyable. + std::shared_ptr> promise = + std::make_shared>(); + std::future ret_future = promise->get_future(); + + impl::FuncWrapper func_wrapper; + std::function wrapped_func = func_wrapper.GetWrapped( + std::move(func), std::move(promise), std::forward(args)...); + + // Acquire the lock, and then push the WorkItem onto the queue. + { + std::lock_guard scoped_lock(mu_); + WorkItem work; + work.func = std::move(wrapped_func); + work_.emplace(std::move(work)); + } + condvar_.notify_one(); // Tell one worker we are ready. + return ret_future; +} + +} // namespace cb + +#undef INVOKE_MACRO diff --git a/common/Threading.h b/common/Threading.h index d91b58ec01..57b4ba9187 100644 --- a/common/Threading.h +++ b/common/Threading.h @@ -211,6 +211,8 @@ namespace Threading m_sema.Post(); } + /// Checks if there's any work in the queue + bool CheckForWork(); /// Wait for work to be added to the queue void WaitForWork(); /// Wait for work to be added to the queue, spinning for a bit before sleeping the thread @@ -228,4 +230,35 @@ namespace Threading /// Should be called by the worker thread if it restarts after dying void Reset(); }; + + /// A semaphore that definitely has a fast userspace path + class UserspaceSemaphore + { + KernelSemaphore m_sema; + std::atomic m_counter{0}; + + public: + UserspaceSemaphore() = default; + ~UserspaceSemaphore() = default; + + void Post() + { + if (m_counter.fetch_add(1, std::memory_order_release) < 0) + m_sema.Post(); + } + + void Wait() + { + if (m_counter.fetch_sub(1, std::memory_order_acquire) <= 0) + m_sema.Wait(); + } + + bool TryWait() + { + int32_t counter = m_counter.load(std::memory_order_relaxed); + while (counter > 0 && !m_counter.compare_exchange_weak(counter, counter - 1, std::memory_order_acquire, std::memory_order_relaxed)) + ; + return counter > 0; + } + }; } // namespace Threading diff --git a/common/VirtualMemory.cpp b/common/VirtualMemory.cpp index 5cb7c82a47..17b6994507 100644 --- a/common/VirtualMemory.cpp +++ b/common/VirtualMemory.cpp @@ -13,6 +13,7 @@ * If not, see . */ +#include "common/Align.h" #include "common/PageFaultSource.h" #include "common/EventSource.inl" #include "common/MemsetFast.inl" @@ -68,17 +69,13 @@ void SrcType_PageFault::_DispatchRaw(ListenerIterator iter, const ListenerIterat } while ((++iter != iend) && !m_handled); } -static size_t pageAlign(size_t size) -{ - return (size + __pagesize - 1) / __pagesize * __pagesize; -} - // -------------------------------------------------------------------------------------- // VirtualMemoryManager (implementations) // -------------------------------------------------------------------------------------- -VirtualMemoryManager::VirtualMemoryManager(std::string name, uptr base, size_t size, uptr upper_bounds, bool strict) +VirtualMemoryManager::VirtualMemoryManager(std::string name, const char* file_mapping_name, uptr base, size_t size, uptr upper_bounds, bool strict) : m_name(std::move(name)) + , m_file_handle(nullptr) , m_baseptr(0) , m_pageuse(nullptr) , m_pages_reserved(0) @@ -86,34 +83,72 @@ VirtualMemoryManager::VirtualMemoryManager(std::string name, uptr base, size_t s if (!size) return; - uptr reserved_bytes = pageAlign(size); + size_t reserved_bytes = Common::PageAlign(size); m_pages_reserved = reserved_bytes / __pagesize; - m_baseptr = (uptr)HostSys::MmapReserve(base, reserved_bytes); - - if (!m_baseptr || (upper_bounds != 0 && (((uptr)m_baseptr + reserved_bytes) > upper_bounds))) + if (file_mapping_name && file_mapping_name[0]) { - DevCon.Warning("%s: host memory @ 0x%016" PRIXPTR " -> 0x%016" PRIXPTR " is unavailable; attempting to map elsewhere...", - m_name.c_str(), base, base + size); + std::string real_file_mapping_name(HostSys::GetFileMappingName(file_mapping_name)); + m_file_handle = HostSys::CreateSharedMemory(real_file_mapping_name.c_str(), reserved_bytes); + if (!m_file_handle) + return; - SafeSysMunmap(m_baseptr, reserved_bytes); - - if (base) + m_baseptr = static_cast(HostSys::MapSharedMemory(m_file_handle, 0, (void*)base, reserved_bytes, PageAccess_ReadWrite())); + if (!m_baseptr || (upper_bounds != 0 && (((uptr)m_baseptr + reserved_bytes) > upper_bounds))) { - // Let's try again at an OS-picked memory area, and then hope it meets needed - // boundschecking criteria below. - m_baseptr = (uptr)HostSys::MmapReserve(0, reserved_bytes); + DevCon.Warning("%s: host memory @ 0x%016" PRIXPTR " -> 0x%016" PRIXPTR " is unavailable; attempting to map elsewhere...", + m_name.c_str(), base, base + size); + + SafeSysMunmap(m_baseptr, reserved_bytes); + + if (base) + { + // Let's try again at an OS-picked memory area, and then hope it meets needed + // boundschecking criteria below. + m_baseptr = static_cast(HostSys::MapSharedMemory(m_file_handle, 0, nullptr, reserved_bytes, PageAccess_ReadWrite())); + } + } + } + else + { + m_baseptr = static_cast(HostSys::Mmap((void*)base, reserved_bytes, PageAccess_Any())); + + if (!m_baseptr || (upper_bounds != 0 && (((uptr)m_baseptr + reserved_bytes) > upper_bounds))) + { + DevCon.Warning("%s: host memory @ 0x%016" PRIXPTR " -> 0x%016" PRIXPTR " is unavailable; attempting to map elsewhere...", + m_name.c_str(), base, base + size); + + SafeSysMunmap(m_baseptr, reserved_bytes); + + if (base) + { + // Let's try again at an OS-picked memory area, and then hope it meets needed + // boundschecking criteria below. + m_baseptr = static_cast(HostSys::Mmap(0, reserved_bytes, PageAccess_Any())); + } } } bool fulfillsRequirements = true; - if (strict && m_baseptr != base) + if (strict && (uptr)m_baseptr != base) fulfillsRequirements = false; - if ((upper_bounds != 0) && ((m_baseptr + reserved_bytes) > upper_bounds)) + if ((upper_bounds != 0) && ((uptr)(m_baseptr + reserved_bytes) > upper_bounds)) fulfillsRequirements = false; if (!fulfillsRequirements) { - SafeSysMunmap(m_baseptr, reserved_bytes); + if (m_file_handle) + { + if (m_baseptr) + HostSys::UnmapSharedMemory(m_baseptr, reserved_bytes); + m_baseptr = 0; + + HostSys::DestroySharedMemory(m_file_handle); + m_file_handle = nullptr; + } + else + { + SafeSysMunmap(m_baseptr, reserved_bytes); + } } if (!m_baseptr) @@ -137,7 +172,14 @@ VirtualMemoryManager::~VirtualMemoryManager() if (m_pageuse) delete[] m_pageuse; if (m_baseptr) - HostSys::Munmap(m_baseptr, m_pages_reserved * __pagesize); + { + if (m_file_handle) + HostSys::UnmapSharedMemory((void*)m_baseptr, m_pages_reserved * __pagesize); + else + HostSys::Munmap(m_baseptr, m_pages_reserved * __pagesize); + } + if (m_file_handle) + HostSys::DestroySharedMemory(m_file_handle); } static bool VMMMarkPagesAsInUse(std::atomic* begin, std::atomic* end) @@ -164,9 +206,9 @@ static bool VMMMarkPagesAsInUse(std::atomic* begin, std::atomic* end return true; } -void* VirtualMemoryManager::Alloc(uptr offsetLocation, size_t size) const +u8* VirtualMemoryManager::Alloc(uptr offsetLocation, size_t size) const { - size = pageAlign(size); + size = Common::PageAlign(size); if (!pxAssertDev(offsetLocation % __pagesize == 0, "(VirtualMemoryManager) alloc at unaligned offsetLocation")) return nullptr; if (!pxAssertDev(size + offsetLocation <= m_pages_reserved * __pagesize, "(VirtualMemoryManager) alloc outside reserved area")) @@ -177,15 +219,15 @@ void* VirtualMemoryManager::Alloc(uptr offsetLocation, size_t size) const auto puEnd = &m_pageuse[(offsetLocation + size) / __pagesize]; if (!pxAssertDev(VMMMarkPagesAsInUse(puStart, puEnd), "(VirtualMemoryManager) allocation requests overlapped")) return nullptr; - return (void*)(m_baseptr + offsetLocation); + return m_baseptr + offsetLocation; } void VirtualMemoryManager::Free(void* address, size_t size) const { - uptr offsetLocation = (uptr)address - m_baseptr; + uptr offsetLocation = (uptr)address - (uptr)m_baseptr; if (!pxAssertDev(offsetLocation % __pagesize == 0, "(VirtualMemoryManager) free at unaligned address")) { - uptr newLoc = pageAlign(offsetLocation); + uptr newLoc = Common::PageAlign(offsetLocation); size -= (offsetLocation - newLoc); offsetLocation = newLoc; } @@ -210,55 +252,39 @@ void VirtualMemoryManager::Free(void* address, size_t size) const // -------------------------------------------------------------------------------------- VirtualMemoryBumpAllocator::VirtualMemoryBumpAllocator(VirtualMemoryManagerPtr allocator, uptr offsetLocation, size_t size) : m_allocator(std::move(allocator)) - , m_baseptr((uptr)m_allocator->Alloc(offsetLocation, size)) + , m_baseptr(m_allocator->Alloc(offsetLocation, size)) , m_endptr(m_baseptr + size) { if (m_baseptr.load() == 0) pxAssertDev(0, "(VirtualMemoryBumpAllocator) tried to construct from bad VirtualMemoryManager"); } -void* VirtualMemoryBumpAllocator::Alloc(size_t size) +u8* VirtualMemoryBumpAllocator::Alloc(size_t size) { if (m_baseptr.load() == 0) // True if constructed from bad VirtualMemoryManager (assertion was on initialization) return nullptr; - size_t reservedSize = pageAlign(size); + size_t reservedSize = Common::PageAlign(size); - uptr out = m_baseptr.fetch_add(reservedSize, std::memory_order_relaxed); + u8* out = m_baseptr.fetch_add(reservedSize, std::memory_order_relaxed); if (!pxAssertDev(out - reservedSize + size <= m_endptr, "(VirtualMemoryBumpAllocator) ran out of memory")) return nullptr; - return (void*)out; + return out; } // -------------------------------------------------------------------------------------- // VirtualMemoryReserve (implementations) // -------------------------------------------------------------------------------------- -VirtualMemoryReserve::VirtualMemoryReserve(std::string name, size_t size) +VirtualMemoryReserve::VirtualMemoryReserve(std::string name) : m_name(std::move(name)) { - m_defsize = size; - - m_allocator = nullptr; - m_pages_commited = 0; - m_pages_reserved = 0; - m_baseptr = nullptr; - m_prot_mode = PageAccess_None(); - m_allow_writes = true; } -VirtualMemoryReserve& VirtualMemoryReserve::SetPageAccessOnCommit(const PageProtectionMode& mode) +VirtualMemoryReserve::~VirtualMemoryReserve() { - m_prot_mode = mode; - return *this; -} - -size_t VirtualMemoryReserve::GetSize(size_t requestedSize) -{ - if (!requestedSize) - return pageAlign(m_defsize); - return pageAlign(requestedSize); + pxAssertRel(!m_baseptr, "VirtualMemoryReserve has not been released."); } // Notes: @@ -269,136 +295,43 @@ size_t VirtualMemoryReserve::GetSize(size_t requestedSize) // baseptr - the new base pointer that's about to be assigned // size - size of the region pointed to by baseptr // -void* VirtualMemoryReserve::Assign(VirtualMemoryManagerPtr allocator, void* baseptr, size_t size) +void VirtualMemoryReserve::Assign(VirtualMemoryManagerPtr allocator, u8* baseptr, size_t size) { - if (!pxAssertDev(m_baseptr == NULL, "(VirtualMemoryReserve) Invalid object state; object has already been reserved.")) - return m_baseptr; - - if (!size) - return nullptr; + pxAssertRel(size > 0 && Common::IsAlignedPow2(size, __pagesize), "VM allocation is not page aligned"); + pxAssertRel(!m_baseptr, "Virtual memory reserve has already been assigned"); m_allocator = std::move(allocator); - m_baseptr = baseptr; - - uptr reserved_bytes = pageAlign(size); - m_pages_reserved = reserved_bytes / __pagesize; - - if (!m_baseptr) - return nullptr; + m_size = size; std::string mbkb; - uint mbytes = reserved_bytes / _1mb; + uint mbytes = size / _1mb; if (mbytes) mbkb = fmt::format("[{}mb]", mbytes); else - mbkb = fmt::format("[{}kb]", reserved_bytes / 1024); + mbkb = fmt::format("[{}kb]", size / 1024); DevCon.WriteLn(Color_Gray, "%-32s @ 0x%016" PRIXPTR " -> 0x%016" PRIXPTR " %s", m_name.c_str(), - m_baseptr, (uptr)m_baseptr + reserved_bytes, mbkb.c_str()); - - return m_baseptr; + m_baseptr, (uptr)m_baseptr + size, mbkb.c_str()); } -void VirtualMemoryReserve::ReprotectCommittedBlocks(const PageProtectionMode& newmode) +u8* VirtualMemoryReserve::BumpAllocate(VirtualMemoryBumpAllocator& allocator, size_t size) { - if (!m_pages_commited) - return; - HostSys::MemProtect(m_baseptr, m_pages_commited * __pagesize, newmode); -} + u8* base = allocator.Alloc(size); + if (base) + Assign(allocator.GetAllocator(), base, size); -// Clears all committed blocks, restoring the allocation to a reserve only. -void VirtualMemoryReserve::Reset() -{ - if (!m_pages_commited) - return; - - ReprotectCommittedBlocks(PageAccess_None()); - HostSys::MmapResetPtr(m_baseptr, m_pages_commited * __pagesize); - m_pages_commited = 0; + return base; } void VirtualMemoryReserve::Release() { if (!m_baseptr) return; - Reset(); - m_allocator->Free(m_baseptr, m_pages_reserved * __pagesize); + + m_allocator->Free(m_baseptr, m_size); m_baseptr = nullptr; -} - -bool VirtualMemoryReserve::Commit() -{ - if (!m_pages_reserved) - return false; - if (!pxAssert(!m_pages_commited)) - return true; - - m_pages_commited = m_pages_reserved; - return HostSys::MmapCommitPtr(m_baseptr, m_pages_reserved * __pagesize, m_prot_mode); -} - -void VirtualMemoryReserve::AllowModification() -{ - m_allow_writes = true; - HostSys::MemProtect(m_baseptr, m_pages_commited * __pagesize, m_prot_mode); -} - -void VirtualMemoryReserve::ForbidModification() -{ - m_allow_writes = false; - HostSys::MemProtect(m_baseptr, m_pages_commited * __pagesize, PageProtectionMode(m_prot_mode).Write(false)); -} - - -// If growing the array, or if shrinking the array to some point that's still *greater* than the -// committed memory range, then attempt a passive "on-the-fly" resize that maps/unmaps some portion -// of the reserve. -// -// If the above conditions are not met, or if the map/unmap fails, this method returns false. -// The caller will be responsible for manually resetting the reserve. -// -// Parameters: -// newsize - new size of the reserved buffer, in bytes. -bool VirtualMemoryReserve::TryResize(uint newsize) -{ - uint newPages = pageAlign(newsize) / __pagesize; - - if (newPages > m_pages_reserved) - { - uint toReservePages = newPages - m_pages_reserved; - uint toReserveBytes = toReservePages * __pagesize; - - DevCon.WriteLn("%-32s is being expanded by %u pages.", m_name.c_str(), toReservePages); - - if (!m_allocator->AllocAtAddress(GetPtrEnd(), toReserveBytes)) - { - Console.Warning("%-32s could not be passively resized due to virtual memory conflict!", m_name.c_str()); - Console.Indent().Warning("(attempted to map memory @ %08p -> %08p)", m_baseptr, (uptr)m_baseptr + toReserveBytes); - return false; - } - - DevCon.WriteLn(Color_Gray, "%-32s @ %08p -> %08p [%umb]", m_name.c_str(), - m_baseptr, (uptr)m_baseptr + toReserveBytes, toReserveBytes / _1mb); - } - else if (newPages < m_pages_reserved) - { - if (m_pages_commited > newsize) - return false; - - uint toRemovePages = m_pages_reserved - newPages; - uint toRemoveBytes = toRemovePages * __pagesize; - - DevCon.WriteLn("%-32s is being shrunk by %u pages.", m_name.c_str(), toRemovePages); - - m_allocator->Free(GetPtrEnd() - toRemoveBytes, toRemoveBytes); - - DevCon.WriteLn(Color_Gray, "%-32s @ %08p -> %08p [%umb]", m_name.c_str(), - m_baseptr, GetPtrEnd(), GetReserveSizeInBytes() / _1mb); - } - - m_pages_reserved = newPages; - return true; + m_size = 0; } // -------------------------------------------------------------------------------------- @@ -422,11 +355,3 @@ std::string PageProtectionMode::ToString() const return modeStr; } - -// -------------------------------------------------------------------------------------- -// Common HostSys implementation -// -------------------------------------------------------------------------------------- -void HostSys::Munmap(void* base, size_t size) -{ - Munmap((uptr)base, size); -} diff --git a/common/Vulkan/Builders.cpp b/common/Vulkan/Builders.cpp index ab0ad20d41..ec0026dfa3 100644 --- a/common/Vulkan/Builders.cpp +++ b/common/Vulkan/Builders.cpp @@ -436,6 +436,65 @@ namespace Vulkan m_provoking_vertex.provokingVertexMode = mode; } + ComputePipelineBuilder::ComputePipelineBuilder() { Clear(); } + + void ComputePipelineBuilder::Clear() + { + m_ci = {}; + m_ci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + m_si = {}; + m_smap_entries = {}; + m_smap_constants = {}; + } + + VkPipeline ComputePipelineBuilder::Create(VkDevice device, VkPipelineCache pipeline_cache /*= VK_NULL_HANDLE*/, bool clear /*= true*/) + { + VkPipeline pipeline; + VkResult res = vkCreateComputePipelines(device, pipeline_cache, 1, &m_ci, nullptr, &pipeline); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkCreateComputePipelines() failed: "); + return VK_NULL_HANDLE; + } + + if (clear) + Clear(); + + return pipeline; + } + + void ComputePipelineBuilder::SetShader(VkShaderModule module, const char* entry_point) + { + m_ci.stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + m_ci.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT; + m_ci.stage.module = module; + m_ci.stage.pName = entry_point; + } + + void ComputePipelineBuilder::SetPipelineLayout(VkPipelineLayout layout) + { + m_ci.layout = layout; + } + + void ComputePipelineBuilder::SetSpecializationBool(u32 index, bool value) + { + const u32 u32_value = static_cast(value); + SetSpecializationValue(index, u32_value); + } + + void ComputePipelineBuilder::SetSpecializationValue(u32 index, u32 value) + { + if (m_si.mapEntryCount == 0) + { + m_si.pMapEntries = m_smap_entries.data(); + m_si.pData = m_smap_constants.data(); + m_ci.stage.pSpecializationInfo = &m_si; + } + + m_smap_entries[m_si.mapEntryCount++] = {index, index * SPECIALIZATION_CONSTANT_SIZE, SPECIALIZATION_CONSTANT_SIZE}; + m_si.dataSize += SPECIALIZATION_CONSTANT_SIZE; + } + SamplerBuilder::SamplerBuilder() { Clear(); } void SamplerBuilder::Clear() diff --git a/common/Vulkan/Builders.h b/common/Vulkan/Builders.h index a9199cede5..86a0f884dc 100644 --- a/common/Vulkan/Builders.h +++ b/common/Vulkan/Builders.h @@ -159,6 +159,37 @@ namespace Vulkan VkPipelineRasterizationProvokingVertexStateCreateInfoEXT m_provoking_vertex; }; + class ComputePipelineBuilder + { + public: + enum : u32 + { + SPECIALIZATION_CONSTANT_SIZE = 4, + MAX_SPECIALIZATION_CONSTANTS = 4, + }; + + ComputePipelineBuilder(); + + void Clear(); + + VkPipeline Create(VkDevice device, VkPipelineCache pipeline_cache = VK_NULL_HANDLE, bool clear = true); + + void SetShader(VkShaderModule module, const char* entry_point); + + void SetPipelineLayout(VkPipelineLayout layout); + + void SetSpecializationBool(u32 index, bool value); + + private: + void SetSpecializationValue(u32 index, u32 value); + + VkComputePipelineCreateInfo m_ci; + + VkSpecializationInfo m_si; + std::array m_smap_entries; + std::array m_smap_constants; + }; + class SamplerBuilder { public: diff --git a/common/Vulkan/Context.cpp b/common/Vulkan/Context.cpp index f6c6a41741..89ed064854 100644 --- a/common/Vulkan/Context.cpp +++ b/common/Vulkan/Context.cpp @@ -17,13 +17,21 @@ #include "common/Align.h" #include "common/Assertions.h" #include "common/Console.h" +#include "common/General.h" #include "common/StringUtil.h" +#include "common/Vulkan/ShaderCompiler.h" #include "common/Vulkan/SwapChain.h" #include "common/Vulkan/Util.h" #include #include #include +#ifdef _WIN32 +#include "common/RedtapeWindows.h" +#else +#include +#endif + std::unique_ptr g_vulkan_context; // Tweakables @@ -31,8 +39,8 @@ enum : u32 { MAX_DRAW_CALLS_PER_FRAME = 8192, MAX_COMBINED_IMAGE_SAMPLER_DESCRIPTORS_PER_FRAME = 2 * MAX_DRAW_CALLS_PER_FRAME, - MAX_SAMPLED_IMAGE_DESCRIPTORS_PER_FRAME = - MAX_DRAW_CALLS_PER_FRAME, // assume at least half our draws aren't going to be shuffle/blending + MAX_SAMPLED_IMAGE_DESCRIPTORS_PER_FRAME = MAX_DRAW_CALLS_PER_FRAME, // assume at least half our draws aren't going to be shuffle/blending + MAX_STORAGE_IMAGE_DESCRIPTORS_PER_FRAME = 4, // Currently used by CAS only MAX_INPUT_ATTACHMENT_IMAGE_DESCRIPTORS_PER_FRAME = MAX_DRAW_CALLS_PER_FRAME, MAX_DESCRIPTOR_SETS_PER_FRAME = MAX_DRAW_CALLS_PER_FRAME * 2 }; @@ -351,6 +359,7 @@ namespace Vulkan if (!g_vulkan_context->CreateDevice(surface, enable_validation_layer, nullptr, 0, nullptr, 0, nullptr) || !g_vulkan_context->CreateAllocator() || !g_vulkan_context->CreateGlobalDescriptorPool() || !g_vulkan_context->CreateCommandBuffers() || !g_vulkan_context->CreateTextureStreamBuffer() || + !g_vulkan_context->InitSpinResources() || (enable_surface && (*out_swap_chain = SwapChain::Create(wi_copy, surface, preferred_present_mode)) == nullptr)) { // Since we are destroying the instance, we're also responsible for destroying the surface. @@ -378,6 +387,7 @@ namespace Vulkan g_vulkan_context->m_texture_upload_buffer.Destroy(false); + g_vulkan_context->DestroySpinResources(); g_vulkan_context->DestroyRenderPassCache(); g_vulkan_context->DestroyGlobalDescriptorPool(); g_vulkan_context->DestroyCommandBuffers(); @@ -446,10 +456,14 @@ namespace Vulkan SupportsExtension(VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, false); m_optional_extensions.vk_ext_memory_budget = SupportsExtension(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, false); + m_optional_extensions.vk_ext_calibrated_timestamps = + SupportsExtension(VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME, false); m_optional_extensions.vk_khr_driver_properties = SupportsExtension(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, false); m_optional_extensions.vk_arm_rasterization_order_attachment_access = SupportsExtension(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME, false); + m_optional_extensions.vk_khr_fragment_shader_barycentric = + SupportsExtension(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME, false); return true; } @@ -469,6 +483,7 @@ namespace Vulkan m_device_features.wideLines = available_features.wideLines; m_device_features.fragmentStoresAndAtomics = available_features.fragmentStoresAndAtomics; m_device_features.textureCompressionBC = available_features.textureCompressionBC; + m_device_features.samplerAnisotropy = available_features.samplerAnisotropy; return true; } @@ -494,6 +509,8 @@ namespace Vulkan // Find graphics and present queues. m_graphics_queue_family_index = queue_family_count; m_present_queue_family_index = queue_family_count; + m_spin_queue_family_index = queue_family_count; + u32 spin_queue_index = 0; for (uint32_t i = 0; i < queue_family_count; i++) { VkBool32 graphics_supported = queue_family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT; @@ -529,12 +546,29 @@ namespace Vulkan } } } + for (uint32_t i = 0; i < queue_family_count; i++) + { + // Pick a queue for spinning + if (!(queue_family_properties[i].queueFlags & VK_QUEUE_COMPUTE_BIT)) + continue; // We need compute + if (queue_family_properties[i].timestampValidBits == 0) + continue; // We need timing + const bool queue_is_used = i == m_graphics_queue_family_index || i == m_present_queue_family_index; + if (queue_is_used && m_spin_queue_family_index != queue_family_count) + continue; // Found a non-graphics queue to use + spin_queue_index = 0; + m_spin_queue_family_index = i; + if (queue_is_used && queue_family_properties[i].queueCount > 1) + spin_queue_index = 1; + if (!(queue_family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)) + break; // Async compute queue, definitely pick this one + } if (m_graphics_queue_family_index == queue_family_count) { Console.Error("Vulkan: Failed to find an acceptable graphics queue."); return false; } - if (surface && m_present_queue_family_index == queue_family_count) + if (surface != VK_NULL_HANDLE && m_present_queue_family_index == queue_family_count) { Console.Error("Vulkan: Failed to find an acceptable present queue."); return false; @@ -544,9 +578,11 @@ namespace Vulkan device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; device_info.pNext = nullptr; device_info.flags = 0; + device_info.queueCreateInfoCount = 0; - static constexpr float queue_priorities[] = {1.0f}; - VkDeviceQueueCreateInfo graphics_queue_info = {}; + static constexpr float queue_priorities[] = {1.0f, 0.0f}; // Low priority for the spin queue + std::array queue_infos; + VkDeviceQueueCreateInfo& graphics_queue_info = queue_infos[device_info.queueCreateInfoCount++]; graphics_queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; graphics_queue_info.pNext = nullptr; graphics_queue_info.flags = 0; @@ -554,24 +590,38 @@ namespace Vulkan graphics_queue_info.queueCount = 1; graphics_queue_info.pQueuePriorities = queue_priorities; - VkDeviceQueueCreateInfo present_queue_info = {}; - present_queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - present_queue_info.pNext = nullptr; - present_queue_info.flags = 0; - present_queue_info.queueFamilyIndex = m_present_queue_family_index; - present_queue_info.queueCount = 1; - present_queue_info.pQueuePriorities = queue_priorities; - - std::array queue_infos = {{ - graphics_queue_info, - present_queue_info, - }}; - - device_info.queueCreateInfoCount = 1; - if (m_graphics_queue_family_index != m_present_queue_family_index) + if (surface != VK_NULL_HANDLE && m_graphics_queue_family_index != m_present_queue_family_index) { - device_info.queueCreateInfoCount = 2; + VkDeviceQueueCreateInfo& present_queue_info = queue_infos[device_info.queueCreateInfoCount++]; + present_queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + present_queue_info.pNext = nullptr; + present_queue_info.flags = 0; + present_queue_info.queueFamilyIndex = m_present_queue_family_index; + present_queue_info.queueCount = 1; + present_queue_info.pQueuePriorities = queue_priorities; } + + if (m_spin_queue_family_index == m_graphics_queue_family_index) + { + if (spin_queue_index != 0) + graphics_queue_info.queueCount = 2; + } + else if (m_spin_queue_family_index == m_present_queue_family_index) + { + if (spin_queue_index != 0) + queue_infos[1].queueCount = 2; // present queue + } + else + { + VkDeviceQueueCreateInfo& spin_queue_info = queue_infos[device_info.queueCreateInfoCount++]; + spin_queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + spin_queue_info.pNext = nullptr; + spin_queue_info.flags = 0; + spin_queue_info.queueFamilyIndex = m_spin_queue_family_index; + spin_queue_info.queueCount = 1; + spin_queue_info.pQueuePriorities = queue_priorities + 1; + } + device_info.pQueueCreateInfos = queue_infos.data(); ExtensionList enabled_extensions; @@ -633,10 +683,14 @@ namespace Vulkan { vkGetDeviceQueue(m_device, m_present_queue_family_index, 0, &m_present_queue); } + m_spinning_supported = m_spin_queue_family_index != queue_family_count && + queue_family_properties[m_graphics_queue_family_index].timestampValidBits > 0 && + m_device_properties.limits.timestampPeriod > 0; + m_spin_queue_is_graphics_queue = m_spin_queue_family_index == m_graphics_queue_family_index && spin_queue_index == 0; m_gpu_timing_supported = (m_device_properties.limits.timestampComputeAndGraphics != 0 && - queue_family_properties[m_graphics_queue_family_index].timestampValidBits > 0 && - m_device_properties.limits.timestampPeriod > 0); + queue_family_properties[m_graphics_queue_family_index].timestampValidBits > 0 && + m_device_properties.limits.timestampPeriod > 0); DevCon.WriteLn("GPU timing is %s (TS=%u TS valid bits=%u, TS period=%f)", m_gpu_timing_supported ? "supported" : "not supported", static_cast(m_device_properties.limits.timestampComputeAndGraphics), @@ -644,6 +698,23 @@ namespace Vulkan m_device_properties.limits.timestampPeriod); ProcessDeviceExtensions(); + + if (m_spinning_supported) + { + vkGetDeviceQueue(m_device, m_spin_queue_family_index, spin_queue_index, &m_spin_queue); + + m_spin_timestamp_scale = m_device_properties.limits.timestampPeriod; + if (m_optional_extensions.vk_ext_calibrated_timestamps) + { +#ifdef _WIN32 + LARGE_INTEGER Freq; + QueryPerformanceFrequency(&Freq); + m_queryperfcounter_to_ns = 1000000000.0 / static_cast < double > (Freq.QuadPart); +#endif + CalibrateSpinTimestamp(); + } + } + return true; } @@ -682,8 +753,44 @@ namespace Vulkan // query vkGetPhysicalDeviceProperties2(m_physical_device, &properties2); + // VK_EXT_calibrated_timestamps checking + if (m_optional_extensions.vk_ext_calibrated_timestamps) + { + u32 count = 0; + vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(m_physical_device, &count, nullptr); + std::unique_ptr time_domains = std::make_unique(count); + vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(m_physical_device, &count, time_domains.get()); + const VkTimeDomainEXT* begin = &time_domains[0]; + const VkTimeDomainEXT* end = &time_domains[count]; + if (std::find(begin, end, VK_TIME_DOMAIN_DEVICE_EXT) == end) + m_optional_extensions.vk_ext_calibrated_timestamps = false; + VkTimeDomainEXT preferred_types[] = { +#ifdef _WIN32 + VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT, +#else +#ifdef CLOCK_MONOTONIC_RAW + VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT, +#endif + VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT, +#endif + }; + m_calibrated_timestamp_type = VK_TIME_DOMAIN_DEVICE_EXT; + for (VkTimeDomainEXT type : preferred_types) + { + if (std::find(begin, end, type) != end) + { + m_calibrated_timestamp_type = type; + break; + } + } + if (m_calibrated_timestamp_type == VK_TIME_DOMAIN_DEVICE_EXT) + m_optional_extensions.vk_ext_calibrated_timestamps = false; + } + Console.WriteLn("VK_EXT_provoking_vertex is %s", m_optional_extensions.vk_ext_provoking_vertex ? "supported" : "NOT supported"); + Console.WriteLn("VK_EXT_calibrated_timestamps is %s", + m_optional_extensions.vk_ext_calibrated_timestamps ? "supported" : "NOT supported"); Console.WriteLn("VK_ARM_rasterization_order_attachment_access is %s", m_optional_extensions.vk_arm_rasterization_order_attachment_access ? "supported" : "NOT supported"); } @@ -768,6 +875,7 @@ namespace Vulkan VkDescriptorPoolSize pool_sizes[] = { {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, MAX_COMBINED_IMAGE_SAMPLER_DESCRIPTORS_PER_FRAME}, {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, MAX_SAMPLED_IMAGE_DESCRIPTORS_PER_FRAME}, + {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, MAX_STORAGE_IMAGE_DESCRIPTORS_PER_FRAME}, {VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, MAX_INPUT_ATTACHMENT_IMAGE_DESCRIPTORS_PER_FRAME}, }; @@ -828,6 +936,7 @@ namespace Vulkan VkDescriptorPoolSize pool_sizes[] = { {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1024}, {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1024}, + {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1}, }; VkDescriptorPoolCreateInfo pool_create_info = {VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, nullptr, @@ -846,7 +955,7 @@ namespace Vulkan if (m_gpu_timing_supported) { const VkQueryPoolCreateInfo query_create_info = {VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, nullptr, - 0, VK_QUERY_TYPE_TIMESTAMP, NUM_COMMAND_BUFFERS * 2, 0}; + 0, VK_QUERY_TYPE_TIMESTAMP, NUM_COMMAND_BUFFERS * 4, 0}; res = vkCreateQueryPool(m_device, &query_create_info, nullptr, &m_timestamp_query_pool); if (res != VK_SUCCESS) { @@ -972,6 +1081,28 @@ namespace Vulkan return (enabled == m_gpu_timing_enabled); } + void Context::ScanForCommandBufferCompletion() + { + for (u32 check_index = (m_current_frame + 1) % NUM_COMMAND_BUFFERS; check_index != m_current_frame; check_index = (check_index + 1) % NUM_COMMAND_BUFFERS) + { + FrameResources& resources = m_frame_resources[check_index]; + if (resources.fence_counter <= m_completed_fence_counter) + continue; // Already completed + if (vkGetFenceStatus(m_device, resources.fence) != VK_SUCCESS) + break; // Fence not signaled, later fences won't be either + CommandBufferCompleted(check_index); + m_completed_fence_counter = resources.fence_counter; + } + for (SpinResources& resources : m_spin_resources) + { + if (!resources.in_progress) + continue; + if (vkGetFenceStatus(m_device, resources.fence) != VK_SUCCESS) + continue; + SpinCommandCompleted(&resources - &m_spin_resources[0]); + } + } + void Context::WaitForCommandBufferCompletion(u32 index) { // Wait for this command buffer to be completed. @@ -990,11 +1121,7 @@ namespace Vulkan break; if (resources.fence_counter > m_completed_fence_counter) - { - for (auto& it : resources.cleanup_resources) - it(); - resources.cleanup_resources.clear(); - } + CommandBufferCompleted(cleanup_index); cleanup_index = (cleanup_index + 1) % NUM_COMMAND_BUFFERS; } @@ -1020,7 +1147,8 @@ namespace Vulkan } } - if (m_gpu_timing_enabled && resources.timestamp_written) + bool wants_timestamp = m_gpu_timing_enabled || m_spin_timer; + if (wants_timestamp && resources.timestamp_written) { vkCmdWriteTimestamp(m_current_command_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, m_timestamp_query_pool, m_current_frame * 2 + 1); } @@ -1035,12 +1163,48 @@ namespace Vulkan // This command buffer now has commands, so can't be re-used without waiting. resources.needs_fence_wait = true; + u32 spin_cycles = 0; + const bool spin_enabled = m_spin_timer; + if (spin_enabled) + { + ScanForCommandBufferCompletion(); + auto draw = m_spin_manager.DrawSubmitted(m_command_buffer_render_passes); + u32 constant_offset = 400000 * m_spin_manager.SpinsPerUnitTime(); // 400µs, just to be safe since going over gets really bad + if (m_optional_extensions.vk_ext_calibrated_timestamps) + constant_offset /= 2; // Safety factor isn't as important here, going over just hurts this one submission a bit + u32 minimum_spin = 200000 * m_spin_manager.SpinsPerUnitTime(); + u32 maximum_spin = std::max(1024, 16000000 * m_spin_manager.SpinsPerUnitTime()); // 16ms + if (draw.recommended_spin > minimum_spin + constant_offset) + spin_cycles = std::min(draw.recommended_spin - constant_offset, maximum_spin); + resources.spin_id = draw.id; + } + else + { + resources.spin_id = -1; + } + m_command_buffer_render_passes = 0; + + if (present_swap_chain != VK_NULL_HANDLE && m_spinning_supported) + { + m_spin_manager.NextFrame(); + if (m_spin_timer) + m_spin_timer--; + // Calibrate a max of once per frame + m_wants_new_timestamp_calibration = m_optional_extensions.vk_ext_calibrated_timestamps; + } + + if (spin_cycles != 0) + WaitForSpinCompletion(m_current_frame); + std::unique_lock lock(m_present_mutex); WaitForPresentComplete(lock); + if (spin_enabled && m_optional_extensions.vk_ext_calibrated_timestamps) + resources.submit_timestamp = GetCPUTimestamp(); + if (!submit_on_thread || !m_present_thread.joinable()) { - DoSubmitCommandBuffer(m_current_frame, wait_semaphore, signal_semaphore); + DoSubmitCommandBuffer(m_current_frame, wait_semaphore, signal_semaphore, spin_cycles); if (present_swap_chain != VK_NULL_HANDLE) DoPresent(signal_semaphore, present_swap_chain, present_image_index); return; @@ -1051,30 +1215,45 @@ namespace Vulkan m_queued_present.present_image_index = present_image_index; m_queued_present.wait_semaphore = wait_semaphore; m_queued_present.signal_semaphore = signal_semaphore; + m_queued_present.spin_cycles = spin_cycles; m_present_done.store(false); m_present_queued_cv.notify_one(); } - void Context::DoSubmitCommandBuffer(u32 index, VkSemaphore wait_semaphore, VkSemaphore signal_semaphore) + void Context::DoSubmitCommandBuffer(u32 index, VkSemaphore wait_semaphore, VkSemaphore signal_semaphore, u32 spin_cycles) { FrameResources& resources = m_frame_resources[index]; uint32_t wait_bits = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - VkSubmitInfo submit_info = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, &wait_bits, - resources.init_buffer_used ? 2u : 1u, - resources.init_buffer_used ? resources.command_buffers.data() : &resources.command_buffers[1], 0, nullptr}; + VkSemaphore semas[2]; + VkSubmitInfo submit_info = { VK_STRUCTURE_TYPE_SUBMIT_INFO }; + submit_info.commandBufferCount = resources.init_buffer_used ? 2u : 1u; + submit_info.pCommandBuffers = resources.init_buffer_used ? resources.command_buffers.data() : &resources.command_buffers[1]; if (wait_semaphore != VK_NULL_HANDLE) { submit_info.pWaitSemaphores = &wait_semaphore; submit_info.waitSemaphoreCount = 1; + submit_info.pWaitDstStageMask = &wait_bits; } - if (signal_semaphore != VK_NULL_HANDLE) + if (signal_semaphore != VK_NULL_HANDLE && spin_cycles != 0) + { + semas[0] = signal_semaphore; + semas[1] = m_spin_resources[index].semaphore; + submit_info.signalSemaphoreCount = 2; + submit_info.pSignalSemaphores = semas; + } + else if (signal_semaphore != VK_NULL_HANDLE) { submit_info.signalSemaphoreCount = 1; submit_info.pSignalSemaphores = &signal_semaphore; } + else if (spin_cycles != 0) + { + submit_info.signalSemaphoreCount = 1; + submit_info.pSignalSemaphores = &m_spin_resources[index].semaphore; + } VkResult res = vkQueueSubmit(m_graphics_queue, 1, &submit_info, resources.fence); if (res != VK_SUCCESS) @@ -1082,6 +1261,9 @@ namespace Vulkan LOG_VULKAN_ERROR(res, "vkQueueSubmit failed: "); pxFailRel("Failed to submit command buffer."); } + + if (spin_cycles != 0) + SubmitSpinCommand(index, spin_cycles); } void Context::DoPresent(VkSemaphore wait_semaphore, VkSwapchainKHR present_swap_chain, uint32_t present_image_index) @@ -1130,7 +1312,7 @@ namespace Vulkan continue; DoSubmitCommandBuffer(m_queued_present.command_buffer_index, m_queued_present.wait_semaphore, - m_queued_present.signal_semaphore); + m_queued_present.signal_semaphore, m_queued_present.spin_cycles); DoPresent(m_queued_present.signal_semaphore, m_queued_present.present_swap_chain, m_queued_present.present_image_index); m_present_done.store(true); @@ -1160,6 +1342,51 @@ namespace Vulkan m_present_thread.join(); } + void Context::CommandBufferCompleted(u32 index) + { + FrameResources& resources = m_frame_resources[index]; + + for (auto& it : resources.cleanup_resources) + it(); + resources.cleanup_resources.clear(); + + bool wants_timestamps = m_gpu_timing_enabled || resources.spin_id >= 0; + + if (wants_timestamps && resources.timestamp_written) + { + std::array timestamps; + VkResult res = vkGetQueryPoolResults(m_device, m_timestamp_query_pool, index * 2, static_cast(timestamps.size()), + sizeof(u64) * timestamps.size(), timestamps.data(), sizeof(u64), VK_QUERY_RESULT_64_BIT); + if (res == VK_SUCCESS) + { + // if we didn't write the timestamp at the start of the cmdbuffer (just enabled timing), the first TS will be zero + if (timestamps[0] > 0 && m_gpu_timing_enabled) + { + const double ns_diff = (timestamps[1] - timestamps[0]) * static_cast(m_device_properties.limits.timestampPeriod); + m_accumulated_gpu_time += ns_diff / 1000000.0; + } + if (resources.spin_id >= 0) + { + if (m_optional_extensions.vk_ext_calibrated_timestamps && timestamps[1] > 0) + { + u64 end = timestamps[1] * m_spin_timestamp_scale + m_spin_timestamp_offset; + m_spin_manager.DrawCompleted(resources.spin_id, resources.submit_timestamp, end); + } + else if (!m_optional_extensions.vk_ext_calibrated_timestamps && timestamps[0] > 0) + { + u64 begin = timestamps[0] * m_spin_timestamp_scale; + u64 end = timestamps[1] * m_spin_timestamp_scale; + m_spin_manager.DrawCompleted(resources.spin_id, begin, end); + } + } + } + else + { + LOG_VULKAN_ERROR(res, "vkGetQueryPoolResults failed: "); + } + } + } + void Context::MoveToNextCommandBuffer() { ActivateCommandBuffer((m_current_frame + 1) % NUM_COMMAND_BUFFERS); } void Context::ActivateCommandBuffer(u32 index) @@ -1195,35 +1422,16 @@ namespace Vulkan if (res != VK_SUCCESS) LOG_VULKAN_ERROR(res, "vkResetDescriptorPool failed: "); - if (m_gpu_timing_enabled) + bool wants_timestamp = m_gpu_timing_enabled || m_spin_timer; + if (wants_timestamp) { - if (resources.timestamp_written) - { - std::array timestamps; - res = vkGetQueryPoolResults(m_device, m_timestamp_query_pool, index * 2, static_cast(timestamps.size()), - sizeof(u64) * timestamps.size(), timestamps.data(), sizeof(u64), VK_QUERY_RESULT_64_BIT); - if (res == VK_SUCCESS) - { - // if we didn't write the timestamp at the start of the cmdbuffer (just enabled timing), the first TS will be zero - if (timestamps[0] > 0) - { - const double ns_diff = (timestamps[1] - timestamps[0]) * static_cast(m_device_properties.limits.timestampPeriod); - m_accumulated_gpu_time += ns_diff / 1000000.0; - } - } - else - { - LOG_VULKAN_ERROR(res, "vkGetQueryPoolResults failed: "); - } - } - vkCmdResetQueryPool(resources.command_buffers[1], m_timestamp_query_pool, index * 2, 2); vkCmdWriteTimestamp(resources.command_buffers[1], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, m_timestamp_query_pool, index * 2); } resources.fence_counter = m_next_fence_counter++; resources.init_buffer_used = false; - resources.timestamp_written = m_gpu_timing_enabled; + resources.timestamp_written = wants_timestamp; m_current_frame = index; m_current_command_buffer = resources.command_buffers[1]; @@ -1232,15 +1440,25 @@ namespace Vulkan vmaSetCurrentFrameIndex(m_allocator, static_cast(m_next_fence_counter)); } - void Context::ExecuteCommandBuffer(bool wait_for_completion) + void Context::ExecuteCommandBuffer(WaitType wait_for_completion) { // If we're waiting for completion, don't bother waking the worker thread. const u32 current_frame = m_current_frame; SubmitCommandBuffer(); MoveToNextCommandBuffer(); - if (wait_for_completion) + if (wait_for_completion != WaitType::None) + { + // Calibrate while we wait + if (m_wants_new_timestamp_calibration) + CalibrateSpinTimestamp(); + if (wait_for_completion == WaitType::Spin) + { + while (vkGetFenceStatus(m_device, m_frame_resources[current_frame].fence) == VK_NOT_READY) + ShortSpin(); + } WaitForCommandBufferCompletion(current_frame); + } } bool Context::CheckLastPresentFail() @@ -1443,8 +1661,7 @@ namespace Vulkan } const VkSubpassDescriptionFlags subpass_flags = - (key.color_feedback_loop && g_vulkan_context->GetOptionalExtensions().vk_arm_rasterization_order_attachment_access) - ? VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_ARM : 0; + (key.color_feedback_loop && g_vulkan_context->GetOptionalExtensions().vk_arm_rasterization_order_attachment_access) ? VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_ARM : 0; const VkSubpassDescription subpass = {subpass_flags, VK_PIPELINE_BIND_POINT_GRAPHICS, input_reference_ptr ? 1u : 0u, input_reference_ptr ? input_reference_ptr : nullptr, color_reference_ptr ? 1u : 0u, color_reference_ptr ? color_reference_ptr : nullptr, nullptr, depth_reference_ptr, 0, nullptr}; @@ -1471,4 +1688,350 @@ namespace Vulkan m_render_pass_cache.clear(); } + + static constexpr std::string_view SPIN_SHADER = R"( +#version 460 core + +layout(std430, set=0, binding=0) buffer SpinBuffer { uint spin[]; }; +layout(push_constant) uniform constants { uint cycles; }; +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; + +void main() +{ + uint value = spin[0]; + // The compiler doesn't know, but spin[0] == 0, so this loop won't actually go anywhere + for (uint i = 0; i < cycles; i++) + value = spin[value]; + // Store the result back to the buffer so the compiler can't optimize it away + spin[0] = value; +} +)"; + + bool Context::InitSpinResources() + { + if (!m_spinning_supported) + return true; + auto spirv = ShaderCompiler::CompileComputeShader(SPIN_SHADER); + if (!spirv.has_value()) + return false; + + VkResult res; +#define CHECKED_CREATE(create_fn, create_struct, output_struct) \ + do { \ + if ((res = create_fn(m_device, create_struct, nullptr, output_struct)) != VK_SUCCESS) \ + { \ + LOG_VULKAN_ERROR(res, #create_fn " failed: "); \ + return false; \ + } \ + } while (0) + + VkDescriptorSetLayoutBinding set_layout_binding = {}; + set_layout_binding.binding = 0; + set_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + set_layout_binding.descriptorCount = 1; + set_layout_binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + VkDescriptorSetLayoutCreateInfo desc_set_layout_create = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO }; + desc_set_layout_create.bindingCount = 1; + desc_set_layout_create.pBindings = &set_layout_binding; + CHECKED_CREATE(vkCreateDescriptorSetLayout, &desc_set_layout_create, &m_spin_descriptor_set_layout); + + const VkPushConstantRange push_constant_range = { VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(u32) }; + VkPipelineLayoutCreateInfo pl_layout_create = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO }; + pl_layout_create.setLayoutCount = 1; + pl_layout_create.pSetLayouts = &m_spin_descriptor_set_layout; + pl_layout_create.pushConstantRangeCount = 1; + pl_layout_create.pPushConstantRanges = &push_constant_range; + CHECKED_CREATE(vkCreatePipelineLayout, &pl_layout_create, &m_spin_pipeline_layout); + + VkShaderModuleCreateInfo module_create = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO }; + module_create.codeSize = spirv->size() * sizeof(ShaderCompiler::SPIRVCodeType); + module_create.pCode = spirv->data(); + VkShaderModule shader_module; + CHECKED_CREATE(vkCreateShaderModule, &module_create, &shader_module); + Util::SetObjectName(m_device, shader_module, "Spin Shader"); + + VkComputePipelineCreateInfo pl_create = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO }; + pl_create.layout = m_spin_pipeline_layout; + pl_create.stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + pl_create.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT; + pl_create.stage.pName = "main"; + pl_create.stage.module = shader_module; + res = vkCreateComputePipelines(m_device, VK_NULL_HANDLE, 1, &pl_create, nullptr, &m_spin_pipeline); + vkDestroyShaderModule(m_device, shader_module, nullptr); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkCreateComputePipelines failed: "); + return false; + } + Util::SetObjectName(m_device, m_spin_pipeline, "Spin Pipeline"); + + VmaAllocationCreateInfo buf_vma_create = {}; + buf_vma_create.usage = VMA_MEMORY_USAGE_GPU_ONLY; + VkBufferCreateInfo buf_create = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO }; + buf_create.size = 4; + buf_create.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; + if ((res = vmaCreateBuffer(m_allocator, &buf_create, &buf_vma_create, &m_spin_buffer, &m_spin_buffer_allocation, nullptr)) != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vmaCreateBuffer failed: "); + return false; + } + Util::SetObjectName(m_device, m_spin_buffer, "Spin Buffer"); + + VkDescriptorSetAllocateInfo desc_set_allocate = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO }; + desc_set_allocate.descriptorPool = m_global_descriptor_pool; + desc_set_allocate.descriptorSetCount = 1; + desc_set_allocate.pSetLayouts = &m_spin_descriptor_set_layout; + if ((res = vkAllocateDescriptorSets(m_device, &desc_set_allocate, &m_spin_descriptor_set)) != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkAllocateDescriptorSets failed: "); + return false; + } + const VkDescriptorBufferInfo desc_buffer_info = { m_spin_buffer, 0, VK_WHOLE_SIZE }; + VkWriteDescriptorSet desc_set_write = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET }; + desc_set_write.dstSet = m_spin_descriptor_set; + desc_set_write.dstBinding = 0; + desc_set_write.descriptorCount = 1; + desc_set_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + desc_set_write.pBufferInfo = &desc_buffer_info; + vkUpdateDescriptorSets(m_device, 1, &desc_set_write, 0, nullptr); + + for (SpinResources& resources : m_spin_resources) + { + u32 index = &resources - &m_spin_resources[0]; + VkCommandPoolCreateInfo pool_info = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO }; + pool_info.queueFamilyIndex = m_spin_queue_family_index; + CHECKED_CREATE(vkCreateCommandPool, &pool_info, &resources.command_pool); + Vulkan::Util::SetObjectName(m_device, resources.command_pool, "Spin Command Pool %u", index); + + VkCommandBufferAllocateInfo buffer_info = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO }; + buffer_info.commandPool = resources.command_pool; + buffer_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + buffer_info.commandBufferCount = 1; + res = vkAllocateCommandBuffers(m_device, &buffer_info, &resources.command_buffer); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkAllocateCommandBuffers failed: "); + return false; + } + Vulkan::Util::SetObjectName(m_device, resources.command_buffer, "Spin Command Buffer %u", index); + + VkFenceCreateInfo fence_info = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO }; + fence_info.flags = VK_FENCE_CREATE_SIGNALED_BIT; + CHECKED_CREATE(vkCreateFence, &fence_info, &resources.fence); + Vulkan::Util::SetObjectName(m_device, resources.fence, "Spin Fence %u", index); + + if (!m_spin_queue_is_graphics_queue) + { + VkSemaphoreCreateInfo sem_info = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO }; + CHECKED_CREATE(vkCreateSemaphore, &sem_info, &resources.semaphore); + Vulkan::Util::SetObjectName(m_device, resources.semaphore, "Draw to Spin Semaphore %u", index); + } + } + +#undef CHECKED_CREATE + return true; + } + + void Context::DestroySpinResources() + { +#define CHECKED_DESTROY(destructor, obj) \ + do { \ + if (obj != VK_NULL_HANDLE) \ + { \ + destructor(m_device, obj, nullptr); \ + obj = VK_NULL_HANDLE; \ + } \ + } while (0) + + if (m_spin_buffer) + { + vmaDestroyBuffer(m_allocator, m_spin_buffer, m_spin_buffer_allocation); + m_spin_buffer = VK_NULL_HANDLE; + m_spin_buffer_allocation = VK_NULL_HANDLE; + } + CHECKED_DESTROY(vkDestroyPipeline, m_spin_pipeline); + CHECKED_DESTROY(vkDestroyPipelineLayout, m_spin_pipeline_layout); + CHECKED_DESTROY(vkDestroyDescriptorSetLayout, m_spin_descriptor_set_layout); + if (m_spin_descriptor_set != VK_NULL_HANDLE) + { + vkFreeDescriptorSets(m_device, m_global_descriptor_pool, 1, &m_spin_descriptor_set); + m_spin_descriptor_set = VK_NULL_HANDLE; + } + for (SpinResources& resources : m_spin_resources) + { + CHECKED_DESTROY(vkDestroySemaphore, resources.semaphore); + CHECKED_DESTROY(vkDestroyFence, resources.fence); + if (resources.command_buffer != VK_NULL_HANDLE) + { + vkFreeCommandBuffers(m_device, resources.command_pool, 1, &resources.command_buffer); + resources.command_buffer = VK_NULL_HANDLE; + } + CHECKED_DESTROY(vkDestroyCommandPool, resources.command_pool); + } +#undef CHECKED_DESTROY + } + + void Context::WaitForSpinCompletion(u32 index) + { + SpinResources& resources = m_spin_resources[index]; + if (!resources.in_progress) + return; + VkResult res = vkWaitForFences(m_device, 1, &resources.fence, VK_TRUE, UINT64_MAX); + if (res != VK_SUCCESS) + LOG_VULKAN_ERROR(res, "vkWaitForFences failed: "); + SpinCommandCompleted(index); + } + + void Context::SpinCommandCompleted(u32 index) + { + SpinResources& resources = m_spin_resources[index]; + resources.in_progress = false; + const u32 timestamp_base = (index + NUM_COMMAND_BUFFERS) * 2; + std::array timestamps; + VkResult res = vkGetQueryPoolResults(m_device, m_timestamp_query_pool, timestamp_base, static_cast(timestamps.size()), + sizeof(timestamps), timestamps.data(), sizeof(u64), VK_QUERY_RESULT_64_BIT); + if (res == VK_SUCCESS) + { + u64 begin, end; + if (m_optional_extensions.vk_ext_calibrated_timestamps) + { + begin = timestamps[0] * m_spin_timestamp_scale + m_spin_timestamp_offset; + end = timestamps[1] * m_spin_timestamp_scale + m_spin_timestamp_offset; + } + else + { + begin = timestamps[0] * m_spin_timestamp_scale; + end = timestamps[1] * m_spin_timestamp_scale; + } + m_spin_manager.SpinCompleted(resources.cycles, begin, end); + } + else + { + LOG_VULKAN_ERROR(res, "vkGetQueryPoolResults failed: "); + } + } + + void Context::SubmitSpinCommand(u32 index, u32 cycles) + { + SpinResources& resources = m_spin_resources[index]; + VkResult res; + + // Reset fence to unsignaled before starting. + if ((res = vkResetFences(m_device, 1, &resources.fence)) != VK_SUCCESS) + LOG_VULKAN_ERROR(res, "vkResetFences failed: "); + + // Reset command pools to beginning since we can re-use the memory now + if ((res = vkResetCommandPool(m_device, resources.command_pool, 0)) != VK_SUCCESS) + LOG_VULKAN_ERROR(res, "vkResetCommandPool failed: "); + + // Enable commands to be recorded to the two buffers again. + VkCommandBufferBeginInfo begin_info = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; + begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + if ((res = vkBeginCommandBuffer(resources.command_buffer, &begin_info)) != VK_SUCCESS) + LOG_VULKAN_ERROR(res, "vkBeginCommandBuffer failed: "); + + if (!m_spin_buffer_initialized) + { + m_spin_buffer_initialized = true; + vkCmdFillBuffer(resources.command_buffer, m_spin_buffer, 0, VK_WHOLE_SIZE, 0); + VkBufferMemoryBarrier barrier = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER }; + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + barrier.srcQueueFamilyIndex = m_spin_queue_family_index; + barrier.dstQueueFamilyIndex = m_spin_queue_family_index; + barrier.buffer = m_spin_buffer; + barrier.offset = 0; + barrier.size = VK_WHOLE_SIZE; + vkCmdPipelineBarrier(resources.command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 1, &barrier, 0, nullptr); + } + + if (m_spin_queue_is_graphics_queue) + vkCmdPipelineBarrier(resources.command_buffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 0, nullptr); + + const u32 timestamp_base = (index + NUM_COMMAND_BUFFERS) * 2; + vkCmdResetQueryPool(resources.command_buffer, m_timestamp_query_pool, timestamp_base, 2); + vkCmdWriteTimestamp(resources.command_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, m_timestamp_query_pool, timestamp_base); + vkCmdPushConstants(resources.command_buffer, m_spin_pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(u32), &cycles); + vkCmdBindPipeline(resources.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_spin_pipeline); + vkCmdBindDescriptorSets(resources.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_spin_pipeline_layout, 0, 1, &m_spin_descriptor_set, 0, nullptr); + vkCmdDispatch(resources.command_buffer, 1, 1, 1); + vkCmdWriteTimestamp(resources.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, m_timestamp_query_pool, timestamp_base + 1); + + if ((res = vkEndCommandBuffer(resources.command_buffer)) != VK_SUCCESS) + LOG_VULKAN_ERROR(res, "vkEndCommandBuffer failed: "); + + VkSubmitInfo submit_info = { VK_STRUCTURE_TYPE_SUBMIT_INFO }; + submit_info.commandBufferCount = 1; + submit_info.pCommandBuffers = &resources.command_buffer; + VkPipelineStageFlags sema_waits[] = { VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT }; + if (!m_spin_queue_is_graphics_queue) + { + submit_info.waitSemaphoreCount = 1; + submit_info.pWaitSemaphores = &resources.semaphore; + submit_info.pWaitDstStageMask = sema_waits; + } + vkQueueSubmit(m_spin_queue, 1, &submit_info, resources.fence); + resources.in_progress = true; + resources.cycles = cycles; + } + + void Context::NotifyOfReadback() + { + if (!m_spinning_supported) + return; + m_spin_timer = 30; + m_spin_manager.ReadbackRequested(); + } + + void Context::CalibrateSpinTimestamp() + { + if (!m_optional_extensions.vk_ext_calibrated_timestamps) + return; + VkCalibratedTimestampInfoEXT infos[2] = { + { VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT, nullptr, VK_TIME_DOMAIN_DEVICE_EXT }, + { VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT, nullptr, m_calibrated_timestamp_type }, + }; + u64 timestamps[2]; + u64 maxDeviation; + constexpr u64 MAX_MAX_DEVIATION = 100000; // 100µs + for (int i = 0; i < 4; i++) // 4 tries to get under MAX_MAX_DEVIATION + { + VkResult res = vkGetCalibratedTimestampsEXT(m_device, std::size(infos), infos, timestamps, &maxDeviation); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkGetCalibratedTimestampsEXT failed: "); + return; + } + if (maxDeviation < MAX_MAX_DEVIATION) + break; + } + if (maxDeviation >= MAX_MAX_DEVIATION) + Console.Warning("vkGetCalibratedTimestampsEXT returned high max deviation of %lluµs", maxDeviation / 1000); + const double gpu_time = timestamps[0] * m_spin_timestamp_scale; +#ifdef _WIN32 + const double cpu_time = timestamps[1] * m_queryperfcounter_to_ns; +#else + const double cpu_time = timestamps[1]; +#endif + m_spin_timestamp_offset = cpu_time - gpu_time; + } + + u64 Context::GetCPUTimestamp() + { +#ifdef _WIN32 + LARGE_INTEGER value = {}; + QueryPerformanceCounter(&value); + return static_cast(static_cast(value.QuadPart) * m_queryperfcounter_to_ns); +#else +#ifdef CLOCK_MONOTONIC_RAW + const bool use_raw = m_calibrated_timestamp_type == VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT; + const clockid_t clock = use_raw ? CLOCK_MONOTONIC_RAW : CLOCK_MONOTONIC; +#else + const clockid_t clock = CLOCK_MONOTONIC; +#endif + timespec ts = {}; + clock_gettime(clock, &ts); + return static_cast(ts.tv_sec) * 1000000000 + ts.tv_nsec; +#endif + } } // namespace Vulkan diff --git a/common/Vulkan/Context.h b/common/Vulkan/Context.h index 0483e89ab0..0bbd0c5552 100644 --- a/common/Vulkan/Context.h +++ b/common/Vulkan/Context.h @@ -17,6 +17,7 @@ #include "common/Pcsx2Defs.h" +#include "common/ReadbackSpinManager.h" #include "common/Vulkan/Loader.h" #include "common/Vulkan/StreamBuffer.h" @@ -50,8 +51,10 @@ namespace Vulkan { bool vk_ext_provoking_vertex : 1; bool vk_ext_memory_budget : 1; + bool vk_ext_calibrated_timestamps : 1; bool vk_khr_driver_properties : 1; bool vk_arm_rasterization_order_attachment_access : 1; + bool vk_khr_fragment_shader_barycentric : 1; }; ~Context(); @@ -195,7 +198,14 @@ namespace Vulkan uint32_t present_image_index = 0xFFFFFFFF, bool submit_on_thread = false); void MoveToNextCommandBuffer(); - void ExecuteCommandBuffer(bool wait_for_completion); + enum class WaitType + { + None, + Sleep, + Spin, + }; + + void ExecuteCommandBuffer(WaitType wait_for_completion); void WaitForPresentComplete(); // Was the last present submitted to the queue a failure? If so, we must recreate our swapchain. @@ -223,6 +233,9 @@ namespace Vulkan float GetAndResetAccumulatedGPUTime(); bool SetEnableGPUTiming(bool enabled); + void CountRenderPass() { m_command_buffer_render_passes++; } + void NotifyOfReadback(); + private: Context(VkInstance instance, VkPhysicalDevice physical_device); @@ -265,16 +278,26 @@ namespace Vulkan VkRenderPass CreateCachedRenderPass(RenderPassCacheKey key); void DestroyRenderPassCache(); + void CommandBufferCompleted(u32 index); void ActivateCommandBuffer(u32 index); + void ScanForCommandBufferCompletion(); void WaitForCommandBufferCompletion(u32 index); - void DoSubmitCommandBuffer(u32 index, VkSemaphore wait_semaphore, VkSemaphore signal_semaphore); + void DoSubmitCommandBuffer(u32 index, VkSemaphore wait_semaphore, VkSemaphore signal_semaphore, u32 spin_cycles); void DoPresent(VkSemaphore wait_semaphore, VkSwapchainKHR present_swap_chain, uint32_t present_image_index); void WaitForPresentComplete(std::unique_lock& lock); void PresentThread(); void StartPresentThread(); void StopPresentThread(); + bool InitSpinResources(); + void DestroySpinResources(); + void WaitForSpinCompletion(u32 index); + void SpinCommandCompleted(u32 index); + void SubmitSpinCommand(u32 index, u32 cycles); + void CalibrateSpinTimestamp(); + u64 GetCPUTimestamp(); + struct FrameResources { // [0] - Init (upload) command buffer, [1] - draw command buffer @@ -283,6 +306,8 @@ namespace Vulkan VkDescriptorPool descriptor_pool = VK_NULL_HANDLE; VkFence fence = VK_NULL_HANDLE; u64 fence_counter = 0; + s32 spin_id = -1; + u32 submit_timestamp = 0; bool init_buffer_used = false; bool needs_fence_wait = false; bool timestamp_written = false; @@ -290,6 +315,16 @@ namespace Vulkan std::vector> cleanup_resources; }; + struct SpinResources + { + VkCommandPool command_pool = VK_NULL_HANDLE; + VkCommandBuffer command_buffer = VK_NULL_HANDLE; + VkSemaphore semaphore = VK_NULL_HANDLE; + VkFence fence = VK_NULL_HANDLE; + u32 cycles = 0; + bool in_progress = false; + }; + VkInstance m_instance = VK_NULL_HANDLE; VkPhysicalDevice m_physical_device = VK_NULL_HANDLE; VkDevice m_device = VK_NULL_HANDLE; @@ -304,10 +339,33 @@ namespace Vulkan u32 m_graphics_queue_family_index = 0; u32 m_present_queue_family_index = 0; + ReadbackSpinManager m_spin_manager; + VkQueue m_spin_queue = VK_NULL_HANDLE; + VkDescriptorSetLayout m_spin_descriptor_set_layout = VK_NULL_HANDLE; + VkPipelineLayout m_spin_pipeline_layout = VK_NULL_HANDLE; + VkPipeline m_spin_pipeline = VK_NULL_HANDLE; + VkBuffer m_spin_buffer = VK_NULL_HANDLE; + VmaAllocation m_spin_buffer_allocation = VK_NULL_HANDLE; + VkDescriptorSet m_spin_descriptor_set = VK_NULL_HANDLE; + std::array m_spin_resources; +#ifdef _WIN32 + double m_queryperfcounter_to_ns = 0; +#endif + double m_spin_timestamp_scale = 0; + double m_spin_timestamp_offset = 0; + u32 m_spin_queue_family_index = 0; + u32 m_command_buffer_render_passes = 0; + u32 m_spin_timer = 0; + bool m_spinning_supported = false; + bool m_spin_queue_is_graphics_queue = false; + bool m_spin_buffer_initialized = false; + VkQueryPool m_timestamp_query_pool = VK_NULL_HANDLE; float m_accumulated_gpu_time = 0.0f; bool m_gpu_timing_enabled = false; bool m_gpu_timing_supported = false; + bool m_wants_new_timestamp_calibration = false; + VkTimeDomainEXT m_calibrated_timestamp_type = VK_TIME_DOMAIN_DEVICE_EXT; std::array m_frame_resources; u64 m_next_fence_counter = 1; @@ -331,6 +389,7 @@ namespace Vulkan VkSwapchainKHR present_swap_chain; u32 command_buffer_index; u32 present_image_index; + u32 spin_cycles; }; QueuedPresent m_queued_present = {}; diff --git a/common/Vulkan/EntryPoints.h b/common/Vulkan/EntryPoints.h index 5bdc665068..0d78f9538d 100644 --- a/common/Vulkan/EntryPoints.h +++ b/common/Vulkan/EntryPoints.h @@ -231,3 +231,7 @@ extern "C" { #define vkAcquireFullScreenExclusiveModeEXT pcsx2_vkAcquireFullScreenExclusiveModeEXT #define vkReleaseFullScreenExclusiveModeEXT pcsx2_vkReleaseFullScreenExclusiveModeEXT #endif + +// VK_EXT_calibrated_timestamps +#define vkGetCalibratedTimestampsEXT pcsx2_vkGetCalibratedTimestampsEXT +#define vkGetPhysicalDeviceCalibrateableTimeDomainsEXT pcsx2_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT diff --git a/common/Vulkan/EntryPoints.inl b/common/Vulkan/EntryPoints.inl index 4e659ae7e9..346316b19a 100644 --- a/common/Vulkan/EntryPoints.inl +++ b/common/Vulkan/EntryPoints.inl @@ -104,6 +104,9 @@ VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceFeatures2, true) VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceProperties2, true) VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceMemoryProperties2, true) +// VK_EXT_calibrated_timestamps +VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceCalibrateableTimeDomainsEXT, false) + #endif // VULKAN_INSTANCE_ENTRY_POINT #ifdef VULKAN_DEVICE_ENTRY_POINT @@ -245,4 +248,7 @@ VULKAN_DEVICE_ENTRY_POINT(vkAcquireFullScreenExclusiveModeEXT, false) VULKAN_DEVICE_ENTRY_POINT(vkReleaseFullScreenExclusiveModeEXT, false) #endif +// VK_EXT_calibrated_timestamps +VULKAN_DEVICE_ENTRY_POINT(vkGetCalibratedTimestampsEXT, false) + #endif // VULKAN_DEVICE_ENTRY_POINT diff --git a/common/Vulkan/Loader.cpp b/common/Vulkan/Loader.cpp index f52d32f9ed..ee03d170ef 100644 --- a/common/Vulkan/Loader.cpp +++ b/common/Vulkan/Loader.cpp @@ -69,11 +69,7 @@ namespace Vulkan return true; } -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) vulkan_module = LoadLibraryA("vulkan-1.dll"); -#else - vulkan_module = NULL; -#endif if (!vulkan_module) { std::fprintf(stderr, "Failed to load vulkan-1.dll\n"); diff --git a/common/Vulkan/Texture.cpp b/common/Vulkan/Texture.cpp index 77623fede8..0ad591778b 100644 --- a/common/Vulkan/Texture.cpp +++ b/common/Vulkan/Texture.cpp @@ -369,14 +369,14 @@ namespace Vulkan } void Texture::UpdateFromBuffer(VkCommandBuffer cmdbuf, u32 level, u32 layer, u32 x, u32 y, u32 width, u32 height, - u32 row_length, VkBuffer buffer, u32 buffer_offset) + u32 buffer_height, u32 row_length, VkBuffer buffer, u32 buffer_offset) { const VkImageLayout old_layout = m_layout; if (old_layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) TransitionSubresourcesToLayout( cmdbuf, level, 1, layer, 1, old_layout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - const VkBufferImageCopy bic = {static_cast(buffer_offset), row_length, height, + const VkBufferImageCopy bic = {static_cast(buffer_offset), row_length, buffer_height, {VK_IMAGE_ASPECT_COLOR_BIT, level, layer, 1u}, {static_cast(x), static_cast(y), 0}, {width, height, 1u}}; diff --git a/common/Vulkan/Texture.h b/common/Vulkan/Texture.h index fa4c480d85..bf4a764ae6 100644 --- a/common/Vulkan/Texture.h +++ b/common/Vulkan/Texture.h @@ -72,7 +72,7 @@ namespace Vulkan VkFramebuffer CreateFramebuffer(VkRenderPass render_pass); void UpdateFromBuffer(VkCommandBuffer cmdbuf, u32 level, u32 layer, u32 x, u32 y, u32 width, u32 height, - u32 row_length, VkBuffer buffer, u32 buffer_offset); + u32 buffer_height, u32 row_length, VkBuffer buffer, u32 buffer_offset); private: u32 m_width = 0; diff --git a/common/WindowInfo.cpp b/common/WindowInfo.cpp index f4ffd16875..0b03ba8a12 100644 --- a/common/WindowInfo.cpp +++ b/common/WindowInfo.cpp @@ -18,7 +18,7 @@ #include "WindowInfo.h" #include "Console.h" -#if defined(_WIN32) && !defined(_UWP) +#if defined(_WIN32) #include "RedtapeWindows.h" #include diff --git a/common/WindowInfo.h b/common/WindowInfo.h index 55136dfa9f..44845b0eed 100644 --- a/common/WindowInfo.h +++ b/common/WindowInfo.h @@ -54,4 +54,7 @@ struct WindowInfo /// Returns the host's refresh rate for the given window, if available. static bool QueryRefreshRateForWindow(const WindowInfo& wi, float* refresh_rate); + + /// Enables or disables the screen saver from starting. + static bool InhibitScreensaver(const WindowInfo& wi, bool inhibit); }; diff --git a/common/Windows/WinHostSys.cpp b/common/Windows/WinHostSys.cpp index 8eb15360f5..1c1771bbb8 100644 --- a/common/Windows/WinHostSys.cpp +++ b/common/Windows/WinHostSys.cpp @@ -15,23 +15,33 @@ #if defined(_WIN32) +#include "common/Align.h" #include "common/RedtapeWindows.h" #include "common/PageFaultSource.h" #include "common/Console.h" #include "common/Exceptions.h" #include "common/StringUtil.h" #include "common/AlignedMalloc.h" +#include "fmt/core.h" + +#include "fmt/format.h" static long DoSysPageFaultExceptionFilter(EXCEPTION_POINTERS* eps) { if (eps->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION) return EXCEPTION_CONTINUE_SEARCH; +#if defined(_M_AMD64) + void* const exception_pc = reinterpret_cast(eps->ContextRecord->Rip); +#else + void* const exception_pc = nullptr; +#endif + // Note: This exception can be accessed by the EE or MTVU thread // Source_PageFault is a global variable with its own state information // so for now we lock this exception code unless someone can fix this better... std::unique_lock lock(PageFault_Mutex); - Source_PageFault->Dispatch(PageFaultInfo((uptr)eps->ExceptionRecord->ExceptionInformation[1])); + Source_PageFault->Dispatch(PageFaultInfo((uptr)exception_pc, (uptr)eps->ExceptionRecord->ExceptionInformation[1])); return Source_PageFault->WasHandled() ? EXCEPTION_CONTINUE_EXECUTION : EXCEPTION_CONTINUE_SEARCH; } @@ -81,64 +91,19 @@ static DWORD ConvertToWinApi(const PageProtectionMode& mode) return winmode; } -void* HostSys::MmapReservePtr(void* base, size_t size) +void* HostSys::Mmap(void* base, size_t size, const PageProtectionMode& mode) { - return VirtualAlloc(base, size, MEM_RESERVE, PAGE_NOACCESS); + if (mode.IsNone()) + return nullptr; + + return VirtualAlloc(base, size, MEM_RESERVE | MEM_COMMIT, ConvertToWinApi(mode)); } -bool HostSys::MmapCommitPtr(void* base, size_t size, const PageProtectionMode& mode) -{ - void* result = VirtualAlloc(base, size, MEM_COMMIT, ConvertToWinApi(mode)); - if (result) - return true; - - const DWORD errcode = GetLastError(); - if (errcode == ERROR_COMMITMENT_MINIMUM) - { - Console.Warning("(MmapCommit) Received windows error %u {Virtual Memory Minimum Too Low}.", ERROR_COMMITMENT_MINIMUM); - Sleep(1000); // Cut windows some time to rework its memory... - } - else if (errcode != ERROR_NOT_ENOUGH_MEMORY && errcode != ERROR_OUTOFMEMORY) - { - pxFailDev(("VirtualAlloc COMMIT failed: " + Exception::WinApiError().GetMsgFromWindows()).c_str()); - return false; - } - - return false; -} - -void HostSys::MmapResetPtr(void* base, size_t size) -{ - VirtualFree(base, size, MEM_DECOMMIT); -} - - -void* HostSys::MmapReserve(uptr base, size_t size) -{ - return MmapReservePtr((void*)base, size); -} - -bool HostSys::MmapCommit(uptr base, size_t size, const PageProtectionMode& mode) -{ - return MmapCommitPtr((void*)base, size, mode); -} - -void HostSys::MmapReset(uptr base, size_t size) -{ - MmapResetPtr((void*)base, size); -} - - -void* HostSys::Mmap(uptr base, size_t size) -{ - return VirtualAlloc((void*)base, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); -} - -void HostSys::Munmap(uptr base, size_t size) +void HostSys::Munmap(void* base, size_t size) { if (!base) return; - //VirtualFree((void*)base, size, MEM_DECOMMIT); + VirtualFree((void*)base, 0, MEM_RELEASE); } @@ -148,14 +113,228 @@ void HostSys::MemProtect(void* baseaddr, size_t size, const PageProtectionMode& DWORD OldProtect; // enjoy my uselessness, yo! if (!VirtualProtect(baseaddr, size, ConvertToWinApi(mode), &OldProtect)) - { - Exception::WinApiError apiError; - - apiError.SetDiagMsg( - StringUtil::StdStringFromFormat("VirtualProtect failed @ 0x%08X -> 0x%08X (mode=%s)", - baseaddr, (uptr)baseaddr + size, mode.ToString().c_str())); - - pxFailDev(apiError.FormatDiagnosticMessage().c_str()); - } + pxFail("VirtualProtect() failed"); } + +std::string HostSys::GetFileMappingName(const char* prefix) +{ + const unsigned pid = GetCurrentProcessId(); + return fmt::format("{}_{}", prefix, pid); +} + +void* HostSys::CreateSharedMemory(const char* name, size_t size) +{ + return static_cast(CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, + static_cast(size >> 32), static_cast(size), StringUtil::UTF8StringToWideString(name).c_str())); +} + +void HostSys::DestroySharedMemory(void* ptr) +{ + CloseHandle(static_cast(ptr)); +} + +void* HostSys::MapSharedMemory(void* handle, size_t offset, void* baseaddr, size_t size, const PageProtectionMode& mode) +{ + void* ret = MapViewOfFileEx(static_cast(handle), FILE_MAP_READ | FILE_MAP_WRITE, + static_cast(offset >> 32), static_cast(offset), size, baseaddr); + if (!ret) + return nullptr; + + const DWORD prot = ConvertToWinApi(mode); + if (prot != PAGE_READWRITE) + { + DWORD old_prot; + if (!VirtualProtect(ret, size, prot, &old_prot)) + pxFail("Failed to protect memory mapping"); + } + return ret; +} + +void HostSys::UnmapSharedMemory(void* baseaddr, size_t size) +{ + if (!UnmapViewOfFile(baseaddr)) + pxFail("Failed to unmap shared memory"); +} + +SharedMemoryMappingArea::SharedMemoryMappingArea(u8* base_ptr, size_t size, size_t num_pages) + : m_base_ptr(base_ptr) + , m_size(size) + , m_num_pages(num_pages) +{ + m_placeholder_ranges.emplace(0, size); +} + +SharedMemoryMappingArea::~SharedMemoryMappingArea() +{ + pxAssertRel(m_num_mappings == 0, "No mappings left"); + + // hopefully this will be okay, and we don't need to coalesce all the placeholders... + if (!VirtualFreeEx(GetCurrentProcess(), m_base_ptr, 0, MEM_RELEASE)) + pxFailRel("Failed to release shared memory area"); +} + +SharedMemoryMappingArea::PlaceholderMap::iterator SharedMemoryMappingArea::FindPlaceholder(size_t offset) +{ + if (m_placeholder_ranges.empty()) + return m_placeholder_ranges.end(); + + // this will give us an iterator equal or after page + auto it = m_placeholder_ranges.lower_bound(offset); + if (it == m_placeholder_ranges.end()) + { + // check the last page + it = (++m_placeholder_ranges.rbegin()).base(); + } + + // it's the one we found? + if (offset >= it->first && offset < it->second) + return it; + + // otherwise try the one before + if (it == m_placeholder_ranges.begin()) + return m_placeholder_ranges.end(); + + --it; + if (offset >= it->first && offset < it->second) + return it; + else + return m_placeholder_ranges.end(); +} + +std::unique_ptr SharedMemoryMappingArea::Create(size_t size) +{ + pxAssertRel(Common::IsAlignedPow2(size, __pagesize), "Size is page aligned"); + + void* alloc = VirtualAlloc2(GetCurrentProcess(), nullptr, size, MEM_RESERVE | MEM_RESERVE_PLACEHOLDER, PAGE_NOACCESS, nullptr, 0); + if (!alloc) + return nullptr; + + return std::unique_ptr(new SharedMemoryMappingArea(static_cast(alloc), size, size / __pagesize)); +} + +u8* SharedMemoryMappingArea::Map(void* file_handle, size_t file_offset, void* map_base, size_t map_size, const PageProtectionMode& mode) +{ + pxAssert(static_cast(map_base) >= m_base_ptr && static_cast(map_base) < (m_base_ptr + m_size)); + + const size_t map_offset = static_cast(map_base) - m_base_ptr; + pxAssert(Common::IsAlignedPow2(map_offset, __pagesize)); + pxAssert(Common::IsAlignedPow2(map_size, __pagesize)); + + // should be a placeholder. unless there's some other mapping we didn't free. + PlaceholderMap::iterator phit = FindPlaceholder(map_offset); + pxAssertMsg(phit != m_placeholder_ranges.end(), "Page we're mapping is a placeholder"); + pxAssertMsg(map_offset >= phit->first && map_offset < phit->second, "Page is in returned placeholder range"); + pxAssertMsg((map_offset + map_size) <= phit->second, "Page range is in returned placeholder range"); + + // do we need to split to the left? (i.e. is there a placeholder before this range) + const size_t old_ph_end = phit->second; + if (map_offset != phit->first) + { + phit->second = map_offset; + + // split it (i.e. left..start and start..end are now separated) + if (!VirtualFreeEx(GetCurrentProcess(), OffsetPointer(phit->first), + (map_offset - phit->first), MEM_RELEASE | MEM_PRESERVE_PLACEHOLDER)) + { + pxFailRel("Failed to left split placeholder for map"); + } + } + else + { + // start of the placeholder is getting used, we'll split it right below if there's anything left over + m_placeholder_ranges.erase(phit); + } + + // do we need to split to the right? (i.e. is there a placeholder after this range) + if ((map_offset + map_size) != old_ph_end) + { + // split out end..ph_end + m_placeholder_ranges.emplace(map_offset + map_size, old_ph_end); + + if (!VirtualFreeEx(GetCurrentProcess(), OffsetPointer(map_offset), map_size, + MEM_RELEASE | MEM_PRESERVE_PLACEHOLDER)) + { + pxFailRel("Failed to right split placeholder for map"); + } + } + + // actually do the mapping, replacing the placeholder on the range + if (!MapViewOfFile3(static_cast(file_handle), GetCurrentProcess(), + map_base, file_offset, map_size, MEM_REPLACE_PLACEHOLDER, PAGE_READWRITE, nullptr, 0)) + { + Console.Error("(SharedMemoryMappingArea) MapViewOfFile3() failed: %u", GetLastError()); + return nullptr; + } + + const DWORD prot = ConvertToWinApi(mode); + if (prot != PAGE_READWRITE) + { + DWORD old_prot; + if (!VirtualProtect(map_base, map_size, prot, &old_prot)) + pxFail("Failed to protect memory mapping"); + } + + m_num_mappings++; + return static_cast(map_base); +} + +bool SharedMemoryMappingArea::Unmap(void* map_base, size_t map_size) +{ + pxAssert(static_cast(map_base) >= m_base_ptr && static_cast(map_base) < (m_base_ptr + m_size)); + + const size_t map_offset = static_cast(map_base) - m_base_ptr; + pxAssert(Common::IsAlignedPow2(map_offset, __pagesize)); + pxAssert(Common::IsAlignedPow2(map_size, __pagesize)); + + const size_t page = map_offset / __pagesize; + + // unmap the specified range + if (!UnmapViewOfFile2(GetCurrentProcess(), map_base, MEM_PRESERVE_PLACEHOLDER)) + { + Console.Error("(SharedMemoryMappingArea) UnmapViewOfFile2() failed: %u", GetLastError()); + return false; + } + + // can we coalesce to the left? + PlaceholderMap::iterator left_it = (map_offset > 0) ? FindPlaceholder(map_offset - 1) : m_placeholder_ranges.end(); + if (left_it != m_placeholder_ranges.end()) + { + // the left placeholder should end at our start + pxAssert(map_offset == left_it->second); + left_it->second = map_offset + map_size; + + // combine placeholders before and the range we're unmapping, i.e. to the left + if (!VirtualFreeEx(GetCurrentProcess(), OffsetPointer(left_it->first), + left_it->second - left_it->first, MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS)) + { + pxFail("Failed to coalesce placeholders left for unmap"); + } + } + else + { + // this is a new placeholder + left_it = m_placeholder_ranges.emplace(map_offset, map_offset + map_size).first; + } + + // can we coalesce to the right? + PlaceholderMap::iterator right_it = ((map_offset + map_size) < m_size) ? FindPlaceholder(map_offset + map_size) : m_placeholder_ranges.end(); + if (right_it != m_placeholder_ranges.end()) + { + // should start at our end + pxAssert(right_it->first == (map_offset + map_size)); + left_it->second = right_it->second; + m_placeholder_ranges.erase(right_it); + + // combine our placeholder and the next, i.e. to the right + if (!VirtualFreeEx(GetCurrentProcess(), OffsetPointer(left_it->first), + left_it->second - left_it->first, MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS)) + { + pxFail("Failed to coalescae placeholders right for unmap"); + } + } + + m_num_mappings--; + return true; +} + #endif diff --git a/common/Windows/WinMisc.cpp b/common/Windows/WinMisc.cpp index 67c8f015a0..adeea44441 100644 --- a/common/Windows/WinMisc.cpp +++ b/common/Windows/WinMisc.cpp @@ -19,10 +19,14 @@ #include "common/RedtapeWindows.h" #include "common/Exceptions.h" #include "common/StringUtil.h" +#include "common/General.h" +#include "common/WindowInfo.h" #include "fmt/core.h" -#pragma comment(lib, "User32.lib") +#include +#include +#include alignas(16) static LARGE_INTEGER lfreq; @@ -60,60 +64,31 @@ std::string GetOSVersionString() SYSTEM_INFO si; GetNativeSystemInfo(&si); - if (!IsWindows8Point1OrGreater()) - { - retval = "Unsupported Operating System!"; - } - else + if (IsWindows10OrGreater()) { retval = "Microsoft "; - - if (IsWindows10OrGreater()) - retval += IsWindowsServer() ? "Windows Server 2016" : "Windows 10"; - else // IsWindows8Point1OrGreater() - retval += IsWindowsServer() ? "Windows Server 2012 R2" : "Windows 8.1"; + retval += IsWindowsServer() ? "Windows Server 2016+" : "Windows 10+"; + } + else + retval = "Unsupported Operating System!"; return retval; } -// -------------------------------------------------------------------------------------- -// Exception::WinApiError (implementations) -// -------------------------------------------------------------------------------------- -Exception::WinApiError::WinApiError() -{ - ErrorId = GetLastError(); - m_message_diag = "Unspecified Windows API error."; -} - -std::string Exception::WinApiError::GetMsgFromWindows() const -{ - if (!ErrorId) - return "No valid error number was assigned to this exception!"; - - const DWORD BUF_LEN = 2048; - wchar_t t_Msg[BUF_LEN]; - if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, 0, ErrorId, 0, t_Msg, BUF_LEN, 0)) - return fmt::format("Win32 Error #{}: {}", ErrorId, StringUtil::WideStringToUTF8String(t_Msg)); - - return fmt::format("Win32 Error #{} (no text msg available)", ErrorId); -} - -std::string Exception::WinApiError::FormatDisplayMessage() const -{ - return m_message_user + "\n\n" + GetMsgFromWindows(); -} - -std::string Exception::WinApiError::FormatDiagnosticMessage() const -{ - return m_message_diag + "\n\t" + GetMsgFromWindows(); -} - -void ScreensaverAllow(bool allow) +bool WindowInfo::InhibitScreensaver(const WindowInfo& wi, bool inhibit) { EXECUTION_STATE flags = ES_CONTINUOUS; - if (!allow) + if (inhibit) flags |= ES_DISPLAY_REQUIRED; SetThreadExecutionState(flags); + return true; } + +bool Common::PlaySoundAsync(const char* path) +{ + const std::wstring wpath(StringUtil::UTF8StringToWideString(path)); + return PlaySoundW(wpath.c_str(), NULL, SND_ASYNC | SND_NODEFAULT); +} + #endif diff --git a/common/Windows/WinThreads.cpp b/common/Windows/WinThreads.cpp index e99814b402..89341002ff 100644 --- a/common/Windows/WinThreads.cpp +++ b/common/Windows/WinThreads.cpp @@ -19,7 +19,9 @@ #include "common/Assertions.h" #include "common/emitter/tools.h" #include "common/RedtapeWindows.h" +#include #include +#include __fi void Threading::Sleep(int ms) { diff --git a/common/ZipHelpers.h b/common/ZipHelpers.h index 283ce37d01..dfcbf54802 100644 --- a/common/ZipHelpers.h +++ b/common/ZipHelpers.h @@ -104,12 +104,51 @@ static inline std::optional ReadFileInZipToContainer(zip_t* zip, const char* return ret; } + +template +static inline std::optional ReadFileInZipToContainer(zip_file_t* file, u32 chunk_size = 4096) +{ + std::optional ret = T(); + for (;;) + { + const size_t pos = ret->size(); + ret->resize(pos + chunk_size); + const s64 read = zip_fread(file, ret->data() + pos, chunk_size); + if (read < 0) + { + // read error + ret.reset(); + break; + } + + // if less than chunk size, we're EOF + if (read != static_cast(chunk_size)) + { + ret->resize(pos + static_cast(read)); + break; + } + } + + return ret; +} + + static inline std::optional ReadFileInZipToString(zip_t* zip, const char* name) { return ReadFileInZipToContainer(zip, name); } +static inline std::optional ReadFileInZipToString(zip_file_t* file, u32 chunk_size = 4096) +{ + return ReadFileInZipToContainer(file, chunk_size); +} + static inline std::optional> ReadBinaryFileInZip(zip_t* zip, const char* name) { return ReadFileInZipToContainer>(zip, name); } + +static inline std::optional> ReadBinaryFileInZip(zip_file_t* file, u32 chunk_size = 4096) +{ + return ReadFileInZipToContainer>(file, chunk_size); +} \ No newline at end of file diff --git a/common/common.vcxproj b/common/common.vcxproj index 861365fa69..694fb5d6d7 100644 --- a/common/common.vcxproj +++ b/common/common.vcxproj @@ -1,6 +1,7 @@ + {4639972E-424E-4E13-8B07-CA403C481346} @@ -33,11 +34,18 @@ $(SolutionDir)3rdparty\d3d12memalloc\include;$(SolutionDir)3rdparty\glad\include;$(SolutionDir)3rdparty\glslang\glslang;%(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\rapidyaml\rapidyaml\ext\c4core\src\c4\ext\fast_float\include + %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\libpng + %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\jpgd Async Use PrecompiledHeader.h PrecompiledHeader.h WIN32_LEAN_AND_MEAN;NOMINMAX;%(PreprocessorDefinitions) + _M_SSE=0x401;%(PreprocessorDefinitions) + _M_SSE=0x501;%(PreprocessorDefinitions) + NotSet + AdvancedVectorExtensions2 $(IntDir)%(RelativeDir) @@ -64,8 +72,16 @@ + + + + true + + + + @@ -94,6 +110,7 @@ + @@ -126,6 +143,7 @@ + @@ -135,7 +153,16 @@ + + + + + + true + + + @@ -151,8 +178,10 @@ + + @@ -166,6 +195,7 @@ + @@ -203,6 +233,9 @@ {ef6834a9-11f3-4331-bc34-21b325abb180} + + {ed2f21fd-0a36-4a8f-9b90-e7d92a2acb63} + diff --git a/common/common.vcxproj.filters b/common/common.vcxproj.filters index 55cf5d1c09..333dfb8eab 100644 --- a/common/common.vcxproj.filters +++ b/common/common.vcxproj.filters @@ -34,6 +34,9 @@ Source Files + + Source Files + Source Files @@ -55,6 +58,9 @@ Source Files + + Source Files + Source Files @@ -184,6 +190,21 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -261,6 +282,9 @@ Header Files + + Header Files + Header Files @@ -285,6 +309,9 @@ Header Files + + Header Files + Header Files @@ -429,6 +456,33 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + @@ -475,4 +529,4 @@ Source Files - \ No newline at end of file +

+ License: MIT + GitHub Actions + Fuzzing Status + Gitter + Discord +

diff --git a/common/emitter/avx.cpp b/common/emitter/avx.cpp new file mode 100644 index 0000000000..feaafe55b3 --- /dev/null +++ b/common/emitter/avx.cpp @@ -0,0 +1,179 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "common/emitter/internal.h" +#include "common/emitter/tools.h" + +namespace x86Emitter +{ + const xImplAVX_Move xVMOVAPS = {0x00, 0x28, 0x29}; + const xImplAVX_Move xVMOVUPS = {0x00, 0x10, 0x11}; + + const xImplAVX_ArithFloat xVADD = { + {0x00, 0x58}, // VADDPS + {0x66, 0x58}, // VADDPD + {0xF3, 0x58}, // VADDSS + {0xF2, 0x58}, // VADDSD + }; + const xImplAVX_ArithFloat xVSUB = { + {0x00, 0x5C}, // VSUBPS + {0x66, 0x5C}, // VSUBPD + {0xF3, 0x5C}, // VSUBSS + {0xF2, 0x5C}, // VSUBSD + }; + const xImplAVX_ArithFloat xVMUL = { + {0x00, 0x59}, // VMULPS + {0x66, 0x59}, // VMULPD + {0xF3, 0x59}, // VMULSS + {0xF2, 0x59}, // VMULSD + }; + const xImplAVX_ArithFloat xVDIV = { + {0x00, 0x5E}, // VDIVPS + {0x66, 0x5E}, // VDIVPD + {0xF3, 0x5E}, // VDIVSS + {0xF2, 0x5E}, // VDIVSD + }; + const xImplAVX_CmpFloat xVCMP = { + {SSE2_Equal}, + {SSE2_Less}, + {SSE2_LessOrEqual}, + {SSE2_Unordered}, + {SSE2_NotEqual}, + {SSE2_NotLess}, + {SSE2_NotLessOrEqual}, + {SSE2_Ordered}, + }; + const xImplAVX_ThreeArgYMM xVPAND = {0x66, 0xDB}; + const xImplAVX_ThreeArgYMM xVPANDN = {0x66, 0xDF}; + const xImplAVX_ThreeArgYMM xVPOR = {0x66, 0xEB}; + const xImplAVX_ThreeArgYMM xVPXOR = {0x66, 0xEF}; + const xImplAVX_CmpInt xVPCMP = { + {0x66, 0x74}, // VPCMPEQB + {0x66, 0x75}, // VPCMPEQW + {0x66, 0x76}, // VPCMPEQD + {0x66, 0x64}, // VPCMPGTB + {0x66, 0x65}, // VPCMPGTW + {0x66, 0x66}, // VPCMPGTD + }; + + void xVPMOVMSKB(const xRegister32& to, const xRegisterSSE& from) + { + xOpWriteC5(0x66, 0xd7, to, xRegister32(), from); + } + + void xVMOVMSKPS(const xRegister32& to, const xRegisterSSE& from) + { + xOpWriteC5(0x00, 0x50, to, xRegister32(), from); + } + + void xVMOVMSKPD(const xRegister32& to, const xRegisterSSE& from) + { + xOpWriteC5(0x66, 0x50, to, xRegister32(), from); + } + + void xVZEROUPPER() + { + // rather than dealing with nonexistant operands.. + xWrite8(0xc5); + xWrite8(0xf8); + xWrite8(0x77); + } + + void xImplAVX_Move::operator()(const xRegisterSSE& to, const xRegisterSSE& from) const + { + if (to != from) + xOpWriteC5(Prefix, LoadOpcode, to, xRegisterSSE(), from); + } + + void xImplAVX_Move::operator()(const xRegisterSSE& to, const xIndirectVoid& from) const + { + xOpWriteC5(Prefix, LoadOpcode, to, xRegisterSSE(), from); + } + + void xImplAVX_Move::operator()(const xIndirectVoid& to, const xRegisterSSE& from) const + { + xOpWriteC5(Prefix, StoreOpcode, from, xRegisterSSE(), to); + } + + void xImplAVX_ThreeArg::operator()(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const + { + pxAssert(!to.IsWideSIMD() && !from1.IsWideSIMD() && !from2.IsWideSIMD()); + xOpWriteC5(Prefix, Opcode, to, from1, from2); + } + + void xImplAVX_ThreeArg::operator()(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const + { + pxAssert(!to.IsWideSIMD() && !from1.IsWideSIMD()); + xOpWriteC5(Prefix, Opcode, to, from1, from2); + } + + void xImplAVX_ThreeArgYMM::operator()(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const + { + xOpWriteC5(Prefix, Opcode, to, from1, from2); + } + + void xImplAVX_ThreeArgYMM::operator()(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const + { + xOpWriteC5(Prefix, Opcode, to, from1, from2); + } + + void xImplAVX_CmpFloatHelper::PS(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const + { + xOpWriteC5(0x00, 0xC2, to, from1, from2); + xWrite8(static_cast(CType)); + } + + void xImplAVX_CmpFloatHelper::PS(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const + { + xOpWriteC5(0x00, 0xC2, to, from1, from2); + xWrite8(static_cast(CType)); + } + + void xImplAVX_CmpFloatHelper::PD(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const + { + xOpWriteC5(0x66, 0xC2, to, from1, from2); + xWrite8(static_cast(CType)); + } + + void xImplAVX_CmpFloatHelper::PD(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const + { + xOpWriteC5(0x66, 0xC2, to, from1, from2); + xWrite8(static_cast(CType)); + } + + void xImplAVX_CmpFloatHelper::SS(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const + { + xOpWriteC5(0xF3, 0xC2, to, from1, from2); + xWrite8(static_cast(CType)); + } + + void xImplAVX_CmpFloatHelper::SS(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const + { + xOpWriteC5(0xF3, 0xC2, to, from1, from2); + xWrite8(static_cast(CType)); + } + + void xImplAVX_CmpFloatHelper::SD(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const + { + xOpWriteC5(0xF2, 0xC2, to, from1, from2); + xWrite8(static_cast(CType)); + } + + void xImplAVX_CmpFloatHelper::SD(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const + { + xOpWriteC5(0xF2, 0xC2, to, from1, from2); + xWrite8(static_cast(CType)); + } +} // namespace x86Emitter diff --git a/common/emitter/implement/avx.h b/common/emitter/implement/avx.h new file mode 100644 index 0000000000..18fa832e1c --- /dev/null +++ b/common/emitter/implement/avx.h @@ -0,0 +1,113 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +namespace x86Emitter +{ + struct xImplAVX_Move + { + u8 Prefix; + u8 LoadOpcode; + u8 StoreOpcode; + + void operator()(const xRegisterSSE& to, const xRegisterSSE& from) const; + void operator()(const xRegisterSSE& to, const xIndirectVoid& from) const; + void operator()(const xIndirectVoid& to, const xRegisterSSE& from) const; + }; + + struct xImplAVX_ThreeArg + { + u8 Prefix; + u8 Opcode; + + void operator()(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const; + void operator()(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const; + }; + + struct xImplAVX_ThreeArgYMM : xImplAVX_ThreeArg + { + void operator()(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const; + void operator()(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const; + }; + + struct xImplAVX_ArithFloat + { + xImplAVX_ThreeArgYMM PS; + xImplAVX_ThreeArgYMM PD; + xImplAVX_ThreeArg SS; + xImplAVX_ThreeArg SD; + }; + + struct xImplAVX_CmpFloatHelper + { + SSE2_ComparisonType CType; + + void PS(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const; + void PS(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const; + void PD(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const; + void PD(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const; + + void SS(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const; + void SS(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const; + void SD(const xRegisterSSE& to, const xRegisterSSE& from1, const xRegisterSSE& from2) const; + void SD(const xRegisterSSE& to, const xRegisterSSE& from1, const xIndirectVoid& from2) const; + }; + + struct xImplAVX_CmpFloat + { + xImplAVX_CmpFloatHelper EQ; + xImplAVX_CmpFloatHelper LT; + xImplAVX_CmpFloatHelper LE; + xImplAVX_CmpFloatHelper UO; + xImplAVX_CmpFloatHelper NE; + xImplAVX_CmpFloatHelper GE; + xImplAVX_CmpFloatHelper GT; + xImplAVX_CmpFloatHelper OR; + }; + + struct xImplAVX_CmpInt + { + // Compare packed bytes for equality. + // If a data element in dest is equal to the corresponding date element src, the + // corresponding data element in dest is set to all 1s; otherwise, it is set to all 0s. + const xImplAVX_ThreeArgYMM EQB; + + // Compare packed words for equality. + // If a data element in dest is equal to the corresponding date element src, the + // corresponding data element in dest is set to all 1s; otherwise, it is set to all 0s. + const xImplAVX_ThreeArgYMM EQW; + + // Compare packed doublewords [32-bits] for equality. + // If a data element in dest is equal to the corresponding date element src, the + // corresponding data element in dest is set to all 1s; otherwise, it is set to all 0s. + const xImplAVX_ThreeArgYMM EQD; + + // Compare packed signed bytes for greater than. + // If a data element in dest is greater than the corresponding date element src, the + // corresponding data element in dest is set to all 1s; otherwise, it is set to all 0s. + const xImplAVX_ThreeArgYMM GTB; + + // Compare packed signed words for greater than. + // If a data element in dest is greater than the corresponding date element src, the + // corresponding data element in dest is set to all 1s; otherwise, it is set to all 0s. + const xImplAVX_ThreeArgYMM GTW; + + // Compare packed signed doublewords [32-bits] for greater than. + // If a data element in dest is greater than the corresponding date element src, the + // corresponding data element in dest is set to all 1s; otherwise, it is set to all 0s. + const xImplAVX_ThreeArgYMM GTD; + }; +} // namespace x86Emitter diff --git a/common/emitter/implement/simd_shufflepack.h b/common/emitter/implement/simd_shufflepack.h index 070087af2d..fa8f13e8e8 100644 --- a/common/emitter/implement/simd_shufflepack.h +++ b/common/emitter/implement/simd_shufflepack.h @@ -184,17 +184,6 @@ namespace x86Emitter }; - struct xImplSimd_InsertExtractHelper - { - u16 Opcode; - - // [SSE-4.1] Allowed with SSE registers only (MMX regs are invalid) - void operator()(const xRegisterSSE& to, const xRegister32& from, u8 imm8) const; - - // [SSE-4.1] Allowed with SSE registers only (MMX regs are invalid) - void operator()(const xRegisterSSE& to, const xIndirectVoid& from, u8 imm8) const; - }; - // -------------------------------------------------------------------------------------- // SimdImpl_PInsert // -------------------------------------------------------------------------------------- @@ -202,17 +191,19 @@ namespace x86Emitter // struct xImplSimd_PInsert { + void B(const xRegisterSSE& to, const xRegister32& from, u8 imm8) const; + void B(const xRegisterSSE& to, const xIndirect32& from, u8 imm8) const; + void W(const xRegisterSSE& to, const xRegister32& from, u8 imm8) const; - void W(const xRegisterSSE& to, const xIndirectVoid& from, u8 imm8) const; + void W(const xRegisterSSE& to, const xIndirect32& from, u8 imm8) const; - // [SSE-4.1] Allowed with SSE registers only (MMX regs are invalid) - xImplSimd_InsertExtractHelper B; + void D(const xRegisterSSE& to, const xRegister32& from, u8 imm8) const; + void D(const xRegisterSSE& to, const xIndirect32& from, u8 imm8) const; - // [SSE-4.1] Allowed with SSE registers only (MMX regs are invalid) - xImplSimd_InsertExtractHelper D; + void Q(const xRegisterSSE& to, const xRegister64& from, u8 imm8) const; + void Q(const xRegisterSSE& to, const xIndirect64& from, u8 imm8) const; }; - ////////////////////////////////////////////////////////////////////////////////////////// // PEXTRW/B/D [all but Word form are SSE4.1 only!] // @@ -220,6 +211,12 @@ namespace x86Emitter // struct SimdImpl_PExtract { + // [SSE-4.1] Copies the byte element specified by imm8 from src to dest. The upper bits + // of dest are zero-extended (cleared). This can be used to extract any single packed + // byte value from src into an x86 32 bit register. + void B(const xRegister32& to, const xRegisterSSE& from, u8 imm8) const; + void B(const xIndirect32& dest, const xRegisterSSE& from, u8 imm8) const; + // Copies the word element specified by imm8 from src to dest. The upper bits // of dest are zero-extended (cleared). This can be used to extract any single packed // word value from src into an x86 32 bit register. @@ -227,15 +224,15 @@ namespace x86Emitter // [SSE-4.1] Note: Indirect memory forms of this instruction are an SSE-4.1 extension! // void W(const xRegister32& to, const xRegisterSSE& from, u8 imm8) const; - void W(const xIndirectVoid& dest, const xRegisterSSE& from, u8 imm8) const; - - // [SSE-4.1] Copies the byte element specified by imm8 from src to dest. The upper bits - // of dest are zero-extended (cleared). This can be used to extract any single packed - // byte value from src into an x86 32 bit register. - const xImplSimd_InsertExtractHelper B; + void W(const xIndirect32& dest, const xRegisterSSE& from, u8 imm8) const; // [SSE-4.1] Copies the dword element specified by imm8 from src to dest. This can be // used to extract any single packed dword value from src into an x86 32 bit register. - const xImplSimd_InsertExtractHelper D; + void D(const xRegister32& to, const xRegisterSSE& from, u8 imm8) const; + void D(const xIndirect32& dest, const xRegisterSSE& from, u8 imm8) const; + + // Insert a qword integer value from r/m64 into the xmm1 at the destination element specified by imm8. + void Q(const xRegister64& to, const xRegisterSSE& from, u8 imm8) const; + void Q(const xIndirect64& dest, const xRegisterSSE& from, u8 imm8) const; }; } // namespace x86Emitter diff --git a/common/emitter/instructions.h b/common/emitter/instructions.h index cc5322e870..78807d4683 100644 --- a/common/emitter/instructions.h +++ b/common/emitter/instructions.h @@ -622,4 +622,25 @@ namespace x86Emitter extern const SimdImpl_Pack xPACK; extern const xImplSimd_PInsert xPINSR; extern const SimdImpl_PExtract xPEXTR; + + // ------------------------------------------------------------------------ + + extern const xImplAVX_Move xVMOVAPS; + extern const xImplAVX_Move xVMOVUPS; + extern const xImplAVX_ArithFloat xVADD; + extern const xImplAVX_ArithFloat xVSUB; + extern const xImplAVX_ArithFloat xVMUL; + extern const xImplAVX_ArithFloat xVDIV; + extern const xImplAVX_CmpFloat xVCMP; + extern const xImplAVX_ThreeArgYMM xVPAND; + extern const xImplAVX_ThreeArgYMM xVPANDN; + extern const xImplAVX_ThreeArgYMM xVPOR; + extern const xImplAVX_ThreeArgYMM xVPXOR; + extern const xImplAVX_CmpInt xVPCMP; + + extern void xVPMOVMSKB(const xRegister32& to, const xRegisterSSE& from); + extern void xVMOVMSKPS(const xRegister32& to, const xRegisterSSE& from); + extern void xVMOVMSKPD(const xRegister32& to, const xRegisterSSE& from); + extern void xVZEROUPPER(); + } // namespace x86Emitter diff --git a/common/emitter/internal.h b/common/emitter/internal.h index f1f5d1824d..42a0dd9161 100644 --- a/common/emitter/internal.h +++ b/common/emitter/internal.h @@ -123,12 +123,18 @@ namespace x86Emitter { pxAssert(prefix == 0 || prefix == 0x66 || prefix == 0xF3 || prefix == 0xF2); - const xRegisterInt& reg = param1.IsReg() ? param1 : param2; + const xRegisterBase& reg = param1.IsReg() ? param1 : param2; u8 nR = reg.IsExtended() ? 0x00 : 0x80; - u8 L = reg.IsWideSIMD() ? 4 : 0; + u8 L; - u8 nv = (~param2.GetId() & 0xF) << 3; + // Needed for 256-bit movemask. + if constexpr (std::is_same_v) + L = param3.IsWideSIMD() ? 4 : 0; + else + L = reg.IsWideSIMD() ? 4 : 0; + + u8 nv = (param2.IsEmpty() ? 0xF : ((~param2.GetId() & 0xF))) << 3; u8 p = prefix == 0xF2 ? 3 : diff --git a/common/emitter/jmp.cpp b/common/emitter/jmp.cpp index 69970a770e..9d938e37b8 100644 --- a/common/emitter/jmp.cpp +++ b/common/emitter/jmp.cpp @@ -88,7 +88,7 @@ namespace x86Emitter } else { - xMOV(rax, ptrNative[f]); + xLEA(rax, ptr64[f]); xCALL(rax); } } @@ -103,7 +103,7 @@ namespace x86Emitter } else { - xMOV(rax, ptrNative[f]); + xLEA(rax, ptr64[f]); xCALL(rax); } } diff --git a/common/emitter/simd.cpp b/common/emitter/simd.cpp index 23f2d091d1..1937683b63 100644 --- a/common/emitter/simd.cpp +++ b/common/emitter/simd.cpp @@ -38,6 +38,18 @@ const char* EnumToString(SSE_RoundMode sse) } } +SSE_MXCSR SSE_MXCSR::GetCurrent() +{ + SSE_MXCSR ret; + ret.bitmask = _mm_getcsr(); + return ret; +} + +void SSE_MXCSR::SetCurrent(const SSE_MXCSR& value) +{ + _mm_setcsr(value.bitmask); +} + SSE_RoundMode SSE_MXCSR::GetRoundMode() const { return (SSE_RoundMode)RoundingControl; @@ -461,21 +473,29 @@ namespace x86Emitter xOpWrite0F(0x66, 0xc6, to, from, selector & 0x3); } - void xImplSimd_InsertExtractHelper::operator()(const xRegisterSSE& to, const xRegister32& from, u8 imm8) const - { - xOpWrite0F(0x66, Opcode, to, from, imm8); - } - - void xImplSimd_InsertExtractHelper::operator()(const xRegisterSSE& to, const xIndirectVoid& from, u8 imm8) const - { - xOpWrite0F(0x66, Opcode, to, from, imm8); - } + void xImplSimd_PInsert::B(const xRegisterSSE& to, const xRegister32& from, u8 imm8) const { xOpWrite0F(0x66, 0x203a, to, from, imm8); } + void xImplSimd_PInsert::B(const xRegisterSSE& to, const xIndirect32& from, u8 imm8) const { xOpWrite0F(0x66, 0x203a, to, from, imm8); } void xImplSimd_PInsert::W(const xRegisterSSE& to, const xRegister32& from, u8 imm8) const { xOpWrite0F(0x66, 0xc4, to, from, imm8); } - void xImplSimd_PInsert::W(const xRegisterSSE& to, const xIndirectVoid& from, u8 imm8) const { xOpWrite0F(0x66, 0xc4, to, from, imm8); } + void xImplSimd_PInsert::W(const xRegisterSSE& to, const xIndirect32& from, u8 imm8) const { xOpWrite0F(0x66, 0xc4, to, from, imm8); } - void SimdImpl_PExtract::W(const xRegister32& to, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0xc5, to, from, imm8); } - void SimdImpl_PExtract::W(const xIndirectVoid& dest, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0x153a, from, dest, imm8); } + void xImplSimd_PInsert::D(const xRegisterSSE& to, const xRegister32& from, u8 imm8) const { xOpWrite0F(0x66, 0x223a, to, from, imm8); } + void xImplSimd_PInsert::D(const xRegisterSSE& to, const xIndirect32& from, u8 imm8) const { xOpWrite0F(0x66, 0x223a, to, from, imm8); } + + void xImplSimd_PInsert::Q(const xRegisterSSE& to, const xRegister64& from, u8 imm8) const { xOpWrite0F(0x66, 0x223a, to, from, imm8); } + void xImplSimd_PInsert::Q(const xRegisterSSE& to, const xIndirect64& from, u8 imm8) const { xOpWrite0F(0x66, 0x223a, to, from, imm8); } + + void SimdImpl_PExtract::B(const xRegister32& to, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0x143a, from, to, imm8); } + void SimdImpl_PExtract::B(const xIndirect32& dest, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0x143a, from, dest, imm8); } + + void SimdImpl_PExtract::W(const xRegister32& to, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0xc5, from, to, imm8); } + void SimdImpl_PExtract::W(const xIndirect32& dest, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0x153a, from, dest, imm8); } + + void SimdImpl_PExtract::D(const xRegister32& to, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0x163a, from, to, imm8); } + void SimdImpl_PExtract::D(const xIndirect32& dest, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0x163a, from, dest, imm8); } + + void SimdImpl_PExtract::Q(const xRegister64& to, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0x163a, from, to, imm8); } + void SimdImpl_PExtract::Q(const xIndirect64& dest, const xRegisterSSE& from, u8 imm8) const { xOpWrite0F(0x66, 0x163a, from, dest, imm8); } const xImplSimd_Shuffle xSHUF = {}; @@ -517,17 +537,8 @@ namespace x86Emitter {0x66, 0x14}, // LPD }; - const xImplSimd_PInsert xPINSR = - { - {0x203a}, // B - {0x223a}, // D - }; - - const SimdImpl_PExtract xPEXTR = - { - {0x143a}, // B - {0x163a}, // D - }; + const xImplSimd_PInsert xPINSR; + const SimdImpl_PExtract xPEXTR; // ===================================================================================================== // SIMD Move And Blend Instructions diff --git a/common/emitter/tools.h b/common/emitter/tools.h index b950d3807e..d251ee1e78 100644 --- a/common/emitter/tools.h +++ b/common/emitter/tools.h @@ -185,6 +185,9 @@ union SSE_MXCSR FlushToZero : 1; }; + static SSE_MXCSR GetCurrent(); + static void SetCurrent(const SSE_MXCSR& value); + SSE_RoundMode GetRoundMode() const; SSE_MXCSR& SetRoundMode(SSE_RoundMode mode); SSE_MXCSR& ClearExceptionFlags(); diff --git a/common/emitter/x86emitter.cpp b/common/emitter/x86emitter.cpp index 570d956770..e7ff9b7502 100644 --- a/common/emitter/x86emitter.cpp +++ b/common/emitter/x86emitter.cpp @@ -120,6 +120,16 @@ const xRegisterSSE xmm12(12), xmm13(13), xmm14(14), xmm15(15); +const xRegisterSSE + ymm0(0, xRegisterYMMTag()), ymm1(1, xRegisterYMMTag()), + ymm2(2, xRegisterYMMTag()), ymm3(3, xRegisterYMMTag()), + ymm4(4, xRegisterYMMTag()), ymm5(5, xRegisterYMMTag()), + ymm6(6, xRegisterYMMTag()), ymm7(7, xRegisterYMMTag()), + ymm8(8, xRegisterYMMTag()), ymm9(9, xRegisterYMMTag()), + ymm10(10, xRegisterYMMTag()), ymm11(11, xRegisterYMMTag()), + ymm12(12, xRegisterYMMTag()), ymm13(13, xRegisterYMMTag()), + ymm14(14, xRegisterYMMTag()), ymm15(15, xRegisterYMMTag()); + const xAddressReg rax(0), rbx(3), rcx(1), rdx(2), @@ -150,7 +160,13 @@ const xRegister8 al(0), dl(2), bl(3), ah(4), ch(5), - dh(6), bh(7); + dh(6), bh(7), + spl(4, true), bpl(5, true), + sil(6, true), dil(7, true), + r8b(8), r9b(9), + r10b(10), r11b(11), + r12b(12), r13b(13), + r14b(14), r15b(15); #if defined(_WIN32) const xAddressReg @@ -426,10 +442,10 @@ const xRegister32 } ////////////////////////////////////////////////////////////////////////////////////////// - __emitinline static void EmitRex(bool w, bool r, bool x, bool b) + __emitinline static void EmitRex(bool w, bool r, bool x, bool b, bool ext8bit = false) { const u8 rex = 0x40 | (w << 3) | (r << 2) | (x << 1) | (u8)b; - if (rex != 0x40) + if (rex != 0x40 || ext8bit) xWrite8(rex); } @@ -463,16 +479,16 @@ const xRegister32 bool r = false; bool x = false; bool b = reg2.IsExtended(); - EmitRex(w, r, x, b); + EmitRex(w, r, x, b, reg2.IsExtended8Bit()); } void EmitRex(const xRegisterBase& reg1, const xRegisterBase& reg2) { - bool w = reg1.IsWide(); + bool w = reg1.IsWide() || reg2.IsWide(); bool r = reg1.IsExtended(); bool x = false; bool b = reg2.IsExtended(); - EmitRex(w, r, x, b); + EmitRex(w, r, x, b, reg2.IsExtended8Bit()); } void EmitRex(const xRegisterBase& reg1, const void* src) @@ -482,12 +498,12 @@ const xRegister32 bool r = reg1.IsExtended(); bool x = false; bool b = false; // FIXME src.IsExtended(); - EmitRex(w, r, x, b); + EmitRex(w, r, x, b, reg1.IsExtended8Bit()); } void EmitRex(const xRegisterBase& reg1, const xIndirectVoid& sib) { - bool w = reg1.IsWide(); + bool w = reg1.IsWide() || sib.IsWide(); bool r = reg1.IsExtended(); bool x = sib.Index.IsExtended(); bool b = sib.Base.IsExtended(); @@ -496,7 +512,7 @@ const xRegister32 b = x; x = false; } - EmitRex(w, r, x, b); + EmitRex(w, r, x, b, reg1.IsExtended8Bit()); } // For use by instructions that are implicitly wide diff --git a/common/emitter/x86types.h b/common/emitter/x86types.h index 06bff31420..75fee148eb 100644 --- a/common/emitter/x86types.h +++ b/common/emitter/x86types.h @@ -268,7 +268,8 @@ namespace x86Emitter bool IsEmpty() const { return Id < 0; } bool IsInvalid() const { return Id == xRegId_Invalid; } - bool IsExtended() const { return Id > 7; } // Register 8-15 need an extra bit to be selected + bool IsExtended() const { return (Id >= 0 && (Id & 0x0F) > 7); } // Register 8-15 need an extra bit to be selected + bool IsExtended8Bit() const { return (Is8BitOp() && Id >= 0x10); } bool IsMem() const { return false; } bool IsReg() const { return true; } @@ -290,6 +291,9 @@ namespace x86Emitter // is a valid non-null string for any Id, valid or invalid. No assertions are generated. const char* GetName(); int GetId() const { return Id; } + + /// Returns true if the specified register is caller-saved (volatile). + static inline bool IsCallerSaved(uint id); }; class xRegisterInt : public xRegisterBase @@ -347,7 +351,14 @@ namespace x86Emitter explicit xRegister8(const xRegisterInt& other) : _parent(1, other.Id) { - pxAssertDev(other.canMapIDTo(1), "spl, bpl, sil, dil not yet supported"); + if (!other.canMapIDTo(1)) + Id |= 0x10; + } + xRegister8(int regId, bool ext8bit) + : _parent(1, regId) + { + if (ext8bit) + Id |= 0x10; } bool operator==(const xRegister8& src) const { return Id == src.Id; } @@ -420,6 +431,8 @@ namespace x86Emitter // This register type is provided to allow legal syntax for instructions that accept // an XMM register as a parameter, but do not allow for a GPR. + struct xRegisterYMMTag {}; + class xRegisterSSE : public xRegisterBase { typedef xRegisterBase _parent; @@ -430,11 +443,24 @@ namespace x86Emitter : _parent(16, regId) { } + xRegisterSSE(int regId, xRegisterYMMTag) + : _parent(32, regId) + { + } bool operator==(const xRegisterSSE& src) const { return this->Id == src.Id; } bool operator!=(const xRegisterSSE& src) const { return this->Id != src.Id; } static const inline xRegisterSSE& GetInstance(uint id); + static const inline xRegisterSSE& GetYMMInstance(uint id); + + /// Returns the register to use when calling a C function. + /// arg_number is the argument position from the left, starting with 0. + /// sse_number is the argument position relative to the number of vector registers. + static const inline xRegisterSSE& GetArgRegister(uint arg_number, uint sse_number, bool ymm = false); + + /// Returns true if the specified register is caller-saved (volatile). + static inline bool IsCallerSaved(uint id); }; class xRegisterCL : public xRegister8 @@ -476,6 +502,11 @@ namespace x86Emitter // Returns true if the register is the stack pointer: ESP. bool IsStackPointer() const { return Id == 4; } + /// Returns the register to use when calling a C function. + /// arg_number is the argument position from the left, starting with 0. + /// sse_number is the argument position relative to the number of vector registers. + static const inline xAddressReg& GetArgRegister(uint arg_number, uint gpr_number); + xAddressVoid operator+(const xAddressReg& right) const; xAddressVoid operator+(sptr right) const; xAddressVoid operator+(const void* right) const; @@ -483,7 +514,6 @@ namespace x86Emitter xAddressVoid operator-(const void* right) const; xAddressVoid operator*(int factor) const; xAddressVoid operator<<(u32 shift) const; - xAddressReg& operator=(const xAddressReg&) = default; }; // -------------------------------------------------------------------------------------- @@ -570,13 +600,19 @@ namespace x86Emitter extern const xRegisterEmpty xEmptyReg; // clang-format off - -extern const xRegisterSSE + extern const xRegisterSSE xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15; + // TODO: This needs to be _M_SSE >= 0x500'ed, but we can't do it atm because common doesn't have variants. + extern const xRegisterSSE + ymm0, ymm1, ymm2, ymm3, + ymm4, ymm5, ymm6, ymm7, + ymm8, ymm9, ymm10, ymm11, + ymm12, ymm13, ymm14, ymm15; + extern const xAddressReg rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, @@ -595,7 +631,10 @@ extern const xRegister16 extern const xRegister8 al, dl, bl, - ah, ch, dh, bh; + ah, ch, dh, bh, + spl, bpl, sil, dil, + r8b, r9b, r10b, r11b, + r12b, r13b, r14b, r15b; extern const xAddressReg arg1reg, arg2reg, @@ -614,6 +653,28 @@ extern const xRegister32 extern const xRegisterCL cl; // I'm special! + bool xRegisterBase::IsCallerSaved(uint id) + { +#ifdef _WIN32 + // The x64 ABI considers the registers RAX, RCX, RDX, R8, R9, R10, R11, and XMM0-XMM5 volatile. + return (id <= 2 || (id >= 8 && id <= 11)); +#else + // rax, rdi, rsi, rdx, rcx, r8, r9, r10, r11 are scratch registers. + return (id <= 2 || id == 6 || id == 7 || (id >= 8 && id <= 11)); +#endif + } + + bool xRegisterSSE::IsCallerSaved(uint id) + { +#ifdef _WIN32 + // XMM6 through XMM15 are saved. Upper 128 bits is always volatile. + return (id < 6); +#else + // All vector registers are volatile. + return true; +#endif + } + const xRegisterSSE& xRegisterSSE::GetInstance(uint id) { static const xRegisterSSE* const m_tbl_xmmRegs[] = @@ -627,6 +688,45 @@ extern const xRegister32 return *m_tbl_xmmRegs[id]; } + const xRegisterSSE& xRegisterSSE::GetYMMInstance(uint id) + { + static const xRegisterSSE* const m_tbl_ymmRegs[] = + { + &ymm0, &ymm1, &ymm2, &ymm3, + &ymm4, &ymm5, &ymm6, &ymm7, + &ymm8, &ymm9, &ymm10, &ymm11, + &ymm12, &ymm13, &ymm14, &ymm15}; + + pxAssert(id < iREGCNT_XMM); + return *m_tbl_ymmRegs[id]; + } + + const xRegisterSSE& xRegisterSSE::GetArgRegister(uint arg_number, uint sse_number, bool ymm) + { +#ifdef _WIN32 + // Windows passes arguments according to their position from the left. + return ymm ? GetYMMInstance(arg_number) : GetInstance(arg_number); +#else + // Linux counts the number of vector parameters. + return ymm ? GetYMMInstance(sse_number) : GetInstance(sse_number); +#endif + } + + const xAddressReg& xAddressReg::GetArgRegister(uint arg_number, uint gpr_number) + { +#ifdef _WIN32 + // Windows passes arguments according to their position from the left. + static constexpr const xAddressReg* regs[] = {&rcx, &rdx, &r8, &r9}; + pxAssert(arg_number < std::size(regs)); + return *regs[arg_number]; +#else + // Linux counts the number of GPR parameters. + static constexpr const xAddressReg* regs[] = {&rdi, &rsi, &rdx, &rcx}; + pxAssert(gpr_number < std::size(regs)); + return *regs[gpr_number]; +#endif + } + // -------------------------------------------------------------------------------------- // xAddressVoid // -------------------------------------------------------------------------------------- @@ -745,7 +845,7 @@ extern const xRegister32 bool IsMem() const { return true; } bool IsReg() const { return false; } bool IsExtended() const { return false; } // Non sense but ease template - bool IsWide() const { return GetOperandSize() == 8; } + bool IsWide() const { return _operandSize == 8; } operator xAddressVoid() { @@ -949,3 +1049,4 @@ extern const xRegister32 #include "implement/jmpcall.h" #include "implement/bmi.h" +#include "implement/avx.h" \ No newline at end of file diff --git a/common/vsprops/BaseProjectConfig.props b/common/vsprops/BaseProjectConfig.props index 22e9d1ce3e..2a60f774d8 100644 --- a/common/vsprops/BaseProjectConfig.props +++ b/common/vsprops/BaseProjectConfig.props @@ -14,4 +14,10 @@ x64 + + + + true + true + \ No newline at end of file diff --git a/common/vsprops/CodeGen_Release.props b/common/vsprops/CodeGen_Release.props index 56a7d6944e..876c8d1c41 100644 --- a/common/vsprops/CodeGen_Release.props +++ b/common/vsprops/CodeGen_Release.props @@ -18,7 +18,6 @@ true MultiThreadedDLL false - false true diff --git a/common/vsprops/QtCompile.props b/common/vsprops/QtCompile.props index 8bd8b78b64..dea9058f8f 100644 --- a/common/vsprops/QtCompile.props +++ b/common/vsprops/QtCompile.props @@ -2,11 +2,11 @@ $(SolutionDir)bin\ - $(SolutionDir)3rdparty\qt\6.3.0\msvc2019_64\ - $(SolutionDir)3rdparty\qt\6.3.0\msvc2019_arm64\ + $(SolutionDir)3rdparty\qt\6.4.0\msvc2022_64\ + $(SolutionDir)3rdparty\qt\6.4.0\msvc2022_arm64\ $(PCSX2QTDIRDefault) $(PCSX2QTDIR)\ - $(SolutionDir)3rdparty\qt\6.3.0\msvc2019_64\ + $(SolutionDir)3rdparty\qt\6.4.0\msvc2022_64\ false true $(PCSX2QTDIR)include\ @@ -32,7 +32,7 @@ $(QtLibDir);%(AdditionalLibraryDirectories) - Qt6Core$(QtLibSuffix).lib;Qt6Gui$(QtLibSuffix).lib;Qt6Widgets$(QtLibSuffix).lib;Qt6Network$(QtLibSuffix).lib;%(AdditionalDependencies) + Qt6Core$(QtLibSuffix).lib;Qt6Gui$(QtLibSuffix).lib;Qt6Widgets$(QtLibSuffix).lib;Qt6Network$(QtLibSuffix).lib;Qt6Concurrent$(QtLibSuffix).lib;%(AdditionalDependencies) @@ -118,7 +118,7 @@ - + diff --git a/common/vsprops/preBuild.cmd b/common/vsprops/preBuild.cmd index 2914988e63..ac77047640 100644 --- a/common/vsprops/preBuild.cmd +++ b/common/vsprops/preBuild.cmd @@ -6,7 +6,7 @@ :: The git.exe program is part of the msysgit installation. :: :: MsysGit can be downloaded from http://msysgit.github.io/ -:: +:: :: Usage: preBuild.cmd ProjectSrcDir VspropsDir :: :: ProjectSrcDir - $(ProjectDir)\.. - Top-level Directory of project source code. diff --git a/common/vsprops/readme.txt b/common/vsprops/readme.txt index ae1e1b0ed7..520b5f8d42 100644 --- a/common/vsprops/readme.txt +++ b/common/vsprops/readme.txt @@ -5,10 +5,10 @@ Decriptions of Provided .vsprops Sheets * plugin_svnroot - Provides a set of semi-standard user macros for plugins that conform to an expected folder layout. Each user macro can be optionally overridden by the plugin using its own property sheet, if needed. - + See the contents of plugin_svnroot for explanations of the User Macros used by all other properties sheets lested below. - + * 3rdPartyDeps - Adds the /deps folder to the linker search path. Does not add any actual dependencies. You must add those manually. @@ -20,11 +20,10 @@ Decriptions of Provided .vsprops Sheets struct alignment, and other settings required for Pcsx2 and its libs to link in a workable fashion. Adds standard preprocessor defines for: __WIN32__;WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE - + * IncrementalLinking - Enables incremental linking, for use in devel/debug modes only. Incremental linking force-disables Whole Program Optimization, but builds the result .exe/.dll much quicker usually. * GlobalLinking - Enables full support for Whole Program Optimization, and force- disables any conflicting incremental link settings. - \ No newline at end of file diff --git a/linux_various/PCSX2-linux.sh b/linux_various/PCSX2-linux.sh index 874a8e6e51..174dad8144 100755 --- a/linux_various/PCSX2-linux.sh +++ b/linux_various/PCSX2-linux.sh @@ -51,7 +51,7 @@ then return 1 # warning exit will kill current terminal fi -# Allow to ship .so library with the build to avoid version issue +# Allow to ship .so library with the build to avoid version issue MY_LD_LIBRARY_PATH=${MY_LD_LIBRARY_PATH:+$MY_LD_LIBRARY_PATH:}$DIR/3rdPartyLibs # openSUSE don't follow FHS !!!! diff --git a/linux_various/check_po_quality.pl b/linux_various/check_po_quality.pl index fbbe5fa701..9d99534cb0 100755 --- a/linux_various/check_po_quality.pl +++ b/linux_various/check_po_quality.pl @@ -75,7 +75,7 @@ sub check_c_format { if ($line =~ /^#:\s*(.*)/) { my $old_index = $index; $index = $1; # help for debug - + if (scalar(@c_symbol) > 0 and not $is_empty) { print "$old_index\n"; print "Error: translation miss some c format\n"; diff --git a/linux_various/hex2h.pl b/linux_various/hex2h.pl index 2ba600b151..2b9fe6ddca 100755 --- a/linux_various/hex2h.pl +++ b/linux_various/hex2h.pl @@ -14,7 +14,7 @@ # You should have received a copy of the GNU General Public License along with PCSX2. # If not, see . -# This basic script convert an jpeg/png image to a .h include file +# This basic script convert an jpeg/png image to a .h include file # compatible with PCSX2 gui use File::Basename; diff --git a/linux_various/validate_glsl.sh b/linux_various/validate_glsl.sh deleted file mode 100755 index 86422ef9d5..0000000000 --- a/linux_various/validate_glsl.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/sh -# copyright (c) 2011 Gregory Hainaut -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This package is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . - -INPUT=0 -MACRO="" -ENTRY="-noentry" -TEST=/tmp/test.glsl -GL_VERSION=330 -NOFRAG=0 -NOVERT=0 -# VERT="cgc -oglsl -profile glslv -po version=$GL_VERSION" -# FRAG="cgc -oglsl -profile glslf -po version=$GL_VERSION" -# Uniform buffer not supported on glsl ... -#VERT="cgc -oglsl -profile vp40" -#FRAG="cgc -oglsl -profile fp40" -VERT="cgc -oglsl -profile gp5vp" -FRAG="cgc -oglsl -profile gp5fp" - -###################################################### -# Options -###################################################### -help() -{ - cat < : input glsl file (mandatory) - --macro : set a macro. Can be repeated - --entry : set an entry point. Note: print the ASM output of the program - --test_gs : test of gs glsl file - --nofrag : disable fragment processing - --novert : disable vertex processing -EOF - exit -} - -while [ -n "$1" ]; do -case $1 in - --help|--h) help;shift 1;; - --input|--i) INPUT=$2; shift 2;; - --macro|--m) MACRO="${MACRO}#define $2 $3\n"; shift 3;; - --entry|--e) ENTRY="-entry $2";shift 2;; - --test_gs ) TEST_GS=1; shift 1;; - --nofrag) NOFRAG=1; shift 1;; - --novert) NOVERT=1; shift 1;; - - --*) echo "ERROR: $1 option does not exists. Use -h for help";exit 1;; - *) break;; -esac -done - -if [ "$INPUT" = "0" ] ; then - help -fi - -###################################################### -# Functions -###################################################### -head() -{ - \rm -f $TEST - touch $TEST - echo "#version $GL_VERSION" >> $TEST -} - -tail() -{ - cat $INPUT >> $TEST - # Some layout syntax (420) are not supported - # so I remove them (a bit overkill) - #sed -i -e 's/layout(.*)//' $TEST - sed -i -e 's/layout(binding.*)//' $TEST - sed -i -e 's/layout(location.*)//' $TEST - sed -i -e 's/, binding.*)/)/' $TEST -} - -vertex_test() -{ - head - echo "#define VERTEX_SHADER 1" >> $TEST - echo -e $MACRO >> $TEST - tail - - echo "Vertex check with macro : $MACRO" - $VERT $ENTRY $TEST - echo "" -} - -fragment_test() -{ - head - echo "#define FRAGMENT_SHADER 1" >> $TEST - echo -e "$MACRO" >> $TEST - echo "Fragment check with macro : " - echo -e "$MACRO" - - tail - $FRAG $ENTRY $TEST - echo "" -} - -###################################################### -# Main -###################################################### - -if [ "$TEST_GS" = '1' ] ; then - echo "not yet implemented" - # A very big shader example (124 instructions!) - ./validate_glsl.sh --input $INPUT --novert --entry ps_main --macro PS_TCC 0 --macro PS_TFX 0 --macro PS_IIP 1 --macro PS_ATST 4 --macro PS_FST 1 --macro PS_BLEND 4 --macro PS_COLCLIP 3 --macro PS_SHUFFLE 1 --macro PS_LTF 1 --macro PS_FMT 6 --macro PS_AEM 0 --macro PS_FBMASK 1 --macro PS_FOG 1 --macro PS_WMS 2 --macro PS_WMT 3 - - # TODO - # Maybe it would be nice to make several loop to iterate on various option and to monitor the impact on the instruction number - -else - if [ "$NOVERT" = '0' ] ; then vertex_test; fi - if [ "$NOFRAG" = '0' ] ; then fragment_test; fi -fi diff --git a/mscompile.cmd b/mscompile.cmd deleted file mode 100644 index 84ca7654b2..0000000000 --- a/mscompile.cmd +++ /dev/null @@ -1,64 +0,0 @@ -@ECHO OFF -REM PCSX2 - PS2 Emulator for PCs -REM Copyright (C) 2002-2015 PCSX2 Dev Team -REM -REM PCSX2 is free software: you can redistribute it and/or modify it under the terms -REM of the GNU Lesser General Public License as published by the Free Software Found- -REM ation, either version 3 of the License, or (at your option) any later version. -REM -REM PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -REM without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -REM PURPOSE. See the GNU General Public License for more details. -REM -REM You should have received a copy of the GNU General Public License along with PCSX2. -REM If not, see . - -CLS -ECHO Select your Visual Studio version: -ECHO 1. Microsoft Visual Studio 2019 -ECHO Q. Exit the script. -CHOICE /C 1Q /T 10 /D 1 /M "Visual Studio version: " -IF ERRORLEVEL 2 GOTO END -IF ERRORLEVEL 1 SET "VCVARPATH=%VS160COMNTOOLS%..\..\VC\Auxiliary\Build\vcvarsall.bat" - -ECHO. -ECHO Select the desired configuration: -ECHO 1. Release 32bit (default) -ECHO 2. Devel 32bit -ECHO 3. Debug 32bit -ECHO 4. Release 64bit (WIP) -ECHO 5. Devel 64bit (WIP) -ECHO 6. Debug 64bit (WIP) -ECHO Q. Exit the script. -CHOICE /C 123456Q /T 10 /D 1 /M "Configuration: " -IF ERRORLEVEL 7 GOTO END -IF ERRORLEVEL 6 SET "SELARCH=x64" && SET "SELCONF=DebugAll" -IF ERRORLEVEL 5 SET "SELARCH=x64" && SET "SELCONF=DevelAll" -IF ERRORLEVEL 4 SET "SELARCH=x64" && SET "SELCONF=ReleaseAll" -IF ERRORLEVEL 3 SET "SELARCH=x86" && SET "SELCONF=DebugAll" -IF ERRORLEVEL 2 SET "SELARCH=x86" && SET "SELCONF=DevelAll" -IF ERRORLEVEL 1 SET "SELARCH=x86" && SET "SELCONF=ReleaseAll" - -IF EXIST "%VCVARPATH%" (call "%VCVARPATH%" %SELARCH%) ELSE GOTO ERRORVS -cl > NUL 2>&1 -if %ERRORLEVEL% NEQ 0 GOTO ERRORVS - -ECHO. -ECHO Using: -cl 2>&1 | findstr "Version" -ECHO. - -SET Platform= -SET "LOGOPTIONS=/v:m /fl1 /fl2 /flp1:logfile="%~dpn0-%SELARCH%-%SELCONF%-errors.log";errorsonly /flp2:logfile="%~dpn0-%SELARCH%-%SELCONF%-warnings.log";warningsonly" -msbuild "%~dp0\buildbot.xml" /m %LOGOPTIONS% /t:%SELCONF% -GOTO END - -:ERRORVS -ECHO. -ECHO The selected Visual Studio version was not found. - -:END -ECHO. -ECHO Bye! -ECHO. -timeout /t 10 diff --git a/pcsx2-gsrunner/CMakeLists.txt b/pcsx2-gsrunner/CMakeLists.txt new file mode 100644 index 0000000000..d2746009f3 --- /dev/null +++ b/pcsx2-gsrunner/CMakeLists.txt @@ -0,0 +1,21 @@ +add_executable(pcsx2-gsrunnner) + +if (PACKAGE_MODE) + install(TARGETS pcsx2-gsrunnner DESTINATION ${CMAKE_INSTALL_BINDIR}) +else() + install(TARGETS pcsx2-gsrunnner DESTINATION ${CMAKE_SOURCE_DIR}/bin) +endif() + +target_sources(pcsx2-gsrunner PRIVATE + Main.cpp +) + +target_include_directories(pcsx2-gsrunner PRIVATE + "${CMAKE_BINARY_DIR}/common/include" + "${CMAKE_SOURCE_DIR}/pcsx2" +) + +target_link_libraries(pcsx2-gsrunner PRIVATE + PCSX2_FLAGS + PCSX2 +) diff --git a/pcsx2-gsrunner/Main.cpp b/pcsx2-gsrunner/Main.cpp new file mode 100644 index 0000000000..3317927ef4 --- /dev/null +++ b/pcsx2-gsrunner/Main.cpp @@ -0,0 +1,776 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include "common/RedtapeWindows.h" +#endif + +#include "fmt/core.h" + +#include "common/Assertions.h" +#include "common/Console.h" +#include "common/Exceptions.h" +#include "common/FileSystem.h" +#include "common/MemorySettingsInterface.h" +#include "common/Path.h" +#include "common/SettingsWrapper.h" +#include "common/StringUtil.h" + +#include "pcsx2/PrecompiledHeader.h" + +#include "pcsx2/CDVD/CDVD.h" +#include "pcsx2/Frontend/CommonHost.h" +#include "pcsx2/Frontend/InputManager.h" +#include "pcsx2/Frontend/ImGuiManager.h" +#include "pcsx2/Frontend/LogSink.h" +#include "pcsx2/GS.h" +#include "pcsx2/GS/GS.h" +#include "pcsx2/GSDumpReplayer.h" +#include "pcsx2/HostDisplay.h" +#include "pcsx2/HostSettings.h" +#include "pcsx2/INISettingsInterface.h" +#include "pcsx2/PerformanceMetrics.h" +#include "pcsx2/VMManager.h" + +#ifdef ENABLE_ACHIEVEMENTS +#include "pcsx2/Frontend/Achievements.h" +#endif + +#include "svnrev.h" + +namespace GSRunner +{ + static bool InitializeConfig(); + static bool SetCriticalFolders(); + + static bool CreatePlatformWindow(); + static void DestroyPlatformWindow(); + static std::optional GetPlatformWindowInfo(); + static void PumpPlatformMessages(); +} // namespace GSRunner + +static constexpr u32 WINDOW_WIDTH = 640; +static constexpr u32 WINDOW_HEIGHT = 480; + +static MemorySettingsInterface s_settings_interface; +alignas(16) static SysMtgsThread s_mtgs_thread; + +static std::string s_output_prefix; +static s32 s_loop_count = 1; +static std::optional s_use_window; + +bool GSRunner::SetCriticalFolders() +{ + EmuFolders::AppRoot = Path::Canonicalize(Path::GetDirectory(FileSystem::GetProgramPath())); + EmuFolders::Resources = Path::Combine(EmuFolders::AppRoot, "resources"); + EmuFolders::DataRoot = EmuFolders::AppRoot; + + // allow SetDataDirectory() to change settings directory (if we want to split config later on) + if (EmuFolders::Settings.empty()) + EmuFolders::Settings = Path::Combine(EmuFolders::DataRoot, "inis"); + + // the resources directory should exist, bail out if not + if (!FileSystem::DirectoryExists(EmuFolders::Resources.c_str())) + { + Console.Error("Resources directory is missing, your installation is incomplete."); + return false; + } + + return true; +} + +bool GSRunner::InitializeConfig() +{ + if (!CommonHost::InitializeCriticalFolders()) + return false; + + // don't provide an ini path, or bother loading. we'll store everything in memory. + MemorySettingsInterface& si = s_settings_interface; + Host::Internal::SetBaseSettingsLayer(&si); + + CommonHost::SetDefaultSettings(si, true, true, true, true, true); + + // complete as quickly as possible + si.SetBoolValue("EmuCore/GS", "FrameLimitEnable", false); + si.SetIntValue("EmuCore/GS", "VsyncEnable", static_cast(VsyncMode::Off)); + + // ensure all input sources are disabled, we're not using them + si.SetBoolValue("InputSources", "SDL", false); + si.SetBoolValue("InputSources", "XInput", false); + + // we don't need any sound output + si.SetStringValue("SPU2/Output", "OutputModule", "nullout"); + + // force logging + si.SetBoolValue("Logging", "EnableSystemConsole", true); + si.SetBoolValue("Logging", "EnableTimestamps", true); + si.SetBoolValue("Logging", "EnableVerbose", true); + + // and show some stats :) + si.SetBoolValue("EmuCore/GS", "OsdShowFPS", true); + si.SetBoolValue("EmuCore/GS", "OsdShowResolution", true); + si.SetBoolValue("EmuCore/GS", "OsdShowGSStats", true); + + // remove memory cards, so we don't have sharing violations + for (u32 i = 0; i < 2; i++) + { + si.SetBoolValue("MemoryCards", fmt::format("Slot{}_Enable", i + 1).c_str(), false); + si.SetStringValue("MemoryCards", fmt::format("Slot{}_Filename", i + 1).c_str(), ""); + } + + CommonHost::LoadStartupSettings(); + return true; +} + +void Host::CommitBaseSettingChanges() +{ + // nothing to save, we're all in memory +} + +void Host::LoadSettings(SettingsInterface& si, std::unique_lock& lock) +{ + CommonHost::LoadSettings(si, lock); +} + +void Host::CheckForSettingsChanges(const Pcsx2Config& old_config) +{ + CommonHost::CheckForSettingsChanges(old_config); +} + +bool Host::RequestResetSettings(bool folders, bool core, bool controllers, bool hotkeys, bool ui) +{ + // not running any UI, so no settings requests will come in + return false; +} + +void Host::SetDefaultUISettings(SettingsInterface& si) +{ + // nothing +} + +std::optional> Host::ReadResourceFile(const char* filename) +{ + const std::string path(Path::Combine(EmuFolders::Resources, filename)); + std::optional> ret(FileSystem::ReadBinaryFile(path.c_str())); + if (!ret.has_value()) + Console.Error("Failed to read resource file '%s'", filename); + return ret; +} + +std::optional Host::ReadResourceFileToString(const char* filename) +{ + const std::string path(Path::Combine(EmuFolders::Resources, filename)); + std::optional ret(FileSystem::ReadFileToString(path.c_str())); + if (!ret.has_value()) + Console.Error("Failed to read resource file to string '%s'", filename); + return ret; +} + +std::optional Host::GetResourceFileTimestamp(const char* filename) +{ + const std::string path(Path::Combine(EmuFolders::Resources, filename)); + FILESYSTEM_STAT_DATA sd; + if (!FileSystem::StatFile(filename, &sd)) + return std::nullopt; + + return sd.ModificationTime; +} + +void Host::ReportErrorAsync(const std::string_view& title, const std::string_view& message) +{ + if (!title.empty() && !message.empty()) + { + Console.Error( + "ReportErrorAsync: %.*s: %.*s", static_cast(title.size()), title.data(), static_cast(message.size()), message.data()); + } + else if (!message.empty()) + { + Console.Error("ReportErrorAsync: %.*s", static_cast(message.size()), message.data()); + } +} + +bool Host::ConfirmMessage(const std::string_view& title, const std::string_view& message) +{ + if (!title.empty() && !message.empty()) + { + Console.Error( + "ConfirmMessage: %.*s: %.*s", static_cast(title.size()), title.data(), static_cast(message.size()), message.data()); + } + else if (!message.empty()) + { + Console.Error("ConfirmMessage: %.*s", static_cast(message.size()), message.data()); + } + + return true; +} + +void Host::OpenURL(const std::string_view& url) +{ + // noop +} + +bool Host::CopyTextToClipboard(const std::string_view& text) +{ + return false; +} + +void Host::BeginTextInput() +{ + // noop +} + +void Host::EndTextInput() +{ + // noop +} + +std::optional Host::GetTopLevelWindowInfo() +{ + return GSRunner::GetPlatformWindowInfo(); +} + +void Host::OnInputDeviceConnected(const std::string_view& identifier, const std::string_view& device_name) +{ +} + +void Host::OnInputDeviceDisconnected(const std::string_view& identifier) +{ +} + +bool Host::AcquireHostDisplay(RenderAPI api, bool clear_state_on_fail) +{ + const std::optional wi(GSRunner::GetPlatformWindowInfo()); + if (!wi.has_value()) + return false; + + g_host_display = HostDisplay::CreateForAPI(api); + if (!g_host_display) + return false; + + if (!g_host_display->CreateDevice(wi.value()) || !g_host_display->MakeCurrent() || !g_host_display->SetupDevice() || !ImGuiManager::Initialize()) + { + ReleaseHostDisplay(clear_state_on_fail); + return false; + } + + Console.WriteLn(Color_StrongGreen, "%s Graphics Driver Info:", HostDisplay::RenderAPIToString(g_host_display->GetRenderAPI())); + Console.Indent().WriteLn(g_host_display->GetDriverInfo()); + + return g_host_display.get(); +} + +void Host::ReleaseHostDisplay(bool clear_state) +{ + ImGuiManager::Shutdown(clear_state); + g_host_display.reset(); +} + +VsyncMode Host::GetEffectiveVSyncMode() +{ + // Never vsync! We want to finish as quickly as possible. + return VsyncMode::Off; +} + +bool Host::BeginPresentFrame(bool frame_skip) +{ + if (g_host_display->BeginPresent(frame_skip)) + return true; + + // don't render imgui + ImGuiManager::NewFrame(); + return false; +} + +void Host::EndPresentFrame() +{ + if (GSDumpReplayer::IsReplayingDump()) + GSDumpReplayer::RenderUI(); + + ImGuiManager::RenderOSD(); + g_host_display->EndPresent(); + ImGuiManager::NewFrame(); +} + +void Host::ResizeHostDisplay(u32 new_window_width, u32 new_window_height, float new_window_scale) +{ +} + +void Host::UpdateHostDisplay() +{ +} + +void Host::RequestResizeHostDisplay(s32 width, s32 height) +{ +} + +void Host::OnVMStarting() +{ +} + +void Host::OnVMStarted() +{ +} + +void Host::OnVMDestroyed() +{ +} + +void Host::OnVMPaused() +{ +} + +void Host::OnVMResumed() +{ +} + +void Host::OnGameChanged(const std::string& disc_path, const std::string& game_serial, const std::string& game_name, u32 game_crc) +{ +} + +void Host::OnPerformanceMetricsUpdated() +{ +} + +void Host::OnSaveStateLoading(const std::string_view& filename) +{ +} + +void Host::OnSaveStateLoaded(const std::string_view& filename, bool was_successful) +{ +} + +void Host::OnSaveStateSaved(const std::string_view& filename) +{ +} + +void Host::InvalidateSaveStateCache() +{ +} + +void Host::RunOnCPUThread(std::function function, bool block /* = false */) +{ + pxFailRel("Not implemented"); +} + +void Host::RefreshGameListAsync(bool invalidate_cache) +{ +} + +void Host::CancelGameListRefresh() +{ +} + +bool Host::IsFullscreen() +{ + return false; +} + +void Host::SetFullscreen(bool enabled) +{ +} + +void Host::RequestExit(bool save_state_if_running) +{ +} + +void Host::RequestVMShutdown(bool allow_confirm, bool allow_save_state, bool default_save_state) +{ + VMManager::SetState(VMState::Stopping); +} + +#ifdef ENABLE_ACHIEVEMENTS +void Host::OnAchievementsRefreshed() +{ + // noop +} +#endif + +std::optional InputManager::ConvertHostKeyboardStringToCode(const std::string_view& str) +{ + return std::nullopt; +} + +std::optional InputManager::ConvertHostKeyboardCodeToString(u32 code) +{ + return std::nullopt; +} + +SysMtgsThread& GetMTGS() +{ + return s_mtgs_thread; +} + +////////////////////////////////////////////////////////////////////////// +// Interface Stuff +////////////////////////////////////////////////////////////////////////// + +const IConsoleWriter* PatchesCon = &Console; +BEGIN_HOTKEY_LIST(g_host_hotkeys) +END_HOTKEY_LIST() + +static void PrintCommandLineVersion() +{ + std::fprintf(stderr, "PCSX2 GS Runner Version %s\n", GIT_REV); + std::fprintf(stderr, "https://pcsx2.net/\n"); + std::fprintf(stderr, "\n"); +} + +static void PrintCommandLineHelp(const char* progname) +{ + PrintCommandLineVersion(); + std::fprintf(stderr, "Usage: %s [parameters] [--] [filename]\n", progname); + std::fprintf(stderr, "\n"); + std::fprintf(stderr, " -help: Displays this information and exits.\n"); + std::fprintf(stderr, " -version: Displays version information and exits.\n"); + std::fprintf(stderr, " -dumpdir : Frame dump directory (will be dumped as filename_frameN.png).\n"); + std::fprintf(stderr, " -loop : Loops dump playback N times. Defaults to 1. 0 will loop infinitely.\n"); + std::fprintf(stderr, " -renderer : Sets the graphics renderer. Defaults to Auto.\n"); + std::fprintf(stderr, " -window: Forces a window to be displayed.\n"); + std::fprintf(stderr, " -surfaceless: Disables showing a window.\n"); + std::fprintf(stderr, " -logfile : Writes emu log to filename.\n"); + std::fprintf(stderr, " -noshadercache: Disables the shader cache (useful for parallel runs).\n"); + std::fprintf(stderr, " --: Signals that no more arguments will follow and the remaining\n" + " parameters make up the filename. Use when the filename contains\n" + " spaces or starts with a dash.\n"); + std::fprintf(stderr, "\n"); +} + +static bool ParseCommandLineArgs(int argc, char* argv[], VMBootParameters& params) +{ + bool no_more_args = false; + for (int i = 1; i < argc; i++) + { + if (!no_more_args) + { +#define CHECK_ARG(str) !std::strcmp(argv[i], str) +#define CHECK_ARG_PARAM(str) (!std::strcmp(argv[i], str) && ((i + 1) < argc)) + + if (CHECK_ARG("-help")) + { + PrintCommandLineHelp(argv[0]); + return false; + } + else if (CHECK_ARG("-version")) + { + PrintCommandLineVersion(); + return false; + } + else if (CHECK_ARG_PARAM("-dumpdir")) + { + s_output_prefix = StringUtil::StripWhitespace(argv[++i]); + if (s_output_prefix.empty()) + { + Console.Error("Invalid dump directory specified."); + return false; + } + + if (!FileSystem::DirectoryExists(s_output_prefix.c_str()) && !FileSystem::CreateDirectoryPath(s_output_prefix.c_str(), false)) + { + Console.Error("Failed to create output directory"); + return false; + } + + continue; + } + else if (CHECK_ARG_PARAM("-loop")) + { + s_loop_count = StringUtil::FromChars(argv[++i]).value_or(0); + Console.WriteLn("Looping dump playback %d times.", s_loop_count); + continue; + } + else if (CHECK_ARG_PARAM("-renderer")) + { + const char* rname = argv[++i]; + + GSRendererType type = GSRendererType::Auto; + if (StringUtil::Strcasecmp(rname, "Auto") == 0) + type = GSRendererType::Auto; +#ifdef _WIN32 + else if (StringUtil::Strcasecmp(rname, "dx11") == 0) + type = GSRendererType::DX11; + else if (StringUtil::Strcasecmp(rname, "dx12") == 0) + type = GSRendererType::DX12; +#endif +#ifdef ENABLE_OPENGL + else if (StringUtil::Strcasecmp(rname, "gl") == 0) + type = GSRendererType::OGL; +#endif +#ifdef ENABLE_VULKAN + else if (StringUtil::Strcasecmp(rname, "vulkan") == 0) + type = GSRendererType::VK; +#endif +#ifdef __APPLE__ + else if (StringUtil::Strcasecmp(rname, "metal") == 0) + type = GSRendererType::Metal; +#endif + else if (StringUtil::Strcasecmp(rname, "sw") == 0) + type = GSRendererType::SW; + else + { + Console.Error("Unknown renderer '%s'", rname); + return false; + } + + Console.WriteLn("Using %s renderer.", Pcsx2Config::GSOptions::GetRendererName(type)); + s_settings_interface.SetIntValue("EmuCore/GS", "Renderer", static_cast(type)); + continue; + } + else if (CHECK_ARG_PARAM("-logfile")) + { + const char* logfile = argv[++i]; + if (std::strlen(logfile) > 0) + { + // disable timestamps, since we want to be able to diff the logs + Console.WriteLn("Logging to %s...", logfile); + CommonHost::SetFileLogPath(logfile); + s_settings_interface.SetBoolValue("Logging", "EnableFileLogging", true); + s_settings_interface.SetBoolValue("Logging", "EnableTimestamps", false); + } + + continue; + } + else if (CHECK_ARG("-noshadercache")) + { + Console.WriteLn("Disabling shader cache"); + s_settings_interface.SetBoolValue("EmuCore/GS", "disable_shader_cache", false); + continue; + } + else if (CHECK_ARG("-window")) + { + Console.WriteLn("Creating window"); + s_use_window = true; + continue; + } + else if (CHECK_ARG("-surfaceless")) + { + Console.WriteLn("Running surfaceless"); + s_use_window = false; + continue; + } + else if (CHECK_ARG("--")) + { + no_more_args = true; + continue; + } + else if (argv[i][0] == '-') + { + Console.Error("Unknown parameter: '%s'", argv[i]); + return false; + } + +#undef CHECK_ARG +#undef CHECK_ARG_PARAM + } + + if (!params.filename.empty()) + params.filename += ' '; + params.filename += argv[i]; + } + + if (params.filename.empty()) + { + Console.Error("No dump filename provided."); + return false; + } + + if (!VMManager::IsGSDumpFileName(params.filename)) + { + Console.Error("Provided filename is not a GS dump."); + return false; + } + + // set up the frame dump directory + if (!s_output_prefix.empty()) + { + // strip off all extensions + std::string_view title(Path::GetFileTitle(params.filename)); + if (StringUtil::EndsWithNoCase(title, ".gs")) + title = Path::GetFileTitle(title); + + s_output_prefix = Path::Combine(s_output_prefix, StringUtil::StripWhitespace(title)); + Console.WriteLn(fmt::format("Saving dumps as {}_frameN.png", s_output_prefix)); + } + + return true; +} + +int main(int argc, char* argv[]) +{ + CommonHost::InitializeEarlyConsole(); + + if (!GSRunner::InitializeConfig()) + { + Console.Error("Failed to initialize config."); + return false; + } + + VMBootParameters params; + if (!ParseCommandLineArgs(argc, argv, params)) + return false; + + PerformanceMetrics::SetCPUThread(Threading::ThreadHandle::GetForCallingThread()); + if (!VMManager::Internal::InitializeGlobals() || !VMManager::Internal::InitializeMemory()) + { + Console.Error("Failed to allocate globals/memory."); + return false; + } + + if (s_use_window.value_or(false) && !GSRunner::CreatePlatformWindow()) + { + Console.Error("Failed to create window."); + return false; + } + + // apply new settings (e.g. pick up renderer change) + VMManager::ApplySettings(); + + if (VMManager::Initialize(params)) + { + // run until end + GSDumpReplayer::SetLoopCount(s_loop_count); + VMManager::SetState(VMState::Running); + while (VMManager::GetState() == VMState::Running) + VMManager::Execute(); + VMManager::Shutdown(false); + } + + InputManager::CloseSources(); + VMManager::Internal::ReleaseMemory(); + PerformanceMetrics::SetCPUThread(Threading::ThreadHandle()); + GSRunner::DestroyPlatformWindow(); + + return EXIT_SUCCESS; +} + +void Host::CPUThreadVSync() +{ + if (!s_output_prefix.empty()) + { + // wait for the previous frame to complete (and thus dump) + GetMTGS().WaitGS(false, false, false); + + // queue dumping of this frame + std::string dump_path(fmt::format("{}_frame{}.png", s_output_prefix, GSDumpReplayer::GetFrameNumber())); + GetMTGS().RunOnGSThread([dump_path = std::move(dump_path)]() { GSQueueSnapshot(dump_path); }); + } + + // process any window messages (but we shouldn't really have any) + GSRunner::PumpPlatformMessages(); +} + +////////////////////////////////////////////////////////////////////////// +// Platform specific code +////////////////////////////////////////////////////////////////////////// + +#ifdef _WIN32 + +static constexpr LPCWSTR WINDOW_CLASS_NAME = L"PCSX2GSRunner"; +static HWND s_hwnd = NULL; + +static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + +bool GSRunner::CreatePlatformWindow() +{ + WNDCLASSEXW wc = {}; + wc.cbSize = sizeof(WNDCLASSEXW); + wc.style = 0; + wc.lpfnWndProc = WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = GetModuleHandle(nullptr); + wc.hIcon = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wc.lpszMenuName = NULL; + wc.lpszClassName = WINDOW_CLASS_NAME; + wc.hIconSm = NULL; + + if (!RegisterClassExW(&wc)) + { + Console.Error("Window registration failed."); + return false; + } + + s_hwnd = CreateWindowExW(WS_EX_CLIENTEDGE, WINDOW_CLASS_NAME, L"PCSX2 GS Runner", + WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, + WINDOW_HEIGHT, nullptr, nullptr, GetModuleHandleW(nullptr), nullptr); + if (!s_hwnd) + { + Console.Error("CreateWindowEx failed."); + return false; + } + + ShowWindow(s_hwnd, SW_SHOW); + UpdateWindow(s_hwnd); + + // make sure all messages are processed before returning + PumpPlatformMessages(); + return true; +} + +void GSRunner::DestroyPlatformWindow() +{ + if (!s_hwnd) + return; + + PumpPlatformMessages(); + DestroyWindow(s_hwnd); + s_hwnd = {}; +} + +std::optional GSRunner::GetPlatformWindowInfo() +{ + WindowInfo wi; + + if (s_hwnd) + { + RECT rc = {}; + GetWindowRect(s_hwnd, &rc); + wi.surface_width = static_cast(rc.right - rc.left); + wi.surface_height = static_cast(rc.bottom - rc.top); + wi.surface_scale = 1.0f; + wi.type = WindowInfo::Type::Win32; + wi.window_handle = s_hwnd; + } + else + { + wi.type = WindowInfo::Type::Surfaceless; + } + + return wi; +} + +void GSRunner::PumpPlatformMessages() +{ + MSG msg; + while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } +} + +LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + return DefWindowProcW(hwnd, msg, wParam, lParam); +} + +#endif // _WIN32 \ No newline at end of file diff --git a/pcsx2-gsrunner/pcsx2-gsrunner.vcxproj b/pcsx2-gsrunner/pcsx2-gsrunner.vcxproj new file mode 100644 index 0000000000..3d70501906 --- /dev/null +++ b/pcsx2-gsrunner/pcsx2-gsrunner.vcxproj @@ -0,0 +1,123 @@ + + + + + + + {BB98BF81-A132-444A-BB81-96D510F433A8} + + + + Application + Unicode + $(DefaultPlatformToolset) + true + true + false + + + + + + + + + + + + + + + AllRules.ruleset + $(EXEString) + + + + $(SolutionDir)3rdparty\xbyak;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\freetype\include;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\xz\xz\src\liblzma\api;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\baseclasses;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\zlib;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\libpng;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\glad\include;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\simpleini\include;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\rapidyaml\rapidyaml\ext\c4core\src\c4\ext\fast_float\include;%(AdditionalIncludeDirectories); + $(ProjectDir);$(SolutionDir)pcsx2;%(AdditionalIncludeDirectories) + + %(AdditionalIncludeDirectories);$(ProjectDir)\Settings;$(ProjectDir)\GameList + Async + NotUsing + NoExtensions + WIN32_LEAN_AND_MEAN;LZMA_API_STATIC;BUILD_DX=1;ENABLE_RAINTEGRATION;ENABLE_ACHIEVEMENTS;ENABLE_DISCORD_PRESENCE;ENABLE_OPENGL;ENABLE_VULKAN;DIRECTINPUT_VERSION=0x0800;PCSX2_CORE;%(PreprocessorDefinitions) + PCSX2_DEBUG;PCSX2_DEVBUILD;_SECURE_SCL_=1;%(PreprocessorDefinitions) + PCSX2_DEVEL;PCSX2_DEVBUILD;NDEBUG;_SECURE_SCL_=1;%(PreprocessorDefinitions) + NDEBUG;_SECURE_SCL_=0;%(PreprocessorDefinitions) + PCSX2_CI;%(PreprocessorDefinitions) + _M_SSE=0x401;%(PreprocessorDefinitions) + _M_SSE=0x501;%(PreprocessorDefinitions) + NotSet + AdvancedVectorExtensions2 + false + $(IntDir)%(RelativeDir) + + + Precise + true + true + /Zc:__cplusplus /Zo /utf-8%(AdditionalOptions) + + + Console + Yes + comctl32.lib;ws2_32.lib;shlwapi.lib;winmm.lib;rpcrt4.lib;iphlpapi.lib;dsound.lib;%(AdditionalDependencies) + dxguid.lib;dinput8.lib;hid.lib;PowrProf.lib;d3dcompiler.lib;d3d11.lib;dxgi.lib;strmiids.lib;opengl32.lib;comsuppw.lib;OneCore.lib;%(AdditionalDependencies) + + + + + {27f17499-a372-4408-8afa-4f9f4584fbd3} + + + {449ad25e-424a-4714-babc-68706cdcc33b} + + + {bc236261-77e8-4567-8d09-45cd02965eb6} + + + {d6973076-9317-4ef2-a0b8-b7a18ac0713e} + + + {e9b51944-7e6d-4bcd-83f2-7bbd5a46182d} + + + {12728250-16ec-4dc6-94d7-e21dd88947f8} + + + {a0d2b3ad-1f72-4ee3-8b5c-f2c358da35f0} + + + {2f6c0388-20cb-4242-9f6c-a6ebb6a83f47} + false + + + {ed2f21fd-0a36-4a8f-9b90-e7d92a2acb63} + + + {88fb34ec-845e-4f21-a552-f1573b9ed167} + + + {4639972e-424e-4e13-8b07-ca403c481346} + + + {6c7986c4-3e4d-4dcc-b3c6-6bb12b238995} + + + {c0293b32-5acf-40f0-aa6c-e6da6f3bf33a} + + + + + + + + \ No newline at end of file diff --git a/pcsx2-gsrunner/pcsx2-gsrunner.vcxproj.filters b/pcsx2-gsrunner/pcsx2-gsrunner.vcxproj.filters new file mode 100644 index 0000000000..74ee8d56cb --- /dev/null +++ b/pcsx2-gsrunner/pcsx2-gsrunner.vcxproj.filters @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pcsx2-gsrunner/test_check_dumps.py b/pcsx2-gsrunner/test_check_dumps.py new file mode 100644 index 0000000000..5ad060b04e --- /dev/null +++ b/pcsx2-gsrunner/test_check_dumps.py @@ -0,0 +1,127 @@ +import argparse +import glob +import sys +import os +import re +import hashlib + +from pathlib import Path + + +FILE_HEADER = """ + + + +Comparison + + +""" + +FILE_FOOTER = """ + + +""" + +outfile = None +def write(line): + outfile.write(line + "\n") + + +def compare_frames(path1, path2): + try: + with open(path1, "rb") as f: + hash1 = hashlib.md5(f.read()).digest() + with open(path2, "rb") as f: + hash2 = hashlib.md5(f.read()).digest() + + return hash1 == hash2 + except (FileNotFoundError, IOError): + return False + + +def check_regression_test(baselinedir, testdir, name): + #print("Checking '%s'..." % name) + + dir1 = os.path.join(baselinedir, name) + dir2 = os.path.join(testdir, name) + if not os.path.isdir(dir2): + #print("*** %s is missing in test set" % name) + return False + + images = glob.glob(os.path.join(dir1, "*_frame*.png")) + diff_frames = [] + first_fail = True + + for imagepath in images: + imagename = Path(imagepath).name + matches = re.match(".*_frame([0-9]+).png", imagename) + if matches is None: + continue + + framenum = int(matches[1]) + + path1 = os.path.join(dir1, imagename) + path2 = os.path.join(dir2, imagename) + if not os.path.isfile(path2): + print("--- Frame %u for %s is missing in test set" % (framenum, name)) + write("

{}

".format(name)) + write("--- Frame %u for %s is missing in test set" % (framenum, name)) + return False + + if not compare_frames(path1, path2): + diff_frames.append(framenum) + + if first_fail: + write("

{}

".format(name)) + write("") + first_fail = False + + imguri1 = Path(path1).as_uri() + imguri2 = Path(path2).as_uri() + write("" % (framenum)) + write("" % (imguri1, imguri2)) + + if len(diff_frames) > 0: + write("
Frame %d
") + write("
Difference in frames [%s] for %s
" % (",".join(map(str, diff_frames)), name)) + print("*** Difference in frames [%s] for %s" % (",".join(map(str, diff_frames)), name)) + return False + + return True + + +def check_regression_tests(baselinedir, testdir): + gamedirs = glob.glob(baselinedir + "/*", recursive=False) + + success = 0 + failure = 0 + + for gamedir in gamedirs: + name = Path(gamedir).name + if check_regression_test(baselinedir, testdir, name): + success += 1 + else: + failure += 1 + + return (failure == 0) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Check frame dump images for regression tests") + parser.add_argument("-baselinedir", action="store", required=True, help="Directory containing baseline frames to check against") + parser.add_argument("-testdir", action="store", required=True, help="Directory containing frames to check") + parser.add_argument("outfile", action="store", help="The file to write the output to") + + args = parser.parse_args() + + outfile = open(args.outfile, "w") + write(FILE_HEADER) + + if not check_regression_tests(os.path.realpath(args.baselinedir), os.path.realpath(args.testdir)): + write(FILE_FOOTER) + outfile.close() + sys.exit(1) + else: + outfile.close() + os.remove(args.outfile) + sys.exit(0) diff --git a/pcsx2-gsrunner/test_run_dumps.py b/pcsx2-gsrunner/test_run_dumps.py new file mode 100644 index 0000000000..c843b0b90e --- /dev/null +++ b/pcsx2-gsrunner/test_run_dumps.py @@ -0,0 +1,86 @@ +import argparse +import glob +import sys +import os +import subprocess +import multiprocessing +from pathlib import Path +from functools import partial + +def is_gs_path(path): + ppath = Path(path) + for extension in [[".gs"], [".gs", ".xz"], [".gs", ".zst"]]: + if ppath.suffixes == extension: + return True + + return False + + +def run_regression_test(runner, dumpdir, renderer, parallel, gspath): + args = [runner] + gsname = Path(gspath).name + while gsname.rfind('.') >= 0: + gsname = gsname[:gsname.rfind('.')] + + real_dumpdir = os.path.join(dumpdir, gsname).strip() + if not os.path.exists(real_dumpdir): + os.mkdir(real_dumpdir) + + if renderer is not None: + args.extend(["-renderer", renderer]) + args.extend(["-dumpdir", real_dumpdir]) + args.extend(["-logfile", os.path.join(real_dumpdir, "emulog.txt")]) + + # loop a couple of times for those stubborn merge/interlace dumps that don't render anything + # the first time around + args.extend(["-loop", "2"]) + + # disable shader cache for parallel runs, otherwise it'll have sharing violations + if parallel > 1: + args.append("-noshadercache") + + args.append("--") + args.append(gspath) + + print("Running '%s'" % (" ".join(args))) + subprocess.run(args) + + +def run_regression_tests(runner, gsdir, dumpdir, renderer, parallel=1): + paths = glob.glob(gsdir + "/*.*", recursive=True) + gamepaths = list(filter(is_gs_path, paths)) + + if not os.path.isdir(dumpdir): + os.mkdir(dumpdir) + + print("Found %u GS dumps" % len(gamepaths)) + + if parallel <= 1: + for game in gamepaths: + run_regression_test(runner, dumpdir, renderer, parallel, game) + else: + print("Processing %u games on %u processors" % (len(gamepaths), parallel)) + func = partial(run_regression_test, runner, dumpdir, renderer, parallel) + pool = multiprocessing.Pool(parallel) + pool.map(func, gamepaths) + pool.close() + + + return True + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Generate frame dump images for regression tests") + parser.add_argument("-runner", action="store", required=True, help="Path to PCSX2 GS runner") + parser.add_argument("-gsdir", action="store", required=True, help="Directory containing GS dumps") + parser.add_argument("-dumpdir", action="store", required=True, help="Base directory to dump frames to") + parser.add_argument("-renderer", action="store", required=False, help="Renderer to use") + parser.add_argument("-parallel", action="store", type=int, default=1, help="Number of proceeses to run") + + args = parser.parse_args() + + if not run_regression_tests(args.runner, os.path.realpath(args.gsdir), os.path.realpath(args.dumpdir), args.renderer, args.parallel): + sys.exit(1) + else: + sys.exit(0) + diff --git a/pcsx2-qt/AboutDialog.cpp b/pcsx2-qt/AboutDialog.cpp index ffb224c32a..8e7cf67eb8 100644 --- a/pcsx2-qt/AboutDialog.cpp +++ b/pcsx2-qt/AboutDialog.cpp @@ -15,6 +15,8 @@ #include "PrecompiledHeader.h" +#include "pcsx2/SysForwardDefs.h" + #include "AboutDialog.h" #include "QtHost.h" #include "QtUtils.h" @@ -52,25 +54,25 @@ AboutDialog::~AboutDialog() = default; QString AboutDialog::getWebsiteUrl() { - return QStringLiteral("https://pcsx2.net/"); + return QString::fromUtf8(PCSX2_WEBSITE_URL); } QString AboutDialog::getSupportForumsUrl() { - return QStringLiteral("https://forums.pcsx2.net/"); + return QString::fromUtf8(PCSX2_FORUMS_URL); } QString AboutDialog::getGitHubRepositoryUrl() { - return QStringLiteral("https://github.com/PCSX2/pcsx2"); + return QString::fromUtf8(PCSX2_GITHUB_URL); } QString AboutDialog::getLicenseUrl() { - return QStringLiteral("https://github.com/PCSX2/pcsx2/blob/master/pcsx2/Docs/License.txt"); + return QString::fromUtf8(PCSX2_LICENSE_URL); } QString AboutDialog::getDiscordServerUrl() { - return QStringLiteral("https://discord.com/invite/TCz3t9k"); + return QString::fromUtf8(PCSX2_DISCORD_URL); } diff --git a/pcsx2-qt/AutoUpdaterDialog.cpp b/pcsx2-qt/AutoUpdaterDialog.cpp index cf9e39b0a3..10f1ade9ad 100644 --- a/pcsx2-qt/AutoUpdaterDialog.cpp +++ b/pcsx2-qt/AutoUpdaterDialog.cpp @@ -47,18 +47,21 @@ // Logic to detect whether we can use the auto updater. // We use tagged commit, because this gets set on nightly builds. -#if (defined(_WIN32)) && (defined(GIT_TAGGED_COMMIT) && GIT_TAGGED_COMMIT) +#if (defined(_WIN32) || defined(__linux__)) && (defined(GIT_TAGGED_COMMIT) && GIT_TAGGED_COMMIT) #define AUTO_UPDATER_SUPPORTED 1 #if defined(_WIN32) #define UPDATE_PLATFORM_STR "Windows" +#elif defined(__linux__) +#define UPDATE_PLATFORM_STR "Linux" +#endif + #if _M_SSE >= 0x500 #define UPDATE_ADDITIONAL_TAGS "AVX2" #else #define UPDATE_ADDITIONAL_TAGS "SSE4" #endif -#endif #endif @@ -94,7 +97,19 @@ AutoUpdaterDialog::~AutoUpdaterDialog() = default; bool AutoUpdaterDialog::isSupported() { #ifdef AUTO_UPDATER_SUPPORTED +#ifdef __linux__ + // For Linux, we need to check whether we're running from the appimage. + if (!std::getenv("APPIMAGE")) + { + Console.Warning("We're a tagged commit, but not running from an AppImage. Disabling automatic updater."); + return false; + } + return true; +#else + // Windows - always supported. + return true; +#endif #else return false; #endif @@ -147,6 +162,7 @@ void AutoUpdaterDialog::reportError(const char* msg, ...) va_end(ap); // don't display errors when we're doing an automatic background check, it's just annoying + Console.Error("Updater Error: %s", full_msg.c_str()); if (m_display_messages) QMessageBox::critical(this, tr("Updater Error"), QString::fromStdString(full_msg)); } @@ -315,6 +331,13 @@ void AutoUpdaterDialog::getChangesComplete(QNetworkReply* reply) QString message = commit_obj["message"].toString(); QString author = commit_obj["author"].toObject()["name"].toString(); + + if (message.contains(QStringLiteral("[SAVEVERSION+]"))) + update_will_break_save_states = true; + + if (message.contains(QStringLiteral("[SETTINGSVERSION+]"))) + update_increases_settings_version = true; + const int first_line_terminator = message.indexOf('\n'); if (first_line_terminator >= 0) message.remove(first_line_terminator, message.size() - first_line_terminator); @@ -323,12 +346,6 @@ void AutoUpdaterDialog::getChangesComplete(QNetworkReply* reply) changes_html += QStringLiteral("
  • %1 (%2)
  • ").arg(message.toHtmlEscaped()).arg(author.toHtmlEscaped()); } - - if (message.contains(QStringLiteral("[SAVEVERSION+]"))) - update_will_break_save_states = true; - - if (message.contains(QStringLiteral("[SETTINGSVERSION+]"))) - update_increases_settings_version = true; } changes_html += ""; @@ -454,7 +471,8 @@ void AutoUpdaterDialog::checkIfUpdateNeeded() void AutoUpdaterDialog::skipThisUpdateClicked() { - QtHost::SetBaseStringSettingValue("AutoUpdater", "LastVersion", m_latest_version.toUtf8().constData()); + Host::SetBaseStringSettingValue("AutoUpdater", "LastVersion", m_latest_version.toUtf8().constData()); + Host::CommitBaseSettingChanges(); done(0); } @@ -463,7 +481,7 @@ void AutoUpdaterDialog::remindMeLaterClicked() done(0); } -#ifdef _WIN32 +#if defined(_WIN32) bool AutoUpdaterDialog::processUpdate(const QByteArray& update_data) { @@ -534,6 +552,84 @@ bool AutoUpdaterDialog::doUpdate(const QString& zip_path, const QString& updater return true; } +#elif defined(__linux__) + +bool AutoUpdaterDialog::processUpdate(const QByteArray& update_data) +{ + const char* appimage_path = std::getenv("APPIMAGE"); + if (!appimage_path || !FileSystem::FileExists(appimage_path)) + { + reportError("Missing APPIMAGE."); + return false; + } + + const QString qappimage_path(QString::fromUtf8(appimage_path)); + if (!QFile::exists(qappimage_path)) + { + reportError("Current AppImage does not exist: %s", appimage_path); + return false; + } + + const QString new_appimage_path(qappimage_path + QStringLiteral(".new")); + const QString backup_appimage_path(qappimage_path + QStringLiteral(".backup")); + Console.WriteLn("APPIMAGE = %s", appimage_path); + Console.WriteLn("Backup AppImage path = %s", backup_appimage_path.toUtf8().constData()); + Console.WriteLn("New AppImage path = %s", new_appimage_path.toUtf8().constData()); + + // Remove old "new" appimage and existing backup appimage. + if (QFile::exists(new_appimage_path) && !QFile::remove(new_appimage_path)) + { + reportError("Failed to remove old destination AppImage: %s", new_appimage_path.toUtf8().constData()); + return false; + } + if (QFile::exists(backup_appimage_path) && !QFile::remove(backup_appimage_path)) + { + reportError("Failed to remove old backup AppImage: %s", new_appimage_path.toUtf8().constData()); + return false; + } + + // Write "new" appimage. + { + // We want to copy the permissions from the old appimage to the new one. + QFile old_file(qappimage_path); + const QFileDevice::Permissions old_permissions = old_file.permissions(); + QFile new_file(new_appimage_path); + if (!new_file.open(QIODevice::WriteOnly) || new_file.write(update_data) != update_data.size() || !new_file.setPermissions(old_permissions)) + { + QFile::remove(new_appimage_path); + reportError("Failed to write new destination AppImage: %s", new_appimage_path.toUtf8().constData()); + return false; + } + } + + // Rename "old" appimage. + if (!QFile::rename(qappimage_path, backup_appimage_path)) + { + reportError("Failed to rename old AppImage to %s", backup_appimage_path.toUtf8().constData()); + QFile::remove(new_appimage_path); + return false; + } + + // Rename "new" appimage. + if (!QFile::rename(new_appimage_path, qappimage_path)) + { + reportError("Failed to rename new AppImage to %s", qappimage_path.toUtf8().constData()); + return false; + } + + // Execute new appimage. + QProcess* new_process = new QProcess(); + new_process->setProgram(qappimage_path); + if (!new_process->startDetached()) + { + reportError("Failed to execute new AppImage."); + return false; + } + + // We exit once we return. + return true; +} + #else bool AutoUpdaterDialog::processUpdate(const QByteArray& update_data) diff --git a/pcsx2-qt/AutoUpdaterDialog.h b/pcsx2-qt/AutoUpdaterDialog.h index 69965935b9..afd10666a7 100644 --- a/pcsx2-qt/AutoUpdaterDialog.h +++ b/pcsx2-qt/AutoUpdaterDialog.h @@ -58,9 +58,11 @@ private: void checkIfUpdateNeeded(); QString getCurrentUpdateTag() const; -#ifdef _WIN32 +#if defined(_WIN32) bool processUpdate(const QByteArray& update_data); bool doUpdate(const QString& zip_path, const QString& updater_path, const QString& destination_path); +#elif defined(__linux__) + bool processUpdate(const QByteArray& update_data); #else bool processUpdate(const QByteArray& update_data); #endif diff --git a/pcsx2-qt/CMakeLists.txt b/pcsx2-qt/CMakeLists.txt index bc0e88d4e8..9e3c5eae20 100644 --- a/pcsx2-qt/CMakeLists.txt +++ b/pcsx2-qt/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_AUTOUIC ON) add_executable(pcsx2-qt) if (PACKAGE_MODE) - install(TARGETS pcsx2-qt DESTINATION ${CMAKE_INSTALL_BINDIR}) + message(FATAL_ERROR "Package mode is not supported for Qt builds.") else() install(TARGETS pcsx2-qt DESTINATION ${CMAKE_SOURCE_DIR}/bin) endif() @@ -17,12 +17,12 @@ target_sources(pcsx2-qt PRIVATE AutoUpdaterDialog.cpp AutoUpdaterDialog.h AutoUpdaterDialog.ui + CoverDownloadDialog.cpp + CoverDownloadDialog.h + CoverDownloadDialog.ui DisplayWidget.cpp DisplayWidget.h EarlyHardwareCheck.cpp - EmuThread.cpp - EmuThread.h - Main.cpp MainWindow.cpp MainWindow.h MainWindow.ui @@ -31,6 +31,8 @@ target_sources(pcsx2-qt PRIVATE QtHost.cpp QtHost.h QtKeyCodes.cpp + QtProgressCallback.cpp + QtProgressCallback.h QtUtils.cpp QtUtils.h SettingWidgetBinder.h @@ -41,9 +43,9 @@ target_sources(pcsx2-qt PRIVATE GameList/GameListRefreshThread.h GameList/GameListWidget.cpp GameList/GameListWidget.h - Settings/AdvancedSystemSettingsWidget.cpp - Settings/AdvancedSystemSettingsWidget.h - Settings/AdvancedSystemSettingsWidget.ui + Settings/AdvancedSettingsWidget.cpp + Settings/AdvancedSettingsWidget.h + Settings/AdvancedSettingsWidget.ui Settings/AudioSettingsWidget.cpp Settings/AudioSettingsWidget.h Settings/AudioSettingsWidget.ui @@ -57,6 +59,8 @@ target_sources(pcsx2-qt PRIVATE Settings/ControllerGlobalSettingsWidget.cpp Settings/ControllerGlobalSettingsWidget.h Settings/ControllerGlobalSettingsWidget.ui + Settings/ControllerMacroEditWidget.ui + Settings/ControllerMacroWidget.ui Settings/ControllerSettingsDialog.cpp Settings/ControllerSettingsDialog.h Settings/ControllerSettingsDialog.ui @@ -92,6 +96,11 @@ target_sources(pcsx2-qt PRIVATE Settings/InterfaceSettingsWidget.cpp Settings/InterfaceSettingsWidget.h Settings/InterfaceSettingsWidget.ui + Settings/MemoryCardConvertDialog.cpp + Settings/MemoryCardConvertDialog.h + Settings/MemoryCardConvertDialog.ui + Settings/MemoryCardConvertWorker.cpp + Settings/MemoryCardConvertWorker.h Settings/MemoryCardSettingsWidget.cpp Settings/MemoryCardSettingsWidget.h Settings/MemoryCardSettingsWidget.ui @@ -108,15 +117,26 @@ target_sources(pcsx2-qt PRIVATE Settings/SettingsDialog.cpp Settings/SettingsDialog.h Settings/SettingsDialog.ui - Settings/SystemSettingsWidget.cpp - Settings/SystemSettingsWidget.h - Settings/SystemSettingsWidget.ui Tools/InputRecording/NewInputRecordingDlg.cpp Tools/InputRecording/NewInputRecordingDlg.h Tools/InputRecording/NewInputRecordingDlg.ui + Tools/InputRecording/InputRecordingViewer.cpp + Tools/InputRecording/InputRecordingViewer.h + Tools/InputRecording/InputRecordingViewer.ui resources/resources.qrc ) +if(USE_ACHIEVEMENTS) + target_sources(pcsx2-qt PRIVATE + Settings/AchievementLoginDialog.cpp + Settings/AchievementLoginDialog.h + Settings/AchievementLoginDialog.ui + Settings/AchievementSettingsWidget.cpp + Settings/AchievementSettingsWidget.h + Settings/AchievementSettingsWidget.ui + ) +endif() + target_precompile_headers(pcsx2-qt PRIVATE PrecompiledHeader.h) target_include_directories(pcsx2-qt PRIVATE diff --git a/pcsx2-qt/CoverDownloadDialog.cpp b/pcsx2-qt/CoverDownloadDialog.cpp new file mode 100644 index 0000000000..1b7e3ecda1 --- /dev/null +++ b/pcsx2-qt/CoverDownloadDialog.cpp @@ -0,0 +1,139 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#include "common/Assertions.h" + +#include "pcsx2/Frontend/GameList.h" + +#include "CoverDownloadDialog.h" + +CoverDownloadDialog::CoverDownloadDialog(QWidget* parent /*= nullptr*/) + : QDialog(parent) +{ + m_ui.setupUi(this); + m_ui.coverIcon->setPixmap(QIcon::fromTheme("image-fill").pixmap(32)); + updateEnabled(); + + connect(m_ui.start, &QPushButton::clicked, this, &CoverDownloadDialog::onStartClicked); + connect(m_ui.close, &QPushButton::clicked, this, &CoverDownloadDialog::onCloseClicked); + connect(m_ui.urls, &QTextEdit::textChanged, this, &CoverDownloadDialog::updateEnabled); +} + +CoverDownloadDialog::~CoverDownloadDialog() +{ + pxAssert(!m_thread); +} + +void CoverDownloadDialog::closeEvent(QCloseEvent* ev) +{ + cancelThread(); +} + +void CoverDownloadDialog::onDownloadStatus(const QString& text) +{ + m_ui.status->setText(text); +} + +void CoverDownloadDialog::onDownloadProgress(int value, int range) +{ + // Limit to once every five seconds, otherwise it's way too flickery. + // Ideally in the future we'd have some way to invalidate only a single cover. + if (m_last_refresh_time.GetTimeSeconds() >= 5.0f) + { + emit coverRefreshRequested(); + m_last_refresh_time.Reset(); + } + + if (range != m_ui.progress->maximum()) + m_ui.progress->setMaximum(range); + m_ui.progress->setValue(value); +} + +void CoverDownloadDialog::onDownloadComplete() +{ + emit coverRefreshRequested(); + + if (m_thread) + { + m_thread->join(); + m_thread.reset(); + } + + updateEnabled(); + + m_ui.status->setText(tr("Download complete.")); +} + +void CoverDownloadDialog::onStartClicked() +{ + if (m_thread) + cancelThread(); + else + startThread(); +} + +void CoverDownloadDialog::onCloseClicked() +{ + if (m_thread) + cancelThread(); + + done(0); +} + +void CoverDownloadDialog::updateEnabled() +{ + const bool running = static_cast(m_thread); + m_ui.start->setText(running ? tr("Stop") : tr("Start")); + m_ui.start->setEnabled(running || !m_ui.urls->toPlainText().isEmpty()); + m_ui.close->setEnabled(!running); + m_ui.urls->setEnabled(!running); +} + +void CoverDownloadDialog::startThread() +{ + m_thread = std::make_unique(this, m_ui.urls->toPlainText(), m_ui.useSerialFileNames->isChecked()); + m_last_refresh_time.Reset(); + connect(m_thread.get(), &CoverDownloadThread::statusUpdated, this, &CoverDownloadDialog::onDownloadStatus); + connect(m_thread.get(), &CoverDownloadThread::progressUpdated, this, &CoverDownloadDialog::onDownloadProgress); + connect(m_thread.get(), &CoverDownloadThread::threadFinished, this, &CoverDownloadDialog::onDownloadComplete); + m_thread->start(); + updateEnabled(); +} + +void CoverDownloadDialog::cancelThread() +{ + if (!m_thread) + return; + + m_thread->requestInterruption(); + m_thread->join(); + m_thread.reset(); +} + +CoverDownloadDialog::CoverDownloadThread::CoverDownloadThread(QWidget* parent, const QString& urls, bool use_serials) + : QtAsyncProgressThread(parent), m_use_serials(use_serials) +{ + for (const QString& str : urls.split(QChar('\n'))) + m_urls.push_back(str.toStdString()); +} + +CoverDownloadDialog::CoverDownloadThread::~CoverDownloadThread() = default; + +void CoverDownloadDialog::CoverDownloadThread::runAsync() +{ + GameList::DownloadCovers(m_urls, m_use_serials, this); +} diff --git a/pcsx2-qt/CoverDownloadDialog.h b/pcsx2-qt/CoverDownloadDialog.h new file mode 100644 index 0000000000..2fea110f4a --- /dev/null +++ b/pcsx2-qt/CoverDownloadDialog.h @@ -0,0 +1,69 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "common/Timer.h" +#include "common/Pcsx2Defs.h" +#include "QtProgressCallback.h" +#include "ui_CoverDownloadDialog.h" +#include +#include +#include +#include + +class CoverDownloadDialog final : public QDialog +{ + Q_OBJECT + +public: + CoverDownloadDialog(QWidget* parent = nullptr); + ~CoverDownloadDialog(); + +Q_SIGNALS: + void coverRefreshRequested(); + +protected: + void closeEvent(QCloseEvent* ev); + +private Q_SLOTS: + void onDownloadStatus(const QString& text); + void onDownloadProgress(int value, int range); + void onDownloadComplete(); + void onStartClicked(); + void onCloseClicked(); + void updateEnabled(); + +private: + class CoverDownloadThread : public QtAsyncProgressThread + { + public: + CoverDownloadThread(QWidget* parent, const QString& urls, bool use_serials); + ~CoverDownloadThread(); + + protected: + void runAsync() override; + + private: + std::vector m_urls; + bool m_use_serials; + }; + + void startThread(); + void cancelThread(); + + Ui::CoverDownloadDialog m_ui; + std::unique_ptr m_thread; + Common::Timer m_last_refresh_time; +}; diff --git a/pcsx2-qt/CoverDownloadDialog.ui b/pcsx2-qt/CoverDownloadDialog.ui new file mode 100644 index 0000000000..4396eb297b --- /dev/null +++ b/pcsx2-qt/CoverDownloadDialog.ui @@ -0,0 +1,117 @@ + + + CoverDownloadDialog + + + + 0 + 0 + 720 + 380 + + + + Download Covers + + + + + + 10 + + + + + + + + :/icons/black/svg/image-fill.svg + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + PCSX2 can automatically download covers for games which do not currently have a cover set. We do not host any cover images, the user must provide their own source for images. + + + true + + + + + + + + + <html><head/><body><p>In the box below, specify the URLs to download covers from, with one template URL per line. The following variables are available:</p><p><span style=" font-style:italic;">${title}:</span> Title of the game.<br/><span style=" font-style:italic;">${filetitle}:</span> Name component of the game's filename.<br/><span style=" font-style:italic;">${serial}:</span> Serial of the game.</p><p><span style=" font-weight:700;">Example:</span> https://www.example-not-a-real-domain.com/covers/${serial}.jpg</p></body></html> + + + true + + + + + + + + + + By default, the downloaded covers will be saved with the game's title. If this is not desired, you can check the "Use Serial File Names" box below. Using serials instead of game titles will prevent conflicts when multiple regions of the same game are used. + + + true + + + + + + + Use Serial File Names + + + + + + + Waiting to start... + + + + + + + + + + + + false + + + Start + + + true + + + + + + + Close + + + + + + + + + + + + diff --git a/pcsx2-qt/DisplayWidget.cpp b/pcsx2-qt/DisplayWidget.cpp index 227d4e9e65..245ea728d4 100644 --- a/pcsx2-qt/DisplayWidget.cpp +++ b/pcsx2-qt/DisplayWidget.cpp @@ -17,8 +17,9 @@ #include "common/Assertions.h" +#include "pcsx2/Frontend/ImGuiManager.h" + #include "DisplayWidget.h" -#include "EmuThread.h" #include "MainWindow.h" #include "QtHost.h" #include "QtUtils.h" @@ -61,62 +62,26 @@ DisplayWidget::~DisplayWidget() #endif } -qreal DisplayWidget::devicePixelRatioFromScreen() const -{ - const QScreen* screen_for_ratio = screen(); - if (!screen_for_ratio) - screen_for_ratio = QGuiApplication::primaryScreen(); - - return screen_for_ratio ? screen_for_ratio->devicePixelRatio() : static_cast(1); -} - int DisplayWidget::scaledWindowWidth() const { - return std::max(static_cast(std::ceil(static_cast(width()) * devicePixelRatioFromScreen())), 1); + return std::max(static_cast(std::ceil(static_cast(width()) * QtUtils::GetDevicePixelRatioForWidget(this))), 1); } int DisplayWidget::scaledWindowHeight() const { - return std::max(static_cast(std::ceil(static_cast(height()) * devicePixelRatioFromScreen())), 1); + return std::max(static_cast(std::ceil(static_cast(height()) * QtUtils::GetDevicePixelRatioForWidget(this))), 1); } std::optional DisplayWidget::getWindowInfo() { - WindowInfo wi; - - // Windows and Apple are easy here since there's no display connection. -#if defined(_WIN32) - wi.type = WindowInfo::Type::Win32; - wi.window_handle = reinterpret_cast(winId()); -#elif defined(__APPLE__) - wi.type = WindowInfo::Type::MacOS; - wi.window_handle = reinterpret_cast(winId()); -#else - QPlatformNativeInterface* pni = QGuiApplication::platformNativeInterface(); - const QString platform_name = QGuiApplication::platformName(); - if (platform_name == QStringLiteral("xcb")) + std::optional ret(QtUtils::GetWindowInfoForWidget(this)); + if (ret.has_value()) { - wi.type = WindowInfo::Type::X11; - wi.display_connection = pni->nativeResourceForWindow("display", windowHandle()); - wi.window_handle = reinterpret_cast(winId()); + m_last_window_width = ret->surface_width; + m_last_window_height = ret->surface_height; + m_last_window_scale = ret->surface_scale; } - else if (platform_name == QStringLiteral("wayland")) - { - wi.type = WindowInfo::Type::Wayland; - wi.display_connection = pni->nativeResourceForWindow("display", windowHandle()); - wi.window_handle = pni->nativeResourceForWindow("surface", windowHandle()); - } - else - { - qCritical() << "Unknown PNI platform " << platform_name; - return std::nullopt; - } -#endif - - m_last_window_width = wi.surface_width = static_cast(scaledWindowWidth()); - m_last_window_height = wi.surface_height = static_cast(scaledWindowHeight()); - m_last_window_scale = wi.surface_scale = static_cast(devicePixelRatioFromScreen()); - return wi; + return ret; } void DisplayWidget::updateRelativeMode(bool master_enable) @@ -181,6 +146,24 @@ void DisplayWidget::updateCursor(bool master_enable) unsetCursor(); } +void DisplayWidget::handleCloseEvent(QCloseEvent* event) +{ + // Closing the separate widget will either cancel the close, or trigger shutdown. + // In the latter case, it's going to destroy us, so don't let Qt do it first. + if (QtHost::IsVMValid()) + { + QMetaObject::invokeMethod(g_main_window, "requestShutdown", Q_ARG(bool, true), + Q_ARG(bool, true), Q_ARG(bool, false)); + } + else + { + QMetaObject::invokeMethod(g_main_window, &MainWindow::requestExit); + } + + // Cancel the event from closing the window. + event->ignore(); +} + void DisplayWidget::updateCenterPos() { #ifdef _WIN32 @@ -224,6 +207,18 @@ bool DisplayWidget::event(QEvent* event) case QEvent::KeyRelease: { const QKeyEvent* key_event = static_cast(event); + + // Forward text input to imgui. + if (ImGuiManager::WantsTextInput() && key_event->type() == QEvent::KeyPress) + { + // Don't forward backspace characters. We send the backspace as a normal key event, + // so if we send the character too, it double-deletes. + QString text(key_event->text()); + text.remove(QChar('\b')); + if (!text.isEmpty()) + ImGuiManager::AddTextInput(text.toStdString()); + } + if (key_event->isAutoRepeat()) return true; @@ -264,7 +259,7 @@ bool DisplayWidget::event(QEvent* event) if (!m_relative_mouse_enabled) { - const qreal dpr = devicePixelRatioFromScreen(); + const qreal dpr = QtUtils::GetDevicePixelRatioForWidget(this); const QPoint mouse_pos = mouse_event->pos(); const float scaled_x = static_cast(static_cast(mouse_pos.x()) * dpr); @@ -319,6 +314,7 @@ bool DisplayWidget::event(QEvent* event) // don't toggle fullscreen when we're bound.. that wouldn't end well. if (event->type() == QEvent::MouseButtonDblClick && static_cast(event)->button() == Qt::LeftButton && + QtHost::IsVMValid() && !QtHost::IsVMPaused() && !InputManager::HasAnyBindingsForKey(InputManager::MakePointerButtonKey(0, 0)) && Host::GetBoolSettingValue("UI", "DoubleClickTogglesFullscreen", true)) { @@ -348,7 +344,7 @@ bool DisplayWidget::event(QEvent* event) { QWidget::event(event); - const float dpr = devicePixelRatioFromScreen(); + const float dpr = QtUtils::GetDevicePixelRatioForWidget(this); const u32 scaled_width = static_cast(std::max(static_cast(std::ceil(static_cast(width()) * dpr)), 1)); const u32 scaled_height = static_cast(std::max(static_cast(std::ceil(static_cast(height()) * dpr)), 1)); @@ -373,10 +369,7 @@ bool DisplayWidget::event(QEvent* event) case QEvent::Close: { - // Closing the separate widget will either cancel the close, or trigger shutdown. - // In the latter case, it's going to destroy us, so don't let Qt do it first. - QMetaObject::invokeMethod(g_main_window, "requestShutdown", Q_ARG(bool, true), Q_ARG(bool, false), Q_ARG(bool, false)); - event->ignore(); + handleCloseEvent(static_cast(event)); return true; } @@ -402,15 +395,24 @@ DisplayContainer::DisplayContainer() DisplayContainer::~DisplayContainer() = default; -bool DisplayContainer::IsNeeded(bool fullscreen, bool render_to_main) +bool DisplayContainer::isNeeded(bool fullscreen, bool render_to_main) { #if defined(_WIN32) || defined(__APPLE__) return false; #else - if (!fullscreen && render_to_main) + if (!isRunningOnWayland()) return false; // We only need this on Wayland because of client-side decorations... + return (fullscreen || !render_to_main); +#endif +} + +bool DisplayContainer::isRunningOnWayland() +{ +#if defined(_WIN32) || defined(__APPLE__) + return false; +#else const QString platform_name = QGuiApplication::platformName(); return (platform_name == QStringLiteral("wayland")); #endif @@ -434,12 +436,9 @@ DisplayWidget* DisplayContainer::removeDisplayWidget() bool DisplayContainer::event(QEvent* event) { - if (event->type() == QEvent::Close) + if (event->type() == QEvent::Close && m_display_widget) { - // Closing the separate widget will either cancel the close, or trigger shutdown. - // In the latter case, it's going to destroy us, so don't let Qt do it first. - QMetaObject::invokeMethod(g_main_window, "requestShutdown", Q_ARG(bool, true), Q_ARG(bool, false), Q_ARG(bool, false)); - event->ignore(); + m_display_widget->handleCloseEvent(static_cast(event)); return true; } diff --git a/pcsx2-qt/DisplayWidget.h b/pcsx2-qt/DisplayWidget.h index 45d7f2c008..76b14bcce7 100644 --- a/pcsx2-qt/DisplayWidget.h +++ b/pcsx2-qt/DisplayWidget.h @@ -20,6 +20,8 @@ #include #include +class QCloseEvent; + class DisplayWidget final : public QWidget { Q_OBJECT @@ -34,13 +36,14 @@ public: int scaledWindowWidth() const; int scaledWindowHeight() const; - qreal devicePixelRatioFromScreen() const; std::optional getWindowInfo(); void updateRelativeMode(bool master_enable); void updateCursor(bool master_enable); + void handleCloseEvent(QCloseEvent* event); + Q_SIGNALS: void windowResizedEvent(int width, int height, float scale); void windowRestoredEvent(); @@ -75,7 +78,10 @@ public: DisplayContainer(); ~DisplayContainer(); - static bool IsNeeded(bool fullscreen, bool render_to_main); + // Wayland is broken in lots of ways, so we need to check for it. + static bool isRunningOnWayland(); + + static bool isNeeded(bool fullscreen, bool render_to_main); void setDisplayWidget(DisplayWidget* widget); DisplayWidget* removeDisplayWidget(); diff --git a/pcsx2-qt/EmuThread.cpp b/pcsx2-qt/EmuThread.cpp deleted file mode 100644 index a79cff4498..0000000000 --- a/pcsx2-qt/EmuThread.cpp +++ /dev/null @@ -1,1050 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2022 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" - -#include - -#include -#include - -#include "common/Assertions.h" -#include "common/Console.h" -#include "common/Exceptions.h" -#include "common/SettingsWrapper.h" -#include "common/StringUtil.h" - -#include "pcsx2/CDVD/CDVD.h" -#include "pcsx2/Counters.h" -#include "pcsx2/Frontend/InputManager.h" -#include "pcsx2/Frontend/ImGuiManager.h" -#include "pcsx2/GS.h" -#include "pcsx2/GS/GS.h" -#include "pcsx2/GSDumpReplayer.h" -#include "pcsx2/HostDisplay.h" -#include "pcsx2/HostSettings.h" -#include "pcsx2/PAD/Host/PAD.h" -#include "pcsx2/PerformanceMetrics.h" -#include "pcsx2/Recording/InputRecordingControls.h" -#include "pcsx2/VMManager.h" - -#include "DisplayWidget.h" -#include "EmuThread.h" -#include "MainWindow.h" -#include "QtHost.h" -#include "QtUtils.h" - -EmuThread* g_emu_thread = nullptr; - -static std::unique_ptr s_host_display; - -EmuThread::EmuThread(QThread* ui_thread) - : QThread() - , m_ui_thread(ui_thread) -{ -} - -EmuThread::~EmuThread() = default; - -bool EmuThread::isOnEmuThread() const -{ - return QThread::currentThread() == this; -} - -void EmuThread::start() -{ - pxAssertRel(!g_emu_thread, "Emu thread does not exist"); - - g_emu_thread = new EmuThread(QThread::currentThread()); - g_emu_thread->QThread::start(); - g_emu_thread->m_started_semaphore.acquire(); - g_emu_thread->moveToThread(g_emu_thread); -} - -void EmuThread::stop() -{ - pxAssertRel(g_emu_thread, "Emu thread exists"); - pxAssertRel(!g_emu_thread->isOnEmuThread(), "Not called on the emu thread"); - - QMetaObject::invokeMethod(g_emu_thread, &EmuThread::stopInThread, Qt::QueuedConnection); - while (g_emu_thread->isRunning()) - QApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 1); -} - -void EmuThread::stopInThread() -{ - if (VMManager::HasValidVM()) - destroyVM(); - - m_event_loop->quit(); - m_shutdown_flag.store(true); -} - -void EmuThread::startVM(std::shared_ptr boot_params) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "startVM", Qt::QueuedConnection, - Q_ARG(std::shared_ptr, boot_params)); - return; - } - - pxAssertRel(!VMManager::HasValidVM(), "VM is shut down"); - loadOurSettings(); - - emit onVMStarting(); - - // create the display, this may take a while... - m_is_fullscreen = boot_params->fullscreen.value_or(Host::GetBaseBoolSettingValue("UI", "StartFullscreen", false)); - m_is_rendering_to_main = !Host::GetBaseBoolSettingValue("UI", "RenderToSeparateWindow", false); - m_is_surfaceless = false; - m_save_state_on_shutdown = false; - if (!VMManager::Initialize(*boot_params)) - return; - - if (!Host::GetBoolSettingValue("UI", "StartPaused", false)) - { - // This will come back and call OnVMResumed(). - VMManager::SetState(VMState::Running); - } - else - { - // When starting paused, redraw the window, so there's at least something there. - redrawDisplayWindow(); - Host::OnVMPaused(); - } - - m_event_loop->quit(); -} - -void EmuThread::resetVM() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::resetVM, Qt::QueuedConnection); - return; - } - - VMManager::Reset(); -} - -void EmuThread::setVMPaused(bool paused) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "setVMPaused", Qt::QueuedConnection, Q_ARG(bool, paused)); - return; - } - - // if we were surfaceless (view->game list, system->unpause), get our display widget back - if (!paused && m_is_surfaceless) - setSurfaceless(false); - - VMManager::SetPaused(paused); -} - -void EmuThread::shutdownVM(bool save_state /* = true */) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "shutdownVM", Qt::QueuedConnection, Q_ARG(bool, save_state)); - return; - } - - const VMState state = VMManager::GetState(); - if (state == VMState::Paused) - m_event_loop->quit(); - else if (state != VMState::Running) - return; - - m_save_state_on_shutdown = save_state; - VMManager::SetState(VMState::Stopping); -} - -void EmuThread::loadState(const QString& filename) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "loadState", Qt::QueuedConnection, Q_ARG(const QString&, filename)); - return; - } - - if (!VMManager::HasValidVM()) - return; - - VMManager::LoadState(filename.toUtf8().constData()); -} - -void EmuThread::loadStateFromSlot(qint32 slot) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "loadStateFromSlot", Qt::QueuedConnection, Q_ARG(qint32, slot)); - return; - } - - if (!VMManager::HasValidVM()) - return; - - VMManager::LoadStateFromSlot(slot); -} - -void EmuThread::saveState(const QString& filename) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "saveState", Qt::QueuedConnection, Q_ARG(const QString&, filename)); - return; - } - - if (!VMManager::HasValidVM()) - return; - - if (!VMManager::SaveState(filename.toUtf8().constData())) - { - // this one is usually the result of a user-chosen path, so we can display a message box safely here - Console.Error("Failed to save state"); - } -} - -void EmuThread::saveStateToSlot(qint32 slot) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "saveStateToSlot", Qt::QueuedConnection, Q_ARG(qint32, slot)); - return; - } - - if (!VMManager::HasValidVM()) - return; - - VMManager::SaveStateToSlot(slot); -} - -void EmuThread::run() -{ - PerformanceMetrics::SetCPUThread(Threading::ThreadHandle::GetForCallingThread()); - m_event_loop = new QEventLoop(); - m_started_semaphore.release(); - - // neither of these should ever fail. - if (!VMManager::Internal::InitializeGlobals() || !VMManager::Internal::InitializeMemory()) - pxFailRel("Failed to allocate memory map"); - - // we need input sources ready for binding - reloadInputSources(); - createBackgroundControllerPollTimer(); - startBackgroundControllerPollTimer(); - connectSignals(); - - while (!m_shutdown_flag.load()) - { - if (!VMManager::HasValidVM()) - { - m_event_loop->exec(); - continue; - } - - executeVM(); - } - - stopBackgroundControllerPollTimer(); - destroyBackgroundControllerPollTimer(); - InputManager::CloseSources(); - VMManager::WaitForSaveStateFlush(); - VMManager::Internal::ReleaseMemory(); - VMManager::Internal::ReleaseGlobals(); - PerformanceMetrics::SetCPUThread(Threading::ThreadHandle()); - moveToThread(m_ui_thread); - deleteLater(); -} - -void EmuThread::destroyVM() -{ - m_last_speed = 0.0f; - m_last_game_fps = 0.0f; - m_last_video_fps = 0.0f; - m_last_internal_width = 0; - m_last_internal_height = 0; - m_was_paused_by_focus_loss = false; - VMManager::Shutdown(m_save_state_on_shutdown); -} - -void EmuThread::executeVM() -{ - for (;;) - { - switch (VMManager::GetState()) - { - case VMState::Initializing: - pxFailRel("Shouldn't be in the starting state state"); - continue; - - case VMState::Paused: - m_event_loop->exec(); - continue; - - case VMState::Running: - m_event_loop->processEvents(QEventLoop::AllEvents); - VMManager::Execute(); - continue; - - case VMState::Stopping: - destroyVM(); - m_event_loop->processEvents(QEventLoop::AllEvents); - return; - - default: - continue; - } - } -} - -void EmuThread::createBackgroundControllerPollTimer() -{ - pxAssert(!m_background_controller_polling_timer); - m_background_controller_polling_timer = new QTimer(this); - m_background_controller_polling_timer->setSingleShot(false); - m_background_controller_polling_timer->setTimerType(Qt::CoarseTimer); - connect(m_background_controller_polling_timer, &QTimer::timeout, this, &EmuThread::doBackgroundControllerPoll); -} - -void EmuThread::destroyBackgroundControllerPollTimer() -{ - delete m_background_controller_polling_timer; - m_background_controller_polling_timer = nullptr; -} - -void EmuThread::startBackgroundControllerPollTimer() -{ - if (m_background_controller_polling_timer->isActive()) - return; - - m_background_controller_polling_timer->start(BACKGROUND_CONTROLLER_POLLING_INTERVAL); -} - -void EmuThread::stopBackgroundControllerPollTimer() -{ - if (!m_background_controller_polling_timer->isActive()) - return; - - m_background_controller_polling_timer->stop(); -} - -void EmuThread::doBackgroundControllerPoll() -{ - InputManager::PollSources(); -} - -void EmuThread::toggleFullscreen() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::toggleFullscreen, Qt::QueuedConnection); - return; - } - - setFullscreen(!m_is_fullscreen); -} - -void EmuThread::setFullscreen(bool fullscreen) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "setFullscreen", Qt::QueuedConnection, Q_ARG(bool, fullscreen)); - return; - } - - if (!VMManager::HasValidVM() || m_is_fullscreen == fullscreen) - return; - - // This will call back to us on the MTGS thread. - m_is_fullscreen = fullscreen; - GetMTGS().UpdateDisplayWindow(); - GetMTGS().WaitGS(); - - // If we're using exclusive fullscreen, the refresh rate may have changed. - UpdateVSyncRate(); -} - -void EmuThread::setSurfaceless(bool surfaceless) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "setSurfaceless", Qt::QueuedConnection, Q_ARG(bool, surfaceless)); - return; - } - - if (!VMManager::HasValidVM() || m_is_surfaceless == surfaceless) - return; - - // This will call back to us on the MTGS thread. - m_is_surfaceless = surfaceless; - GetMTGS().UpdateDisplayWindow(); - GetMTGS().WaitGS(); -} - -void EmuThread::applySettings() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::applySettings, Qt::QueuedConnection); - return; - } - - checkForSettingChanges(); - VMManager::ApplySettings(); -} - -void EmuThread::reloadGameSettings() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::reloadGameSettings, Qt::QueuedConnection); - return; - } - - // this will skip applying settings when they're not active - if (VMManager::ReloadGameSettings()) - { - // none of these settings below are per-game.. for now. but in case they are in the future. - checkForSettingChanges(); - } -} - -void EmuThread::updateEmuFolders() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::updateEmuFolders, Qt::QueuedConnection); - return; - } - - Host::Internal::UpdateEmuFolders(); -} - -void EmuThread::loadOurSettings() -{ - m_verbose_status = Host::GetBaseBoolSettingValue("UI", "VerboseStatusBar", false); - m_pause_on_focus_loss = Host::GetBaseBoolSettingValue("UI", "PauseOnFocusLoss", false); -} - -void EmuThread::connectSignals() -{ - connect(qApp, &QGuiApplication::applicationStateChanged, this, &EmuThread::onApplicationStateChanged); -} - -void EmuThread::checkForSettingChanges() -{ - QMetaObject::invokeMethod(g_main_window, &MainWindow::checkForSettingChanges, Qt::QueuedConnection); - - if (VMManager::HasValidVM()) - { - const bool render_to_main = !Host::GetBaseBoolSettingValue("UI", "RenderToSeparateWindow", false); - if (!m_is_fullscreen && m_is_rendering_to_main != render_to_main) - { - m_is_rendering_to_main = render_to_main; - GetMTGS().UpdateDisplayWindow(); - GetMTGS().WaitGS(); - } - } - - const bool last_verbose_status = m_verbose_status; - - loadOurSettings(); - - if (m_verbose_status != last_verbose_status) - updatePerformanceMetrics(true); -} - -void EmuThread::toggleSoftwareRendering() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::toggleSoftwareRendering, Qt::QueuedConnection); - return; - } - - if (!VMManager::HasValidVM()) - return; - - GetMTGS().ToggleSoftwareRendering(); -} - -void EmuThread::switchRenderer(GSRendererType renderer) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "switchRenderer", Qt::QueuedConnection, Q_ARG(GSRendererType, renderer)); - return; - } - - if (!VMManager::HasValidVM()) - return; - - GetMTGS().SwitchRenderer(renderer); -} - -void EmuThread::changeDisc(CDVD_SourceType source, const QString& path) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "changeDisc", Qt::QueuedConnection, Q_ARG(CDVD_SourceType, source), Q_ARG(const QString&, path)); - return; - } - - if (!VMManager::HasValidVM()) - return; - - VMManager::ChangeDisc(source, path.toStdString()); -} - -void EmuThread::reloadPatches() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::reloadPatches, Qt::QueuedConnection); - return; - } - - if (!VMManager::HasValidVM()) - return; - - VMManager::ReloadPatches(true, true); -} - -void EmuThread::reloadInputSources() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::reloadInputSources, Qt::QueuedConnection); - return; - } - - std::unique_lock lock = Host::GetSettingsLock(); - SettingsInterface* si = Host::GetSettingsInterface(); - SettingsInterface* bindings_si = Host::GetSettingsInterfaceForBindings(); - InputManager::ReloadSources(*si, lock); - - // skip loading bindings if we're not running, since it'll get done on startup anyway - if (VMManager::HasValidVM()) - InputManager::ReloadBindings(*si, *bindings_si); -} - -void EmuThread::reloadInputBindings() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::reloadInputBindings, Qt::QueuedConnection); - return; - } - - // skip loading bindings if we're not running, since it'll get done on startup anyway - if (!VMManager::HasValidVM()) - return; - - auto lock = Host::GetSettingsLock(); - SettingsInterface* si = Host::GetSettingsInterface(); - SettingsInterface* bindings_si = Host::GetSettingsInterfaceForBindings(); - InputManager::ReloadBindings(*si, *bindings_si); -} - -void EmuThread::requestDisplaySize(float scale) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "requestDisplaySize", Qt::QueuedConnection, Q_ARG(float, scale)); - return; - } - - if (!VMManager::HasValidVM()) - return; - - VMManager::RequestDisplaySize(scale); -} - -void EmuThread::enumerateInputDevices() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::enumerateInputDevices, Qt::QueuedConnection); - return; - } - - const std::vector> devs(InputManager::EnumerateDevices()); - QList> qdevs; - qdevs.reserve(devs.size()); - for (const std::pair& dev : devs) - qdevs.emplace_back(QString::fromStdString(dev.first), QString::fromStdString(dev.second)); - - onInputDevicesEnumerated(qdevs); -} - -void EmuThread::enumerateVibrationMotors() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::enumerateVibrationMotors, Qt::QueuedConnection); - return; - } - - const std::vector motors(InputManager::EnumerateMotors()); - QList qmotors; - qmotors.reserve(motors.size()); - for (InputBindingKey key : motors) - qmotors.push_back(key); - - onVibrationMotorsEnumerated(qmotors); -} - -void EmuThread::connectDisplaySignals(DisplayWidget* widget) -{ - widget->disconnect(this); - - connect(widget, &DisplayWidget::windowResizedEvent, this, &EmuThread::onDisplayWindowResized); - connect(widget, &DisplayWidget::windowRestoredEvent, this, &EmuThread::redrawDisplayWindow); -} - -void EmuThread::onDisplayWindowResized(int width, int height, float scale) -{ - if (!s_host_display) - return; - - GetMTGS().ResizeDisplayWindow(width, height, scale); -} - -void EmuThread::onApplicationStateChanged(Qt::ApplicationState state) -{ - // NOTE: This is executed on the emu thread, not UI thread. - if (!m_pause_on_focus_loss || !VMManager::HasValidVM()) - return; - - const bool focus_loss = (state != Qt::ApplicationActive); - if (focus_loss) - { - if (!m_was_paused_by_focus_loss && VMManager::GetState() == VMState::Running) - { - m_was_paused_by_focus_loss = true; - VMManager::SetPaused(true); - } - } - else - { - if (m_was_paused_by_focus_loss) - { - m_was_paused_by_focus_loss = false; - if (VMManager::GetState() == VMState::Paused) - VMManager::SetPaused(false); - } - } -} - -void EmuThread::redrawDisplayWindow() -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, &EmuThread::redrawDisplayWindow, Qt::QueuedConnection); - return; - } - - // If we're running, we're going to re-present anyway. - if (!VMManager::HasValidVM() || VMManager::GetState() == VMState::Running) - return; - - GetMTGS().RunOnGSThread([]() { GetMTGS().PresentCurrentFrame(); }); -} - -void EmuThread::runOnCPUThread(const std::function& func) -{ - func(); -} - -void EmuThread::queueSnapshot(quint32 gsdump_frames) -{ - if (!isOnEmuThread()) - { - QMetaObject::invokeMethod(this, "queueSnapshot", Qt::QueuedConnection, Q_ARG(quint32, gsdump_frames)); - return; - } - - if (!VMManager::HasValidVM()) - return; - - GetMTGS().RunOnGSThread([gsdump_frames]() { - GSQueueSnapshot(std::string(), gsdump_frames); - }); -} - -void EmuThread::updateDisplay() -{ - pxAssertRel(!isOnEmuThread(), "Not on emu thread"); - - // finished with the display for now - HostDisplay* display = Host::GetHostDisplay(); - display->DoneRenderContextCurrent(); - - // but we should get it back after this call - onUpdateDisplayRequested(m_is_fullscreen, !m_is_fullscreen && m_is_rendering_to_main, m_is_surfaceless); - if (!display->MakeRenderContextCurrent()) - { - pxFailRel("Failed to recreate context after updating"); - return; - } -} - -HostDisplay* EmuThread::acquireHostDisplay(HostDisplay::RenderAPI api) -{ - s_host_display = HostDisplay::CreateDisplayForAPI(api); - if (!s_host_display) - return nullptr; - - DisplayWidget* widget = emit onCreateDisplayRequested(m_is_fullscreen, m_is_rendering_to_main); - if (!widget) - { - s_host_display.reset(); - return nullptr; - } - - connectDisplaySignals(widget); - - if (!s_host_display->MakeRenderContextCurrent()) - { - Console.Error("Failed to make render context current"); - releaseHostDisplay(); - return nullptr; - } - - if (!s_host_display->InitializeRenderDevice(EmuFolders::Cache, false) || - !ImGuiManager::Initialize()) - { - Console.Error("Failed to initialize device/imgui"); - releaseHostDisplay(); - return nullptr; - } - - Console.WriteLn(Color_StrongGreen, "%s Graphics Driver Info:", HostDisplay::RenderAPIToString(s_host_display->GetRenderAPI())); - Console.Indent().WriteLn(s_host_display->GetDriverInfo()); - - return s_host_display.get(); -} - -void EmuThread::releaseHostDisplay() -{ - ImGuiManager::Shutdown(); - - s_host_display.reset(); - emit onDestroyDisplayRequested(); -} - -HostDisplay* Host::GetHostDisplay() -{ - return s_host_display.get(); -} - -HostDisplay* Host::AcquireHostDisplay(HostDisplay::RenderAPI api) -{ - return g_emu_thread->acquireHostDisplay(api); -} - -void Host::ReleaseHostDisplay() -{ - g_emu_thread->releaseHostDisplay(); -} - -bool Host::BeginPresentFrame(bool frame_skip) -{ - if (!s_host_display->BeginPresent(frame_skip)) - { - // if we're skipping a frame, we need to reset imgui's state, since - // we won't be calling EndPresentFrame(). - ImGuiManager::NewFrame(); - return false; - } - - return true; -} - -void Host::EndPresentFrame() -{ - if (GSDumpReplayer::IsReplayingDump()) - GSDumpReplayer::RenderUI(); - - ImGuiManager::RenderOSD(); - s_host_display->EndPresent(); - ImGuiManager::NewFrame(); -} - -void Host::ResizeHostDisplay(u32 new_window_width, u32 new_window_height, float new_window_scale) -{ - s_host_display->ResizeRenderWindow(new_window_width, new_window_height, new_window_scale); - ImGuiManager::WindowResized(); - - // if we're paused, re-present the current frame at the new window size. - if (VMManager::GetState() == VMState::Paused) - GetMTGS().PresentCurrentFrame(); -} - -void Host::RequestResizeHostDisplay(s32 width, s32 height) -{ - g_emu_thread->onResizeDisplayRequested(width, height); -} - -void Host::UpdateHostDisplay() -{ - g_emu_thread->updateDisplay(); - ImGuiManager::WindowResized(); - - // if we're paused, re-present the current frame at the new window size. - if (VMManager::GetState() == VMState::Paused) - GetMTGS().PresentCurrentFrame(); -} - -void Host::OnVMStarting() -{ - g_emu_thread->stopBackgroundControllerPollTimer(); - emit g_emu_thread->onVMStarting(); -} - -void Host::OnVMStarted() -{ - emit g_emu_thread->onVMStarted(); -} - -void Host::OnVMDestroyed() -{ - emit g_emu_thread->onVMStopped(); - g_emu_thread->startBackgroundControllerPollTimer(); -} - -void Host::OnVMPaused() -{ - g_emu_thread->startBackgroundControllerPollTimer(); - emit g_emu_thread->onVMPaused(); -} - -void Host::OnVMResumed() -{ - // exit the event loop when we eventually return - g_emu_thread->getEventLoop()->quit(); - g_emu_thread->stopBackgroundControllerPollTimer(); - emit g_emu_thread->onVMResumed(); -} - -void Host::OnGameChanged(const std::string& disc_path, const std::string& game_serial, const std::string& game_name, - u32 game_crc) -{ - emit g_emu_thread->onGameChanged(QString::fromStdString(disc_path), QString::fromStdString(game_serial), - QString::fromStdString(game_name), game_crc); -} - -void EmuThread::updatePerformanceMetrics(bool force) -{ - if (m_verbose_status && VMManager::HasValidVM()) - { - std::string gs_stat_str; - GSgetTitleStats(gs_stat_str); - - QString gs_stat; - if (THREAD_VU1) - { - gs_stat = - QStringLiteral("%1 | EE: %2% | VU: %3% | GS: %4%") - .arg(gs_stat_str.c_str()) - .arg(PerformanceMetrics::GetCPUThreadUsage(), 0, 'f', 0) - .arg(PerformanceMetrics::GetVUThreadUsage(), 0, 'f', 0) - .arg(PerformanceMetrics::GetGSThreadUsage(), 0, 'f', 0); - } - else - { - gs_stat = QStringLiteral("%1 | EE: %2% | GS: %3%") - .arg(gs_stat_str.c_str()) - .arg(PerformanceMetrics::GetCPUThreadUsage(), 0, 'f', 0) - .arg(PerformanceMetrics::GetGSThreadUsage(), 0, 'f', 0); - } - - QMetaObject::invokeMethod(g_main_window->getStatusVerboseWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, gs_stat)); - } - - const GSRendererType renderer = GSConfig.Renderer; - const float speed = std::round(PerformanceMetrics::GetSpeed()); - const float gfps = std::round(PerformanceMetrics::GetInternalFPS()); - const float vfps = std::round(PerformanceMetrics::GetFPS()); - int iwidth, iheight; - GSgetInternalResolution(&iwidth, &iheight); - - if (iwidth != m_last_internal_width || iheight != m_last_internal_height || - speed != m_last_speed || gfps != m_last_game_fps || vfps != m_last_video_fps || - renderer != m_last_renderer || force) - { - if (iwidth == 0 && iheight == 0) - { - // if we don't have width/height yet, we're not going to have fps either. - // and we'll probably be <100% due to compiling. so just leave it blank for now. - QString blank; - QMetaObject::invokeMethod(g_main_window->getStatusRendererWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, blank)); - QMetaObject::invokeMethod(g_main_window->getStatusResolutionWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, blank)); - QMetaObject::invokeMethod(g_main_window->getStatusFPSWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, blank)); - QMetaObject::invokeMethod(g_main_window->getStatusVPSWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, blank)); - return; - } - else - { - if (renderer != m_last_renderer || force) - { - QMetaObject::invokeMethod(g_main_window->getStatusRendererWidget(), "setText", Qt::QueuedConnection, - Q_ARG(const QString&, QString::fromUtf8(Pcsx2Config::GSOptions::GetRendererName(renderer)))); - m_last_renderer = renderer; - } - if (iwidth != m_last_internal_width || iheight != m_last_internal_height || force) - { - QMetaObject::invokeMethod(g_main_window->getStatusResolutionWidget(), "setText", Qt::QueuedConnection, - Q_ARG(const QString&, tr("%1x%2") - .arg(iwidth) - .arg(iheight))); - m_last_internal_width = iwidth; - m_last_internal_height = iheight; - } - - if (gfps != m_last_game_fps || force) - { - QMetaObject::invokeMethod(g_main_window->getStatusFPSWidget(), "setText", Qt::QueuedConnection, - Q_ARG(const QString&, tr("Game: %1 FPS") - .arg(gfps, 0, 'f', 0))); - m_last_game_fps = gfps; - } - - if (speed != m_last_speed || vfps != m_last_video_fps || force) - { - QMetaObject::invokeMethod(g_main_window->getStatusVPSWidget(), "setText", Qt::QueuedConnection, - Q_ARG(const QString&, tr("Video: %1 FPS (%2%)") - .arg(vfps, 0, 'f', 0) - .arg(speed, 0, 'f', 0))); - m_last_speed = speed; - m_last_video_fps = vfps; - } - } - } -} - -void Host::OnPerformanceMetricsUpdated() -{ - g_emu_thread->updatePerformanceMetrics(false); -} - -void Host::OnSaveStateLoading(const std::string_view& filename) -{ - emit g_emu_thread->onSaveStateLoading(QtUtils::StringViewToQString(filename)); -} - -void Host::OnSaveStateLoaded(const std::string_view& filename, bool was_successful) -{ - emit g_emu_thread->onSaveStateLoaded(QtUtils::StringViewToQString(filename), was_successful); -} - -void Host::OnSaveStateSaved(const std::string_view& filename) -{ - emit g_emu_thread->onSaveStateSaved(QtUtils::StringViewToQString(filename)); -} - -void Host::PumpMessagesOnCPUThread() -{ - g_emu_thread->getEventLoop()->processEvents(QEventLoop::AllEvents); -} - -void Host::RunOnCPUThread(std::function function, bool block /* = false */) -{ - if (g_emu_thread->isOnEmuThread()) - { - // probably shouldn't ever happen, but just in case.. - function(); - return; - } - - QMetaObject::invokeMethod(g_emu_thread, "runOnCPUThread", - block ? Qt::BlockingQueuedConnection : Qt::QueuedConnection, - Q_ARG(const std::function&, std::move(function))); -} - -void Host::RefreshGameListAsync(bool invalidate_cache) -{ - QMetaObject::invokeMethod(g_main_window, "refreshGameList", Qt::QueuedConnection, - Q_ARG(bool, invalidate_cache)); -} - -void Host::CancelGameListRefresh() -{ - QMetaObject::invokeMethod(g_main_window, "cancelGameListRefresh", Qt::BlockingQueuedConnection); -} - -void Host::RequestExit(bool save_state_if_running) -{ - if (VMManager::HasValidVM()) - g_emu_thread->shutdownVM(save_state_if_running); - - QMetaObject::invokeMethod(g_main_window, "requestExit", Qt::QueuedConnection); -} - -void Host::RequestVMShutdown(bool save_state) -{ - if (VMManager::HasValidVM()) - g_emu_thread->shutdownVM(save_state); -} - -bool Host::IsFullscreen() -{ - return g_emu_thread->isFullscreen(); -} - -void Host::SetFullscreen(bool enabled) -{ - g_emu_thread->setFullscreen(enabled); -} - -alignas(16) static SysMtgsThread s_mtgs_thread; - -SysMtgsThread& GetMTGS() -{ - return s_mtgs_thread; -} - -// ------------------------------------------------------------------------ -// Hotkeys -// ------------------------------------------------------------------------ - -BEGIN_HOTKEY_LIST(g_host_hotkeys) -DEFINE_HOTKEY("ShutdownVM", "System", "Shut Down Virtual Machine", [](s32 pressed) { - if (!pressed) - { - // run it on the host thread, that way we get the confirm prompt (if enabled) - QMetaObject::invokeMethod(g_main_window, "requestShutdown", Qt::QueuedConnection, - Q_ARG(bool, true), Q_ARG(bool, true), Q_ARG(bool, true)); - } -}) -DEFINE_HOTKEY("TogglePause", "System", "Toggle Pause", [](s32 pressed) { - if (!pressed) - g_emu_thread->setVMPaused(VMManager::GetState() != VMState::Paused); -}) -DEFINE_HOTKEY("ToggleFullscreen", "General", "Toggle Fullscreen", [](s32 pressed) { - if (!pressed) - g_emu_thread->toggleFullscreen(); -}) -// Input Recording Hot Keys -DEFINE_HOTKEY("InputRecToggleMode", "Input Recording", "Toggle Recording Mode", [](s32 pressed) { - if (!pressed) // ?? - not pressed so it is on key up? - { - g_InputRecordingControls.RecordModeToggle(); - } -}) -END_HOTKEY_LIST() diff --git a/pcsx2-qt/EmuThread.h b/pcsx2-qt/EmuThread.h deleted file mode 100644 index 9bd31cf5d6..0000000000 --- a/pcsx2-qt/EmuThread.h +++ /dev/null @@ -1,176 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2022 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#pragma once -#include "pcsx2/Host.h" -#include "pcsx2/HostDisplay.h" -#include "pcsx2/Frontend/InputManager.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class DisplayWidget; -struct VMBootParameters; - -enum class CDVD_SourceType : uint8_t; - -class EmuThread : public QThread -{ - Q_OBJECT - -public: - explicit EmuThread(QThread* ui_thread); - ~EmuThread(); - - static void start(); - static void stop(); - - __fi QEventLoop* getEventLoop() const { return m_event_loop; } - __fi bool isFullscreen() const { return m_is_fullscreen; } - __fi bool isRenderingToMain() const { return m_is_rendering_to_main; } - - bool isOnEmuThread() const; - - /// Called back from the GS thread when the display state changes (e.g. fullscreen, render to main). - HostDisplay* acquireHostDisplay(HostDisplay::RenderAPI api); - void connectDisplaySignals(DisplayWidget* widget); - void releaseHostDisplay(); - void updateDisplay(); - - void startBackgroundControllerPollTimer(); - void stopBackgroundControllerPollTimer(); - void updatePerformanceMetrics(bool force); - -public Q_SLOTS: - void startVM(std::shared_ptr boot_params); - void resetVM(); - void setVMPaused(bool paused); - void shutdownVM(bool save_state = true); - void loadState(const QString& filename); - void loadStateFromSlot(qint32 slot); - void saveState(const QString& filename); - void saveStateToSlot(qint32 slot); - void toggleFullscreen(); - void setFullscreen(bool fullscreen); - void setSurfaceless(bool surfaceless); - void applySettings(); - void reloadGameSettings(); - void updateEmuFolders(); - void toggleSoftwareRendering(); - void switchRenderer(GSRendererType renderer); - void changeDisc(CDVD_SourceType source, const QString& path); - void reloadPatches(); - void reloadInputSources(); - void reloadInputBindings(); - void requestDisplaySize(float scale); - void enumerateInputDevices(); - void enumerateVibrationMotors(); - void runOnCPUThread(const std::function& func); - void queueSnapshot(quint32 gsdump_frames); - -Q_SIGNALS: - DisplayWidget* onCreateDisplayRequested(bool fullscreen, bool render_to_main); - DisplayWidget* onUpdateDisplayRequested(bool fullscreen, bool render_to_main, bool surfaceless); - void onResizeDisplayRequested(qint32 width, qint32 height); - void onDestroyDisplayRequested(); - - /// Called when the VM is starting initialization, but has not been completed yet. - void onVMStarting(); - - /// Called when the VM is created. - void onVMStarted(); - - /// Called when the VM is paused. - void onVMPaused(); - - /// Called when the VM is resumed after being paused. - void onVMResumed(); - - /// Called when the VM is shut down or destroyed. - void onVMStopped(); - - /// Provided by the host; called when the running executable changes. - void onGameChanged(const QString& path, const QString& serial, const QString& name, quint32 crc); - - void onInputDevicesEnumerated(const QList>& devices); - void onInputDeviceConnected(const QString& identifier, const QString& device_name); - void onInputDeviceDisconnected(const QString& identifier); - void onVibrationMotorsEnumerated(const QList& motors); - - /// Called when a save state is loading, before the file is processed. - void onSaveStateLoading(const QString& path); - - /// Called after a save state is successfully loaded. If the save state was invalid, was_successful will be false. - void onSaveStateLoaded(const QString& path, bool was_successful); - - /// Called when a save state is being created/saved. The compression/write to disk is asynchronous, so this callback - /// just signifies that the save has started, not necessarily completed. - void onSaveStateSaved(const QString& path); - -protected: - void run(); - -private: - static constexpr u32 BACKGROUND_CONTROLLER_POLLING_INTERVAL = - 100; /// Interval at which the controllers are polled when the system is not active. - - void destroyVM(); - void executeVM(); - void checkForSettingChanges(); - - void createBackgroundControllerPollTimer(); - void destroyBackgroundControllerPollTimer(); - void loadOurSettings(); - void connectSignals(); - -private Q_SLOTS: - void stopInThread(); - void doBackgroundControllerPoll(); - void onDisplayWindowResized(int width, int height, float scale); - void onApplicationStateChanged(Qt::ApplicationState state); - void redrawDisplayWindow(); - -private: - QThread* m_ui_thread; - QSemaphore m_started_semaphore; - QEventLoop* m_event_loop = nullptr; - QTimer* m_background_controller_polling_timer = nullptr; - - std::atomic_bool m_shutdown_flag{false}; - - bool m_verbose_status = false; - bool m_is_rendering_to_main = false; - bool m_is_fullscreen = false; - bool m_is_surfaceless = false; - bool m_save_state_on_shutdown = false; - bool m_pause_on_focus_loss = false; - - bool m_was_paused_by_focus_loss = false; - - float m_last_speed = 0.0f; - float m_last_game_fps = 0.0f; - float m_last_video_fps = 0.0f; - int m_last_internal_width = 0; - int m_last_internal_height = 0; - GSRendererType m_last_renderer = GSRendererType::Null; -}; - -extern EmuThread* g_emu_thread; diff --git a/pcsx2-qt/GameList/GameListModel.cpp b/pcsx2-qt/GameList/GameListModel.cpp index c81de308c6..bf4c5102fb 100644 --- a/pcsx2-qt/GameList/GameListModel.cpp +++ b/pcsx2-qt/GameList/GameListModel.cpp @@ -17,21 +17,27 @@ #include "GameListModel.h" #include "QtHost.h" +#include "QtUtils.h" #include "common/FileSystem.h" #include "common/Path.h" #include "common/StringUtil.h" +#include "fmt/format.h" #include #include +#include +#include +#include #include #include #include static constexpr std::array s_column_names = { - {"Type", "Code", "Title", "File Title", "CRC", "Size", "Region", "Compatibility", "Cover"}}; + {"Type", "Code", "Title", "File Title", "CRC", "Time Played", "Last Played", "Size", "Region", "Compatibility", "Cover"}}; static constexpr int COVER_ART_WIDTH = 350; static constexpr int COVER_ART_HEIGHT = 512; static constexpr int COVER_ART_SPACING = 32; +static constexpr int MIN_COVER_CACHE_SIZE = 256; static int DPRScale(int size, float dpr) { @@ -123,27 +129,113 @@ const char* GameListModel::getColumnName(Column col) GameListModel::GameListModel(QObject* parent /* = nullptr */) : QAbstractTableModel(parent) + , m_cover_pixmap_cache(MIN_COVER_CACHE_SIZE) { loadCommonImages(); setColumnDisplayNames(); } GameListModel::~GameListModel() = default; +void GameListModel::refreshImages() +{ + loadCommonImages(); + refresh(); +} + void GameListModel::setCoverScale(float scale) { if (m_cover_scale == scale) return; - m_cover_pixmap_cache.clear(); + m_cover_pixmap_cache.Clear(); m_cover_scale = scale; + m_cover_scale_counter.fetch_add(1, std::memory_order_release); + m_loading_pixmap = QPixmap(getCoverArtWidth(), getCoverArtHeight()); + m_loading_pixmap.fill(QColor(0, 0, 0, 0)); } void GameListModel::refreshCovers() { - m_cover_pixmap_cache.clear(); + m_cover_pixmap_cache.Clear(); refresh(); } +void GameListModel::updateCacheSize(int width, int height) +{ + // This is a bit conversative, since it doesn't consider padding, but better to be over than under. + const int cover_width = getCoverArtWidth(); + const int cover_height = getCoverArtHeight(); + const int num_columns = ((width + (cover_width - 1)) / cover_width); + const int num_rows = ((height + (cover_height - 1)) / cover_height); + m_cover_pixmap_cache.SetMaxCapacity(static_cast(std::max(num_columns * num_rows, MIN_COVER_CACHE_SIZE))); +} + +void GameListModel::loadOrGenerateCover(const GameList::Entry* ge) +{ + // Why this counter: Every time we change the cover scale, we increment the counter variable. This way if the scale is changed + // while there's outstanding jobs, the old jobs won't proceed (at the wrong size), or get added into the grid. + const u32 counter = m_cover_scale_counter.load(std::memory_order_acquire); + + QFuture future = QtConcurrent::run([this, path = ge->path, title = ge->title, serial = ge->serial, counter]() -> QPixmap { + QPixmap image; + if (m_cover_scale_counter.load(std::memory_order_acquire) == counter) + { + const std::string cover_path(GameList::GetCoverImagePath(path, serial, title)); + if (!cover_path.empty()) + { + const float dpr = qApp->devicePixelRatio(); + image = QPixmap(QString::fromStdString(cover_path)); + if (!image.isNull()) + { + image.setDevicePixelRatio(dpr); + resizeAndPadPixmap(&image, getCoverArtWidth(), getCoverArtHeight(), dpr); + } + } + } + + if (image.isNull()) + image = createPlaceholderImage(m_placeholder_pixmap, getCoverArtWidth(), getCoverArtHeight(), m_cover_scale, title); + + if (m_cover_scale_counter.load(std::memory_order_acquire) != counter) + image = {}; + + return image; + }); + + // Context must be 'this' so we run on the UI thread. + future.then(this, [this, path = ge->path, counter](QPixmap pm) { + if (m_cover_scale_counter.load(std::memory_order_acquire) != counter) + return; + + m_cover_pixmap_cache.Insert(std::move(path), std::move(pm)); + invalidateCoverForPath(path); + }); +} + +void GameListModel::invalidateCoverForPath(const std::string& path) +{ + // This isn't ideal, but not sure how else we can get the row, when it might change while scanning... + auto lock = GameList::GetLock(); + const u32 count = GameList::GetEntryCount(); + std::optional row; + for (u32 i = 0; i < count; i++) + { + if (GameList::GetEntryByIndex(i)->path == path) + { + row = i; + break; + } + } + if (!row.has_value()) + { + // Game removed? + return; + } + + const QModelIndex mi(index(static_cast(row.value()), Column_Cover)); + emit dataChanged(mi, mi, {Qt::DecorationRole}); +} + int GameListModel::getCoverArtWidth() const { return std::max(static_cast(static_cast(COVER_ART_WIDTH) * m_cover_scale), 1); @@ -202,13 +294,21 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const return QString::fromStdString(ge->title); case Column_FileTitle: - { - const std::string_view file_title(Path::GetFileTitle(ge->path)); - return QString::fromUtf8(file_title.data(), static_cast(file_title.length())); - } + return QtUtils::StringViewToQString(Path::GetFileTitle(ge->path)); case Column_CRC: - return QStringLiteral("%1").arg(ge->crc, 8, 16, QChar('0')); + return QString::fromStdString(fmt::format("{:08X}", ge->crc)); + + case Column_TimePlayed: + { + if (ge->total_played_time == 0) + return {}; + else + return QString::fromStdString(GameList::FormatTimespan(ge->total_played_time, true)); + } + + case Column_LastPlayed: + return QString::fromStdString(GameList::FormatTimestamp(ge->last_played_time)); case Column_Size: return QString("%1 MB").arg(static_cast(ge->total_size) / 1048576.0, 0, 'f', 2); @@ -241,14 +341,17 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const return QString::fromStdString(ge->title); case Column_FileTitle: - { - const std::string_view file_title(Path::GetFileTitle(ge->path)); - return QString::fromUtf8(file_title.data(), static_cast(file_title.length())); - } + return QtUtils::StringViewToQString(Path::GetFileTitle(ge->path)); case Column_CRC: return static_cast(ge->crc); + case Column_TimePlayed: + return static_cast(ge->total_played_time); + + case Column_LastPlayed: + return static_cast(ge->last_played_time); + case Column_Region: return static_cast(ge->region); @@ -269,60 +372,32 @@ QVariant GameListModel::data(const QModelIndex& index, int role) const { case Column_Type: { - switch (ge->type) - { - case GameList::EntryType::PS1Disc: - case GameList::EntryType::PS2Disc: - // return ((ge->settings.GetUserSettingsCount() > 0) ? m_type_disc_with_settings_pixmap : // m_type_disc_pixmap); - return m_type_disc_pixmap; - case GameList::EntryType::Playlist: - return m_type_playlist_pixmap; - case GameList::EntryType::ELF: - default: - return m_type_exe_pixmap; - } + return m_type_pixmaps[static_cast(ge->type)]; } case Column_Region: { - return m_region_pixmaps[static_cast(ge->region)]; + return m_region_pixmaps[static_cast(ge->region)]; } case Column_Compatibility: { - return m_compatibility_pixmaps[static_cast( + return m_compatibility_pixmaps[static_cast( (static_cast(ge->compatibility_rating) >= GameList::CompatibilityRatingCount) ? - GameList::CompatibilityRating::Unknown : + GameList::CompatibilityRating::Unknown : ge->compatibility_rating)]; } case Column_Cover: { - auto it = m_cover_pixmap_cache.find(ge->path); - if (it != m_cover_pixmap_cache.end()) - return it->second; + QPixmap* pm = m_cover_pixmap_cache.Lookup(ge->path); + if (pm) + return *pm; - QPixmap image; - std::string path = GameList::GetCoverImagePathForEntry(ge); - if (!path.empty()) - { - const float dpr = qApp->devicePixelRatio(); - image = QPixmap(QString::fromStdString(path)); - if (!image.isNull()) - { - image.setDevicePixelRatio(dpr); - resizeAndPadPixmap(&image, getCoverArtWidth(), getCoverArtHeight(), dpr); - } - } - - if (image.isNull()) - { - image = createPlaceholderImage(m_placeholder_pixmap, getCoverArtWidth(), getCoverArtHeight(), m_cover_scale, - ge->title); - } - - m_cover_pixmap_cache.emplace(ge->path, image); - return image; + // We insert the placeholder into the cache, so that we don't repeatedly + // queue loading jobs for this game. + const_cast(this)->loadOrGenerateCover(ge); + return *m_cover_pixmap_cache.Insert(ge->path, m_loading_pixmap); } break; @@ -446,31 +521,61 @@ bool GameListModel::lessThan(const QModelIndex& left_index, const QModelIndex& r return (left->crc < right->crc); } + case Column_TimePlayed: + { + if (left->total_played_time == right->total_played_time) + return titlesLessThan(left_row, right_row); + + return (left->total_played_time < right->total_played_time); + } + + case Column_LastPlayed: + { + if (left->last_played_time == right->last_played_time) + return titlesLessThan(left_row, right_row); + + return (left->last_played_time < right->last_played_time); + } + default: return false; } } +QIcon GameListModel::getIconForType(GameList::EntryType type) +{ + switch (type) + { + case GameList::EntryType::PS2Disc: + case GameList::EntryType::PS1Disc: + return QIcon(QStringLiteral(":/icons/media-optical-24.png")); + + case GameList::EntryType::ELF: + default: + return QIcon(QStringLiteral(":/icons/applications-system-24.png")); + } +} + +QIcon GameListModel::getIconForRegion(GameList::Region region) +{ + return QIcon( + QStringLiteral("%1/icons/flags/%2.png").arg(QtHost::GetResourcesBasePath()).arg(GameList::RegionToString(region))); +} + void GameListModel::loadCommonImages() { - m_type_disc_pixmap = QIcon(QStringLiteral(":/icons/media-optical-24.png")).pixmap(QSize(24, 24)); - m_type_disc_with_settings_pixmap = QIcon(QStringLiteral(":/icons/media-optical-gear-24.png")).pixmap(QSize(24, 24)); - m_type_exe_pixmap = QIcon(QStringLiteral(":/icons/applications-system-24.png")).pixmap(QSize(24, 24)); - m_type_playlist_pixmap = QIcon(QStringLiteral(":/icons/address-book-new-22.png")).pixmap(QSize(22, 22)); + for (u32 type = 0; type < static_cast(GameList::EntryType::Count); type++) + m_type_pixmaps[type] = getIconForType(static_cast(type)).pixmap(QSize(24, 24)); + + for (u32 i = 0; i < static_cast(GameList::Region::Count); i++) + m_region_pixmaps[i] = getIconForRegion(static_cast(i)).pixmap(QSize(42, 30)); const QString base_path(QtHost::GetResourcesBasePath()); - - for (u32 i = 0; i < static_cast(GameList::Region::Count); i++) - { - m_region_pixmaps[i] = QIcon( - QStringLiteral("%1/icons/flags/%2.png").arg(base_path).arg(GameList::RegionToString(static_cast(i)))) - .pixmap(QSize(42, 30)); - } - for (u32 i = 1; i < GameList::CompatibilityRatingCount; i++) m_compatibility_pixmaps[i].load(QStringLiteral("%1/icons/star-%2.png").arg(base_path).arg(i - 1)); m_placeholder_pixmap.load(QStringLiteral("%1/cover-placeholder.png").arg(base_path)); + setCoverScale(1.0f); } void GameListModel::setColumnDisplayNames() @@ -480,6 +585,8 @@ void GameListModel::setColumnDisplayNames() m_column_display_names[Column_Title] = tr("Title"); m_column_display_names[Column_FileTitle] = tr("File Title"); m_column_display_names[Column_CRC] = tr("CRC"); + m_column_display_names[Column_TimePlayed] = tr("Time Played"); + m_column_display_names[Column_LastPlayed] = tr("Last Played"); m_column_display_names[Column_Size] = tr("Size"); m_column_display_names[Column_Region] = tr("Region"); m_column_display_names[Column_Compatibility] = tr("Compatibility"); diff --git a/pcsx2-qt/GameList/GameListModel.h b/pcsx2-qt/GameList/GameListModel.h index a782a5fc94..6837ec78aa 100644 --- a/pcsx2-qt/GameList/GameListModel.h +++ b/pcsx2-qt/GameList/GameListModel.h @@ -15,9 +15,11 @@ #pragma once #include "pcsx2/Frontend/GameList.h" +#include "common/LRUCache.h" #include #include #include +#include #include #include #include @@ -34,6 +36,8 @@ public: Column_Title, Column_FileTitle, Column_CRC, + Column_TimePlayed, + Column_LastPlayed, Column_Size, Column_Region, Column_Compatibility, @@ -45,6 +49,9 @@ public: static std::optional getColumnIdForName(std::string_view name); static const char* getColumnName(Column col); + static QIcon getIconForType(GameList::EntryType type); + static QIcon getIconForRegion(GameList::Region region); + GameListModel(QObject* parent = nullptr); ~GameListModel(); @@ -56,6 +63,7 @@ public: __fi const QString& getColumnDisplayName(int column) { return m_column_display_names[column]; } void refresh(); + void refreshImages(); bool titlesLessThan(int left_row, int right_row) const; @@ -70,23 +78,24 @@ public: int getCoverArtHeight() const; int getCoverArtSpacing() const; void refreshCovers(); + void updateCacheSize(int width, int height); private: void loadCommonImages(); void setColumnDisplayNames(); + void loadOrGenerateCover(const GameList::Entry* ge); + void invalidateCoverForPath(const std::string& path); - float m_cover_scale = 1.0f; + float m_cover_scale = 0.0f; + std::atomic m_cover_scale_counter{0}; bool m_show_titles_for_covers = false; std::array m_column_display_names; - - QPixmap m_type_disc_pixmap; - QPixmap m_type_disc_with_settings_pixmap; - QPixmap m_type_exe_pixmap; - QPixmap m_type_playlist_pixmap; - QPixmap m_region_pixmaps[static_cast(GameList::Region::Count)]; + std::array(GameList::EntryType::Count)> m_type_pixmaps; + std::array(GameList::Region::Count)> m_region_pixmaps; QPixmap m_placeholder_pixmap; + QPixmap m_loading_pixmap; std::array(GameList::CompatibilityRatingCount)> m_compatibility_pixmaps; - mutable std::unordered_map m_cover_pixmap_cache; -}; \ No newline at end of file + mutable LRUCache m_cover_pixmap_cache; +}; diff --git a/pcsx2-qt/GameList/GameListRefreshThread.cpp b/pcsx2-qt/GameList/GameListRefreshThread.cpp index 9e0e6ea37c..89c809d066 100644 --- a/pcsx2-qt/GameList/GameListRefreshThread.cpp +++ b/pcsx2-qt/GameList/GameListRefreshThread.cpp @@ -122,6 +122,6 @@ void GameListRefreshThread::cancel() void GameListRefreshThread::run() { - GameList::Refresh(m_invalidate_cache, &m_progress); + GameList::Refresh(m_invalidate_cache, false, &m_progress); emit refreshComplete(); } diff --git a/pcsx2-qt/GameList/GameListWidget.cpp b/pcsx2-qt/GameList/GameListWidget.cpp index e119c81198..19e8b1d309 100644 --- a/pcsx2-qt/GameList/GameListWidget.cpp +++ b/pcsx2-qt/GameList/GameListWidget.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "GameListModel.h" #include "GameListRefreshThread.h" @@ -40,6 +41,9 @@ static const char* SUPPORTED_FORMATS_STRING = QT_TRANSLATE_NOOP(GameListWidget, ".cso (Compressed ISO)\n" ".gz (Gzip Compressed ISO)"); +static constexpr float MIN_SCALE = 0.1f; +static constexpr float MAX_SCALE = 2.0f; + class GameListSortModel final : public QSortFilterProxyModel { public: @@ -49,9 +53,41 @@ public: { } + void setFilterType(GameList::EntryType type) + { + m_filter_type = type; + invalidateRowsFilter(); + } + void setFilterRegion(GameList::Region region) + { + m_filter_region = region; + invalidateRowsFilter(); + } + void setFilterName(const QString& name) + { + m_filter_name = name; + invalidateRowsFilter(); + } + bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override { - // TODO: Search + if (m_filter_type != GameList::EntryType::Count || + m_filter_region != GameList::Region::Count || + !m_filter_name.isEmpty()) + { + const auto lock = GameList::GetLock(); + const GameList::Entry* entry = GameList::GetEntryByIndex(source_row); + if (m_filter_type != GameList::EntryType::Count && entry->type != m_filter_type) + return false; + if (m_filter_region != GameList::Region::Count && entry->region != m_filter_region) + return false; + if (!m_filter_name.isEmpty() && + !QString::fromStdString(entry->path).contains(m_filter_name, Qt::CaseInsensitive) && + !QString::fromStdString(entry->serial).contains(m_filter_name, Qt::CaseInsensitive) && + !QString::fromStdString(entry->title).contains(m_filter_name, Qt::CaseInsensitive)) + return false; + } + return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); } @@ -62,10 +98,13 @@ public: private: GameListModel* m_model; + GameList::EntryType m_filter_type = GameList::EntryType::Count; + GameList::Region m_filter_region = GameList::Region::Count; + QString m_filter_name; }; GameListWidget::GameListWidget(QWidget* parent /* = nullptr */) - : QStackedWidget(parent) + : QWidget(parent) { } @@ -76,10 +115,38 @@ void GameListWidget::initialize() m_model = new GameListModel(this); m_model->setCoverScale(Host::GetBaseFloatSettingValue("UI", "GameListCoverArtScale", 0.45f)); m_model->setShowCoverTitles(Host::GetBaseBoolSettingValue("UI", "GameListShowCoverTitles", true)); + m_model->updateCacheSize(width(), height()); m_sort_model = new GameListSortModel(m_model); m_sort_model->setSourceModel(m_model); - m_table_view = new QTableView(this); + + m_ui.setupUi(this); + for (u32 type = 0; type < static_cast(GameList::EntryType::Count); type++) + { + m_ui.filterType->addItem(GameListModel::getIconForType(static_cast(type)), + qApp->translate("GameList", GameList::EntryTypeToDisplayString(static_cast(type)))); + } + for (u32 region = 0; region < static_cast(GameList::Region::Count); region++) + { + m_ui.filterRegion->addItem(GameListModel::getIconForRegion(static_cast(region)), + qApp->translate("GameList", GameList::RegionToString(static_cast(region)))); + } + + connect(m_ui.viewGameList, &QPushButton::clicked, this, &GameListWidget::showGameList); + connect(m_ui.viewGameGrid, &QPushButton::clicked, this, &GameListWidget::showGameGrid); + connect(m_ui.gridScale, &QSlider::valueChanged, this, &GameListWidget::gridIntScale); + connect(m_ui.viewGridTitles, &QPushButton::toggled, this, &GameListWidget::setShowCoverTitles); + connect(m_ui.filterType, &QComboBox::currentIndexChanged, this, [this](int index) { + m_sort_model->setFilterType((index == 0) ? GameList::EntryType::Count : static_cast(index - 1)); + }); + connect(m_ui.filterRegion, &QComboBox::currentIndexChanged, this, [this](int index) { + m_sort_model->setFilterRegion((index == 0) ? GameList::Region::Count : static_cast(index - 1)); + }); + connect(m_ui.searchText, &QLineEdit::textChanged, this, [this](const QString& text) { + m_sort_model->setFilterName(text); + }); + + m_table_view = new QTableView(m_ui.stack); m_table_view->setModel(m_sort_model); m_table_view->setSortingEnabled(true); m_table_view->setSelectionMode(QAbstractItemView::SingleSelection); @@ -107,9 +174,9 @@ void GameListWidget::initialize() connect(m_table_view->horizontalHeader(), &QHeaderView::sortIndicatorChanged, this, &GameListWidget::onTableViewHeaderSortIndicatorChanged); - insertWidget(0, m_table_view); + m_ui.stack->insertWidget(0, m_table_view); - m_list_view = new GameListGridListView(this); + m_list_view = new GameListGridListView(m_ui.stack); m_list_view->setModel(m_sort_model); m_list_view->setModelColumn(GameListModel::Column_Cover); m_list_view->setSelectionMode(QAbstractItemView::ExtendedSelection); @@ -121,6 +188,7 @@ void GameListWidget::initialize() m_list_view->setFrameStyle(QFrame::NoFrame); m_list_view->setSpacing(m_model->getCoverArtSpacing()); m_list_view->setVerticalScrollMode(QAbstractItemView::ScrollMode::ScrollPerPixel); + m_list_view->verticalScrollBar()->setSingleStep(15); updateListFont(); @@ -131,31 +199,32 @@ void GameListWidget::initialize() connect(m_list_view, &QListView::activated, this, &GameListWidget::onListViewItemActivated); connect(m_list_view, &QListView::customContextMenuRequested, this, &GameListWidget::onListViewContextMenuRequested); - insertWidget(1, m_list_view); + m_ui.stack->insertWidget(1, m_list_view); - m_empty_widget = new QWidget(this); + m_empty_widget = new QWidget(m_ui.stack); m_empty_ui.setupUi(m_empty_widget); m_empty_ui.supportedFormats->setText(qApp->translate("GameListWidget", SUPPORTED_FORMATS_STRING)); connect(m_empty_ui.addGameDirectory, &QPushButton::clicked, this, [this]() { emit addGameDirectoryRequested(); }); connect(m_empty_ui.scanForNewGames, &QPushButton::clicked, this, [this]() { refresh(false); }); - insertWidget(2, m_empty_widget); + m_ui.stack->insertWidget(2, m_empty_widget); if (Host::GetBaseBoolSettingValue("UI", "GameListGridView", false)) - setCurrentIndex(1); + m_ui.stack->setCurrentIndex(1); else - setCurrentIndex(0); + m_ui.stack->setCurrentIndex(0); + updateToolbar(); resizeTableViewColumnsToFit(); } bool GameListWidget::isShowingGameList() const { - return currentIndex() == 0; + return m_ui.stack->currentIndex() == 0; } bool GameListWidget::isShowingGameGrid() const { - return currentIndex() == 1; + return m_ui.stack->currentIndex() == 1; } bool GameListWidget::getShowGridCoverTitles() const @@ -182,15 +251,22 @@ void GameListWidget::cancelRefresh() m_refresh_thread->cancel(); m_refresh_thread->wait(); - QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - pxAssertRel(!m_refresh_thread, "Game list thread should be unreferenced by now"); + + // Cancelling might not be instant if we're say, scanning a gzip dump. Wait until it's done. + while (m_refresh_thread) + QApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 1); +} + +void GameListWidget::refreshImages() +{ + m_model->refreshImages(); } void GameListWidget::onRefreshProgress(const QString& status, int current, int total) { // switch away from the placeholder while we scan, in case we find anything - if (currentIndex() == 2) - setCurrentIndex(Host::GetBaseBoolSettingValue("UI", "GameListGridView", false) ? 1 : 0); + if (m_ui.stack->currentIndex() == 2) + m_ui.stack->setCurrentIndex(Host::GetBaseBoolSettingValue("UI", "GameListGridView", false) ? 1 : 0); m_model->refresh(); emit refreshProgress(status, current, total); @@ -208,7 +284,7 @@ void GameListWidget::onRefreshComplete() // if we still had no games, switch to the helper widget if (m_model->rowCount() == 0) - setCurrentIndex(2); + m_ui.stack->setCurrentIndex(2); } void GameListWidget::onSelectionModelCurrentChanged(const QModelIndex& current, const QModelIndex& previous) @@ -277,15 +353,13 @@ void GameListWidget::onTableViewHeaderSortIndicatorChanged(int, Qt::SortOrder) void GameListWidget::listZoom(float delta) { - static constexpr float MIN_SCALE = 0.1f; - static constexpr float MAX_SCALE = 2.0f; - const float new_scale = std::clamp(m_model->getCoverScale() + delta, MIN_SCALE, MAX_SCALE); - QtHost::SetBaseFloatSettingValue("UI", "GameListCoverArtScale", new_scale); + Host::SetBaseFloatSettingValue("UI", "GameListCoverArtScale", new_scale); + Host::CommitBaseSettingChanges(); m_model->setCoverScale(new_scale); + m_model->updateCacheSize(width(), height()); updateListFont(); - - m_model->refresh(); + updateToolbar(); } void GameListWidget::gridZoomIn() @@ -298,6 +372,18 @@ void GameListWidget::gridZoomOut() listZoom(-0.05f); } +void GameListWidget::gridIntScale(int int_scale) +{ + const float new_scale = std::clamp(static_cast(int_scale) / 100.0f, MIN_SCALE, MAX_SCALE); + + Host::SetBaseFloatSettingValue("UI", "GameListCoverArtScale", new_scale); + Host::CommitBaseSettingChanges(); + m_model->setCoverScale(new_scale); + m_model->updateCacheSize(width(), height()); + updateListFont(); + updateToolbar(); +} + void GameListWidget::refreshGridCovers() { m_model->refreshCovers(); @@ -305,21 +391,35 @@ void GameListWidget::refreshGridCovers() void GameListWidget::showGameList() { - if (currentIndex() == 0 || m_model->rowCount() == 0) + if (m_ui.stack->currentIndex() == 0 || m_model->rowCount() == 0) + { + // We can click the toolbar multiple times, so keep it correct. + updateToolbar(); return; + } - QtHost::SetBaseBoolSettingValue("UI", "GameListGridView", false); - setCurrentIndex(0); + Host::SetBaseBoolSettingValue("UI", "GameListGridView", false); + Host::CommitBaseSettingChanges(); + m_ui.stack->setCurrentIndex(0); resizeTableViewColumnsToFit(); + updateToolbar(); + emit layoutChange(); } void GameListWidget::showGameGrid() { - if (currentIndex() == 1 || m_model->rowCount() == 0) + if (m_ui.stack->currentIndex() == 1 || m_model->rowCount() == 0) + { + // We can click the toolbar multiple times, so keep it correct. + updateToolbar(); return; + } - QtHost::SetBaseBoolSettingValue("UI", "GameListGridView", true); - setCurrentIndex(1); + Host::SetBaseBoolSettingValue("UI", "GameListGridView", true); + Host::CommitBaseSettingChanges(); + m_ui.stack->setCurrentIndex(1); + updateToolbar(); + emit layoutChange(); } void GameListWidget::setShowCoverTitles(bool enabled) @@ -327,10 +427,13 @@ void GameListWidget::setShowCoverTitles(bool enabled) if (m_model->getShowCoverTitles() == enabled) return; - QtHost::SetBaseBoolSettingValue("UI", "GameListShowCoverTitles", enabled); + Host::SetBaseBoolSettingValue("UI", "GameListShowCoverTitles", enabled); + Host::CommitBaseSettingChanges(); m_model->setShowCoverTitles(enabled); if (isShowingGameGrid()) m_model->refresh(); + updateToolbar(); + emit layoutChange(); } void GameListWidget::updateListFont() @@ -340,10 +443,35 @@ void GameListWidget::updateListFont() m_list_view->setFont(font); } +void GameListWidget::updateToolbar() +{ + const bool grid_view = isShowingGameGrid(); + { + QSignalBlocker sb(m_ui.viewGameGrid); + m_ui.viewGameGrid->setChecked(grid_view); + } + { + QSignalBlocker sb(m_ui.viewGameList); + m_ui.viewGameList->setChecked(!grid_view); + } + { + QSignalBlocker sb(m_ui.viewGridTitles); + m_ui.viewGridTitles->setChecked(m_model->getShowCoverTitles()); + } + { + QSignalBlocker sb(m_ui.gridScale); + m_ui.gridScale->setValue(static_cast(m_model->getCoverScale() * 100.0f)); + } + + m_ui.viewGridTitles->setEnabled(grid_view); + m_ui.gridScale->setEnabled(grid_view); +} + void GameListWidget::resizeEvent(QResizeEvent* event) { - QStackedWidget::resizeEvent(event); + QWidget::resizeEvent(event); resizeTableViewColumnsToFit(); + m_model->updateCacheSize(width(), height()); } void GameListWidget::resizeTableViewColumnsToFit() @@ -353,7 +481,9 @@ void GameListWidget::resizeTableViewColumnsToFit() 80, // code -1, // title -1, // file title - 60, // crc + 65, // crc + 80, // time played + 80, // last played 80, // size 60, // region 100 // compatibility @@ -374,6 +504,8 @@ void GameListWidget::loadTableViewColumnVisibilitySettings() true, // title false, // file title false, // crc + true, // time played + true, // last played true, // size true, // region true // compatibility @@ -392,14 +524,16 @@ void GameListWidget::saveTableViewColumnVisibilitySettings() for (int column = 0; column < GameListModel::Column_Count; column++) { const bool visible = !m_table_view->isColumnHidden(column); - QtHost::SetBaseBoolSettingValue("GameListTableView", getColumnVisibilitySettingsKeyName(column).c_str(), visible); + Host::SetBaseBoolSettingValue("GameListTableView", getColumnVisibilitySettingsKeyName(column).c_str(), visible); + Host::CommitBaseSettingChanges(); } } void GameListWidget::saveTableViewColumnVisibilitySettings(int column) { const bool visible = !m_table_view->isColumnHidden(column); - QtHost::SetBaseBoolSettingValue("GameListTableView", getColumnVisibilitySettingsKeyName(column).c_str(), visible); + Host::SetBaseBoolSettingValue("GameListTableView", getColumnVisibilitySettingsKeyName(column).c_str(), visible); + Host::CommitBaseSettingChanges(); } void GameListWidget::loadTableViewColumnSortSettings() @@ -422,16 +556,17 @@ void GameListWidget::saveTableViewColumnSortSettings() if (sort_column >= 0 && sort_column < GameListModel::Column_Count) { - QtHost::SetBaseStringSettingValue( + Host::SetBaseStringSettingValue( "GameListTableView", "SortColumn", GameListModel::getColumnName(static_cast(sort_column))); } - QtHost::SetBaseBoolSettingValue("GameListTableView", "SortDescending", sort_descending); + Host::SetBaseBoolSettingValue("GameListTableView", "SortDescending", sort_descending); + Host::CommitBaseSettingChanges(); } const GameList::Entry* GameListWidget::getSelectedEntry() const { - if (currentIndex() == 0) + if (m_ui.stack->currentIndex() == 0) { const QItemSelectionModel* selection_model = m_table_view->selectionModel(); if (!selection_model->hasSelection()) diff --git a/pcsx2-qt/GameList/GameListWidget.h b/pcsx2-qt/GameList/GameListWidget.h index 6ba453ec53..601024ca3f 100644 --- a/pcsx2-qt/GameList/GameListWidget.h +++ b/pcsx2-qt/GameList/GameListWidget.h @@ -16,8 +16,8 @@ #pragma once #include "pcsx2/Frontend/GameList.h" #include "ui_EmptyGameListWidget.h" +#include "ui_GameListWidget.h" #include -#include #include Q_DECLARE_METATYPE(const GameList::Entry*); @@ -41,7 +41,7 @@ protected: void wheelEvent(QWheelEvent* e); }; -class GameListWidget : public QStackedWidget +class GameListWidget : public QWidget { Q_OBJECT @@ -56,10 +56,10 @@ public: void refresh(bool invalidate_cache); void cancelRefresh(); + void refreshImages(); bool isShowingGameList() const; bool isShowingGameGrid() const; - bool getShowGridCoverTitles() const; const GameList::Entry* getSelectedEntry() const; @@ -73,6 +73,7 @@ Q_SIGNALS: void entryContextMenuRequested(const QPoint& point); void addGameDirectoryRequested(); + void layoutChange(); private Q_SLOTS: void onRefreshProgress(const QString& status, int current, int total); @@ -92,6 +93,7 @@ public Q_SLOTS: void setShowCoverTitles(bool enabled); void gridZoomIn(); void gridZoomOut(); + void gridIntScale(int int_scale); void refreshGridCovers(); protected: @@ -105,6 +107,9 @@ private: void saveTableViewColumnSortSettings(); void listZoom(float delta); void updateListFont(); + void updateToolbar(); + + Ui::GameListWidget m_ui; GameListModel* m_model = nullptr; GameListSortModel* m_sort_model = nullptr; diff --git a/pcsx2-qt/GameList/GameListWidget.ui b/pcsx2-qt/GameList/GameListWidget.ui new file mode 100644 index 0000000000..7fa2956894 --- /dev/null +++ b/pcsx2-qt/GameList/GameListWidget.ui @@ -0,0 +1,220 @@ + + + GameListWidget + + + + 0 + 0 + 758 + 619 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 3 + + + 3 + + + 3 + + + 3 + + + + + 3 + + + + + + 32 + 0 + + + + Game List + + + + .. + + + true + + + true + + + + + + + + 32 + 0 + + + + Game Grid + + + + .. + + + true + + + true + + + + + + + + 32 + 0 + + + + Show Titles + + + + .. + + + true + + + true + + + + + + + + 125 + 0 + + + + + 125 + 16777215 + + + + 10 + + + 200 + + + Qt::Horizontal + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 6 + + + + + + All Types + + + + .. + + + + + + + + + All Regions + + + + .. + + + + + + + + + 150 + 0 + + + + Search... + + + true + + + + + + + + + + + + + + + + + diff --git a/pcsx2-qt/Main.cpp b/pcsx2-qt/Main.cpp deleted file mode 100644 index 980877a3d6..0000000000 --- a/pcsx2-qt/Main.cpp +++ /dev/null @@ -1,255 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2022 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" - -#include -#include -#include -#include - -#include "MainWindow.h" -#include "EmuThread.h" -#include "QtHost.h" - -#include "CDVD/CDVD.h" -#include "Frontend/GameList.h" -#include "Frontend/LogSink.h" - -#include "common/CrashHandler.h" - -static void PrintCommandLineVersion() -{ - Host::InitializeEarlyConsole(); - std::fprintf(stderr, "%s\n", (QtHost::GetAppNameAndVersion() + QtHost::GetAppConfigSuffix()).toUtf8().constData()); - std::fprintf(stderr, "https://pcsx2.net/\n"); - std::fprintf(stderr, "\n"); -} - -static void PrintCommandLineHelp(const char* progname) -{ - PrintCommandLineVersion(); - std::fprintf(stderr, "Usage: %s [parameters] [--] [boot filename]\n", progname); - std::fprintf(stderr, "\n"); - std::fprintf(stderr, " -help: Displays this information and exits.\n"); - std::fprintf(stderr, " -version: Displays version information and exits.\n"); - std::fprintf(stderr, " -batch: Enables batch mode (exits after shutting down).\n"); - std::fprintf(stderr, " -elf : Overrides the boot ELF with the specified filename.\n"); - std::fprintf(stderr, " -disc : Uses the specified host DVD drive as a source.\n"); - std::fprintf(stderr, " -bios: Starts the BIOS (System Menu/OSDSYS).\n"); - std::fprintf(stderr, " -fastboot: Force fast boot for provided filename.\n"); - std::fprintf(stderr, " -slowboot: Force slow boot for provided filename.\n"); - std::fprintf(stderr, " -state : Loads specified save state by index.\n"); - std::fprintf(stderr, " -statefile : Loads state from the specified filename.\n"); - std::fprintf(stderr, " -fullscreen: Enters fullscreen mode immediately after starting.\n"); - std::fprintf(stderr, " -nofullscreen: Prevents fullscreen mode from triggering if enabled.\n"); - std::fprintf(stderr, " -earlyconsolelog: Forces logging of early console messages to console.\n"); - std::fprintf(stderr, " --: Signals that no more arguments will follow and the remaining\n" - " parameters make up the filename. Use when the filename contains\n" - " spaces or starts with a dash.\n"); - std::fprintf(stderr, "\n"); -} - -static std::shared_ptr& AutoBoot(std::shared_ptr& autoboot) -{ - if (!autoboot) - autoboot = std::make_shared(); - - return autoboot; -} - -static bool ParseCommandLineOptions(int argc, char* argv[], std::shared_ptr& autoboot) -{ - bool no_more_args = false; - - for (int i = 1; i < argc; i++) - { - if (!no_more_args) - { -#define CHECK_ARG(str) !std::strcmp(argv[i], str) -#define CHECK_ARG_PARAM(str) (!std::strcmp(argv[i], str) && ((i + 1) < argc)) - - if (CHECK_ARG("-help")) - { - PrintCommandLineHelp(argv[0]); - return false; - } - else if (CHECK_ARG("-version")) - { - PrintCommandLineVersion(); - return false; - } - else if (CHECK_ARG("-batch")) - { - QtHost::SetBatchMode(true); - continue; - } - else if (CHECK_ARG("-fastboot")) - { - AutoBoot(autoboot)->fast_boot = true; - continue; - } - else if (CHECK_ARG("-slowboot")) - { - AutoBoot(autoboot)->fast_boot = false; - continue; - } - else if (CHECK_ARG_PARAM("-state")) - { - AutoBoot(autoboot)->state_index = std::atoi(argv[++i]); - continue; - } - else if (CHECK_ARG_PARAM("-statefile")) - { - AutoBoot(autoboot)->save_state = argv[++i]; - continue; - } - else if (CHECK_ARG_PARAM("-elf")) - { - AutoBoot(autoboot)->elf_override = argv[++i]; - continue; - } - else if (CHECK_ARG_PARAM("-disc")) - { - AutoBoot(autoboot)->source_type = CDVD_SourceType::Disc; - AutoBoot(autoboot)->filename = argv[++i]; - continue; - } - else if (CHECK_ARG("-bios")) - { - AutoBoot(autoboot)->source_type = CDVD_SourceType::NoDisc; - continue; - } - else if (CHECK_ARG("-fullscreen")) - { - AutoBoot(autoboot)->fullscreen = true; - continue; - } - else if (CHECK_ARG("-nofullscreen")) - { - AutoBoot(autoboot)->fullscreen = false; - continue; - } - else if (CHECK_ARG("-earlyconsolelog")) - { - Host::InitializeEarlyConsole(); - continue; - } - else if (CHECK_ARG("--")) - { - no_more_args = true; - continue; - } - else if (argv[i][0] == '-') - { - Host::InitializeEarlyConsole(); - std::fprintf(stderr, "Unknown parameter: '%s'", argv[i]); - return false; - } - -#undef CHECK_ARG -#undef CHECK_ARG_PARAM - } - - if (!AutoBoot(autoboot)->filename.empty()) - AutoBoot(autoboot)->filename += ' '; - - AutoBoot(autoboot)->filename += argv[i]; - } - - // check autoboot parameters, if we set something like fullscreen without a bios - // or disc, we don't want to actually start. - if (autoboot && !autoboot->source_type.has_value() && autoboot->filename.empty() && autoboot->elf_override.empty()) - { - Host::InitializeEarlyConsole(); - Console.Warning("Skipping autoboot due to no boot parameters."); - autoboot.reset(); - } - - // if we don't have autoboot, we definitely don't want batch mode (because that'll skip - // scanning the game list). - if (QtHost::InBatchMode() && !autoboot) - { - Host::InitializeEarlyConsole(); - Console.Warning("Disabling batch mode, because we have no autoboot."); - QtHost::SetBatchMode(false); - } - - return true; -} - -#ifndef _WIN32 - -// See note at the end of the file as to why we don't do this on Windows. -static bool PerformEarlyHardwareChecks() -{ - // NOTE: No point translating this message, because the configuration isn't loaded yet, so we - // won't know which language to use, and loading the configuration uses float instructions. - const char* error; - if (VMManager::PerformEarlyHardwareChecks(&error)) - return true; - - QMessageBox::critical(nullptr, QStringLiteral("Hardware Check Failed"), QString::fromUtf8(error)); - return false; -} - -#endif - -int main(int argc, char* argv[]) -{ - CrashHandler::Install(); - - QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); - QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); - - QApplication app(argc, argv); - -#ifndef _WIN32 - if (!PerformEarlyHardwareChecks()) - return EXIT_FAILURE; -#endif - - std::shared_ptr autoboot; - if (!ParseCommandLineOptions(argc, argv, autoboot)) - return EXIT_FAILURE; - - MainWindow* main_window = new MainWindow(QApplication::style()->objectName()); - - if (!QtHost::Initialize()) - { - delete main_window; - return EXIT_FAILURE; - } - - // actually show the window, the emuthread might still be starting up at this point - main_window->initialize(); - - // skip scanning the game list when running in batch mode - if (!QtHost::InBatchMode()) - main_window->refreshGameList(false); - - main_window->show(); - - if (autoboot) - g_emu_thread->startVM(std::move(autoboot)); - else - main_window->startupUpdateCheck(); - - const int result = app.exec(); - - QtHost::Shutdown(); - return result; -} diff --git a/pcsx2-qt/MainWindow.cpp b/pcsx2-qt/MainWindow.cpp index d5db5e21e5..034a546de4 100644 --- a/pcsx2-qt/MainWindow.cpp +++ b/pcsx2-qt/MainWindow.cpp @@ -28,7 +28,7 @@ #include "common/CocoaTools.h" #include "common/FileSystem.h" -#include "pcsx2/CDVD/CDVDaccess.h" +#include "pcsx2/CDVD/CDVDcommon.h" #include "pcsx2/CDVD/CDVDdiscReader.h" #include "pcsx2/Frontend/GameList.h" #include "pcsx2/Frontend/LogSink.h" @@ -37,11 +37,12 @@ #include "pcsx2/HostSettings.h" #include "pcsx2/PerformanceMetrics.h" #include "pcsx2/Recording/InputRecording.h" +#include "pcsx2/Recording/InputRecordingControls.h" #include "AboutDialog.h" #include "AutoUpdaterDialog.h" +#include "CoverDownloadDialog.h" #include "DisplayWidget.h" -#include "EmuThread.h" #include "GameList/GameListRefreshThread.h" #include "GameList/GameListWidget.h" #include "MainWindow.h" @@ -52,11 +53,21 @@ #include "Settings/InterfaceSettingsWidget.h" #include "SettingWidgetBinder.h" #include "svnrev.h" +#include "Tools/InputRecording/InputRecordingViewer.h" #include "Tools/InputRecording/NewInputRecordingDlg.h" +#ifdef _WIN32 +#include "common/RedtapeWindows.h" +#include +#endif + +#ifdef ENABLE_RAINTEGRATION +#include "pcsx2/Frontend/Achievements.h" +#endif + static constexpr char OPEN_FILE_FILTER[] = - QT_TRANSLATE_NOOP("MainWindow", "All File Types (*.bin *.iso *.cue *.chd *.cso *.gz *.elf *.irx *.m3u *.gs *.gs.xz *.gs.zst *.dump);;" + QT_TRANSLATE_NOOP("MainWindow", "All File Types (*.bin *.iso *.cue *.chd *.cso *.gz *.elf *.irx *.gs *.gs.xz *.gs.zst *.dump);;" "Single-Track Raw Images (*.bin *.iso);;" "Cue Sheets (*.cue);;" "MAME CHD Images (*.chd);;" @@ -64,7 +75,6 @@ static constexpr char OPEN_FILE_FILTER[] = "GZ Images (*.gz);;" "ELF Executables (*.elf);;" "IRX Executables (*.irx);;" - "Playlists (*.m3u);;" "GS Dumps (*.gs *.gs.xz *.gs.zst);;" "Block Dumps (*.dump)"); @@ -84,16 +94,32 @@ const char* MainWindow::DEFAULT_THEME_NAME = "darkfusion"; #endif MainWindow* g_main_window = nullptr; +static QString s_unthemed_style_name; +static QPalette s_unthemed_palette; +static bool s_unthemed_style_name_set; + +#if defined(_WIN32) || defined(__APPLE__) +static const bool s_use_central_widget = false; +#else +// Qt Wayland is broken. Any sort of stacked widget usage fails to update, +// leading to broken window resizes, no display rendering, etc. So, we mess +// with the central widget instead. Which we can't do on xorg, because it +// breaks window resizing there... +static bool s_use_central_widget = false; +#endif // UI thread VM validity. static bool s_vm_valid = false; static bool s_vm_paused = false; -MainWindow::MainWindow(const QString& unthemed_style_name) - : m_unthemed_style_name(unthemed_style_name) +MainWindow::MainWindow() { pxAssert(!g_main_window); g_main_window = this; + +#if !defined(_WIN32) && !defined(__APPLE__) + s_use_central_widget = DisplayContainer::isRunningOnWayland(); +#endif } MainWindow::~MainWindow() @@ -101,6 +127,9 @@ MainWindow::~MainWindow() // we compare here, since recreate destroys the window later if (g_main_window == this) g_main_window = nullptr; +#ifdef _WIN32 + unregisterForDeviceNotifications(); +#endif #ifdef __APPLE__ CocoaTools::RemoveThemeChangeHandler(this); #endif @@ -108,15 +137,12 @@ MainWindow::~MainWindow() void MainWindow::initialize() { - setStyleFromSettings(); - setIconThemeFromStyle(); #ifdef __APPLE__ CocoaTools::AddThemeChangeHandler(this, [](void* ctx) { // This handler is called *before* the style change has propagated far enough for Qt to see it // Use RunOnUIThread to delay until it has QtHost::RunOnUIThread([ctx = static_cast(ctx)] { - ctx->setStyleFromSettings(); // Qt won't notice the style change without us touching the palette in some way - ctx->setIconThemeFromStyle(); + ctx->updateTheme(); // Qt won't notice the style change without us touching the palette in some way }); }); #endif @@ -129,6 +155,10 @@ void MainWindow::initialize() switchToGameListView(); updateWindowTitle(); updateSaveStateMenus(QString(), QString(), 0); + +#ifdef _WIN32 + registerForDeviceNotifications(); +#endif } // TODO: Figure out how to set this in the .ui file @@ -151,11 +181,20 @@ static void makeIconsMasks(QWidget* menu) } } +QWidget* MainWindow::getContentParent() +{ + return s_use_central_widget ? static_cast(this) : static_cast(m_ui.mainContainer); +} + void MainWindow::setupAdditionalUi() { + const bool show_advanced_settings = QtHost::ShouldShowAdvancedSettings(); + setWindowIcon(QIcon(QStringLiteral("%1/icons/AppIconLarge.png").arg(QtHost::GetResourcesBasePath()))); makeIconsMasks(menuBar()); + m_ui.menuDebug->menuAction()->setVisible(show_advanced_settings); + const bool toolbar_visible = Host::GetBaseBoolSettingValue("UI", "ShowToolbar", false); m_ui.actionViewToolbar->setChecked(toolbar_visible); m_ui.toolBar->setVisible(toolbar_visible); @@ -169,14 +208,24 @@ void MainWindow::setupAdditionalUi() m_ui.actionViewStatusBar->setChecked(status_bar_visible); m_ui.statusBar->setVisible(status_bar_visible); - m_game_list_widget = new GameListWidget(this); + m_game_list_widget = new GameListWidget(getContentParent()); m_game_list_widget->initialize(); m_ui.actionGridViewShowTitles->setChecked(m_game_list_widget->getShowGridCoverTitles()); - setCentralWidget(m_game_list_widget); + if (s_use_central_widget) + { + m_ui.mainContainer = nullptr; // setCentralWidget() will delete this + setCentralWidget(m_game_list_widget); + } + else + { + m_ui.mainContainer->addWidget(m_game_list_widget); + } m_status_progress_widget = new QProgressBar(m_ui.statusBar); m_status_progress_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); m_status_progress_widget->setFixedSize(140, 16); + m_status_progress_widget->setMinimum(0); + m_status_progress_widget->setMaximum(100); m_status_progress_widget->hide(); m_status_verbose_widget = new QLabel(m_ui.statusBar); @@ -209,6 +258,39 @@ void MainWindow::setupAdditionalUi() } updateEmulationActions(false, false); + updateDisplayRelatedActions(false, false, false); + +#ifdef ENABLE_RAINTEGRATION + if (Achievements::IsUsingRAIntegration()) + { + QMenu* raMenu = new QMenu(QStringLiteral("RAIntegration"), m_ui.menu_Tools); + connect(raMenu, &QMenu::aboutToShow, this, [this, raMenu]() { + raMenu->clear(); + + const auto items = Achievements::RAIntegration::GetMenuItems(); + for (const auto& [id, title, checked] : items) + { + if (id == 0) + { + raMenu->addSeparator(); + continue; + } + + QAction* raAction = raMenu->addAction(QString::fromUtf8(title)); + if (checked) + { + raAction->setCheckable(true); + raAction->setChecked(checked); + } + + connect(raAction, &QAction::triggered, this, [id = id]() { + Host::RunOnCPUThread([id]() { Achievements::RAIntegration::ActivateMenuItem(id); }, false); + }); + } + }); + m_ui.menu_Tools->insertMenu(m_ui.menuInput_Recording->menuAction(), raMenu); + } +#endif } void MainWindow::connectSignals() @@ -223,8 +305,8 @@ void MainWindow::connectSignals() connect(m_ui.actionRemoveDisc, &QAction::triggered, this, &MainWindow::onRemoveDiscActionTriggered); connect(m_ui.menuChangeDisc, &QMenu::aboutToShow, this, &MainWindow::onChangeDiscMenuAboutToShow); connect(m_ui.menuChangeDisc, &QMenu::aboutToHide, this, &MainWindow::onChangeDiscMenuAboutToHide); - connect(m_ui.actionPowerOff, &QAction::triggered, this, [this]() { requestShutdown(true, true); }); - connect(m_ui.actionPowerOffWithoutSaving, &QAction::triggered, this, [this]() { requestShutdown(false, false); }); + connect(m_ui.actionPowerOff, &QAction::triggered, this, [this]() { requestShutdown(true, true, EmuConfig.SaveStateOnShutdown); }); + connect(m_ui.actionPowerOffWithoutSaving, &QAction::triggered, this, [this]() { requestShutdown(false, false, false); }); connect(m_ui.actionLoadState, &QAction::triggered, this, [this]() { m_ui.menuLoadState->exec(QCursor::pos()); }); connect(m_ui.actionSaveState, &QAction::triggered, this, [this]() { m_ui.menuSaveState->exec(QCursor::pos()); }); connect(m_ui.actionExit, &QAction::triggered, this, &MainWindow::close); @@ -236,12 +318,12 @@ void MainWindow::connectSignals() connect(m_ui.actionGameListSettings, &QAction::triggered, [this]() { doSettings("Game List"); }); connect(m_ui.actionEmulationSettings, &QAction::triggered, [this]() { doSettings("Emulation"); }); connect(m_ui.actionBIOSSettings, &QAction::triggered, [this]() { doSettings("BIOS"); }); - connect(m_ui.actionSystemSettings, &QAction::triggered, [this]() { doSettings("System"); }); connect(m_ui.actionGraphicsSettings, &QAction::triggered, [this]() { doSettings("Graphics"); }); connect(m_ui.actionAudioSettings, &QAction::triggered, [this]() { doSettings("Audio"); }); connect(m_ui.actionMemoryCardSettings, &QAction::triggered, [this]() { doSettings("Memory Cards"); }); connect(m_ui.actionDEV9Settings, &QAction::triggered, [this]() { doSettings("Network & HDD"); }); connect(m_ui.actionFolderSettings, &QAction::triggered, [this]() { doSettings("Folders"); }); + connect(m_ui.actionAchievementSettings, &QAction::triggered, [this]() { doSettings("Achievements"); }); connect( m_ui.actionControllerSettings, &QAction::triggered, [this]() { doControllerSettings(ControllerSettingsDialog::Category::GlobalSettings); }); connect(m_ui.actionHotkeySettings, &QAction::triggered, [this]() { doControllerSettings(ControllerSettingsDialog::Category::HotkeySettings); }); @@ -263,6 +345,7 @@ void MainWindow::connectSignals() connect(m_ui.actionAbout, &QAction::triggered, this, &MainWindow::onAboutActionTriggered); connect(m_ui.actionCheckForUpdates, &QAction::triggered, this, &MainWindow::onCheckForUpdatesActionTriggered); connect(m_ui.actionOpenDataDirectory, &QAction::triggered, this, &MainWindow::onToolsOpenDataDirectoryTriggered); + connect(m_ui.actionCoverDownloader, &QAction::triggered, this, &MainWindow::onToolsCoverDownloaderTriggered); connect(m_ui.actionGridViewShowTitles, &QAction::triggered, m_game_list_widget, &GameListWidget::setShowCoverTitles); connect(m_ui.actionGridViewZoomIn, &QAction::triggered, m_game_list_widget, [this]() { if (isShowingGameList()) @@ -273,31 +356,30 @@ void MainWindow::connectSignals() m_game_list_widget->gridZoomOut(); }); connect(m_ui.actionGridViewRefreshCovers, &QAction::triggered, m_game_list_widget, &GameListWidget::refreshGridCovers); + connect(m_game_list_widget, &GameListWidget::layoutChange, this, [this]() { + QSignalBlocker sb(m_ui.actionGridViewShowTitles); + m_ui.actionGridViewShowTitles->setChecked(m_game_list_widget->getShowGridCoverTitles()); + }); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionViewStatusBarVerbose, "UI", "VerboseStatusBar", false); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionEnableSystemConsole, "Logging", "EnableSystemConsole", false); - connect(m_ui.actionEnableSystemConsole, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged); #ifndef PCSX2_DEVBUILD SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionEnableVerboseLogging, "Logging", "EnableVerbose", false); - connect(m_ui.actionEnableVerboseLogging, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged); #else // Dev builds always have verbose logging. m_ui.actionEnableVerboseLogging->setChecked(true); m_ui.actionEnableVerboseLogging->setEnabled(false); #endif SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionEnableEEConsoleLogging, "Logging", "EnableEEConsole", true); - connect(m_ui.actionEnableEEConsoleLogging, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionEnableIOPConsoleLogging, "Logging", "EnableIOPConsole", true); - connect(m_ui.actionEnableIOPConsoleLogging, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionEnableFileLogging, "Logging", "EnableFileLogging", false); - connect(m_ui.actionEnableFileLogging, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionEnableLogTimestamps, "Logging", "EnableTimestamps", true); - connect(m_ui.actionEnableLogTimestamps, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionEnableCDVDVerboseReads, "EmuCore", "CdvdVerboseReads", false); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionSaveBlockDump, "EmuCore", "CdvdDumpBlocks", false); + m_ui.actionShowAdvancedSettings->setChecked(QtHost::ShouldShowAdvancedSettings()); connect(m_ui.actionSaveBlockDump, &QAction::toggled, this, &MainWindow::onBlockDumpActionToggled); - + connect(m_ui.actionShowAdvancedSettings, &QAction::toggled, this, &MainWindow::onShowAdvancedSettingsToggled); connect(m_ui.actionSaveGSDump, &QAction::triggered, this, &MainWindow::onSaveGSDumpActionTriggered); // Input Recording @@ -305,9 +387,8 @@ void MainWindow::connectSignals() connect(m_ui.actionInputRecPlay, &QAction::triggered, this, &MainWindow::onInputRecPlayActionTriggered); connect(m_ui.actionInputRecStop, &QAction::triggered, this, &MainWindow::onInputRecStopActionTriggered); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionInputRecConsoleLogs, "Logging", "EnableInputRecordingLogs", false); - connect(m_ui.actionInputRecConsoleLogs, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.actionInputRecControllerLogs, "Logging", "EnableControllerLogs", false); - connect(m_ui.actionInputRecControllerLogs, &QAction::triggered, this, &MainWindow::onLoggingOptionChanged); + connect(m_ui.actionInputRecOpenViewer, &QAction::triggered, this, &MainWindow::onInputRecOpenViewer); // These need to be queued connections to stop crashing due to menus opening/closing and switching focus. connect(m_game_list_widget, &GameListWidget::refreshProgress, this, &MainWindow::onGameListRefreshProgress); @@ -322,6 +403,9 @@ void MainWindow::connectSignals() void MainWindow::connectVMThreadSignals(EmuThread* thread) { + connect(m_ui.actionStartFullscreenUI, &QAction::triggered, thread, &EmuThread::startFullscreenUI); + connect(m_ui.actionStartFullscreenUI2, &QAction::triggered, thread, &EmuThread::startFullscreenUI); + connect(thread, &EmuThread::messageConfirmed, this, &MainWindow::confirmMessage, Qt::BlockingQueuedConnection); connect(thread, &EmuThread::onCreateDisplayRequested, this, &MainWindow::createDisplay, Qt::BlockingQueuedConnection); connect(thread, &EmuThread::onUpdateDisplayRequested, this, &MainWindow::updateDisplay, Qt::BlockingQueuedConnection); connect(thread, &EmuThread::onDestroyDisplayRequested, this, &MainWindow::destroyDisplay, Qt::BlockingQueuedConnection); @@ -354,16 +438,71 @@ void MainWindow::connectVMThreadSignals(EmuThread* thread) void MainWindow::recreate() { if (s_vm_valid) - requestShutdown(false, true, true); + requestShutdown(false, true, EmuConfig.SaveStateOnShutdown); + + // We need to close input sources, because e.g. DInput uses our window handle. + g_emu_thread->closeInputSources(); close(); g_main_window = nullptr; - MainWindow* new_main_window = new MainWindow(m_unthemed_style_name); + MainWindow* new_main_window = new MainWindow(); new_main_window->initialize(); new_main_window->refreshGameList(false); new_main_window->show(); deleteLater(); + + // Reload the sources we just closed. + g_emu_thread->reloadInputSources(); +} + +void MainWindow::recreateSettings() +{ + QString current_category; + if (m_settings_dialog) + { + const bool was_visible = m_settings_dialog->isVisible(); + + current_category = m_settings_dialog->getCategory(); + m_settings_dialog->hide(); + m_settings_dialog->deleteLater(); + m_settings_dialog = nullptr; + + if (!was_visible) + return; + } + + doSettings(current_category.toUtf8().constData()); +} + +void MainWindow::resetSettings(bool ui) +{ + Host::RequestResetSettings(false, true, false, false, ui); + + if (ui) + { + // UI reset includes theme (and eventually language). + // Just updating the theme here, when there's no change, causes Qt to get very confused.. + // So, we'll just tear down everything and recreate. We'll need to do that for language + // resets eventaully anyway. + recreate(); + } + + // g_main_window here for recreate() case above. + g_main_window->recreateSettings(); +} + +void MainWindow::updateApplicationTheme() +{ + if (!s_unthemed_style_name_set) + { + s_unthemed_style_name_set = true; + s_unthemed_style_name = QApplication::style()->objectName(); + s_unthemed_palette = QApplication::style()->standardPalette(); + } + + setStyleFromSettings(); + setIconThemeFromStyle(); } void MainWindow::setStyleFromSettings() @@ -372,7 +511,7 @@ void MainWindow::setStyleFromSettings() if (theme == "fusion") { - qApp->setPalette(QApplication::style()->standardPalette()); + qApp->setPalette(s_unthemed_palette); qApp->setStyleSheet(QString()); qApp->setStyle(QStyleFactory::create("Fusion")); } @@ -507,6 +646,7 @@ void MainWindow::setStyleFromSettings() darkPalette.setColor(QPalette::Link, blue); darkPalette.setColor(QPalette::Highlight, lighterGray); darkPalette.setColor(QPalette::HighlightedText, Qt::white); + darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); darkPalette.setColor(QPalette::Active, QPalette::Button, gray.darker()); darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); @@ -542,6 +682,7 @@ void MainWindow::setStyleFromSettings() darkPalette.setColor(QPalette::Link, blue); darkPalette.setColor(QPalette::Highlight, blue2); darkPalette.setColor(QPalette::HighlightedText, Qt::white); + darkPalette.setColor(QPalette::PlaceholderText, QColor(Qt::white).darker()); darkPalette.setColor(QPalette::Active, QPalette::Button, gray.darker()); darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); @@ -587,11 +728,64 @@ void MainWindow::setStyleFromSettings() qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); } + else if (theme == "Ruby") + { + // Custom pallete by Daisouji, Black as main color andd Red as complimentary. + // Alternative dark theme. + qApp->setStyle(QStyleFactory::create("Fusion")); + + const QColor gray(128, 128, 128); + const QColor slate(18, 18, 18); + const QColor rubyish(172, 21, 31); + + QPalette darkPalette; + darkPalette.setColor(QPalette::Window, slate); + darkPalette.setColor(QPalette::WindowText, Qt::white); + darkPalette.setColor(QPalette::Base, slate.lighter()); + darkPalette.setColor(QPalette::AlternateBase, slate.lighter()); + darkPalette.setColor(QPalette::ToolTipBase, slate); + darkPalette.setColor(QPalette::ToolTipText, Qt::white); + darkPalette.setColor(QPalette::Text, Qt::white); + darkPalette.setColor(QPalette::Button, slate); + darkPalette.setColor(QPalette::ButtonText, Qt::white); + darkPalette.setColor(QPalette::Link, Qt::white); + darkPalette.setColor(QPalette::Highlight, rubyish); + darkPalette.setColor(QPalette::HighlightedText, Qt::white); + + darkPalette.setColor(QPalette::Active, QPalette::Button, slate.lighter()); + darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); + darkPalette.setColor(QPalette::Disabled, QPalette::Light, slate.lighter()); + + qApp->setPalette(darkPalette); + + qApp->setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }"); + } + else if (theme == "Custom") + { + + //Additional Theme option than loads .qss from main PCSX2 Directory + qApp->setStyle(QStyleFactory::create("Fusion")); + + QString sheet_content; + QFile sheets(QString::fromStdString(Path::Combine(EmuFolders::DataRoot, "custom.qss"))); + + if (sheets.open(QFile::ReadOnly)) + { + QString sheet_content = QString::fromUtf8(sheets.readAll().data()); + qApp->setStyleSheet(sheet_content); + } + else + { + qApp->setStyle(QStyleFactory::create("Fusion")); + } + } else { - qApp->setPalette(QApplication::style()->standardPalette()); + qApp->setPalette(s_unthemed_palette); qApp->setStyleSheet(QString()); - qApp->setStyle(m_unthemed_style_name); + qApp->setStyle(s_unthemed_style_name); } } @@ -632,7 +826,52 @@ void MainWindow::onBlockDumpActionToggled(bool checked) return; } - QtHost::SetBaseStringSettingValue("EmuCore", "BlockDumpSaveDirectory", new_dir.toUtf8().constData()); + Host::SetBaseStringSettingValue("EmuCore", "BlockDumpSaveDirectory", new_dir.toUtf8().constData()); + Host::CommitBaseSettingChanges(); + + g_emu_thread->applySettings(); +} + +void MainWindow::onShowAdvancedSettingsToggled(bool checked) +{ + if (checked && !Host::GetBaseBoolSettingValue("UI", "AdvancedSettingsWarningShown", false)) + { + QCheckBox* cb = new QCheckBox(tr("Do not show again")); + QMessageBox mb(this); + mb.setWindowTitle(tr("Show Advanced Settings")); + mb.setText( + tr("Changing advanced settings can have unpredictable effects on games, including graphical glitches, lock-ups, and even corrupted save files. " + "We do not recommend changing advanced settings unless you know what you are doing, and the implications of changing each setting.\n\n" + "The PCSX2 team will not provide any support for configurations that modify these settings, you are on your own.\n\n" + "Are you sure you want to continue?")); + mb.setIcon(QMessageBox::Warning); + mb.addButton(QMessageBox::Yes); + mb.addButton(QMessageBox::No); + mb.setDefaultButton(QMessageBox::No); + mb.setCheckBox(cb); + + if (mb.exec() == QMessageBox::No) + { + QSignalBlocker sb(m_ui.actionShowAdvancedSettings); + m_ui.actionShowAdvancedSettings->setChecked(false); + return; + } + + if (cb->isChecked()) + { + Host::SetBaseBoolSettingValue("UI", "AdvancedSettingsWarningShown", true); + Host::CommitBaseSettingChanges(); + } + } + + Host::SetBaseBoolSettingValue("UI", "ShowAdvancedSettings", checked); + Host::CommitBaseSettingChanges(); + + m_ui.menuDebug->menuAction()->setVisible(checked); + + // just recreate the entire settings window, it's easier. + if (m_settings_dialog) + recreateSettings(); } void MainWindow::saveStateToConfig() @@ -645,7 +884,10 @@ void MainWindow::saveStateToConfig() const QByteArray geometry_b64 = geometry.toBase64(); const std::string old_geometry_b64 = Host::GetBaseStringSettingValue("UI", "MainWindowGeometry"); if (old_geometry_b64 != geometry_b64.constData()) - QtHost::SetBaseStringSettingValue("UI", "MainWindowGeometry", geometry_b64.constData()); + { + Host::SetBaseStringSettingValue("UI", "MainWindowGeometry", geometry_b64.constData()); + Host::CommitBaseSettingChanges(); + } } { @@ -653,7 +895,10 @@ void MainWindow::saveStateToConfig() const QByteArray state_b64 = state.toBase64(); const std::string old_state_b64 = Host::GetBaseStringSettingValue("UI", "MainWindowState"); if (old_state_b64 != state_b64.constData()) - QtHost::SetBaseStringSettingValue("UI", "MainWindowState", state_b64.constData()); + { + Host::SetBaseStringSettingValue("UI", "MainWindowState", state_b64.constData()); + Host::CommitBaseSettingChanges(); + } } } @@ -697,14 +942,11 @@ void MainWindow::updateEmulationActions(bool starting, bool running) m_ui.actionPause->setEnabled(running); m_ui.actionChangeDisc->setEnabled(running); m_ui.actionScreenshot->setEnabled(running); - m_ui.actionViewSystemDisplay->setEnabled(starting_or_running); m_ui.menuChangeDisc->setEnabled(running); m_ui.actionSaveState->setEnabled(running); m_ui.menuSaveState->setEnabled(running); - m_ui.menuWindowSize->setEnabled(starting_or_running); - m_ui.actionFullscreen->setEnabled(starting_or_running); m_ui.actionViewGameProperties->setEnabled(running); m_game_list_widget->setDisabled(starting && !running); @@ -717,6 +959,19 @@ void MainWindow::updateEmulationActions(bool starting, bool running) m_ui.actionRescanAllGames->setDisabled(starting_or_running); } +void MainWindow::updateDisplayRelatedActions(bool has_surface, bool render_to_main, bool fullscreen) +{ + // rendering to main, or switched to gamelist/grid + m_ui.actionViewSystemDisplay->setEnabled((has_surface && render_to_main) || (!has_surface && g_host_display)); + m_ui.menuWindowSize->setEnabled(has_surface && !fullscreen); + m_ui.actionFullscreen->setEnabled(has_surface); + + { + QSignalBlocker blocker(m_ui.actionFullscreen); + m_ui.actionFullscreen->setChecked(fullscreen); + } +} + void MainWindow::updateStatusBarWidgetVisibility() { auto Update = [this](QWidget* widget, bool visible, int stretch) { @@ -768,8 +1023,8 @@ void MainWindow::updateWindowState(bool force_visible) if (m_is_closing) return; - const bool hide_window = !g_emu_thread->isRenderingToMain() && Host::GetBaseBoolSettingValue("UI", "HideMainWindowWhenRunning", false); - const bool disable_resize = Host::GetBaseBoolSettingValue("UI", "DisableWindowResize", false); + const bool hide_window = !isRenderingToMain() && shouldHideMainWindow(); + const bool disable_resize = Host::GetBoolSettingValue("UI", "DisableWindowResize", false); const bool has_window = s_vm_valid || m_display_widget; // Need to test both valid and display widget because of startup (vm invalid while window is created). @@ -789,8 +1044,9 @@ void MainWindow::updateWindowState(bool force_visible) void MainWindow::setProgressBar(int current, int total) { - m_status_progress_widget->setValue(current); - m_status_progress_widget->setMaximum(total); + const int value = (total != 0) ? ((current * 100) / total) : 0; + if (m_status_progress_widget->value() != value) + m_status_progress_widget->setValue(value); if (m_status_progress_widget->isVisible()) return; @@ -810,21 +1066,26 @@ void MainWindow::clearProgressBar() bool MainWindow::isShowingGameList() const { - return (centralWidget() == m_game_list_widget); + if (s_use_central_widget) + return (centralWidget() == m_game_list_widget); + else + return (m_ui.mainContainer->currentIndex() == 0); } bool MainWindow::isRenderingFullscreen() const { - HostDisplay* display = Host::GetHostDisplay(); - if (!display || !m_display_widget) + if (!g_host_display || !m_display_widget) return false; - return (m_display_widget->parent() != this && (m_display_widget->isFullScreen() || display->IsFullscreen())); + return getDisplayContainer()->isFullScreen() || g_host_display->IsFullscreen(); } bool MainWindow::isRenderingToMain() const { - return (m_display_widget && m_display_widget->parent() == this); + if (s_use_central_widget) + return (m_display_widget && centralWidget() == m_display_widget); + else + return (m_display_widget && m_ui.mainContainer->indexOf(m_display_widget) == 1); } bool MainWindow::shouldHideMouseCursor() const @@ -832,15 +1093,23 @@ bool MainWindow::shouldHideMouseCursor() const return isRenderingFullscreen() && Host::GetBoolSettingValue("UI", "HideMouseCursor", false); } +bool MainWindow::shouldHideMainWindow() const +{ + // NOTE: We can't use isRenderingToMain() here, because this happens post-fullscreen-switch. + return Host::GetBoolSettingValue("UI", "HideMainWindowWhenRunning", false) || + (g_emu_thread->shouldRenderToMain() && isRenderingFullscreen()) || + QtHost::InNoGUIMode(); +} + void MainWindow::switchToGameListView() { - if (centralWidget() == m_game_list_widget) + if (isShowingGameList()) { m_game_list_widget->setFocus(); return; } - if (s_vm_valid) + if (m_display_created) { m_was_paused_on_surface_loss = s_vm_paused; if (!s_vm_paused) @@ -851,17 +1120,11 @@ void MainWindow::switchToGameListView() while (m_display_widget) QApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 1); } - - pxAssertMsg(!centralWidget(), "Should not have a central widget at game list switch time"); - takeCentralWidget(); - setCentralWidget(m_game_list_widget); - m_game_list_widget->setVisible(true); - m_game_list_widget->setFocus(); } void MainWindow::switchToEmulationView() { - if (!s_vm_valid || (m_display_widget && centralWidget() == m_display_widget)) + if (!m_display_created || !isShowingGameList()) return; // we're no longer surfaceless! this will call back to UpdateDisplay(), which will swap the widget out. @@ -899,29 +1162,35 @@ void MainWindow::reportError(const QString& title, const QString& message) QMessageBox::critical(this, title, message); } +bool MainWindow::confirmMessage(const QString& title, const QString& message) +{ + VMLock lock(pauseAndLockVM()); + return (QMessageBox::question(this, title, message) == QMessageBox::Yes); +} + void MainWindow::runOnUIThread(const std::function& func) { func(); } -bool MainWindow::requestShutdown(bool allow_confirm /* = true */, bool allow_save_to_state /* = true */, bool block_until_done /* = false */) +bool MainWindow::requestShutdown(bool allow_confirm /* = true */, bool allow_save_to_state /* = true */, bool default_save_to_state /* = true */, bool block_until_done /* = false */) { if (!s_vm_valid) return true; // If we don't have a crc, we can't save state. allow_save_to_state &= (m_current_game_crc != 0); - bool save_state = allow_save_to_state && EmuConfig.SaveStateOnShutdown; + bool save_state = allow_save_to_state && default_save_to_state; // Only confirm on UI thread because we need to display a msgbox. - if (!m_is_closing && allow_confirm && !GSDumpReplayer::IsReplayingDump() && Host::GetBaseBoolSettingValue("UI", "ConfirmShutdown", true)) + if (!m_is_closing && allow_confirm && !GSDumpReplayer::IsReplayingDump() && Host::GetBoolSettingValue("UI", "ConfirmShutdown", true)) { VMLock lock(pauseAndLockVM()); QMessageBox msgbox(lock.getDialogParent()); msgbox.setIcon(QMessageBox::Question); msgbox.setWindowTitle(tr("Confirm Shutdown")); - msgbox.setText("Are you sure you want to shut down the virtual machine?"); + msgbox.setText(tr("Are you sure you want to shut down the virtual machine?")); QCheckBox* save_cb = new QCheckBox(tr("Save State For Resume"), &msgbox); save_cb->setChecked(save_state); @@ -944,7 +1213,7 @@ bool MainWindow::requestShutdown(bool allow_confirm /* = true */, bool allow_sav // reshow the main window during display updates, because otherwise fullscreen transitions and renderer switches // would briefly show and then hide the main window. So instead, we do it on shutdown, here. Except if we're in // batch mode, when we're going to exit anyway. - if (!isRenderingToMain() && isHidden() && !QtHost::InBatchMode()) + if (!isRenderingToMain() && isHidden() && !QtHost::InBatchMode() && !g_emu_thread->isRunningFullscreenUI()) updateWindowState(true); // Now we can actually shut down the VM. @@ -959,10 +1228,10 @@ bool MainWindow::requestShutdown(bool allow_confirm /* = true */, bool allow_sav if (!m_is_closing && QtHost::InBatchMode()) { - // Closing the window should shut down everything. If we don't set the closing flag here, - // the VM shutdown may not complete by the time closeEvent() is called, leading to a confirm. + // If we don't set the closing flag here, the VM shutdown may not complete by the time closeEvent() is called, + // leading to a confirm. m_is_closing = true; - close(); + QGuiApplication::quit(); } return true; @@ -971,10 +1240,12 @@ bool MainWindow::requestShutdown(bool allow_confirm /* = true */, bool allow_sav void MainWindow::requestExit() { // this is block, because otherwise closeEvent() will also prompt - if (!requestShutdown(true, true, true)) + if (!requestShutdown(true, true, EmuConfig.SaveStateOnShutdown, true)) return; - close(); + // We could use close here, but if we're not visible (e.g. quitting from fullscreen), closing the window + // doesn't quit the application. + QGuiApplication::quit(); } void MainWindow::checkForSettingChanges() @@ -985,6 +1256,11 @@ void MainWindow::checkForSettingChanges() updateWindowState(); } +std::optional MainWindow::getWindowInfo() +{ + return QtUtils::GetWindowInfoForWidget(this); +} + void Host::InvalidateSaveStateCache() { QMetaObject::invokeMethod(g_main_window, &MainWindow::invalidateSaveStateCache, Qt::QueuedConnection); @@ -1072,6 +1348,9 @@ void MainWindow::onGameListEntryContextMenuRequested(const QPoint& point) connect(menu.addAction(tr("Exclude From List")), &QAction::triggered, [this, entry]() { getSettingsDialog()->getGameListSettingsWidget()->addExcludedPath(entry->path); }); + connect(menu.addAction(tr("Reset Play Time")), &QAction::triggered, + [this, entry]() { clearGameListEntryPlayTime(entry); }); + menu.addSeparator(); if (!s_vm_valid) @@ -1192,19 +1471,22 @@ void MainWindow::onSaveStateMenuAboutToShow() void MainWindow::onViewToolbarActionToggled(bool checked) { - QtHost::SetBaseBoolSettingValue("UI", "ShowToolbar", checked); + Host::SetBaseBoolSettingValue("UI", "ShowToolbar", checked); + Host::CommitBaseSettingChanges(); m_ui.toolBar->setVisible(checked); } void MainWindow::onViewLockToolbarActionToggled(bool checked) { - QtHost::SetBaseBoolSettingValue("UI", "LockToolbar", checked); + Host::SetBaseBoolSettingValue("UI", "LockToolbar", checked); + Host::CommitBaseSettingChanges(); m_ui.toolBar->setMovable(!checked); } void MainWindow::onViewStatusBarActionToggled(bool checked) { - QtHost::SetBaseBoolSettingValue("UI", "ShowStatusBar", checked); + Host::SetBaseBoolSettingValue("UI", "ShowStatusBar", checked); + Host::CommitBaseSettingChanges(); m_ui.statusBar->setVisible(checked); } @@ -1222,7 +1504,7 @@ void MainWindow::onViewGameGridActionTriggered() void MainWindow::onViewSystemDisplayTriggered() { - if (s_vm_valid) + if (m_display_created) switchToEmulationView(); } @@ -1272,7 +1554,8 @@ void MainWindow::onAboutActionTriggered() void MainWindow::onCheckForUpdatesActionTriggered() { // Wipe out the last version, that way it displays the update if we've previously skipped it. - QtHost::RemoveBaseSettingValue("AutoUpdater", "LastVersion"); + Host::RemoveBaseSettingValue("AutoUpdater", "LastVersion"); + Host::CommitBaseSettingChanges(); checkForUpdates(true); } @@ -1336,23 +1619,17 @@ void MainWindow::onToolsOpenDataDirectoryTriggered() QtUtils::OpenURL(this, QUrl::fromLocalFile(path)); } -void MainWindow::onThemeChanged() +void MainWindow::onToolsCoverDownloaderTriggered() { - setStyleFromSettings(); - setIconThemeFromStyle(); - recreate(); + CoverDownloadDialog dlg(this); + connect(&dlg, &CoverDownloadDialog::coverRefreshRequested, m_game_list_widget, &GameListWidget::refreshGridCovers); + dlg.exec(); } -void MainWindow::onThemeChangedFromSettings() +void MainWindow::updateTheme() { - // reopen the settings dialog after recreating - onThemeChanged(); - g_main_window->doSettings(); -} - -void MainWindow::onLoggingOptionChanged() -{ - Host::UpdateLogging(); + updateApplicationTheme(); + m_game_list_widget->refreshImages(); } void MainWindow::onInputRecNewActionTriggered() @@ -1361,7 +1638,7 @@ void MainWindow::onInputRecNewActionTriggered() const bool wasRunning = s_vm_valid; if (wasRunning && !wasPaused) { - VMManager::SetPaused(true); + g_emu_thread->setVMPaused(true); } NewInputRecordingDlg dlg(this); @@ -1369,29 +1646,37 @@ void MainWindow::onInputRecNewActionTriggered() if (result == QDialog::Accepted) { - if (g_InputRecording.Create( - dlg.getFilePath(), - dlg.getInputRecType() == InputRecording::Type::FROM_SAVESTATE, - dlg.getAuthorName())) - { - return; - } + Host::RunOnCPUThread([&, filePath = dlg.getFilePath(), + fromSavestate = dlg.getInputRecType() == InputRecording::Type::FROM_SAVESTATE, + authorName = dlg.getAuthorName()]() { + if (g_InputRecording.create( + filePath, + fromSavestate, + authorName)) + { + QtHost::RunOnUIThread([&]() { + m_ui.actionInputRecNew->setEnabled(false); + m_ui.actionInputRecStop->setEnabled(true); + m_ui.actionReset->setEnabled(!g_InputRecording.isTypeSavestate()); + }); + } + }); } if (wasRunning && !wasPaused) { - VMManager::SetPaused(false); + g_emu_thread->setVMPaused(false); } } -#include "pcsx2/Recording/InputRecordingControls.h" - void MainWindow::onInputRecPlayActionTriggered() { const bool wasPaused = s_vm_paused; if (!wasPaused) - g_InputRecordingControls.PauseImmediately(); + { + g_emu_thread->setVMPaused(true); + } QFileDialog dialog(this); dialog.setFileMode(QFileDialog::ExistingFile); @@ -1402,30 +1687,49 @@ void MainWindow::onInputRecPlayActionTriggered() { fileNames = dialog.selectedFiles(); } - - if (fileNames.length() > 0) + else { - if (g_InputRecording.IsActive()) - { - g_InputRecording.Stop(); - } - if (g_InputRecording.Play(fileNames.first().toStdString())) + if (!wasPaused) { + g_emu_thread->setVMPaused(false); return; } } - if (!wasPaused) + if (fileNames.length() > 0) { - g_InputRecordingControls.Resume(); + if (g_InputRecording.isActive()) + { + Host::RunOnCPUThread([]() { + g_InputRecording.stop(); + }); + m_ui.actionInputRecStop->setEnabled(false); + } + Host::RunOnCPUThread([&, filename = fileNames.first().toStdString()]() { + if (g_InputRecording.play(filename)) + { + QtHost::RunOnUIThread([&]() { + m_ui.actionInputRecNew->setEnabled(false); + m_ui.actionInputRecStop->setEnabled(true); + m_ui.actionReset->setEnabled(!g_InputRecording.isTypeSavestate()); + }); + } + }); } } void MainWindow::onInputRecStopActionTriggered() { - if (g_InputRecording.IsActive()) + if (g_InputRecording.isActive()) { - g_InputRecording.Stop(); + Host::RunOnCPUThread([&]() { + g_InputRecording.stop(); + QtHost::RunOnUIThread([&]() { + m_ui.actionInputRecNew->setEnabled(true); + m_ui.actionInputRecStop->setEnabled(false); + m_ui.actionReset->setEnabled(true); + }); + }); } } @@ -1434,6 +1738,32 @@ void MainWindow::onInputRecOpenSettingsTriggered() // TODO - Vaser - Implement } +InputRecordingViewer* MainWindow::getInputRecordingViewer() +{ + if (!m_input_recording_viewer) + { + m_input_recording_viewer = new InputRecordingViewer(this); + } + + return m_input_recording_viewer; +} + +void MainWindow::updateInputRecordingActions(bool started) +{ + m_ui.actionInputRecNew->setEnabled(started); + m_ui.actionInputRecPlay->setEnabled(started); +} + +void MainWindow::onInputRecOpenViewer() +{ + InputRecordingViewer* viewer = getInputRecordingViewer(); + if (!viewer->isVisible()) + { + viewer->show(); + } +} + + void MainWindow::onVMStarting() { s_vm_valid = true; @@ -1451,6 +1781,7 @@ void MainWindow::onVMStarted() updateEmulationActions(true, true); updateWindowTitle(); updateStatusBarWidgetVisibility(); + updateInputRecordingActions(true); } void MainWindow::onVMPaused() @@ -1504,6 +1835,7 @@ void MainWindow::onVMStopped() updateWindowTitle(); updateWindowState(); updateStatusBarWidgetVisibility(); + updateInputRecordingActions(false); if (m_display_widget) { @@ -1514,6 +1846,10 @@ void MainWindow::onVMStopped() { switchToGameListView(); } + + // reload played time + if (m_game_list_widget->isShowingGameList()) + m_game_list_widget->refresh(false); } void MainWindow::onGameChanged(const QString& path, const QString& serial, const QString& name, quint32 crc) @@ -1535,11 +1871,16 @@ void MainWindow::showEvent(QShowEvent* event) // the rest of the window... so, instead, let's just force it to be resized on show. if (isShowingGameList()) m_game_list_widget->resizeTableViewColumnsToFit(); + +#ifdef ENABLE_RAINTEGRATION + if (Achievements::IsUsingRAIntegration()) + Achievements::RAIntegration::MainWindowChanged((void*)winId()); +#endif } void MainWindow::closeEvent(QCloseEvent* event) { - if (!requestShutdown(true, true, true)) + if (!requestShutdown(true, true, EmuConfig.SaveStateOnShutdown, true)) { event->ignore(); return; @@ -1604,55 +1945,59 @@ void MainWindow::dropEvent(QDropEvent* event) } } +void MainWindow::registerForDeviceNotifications() +{ +#ifdef _WIN32 + // We use these notifications to detect when a controller is connected or disconnected. + DEV_BROADCAST_DEVICEINTERFACE_W filter = {sizeof(DEV_BROADCAST_DEVICEINTERFACE_W), DBT_DEVTYP_DEVICEINTERFACE}; + m_device_notification_handle = RegisterDeviceNotificationW((HANDLE)winId(), &filter, + DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); +#endif +} + +void MainWindow::unregisterForDeviceNotifications() +{ +#ifdef _WIN32 + if (!m_device_notification_handle) + return; + + UnregisterDeviceNotification(static_cast(m_device_notification_handle)); + m_device_notification_handle = nullptr; +#endif +} + +#ifdef _WIN32 + +bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, qintptr* result) +{ + static constexpr const char win_type[] = "windows_generic_MSG"; + if (eventType == QByteArray(win_type, sizeof(win_type) - 1)) + { + const MSG* msg = static_cast(message); + if (msg->message == WM_DEVICECHANGE && msg->wParam == DBT_DEVNODES_CHANGED) + { + g_emu_thread->reloadInputDevices(); + *result = 1; + return true; + } + } + + return QMainWindow::nativeEvent(eventType, message, result); +} + +#endif + DisplayWidget* MainWindow::createDisplay(bool fullscreen, bool render_to_main) { DevCon.WriteLn("createDisplay(%u, %u)", static_cast(fullscreen), static_cast(render_to_main)); - HostDisplay* host_display = Host::GetHostDisplay(); - if (!host_display) + if (!g_host_display) return nullptr; const std::string fullscreen_mode(Host::GetBaseStringSettingValue("EmuCore/GS", "FullscreenMode", "")); - const bool is_exclusive_fullscreen = (fullscreen && !fullscreen_mode.empty() && host_display->SupportsFullscreen()); + const bool is_exclusive_fullscreen = (fullscreen && !fullscreen_mode.empty() && g_host_display->SupportsFullscreen()); - QWidget* container; - if (DisplayContainer::IsNeeded(fullscreen, render_to_main)) - { - m_display_container = new DisplayContainer(); - m_display_widget = new DisplayWidget(m_display_container); - m_display_container->setDisplayWidget(m_display_widget); - container = m_display_container; - } - else - { - m_display_widget = new DisplayWidget((!fullscreen && render_to_main) ? this : nullptr); - container = m_display_widget; - } - - if (fullscreen || !render_to_main) - { - container->setWindowTitle(windowTitle()); - container->setWindowIcon(windowIcon()); - } - - if (fullscreen) - { - if (!is_exclusive_fullscreen) - container->showFullScreen(); - else - container->showNormal(); - } - else if (!render_to_main) - { - restoreDisplayWindowGeometryFromConfig(); - container->showNormal(); - } - else - { - m_game_list_widget->setVisible(false); - takeCentralWidget(); - setCentralWidget(m_display_widget); - } + createDisplayWidget(fullscreen, render_to_main, is_exclusive_fullscreen); // we need the surface visible.. this might be able to be replaced with something else QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); @@ -1661,32 +2006,36 @@ DisplayWidget* MainWindow::createDisplay(bool fullscreen, bool render_to_main) if (!wi.has_value()) { QMessageBox::critical(this, tr("Error"), tr("Failed to get window info from widget")); - destroyDisplayWidget(); + destroyDisplayWidget(true); return nullptr; } g_emu_thread->connectDisplaySignals(m_display_widget); - if (!host_display->CreateRenderDevice(wi.value(), Host::GetStringSettingValue("EmuCore/GS", "Adapter", ""), EmuConfig.GetEffectiveVsyncMode(), - Host::GetBoolSettingValue("EmuCore/GS", "ThreadedPresentation", false), Host::GetBoolSettingValue("EmuCore/GS", "UseDebugDevice", false))) + if (!g_host_display->CreateDevice(wi.value())) { QMessageBox::critical(this, tr("Error"), tr("Failed to create host display device context.")); - destroyDisplayWidget(); + destroyDisplayWidget(true); return nullptr; } + m_display_created = true; + if (is_exclusive_fullscreen) setDisplayFullscreen(fullscreen_mode); updateWindowTitle(); updateWindowState(); - m_display_widget->setFocus(); + m_ui.actionStartFullscreenUI->setEnabled(false); + m_ui.actionStartFullscreenUI2->setEnabled(false); + m_display_widget->setShouldHideCursor(shouldHideMouseCursor()); m_display_widget->updateRelativeMode(s_vm_valid && !s_vm_paused); m_display_widget->updateCursor(s_vm_valid && !s_vm_paused); + m_display_widget->setFocus(); - host_display->DoneRenderContextCurrent(); + g_host_display->DoneCurrent(); return m_display_widget; } @@ -1695,12 +2044,11 @@ DisplayWidget* MainWindow::updateDisplay(bool fullscreen, bool render_to_main, b DevCon.WriteLn("updateDisplay() fullscreen=%s render_to_main=%s surfaceless=%s", fullscreen ? "true" : "false", render_to_main ? "true" : "false", surfaceless ? "true" : "false"); - HostDisplay* host_display = Host::GetHostDisplay(); QWidget* container = m_display_container ? static_cast(m_display_container) : static_cast(m_display_widget); const bool is_fullscreen = isRenderingFullscreen(); const bool is_rendering_to_main = isRenderingToMain(); const std::string fullscreen_mode(Host::GetBaseStringSettingValue("EmuCore/GS", "FullscreenMode", "")); - const bool is_exclusive_fullscreen = (fullscreen && !fullscreen_mode.empty() && host_display->SupportsFullscreen()); + const bool is_exclusive_fullscreen = (fullscreen && !fullscreen_mode.empty() && g_host_display->SupportsFullscreen()); const bool changing_surfaceless = (!m_display_widget != surfaceless); if (fullscreen == is_fullscreen && is_rendering_to_main == render_to_main && !changing_surfaceless) return m_display_widget; @@ -1708,12 +2056,12 @@ DisplayWidget* MainWindow::updateDisplay(bool fullscreen, bool render_to_main, b // Skip recreating the surface if we're just transitioning between fullscreen and windowed with render-to-main off. // .. except on Wayland, where everything tends to break if you don't recreate. const bool has_container = (m_display_container != nullptr); - const bool needs_container = DisplayContainer::IsNeeded(fullscreen, render_to_main); + const bool needs_container = DisplayContainer::isNeeded(fullscreen, render_to_main); if (!is_rendering_to_main && !render_to_main && !is_exclusive_fullscreen && has_container == needs_container && !needs_container && !changing_surfaceless) { DevCon.WriteLn("Toggling to %s without recreating surface", (fullscreen ? "fullscreen" : "windowed")); - if (host_display->IsFullscreen()) - host_display->SetFullscreen(false, 0, 0, 0.0f); + if (g_host_display->IsFullscreen()) + g_host_display->SetFullscreen(false, 0, 0, 0.0f); // since we don't destroy the display widget, we need to save it here if (!is_fullscreen && !is_rendering_to_main) @@ -1733,79 +2081,33 @@ DisplayWidget* MainWindow::updateDisplay(bool fullscreen, bool render_to_main, b m_display_widget->setShouldHideCursor(shouldHideMouseCursor()); m_display_widget->updateRelativeMode(s_vm_valid && !s_vm_paused); m_display_widget->updateCursor(s_vm_valid && !s_vm_paused); + updateWindowState(); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); return m_display_widget; } - host_display->DestroyRenderSurface(); + g_host_display->DestroySurface(); - destroyDisplayWidget(); + destroyDisplayWidget(surfaceless); // if we're going to surfaceless, we're done here if (surfaceless) return nullptr; - if (DisplayContainer::IsNeeded(fullscreen, render_to_main)) - { - m_display_container = new DisplayContainer(); - m_display_widget = new DisplayWidget(m_display_container); - m_display_container->setDisplayWidget(m_display_widget); - container = m_display_container; - } - else - { - m_display_widget = new DisplayWidget((!fullscreen && render_to_main) ? this : nullptr); - container = m_display_widget; - } - - if (fullscreen || !render_to_main) - { - container->setWindowTitle(windowTitle()); - container->setWindowIcon(windowIcon()); - - // make sure the game list widget is still visible - if (centralWidget() != m_game_list_widget && !fullscreen) - { - setCentralWidget(m_game_list_widget); - m_game_list_widget->setVisible(true); - } - } - - if (fullscreen) - { - if (!is_exclusive_fullscreen) - container->showFullScreen(); - else - container->showNormal(); - } - else if (!render_to_main) - { - restoreDisplayWindowGeometryFromConfig(); - container->showNormal(); - } - else - { - m_game_list_widget->setVisible(false); - takeCentralWidget(); - setCentralWidget(m_display_widget); - m_display_widget->setFocus(); - } - - // we need the surface visible.. this might be able to be replaced with something else - QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + createDisplayWidget(fullscreen, render_to_main, is_exclusive_fullscreen); std::optional wi = m_display_widget->getWindowInfo(); if (!wi.has_value()) { QMessageBox::critical(this, tr("Error"), tr("Failed to get new window info from widget")); - destroyDisplayWidget(); + destroyDisplayWidget(true); return nullptr; } g_emu_thread->connectDisplaySignals(m_display_widget); - if (!host_display->ChangeRenderWindow(wi.value())) + if (!g_host_display->ChangeWindow(wi.value())) pxFailRel("Failed to recreate surface on new widget."); if (is_exclusive_fullscreen) @@ -1819,11 +2121,78 @@ DisplayWidget* MainWindow::updateDisplay(bool fullscreen, bool render_to_main, b m_display_widget->updateRelativeMode(s_vm_valid && !s_vm_paused); m_display_widget->updateCursor(s_vm_valid && !s_vm_paused); - QSignalBlocker blocker(m_ui.actionFullscreen); - m_ui.actionFullscreen->setChecked(fullscreen); return m_display_widget; } +void MainWindow::createDisplayWidget(bool fullscreen, bool render_to_main, bool is_exclusive_fullscreen) +{ + // If we're rendering to main and were hidden (e.g. coming back from fullscreen), + // make sure we're visible before trying to add ourselves. Otherwise Wayland breaks. + if (!fullscreen && render_to_main && !isVisible()) + { + setVisible(true); + QGuiApplication::sync(); + } + + QWidget* container; + if (DisplayContainer::isNeeded(fullscreen, render_to_main)) + { + m_display_container = new DisplayContainer(); + m_display_widget = new DisplayWidget(m_display_container); + m_display_container->setDisplayWidget(m_display_widget); + container = m_display_container; + } + else + { + m_display_widget = new DisplayWidget((!fullscreen && render_to_main) ? getContentParent() : nullptr); + container = m_display_widget; + } + + if (fullscreen || !render_to_main) + { + container->setWindowTitle(windowTitle()); + container->setWindowIcon(windowIcon()); + } + + if (fullscreen) + { + // Don't risk doing this on Wayland, it really doesn't like window state changes, + // and positioning has no effect anyway. + if (!s_use_central_widget) + restoreDisplayWindowGeometryFromConfig(); + + if (!is_exclusive_fullscreen) + container->showFullScreen(); + else + container->showNormal(); + } + else if (!render_to_main) + { + restoreDisplayWindowGeometryFromConfig(); + container->showNormal(); + } + else if (s_use_central_widget) + { + m_game_list_widget->setVisible(false); + takeCentralWidget(); + m_game_list_widget->setParent(this); // takeCentralWidget() removes parent + setCentralWidget(m_display_widget); + m_display_widget->setFocus(); + update(); + } + else + { + pxAssertRel(m_ui.mainContainer->count() == 1, "Has no display widget"); + m_ui.mainContainer->addWidget(container); + m_ui.mainContainer->setCurrentIndex(1); + } + + updateDisplayRelatedActions(true, render_to_main, fullscreen); + + // We need the surface visible. + QGuiApplication::sync(); +} + void MainWindow::displayResizeRequested(qint32 width, qint32 height) { if (!m_display_widget) @@ -1849,16 +2218,64 @@ void MainWindow::displayResizeRequested(qint32 width, qint32 height) void MainWindow::destroyDisplay() { // Now we can safely destroy the display window. - destroyDisplayWidget(); + destroyDisplayWidget(true); + m_display_created = false; - // Switch back to game list view, we're not going back to display, so we can't use switchToGameListView(). - if (centralWidget() != m_game_list_widget) + m_ui.actionViewSystemDisplay->setEnabled(false); + m_ui.actionFullscreen->setEnabled(false); + m_ui.actionStartFullscreenUI->setEnabled(true); + m_ui.actionStartFullscreenUI2->setEnabled(true); +} + +void MainWindow::destroyDisplayWidget(bool show_game_list) +{ + if (!m_display_widget) + return; + + if (!isRenderingFullscreen() && !isRenderingToMain()) + saveDisplayWindowGeometryToConfig(); + + if (m_display_container) + m_display_container->removeDisplayWidget(); + + if (isRenderingToMain()) { - takeCentralWidget(); - setCentralWidget(m_game_list_widget); - m_game_list_widget->setVisible(true); - m_game_list_widget->setFocus(); + if (s_use_central_widget) + { + pxAssertRel(centralWidget() == m_display_widget, "Display widget is currently central"); + takeCentralWidget(); + if (show_game_list) + { + m_game_list_widget->setVisible(true); + setCentralWidget(m_game_list_widget); + m_game_list_widget->resizeTableViewColumnsToFit(); + } + } + else + { + pxAssertRel(m_ui.mainContainer->indexOf(m_display_widget) == 1, "Display widget in stack"); + m_ui.mainContainer->removeWidget(m_display_widget); + if (show_game_list) + { + m_ui.mainContainer->setCurrentIndex(0); + m_game_list_widget->resizeTableViewColumnsToFit(); + } + } } + + if (m_display_widget) + { + m_display_widget->deleteLater(); + m_display_widget = nullptr; + } + + if (m_display_container) + { + m_display_container->deleteLater(); + m_display_container = nullptr; + } + + updateDisplayRelatedActions(false, false, false); } void MainWindow::focusDisplayWidget() @@ -1887,7 +2304,10 @@ void MainWindow::saveDisplayWindowGeometryToConfig() const QByteArray geometry_b64 = geometry.toBase64(); const std::string old_geometry_b64 = Host::GetBaseStringSettingValue("UI", "DisplayWindowGeometry"); if (old_geometry_b64 != geometry_b64.constData()) - QtHost::SetBaseStringSettingValue("UI", "DisplayWindowGeometry", geometry_b64.constData()); + { + Host::SetBaseStringSettingValue("UI", "DisplayWindowGeometry", geometry_b64.constData()); + Host::CommitBaseSettingChanges(); + } } void MainWindow::restoreDisplayWindowGeometryFromConfig() @@ -1909,46 +2329,19 @@ void MainWindow::restoreDisplayWindowGeometryFromConfig() } } -void MainWindow::destroyDisplayWidget() -{ - if (!m_display_widget) - return; - - if (!isRenderingFullscreen() && !isRenderingToMain()) - saveDisplayWindowGeometryToConfig(); - - if (m_display_container) - m_display_container->removeDisplayWidget(); - - if (m_display_widget == centralWidget()) - takeCentralWidget(); - - if (m_display_widget) - { - m_display_widget->deleteLater(); - m_display_widget = nullptr; - } - - if (m_display_container) - { - m_display_container->deleteLater(); - m_display_container = nullptr; - } -} - void MainWindow::setDisplayFullscreen(const std::string& fullscreen_mode) { u32 width, height; float refresh_rate; if (HostDisplay::ParseFullscreenMode(fullscreen_mode, &width, &height, &refresh_rate)) { - if (Host::GetHostDisplay()->SetFullscreen(true, width, height, refresh_rate)) + if (g_host_display->SetFullscreen(true, width, height, refresh_rate)) { - Host::AddOSDMessage("Acquired exclusive fullscreen.", 10.0f); + Host::AddOSDMessage("Acquired exclusive fullscreen.", Host::OSD_INFO_DURATION); } else { - Host::AddOSDMessage("Failed to acquire exclusive fullscreen.", 10.0f); + Host::AddOSDMessage("Failed to acquire exclusive fullscreen.", Host::OSD_WARNING_DURATION); } } } @@ -1959,7 +2352,7 @@ SettingsDialog* MainWindow::getSettingsDialog() { m_settings_dialog = new SettingsDialog(this); connect( - m_settings_dialog->getInterfaceSettingsWidget(), &InterfaceSettingsWidget::themeChanged, this, &MainWindow::onThemeChangedFromSettings); + m_settings_dialog->getInterfaceSettingsWidget(), &InterfaceSettingsWidget::themeChanged, this, &MainWindow::updateTheme); } return m_settings_dialog; @@ -2093,6 +2486,19 @@ void MainWindow::setGameListEntryCoverImage(const GameList::Entry* entry) m_game_list_widget->refreshGridCovers(); } +void MainWindow::clearGameListEntryPlayTime(const GameList::Entry* entry) +{ + if (QMessageBox::question(this, tr("Confirm Reset"), + tr("Are you sure you want to reset the play time for '%1'?\n\nThis action cannot be undone.") + .arg(QString::fromStdString(entry->title))) != QMessageBox::Yes) + { + return; + } + + GameList::ClearPlayedTimeForSerial(entry->serial); + m_game_list_widget->refresh(false); +} + std::optional MainWindow::promptForResumeState(const QString& save_state_path) { if (save_state_path.isEmpty()) @@ -2184,6 +2590,7 @@ void MainWindow::populateLoadStateMenu(QMenu* menu, const QString& filename, con return; const bool is_right_click_menu = (menu != m_ui.menuLoadState); + bool has_any_states = false; QAction* action = menu->addAction(is_right_click_menu ? tr("Load State File...") : tr("Load From File...")); connect(action, &QAction::triggered, [this, filename]() { @@ -2194,6 +2601,8 @@ void MainWindow::populateLoadStateMenu(QMenu* menu, const QString& filename, con loadSaveStateFile(filename, path); }); + QAction* delete_save_states_action = menu->addAction(tr("Delete Save States...")); + // don't include undo in the right click menu if (!is_right_click_menu) { @@ -2216,10 +2625,11 @@ void MainWindow::populateLoadStateMenu(QMenu* menu, const QString& filename, con // Make bold to indicate it's the default choice when double-clicking QtUtils::MarkActionAsDefault(action); + has_any_states = true; } } - for (s32 i = 1; i <= NUM_SAVE_STATE_SLOTS; i++) + for (s32 i = 1; i <= VMManager::NUM_SAVE_STATE_SLOTS; i++) { FILESYSTEM_STAT_DATA sd; state_filename = VMManager::GetSaveStateFileName(game_serial_utf8.constData(), crc, i); @@ -2228,6 +2638,25 @@ void MainWindow::populateLoadStateMenu(QMenu* menu, const QString& filename, con action = menu->addAction(tr("Load Slot %1 (%2)").arg(i).arg(formatTimestampForSaveStateMenu(sd.ModificationTime))); connect(action, &QAction::triggered, [this, i]() { loadSaveStateSlot(i); }); + has_any_states = true; + } + + delete_save_states_action->setEnabled(has_any_states); + if (has_any_states) + { + connect(delete_save_states_action, &QAction::triggered, this, [this, serial, crc] { + if (QMessageBox::warning( + this, tr("Delete Save States"), + tr("Are you sure you want to delete all save states for %1?\n\nThe saves will not be recoverable.") + .arg(serial), + QMessageBox::Yes, QMessageBox::No) != QMessageBox::Yes) + { + return; + } + + const u32 deleted = VMManager::DeleteSaveStates(serial.toUtf8().constData(), crc, true); + QMessageBox::information(this, tr("Delete Save States"), tr("%1 save states deleted.").arg(deleted)); + }); } } @@ -2247,7 +2676,7 @@ void MainWindow::populateSaveStateMenu(QMenu* menu, const QString& serial, quint menu->addSeparator(); const QByteArray game_serial_utf8(serial.toUtf8()); - for (s32 i = 1; i <= NUM_SAVE_STATE_SLOTS; i++) + for (s32 i = 1; i <= VMManager::NUM_SAVE_STATE_SLOTS; i++) { std::string filename(VMManager::GetSaveStateFileName(game_serial_utf8.constData(), crc, i)); FILESYSTEM_STAT_DATA sd; diff --git a/pcsx2-qt/MainWindow.h b/pcsx2-qt/MainWindow.h index 4562973083..a0ea86fe7e 100644 --- a/pcsx2-qt/MainWindow.h +++ b/pcsx2-qt/MainWindow.h @@ -15,11 +15,14 @@ #pragma once +#include "common/WindowInfo.h" + #include #include #include #include +#include "Tools/InputRecording/InputRecordingViewer.h" #include "Settings/ControllerSettingsDialog.h" #include "Settings/SettingsDialog.h" #include "ui_MainWindow.h" @@ -76,12 +79,16 @@ public: static const char* DEFAULT_THEME_NAME; public: - explicit MainWindow(const QString& unthemed_style_name); + MainWindow(); ~MainWindow(); + /// Sets application theme according to settings. + static void updateApplicationTheme(); + void initialize(); void connectVMThreadSignals(EmuThread* thread); void startupUpdateCheck(); + void resetSettings(bool ui); /// Locks the VM by pausing it, while a popup dialog is displayed. VMLock pauseAndLockVM(); @@ -99,10 +106,12 @@ public Q_SLOTS: void cancelGameListRefresh(); void invalidateSaveStateCache(); void reportError(const QString& title, const QString& message); + bool confirmMessage(const QString& title, const QString& message); void runOnUIThread(const std::function& func); - bool requestShutdown(bool allow_confirm = true, bool allow_save_to_state = true, bool block_until_done = false); + bool requestShutdown(bool allow_confirm = true, bool allow_save_to_state = true, bool default_save_to_state = true, bool block_until_done = false); void requestExit(); void checkForSettingChanges(); + std::optional getWindowInfo(); private Q_SLOTS: void onUpdateCheckComplete(); @@ -143,18 +152,19 @@ private Q_SLOTS: void onAboutActionTriggered(); void onCheckForUpdatesActionTriggered(); void onToolsOpenDataDirectoryTriggered(); - void onThemeChanged(); - void onThemeChangedFromSettings(); - void onLoggingOptionChanged(); + void onToolsCoverDownloaderTriggered(); + void updateTheme(); void onScreenshotActionTriggered(); void onSaveGSDumpActionTriggered(); void onBlockDumpActionToggled(bool checked); + void onShowAdvancedSettingsToggled(bool checked); // Input Recording void onInputRecNewActionTriggered(); void onInputRecPlayActionTriggered(); void onInputRecStopActionTriggered(); void onInputRecOpenSettingsTriggered(); + void onInputRecOpenViewer(); void onVMStarting(); void onVMStarted(); @@ -164,29 +174,33 @@ private Q_SLOTS: void onGameChanged(const QString& path, const QString& serial, const QString& name, quint32 crc); - void recreate(); - protected: void showEvent(QShowEvent* event) override; void closeEvent(QCloseEvent* event) override; void dragEnterEvent(QDragEnterEvent* event) override; void dropEvent(QDropEvent* event) override; +#ifdef _WIN32 + bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result) override; +#endif + private: - enum : s32 - { - NUM_SAVE_STATE_SLOTS = 10, - }; + static void setStyleFromSettings(); + static void setIconThemeFromStyle(); void setupAdditionalUi(); void connectSignals(); - void setStyleFromSettings(); - void setIconThemeFromStyle(); + void recreate(); + void recreateSettings(); + + void registerForDeviceNotifications(); + void unregisterForDeviceNotifications(); void saveStateToConfig(); void restoreStateFromConfig(); void updateEmulationActions(bool starting, bool running); + void updateDisplayRelatedActions(bool has_surface, bool render_to_main, bool fullscreen); void updateStatusBarWidgetVisibility(); void updateWindowTitle(); void updateWindowState(bool force_visible = false); @@ -197,18 +211,24 @@ private: bool isRenderingFullscreen() const; bool isRenderingToMain() const; bool shouldHideMouseCursor() const; + bool shouldHideMainWindow() const; void switchToGameListView(); void switchToEmulationView(); + QWidget* getContentParent(); QWidget* getDisplayContainer() const; void saveDisplayWindowGeometryToConfig(); void restoreDisplayWindowGeometryFromConfig(); - void destroyDisplayWidget(); + void createDisplayWidget(bool fullscreen, bool render_to_main, bool is_exclusive_fullscreen); + void destroyDisplayWidget(bool show_game_list); void setDisplayFullscreen(const std::string& fullscreen_mode); SettingsDialog* getSettingsDialog(); void doSettings(const char* category = nullptr); + InputRecordingViewer* getInputRecordingViewer(); + void updateInputRecordingActions(bool started); + ControllerSettingsDialog* getControllerSettingsDialog(); void doControllerSettings(ControllerSettingsDialog::Category category = ControllerSettingsDialog::Category::Count); @@ -217,6 +237,7 @@ private: void startGameListEntry(const GameList::Entry* entry, std::optional save_slot = std::nullopt, std::optional fast_boot = std::nullopt); void setGameListEntryCoverImage(const GameList::Entry* entry); + void clearGameListEntryPlayTime(const GameList::Entry* entry); std::optional promptForResumeState(const QString& save_state_path); void loadSaveStateSlot(s32 slot); @@ -229,13 +250,12 @@ private: Ui::MainWindow m_ui; - QString m_unthemed_style_name; - GameListWidget* m_game_list_widget = nullptr; DisplayWidget* m_display_widget = nullptr; DisplayContainer* m_display_container = nullptr; SettingsDialog* m_settings_dialog = nullptr; + InputRecordingViewer* m_input_recording_viewer = nullptr; ControllerSettingsDialog* m_controller_settings_dialog = nullptr; AutoUpdaterDialog* m_auto_updater_dialog = nullptr; @@ -251,12 +271,17 @@ private: QString m_current_game_name; quint32 m_current_game_crc; + bool m_display_created = false; bool m_save_states_invalidated = false; bool m_was_paused_on_surface_loss = false; bool m_was_disc_change_request = false; bool m_is_closing = false; QString m_last_fps_status; + +#ifdef _WIN32 + void* m_device_notification_handle = nullptr; +#endif }; extern MainWindow* g_main_window; diff --git a/pcsx2-qt/MainWindow.ui b/pcsx2-qt/MainWindow.ui index cf7138a089..9cf49ce8dd 100644 --- a/pcsx2-qt/MainWindow.ui +++ b/pcsx2-qt/MainWindow.ui @@ -16,6 +16,7 @@ PCSX2 + @@ -65,6 +66,7 @@ + @@ -88,7 +90,6 @@ - @@ -96,6 +97,7 @@ + @@ -123,18 +125,8 @@ Switch Renderer - - - - - - - - - - @@ -184,13 +176,26 @@ + + + + + + + + + + + + + @@ -224,6 +229,7 @@ + @@ -360,15 +366,6 @@ &BIOS - - - - .. - - - System - - @@ -405,6 +402,15 @@ &Graphics + + + + .. + + + A&chievements + + &Post-Processing Settings... @@ -756,21 +762,33 @@ + + false + New + + false + Play + + false + Stop + + false + Settings @@ -828,6 +846,42 @@ Enable Log Timestamps + + + + .. + + + Start Big Picture Mode + + + + + + .. + + + Big Picture + + + + + Cover Downloader... + + + + + true + + + Show Advanced Settings + + + + + Recording Viewer + + diff --git a/pcsx2-qt/QtHost.cpp b/pcsx2-qt/QtHost.cpp index e7e1805c24..194d717662 100644 --- a/pcsx2-qt/QtHost.cpp +++ b/pcsx2-qt/QtHost.cpp @@ -15,55 +15,73 @@ #include "PrecompiledHeader.h" +#include #include -#include -#include - -#ifdef _WIN32 -#include "common/RedtapeWindows.h" -#include -#include -#endif - #include "common/Assertions.h" #include "common/Console.h" #include "common/CrashHandler.h" +#include "common/Exceptions.h" #include "common/FileSystem.h" #include "common/Path.h" #include "common/SettingsWrapper.h" #include "common/StringUtil.h" #include "common/Timer.h" +#include "pcsx2/CDVD/CDVD.h" +#include "pcsx2/CDVD/CDVDcommon.h" +#include "pcsx2/Counters.h" #include "pcsx2/DebugTools/Debug.h" +#include "pcsx2/Frontend/CommonHost.h" +#include "pcsx2/Frontend/FullscreenUI.h" #include "pcsx2/Frontend/GameList.h" -#include "pcsx2/Frontend/INISettingsInterface.h" +#include "pcsx2/Frontend/InputManager.h" +#include "pcsx2/Frontend/ImGuiManager.h" #include "pcsx2/Frontend/LogSink.h" +#include "pcsx2/GS.h" +#include "pcsx2/GS/GS.h" +#include "pcsx2/GSDumpReplayer.h" +#include "pcsx2/HostDisplay.h" #include "pcsx2/HostSettings.h" +#include "pcsx2/INISettingsInterface.h" #include "pcsx2/PAD/Host/PAD.h" +#include "pcsx2/PerformanceMetrics.h" +#include "pcsx2/VMManager.h" -#include "EmuThread.h" +#include +#include +#include +#include +#include + +#include "fmt/core.h" + +#include "DisplayWidget.h" #include "GameList/GameListWidget.h" #include "MainWindow.h" #include "QtHost.h" +#include "QtUtils.h" #include "svnrev.h" -static constexpr u32 SETTINGS_VERSION = 1; +#ifdef ENABLE_ACHIEVEMENTS +#include "Frontend/Achievements.h" +#endif + static constexpr u32 SETTINGS_SAVE_DELAY = 1000; +EmuThread* g_emu_thread = nullptr; + ////////////////////////////////////////////////////////////////////////// // Local function declarations ////////////////////////////////////////////////////////////////////////// namespace QtHost { +static void PrintCommandLineVersion(); +static void PrintCommandLineHelp(const std::string_view& progname); +static std::shared_ptr& AutoBoot(std::shared_ptr& autoboot); +static bool ParseCommandLineOptions(const QStringList& args, std::shared_ptr& autoboot); static bool InitializeConfig(); -static bool ShouldUsePortableMode(); -static void SetAppRoot(); -static void SetResourcesDirectory(); -static void SetDataDirectory(); -static void HookSignals(); -static bool SetCriticalFolders(); -static void SetDefaultConfig(); static void SaveSettings(); +static void HookSignals(); } ////////////////////////////////////////////////////////////////////////// @@ -73,274 +91,1216 @@ const IConsoleWriter* PatchesCon = &Console; static std::unique_ptr s_settings_save_timer; static std::unique_ptr s_base_settings_interface; static bool s_batch_mode = false; +static bool s_nogui_mode = false; +static bool s_start_fullscreen_ui = false; +static bool s_start_fullscreen_ui_fullscreen = false; +static bool s_test_config_and_exit = false; ////////////////////////////////////////////////////////////////////////// -// Initialization/Shutdown +// CPU Thread ////////////////////////////////////////////////////////////////////////// -bool QtHost::Initialize() +EmuThread::EmuThread(QThread* ui_thread) + : QThread() + , m_ui_thread(ui_thread) { - qRegisterMetaType>(); - qRegisterMetaType>(); - qRegisterMetaType>(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); +} - if (!InitializeConfig()) +EmuThread::~EmuThread() = default; + +bool EmuThread::isOnEmuThread() const +{ + return QThread::currentThread() == this; +} + +void EmuThread::start() +{ + pxAssertRel(!g_emu_thread, "Emu thread does not exist"); + + g_emu_thread = new EmuThread(QThread::currentThread()); + g_emu_thread->QThread::start(); + g_emu_thread->m_started_semaphore.acquire(); + g_emu_thread->moveToThread(g_emu_thread); +} + +void EmuThread::stop() +{ + pxAssertRel(g_emu_thread, "Emu thread exists"); + pxAssertRel(!g_emu_thread->isOnEmuThread(), "Not called on the emu thread"); + + QMetaObject::invokeMethod(g_emu_thread, &EmuThread::stopInThread, Qt::QueuedConnection); + while (g_emu_thread->isRunning()) + QApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 1); +} + +void EmuThread::stopInThread() +{ + if (VMManager::HasValidVM()) + destroyVM(); + + if (m_run_fullscreen_ui) + stopFullscreenUI(); + + m_event_loop->quit(); + m_shutdown_flag.store(true); +} + +bool EmuThread::confirmMessage(const QString& title, const QString& message) +{ + if (!isOnEmuThread()) { - // NOTE: No point translating this, because no config means the language won't be loaded anyway. - QMessageBox::critical(nullptr, QStringLiteral("Error"), QStringLiteral("Failed to initialize config.")); - return false; + // This is definitely deadlock risky, but unlikely to happen (why would GS be confirming?). + bool result = false; + QMetaObject::invokeMethod(g_emu_thread, "confirmMessage", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(bool, result), Q_ARG(const QString&, title), Q_ARG(const QString&, message)); + return result; } - HookSignals(); - EmuThread::start(); - return true; + // Easy if there's no VM. + if (!VMManager::HasValidVM()) + return emit messageConfirmed(title, message); + + // Preemptively pause/set surfaceless on the emu thread, because it can't run while the popup is open. + const bool was_paused = (VMManager::GetState() == VMState::Paused); + const bool was_fullscreen = isFullscreen(); + if (!was_paused) + VMManager::SetPaused(true); + if (was_fullscreen) + setSurfaceless(true); + + // This won't return until the user confirms one way or another. + const bool result = emit messageConfirmed(title, message); + + // Resume VM after confirming. + if (was_fullscreen) + setSurfaceless(false); + if (!was_paused) + VMManager::SetPaused(false); + + return result; } -void QtHost::Shutdown() +void EmuThread::startFullscreenUI(bool fullscreen) { - EmuThread::stop(); - if (g_main_window) + if (!isOnEmuThread()) { - g_main_window->close(); - delete g_main_window; - } - - if (emuLog) - { - std::fclose(emuLog); - emuLog = nullptr; - } -} - -bool QtHost::SetCriticalFolders() -{ - SetAppRoot(); - SetResourcesDirectory(); - SetDataDirectory(); - - // logging of directories in case something goes wrong super early - Console.WriteLn("AppRoot Directory: %s", EmuFolders::AppRoot.c_str()); - Console.WriteLn("DataRoot Directory: %s", EmuFolders::DataRoot.c_str()); - Console.WriteLn("Resources Directory: %s", EmuFolders::Resources.c_str()); - - // allow SetDataDirectory() to change settings directory (if we want to split config later on) - if (EmuFolders::Settings.empty()) - EmuFolders::Settings = Path::Combine(EmuFolders::DataRoot, "inis"); - - // Write crash dumps to the data directory, since that'll be accessible for certain. - CrashHandler::SetWriteDirectory(EmuFolders::DataRoot); - - // the resources directory should exist, bail out if not - if (!FileSystem::DirectoryExists(EmuFolders::Resources.c_str())) - { - QMessageBox::critical(nullptr, QStringLiteral("Error"), - QStringLiteral("Resources directory is missing, your installation is incomplete.")); - return false; - } - - return true; -} - -bool QtHost::ShouldUsePortableMode() -{ - // Check whether portable.ini exists in the program directory. - return FileSystem::FileExists(Path::Combine(EmuFolders::AppRoot, "portable.ini").c_str()); -} - -void QtHost::SetAppRoot() -{ - std::string program_path(FileSystem::GetProgramPath()); - Console.WriteLn("Program Path: %s", program_path.c_str()); - - EmuFolders::AppRoot = Path::Canonicalize(Path::GetDirectory(program_path)); -} - -void QtHost::SetResourcesDirectory() -{ -#ifndef __APPLE__ - // On Windows/Linux, these are in the binary directory. - EmuFolders::Resources = Path::Combine(EmuFolders::AppRoot, "resources"); -#else - // On macOS, this is in the bundle resources directory. - EmuFolders::Resources = Path::Canonicalize(Path::Combine(EmuFolders::AppRoot, "../Resources")); -#endif -} - -void QtHost::SetDataDirectory() -{ - if (ShouldUsePortableMode()) - { - EmuFolders::DataRoot = EmuFolders::AppRoot; + QMetaObject::invokeMethod(this, "startFullscreenUI", Qt::QueuedConnection, Q_ARG(bool, fullscreen)); return; } -#if defined(_WIN32) - // On Windows, use My Documents\PCSX2 to match old installs. - PWSTR documents_directory; - if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &documents_directory))) + if (VMManager::HasValidVM()) + return; + + m_run_fullscreen_ui = true; + if (fullscreen) + m_is_fullscreen = true; + + if (!GetMTGS().WaitForOpen()) { - if (std::wcslen(documents_directory) > 0) - EmuFolders::DataRoot = Path::Combine(StringUtil::WideStringToUTF8String(documents_directory), "PCSX2"); - CoTaskMemFree(documents_directory); + m_run_fullscreen_ui = false; + return; } -#elif defined(__linux__) - // Use $XDG_CONFIG_HOME/PCSX2 if it exists. - const char* xdg_config_home = getenv("XDG_CONFIG_HOME"); - if (xdg_config_home && Path::IsAbsolute(xdg_config_home)) + + // poll more frequently so we don't lose events + stopBackgroundControllerPollTimer(); + startBackgroundControllerPollTimer(); +} + +void EmuThread::stopFullscreenUI() +{ + if (!isOnEmuThread()) { - EmuFolders::DataRoot = Path::Combine(xdg_config_home, "PCSX2"); + QMetaObject::invokeMethod(this, &EmuThread::stopFullscreenUI, Qt::QueuedConnection); + + // wait until the host display is gone + while (g_host_display) + QApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 1); + + return; + } + + if (!g_host_display) + return; + + pxAssertRel(!VMManager::HasValidVM(), "VM is not valid at FSUI shutdown time"); + m_run_fullscreen_ui = false; + GetMTGS().WaitForClose(); +} + +void EmuThread::startVM(std::shared_ptr boot_params) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "startVM", Qt::QueuedConnection, + Q_ARG(std::shared_ptr, boot_params)); + return; + } + + pxAssertRel(!VMManager::HasValidVM(), "VM is shut down"); + + // Determine whether to start fullscreen or not. + if (boot_params->fullscreen.has_value()) + m_is_fullscreen = boot_params->fullscreen.value(); + else + m_is_fullscreen = Host::GetBaseBoolSettingValue("UI", "StartFullscreen", false); + + if (!VMManager::Initialize(*boot_params)) + return; + + if (!Host::GetBoolSettingValue("UI", "StartPaused", false)) + { + // This will come back and call OnVMResumed(). + VMManager::SetState(VMState::Running); } else { - // Use ~/PCSX2 for non-XDG, and ~/.config/PCSX2 for XDG. - // Maybe we should drop the former when Qt goes live. - const char* home_dir = getenv("HOME"); - if (home_dir) - { -#ifndef XDG_STD - EmuFolders::DataRoot = Path::Combine(home_dir, "PCSX2"); -#else - // ~/.config should exist, but just in case it doesn't and this is a fresh profile.. - const std::string config_dir(Path::Combine(home_dir, ".config")); - if (!FileSystem::DirectoryExists(config_dir.c_str())) - FileSystem::CreateDirectoryPath(config_dir.c_str(), false); + // When starting paused, redraw the window, so there's at least something there. + redrawDisplayWindow(); + Host::OnVMPaused(); + } - EmuFolders::DataRoot = Path::Combine(config_dir, "PCSX2"); -#endif + m_event_loop->quit(); +} + +void EmuThread::resetVM() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::resetVM, Qt::QueuedConnection); + return; + } + + VMManager::Reset(); +} + +void EmuThread::setVMPaused(bool paused) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "setVMPaused", Qt::QueuedConnection, Q_ARG(bool, paused)); + return; + } + + VMManager::SetPaused(paused); +} + +void EmuThread::shutdownVM(bool save_state /* = true */) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "shutdownVM", Qt::QueuedConnection, Q_ARG(bool, save_state)); + return; + } + + const VMState state = VMManager::GetState(); + if (state == VMState::Paused) + m_event_loop->quit(); + else if (state != VMState::Running) + return; + + m_save_state_on_shutdown = save_state; + VMManager::SetState(VMState::Stopping); +} + +void EmuThread::loadState(const QString& filename) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "loadState", Qt::QueuedConnection, Q_ARG(const QString&, filename)); + return; + } + + if (!VMManager::HasValidVM()) + return; + + VMManager::LoadState(filename.toUtf8().constData()); +} + +void EmuThread::loadStateFromSlot(qint32 slot) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "loadStateFromSlot", Qt::QueuedConnection, Q_ARG(qint32, slot)); + return; + } + + if (!VMManager::HasValidVM()) + return; + + VMManager::LoadStateFromSlot(slot); +} + +void EmuThread::saveState(const QString& filename) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "saveState", Qt::QueuedConnection, Q_ARG(const QString&, filename)); + return; + } + + if (!VMManager::HasValidVM()) + return; + + if (!VMManager::SaveState(filename.toUtf8().constData())) + { + // this one is usually the result of a user-chosen path, so we can display a message box safely here + Console.Error("Failed to save state"); + } +} + +void EmuThread::saveStateToSlot(qint32 slot) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "saveStateToSlot", Qt::QueuedConnection, Q_ARG(qint32, slot)); + return; + } + + if (!VMManager::HasValidVM()) + return; + + VMManager::SaveStateToSlot(slot); +} + +void EmuThread::run() +{ + // Qt-specific initialization. + m_event_loop = new QEventLoop(); + m_started_semaphore.release(); + connectSignals(); + + // Common host initialization (VM setup, etc). + CommonHost::CPUThreadInitialize(); + + // Start background polling because the VM won't do it for us. + createBackgroundControllerPollTimer(); + startBackgroundControllerPollTimer(); + + // Main CPU thread loop. + while (!m_shutdown_flag.load()) + { + if (!VMManager::HasValidVM()) + { + m_event_loop->exec(); + continue; + } + + executeVM(); + } + + // Teardown in reverse order. + stopBackgroundControllerPollTimer(); + destroyBackgroundControllerPollTimer(); + CommonHost::CPUThreadShutdown(); + + // Move back to the UI thread, since we're no longer running. + moveToThread(m_ui_thread); + deleteLater(); +} + +void EmuThread::destroyVM() +{ + m_last_speed = 0.0f; + m_last_game_fps = 0.0f; + m_last_video_fps = 0.0f; + m_last_internal_width = 0; + m_last_internal_height = 0; + m_was_paused_by_focus_loss = false; + VMManager::Shutdown(m_save_state_on_shutdown); + m_save_state_on_shutdown = false; +} + +void EmuThread::executeVM() +{ + for (;;) + { + switch (VMManager::GetState()) + { + case VMState::Initializing: + pxFailRel("Shouldn't be in the starting state state"); + continue; + + case VMState::Paused: + m_event_loop->exec(); + continue; + + case VMState::Running: + m_event_loop->processEvents(QEventLoop::AllEvents); + VMManager::Execute(); + continue; + + case VMState::Stopping: + destroyVM(); + m_event_loop->processEvents(QEventLoop::AllEvents); + return; + + default: + continue; } } -#elif defined(__APPLE__) - static constexpr char MAC_DATA_DIR[] = "Library/Application Support/PCSX2"; - const char* home_dir = getenv("HOME"); - if (home_dir) - EmuFolders::DataRoot = Path::Combine(home_dir, MAC_DATA_DIR); -#endif +} - // make sure it exists - if (!EmuFolders::DataRoot.empty() && !FileSystem::DirectoryExists(EmuFolders::DataRoot.c_str())) +void EmuThread::createBackgroundControllerPollTimer() +{ + pxAssert(!m_background_controller_polling_timer); + m_background_controller_polling_timer = new QTimer(this); + m_background_controller_polling_timer->setSingleShot(false); + m_background_controller_polling_timer->setTimerType(Qt::CoarseTimer); + connect(m_background_controller_polling_timer, &QTimer::timeout, this, &EmuThread::doBackgroundControllerPoll); +} + +void EmuThread::destroyBackgroundControllerPollTimer() +{ + delete m_background_controller_polling_timer; + m_background_controller_polling_timer = nullptr; +} + +void EmuThread::startBackgroundControllerPollTimer() +{ + if (m_background_controller_polling_timer->isActive()) + return; + + m_background_controller_polling_timer->start(FullscreenUI::IsInitialized() ? + FULLSCREEN_UI_CONTROLLER_POLLING_INTERVAL : + BACKGROUND_CONTROLLER_POLLING_INTERVAL); +} + +void EmuThread::stopBackgroundControllerPollTimer() +{ + if (!m_background_controller_polling_timer->isActive()) + return; + + m_background_controller_polling_timer->stop(); +} + +void EmuThread::doBackgroundControllerPoll() +{ + InputManager::PollSources(); +} + +void EmuThread::toggleFullscreen() +{ + if (!isOnEmuThread()) { - // we're in trouble if we fail to create this directory... but try to hobble on with portable - if (!FileSystem::CreateDirectoryPath(EmuFolders::DataRoot.c_str(), false)) - EmuFolders::DataRoot.clear(); + QMetaObject::invokeMethod(this, &EmuThread::toggleFullscreen, Qt::QueuedConnection); + return; } - // couldn't determine the data directory? fallback to portable. - if (EmuFolders::DataRoot.empty()) - EmuFolders::DataRoot = EmuFolders::AppRoot; + setFullscreen(!m_is_fullscreen); +} + +void EmuThread::setFullscreen(bool fullscreen) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "setFullscreen", Qt::QueuedConnection, Q_ARG(bool, fullscreen)); + return; + } + + if (!GetMTGS().IsOpen() || m_is_fullscreen == fullscreen) + return; + + // This will call back to us on the MTGS thread. + m_is_fullscreen = fullscreen; + GetMTGS().UpdateDisplayWindow(); + GetMTGS().WaitGS(); + + // If we're using exclusive fullscreen, the refresh rate may have changed. + UpdateVSyncRate(); +} + +void EmuThread::setSurfaceless(bool surfaceless) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "setSurfaceless", Qt::QueuedConnection, Q_ARG(bool, surfaceless)); + return; + } + + if (!GetMTGS().IsOpen() || m_is_surfaceless == surfaceless) + return; + + // If we went surfaceless and were running the fullscreen UI, stop MTGS running idle. + // Otherwise, we'll keep trying to present to nothing. + GetMTGS().SetRunIdle(!surfaceless && m_run_fullscreen_ui); + + // This will call back to us on the MTGS thread. + m_is_surfaceless = surfaceless; + GetMTGS().UpdateDisplayWindow(); + GetMTGS().WaitGS(); +} + +void EmuThread::applySettings() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::applySettings, Qt::QueuedConnection); + return; + } + + VMManager::ApplySettings(); +} + +void EmuThread::reloadGameSettings() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::reloadGameSettings, Qt::QueuedConnection); + return; + } + + // this will skip applying settings when they're not active + VMManager::ReloadGameSettings(); +} + +void EmuThread::updateEmuFolders() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::updateEmuFolders, Qt::QueuedConnection); + return; + } + + Host::Internal::UpdateEmuFolders(); +} + +void EmuThread::connectSignals() +{ + connect(qApp, &QGuiApplication::applicationStateChanged, this, &EmuThread::onApplicationStateChanged); +} + +void EmuThread::loadSettings(SettingsInterface& si, std::unique_lock& lock) +{ + m_verbose_status = si.GetBoolValue("UI", "VerboseStatusBar", false); + m_pause_on_focus_loss = si.GetBoolValue("UI", "PauseOnFocusLoss", false); +} + +void Host::LoadSettings(SettingsInterface& si, std::unique_lock& lock) +{ + CommonHost::LoadSettings(si, lock); + g_emu_thread->loadSettings(si, lock); +} + +void EmuThread::checkForSettingChanges(const Pcsx2Config& old_config) +{ + QMetaObject::invokeMethod(g_main_window, &MainWindow::checkForSettingChanges, Qt::QueuedConnection); + + if (g_host_display) + { + const bool render_to_main = shouldRenderToMain(); + if (!m_is_fullscreen && m_is_rendering_to_main != render_to_main) + { + m_is_rendering_to_main = render_to_main; + GetMTGS().UpdateDisplayWindow(); + GetMTGS().WaitGS(); + } + } + + updatePerformanceMetrics(true); +} + +void Host::CheckForSettingsChanges(const Pcsx2Config& old_config) +{ + CommonHost::CheckForSettingsChanges(old_config); + g_emu_thread->checkForSettingChanges(old_config); +} + +bool EmuThread::shouldRenderToMain() const +{ + return !Host::GetBoolSettingValue("UI", "RenderToSeparateWindow", false) && !QtHost::InNoGUIMode(); +} + +void EmuThread::toggleSoftwareRendering() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::toggleSoftwareRendering, Qt::QueuedConnection); + return; + } + + if (!VMManager::HasValidVM()) + return; + + GetMTGS().ToggleSoftwareRendering(); +} + +void EmuThread::switchRenderer(GSRendererType renderer) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "switchRenderer", Qt::QueuedConnection, Q_ARG(GSRendererType, renderer)); + return; + } + + if (!VMManager::HasValidVM()) + return; + + GetMTGS().SwitchRenderer(renderer); +} + +void EmuThread::changeDisc(CDVD_SourceType source, const QString& path) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "changeDisc", Qt::QueuedConnection, Q_ARG(CDVD_SourceType, source), Q_ARG(const QString&, path)); + return; + } + + if (!VMManager::HasValidVM()) + return; + + VMManager::ChangeDisc(source, path.toStdString()); +} + +void EmuThread::reloadPatches() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::reloadPatches, Qt::QueuedConnection); + return; + } + + if (!VMManager::HasValidVM()) + return; + + VMManager::ReloadPatches(true, true); +} + +void EmuThread::reloadInputSources() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::reloadInputSources, Qt::QueuedConnection); + return; + } + + std::unique_lock lock = Host::GetSettingsLock(); + SettingsInterface* si = Host::GetSettingsInterface(); + SettingsInterface* bindings_si = Host::GetSettingsInterfaceForBindings(); + InputManager::ReloadSources(*si, lock); + + // skip loading bindings if we're not running, since it'll get done on startup anyway + if (VMManager::HasValidVM()) + InputManager::ReloadBindings(*si, *bindings_si); +} + +void EmuThread::reloadInputBindings() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::reloadInputBindings, Qt::QueuedConnection); + return; + } + + // skip loading bindings if we're not running, since it'll get done on startup anyway + if (!VMManager::HasValidVM()) + return; + + auto lock = Host::GetSettingsLock(); + SettingsInterface* si = Host::GetSettingsInterface(); + SettingsInterface* bindings_si = Host::GetSettingsInterfaceForBindings(); + InputManager::ReloadBindings(*si, *bindings_si); +} + +void EmuThread::reloadInputDevices() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::reloadInputDevices, Qt::QueuedConnection); + return; + } + + InputManager::ReloadDevices(); +} + +void EmuThread::closeInputSources() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::reloadInputDevices, Qt::BlockingQueuedConnection); + return; + } + + InputManager::CloseSources(); +} + +void EmuThread::requestDisplaySize(float scale) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "requestDisplaySize", Qt::QueuedConnection, Q_ARG(float, scale)); + return; + } + + if (!VMManager::HasValidVM()) + return; + + VMManager::RequestDisplaySize(scale); +} + +void EmuThread::enumerateInputDevices() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::enumerateInputDevices, Qt::QueuedConnection); + return; + } + + const std::vector> devs(InputManager::EnumerateDevices()); + QList> qdevs; + qdevs.reserve(devs.size()); + for (const std::pair& dev : devs) + qdevs.emplace_back(QString::fromStdString(dev.first), QString::fromStdString(dev.second)); + + onInputDevicesEnumerated(qdevs); +} + +void EmuThread::enumerateVibrationMotors() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::enumerateVibrationMotors, Qt::QueuedConnection); + return; + } + + const std::vector motors(InputManager::EnumerateMotors()); + QList qmotors; + qmotors.reserve(motors.size()); + for (InputBindingKey key : motors) + qmotors.push_back(key); + + onVibrationMotorsEnumerated(qmotors); +} + +void EmuThread::connectDisplaySignals(DisplayWidget* widget) +{ + widget->disconnect(this); + + connect(widget, &DisplayWidget::windowResizedEvent, this, &EmuThread::onDisplayWindowResized); + connect(widget, &DisplayWidget::windowRestoredEvent, this, &EmuThread::redrawDisplayWindow); +} + +void EmuThread::onDisplayWindowResized(int width, int height, float scale) +{ + if (!g_host_display) + return; + + GetMTGS().ResizeDisplayWindow(width, height, scale); +} + +void EmuThread::onApplicationStateChanged(Qt::ApplicationState state) +{ + // NOTE: This is executed on the emu thread, not UI thread. + if (!m_pause_on_focus_loss || !VMManager::HasValidVM()) + return; + + const bool focus_loss = (state != Qt::ApplicationActive); + if (focus_loss) + { + if (!m_was_paused_by_focus_loss && VMManager::GetState() == VMState::Running) + { + m_was_paused_by_focus_loss = true; + VMManager::SetPaused(true); + } + } + else + { + if (m_was_paused_by_focus_loss) + { + m_was_paused_by_focus_loss = false; + if (VMManager::GetState() == VMState::Paused) + VMManager::SetPaused(false); + } + } +} + +void EmuThread::redrawDisplayWindow() +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, &EmuThread::redrawDisplayWindow, Qt::QueuedConnection); + return; + } + + // If we're running, we're going to re-present anyway. + if (!VMManager::HasValidVM() || VMManager::GetState() == VMState::Running) + return; + + GetMTGS().PresentCurrentFrame(); +} + +void EmuThread::runOnCPUThread(const std::function& func) +{ + func(); +} + +void EmuThread::queueSnapshot(quint32 gsdump_frames) +{ + if (!isOnEmuThread()) + { + QMetaObject::invokeMethod(this, "queueSnapshot", Qt::QueuedConnection, Q_ARG(quint32, gsdump_frames)); + return; + } + + if (!VMManager::HasValidVM()) + return; + + GetMTGS().RunOnGSThread([gsdump_frames]() { + GSQueueSnapshot(std::string(), gsdump_frames); + }); +} + +void EmuThread::updateDisplay() +{ + pxAssertRel(!isOnEmuThread(), "Not on emu thread"); + + // finished with the display for now + g_host_display->DoneCurrent(); + + // but we should get it back after this call + onUpdateDisplayRequested(m_is_fullscreen, !m_is_fullscreen && m_is_rendering_to_main, m_is_surfaceless); + if (!g_host_display->MakeCurrent()) + { + pxFailRel("Failed to recreate context after updating"); + return; + } +} + +bool EmuThread::acquireHostDisplay(RenderAPI api, bool clear_state_on_fail) +{ + pxAssertRel(!g_host_display, "Host display does not exist on create"); + m_is_rendering_to_main = shouldRenderToMain(); + m_is_surfaceless = false; + + g_host_display = HostDisplay::CreateForAPI(api); + if (!g_host_display) + return false; + + DisplayWidget* widget = emit onCreateDisplayRequested(m_is_fullscreen, m_is_rendering_to_main); + if (!widget) + { + g_host_display.reset(); + return false; + } + + connectDisplaySignals(widget); + + if (!g_host_display->MakeCurrent()) + { + Console.Error("Failed to make render context current"); + releaseHostDisplay(clear_state_on_fail); + return false; + } + + if (!g_host_display->SetupDevice() || !ImGuiManager::Initialize()) + { + Console.Error("Failed to initialize device/imgui"); + releaseHostDisplay(clear_state_on_fail); + return false; + } + + Console.WriteLn(Color_StrongGreen, "%s Graphics Driver Info:", HostDisplay::RenderAPIToString(g_host_display->GetRenderAPI())); + Console.Indent().WriteLn(g_host_display->GetDriverInfo()); + + if (m_run_fullscreen_ui && !ImGuiManager::InitializeFullscreenUI()) + { + Console.Error("Failed to initialize fullscreen UI"); + releaseHostDisplay(clear_state_on_fail); + m_run_fullscreen_ui = false; + return false; + } + + return true; +} + +void EmuThread::releaseHostDisplay(bool clear_state) +{ + ImGuiManager::Shutdown(clear_state); + + g_host_display.reset(); + emit onDestroyDisplayRequested(); +} + +bool Host::AcquireHostDisplay(RenderAPI api, bool clear_state_on_fail) +{ + return g_emu_thread->acquireHostDisplay(api, clear_state_on_fail); +} + +void Host::ReleaseHostDisplay(bool clear_state) +{ + g_emu_thread->releaseHostDisplay(clear_state); +} + +VsyncMode Host::GetEffectiveVSyncMode() +{ + // Force vsync on when running big picture UI, and paused or no VM. + // We check the "running FSUI" flag here, because that way we set the initial vsync + // state when initalizing to on, avoiding an unnecessary switch. + if (FullscreenUI::HasActiveWindow() || (!FullscreenUI::IsInitialized() && g_emu_thread->isRunningFullscreenUI())) + { + const VMState state = VMManager::GetState(); + if (state == VMState::Shutdown || state == VMState::Paused) + return VsyncMode::On; + } + + // Force vsync off when not running at 100% speed. + if (EmuConfig.GS.LimitScalar != 1.0f) + return VsyncMode::Off; + + // Otherwise use the config setting. + return EmuConfig.GS.VsyncEnable; +} + +bool Host::BeginPresentFrame(bool frame_skip) +{ + if (!g_host_display->BeginPresent(frame_skip)) + { + // if we're skipping a frame, we need to reset imgui's state, since + // we won't be calling EndPresentFrame(). + ImGuiManager::NewFrame(); + return false; + } + + return true; +} + +void Host::EndPresentFrame() +{ + if (GSDumpReplayer::IsReplayingDump()) + GSDumpReplayer::RenderUI(); + + FullscreenUI::Render(); + ImGuiManager::RenderOSD(); + g_host_display->EndPresent(); + ImGuiManager::NewFrame(); +} + +void Host::ResizeHostDisplay(u32 new_window_width, u32 new_window_height, float new_window_scale) +{ + g_host_display->ResizeWindow(new_window_width, new_window_height, new_window_scale); + ImGuiManager::WindowResized(); +} + +void Host::RequestResizeHostDisplay(s32 width, s32 height) +{ + g_emu_thread->onResizeDisplayRequested(width, height); +} + +void Host::UpdateHostDisplay() +{ + g_emu_thread->updateDisplay(); + ImGuiManager::WindowResized(); +} + +void Host::OnVMStarting() +{ + CommonHost::OnVMStarting(); + g_emu_thread->stopBackgroundControllerPollTimer(); + emit g_emu_thread->onVMStarting(); +} + +void Host::OnVMStarted() +{ + CommonHost::OnVMStarted(); + emit g_emu_thread->onVMStarted(); +} + +void Host::OnVMDestroyed() +{ + CommonHost::OnVMDestroyed(); + emit g_emu_thread->onVMStopped(); + g_emu_thread->startBackgroundControllerPollTimer(); +} + +void Host::OnVMPaused() +{ + CommonHost::OnVMPaused(); + g_emu_thread->startBackgroundControllerPollTimer(); + emit g_emu_thread->onVMPaused(); +} + +void Host::OnVMResumed() +{ + CommonHost::OnVMResumed(); + + // exit the event loop when we eventually return + g_emu_thread->getEventLoop()->quit(); + g_emu_thread->stopBackgroundControllerPollTimer(); + + // if we were surfaceless (view->game list, system->unpause), get our display widget back + if (g_emu_thread->isSurfaceless()) + g_emu_thread->setSurfaceless(false); + + emit g_emu_thread->onVMResumed(); +} + +void Host::OnGameChanged(const std::string& disc_path, const std::string& game_serial, const std::string& game_name, u32 game_crc) +{ + CommonHost::OnGameChanged(disc_path, game_serial, game_name, game_crc); + emit g_emu_thread->onGameChanged(QString::fromStdString(disc_path), QString::fromStdString(game_serial), QString::fromStdString(game_name), game_crc); +} + +void EmuThread::updatePerformanceMetrics(bool force) +{ + if (m_verbose_status && VMManager::HasValidVM()) + { + std::string gs_stat_str; + GSgetTitleStats(gs_stat_str); + + QString gs_stat; + if (THREAD_VU1) + { + gs_stat = + QStringLiteral("%1 | EE: %2% | VU: %3% | GS: %4%") + .arg(gs_stat_str.c_str()) + .arg(PerformanceMetrics::GetCPUThreadUsage(), 0, 'f', 0) + .arg(PerformanceMetrics::GetVUThreadUsage(), 0, 'f', 0) + .arg(PerformanceMetrics::GetGSThreadUsage(), 0, 'f', 0); + } + else + { + gs_stat = QStringLiteral("%1 | EE: %2% | GS: %3%") + .arg(gs_stat_str.c_str()) + .arg(PerformanceMetrics::GetCPUThreadUsage(), 0, 'f', 0) + .arg(PerformanceMetrics::GetGSThreadUsage(), 0, 'f', 0); + } + + QMetaObject::invokeMethod(g_main_window->getStatusVerboseWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, gs_stat)); + } + + const GSRendererType renderer = GSConfig.Renderer; + const float speed = std::round(PerformanceMetrics::GetSpeed()); + const float gfps = std::round(PerformanceMetrics::GetInternalFPS()); + const float vfps = std::round(PerformanceMetrics::GetFPS()); + int iwidth, iheight; + GSgetInternalResolution(&iwidth, &iheight); + + if (iwidth != m_last_internal_width || iheight != m_last_internal_height || + speed != m_last_speed || gfps != m_last_game_fps || vfps != m_last_video_fps || + renderer != m_last_renderer || force) + { + if (iwidth == 0 && iheight == 0) + { + // if we don't have width/height yet, we're not going to have fps either. + // and we'll probably be <100% due to compiling. so just leave it blank for now. + QString blank; + QMetaObject::invokeMethod(g_main_window->getStatusRendererWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, blank)); + QMetaObject::invokeMethod(g_main_window->getStatusResolutionWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, blank)); + QMetaObject::invokeMethod(g_main_window->getStatusFPSWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, blank)); + QMetaObject::invokeMethod(g_main_window->getStatusVPSWidget(), "setText", Qt::QueuedConnection, Q_ARG(const QString&, blank)); + return; + } + else + { + if (renderer != m_last_renderer || force) + { + QMetaObject::invokeMethod(g_main_window->getStatusRendererWidget(), "setText", Qt::QueuedConnection, + Q_ARG(const QString&, QString::fromUtf8(Pcsx2Config::GSOptions::GetRendererName(renderer)))); + m_last_renderer = renderer; + } + if (iwidth != m_last_internal_width || iheight != m_last_internal_height || force) + { + QMetaObject::invokeMethod(g_main_window->getStatusResolutionWidget(), "setText", Qt::QueuedConnection, + Q_ARG(const QString&, tr("%1x%2") + .arg(iwidth) + .arg(iheight))); + m_last_internal_width = iwidth; + m_last_internal_height = iheight; + } + + if (gfps != m_last_game_fps || force) + { + QMetaObject::invokeMethod(g_main_window->getStatusFPSWidget(), "setText", Qt::QueuedConnection, + Q_ARG(const QString&, tr("Game: %1 FPS") + .arg(gfps, 0, 'f', 0))); + m_last_game_fps = gfps; + } + + if (speed != m_last_speed || vfps != m_last_video_fps || force) + { + QMetaObject::invokeMethod(g_main_window->getStatusVPSWidget(), "setText", Qt::QueuedConnection, + Q_ARG(const QString&, tr("Video: %1 FPS (%2%)") + .arg(vfps, 0, 'f', 0) + .arg(speed, 0, 'f', 0))); + m_last_speed = speed; + m_last_video_fps = vfps; + } + } + } +} + +void Host::OnPerformanceMetricsUpdated() +{ + g_emu_thread->updatePerformanceMetrics(false); +} + +void Host::OnSaveStateLoading(const std::string_view& filename) +{ + emit g_emu_thread->onSaveStateLoading(QtUtils::StringViewToQString(filename)); +} + +void Host::OnSaveStateLoaded(const std::string_view& filename, bool was_successful) +{ + emit g_emu_thread->onSaveStateLoaded(QtUtils::StringViewToQString(filename), was_successful); +} + +void Host::OnSaveStateSaved(const std::string_view& filename) +{ + emit g_emu_thread->onSaveStateSaved(QtUtils::StringViewToQString(filename)); +} + +#ifdef ENABLE_ACHIEVEMENTS +void Host::OnAchievementsRefreshed() +{ + u32 game_id = 0; + u32 achievement_count = 0; + u32 max_points = 0; + + QString game_info; + + if (Achievements::HasActiveGame()) + { + game_id = Achievements::GetGameID(); + achievement_count = Achievements::GetAchievementCount(); + max_points = Achievements::GetMaximumPointsForGame(); + + game_info = qApp->translate("EmuThread", + "Game ID: %1\n" + "Game Title: %2\n" + "Achievements: %5 (%6)\n\n") + .arg(game_id) + .arg(QString::fromStdString(Achievements::GetGameTitle())) + .arg(achievement_count) + .arg(qApp->translate("EmuThread", "%n points", "", max_points)); + + const std::string rich_presence_string(Achievements::GetRichPresenceString()); + if (!rich_presence_string.empty()) + game_info.append(QString::fromStdString(rich_presence_string)); + else + game_info.append(qApp->translate("EmuThread", "Rich presence inactive or unsupported.")); + } + else + { + game_info = qApp->translate("EmuThread", "Game not loaded or no RetroAchievements available."); + } + + emit g_emu_thread->onAchievementsRefreshed(game_id, game_info, achievement_count, max_points); +} +#endif + +void Host::CPUThreadVSync() +{ + g_emu_thread->getEventLoop()->processEvents(QEventLoop::AllEvents); + CommonHost::CPUThreadVSync(); +} + +void Host::RunOnCPUThread(std::function function, bool block /* = false */) +{ + if (g_emu_thread->isOnEmuThread()) + { + // probably shouldn't ever happen, but just in case.. + function(); + return; + } + + QMetaObject::invokeMethod(g_emu_thread, "runOnCPUThread", + block ? Qt::BlockingQueuedConnection : Qt::QueuedConnection, + Q_ARG(const std::function&, std::move(function))); +} + +void Host::RefreshGameListAsync(bool invalidate_cache) +{ + QMetaObject::invokeMethod(g_main_window, "refreshGameList", Qt::QueuedConnection, + Q_ARG(bool, invalidate_cache)); +} + +void Host::CancelGameListRefresh() +{ + QMetaObject::invokeMethod(g_main_window, "cancelGameListRefresh", Qt::BlockingQueuedConnection); +} + +void Host::RequestExit(bool save_state_if_running) +{ + if (VMManager::HasValidVM()) + g_emu_thread->shutdownVM(save_state_if_running); + + QMetaObject::invokeMethod(g_main_window, "requestExit", Qt::QueuedConnection); +} + +void Host::RequestVMShutdown(bool allow_confirm, bool allow_save_state, bool default_save_state) +{ + if (!VMManager::HasValidVM()) + return; + + // Run it on the host thread, that way we get the confirm prompt (if enabled). + QMetaObject::invokeMethod(g_main_window, "requestShutdown", Qt::QueuedConnection, + Q_ARG(bool, allow_confirm), Q_ARG(bool, allow_save_state), + Q_ARG(bool, default_save_state), Q_ARG(bool, false)); +} + +bool Host::IsFullscreen() +{ + return g_emu_thread->isFullscreen(); +} + +void Host::SetFullscreen(bool enabled) +{ + g_emu_thread->setFullscreen(enabled); +} + +alignas(16) static SysMtgsThread s_mtgs_thread; + +SysMtgsThread& GetMTGS() +{ + return s_mtgs_thread; } bool QtHost::InitializeConfig() { - if (!SetCriticalFolders()) + if (!CommonHost::InitializeCriticalFolders()) + { + QMessageBox::critical(nullptr, QStringLiteral("PCSX2"), + QStringLiteral("One or more critical directories are missing, your installation may be incomplete.")); return false; + } const std::string path(Path::Combine(EmuFolders::Settings, "PCSX2.ini")); Console.WriteLn("Loading config from %s.", path.c_str()); + s_base_settings_interface = std::make_unique(std::move(path)); Host::Internal::SetBaseSettingsLayer(s_base_settings_interface.get()); - - uint settings_version; - if (!s_base_settings_interface->Load() || - !s_base_settings_interface->GetUIntValue("UI", "SettingsVersion", &settings_version) || - settings_version != SETTINGS_VERSION) + if (!s_base_settings_interface->Load() || !CommonHost::CheckSettingsVersion()) { - QMessageBox::critical( - g_main_window, qApp->translate("QtHost", "Settings Reset"), - qApp->translate("QtHost", "Settings do not exist or are the incorrect version, resetting to defaults.")); - SetDefaultConfig(); - s_base_settings_interface->Save(); + // If the config file doesn't exist, assume this is a new install and don't prompt to overwrite. + if (FileSystem::FileExists(s_base_settings_interface->GetFileName().c_str()) && + QMessageBox::question(nullptr, QStringLiteral("PCSX2"), + QStringLiteral("Settings failed to load, or are the incorrect version. Clicking Yes will reset all settings to defaults. Do you want to continue?")) != QMessageBox::Yes) + { + return false; + } + + CommonHost::SetDefaultSettings(*s_base_settings_interface, true, true, true, true, true); + SaveSettings(); } - // TODO: Handle reset to defaults if load fails. - EmuFolders::LoadConfig(*s_base_settings_interface.get()); - EmuFolders::EnsureFoldersExist(); - Host::UpdateLogging(); + CommonHost::SetBlockSystemConsole(QtHost::InNoGUIMode()); + CommonHost::LoadStartupSettings(); return true; } -void QtHost::SetDefaultConfig() +void Host::SetDefaultUISettings(SettingsInterface& si) { - EmuConfig = Pcsx2Config(); - EmuFolders::SetDefaults(); - EmuFolders::EnsureFoldersExist(); - VMManager::SetHardwareDependentDefaultSettings(EmuConfig); - - SettingsInterface& si = *s_base_settings_interface.get(); - si.SetUIntValue("UI", "SettingsVersion", SETTINGS_VERSION); - - { - SettingsSaveWrapper wrapper(si); - EmuConfig.LoadSave(wrapper); - } - - EmuFolders::Save(si); - PAD::SetDefaultConfig(si); -} - -void QtHost::SetBaseBoolSettingValue(const char* section, const char* key, bool value) -{ - auto lock = Host::GetSettingsLock(); - s_base_settings_interface->SetBoolValue(section, key, value); - QueueSettingsSave(); -} - -void QtHost::SetBaseIntSettingValue(const char* section, const char* key, int value) -{ - auto lock = Host::GetSettingsLock(); - s_base_settings_interface->SetIntValue(section, key, value); - QueueSettingsSave(); -} - -void QtHost::SetBaseFloatSettingValue(const char* section, const char* key, float value) -{ - auto lock = Host::GetSettingsLock(); - s_base_settings_interface->SetFloatValue(section, key, value); - QueueSettingsSave(); -} - -void QtHost::SetBaseStringSettingValue(const char* section, const char* key, const char* value) -{ - auto lock = Host::GetSettingsLock(); - s_base_settings_interface->SetStringValue(section, key, value); - QueueSettingsSave(); -} - -void QtHost::SetBaseStringListSettingValue(const char* section, const char* key, const std::vector& values) -{ - auto lock = Host::GetSettingsLock(); - s_base_settings_interface->SetStringList(section, key, values); - QueueSettingsSave(); -} - -bool QtHost::AddBaseValueToStringList(const char* section, const char* key, const char* value) -{ - auto lock = Host::GetSettingsLock(); - if (!s_base_settings_interface->AddToStringList(section, key, value)) - return false; - - QueueSettingsSave(); - return true; -} - -bool QtHost::RemoveBaseValueFromStringList(const char* section, const char* key, const char* value) -{ - auto lock = Host::GetSettingsLock(); - if (!s_base_settings_interface->RemoveFromStringList(section, key, value)) - return false; - - QueueSettingsSave(); - return true; -} - -void QtHost::RemoveBaseSettingValue(const char* section, const char* key) -{ - auto lock = Host::GetSettingsLock(); - s_base_settings_interface->DeleteValue(section, key); - QueueSettingsSave(); + si.SetBoolValue("UI", "InhibitScreensaver", true); + si.SetBoolValue("UI", "ConfirmShutdown", true); + si.SetBoolValue("UI", "StartPaused", false); + si.SetBoolValue("UI", "PauseOnFocusLoss", false); + si.SetBoolValue("UI", "StartFullscreen", false); + si.SetBoolValue("UI", "DoubleClickTogglesFullscreen", true); + si.SetBoolValue("UI", "HideMouseCursor", false); + si.SetBoolValue("UI", "RenderToSeparateWindow", false); + si.SetBoolValue("UI", "HideMainWindowWhenRunning", false); + si.SetBoolValue("UI", "DisableWindowResize", false); + si.SetStringValue("UI", "Theme", MainWindow::DEFAULT_THEME_NAME); } void QtHost::SaveSettings() @@ -357,13 +1317,20 @@ void QtHost::SaveSettings() s_settings_save_timer.release(); } -void QtHost::QueueSettingsSave() +void Host::CommitBaseSettingChanges() { + if (!QtHost::IsOnUIThread()) + { + QtHost::RunOnUIThread(&Host::CommitBaseSettingChanges); + return; + } + + auto lock = Host::GetSettingsLock(); if (s_settings_save_timer) return; s_settings_save_timer = std::make_unique(); - s_settings_save_timer->connect(s_settings_save_timer.get(), &QTimer::timeout, SaveSettings); + s_settings_save_timer->connect(s_settings_save_timer.get(), &QTimer::timeout, &QtHost::SaveSettings); s_settings_save_timer->setSingleShot(true); s_settings_save_timer->start(SETTINGS_SAVE_DELAY); } @@ -373,9 +1340,20 @@ bool QtHost::InBatchMode() return s_batch_mode; } -void QtHost::SetBatchMode(bool enabled) +bool QtHost::InNoGUIMode() { - s_batch_mode = enabled; + return s_nogui_mode; +} + +bool QtHost::IsOnUIThread() +{ + QThread* ui_thread = qApp->thread(); + return (QThread::currentThread() == ui_thread); +} + +bool QtHost::ShouldShowAdvancedSettings() +{ + return Host::GetBaseBoolSettingValue("UI", "ShowAdvancedSettings", false); } void QtHost::RunOnUIThread(const std::function& func, bool block /*= false*/) @@ -386,6 +1364,21 @@ void QtHost::RunOnUIThread(const std::function& func, bool block /*= fal Q_ARG(const std::function&, func)); } +bool Host::RequestResetSettings(bool folders, bool core, bool controllers, bool hotkeys, bool ui) +{ + { + auto lock = Host::GetSettingsLock(); + CommonHost::SetDefaultSettings(*s_base_settings_interface.get(), folders, core, controllers, hotkeys, ui); + } + Host::CommitBaseSettingChanges(); + + g_emu_thread->applySettings(); + if (folders) + g_emu_thread->updateEmuFolders(); + + return true; +} + QString QtHost::GetAppNameAndVersion() { QString ret; @@ -444,6 +1437,16 @@ std::optional Host::ReadResourceFileToString(const char* filename) return ret; } +std::optional Host::GetResourceFileTimestamp(const char* filename) +{ + const std::string path(Path::Combine(EmuFolders::Resources, filename)); + FILESYSTEM_STAT_DATA sd; + if (!FileSystem::StatFile(filename, &sd)) + return std::nullopt; + + return sd.ModificationTime; +} + void Host::ReportErrorAsync(const std::string_view& title, const std::string_view& message) { if (!title.empty() && !message.empty()) @@ -463,6 +1466,51 @@ void Host::ReportErrorAsync(const std::string_view& title, const std::string_vie Q_ARG(const QString&, message.empty() ? QString() : QString::fromUtf8(message.data(), message.size()))); } +bool Host::ConfirmMessage(const std::string_view& title, const std::string_view& message) +{ + const QString qtitle(QString::fromUtf8(title.data(), title.size())); + const QString qmessage(QString::fromUtf8(message.data(), message.size())); + return g_emu_thread->confirmMessage(qtitle, qmessage); +} + +void Host::OpenURL(const std::string_view& url) +{ + QtHost::RunOnUIThread([url = QtUtils::StringViewToQString(url)]() { + QtUtils::OpenURL(g_main_window, QUrl(url)); + }); +} + +bool Host::CopyTextToClipboard(const std::string_view& text) +{ + QtHost::RunOnUIThread([text = QtUtils::StringViewToQString(text)]() { + QClipboard* clipboard = QGuiApplication::clipboard(); + if (clipboard) + clipboard->setText(text); + }); + return true; +} + +void Host::BeginTextInput() +{ + QInputMethod* method = qApp->inputMethod(); + if (method) + QMetaObject::invokeMethod(method, "show", Qt::QueuedConnection); +} + +void Host::EndTextInput() +{ + QInputMethod* method = qApp->inputMethod(); + if (method) + QMetaObject::invokeMethod(method, "hide", Qt::QueuedConnection); +} + +std::optional Host::GetTopLevelWindowInfo() +{ + std::optional ret; + QMetaObject::invokeMethod(g_main_window, &MainWindow::getWindowInfo, Qt::BlockingQueuedConnection, &ret); + return ret; +} + void Host::OnInputDeviceConnected(const std::string_view& identifier, const std::string_view& device_name) { emit g_emu_thread->onInputDeviceConnected( @@ -476,6 +1524,14 @@ void Host::OnInputDeviceDisconnected(const std::string_view& identifier) identifier.empty() ? QString() : QString::fromUtf8(identifier.data(), identifier.size())); } +////////////////////////////////////////////////////////////////////////// +// Hotkeys +////////////////////////////////////////////////////////////////////////// + +BEGIN_HOTKEY_LIST(g_host_hotkeys) +END_HOTKEY_LIST() + + ////////////////////////////////////////////////////////////////////////// // Interface Stuff ////////////////////////////////////////////////////////////////////////// @@ -508,4 +1564,333 @@ void QtHost::HookSignals() { std::signal(SIGINT, SignalHandler); std::signal(SIGTERM, SignalHandler); + +#ifdef __linux__ + // Ignore SIGCHLD by default on Linux, since we kick off aplay asynchronously. + struct sigaction sa_chld = {}; + sigemptyset(&sa_chld.sa_mask); + sa_chld.sa_flags = SA_SIGINFO | SA_RESTART | SA_NOCLDSTOP | SA_NOCLDWAIT; + sigaction(SIGCHLD, &sa_chld, nullptr); +#endif +} + +void QtHost::PrintCommandLineVersion() +{ + CommonHost::InitializeEarlyConsole(); + std::fprintf(stderr, "%s\n", (GetAppNameAndVersion() + GetAppConfigSuffix()).toUtf8().constData()); + std::fprintf(stderr, "https://pcsx2.net/\n"); + std::fprintf(stderr, "\n"); +} + +void QtHost::PrintCommandLineHelp(const std::string_view& progname) +{ + PrintCommandLineVersion(); + fmt::print(stderr, "Usage: {} [parameters] [--] [boot filename]\n", progname); + std::fprintf(stderr, "\n"); + std::fprintf(stderr, " -help: Displays this information and exits.\n"); + std::fprintf(stderr, " -version: Displays version information and exits.\n"); + std::fprintf(stderr, " -batch: Enables batch mode (exits after shutting down).\n"); + std::fprintf(stderr, " -nogui: Hides main window while running (implies batch mode).\n"); + std::fprintf(stderr, " -elf : Overrides the boot ELF with the specified filename.\n"); + std::fprintf(stderr, " -disc : Uses the specified host DVD drive as a source.\n"); + std::fprintf(stderr, " -logfile : Writes the application log to path instead of emulog.txt.\n"); + std::fprintf(stderr, " -bios: Starts the BIOS (System Menu/OSDSYS).\n"); + std::fprintf(stderr, " -fastboot: Force fast boot for provided filename.\n"); + std::fprintf(stderr, " -slowboot: Force slow boot for provided filename.\n"); + std::fprintf(stderr, " -state : Loads specified save state by index.\n"); + std::fprintf(stderr, " -statefile : Loads state from the specified filename.\n"); + std::fprintf(stderr, " -fullscreen: Enters fullscreen mode immediately after starting.\n"); + std::fprintf(stderr, " -nofullscreen: Prevents fullscreen mode from triggering if enabled.\n"); + std::fprintf(stderr, " -earlyconsolelog: Forces logging of early console messages to console.\n"); + std::fprintf(stderr, " -testconfig: Initializes configuration and checks version, then exits.\n"); +#ifdef ENABLE_RAINTEGRATION + std::fprintf(stderr, " -raintegration: Use RAIntegration instead of built-in achievement support.\n"); +#endif + std::fprintf(stderr, " --: Signals that no more arguments will follow and the remaining\n" + " parameters make up the filename. Use when the filename contains\n" + " spaces or starts with a dash.\n"); + std::fprintf(stderr, "\n"); +} + +std::shared_ptr& QtHost::AutoBoot(std::shared_ptr& autoboot) +{ + if (!autoboot) + autoboot = std::make_shared(); + + return autoboot; +} + +bool QtHost::ParseCommandLineOptions(const QStringList& args, std::shared_ptr& autoboot) +{ + bool no_more_args = false; + + if (args.empty()) + { + // Nothing to do here. + return true; + } + + for (auto it = std::next(args.begin()); it != args.end(); ++it) + { + if (!no_more_args) + { +#define CHECK_ARG(str) (*it == str) +#define CHECK_ARG_PARAM(str) (*it == str && std::next(it) != args.end()) + + if (CHECK_ARG(QStringLiteral("-help"))) + { + PrintCommandLineHelp(args.front().toStdString()); + return false; + } + else if (CHECK_ARG(QStringLiteral("-version"))) + { + PrintCommandLineVersion(); + return false; + } + else if (CHECK_ARG(QStringLiteral("-batch"))) + { + s_batch_mode = true; + continue; + } + else if (CHECK_ARG(QStringLiteral("-nogui"))) + { + s_batch_mode = true; + s_nogui_mode = true; + continue; + } + else if (CHECK_ARG(QStringLiteral("-fastboot"))) + { + AutoBoot(autoboot)->fast_boot = true; + continue; + } + else if (CHECK_ARG(QStringLiteral("-slowboot"))) + { + AutoBoot(autoboot)->fast_boot = false; + continue; + } + else if (CHECK_ARG_PARAM(QStringLiteral("-state"))) + { + AutoBoot(autoboot)->state_index = (++it)->toInt(); + continue; + } + else if (CHECK_ARG_PARAM(QStringLiteral("-statefile"))) + { + AutoBoot(autoboot)->save_state = (++it)->toStdString(); + continue; + } + else if (CHECK_ARG_PARAM(QStringLiteral("-elf"))) + { + AutoBoot(autoboot)->elf_override = (++it)->toStdString(); + continue; + } + else if (CHECK_ARG_PARAM(QStringLiteral("-disc"))) + { + AutoBoot(autoboot)->source_type = CDVD_SourceType::Disc; + AutoBoot(autoboot)->filename = (++it)->toStdString(); + continue; + } + else if (CHECK_ARG_PARAM(QStringLiteral("-logfile"))) + { + CommonHost::SetFileLogPath((++it)->toStdString()); + continue; + } + else if (CHECK_ARG(QStringLiteral("-bios"))) + { + AutoBoot(autoboot)->source_type = CDVD_SourceType::NoDisc; + continue; + } + else if (CHECK_ARG(QStringLiteral("-fullscreen"))) + { + AutoBoot(autoboot)->fullscreen = true; + s_start_fullscreen_ui_fullscreen = true; + continue; + } + else if (CHECK_ARG(QStringLiteral("-nofullscreen"))) + { + AutoBoot(autoboot)->fullscreen = false; + continue; + } + else if (CHECK_ARG(QStringLiteral("-earlyconsolelog"))) + { + CommonHost::InitializeEarlyConsole(); + continue; + } + else if (CHECK_ARG(QStringLiteral("-bigpicture"))) + { + s_start_fullscreen_ui = true; + continue; + } + else if (CHECK_ARG(QStringLiteral("-testconfig"))) + { + s_test_config_and_exit = true; + continue; + } +#ifdef ENABLE_RAINTEGRATION + else if (CHECK_ARG(QStringLiteral("-raintegration"))) + { + Achievements::SwitchToRAIntegration(); + continue; + } +#endif + else if (CHECK_ARG(QStringLiteral("--"))) + { + no_more_args = true; + continue; + } + else if ((*it)[0] == '-') + { + QMessageBox::critical(nullptr, QStringLiteral("Error"), QStringLiteral("Unknown parameter: '%1'").arg(*it)); + return false; + } + +#undef CHECK_ARG +#undef CHECK_ARG_PARAM + } + + if (!AutoBoot(autoboot)->filename.empty()) + AutoBoot(autoboot)->filename += ' '; + + AutoBoot(autoboot)->filename += it->toStdString(); + } + + // check autoboot parameters, if we set something like fullscreen without a bios + // or disc, we don't want to actually start. + if (autoboot && !autoboot->source_type.has_value() && autoboot->filename.empty() && autoboot->elf_override.empty()) + { + CommonHost::InitializeEarlyConsole(); + Console.Warning("Skipping autoboot due to no boot parameters."); + autoboot.reset(); + } + + // if we don't have autoboot, we definitely don't want batch mode (because that'll skip + // scanning the game list). + if (s_batch_mode && !s_start_fullscreen_ui && !autoboot) + { + QMessageBox::critical(nullptr, QStringLiteral("Error"), s_nogui_mode ? + QStringLiteral("Cannot use no-gui mode, because no boot filename was specified.") : + QStringLiteral("Cannot use batch mode, because no boot filename was specified.")); + return false; + } + + return true; +} + +#ifndef _WIN32 + +// See note in EarlyHardwareChecks.cpp as to why we don't do this on Windows. +static bool PerformEarlyHardwareChecks() +{ + // NOTE: No point translating this message, because the configuration isn't loaded yet, so we + // won't know which language to use, and loading the configuration uses float instructions. + const char* error; + if (VMManager::PerformEarlyHardwareChecks(&error)) + return true; + + QMessageBox::critical(nullptr, QStringLiteral("Hardware Check Failed"), QString::fromUtf8(error)); + return false; +} + +#endif + +static void RegisterTypes() +{ + qRegisterMetaType>(); + qRegisterMetaType>("std::optional()"); + // Bit of fun with metatype names + // On Windows, the real type name here is "std::function" + // Normally, the fact that we `Q_DECLARE_METATYPE(std::function);` in QtHost.h would make it also register under "std::function" + // The metatype is a pointer to `QMetaTypeInterfaceWrapper>::metaType`, which contains a pointer to the function that would register the alternate name + // But to anyone who can't see QtHost.h, that pointer should be null, opening us up to ODR violations + // Turns out some of our automoc files also instantiate that metaType (with the null pointer), so if we try to rely on it, everything will break if we get unlucky with link order + // Instead, manually register under the desired name: + qRegisterMetaType>("std::function"); + qRegisterMetaType>(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); +} + +int main(int argc, char* argv[]) +{ + CrashHandler::Install(); + + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); + RegisterTypes(); + + QApplication app(argc, argv); + +#ifndef _WIN32 + if (!PerformEarlyHardwareChecks()) + return EXIT_FAILURE; +#endif + + std::shared_ptr autoboot; + if (!QtHost::ParseCommandLineOptions(app.arguments(), autoboot)) + return EXIT_FAILURE; + + // Bail out if we can't find any config. + if (!QtHost::InitializeConfig()) + return EXIT_FAILURE; + + // Are we just setting up the configuration? + if (s_test_config_and_exit) + return EXIT_SUCCESS; + + // Set theme before creating any windows. + MainWindow::updateApplicationTheme(); + MainWindow* main_window = new MainWindow(); + + // Start up the CPU thread. + QtHost::HookSignals(); + EmuThread::start(); + + // Create all window objects, the emuthread might still be starting up at this point. + main_window->initialize(); + + // When running in batch mode, ensure game list is loaded, but don't scan for any new files. + if (!s_batch_mode) + main_window->refreshGameList(false); + else + GameList::Refresh(false, true); + + // Don't bother showing the window in no-gui mode. + if (!s_nogui_mode) + main_window->show(); + + // Initialize big picture mode if requested. + if (s_start_fullscreen_ui) + g_emu_thread->startFullscreenUI(s_start_fullscreen_ui_fullscreen); + + // Skip the update check if we're booting a game directly. + if (autoboot) + g_emu_thread->startVM(std::move(autoboot)); + else if (!s_nogui_mode) + main_window->startupUpdateCheck(); + + // This doesn't return until we exit. + const int result = app.exec(); + + // Shutting down. + EmuThread::stop(); + if (g_main_window) + { + g_main_window->close(); + delete g_main_window; + } + + // Ensure config is written. Prevents destruction order issues. + if (s_base_settings_interface->IsDirty()) + s_base_settings_interface->Save(); + + // Ensure emulog is flushed. + if (emuLog) + { + std::fclose(emuLog); + emuLog = nullptr; + } + + return result; } diff --git a/pcsx2-qt/QtHost.h b/pcsx2-qt/QtHost.h index 2f6d27044d..aa2898c0c4 100644 --- a/pcsx2-qt/QtHost.h +++ b/pcsx2-qt/QtHost.h @@ -14,38 +14,214 @@ */ #pragma once + +#include +#include +#include +#include + #include "pcsx2/Host.h" #include "pcsx2/HostDisplay.h" #include "pcsx2/HostSettings.h" #include "pcsx2/Frontend/InputManager.h" #include "pcsx2/VMManager.h" + +#include +#include #include +#include #include -#include -#include -#include +#include +#include +#include +#include class SettingsInterface; -class EmuThread; +class DisplayWidget; +struct VMBootParameters; enum class CDVD_SourceType : uint8_t; Q_DECLARE_METATYPE(std::shared_ptr); Q_DECLARE_METATYPE(std::optional); -Q_DECLARE_METATYPE(std::function); Q_DECLARE_METATYPE(GSRendererType); Q_DECLARE_METATYPE(InputBindingKey); Q_DECLARE_METATYPE(CDVD_SourceType); +class EmuThread : public QThread +{ + Q_OBJECT + +public: + explicit EmuThread(QThread* ui_thread); + ~EmuThread(); + + static void start(); + static void stop(); + + __fi QEventLoop* getEventLoop() const { return m_event_loop; } + __fi bool isFullscreen() const { return m_is_fullscreen; } + __fi bool isRenderingToMain() const { return m_is_rendering_to_main; } + __fi bool isSurfaceless() const { return m_is_surfaceless; } + __fi bool isRunningFullscreenUI() const { return m_run_fullscreen_ui; } + + bool isOnEmuThread() const; + bool shouldRenderToMain() const; + + /// Called back from the GS thread when the display state changes (e.g. fullscreen, render to main). + bool acquireHostDisplay(RenderAPI api, bool clear_state_on_fail); + void connectDisplaySignals(DisplayWidget* widget); + void releaseHostDisplay(bool clear_state); + void updateDisplay(); + + void startBackgroundControllerPollTimer(); + void stopBackgroundControllerPollTimer(); + void updatePerformanceMetrics(bool force); + +public Q_SLOTS: + bool confirmMessage(const QString& title, const QString& message); + void loadSettings(SettingsInterface& si, std::unique_lock& lock); + void checkForSettingChanges(const Pcsx2Config& old_config); + void startFullscreenUI(bool fullscreen); + void stopFullscreenUI(); + void startVM(std::shared_ptr boot_params); + void resetVM(); + void setVMPaused(bool paused); + void shutdownVM(bool save_state = true); + void loadState(const QString& filename); + void loadStateFromSlot(qint32 slot); + void saveState(const QString& filename); + void saveStateToSlot(qint32 slot); + void toggleFullscreen(); + void setFullscreen(bool fullscreen); + void setSurfaceless(bool surfaceless); + void applySettings(); + void reloadGameSettings(); + void updateEmuFolders(); + void toggleSoftwareRendering(); + void switchRenderer(GSRendererType renderer); + void changeDisc(CDVD_SourceType source, const QString& path); + void reloadPatches(); + void reloadInputSources(); + void reloadInputBindings(); + void reloadInputDevices(); + void closeInputSources(); + void requestDisplaySize(float scale); + void enumerateInputDevices(); + void enumerateVibrationMotors(); + void runOnCPUThread(const std::function& func); + void queueSnapshot(quint32 gsdump_frames); + +Q_SIGNALS: + bool messageConfirmed(const QString& title, const QString& message); + + DisplayWidget* onCreateDisplayRequested(bool fullscreen, bool render_to_main); + DisplayWidget* onUpdateDisplayRequested(bool fullscreen, bool render_to_main, bool surfaceless); + void onResizeDisplayRequested(qint32 width, qint32 height); + void onDestroyDisplayRequested(); + + /// Called when the VM is starting initialization, but has not been completed yet. + void onVMStarting(); + + /// Called when the VM is created. + void onVMStarted(); + + /// Called when the VM is paused. + void onVMPaused(); + + /// Called when the VM is resumed after being paused. + void onVMResumed(); + + /// Called when the VM is shut down or destroyed. + void onVMStopped(); + + /// Provided by the host; called when the running executable changes. + void onGameChanged(const QString& path, const QString& serial, const QString& name, quint32 crc); + + void onInputDevicesEnumerated(const QList>& devices); + void onInputDeviceConnected(const QString& identifier, const QString& device_name); + void onInputDeviceDisconnected(const QString& identifier); + void onVibrationMotorsEnumerated(const QList& motors); + + /// Called when a save state is loading, before the file is processed. + void onSaveStateLoading(const QString& path); + + /// Called after a save state is successfully loaded. If the save state was invalid, was_successful will be false. + void onSaveStateLoaded(const QString& path, bool was_successful); + + /// Called when a save state is being created/saved. The compression/write to disk is asynchronous, so this callback + /// just signifies that the save has started, not necessarily completed. + void onSaveStateSaved(const QString& path); + + /// Called when achievements are reloaded/refreshed (e.g. game change, login, option change). + void onAchievementsRefreshed(quint32 id, const QString& game_info_string, quint32 total, quint32 points); + +protected: + void run(); + +private: + /// Interval at which the controllers are polled when the system is not active. + static constexpr u32 BACKGROUND_CONTROLLER_POLLING_INTERVAL = 100; + + /// Poll at half the vsync rate for FSUI to reduce the chance of getting a press+release in the same frame. + static constexpr u32 FULLSCREEN_UI_CONTROLLER_POLLING_INTERVAL = 8; + + void destroyVM(); + void executeVM(); + + void createBackgroundControllerPollTimer(); + void destroyBackgroundControllerPollTimer(); + void connectSignals(); + +private Q_SLOTS: + void stopInThread(); + void doBackgroundControllerPoll(); + void onDisplayWindowResized(int width, int height, float scale); + void onApplicationStateChanged(Qt::ApplicationState state); + void redrawDisplayWindow(); + +private: + QThread* m_ui_thread; + QSemaphore m_started_semaphore; + QEventLoop* m_event_loop = nullptr; + QTimer* m_background_controller_polling_timer = nullptr; + + std::atomic_bool m_shutdown_flag{false}; + + bool m_verbose_status = false; + bool m_run_fullscreen_ui = false; + bool m_is_rendering_to_main = false; + bool m_is_fullscreen = false; + bool m_is_surfaceless = false; + bool m_save_state_on_shutdown = false; + bool m_pause_on_focus_loss = false; + + bool m_was_paused_by_focus_loss = false; + + float m_last_speed = 0.0f; + float m_last_game_fps = 0.0f; + float m_last_video_fps = 0.0f; + int m_last_internal_width = 0; + int m_last_internal_height = 0; + GSRendererType m_last_renderer = GSRendererType::Null; +}; + +extern EmuThread* g_emu_thread; + namespace QtHost { - bool Initialize(); - void Shutdown(); - /// Sets batch mode (exit after game shutdown). bool InBatchMode(); - void SetBatchMode(bool enabled); + + /// Sets NoGUI mode (implys batch mode, does not display main window, exits on shutdown). + bool InNoGUIMode(); + + /// Returns true if the calling thread is the UI thread. + bool IsOnUIThread(); + + /// Returns true if advanced settings should be shown. + bool ShouldShowAdvancedSettings(); /// Executes a function on the UI thread. void RunOnUIThread(const std::function& func, bool block = false); @@ -59,17 +235,6 @@ namespace QtHost /// Returns the base path for resources. This may be : prefixed, if we're using embedded resources. QString GetResourcesBasePath(); - /// Thread-safe settings access. - void SetBaseBoolSettingValue(const char* section, const char* key, bool value); - void SetBaseIntSettingValue(const char* section, const char* key, int value); - void SetBaseFloatSettingValue(const char* section, const char* key, float value); - void SetBaseStringSettingValue(const char* section, const char* key, const char* value); - void SetBaseStringListSettingValue(const char* section, const char* key, const std::vector& values); - bool AddBaseValueToStringList(const char* section, const char* key, const char* value); - bool RemoveBaseValueFromStringList(const char* section, const char* key, const char* value); - void RemoveBaseSettingValue(const char* section, const char* key); - void QueueSettingsSave(); - /// VM state, safe to access on UI thread. bool IsVMValid(); bool IsVMPaused(); diff --git a/pcsx2-qt/QtProgressCallback.cpp b/pcsx2-qt/QtProgressCallback.cpp new file mode 100644 index 0000000000..4455446505 --- /dev/null +++ b/pcsx2-qt/QtProgressCallback.cpp @@ -0,0 +1,247 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#include "common/Assertions.h" + +#include "QtProgressCallback.h" + +#include +#include +#include +#include + +QtModalProgressCallback::QtModalProgressCallback(QWidget* parent_widget, float show_delay) + : QObject(parent_widget) + , m_dialog(QString(), QString(), 0, 1, parent_widget) + , m_show_delay(show_delay) +{ + m_dialog.setWindowTitle(tr("PCSX2")); + m_dialog.setMinimumSize(QSize(500, 0)); + m_dialog.setModal(parent_widget != nullptr); + m_dialog.setAutoClose(false); + m_dialog.setAutoReset(false); + checkForDelayedShow(); +} + +QtModalProgressCallback::~QtModalProgressCallback() = default; + +bool QtModalProgressCallback::IsCancelled() const +{ + return m_dialog.wasCanceled(); +} + +void QtModalProgressCallback::SetCancellable(bool cancellable) +{ + if (m_cancellable == cancellable) + return; + + BaseProgressCallback::SetCancellable(cancellable); + m_dialog.setCancelButtonText(cancellable ? tr("Cancel") : QString()); +} + +void QtModalProgressCallback::SetTitle(const char* title) +{ + m_dialog.setWindowTitle(QString::fromUtf8(title)); +} + +void QtModalProgressCallback::SetStatusText(const char* text) +{ + BaseProgressCallback::SetStatusText(text); + checkForDelayedShow(); + + if (m_dialog.isVisible()) + m_dialog.setLabelText(QString::fromUtf8(text)); +} + +void QtModalProgressCallback::SetProgressRange(u32 range) +{ + BaseProgressCallback::SetProgressRange(range); + checkForDelayedShow(); + + if (m_dialog.isVisible()) + m_dialog.setRange(0, m_progress_range); +} + +void QtModalProgressCallback::SetProgressValue(u32 value) +{ + BaseProgressCallback::SetProgressValue(value); + checkForDelayedShow(); + + if (m_dialog.isVisible() && static_cast(m_dialog.value()) != m_progress_range) + m_dialog.setValue(m_progress_value); + + QCoreApplication::processEvents(); +} + +void QtModalProgressCallback::DisplayError(const char* message) +{ + qWarning() << message; +} + +void QtModalProgressCallback::DisplayWarning(const char* message) +{ + qWarning() << message; +} + +void QtModalProgressCallback::DisplayInformation(const char* message) +{ + qWarning() << message; +} + +void QtModalProgressCallback::DisplayDebugMessage(const char* message) +{ + qWarning() << message; +} + +void QtModalProgressCallback::ModalError(const char* message) +{ + QMessageBox::critical(&m_dialog, tr("Error"), QString::fromUtf8(message)); +} + +bool QtModalProgressCallback::ModalConfirmation(const char* message) +{ + return (QMessageBox::question(&m_dialog, tr("Question"), QString::fromUtf8(message), QMessageBox::Yes, + QMessageBox::No) == QMessageBox::Yes); +} + +void QtModalProgressCallback::ModalInformation(const char* message) +{ + QMessageBox::information(&m_dialog, tr("Information"), QString::fromUtf8(message)); +} + +void QtModalProgressCallback::checkForDelayedShow() +{ + if (m_dialog.isVisible()) + return; + + if (m_show_timer.GetTimeSeconds() >= m_show_delay) + { + m_dialog.setRange(0, m_progress_range); + m_dialog.setValue(m_progress_value); + m_dialog.show(); + } +} + +QtAsyncProgressThread::QtAsyncProgressThread(QWidget* parent) + : QThread() +{ + // NOTE: We deliberately don't set the thread parent, because otherwise we can't move it. +} + +QtAsyncProgressThread::~QtAsyncProgressThread() = default; + +bool QtAsyncProgressThread::IsCancelled() const +{ + return isInterruptionRequested(); +} + +void QtAsyncProgressThread::SetCancellable(bool cancellable) +{ + if (m_cancellable == cancellable) + return; + + BaseProgressCallback::SetCancellable(cancellable); +} + +void QtAsyncProgressThread::SetTitle(const char* title) +{ + emit titleUpdated(QString::fromUtf8(title)); +} + +void QtAsyncProgressThread::SetStatusText(const char* text) +{ + BaseProgressCallback::SetStatusText(text); + emit statusUpdated(QString::fromUtf8(text)); +} + +void QtAsyncProgressThread::SetProgressRange(u32 range) +{ + BaseProgressCallback::SetProgressRange(range); + emit progressUpdated(static_cast(m_progress_value), static_cast(m_progress_range)); +} + +void QtAsyncProgressThread::SetProgressValue(u32 value) +{ + BaseProgressCallback::SetProgressValue(value); + emit progressUpdated(static_cast(m_progress_value), static_cast(m_progress_range)); +} + +void QtAsyncProgressThread::DisplayError(const char* message) +{ + qWarning() << message; +} + +void QtAsyncProgressThread::DisplayWarning(const char* message) +{ + qWarning() << message; +} + +void QtAsyncProgressThread::DisplayInformation(const char* message) +{ + qWarning() << message; +} + +void QtAsyncProgressThread::DisplayDebugMessage(const char* message) +{ + qWarning() << message; +} + +void QtAsyncProgressThread::ModalError(const char* message) +{ + QMessageBox::critical(parentWidget(), tr("Error"), QString::fromUtf8(message)); +} + +bool QtAsyncProgressThread::ModalConfirmation(const char* message) +{ + return (QMessageBox::question(parentWidget(), tr("Question"), QString::fromUtf8(message), QMessageBox::Yes, + QMessageBox::No) == QMessageBox::Yes); +} + +void QtAsyncProgressThread::ModalInformation(const char* message) +{ + QMessageBox::information(parentWidget(), tr("Information"), QString::fromUtf8(message)); +} + +void QtAsyncProgressThread::start() +{ + pxAssertRel(!isRunning(), "Async progress thread is not already running"); + + QThread::start(); + moveToThread(this); + m_starting_thread = QThread::currentThread(); + m_start_semaphore.release(); +} + +void QtAsyncProgressThread::join() +{ + if (isRunning()) + QThread::wait(); +} + +void QtAsyncProgressThread::run() +{ + m_start_semaphore.acquire(); + emit threadStarting(); + runAsync(); + emit threadFinished(); + moveToThread(m_starting_thread); +} + +QWidget* QtAsyncProgressThread::parentWidget() const +{ + return qobject_cast(parent()); +} diff --git a/pcsx2-qt/QtProgressCallback.h b/pcsx2-qt/QtProgressCallback.h new file mode 100644 index 0000000000..0916d2e01d --- /dev/null +++ b/pcsx2-qt/QtProgressCallback.h @@ -0,0 +1,102 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "common/ProgressCallback.h" +#include "common/Timer.h" +#include +#include +#include +#include + +class QtModalProgressCallback final : public QObject, public BaseProgressCallback +{ + Q_OBJECT + +public: + QtModalProgressCallback(QWidget* parent_widget, float show_delay = 0.0f); + ~QtModalProgressCallback(); + + bool IsCancelled() const override; + + void SetCancellable(bool cancellable) override; + void SetTitle(const char* title) override; + void SetStatusText(const char* text) override; + void SetProgressRange(u32 range) override; + void SetProgressValue(u32 value) override; + + void DisplayError(const char* message) override; + void DisplayWarning(const char* message) override; + void DisplayInformation(const char* message) override; + void DisplayDebugMessage(const char* message) override; + + void ModalError(const char* message) override; + bool ModalConfirmation(const char* message) override; + void ModalInformation(const char* message) override; + +private: + void checkForDelayedShow(); + + QProgressDialog m_dialog; + Common::Timer m_show_timer; + float m_show_delay; +}; + +class QtAsyncProgressThread : public QThread, public BaseProgressCallback +{ + Q_OBJECT + +public: + QtAsyncProgressThread(QWidget* parent); + ~QtAsyncProgressThread(); + + bool IsCancelled() const override; + + void SetCancellable(bool cancellable) override; + void SetTitle(const char* title) override; + void SetStatusText(const char* text) override; + void SetProgressRange(u32 range) override; + void SetProgressValue(u32 value) override; + + void DisplayError(const char* message) override; + void DisplayWarning(const char* message) override; + void DisplayInformation(const char* message) override; + void DisplayDebugMessage(const char* message) override; + + void ModalError(const char* message) override; + bool ModalConfirmation(const char* message) override; + void ModalInformation(const char* message) override; + +Q_SIGNALS: + void titleUpdated(const QString& title); + void statusUpdated(const QString& status); + void progressUpdated(int value, int range); + void threadStarting(); + void threadFinished(); + +public Q_SLOTS: + void start(); + void join(); + +protected: + virtual void runAsync() = 0; + void run() final; + +private: + QWidget* parentWidget() const; + + QSemaphore m_start_semaphore; + QThread* m_starting_thread = nullptr; +}; diff --git a/pcsx2-qt/QtUtils.cpp b/pcsx2-qt/QtUtils.cpp index cea0d06bdd..4a7d89fe26 100644 --- a/pcsx2-qt/QtUtils.cpp +++ b/pcsx2-qt/QtUtils.cpp @@ -15,13 +15,15 @@ #include "PrecompiledHeader.h" +#include "QtUtils.h" + #include #include +#include +#include #include #include - -#include - +#include #include #include #include @@ -33,11 +35,16 @@ #include #include #include + #include #include #include -#include "QtUtils.h" +#if defined(_WIN32) +#include "common/RedtapeWindows.h" +#elif !defined(APPLE) +#include +#endif namespace QtUtils { @@ -203,4 +210,54 @@ namespace QtUtils widget->resize(width, height); } + + qreal GetDevicePixelRatioForWidget(const QWidget* widget) + { + const QScreen* screen_for_ratio = widget->screen(); + if (!screen_for_ratio) + screen_for_ratio = QGuiApplication::primaryScreen(); + + return screen_for_ratio ? screen_for_ratio->devicePixelRatio() : static_cast(1); + } + + std::optional GetWindowInfoForWidget(QWidget* widget) + { + WindowInfo wi; + + // Windows and Apple are easy here since there's no display connection. +#if defined(_WIN32) + wi.type = WindowInfo::Type::Win32; + wi.window_handle = reinterpret_cast(widget->winId()); +#elif defined(__APPLE__) + wi.type = WindowInfo::Type::MacOS; + wi.window_handle = reinterpret_cast(widget->winId()); +#else + QPlatformNativeInterface* pni = QGuiApplication::platformNativeInterface(); + const QString platform_name = QGuiApplication::platformName(); + if (platform_name == QStringLiteral("xcb")) + { + wi.type = WindowInfo::Type::X11; + wi.display_connection = pni->nativeResourceForWindow("display", widget->windowHandle()); + wi.window_handle = reinterpret_cast(widget->winId()); + } + else if (platform_name == QStringLiteral("wayland")) + { + wi.type = WindowInfo::Type::Wayland; + wi.display_connection = pni->nativeResourceForWindow("display", widget->windowHandle()); + wi.window_handle = pni->nativeResourceForWindow("surface", widget->windowHandle()); + } + else + { + qCritical() << "Unknown PNI platform " << platform_name; + return std::nullopt; + } +#endif + + const qreal dpr = GetDevicePixelRatioForWidget(widget); + wi.surface_width = static_cast(static_cast(widget->width()) * dpr); + wi.surface_height = static_cast(static_cast(widget->height()) * dpr); + wi.surface_scale = static_cast(dpr); + return wi; + } + } // namespace QtUtils diff --git a/pcsx2-qt/QtUtils.h b/pcsx2-qt/QtUtils.h index 8dab030d48..eba6200485 100644 --- a/pcsx2-qt/QtUtils.h +++ b/pcsx2-qt/QtUtils.h @@ -14,6 +14,9 @@ */ #pragma once + +#include "common/WindowInfo.h" + #include #include #include @@ -77,4 +80,10 @@ namespace QtUtils /// Adjusts the fixed size for a window if it's not resizeable. void ResizePotentiallyFixedSizeWindow(QWidget* widget, int width, int height); + + /// Returns the pixel ratio/scaling factor for a widget. + qreal GetDevicePixelRatioForWidget(const QWidget* widget); + + /// Returns the common window info structure for a Qt widget. + std::optional GetWindowInfoForWidget(QWidget* widget); } // namespace QtUtils \ No newline at end of file diff --git a/pcsx2-qt/SettingWidgetBinder.h b/pcsx2-qt/SettingWidgetBinder.h index 316e446357..39a14b2f2c 100644 --- a/pcsx2-qt/SettingWidgetBinder.h +++ b/pcsx2-qt/SettingWidgetBinder.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -34,13 +35,16 @@ #include "pcsx2/Config.h" #include "pcsx2/HostSettings.h" -#include "EmuThread.h" #include "QtHost.h" #include "QtUtils.h" #include "Settings/SettingsDialog.h" namespace SettingWidgetBinder { + static constexpr const char* NULLABLE_PROPERTY = "SettingWidgetBinder_isNullable"; + static constexpr const char* IS_NULL_PROPERTY = "SettingWidgetBinder_isNull"; + static constexpr const char* GLOBAL_VALUE_PROPERTY = "SettingWidgetBinder_globalValue"; + template struct SettingAccessor { @@ -179,7 +183,7 @@ namespace SettingWidgetBinder } static void setNullableStringValue(QComboBox* widget, std::optional value) { - isNullValue(widget) ? widget->setCurrentIndex(0) : setStringValue(widget, value.value()); + value.has_value() ? setStringValue(widget, value.value()) : widget->setCurrentIndex(0); } template @@ -286,71 +290,256 @@ namespace SettingWidgetBinder template <> struct SettingAccessor { + static bool isNullable(const QSpinBox* widget) { return widget->property(NULLABLE_PROPERTY).toBool(); } + + static void updateNullState(QSpinBox* widget, bool isNull) + { + widget->setPrefix(isNull ? qApp->translate("SettingWidgetBinder", "Default: ") : QString()); + } + static bool getBoolValue(const QSpinBox* widget) { return widget->value() > 0; } static void setBoolValue(QSpinBox* widget, bool value) { widget->setValue(value ? 1 : 0); } - static void makeNullableBool(QSpinBox* widget, bool globalSetting) { widget->setEnabled(false); } - static std::optional getNullableBoolValue(const QSpinBox* widget) { return getBoolValue(widget); } - static void setNullableBoolValue(QSpinBox* widget, std::optional value) { setBoolValue(widget, value.value_or(false)); } + static void makeNullableBool(QSpinBox* widget, bool globalSetting) + { + widget->setProperty(NULLABLE_PROPERTY, QVariant(true)); + widget->setProperty(GLOBAL_VALUE_PROPERTY, QVariant(globalSetting)); + } + static std::optional getNullableBoolValue(const QSpinBox* widget) + { + if (widget->property(IS_NULL_PROPERTY).toBool()) + return std::nullopt; + + return getBoolValue(widget); + } + static void setNullableBoolValue(QSpinBox* widget, std::optional value) + { + widget->setProperty(IS_NULL_PROPERTY, QVariant(!value.has_value())); + setBoolValue(widget, value.has_value() ? value.value() : widget->property(GLOBAL_VALUE_PROPERTY).toBool()); + updateNullState(widget, !value.has_value()); + } static int getIntValue(const QSpinBox* widget) { return widget->value(); } static void setIntValue(QSpinBox* widget, int value) { widget->setValue(value); } - static void makeNullableInt(QSpinBox* widget, int globalValue) { widget->setEnabled(false); } - static std::optional getNullableIntValue(const QSpinBox* widget) { return getIntValue(widget); } - static void setNullableIntValue(QSpinBox* widget, std::optional value) { setIntValue(widget, value.value_or(0)); } + static void makeNullableInt(QSpinBox* widget, int globalValue) + { + widget->setProperty(NULLABLE_PROPERTY, QVariant(true)); + widget->setProperty(GLOBAL_VALUE_PROPERTY, QVariant(globalValue)); + } + static std::optional getNullableIntValue(const QSpinBox* widget) + { + if (widget->property(IS_NULL_PROPERTY).toBool()) + return std::nullopt; + + return getIntValue(widget); + } + static void setNullableIntValue(QSpinBox* widget, std::optional value) + { + widget->setProperty(IS_NULL_PROPERTY, QVariant(!value.has_value())); + setIntValue(widget, value.has_value() ? value.value() : widget->property(GLOBAL_VALUE_PROPERTY).toInt()); + updateNullState(widget, !value.has_value()); + } static float getFloatValue(const QSpinBox* widget) { return static_cast(widget->value()); } static void setFloatValue(QSpinBox* widget, float value) { widget->setValue(static_cast(value)); } - static void makeNullableFloat(QSpinBox* widget, float globalValue) { widget->setEnabled(false); } - static std::optional getNullableFloatValue(const QSpinBox* widget) { return getFloatValue(widget); } - static void setNullableFloatValue(QSpinBox* widget, std::optional value) { setFloatValue(widget, value.value_or(0.0f)); } + static void makeNullableFloat(QSpinBox* widget, float globalValue) + { + widget->setProperty(NULLABLE_PROPERTY, QVariant(true)); + widget->setProperty(GLOBAL_VALUE_PROPERTY, QVariant(globalValue)); + } + static std::optional getNullableFloatValue(const QSpinBox* widget) + { + if (widget->property(IS_NULL_PROPERTY).toBool()) + return std::nullopt; + + return getFloatValue(widget); + } + static void setNullableFloatValue(QSpinBox* widget, std::optional value) + { + widget->setProperty(IS_NULL_PROPERTY, QVariant(!value.has_value())); + setFloatValue(widget, value.has_value() ? value.value() : widget->property(GLOBAL_VALUE_PROPERTY).toFloat()); + updateNullState(widget, !value.has_value()); + } static QString getStringValue(const QSpinBox* widget) { return QString::number(widget->value()); } static void setStringValue(QSpinBox* widget, const QString& value) { widget->setValue(value.toInt()); } - static void makeNullableString(QSpinBox* widget, const QString& globalValue) { widget->setEnabled(false); } - static std::optional getNullableStringValue(const QSpinBox* widget) { return getStringValue(widget); } - static void setNullableStringValue(QSpinBox* widget, std::optional value) { setStringValue(widget, value.value_or(QString())); } + static void makeNullableString(QSpinBox* widget, const QString& globalValue) + { + widget->setProperty(NULLABLE_PROPERTY, QVariant(true)); + widget->setProperty(GLOBAL_VALUE_PROPERTY, QVariant(globalValue)); + } + static std::optional getNullableStringValue(const QSpinBox* widget) + { + if (widget->property(IS_NULL_PROPERTY).toBool()) + return std::nullopt; + + return getStringValue(widget); + } + static void setNullableStringValue(QSpinBox* widget, std::optional value) + { + widget->setProperty(IS_NULL_PROPERTY, QVariant(!value.has_value())); + setStringValue(widget, value.has_value() ? value.value() : widget->property(GLOBAL_VALUE_PROPERTY).toString()); + updateNullState(widget, !value.has_value()); + } template static void connectValueChanged(QSpinBox* widget, F func) { - widget->connect(widget, QOverload::of(&QSpinBox::valueChanged), func); + if (!isNullable(widget)) + { + widget->connect(widget, QOverload::of(&QSpinBox::valueChanged), func); + } + else + { + widget->setContextMenuPolicy(Qt::CustomContextMenu); + widget->connect(widget, &QSpinBox::customContextMenuRequested, widget, [widget, func](const QPoint& pt) { + QMenu menu(widget); + widget->connect(menu.addAction(qApp->translate("SettingWidgetBinder", "Reset")), &QAction::triggered, widget, + [widget, func = std::move(func)]() { + const bool old = widget->blockSignals(true); + setNullableIntValue(widget, std::nullopt); + widget->blockSignals(old); + updateNullState(widget, true); + func(); + }); + menu.exec(widget->mapToGlobal(pt)); + }); + widget->connect(widget, &QSpinBox::valueChanged, widget, [widget, func = std::move(func)]() { + if (widget->property(IS_NULL_PROPERTY).toBool()) + { + widget->setProperty(IS_NULL_PROPERTY, QVariant(false)); + updateNullState(widget, false); + } + func(); + }); + } } }; template <> struct SettingAccessor { + static bool isNullable(const QDoubleSpinBox* widget) { return widget->property(NULLABLE_PROPERTY).toBool(); } + + static void updateNullState(QDoubleSpinBox* widget, bool isNull) + { + widget->setPrefix(isNull ? qApp->translate("SettingWidgetBinder", "Default: ") : QString()); + } + static bool getBoolValue(const QDoubleSpinBox* widget) { return widget->value() > 0.0; } static void setBoolValue(QDoubleSpinBox* widget, bool value) { widget->setValue(value ? 1.0 : 0.0); } - static void makeNullableBool(QDoubleSpinBox* widget, bool globalSetting) { widget->setEnabled(false); } - static std::optional getNullableBoolValue(const QDoubleSpinBox* widget) { return getBoolValue(widget); } - static void setNullableBoolValue(QDoubleSpinBox* widget, std::optional value) { setBoolValue(widget, value.value_or(false)); } + static void makeNullableBool(QDoubleSpinBox* widget, bool globalSetting) + { + widget->setProperty(NULLABLE_PROPERTY, QVariant(true)); + widget->setProperty(GLOBAL_VALUE_PROPERTY, QVariant(globalSetting)); + } + static std::optional getNullableBoolValue(const QDoubleSpinBox* widget) + { + if (widget->property(IS_NULL_PROPERTY).toBool()) + return std::nullopt; + + return getBoolValue(widget); + } + static void setNullableBoolValue(QDoubleSpinBox* widget, std::optional value) + { + widget->setProperty(IS_NULL_PROPERTY, QVariant(!value.has_value())); + setBoolValue(widget, value.has_value() ? value.value() : widget->property(GLOBAL_VALUE_PROPERTY).toBool()); + updateNullState(widget, !value.has_value()); + } static int getIntValue(const QDoubleSpinBox* widget) { return static_cast(widget->value()); } static void setIntValue(QDoubleSpinBox* widget, int value) { widget->setValue(static_cast(value)); } - static void makeNullableInt(QDoubleSpinBox* widget, int globalValue) { widget->setEnabled(false); } - static std::optional getNullableIntValue(const QDoubleSpinBox* widget) { return getIntValue(widget); } - static void setNullableIntValue(QDoubleSpinBox* widget, std::optional value) { setIntValue(widget, value.value_or(0)); } + static void makeNullableInt(QDoubleSpinBox* widget, int globalValue) + { + widget->setProperty(NULLABLE_PROPERTY, QVariant(true)); + widget->setProperty(GLOBAL_VALUE_PROPERTY, QVariant(globalValue)); + } + static std::optional getNullableIntValue(const QDoubleSpinBox* widget) + { + if (widget->property(IS_NULL_PROPERTY).toBool()) + return std::nullopt; + + return getIntValue(widget); + } + static void setNullableIntValue(QDoubleSpinBox* widget, std::optional value) + { + widget->setProperty(IS_NULL_PROPERTY, QVariant(!value.has_value())); + setIntValue(widget, value.has_value() ? value.value() : widget->property(GLOBAL_VALUE_PROPERTY).toInt()); + updateNullState(widget, !value.has_value()); + } static float getFloatValue(const QDoubleSpinBox* widget) { return static_cast(widget->value()); } static void setFloatValue(QDoubleSpinBox* widget, float value) { widget->setValue(static_cast(value)); } - static void makeNullableFloat(QDoubleSpinBox* widget, float globalValue) { widget->setEnabled(false); } - static std::optional getNullableFloatValue(const QDoubleSpinBox* widget) { return getFloatValue(widget); } - static void setNullableFloatValue(QDoubleSpinBox* widget, std::optional value) { setFloatValue(widget, value.value_or(0.0f)); } + static void makeNullableFloat(QDoubleSpinBox* widget, float globalValue) + { + widget->setProperty(NULLABLE_PROPERTY, QVariant(true)); + widget->setProperty(GLOBAL_VALUE_PROPERTY, QVariant(globalValue)); + } + static std::optional getNullableFloatValue(const QDoubleSpinBox* widget) + { + if (widget->property(IS_NULL_PROPERTY).toBool()) + return std::nullopt; + + return getFloatValue(widget); + } + static void setNullableFloatValue(QDoubleSpinBox* widget, std::optional value) + { + widget->setProperty(IS_NULL_PROPERTY, QVariant(!value.has_value())); + setFloatValue(widget, value.has_value() ? value.value() : widget->property(GLOBAL_VALUE_PROPERTY).toFloat()); + updateNullState(widget, !value.has_value()); + } static QString getStringValue(const QDoubleSpinBox* widget) { return QString::number(widget->value()); } static void setStringValue(QDoubleSpinBox* widget, const QString& value) { widget->setValue(value.toDouble()); } - static void makeNullableString(QDoubleSpinBox* widget, const QString& globalValue) { widget->setEnabled(false); } - static std::optional getNullableStringValue(const QDoubleSpinBox* widget) { return getStringValue(widget); } + static void makeNullableString(QDoubleSpinBox* widget, const QString& globalValue) + { + widget->setProperty(NULLABLE_PROPERTY, QVariant(true)); + widget->setProperty(GLOBAL_VALUE_PROPERTY, QVariant(globalValue)); + } + static std::optional getNullableStringValue(const QDoubleSpinBox* widget) + { + if (widget->property(IS_NULL_PROPERTY).toBool()) + return std::nullopt; + + return getStringValue(widget); + } static void setNullableStringValue(QDoubleSpinBox* widget, std::optional value) { - setStringValue(widget, value.value_or(QString())); + widget->setProperty(IS_NULL_PROPERTY, QVariant(!value.has_value())); + setStringValue(widget, value.has_value() ? value.value() : widget->property(GLOBAL_VALUE_PROPERTY).toString()); + updateNullState(widget, !value.has_value()); } template static void connectValueChanged(QDoubleSpinBox* widget, F func) { - widget->connect(widget, QOverload::of(&QDoubleSpinBox::valueChanged), func); + if (!isNullable(widget)) + { + widget->connect(widget, QOverload::of(&QDoubleSpinBox::valueChanged), func); + } + else + { + widget->setContextMenuPolicy(Qt::CustomContextMenu); + widget->connect(widget, &QDoubleSpinBox::customContextMenuRequested, widget, [widget, func](const QPoint& pt) { + QMenu menu(widget); + widget->connect(menu.addAction(qApp->translate("SettingWidgetBinder", "Reset")), &QAction::triggered, widget, + [widget, func = std::move(func)]() { + const bool old = widget->blockSignals(true); + setNullableFloatValue(widget, std::nullopt); + widget->blockSignals(old); + updateNullState(widget, true); + func(); + }); + menu.exec(widget->mapToGlobal(pt)); + }); + widget->connect(widget, QOverload::of(&QDoubleSpinBox::valueChanged), widget, [widget, func = std::move(func)]() { + if (widget->property(IS_NULL_PROPERTY).toBool()) + { + widget->setProperty(IS_NULL_PROPERTY, QVariant(false)); + updateNullState(widget, false); + } + func(); + }); + } } }; @@ -423,7 +612,8 @@ namespace SettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key)]() { const bool new_value = Accessor::getBoolValue(widget); - QtHost::SetBaseBoolSettingValue(section.c_str(), key.c_str(), new_value); + Host::SetBaseBoolSettingValue(section.c_str(), key.c_str(), new_value); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -463,7 +653,8 @@ namespace SettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key), option_offset]() { const int new_value = Accessor::getIntValue(widget); - QtHost::SetBaseIntSettingValue(section.c_str(), key.c_str(), new_value + option_offset); + Host::SetBaseIntSettingValue(section.c_str(), key.c_str(), new_value + option_offset); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -502,7 +693,8 @@ namespace SettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key)]() { const float new_value = Accessor::getFloatValue(widget); - QtHost::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value); + Host::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -542,7 +734,8 @@ namespace SettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key), range]() { const float new_value = (static_cast(Accessor::getIntValue(widget)) / range); - QtHost::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value); + Host::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -583,10 +776,11 @@ namespace SettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key)]() { const QString new_value = Accessor::getStringValue(widget); if (!new_value.isEmpty()) - QtHost::SetBaseStringSettingValue(section.c_str(), key.c_str(), new_value.toUtf8().constData()); + Host::SetBaseStringSettingValue(section.c_str(), key.c_str(), new_value.toUtf8().constData()); else - QtHost::RemoveBaseSettingValue(section.c_str(), key.c_str()); + Host::RemoveBaseSettingValue(section.c_str(), key.c_str()); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -645,7 +839,8 @@ namespace SettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key), to_string_function]() { const DataType value = static_cast(static_cast(Accessor::getIntValue(widget))); const char* string_value = to_string_function(value); - QtHost::SetBaseStringSettingValue(section.c_str(), key.c_str(), string_value); + Host::SetBaseStringSettingValue(section.c_str(), key.c_str(), string_value); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -706,7 +901,8 @@ namespace SettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key), enum_names]() { const UnderlyingType value = static_cast(Accessor::getIntValue(widget)); - QtHost::SetBaseStringSettingValue(section.c_str(), key.c_str(), enum_names[value]); + Host::SetBaseStringSettingValue(section.c_str(), key.c_str(), enum_names[value]); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -769,21 +965,23 @@ namespace SettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key), enum_values]() { const int value = Accessor::getIntValue(widget); - QtHost::SetBaseStringSettingValue(section.c_str(), key.c_str(), enum_values[value]); + Host::SetBaseStringSettingValue(section.c_str(), key.c_str(), enum_values[value]); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } } template - static void BindWidgetToFolderSetting(SettingsInterface* sif, WidgetType* widget, - QAbstractButton* browse_button, QAbstractButton* open_button, QAbstractButton* reset_button, - std::string section, std::string key, std::string default_value) + static void BindWidgetToFolderSetting(SettingsInterface* sif, WidgetType* widget, QAbstractButton* browse_button, QAbstractButton* open_button, + QAbstractButton* reset_button, std::string section, std::string key, std::string default_value) { using Accessor = SettingAccessor; std::string current_path(Host::GetBaseStringSettingValue(section.c_str(), key.c_str(), default_value.c_str())); - if (!Path::IsAbsolute(current_path)) + if (current_path.empty()) + current_path = default_value; + else if (!Path::IsAbsolute(current_path)) current_path = Path::Combine(EmuFolders::DataRoot, current_path); const QString value(QString::fromStdString(current_path)); @@ -805,13 +1003,14 @@ namespace SettingWidgetBinder if (!new_value.empty()) { std::string relative_path(Path::MakeRelative(new_value, EmuFolders::DataRoot)); - QtHost::SetBaseStringSettingValue(section.c_str(), key.c_str(), relative_path.c_str()); + Host::SetBaseStringSettingValue(section.c_str(), key.c_str(), relative_path.c_str()); } else { - QtHost::RemoveBaseSettingValue(section.c_str(), key.c_str()); + Host::RemoveBaseSettingValue(section.c_str(), key.c_str()); } + Host::CommitBaseSettingChanges(); g_emu_thread->updateEmuFolders(); }); @@ -836,9 +1035,8 @@ namespace SettingWidgetBinder } if (reset_button) { - QObject::connect(reset_button, &QAbstractButton::clicked, reset_button, [widget, default_value = std::move(default_value)]() { - Accessor::setStringValue(widget, QString::fromStdString(Path::Combine(EmuFolders::AppRoot, default_value))); - }); + QObject::connect(reset_button, &QAbstractButton::clicked, reset_button, + [widget, default_value = std::move(default_value)]() { Accessor::setStringValue(widget, QString::fromStdString(default_value)); }); } } } // namespace SettingWidgetBinder diff --git a/pcsx2-qt/Settings/AchievementLoginDialog.cpp b/pcsx2-qt/Settings/AchievementLoginDialog.cpp new file mode 100644 index 0000000000..c985d74b88 --- /dev/null +++ b/pcsx2-qt/Settings/AchievementLoginDialog.cpp @@ -0,0 +1,91 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" +#include "AchievementLoginDialog.h" +#include "pcsx2/Frontend/Achievements.h" +#include "QtHost.h" +#include + +AchievementLoginDialog::AchievementLoginDialog(QWidget* parent) + : QDialog(parent) +{ + m_ui.setupUi(this); + m_ui.loginIcon->setPixmap(QIcon::fromTheme("login-box-line").pixmap(32)); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + m_login = m_ui.buttonBox->addButton(tr("&Login"), QDialogButtonBox::AcceptRole); + m_login->setEnabled(false); + connectUi(); +} + +AchievementLoginDialog::~AchievementLoginDialog() = default; + +void AchievementLoginDialog::loginClicked() +{ + std::string username(m_ui.userName->text().toStdString()); + std::string password(m_ui.password->text().toStdString()); + + // TODO: Make cancellable. + m_ui.status->setText(tr("Logging in...")); + enableUI(false); + + Host::RunOnCPUThread([this, username = std::move(username), password = std::move(password)]() { + const bool result = Achievements::Login(username.c_str(), password.c_str()); + QMetaObject::invokeMethod(this, "processLoginResult", Qt::QueuedConnection, Q_ARG(bool, result)); + }); +} + +void AchievementLoginDialog::cancelClicked() +{ + done(1); +} + +void AchievementLoginDialog::processLoginResult(bool result) +{ + if (!result) + { + QMessageBox::critical(this, tr("Login Error"), + tr("Login failed. Please check your username and password, and try again.")); + m_ui.status->setText(tr("Login failed.")); + enableUI(true); + return; + } + + done(0); +} + +void AchievementLoginDialog::connectUi() +{ + connect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, &AchievementLoginDialog::loginClicked); + connect(m_ui.buttonBox, &QDialogButtonBox::rejected, this, &AchievementLoginDialog::cancelClicked); + + auto enableLoginButton = [this](const QString&) { m_login->setEnabled(canEnableLoginButton()); }; + connect(m_ui.userName, &QLineEdit::textChanged, enableLoginButton); + connect(m_ui.password, &QLineEdit::textChanged, enableLoginButton); +} + +void AchievementLoginDialog::enableUI(bool enabled) +{ + m_ui.userName->setEnabled(enabled); + m_ui.password->setEnabled(enabled); + m_ui.buttonBox->button(QDialogButtonBox::Cancel)->setEnabled(enabled); + m_login->setEnabled(enabled && canEnableLoginButton()); +} + +bool AchievementLoginDialog::canEnableLoginButton() const +{ + return !m_ui.userName->text().isEmpty() && !m_ui.password->text().isEmpty(); +} diff --git a/pcsx2-qt/Settings/AchievementLoginDialog.h b/pcsx2-qt/Settings/AchievementLoginDialog.h new file mode 100644 index 0000000000..835e057eb8 --- /dev/null +++ b/pcsx2-qt/Settings/AchievementLoginDialog.h @@ -0,0 +1,41 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "ui_AchievementLoginDialog.h" +#include +#include + +class AchievementLoginDialog : public QDialog +{ + Q_OBJECT + +public: + AchievementLoginDialog(QWidget* parent); + ~AchievementLoginDialog(); + +private Q_SLOTS: + void loginClicked(); + void cancelClicked(); + void processLoginResult(bool result); + +private: + void connectUi(); + void enableUI(bool enabled); + bool canEnableLoginButton() const; + + Ui::AchievementLoginDialog m_ui; + QPushButton* m_login; +}; diff --git a/pcsx2-qt/Settings/AchievementLoginDialog.ui b/pcsx2-qt/Settings/AchievementLoginDialog.ui new file mode 100644 index 0000000000..441c94aa4d --- /dev/null +++ b/pcsx2-qt/Settings/AchievementLoginDialog.ui @@ -0,0 +1,140 @@ + + + AchievementLoginDialog + + + Qt::WindowModal + + + + 0 + 0 + 410 + 190 + + + + + 410 + 190 + + + + + 410 + 190 + + + + RetroAchievements Login + + + true + + + + + + + + + + + :/icons/black/48/login-box-line.png + + + + + + + + 14 + false + + + + RetroAchievements Login + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + Please enter user name and password for retroachievements.org below. Your password will not be saved in PCSX2, an access token will be generated and used instead. + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + User Name: + + + + + + + + + + Password: + + + + + + + QLineEdit::Password + + + + + + + + + + + Ready... + + + + + + + QDialogButtonBox::Cancel + + + + + + + + + + + + diff --git a/pcsx2-qt/Settings/AchievementSettingsWidget.cpp b/pcsx2-qt/Settings/AchievementSettingsWidget.cpp new file mode 100644 index 0000000000..a13b566378 --- /dev/null +++ b/pcsx2-qt/Settings/AchievementSettingsWidget.cpp @@ -0,0 +1,200 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#include "AchievementSettingsWidget.h" +#include "AchievementLoginDialog.h" +#include "MainWindow.h" +#include "SettingsDialog.h" +#include "SettingWidgetBinder.h" +#include "QtUtils.h" + +#include "pcsx2/Frontend/Achievements.h" +#include "pcsx2/HostSettings.h" + +#include "common/StringUtil.h" + +#include +#include + +AchievementSettingsWidget::AchievementSettingsWidget(SettingsDialog* dialog, QWidget* parent) + : QWidget(parent) + , m_dialog(dialog) +{ + m_ui.setupUi(this); + + SettingsInterface* sif = dialog->getSettingsInterface(); + + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enable, "Achievements", "Enabled", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.richPresence, "Achievements", "RichPresence", true); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.challengeMode, "Achievements", "ChallengeMode", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.leaderboards, "Achievements", "Leaderboards", true); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.testMode, "Achievements", "TestMode", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.unofficialTestMode, "Achievements", + "UnofficialTestMode", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.soundEffects, "Achievements", + "SoundEffects", true); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.primedIndicators, "Achievements", + "PrimedIndicators", true); + + dialog->registerWidgetHelp(m_ui.enable, tr("Enable Achievements"), tr("Unchecked"), + tr("When enabled and logged in, PCSX2 will scan for achievements on game load.")); + dialog->registerWidgetHelp(m_ui.testMode, tr("Enable Test Mode"), tr("Unchecked"), + tr("When enabled, PCSX2 will assume all achievements are locked and not send any " + "unlock notifications to the server.")); + dialog->registerWidgetHelp( + m_ui.unofficialTestMode, tr("Test Unofficial Achievements"), tr("Unchecked"), + tr("When enabled, PCSX2 will list achievements from unofficial sets. Please note that these achievements are " + "not tracked by RetroAchievements, so they unlock every time.")); + dialog->registerWidgetHelp( + m_ui.richPresence, tr("Enable Rich Presence"), tr("Unchecked"), + tr("When enabled, rich presence information will be collected and sent to the server where supported.")); + dialog->registerWidgetHelp(m_ui.challengeMode, tr("Enable Hardcore Mode"), tr("Unchecked"), + tr("\"Challenge\" mode for achievements, including leaderboard tracking. Disables save state, cheats, and slowdown functions.")); + dialog->registerWidgetHelp(m_ui.leaderboards, tr("Enable Leaderboards"), tr("Checked"), + tr("Enables tracking and submission of leaderboards in supported games. If leaderboards are disabled, you will still " + "be able to view the leaderboard and scores, but no scores will be uploaded.")); + dialog->registerWidgetHelp( + m_ui.soundEffects, tr("Enable Sound Effects"), tr("Checked"), + tr("Plays sound effects for events such as achievement unlocks and leaderboard submissions.")); + dialog->registerWidgetHelp( + m_ui.primedIndicators, tr("Show Challenge Indicators"), tr("Checked"), + tr("Shows icons in the lower-right corner of the screen when a challenge/primed achievement is active.")); + + connect(m_ui.enable, &QCheckBox::stateChanged, this, &AchievementSettingsWidget::updateEnableState); + connect(m_ui.challengeMode, &QCheckBox::stateChanged, this, &AchievementSettingsWidget::updateEnableState); + connect(m_ui.challengeMode, &QCheckBox::stateChanged, this, &AchievementSettingsWidget::onChallengeModeStateChanged); + + if (!m_dialog->isPerGameSettings()) + { + connect(m_ui.loginButton, &QPushButton::clicked, this, &AchievementSettingsWidget::onLoginLogoutPressed); + connect(m_ui.viewProfile, &QPushButton::clicked, this, &AchievementSettingsWidget::onViewProfilePressed); + connect(g_emu_thread, &EmuThread::onAchievementsRefreshed, this, &AchievementSettingsWidget::onAchievementsRefreshed); + updateLoginState(); + + // force a refresh of game info + Host::RunOnCPUThread(Host::OnAchievementsRefreshed); + } + else + { + // remove login and game info, not relevant for per-game + m_ui.verticalLayout->removeWidget(m_ui.gameInfoBox); + m_ui.gameInfoBox->deleteLater(); + m_ui.gameInfoBox = nullptr; + m_ui.verticalLayout->removeWidget(m_ui.loginBox); + m_ui.loginBox->deleteLater(); + m_ui.loginBox = nullptr; + } + + updateEnableState(); +} + +AchievementSettingsWidget::~AchievementSettingsWidget() = default; + +void AchievementSettingsWidget::updateEnableState() +{ + const bool enabled = m_dialog->getEffectiveBoolValue("Achievements", "Enabled", false); + const bool challenge = m_dialog->getEffectiveBoolValue("Achievements", "ChallengeMode", false); + m_ui.testMode->setEnabled(enabled); + m_ui.unofficialTestMode->setEnabled(enabled); + m_ui.richPresence->setEnabled(enabled); + m_ui.challengeMode->setEnabled(enabled); + m_ui.leaderboards->setEnabled(enabled && challenge); + m_ui.soundEffects->setEnabled(enabled); + m_ui.primedIndicators->setEnabled(enabled); +} + +void AchievementSettingsWidget::onChallengeModeStateChanged() +{ + if (!QtHost::IsVMValid()) + return; + + const bool enabled = m_dialog->getEffectiveBoolValue("Achievements", "Enabled", false); + const bool challenge = m_dialog->getEffectiveBoolValue("Achievements", "ChallengeMode", false); + if (!enabled || !challenge) + return; + + // don't bother prompting if the game doesn't have achievements + auto lock = Achievements::GetLock(); + if (!Achievements::HasActiveGame()) + return; + + if (QMessageBox::question(QtUtils::GetRootWidget(this), tr("Reset System"), + tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?")) != QMessageBox::Yes) + { + return; + } + + g_emu_thread->resetVM(); +} + +void AchievementSettingsWidget::updateLoginState() +{ + const std::string username(Host::GetBaseStringSettingValue("Achievements", "Username")); + const bool logged_in = !username.empty(); + + if (logged_in) + { + const u64 login_unix_timestamp = StringUtil::FromChars(Host::GetBaseStringSettingValue("Achievements", "LoginTimestamp", "0")).value_or(0); + const QDateTime login_timestamp(QDateTime::fromSecsSinceEpoch(static_cast(login_unix_timestamp))); + m_ui.loginStatus->setText(tr("Username: %1\nLogin token generated on %2.") + .arg(QString::fromStdString(username)) + .arg(login_timestamp.toString(Qt::TextDate))); + m_ui.loginButton->setText(tr("Logout")); + } + else + { + m_ui.loginStatus->setText(tr("Not Logged In.")); + m_ui.loginButton->setText(tr("Login...")); + } + + m_ui.viewProfile->setEnabled(logged_in); +} + +void AchievementSettingsWidget::onLoginLogoutPressed() +{ + if (!Host::GetBaseStringSettingValue("Achievements", "Username").empty()) + { + Host::RunOnCPUThread(Achievements::Logout, true); + updateLoginState(); + return; + } + + AchievementLoginDialog login(this); + int res = login.exec(); + if (res != 0) + return; + + updateLoginState(); +} + +void AchievementSettingsWidget::onViewProfilePressed() +{ + const std::string username(Host::GetBaseStringSettingValue("Achievements", "Username")); + if (username.empty()) + return; + + const QByteArray encoded_username(QUrl::toPercentEncoding(QString::fromStdString(username))); + QtUtils::OpenURL( + QtUtils::GetRootWidget(this), + QUrl(QStringLiteral("https://retroachievements.org/user/%1").arg(QString::fromUtf8(encoded_username)))); +} + +void AchievementSettingsWidget::onAchievementsRefreshed(quint32 id, const QString& game_info_string, quint32 total, + quint32 points) +{ + m_ui.gameInfo->setText(game_info_string); +} diff --git a/pcsx2-qt/Settings/AchievementSettingsWidget.h b/pcsx2-qt/Settings/AchievementSettingsWidget.h new file mode 100644 index 0000000000..87ff075e84 --- /dev/null +++ b/pcsx2-qt/Settings/AchievementSettingsWidget.h @@ -0,0 +1,42 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include +#include "ui_AchievementSettingsWidget.h" + +class SettingsDialog; + +class AchievementSettingsWidget : public QWidget +{ + Q_OBJECT + +public: + explicit AchievementSettingsWidget(SettingsDialog* dialog, QWidget* parent); + ~AchievementSettingsWidget(); + +private Q_SLOTS: + void updateEnableState(); + void onChallengeModeStateChanged(); + void onLoginLogoutPressed(); + void onViewProfilePressed(); + void onAchievementsRefreshed(quint32 id, const QString& game_info_string, quint32 total, quint32 points); + +private: + void updateLoginState(); + + Ui::AchievementSettingsWidget m_ui; + SettingsDialog* m_dialog; +}; diff --git a/pcsx2-qt/Settings/AchievementSettingsWidget.ui b/pcsx2-qt/Settings/AchievementSettingsWidget.ui new file mode 100644 index 0000000000..a5b6e8ec8d --- /dev/null +++ b/pcsx2-qt/Settings/AchievementSettingsWidget.ui @@ -0,0 +1,188 @@ + + + AchievementSettingsWidget + + + + 0 + 0 + 648 + 470 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Global Settings + + + + + + Enable Leaderboards + + + + + + + Enable Achievements + + + + + + + Enable Rich Presence + + + + + + + Enable Hardcore Mode + + + + + + + Enable Sound Effects + + + + + + + Test Unofficial Achievements + + + + + + + Enable Test Mode + + + + + + + Show Challenge Indicators + + + + + + + + + + Account + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + Login... + + + + + + + View Profile... + + + + + + + + + + + + + 0 + 160 + + + + Game Info + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + + <html><head/><body><p align="justify">PCSX2 uses RetroAchievements as an achievement database and for tracking progress. To use achievements, please sign up for an account at <a href="https://retroachievements.org/"><span style=" text-decoration: underline; color:#4169e1;">retroachievements.org</span></a>.</p><p align="justify">To view the achievement list in-game, press the hotkey for <span style=" font-weight:600;">Open Pause Menu</span> and select <span style=" font-weight:600;">Achievements</span> from the menu.</p></body></html> + + + Qt::RichText + + + true + + + 8 + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + diff --git a/pcsx2-qt/Settings/AdvancedSystemSettingsWidget.cpp b/pcsx2-qt/Settings/AdvancedSettingsWidget.cpp similarity index 51% rename from pcsx2-qt/Settings/AdvancedSystemSettingsWidget.cpp rename to pcsx2-qt/Settings/AdvancedSettingsWidget.cpp index 59f93bcfba..8e8d33cce0 100644 --- a/pcsx2-qt/Settings/AdvancedSystemSettingsWidget.cpp +++ b/pcsx2-qt/Settings/AdvancedSettingsWidget.cpp @@ -18,14 +18,14 @@ #include #include -#include "AdvancedSystemSettingsWidget.h" -#include "EmuThread.h" +#include "AdvancedSettingsWidget.h" +#include "QtHost.h" #include "QtUtils.h" #include "SettingWidgetBinder.h" #include "SettingsDialog.h" -AdvancedSystemSettingsWidget::AdvancedSystemSettingsWidget(SettingsDialog* dialog, QWidget* parent) - : QWidget(parent) +AdvancedSettingsWidget::AdvancedSettingsWidget(SettingsDialog* dialog, QWidget* parent) + : QWidget(parent), m_dialog(dialog) { SettingsInterface* sif = dialog->getSettingsInterface(); @@ -35,11 +35,24 @@ AdvancedSystemSettingsWidget::AdvancedSystemSettingsWidget(SettingsDialog* dialo SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.eeCache, "EmuCore/CPU/Recompiler", "EnableEECache", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.eeINTCSpinDetection, "EmuCore/Speedhacks", "IntcStat", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.eeWaitLoopDetection, "EmuCore/Speedhacks", "WaitLoop", true); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.eeFastmem, "EmuCore/CPU/Recompiler", "EnableFastmem", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.vu0Recompiler, "EmuCore/CPU/Recompiler", "EnableVU0", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.vu1Recompiler, "EmuCore/CPU/Recompiler", "EnableVU1", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.vuFlagHack, "EmuCore/Speedhacks", "vuFlagHack", true); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.eeRoundingMode, "EmuCore/CPU", "FPU.Roundmode", 3); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.vuRoundingMode, "EmuCore/CPU", "VU.Roundmode", 3); + if (m_dialog->isPerGameSettings()) + { + m_ui.eeClampMode->insertItem(0, tr("Use Global Setting [%1]").arg(m_ui.eeClampMode->itemText(getGlobalClampingModeIndex(false)))); + m_ui.vuClampMode->insertItem(0, tr("Use Global Setting [%1]").arg(m_ui.vuClampMode->itemText(getGlobalClampingModeIndex(true)))); + } + m_ui.eeClampMode->setCurrentIndex(getClampingModeIndex(false)); + m_ui.vuClampMode->setCurrentIndex(getClampingModeIndex(true)); + connect(m_ui.eeClampMode, QOverload::of(&QComboBox::currentIndexChanged), [this](int index) { setClampingMode(false, index); }); + connect(m_ui.vuClampMode, QOverload::of(&QComboBox::currentIndexChanged), [this](int index) { setClampingMode(true, index); }); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.iopRecompiler, "EmuCore/CPU/Recompiler", "EnableIOP", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.gameFixes, "EmuCore", "EnableGameFixes", true); @@ -60,6 +73,9 @@ AdvancedSystemSettingsWidget::AdvancedSystemSettingsWidget(SettingsDialog* dialo dialog->registerWidgetHelp(m_ui.eeINTCSpinDetection, tr("INTC Spin Detection"), tr("Checked"), tr("Huge speedup for some games, with almost no compatibility side effects.")); + dialog->registerWidgetHelp(m_ui.eeFastmem, tr("Enable Fast Memory Access"), tr("Checked"), + tr("Uses backpatching to avoid register flushing on every memory access.")); + dialog->registerWidgetHelp(m_ui.vu0Recompiler, tr("Enable VU0 Recompiler"), tr("Checked"), tr("Enables VU0 Recompiler.")); @@ -79,4 +95,58 @@ AdvancedSystemSettingsWidget::AdvancedSystemSettingsWidget(SettingsDialog* dialo tr("Automatically loads and applies compatibility patches to known problematic games.")); } -AdvancedSystemSettingsWidget::~AdvancedSystemSettingsWidget() = default; +AdvancedSettingsWidget::~AdvancedSettingsWidget() = default; + +int AdvancedSettingsWidget::getGlobalClampingModeIndex(bool vu) const +{ + if (Host::GetBaseBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuSignOverflow" : "fpuFullMode", false)) + return 3; + + if (Host::GetBaseBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuExtraOverflow" : "fpuExtraOverflow", false)) + return 2; + + if (Host::GetBaseBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuOverflow" : "fpuOverflow", true)) + return 1; + + return 0; +} + +int AdvancedSettingsWidget::getClampingModeIndex(bool vu) const +{ + // This is so messy... maybe we should just make the mode an int in the settings too... + const bool base = m_dialog->isPerGameSettings() ? 1 : 0; + std::optional default_false = m_dialog->isPerGameSettings() ? std::nullopt : std::optional(false); + std::optional default_true = m_dialog->isPerGameSettings() ? std::nullopt : std::optional(true); + + std::optional third = m_dialog->getBoolValue("EmuCore/CPU/Recompiler", vu ? "vuSignOverflow" : "fpuFullMode", default_false); + std::optional second = m_dialog->getBoolValue("EmuCore/CPU/Recompiler", vu ? "vuExtraOverflow" : "fpuExtraOverflow", default_false); + std::optional first = m_dialog->getBoolValue("EmuCore/CPU/Recompiler", vu ? "vuOverflow" : "fpuOverflow", default_true); + + if (third.has_value() && third.value()) + return base + 3; + if (second.has_value() && second.value()) + return base + 2; + if (first.has_value() && first.value()) + return base + 1; + else if (first.has_value()) + return base + 0; // none + else + return 0; // no per game override +} + +void AdvancedSettingsWidget::setClampingMode(bool vu, int index) +{ + std::optional first, second, third; + + if (!m_dialog->isPerGameSettings() || index > 0) + { + const bool base = m_dialog->isPerGameSettings() ? 1 : 0; + third = (index >= (base + 3)); + second = (index >= (base + 2)); + first = (index >= (base + 1)); + } + + m_dialog->setBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuSignOverflow" : "fpuFullMode", third); + m_dialog->setBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuExtraOverflow" : "fpuExtraOverflow", second); + m_dialog->setBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuOverflow" : "fpuOverflow", first); +} diff --git a/pcsx2-qt/Settings/SystemSettingsWidget.h b/pcsx2-qt/Settings/AdvancedSettingsWidget.h similarity index 79% rename from pcsx2-qt/Settings/SystemSettingsWidget.h rename to pcsx2-qt/Settings/AdvancedSettingsWidget.h index 6b760b1b78..40e1115d22 100644 --- a/pcsx2-qt/Settings/SystemSettingsWidget.h +++ b/pcsx2-qt/Settings/AdvancedSettingsWidget.h @@ -17,20 +17,17 @@ #include -#include "ui_SystemSettingsWidget.h" +#include "ui_AdvancedSettingsWidget.h" class SettingsDialog; -class SystemSettingsWidget : public QWidget +class AdvancedSettingsWidget : public QWidget { Q_OBJECT public: - SystemSettingsWidget(SettingsDialog* dialog, QWidget* parent); - ~SystemSettingsWidget(); - -private Q_SLOTS: - void updateVU1InstantState(); + AdvancedSettingsWidget(SettingsDialog* dialog, QWidget* parent); + ~AdvancedSettingsWidget(); private: int getGlobalClampingModeIndex(bool vu) const; @@ -39,5 +36,5 @@ private: SettingsDialog* m_dialog; - Ui::SystemSettingsWidget m_ui; + Ui::AdvancedSystemSettingsWidget m_ui; }; diff --git a/pcsx2-qt/Settings/AdvancedSettingsWidget.ui b/pcsx2-qt/Settings/AdvancedSettingsWidget.ui new file mode 100644 index 0000000000..78113ece47 --- /dev/null +++ b/pcsx2-qt/Settings/AdvancedSettingsWidget.ui @@ -0,0 +1,374 @@ + + + AdvancedSystemSettingsWidget + + + + 0 + 0 + 628 + 375 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + + 0 + 0 + 609 + 569 + + + + + 0 + + + 0 + + + 0 + + + + + Changing these options may cause games to become non-functional. Modify at your own risk, the PCSX2 team will not provide support for configurations with these settings changed. + + + true + + + + + + + EmotionEngine (MIPS-IV) + + + + + + Rounding Mode: + + + + + + + + Nearest + + + + + Negative + + + + + Positive + + + + + Chop / Zero (Default) + + + + + + + + Clamping Mode: + + + + + + + + None + + + + + Normal (Default) + + + + + Extra + Preserve Sign + + + + + Full + + + + + + + + + + Wait Loop Detection + + + + + + + Enable Recompiler + + + + + + + Enable Fast Memory Access + + + + + + + Enable Cache (Slow) + + + + + + + INTC Spin Detection + + + + + + + + + + + + Vector Units (VU) + + + + + + + + Enable VU0 Recompiler (Micro Mode) + + + + + + + Enable VU1 Recompiler + + + + + + + mVU Flag Hack + + + + + + + + + Clamping Mode: + + + + + + + Rounding Mode: + + + + + + + + Nearest + + + + + Negative + + + + + Positive + + + + + Chop / Zero (Default) + + + + + + + + + None + + + + + Normal (Default) + + + + + Extra + + + + + Extra + Preserve Sign + + + + + + + + + + + I/O Processor (IOP, MIPS-I) + + + + + + Enable Recompiler + + + + + + + + + + Game Settings + + + + + + Enable Game Fixes + + + + + + + Enable Compatibility Patches + + + + + + + + + + Frame Rate Control + + + + + + hz + + + 0.010000000000000 + + + + + + + hz + + + 0.010000000000000 + + + + + + + PAL Frame Rate: + + + + + + + NTSC Frame Rate: + + + + + + + + + + Qt::Vertical + + + + 20 + 3 + + + + + + + + + + + + + + + diff --git a/pcsx2-qt/Settings/AdvancedSystemSettingsWidget.ui b/pcsx2-qt/Settings/AdvancedSystemSettingsWidget.ui deleted file mode 100644 index 665a3c6e47..0000000000 --- a/pcsx2-qt/Settings/AdvancedSystemSettingsWidget.ui +++ /dev/null @@ -1,197 +0,0 @@ - - - AdvancedSystemSettingsWidget - - - - 0 - 0 - 648 - 481 - - - - Form - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - EmotionEngine (MIPS-IV) - - - - - - Enable Recompiler - - - - - - - Wait Loop Detection - - - - - - - Enable Cache (Slow) - - - - - - - INTC Spin Detection - - - - - - - - - - Vector Units (VU) - - - - - - mVU Flag Hack - - - - - - - Enable VU0 Recompiler (Micro Mode) - - - - - - - Enable VU1 Recompiler - - - - - - - - - - I/O Processor (IOP, MIPS-I) - - - - - - Enable Recompiler - - - - - - - - - - Game Settings - - - - - - Enable Game Fixes - - - - - - - Enable Compatibility Patches - - - - - - - - - - Frame Rate Control - - - - - - hz - - - 0.010000000000000 - - - - - - - hz - - - 0.010000000000000 - - - - - - - PAL Frame Rate: - - - - - - - NTSC Frame Rate: - - - - - - - - - - Qt::Vertical - - - - 20 - 3 - - - - - - - - - - - diff --git a/pcsx2-qt/Settings/AudioSettingsWidget.cpp b/pcsx2-qt/Settings/AudioSettingsWidget.cpp index 2258c7d076..8edc308e46 100644 --- a/pcsx2-qt/Settings/AudioSettingsWidget.cpp +++ b/pcsx2-qt/Settings/AudioSettingsWidget.cpp @@ -18,8 +18,10 @@ #include #include +#include "pcsx2/SPU2/Global.h" + #include "AudioSettingsWidget.h" -#include "EmuThread.h" +#include "QtHost.h" #include "QtUtils.h" #include "SettingWidgetBinder.h" #include "SettingsDialog.h" @@ -27,6 +29,7 @@ static constexpr s32 DEFAULT_INTERPOLATION_MODE = 5; static constexpr s32 DEFAULT_SYNCHRONIZATION_MODE = 0; static constexpr s32 DEFAULT_EXPANSION_MODE = 0; +static constexpr s32 DEFAULT_DPL_DECODING_LEVEL = 0; static const char* DEFAULT_OUTPUT_MODULE = "cubeb"; static constexpr s32 DEFAULT_OUTPUT_LATENCY = 100; static constexpr s32 DEFAULT_VOLUME = 100; @@ -53,6 +56,7 @@ static const char* s_output_module_values[] = { AudioSettingsWidget::AudioSettingsWidget(SettingsDialog* dialog, QWidget* parent) : QWidget(parent) + , m_dialog(dialog) { SettingsInterface* sif = dialog->getSettingsInterface(); @@ -61,10 +65,16 @@ AudioSettingsWidget::AudioSettingsWidget(SettingsDialog* dialog, QWidget* parent SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.interpolation, "SPU2/Mixing", "Interpolation", DEFAULT_INTERPOLATION_MODE); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.syncMode, "SPU2/Output", "SynchMode", DEFAULT_SYNCHRONIZATION_MODE); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.expansionMode, "SPU2/Output", "SpeakerConfiguration", DEFAULT_EXPANSION_MODE); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.dplLevel, "SPU2/Output", "DplDecodingLevel", DEFAULT_DPL_DECODING_LEVEL); + connect(m_ui.expansionMode, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioSettingsWidget::expansionModeChanged); + expansionModeChanged(); SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.outputModule, "SPU2/Output", "OutputModule", s_output_module_entries, s_output_module_values, DEFAULT_OUTPUT_MODULE); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.latency, "SPU2/Output", "Latency", DEFAULT_OUTPUT_LATENCY); + connect(m_ui.outputModule, &QComboBox::currentIndexChanged, this, &AudioSettingsWidget::outputModuleChanged); + connect(m_ui.backend, &QComboBox::currentIndexChanged, this, &AudioSettingsWidget::outputBackendChanged); connect(m_ui.latency, &QSlider::valueChanged, this, &AudioSettingsWidget::updateLatencyLabel); + outputModuleChanged(); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.volume, "SPU2/Mixing", "FinalVolume", DEFAULT_VOLUME); connect(m_ui.volume, &QSlider::valueChanged, this, &AudioSettingsWidget::updateVolumeLabel); @@ -75,6 +85,10 @@ AudioSettingsWidget::AudioSettingsWidget(SettingsDialog* dialog, QWidget* parent connect(m_ui.seekWindowSize, &QSlider::valueChanged, this, &AudioSettingsWidget::updateTimestretchSeekwindowLengthLabel); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.overlap, "Soundtouch", "OverlapMS", DEFAULT_SOUNDTOUCH_OVERLAP); connect(m_ui.overlap, &QSlider::valueChanged, this, &AudioSettingsWidget::updateTimestretchOverlapLabel); + connect(m_ui.resetTimestretchDefaults, &QPushButton::clicked, this, &AudioSettingsWidget::resetTimestretchDefaults); + + m_ui.label_3b->setVisible(false); + m_ui.dplLevel->setVisible(false); updateVolumeLabel(); updateLatencyLabel(); @@ -85,6 +99,65 @@ AudioSettingsWidget::AudioSettingsWidget(SettingsDialog* dialog, QWidget* parent AudioSettingsWidget::~AudioSettingsWidget() = default; +void AudioSettingsWidget::expansionModeChanged() +{ + const bool expansion51 = m_dialog->getEffectiveIntValue("SPU2/Output", "SpeakerConfiguration", 0) == 2; + m_ui.dplLevel->setDisabled(!expansion51); +} + +void AudioSettingsWidget::outputModuleChanged() +{ + const std::string module_name(m_dialog->getEffectiveStringValue("SPU2/Output", "OutputModule", DEFAULT_OUTPUT_MODULE)); + const char* const* backend_names = GetOutputModuleBackends(module_name.c_str()); + + const std::string backend_name(m_dialog->getEffectiveStringValue("SPU2/Output", "BackendName", "")); + + QSignalBlocker sb(m_ui.backend); + m_ui.backend->clear(); + + if (m_dialog->isPerGameSettings()) + { + const QString global_backend(QString::fromStdString(Host::GetStringSettingValue("SPU2/Output", "BackendName", ""))); + m_ui.backend->addItem(tr("Use Global Setting [%1]").arg(global_backend.isEmpty() ? tr("Default") : global_backend)); + } + + m_ui.backend->setEnabled(backend_names != nullptr); + m_ui.backend->addItem(tr("(Default)")); + if (!backend_names || backend_name.empty()) + m_ui.backend->setCurrentIndex(0); + + if (backend_names) + { + for (u32 i = 0; backend_names[i] != nullptr; i++) + { + const int index = m_ui.backend->count(); + m_ui.backend->addItem(QString::fromUtf8(backend_names[i])); + if (backend_name == backend_names[i]) + m_ui.backend->setCurrentIndex(index); + } + } +} + +void AudioSettingsWidget::outputBackendChanged() +{ + int index = m_ui.backend->currentIndex(); + if (m_dialog->isPerGameSettings()) + { + if (index == 0) + { + m_dialog->setStringSettingValue("SPU2/Output", "BackendName", std::nullopt); + return; + } + + index--; + } + + if (index == 0) + m_dialog->setStringSettingValue("SPU2/Output", "BackendName", ""); + else + m_dialog->setStringSettingValue("SPU2/Output", "BackendName", m_ui.backend->currentText().toUtf8().constData()); +} + void AudioSettingsWidget::updateVolumeLabel() { m_ui.volumeLabel->setText(tr("%1%").arg(m_ui.volume->value())); diff --git a/pcsx2-qt/Settings/AudioSettingsWidget.h b/pcsx2-qt/Settings/AudioSettingsWidget.h index 0f96df8658..33038fd042 100644 --- a/pcsx2-qt/Settings/AudioSettingsWidget.h +++ b/pcsx2-qt/Settings/AudioSettingsWidget.h @@ -30,6 +30,9 @@ public: ~AudioSettingsWidget(); private Q_SLOTS: + void expansionModeChanged(); + void outputModuleChanged(); + void outputBackendChanged(); void updateVolumeLabel(); void updateLatencyLabel(); void updateTimestretchSequenceLengthLabel(); @@ -38,5 +41,6 @@ private Q_SLOTS: void resetTimestretchDefaults(); private: + SettingsDialog* m_dialog; Ui::AudioSettingsWidget m_ui; }; diff --git a/pcsx2-qt/Settings/AudioSettingsWidget.ui b/pcsx2-qt/Settings/AudioSettingsWidget.ui index 8033945e2a..67dfc5a5c4 100644 --- a/pcsx2-qt/Settings/AudioSettingsWidget.ui +++ b/pcsx2-qt/Settings/AudioSettingsWidget.ui @@ -7,7 +7,7 @@ 0 0 752 - 430 + 448 @@ -130,6 +130,32 @@ + + + + ProLogic Level: + + + + + + + + None (Default) + + + + + ProLogic Decoding (basic) + + + + + ProLogic II Decoding (gigaherz) + + + + @@ -147,16 +173,16 @@ - + - + Latency: - + @@ -189,6 +215,16 @@ + + + + Output Backend: + + + + + + @@ -325,7 +361,7 @@ - + 120 @@ -366,7 +402,7 @@ - 100 + 200 Qt::Vertical diff --git a/pcsx2-qt/Settings/BIOSSettingsWidget.cpp b/pcsx2-qt/Settings/BIOSSettingsWidget.cpp index 6dc7467c98..d4c2ccb5e5 100644 --- a/pcsx2-qt/Settings/BIOSSettingsWidget.cpp +++ b/pcsx2-qt/Settings/BIOSSettingsWidget.cpp @@ -36,14 +36,10 @@ BIOSSettingsWidget::BIOSSettingsWidget(SettingsDialog* dialog, QWidget* parent) m_ui.setupUi(this); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.fastBoot, "EmuCore", "EnableFastBoot", true); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.patchRegion, "EmuCore", "PatchBios", false); - SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.regionComboBox, "EmuCore", "PatchRegion", BiosZoneStrings, BiosZoneBytes, BiosZoneBytes[0]); SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.searchDirectory, m_ui.browseSearchDirectory, m_ui.openSearchDirectory, - m_ui.resetSearchDirectory, "Folders", "Bios", "bios"); + m_ui.resetSearchDirectory, "Folders", "Bios", Path::Combine(EmuFolders::DataRoot, "bios")); - dialog->registerWidgetHelp(m_ui.patchRegion, tr("Patch Region"), tr("Unchecked"), - tr("Patches the BIOS region byte in ROM. Not recommended unless you really know what you're doing.")); - dialog->registerWidgetHelp(m_ui.fastBoot, tr("Fast Boot"), tr("Unchecked"), + dialog->registerWidgetHelp(m_ui.fastBoot, tr("Fast Boot"), tr("Checked"), tr("Patches the BIOS to skip the console's boot animation.")); refreshList(); @@ -51,9 +47,6 @@ BIOSSettingsWidget::BIOSSettingsWidget(SettingsDialog* dialog, QWidget* parent) connect(m_ui.searchDirectory, &QLineEdit::textChanged, this, &BIOSSettingsWidget::refreshList); connect(m_ui.refresh, &QPushButton::clicked, this, &BIOSSettingsWidget::refreshList); connect(m_ui.fileList, &QTreeWidget::currentItemChanged, this, &BIOSSettingsWidget::listItemChanged); - - connect(m_ui.patchRegion, &QCheckBox::clicked, this, [&] { m_ui.regionComboBox->setEnabled(m_ui.patchRegion->isChecked()); }); - m_ui.regionComboBox->setEnabled(m_ui.patchRegion->isChecked()); } BIOSSettingsWidget::~BIOSSettingsWidget() @@ -92,29 +85,39 @@ void BIOSSettingsWidget::listRefreshed(const QVector& items) switch (bi.region) { - case 2: // Japan + case 0: // Japan item->setIcon(0, QIcon(QStringLiteral("%1/icons/flags/NTSC-J.png").arg(res_path))); break; - case 3: // USA + case 1: // USA item->setIcon(0, QIcon(QStringLiteral("%1/icons/flags/NTSC-U.png").arg(res_path))); break; - case 4: // Europe + case 2: // Europe item->setIcon(0, QIcon(QStringLiteral("%1/icons/flags/PAL-E.png").arg(res_path))); break; - case 7: // China - item->setIcon(0, QIcon(QStringLiteral("%1/icons//flags/NTSC-C.png").arg(res_path))); + case 3: // Oceania + item->setIcon(0, QIcon(QStringLiteral("%1/icons/flags/PAL-A.png").arg(res_path))); break; - case 5: // HK + case 4: // Asia item->setIcon(0, QIcon(QStringLiteral("%1/icons/flags/NTSC-HK.png").arg(res_path))); break; - case 6: // Free - case 0: // T10K - case 1: // Test + case 5: // Russia + item->setIcon(0, QIcon(QStringLiteral("%1/icons/flags/PAL-R.png").arg(res_path))); + break; + + case 6: // China + item->setIcon(0, QIcon(QStringLiteral("%1/icons/flags/NTSC-C.png").arg(res_path))); + break; + + case 7: // Mexico, flag is missing + + case 8: // T10K + case 9: // Test + case 10: // Free default: item->setIcon(0, QIcon(QStringLiteral("%1/icons/flags/NTSC-J.png").arg(res_path))); break; @@ -130,7 +133,10 @@ void BIOSSettingsWidget::listRefreshed(const QVector& items) void BIOSSettingsWidget::listItemChanged(const QTreeWidgetItem* current, const QTreeWidgetItem* previous) { - QtHost::SetBaseStringSettingValue("Filenames", "BIOS", current->text(0).toUtf8().constData()); + Host::SetBaseStringSettingValue("Filenames", "BIOS", current->text(0).toUtf8().constData()); + Host::CommitBaseSettingChanges(); + + g_emu_thread->applySettings(); } BIOSSettingsWidget::RefreshThread::RefreshThread(BIOSSettingsWidget* parent, const QString& directory) diff --git a/pcsx2-qt/Settings/BIOSSettingsWidget.h b/pcsx2-qt/Settings/BIOSSettingsWidget.h index 6e5be18884..0e7c2c2314 100644 --- a/pcsx2-qt/Settings/BIOSSettingsWidget.h +++ b/pcsx2-qt/Settings/BIOSSettingsWidget.h @@ -15,8 +15,9 @@ #pragma once #include -#include #include +#include +#include #include #include #include diff --git a/pcsx2-qt/Settings/BIOSSettingsWidget.ui b/pcsx2-qt/Settings/BIOSSettingsWidget.ui index 24abd272fc..8f9ca565e4 100644 --- a/pcsx2-qt/Settings/BIOSSettingsWidget.ui +++ b/pcsx2-qt/Settings/BIOSSettingsWidget.ui @@ -7,7 +7,7 @@ 0 0 618 - 439 + 408 @@ -134,41 +134,14 @@ Options and Patches - - - - - Patch Region - - - - + + Fast Boot - - - - false - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - diff --git a/pcsx2-qt/Settings/ControllerBindingWidget.ui b/pcsx2-qt/Settings/ControllerBindingWidget.ui index 327d289d3c..60f76d6f7d 100644 --- a/pcsx2-qt/Settings/ControllerBindingWidget.ui +++ b/pcsx2-qt/Settings/ControllerBindingWidget.ui @@ -7,13 +7,13 @@ 0 0 833 - 560 + 617 Form - + 0 @@ -31,9 +31,73 @@ Controller Type - + - + + + + + + + + Bindings + + + true + + + + .. + + + Qt::ToolButtonTextBesideIcon + + + true + + + + + + + Settings + + + + .. + + + true + + + Qt::ToolButtonTextBesideIcon + + + true + + + + + + + Macros + + + + .. + + + true + + + Qt::ToolButtonTextBesideIcon + + + true + + + + @@ -51,25 +115,31 @@ - + - Automatic binding + Automatic Mapping .. + + Qt::ToolButtonTextBesideIcon + - + - Clear Bindings + Clear Mapping .. + + Qt::ToolButtonTextBesideIcon + @@ -77,6 +147,9 @@ + + + diff --git a/pcsx2-qt/Settings/ControllerBindingWidget_DualShock2.ui b/pcsx2-qt/Settings/ControllerBindingWidget_DualShock2.ui index 030e17d480..1bd37f0553 100644 --- a/pcsx2-qt/Settings/ControllerBindingWidget_DualShock2.ui +++ b/pcsx2-qt/Settings/ControllerBindingWidget_DualShock2.ui @@ -415,25 +415,6 @@ - - - - - 80 - 0 - - - - x - - - 3.000000000000000 - - - 0.100000000000000 - - - @@ -488,74 +469,6 @@ - - - - Select - - - - 6 - - - 6 - - - 6 - - - 6 - - - - - - 100 - 16777215 - - - - PushButton - - - - - - - - - - Start - - - - 6 - - - 6 - - - 6 - - - 6 - - - - - - 100 - 16777215 - - - - PushButton - - - - - - @@ -624,62 +537,6 @@ - - - - Pressure Modifier - - - - - - - 80 - 0 - - - - x - - - 1.000000000000000 - - - 0.010000000000000 - - - 0.500000000000000 - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - - 16777215 - 16777215 - - - - PushButton - - - - - - @@ -714,6 +571,74 @@ + + + + Start + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + 100 + 16777215 + + + + PushButton + + + + + + + + + + Select + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + 100 + 16777215 + + + + PushButton + + + + + + @@ -1093,19 +1018,6 @@ - - - - x - - - 3.000000000000000 - - - 0.100000000000000 - - - @@ -1181,6 +1093,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -1221,19 +1146,6 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - @@ -1274,59 +1186,41 @@ - - + + - Analog Sensitivity + Pressure Modifier - - - - - 200 + + + + + + 0 + 0 + - - Qt::Horizontal + + + 100 + 0 + + + + + 16777215 + 16777215 + - - - - - 100% + PushButton - - - - Analog Deadzone - - - - - - 100 - - - Qt::Horizontal - - - - - - - 0% - - - - - - - + Analog @@ -1366,7 +1260,6 @@ - diff --git a/pcsx2-qt/Settings/ControllerBindingWidgets.cpp b/pcsx2-qt/Settings/ControllerBindingWidgets.cpp index 2df94d01db..8a939b41e1 100644 --- a/pcsx2-qt/Settings/ControllerBindingWidgets.cpp +++ b/pcsx2-qt/Settings/ControllerBindingWidgets.cpp @@ -15,6 +15,7 @@ #include "PrecompiledHeader.h" +#include #include #include #include @@ -23,7 +24,7 @@ #include "Settings/ControllerSettingsDialog.h" #include "Settings/ControllerSettingWidgetBinder.h" #include "Settings/SettingsDialog.h" -#include "EmuThread.h" +#include "QtHost.h" #include "QtUtils.h" #include "SettingWidgetBinder.h" @@ -45,15 +46,18 @@ ControllerBindingWidget::ControllerBindingWidget(QWidget* parent, ControllerSett m_ui.controllerType, m_config_section, "Type", PAD::GetDefaultPadType(port)); connect(m_ui.controllerType, QOverload::of(&QComboBox::currentIndexChanged), this, &ControllerBindingWidget::onTypeChanged); - connect(m_ui.automaticBinding, &QPushButton::clicked, this, &ControllerBindingWidget::doAutomaticBinding); - connect(m_ui.clearBindings, &QPushButton::clicked, this, &ControllerBindingWidget::doClearBindings); + connect(m_ui.bindings, &QPushButton::clicked, this, &ControllerBindingWidget::onBindingsClicked); + connect(m_ui.settings, &QPushButton::clicked, this, &ControllerBindingWidget::onSettingsClicked); + connect(m_ui.macros, &QPushButton::clicked, this, &ControllerBindingWidget::onMacrosClicked); + connect(m_ui.automaticBinding, &QPushButton::clicked, this, &ControllerBindingWidget::onAutomaticBindingClicked); + connect(m_ui.clearBindings, &QPushButton::clicked, this, &ControllerBindingWidget::onClearBindingsClicked); } ControllerBindingWidget::~ControllerBindingWidget() = default; QIcon ControllerBindingWidget::getIcon() const { - return m_current_widget->getIcon(); + return m_bindings_widget->getIcon(); } void ControllerBindingWidget::populateControllerTypes() @@ -64,36 +68,101 @@ void ControllerBindingWidget::populateControllerTypes() void ControllerBindingWidget::onTypeChanged() { - const bool is_initializing = (m_current_widget == nullptr); + const bool is_initializing = (m_ui.stackedWidget->count() == 0); m_controller_type = m_dialog->getStringValue(m_config_section.c_str(), "Type", PAD::GetDefaultPadType(m_port_number)); - if (!is_initializing) + if (m_bindings_widget) { - m_ui.verticalLayout->removeWidget(m_current_widget); - delete m_current_widget; - m_current_widget = nullptr; + m_ui.stackedWidget->removeWidget(m_bindings_widget); + delete m_bindings_widget; + m_bindings_widget = nullptr; + } + if (m_settings_widget) + { + m_ui.stackedWidget->removeWidget(m_settings_widget); + delete m_settings_widget; + m_settings_widget = nullptr; + } + if (m_macros_widget) + { + m_ui.stackedWidget->removeWidget(m_macros_widget); + delete m_macros_widget; + m_macros_widget = nullptr; } - const int index = m_ui.controllerType->findData(QString::fromStdString(m_controller_type)); - if (index >= 0 && index != m_ui.controllerType->currentIndex()) - { - QSignalBlocker sb(m_ui.controllerType); - m_ui.controllerType->setCurrentIndex(index); - } + const PAD::ControllerInfo* cinfo = PAD::GetControllerInfo(m_controller_type); + const bool has_settings = (cinfo && cinfo->num_settings > 0); + const bool has_macros = (cinfo && cinfo->num_bindings > 0); + m_ui.settings->setEnabled(has_settings); + m_ui.macros->setEnabled(has_macros); if (m_controller_type == "DualShock2") - m_current_widget = ControllerBindingWidget_DualShock2::createInstance(this); + m_bindings_widget = ControllerBindingWidget_DualShock2::createInstance(this); else - m_current_widget = new ControllerBindingWidget_Base(this); + m_bindings_widget = new ControllerBindingWidget_Base(this); - m_ui.verticalLayout->addWidget(m_current_widget, 1); + m_ui.stackedWidget->addWidget(m_bindings_widget); + m_ui.stackedWidget->setCurrentWidget(m_bindings_widget); + + if (has_settings) + { + m_settings_widget = new ControllerCustomSettingsWidget(this, m_ui.stackedWidget); + m_ui.stackedWidget->addWidget(m_settings_widget); + } + + if (has_macros) + { + m_macros_widget = new ControllerMacroWidget(this); + m_ui.stackedWidget->addWidget(m_macros_widget); + } + + updateHeaderToolButtons(); // no need to do this on first init, only changes if (!is_initializing) m_dialog->updateListDescription(m_port_number, this); } -void ControllerBindingWidget::doAutomaticBinding() +void ControllerBindingWidget::updateHeaderToolButtons() +{ + const QWidget* current_widget = m_ui.stackedWidget->currentWidget(); + const QSignalBlocker bindings_sb(m_ui.bindings); + const QSignalBlocker settings_sb(m_ui.settings); + const QSignalBlocker macros_sb(m_ui.macros); + + const bool is_bindings = (current_widget == m_bindings_widget); + m_ui.bindings->setChecked(is_bindings); + m_ui.automaticBinding->setEnabled(is_bindings); + m_ui.clearBindings->setEnabled(is_bindings); + m_ui.macros->setChecked(current_widget == m_macros_widget); + m_ui.settings->setChecked((current_widget == m_settings_widget)); +} + +void ControllerBindingWidget::onBindingsClicked() +{ + m_ui.stackedWidget->setCurrentWidget(m_bindings_widget); + updateHeaderToolButtons(); +} + +void ControllerBindingWidget::onSettingsClicked() +{ + if (!m_settings_widget) + return; + + m_ui.stackedWidget->setCurrentWidget(m_settings_widget); + updateHeaderToolButtons(); +} + +void ControllerBindingWidget::onMacrosClicked() +{ + if (!m_macros_widget) + return; + + m_ui.stackedWidget->setCurrentWidget(m_macros_widget); + updateHeaderToolButtons(); +} + +void ControllerBindingWidget::onAutomaticBindingClicked() { QMenu menu(this); bool added = false; @@ -118,7 +187,7 @@ void ControllerBindingWidget::doAutomaticBinding() menu.exec(QCursor::pos()); } -void ControllerBindingWidget::doClearBindings() +void ControllerBindingWidget::onClearBindingsClicked() { if (QMessageBox::question(QtUtils::GetRootWidget(this), tr("Clear Bindings"), tr("Are you sure you want to clear all bindings for this controller? This action cannot be undone.")) != QMessageBox::Yes) @@ -128,15 +197,21 @@ void ControllerBindingWidget::doClearBindings() if (m_dialog->isEditingGlobalSettings()) { - auto lock = Host::GetSettingsLock(); - PAD::ClearPortBindings(*Host::Internal::GetBaseSettingsLayer(), m_port_number); + { + auto lock = Host::GetSettingsLock(); + PAD::ClearPortBindings(*Host::Internal::GetBaseSettingsLayer(), m_port_number); + } + Host::CommitBaseSettingChanges(); } else { PAD::ClearPortBindings(*m_dialog->getProfileSettingsInterface(), m_port_number); + m_dialog->getProfileSettingsInterface()->Save(); } - saveAndRefresh(); + // force a refresh after clearing + g_emu_thread->applySettings(); + onTypeChanged(); } void ControllerBindingWidget::doDeviceAutomaticBinding(const QString& device) @@ -145,35 +220,440 @@ void ControllerBindingWidget::doDeviceAutomaticBinding(const QString& device) if (mapping.empty()) { QMessageBox::critical(QtUtils::GetRootWidget(this), tr("Automatic Binding"), - tr("No generic bindings were generated for device '%1'").arg(device)); + tr("No generic bindings were generated for device '%1'. The controller/source may not support automatic mapping.").arg(device)); return; } bool result; if (m_dialog->isEditingGlobalSettings()) { - auto lock = Host::GetSettingsLock(); - result = PAD::MapController(*Host::Internal::GetBaseSettingsLayer(), m_port_number, mapping); + { + auto lock = Host::GetSettingsLock(); + result = PAD::MapController(*Host::Internal::GetBaseSettingsLayer(), m_port_number, mapping); + } + if (result) + Host::CommitBaseSettingChanges(); } else { result = PAD::MapController(*m_dialog->getProfileSettingsInterface(), m_port_number, mapping); - m_dialog->getProfileSettingsInterface()->Save(); - g_emu_thread->reloadInputBindings(); + if (result) + { + m_dialog->getProfileSettingsInterface()->Save(); + g_emu_thread->reloadInputBindings(); + } } // force a refresh after mapping if (result) - saveAndRefresh(); + { + g_emu_thread->applySettings(); + onTypeChanged(); + } } -void ControllerBindingWidget::saveAndRefresh() +////////////////////////////////////////////////////////////////////////// + +ControllerMacroWidget::ControllerMacroWidget(ControllerBindingWidget* parent) + : QWidget(parent) { - onTypeChanged(); - QtHost::QueueSettingsSave(); - g_emu_thread->applySettings(); + m_ui.setupUi(this); + setWindowTitle(tr("Controller Port %1 Macros").arg(parent->getPortNumber() + 1u)); + createWidgets(parent); } +ControllerMacroWidget::~ControllerMacroWidget() = default; + +void ControllerMacroWidget::updateListItem(u32 index) +{ + m_ui.portList->item(static_cast(index)) + ->setText(tr("Macro %1\n%2").arg(index + 1).arg(m_macros[index]->getSummary())); +} + +void ControllerMacroWidget::createWidgets(ControllerBindingWidget* parent) +{ + for (u32 i = 0; i < NUM_MACROS; i++) + { + m_macros[i] = new ControllerMacroEditWidget(this, parent, i); + m_ui.container->addWidget(m_macros[i]); + + QListWidgetItem* item = new QListWidgetItem(); + item->setIcon(QIcon::fromTheme(QStringLiteral("flashlight-line"))); + m_ui.portList->addItem(item); + updateListItem(i); + } + + m_ui.portList->setCurrentRow(0); + m_ui.container->setCurrentIndex(0); + + connect(m_ui.portList, &QListWidget::currentRowChanged, m_ui.container, &QStackedWidget::setCurrentIndex); +} + +////////////////////////////////////////////////////////////////////////// + +ControllerMacroEditWidget::ControllerMacroEditWidget(ControllerMacroWidget* parent, ControllerBindingWidget* bwidget, + u32 index) + : QWidget(parent) + , m_parent(parent) + , m_bwidget(bwidget) + , m_index(index) +{ + m_ui.setupUi(this); + + ControllerSettingsDialog* dialog = m_bwidget->getDialog(); + const std::string& section = m_bwidget->getConfigSection(); + const PAD::ControllerInfo* cinfo = PAD::GetControllerInfo(m_bwidget->getControllerType()); + if (!cinfo) + { + // Shouldn't ever happen. + return; + } + + // load binds (single string joined by &) + const std::string binds_string( + dialog->getStringValue(section.c_str(), fmt::format("Macro{}Binds", index + 1u).c_str(), "")); + const std::vector buttons_split(StringUtil::SplitString(binds_string, '&', true)); + + for (const std::string_view& button : buttons_split) + { + for (u32 i = 0; i < cinfo->num_bindings; i++) + { + if (button == cinfo->bindings[i].name) + { + m_binds.push_back(&cinfo->bindings[i]); + break; + } + } + } + + // populate list view + for (u32 i = 0; i < cinfo->num_bindings; i++) + { + const PAD::ControllerBindingInfo& bi = cinfo->bindings[i]; + if (bi.type == PAD::ControllerBindingType::Motor) + continue; + + QListWidgetItem* item = new QListWidgetItem(); + item->setText(QString::fromUtf8(bi.display_name)); + item->setCheckState((std::find(m_binds.begin(), m_binds.end(), &bi) != m_binds.end()) ? Qt::Checked : + Qt::Unchecked); + m_ui.bindList->addItem(item); + } + + m_frequency = dialog->getIntValue(section.c_str(), fmt::format("Macro{}Frequency", index + 1u).c_str(), 0); + updateFrequencyText(); + + m_ui.trigger->initialize(dialog->getProfileSettingsInterface(), section, fmt::format("Macro{}", index + 1u)); + + connect(m_ui.increaseFrequency, &QAbstractButton::clicked, this, [this]() { modFrequency(1); }); + connect(m_ui.decreateFrequency, &QAbstractButton::clicked, this, [this]() { modFrequency(-1); }); + connect(m_ui.setFrequency, &QAbstractButton::clicked, this, &ControllerMacroEditWidget::onSetFrequencyClicked); + connect(m_ui.bindList, &QListWidget::itemChanged, this, &ControllerMacroEditWidget::updateBinds); +} + +ControllerMacroEditWidget::~ControllerMacroEditWidget() = default; + +QString ControllerMacroEditWidget::getSummary() const +{ + QString str; + for (const PAD::ControllerBindingInfo* bi : m_binds) + { + if (!str.isEmpty()) + str += static_cast('/'); + str += QString::fromUtf8(bi->name); + } + return str.isEmpty() ? tr("Not Configured") : str; +} + +void ControllerMacroEditWidget::onSetFrequencyClicked() +{ + bool okay; + int new_freq = QInputDialog::getInt(this, tr("Set Frequency"), tr("Frequency: "), static_cast(m_frequency), 0, + std::numeric_limits::max(), 1, &okay); + if (!okay) + return; + + m_frequency = static_cast(new_freq); + updateFrequency(); +} + +void ControllerMacroEditWidget::modFrequency(s32 delta) +{ + if (delta < 0 && m_frequency == 0) + return; + + m_frequency = static_cast(static_cast(m_frequency) + delta); + updateFrequency(); +} + +void ControllerMacroEditWidget::updateFrequency() +{ + m_bwidget->getDialog()->setIntValue(m_bwidget->getConfigSection().c_str(), + fmt::format("Macro{}Frequency", m_index + 1u).c_str(), + static_cast(m_frequency)); + updateFrequencyText(); +} + +void ControllerMacroEditWidget::updateFrequencyText() +{ + if (m_frequency == 0) + m_ui.frequencyText->setText(tr("Macro will not repeat.")); + else + m_ui.frequencyText->setText(tr("Macro will toggle buttons every %1 frames.").arg(m_frequency)); +} + +void ControllerMacroEditWidget::updateBinds() +{ + ControllerSettingsDialog* dialog = m_bwidget->getDialog(); + const PAD::ControllerInfo* cinfo = PAD::GetControllerInfo(m_bwidget->getControllerType()); + if (!cinfo) + return; + + std::vector new_binds; + for (u32 i = 0, bind_index = 0; i < cinfo->num_bindings; i++) + { + const PAD::ControllerBindingInfo& bi = cinfo->bindings[i]; + if (bi.type == PAD::ControllerBindingType::Motor) + continue; + + const QListWidgetItem* item = m_ui.bindList->item(static_cast(bind_index)); + bind_index++; + + if (!item) + { + // shouldn't happen + continue; + } + + if (item->checkState() == Qt::Checked) + new_binds.push_back(&bi); + } + if (m_binds == new_binds) + return; + + m_binds = std::move(new_binds); + + std::string binds_string; + for (const PAD::ControllerBindingInfo* bi : m_binds) + { + if (!binds_string.empty()) + binds_string.append(" & "); + binds_string.append(bi->name); + } + + const std::string& section = m_bwidget->getConfigSection(); + const std::string key(fmt::format("Macro{}Binds", m_index + 1u)); + if (binds_string.empty()) + dialog->clearSettingValue(section.c_str(), key.c_str()); + else + dialog->setStringValue(section.c_str(), key.c_str(), binds_string.c_str()); + + m_parent->updateListItem(m_index); +} + +////////////////////////////////////////////////////////////////////////// + +ControllerCustomSettingsWidget::ControllerCustomSettingsWidget(ControllerBindingWidget* parent, QWidget* parent_widget) + : QWidget(parent_widget) + , m_parent(parent) +{ + const PAD::ControllerInfo* cinfo = PAD::GetControllerInfo(parent->getControllerType()); + if (!cinfo || cinfo->num_settings == 0) + return; + + QGroupBox* gbox = new QGroupBox(tr("%1 Settings").arg(qApp->translate("PAD", cinfo->display_name)), this); + QGridLayout* gbox_layout = new QGridLayout(gbox); + createSettingWidgets(parent, gbox, gbox_layout, cinfo); + + QVBoxLayout* layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(gbox); + + QHBoxLayout* bottom_hlayout = new QHBoxLayout(); + QPushButton* restore_defaults = new QPushButton(tr("Restore Default Settings"), this); + restore_defaults->setIcon(QIcon::fromTheme(QStringLiteral("restart-line"))); + connect(restore_defaults, &QPushButton::clicked, this, &ControllerCustomSettingsWidget::restoreDefaults); + bottom_hlayout->addStretch(1); + bottom_hlayout->addWidget(restore_defaults); + layout->addLayout(bottom_hlayout); + layout->addStretch(1); +} + +ControllerCustomSettingsWidget::~ControllerCustomSettingsWidget() = default; + +void ControllerCustomSettingsWidget::createSettingWidgets(ControllerBindingWidget* parent, QWidget* widget_parent, + QGridLayout* layout, const PAD::ControllerInfo* cinfo) +{ + const std::string& section = parent->getConfigSection(); + SettingsInterface* sif = parent->getDialog()->getProfileSettingsInterface(); + int current_row = 0; + + for (u32 i = 0; i < cinfo->num_settings; i++) + { + const PAD::ControllerSettingInfo& si = cinfo->settings[i]; + std::string key_name = si.name; + + switch (si.type) + { + case PAD::ControllerSettingInfo::Type::Boolean: + { + QCheckBox* cb = new QCheckBox(qApp->translate(cinfo->name, si.display_name), widget_parent); + cb->setObjectName(QString::fromUtf8(si.name)); + ControllerSettingWidgetBinder::BindWidgetToInputProfileBool(sif, cb, section, std::move(key_name), + si.BooleanDefaultValue()); + layout->addWidget(cb, current_row, 0, 1, 4); + current_row++; + } + break; + + case PAD::ControllerSettingInfo::Type::Integer: + { + QSpinBox* sb = new QSpinBox(widget_parent); + sb->setObjectName(QString::fromUtf8(si.name)); + sb->setMinimum(si.IntegerMinValue()); + sb->setMaximum(si.IntegerMaxValue()); + sb->setSingleStep(si.IntegerStepValue()); + SettingWidgetBinder::BindWidgetToIntSetting(sif, sb, section, std::move(key_name), si.IntegerDefaultValue()); + layout->addWidget(new QLabel(qApp->translate(cinfo->name, si.display_name), widget_parent), current_row, 0); + layout->addWidget(sb, current_row, 1, 1, 3); + current_row++; + } + break; + + case PAD::ControllerSettingInfo::Type::IntegerList: + { + QComboBox* cb = new QComboBox(widget_parent); + cb->setObjectName(QString::fromUtf8(si.name)); + for (u32 i = 0; si.options[i] != nullptr; i++) + cb->addItem(qApp->translate(cinfo->name, si.options[i])); + SettingWidgetBinder::BindWidgetToIntSetting(sif, cb, section, std::move(key_name), si.IntegerDefaultValue(), si.IntegerMinValue()); + layout->addWidget(new QLabel(qApp->translate(cinfo->name, si.display_name), widget_parent), current_row, 0); + layout->addWidget(cb, current_row, 1, 1, 3); + current_row++; + } + break; + + case PAD::ControllerSettingInfo::Type::Float: + { + QDoubleSpinBox* sb = new QDoubleSpinBox(widget_parent); + sb->setObjectName(QString::fromUtf8(si.name)); + sb->setMinimum(si.FloatMinValue()); + sb->setMaximum(si.FloatMaxValue()); + sb->setSingleStep(si.FloatStepValue()); + SettingWidgetBinder::BindWidgetToFloatSetting(sif, sb, section, std::move(key_name), si.FloatDefaultValue()); + layout->addWidget(new QLabel(qApp->translate(cinfo->name, si.display_name), widget_parent), current_row, 0); + layout->addWidget(sb, current_row, 1, 1, 3); + current_row++; + } + break; + + case PAD::ControllerSettingInfo::Type::String: + { + QLineEdit* le = new QLineEdit(widget_parent); + le->setObjectName(QString::fromUtf8(si.name)); + SettingWidgetBinder::BindWidgetToStringSetting(sif, le, section, std::move(key_name), si.StringDefaultValue()); + layout->addWidget(new QLabel(qApp->translate(cinfo->name, si.display_name), widget_parent), current_row, 0); + layout->addWidget(le, current_row, 1, 1, 3); + current_row++; + } + break; + + case PAD::ControllerSettingInfo::Type::Path: + { + QLineEdit* le = new QLineEdit(widget_parent); + le->setObjectName(QString::fromUtf8(si.name)); + QPushButton* browse_button = new QPushButton(tr("Browse..."), widget_parent); + SettingWidgetBinder::BindWidgetToStringSetting(sif, le, section, std::move(key_name), si.StringDefaultValue()); + connect(browse_button, &QPushButton::clicked, [this, le]() { + QString path = QFileDialog::getOpenFileName(this, tr("Select File")); + if (!path.isEmpty()) + le->setText(path); + }); + + QHBoxLayout* hbox = new QHBoxLayout(); + hbox->addWidget(le, 1); + hbox->addWidget(browse_button); + + layout->addWidget(new QLabel(qApp->translate(cinfo->name, si.display_name), widget_parent), current_row, 0); + layout->addLayout(hbox, current_row, 1, 1, 3); + current_row++; + } + break; + } + + QLabel* label = new QLabel(si.description ? qApp->translate(cinfo->name, si.description) : QString(), widget_parent); + label->setWordWrap(true); + layout->addWidget(label, current_row++, 0, 1, 4); + + layout->addItem(new QSpacerItem(1, 10, QSizePolicy::Minimum, QSizePolicy::Fixed), current_row++, 0, 1, 4); + } +} + +void ControllerCustomSettingsWidget::restoreDefaults() +{ + const PAD::ControllerInfo* cinfo = PAD::GetControllerInfo(m_parent->getControllerType()); + if (!cinfo || cinfo->num_settings == 0) + return; + + for (u32 i = 0; i < cinfo->num_settings; i++) + { + const PAD::ControllerSettingInfo& si = cinfo->settings[i]; + const QString key(QString::fromStdString(si.name)); + + switch (si.type) + { + case PAD::ControllerSettingInfo::Type::Boolean: + { + QCheckBox* widget = findChild(QString::fromStdString(si.name)); + if (widget) + widget->setChecked(si.BooleanDefaultValue()); + } + break; + + case PAD::ControllerSettingInfo::Type::Integer: + { + QSpinBox* widget = findChild(QString::fromStdString(si.name)); + if (widget) + widget->setValue(si.IntegerDefaultValue()); + } + break; + + case PAD::ControllerSettingInfo::Type::IntegerList: + { + QComboBox* widget = findChild(QString::fromStdString(si.name)); + if (widget) + widget->setCurrentIndex(si.IntegerDefaultValue() - si.IntegerMinValue()); + } + break; + + case PAD::ControllerSettingInfo::Type::Float: + { + QDoubleSpinBox* widget = findChild(QString::fromStdString(si.name)); + if (widget) + widget->setValue(si.FloatDefaultValue()); + } + break; + + case PAD::ControllerSettingInfo::Type::String: + { + QLineEdit* widget = findChild(QString::fromStdString(si.name)); + if (widget) + widget->setText(QString::fromUtf8(si.StringDefaultValue())); + } + break; + + case PAD::ControllerSettingInfo::Type::Path: + { + QLineEdit* widget = findChild(QString::fromStdString(si.name)); + if (widget) + widget->setText(QString::fromUtf8(si.StringDefaultValue())); + } + break; + } + } +} + + ////////////////////////////////////////////////////////////////////////// ControllerBindingWidget_Base::ControllerBindingWidget_Base(ControllerBindingWidget* parent) @@ -237,44 +717,6 @@ void ControllerBindingWidget_Base::initBindingWidgets() default: break; } - - if (QSlider* widget = findChild(QStringLiteral("Deadzone")); widget) - { - const float range = static_cast(widget->maximum()); - QLabel* label = findChild(QStringLiteral("DeadzoneLabel")); - if (label) - { - connect(widget, &QSlider::valueChanged, this, [range, label](int value) { - label->setText(tr("%1%").arg((static_cast(value) / range) * 100.0f, 0, 'f', 0)); - }); - } - - ControllerSettingWidgetBinder::BindWidgetToInputProfileNormalized(sif, widget, config_section, "Deadzone", range, - PAD::DEFAULT_STICK_DEADZONE); - } - - if (QSlider* widget = findChild(QStringLiteral("AxisScale")); widget) - { - // position 1.0f at the halfway point - const float range = static_cast(widget->maximum()) * 0.5f; - QLabel* label = findChild(QStringLiteral("AxisScaleLabel")); - if (label) - { - connect(widget, &QSlider::valueChanged, this, [range, label](int value) { - label->setText(tr("%1%").arg((static_cast(value) / range) * 100.0f, 0, 'f', 0)); - }); - } - - ControllerSettingWidgetBinder::BindWidgetToInputProfileNormalized(sif, widget, config_section, "AxisScale", range, - PAD::DEFAULT_STICK_SCALE); - } - - if (QDoubleSpinBox* widget = findChild(QStringLiteral("SmallMotorScale")); widget) - ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat(sif, widget, config_section, "SmallMotorScale", PAD::DEFAULT_MOTOR_SCALE); - if (QDoubleSpinBox* widget = findChild(QStringLiteral("LargeMotorScale")); widget) - ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat(sif, widget, config_section, "LargeMotorScale", PAD::DEFAULT_MOTOR_SCALE); - if (QDoubleSpinBox* widget = findChild(QStringLiteral("PressureModifier")); widget) - ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat(sif, widget, config_section, "PressureModifier", PAD::DEFAULT_PRESSURE_MODIFIER); } ControllerBindingWidget_DualShock2::ControllerBindingWidget_DualShock2(ControllerBindingWidget* parent) diff --git a/pcsx2-qt/Settings/ControllerBindingWidgets.h b/pcsx2-qt/Settings/ControllerBindingWidgets.h index c91794039a..72b692b321 100644 --- a/pcsx2-qt/Settings/ControllerBindingWidgets.h +++ b/pcsx2-qt/Settings/ControllerBindingWidgets.h @@ -15,13 +15,20 @@ #pragma once +#include "PAD/Host/PAD.h" + #include #include "ui_ControllerBindingWidget.h" #include "ui_ControllerBindingWidget_DualShock2.h" +#include "ui_ControllerMacroWidget.h" +#include "ui_ControllerMacroEditWidget.h" class InputBindingWidget; class ControllerSettingsDialog; +class ControllerCustomSettingsWidget; +class ControllerMacroWidget; +class ControllerMacroEditWidget; class ControllerBindingWidget_Base; class ControllerBindingWidget final : public QWidget @@ -41,13 +48,16 @@ public: private Q_SLOTS: void onTypeChanged(); - void doAutomaticBinding(); - void doClearBindings(); + void onAutomaticBindingClicked(); + void onClearBindingsClicked(); + void onBindingsClicked(); + void onSettingsClicked(); + void onMacrosClicked(); private: void populateControllerTypes(); + void updateHeaderToolButtons(); void doDeviceAutomaticBinding(const QString& device); - void saveAndRefresh(); Ui::ControllerBindingWidget m_ui; @@ -57,9 +67,87 @@ private: std::string m_controller_type; u32 m_port_number; - ControllerBindingWidget_Base* m_current_widget = nullptr; + ControllerBindingWidget_Base* m_bindings_widget = nullptr; + ControllerCustomSettingsWidget* m_settings_widget = nullptr; + ControllerMacroWidget* m_macros_widget = nullptr; }; + +////////////////////////////////////////////////////////////////////////// + +class ControllerMacroWidget : public QWidget +{ + Q_OBJECT + +public: + ControllerMacroWidget(ControllerBindingWidget* parent); + ~ControllerMacroWidget(); + + void updateListItem(u32 index); + +private: + static constexpr u32 NUM_MACROS = PAD::NUM_MACRO_BUTTONS_PER_CONTROLLER; + + void createWidgets(ControllerBindingWidget* parent); + + Ui::ControllerMacroWidget m_ui; + ControllerSettingsDialog* m_dialog; + std::array m_macros; +}; + +////////////////////////////////////////////////////////////////////////// + +class ControllerMacroEditWidget : public QWidget +{ + Q_OBJECT + +public: + ControllerMacroEditWidget(ControllerMacroWidget* parent, ControllerBindingWidget* bwidget, u32 index); + ~ControllerMacroEditWidget(); + + QString getSummary() const; + +private Q_SLOTS: + void onSetFrequencyClicked(); + void updateBinds(); + +private: + void modFrequency(s32 delta); + void updateFrequency(); + void updateFrequencyText(); + + Ui::ControllerMacroEditWidget m_ui; + + ControllerMacroWidget* m_parent; + ControllerBindingWidget* m_bwidget; + u32 m_index; + + std::vector m_binds; + u32 m_frequency = 0; +}; + +////////////////////////////////////////////////////////////////////////// + +class ControllerCustomSettingsWidget : public QWidget +{ + Q_OBJECT + +public: + ControllerCustomSettingsWidget(ControllerBindingWidget* parent, QWidget* parent_widget); + ~ControllerCustomSettingsWidget(); + + void createSettingWidgets(ControllerBindingWidget* parent, QWidget* widget_parent, QGridLayout* layout, const PAD::ControllerInfo* cinfo); + +private Q_SLOTS: + void restoreDefaults(); + +private: + ControllerBindingWidget* m_parent; +}; + +////////////////////////////////////////////////////////////////////////// + + class ControllerBindingWidget_Base : public QWidget { Q_OBJECT diff --git a/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.cpp b/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.cpp index 5fabe9e039..f122c2a91f 100644 --- a/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.cpp +++ b/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.cpp @@ -32,15 +32,24 @@ ControllerGlobalSettingsWidget::ControllerGlobalSettingsWidget(QWidget* parent, SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableSDLSource, "InputSources", "SDL", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableSDLEnhancedMode, "InputSources", "SDLControllerEnhancedMode", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableXInputSource, "InputSources", "XInput", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableMouseMapping, "UI", "EnableMouseMapping", false); ControllerSettingWidgetBinder::BindWidgetToInputProfileBool(sif, m_ui.multitapPort1, "Pad", "MultitapPort1", false); ControllerSettingWidgetBinder::BindWidgetToInputProfileBool(sif, m_ui.multitapPort2, "Pad", "MultitapPort2", false); - ControllerSettingWidgetBinder::BindWidgetToInputProfileBool(sif, m_ui.pointerXInvert, "Pad", "PointerXInvert", false); - ControllerSettingWidgetBinder::BindWidgetToInputProfileBool(sif, m_ui.pointerYInvert, "Pad", "PointerYInvert", false); ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat(sif, m_ui.pointerXScale, "Pad", "PointerXScale", 8.0f); ControllerSettingWidgetBinder::BindWidgetToInputProfileFloat(sif, m_ui.pointerYScale, "Pad", "PointerYScale", 8.0f); +#ifdef _WIN32 + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableXInputSource, "InputSources", "XInput", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableDInputSource, "InputSources", "DInput", false); +#else + m_ui.mainLayout->removeWidget(m_ui.xinputGroup); + m_ui.xinputGroup->deleteLater(); + m_ui.xinputGroup = nullptr; + m_ui.mainLayout->removeWidget(m_ui.dinputGroup); + m_ui.dinputGroup->deleteLater(); + m_ui.dinputGroup = nullptr; +#endif + if (dialog->isEditingProfile()) { m_ui.useProfileHotkeyBindings->setChecked(m_dialog->getBoolValue("Pad", "UseProfileHotkeyBindings", false)); diff --git a/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.ui b/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.ui index 0ac675b828..434863a563 100644 --- a/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.ui +++ b/pcsx2-qt/Settings/ControllerGlobalSettingsWidget.ui @@ -27,7 +27,7 @@ 0 - + SDL Input Source @@ -60,7 +60,7 @@ - + XInput Source @@ -86,149 +86,72 @@ - + - Mouse/Pointer Source + DInput Source - - - - - 0 - 0 - - - - - 20 - 0 - - + + - 10 - - - - - - - - 0 - 0 - - - - - 150 - 0 - - - - 1 - - - 30 - - - Qt::Horizontal - - - - - - - Invert - - - - - - - - 0 - 0 - - - - - 150 - 0 - - - - 1 - - - 30 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 20 - 0 - - - - 10 - - - - - - - Invert - - - - - - - Using raw input improves precision when you bind controller sticks to the mouse pointer. Also enables multiple mice to be used. + The DInput source provides support for legacy controllers which do not support XInput. Accessing these controllers via SDL instead is recommended, but DirectInput can be used if they are not compatible with SDL. true - - - - Vertical Sensitivity: - - - - + - Horizontal Sensitivity: - - - - - - - Enable Mouse Mapping + Enable DInput Input Source - - + + + + Qt::Vertical + + + + 20 + 45 + + + + + + + + Profile Settings + + + + + + When this option is enabled, hotkeys can be set in this input profile, and will be used instead of the global hotkeys. By default, hotkeys are always shared between all profiles. + + + true + + + + + + + Use Per-Profile Hotkeys + + + + + + + + Controller Multitap @@ -260,16 +183,16 @@ - - + + - Profile Settings + Mouse/Pointer Source - - - + + + - When this option is enabled, hotkeys can be set in this input profile, and will be used instead of the global hotkeys. By default, hotkeys are always shared between all profiles. + Using raw input improves precision when you bind controller sticks to the mouse pointer. Also enables multiple mice to be used. true @@ -277,29 +200,130 @@ - + - Use Per-Profile Hotkeys + Horizontal Sensitivity: + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + 1 + + + 30 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + 10 + + + + + + + + + Vertical Sensitivity: + + + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + 1 + + + 30 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + 10 + + + + + + + + + + + Enable Mouse Mapping + + + + + - - - - Qt::Vertical - - - - 20 - 45 - - - - - + Detected Devices diff --git a/pcsx2-qt/Settings/ControllerMacroEditWidget.ui b/pcsx2-qt/Settings/ControllerMacroEditWidget.ui new file mode 100644 index 0000000000..788a59b355 --- /dev/null +++ b/pcsx2-qt/Settings/ControllerMacroEditWidget.ui @@ -0,0 +1,157 @@ + + + ControllerMacroEditWidget + + + + 0 + 0 + 595 + 473 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Binds/Buttons + + + + + + Select the buttons which you want to trigger with this macro. All buttons are activated concurrently. + + + true + + + + + + + + + + + + + Trigger + + + + + + Select the trigger to activate this macro. This can be a single button, or combination of buttons (chord). Shift-click for multiple triggers. + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + + PushButton + + + + + + + + + + Frequency + + + + + + + + Macro will toggle every N frames. + + + + + + + Set... + + + + + + + + 0 + 20 + + + + Qt::UpArrow + + + + + + + + 0 + 20 + + + + Qt::DownArrow + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + InputBindingWidget + QPushButton +
    Settings/InputBindingWidget.h
    +
    +
    + + +
    diff --git a/pcsx2-qt/Settings/ControllerMacroWidget.ui b/pcsx2-qt/Settings/ControllerMacroWidget.ui new file mode 100644 index 0000000000..773ffc4adc --- /dev/null +++ b/pcsx2-qt/Settings/ControllerMacroWidget.ui @@ -0,0 +1,69 @@ + + + ControllerMacroWidget + + + + 0 + 0 + 799 + 493 + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 150 + 0 + + + + + 150 + 16777215 + + + + + 32 + 32 + + + + + + + + + + + + + + diff --git a/pcsx2-qt/Settings/ControllerSettingWidgetBinder.h b/pcsx2-qt/Settings/ControllerSettingWidgetBinder.h index 4d057e75cb..02e7e78c24 100644 --- a/pcsx2-qt/Settings/ControllerSettingWidgetBinder.h +++ b/pcsx2-qt/Settings/ControllerSettingWidgetBinder.h @@ -29,9 +29,7 @@ #include "pcsx2/HostSettings.h" -#include "EmuThread.h" #include "QtHost.h" - #include "SettingWidgetBinder.h" /// This nastyness is required because input profiles aren't overlaid settings like the rest of them, it's @@ -63,7 +61,8 @@ namespace ControllerSettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key)]() { const bool new_value = Accessor::getBoolValue(widget); - QtHost::SetBaseBoolSettingValue(section.c_str(), key.c_str(), new_value); + Host::SetBaseBoolSettingValue(section.c_str(), key.c_str(), new_value); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -94,7 +93,8 @@ namespace ControllerSettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key)]() { const float new_value = Accessor::getFloatValue(widget); - QtHost::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value); + Host::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -127,7 +127,8 @@ namespace ControllerSettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key), range]() { const float new_value = (static_cast(Accessor::getIntValue(widget)) / range); - QtHost::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value); + Host::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } @@ -166,10 +167,11 @@ namespace ControllerSettingWidgetBinder Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key)]() { const QString new_value = Accessor::getStringValue(widget); if (!new_value.isEmpty()) - QtHost::SetBaseStringSettingValue(section.c_str(), key.c_str(), new_value.toUtf8().constData()); + Host::SetBaseStringSettingValue(section.c_str(), key.c_str(), new_value.toUtf8().constData()); else - QtHost::RemoveBaseSettingValue(section.c_str(), key.c_str()); + Host::RemoveBaseSettingValue(section.c_str(), key.c_str()); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); }); } diff --git a/pcsx2-qt/Settings/ControllerSettingsDialog.cpp b/pcsx2-qt/Settings/ControllerSettingsDialog.cpp index c3914acbad..edb33401ec 100644 --- a/pcsx2-qt/Settings/ControllerSettingsDialog.cpp +++ b/pcsx2-qt/Settings/ControllerSettingsDialog.cpp @@ -15,14 +15,14 @@ #include "PrecompiledHeader.h" -#include "EmuThread.h" #include "QtHost.h" #include "Settings/ControllerSettingsDialog.h" #include "Settings/ControllerGlobalSettingsWidget.h" #include "Settings/ControllerBindingWidgets.h" #include "Settings/HotkeySettingsWidget.h" -#include "pcsx2/Frontend/INISettingsInterface.h" +#include "pcsx2/Frontend/CommonHost.h" +#include "pcsx2/INISettingsInterface.h" #include "pcsx2/PAD/Host/PAD.h" #include "pcsx2/Sio.h" #include "pcsx2/VMManager.h" @@ -162,8 +162,10 @@ void ControllerSettingsDialog::onLoadProfileClicked() { auto lock = Host::GetSettingsLock(); PAD::CopyConfiguration(Host::Internal::GetBaseSettingsLayer(), *m_profile_interface, true, true, false); - QtHost::QueueSettingsSave(); } + Host::CommitBaseSettingChanges(); + + g_emu_thread->applySettings(); // make it visible switchProfile({}); @@ -204,9 +206,11 @@ void ControllerSettingsDialog::onRestoreDefaultsClicked() // actually restore it { auto lock = Host::GetSettingsLock(); - PAD::SetDefaultConfig(*Host::Internal::GetBaseSettingsLayer()); - QtHost::QueueSettingsSave(); + CommonHost::SetDefaultSettings(*Host::Internal::GetBaseSettingsLayer(), false, false, true, true, false); } + Host::CommitBaseSettingChanges(); + + g_emu_thread->applySettings(); // reload all settings switchProfile({}); @@ -262,6 +266,14 @@ bool ControllerSettingsDialog::getBoolValue(const char* section, const char* key return Host::GetBaseBoolSettingValue(section, key, default_value); } +s32 ControllerSettingsDialog::getIntValue(const char* section, const char* key, s32 default_value) const +{ + if (m_profile_interface) + return m_profile_interface->GetIntValue(section, key, default_value); + else + return Host::GetBaseIntSettingValue(section, key, default_value); +} + std::string ControllerSettingsDialog::getStringValue(const char* section, const char* key, const char* default_value) const { std::string value; @@ -282,7 +294,24 @@ void ControllerSettingsDialog::setBoolValue(const char* section, const char* key } else { - QtHost::SetBaseBoolSettingValue(section, key, value); + Host::SetBaseBoolSettingValue(section, key, value); + Host::CommitBaseSettingChanges(); + g_emu_thread->applySettings(); + } +} + +void ControllerSettingsDialog::setIntValue(const char* section, const char* key, s32 value) +{ + if (m_profile_interface) + { + m_profile_interface->SetIntValue(section, key, value); + m_profile_interface->Save(); + g_emu_thread->reloadGameSettings(); + } + else + { + Host::SetBaseIntSettingValue(section, key, value); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); } } @@ -297,7 +326,8 @@ void ControllerSettingsDialog::setStringValue(const char* section, const char* k } else { - QtHost::SetBaseStringSettingValue(key, section, value); + Host::SetBaseStringSettingValue(section, key, value); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); } } @@ -312,7 +342,8 @@ void ControllerSettingsDialog::clearSettingValue(const char* section, const char } else { - QtHost::RemoveBaseSettingValue(section, key); + Host::RemoveBaseSettingValue(section, key); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); } } @@ -402,7 +433,6 @@ void ControllerSettingsDialog::updateListDescription(u32 global_slot, Controller const QVariant data(item->data(Qt::UserRole)); if (data.type() == QVariant::UInt && data.toUInt() == global_slot) { - const bool is_mtap_port = sioPadIsMultitapSlot(global_slot); const auto [port, slot] = sioConvertPadToPortAndSlot(global_slot); const bool mtap_enabled = getBoolValue("Pad", (port == 0) ? "MultitapPort1" : "MultitapPort2", false); diff --git a/pcsx2-qt/Settings/ControllerSettingsDialog.h b/pcsx2-qt/Settings/ControllerSettingsDialog.h index 149623cb2d..1569ebb099 100644 --- a/pcsx2-qt/Settings/ControllerSettingsDialog.h +++ b/pcsx2-qt/Settings/ControllerSettingsDialog.h @@ -64,8 +64,10 @@ public: // Helper functions for updating setting values globally or in the profile. bool getBoolValue(const char* section, const char* key, bool default_value) const; + s32 getIntValue(const char* section, const char* key, s32 default_value) const; std::string getStringValue(const char* section, const char* key, const char* default_value) const; void setBoolValue(const char* section, const char* key, bool value); + void setIntValue(const char* section, const char* key, s32 value); void setStringValue(const char* section, const char* key, const char* value); void clearSettingValue(const char* section, const char* key); diff --git a/pcsx2-qt/Settings/ControllerSettingsDialog.ui b/pcsx2-qt/Settings/ControllerSettingsDialog.ui index f1e4807824..4b4fdedede 100644 --- a/pcsx2-qt/Settings/ControllerSettingsDialog.ui +++ b/pcsx2-qt/Settings/ControllerSettingsDialog.ui @@ -9,8 +9,8 @@ 0 0 - 1276 - 672 + 1300 + 680
    diff --git a/pcsx2-qt/Settings/DEV9DnsHostDialog.cpp b/pcsx2-qt/Settings/DEV9DnsHostDialog.cpp index 06417723ab..a0c900129f 100644 --- a/pcsx2-qt/Settings/DEV9DnsHostDialog.cpp +++ b/pcsx2-qt/Settings/DEV9DnsHostDialog.cpp @@ -22,7 +22,7 @@ #include "common/StringUtil.h" #include "DEV9DnsHostDialog.h" -#include "EmuThread.h" +#include "QtHost.h" #include "QtUtils.h" #include "SettingWidgetBinder.h" #include "SettingsDialog.h" diff --git a/pcsx2-qt/Settings/DEV9DnsHostDialog.h b/pcsx2-qt/Settings/DEV9DnsHostDialog.h index 947bd4dd39..7ccdc0b1c8 100644 --- a/pcsx2-qt/Settings/DEV9DnsHostDialog.h +++ b/pcsx2-qt/Settings/DEV9DnsHostDialog.h @@ -15,8 +15,9 @@ #pragma once -#include +#include #include +#include #include "ui_DEV9DnsHostDialog.h" diff --git a/pcsx2-qt/Settings/DEV9SettingsWidget.cpp b/pcsx2-qt/Settings/DEV9SettingsWidget.cpp index 731019b8f2..94a8798220 100644 --- a/pcsx2-qt/Settings/DEV9SettingsWidget.cpp +++ b/pcsx2-qt/Settings/DEV9SettingsWidget.cpp @@ -24,13 +24,13 @@ #include "common/StringUtil.h" #include "pcsx2/HostSettings.h" +#include "pcsx2/INISettingsInterface.h" #include "DEV9SettingsWidget.h" -#include "EmuThread.h" +#include "QtHost.h" #include "QtUtils.h" #include "SettingWidgetBinder.h" #include "SettingsDialog.h" -#include "Frontend/INISettingsInterface.h" #include "HddCreateQt.h" @@ -251,8 +251,7 @@ DEV9SettingsWidget::DEV9SettingsWidget(SettingsDialog* dialog, QWidget* parent) connect(m_ui.ethHostExport, &QPushButton::clicked, this, &DEV9SettingsWidget::onEthHostExport); connect(m_ui.ethHostImport, &QPushButton::clicked, this, &DEV9SettingsWidget::onEthHostImport); - if (m_dialog->isPerGameSettings()) - m_ui.ethTabWidget->setTabEnabled(1, false); + connect(m_ui.ethHostPerGame, &QPushButton::clicked, this, &DEV9SettingsWidget::onEthHostPerGame); ////////////////////////////////////////////////////////////////////////// // HDD Settings @@ -495,7 +494,7 @@ void DEV9SettingsWidget::onEthHostDel() void DEV9SettingsWidget::onEthHostExport() { - std::vector hosts = ListHostsConfig(); + std::vector hosts = ListHostsConfig().value(); DEV9DnsHostDialog exportDialog(hosts, this); @@ -609,6 +608,55 @@ void DEV9SettingsWidget::onEthHostImport() QMessageBox::StandardButton::Ok, QMessageBox::StandardButton::Ok); } +void DEV9SettingsWidget::onEthHostPerGame() +{ + const std::optional hostLengthOpt = m_dialog->getIntValue("DEV9/Eth/Hosts", "Count", std::nullopt); + if (!hostLengthOpt.has_value()) + { + QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Per Game Host list"), + tr("Copy global settings?"), + QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No | QMessageBox::StandardButton::Cancel, QMessageBox::StandardButton::Yes); + + switch (ret) + { + case QMessageBox::StandardButton::No: + m_dialog->setIntSettingValue("DEV9/Eth/Hosts", "Count", 0); + break; + + case QMessageBox::StandardButton::Yes: + { + m_dialog->setIntSettingValue("DEV9/Eth/Hosts", "Count", 0); + std::vector hosts = ListBaseHostsConfig(); + for (size_t i = 0; i < hosts.size(); i++) + AddNewHostConfig(hosts[i]); + break; + } + + case QMessageBox::StandardButton::Cancel: + return; + + default: + return; + } + } + else + { + QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Per Game Host list"), + tr("Delete per game host list?"), + QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::Cancel, QMessageBox::StandardButton::Yes); + + if (ret == QMessageBox::StandardButton::Yes) + { + const int hostLength = CountHostsConfig(); + for (int i = hostLength - 1; i >= 0; i--) + DeleteHostConfig(i); + } + m_dialog->setIntSettingValue("DEV9/Eth/Hosts", nullptr, std::nullopt); + } + + RefreshHostList(); +} + void DEV9SettingsWidget::onEthHostEdit(QStandardItem* item) { const int row = item->row(); @@ -825,9 +873,42 @@ void DEV9SettingsWidget::RefreshHostList() while (m_ethHost_model->rowCount() > 0) m_ethHost_model->removeRow(0); - //Load list - std::vector hosts = ListHostsConfig(); + bool enableHostsUi; + std::vector hosts; + + if (m_dialog->isPerGameSettings()) + { + m_ui.ethHostPerGame->setVisible(true); + + std::optional> hostsOpt = ListHostsConfig(); + if (hostsOpt.has_value()) + { + m_ui.ethHostPerGame->setText(tr("Use Global")); + hosts = hostsOpt.value(); + enableHostsUi = true; + } + else + { + m_ui.ethHostPerGame->setText(tr("Override")); + hosts = ListBaseHostsConfig(); + enableHostsUi = false; + } + } + else + { + m_ui.ethHostPerGame->setVisible(false); + hosts = ListHostsConfig().value(); + enableHostsUi = true; + } + + m_ui.ethHosts->setEnabled(enableHostsUi); + m_ui.ethHostAdd->setEnabled(enableHostsUi); + m_ui.ethHostDel->setEnabled(enableHostsUi); + m_ui.ethHostExport->setEnabled(enableHostsUi); + m_ui.ethHostImport->setEnabled(enableHostsUi); + + //Load list for (size_t i = 0; i < hosts.size(); i++) { HostEntryUi entry = hosts[i]; @@ -863,11 +944,21 @@ int DEV9SettingsWidget::CountHostsConfig() return m_dialog->getIntValue("DEV9/Eth/Hosts", "Count", 0).value(); } -std::vector DEV9SettingsWidget::ListHostsConfig() +std::optional> DEV9SettingsWidget::ListHostsConfig() { std::vector hosts; - const int hostLength = CountHostsConfig(); + std::optional hostLengthOpt; + if (m_dialog->isPerGameSettings()) + { + hostLengthOpt = m_dialog->getIntValue("DEV9/Eth/Hosts", "Count", std::nullopt); + if (!hostLengthOpt.has_value()) + return std::nullopt; + } + else + hostLengthOpt = m_dialog->getIntValue("DEV9/Eth/Hosts", "Count", 0); + + const int hostLength = hostLengthOpt.value(); for (int i = 0; i < hostLength; i++) { std::string section = "DEV9/Eth/Hosts/Host" + std::to_string(i); @@ -883,6 +974,26 @@ std::vector DEV9SettingsWidget::ListHostsConfig() return hosts; } +std::vector DEV9SettingsWidget::ListBaseHostsConfig() +{ + std::vector hosts; + + const int hostLength = Host::GetBaseIntSettingValue("DEV9/Eth/Hosts", "Count", 0); + for (int i = 0; i < hostLength; i++) + { + std::string section = "DEV9/Eth/Hosts/Host" + std::to_string(i); + + HostEntryUi entry; + entry.Url = Host::GetBaseStringSettingValue(section.c_str(), "Url", ""); + entry.Desc = Host::GetBaseStringSettingValue(section.c_str(), "Desc", ""); + entry.Address = Host::GetBaseStringSettingValue(section.c_str(), "Address", ""); + entry.Enabled = Host::GetBaseBoolSettingValue(section.c_str(), "Enabled", false); + hosts.push_back(entry); + } + + return hosts; +} + void DEV9SettingsWidget::AddNewHostConfig(const HostEntryUi& host) { const int hostLength = CountHostsConfig(); diff --git a/pcsx2-qt/Settings/DEV9SettingsWidget.h b/pcsx2-qt/Settings/DEV9SettingsWidget.h index 8bf21f87be..c66d5be48e 100644 --- a/pcsx2-qt/Settings/DEV9SettingsWidget.h +++ b/pcsx2-qt/Settings/DEV9SettingsWidget.h @@ -42,6 +42,7 @@ private Q_SLOTS: void onEthHostDel(); void onEthHostExport(); void onEthHostImport(); + void onEthHostPerGame(); void onEthHostEdit(QStandardItem* item); void onHddEnabledChanged(int state); @@ -63,7 +64,8 @@ private: void AddAdapter(const AdapterEntry& adapter); void RefreshHostList(); int CountHostsConfig(); - std::vector ListHostsConfig(); + std::optional> ListHostsConfig(); + std::vector ListBaseHostsConfig(); void AddNewHostConfig(const HostEntryUi& host); void DeleteHostConfig(int index); diff --git a/pcsx2-qt/Settings/DEV9SettingsWidget.ui b/pcsx2-qt/Settings/DEV9SettingsWidget.ui index bfbbd8cda5..fb64505c54 100644 --- a/pcsx2-qt/Settings/DEV9SettingsWidget.ui +++ b/pcsx2-qt/Settings/DEV9SettingsWidget.ui @@ -206,6 +206,13 @@
    + + + + Per game + + + diff --git a/pcsx2-qt/Settings/EmulationSettingsWidget.cpp b/pcsx2-qt/Settings/EmulationSettingsWidget.cpp index 847eccf78f..2fe09ec108 100644 --- a/pcsx2-qt/Settings/EmulationSettingsWidget.cpp +++ b/pcsx2-qt/Settings/EmulationSettingsWidget.cpp @@ -26,6 +26,10 @@ #include "SettingWidgetBinder.h" #include "SettingsDialog.h" +static constexpr int MINIMUM_EE_CYCLE_RATE = -3; +static constexpr int MAXIMUM_EE_CYCLE_RATE = 3; +static constexpr int DEFAULT_EE_CYCLE_RATE = 0; +static constexpr int DEFAULT_EE_CYCLE_SKIP = 0; static constexpr u32 DEFAULT_FRAME_LATENCY = 2; EmulationSettingsWidget::EmulationSettingsWidget(SettingsDialog* dialog, QWidget* parent) @@ -46,55 +50,84 @@ EmulationSettingsWidget::EmulationSettingsWidget(SettingsDialog* dialog, QWidget connect(m_ui.optimalFramePacing, &QCheckBox::stateChanged, this, &EmulationSettingsWidget::onOptimalFramePacingChanged); m_ui.optimalFramePacing->setTristate(dialog->isPerGameSettings()); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.eeCycleSkipping, "EmuCore/Speedhacks", "EECycleSkip", DEFAULT_EE_CYCLE_SKIP); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.affinityControl, "EmuCore/CPU", "AffinityControlMode", 0); + + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.MTVU, "EmuCore/Speedhacks", "vuThread", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.instantVU1, "EmuCore/Speedhacks", "vu1Instant", true); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.fastCDVD, "EmuCore/Speedhacks", "fastCDVD", false); + + if (m_dialog->isPerGameSettings()) + { + m_ui.eeCycleRate->insertItem( + 0, tr("Use Global Setting [%1]") + .arg(m_ui.eeCycleRate->itemText( + std::clamp(Host::GetBaseIntSettingValue("EmuCore/Speedhacks", "EECycleRate", DEFAULT_EE_CYCLE_RATE) - MINIMUM_EE_CYCLE_RATE, + 0, MAXIMUM_EE_CYCLE_RATE - MINIMUM_EE_CYCLE_RATE)))); + } + else + { + // Allow for FastCDVD for per-game settings only + m_ui.systemSettingsLayout->removeWidget(m_ui.fastCDVD); + m_ui.fastCDVD->deleteLater(); + } + + const std::optional cycle_rate = + m_dialog->getIntValue("EmuCore/Speedhacks", "EECycleRate", sif ? std::nullopt : std::optional(DEFAULT_EE_CYCLE_RATE)); + m_ui.eeCycleRate->setCurrentIndex(cycle_rate.has_value() ? (std::clamp(cycle_rate.value(), MINIMUM_EE_CYCLE_RATE, MAXIMUM_EE_CYCLE_RATE) + + (0 - MINIMUM_EE_CYCLE_RATE) + static_cast(m_dialog->isPerGameSettings())) : + 0); + connect(m_ui.eeCycleRate, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index) { + std::optional value; + if (!m_dialog->isPerGameSettings() || index > 0) + value = MINIMUM_EE_CYCLE_RATE + index - static_cast(m_dialog->isPerGameSettings()); + m_dialog->setIntSettingValue("EmuCore/Speedhacks", "EECycleRate", value); + }); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.cheats, "EmuCore", "EnableCheats", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.widescreenPatches, "EmuCore", "EnableWideScreenPatches", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.noInterlacingPatches, "EmuCore", "EnableNoInterlacingPatches", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.perGameSettings, "EmuCore", "EnablePerGameSettings", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.hostFilesystem, "EmuCore", "HostFs", false); dialog->registerWidgetHelp(m_ui.normalSpeed, tr("Normal Speed"), "100%", tr("Sets the target emulation speed. It is not guaranteed that this speed will be reached, " "and if not, the emulator will run as fast as it can manage.")); - dialog->registerWidgetHelp(m_ui.fastForwardSpeed, tr("Fast Forward Speed"), tr("User Preference"), tr("Sets the fast forward speed. This speed will be used when the fast forward hotkey is pressed/toggled.")); - dialog->registerWidgetHelp(m_ui.slowMotionSpeed, tr("Slow Motion Speed"), tr("User Preference"), tr("Sets the slow motion speed. This speed will be used when the slow motion hotkey is pressed/toggled.")); - - dialog->registerWidgetHelp(m_ui.speedLimiter, tr("Speed Limiter"), tr("checked"), + dialog->registerWidgetHelp(m_ui.speedLimiter, tr("Speed Limiter"), tr("Checked"), tr("Limits the emulation to the appropriate framerate for the currently running game.")); - dialog->registerWidgetHelp(m_ui.syncToHostRefreshRate, tr("Sync To Host Refresh Rate"), tr("Unchecked"), - tr("Adjusts the emulation speed so the console's refresh rate matches the host's refresh rate when both VSync and " - "Audio Resampling settings are enabled. This results in the smoothest animations possible, at the cost of " - "potentially increasing the emulation speed by less than 1%. Sync To Host Refresh Rate will not take effect if " - "the console's refresh rate is too far from the host's refresh rate. Users with variable refresh rate displays " - "should disable this option.")); - + dialog->registerWidgetHelp(m_ui.eeCycleRate, tr("Cycle Rate"), tr("100% (Normal Speed)"), + tr("Higher values may increase internal framerate in games, but will increase CPU requirements substantially. " + "Lower values will reduce the CPU load allowing lightweight games to run full speed on weaker CPUs.")); + dialog->registerWidgetHelp(m_ui.eeCycleSkipping, tr("Cycle Skip"), tr("None"), + tr("Makes the emulated Emotion Engine skip cycles. " + "Helps a small subset of games like SOTC. Most of the time it's harmful to performance.")); + dialog->registerWidgetHelp(m_ui.MTVU, tr("MTVU (Multi-threaded VU1)"), tr("Checked"), + tr("Generally a speedup on CPUs with 3 or more threads. " + "Safe for most games, but a few are incompatible and may hang.")); + dialog->registerWidgetHelp(m_ui.instantVU1, tr("Instant VU1"), tr("Checked"), + tr("Runs VU1 instantly. Provides a modest speed improvement in most games. " + "Safe for most games, but a few games may exhibit graphical errors.")); + dialog->registerWidgetHelp(m_ui.fastCDVD, tr("Enable Fast CDVD"), tr("Unchecked"), + tr("Fast disc access, less loading times. Check HDLoader compatibility lists for known games that have issues with this.")); dialog->registerWidgetHelp(m_ui.cheats, tr("Enable Cheats"), tr("Unchecked"), tr("Automatically loads and applies cheats on game start.")); - dialog->registerWidgetHelp(m_ui.hostFilesystem, tr("Enable Host Filesystem"), tr("Unchecked"), tr("Allows games and homebrew to access files / folders directly on the host computer.")); - dialog->registerWidgetHelp(m_ui.widescreenPatches, tr("Enable Widescreen Patches"), tr("Unchecked"), - tr("Automatically loads and applies widescreen patches on game start. Can cause issues.")); - - dialog->registerWidgetHelp(m_ui.noInterlacingPatches, tr("Enable No-Interlacing Patches"), tr("Unchecked"), - tr("Automatically loads and applies no-interlacing patches on game start. Can cause issues.")); - - dialog->registerWidgetHelp(m_ui.perGameSettings, tr("Enable Per-Game Settings"), tr("Checked"), - tr("When enabled, per-game settings will be applied, and incompatible enhancements will be disabled. You should " - "leave this option enabled except when testing enhancements with incompatible games.")); - dialog->registerWidgetHelp(m_ui.optimalFramePacing, tr("Optimal Frame Pacing"), tr("Unchecked"), tr("Sets the vsync queue size to 0, making every frame be completed and presented by the GS before input is polled, and the next frame begins. " "Using this setting can reduce input lag, at the cost of measurably higher CPU and GPU requirements.")); - dialog->registerWidgetHelp(m_ui.maxFrameLatency, tr("Maximum Frame Latency"), tr("2 Frames"), tr("Sets the maximum number of frames that can be queued up to the GS, before the CPU thread will wait for one of them to complete before continuing. " "Higher values can assist with smoothing out irregular frame times, but add additional input lag.")); + dialog->registerWidgetHelp(m_ui.syncToHostRefreshRate, tr("Scale To Host Refresh Rate"), tr("Unchecked"), + tr("Adjusts the emulation speed so the console's refresh rate matches the host's refresh rate when both VSync and " + "Audio Resampling settings are enabled. This results in the smoothest animations possible, at the cost of " + "potentially increasing the emulation speed by less than 1%. Scale To Host Refresh Rate will not take effect if " + "the console's refresh rate is too far from the host's refresh rate. Users with variable refresh rate displays " + "should disable this option.")); updateOptimalFramePacing(); } diff --git a/pcsx2-qt/Settings/EmulationSettingsWidget.ui b/pcsx2-qt/Settings/EmulationSettingsWidget.ui index 4541674fb1..b65c243aa5 100644 --- a/pcsx2-qt/Settings/EmulationSettingsWidget.ui +++ b/pcsx2-qt/Settings/EmulationSettingsWidget.ui @@ -7,7 +7,7 @@ 0 0 672 - 518 + 431 @@ -72,13 +72,184 @@
    + + + + System Settings + + + + + + + + Enable Instant VU1 + + + + + + + Enable Cheats + + + + + + + Enable Multi-Threaded VU1 (MTVU) + + + + + + + Enable Host Filesystem + + + + + + + Enable Fast CDVD + + + + + + + + + EE Cycle Skipping: + + + + + + + + Disabled + + + + + Mild Underclock + + + + + Moderate Underclock + + + + + Maximum Underclock + + + + + + + + EE Cycle Rate: + + + + + + + + 50% (Underclock) + + + + + 60% (Underclock) + + + + + 75% (Underclock) + + + + + 100% (Normal Speed) + + + + + 130% (Overclock) + + + + + 180% (Overclock) + + + + + 300% (Overclock) + + + + + + + + Affinity Control: + + + + + + + + Disabled + + + + + EE > VU > GS + + + + + EE > GS > VU + + + + + VU > EE > GS + + + + + VU > GS > EE + + + + + GS > EE > VU + + + + + GS > VU > EE + + + + + + + Frame Pacing / Latency Control - + frames @@ -91,14 +262,14 @@ - + Maximum Frame Latency: - + @@ -110,7 +281,7 @@ - Adjust To Host Refresh Rate + Scale To Host Refresh Rate @@ -119,50 +290,6 @@ - - - - Game Settings - - - - - - Enable Per-Game Settings - - - - - - - Enable Widescreen Patches - - - - - - - Enable Cheats - - - - - - - Enable Host Filesystem - - - - - - - Enable No-Interlacing Patches - - - - - - diff --git a/pcsx2-qt/Settings/FolderSettingsWidget.cpp b/pcsx2-qt/Settings/FolderSettingsWidget.cpp index 38c707c13d..457e76b957 100644 --- a/pcsx2-qt/Settings/FolderSettingsWidget.cpp +++ b/pcsx2-qt/Settings/FolderSettingsWidget.cpp @@ -29,10 +29,10 @@ FolderSettingsWidget::FolderSettingsWidget(SettingsDialog* dialog, QWidget* pare m_ui.setupUi(this); - SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.cache, m_ui.cacheBrowse, m_ui.cacheOpen, m_ui.cacheReset, "Folders", "Cache", "cache"); - SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.covers, m_ui.coversBrowse, m_ui.coversOpen, m_ui.coversReset, "Folders", "Covers", "covers"); - SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.snapshots, m_ui.snapshotsBrowse, m_ui.snapshotsOpen, m_ui.snapshotsReset, "Folders", "Snapshots", "snaps"); - SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.saveStates, m_ui.saveStatesBrowse, m_ui.saveStatesOpen, m_ui.saveStatesReset, "Folders", "SaveStates", "sstates"); + SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.cache, m_ui.cacheBrowse, m_ui.cacheOpen, m_ui.cacheReset, "Folders", "Cache", Path::Combine(EmuFolders::DataRoot, "cache")); + SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.covers, m_ui.coversBrowse, m_ui.coversOpen, m_ui.coversReset, "Folders", "Covers", Path::Combine(EmuFolders::DataRoot, "covers")); + SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.snapshots, m_ui.snapshotsBrowse, m_ui.snapshotsOpen, m_ui.snapshotsReset, "Folders", "Snapshots", Path::Combine(EmuFolders::DataRoot, "snaps")); + SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.saveStates, m_ui.saveStatesBrowse, m_ui.saveStatesOpen, m_ui.saveStatesReset, "Folders", "SaveStates", Path::Combine(EmuFolders::DataRoot, "sstates")); } FolderSettingsWidget::~FolderSettingsWidget() = default; diff --git a/pcsx2-qt/Settings/GameFixSettingsWidget.cpp b/pcsx2-qt/Settings/GameFixSettingsWidget.cpp index cb874d4d0b..a3fc04c666 100644 --- a/pcsx2-qt/Settings/GameFixSettingsWidget.cpp +++ b/pcsx2-qt/Settings/GameFixSettingsWidget.cpp @@ -19,7 +19,7 @@ #include #include "GameFixSettingsWidget.h" -#include "EmuThread.h" +#include "QtHost.h" #include "QtUtils.h" #include "SettingWidgetBinder.h" #include "SettingsDialog.h" @@ -38,12 +38,14 @@ GameFixSettingsWidget::GameFixSettingsWidget(SettingsDialog* dialog, QWidget* pa SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.SkipMPEGHack, "EmuCore/Gamefixes", "SkipMPEGHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.OPHFlagHack, "EmuCore/Gamefixes", "OPHFlagHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.EETimingHack, "EmuCore/Gamefixes", "EETimingHack", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.InstantDMAHack, "EmuCore/Gamefixes", "InstantDMAHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.DMABusyHack, "EmuCore/Gamefixes", "DMABusyHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.GIFFIFOHack, "EmuCore/Gamefixes", "GIFFIFOHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.VIFFIFOHack, "EmuCore/Gamefixes", "VIFFIFOHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.VIF1StallHack, "EmuCore/Gamefixes", "VIF1StallHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.VuAddSubHack, "EmuCore/Gamefixes", "VuAddSubHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.IbitHack, "EmuCore/Gamefixes", "IbitHack", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.FullVU0SyncHack, "EmuCore/Gamefixes", "FullVU0SyncHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.VUSyncHack, "EmuCore/Gamefixes", "VUSyncHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.VUOverflowHack, "EmuCore/Gamefixes", "VUOverflowHack", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.XgKickHack, "EmuCore/Gamefixes", "XgKickHack", false); diff --git a/pcsx2-qt/Settings/GameFixSettingsWidget.ui b/pcsx2-qt/Settings/GameFixSettingsWidget.ui index deb4c485e6..a55aef014f 100644 --- a/pcsx2-qt/Settings/GameFixSettingsWidget.ui +++ b/pcsx2-qt/Settings/GameFixSettingsWidget.ui @@ -6,14 +6,14 @@ 0 0 - 648 - 481 + 676 + 535 Form - + 0 @@ -23,147 +23,195 @@ 0 + + 0 + - - - Game Fixes (NOT recommended to change globally) + + + true - - - - - FPU Negative Divide Hack (For Gundam Games) - - - - - - - FPU Multiply Hack (For Tales of Destiny) - - - - - - - Use Software Renderer For FMVs - - - - - - - Skip MPEG Hack (Skips Videos/FMVs) - - - - - - - Preload TLB Hack (For Goemon) - - - - - - - EE Timing Hack (General Purpose Timing Hack) - - - - - - - OPH Flag Hack (For Bleach Blade Battlers) - - - - - - - Emulate GIF FIFO (Correct But Slower) - - - - - - - DMA Busy Hack (Deny Writes When Busy) - - - - - - - Delay VIF1 Stalls (For SOCOM 2 HUD/Spy Hunter) - - - - - - - Emulate VIF FIFO (Correct But Slower) - - - - - - - VU I Bit Hack (For Scarface The World is Yours/Crash Tag Team Racing) - - - - - - - VU Add Hack (For Tri-Ace Games) - - - - - - - VU Overflow Hack (Superman Returns) - - - - - - - VU Sync (Run Behind, M-Bit games) - - - - - - - VU XGKick Sync (Correct But Slower) - - - - - - - Force Blit Internal FPS Detection (When auto-detection fails) - - - - + + + + 0 + 0 + 674 + 533 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Game Fixes (NOT recommended to change globally) + + + + + + FPU Negative Divide Hack (For Gundam Games) + + + + + + + FPU Multiply Hack (For Tales of Destiny) + + + + + + + Use Software Renderer For FMVs + + + + + + + Skip MPEG Hack (Skips Videos/FMVs) + + + + + + + Preload TLB Hack (For Goemon) + + + + + + + EE Timing Hack (General Purpose Timing Hack) + + + + + + + Instant DMA Hack (Good for cache emulation problems) + + + + + + + OPH Flag Hack (For Bleach Blade Battlers) + + + + + + + Emulate GIF FIFO (Correct But Slower) + + + + + + + DMA Busy Hack (Deny Writes When Busy) + + + + + + + Delay VIF1 Stalls (For SOCOM 2 HUD/Spy Hunter) + + + + + + + Emulate VIF FIFO (Correct But Slower) + + + + + + + Full VU0 Synchronization (Correct But Slower) + + + + + + + VU I Bit Hack (For Scarface The World is Yours/Crash Tag Team Racing) + + + + + + + VU Add Hack (For Tri-Ace Games) + + + + + + + VU Overflow Hack (Superman Returns) + + + + + + + VU Sync (Run Behind, M-Bit games) + + + + + + + VU XGKick Sync (Correct But Slower) + + + + + + + Force Blit Internal FPS Detection (When auto-detection fails) + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - - - - Qt::Vertical - - - - 20 - 40 - - - -
    diff --git a/pcsx2-qt/Settings/GameListSettingsWidget.cpp b/pcsx2-qt/Settings/GameListSettingsWidget.cpp index 023ed98a83..4a2434bee4 100644 --- a/pcsx2-qt/Settings/GameListSettingsWidget.cpp +++ b/pcsx2-qt/Settings/GameListSettingsWidget.cpp @@ -65,9 +65,10 @@ GameListSettingsWidget::~GameListSettingsWidget() = default; bool GameListSettingsWidget::addExcludedPath(const std::string& path) { - if (!QtHost::AddBaseValueToStringList("GameList", "ExcludedPaths", path.c_str())) + if (!Host::AddBaseValueToStringList("GameList", "ExcludedPaths", path.c_str())) return false; + Host::CommitBaseSettingChanges(); m_ui.excludedPaths->addItem(QString::fromStdString(path)); g_main_window->refreshGameList(false); return true; @@ -107,14 +108,15 @@ void GameListSettingsWidget::addPathToTable(const std::string& path, bool recurs const std::string path(item->text().toStdString()); if (state == Qt::Checked) { - QtHost::RemoveBaseValueFromStringList("GameList", "Paths", path.c_str()); - QtHost::AddBaseValueToStringList("GameList", "RecursivePaths", path.c_str()); + Host::RemoveBaseValueFromStringList("GameList", "Paths", path.c_str()); + Host::AddBaseValueToStringList("GameList", "RecursivePaths", path.c_str()); } else { - QtHost::RemoveBaseValueFromStringList("GameList", "RecursivePaths", path.c_str()); - QtHost::AddBaseValueToStringList("GameList", "Paths", path.c_str()); + Host::RemoveBaseValueFromStringList("GameList", "RecursivePaths", path.c_str()); + Host::AddBaseValueToStringList("GameList", "Paths", path.c_str()); } + Host::CommitBaseSettingChanges(); }); } @@ -138,8 +140,9 @@ void GameListSettingsWidget::refreshDirectoryList() void GameListSettingsWidget::addSearchDirectory(const QString& path, bool recursive) { const std::string spath(path.toStdString()); - QtHost::RemoveBaseValueFromStringList("GameList", recursive ? "Paths" : "RecursivePaths", spath.c_str()); - QtHost::AddBaseValueToStringList("GameList", recursive ? "RecursivePaths" : "Paths", spath.c_str()); + Host::RemoveBaseValueFromStringList("GameList", recursive ? "Paths" : "RecursivePaths", spath.c_str()); + Host::AddBaseValueToStringList("GameList", recursive ? "RecursivePaths" : "Paths", spath.c_str()); + Host::CommitBaseSettingChanges(); refreshDirectoryList(); g_main_window->refreshGameList(false); } @@ -147,12 +150,13 @@ void GameListSettingsWidget::addSearchDirectory(const QString& path, bool recurs void GameListSettingsWidget::removeSearchDirectory(const QString& path) { const std::string spath(path.toStdString()); - if (!QtHost::RemoveBaseValueFromStringList("GameList", "Paths", spath.c_str()) && - !QtHost::RemoveBaseValueFromStringList("GameList", "RecursivePaths", spath.c_str())) + if (!Host::RemoveBaseValueFromStringList("GameList", "Paths", spath.c_str()) && + !Host::RemoveBaseValueFromStringList("GameList", "RecursivePaths", spath.c_str())) { return; } + Host::CommitBaseSettingChanges(); refreshDirectoryList(); g_main_window->refreshGameList(false); } @@ -228,7 +232,9 @@ void GameListSettingsWidget::onRemoveExcludedPathButtonClicked() if (!item) return; - QtHost::RemoveBaseValueFromStringList("GameList", "ExcludedPaths", item->text().toUtf8().constData()); + if (Host::RemoveBaseValueFromStringList("GameList", "ExcludedPaths", item->text().toUtf8().constData())) + Host::CommitBaseSettingChanges(); + delete item; g_main_window->refreshGameList(false); diff --git a/pcsx2-qt/Settings/GameSummaryWidget.ui b/pcsx2-qt/Settings/GameSummaryWidget.ui index a25938d0db..c4d771d932 100644 --- a/pcsx2-qt/Settings/GameSummaryWidget.ui +++ b/pcsx2-qt/Settings/GameSummaryWidget.ui @@ -130,15 +130,6 @@ :/icons/applications-system-24.png:/icons/applications-system-24.png
    - - - Playlist - - - - :/icons/address-book-new-22.png:/icons/address-book-new-22.png - -
    diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp b/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp index ba763ed66c..b17e7b6b98 100644 --- a/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp +++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.cpp @@ -75,8 +75,9 @@ static const char* s_anisotropic_filtering_entries[] = {QT_TRANSLATE_NOOP("Graph QT_TRANSLATE_NOOP("GraphicsSettingsWidget", "8x"), QT_TRANSLATE_NOOP("GraphicsSettingsWidget", "16x"), nullptr}; static const char* s_anisotropic_filtering_values[] = {"0", "2", "4", "8", "16", nullptr}; -static constexpr int DEFAULT_INTERLACE_MODE = 7; +static constexpr int DEFAULT_INTERLACE_MODE = 0; static constexpr int DEFAULT_TV_SHADER_MODE = 0; +static constexpr int DEFAULT_CAS_SHARPNESS = 50; GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* parent) : QWidget(parent) @@ -86,18 +87,14 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* m_ui.setupUi(this); - // start hidden, fixup in updateRendererDependentOptions() - m_ui.hardwareRendererGroup->setVisible(false); - m_ui.verticalLayout->removeWidget(m_ui.hardwareRendererGroup); - m_ui.softwareRendererGroup->setVisible(false); - m_ui.verticalLayout->removeWidget(m_ui.softwareRendererGroup); - ////////////////////////////////////////////////////////////////////////// // Global Settings ////////////////////////////////////////////////////////////////////////// SettingWidgetBinder::BindWidgetToStringSetting(sif, m_ui.adapter, "EmuCore/GS", "Adapter"); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.vsync, "EmuCore/GS", "VsyncEnable", 0); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enableHWFixes, "EmuCore/GS", "UserHacks", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.spinGPUDuringReadbacks, "EmuCore/GS", "HWSpinGPUForReadbacks", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.spinCPUDuringReadbacks, "EmuCore/GS", "HWSpinCPUForReadbacks", false); ////////////////////////////////////////////////////////////////////////// // Game Display Settings @@ -106,18 +103,27 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* sif, m_ui.aspectRatio, "EmuCore/GS", "AspectRatio", Pcsx2Config::GSOptions::AspectRatioNames, AspectRatioType::RAuto4_3_3_2); SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.fmvAspectRatio, "EmuCore/GS", "FMVAspectRatioSwitch", Pcsx2Config::GSOptions::FMVAspectRatioSwitchNames, FMVAspectRatioSwitchType::Off); - SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.interlacing, "EmuCore/GS", "deinterlace", DEFAULT_INTERLACE_MODE); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.bilinearFiltering, "EmuCore/GS", "linear_present", true); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.interlacing, "EmuCore/GS", "deinterlace_mode", DEFAULT_INTERLACE_MODE); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.bilinearFiltering, "EmuCore/GS", "linear_present_mode", static_cast(GSPostBilinearMode::BilinearSmooth)); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.widescreenPatches, "EmuCore", "EnableWideScreenPatches", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.noInterlacingPatches, "EmuCore", "EnableNoInterlacingPatches", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.integerScaling, "EmuCore/GS", "IntegerScaling", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.PCRTCOffsets, "EmuCore/GS", "pcrtc_offsets", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.PCRTCOverscan, "EmuCore/GS", "pcrtc_overscan", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.PCRTCAntiBlur, "EmuCore/GS", "pcrtc_antiblur", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.DisableInterlaceOffset, "EmuCore/GS", "disable_interlace_offset", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.internalResolutionScreenshots, "EmuCore/GS", "InternalResolutionScreenshots", false); SettingWidgetBinder::BindWidgetToFloatSetting(sif, m_ui.zoom, "EmuCore/GS", "Zoom", 100.0f); SettingWidgetBinder::BindWidgetToFloatSetting(sif, m_ui.stretchY, "EmuCore/GS", "StretchY", 100.0f); - SettingWidgetBinder::BindWidgetToFloatSetting(sif, m_ui.offsetX, "EmuCore/GS", "OffsetX", 0.0f); - SettingWidgetBinder::BindWidgetToFloatSetting(sif, m_ui.offsetY, "EmuCore/GS", "OffsetY", 0.0f); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.cropLeft, "EmuCore/GS", "CropLeft", 0); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.cropTop, "EmuCore/GS", "CropTop", 0); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.cropRight, "EmuCore/GS", "CropRight", 0); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.cropBottom, "EmuCore/GS", "CropBottom", 0); + + dialog->registerWidgetHelp(m_ui.widescreenPatches, tr("Enable Widescreen Patches"), tr("Unchecked"), + tr("Automatically loads and applies widescreen patches on game start. Can cause issues.")); + + dialog->registerWidgetHelp(m_ui.noInterlacingPatches, tr("Enable No-Interlacing Patches"), tr("Unchecked"), + tr("Automatically loads and applies no-interlacing patches on game start. Can cause issues.")); connect(m_ui.integerScaling, &QCheckBox::stateChanged, this, &GraphicsSettingsWidget::onIntegerScalingChanged); onIntegerScalingChanged(); @@ -136,12 +142,18 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.osdShowResolution, "EmuCore/GS", "OsdShowResolution", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.osdShowGSStats, "EmuCore/GS", "OsdShowGSStats", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.osdShowIndicators, "EmuCore/GS", "OsdShowIndicators", true); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.osdShowSettings, "EmuCore/GS", "OsdShowSettings", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.osdShowInputs, "EmuCore/GS", "OsdShowInputs", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.osdShowFrameTimes, "EmuCore/GS", "OsdShowFrameTimes", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.warnAboutUnsafeSettings, "EmuCore", "WarnAboutUnsafeSettings", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.fxaa, "EmuCore/GS", "fxaa", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.shadeBoost, "EmuCore/GS", "ShadeBoost", false); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.shadeBoostBrightness, "EmuCore/GS", "ShadeBoost_Brightness", false); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.shadeBoostContrast, "EmuCore/GS", "ShadeBoost_Contrast", false); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.shadeBoostSaturation, "EmuCore/GS", "ShadeBoost_Saturation", false); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.tvShader, "EmuCore/GS", "TVShader", DEFAULT_TV_SHADER_MODE); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.casMode, "EmuCore/GS", "CASMode", static_cast(GSCASMode::Disabled)); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.casSharpness, "EmuCore/GS", "CASSharpness", DEFAULT_CAS_SHARPNESS); connect(m_ui.shadeBoost, QOverload::of(&QCheckBox::stateChanged), this, &GraphicsSettingsWidget::onShadeBoostChanged); onShadeBoostChanged(); @@ -163,6 +175,8 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* tr("Shows counters for internal graphical utilization, useful for debugging.")); dialog->registerWidgetHelp(m_ui.osdShowIndicators, tr("Show Indicators"), tr("Unchecked"), tr("Shows OSD icon indicators for emulation states such as Pausing, Turbo, Fast Forward, and Slow Motion.")); + dialog->registerWidgetHelp(m_ui.warnAboutUnsafeSettings, tr("Warn About Unsafe Settings"), + tr("Checked"), tr("Displays warnings when settings are enabled which may break games.")); dialog->registerWidgetHelp(m_ui.shadeBoost, tr("Shade Boost"), tr("Unchecked"), tr("Enables saturation, contrast, and brightness to be adjusted. Values of brightness, saturation, and contrast are at default 50.")); @@ -173,18 +187,49 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* ////////////////////////////////////////////////////////////////////////// // HW Settings ////////////////////////////////////////////////////////////////////////// - SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.upscaleMultiplier, "EmuCore/GS", "upscale_multiplier", 1, 1); + static const char* upscale_entries[] = { + "Native (PS2) (Default)", + "1.25x Native", + "1.5x Native", + "1.75x Native", + "2x Native (~720p)", + "2.25x Native", + "2.5x Native", + "2.75x Native", + "3x Native (~1080p)", + "3.5x Native", + "4x Native (~1440p/2K)", + "5x Native (~1620p)", + "6x Native (~2160p/4K)", + "7x Native (~2520p)", + "8x Native (~2880p/5K)", + nullptr}; + static const char* upscale_values[] = { + "1", + "1.25", + "1.5", + "1.75", + "2", + "2.25", + "2.5", + "2.75", + "3", + "3.5", + "4", + "5", + "6", + "7", + "8", + nullptr }; + SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.upscaleMultiplier, "EmuCore/GS", "upscale_multiplier", upscale_entries, upscale_values, "1.0"); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.textureFiltering, "EmuCore/GS", "filter", static_cast(BiFiltering::PS2)); - SettingWidgetBinder::BindWidgetToIntSetting( - sif, m_ui.trilinearFiltering, "EmuCore/GS", "UserHacks_TriFilter", static_cast(TriFiltering::Automatic), -1); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.trilinearFiltering, "EmuCore/GS", "TriFilter", static_cast(TriFiltering::Automatic), -1); SettingWidgetBinder::BindWidgetToEnumSetting( - sif, m_ui.anisotropicFiltering, "EmuCore/GS", "MaxAnisotropy", s_anisotropic_filtering_entries, s_anisotropic_filtering_values, "1"); + sif, m_ui.anisotropicFiltering, "EmuCore/GS", "MaxAnisotropy", s_anisotropic_filtering_entries, s_anisotropic_filtering_values, "0"); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.dithering, "EmuCore/GS", "dithering_ps2", 2); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.mipmapping, "EmuCore/GS", "mipmap_hw", static_cast(HWMipmapLevel::Automatic), -1); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.crcFixLevel, "EmuCore/GS", "crc_hack_level", static_cast(CRCHackLevel::Automatic), -1); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.blending, "EmuCore/GS", "accurate_blending_unit", static_cast(AccBlendLevel::Basic)); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.accurateDATE, "EmuCore/GS", "accurate_date", true); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.conservativeBufferAllocation, "EmuCore/GS", "conservative_framebuffer", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.gpuPaletteConversion, "EmuCore/GS", "paltex", false); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.texturePreloading, "EmuCore/GS", "texture_preloading", static_cast(TexturePreloadingLevel::Off)); @@ -199,6 +244,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* ////////////////////////////////////////////////////////////////////////// SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.halfScreenFix, "EmuCore/GS", "UserHacks_Half_Bottom_Override", -1, -1); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.cpuSpriteRenderBW, "EmuCore/GS", "UserHacks_CPUSpriteRenderBW", 0); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.cpuCLUTRender, "EmuCore/GS", "UserHacks_CPUCLUTRender", 0); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.skipDrawStart, "EmuCore/GS", "UserHacks_SkipDraw_Start", 0); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.skipDrawEnd, "EmuCore/GS", "UserHacks_SkipDraw_End", 0); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.hwAutoFlush, "EmuCore/GS", "UserHacks_AutoFlush", false); @@ -231,7 +277,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.loadTextureReplacementsAsync, "EmuCore/GS", "LoadTextureReplacementsAsync", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.precacheTextureReplacements, "EmuCore/GS", "PrecacheTextureReplacements", false); SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.texturesDirectory, m_ui.texturesBrowse, m_ui.texturesOpen, m_ui.texturesReset, - "Folders", "Textures", "textures"); + "Folders", "Textures", Path::Combine(EmuFolders::DataRoot, "textures")); ////////////////////////////////////////////////////////////////////////// // Advanced Settings @@ -241,17 +287,17 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.skipPresentingDuplicateFrames, "EmuCore/GS", "SkipDuplicateFrames", false); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.overrideTextureBarriers, "EmuCore/GS", "OverrideTextureBarriers", -1, -1); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.overrideGeometryShader, "EmuCore/GS", "OverrideGeometryShaders", -1, -1); - SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.gsDumpCompression, "EmuCore/GS", "GSDumpCompression", static_cast(GSDumpCompressionMethod::Uncompressed)); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.gsDumpCompression, "EmuCore/GS", "GSDumpCompression", static_cast(GSDumpCompressionMethod::Zstandard)); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableFramebufferFetch, "EmuCore/GS", "DisableFramebufferFetch", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableDualSource, "EmuCore/GS", "DisableDualSourceBlend", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableHardwareReadbacks, "EmuCore/GS", "HWDisableReadbacks", false); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.gsDownloadMode, "EmuCore/GS", "HWDownloadMode", static_cast(GSHardwareDownloadMode::Enabled)); ////////////////////////////////////////////////////////////////////////// // SW Settings ////////////////////////////////////////////////////////////////////////// + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.swTextureFiltering, "EmuCore/GS", "filter", static_cast(BiFiltering::PS2)); SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.extraSWThreads, "EmuCore/GS", "extrathreads", 2); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.swAutoFlush, "EmuCore/GS", "autoflush_sw", true); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.swAA1, "EmuCore/GS", "aa1", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.swMipmap, "EmuCore/GS", "mipmap", true); ////////////////////////////////////////////////////////////////////////// @@ -284,19 +330,28 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* } connect(m_ui.renderer, QOverload::of(&QComboBox::currentIndexChanged), this, &GraphicsSettingsWidget::onRendererChanged); - connect(m_ui.enableHWFixes, &QCheckBox::stateChanged, this, &GraphicsSettingsWidget::onEnableHardwareFixesChanged); + connect(m_ui.enableHWFixes, &QCheckBox::stateChanged, this, &GraphicsSettingsWidget::updateRendererDependentOptions); + connect(m_ui.textureFiltering, &QComboBox::currentIndexChanged, this, &GraphicsSettingsWidget::onTextureFilteringChange); + connect(m_ui.swTextureFiltering, &QComboBox::currentIndexChanged, this, &GraphicsSettingsWidget::onSWTextureFilteringChange); updateRendererDependentOptions(); - // only allow disabling readbacks for per-game settings, it's too dangerous - m_ui.disableHardwareReadbacks->setEnabled(m_dialog->isPerGameSettings()); +#ifndef PCSX2_DEVBUILD + if (!m_dialog->isPerGameSettings()) + { + // Only allow disabling readbacks for per-game settings, it's too dangerous. + m_ui.advancedDebugFormLayout->removeRow(2); + m_ui.gsDownloadMode = nullptr; - // allow Texture Offset for per-game settings only - m_ui.textureOffsetX->setEnabled(m_dialog->isPerGameSettings()); - m_ui.textureOffsetY->setEnabled(m_dialog->isPerGameSettings()); - - // allow Skipdraw Range for per-game settings only - m_ui.skipDrawStart->setEnabled(m_dialog->isPerGameSettings()); - m_ui.skipDrawEnd->setEnabled(m_dialog->isPerGameSettings()); + // Remove texture offset and skipdraw range for global settings. + m_ui.upscalingFixesLayout->removeRow(2); + m_ui.hardwareFixesLayout->removeRow(2); + m_ui.hardwareFixesLayout->removeRow(1); + m_ui.skipDrawStart = nullptr; + m_ui.skipDrawEnd = nullptr; + m_ui.textureOffsetX = nullptr; + m_ui.textureOffsetY = nullptr; + } +#endif // Display tab { @@ -304,7 +359,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* dialog->registerWidgetHelp(m_ui.DisableInterlaceOffset, tr("Disable Interlace Offset"), tr("Unchecked"), tr("Disables interlacing offset which may reduce blurring in some situations.")); - dialog->registerWidgetHelp(m_ui.bilinearFiltering, tr("Bilinear Filtering"), tr("Checked"), + dialog->registerWidgetHelp(m_ui.bilinearFiltering, tr("Bilinear Filtering"), tr("Bilinear (Smooth)"), tr("Enables bilinear post processing filter. Smooths the overall picture as it is displayed on the screen. Corrects positioning between pixels.")); dialog->registerWidgetHelp(m_ui.PCRTCOffsets, tr("Screen Offsets"), tr("Unchecked"), @@ -318,6 +373,12 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* dialog->registerWidgetHelp(m_ui.PCRTCAntiBlur, tr("Anti-Blur"), tr("Checked"), tr("Enables internal Anti-Blur hacks. Less accurate to PS2 rendering but will make a lot of games look less blurry.")); + + dialog->registerWidgetHelp(m_ui.vsync, tr("VSync"), tr("Unchecked"), + tr("Enable this option to match PCSX2's refresh rate with your current monitor or screen. VSync is automatically disabled when it is not possible (eg. running at non-100% speed).")); + + dialog->registerWidgetHelp(m_ui.integerScaling, tr("Integer Scaling"), tr("Unchecked"), + tr("Adds padding to the display area to ensure that the ratio between pixels on the host to pixels in the console is an integer number. May result in a sharper image in some 2D games.")); } // Rendering tab @@ -346,18 +407,10 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* "The higher the setting, the more blending is emulated in the shader accurately, and the higher the speed penalty will be. " "Do note that Direct3D's blending is reduced in capability compared to OpenGL/Vulkan")); - dialog->registerWidgetHelp(m_ui.texturePreloading, tr("Texture Preloading"), tr(""), + dialog->registerWidgetHelp(m_ui.texturePreloading, tr("Texture Preloading"), tr("Full (Hash Cache)"), tr("Uploads entire textures at once instead of small pieces, avoiding redundant uploads when possible. " "Improves performance in most games, but can make a small selection slower.")); - dialog->registerWidgetHelp(m_ui.accurateDATE, tr("Accurate DestinationAlpha Test"), tr("Checked"), - tr("Implement a more accurate algorithm to compute GS destination alpha testing. " - "It improves shadow and transparency rendering.")); - - dialog->registerWidgetHelp(m_ui.conservativeBufferAllocation, tr("Conservative Buffer Allocation"), tr("Checked"), - tr("Disabled: Reserves a larger framebuffer to prevent FMV flickers. Increases GPU/memory requirements. " - "Disabling this can amplify stuttering due to low RAM/VRAM.")); - dialog->registerWidgetHelp(m_ui.gpuPaletteConversion, tr("GPU Palette Conversion"), tr("Unchecked"), tr("When enabled GPU converts colormap-textures, otherwise the CPU will. " "It is a trade-off between GPU and CPU.")); @@ -367,6 +420,14 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* "to your games. However IF you have ENABLED this, you WILL DISABLE AUTOMATIC " "SETTINGS and you can re-enable automatic settings by unchecking this option.")); + dialog->registerWidgetHelp(m_ui.spinCPUDuringReadbacks, tr("Spin CPU During Readbacks"), tr("Unchecked"), + tr("Does useless work on the CPU during readbacks to prevent it from going to into powersave modes. " + "May improve performance but with a significant increase in power usage.")); + + dialog->registerWidgetHelp(m_ui.spinGPUDuringReadbacks, tr("Spin GPU During Readbacks"), tr("Unchecked"), + tr("Submits useless work to the GPU during readbacks to prevent it from going into powersave modes. " + "May improve performance but with a significant increase in power usage.")); + // Software dialog->registerWidgetHelp(m_ui.extraSWThreads, tr("Extra Rendering Threads"), tr("2 threads"), tr("Number of rendering threads: 0 for single thread, 2 or more for multithread (1 is for debugging). " @@ -377,9 +438,6 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* tr("Force a primitive flush when a framebuffer is also an input texture. " "Fixes some processing effects such as the shadows in the Jak series and radiosity in GTA:SA.")); - dialog->registerWidgetHelp(m_ui.swAA1, tr("Edge Anti-Aliasing"), tr("Checked"), - tr("Internal GS feature. Reduces edge aliasing of lines and triangles when the game requests it.")); - dialog->registerWidgetHelp(m_ui.swMipmap, tr("Mipmapping"), tr("Checked"), tr("Enables mipmapping, which some games require to render correctly.")); } @@ -471,7 +529,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* "the GPU has more time to complete it (this is NOT frame skipping). Can smooth our frame time fluctuations when the CPU/GPU are near maximum " "utilization, but makes frame pacing more inconsistent and can increase input lag.")); - dialog->registerWidgetHelp(m_ui.disableHardwareReadbacks, tr("Disable Hardware Readbacks"), tr("Unchecked"), + dialog->registerWidgetHelp(m_ui.gsDownloadMode, tr("GS Download Mode"), tr("Accurate"), tr("Skips synchronizing with the GS thread and host GPU for GS downloads. " "Can result in a large speed boost on slower systems, at the cost of many broken graphical effects. " "If games are broken and you have this option enabled, please disable it first.")); @@ -480,6 +538,20 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget* GraphicsSettingsWidget::~GraphicsSettingsWidget() = default; +void GraphicsSettingsWidget::onTextureFilteringChange() +{ + const QSignalBlocker block(m_ui.swTextureFiltering); + + m_ui.swTextureFiltering->setCurrentIndex(m_ui.textureFiltering->currentIndex()); +} + +void GraphicsSettingsWidget::onSWTextureFilteringChange() +{ + const QSignalBlocker block(m_ui.textureFiltering); + + m_ui.textureFiltering->setCurrentIndex(m_ui.swTextureFiltering->currentIndex()); +} + void GraphicsSettingsWidget::onRendererChanged(int index) { if (m_dialog->isPerGameSettings()) @@ -534,7 +606,7 @@ void GraphicsSettingsWidget::onIntegerScalingChanged() void GraphicsSettingsWidget::onTrilinearFilteringChanged() { const bool forced_bilinear = - (m_dialog->getEffectiveIntValue("EmuCore/GS", "UserHacks_TriFilter", static_cast(TriFiltering::Automatic)) + (m_dialog->getEffectiveIntValue("EmuCore/GS", "TriFilter", static_cast(TriFiltering::Automatic)) >= static_cast(TriFiltering::Forced)); m_ui.textureFiltering->setDisabled(forced_bilinear); } @@ -554,13 +626,6 @@ void GraphicsSettingsWidget::onGpuPaletteConversionChanged(int state) m_ui.anisotropicFiltering->setEnabled(!enabled); } -void GraphicsSettingsWidget::onEnableHardwareFixesChanged() -{ - const bool enabled = (m_ui.enableHWFixes->checkState() == Qt::Checked); - m_ui.hardwareRendererGroup->setTabEnabled(2, enabled); - m_ui.hardwareRendererGroup->setTabEnabled(3, enabled); -} - GSRendererType GraphicsSettingsWidget::getEffectiveRenderer() const { const GSRendererType type = @@ -582,58 +647,20 @@ void GraphicsSettingsWidget::updateRendererDependentOptions() const bool is_hardware = (type == GSRendererType::DX11 || type == GSRendererType::DX12 || type == GSRendererType::OGL || type == GSRendererType::VK || type == GSRendererType::Metal); const bool is_software = (type == GSRendererType::SW); - const int current_tab = m_hardware_renderer_visible ? m_ui.hardwareRendererGroup->currentIndex() : m_ui.softwareRendererGroup->currentIndex(); + const bool hw_fixes = (is_hardware && m_ui.enableHWFixes->checkState() == Qt::Checked); + const int prev_tab = m_ui.tabs->currentIndex(); - // move advanced tab to the correct parent - static constexpr std::array move_tab_names = {{"Display", "OSD", "Advanced"}}; - const std::array move_tab_pointers = {{m_ui.gameDisplayTab, m_ui.osdTab, m_ui.advancedTab}}; - for (size_t i = 0; i < move_tab_pointers.size(); i++) - { - QWidget* tab = move_tab_pointers[i]; - const QString tab_label(tr(move_tab_names[i])); - if (const int index = m_ui.softwareRendererGroup->indexOf(tab); index >= 0 && is_hardware) - m_ui.softwareRendererGroup->removeTab(index); - if (const int index = m_ui.hardwareRendererGroup->indexOf(tab); index >= 0 && is_software) - m_ui.hardwareRendererGroup->removeTab(index); - if (const int index = m_ui.hardwareRendererGroup->indexOf(tab); index < 0 && is_hardware) - m_ui.hardwareRendererGroup->insertTab((i == 0) ? 0 : m_ui.hardwareRendererGroup->count(), tab, tab_label); - if (const int index = m_ui.softwareRendererGroup->indexOf(tab); index < 0 && is_software) - m_ui.softwareRendererGroup->insertTab((i == 0) ? 0 : m_ui.softwareRendererGroup->count(), tab, tab_label); - } + m_ui.tabs->setTabVisible(1, is_hardware); // hw rendering + m_ui.tabs->setTabVisible(2, is_software); // sw rendering + m_ui.tabs->setTabVisible(3, hw_fixes); // hardware fixes + m_ui.tabs->setTabVisible(4, hw_fixes); // upscaling fixes + m_ui.tabs->setTabVisible(5, is_hardware); // texture replacement - if (m_hardware_renderer_visible != is_hardware) - { - m_ui.hardwareRendererGroup->setVisible(is_hardware); - if (!is_hardware) - { - m_ui.verticalLayout->removeWidget(m_ui.hardwareRendererGroup); - } - else - { - // map first two tabs over, skip hacks - m_ui.verticalLayout->insertWidget(1, m_ui.hardwareRendererGroup); - m_ui.hardwareRendererGroup->setCurrentIndex((current_tab < 2) ? current_tab : (current_tab + 3)); - } - - m_hardware_renderer_visible = is_hardware; - } - - if (m_software_renderer_visible != is_software) - { - m_ui.softwareRendererGroup->setVisible(is_software); - if (is_hardware) - { - m_ui.verticalLayout->removeWidget(m_ui.softwareRendererGroup); - } - else - { - // software has no hacks tabs - m_ui.verticalLayout->insertWidget(1, m_ui.softwareRendererGroup); - m_ui.softwareRendererGroup->setCurrentIndex((current_tab >= 5) ? (current_tab - 3) : (current_tab >= 2 ? 1 : current_tab)); - } - - m_software_renderer_visible = is_software; - } + // move back to the renderer if we're on one of the now-hidden tabs + if (is_software && (prev_tab == 1 || (prev_tab >= 2 && prev_tab <= 5))) + m_ui.tabs->setCurrentIndex(2); + else if (is_hardware && prev_tab == 2) + m_ui.tabs->setCurrentIndex(1); m_ui.overrideTextureBarriers->setDisabled(is_sw_dx); m_ui.overrideGeometryShader->setDisabled(is_sw_dx); @@ -730,8 +757,4 @@ void GraphicsSettingsWidget::updateRendererDependentOptions() m_ui.fullscreenModes->setCurrentIndex(m_ui.fullscreenModes->count() - 1); } } - - m_ui.enableHWFixes->setEnabled(is_hardware); - if (is_hardware) - onEnableHardwareFixesChanged(); } diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.h b/pcsx2-qt/Settings/GraphicsSettingsWidget.h index 5521505742..409c5163b7 100644 --- a/pcsx2-qt/Settings/GraphicsSettingsWidget.h +++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.h @@ -35,9 +35,10 @@ Q_SIGNALS: void fullscreenModesChanged(const QStringList& modes); private Q_SLOTS: + void onTextureFilteringChange(); + void onSWTextureFilteringChange(); void onRendererChanged(int index); void onAdapterChanged(int index); - void onEnableHardwareFixesChanged(); void onIntegerScalingChanged(); void onTrilinearFilteringChanged(); void onGpuPaletteConversionChanged(int state); diff --git a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui index c4277de497..89c9a12090 100644 --- a/pcsx2-qt/Settings/GraphicsSettingsWidget.ui +++ b/pcsx2-qt/Settings/GraphicsSettingsWidget.ui @@ -6,8 +6,8 @@ 0 0 - 657 - 890 + 658 + 476 @@ -56,7 +56,7 @@ - + 0 @@ -149,6 +149,11 @@ + + + Automatic (Default) + + None @@ -186,19 +191,24 @@ - Automatic (Default) + Adaptive (Top Field First) + + + + + Adaptive (Bottom Field First) - + Zoom: - + % @@ -211,14 +221,14 @@ - + Stretch Height: - + % @@ -231,17 +241,24 @@ - + - Offset: + Crop: - - + + - + + + Left: + + + + + px @@ -253,12 +270,46 @@ - x + Top: - + + + px + + + 1000 + + + + + + + Right: + + + + + + + px + + + 1000 + + + + + + + Bottom: + + + + + px @@ -269,58 +320,51 @@ - + - - - - Sync To Host Refresh (VSync) - - - - - - - Bilinear Filtering - - - - - - - Internal Resolution Screenshots - - - - - - - Integer Upscaling - - - - - - - Show Overscan - - - - + Screen Offsets - - + + - Disable Interlace Offset + Integer Upscaling - + + + + VSync + + + + + + + Show Overscan + + + + + + + Enable Widescreen Patches + + + + + + + Enable No-Interlacing Patches + + + + Anti-Blur @@ -330,8 +374,41 @@ + + + + Disable Interlace Offset + + + + + + + Bilinear Filtering: + + + + + + + + None + + + + + Bilinear (Smooth) + + + + + Bilinear (Sharp) + + + + @@ -347,48 +424,7 @@ - - - - Native (PS2) - - - - - 2x Native (~720p) - - - - - 3x Native (~1080p) - - - - - 4x Native (~1440p/2K) - - - - - 5x Native (~1620p) - - - - - 6x Native (~2160p/4K) - - - - - 7x Native (~2520p) - - - - - 8x Native (~2880p) - - - + @@ -601,38 +637,6 @@ - - - - - - GPU Palette Conversion - - - - - - - Conservative Buffer Allocation - - - - - - - Accurate Destination Alpha Test - - - - - - - Manual Hardware Renderer Fixes - - - - - @@ -659,13 +663,127 @@ + + + + + + GPU Palette Conversion + + + + + + + Manual Hardware Renderer Fixes + + + + + + + Spin GPU During Readbacks + + + + + + + Spin CPU During Readbacks + + + + + + + + + + Rendering + + + + + + Texture Filtering: + + + + + + + true + + + + 0 + 0 + + + + Qt::LeftToRight + + + + Nearest + + + + + Bilinear (Forced) + + + + + Bilinear (PS2) + + + + + Bilinear (Forced excluding sprite) + + + + + + + + Extra Rendering Threads: + + + + + + + threads + + + + + + + + + Mipmapping + + + + + + + Auto Flush + + + + + Hardware Fixes - + @@ -692,91 +810,6 @@ - - - - Skipdraw Range: - - - - - - - - - 10000 - - - - - - - 10000 - - - - - - - - - - - Auto Flush - - - - - - - Frame Buffer Conversion - - - - - - - Disable Depth Emulation - - - - - - - Memory Wrapping - - - - - - - Disable Safe Features - - - - - - - Preload Frame Data - - - - - - - Disable Partial Invalidation - - - - - - - Texture Inside RT - - - - - @@ -843,13 +876,130 @@ + + + + Skipdraw Range: + + + + + + + + + 10000 + + + + + + + 10000 + + + + + + + + + + + Auto Flush + + + + + + + Frame Buffer Conversion + + + + + + + Disable Depth Emulation + + + + + + + Memory Wrapping + + + + + + + Disable Safe Features + + + + + + + Preload Frame Data + + + + + + + Disable Partial Invalidation + + + + + + + Texture Inside RT + + + + + + + + + 0 (Disabled) + + + 0 + + + + 0 (Disabled) + + + + + 1 (Normal) + + + + + 2 (Aggressive) + + + + + + + + Software CLUT Render: + + + Upscaling Fixes - + @@ -908,16 +1058,16 @@ - + Texture Offsets: - + - + X: @@ -931,7 +1081,7 @@ - + Y: @@ -1084,114 +1234,136 @@ - + - OSD + Post-Processing - + - + - On-Screen Display + Sharpening/Anti-Aliasing - + - + - OSD Scale: + Contrast Adaptive Sharpening: - - - % - - - 100 - - - 500 - - - - - - - - - Show Notifications - + + + + + + Disabled + + + + + Sharpen Only (Internal Resolution) + + + + + Sharpen and Resize (Display Resolution) + + - - - - Show Speed - - - - - - - Show FPS - - - - - - - Show Resolution - - - - - - - Show CPU Usage - - - - - - - Show GPU Usage - - - - - - - Show Statistics - - - - - - - Show Indicators - - + + + + + + Sharpness: + + + + + + + % + + + 100 + + + 50 + + + + + + + + FXAA + + + - + - Post-Processing + Filters - + + + + TV Shader: + + + + + + + + None + + + + + Scanline Filter + + + + + Diagonal Filter + + + + + Triangular Filter + + + + + Wave Filter + + + + + Lottes CRT + + + + + Shade Boost - + @@ -1259,53 +1431,142 @@ - - + + + + + + + Qt::Vertical + + + + 20 + 111 + + + + + + + + + OSD + + + + + + On-Screen Display + + + + - FXAA + OSD Scale: - - - - TV Shader + + + + % + + + 100 + + + 500 - - - - - None - + + + + + + Show Indicators + + - - - Scanline Filter - + + + + Show Resolution + + - - - Diagonal Filter - + + + + Show Inputs + + - - - Triangular Filter - + + + + Show GPU Usage + + - - - Wave Filter - + + + + Show Settings + + - - - Lottes CRT - + + + + Show FPS + + - + + + + Show Notifications + + + + + + + Show Statistics + + + + + + + Show CPU Usage + + + + + + + Show Speed + + + + + + + Warn About Unsafe Settings + + + + + + + Show Frame Times + + + + @@ -1335,7 +1596,7 @@ Debug Options - + @@ -1388,8 +1649,15 @@ - + + + + + Skip Presenting Duplicate Frames + + + @@ -1397,6 +1665,13 @@ + + + + Disable Framebuffer Fetch + + + @@ -1411,37 +1686,16 @@ - - - - Disable Framebuffer Fetch - - - - - - - Skip Presenting Duplicate Frames - - - - - - - Disable Hardware Readbacks - - - - + GS Dump Compression: - + @@ -1460,6 +1714,37 @@ + + + + Hardware Download Mode: + + + + + + + + Accurate (Recommended) + + + + + Disable Readbacks (Synchronize GS Thread) + + + + + Unsynchronized (Non-Deterministic) + + + + + Disabled (Ignore Transfers) + + + + @@ -1480,59 +1765,6 @@ - - - - true - - - - Rendering - - - - - - Extra Rendering Threads: - - - - - - - threads - - - - - - - - - Auto Flush - - - - - - - Mipmapping - - - - - - - Edge Anti-Aliasing - - - - - - - - - diff --git a/pcsx2-qt/Settings/HotkeySettingsWidget.cpp b/pcsx2-qt/Settings/HotkeySettingsWidget.cpp index 90d800bef3..4c25ba7b7f 100644 --- a/pcsx2-qt/Settings/HotkeySettingsWidget.cpp +++ b/pcsx2-qt/Settings/HotkeySettingsWidget.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include HotkeySettingsWidget::HotkeySettingsWidget(QWidget* parent, ControllerSettingsDialog* dialog) : QWidget(parent) @@ -41,11 +41,16 @@ void HotkeySettingsWidget::createUi() QGridLayout* layout = new QGridLayout(this); layout->setContentsMargins(0, 0, 0, 0); - m_tab_widget = new QTabWidget(this); + m_scroll_area = new QScrollArea(this); + m_container = new QWidget(m_scroll_area); + m_layout = new QVBoxLayout(m_container); + m_scroll_area->setWidget(m_container); + m_scroll_area->setWidgetResizable(true); + m_scroll_area->setBackgroundRole(QPalette::Base); createButtons(); - layout->addWidget(m_tab_widget, 0, 0, 1, 1); + layout->addWidget(m_scroll_area, 0, 0, 1, 1); setLayout(layout); } @@ -55,31 +60,39 @@ void HotkeySettingsWidget::createButtons() const std::vector hotkeys(InputManager::GetHotkeyList()); for (const HotkeyInfo* hotkey : hotkeys) { - const auto category = qApp->translate("Hotkeys", hotkey->category); + const QString category(qApp->translate("Hotkeys", hotkey->category)); auto iter = m_categories.find(category); if (iter == m_categories.end()) { - QScrollArea* scroll = new QScrollArea(m_tab_widget); - QWidget* container = new QWidget(scroll); - QVBoxLayout* vlayout = new QVBoxLayout(container); + QLabel* label = new QLabel(category, m_container); + QFont label_font(label->font()); + label_font.setPointSizeF(14.0f); + label->setFont(label_font); + m_layout->addWidget(label); + + QLabel* line = new QLabel(m_container); + line->setFrameShape(QFrame::HLine); + line->setFixedHeight(4); + m_layout->addWidget(line); + QGridLayout* layout = new QGridLayout(); layout->setContentsMargins(0, 0, 0, 0); - vlayout->addLayout(layout); - vlayout->addStretch(1); - iter = m_categories.insert(category, Category{container, layout}); - scroll->setWidget(container); - scroll->setWidgetResizable(true); - scroll->setBackgroundRole(QPalette::Base); - scroll->setFrameShape(QFrame::NoFrame); - m_tab_widget->addTab(scroll, category); + m_layout->addLayout(layout); + iter = m_categories.insert(category, layout); } - QWidget* container = iter->container; - QGridLayout* layout = iter->layout; + QGridLayout* layout = *iter; const int target_row = layout->count() / 2; - layout->addWidget(new QLabel(qApp->translate("Hotkeys", hotkey->display_name), container), target_row, 0); - layout->addWidget(new InputBindingWidget(container, m_dialog->getProfileSettingsInterface(), "Hotkeys", hotkey->name), target_row, 1); + QLabel* label = new QLabel(qApp->translate("Hotkeys", hotkey->display_name), m_container); + layout->addWidget(label, target_row, 0); + + InputBindingWidget* bind = new InputBindingWidget(m_container, m_dialog->getProfileSettingsInterface(), "Hotkeys", hotkey->name); + bind->setMinimumWidth(300); + layout->addWidget(bind, target_row, 1); } + + // Fill remaining space. + m_layout->addStretch(1); } diff --git a/pcsx2-qt/Settings/HotkeySettingsWidget.h b/pcsx2-qt/Settings/HotkeySettingsWidget.h index d151e9f4df..647d712249 100644 --- a/pcsx2-qt/Settings/HotkeySettingsWidget.h +++ b/pcsx2-qt/Settings/HotkeySettingsWidget.h @@ -20,8 +20,9 @@ #include #include -class QTabWidget; +class QScrollArea; class QGridLayout; +class QVBoxLayout; class ControllerSettingsDialog; @@ -38,12 +39,9 @@ private: void createButtons(); ControllerSettingsDialog* m_dialog; - QTabWidget* m_tab_widget; + QScrollArea* m_scroll_area = nullptr; + QWidget* m_container = nullptr; + QVBoxLayout* m_layout = nullptr; - struct Category - { - QWidget* container; - QGridLayout* layout; - }; - QMap m_categories; + QMap m_categories; }; diff --git a/pcsx2-qt/Settings/InputBindingDialog.cpp b/pcsx2-qt/Settings/InputBindingDialog.cpp index 9dbd1b13d8..3a6ebeddda 100644 --- a/pcsx2-qt/Settings/InputBindingDialog.cpp +++ b/pcsx2-qt/Settings/InputBindingDialog.cpp @@ -15,7 +15,6 @@ #include "PrecompiledHeader.h" -#include "EmuThread.h" #include "QtHost.h" #include "QtUtils.h" #include "Settings/InputBindingDialog.h" @@ -85,7 +84,7 @@ bool InputBindingDialog::eventFilter(QObject* watched, QEvent* event) if (dx != 0.0f) { InputBindingKey key(InputManager::MakePointerAxisKey(0, InputPointerAxis::WheelX)); - key.negative = (dx < 0.0f); + key.modifier = dx < 0.0f ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key); } @@ -93,7 +92,7 @@ bool InputBindingDialog::eventFilter(QObject* watched, QEvent* event) if (dy != 0.0f) { InputBindingKey key(InputManager::MakePointerAxisKey(0, InputPointerAxis::WheelY)); - key.negative = (dy < 0.0f); + key.modifier = dy < 0.0f ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key); } @@ -116,14 +115,14 @@ bool InputBindingDialog::eventFilter(QObject* watched, QEvent* event) if (std::abs(diff.x()) >= THRESHOLD) { InputBindingKey key(InputManager::MakePointerAxisKey(0, InputPointerAxis::X)); - key.negative = (diff.x() < 0); + key.modifier = diff.x() < 0 ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key); has_one = true; } if (std::abs(diff.y()) >= THRESHOLD) { InputBindingKey key(InputManager::MakePointerAxisKey(0, InputPointerAxis::Y)); - key.negative = (diff.y() < 0); + key.modifier = diff.y() < 0 ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key); has_one = true; } @@ -259,9 +258,10 @@ void InputBindingDialog::saveListToSettings() else { if (!m_bindings.empty()) - QtHost::SetBaseStringListSettingValue(m_section_name.c_str(), m_key_name.c_str(), m_bindings); + Host::SetBaseStringListSettingValue(m_section_name.c_str(), m_key_name.c_str(), m_bindings); else - QtHost::RemoveBaseSettingValue(m_section_name.c_str(), m_key_name.c_str()); + Host::RemoveBaseSettingValue(m_section_name.c_str(), m_key_name.c_str()); + Host::CommitBaseSettingChanges(); g_emu_thread->reloadInputBindings(); } } @@ -291,7 +291,7 @@ void InputBindingDialog::inputManagerHookCallback(InputBindingKey key, float val if (abs_value >= 0.5f) { InputBindingKey key_to_add = key; - key_to_add.negative = (value < 0.0f); + key_to_add.modifier = value < 0.0f ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key_to_add); } } diff --git a/pcsx2-qt/Settings/InputBindingWidget.cpp b/pcsx2-qt/Settings/InputBindingWidget.cpp index e6d13f87b7..eecc820552 100644 --- a/pcsx2-qt/Settings/InputBindingWidget.cpp +++ b/pcsx2-qt/Settings/InputBindingWidget.cpp @@ -28,7 +28,6 @@ #include "pcsx2/GS/GSIntrin.h" // _BitScanForward -#include "EmuThread.h" #include "QtHost.h" #include "QtUtils.h" #include "Settings/ControllerSettingsDialog.h" @@ -139,7 +138,7 @@ bool InputBindingWidget::eventFilter(QObject* watched, QEvent* event) if (dx != 0.0f) { InputBindingKey key(InputManager::MakePointerAxisKey(0, InputPointerAxis::WheelX)); - key.negative = (dx < 0.0f); + key.modifier = dx < 0.0f ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key); } @@ -147,7 +146,7 @@ bool InputBindingWidget::eventFilter(QObject* watched, QEvent* event) if (dy != 0.0f) { InputBindingKey key(InputManager::MakePointerAxisKey(0, InputPointerAxis::WheelY)); - key.negative = (dy < 0.0f); + key.modifier = dy < 0.0f ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key); } @@ -170,14 +169,14 @@ bool InputBindingWidget::eventFilter(QObject* watched, QEvent* event) if (std::abs(diff.x()) >= THRESHOLD) { InputBindingKey key(InputManager::MakePointerAxisKey(0, InputPointerAxis::X)); - key.negative = (diff.x() < 0); + key.modifier = diff.x() < 0 ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key); has_one = true; } if (std::abs(diff.y()) >= THRESHOLD) { InputBindingKey key(InputManager::MakePointerAxisKey(0, InputPointerAxis::Y)); - key.negative = (diff.y() < 0); + key.modifier = diff.y() < 0 ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key); has_one = true; } @@ -236,7 +235,8 @@ void InputBindingWidget::setNewBinding() } else { - QtHost::SetBaseStringSettingValue(m_section_name.c_str(), m_key_name.c_str(), new_binding.c_str()); + Host::SetBaseStringSettingValue(m_section_name.c_str(), m_key_name.c_str(), new_binding.c_str()); + Host::CommitBaseSettingChanges(); g_emu_thread->reloadInputBindings(); } } @@ -256,7 +256,8 @@ void InputBindingWidget::clearBinding() } else { - QtHost::RemoveBaseSettingValue(m_section_name.c_str(), m_key_name.c_str()); + Host::RemoveBaseSettingValue(m_section_name.c_str(), m_key_name.c_str()); + Host::CommitBaseSettingChanges(); g_emu_thread->reloadInputBindings(); } reloadBinding(); @@ -356,7 +357,7 @@ void InputBindingWidget::inputManagerHookCallback(InputBindingKey key, float val if (abs_value >= 0.5f) { InputBindingKey key_to_add = key; - key_to_add.negative = (value < 0.0f); + key_to_add.modifier = value < 0.0f ? InputModifier::Negate : InputModifier::None; m_new_bindings.push_back(key_to_add); } } @@ -413,7 +414,8 @@ void InputVibrationBindingWidget::setKey(ControllerSettingsDialog* dialog, std:: void InputVibrationBindingWidget::clearBinding() { m_binding = {}; - QtHost::RemoveBaseSettingValue(m_section_name.c_str(), m_key_name.c_str()); + Host::RemoveBaseSettingValue(m_section_name.c_str(), m_key_name.c_str()); + Host::CommitBaseSettingChanges(); g_emu_thread->reloadInputBindings(); setText(QString()); } @@ -448,7 +450,8 @@ void InputVibrationBindingWidget::onClicked() const QString new_value(input_dialog.textValue()); m_binding = new_value.toStdString(); - QtHost::SetBaseStringSettingValue(m_section_name.c_str(), m_key_name.c_str(), m_binding.c_str()); + Host::SetBaseStringSettingValue(m_section_name.c_str(), m_key_name.c_str(), m_binding.c_str()); + Host::CommitBaseSettingChanges(); setText(new_value); } diff --git a/pcsx2-qt/Settings/InterfaceSettingsWidget.cpp b/pcsx2-qt/Settings/InterfaceSettingsWidget.cpp index 478b66c562..a265d286e4 100644 --- a/pcsx2-qt/Settings/InterfaceSettingsWidget.cpp +++ b/pcsx2-qt/Settings/InterfaceSettingsWidget.cpp @@ -30,6 +30,8 @@ static const char* THEME_NAMES[] = { QT_TRANSLATE_NOOP("InterfaceSettingsWidget", "Baby Pastel (Pink) [Light]"), QT_TRANSLATE_NOOP("InterfaceSettingsWidget", "PCSX2 (White/Blue) [Light]"), QT_TRANSLATE_NOOP("InterfaceSettingsWidget", "Scarlet Devil (Red/Purple) [Dark]"), + QT_TRANSLATE_NOOP("InterfaceSettingsWidget", "Ruby (Black/Red) [Dark]"), + QT_TRANSLATE_NOOP("InterfaceSettingsWidget", "Custom.qss [Drop in PCSX2 Folder]"), nullptr}; static const char* THEME_VALUES[] = { @@ -41,6 +43,8 @@ static const char* THEME_VALUES[] = { "BabyPastel", "PCSX2Blue", "ScarletDevilRed", + "Ruby", + "Custom", nullptr}; InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsDialog* dialog, QWidget* parent) @@ -50,11 +54,11 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsDialog* dialog, QWidget m_ui.setupUi(this); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.inhibitScreensaver, "UI", "InhibitScreensaver", true); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.inhibitScreensaver, "EmuCore", "InhibitScreensaver", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.confirmShutdown, "UI", "ConfirmShutdown", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.saveStateOnShutdown, "EmuCore", "SaveStateOnShutdown", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.pauseOnStart, "UI", "StartPaused", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.pauseOnFocusLoss, "UI", "PauseOnFocusLoss", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.backupSaveStates, "EmuCore", "BackupSavestate", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.startFullscreen, "UI", "StartFullscreen", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.doubleClickTogglesFullscreen, "UI", "DoubleClickTogglesFullscreen", @@ -69,11 +73,16 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsDialog* dialog, QWidget MainWindow::DEFAULT_THEME_NAME); connect(m_ui.theme, QOverload::of(&QComboBox::currentIndexChanged), [this]() { emit themeChanged(); }); - dialog->registerWidgetHelp( - m_ui.inhibitScreensaver, tr("Inhibit Screensaver"), tr("Checked"), - tr("Prevents the screen saver from activating and the host from sleeping while emulation is running.")); + // Per-game settings is special, we don't want to bind it if we're editing per-game settings. + m_ui.perGameSettings->setEnabled(!dialog->isPerGameSettings()); + if (!dialog->isPerGameSettings()) + { + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.pauseOnStart, "UI", "StartPaused", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.perGameSettings, "EmuCore", "EnablePerGameSettings", true); + connect(m_ui.perGameSettings, &QCheckBox::stateChanged, g_emu_thread, &EmuThread::reloadGameSettings); + } - if (AutoUpdaterDialog::isSupported()) + if (!dialog->isPerGameSettings() && AutoUpdaterDialog::isSupported()) { SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.autoUpdateEnabled, "AutoUpdater", "CheckAtStartup", true); dialog->registerWidgetHelp(m_ui.autoUpdateEnabled, tr("Enable Automatic Update Check"), tr("Checked"), @@ -93,6 +102,25 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsDialog* dialog, QWidget m_ui.automaticUpdaterGroup->hide(); } +#ifdef ENABLE_DISCORD_PRESENCE + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.discordPresence, "EmuCore", "EnableDiscordPresence", false); +#else + m_ui.discordPresence->setEnabled(false); +#endif + + if (dialog->isPerGameSettings()) + { + // language/theme doesn't make sense to have in per-game settings + m_ui.verticalLayout->removeWidget(m_ui.preferencesGroup); + m_ui.preferencesGroup->hide(); + + // start paused doesn't make sense, because settings are applied after ELF load. + m_ui.pauseOnStart->setEnabled(false); + } + + dialog->registerWidgetHelp( + m_ui.inhibitScreensaver, tr("Inhibit Screensaver"), tr("Checked"), + tr("Prevents the screen saver from activating and the host from sleeping while emulation is running.")); dialog->registerWidgetHelp( m_ui.confirmShutdown, tr("Confirm Shutdown"), tr("Checked"), tr("Determines whether a prompt will be displayed to confirm shutting down the virtual machine " @@ -105,6 +133,8 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsDialog* dialog, QWidget dialog->registerWidgetHelp(m_ui.pauseOnFocusLoss, tr("Pause On Focus Loss"), tr("Unchecked"), tr("Pauses the emulator when you minimize the window or switch to another application, " "and unpauses when you switch back.")); + dialog->registerWidgetHelp(m_ui.backupSaveStates, tr("Create Save State Backups"), tr("Unchecked"), + tr("Creates a backup copy of a save state if it already exists when the save is created. The backup copy has a .backup suffix.")); dialog->registerWidgetHelp(m_ui.startFullscreen, tr("Start Fullscreen"), tr("Unchecked"), tr("Automatically switches to fullscreen mode when a game is started.")); dialog->registerWidgetHelp(m_ui.hideMouseCursor, tr("Hide Cursor In Fullscreen"), tr("Checked"), @@ -115,6 +145,11 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsDialog* dialog, QWidget dialog->registerWidgetHelp( m_ui.hideMainWindow, tr("Hide Main Window When Running"), tr("Unchecked"), tr("Hides the main window (with the game list) when a game is running, requires Render To Separate Window to be enabled.")); + dialog->registerWidgetHelp(m_ui.perGameSettings, tr("Enable Per-Game Settings"), tr("Checked"), + tr("When enabled, custom per-game settings will be appled. Disable to always use the global configuration.")); + dialog->registerWidgetHelp( + m_ui.discordPresence, tr("Enable Discord Presence"), tr("Unchecked"), + tr("Shows the game you are currently playing as part of your profile in Discord.")); // Not yet used, disable the options m_ui.language->setDisabled(true); diff --git a/pcsx2-qt/Settings/InterfaceSettingsWidget.ui b/pcsx2-qt/Settings/InterfaceSettingsWidget.ui index d12819dbe4..bb7519608d 100644 --- a/pcsx2-qt/Settings/InterfaceSettingsWidget.ui +++ b/pcsx2-qt/Settings/InterfaceSettingsWidget.ui @@ -32,6 +32,13 @@ Behaviour + + + + Pause On Focus Loss + + + @@ -39,31 +46,45 @@ - + + + + Save State On Shutdown + + + + Pause On Start - - - - Pause On Focus Loss - - - - + Confirm Shutdown - - + + - Save State On Shutdown + Create Save State Backups + + + + + + + Enable Discord Presence + + + + + + + Enable Per-Game Settings @@ -75,58 +96,54 @@ Game Display - - - - - - - Disable Window Resizing - - - - - - - Start Fullscreen - - - - - - - Double-Click Toggles Fullscreen - - - - - - - Render To Separate Window - - - - - - - Hide Cursor In Fullscreen - - - - - - - Hide Main Window When Running - - - - + + + + + Start Fullscreen + + + + + + + Double-Click Toggles Fullscreen + + + + + + + Render To Separate Window + + + + + + + Hide Main Window When Running + + + + + + + Disable Window Resizing + + + + + + + Hide Cursor In Fullscreen + + - + Preferences diff --git a/pcsx2-qt/Settings/MemoryCardConvertDialog.cpp b/pcsx2-qt/Settings/MemoryCardConvertDialog.cpp new file mode 100644 index 0000000000..67abbf4f85 --- /dev/null +++ b/pcsx2-qt/Settings/MemoryCardConvertDialog.cpp @@ -0,0 +1,310 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#include "MemoryCardConvertDialog.h" + +#include +#include +#include + +#include "common/Path.h" +#include "common/StringUtil.h" + +#include "pcsx2/System.h" + +MemoryCardConvertDialog::MemoryCardConvertDialog(QWidget* parent, QString selectedCard) + : QDialog(parent) +{ + m_ui.setupUi(this); + m_selectedCard = selectedCard; + std::optional srcCardInfo = FileMcd_GetCardInfo(m_selectedCard.toStdString()); + + if (srcCardInfo.has_value()) + { + m_srcCardInfo = srcCardInfo.value(); + } + + isSetup = SetupPicklist(); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + m_ui.progressBar->setRange(0, 100); + m_ui.progressBar->setValue(0); + + connect(m_ui.conversionTypeSelect, &QComboBox::currentIndexChanged, this, [this]() + { + switch (m_srcCardInfo.type) + { + case MemoryCardType::File: + SetType(MemoryCardType::Folder, MemoryCardFileType::Unknown, "Uses a folder on your PC filesystem, instead of a file. Infinite capacity, while keeping the same compatibility as an 8 MB memory card."); + break; + case MemoryCardType::Folder: + switch (m_ui.conversionTypeSelect->currentData().toInt()) + { + case 8: + SetType(MemoryCardType::File, MemoryCardFileType::PS2_8MB, "A standard, 8 MB memory card. Most compatible, but smallest capacity."); + break; + case 16: + SetType(MemoryCardType::File, MemoryCardFileType::PS2_16MB, "2x larger as a standard memory card. May have some compatibility issues."); + break; + case 32: + SetType(MemoryCardType::File, MemoryCardFileType::PS2_32MB, "4x larger than a standard memory card. Likely to have compatibility issues."); + break; + case 64: + SetType(MemoryCardType::File, MemoryCardFileType::PS2_64MB, "8x larger than a standard memory card. Likely to have compatibility issues."); + break; + default: + QMessageBox::critical(this, tr("Convert Memory Card Failed"), tr("Invalid MemoryCardType")); + return; + } + break; + default: + QMessageBox::critical(this, tr("Convert Memory Card Failed"), tr("Invalid MemoryCardType")); + return; + } + } + ); + + disconnect(m_ui.buttonBox, &QDialogButtonBox::accepted, this, nullptr); + + connect(m_ui.buttonBox->button(QDialogButtonBox::Ok), &QPushButton::clicked, this, &MemoryCardConvertDialog::ConvertCard); + connect(m_ui.buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, this, &MemoryCardConvertDialog::close); +} + +MemoryCardConvertDialog::~MemoryCardConvertDialog() = default; + +bool MemoryCardConvertDialog::IsSetup() +{ + return isSetup; +} + +void MemoryCardConvertDialog::onStatusUpdated() +{ + +} + +void MemoryCardConvertDialog::onProgressUpdated(int value, int range) +{ + m_ui.progressBar->setRange(0, range); + m_ui.progressBar->setValue(value); +} + +void MemoryCardConvertDialog::onThreadFinished() +{ + QMessageBox::information(this, tr("Conversion Complete"), tr("Memory card \"%1\" converted to \"%2\"").arg(m_selectedCard).arg(m_destCardName)); + accept(); +} + +void MemoryCardConvertDialog::StartThread() +{ + m_thread = std::make_unique(this, m_srcCardInfo.type, m_fileType, m_selectedCard.toStdString(), m_destCardName.toStdString()); + connect(m_thread.get(), &MemoryCardConvertWorker::statusUpdated, this, &MemoryCardConvertDialog::onStatusUpdated); + connect(m_thread.get(), &MemoryCardConvertWorker::progressUpdated, this, &MemoryCardConvertDialog::onProgressUpdated); + connect(m_thread.get(), &MemoryCardConvertWorker::threadFinished, this, &MemoryCardConvertDialog::onThreadFinished); + m_thread->start(); + UpdateEnabled(); +} + +void MemoryCardConvertDialog::CancelThread() +{ + if (!m_thread) + { + return; + } + + m_thread->requestInterruption(); + m_thread->join(); + m_thread.reset(); +} + +void MemoryCardConvertDialog::UpdateEnabled() +{ + if (m_thread) + { + m_ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + m_ui.buttonBox->button(QDialogButtonBox::Cancel)->setEnabled(false); + } +} + +bool MemoryCardConvertDialog::SetupPicklist() +{ + FileSystem::FindResultsArray rootDir; + size_t sizeBytes = 0; + bool typeSet = false; + + m_ui.conversionTypeSelect->clear(); + + switch (m_srcCardInfo.type) + { + case MemoryCardType::File: + m_ui.conversionTypeSelect->addItems({"Folder"}); + SetType(MemoryCardType::Folder, MemoryCardFileType::Unknown, "Uses a folder on your PC filesystem, instead of a file. Infinite capacity, while keeping the same compatibility as an 8 MB memory card."); + break; + case MemoryCardType::Folder: + // Compute which file types should be allowed. + FileSystem::FindFiles(m_srcCardInfo.path.c_str(), "*", FLAGS, &rootDir); + + for (auto dirEntry : rootDir) + { + const std::string_view fileName = Path::GetFileName(dirEntry.FileName); + + if (fileName.size() >= 7 && fileName.substr(0, 7).compare("_pcsx2_") == 0) + { + continue; + } + else if (dirEntry.Attributes & FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY) + { + sizeBytes += 512; + } + else + { + size_t toAdd = static_cast(dirEntry.Size + (1024 - (dirEntry.Size % 1024))); + sizeBytes += toAdd + 512; // The file content needs to be added, PLUS a directory entry + } + } + + // Finally, round up to the nearest erase block. + sizeBytes += (512 * 16) - (sizeBytes % (512 * 16)); + + if (sizeBytes < CardCapacity::_8_MB) + { + m_ui.conversionTypeSelect->addItem("8 MB File", 8); + + if (!typeSet) + { + SetType_8(); + typeSet = true; + } + } + + if (sizeBytes < CardCapacity::_16_MB) + { + m_ui.conversionTypeSelect->addItem("16 MB File", 16); + + if (!typeSet) + { + SetType_16(); + typeSet = true; + } + } + + if (sizeBytes < CardCapacity::_32_MB) + { + m_ui.conversionTypeSelect->addItem("32 MB File", 32); + + if (!typeSet) + { + SetType_32(); + typeSet = true; + } + } + + if (sizeBytes < CardCapacity::_64_MB) + { + m_ui.conversionTypeSelect->addItem("64 MB File", 64); + + if (!typeSet) + { + SetType_64(); + typeSet = true; + } + } + + if (!typeSet) + { + QMessageBox::critical(this, tr("Cannot Convert Memory Card"), tr("Your folder memory card has too much data inside it to be converted to a file memory card. The largest supported file memory card has a capacity of 64 MB. To convert your folder memory card, you must remove game folders until its size is 64 MB or less.")); + return false; + } + + break; + default: + QMessageBox::critical(this, tr("Convert Memory Card Failed"), tr("Invalid MemoryCardType")); + return false; + } + + return true; +} + +void MemoryCardConvertDialog::ConvertCard() +{ + if (m_thread) + { + CancelThread(); + } + else + { + QString baseName = m_selectedCard; + + // Get our destination file name + size_t extensionPos = baseName.lastIndexOf(".ps2", -1); + // Strip the extension off of it + baseName.replace(extensionPos, 4, ""); + // Add _converted to the end of it + baseName.append("_converted"); + + size_t num = 0; + QString destName = baseName; + destName.append(".ps2"); + + // If a match is found, revert back to the base name, add a number and the extension, and try again. + // Keep incrementing the number until we get a unique result. + while (m_srcCardInfo.type == MemoryCardType::File ? FileSystem::DirectoryExists(Path::Combine(EmuFolders::MemoryCards, destName.toStdString()).c_str()) : FileSystem::FileExists(Path::Combine(EmuFolders::MemoryCards, destName.toStdString()).c_str())) + { + destName = baseName; + destName.append(StringUtil::StdStringFromFormat("_%02d.ps2", ++num).c_str()); + } + + m_destCardName = destName; + StartThread(); + } +} + +void MemoryCardConvertDialog::ConvertCallback() +{ + Console.WriteLn("%s() Finished", __FUNCTION__); +} + +void MemoryCardConvertDialog::SetType(MemoryCardType type, MemoryCardFileType fileType, const QString& description) +{ + m_type = type; + m_fileType = fileType; + m_ui.conversionTypeDescription->setPlainText(description); +} + +void MemoryCardConvertDialog::SetType_8() +{ + SetType(MemoryCardType::File, MemoryCardFileType::PS2_8MB, "A standard, 8 MB memory card. Most compatible, but smallest capacity."); +} + +void MemoryCardConvertDialog::SetType_16() +{ + SetType(MemoryCardType::File, MemoryCardFileType::PS2_16MB, "2x larger as a standard memory card. May have some compatibility issues."); +} + +void MemoryCardConvertDialog::SetType_32() +{ + SetType(MemoryCardType::File, MemoryCardFileType::PS2_32MB, "4x larger than a standard memory card. Likely to have compatibility issues."); +} + +void MemoryCardConvertDialog::SetType_64() +{ + SetType(MemoryCardType::File, MemoryCardFileType::PS2_64MB, "8x larger than a standard memory card. Likely to have compatibility issues."); +} + +void MemoryCardConvertDialog::SetType_Folder() +{ + SetType(MemoryCardType::Folder, MemoryCardFileType::Unknown, "Uses a folder on your PC filesystem, instead of a file. Infinite capacity, while keeping the same compatibility as an 8 MB memory card."); +} diff --git a/pcsx2-qt/Settings/MemoryCardConvertDialog.h b/pcsx2-qt/Settings/MemoryCardConvertDialog.h new file mode 100644 index 0000000000..fdbe0d3490 --- /dev/null +++ b/pcsx2-qt/Settings/MemoryCardConvertDialog.h @@ -0,0 +1,78 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +#include + +#include "common/FileSystem.h" + +#include "ui_MemoryCardConvertDialog.h" + +#include "MemoryCardConvertWorker.h" + +#include "pcsx2/MemoryCardFile.h" + +class MemoryCardConvertDialog final : public QDialog +{ + Q_OBJECT + +public: + explicit MemoryCardConvertDialog(QWidget* parent, QString selectedCard); + ~MemoryCardConvertDialog(); + + bool IsSetup(); + void onStatusUpdated(); + void onProgressUpdated(int value, int range); + void onThreadFinished(); + +private Q_SLOTS: + void ConvertCard(); + void ConvertCallback(); + +private: + void StartThread(); + void CancelThread(); + void UpdateEnabled(); + bool SetupPicklist(); + void SetType(MemoryCardType type, MemoryCardFileType fileType, const QString& description); + void SetType_8(); + void SetType_16(); + void SetType_32(); + void SetType_64(); + void SetType_Folder(); + + Ui::MemoryCardConvertDialog m_ui; + + bool isSetup = false; + AvailableMcdInfo m_srcCardInfo; + QString m_selectedCard; + QString m_destCardName; + + MemoryCardType m_type = MemoryCardType::File; + MemoryCardFileType m_fileType = MemoryCardFileType::PS2_8MB; + std::unique_ptr m_thread; + + static constexpr u32 FLAGS = FILESYSTEM_FIND_RECURSIVE | FILESYSTEM_FIND_FOLDERS | FILESYSTEM_FIND_FILES; +}; + +// Card capacities computed from freshly formatted superblocks. +namespace CardCapacity +{ + static constexpr size_t _8_MB = 0x1f40 * 512 * 2; //(0x1fc7 - 0x29) * 2 * 512; + static constexpr size_t _16_MB = 0x3e80 * 512 * 2; //(0x3fa7 - 0x49) * 2 * 512; + static constexpr size_t _32_MB = 0x7d00 * 512 * 2; //(0x7f67 - 0x89) * 2 * 512; + static constexpr size_t _64_MB = 0xfde8 * 512 * 2; //(0xfee7 - 0x0109) * 2 * 512; +} diff --git a/pcsx2-qt/Settings/MemoryCardConvertDialog.ui b/pcsx2-qt/Settings/MemoryCardConvertDialog.ui new file mode 100644 index 0000000000..0b94100260 --- /dev/null +++ b/pcsx2-qt/Settings/MemoryCardConvertDialog.ui @@ -0,0 +1,181 @@ + + + MemoryCardConvertDialog + + + true + + + + 0 + 0 + 440 + 320 + + + + + 0 + 0 + + + + + 440 + 320 + + + + + 440 + 320 + + + + Convert Memory Card + + + false + + + false + + + + + 10 + 10 + 421 + 61 + + + + Conversion Type + + + + + 10 + 30 + 401 + 22 + + + + + 8 MB File + + + + + 16 MB File + + + + + 32 MB File + + + + + 64 MB File + + + + + Folder + + + + + + + + 10 + 150 + 421 + 61 + + + + + 0 + 0 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +</style></head><body style=" font-family:'Segoe UI'; font-size:9pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Note: Converting a memory card creates a COPY of your existing memory card. It does NOT delete, modify, or replace your existing memory card.</p></body></html> + + + + + + 10 + 80 + 421 + 61 + + + + + 0 + 0 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +</style></head><body style=" font-family:'Segoe UI'; font-size:9pt; font-weight:400; font-style:normal;"> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + + 270 + 290 + 156 + 24 + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 220 + 421 + 61 + + + + Progress + + + + + 10 + 30 + 401 + 23 + + + + 24 + + + + + + + diff --git a/pcsx2-qt/Settings/MemoryCardConvertWorker.cpp b/pcsx2-qt/Settings/MemoryCardConvertWorker.cpp new file mode 100644 index 0000000000..77b7aaf63e --- /dev/null +++ b/pcsx2-qt/Settings/MemoryCardConvertWorker.cpp @@ -0,0 +1,164 @@ + +#include "PrecompiledHeader.h" + +#include "MemoryCardConvertWorker.h" + +#include "common/Path.h" +#include "common/FileSystem.h" + +MemoryCardConvertWorker::MemoryCardConvertWorker(QWidget* parent, MemoryCardType type, MemoryCardFileType fileType, const std::string& srcFileName, const std::string& destFileName) + : QtAsyncProgressThread(parent) +{ + this->type = type; + this->fileType = fileType; + this->srcFileName = srcFileName; + this->destFileName = destFileName; +} + +MemoryCardConvertWorker::~MemoryCardConvertWorker() = default; + +void MemoryCardConvertWorker::runAsync() +{ + switch (type) + { + case MemoryCardType::File: + ConvertToFolder(srcFileName, destFileName, fileType); + break; + case MemoryCardType::Folder: + ConvertToFile(srcFileName, destFileName, fileType); + break; + default: + break; + } +} + +bool MemoryCardConvertWorker::ConvertToFile(const std::string& srcFolderName, const std::string& destFileName, const MemoryCardFileType type) +{ + const std::string srcPath(Path::Combine(EmuFolders::MemoryCards, srcFolderName)); + const std::string destPath(Path::Combine(EmuFolders::MemoryCards, destFileName)); + size_t sizeInMB = 0; + + switch (type) + { + case MemoryCardFileType::PS2_8MB: + sizeInMB = 8; + break; + case MemoryCardFileType::PS2_16MB: + sizeInMB = 16; + break; + case MemoryCardFileType::PS2_32MB: + sizeInMB = 32; + break; + case MemoryCardFileType::PS2_64MB: + sizeInMB = 64; + break; + default: + Console.Error("%s(%s, %s, %d) Received invalid MemoryCardFileType, aborting", __FUNCTION__, srcPath.c_str(), destPath.c_str(), type); + return false; + } + + FolderMemoryCard sourceFolderMemoryCard; + Pcsx2Config::McdOptions config; + config.Enabled = true; + config.Type = MemoryCardType::Folder; + sourceFolderMemoryCard.Open(srcPath, config, (sizeInMB * 1024 * 1024) / FolderMemoryCard::ClusterSize, false, ""); + const size_t capacity = sourceFolderMemoryCard.GetSizeInClusters() * FolderMemoryCard::ClusterSizeRaw; + + std::vector sourceBuffer; + sourceBuffer.resize(capacity); + size_t address = 0; + this->SetProgressRange(capacity); + this->SetProgressValue(0); + + while (address < capacity) + { + sourceFolderMemoryCard.Read(sourceBuffer.data() + address, address, FolderMemoryCard::PageSizeRaw); + address += FolderMemoryCard::PageSizeRaw; + + // Only report progress every 16 pages. Substantially speeds up the conversion. + if (address % (FolderMemoryCard::PageSizeRaw * 16) == 0) + this->SetProgressValue(address); + } + + bool writeResult = FileSystem::WriteBinaryFile(destPath.c_str(), sourceBuffer.data(), sourceBuffer.size()); + + if (!writeResult) + { + Console.Error("%s(%s, %s, %d) Failed to write memory card contents to file", __FUNCTION__, srcPath.c_str(), destPath.c_str(), type); + return false; + } +#ifdef _WIN32 + else + { + FileSystem::SetPathCompression(destPath.c_str(), true); + } +#endif + + sourceFolderMemoryCard.Close(false); + return true; +} + +bool MemoryCardConvertWorker::ConvertToFolder(const std::string& srcFileName, const std::string& destFolderName, const MemoryCardFileType type) +{ + const std::string srcPath(Path::Combine(EmuFolders::MemoryCards, srcFileName)); + const std::string destPath(Path::Combine(EmuFolders::MemoryCards, destFolderName)); + + FolderMemoryCard targetFolderMemoryCard; + Pcsx2Config::McdOptions config; + config.Enabled = true; + config.Type = MemoryCardType::Folder; + + std::optional> sourceBufferOpt = FileSystem::ReadBinaryFile(srcPath.c_str()); + + if (!sourceBufferOpt.has_value()) + { + Console.Error("%s(%s, %s, %d) Failed to open file memory card!", __FUNCTION__, srcFileName.c_str(), destFolderName.c_str(), type); + return false; + } + + std::vector sourceBuffer = sourceBufferOpt.value(); + // Set progress bar to the literal number of bytes in the memcard. + // Plus two because there is a lag period after the Save calls complete + // where the progress bar stalls out; this lets us stop the progress bar + // just shy of 50 and 100% so it seems like its still doing some work. + this->SetProgressRange((sourceBuffer.size() * 2) + 2); + this->SetProgressValue(0); + + // Attempt the write twice. Once with writes being simulated rather than truly committed. + // Again with actual writes. If a file memcard has a corrupted page or something which would + // cause the conversion to fail, it will fail on the simulated run, with no files committed + // to the filesystem yet. + for (int i = 0; i < 2; i++) + { + bool simulateWrites = (i == 0); + targetFolderMemoryCard.Open(destPath, config, 0, false, "", simulateWrites); + + size_t address = 0; + + while (address < sourceBuffer.size()) + { + targetFolderMemoryCard.Save(sourceBuffer.data() + address, address, FolderMemoryCard::PageSizeRaw); + address += FolderMemoryCard::PageSizeRaw; + + // Only report progress every 16 pages. Substantially speeds up the conversion. + if (address % (FolderMemoryCard::PageSizeRaw * 16) == 0) + this->SetProgressValue(address + (i * sourceBuffer.size())); + } + + targetFolderMemoryCard.Close(); + + // If the source file memory card was larger than 8 MB, the raw copy will have also made the superblock of + // the destination folder memory card larger than 8 MB. For compatibility, we always want folder memory cards + // to report 8 MB, so we'll override that here. Don't do this on the simulated run, only the actual. + if (!simulateWrites && sourceBuffer.size() != FolderMemoryCard::TotalSizeRaw) + { + targetFolderMemoryCard.Open(destPath, config, 0, false, "", simulateWrites); + targetFolderMemoryCard.SetSizeInMB(8); + targetFolderMemoryCard.Close(); + } + + this->IncrementProgressValue(); + } + + return true; +} diff --git a/pcsx2-qt/Settings/MemoryCardConvertWorker.h b/pcsx2-qt/Settings/MemoryCardConvertWorker.h new file mode 100644 index 0000000000..5812c566a2 --- /dev/null +++ b/pcsx2-qt/Settings/MemoryCardConvertWorker.h @@ -0,0 +1,31 @@ + +#pragma once + +#include +#include +#include + +#include "QtProgressCallback.h" + +#include "pcsx2/MemoryCardFile.h" +#include "pcsx2/MemoryCardFolder.h" + +class MemoryCardConvertWorker : public QtAsyncProgressThread +{ +public: + MemoryCardConvertWorker(QWidget* parent, MemoryCardType type, MemoryCardFileType fileType, const std::string& srcFileName, const std::string& destFileName); + ~MemoryCardConvertWorker(); + +protected: + void runAsync() override; + +private: + MemoryCardType type; + MemoryCardFileType fileType; + std::string srcFileName; + std::string destFileName; + + + bool ConvertToFile(const std::string& srcFolderName, const std::string& destFileName, const MemoryCardFileType type); + bool ConvertToFolder(const std::string& srcFolderName, const std::string& destFileName, const MemoryCardFileType type); +}; diff --git a/pcsx2-qt/Settings/MemoryCardSettingsWidget.cpp b/pcsx2-qt/Settings/MemoryCardSettingsWidget.cpp index 8bf96062e5..f9a2af9964 100644 --- a/pcsx2-qt/Settings/MemoryCardSettingsWidget.cpp +++ b/pcsx2-qt/Settings/MemoryCardSettingsWidget.cpp @@ -26,7 +26,8 @@ #include "MemoryCardSettingsWidget.h" #include "CreateMemoryCardDialog.h" -#include "EmuThread.h" +#include "QtHost.h" +#include "MemoryCardConvertDialog.h" #include "QtUtils.h" #include "SettingWidgetBinder.h" #include "SettingsDialog.h" @@ -50,7 +51,7 @@ MemoryCardSettingsWidget::MemoryCardSettingsWidget(SettingsDialog* dialog, QWidg // since the group box hasn't been resized at that point. m_ui.cardGroupBox->installEventFilter(this); - SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.directory, m_ui.browse, m_ui.open, m_ui.reset, "Folders", "MemoryCards", "memcards"); + SettingWidgetBinder::BindWidgetToFolderSetting(sif, m_ui.directory, m_ui.browse, m_ui.open, m_ui.reset, "Folders", "MemoryCards", Path::Combine(EmuFolders::DataRoot, "memcards")); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.autoEject, "EmuCore", "McdEnableEjection", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.automaticManagement, "EmuCore", "McdFolderAutoManage", true); @@ -69,6 +70,12 @@ MemoryCardSettingsWidget::MemoryCardSettingsWidget(SettingsDialog* dialog, QWidg connect(m_ui.deleteCard, &QPushButton::clicked, this, &MemoryCardSettingsWidget::deleteCard); refresh(); + + dialog->registerWidgetHelp(m_ui.autoEject, tr("Auto-eject memory cards when loading save states"), tr("Checked"), + tr("Avoids broken memory card saves. May not work with some games such as Guitar Hero.")); + + dialog->registerWidgetHelp(m_ui.automaticManagement, tr("Automatically manage saves based on running game"), tr("Checked"), + tr("(Folder type only / Card size: Auto) Loads only the relevant booted game saves, ignoring others. Avoids running out of space for saves.")); } MemoryCardSettingsWidget::~MemoryCardSettingsWidget() = default; @@ -183,9 +190,13 @@ QString MemoryCardSettingsWidget::getSelectedCard() const void MemoryCardSettingsWidget::updateCardActions() { - const bool hasSelection = !getSelectedCard().isEmpty(); + QString selectedCard = getSelectedCard(); + const bool hasSelection = !selectedCard.isEmpty(); + + std::optional cardInfo = FileMcd_GetCardInfo(selectedCard.toStdString()); + bool isPS1 = (cardInfo.has_value() ? cardInfo.value().file_type == MemoryCardFileType::PS1 : false); - m_ui.convertCard->setEnabled(hasSelection); + m_ui.convertCard->setEnabled(hasSelection && !isPS1); m_ui.duplicateCard->setEnabled(hasSelection); m_ui.renameCard->setEnabled(hasSelection); m_ui.deleteCard->setEnabled(hasSelection); @@ -263,10 +274,14 @@ void MemoryCardSettingsWidget::renameCard() void MemoryCardSettingsWidget::convertCard() { const QString selectedCard(getSelectedCard()); + if (selectedCard.isEmpty()) return; - QMessageBox::critical(this, tr("Error"), tr("Not yet implemented.")); + MemoryCardConvertDialog dialog(QtUtils::GetRootWidget(this), selectedCard); + + if (dialog.IsSetup() && dialog.exec() == QDialog::Accepted) + refresh(); } void MemoryCardSettingsWidget::listContextMenuRequested(const QPoint& pos) diff --git a/pcsx2-qt/Settings/SettingsDialog.cpp b/pcsx2-qt/Settings/SettingsDialog.cpp index fa8842f1ed..c5c45b7e59 100644 --- a/pcsx2-qt/Settings/SettingsDialog.cpp +++ b/pcsx2-qt/Settings/SettingsDialog.cpp @@ -19,17 +19,16 @@ #include "common/Path.h" #include "common/StringUtil.h" -#include "pcsx2/HostSettings.h" #include "pcsx2/Frontend/GameList.h" -#include "pcsx2/Frontend/INISettingsInterface.h" +#include "pcsx2/HostSettings.h" +#include "pcsx2/INISettingsInterface.h" -#include "EmuThread.h" #include "MainWindow.h" #include "QtHost.h" #include "QtUtils.h" #include "SettingsDialog.h" -#include "AdvancedSystemSettingsWidget.h" +#include "AdvancedSettingsWidget.h" #include "AudioSettingsWidget.h" #include "BIOSSettingsWidget.h" #include "EmulationSettingsWidget.h" @@ -42,7 +41,11 @@ #include "HotkeySettingsWidget.h" #include "InterfaceSettingsWidget.h" #include "MemoryCardSettingsWidget.h" -#include "SystemSettingsWidget.h" + +#ifdef ENABLE_ACHIEVEMENTS +#include "AchievementSettingsWidget.h" +#include "pcsx2/Frontend/Achievements.h" +#endif #include #include @@ -68,26 +71,12 @@ SettingsDialog::SettingsDialog(QWidget* parent, std::unique_ptrInterface Settings
    These options control how the software looks and behaves.

    Mouse over an option for " - "additional information.")); - addWidget(m_game_list_settings = new GameListSettingsWidget(this, m_ui.settingsContainer), tr("Game List"), - QStringLiteral("folder-settings-line"), - tr("Game List Settings
    The list above shows the directories which will be searched by PCSX2 to populate the game " - "list. Search directories can be added, removed, and switched to recursive/non-recursive.")); - addWidget(m_bios_settings = new BIOSSettingsWidget(this, m_ui.settingsContainer), tr("BIOS"), QStringLiteral("hard-drive-2-line"), - tr("BIOS Settings
    Configure your BIOS here.

    Mouse over an option for additional information.")); - } - else + if (isPerGameSettings()) { if (game) { @@ -98,23 +87,31 @@ void SettingsDialog::setupUi(const GameList::Entry* game) m_ui.restoreDefaultsButton->setVisible(false); } + addWidget(m_interface_settings = new InterfaceSettingsWidget(this, m_ui.settingsContainer), tr("Interface"), + QStringLiteral("settings-3-line"), + tr("Interface Settings
    These options control how the software looks and behaves.

    Mouse over an option for " + "additional information.")); + + // We don't include game list/bios settings in per-game settings. + if (!isPerGameSettings()) + { + addWidget(m_game_list_settings = new GameListSettingsWidget(this, m_ui.settingsContainer), tr("Game List"), + QStringLiteral("folder-settings-line"), + tr("Game List Settings
    The list above shows the directories which will be searched by PCSX2 to populate the game " + "list. Search directories can be added, removed, and switched to recursive/non-recursive.")); + addWidget(m_bios_settings = new BIOSSettingsWidget(this, m_ui.settingsContainer), tr("BIOS"), QStringLiteral("hard-drive-2-line"), + tr("BIOS Settings
    Configure your BIOS here.

    Mouse over an option for additional information.")); + } + // Common to both per-game and global settings. addWidget(m_emulation_settings = new EmulationSettingsWidget(this, m_ui.settingsContainer), tr("Emulation"), QStringLiteral("dashboard-line"), tr("Emulation Settings
    These options determine the configuration of frame pacing and game settings.

    Mouse over an option for additional information.")); - addWidget(m_system_settings = new SystemSettingsWidget(this, m_ui.settingsContainer), tr("System"), QStringLiteral("artboard-2-line"), - tr("System Settings
    These options determine the configuration of the simulated console.

    Mouse over an option for additional information.")); - if (show_advanced_settings) + // Only show the game fixes for per-game settings, there's really no reason to be setting them globally. + if (show_advanced_settings && isPerGameSettings()) { - addWidget(m_advanced_system_settings = new AdvancedSystemSettingsWidget(this, m_ui.settingsContainer), tr("Advanced System"), - QStringLiteral("artboard-2-line"), tr("Advanced System Settings
    These are Advanced options to determine the configuration of the simulated console.

    Mouse over an option for additional information.")); - - // Only show the game fixes for per-game settings, there's really no reason to be setting them globally. - if (isPerGameSettings()) - { - addWidget(m_game_fix_settings_widget = new GameFixSettingsWidget(this, m_ui.settingsContainer), tr("Game Fix"), - QStringLiteral("close-line"), tr("Game Fix Settings
    ")); - } + addWidget(m_game_fix_settings_widget = new GameFixSettingsWidget(this, m_ui.settingsContainer), tr("Game Fix"), + QStringLiteral("close-line"), tr("Game Fix Settings
    Gamefixes can work around incorrect emulation in some titles
    however they can also cause problems in games if used incorrectly.
    It is best to leave them all disabled unless advised otherwise.")); } addWidget(m_graphics_settings = new GraphicsSettingsWidget(this, m_ui.settingsContainer), tr("Graphics"), QStringLiteral("brush-line"), @@ -128,7 +125,7 @@ void SettingsDialog::setupUi(const GameList::Entry* game) addWidget(m_memory_card_settings = new MemoryCardSettingsWidget(this, m_ui.settingsContainer), tr("Memory Cards"), QStringLiteral("sd-card-line"), tr("Memory Card Settings
    Create and configure Memory Cards here.

    Mouse over an option for additional information.")); } - + addWidget(m_dev9_settings = new DEV9SettingsWidget(this, m_ui.settingsContainer), tr("Network & HDD"), QStringLiteral("dashboard-line"), tr("Network & HDD Settings
    These options control the network connectivity and internal HDD storage of the console.

    " "Mouse over an option for additional information.")); @@ -139,6 +136,40 @@ void SettingsDialog::setupUi(const GameList::Entry* game) tr("Folder Settings
    These options control where PCSX2 will save runtime data files.")); } + { + QString title = tr("Achievements"); + QString icon_text(QStringLiteral("trophy-line")); + QString help_text = tr( + "Achievements Settings
    " + "These options control the RetroAchievements implementation in PCSX2, allowing you to earn achievements in your games."); +#ifdef ENABLE_ACHIEVEMENTS + if (Achievements::IsUsingRAIntegration()) + { + QLabel* placeholder_label = + new QLabel(tr("RAIntegration is being used, built-in RetroAchievements support is disabled."), + m_ui.settingsContainer); + placeholder_label->setAlignment(Qt::AlignLeft | Qt::AlignTop); + addWidget(placeholder_label, std::move(title), std::move(icon_text), std::move(help_text)); + } + else + { + addWidget((m_achievement_settings = new AchievementSettingsWidget(this, m_ui.settingsContainer)), + std::move(title), std::move(icon_text), std::move(help_text)); + } +#else + QLabel* placeholder_label = + new QLabel(tr("This PCSX2 build was not compiled with RetroAchievements support."), m_ui.settingsContainer); + placeholder_label->setAlignment(Qt::AlignLeft | Qt::AlignTop); + addWidget(placeholder_label, std::move(title), std::move(icon_text), std::move(help_text)); +#endif + } + + if (show_advanced_settings) + { + addWidget(m_advanced_settings = new AdvancedSettingsWidget(this, m_ui.settingsContainer), tr("Advanced"), + QStringLiteral("artboard-2-line"), tr("Advanced Settings
    These are advanced options to determine the configuration of the simulated console.

    Mouse over an option for additional information.")); + } + m_ui.settingsCategory->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); m_ui.settingsCategory->setCurrentRow(0); m_ui.settingsContainer->setCurrentIndex(0); @@ -146,9 +177,6 @@ void SettingsDialog::setupUi(const GameList::Entry* game) connect(m_ui.settingsCategory, &QListWidget::currentRowChanged, this, &SettingsDialog::onCategoryCurrentRowChanged); connect(m_ui.closeButton, &QPushButton::clicked, this, &SettingsDialog::accept); connect(m_ui.restoreDefaultsButton, &QPushButton::clicked, this, &SettingsDialog::onRestoreDefaultsClicked); - - // TODO: Remove this once they're implemented. - m_ui.restoreDefaultsButton->setVisible(false); } SettingsDialog::~SettingsDialog() @@ -164,6 +192,11 @@ void SettingsDialog::closeEvent(QCloseEvent*) deleteLater(); } +QString SettingsDialog::getCategory() const +{ + return m_ui.settingsCategory->item(m_ui.settingsCategory->currentRow())->text(); +} + void SettingsDialog::setCategory(const char* category) { // the titles in the category list will be translated. @@ -188,14 +221,20 @@ void SettingsDialog::onCategoryCurrentRowChanged(int row) void SettingsDialog::onRestoreDefaultsClicked() { - if (QMessageBox::question(this, tr("Confirm Restore Defaults"), - tr("Are you sure you want to restore the default settings? Any preferences will be lost."), QMessageBox::Yes, - QMessageBox::No) != QMessageBox::Yes) - { - return; - } + QMessageBox msgbox(this); + msgbox.setIcon(QMessageBox::Question); + msgbox.setWindowTitle(tr("Confirm Restore Defaults")); + msgbox.setText(tr("Are you sure you want to restore the default settings? Any preferences will be lost.")); - // TODO + QCheckBox* ui_cb = new QCheckBox(tr("Reset UI Settings"), &msgbox); + msgbox.setCheckBox(ui_cb); + msgbox.addButton(QMessageBox::Yes); + msgbox.addButton(QMessageBox::No); + msgbox.setDefaultButton(QMessageBox::Yes); + if (msgbox.exec() != QMessageBox::Yes) + return; + + g_main_window->resetSettings(ui_cb->isChecked()); } void SettingsDialog::addWidget(QWidget* widget, QString title, QString icon, QString help_text) @@ -214,6 +253,9 @@ void SettingsDialog::addWidget(QWidget* widget, QString title, QString icon, QSt void SettingsDialog::registerWidgetHelp(QObject* object, QString title, QString recommended_value, QString text) { + if (!object) + return; + // construct rich text with formatted description QString full_text; full_text += " - @@ -337,7 +337,7 @@ in the FAT and directory entries are relative to this. - @@ -476,9 +476,9 @@ if that block was found to be bad. FAT might look something like this:

    -fat_offset = fat_index % 256 +fat_offset = fat_index % 256
    -indirect_index = fat_index / 256 +indirect_index = fat_index / 256
    indirect_offset = indirect_index % 256
    @@ -616,28 +616,28 @@ If this flag is clear, then the file or directory has been deleted.

    - + - + - + - + - + @@ -655,21 +655,21 @@ in its parent's directory. - + - + - + @@ -698,7 +698,7 @@ in its parent's directory. cluster field which isn't used.

    -
    +
    "; @@ -373,7 +415,8 @@ void SettingsDialog::setBoolSettingValue(const char* section, const char* key, s } else { - value.has_value() ? QtHost::SetBaseBoolSettingValue(section, key, value.value()) : QtHost::RemoveBaseSettingValue(section, key); + value.has_value() ? Host::SetBaseBoolSettingValue(section, key, value.value()) : Host::RemoveBaseSettingValue(section, key); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); } } @@ -388,7 +431,8 @@ void SettingsDialog::setIntSettingValue(const char* section, const char* key, st } else { - value.has_value() ? QtHost::SetBaseIntSettingValue(section, key, value.value()) : QtHost::RemoveBaseSettingValue(section, key); + value.has_value() ? Host::SetBaseIntSettingValue(section, key, value.value()) : Host::RemoveBaseSettingValue(section, key); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); } } @@ -403,7 +447,8 @@ void SettingsDialog::setFloatSettingValue(const char* section, const char* key, } else { - value.has_value() ? QtHost::SetBaseFloatSettingValue(section, key, value.value()) : QtHost::RemoveBaseSettingValue(section, key); + value.has_value() ? Host::SetBaseFloatSettingValue(section, key, value.value()) : Host::RemoveBaseSettingValue(section, key); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); } } @@ -418,7 +463,8 @@ void SettingsDialog::setStringSettingValue(const char* section, const char* key, } else { - value.has_value() ? QtHost::SetBaseStringSettingValue(section, key, value.value()) : QtHost::RemoveBaseSettingValue(section, key); + value.has_value() ? Host::SetBaseStringSettingValue(section, key, value.value()) : Host::RemoveBaseSettingValue(section, key); + Host::CommitBaseSettingChanges(); g_emu_thread->applySettings(); } } diff --git a/pcsx2-qt/Settings/SettingsDialog.h b/pcsx2-qt/Settings/SettingsDialog.h index 0bc3d5b668..3f5e7acee2 100644 --- a/pcsx2-qt/Settings/SettingsDialog.h +++ b/pcsx2-qt/Settings/SettingsDialog.h @@ -33,14 +33,14 @@ class InterfaceSettingsWidget; class GameListSettingsWidget; class EmulationSettingsWidget; class BIOSSettingsWidget; -class SystemSettingsWidget; -class AdvancedSystemSettingsWidget; class GameFixSettingsWidget; class GraphicsSettingsWidget; class AudioSettingsWidget; class MemoryCardSettingsWidget; class FolderSettingsWidget; class DEV9SettingsWidget; +class AchievementSettingsWidget; +class AdvancedSettingsWidget; class SettingsDialog final : public QDialog { @@ -60,18 +60,19 @@ public: __fi GameListSettingsWidget* getGameListSettingsWidget() const { return m_game_list_settings; } __fi BIOSSettingsWidget* getBIOSSettingsWidget() const { return m_bios_settings; } __fi EmulationSettingsWidget* getEmulationSettingsWidget() const { return m_emulation_settings; } - __fi SystemSettingsWidget* getSystemSettingsWidget() const { return m_system_settings; } - __fi AdvancedSystemSettingsWidget* getAdvancedSystemSettingsWidget() const { return m_advanced_system_settings; } __fi GameFixSettingsWidget* getGameFixSettingsWidget() const { return m_game_fix_settings_widget; } __fi GraphicsSettingsWidget* getGraphicsSettingsWidget() const { return m_graphics_settings; } __fi AudioSettingsWidget* getAudioSettingsWidget() const { return m_audio_settings; } __fi MemoryCardSettingsWidget* getMemoryCardSettingsWidget() const { return m_memory_card_settings; } __fi FolderSettingsWidget* getFolderSettingsWidget() const { return m_folder_settings; } __fi DEV9SettingsWidget* getDEV9SettingsWidget() const { return m_dev9_settings; } + __fi AchievementSettingsWidget* getAchievementSettingsWidget() const { return m_achievement_settings; } + __fi AdvancedSettingsWidget* getAdvancedSettingsWidget() const { return m_advanced_settings; } void registerWidgetHelp(QObject* object, QString title, QString recommended_value, QString text); bool eventFilter(QObject* object, QEvent* event) override; + QString getCategory() const; void setCategory(const char* category); // Helper functions for reading effective setting values (from game -> global settings). @@ -103,7 +104,7 @@ protected: private: enum : u32 { - MAX_SETTINGS_WIDGETS = 11 + MAX_SETTINGS_WIDGETS = 12 }; void setupUi(const GameList::Entry* game); @@ -118,14 +119,14 @@ private: GameListSettingsWidget* m_game_list_settings = nullptr; BIOSSettingsWidget* m_bios_settings = nullptr; EmulationSettingsWidget* m_emulation_settings = nullptr; - SystemSettingsWidget* m_system_settings = nullptr; - AdvancedSystemSettingsWidget* m_advanced_system_settings = nullptr; GameFixSettingsWidget* m_game_fix_settings_widget = nullptr; GraphicsSettingsWidget* m_graphics_settings = nullptr; AudioSettingsWidget* m_audio_settings = nullptr; MemoryCardSettingsWidget* m_memory_card_settings = nullptr; FolderSettingsWidget* m_folder_settings = nullptr; DEV9SettingsWidget* m_dev9_settings = nullptr; + AchievementSettingsWidget* m_achievement_settings = nullptr; + AdvancedSettingsWidget* m_advanced_settings = nullptr; std::array m_category_help_text; diff --git a/pcsx2-qt/Settings/SettingsDialog.ui b/pcsx2-qt/Settings/SettingsDialog.ui index d2f6bbce85..93a4c73dd8 100644 --- a/pcsx2-qt/Settings/SettingsDialog.ui +++ b/pcsx2-qt/Settings/SettingsDialog.ui @@ -33,13 +33,13 @@ - 150 + 160 0 - 150 + 160 16777215 @@ -66,7 +66,7 @@ 0 - 100 + 120 diff --git a/pcsx2-qt/Settings/SystemSettingsWidget.cpp b/pcsx2-qt/Settings/SystemSettingsWidget.cpp deleted file mode 100644 index 3ac5b69d6e..0000000000 --- a/pcsx2-qt/Settings/SystemSettingsWidget.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2022 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" - -#include -#include - -#include "pcsx2/HostSettings.h" - -#include "EmuThread.h" -#include "QtUtils.h" -#include "SettingWidgetBinder.h" -#include "SettingsDialog.h" -#include "SystemSettingsWidget.h" - -static constexpr int MINIMUM_EE_CYCLE_RATE = -3; -static constexpr int MAXIMUM_EE_CYCLE_RATE = 3; -static constexpr int DEFAULT_EE_CYCLE_RATE = 0; -static constexpr int DEFAULT_EE_CYCLE_SKIP = 0; - -SystemSettingsWidget::SystemSettingsWidget(SettingsDialog* dialog, QWidget* parent) - : QWidget(parent) - , m_dialog(dialog) -{ - SettingsInterface* sif = dialog->getSettingsInterface(); - - m_ui.setupUi(this); - - SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.eeCycleSkipping, "EmuCore/Speedhacks", "EECycleSkip", DEFAULT_EE_CYCLE_SKIP); - SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.affinityControl, "EmuCore/CPU", "AffinityControlMode", 0); - - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.MTVU, "EmuCore/Speedhacks", "vuThread", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.instantVU1, "EmuCore/Speedhacks", "vu1Instant", true); - SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.eeRoundingMode, "EmuCore/CPU", "FPU.Roundmode", 3); - SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.vuRoundingMode, "EmuCore/CPU", "VU.Roundmode", 3); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.fastCDVD, "EmuCore/Speedhacks", "fastCDVD", false); - - if (m_dialog->isPerGameSettings()) - { - m_ui.eeCycleRate->insertItem( - 0, tr("Use Global Setting [%1]") - .arg(m_ui.eeCycleRate->itemText( - std::clamp(Host::GetBaseIntSettingValue("EmuCore/Speedhacks", "EECycleRate", DEFAULT_EE_CYCLE_RATE) - MINIMUM_EE_CYCLE_RATE, - 0, MAXIMUM_EE_CYCLE_RATE - MINIMUM_EE_CYCLE_RATE)))); - m_ui.eeClampMode->insertItem(0, tr("Use Global Setting [%1]").arg(m_ui.eeClampMode->itemText(getGlobalClampingModeIndex(false)))); - m_ui.vuClampMode->insertItem(0, tr("Use Global Setting [%1]").arg(m_ui.vuClampMode->itemText(getGlobalClampingModeIndex(true)))); - } - - const std::optional cycle_rate = - m_dialog->getIntValue("EmuCore/Speedhacks", "EECycleRate", sif ? std::nullopt : std::optional(DEFAULT_EE_CYCLE_RATE)); - m_ui.eeCycleRate->setCurrentIndex(cycle_rate.has_value() ? (std::clamp(cycle_rate.value(), MINIMUM_EE_CYCLE_RATE, MAXIMUM_EE_CYCLE_RATE) + - (0 - MINIMUM_EE_CYCLE_RATE) + static_cast(m_dialog->isPerGameSettings())) : - 0); - connect(m_ui.eeCycleRate, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index) { - std::optional value; - if (!m_dialog->isPerGameSettings() || index > 0) - value = MINIMUM_EE_CYCLE_RATE + index - static_cast(m_dialog->isPerGameSettings()); - m_dialog->setIntSettingValue("EmuCore/Speedhacks", "EECycleRate", value); - }); - - m_ui.eeClampMode->setCurrentIndex(getClampingModeIndex(false)); - m_ui.vuClampMode->setCurrentIndex(getClampingModeIndex(true)); - connect(m_ui.eeClampMode, QOverload::of(&QComboBox::currentIndexChanged), [this](int index) { setClampingMode(false, index); }); - connect(m_ui.vuClampMode, QOverload::of(&QComboBox::currentIndexChanged), [this](int index) { setClampingMode(true, index); }); - - dialog->registerWidgetHelp(m_ui.eeCycleRate, tr("Cycle Rate"), tr("100% (Normal Speed)"), - tr("Higher values may increase internal framerate in games, but will increase CPU requirements substantially. " - "Lower values will reduce the CPU load allowing lightweight games to run full speed on weaker CPUs.")); - - dialog->registerWidgetHelp(m_ui.eeCycleSkipping, tr("Cycle Skip"), tr("Normal Speed"), - tr("Makes the emulated Emotion Engine skip cycles. " - "Helps a small subset of games like SOTC. Most of the time it's harmful to performance.")); - - dialog->registerWidgetHelp(m_ui.MTVU, tr("MTVU (Multi-threaded VU1)"), tr("Unchecked"), - tr("Generally a speedup on CPUs with 3 or more threads. " - "Safe for most games, but a few are incompatible and may hang.")); - - dialog->registerWidgetHelp(m_ui.instantVU1, tr("Instant VU1"), tr("Checked"), - tr("Runs VU1 instantly (when MTVU is disabled). Provides a modest speed improvement. " - "Safe for most games, but a few games may exhibit graphical errors.")); - - dialog->registerWidgetHelp(m_ui.fastCDVD, tr("Enable Fast CDVD"), tr("Unchecked"), - tr("Fast disc access, less loading times. Check HDLoader compatibility lists for known games that have issues with this.")); - - updateVU1InstantState(); - connect(m_ui.MTVU, &QCheckBox::stateChanged, this, &SystemSettingsWidget::updateVU1InstantState); -} - -SystemSettingsWidget::~SystemSettingsWidget() = default; - -void SystemSettingsWidget::updateVU1InstantState() -{ - m_ui.instantVU1->setEnabled(!m_dialog->getEffectiveBoolValue("EmuCore/Speedhacks", "vuThread", false)); -} - -int SystemSettingsWidget::getGlobalClampingModeIndex(bool vu) const -{ - if (Host::GetBaseBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuSignOverflow" : "fpuFullMode", false)) - return 3; - - if (Host::GetBaseBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuExtraOverflow" : "fpuExtraOverflow", false)) - return 2; - - if (Host::GetBaseBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuOverflow" : "fpuOverflow", true)) - return 1; - - return 0; -} - -int SystemSettingsWidget::getClampingModeIndex(bool vu) const -{ - // This is so messy... maybe we should just make the mode an int in the settings too... - const bool base = m_dialog->isPerGameSettings() ? 1 : 0; - std::optional default_false = m_dialog->isPerGameSettings() ? std::nullopt : std::optional(false); - std::optional default_true = m_dialog->isPerGameSettings() ? std::nullopt : std::optional(true); - - std::optional third = m_dialog->getBoolValue("EmuCore/CPU/Recompiler", vu ? "vuSignOverflow" : "fpuFullMode", default_false); - std::optional second = m_dialog->getBoolValue("EmuCore/CPU/Recompiler", vu ? "vuExtraOverflow" : "fpuExtraOverflow", default_false); - std::optional first = m_dialog->getBoolValue("EmuCore/CPU/Recompiler", vu ? "vuOverflow" : "fpuOverflow", default_true); - - if (third.has_value() && third.value()) - return base + 3; - if (second.has_value() && second.value()) - return base + 2; - if (first.has_value() && first.value()) - return base + 1; - else if (first.has_value()) - return base + 0; // none - else - return 0; // no per game override -} - -void SystemSettingsWidget::setClampingMode(bool vu, int index) -{ - std::optional first, second, third; - - if (!m_dialog->isPerGameSettings() || index > 0) - { - const bool base = m_dialog->isPerGameSettings() ? 1 : 0; - third = (index >= (base + 3)); - second = (index >= (base + 2)); - first = (index >= (base + 1)); - } - - m_dialog->setBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuSignOverflow" : "fpuFullMode", third); - m_dialog->setBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuExtraOverflow" : "fpuExtraOverflow", second); - m_dialog->setBoolSettingValue("EmuCore/CPU/Recompiler", vu ? "vuOverflow" : "fpuOverflow", first); -} diff --git a/pcsx2-qt/Settings/SystemSettingsWidget.ui b/pcsx2-qt/Settings/SystemSettingsWidget.ui deleted file mode 100644 index d87e2c6840..0000000000 --- a/pcsx2-qt/Settings/SystemSettingsWidget.ui +++ /dev/null @@ -1,347 +0,0 @@ - - - SystemSettingsWidget - - - - 0 - 0 - 648 - 454 - - - - Form - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - EmotionEngine (EE, MIPS-IV) - - - - - - Cycle Rate: - - - - - - - - 50% Speed - - - - - 60% Speed - - - - - 75% Speed - - - - - 100% (Normal Speed) - - - - - 130% Speed - - - - - 180% Speed - - - - - 300% Speed - - - - - - - - Cycle Skip: - - - - - - - - Normal - - - - - Mild Underclock - - - - - Moderate Underclock - - - - - Maximum Underclock - - - - - - - - Rounding Mode: - - - - - - - - Nearest - - - - - Negative - - - - - Positive - - - - - Chop / Zero (Default) - - - - - - - - Clamping Mode: - - - - - - - - None - - - - - Normal (Default) - - - - - Extra + Preserve Sign - - - - - Full - - - - - - - - Affinity Control: - - - - - - - - Disabled - - - - - EE > VU > GS - - - - - EE > GS > VU - - - - - VU > EE > GS - - - - - VU > GS > EE - - - - - GS > EE > VU - - - - - GS > VU > EE - - - - - - - - - - - Vector Units (VU) - - - - - - Rounding Mode: - - - - - - - - Nearest - - - - - Negative - - - - - Positive - - - - - Chop / Zero (Default) - - - - - - - - Clamping Mode: - - - - - - - - None - - - - - Normal (Default) - - - - - Extra - - - - - Extra + Preserve Sign - - - - - - - - - - MTVU (Multi-Threaded VU1) - - - - - - - Instant VU1 - - - - - - - - - - - - I/O Processor (IOP, MIPS-I) - - - - - - Enable Fast CDVD - - - - - - - - - - Qt::Vertical - - - - 20 - 3 - - - - - - - - - - - diff --git a/pcsx2-qt/Tools/InputRecording/InputRecordingViewer.cpp b/pcsx2-qt/Tools/InputRecording/InputRecordingViewer.cpp new file mode 100644 index 0000000000..044bf751df --- /dev/null +++ b/pcsx2-qt/Tools/InputRecording/InputRecordingViewer.cpp @@ -0,0 +1,128 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#include "InputRecordingViewer.h" + +#include "QtUtils.h" +#include +#include +#include + +// TODO - for now this uses a very naive implementation that fills the entire table +// this needs to be replaced with a lazy-loading QTableView implementation +// +// For now, especially for just debugging input recording issues, its good enough! + +InputRecordingViewer::InputRecordingViewer(QWidget* parent) + : QMainWindow(parent) +{ + m_ui.setupUi(this); + + m_ui.tableWidget->setSelectionMode(QAbstractItemView::NoSelection); + + connect(m_ui.actionOpen, &QAction::triggered, this, &InputRecordingViewer::openFile); + connect(m_ui.actionClose, &QAction::triggered, this, &InputRecordingViewer::closeFile); +} + +QTableWidgetItem* InputRecordingViewer::createRowItem(std::tuple analog) +{ + const auto [left, right] = analog; + return new QTableWidgetItem(tr("%1 %2").arg(left).arg(right)); +} + +QTableWidgetItem* InputRecordingViewer::createRowItem(bool pressed) +{ + return new QTableWidgetItem(tr("%1").arg(pressed)); +} + +QTableWidgetItem* InputRecordingViewer::createRowItem(std::tuple buttonInfo) +{ + const auto [isPressed, pressure] = buttonInfo; + return new QTableWidgetItem(tr("%1 [%2]").arg(isPressed).arg(pressure)); +} + +void InputRecordingViewer::loadTable() +{ + static const auto headers = QStringList({"Left Analog", "Right Analog", "Cross", "Square", "Triangle", "Circle", "L1", "R1", "L2", "R2", "⬇️", "➡️", "⬆️", "⬅️", "L3", "R3", "Select", "Start"}); + m_ui.tableWidget->setColumnCount(headers.length()); + m_ui.tableWidget->setHorizontalHeaderLabels(headers); + + // TODO - only port 1 for now + auto dataColl = m_file.bulkReadPadData(0, m_file.getTotalFrames(), 0); + m_ui.tableWidget->setRowCount(dataColl.size()); + + int frameNum = 0; + for (const auto& frameData : dataColl) + { + m_ui.tableWidget->setItem(frameNum, 0, createRowItem(frameData.m_leftAnalog)); + m_ui.tableWidget->setItem(frameNum, 1, createRowItem(frameData.m_rightAnalog)); + m_ui.tableWidget->setItem(frameNum, 2, createRowItem(frameData.m_cross)); + m_ui.tableWidget->setItem(frameNum, 3, createRowItem(frameData.m_square)); + m_ui.tableWidget->setItem(frameNum, 4, createRowItem(frameData.m_triangle)); + m_ui.tableWidget->setItem(frameNum, 5, createRowItem(frameData.m_circle)); + m_ui.tableWidget->setItem(frameNum, 6, createRowItem(frameData.m_l1)); + m_ui.tableWidget->setItem(frameNum, 7, createRowItem(frameData.m_l2)); + m_ui.tableWidget->setItem(frameNum, 8, createRowItem(frameData.m_r1)); + m_ui.tableWidget->setItem(frameNum, 9, createRowItem(frameData.m_r2)); + m_ui.tableWidget->setItem(frameNum, 10, createRowItem(frameData.m_down)); + m_ui.tableWidget->setItem(frameNum, 11, createRowItem(frameData.m_right)); + m_ui.tableWidget->setItem(frameNum, 12, createRowItem(frameData.m_up)); + m_ui.tableWidget->setItem(frameNum, 13, createRowItem(frameData.m_left)); + m_ui.tableWidget->setItem(frameNum, 14, createRowItem(frameData.m_l3)); + m_ui.tableWidget->setItem(frameNum, 15, createRowItem(frameData.m_r3)); + m_ui.tableWidget->setItem(frameNum, 16, createRowItem(frameData.m_select)); + m_ui.tableWidget->setItem(frameNum, 17, createRowItem(frameData.m_select)); + frameNum++; + } +} + +void InputRecordingViewer::openFile() +{ + QFileDialog dialog(this); + dialog.setFileMode(QFileDialog::ExistingFile); + dialog.setWindowTitle("Select a File"); + dialog.setNameFilter(tr("Input Recording Files (*.p2m2)")); + QStringList fileNames; + if (dialog.exec()) + { + fileNames = dialog.selectedFiles(); + } + if (!fileNames.isEmpty()) + { + const std::string fileName = fileNames.first().toStdString(); + m_file_open = m_file.openExisting(fileName); + m_ui.actionClose->setEnabled(m_file_open); + if (m_file_open) + { + loadTable(); + } // TODO else error + } +} + +void InputRecordingViewer::closeFile() +{ + if (m_file_open) + { + m_file_open = !m_file.close(); + if (!m_file_open) + { + m_ui.tableWidget->clearContents(); + m_ui.tableWidget->setRowCount(0); + } + } // TODO else error + m_ui.actionClose->setEnabled(m_file_open); +} \ No newline at end of file diff --git a/pcsx2-qt/Tools/InputRecording/InputRecordingViewer.h b/pcsx2-qt/Tools/InputRecording/InputRecordingViewer.h new file mode 100644 index 0000000000..6361d44cd5 --- /dev/null +++ b/pcsx2-qt/Tools/InputRecording/InputRecordingViewer.h @@ -0,0 +1,44 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +#include "ui_InputRecordingViewer.h" + +#include "pcsx2/Recording/InputRecordingFile.h" + +class InputRecordingViewer final : public QMainWindow +{ + Q_OBJECT + +public: + explicit InputRecordingViewer(QWidget* parent = nullptr); + ~InputRecordingViewer() = default; + +private Q_SLOTS: + void openFile(); + void closeFile(); + +private: + Ui::InputRecordingViewer m_ui; + + InputRecordingFile m_file; + bool m_file_open; + + void loadTable(); + QTableWidgetItem* createRowItem(std::tuple analog); + QTableWidgetItem* createRowItem(bool pressed); + QTableWidgetItem* createRowItem(std::tuple buttonInfo); +}; diff --git a/pcsx2-qt/Tools/InputRecording/InputRecordingViewer.ui b/pcsx2-qt/Tools/InputRecording/InputRecordingViewer.ui new file mode 100644 index 0000000000..ad60c3b3fd --- /dev/null +++ b/pcsx2-qt/Tools/InputRecording/InputRecordingViewer.ui @@ -0,0 +1,74 @@ + + + InputRecordingViewer + + + + 0 + 0 + 800 + 600 + + + + Input Recording Viewer + + + + true + + + + + + + + + + + 0 + 0 + 800 + 21 + + + + + File + + + + + + + Edit + + + + + View + + + + + + + + + + Open + + + + + false + + + Close + + + + + + + diff --git a/pcsx2-qt/pcsx2-qt.vcxproj b/pcsx2-qt/pcsx2-qt.vcxproj index 1e3c584711..34e7ef0e55 100644 --- a/pcsx2-qt/pcsx2-qt.vcxproj +++ b/pcsx2-qt/pcsx2-qt.vcxproj @@ -43,6 +43,7 @@ $(SolutionDir)3rdparty\glad\include;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\simpleini\include;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\lzma\include;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\rapidyaml\rapidyaml\ext\c4core\src\c4\ext\fast_float\include;%(AdditionalIncludeDirectories); $(ProjectDir);$(SolutionDir)pcsx2;%(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories);$(ProjectDir)\Settings;$(ProjectDir)\GameList;$(ProjectDir)\Tools\InputRecording @@ -50,16 +51,14 @@ Use PrecompiledHeader.h NoExtensions - WIN32_LEAN_AND_MEAN;LZMA_API_STATIC;BUILD_DX=1;ENABLE_OPENGL;ENABLE_VULKAN;DIRECTINPUT_VERSION=0x0800;PCSX2_CORE;%(PreprocessorDefinitions) + WIN32_LEAN_AND_MEAN;LZMA_API_STATIC;BUILD_DX=1;ENABLE_RAINTEGRATION;ENABLE_ACHIEVEMENTS;ENABLE_DISCORD_PRESENCE;ENABLE_OPENGL;ENABLE_VULKAN;DIRECTINPUT_VERSION=0x0800;PCSX2_CORE;%(PreprocessorDefinitions) PCSX2_DEBUG;PCSX2_DEVBUILD;_SECURE_SCL_=1;%(PreprocessorDefinitions) PCSX2_DEVEL;PCSX2_DEVBUILD;NDEBUG;_SECURE_SCL_=1;%(PreprocessorDefinitions) NDEBUG;_SECURE_SCL_=0;%(PreprocessorDefinitions) PCSX2_CI;%(PreprocessorDefinitions) - _M_SSE=0x401;%(PreprocessorDefinitions) - _M_SSE=0x501;%(PreprocessorDefinitions) - - NotSet - StreamingSIMDExtensions2 + + __SSE4_1__;%(PreprocessorDefinitions) + NotSet AdvancedVectorExtensions2 false $(IntDir)%(RelativeDir) @@ -95,9 +94,6 @@ {d6973076-9317-4ef2-a0b8-b7a18ac0713e} - - {47afdbef-f15f-4bc0-b436-5be443c3f80f} - {e9b51944-7e6d-4bcd-83f2-7bbd5a46182d} @@ -129,13 +125,19 @@ {a4323327-3f2b-4271-83d9-7f9a3c66b6b2} + + {67d0160c-0fe4-44b9-ac2e-82bbcf4104df} + + + + @@ -145,74 +147,80 @@ - - + + + + + - Create - - - + + + + + + + - + - + @@ -231,29 +239,34 @@ - - + + + + + - + + + NotUsing @@ -265,10 +278,10 @@ Document - + Document - + Document @@ -286,7 +299,7 @@ Document - + Document @@ -313,6 +326,9 @@ Document + + Document + Document @@ -328,14 +344,32 @@ Document + + Document + Document + + Document + + + Document + + + Document + + + Document + + + Document + - \ No newline at end of file + diff --git a/pcsx2-qt/pcsx2-qt.vcxproj.filters b/pcsx2-qt/pcsx2-qt.vcxproj.filters index 6bf932a4ad..88777df26c 100644 --- a/pcsx2-qt/pcsx2-qt.vcxproj.filters +++ b/pcsx2-qt/pcsx2-qt.vcxproj.filters @@ -30,7 +30,6 @@ - @@ -43,9 +42,8 @@ moc - - + moc @@ -67,9 +65,6 @@ Settings - - Settings - moc @@ -88,13 +83,10 @@ moc - + moc - - moc - - + Settings @@ -158,6 +150,9 @@ Settings + + moc + moc @@ -182,6 +177,9 @@ Settings + + Settings + Settings @@ -213,6 +211,9 @@ moc + + moc + Tools\Input Recording @@ -223,6 +224,32 @@ moc + + moc + + + + + moc + + + Settings + + + Settings + + + moc + + + moc + + + Settings + + + Tools\Input Recording + @@ -231,7 +258,6 @@ - @@ -240,11 +266,16 @@ Settings + + Settings + + + Tools\Input Recording + - Settings @@ -263,10 +294,7 @@ Settings - - Settings - - + Settings @@ -303,6 +331,9 @@ Settings + + Settings + Settings @@ -328,6 +359,15 @@ Settings + + + + + Settings + + + Settings + @@ -351,13 +391,10 @@ Settings - - Settings - Settings - + Settings @@ -381,6 +418,9 @@ Settings + + Settings + Settings @@ -399,14 +439,33 @@ GameList + + GameList + Tools\Input Recording + + Settings + + + Settings + + + Settings + + + Settings + + + + Tools\Input Recording + Settings - \ No newline at end of file + diff --git a/pcsx2-qt/resources/icons/black/svg/checkbox-multiple-blank-line.svg b/pcsx2-qt/resources/icons/black/svg/checkbox-multiple-blank-line.svg new file mode 100644 index 0000000000..b3c3cbc41c --- /dev/null +++ b/pcsx2-qt/resources/icons/black/svg/checkbox-multiple-blank-line.svg @@ -0,0 +1 @@ + diff --git a/pcsx2-qt/resources/icons/black/svg/filter-line.svg b/pcsx2-qt/resources/icons/black/svg/filter-line.svg new file mode 100644 index 0000000000..6c9acd0fd6 --- /dev/null +++ b/pcsx2-qt/resources/icons/black/svg/filter-line.svg @@ -0,0 +1 @@ + diff --git a/pcsx2-qt/resources/icons/black/svg/flashlight-line.svg b/pcsx2-qt/resources/icons/black/svg/flashlight-line.svg new file mode 100644 index 0000000000..80452ba28c --- /dev/null +++ b/pcsx2-qt/resources/icons/black/svg/flashlight-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pcsx2-qt/resources/icons/black/svg/global-line.svg b/pcsx2-qt/resources/icons/black/svg/global-line.svg new file mode 100644 index 0000000000..830359dae1 --- /dev/null +++ b/pcsx2-qt/resources/icons/black/svg/global-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pcsx2-qt/resources/icons/black/svg/image-fill.svg b/pcsx2-qt/resources/icons/black/svg/image-fill.svg new file mode 100644 index 0000000000..25cbfc9c47 --- /dev/null +++ b/pcsx2-qt/resources/icons/black/svg/image-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pcsx2-qt/resources/icons/black/svg/login-box-line.svg b/pcsx2-qt/resources/icons/black/svg/login-box-line.svg new file mode 100644 index 0000000000..6b0d9bfa9c --- /dev/null +++ b/pcsx2-qt/resources/icons/black/svg/login-box-line.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pcsx2-qt/resources/icons/black/svg/price-tag-3-line.svg b/pcsx2-qt/resources/icons/black/svg/price-tag-3-line.svg new file mode 100644 index 0000000000..3511dc1655 --- /dev/null +++ b/pcsx2-qt/resources/icons/black/svg/price-tag-3-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pcsx2-qt/resources/icons/black/svg/trophy-line.svg b/pcsx2-qt/resources/icons/black/svg/trophy-line.svg new file mode 100644 index 0000000000..c53c31fbe0 --- /dev/null +++ b/pcsx2-qt/resources/icons/black/svg/trophy-line.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pcsx2-qt/resources/icons/white/index.theme b/pcsx2-qt/resources/icons/white/index.theme index 1db4474307..4a5f76b6c7 100644 --- a/pcsx2-qt/resources/icons/white/index.theme +++ b/pcsx2-qt/resources/icons/white/index.theme @@ -6,4 +6,4 @@ Comment=White Icon Theme Size=64 Type=Scalable MinSize=64 -MaxSize=1024 \ No newline at end of file +MaxSize=1024 diff --git a/pcsx2-qt/resources/icons/white/svg/arrow-left-right-line.svg b/pcsx2-qt/resources/icons/white/svg/arrow-left-right-line.svg index a9f9121b17..b3f6cbaf76 100644 --- a/pcsx2-qt/resources/icons/white/svg/arrow-left-right-line.svg +++ b/pcsx2-qt/resources/icons/white/svg/arrow-left-right-line.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/pcsx2-qt/resources/icons/white/svg/checkbox-multiple-blank-line.svg b/pcsx2-qt/resources/icons/white/svg/checkbox-multiple-blank-line.svg new file mode 100644 index 0000000000..273464eec7 --- /dev/null +++ b/pcsx2-qt/resources/icons/white/svg/checkbox-multiple-blank-line.svg @@ -0,0 +1 @@ + diff --git a/pcsx2-qt/resources/icons/white/svg/filter-line.svg b/pcsx2-qt/resources/icons/white/svg/filter-line.svg new file mode 100644 index 0000000000..6b22ced26b --- /dev/null +++ b/pcsx2-qt/resources/icons/white/svg/filter-line.svg @@ -0,0 +1 @@ + diff --git a/pcsx2-qt/resources/icons/white/svg/flashlight-line.svg b/pcsx2-qt/resources/icons/white/svg/flashlight-line.svg new file mode 100644 index 0000000000..0887d14a8d --- /dev/null +++ b/pcsx2-qt/resources/icons/white/svg/flashlight-line.svg @@ -0,0 +1 @@ + diff --git a/pcsx2-qt/resources/icons/white/svg/global-line.svg b/pcsx2-qt/resources/icons/white/svg/global-line.svg new file mode 100644 index 0000000000..267679ba7a --- /dev/null +++ b/pcsx2-qt/resources/icons/white/svg/global-line.svg @@ -0,0 +1 @@ + diff --git a/pcsx2-qt/resources/icons/white/svg/image-fill.svg b/pcsx2-qt/resources/icons/white/svg/image-fill.svg new file mode 100644 index 0000000000..d2b514fd95 --- /dev/null +++ b/pcsx2-qt/resources/icons/white/svg/image-fill.svg @@ -0,0 +1 @@ + diff --git a/pcsx2-qt/resources/icons/white/svg/login-box-line.svg b/pcsx2-qt/resources/icons/white/svg/login-box-line.svg new file mode 100644 index 0000000000..585ef107e2 --- /dev/null +++ b/pcsx2-qt/resources/icons/white/svg/login-box-line.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pcsx2-qt/resources/icons/white/svg/price-tag-3-line.svg b/pcsx2-qt/resources/icons/white/svg/price-tag-3-line.svg new file mode 100644 index 0000000000..d86e54426e --- /dev/null +++ b/pcsx2-qt/resources/icons/white/svg/price-tag-3-line.svg @@ -0,0 +1 @@ + diff --git a/pcsx2-qt/resources/icons/white/svg/trophy-line.svg b/pcsx2-qt/resources/icons/white/svg/trophy-line.svg new file mode 100644 index 0000000000..4173ac212e --- /dev/null +++ b/pcsx2-qt/resources/icons/white/svg/trophy-line.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pcsx2-qt/resources/images/dualshock-2.png b/pcsx2-qt/resources/images/dualshock-2.png index 5e01800c48..4c9e94fd11 100644 Binary files a/pcsx2-qt/resources/images/dualshock-2.png and b/pcsx2-qt/resources/images/dualshock-2.png differ diff --git a/pcsx2-qt/resources/resources.qrc b/pcsx2-qt/resources/resources.qrc index 74ae942578..3b2aeab90c 100644 --- a/pcsx2-qt/resources/resources.qrc +++ b/pcsx2-qt/resources/resources.qrc @@ -7,6 +7,7 @@ icons/black/svg/artboard-2-line.svg icons/black/svg/book-open-line.svg icons/black/svg/brush-line.svg + icons/black/svg/checkbox-multiple-blank-line.svg icons/black/svg/close-line.svg icons/black/svg/dashboard-line.svg icons/black/svg/disc-line.svg @@ -20,6 +21,8 @@ icons/black/svg/file-reduce-line.svg icons/black/svg/file-search-line.svg icons/black/svg/file-settings-line.svg + icons/black/svg/filter-line.svg + icons/black/svg/flashlight-line.svg icons/black/svg/flask-line.svg icons/black/svg/folder-add-line.svg icons/black/svg/folder-open-line.svg @@ -28,12 +31,16 @@ icons/black/svg/fullscreen-line.svg icons/black/svg/function-line.svg icons/black/svg/gamepad-line.svg + icons/black/svg/global-line.svg icons/black/svg/hard-drive-2-line.svg + icons/black/svg/image-fill.svg icons/black/svg/keyboard-line.svg icons/black/svg/layout-grid-line.svg icons/black/svg/list-check.svg + icons/black/svg/login-box-line.svg icons/black/svg/pause-line.svg icons/black/svg/play-line.svg + icons/black/svg/price-tag-3-line.svg icons/black/svg/refresh-line.svg icons/black/svg/restart-line.svg icons/black/svg/save-3-line.svg @@ -41,6 +48,7 @@ icons/black/svg/sd-card-line.svg icons/black/svg/settings-3-line.svg icons/black/svg/shut-down-line.svg + icons/black/svg/trophy-line.svg icons/black/svg/tv-2-line.svg icons/black/svg/volume-up-line.svg icons/black/svg/window-2-line.svg @@ -56,6 +64,7 @@ icons/white/svg/artboard-2-line.svg icons/white/svg/book-open-line.svg icons/white/svg/brush-line.svg + icons/white/svg/checkbox-multiple-blank-line.svg icons/white/svg/close-line.svg icons/white/svg/dashboard-line.svg icons/white/svg/disc-line.svg @@ -69,6 +78,8 @@ icons/white/svg/file-reduce-line.svg icons/white/svg/file-search-line.svg icons/white/svg/file-settings-line.svg + icons/white/svg/filter-line.svg + icons/white/svg/flashlight-line.svg icons/white/svg/flask-line.svg icons/white/svg/folder-add-line.svg icons/white/svg/folder-open-line.svg @@ -77,12 +88,16 @@ icons/white/svg/fullscreen-line.svg icons/white/svg/function-line.svg icons/white/svg/gamepad-line.svg + icons/white/svg/global-line.svg icons/white/svg/hard-drive-2-line.svg + icons/white/svg/image-fill.svg icons/white/svg/keyboard-line.svg icons/white/svg/layout-grid-line.svg icons/white/svg/list-check.svg + icons/white/svg/login-box-line.svg icons/white/svg/pause-line.svg icons/white/svg/play-line.svg + icons/white/svg/price-tag-3-line.svg icons/white/svg/refresh-line.svg icons/white/svg/restart-line.svg icons/white/svg/save-3-line.svg @@ -90,6 +105,7 @@ icons/white/svg/sd-card-line.svg icons/white/svg/settings-3-line.svg icons/white/svg/shut-down-line.svg + icons/white/svg/trophy-line.svg icons/white/svg/tv-2-line.svg icons/white/svg/volume-up-line.svg icons/white/svg/window-2-line.svg diff --git a/pcsx2/Achievements.h b/pcsx2/Achievements.h new file mode 100644 index 0000000000..1fb6bfc4e5 --- /dev/null +++ b/pcsx2/Achievements.h @@ -0,0 +1,78 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "common/Pcsx2Types.h" +#include + +namespace Achievements +{ +#ifdef ENABLE_ACHIEVEMENTS + + // Implemented in Host. + extern bool OnReset(); + extern void LoadState(const u8* state_data, u32 state_data_size); + extern std::vector SaveState(); + extern void GameChanged(u32 crc); + + /// Re-enables hardcode mode if it is enabled in the settings. + extern bool ResetChallengeMode(); + + /// Forces hardcore mode off until next reset. + extern void DisableChallengeMode(); + + /// Prompts the user to disable hardcore mode, if they agree, returns true. + extern bool ConfirmChallengeModeDisable(const char* trigger); + + /// Returns true if features such as save states should be disabled. + extern bool ChallengeModeActive(); + +#else + + // Make noops when compiling without cheevos. + static inline bool OnReset() + { + return true; + } + static inline void LoadState(const u8* state_data, u32 state_data_size) + { + } + static inline std::vector SaveState() + { + return {}; + } + static inline void GameChanged() + { + } + + static constexpr inline bool ChallengeModeActive() + { + return false; + } + + static inline bool ResetChallengeMode() + { + return false; + } + + static inline void DisableChallengeMode() {} + + static inline bool ConfirmChallengeModeDisable(const char* trigger) + { + return true; + } + +#endif +} // namespace Achievements diff --git a/pcsx2/CDVD/CDVD.cpp b/pcsx2/CDVD/CDVD.cpp index 69f5bf4675..a9ca63353d 100644 --- a/pcsx2/CDVD/CDVD.cpp +++ b/pcsx2/CDVD/CDVD.cpp @@ -739,13 +739,14 @@ static int cdvdTrayStateDetecting() else return CDVD_TYPE_DETCT; //Detecting any kind of disc existing } -static uint cdvdRotationalLatency(CDVD_MODE_TYPE mode) +static u32 cdvdRotationalLatency(CDVD_MODE_TYPE mode) { // CAV rotation is constant (minimum speed to maintain exact speed on outer dge if (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) { - float rotationPerSecond = (((mode == MODE_CDROM) ? CD_MIN_ROTATION_X1 : DVD_MIN_ROTATION_X1) * cdvd.Speed) / 60; - float msPerRotation = 1000.0f / rotationPerSecond; + const float rotationPerSecond = static_cast(((mode == MODE_CDROM) ? CD_MIN_ROTATION_X1 : DVD_MIN_ROTATION_X1) * cdvd.Speed) / 60.0f; + const float msPerRotation = 1000.0f / rotationPerSecond; + return ((PSXCLK / 1000) * msPerRotation); } else @@ -775,10 +776,9 @@ static uint cdvdRotationalLatency(CDVD_MODE_TYPE mode) } const float sectorSpeed = (((float)(cdvd.SeekToSector - offset) / numSectors) * 0.60f) + 0.40f; - float rotationPerSecond = (((mode == MODE_CDROM) ? CD_MAX_ROTATION_X1 : DVD_MAX_ROTATION_X1) * cdvd.Speed * sectorSpeed) / 60; - float msPerRotation = 1000.0f / rotationPerSecond; + const float rotationPerSecond = static_cast(((mode == MODE_CDROM) ? CD_MAX_ROTATION_X1 : DVD_MAX_ROTATION_X1) * cdvd.Speed * sectorSpeed) / 60.0f; + const float msPerRotation = 1000.0f / rotationPerSecond; //DevCon.Warning("Rotations per second %f, msPerRotation cycles per ms %f total cycles per ms %d cycles per rotation %d", rotationPerSecond, msPerRotation, (u32)(PSXCLK / 1000), (u32)((PSXCLK / 1000) * msPerRotation)); - return ((PSXCLK / 1000) * msPerRotation); } } @@ -811,15 +811,17 @@ static uint cdvdBlockReadTime(CDVD_MODE_TYPE mode) break; } - const float sectorSpeed = (((float)(cdvd.SeekToSector - offset) / numSectors) * 0.60f) + 0.40f; + // 0.40f is the "base" inner track speed. + const float sectorSpeed = ((static_cast(cdvd.SeekToSector - offset) / static_cast(numSectors)) * 0.60f) + 0.40f; + float cycles = static_cast(PSXCLK) / (static_cast(((mode == MODE_CDROM) ? CD_SECTORS_PERSECOND : DVD_SECTORS_PERSECOND) * cdvd.Speed) * sectorSpeed); - return (PSXCLK / ((((mode == MODE_CDROM) ? CD_SECTORS_PERSECOND : DVD_SECTORS_PERSECOND) * cdvd.Speed) * sectorSpeed)); - //return ((PSXCLK * cdvd.BlockSize) / ((float)(((mode == MODE_CDROM) ? PSX_CD_READSPEED : PSX_DVD_READSPEED) * cdvd.Speed) * sectorSpeed)); + return static_cast(cycles); } // CLV Read Speed is constant - //return ((PSXCLK * cdvd.BlockSize) / (float)(((mode == MODE_CDROM) ? PSX_CD_READSPEED : PSX_DVD_READSPEED) * cdvd.Speed)); - return (PSXCLK / (((mode == MODE_CDROM) ? CD_SECTORS_PERSECOND : DVD_SECTORS_PERSECOND) * cdvd.Speed)); + float cycles = static_cast(PSXCLK) / static_cast(((mode == MODE_CDROM) ? CD_SECTORS_PERSECOND : DVD_SECTORS_PERSECOND) * cdvd.Speed); + + return static_cast(cycles); } void cdvdReset() @@ -839,8 +841,11 @@ void cdvdReset() // If we are recording, always use the same RTC setting // for games that use the RTC to seed their RNG -- this is very important to be the same everytime! -#ifndef DISABLE_RECORDING - if (g_InputRecording.IsActive()) + bool input_recording_active = false; +#ifdef PCSX2_CORE + input_recording_active = g_InputRecording.isActive(); +#endif + if (input_recording_active) { Console.WriteLn("Input Recording Active - Using Constant RTC of 04-03-2020 (DD-MM-YYYY)"); // Why not just 0 everything? Some games apparently require the date to be valid in terms of when @@ -853,7 +858,6 @@ void cdvdReset() cdvd.RTC.year = 20; } else -#endif { // CDVD internally uses GMT+9. If you think the time's wrong, you're wrong. // Set up your time zone and winter/summer in the BIOS. No PS2 BIOS I know of features automatic DST. @@ -1098,8 +1102,9 @@ __fi void cdvdActionInterrupt() cdvdUpdateStatus(CDVD_STATUS_PAUSE); break; } - cdvd.Action = cdvdAction_None; - + + if(cdvd.Action != cdvdAction_Seek) + cdvd.Action = cdvdAction_None; cdvdSetIrq(); } @@ -1113,6 +1118,8 @@ __fi void cdvdSectorReady() if (cdvd.nextSectorsBuffered < 16) CDVDSECTORREADY_INT(cdvd.ReadTime); + else + cdvdUpdateStatus(CDVD_STATUS_PAUSE); } // inlined due to being referenced in only one place. @@ -1123,7 +1130,7 @@ __fi void cdvdReadInterrupt() cdvdUpdateReady(CDVD_DRIVE_BUSY); cdvdUpdateStatus(CDVD_STATUS_READ); cdvd.WaitingDMA = false; - + if (!cdvd.Readed) { // Seeking finished. Process the track we requested before, and @@ -1166,7 +1173,7 @@ __fi void cdvdReadInterrupt() cdvdSetIrq(); return; } - + if (cdvd.Reading) { if (cdvd.RErr == 0) @@ -1236,7 +1243,10 @@ __fi void cdvdReadInterrupt() cdvdSetIrq(); cdvdUpdateReady(CDVD_DRIVE_READY); - cdvdUpdateStatus(CDVD_STATUS_PAUSE); + if (cdvd.nextSectorsBuffered < 16) + cdvdUpdateStatus(CDVD_STATUS_READ); + else + cdvdUpdateStatus(CDVD_STATUS_PAUSE); //DevCon.Warning("Scheduling interrupt in %d cycles", cdvd.ReadTime - ((cdvd.BlockSize / 4) * 12)); // Timing issues on command end // Star Ocean (1.1 Japan) expects the DMA to end and interrupt at least 128 or more cycles before the CDVD command ends. @@ -1288,7 +1298,7 @@ static uint cdvdStartSeek(uint newsector, CDVD_MODE_TYPE mode) // So In the case where it's seeking to data it will be Spinning (0x2) not reading (0x8) and Seeking (0x10, but because seeking is also spinning 0x2 is also set)) // Update - Apparently all that was rubbish and some games don't like it. WRC was the one in this scenario which hated SEEK |ZPAUSE, so just putting it back to pause for now. // We should really run some tests for this behaviour. - + cdvdUpdateStatus(CDVD_STATUS_SEEK); if (!cdvd.Spinning) @@ -1324,7 +1334,7 @@ static uint cdvdStartSeek(uint newsector, CDVD_MODE_TYPE mode) // if delta > 0 it will read a new sector so the readInterrupt will account for this. seektime = 0; isSeeking = false; - + if (delta == 0) { //cdvd.Status = CDVD_STATUS_PAUSE; @@ -1336,9 +1346,9 @@ static uint cdvdStartSeek(uint newsector, CDVD_MODE_TYPE mode) // setting Readed to 0 skips the seek logic, which means the next call to // cdvdReadInterrupt will load a block. So make sure it's properly scheduled // based on sector read speeds: - + //seektime = cdvd.ReadTime; - + if (!cdvd.nextSectorsBuffered)//Buffering time hasn't completed yet so cancel it and simulate the remaining time { if (psxRegs.interrupt & (1 << IopEvt_CdvdSectorReady)) @@ -1356,22 +1366,42 @@ static uint cdvdStartSeek(uint newsector, CDVD_MODE_TYPE mode) } else { - psxRegs.interrupt &= ~(1 << IopEvt_CdvdSectorReady); - cdvd.nextSectorsBuffered = 0; + if (delta >= cdvd.nextSectorsBuffered) + { + psxRegs.interrupt &= ~(1 << IopEvt_CdvdSectorReady); + cdvd.nextSectorsBuffered = 0; + } + else + cdvd.nextSectorsBuffered -= delta; } } // Only do this on reads, the seek kind of accounts for this and then it reads the sectors after - if (delta && !isSeeking) + if ((delta || cdvd.Action == cdvdAction_Seek) && !isSeeking && !cdvd.nextSectorsBuffered) { - int rotationalLatency = cdvdRotationalLatency((CDVD_MODE_TYPE)cdvdIsDVD()); + const u32 rotationalLatency = cdvdRotationalLatency((CDVD_MODE_TYPE)cdvdIsDVD()); //DevCon.Warning("%s rotational latency at sector %d is %d cycles", (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? "CAV" : "CLV", cdvd.SeekToSector, rotationalLatency); seektime += rotationalLatency + cdvd.ReadTime; CDVDSECTORREADY_INT(seektime); seektime += (cdvd.BlockSize / 4) * 12; } - else + else if (!isSeeking) // Not seeking but we have buffered stuff, need to just account for DMA time (and kick the read DMA if it's not running for some reason. + { + if (!(psxRegs.interrupt & (1 << IopEvt_CdvdSectorReady))) + { + seektime += cdvd.ReadTime; + CDVDSECTORREADY_INT(seektime); + } + seektime += (cdvd.BlockSize / 4) * 12; + } + else // We're seeking, so kick off the buffering after the seek finishes. + { CDVDSECTORREADY_INT(seektime); + } + + // Clear the action on the following command, so we can rotate after seek. + if (cdvd.nCommand != N_CD_SEEK) + cdvd.Action = cdvdAction_None; return seektime; } @@ -1727,22 +1757,22 @@ static void cdvdWrite04(u8 rt) // spinup times if needed. cdvdUpdateReady(CDVD_DRIVE_BUSY); DevCon.Warning("CdStandby : %d", rt); - cdvd.Action = cdvdAction_Standby; cdvd.ReadTime = cdvdBlockReadTime((CDVD_MODE_TYPE)cdvdIsDVD()); CDVD_INT(cdvdStartSeek(0, MODE_DVDROM)); // Might not seek, but makes sense since it does move to the inner most track // It's only temporary until the interrupt anyway when it sets itself ready cdvdUpdateStatus(CDVD_STATUS_SEEK); + cdvd.Action = cdvdAction_Standby; break; case N_CD_STOP: // CdStop DevCon.Warning("CdStop : %d", rt); - cdvd.Action = cdvdAction_Stop; cdvdUpdateReady(CDVD_DRIVE_BUSY); cdvd.nextSectorsBuffered = 0; psxRegs.interrupt &= ~(1 << IopEvt_CdvdSectorReady); cdvdUpdateStatus(CDVD_STATUS_SPIN); CDVD_INT(PSXCLK / 6); // 166ms delay? + cdvd.Action = cdvdAction_Stop; break; case N_CD_PAUSE: // CdPause @@ -1758,11 +1788,11 @@ static void cdvdWrite04(u8 rt) break; case N_CD_SEEK: // CdSeek - cdvd.Action = cdvdAction_Seek; cdvdUpdateReady(CDVD_DRIVE_BUSY); cdvd.ReadTime = cdvdBlockReadTime((CDVD_MODE_TYPE)cdvdIsDVD()); CDVD_INT(cdvdStartSeek(*(uint*)(cdvd.NCMDParam + 0), (CDVD_MODE_TYPE)cdvdIsDVD())); cdvdUpdateStatus(CDVD_STATUS_SEEK); + cdvd.Action = cdvdAction_Seek; break; case N_CD_READ: // CdRead @@ -1782,6 +1812,7 @@ static void cdvdWrite04(u8 rt) DevCon.Warning("CDVD: CD Read using Nominal switch from CAV to CLV, unhandled"); bool ParamError = false; + const int oldSpeed = cdvd.Speed; switch (cdvd.SpindlCtrl & CDVD_SPINDLE_SPEED) { @@ -1818,6 +1849,12 @@ static void cdvdWrite04(u8 rt) break; } + if ((cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) != (oldSpindleCtrl & CDVD_SPINDLE_CAV) || oldSpeed != cdvd.Speed) + { + CDVD_LOG("CdRead > Speed change, adding delay"); + cdvd.Spinning = false; + } + if (cdvdIsDVD() && cdvd.NCMDParam[10] != 0) { ParamError = true; @@ -1866,11 +1903,11 @@ static void cdvdWrite04(u8 rt) } CDVD_LOG("CDRead > startSector=%d, seekTo=%d nSectors=%d, RetryCnt=%x, Speed=%dx(%s), ReadMode=%x(%x) SpindleCtrl=%x", - cdvd.Sector, cdvd.SeekToSector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? L"CAV" : L"CLV", cdvd.ReadMode, cdvd.NCMDParam[10], cdvd.SpindlCtrl); + cdvd.Sector, cdvd.SeekToSector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? "CAV" : "CLV", cdvd.ReadMode, cdvd.NCMDParam[10], cdvd.SpindlCtrl); if (EmuConfig.CdvdVerboseReads) Console.WriteLn(Color_Gray, "CDRead: Reading Sector %07d (%03d Blocks of Size %d) at Speed=%dx(%s) Spindle=%x", - cdvd.SeekToSector, cdvd.nSectors, cdvd.BlockSize, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? L"CAV" : L"CLV", cdvd.SpindlCtrl); + cdvd.SeekToSector, cdvd.nSectors, cdvd.BlockSize, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? "CAV" : "CLV", cdvd.SpindlCtrl); cdvd.ReadTime = cdvdBlockReadTime((CDVD_MODE_TYPE)cdvdIsDVD()); CDVDREAD_INT(cdvdStartSeek(cdvd.SeekToSector, (CDVD_MODE_TYPE)cdvdIsDVD())); @@ -1913,6 +1950,7 @@ static void cdvdWrite04(u8 rt) DevCon.Warning("CDVD: CDDA Read using Nominal switch from CAV to CLV, unhandled"); bool ParamError = false; + const int oldSpeed = cdvd.Speed; switch (cdvd.SpindlCtrl & CDVD_SPINDLE_SPEED) { @@ -1937,6 +1975,12 @@ static void cdvdWrite04(u8 rt) break; } + if ((cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) != (oldSpindleCtrl & CDVD_SPINDLE_CAV) || oldSpeed != cdvd.Speed) + { + CDVD_LOG("CdRead > Speed change, adding delay"); + cdvd.Spinning = false; + } + switch (cdvd.NCMDParam[10]) { case 1: @@ -1965,11 +2009,11 @@ static void cdvdWrite04(u8 rt) } CDVD_LOG("CDRead > startSector=%d, seekTo=%d, nSectors=%d, RetryCnt=%x, Speed=%dx(%s), ReadMode=%x(%x) SpindleCtrl=%x", - cdvd.Sector, cdvd.SeekToSector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? L"CAV" : L"CLV", cdvd.ReadMode, cdvd.NCMDParam[10], cdvd.SpindlCtrl); + cdvd.Sector, cdvd.SeekToSector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? "CAV" : "CLV", cdvd.ReadMode, cdvd.NCMDParam[10], cdvd.SpindlCtrl); if (EmuConfig.CdvdVerboseReads) Console.WriteLn(Color_Gray, "CdAudioRead: Reading Sector %07d (%03d Blocks of Size %d) at Speed=%dx(%s) Spindle=%x", - cdvd.Sector, cdvd.nSectors, cdvd.BlockSize, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? L"CAV" : L"CLV", cdvd.SpindlCtrl); + cdvd.Sector, cdvd.nSectors, cdvd.BlockSize, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? "CAV" : "CLV", cdvd.SpindlCtrl); cdvd.ReadTime = cdvdBlockReadTime(MODE_CDROM); CDVDREAD_INT(cdvdStartSeek(cdvd.SeekToSector, MODE_CDROM)); @@ -2015,6 +2059,7 @@ static void cdvdWrite04(u8 rt) DevCon.Warning("CDVD: DVD Read using Nominal switch from CAV to CLV, unhandled"); bool ParamError = false; + const int oldSpeed = cdvd.Speed; switch (cdvd.SpindlCtrl & CDVD_SPINDLE_SPEED) { @@ -2033,6 +2078,12 @@ static void cdvdWrite04(u8 rt) break; } + if ((cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) != (oldSpindleCtrl & CDVD_SPINDLE_CAV) || oldSpeed != cdvd.Speed) + { + CDVD_LOG("DvdRead > Speed change, adding delay"); + cdvd.Spinning = false; + } + if (cdvd.NCMDParam[10] != 0) ParamError = true; @@ -2061,11 +2112,11 @@ static void cdvdWrite04(u8 rt) } CDVD_LOG("DvdRead > startSector=%d, seekTo=%d nSectors=%d, RetryCnt=%x, Speed=%dx(%s), ReadMode=%x(%x) SpindleCtrl=%x", - cdvd.Sector, cdvd.SeekToSector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? L"CAV" : L"CLV", cdvd.ReadMode, cdvd.NCMDParam[10], cdvd.SpindlCtrl); + cdvd.Sector, cdvd.SeekToSector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? "CAV" : "CLV", cdvd.ReadMode, cdvd.NCMDParam[10], cdvd.SpindlCtrl); if (EmuConfig.CdvdVerboseReads) Console.WriteLn(Color_Gray, "DvdRead: Reading Sector %07d (%03d Blocks of Size %d) at Speed=%dx(%s) SpindleCtrl=%x", - cdvd.SeekToSector, cdvd.nSectors, cdvd.BlockSize, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? L"CAV" : L"CLV", cdvd.SpindlCtrl); + cdvd.SeekToSector, cdvd.nSectors, cdvd.BlockSize, cdvd.Speed, (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) ? "CAV" : "CLV", cdvd.SpindlCtrl); cdvd.ReadTime = cdvdBlockReadTime(MODE_DVDROM); CDVDREAD_INT(cdvdStartSeek(cdvd.SeekToSector, MODE_DVDROM)); diff --git a/pcsx2/CDVD/CDVD.h b/pcsx2/CDVD/CDVD.h index d02f668e99..d0edaa6c19 100644 --- a/pcsx2/CDVD/CDVD.h +++ b/pcsx2/CDVD/CDVD.h @@ -15,7 +15,7 @@ #pragma once -#include "CDVDaccess.h" +#include "CDVDcommon.h" #include #include diff --git a/pcsx2/CDVD/CDVD_internal.h b/pcsx2/CDVD/CDVD_internal.h index bce277d6e2..97e28cc379 100644 --- a/pcsx2/CDVD/CDVD_internal.h +++ b/pcsx2/CDVD/CDVD_internal.h @@ -277,14 +277,17 @@ static NVMLayout nvmlayouts[NVM_FORMAT_MAX] = {0x146, 0x270, 0x2B0, 0x200, 0x1C8, 0x1E0, 0x1B0, 0x180, 0x198}, // eeproms from bios v1.70 and up }; -static u8 biosLangDefaults[8][16] = -{ - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // T10K (Japanese, generally gets overridden) - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Test (Japanese, as above) - {0x20, 0x20, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30}, // Japan (Japanese) - {0x30, 0x21, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41}, // USA (English) - {0x30, 0x21, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41}, // Europe (English) - {0x30, 0x21, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41}, // HongKong (English) - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Free (Japanese, no examples to use) - {0x30, 0x2B, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B}, // China (Simplified Chinese) +static u8 biosLangDefaults[11][16] = + { + {0x20, 0x20, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30}, // Japan (Japanese) + {0x30, 0x21, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41}, // USA (English) + {0x30, 0x21, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41}, // Europe (English) + {0x30, 0x21, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41}, // Oceania (English) + {0x30, 0x21, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41}, // Asia (English) + {0x30, 0x21, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41}, // Russia (English) + {0x30, 0x2B, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B}, // China (Simplified Chinese) + {0x30, 0x21, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41}, // Mexico (English) + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // T10K (Japanese, generally gets overridden) + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Test (Japanese, as above) + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Free (Japanese, no examples to use) }; diff --git a/pcsx2/CDVD/CDVDaccess.cpp b/pcsx2/CDVD/CDVDcommon.cpp similarity index 99% rename from pcsx2/CDVD/CDVDaccess.cpp rename to pcsx2/CDVD/CDVDcommon.cpp index 20fcf54c39..17d4bbb889 100644 --- a/pcsx2/CDVD/CDVDaccess.cpp +++ b/pcsx2/CDVD/CDVDcommon.cpp @@ -413,7 +413,7 @@ bool DoCDVDopen() CDVD->getTD(0, &td); #ifdef PCSX2_CORE - Host::AddKeyedOSDMessage("BlockDumpCreate", fmt::format("Saving CDVD block dump to '{}'.", temp), 10.0f); + Host::AddKeyedOSDMessage("BlockDumpCreate", fmt::format("Saving CDVD block dump to '{}'.", temp), Host::OSD_INFO_DURATION); #endif blockDumpFile.Create(std::move(temp), 2); diff --git a/pcsx2/CDVD/CDVDaccess.h b/pcsx2/CDVD/CDVDcommon.h similarity index 99% rename from pcsx2/CDVD/CDVDaccess.h rename to pcsx2/CDVD/CDVDcommon.h index 5944ea2b88..de32341197 100644 --- a/pcsx2/CDVD/CDVDaccess.h +++ b/pcsx2/CDVD/CDVDcommon.h @@ -145,7 +145,7 @@ struct CDVD_API }; // ---------------------------------------------------------------------------- -// Multiple interface system for CDVD. +// Multiple interface system for CDVD. // ---------------------------------------------------------------------------- extern CDVD_API* CDVD; // currently active CDVD access mode api (either Iso, NoDisc, or Disc) diff --git a/pcsx2/CDVD/CDVDdiscReader.h b/pcsx2/CDVD/CDVDdiscReader.h index 3a2f596e13..622942b98d 100644 --- a/pcsx2/CDVD/CDVDdiscReader.h +++ b/pcsx2/CDVD/CDVDdiscReader.h @@ -15,9 +15,8 @@ #pragma once -#if defined(_WIN32) -#define NOMINMAX -#include +#ifdef _WIN32 +#include "common/RedtapeWindows.h" #endif #include diff --git a/pcsx2/CDVD/GzippedFileReader.cpp b/pcsx2/CDVD/GzippedFileReader.cpp index 8a17ba9a39..f8d06653b7 100644 --- a/pcsx2/CDVD/GzippedFileReader.cpp +++ b/pcsx2/CDVD/GzippedFileReader.cpp @@ -332,11 +332,11 @@ bool GzippedFileReader::OkIndex() // No valid index file. Generate an index Console.Warning("This may take a while (but only once). Scanning compressed file to generate a quick access index..."); + const s64 prevoffset = FileSystem::FTell64(m_src); Access* index; - FILE* infile = FileSystem::OpenCFile(m_filename.c_str(), "rb"); - int len = build_index(infile, GZFILE_SPAN_DEFAULT, &index); + int len = build_index(m_src, GZFILE_SPAN_DEFAULT, &index); printf("\n"); // build_index prints progress without \n's - fclose(infile); + FileSystem::FSeek64(m_src, prevoffset, SEEK_SET); if (len >= 0) { diff --git a/pcsx2/CDVD/IsoFS/IsoDirectory.h b/pcsx2/CDVD/IsoFS/IsoDirectory.h index e270ff976e..b5e2d1f611 100644 --- a/pcsx2/CDVD/IsoFS/IsoDirectory.h +++ b/pcsx2/CDVD/IsoFS/IsoDirectory.h @@ -34,7 +34,7 @@ public: public: IsoDirectory(SectorSource& r); - IsoDirectory(SectorSource& r, IsoFileDescriptor directoryEntry); + IsoDirectory(SectorSource& r, const IsoFileDescriptor& directoryEntry); virtual ~IsoDirectory() = default; std::string FStype_ToString() const; diff --git a/pcsx2/CDVD/IsoFS/IsoFS.cpp b/pcsx2/CDVD/IsoFS/IsoFS.cpp index 4a2a250760..23ed40600d 100644 --- a/pcsx2/CDVD/IsoFS/IsoFS.cpp +++ b/pcsx2/CDVD/IsoFS/IsoFS.cpp @@ -62,7 +62,10 @@ IsoDirectory::IsoDirectory(SectorSource& r) while (!done) { u8 sector[2048]; - internalReader.readSector(sector, i); + // If this fails, we're not reading an iso, or it's bad. + if (!internalReader.readSector(sector, i)) + break; + if (memcmp(§or[1], "CD001", 5) == 0) { switch (sector[0]) @@ -112,7 +115,7 @@ IsoDirectory::IsoDirectory(SectorSource& r) } // Used to load a specific directory from a file descriptor -IsoDirectory::IsoDirectory(SectorSource& r, IsoFileDescriptor directoryEntry) +IsoDirectory::IsoDirectory(SectorSource& r, const IsoFileDescriptor& directoryEntry) : internalReader(r) { m_fstype = FStype_ISO9660; @@ -222,10 +225,10 @@ u32 IsoDirectory::GetFileSize(const std::string_view& filePath) const } IsoFileDescriptor::IsoFileDescriptor() + : lba(0) + , size(0) + , flags(0) { - lba = 0; - size = 0; - flags = 0; memset(&date, 0, sizeof(date)); } diff --git a/pcsx2/CDVD/IsoFS/IsoFSCDVD.cpp b/pcsx2/CDVD/IsoFS/IsoFSCDVD.cpp index 3df2c39dd0..5fa89a1872 100644 --- a/pcsx2/CDVD/IsoFS/IsoFSCDVD.cpp +++ b/pcsx2/CDVD/IsoFS/IsoFSCDVD.cpp @@ -17,7 +17,7 @@ #include "PrecompiledHeader.h" #include "IsoFSCDVD.h" -#include "CDVD/CDVDaccess.h" +#include "CDVD/CDVDcommon.h" IsoFSCDVD::IsoFSCDVD() { diff --git a/pcsx2/CDVD/OutputIsoFile.cpp b/pcsx2/CDVD/OutputIsoFile.cpp index 1759194ecd..3942d1a017 100644 --- a/pcsx2/CDVD/OutputIsoFile.cpp +++ b/pcsx2/CDVD/OutputIsoFile.cpp @@ -58,8 +58,7 @@ void OutputIsoFile::Create(std::string filename, int version) if (!m_outstream) { Console.Error("(OutputIsoFile::Create) Unable to open the file '%s' for writing: %d", m_filename.c_str(), errno); - ScopedExcept ex(Exception::FromErrno(filename, errno)); - ex->Rethrow(); + Exception::FromErrno(filename, errno)->Rethrow(); } Console.WriteLn("isoFile create ok: %s ", m_filename.c_str()); @@ -130,7 +129,7 @@ void OutputIsoFile::WriteBuffer(const void* src, size_t size) .SetDiagMsg(fmt::format("An error occurred while writing {} bytes to file", size)); } - ScopedExcept ex(Exception::FromErrno(m_filename, err)); + std::unique_ptr ex(Exception::FromErrno(m_filename, err)); ex->SetDiagMsg(fmt::format("An error occurred while writing {} bytes to file: {}", size, ex->DiagMsg())); ex->Rethrow(); } diff --git a/pcsx2/CDVD/Ps1CD.h b/pcsx2/CDVD/Ps1CD.h index fc0468b04e..7172d84366 100644 --- a/pcsx2/CDVD/Ps1CD.h +++ b/pcsx2/CDVD/Ps1CD.h @@ -15,7 +15,7 @@ #pragma once -#include "CDVDaccess.h" +#include "CDVDcommon.h" // Not used. typedef struct diff --git a/pcsx2/CDVD/Windows/IOCtlSrc.cpp b/pcsx2/CDVD/Windows/IOCtlSrc.cpp index 695b84e28d..90b9beb604 100644 --- a/pcsx2/CDVD/Windows/IOCtlSrc.cpp +++ b/pcsx2/CDVD/Windows/IOCtlSrc.cpp @@ -212,7 +212,7 @@ bool IOCtlSrc::ReadDVDInfo() // least 18 bytes of the layer descriptor or else the ioctl will fail. The // media specific information seems to be empty, so there's no point reading // any more than that. - + // UPDATE 15 Jan 2021 // Okay so some drives seem to have descriptors BIGGER than 22 bytes! // This causes the read to fail with INVALID_PARAMETER. diff --git a/pcsx2/CMakeLists.txt b/pcsx2/CMakeLists.txt index 3236eec244..6838ce3e99 100644 --- a/pcsx2/CMakeLists.txt +++ b/pcsx2/CMakeLists.txt @@ -42,6 +42,7 @@ if(MSVC) if (MSVC_VERSION GREATER_EQUAL 1930) target_compile_options(PCSX2_FLAGS INTERFACE /fp:contract) endif() + target_compile_options(PCSX2_FLAGS INTERFACE /GS-) else() target_compile_options(PCSX2_FLAGS INTERFACE -ffp-contract=fast @@ -65,11 +66,6 @@ elseif("${PGO}" STREQUAL "use") target_compile_options(PCSX2_FLAGS INTERFACE -fprofile-use) endif() -if(TARGET PulseAudio::PulseAudio) - target_compile_definitions(PCSX2_FLAGS INTERFACE SPU2X_PULSEAUDIO) - target_link_libraries(PCSX2_FLAGS INTERFACE PulseAudio::PulseAudio) -endif() - if(XDG_STD) target_compile_definitions(PCSX2_FLAGS INTERFACE XDG_STD) endif() @@ -91,22 +87,16 @@ if(TARGET SDL2::SDL2 OR TARGET SDL2::SDL2-static) endif() if(WIN32) - # Resources - target_sources(PCSX2 PRIVATE - PCSX2.rc - GS/GS.rc - PAD/Windows/PAD.rc - SPU2/Windows/SPU2.rc - USB/usb-pad/dx/versionproxy.rc - USB/usb-pad/raw/raw-config.rc - windows/wxResources.rc - windows/PCSX2.manifest - ) + if(PCSX2_CORE) + set(MIN_WIN32 0x0A00) + else() + set(MIN_WIN32 0x0603) + endif() target_compile_definitions(PCSX2_FLAGS INTERFACE - _M_SSE=0x401 # TODO: Multiple ISA + __SSE4_1__ DIRECTINPUT_VERSION=0x0800 - WINVER=0x0603 - _WIN32_WINNT=0x0603 + WINVER=${MIN_WIN32} + _WIN32_WINNT=${MIN_WIN32} WIN32_LEAN_AND_MEAN LZMA_API_STATIC WIL_SUPPRESS_EXCEPTIONS @@ -114,7 +104,6 @@ if(WIN32) target_include_directories(PCSX2_FLAGS INTERFACE ../3rdparty # GL headers ) - set_target_properties(PCSX2 PROPERTIES WIN32_EXECUTABLE TRUE) endif(WIN32) # Main pcsx2 source @@ -147,16 +136,17 @@ set(pcsx2Sources IopHw.cpp IopIrq.cpp IopMem.cpp - IopSio2.cpp PINE.cpp Mdec.cpp Memory.cpp MemoryCardFile.cpp MemoryCardFolder.cpp + MemoryCardProtocol.cpp MMI.cpp MTGS.cpp MTVU.cpp MultipartFileReader.cpp + MultitapProtocol.cpp Patch.cpp Patch_Memory.cpp Pcsx2Config.cpp @@ -198,6 +188,7 @@ set(pcsx2Sources # Main pcsx2 header set(pcsx2Headers + Achievements.h AsyncFileReader.h Cache.h Common.h @@ -222,14 +213,15 @@ set(pcsx2Headers IopGte.h IopHw.h IopMem.h - IopSio2.h PINE.h Mdec.h MTVU.h Memory.h MemoryCardFile.h MemoryCardFolder.h + MemoryCardProtocol.h MemoryTypes.h + MultitapProtocol.h Patch.h PCSX2Base.h PerformanceMetrics.h @@ -239,11 +231,11 @@ set(pcsx2Headers R5900.h R5900OpcodeTables.h SaveState.h + ShaderCacheVersion.h Sifcmd.h Sif.h SingleRegisterTypes.h Sio.h - sio_internal.h SPR.h SysForwardDefs.h System.h @@ -259,7 +251,7 @@ set(pcsx2Headers set(pcsx2CDVDSources CDVD/BlockdumpFileReader.cpp CDVD/Ps1CD.cpp - CDVD/CDVDaccess.cpp + CDVD/CDVDcommon.cpp CDVD/CDVD.cpp CDVD/CDVDdiscReader.cpp CDVD/CDVDisoReader.cpp @@ -280,7 +272,7 @@ set(pcsx2CDVDSources # CDVD headers set(pcsx2CDVDHeaders CDVD/Ps1CD.h - CDVD/CDVDaccess.h + CDVD/CDVDcommon.h CDVD/CDVD.h CDVD/CDVD_internal.h CDVD/CDVDdiscReader.h @@ -442,7 +434,7 @@ endif() set(pcsx2USBNullSources USB/USBNull.cpp) set(pcsx2USBNullHeaders USB/USB.h) -# USB sources +# USB sources set(pcsx2USBSources USB/USB.cpp USB/deviceproxy.cpp @@ -465,8 +457,6 @@ set(pcsx2USBSources USB/usb-mic/usb-mic-singstar.cpp USB/usb-mic/usb-mic-logitech.cpp USB/usb-mic/usb-headset.cpp - ../3rdparty/jpgd/jpgd.cpp - ../3rdparty/jpgd/jpge.cpp USB/usb-eyetoy/jo_mpeg.cpp USB/usb-eyetoy/usb-eyetoy-webcam.cpp USB/usb-hid/usb-hid.cpp @@ -524,6 +514,7 @@ set(pcsx2USBHeaders if(TARGET PulseAudio::PulseAudio) list(APPEND pcsx2USBSources USB/usb-mic/audiodev-pulse.cpp) list(APPEND pcsx2USBHeaders USB/usb-mic/audiodev-pulse.h) + target_link_libraries(PCSX2_FLAGS INTERFACE PulseAudio::PulseAudio) endif() if(PCSX2_CORE) @@ -659,10 +650,24 @@ else() endif() # GS sources +set(pcsx2GSSourcesUnshared + GS/GSBlock.cpp + GS/GSLocalMemoryMultiISA.cpp + GS/GSXXH.cpp + GS/Renderers/Common/GSVertexTraceFMM.cpp + GS/Renderers/HW/GSRendererHWMultiISA.cpp + GS/Renderers/SW/GSDrawScanline.cpp + GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp + GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.cpp + GS/Renderers/SW/GSRasterizer.cpp + GS/Renderers/SW/GSRendererSW.cpp + GS/Renderers/SW/GSSetupPrimCodeGenerator.cpp + GS/Renderers/SW/GSSetupPrimCodeGenerator.all.cpp +) + set(pcsx2GSSources GS/GS.cpp GS/GSAlignedClass.cpp - GS/GSBlock.cpp GS/GSCapture.cpp GS/GSClut.cpp GS/GSCodeBuffer.cpp @@ -678,6 +683,7 @@ set(pcsx2GSSources GS/GSTables.cpp GS/GSUtil.cpp GS/GSVector.cpp + GS/MultiISA.cpp GS/Renderers/Common/GSDevice.cpp GS/Renderers/Common/GSDirtyRect.cpp GS/Renderers/Common/GSFunctionMap.cpp @@ -692,14 +698,7 @@ set(pcsx2GSSources GS/Renderers/HW/GSTextureCache.cpp GS/Renderers/HW/GSTextureReplacementLoaders.cpp GS/Renderers/HW/GSTextureReplacements.cpp - GS/Renderers/SW/GSDrawScanline.cpp - GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp - GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.cpp GS/Renderers/SW/GSNewCodeGenerator.cpp - GS/Renderers/SW/GSRasterizer.cpp - GS/Renderers/SW/GSRendererSW.cpp - GS/Renderers/SW/GSSetupPrimCodeGenerator.cpp - GS/Renderers/SW/GSSetupPrimCodeGenerator.all.cpp GS/Renderers/SW/GSTextureCacheSW.cpp GS/Renderers/SW/GSTextureSW.cpp GS/Window/GSSetting.cpp @@ -737,6 +736,8 @@ set(pcsx2GSHeaders GS/GSVector4i.h GS/GSVector8.h GS/GSVector8i.h + GS/GSXXH.h + GS/MultiISA.h GS/Renderers/Common/GSDevice.h GS/Renderers/Common/GSDirtyRect.h GS/Renderers/Common/GSFastList.h @@ -799,23 +800,16 @@ if(USE_VULKAN) endif() set(pcsx2GSMetalShaders + GS/Renderers/Metal/cas.metal GS/Renderers/Metal/convert.metal GS/Renderers/Metal/present.metal GS/Renderers/Metal/merge.metal + GS/Renderers/Metal/misc.metal GS/Renderers/Metal/interlace.metal GS/Renderers/Metal/tfx.metal GS/Renderers/Metal/fxaa.metal ) -if(NOT PCSX2_CORE) - list(APPEND pcsx2GSSources - GS/Window/GSwxDialog.cpp - ) - list(APPEND pcsx2GSHeaders - GS/Window/GSwxDialog.h - ) -endif() - if(PCSX2_CORE) list(APPEND pcsx2SPU2Headers SPU2/Host/Config.cpp @@ -832,22 +826,50 @@ if(PCSX2_CORE) SPU2/WavFile.cpp ) endif() -elseif(WIN32) - list(APPEND pcsx2SPU2Sources - SPU2/Windows/CfgHelpers.cpp - SPU2/Windows/Config.cpp - SPU2/Windows/ConfigDebug.cpp - SPU2/Windows/ConfigSoundTouch.cpp - SPU2/Windows/dsp.cpp - SPU2/Windows/RealtimeDebugger.cpp - SPU2/Windows/SndOut_XAudio2.cpp - SPU2/Windows/UIHelpers.cpp +else() + list(APPEND pcsx2GSSources + GS/Window/GSwxDialog.cpp ) - list(APPEND pcsx2SPU2Headers - SPU2/Windows/Dialogs.h - SPU2/Windows/dsp.h - SPU2/Windows/resource.h - SPU2/Windows/WinConfig.h + list(APPEND pcsx2GSHeaders + GS/Window/GSwxDialog.h + ) + if(WIN32) + list(APPEND pcsx2SPU2Sources + SPU2/Windows/CfgHelpers.cpp + SPU2/Windows/Config.cpp + SPU2/Windows/ConfigDebug.cpp + SPU2/Windows/ConfigSoundTouch.cpp + SPU2/Windows/dsp.cpp + SPU2/Windows/RealtimeDebugger.cpp + SPU2/Windows/UIHelpers.cpp + ) + list(APPEND pcsx2SPU2Headers + SPU2/Windows/Dialogs.h + SPU2/Windows/dsp.h + SPU2/Windows/resource.h + SPU2/Windows/WinConfig.h + ) + else() + list(APPEND pcsx2SPU2Sources + SPU2/Linux/CfgHelpers.cpp + SPU2/Linux/Config.cpp + SPU2/Linux/ConfigDebug.cpp + SPU2/Linux/ConfigSoundTouch.cpp + SPU2/Linux/Dialogs.cpp + SPU2/WavFile.cpp + SPU2/wx/wxConfig.cpp + ) + list(APPEND pcsx2SPU2Headers + SPU2/Linux/Config.h + SPU2/Linux/Dialogs.h + SPU2/wx/wxConfig.h + ) + endif() +endif() + +if(WIN32) + list(APPEND pcsx2SPU2Sources + SPU2/Windows/SndOut_XAudio2.cpp ) list(APPEND pcsx2DEV9Sources @@ -910,21 +932,6 @@ elseif(WIN32) GS/Renderers/DX12/GSTexture12.h ) else() - list(APPEND pcsx2SPU2Sources - SPU2/Linux/CfgHelpers.cpp - SPU2/Linux/Config.cpp - SPU2/Linux/ConfigDebug.cpp - SPU2/Linux/ConfigSoundTouch.cpp - SPU2/Linux/Dialogs.cpp - SPU2/WavFile.cpp - SPU2/wx/wxConfig.cpp - ) - list(APPEND pcsx2SPU2Headers - SPU2/Linux/Config.h - SPU2/Linux/Dialogs.h - SPU2/wx/wxConfig.h - ) - list(APPEND pcsx2USBSources USB/icon_buzz_24.cpp USB/linux/config-gtk.cpp @@ -960,6 +967,74 @@ else() ) endif() +# IPU sources +set(pcsx2IPUSources + IPU/IPU.cpp + IPU/IPU_Fifo.cpp + IPU/IPUdma.cpp +) + +set(pcsx2IPUSourcesUnshared + IPU/IPU_MultiISA.cpp + IPU/IPUdither.cpp + IPU/mpeg2lib/Idct.cpp + IPU/mpeg2lib/Mpeg.cpp + IPU/yuv2rgb.cpp +) + +# IPU headers +set(pcsx2IPUHeaders + IPU/IPU.h + IPU/IPU_Fifo.h + IPU/IPU_MultiISA.h + IPU/IPUdma.h + IPU/mpeg2lib/Mpeg.h + IPU/mpeg2lib/Vlc.h + IPU/yuv2rgb.h +) + +if(DISABLE_ADVANCE_SIMD) + target_compile_definitions(PCSX2 PRIVATE MULTI_ISA_SHARED_COMPILATION) + if(USE_GCC) + target_link_options(PCSX2_FLAGS INTERFACE -Wno-odr) + endif() + if(WIN32) + set(compile_options_avx2 /arch:AVX2) + set(compile_options_avx /arch:AVX) + elseif(USE_GCC) + # GCC can't inline into multi-isa functions if we use march and mtune, but can if we use feature flags + set(compile_options_avx2 -msse4.1 -mavx -mavx2 -mbmi -mbmi2 -mfma) + set(compile_options_avx -msse4.1 -mavx) + set(compile_options_sse4 -msse4.1) + else() + set(compile_options_avx2 -march=haswell -mtune=haswell) + set(compile_options_avx -march=sandybridge -mtune=sandybridge) + set(compile_options_sse4 -msse4.1 -mtune=nehalem) + endif() + # ODR violation time! + # Everything would be fine if we only defined things in cpp files, but C++ tends to like inline functions (STL anyone?) + # Each ISA will bring with it its own copies of these inline header functions, and the linker gets to choose whichever one it wants! Not fun if the linker chooses the avx2 version and uses it with everything + # Thankfully, most linkers don't choose at random. When presented with a bunch of .o files, most linkers seem to choose the first implementation they see, so make sure you order these from oldest to newest + # Note: ld64 (macOS's linker) does not act the same way when presented with .a files, unless linked with `-force_load` (cmake WHOLE_ARCHIVE). + set(is_first_isa "1") + foreach(isa "sse4" "avx" "avx2") + add_library(GS-${isa} STATIC ${pcsx2GSSourcesUnshared} ${pcsx2IPUSourcesUnshared}) + target_link_libraries(GS-${isa} PRIVATE PCSX2_FLAGS) + target_compile_definitions(GS-${isa} PRIVATE MULTI_ISA_UNSHARED_COMPILATION=isa_${isa} MULTI_ISA_IS_FIRST=${is_first_isa} ${pcsx2_defs_${isa}}) + target_compile_options(GS-${isa} PRIVATE ${compile_options_${isa}}) + if (${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.24) + target_link_libraries(PCSX2 PRIVATE $) + elseif(APPLE) + message(FATAL_ERROR "MacOS builds with DISABLE_ADVANCE_SIMD=ON require CMake 3.24") + else() + target_link_libraries(PCSX2 PRIVATE GS-${isa}) + endif() + set(is_first_isa "0") + endforeach() +else() + list(APPEND pcsx2GSSources ${pcsx2GSSourcesUnshared}) + list(APPEND pcsx2IPUSources ${pcsx2IPUSourcesUnshared}) +endif() # DebugTools sources set(pcsx2DebugToolsSources @@ -998,11 +1073,13 @@ set(pcsx2DebugToolsHeaders # Frontend sources set(pcsx2FrontendSources Frontend/ImGuiManager.cpp + Frontend/ImGuiOverlays.cpp ) # Frontend headers set(pcsx2FrontendHeaders Frontend/ImGuiManager.h + Frontend/ImGuiOverlays.h ) if(USE_OPENGL) @@ -1064,26 +1141,66 @@ endif() if(PCSX2_CORE) list(APPEND pcsx2FrontendSources + Frontend/CommonHost.cpp + Frontend/CommonHotkeys.cpp + Frontend/FullscreenUI.cpp Frontend/GameList.cpp - Frontend/INISettingsInterface.cpp + Frontend/HostSettings.cpp + Frontend/ImGuiFullscreen.cpp Frontend/InputManager.cpp Frontend/InputSource.cpp Frontend/LayeredSettingsInterface.cpp Frontend/LogSink.cpp GSDumpReplayer.cpp - HostSettings.cpp + INISettingsInterface.cpp VMManager.cpp ) list(APPEND pcsx2FrontendHeaders + Frontend/CommonHost.h + Frontend/FullscreenUI.h Frontend/GameList.h - Frontend/INISettingsInterface.h + Frontend/ImGuiFullscreen.h Frontend/InputManager.h Frontend/InputSource.h Frontend/LayeredSettingsInterface.h Frontend/LogSink.h GSDumpReplayer.h HostSettings.h + INISettingsInterface.h VMManager.h) + + if(USE_ACHIEVEMENTS) + list(APPEND pcsx2FrontendSources + Frontend/Achievements.cpp + ) + list(APPEND pcsx2FrontendHeaders + Frontend/Achievements.h + ) + target_compile_definitions(PCSX2_FLAGS INTERFACE + ENABLE_ACHIEVEMENTS + ) + target_link_libraries(PCSX2_FLAGS INTERFACE + rcheevos + ) + endif() + if(USE_DISCORD_PRESENCE) + target_compile_definitions(PCSX2_FLAGS INTERFACE + ENABLE_DISCORD_PRESENCE + ) + target_link_libraries(PCSX2_FLAGS INTERFACE + discord-rpc + ) + endif() + if(WIN32) + list(APPEND pcsx2FrontendSources + Frontend/DInputSource.cpp + Frontend/XInputSource.cpp + ) + list(APPEND pcsx2FrontendHeaders + Frontend/DInputSource.h + Frontend/XInputSource.h + ) + endif() endif() # gui sources @@ -1246,26 +1363,6 @@ set(pcsx2GuiResources ${res_bin}/Breakpoint_Inactive.h ) -# IPU sources -set(pcsx2IPUSources - IPU/IPU.cpp - IPU/IPU_Fifo.cpp - IPU/IPUdither.cpp - IPU/IPUdma.cpp - IPU/mpeg2lib/Idct.cpp - IPU/mpeg2lib/Mpeg.cpp - IPU/yuv2rgb.cpp) - -# IPU headers -set(pcsx2IPUHeaders - IPU/IPUdma.h - IPU/IPU_Fifo.h - IPU/IPU.h - IPU/mpeg2lib/Mpeg.h - IPU/mpeg2lib/Vlc.h - IPU/yuv2rgb.h - ) - # Linux sources set(pcsx2LinuxSources CDVD/Linux/DriveUtility.cpp @@ -1347,12 +1444,8 @@ set(pcsx2RecordingSources ${rec_src}/InputRecording.cpp ${rec_src}/InputRecordingControls.cpp ${rec_src}/InputRecordingFile.cpp - ${rec_src}/NewRecordingFrame.cpp ${rec_src}/PadData.cpp ${rec_src}/Utilities/InputRecordingLogger.cpp - ${rec_vp_src}/VirtualPad.cpp - ${rec_vp_src}/VirtualPadData.cpp - ${rec_vp_src}/VirtualPadResources.cpp ) # Recording headers @@ -1360,38 +1453,8 @@ set(pcsx2RecordingHeaders ${rec_src}/InputRecording.h ${rec_src}/InputRecordingControls.h ${rec_src}/InputRecordingFile.h - ${rec_src}/NewRecordingFrame.h ${rec_src}/PadData.h ${rec_src}/Utilities/InputRecordingLogger.h - ${rec_vp_src}/VirtualPad.h - ${rec_vp_src}/VirtualPadData.h - ${rec_vp_src}/VirtualPadResources.h -) - -# Warning: the declaration of the .h are mandatory in case of resources files. It will ensure the creation -# from the bin2cpp tools at the right moment (ie .h must be created before the pcsx2 compilation) -# Recording - VirtualPad resources headers -set(res_rec_vp_src "${CMAKE_SOURCE_DIR}/pcsx2/Recording/VirtualPad/img") -set(pcsx2RecordingVirtualPadResources - ${res_rec_vp_src}/circlePressed.h - ${res_rec_vp_src}/controllerFull.h - ${res_rec_vp_src}/controllerHalf.h - ${res_rec_vp_src}/controllerThreeQuarters.h - ${res_rec_vp_src}/crossPressed.h - ${res_rec_vp_src}/downPressed.h - ${res_rec_vp_src}/l1Pressed.h - ${res_rec_vp_src}/l2Pressed.h - ${res_rec_vp_src}/l3Pressed.h - ${res_rec_vp_src}/leftPressed.h - ${res_rec_vp_src}/r1Pressed.h - ${res_rec_vp_src}/r2Pressed.h - ${res_rec_vp_src}/r3Pressed.h - ${res_rec_vp_src}/rightPressed.h - ${res_rec_vp_src}/selectPressed.h - ${res_rec_vp_src}/squarePressed.h - ${res_rec_vp_src}/startPressed.h - ${res_rec_vp_src}/trianglePressed.h - ${res_rec_vp_src}/upPressed.h ) # System headers @@ -1404,11 +1467,15 @@ set(pcsx2WindowsSources CDVD/Windows/IOCtlSrc.cpp windows/FlatFileReaderWindows.cpp windows/Optimus.cpp - windows/VCprojects/IopSif.cpp - windows/WinConsolePipe.cpp - windows/WinKeyCodes.cpp - windows/WinPowerProfile.cpp +) + +if(NOT PCSX2_CORE) + list(APPEND pcsx2WindowsSources + windows/WinConsolePipe.cpp + windows/WinKeyCodes.cpp + windows/WinPowerProfile.cpp ) +endif() # Windows headers set(pcsx2WindowsHeaders @@ -1495,13 +1562,24 @@ set(pcsx2LTOSources ${pcsx2IPUHeaders} ${pcsx2x86Sources} ${pcsx2x86Headers} + ${pcsx2SPU2Sources} + ${pcsx2SPU2Headers} + ${pcsx2GSSources} + ${pcsx2GSHeaders} ) if(LTO_PCSX2_CORE) add_library(PCSX2_LTO ${pcsx2LTOSources}) + if (WIN32) + target_compile_definitions(PCSX2_LTO PRIVATE _M_SSE=0x401) + endif() + if (DISABLE_ADVANCE_SIMD) + target_compile_definitions(PCSX2_LTO PRIVATE MULTI_ISA_SHARED_COMPILATION) + endif() target_link_libraries(PCSX2_LTO PRIVATE PCSX2_FLAGS) target_link_libraries(PCSX2 PRIVATE PCSX2_LTO) set_target_properties(PCSX2_LTO PROPERTIES INTERPROCEDURAL_OPTIMIZATION true) + fixup_file_properties(PCSX2_LTO) else() target_sources(PCSX2 PRIVATE ${pcsx2LTOSources}) endif() @@ -1510,14 +1588,10 @@ endif() target_sources(PCSX2 PRIVATE ${pcsx2CDVDSources} ${pcsx2CDVDHeaders} - ${pcsx2SPU2Sources} - ${pcsx2SPU2Headers} ${pcsx2DEV9Sources} ${pcsx2DEV9Headers} ${pcsx2PADHeaders} ${pcsx2PADSources} - ${pcsx2GSHeaders} - ${pcsx2GSSources} ${pcsx2RecordingSources} ${pcsx2DebugToolsSources} ${pcsx2DebugToolsHeaders} @@ -1577,8 +1651,14 @@ endif() # MacOSX/BSD if(UNIX AND NOT Linux) + if(APPLE) + target_sources(PCSX2 PRIVATE + ${pcsx2OSXSources}) + else() + target_sources(PCSX2 PRIVATE + ${pcsx2FreeBSDSources}) + endif() target_sources(PCSX2 PRIVATE - ${pcsx2OSXSources} ${pcsx2LinuxHeaders} ${pcsx2USBNullSources} ${pcsx2USBNullHeaders}) @@ -1587,6 +1667,10 @@ else() target_sources(PCSX2 PRIVATE ${pcsx2USBSources} ${pcsx2USBHeaders}) + target_link_libraries(PCSX2_FLAGS INTERFACE + jpgd + PkgConfig::SAMPLERATE + ) else() target_sources(PCSX2 PRIVATE ${pcsx2USBNullSources} @@ -1594,12 +1678,6 @@ else() endif() endif() -if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") - target_sources(PCSX2 PRIVATE - ${pcsx2FreeBSDSources} - ${pcsx2LinuxHeaders}) -endif() - target_link_libraries(PCSX2_FLAGS INTERFACE common imgui @@ -1608,9 +1686,9 @@ target_link_libraries(PCSX2_FLAGS INTERFACE chdr-static libzip::zip cpuinfo + zydis ZLIB::ZLIB PkgConfig::SOUNDTOUCH - PkgConfig::SAMPLERATE PNG::PNG LibLZMA::LibLZMA Zstd::Zstd @@ -1647,12 +1725,9 @@ if(WIN32) strmiids.lib opengl32.lib comsuppw.lib + OneCore.lib ) - if(PCSX2_CORE) - target_link_libraries(PCSX2_FLAGS INTERFACE - OneCore.lib - ) - else() + if(NOT PCSX2_CORE) target_link_libraries(PCSX2_FLAGS INTERFACE pthreads4w ) @@ -1688,18 +1763,6 @@ if(NOT PCSX2_CORE) COMMAND ${BIN2CPP} "${res_src}/${res_file}.png" "${res_bin}/${res_file}" ) endforeach() - - ### Generate Recording resource files - ### Drop them into the folder alongside the png files - foreach(res_file IN ITEMS - circlePressed controllerFull controllerHalf controllerThreeQuarters crossPressed downPressed l1Pressed l2Pressed l3Pressed leftPressed - r1Pressed r2Pressed r3Pressed rightPressed selectPressed squarePressed startPressed trianglePressed upPressed) - add_custom_command( - OUTPUT "${res_rec_vp_src}/${res_file}.h" - DEPENDS ${BIN2CPPDEP} "${res_rec_vp_src}/${res_file}.png" - COMMAND ${BIN2CPP} "${res_rec_vp_src}/${res_file}.png" "${res_rec_vp_src}/${res_file}" - ) - endforeach() endif() # additonal include directories @@ -1793,6 +1856,37 @@ function(setup_main_executable target) get_property(PCSX2_SOURCE_DIR GLOBAL PROPERTY PCSX2_SOURCE_DIR) get_property(PCSX2_METAL_SHADERS GLOBAL PROPERTY PCSX2_METAL_SHADERS) + if(QT_BUILD) + get_target_property(MOC_EXECUTABLE_LOCATION Qt6::moc IMPORTED_LOCATION) + get_filename_component(QT_BINARY_DIRECTORY "${MOC_EXECUTABLE_LOCATION}" DIRECTORY) + endif() + + if(WIN32) + if(NOT PCSX2_CORE) + target_sources(${target} PRIVATE + ${PCSX2_SOURCE_DIR}/GS/GS.rc + ${PCSX2_SOURCE_DIR}/PAD/Windows/PAD.rc + ${PCSX2_SOURCE_DIR}/SPU2/Windows/SPU2.rc + ${PCSX2_SOURCE_DIR}/USB/usb-pad/dx/versionproxy.rc + ${PCSX2_SOURCE_DIR}/USB/usb-pad/raw/raw-config.rc + ) + endif() + target_sources(${target} PRIVATE + ${PCSX2_SOURCE_DIR}/PCSX2.rc + ${PCSX2_SOURCE_DIR}/windows/wxResources.rc + ${PCSX2_SOURCE_DIR}/windows/PCSX2.manifest + ) + set_target_properties(${target} PROPERTIES WIN32_EXECUTABLE TRUE) + if(MSVC) + install(FILES $ DESTINATION ${CMAKE_SOURCE_DIR}/bin) + endif() + if(QT_BUILD) + find_program(WINDEPLOYQT_EXE windeployqt HINTS "${QT_BINARY_DIRECTORY}") + install(CODE "execute_process(COMMAND \"${WINDEPLOYQT_EXE}\" \"${CMAKE_SOURCE_DIR}/bin/pcsx2-qt.exe\" --plugindir ${CMAKE_SOURCE_DIR}/bin/QtPlugins --no-compiler-runtime --no-system-d3d-compiler)") + install(CODE "file(WRITE \"${CMAKE_SOURCE_DIR}/bin/qt.conf\" \"[Paths]\\nPlugins = ./QtPlugins\")") + endif() + endif() + if(APPLE) if(CMAKE_GENERATOR MATCHES "Xcode") # If we're generating an xcode project, you can just add the shaders to the main pcsx2 target and xcode will deal with them properly @@ -1851,11 +1945,9 @@ function(setup_main_executable target) endif() if(QT_BUILD) - get_target_property(MOC_EXECUTABLE_LOCATION Qt6::moc IMPORTED_LOCATION) - get_filename_component(QT_BINARY_DIRECTORY "${MOC_EXECUTABLE_LOCATION}" DIRECTORY) find_program(MACDEPLOYQT_EXE macdeployqt HINTS "${QT_BINARY_DIRECTORY}") add_custom_target(pcsx2-postprocess-bundle ${postprocessBundleType} - COMMAND "${MACDEPLOYQT_EXE}" "$/../.." + COMMAND "${MACDEPLOYQT_EXE}" "$/../.." -no-strip ) else() add_custom_target(pcsx2-postprocess-bundle ${postprocessBundleType} @@ -1871,7 +1963,7 @@ if (NOT QT_BUILD) setup_main_executable(PCSX2) endif() -if(NOT DISABLE_SETCAP AND NOT PCSX2_CORE) +if(NOT DISABLE_SETCAP AND NOT PCSX2_CORE AND NOT WIN32) if(PACKAGE_MODE) install(CODE "execute_process(COMMAND /bin/bash -c \"echo 'Enabling networking capability on Linux...';set -x; [ -f '${CMAKE_INSTALL_FULL_BINDIR}/pcsx2' ] && sudo setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' '${CMAKE_INSTALL_FULL_BINDIR}/pcsx2'; set +x\")") else() diff --git a/pcsx2/COP0.cpp b/pcsx2/COP0.cpp index 461aa5bd96..1b7a8492f8 100644 --- a/pcsx2/COP0.cpp +++ b/pcsx2/COP0.cpp @@ -18,9 +18,6 @@ #include "Common.h" #include "COP0.h" -u32 s_iLastCOP0Cycle = 0; -u32 s_iLastPERFCycle[2] = { 0, 0 }; - // Updates the CPU's mode of operation (either, Kernel, Supervisor, or User modes). // Currently the different modes are not implemented. // Given this function is called so much, it's commented out for now. (rama) @@ -127,8 +124,8 @@ __fi void COP0_UpdatePCCR() // or the counting function is not enabled (CTE) if (cpuRegs.CP0.n.Status.b.ERL || !cpuRegs.PERF.n.pccr.b.CTE) { - s_iLastPERFCycle[0] = cpuRegs.cycle; - s_iLastPERFCycle[1] = s_iLastPERFCycle[0]; + cpuRegs.lastPERFCycle[0] = cpuRegs.cycle; + cpuRegs.lastPERFCycle[1] = cpuRegs.lastPERFCycle[0]; return; } @@ -142,13 +139,13 @@ __fi void COP0_UpdatePCCR() if( PERF_ShouldCountEvent( cpuRegs.PERF.n.pccr.b.Event0 ) ) { - u32 incr = cpuRegs.cycle - s_iLastPERFCycle[0]; + u32 incr = cpuRegs.cycle - cpuRegs.lastPERFCycle[0]; if( incr == 0 ) incr++; // use prev/XOR method for one-time exceptions (but likely less correct) //u32 prev = cpuRegs.PERF.n.pcr0; cpuRegs.PERF.n.pcr0 += incr; - s_iLastPERFCycle[0] = cpuRegs.cycle; + cpuRegs.lastPERFCycle[0] = cpuRegs.cycle; //prev ^= (1UL<<31); // XOR is fun! //if( (prev & cpuRegs.PERF.n.pcr0) & (1UL<<31) ) @@ -193,11 +190,11 @@ __fi void COP0_UpdatePCCR() if( PERF_ShouldCountEvent( cpuRegs.PERF.n.pccr.b.Event1 ) ) { - u32 incr = cpuRegs.cycle - s_iLastPERFCycle[1]; + u32 incr = cpuRegs.cycle - cpuRegs.lastPERFCycle[1]; if( incr == 0 ) incr++; cpuRegs.PERF.n.pcr1 += incr; - s_iLastPERFCycle[1] = cpuRegs.cycle; + cpuRegs.lastPERFCycle[1] = cpuRegs.cycle; if( (cpuRegs.PERF.n.pcr1 & 0x80000000)) { @@ -238,81 +235,81 @@ __fi void COP0_UpdatePCCR() // -void MapTLB(int i) +void MapTLB(const tlbs& t, int i) { u32 mask, addr; u32 saddr, eaddr; COP0_LOG("MAP TLB %d: 0x%08X-> [0x%08X 0x%08X] S=%d G=%d ASID=%d Mask=0x%03X EntryLo0 PFN=%x EntryLo0 Cache=%x EntryLo1 PFN=%x EntryLo1 Cache=%x VPN2=%x", - i, tlb[i].VPN2, tlb[i].PFN0, tlb[i].PFN1, tlb[i].S >> 31, tlb[i].G, tlb[i].ASID, - tlb[i].Mask, tlb[i].EntryLo0 >> 6, (tlb[i].EntryLo0 & 0x38) >> 3, tlb[i].EntryLo1 >> 6, (tlb[i].EntryLo1 & 0x38) >> 3, tlb[i].VPN2); + i, t.VPN2, t.PFN0, t.PFN1, t.S >> 31, t.G, t.ASID, + t.Mask, t.EntryLo0 >> 6, (t.EntryLo0 & 0x38) >> 3, t.EntryLo1 >> 6, (t.EntryLo1 & 0x38) >> 3, t.VPN2); - if (tlb[i].S) + if (t.S) { - vtlb_VMapBuffer(tlb[i].VPN2, eeMem->Scratch, Ps2MemSize::Scratch); + vtlb_VMapBuffer(t.VPN2, eeMem->Scratch, Ps2MemSize::Scratch); } - if (tlb[i].VPN2 == 0x70000000) return; //uh uhh right ... - if (tlb[i].EntryLo0 & 0x2) { - mask = ((~tlb[i].Mask) << 1) & 0xfffff; - saddr = tlb[i].VPN2 >> 12; - eaddr = saddr + tlb[i].Mask + 1; + if (t.VPN2 == 0x70000000) return; //uh uhh right ... + if (t.EntryLo0 & 0x2) { + mask = ((~t.Mask) << 1) & 0xfffff; + saddr = t.VPN2 >> 12; + eaddr = saddr + t.Mask + 1; for (addr=saddr; addr> 12) & mask)) { //match - memSetPageAddr(addr << 12, tlb[i].PFN0 + ((addr - saddr) << 12)); + if ((addr & mask) == ((t.VPN2 >> 12) & mask)) { //match + memSetPageAddr(addr << 12, t.PFN0 + ((addr - saddr) << 12)); Cpu->Clear(addr << 12, 0x400); } } } - if (tlb[i].EntryLo1 & 0x2) { - mask = ((~tlb[i].Mask) << 1) & 0xfffff; - saddr = (tlb[i].VPN2 >> 12) + tlb[i].Mask + 1; - eaddr = saddr + tlb[i].Mask + 1; + if (t.EntryLo1 & 0x2) { + mask = ((~t.Mask) << 1) & 0xfffff; + saddr = (t.VPN2 >> 12) + t.Mask + 1; + eaddr = saddr + t.Mask + 1; for (addr=saddr; addr> 12) & mask)) { //match - memSetPageAddr(addr << 12, tlb[i].PFN1 + ((addr - saddr) << 12)); + if ((addr & mask) == ((t.VPN2 >> 12) & mask)) { //match + memSetPageAddr(addr << 12, t.PFN1 + ((addr - saddr) << 12)); Cpu->Clear(addr << 12, 0x400); } } } } -void UnmapTLB(int i) +void UnmapTLB(const tlbs& t, int i) { - //Console.WriteLn("Clear TLB %d: %08x-> [%08x %08x] S=%d G=%d ASID=%d Mask= %03X", i,tlb[i].VPN2,tlb[i].PFN0,tlb[i].PFN1,tlb[i].S,tlb[i].G,tlb[i].ASID,tlb[i].Mask); + //Console.WriteLn("Clear TLB %d: %08x-> [%08x %08x] S=%d G=%d ASID=%d Mask= %03X", i,t.VPN2,t.PFN0,t.PFN1,t.S,t.G,t.ASID,t.Mask); u32 mask, addr; u32 saddr, eaddr; - if (tlb[i].S) + if (t.S) { - vtlb_VMapUnmap(tlb[i].VPN2,0x4000); + vtlb_VMapUnmap(t.VPN2,0x4000); return; } - if (tlb[i].EntryLo0 & 0x2) + if (t.EntryLo0 & 0x2) { - mask = ((~tlb[i].Mask) << 1) & 0xfffff; - saddr = tlb[i].VPN2 >> 12; - eaddr = saddr + tlb[i].Mask + 1; + mask = ((~t.Mask) << 1) & 0xfffff; + saddr = t.VPN2 >> 12; + eaddr = saddr + t.Mask + 1; // Console.WriteLn("Clear TLB: %08x ~ %08x",saddr,eaddr-1); for (addr=saddr; addr> 12) & mask)) { //match + if ((addr & mask) == ((t.VPN2 >> 12) & mask)) { //match memClearPageAddr(addr << 12); Cpu->Clear(addr << 12, 0x400); } } } - if (tlb[i].EntryLo1 & 0x2) { - mask = ((~tlb[i].Mask) << 1) & 0xfffff; - saddr = (tlb[i].VPN2 >> 12) + tlb[i].Mask + 1; - eaddr = saddr + tlb[i].Mask + 1; + if (t.EntryLo1 & 0x2) { + mask = ((~t.Mask) << 1) & 0xfffff; + saddr = (t.VPN2 >> 12) + t.Mask + 1; + eaddr = saddr + t.Mask + 1; // Console.WriteLn("Clear TLB: %08x ~ %08x",saddr,eaddr-1); for (addr=saddr; addr> 12) & mask)) { //match + if ((addr & mask) == ((t.VPN2 >> 12) & mask)) { //match memClearPageAddr(addr << 12); Cpu->Clear(addr << 12, 0x400); } @@ -336,7 +333,7 @@ void WriteTLB(int i) tlb[i].PFN1 = (((cpuRegs.CP0.n.EntryLo1 >> 6) & 0xFFFFF) & (~tlb[i].Mask)) << 12; tlb[i].S = cpuRegs.CP0.n.EntryLo0&0x80000000; - MapTLB(i); + MapTLB(tlb[i], i); } namespace R5900 { @@ -366,7 +363,7 @@ void TLBWI() { cpuRegs.CP0.n.Index, cpuRegs.CP0.n.PageMask, cpuRegs.CP0.n.EntryHi, cpuRegs.CP0.n.EntryLo0, cpuRegs.CP0.n.EntryLo1); - UnmapTLB(j); + UnmapTLB(tlb[j], j); tlb[j].PageMask = cpuRegs.CP0.n.PageMask; tlb[j].EntryHi = cpuRegs.CP0.n.EntryHi; tlb[j].EntryLo0 = cpuRegs.CP0.n.EntryLo0; @@ -385,7 +382,7 @@ DevCon.Warning("COP0_TLBWR %d:%x,%x,%x,%x\n", //if (j > 48) return; - UnmapTLB(j); + UnmapTLB(tlb[j], j); tlb[j].PageMask = cpuRegs.CP0.n.PageMask; tlb[j].EntryHi = cpuRegs.CP0.n.EntryHi; tlb[j].EntryLo0 = cpuRegs.CP0.n.EntryLo0; @@ -456,16 +453,16 @@ void MFC0() case 9: { - u32 incr = cpuRegs.cycle-s_iLastCOP0Cycle; + u32 incr = cpuRegs.cycle - cpuRegs.lastCOP0Cycle; if( incr == 0 ) incr++; cpuRegs.CP0.n.Count += incr; - s_iLastCOP0Cycle = cpuRegs.cycle; + cpuRegs.lastCOP0Cycle = cpuRegs.cycle; if( !_Rt_ ) break; } [[fallthrough]]; default: - cpuRegs.GPR.r[_Rt_].UD[0] = (s64)cpuRegs.CP0.r[_Rd_]; + cpuRegs.GPR.r[_Rt_].SD[0] = (s32)cpuRegs.CP0.r[_Rd_]; } } @@ -475,7 +472,7 @@ void MTC0() switch (_Rd_) { case 9: - s_iLastCOP0Cycle = cpuRegs.cycle; + cpuRegs.lastCOP0Cycle = cpuRegs.cycle; cpuRegs.CP0.r[9] = cpuRegs.GPR.r[_Rt_].UL[0]; break; @@ -506,12 +503,12 @@ void MTC0() else if (0 == (_Imm_ & 2)) // MTPC 0, only LSB of register matters { cpuRegs.PERF.n.pcr0 = cpuRegs.GPR.r[_Rt_].UL[0]; - s_iLastPERFCycle[0] = cpuRegs.cycle; + cpuRegs.lastPERFCycle[0] = cpuRegs.cycle; } else // MTPC 1 { cpuRegs.PERF.n.pcr1 = cpuRegs.GPR.r[_Rt_].UL[0]; - s_iLastPERFCycle[1] = cpuRegs.cycle; + cpuRegs.lastPERFCycle[1] = cpuRegs.cycle; } break; diff --git a/pcsx2/COP0.h b/pcsx2/COP0.h index 3ed3c48cbf..834c1b7928 100644 --- a/pcsx2/COP0.h +++ b/pcsx2/COP0.h @@ -15,12 +15,14 @@ #pragma once +struct tlbs; + extern void WriteCP0Status(u32 value); extern void WriteCP0Config(u32 value); extern void cpuUpdateOperationMode(); extern void WriteTLB(int i); -extern void UnmapTLB(int i); -extern void MapTLB(int i); +extern void UnmapTLB(const tlbs& t, int i); +extern void MapTLB(const tlbs& t, int i); extern void COP0_UpdatePCCR(); extern void COP0_DiagnosticPCCR(); diff --git a/pcsx2/Cache.cpp b/pcsx2/Cache.cpp index 08d235e375..cc2ed32ce2 100644 --- a/pcsx2/Cache.cpp +++ b/pcsx2/Cache.cpp @@ -290,13 +290,9 @@ u32 readCache32(u32 mem) return readCache(mem); } -RETURNS_R64 readCache64(u32 mem) +u64 readCache64(u32 mem) { - int way, idx; - void* addr = prepareCacheAccess(mem, &way, &idx); - r64 value = r64_load(addr); - CACHE_LOG("readCache64 %8.8x from %d, way %d, value %llx", mem, idx, way, *(u64*)&value); - return value; + return readCache(mem); } RETURNS_R128 readCache128(u32 mem) @@ -341,7 +337,7 @@ void CACHE() u32 addr = cpuRegs.GPR.r[_Rs_].UL[0] + _Imm_; // CACHE_LOG("cpuRegs.GPR.r[_Rs_].UL[0] = %x, IMM = %x RT = %x", cpuRegs.GPR.r[_Rs_].UL[0], _Imm_, _Rt_); - switch (_Rt_) + switch (_Rt_) { case 0x1a: //DHIN (Data Cache Hit Invalidate) doCacheHitOp(addr, "DHIN", [](CacheLine line) diff --git a/pcsx2/Cache.h b/pcsx2/Cache.h index 1f11a22310..f1dc6945d3 100644 --- a/pcsx2/Cache.h +++ b/pcsx2/Cache.h @@ -27,5 +27,5 @@ void writeCache128(u32 mem, const mem128_t* value); u8 readCache8(u32 mem); u16 readCache16(u32 mem); u32 readCache32(u32 mem); -RETURNS_R64 readCache64(u32 mem); +u64 readCache64(u32 mem); RETURNS_R128 readCache128(u32 mem); diff --git a/pcsx2/Config.h b/pcsx2/Config.h index 6abf912f52..d38f14b967 100644 --- a/pcsx2/Config.h +++ b/pcsx2/Config.h @@ -18,6 +18,7 @@ #include "common/emitter/tools.h" #include "common/General.h" #include +#include class SettingsInterface; class SettingsWrapper; @@ -35,6 +36,7 @@ enum GamefixId Fix_SkipMpeg, Fix_OPHFlag, Fix_EETiming, + Fix_InstantDMA, Fix_DMABusy, Fix_GIFFIFO, Fix_VIFFIFO, @@ -45,6 +47,7 @@ enum GamefixId Fix_VUOverflow, Fix_XGKick, Fix_BlitInternalFPS, + Fix_FullVU0Sync, GamefixId_COUNT }; @@ -129,6 +132,7 @@ enum class GSRendererType : s8 enum class GSInterlaceMode : u8 { + Automatic, Off, WeaveTFF, WeaveBFF, @@ -136,10 +140,18 @@ enum class GSInterlaceMode : u8 BobBFF, BlendTFF, BlendBFF, - Automatic, + AdaptiveTFF, + AdaptiveBFF, Count }; +enum class GSPostBilinearMode : u8 +{ + Off, + BilinearSmooth, + BilinearSharp, +}; + // Ordering was done to keep compatibility with older ini file. enum class BiFiltering : u8 { @@ -199,6 +211,21 @@ enum class GSDumpCompressionMethod : u8 Zstandard, }; +enum class GSHardwareDownloadMode : u8 +{ + Enabled, + NoReadbacks, + Unsynchronized, + Disabled +}; + +enum class GSCASMode : u8 +{ + Disabled, + SharpenOnly, + SharpenAndResize, +}; + // Template function for casting enumerations to their underlying type template typename std::underlying_type::type enum_cast(Enumeration E) @@ -212,6 +239,7 @@ ImplementEnumOperators(SpeedhackId); //------------ DEFAULT sseMXCSR VALUES --------------- #define DEFAULT_sseMXCSR 0xffc0 //FPU rounding > DaZ, FtZ, "chop" #define DEFAULT_sseVUMXCSR 0xffc0 //VU rounding > DaZ, FtZ, "chop" +#define SYSTEM_sseMXCSR 0x1f80 // -------------------------------------------------------------------------------------- // TraceFiltersEE @@ -368,12 +396,10 @@ struct Pcsx2Config fpuExtraOverflow : 1, fpuFullMode : 1; - bool - StackFrameChecks : 1, - PreBlockCheckEE : 1, - PreBlockCheckIOP : 1; bool EnableEECache : 1; + bool + EnableFastmem : 1; BITFIELD_END RecompilerOptions(); @@ -390,6 +416,30 @@ struct Pcsx2Config { return !OpEqu(bitset); } + + u32 GetEEClampMode() const + { + return fpuFullMode ? 3 : (fpuExtraOverflow ? 2 : (fpuOverflow ? 1 : 0)); + } + + void SetEEClampMode(u32 value) + { + fpuOverflow = (value >= 1); + fpuExtraOverflow = (value >= 2); + fpuFullMode = (value >= 3); + } + + u32 GetVUClampMode() const + { + return vuSignOverflow ? 3 : (vuExtraOverflow ? 2 : (vuOverflow ? 1 : 0)); + } + + void SetVUClampMode(u32 value) + { + vuOverflow = (value >= 1); + vuExtraOverflow = (value >= 2); + vuSignOverflow = (value >= 3); + } }; // ------------------------------------------------------------------------ @@ -427,6 +477,9 @@ struct Pcsx2Config static const char* GetRendererName(GSRendererType type); + static constexpr float DEFAULT_FRAME_RATE_NTSC = 59.94f; + static constexpr float DEFAULT_FRAME_RATE_PAL = 50.00f; + union { u64 bitset; @@ -439,7 +492,6 @@ struct Pcsx2Config PCRTCOffsets : 1, PCRTCOverscan : 1, IntegerScaling : 1, - LinearPresent : 1, SyncToHostRefreshRate : 1, UseDebugDevice : 1, UseBlitSwapChain : 1, @@ -455,18 +507,19 @@ struct Pcsx2Config OsdShowGPU : 1, OsdShowResolution : 1, OsdShowGSStats : 1, - OsdShowIndicators : 1; + OsdShowIndicators : 1, + OsdShowSettings : 1, + OsdShowInputs : 1, + OsdShowFrameTimes : 1; bool - HWDisableReadbacks : 1, - AccurateDATE : 1, + HWSpinGPUForReadbacks : 1, + HWSpinCPUForReadbacks : 1, GPUPaletteConversion : 1, - ConservativeFramebuffer : 1, AutoFlushSW : 1, PreloadFrameWithGSData : 1, WrapGSMem : 1, Mipmap : 1, - AA1 : 1, PointListPalette : 1, ManualUserHacks : 1, UserHacks_AlignSpriteX : 1, @@ -480,7 +533,6 @@ struct Pcsx2Config UserHacks_TextureInsideRt : 1, FXAA : 1, ShadeBoost : 1, - ShaderFX : 1, DumpGSData : 1, SaveRT : 1, SaveFrame : 1, @@ -506,30 +558,37 @@ struct Pcsx2Config VsyncMode VsyncEnable{VsyncMode::Off}; - double LimitScalar{1.0}; - double FramerateNTSC{59.94}; - double FrameratePAL{50.00}; + float LimitScalar{1.0f}; + float FramerateNTSC{DEFAULT_FRAME_RATE_NTSC}; + float FrameratePAL{DEFAULT_FRAME_RATE_PAL}; AspectRatioType AspectRatio{AspectRatioType::RAuto4_3_3_2}; FMVAspectRatioSwitchType FMVAspectRatioSwitch{FMVAspectRatioSwitchType::Off}; GSInterlaceMode InterlaceMode{GSInterlaceMode::Automatic}; + GSPostBilinearMode LinearPresent{ GSPostBilinearMode::BilinearSmooth }; - double Zoom{100.0}; - double StretchY{100.0}; - double OffsetX{0.0}; - double OffsetY{0.0}; + float Zoom{100.0f}; + float StretchY{100.0f}; +#ifndef PCSX2_CORE + float OffsetX{0.0f}; + float OffsetY{0.0f}; +#else + int Crop[4]{}; +#endif - double OsdScale{100.0}; + float OsdScale{100.0}; GSRendererType Renderer{GSRendererType::Auto}; - uint UpscaleMultiplier{1}; + float UpscaleMultiplier{1.0f}; HWMipmapLevel HWMipmap{HWMipmapLevel::Automatic}; AccBlendLevel AccurateBlendingUnit{AccBlendLevel::Basic}; CRCHackLevel CRCHack{CRCHackLevel::Automatic}; BiFiltering TextureFiltering{BiFiltering::PS2}; TexturePreloadingLevel TexturePreloading{TexturePreloadingLevel::Full}; - GSDumpCompressionMethod GSDumpCompression{GSDumpCompressionMethod::Uncompressed}; + GSDumpCompressionMethod GSDumpCompression{GSDumpCompressionMethod::Zstandard}; + GSHardwareDownloadMode HWDownloadMode{GSHardwareDownloadMode::Enabled}; + GSCASMode CASMode{GSCASMode::Disabled}; int Dithering{2}; int MaxAnisotropy{0}; int SWExtraThreads{2}; @@ -544,18 +603,18 @@ struct Pcsx2Config int UserHacks_TCOffsetX{0}; int UserHacks_TCOffsetY{0}; int UserHacks_CPUSpriteRenderBW{0}; - TriFiltering UserHacks_TriFilter{TriFiltering::Automatic}; + int UserHacks_CPUCLUTRender{ 0 }; + TriFiltering TriFilter{TriFiltering::Automatic}; int OverrideTextureBarriers{-1}; int OverrideGeometryShaders{-1}; + int CAS_Sharpness{50}; int ShadeBoost_Brightness{50}; int ShadeBoost_Contrast{50}; int ShadeBoost_Saturation{50}; int SaveN{0}; int SaveL{5000}; std::string Adapter; - std::string ShaderFX_Conf; - std::string ShaderFX_GLSL; GSOptions(); @@ -608,7 +667,6 @@ struct Pcsx2Config NoSync, }; - BITFIELD32() bool AdvancedVolumeControl : 1; @@ -620,17 +678,19 @@ struct Pcsx2Config s32 FinalVolume = 100; s32 Latency{100}; s32 SpeakerConfiguration{0}; + s32 DplDecodingLevel{0}; - double VolumeAdjustC{ 0.0f }; - double VolumeAdjustFL{ 0.0f }; - double VolumeAdjustFR{ 0.0f }; - double VolumeAdjustBL{ 0.0f }; - double VolumeAdjustBR{ 0.0f }; - double VolumeAdjustSL{ 0.0f }; - double VolumeAdjustSR{ 0.0f }; - double VolumeAdjustLFE{ 0.0f }; + float VolumeAdjustC{ 0.0f }; + float VolumeAdjustFL{ 0.0f }; + float VolumeAdjustFR{ 0.0f }; + float VolumeAdjustBL{ 0.0f }; + float VolumeAdjustBR{ 0.0f }; + float VolumeAdjustSL{ 0.0f }; + float VolumeAdjustSR{ 0.0f }; + float VolumeAdjustLFE{ 0.0f }; std::string OutputModule; + std::string BackendName; SPU2Options(); @@ -646,6 +706,7 @@ struct Pcsx2Config OpEqu(FinalVolume) && OpEqu(Latency) && OpEqu(SpeakerConfiguration) && + OpEqu(DplDecodingLevel) && OpEqu(VolumeAdjustC) && OpEqu(VolumeAdjustFL) && @@ -656,7 +717,8 @@ struct Pcsx2Config OpEqu(VolumeAdjustSR) && OpEqu(VolumeAdjustLFE) && - OpEqu(OutputModule); + OpEqu(OutputModule) && + OpEqu(BackendName); } bool operator!=(const SPU2Options& right) const @@ -791,6 +853,7 @@ struct Pcsx2Config SkipMPEGHack : 1, // Skips MPEG videos (Katamari and other games need this) OPHFlagHack : 1, // Bleach Blade Battlers EETimingHack : 1, // General purpose timing hack. + InstantDMAHack : 1, // Instantly complete DMA's if possible, good for cache emulation problems. DMABusyHack : 1, // Denies writes to the DMAC when it's busy. This is correct behaviour but bad timing can cause problems. GIFFIFOHack : 1, // Enabled the GIF FIFO (more correct but slower) VIFFIFOHack : 1, // Pretends to fill the non-existant VIF FIFO Buffer. @@ -800,7 +863,8 @@ struct Pcsx2Config VUSyncHack : 1, // Makes microVU run behind the EE to avoid VU register reading/writing sync issues. Useful for M-Bit games VUOverflowHack : 1, // Tries to simulate overflow flag checks (not really possible on x86 without soft floats) XgKickHack : 1, // Erementar Gerad, adds more delay to VU XGkick instructions. Corrects the color of some graphics, but breaks Tri-ace games and others. - BlitInternalFPSHack : 1; // Disables privileged register write-based FPS detection. + BlitInternalFPSHack : 1, // Disables privileged register write-based FPS detection. + FullVU0SyncHack : 1; // Forces tight VU0 sync on every COP2 instruction. BITFIELD_END GamefixOptions(); @@ -887,9 +951,9 @@ struct Pcsx2Config // ------------------------------------------------------------------------ struct FramerateOptions { - double NominalScalar{1.0}; - double TurboScalar{2.0}; - double SlomoScalar{0.5}; + float NominalScalar{1.0f}; + float TurboScalar{2.0f}; + float SlomoScalar{0.5f}; void LoadSave(SettingsWrapper& wrap); void SanityCheck(); @@ -934,6 +998,40 @@ struct Pcsx2Config MemoryCardType Type; // the memory card implementation that should be used }; + // ------------------------------------------------------------------------ + +#ifdef ENABLE_ACHIEVEMENTS + struct AchievementsOptions + { + BITFIELD32() + bool + Enabled : 1, + TestMode : 1, + UnofficialTestMode : 1, + RichPresence : 1, + ChallengeMode : 1, + Leaderboards : 1, + SoundEffects : 1, + PrimedIndicators : 1; + BITFIELD_END + + AchievementsOptions(); + void LoadSave(SettingsWrapper& wrap); + + bool operator==(const AchievementsOptions& right) const + { + return OpEqu(bitset); + } + + bool operator!=(const AchievementsOptions& right) const + { + return !this->operator==(right); + } + }; +#endif + + // ------------------------------------------------------------------------ + BITFIELD32() bool CdvdVerboseReads : 1, // enables cdvd read activity verbosely dumped to the console @@ -949,10 +1047,11 @@ struct Pcsx2Config #ifdef PCSX2_CORE EnableGameFixes : 1, // enables automatic game fixes SaveStateOnShutdown : 1, // default value for saving state on shutdown + EnableDiscordPresence : 1, // enables discord rich presence integration + InhibitScreensaver : 1, #endif // when enabled uses BOOT2 injection, skipping sony bios splashes UseBOOT2Injection : 1, - PatchBios : 1, BackupSavestate : 1, SavestateZstdCompression : 1, // enables simulated ejection of memory cards when loading savestates @@ -963,7 +1062,9 @@ struct Pcsx2Config MultitapPort1_Enabled : 1, ConsoleToStdio : 1, - HostFs : 1; + HostFs : 1, + + WarnAboutUnsafeSettings : 1; // uses automatic ntfs compression when creating new memory cards (Win32 only) #ifdef _WIN32 @@ -985,7 +1086,9 @@ struct Pcsx2Config FilenameOptions BaseFilenames; - std::string PatchRegion; +#ifdef ENABLE_ACHIEVEMENTS + AchievementsOptions Achievements; +#endif // Memorycard options - first 2 are default slots, last 6 are multitap 1 and 2 // slots (3 each) @@ -1008,8 +1111,6 @@ struct Pcsx2Config bool MultitapEnabled(uint port) const; - VsyncMode GetEffectiveVsyncMode() const; - bool operator==(const Pcsx2Config& right) const; bool operator!=(const Pcsx2Config& right) const { @@ -1019,6 +1120,9 @@ struct Pcsx2Config // You shouldn't assign to this class, because it'll mess with the runtime variables (Current...). // But you can still use this to copy config. Only needed until we drop wx. void CopyConfig(const Pcsx2Config& cfg); + + /// Copies runtime configuration settings (e.g. frame limiter state). + void CopyRuntimeConfig(Pcsx2Config& cfg); }; extern Pcsx2Config EmuConfig; @@ -1045,10 +1149,9 @@ namespace EmuFolders extern std::string InputProfiles; // Assumes that AppRoot and DataRoot have been initialized. - void SetDefaults(); - bool EnsureFoldersExist(); + void SetDefaults(SettingsInterface& si); void LoadConfig(SettingsInterface& si); - void Save(SettingsInterface& si); + bool EnsureFoldersExist(); } // namespace EmuFolders ///////////////////////////////////////////////////////////////////////////////////////// @@ -1062,6 +1165,7 @@ namespace EmuFolders #define CHECK_EEREC (EmuConfig.Cpu.Recompiler.EnableEE) #define CHECK_CACHE (EmuConfig.Cpu.Recompiler.EnableEECache) #define CHECK_IOPREC (EmuConfig.Cpu.Recompiler.EnableIOP) +#define CHECK_FASTMEM (EmuConfig.Cpu.Recompiler.EnableEE && EmuConfig.Cpu.Recompiler.EnableFastmem) //------------ SPECIAL GAME FIXES!!! --------------- #define CHECK_VUADDSUBHACK (EmuConfig.Gamefixes.VuAddSubHack) // Special Fix for Tri-ace games, they use an encryption algorithm that requires VU addi opcode to be bit-accurate. @@ -1069,6 +1173,7 @@ namespace EmuFolders #define CHECK_FPUNEGDIVHACK (EmuConfig.Gamefixes.FpuNegDivHack) // Special Fix for Gundam games messed up camera-view. #define CHECK_XGKICKHACK (EmuConfig.Gamefixes.XgKickHack) // Special Fix for Erementar Gerad, adds more delay to VU XGkick instructions. Corrects the color of some graphics. #define CHECK_EETIMINGHACK (EmuConfig.Gamefixes.EETimingHack) // Fix all scheduled events to happen in 1 cycle. +#define CHECK_INSTANTDMAHACK (EmuConfig.Gamefixes.InstantDMAHack) // Attempt to finish DMA's instantly, useful for games which rely on cache emulation. #define CHECK_SKIPMPEGHACK (EmuConfig.Gamefixes.SkipMPEGHack) // Finds sceMpegIsEnd pattern to tell the game the mpeg is finished (Katamari and a lot of games need this) #define CHECK_OPHFLAGHACK (EmuConfig.Gamefixes.OPHFlagHack) // Bleach Blade Battlers #define CHECK_DMABUSYHACK (EmuConfig.Gamefixes.DMABusyHack) // Denies writes to the DMAC when it's busy. This is correct behaviour but bad timing can cause problems. @@ -1076,6 +1181,7 @@ namespace EmuFolders #define CHECK_VIF1STALLHACK (EmuConfig.Gamefixes.VIF1StallHack) // Like above, processes FIFO data before the stall is allowed (to make sure data goes over). #define CHECK_GIFFIFOHACK (EmuConfig.Gamefixes.GIFFIFOHack) // Enabled the GIF FIFO (more correct but slower) #define CHECK_VUOVERFLOWHACK (EmuConfig.Gamefixes.VUOverflowHack) // Special Fix for Superman Returns, they check for overflows on PS2 floats which we can't do without soft floats. +#define CHECK_FULLVU0SYNCHACK (EmuConfig.Gamefixes.FullVU0SyncHack) //------------ Advanced Options!!! --------------- #define CHECK_VU_OVERFLOW (EmuConfig.Cpu.Recompiler.vuOverflow) diff --git a/pcsx2/Counters.cpp b/pcsx2/Counters.cpp index 56e20811df..f294e73e8d 100644 --- a/pcsx2/Counters.cpp +++ b/pcsx2/Counters.cpp @@ -36,13 +36,13 @@ #ifndef PCSX2_CORE #include "gui/App.h" +#include "Recording/InputRecordingControls.h" #else #include "PAD/Host/PAD.h" +#include "Recording/InputRecording.h" #include "VMManager.h" #endif -#include "Recording/InputRecordingControls.h" - using namespace Threading; extern u8 psxhblankgate; @@ -301,7 +301,7 @@ const char* ReportVideoMode() const char* ReportInterlaceMode() { const u64& smode2 = *(u64*)PS2GS_BASE(GS_SMODE2); - return (smode2 & 1) ? ((smode2 & 2) ? "Interlaced (Frame)" : "Interlaced (Field)") : "Progressive"; + return !IsProgressiveVideoMode() ? ((smode2 & 2) ? "Interlaced (Frame)" : "Interlaced (Field)") : "Progressive"; } double GetVerticalFrequency() @@ -353,7 +353,7 @@ double GetVerticalFrequency() static double AdjustToHostRefreshRate(double vertical_frequency, double frame_limit) { - if (!EmuConfig.GS.SyncToHostRefreshRate || EmuConfig.GS.LimitScalar != 1.0) + if (!EmuConfig.GS.SyncToHostRefreshRate || EmuConfig.GS.LimitScalar != 1.0f) { SPU2SetDeviceSampleRateMultiplier(1.0); s_use_vsync_for_timing = false; @@ -361,7 +361,7 @@ static double AdjustToHostRefreshRate(double vertical_frequency, double frame_li } float host_refresh_rate; - if (!Host::GetHostDisplay()->GetHostRefreshRate(&host_refresh_rate)) + if (!g_host_display->GetHostRefreshRate(&host_refresh_rate)) { Console.Warning("Cannot sync to host refresh since the query failed."); SPU2SetDeviceSampleRateMultiplier(1.0); @@ -390,7 +390,7 @@ u32 UpdateVSyncRate() // The PS2's vsync timer is an *independent* crystal that is fixed to either 59.94 (NTSC) // or 50.0 (PAL) Hz. It has *nothing* to do with real TV timings or the real vsync of // the GS's output circuit. It is the same regardless if the GS is outputting interlace - // or progressive scan content. + // or progressive scan content. const double vertical_frequency = GetVerticalFrequency(); @@ -413,7 +413,7 @@ u32 UpdateVSyncRate() break; case GS_VideoMode::PAL: case GS_VideoMode::DVD_PAL: - custom = (EmuConfig.GS.FrameratePAL != 50.0); + custom = (EmuConfig.GS.FrameratePAL != Pcsx2Config::GSOptions::DEFAULT_FRAME_RATE_PAL); if (gsIsInterlaced) total_scanlines = SCANLINES_TOTAL_PAL_I; else @@ -421,7 +421,7 @@ u32 UpdateVSyncRate() break; case GS_VideoMode::NTSC: case GS_VideoMode::DVD_NTSC: - custom = (EmuConfig.GS.FramerateNTSC != 59.94); + custom = (EmuConfig.GS.FramerateNTSC != Pcsx2Config::GSOptions::DEFAULT_FRAME_RATE_NTSC); if (gsIsInterlaced) total_scanlines = SCANLINES_TOTAL_NTSC_I; else @@ -457,7 +457,7 @@ u32 UpdateVSyncRate() if (video_mode_initialized) Console.WriteLn(Color_Green, "(UpdateVSyncRate) Mode Changed to %s.", ReportVideoMode()); - + if (custom && video_mode_initialized) Console.Indent().WriteLn(Color_StrongGreen, "... with user configured refresh rate: %.02f Hz", vertical_frequency); @@ -543,7 +543,7 @@ static __fi void DoFMVSwitch() RendererSwitched = false; } -// Convenience function to update UI thread and set patches. +// Convenience function to update UI thread and set patches. static __fi void frameLimitUpdateCore() { DoFMVSwitch(); @@ -564,7 +564,7 @@ static __fi void frameLimitUpdateCore() static __fi void frameLimit() { // Framelimiter off in settings? Framelimiter go brrr. - if (EmuConfig.GS.LimitScalar == 0.0 || s_use_vsync_for_timing) + if (EmuConfig.GS.LimitScalar == 0.0f || s_use_vsync_for_timing) { frameLimitUpdateCore(); return; @@ -585,15 +585,15 @@ static __fi void frameLimit() // Conversion of delta from CPU ticks (microseconds) to milliseconds s32 msec = (int) ((sDeltaTime * -1000) / (s64) GetTickFrequency()); - + // If any integer value of milliseconds exists, sleep it off. // Prior comments suggested that 1-2 ms sleeps were inaccurate on some OSes; - // further testing suggests instead that this was utter bullshit. + // further testing suggests instead that this was utter bullshit. if (msec > 1) { Threading::Sleep(msec - 1); } - + // Conversion to milliseconds loses some precision; after sleeping off whole milliseconds, // spin the thread without sleeping until we finally reach our expected end time. while (GetCPUTicks() < uExpectedEnd) @@ -608,13 +608,6 @@ static __fi void frameLimit() static __fi void VSyncStart(u32 sCycle) { - if (EmuConfig.EnableRecordingTools) - { - // It is imperative that any frame locking that must happen occurs before Vsync is started - // Not doing so would sacrifice a frame of a savestate-based recording when loading any savestate - g_InputRecordingControls.HandlePausingAndLocking(); - } - #ifdef PCSX2_CORE // Update vibration at the end of a frame. PAD::Update(); @@ -628,7 +621,7 @@ static __fi void VSyncStart(u32 sCycle) hwIntcIrq(INTC_VBLANK_S); psxVBlankStart(); - + if (gates) rcntStartGate(true, sCycle); // Counters Start Gate code // INTC - VB Blank Start Hack -- @@ -674,11 +667,6 @@ static __fi void GSVSync() static __fi void VSyncEnd(u32 sCycle) { - if (EmuConfig.EnableRecordingTools) - { - g_InputRecordingControls.CheckPauseStatus(); - } - if(EmuConfig.Trace.Enabled && EmuConfig.Trace.EE.m_EnableAll) SysTrace.EE.Counters.Write( " ================ EE COUNTER VSYNC END (frame: %d) ================", g_FrameCount ); @@ -746,7 +734,7 @@ __fi void rcntUpdate_vSync() if (vsyncCounter.Mode == MODE_VSYNC) { VSyncEnd(vsyncCounter.sCycle); - + vsyncCounter.sCycle += vSyncInfo.Blank; vsyncCounter.CycleT = vSyncInfo.Render; vsyncCounter.Mode = MODE_VRENDER; @@ -962,7 +950,7 @@ static __fi void rcntEndGate(bool isVblank , u32 sCycle) // calls to rcntUpdate). counters[i].mode.IsCounting = 1; counters[i].sCycleT = cpuRegs.cycle; - + EECNT_LOG("EE Counter[%d] %s EndGate Type0, count = %x", i, isVblank ? "vblank" : "hblank", counters[i].count ); break; @@ -1131,7 +1119,7 @@ __fi u16 rcntRead32( u32 mem ) case(RCNT3_MODE): return (u16)counters[3].modeval; case(RCNT3_TARGET): return (u16)counters[3].target; } - + return psHu16(mem); } diff --git a/pcsx2/DEV9/ATA/ATA.h b/pcsx2/DEV9/ATA/ATA.h index a16403ecbe..a8ca7d0e00 100644 --- a/pcsx2/DEV9/ATA/ATA.h +++ b/pcsx2/DEV9/ATA/ATA.h @@ -21,7 +21,9 @@ #include #include +#include "common/RedtapeWindows.h" #include "common/Path.h" + #include "DEV9/SimpleQueue.h" class ATA @@ -37,6 +39,18 @@ private: std::FILE* hddImage = nullptr; u64 hddImageSize; + bool hddSparse = false; + u64 hddSparseBlockSize; + u64 HddSparseStart; + std::unique_ptr hddSparseBlock; + bool hddSparseBlockValid = false; + +#ifdef _WIN32 + HANDLE hddNativeHandle = INVALID_HANDLE_VALUE; +#elif defined(__POSIX__) + int hddNativeHandle = -1; +#endif + int pioMode; int sdmaMode; int mdmaMode; @@ -171,6 +185,8 @@ public: //ATAwritePIO; private: + void InitSparseSupport(const std::string& hddPath); + //Info void CreateHDDinfo(u64 sizeSectors); void CreateHDDinfoCsum(); @@ -203,6 +219,10 @@ private: void IO_Thread(); void IO_Read(); bool IO_Write(); + bool IO_SparseZero(u64 byteOffset, u64 byteSize); + void IO_SparseCacheUpdateLocation(u64 Offset); + void IO_SparseCacheLoad(); + bool IsAllZero(const void* data, size_t len); void HDD_ReadAsync(void (ATA::*drqCMD)()); void HDD_ReadSync(void (ATA::*drqCMD)()); bool HDD_CanAssessOrSetError(); diff --git a/pcsx2/DEV9/ATA/ATA_State.cpp b/pcsx2/DEV9/ATA/ATA_State.cpp index 555d984266..6bf83239b1 100644 --- a/pcsx2/DEV9/ATA/ATA_State.cpp +++ b/pcsx2/DEV9/ATA/ATA_State.cpp @@ -17,6 +17,7 @@ #include "common/Assertions.h" #include "common/FileSystem.h" +#include "common/StringUtil.h" #include "ATA.h" #include "DEV9/DEV9.h" @@ -24,6 +25,20 @@ #include "HddCreateWx.h" #endif +#if _WIN32 +#include "pathcch.h" +#include +#elif defined(__POSIX__) +#define INVALID_HANDLE_VALUE -1 +#if defined(__APPLE__) +#include +#endif +#include +#include +#include +static_assert(sizeof(off_t) >= 8, "off_t is not 64bit"); +#endif + ATA::ATA() { //Power on, Would do self-Diag + Hardware Init @@ -71,6 +86,8 @@ int ATA::Open(const std::string& hddPath) //Store HddImage size for later check hddImageSize = static_cast(size); + InitSparseSupport(hddPath); + { std::lock_guard ioSignallock(ioMutex); ioRead = false; @@ -83,6 +100,139 @@ int ATA::Open(const std::string& hddPath) return 0; } +void ATA::InitSparseSupport(const std::string& hddPath) +{ +#ifdef _WIN32 + hddSparse = false; + + const std::wstring wHddPath(StringUtil::UTF8StringToWideString(hddPath)); + const DWORD fileAttributes = GetFileAttributes(wHddPath.c_str()); + hddSparse = fileAttributes & FILE_ATTRIBUTE_SPARSE_FILE; + + if (!hddSparse) + return; + + // Get OS specific file handle for spare writing. + // HANDLE is owned by FILE* hddImage. + hddNativeHandle = reinterpret_cast(_get_osfhandle(_fileno(hddImage))); + if (hddNativeHandle == INVALID_HANDLE_VALUE) + { + Console.Error("DEV9: ATA: Failed to open file for sparse"); + hddSparse = false; + return; + } + + // Get sparse block size (Initially assumed as 4096 bytes). + hddSparseBlockSize = 4096; + + // We need the drive letter for the drive the file actually resides on + // which means we need to deal with any junction links in the path. + DWORD len = GetFinalPathNameByHandle(hddNativeHandle, nullptr, 0, FILE_NAME_NORMALIZED); + + if (len != 0) + { + std::unique_ptr name = std::make_unique(len); + len = GetFinalPathNameByHandle(hddNativeHandle, name.get(), len, FILE_NAME_NORMALIZED); + if (len != 0) + { + PCWSTR rootEnd; + if (PathCchSkipRoot(name.get(), &rootEnd) == S_OK) + { + const size_t rootLength = rootEnd - name.get(); + std::wstring finalPath(name.get(), rootLength); + + DWORD sectorsPerCluster; + DWORD bytesPerSector; + DWORD temp1, temp2; + if (GetDiskFreeSpace(finalPath.c_str(), §orsPerCluster, &bytesPerSector, &temp1, &temp2) == TRUE) + hddSparseBlockSize = sectorsPerCluster * bytesPerSector; + else + Console.Error("DEV9: ATA: Failed to get sparse block size (GetDiskFreeSpace() returned false)"); + } + else + Console.Error("DEV9: ATA: Failed to get sparse block size (PathCchSkipRoot() returned false)"); + } + else + Console.Error("DEV9: ATA: Failed to get sparse block size (PathBuildRoot() returned 0)"); + } + else + Console.Error("DEV9: ATA: Failed to get sparse block size (GetFinalPathNameByHandle() returned 0)"); + + /* https://askbob.tech/the-ntfs-blog-sparse-and-compressed-file/ + * NTFS Sparse Block Size are the same size as a compression unit + * Cluster Size Compression Unit + * -------------------------------- + * 512bytes 8kb (0x02000) + * 1kb 16kb (0x04000) + * 2kb 32kb (0x08000) + * 4kb 64kb (0x10000) + * 8kb 64kb (0x10000) + * 16kb 64kb (0x10000) + * 32kb 64kb (0x10000) + * 64kb 64kb (0x10000) + * -------------------------------- + */ + + // Get the filesystem type. + WCHAR fsName[MAX_PATH + 1]; + const BOOL ret = GetVolumeInformationByHandleW(hddNativeHandle, nullptr, 0, nullptr, nullptr, nullptr, fsName, MAX_PATH); + if (ret == FALSE) + { + Console.Error("DEV9: ATA: Failed to get sparse block size (GetVolumeInformationByHandle() returned false)"); + // Assume NTFS. + wcscpy(fsName, L"NTFS"); + } + if ((wcscmp(fsName, L"NTFS") == 0)) + { + switch (hddSparseBlockSize) + { + case 512: + hddSparseBlockSize = 8192; + break; + case 1024: + hddSparseBlockSize = 16384; + break; + case 2048: + hddSparseBlockSize = 32768; + break; + case 4096: + case 8192: + case 16384: + case 32768: + case 65536: + hddSparseBlockSize = 65536; + break; + default: + break; + } + } + // Otherwise assume SparseBlockSize == block size. + +#elif defined(__POSIX__) + // fd is owned by FILE* hddImage. + hddNativeHandle = fileno(hddImage); + hddSparse = false; + if (hddNativeHandle != -1) + { + // No way to check if we can hole punch without trying it + // so just assume sparse files are supported. + hddSparse = true; + + // Get sparse block size (Initially assumed as 4096 bytes). + hddSparseBlockSize = 4096; + struct stat fileInfo; + if (fstat(hddNativeHandle, &fileInfo) == 0) + hddSparseBlockSize = fileInfo.st_blksize; + else + Console.Error("DEV9: ATA: Failed to get sparse block size (fstat returned != 0)"); + } + else + Console.Error("DEV9: ATA: Failed to open file for sparse"); +#endif + hddSparseBlock = std::make_unique(hddSparseBlockSize); + hddSparseBlockValid = false; +} + void ATA::Close() { //Wait for async code to finish @@ -108,6 +258,16 @@ void ATA::Close() } //Close File Handle + if (hddSparse) + { + // hddNativeHandle is owned by hddImage. + // It will get closed in fclose(hddImage). + hddNativeHandle = INVALID_HANDLE_VALUE; + + hddSparse = false; + hddSparseBlock = nullptr; + hddSparseBlockValid = false; + } if (hddImage) { std::fclose(hddImage); diff --git a/pcsx2/DEV9/ATA/ATA_Transfer.cpp b/pcsx2/DEV9/ATA/ATA_Transfer.cpp index 77d0b52504..6805fbff51 100644 --- a/pcsx2/DEV9/ATA/ATA_Transfer.cpp +++ b/pcsx2/DEV9/ATA/ATA_Transfer.cpp @@ -21,6 +21,12 @@ #include "ATA.h" #include "DEV9/DEV9.h" +#if __POSIX__ +#define INVALID_HANDLE_VALUE -1 +#include +#include +#endif + void ATA::IO_Thread() { std::unique_lock ioWaitHandle(ioMutex); @@ -99,18 +105,336 @@ bool ATA::IO_Write() return false; } - if (FileSystem::FSeek64(hddImage, entry.sector * 512, SEEK_SET) != 0 || - std::fwrite(entry.data, entry.length, 1, hddImage) != 1 || - std::fflush(hddImage) != 0) + u64 imagePos = entry.sector * 512; + if (FileSystem::FSeek64(hddImage, imagePos, SEEK_SET) != 0) { - Console.Error("DEV9: ATA: File write error"); + Console.Error("DEV9: ATA: File seek error"); pxAssert(false); abort(); } + if (hddSparse) + { + u32 written = 0; + while (written != entry.length) + { + IO_SparseCacheUpdateLocation(imagePos + written); + // Align to sparse block size. + u32 writeSize = hddSparseBlockSize - ((imagePos + written) % hddSparseBlockSize); + // Limit to size of write. + writeSize = std::min(writeSize, entry.length - written); + + pxAssert(writeSize > 0); + pxAssert(writeSize <= hddSparseBlockSize); + pxAssert((imagePos + written) >= HddSparseStart); + pxAssert((imagePos + written) - HddSparseStart + writeSize <= hddSparseBlockSize); + + bool sparseWrite = IsAllZero(&entry.data[written], writeSize); + + if (sparseWrite) + { +#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD) + std::unique_ptr zeroBlock = std::make_unique(writeSize); + memset(zeroBlock.get(), 0, writeSize); + pxAssert(memcmp(&entry.data[written], zeroBlock.get(), writeSize) == 0); +#endif + + if (!IO_SparseZero(imagePos + written, writeSize)) + { + Console.Error("DEV9: ATA: File sparse write error"); + + // hddNativeHandle is owned by hddImage. + // do not close it. + hddNativeHandle = INVALID_HANDLE_VALUE; + + hddSparse = false; + hddSparseBlock = nullptr; + hddSparseBlockValid = false; + + // Fallthough into other if statment. + sparseWrite = false; + } + } + + // Also handles sparse write failures. + if (!sparseWrite) + { +#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD) + if (hddSparse) + { + std::unique_ptr zeroBlock = std::make_unique(writeSize); + memset(zeroBlock.get(), 0, writeSize); + pxAssert(memcmp(&entry.data[written], zeroBlock.get(), writeSize) != 0); + } +#endif + // Update cache. + if (hddSparseBlockValid) + memcpy(&hddSparseBlock[(imagePos + written) - HddSparseStart], &entry.data[written], writeSize); + + if (std::fwrite(&entry.data[written], writeSize, 1, hddImage) != 1 || + std::fflush(hddImage) != 0) + { + Console.Error("DEV9: ATA: File write error"); + pxAssert(false); + abort(); + } + } + written += writeSize; + pxAssert(FileSystem::FTell64(hddImage) == (s64)(imagePos + written)); + } + } + else + { + if (std::fwrite(entry.data, entry.length, 1, hddImage) != 1 || std::fflush(hddImage) != 0) + { + Console.Error("DEV9: ATA: File write error"); + pxAssert(false); + abort(); + } + } delete[] entry.data; return true; } +void ATA::IO_SparseCacheLoad() +{ + // Reads are bounds checked, but for the sectors read only. + // Need to bounds check for sparse block, to handle an edge case of a user providing a file with a size that dosn't align with the sparse block size. + // Normally that won't happen as we generate files of exact Gib size. + u64 readSize = hddSparseBlockSize; + const u64 posEnd = HddSparseStart + hddSparseBlockSize; + if (posEnd > hddImageSize) + { + readSize = hddSparseBlockSize - (posEnd - hddImageSize); + // Zero cache for data beyond end of file. + memset(&hddSparseBlock[readSize], 0, hddSparseBlockSize - readSize); + } + + // Store file pointer. + const s64 orgPos = FileSystem::FTell64(hddImage); + + // Flush so that we know what is allocated. + std::fflush(hddImage); + +#ifdef _WIN32 + // FlushFileBuffers is required, hddSparseBlock differs from actual file without it. + FlushFileBuffers(hddNativeHandle); + // Range to be examined (One Sparse block size). + FILE_ALLOCATED_RANGE_BUFFER queryRange; + queryRange.FileOffset.QuadPart = HddSparseStart; + queryRange.Length.QuadPart = hddSparseBlockSize; + + // Allocated areas info. + FILE_ALLOCATED_RANGE_BUFFER allocRange; + DWORD dwRetBytes; + const BOOL ret = DeviceIoControl(hddNativeHandle, FSCTL_QUERY_ALLOCATED_RANGES, &queryRange, sizeof(queryRange), &allocRange, sizeof(allocRange), &dwRetBytes, nullptr); + + if (ret == TRUE && dwRetBytes == 0) + { + // We are sparse. + memset(hddSparseBlock.get(), 0, hddSparseBlockSize); + hddSparseBlockValid = true; +#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD) + + // Store file pointer. + const s64 orgPos = FileSystem::FTell64(hddImage); + pxAssert(orgPos != -1); + + //Load into check buffer. + FileSystem::FSeek64(hddImage, HddSparseStart, SEEK_SET); + + std::unique_ptr temp = std::make_unique(hddSparseBlockSize); + memset(temp.get(), 0, hddSparseBlockSize); + + if (FileSystem::FSeek64(hddImage, HddSparseStart, SEEK_SET) != 0 || + std::fread((char*)hddSparseBlock.get(), readSize, 1, hddImage) != 1) + pxAssert(false); + + // Restore file pointer. + if (FileSystem::FSeek64(hddImage, orgPos, SEEK_SET) != 0) + pxAssert(false); + + // Check if file is actully zeros. + if (memcmp(hddSparseBlock.get(), temp.get(), hddSparseBlockSize) != 0) + { + Console.WriteLn("DEV9: ATA: Sparse area not sparse, BlockStart: %s, BlockEnd: %s", + std::to_string(HddSparseStart).c_str(), std::to_string(HddSparseStart + hddSparseBlockSize).c_str()); + } + else + Console.WriteLn("DEV9: ATA: Sparse area is sparse (Yay), BlockStart: %s, BlockEnd: %s", + std::to_string(HddSparseStart).c_str(), std::to_string(HddSparseStart + hddSparseBlockSize).c_str()); + + pxAssert(memcmp(hddSparseBlock.get(), temp.get(), hddSparseBlockSize) == 0); +#endif + return; + } +#elif defined(__POSIX__) +#ifdef SEEK_HOLE + // Are we in a hole? + off_t ret = lseek(hddNativeHandle, HddSparseStart, SEEK_HOLE); + if (ret == (off_t)HddSparseStart) + { + // Seek to data. + ret = lseek(hddNativeHandle, HddSparseStart, SEEK_DATA); + if (ret >= (off_t)(HddSparseStart + hddSparseBlockSize)) + { + // We are sparse. + memset(hddSparseBlock.get(), 0, hddSparseBlockSize); + hddSparseBlockValid = true; +#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD) + + // Store file pointer. + const s64 orgPos = FileSystem::FTell64(hddImage); + pxAssert(orgPos != -1); + + // Load into check buffer. + FileSystem::FSeek64(hddImage, HddSparseStart, SEEK_SET); + + std::unique_ptr temp = std::make_unique(hddSparseBlockSize); + memset(temp.get(), 0, hddSparseBlockSize); + + if (FileSystem::FSeek64(hddImage, HddSparseStart, SEEK_SET) != 0 || + std::fread((char*)hddSparseBlock.get(), readSize, 1, hddImage) != 1) + pxAssert(false); + + // Restore file pointer. + if (FileSystem::FSeek64(hddImage, orgPos, SEEK_SET) != 0) + pxAssert(false); + + // Check if file is actully zeros. + if (memcmp(hddSparseBlock.get(), temp.get(), hddSparseBlockSize) != 0) + { + Console.WriteLn("DEV9: ATA: Sparse area not sparse, BlockStart: %s, BlockEnd: %s", + std::to_string(HddSparseStart).c_str(), std::to_string(HddSparseStart + hddSparseBlockSize).c_str()); + } + else + Console.WriteLn("DEV9: ATA: Sparse area is sparse (Yay), BlockStart: %s, BlockEnd: %s", + std::to_string(HddSparseStart).c_str(), std::to_string(HddSparseStart + hddSparseBlockSize).c_str()); + + pxAssert(memcmp(hddSparseBlock.get(), temp.get(), hddSparseBlockSize) == 0); +#endif + return; + } + } +#endif +#endif + + // Load into cache. + if (orgPos == -1 || + FileSystem::FSeek64(hddImage, HddSparseStart, SEEK_SET) != 0 || + std::fread((char*)hddSparseBlock.get(), readSize, 1, hddImage) != 1 || + FileSystem::FSeek64(hddImage, orgPos, SEEK_SET) != 0) // Restore file pointer. + { + Console.Error("DEV9: ATA: File read error"); + pxAssert(false); + abort(); + } + + hddSparseBlockValid = true; +} + +void ATA::IO_SparseCacheUpdateLocation(u64 byteOffset) +{ + const u64 currentBlockStart = (byteOffset / hddSparseBlockSize) * hddSparseBlockSize; + if (currentBlockStart != HddSparseStart) + { + HddSparseStart = currentBlockStart; + hddSparseBlockValid = false; + // Only update cache when we perform a sparse write. + } +} + +// Also sets hddImage write ptr. +bool ATA::IO_SparseZero(u64 byteOffset, u64 byteSize) +{ + if (hddSparseBlockValid == false) + IO_SparseCacheLoad(); + + //Assert as range check + pxAssert(byteOffset >= HddSparseStart); + pxAssert(byteOffset - HddSparseStart + byteSize <= hddSparseBlockSize); + + //Write to cache + memset(&hddSparseBlock[byteOffset - HddSparseStart], 0, byteSize); + + //Is block non-zero? + if (!IsAllZero(hddSparseBlock.get(), hddSparseBlockSize)) + { +#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD) + std::unique_ptr zeroBlock = std::make_unique(hddSparseBlockSize); + memset(zeroBlock.get(), 0, hddSparseBlockSize); + pxAssert(memcmp(hddSparseBlock.get(), zeroBlock.get(), hddSparseBlockSize) != 0); +#endif + + //No, do normal write + if (std::fwrite((char*)&hddSparseBlock[byteOffset - HddSparseStart], byteSize, 1, hddImage) != 1 || + std::fflush(hddImage) != 0) + { + Console.Error("DEV9: ATA: File write error"); + pxAssert(false); + abort(); + } + return true; + } + +#if defined(PCSX2_DEBUG) || defined(PCSX2_DEVBUILD) + std::unique_ptr zeroBlock = std::make_unique(hddSparseBlockSize); + memset(zeroBlock.get(), 0, hddSparseBlockSize); + pxAssert(memcmp(hddSparseBlock.get(), zeroBlock.get(), hddSparseBlockSize) == 0); +#endif + + //Yes, try sparse write +#ifdef _WIN32 + FILE_ZERO_DATA_INFORMATION sparseRange; + sparseRange.FileOffset.QuadPart = HddSparseStart; + sparseRange.BeyondFinalZero.QuadPart = HddSparseStart + hddSparseBlockSize; + DWORD dwTemp; + const BOOL ret = DeviceIoControl(hddNativeHandle, FSCTL_SET_ZERO_DATA, &sparseRange, sizeof(sparseRange), nullptr, 0, &dwTemp, nullptr); + + if (ret == FALSE) + return false; + +#elif defined(__linux__) + const int ret = fallocate(hddNativeHandle, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, HddSparseStart, hddSparseBlockSize); + + if (ret == -1) + return false; + +#elif defined(__APPLE__) + fpunchhole_t sparseRange{0}; + sparseRange.fp_offset = HddSparseStart; + sparseRange.fp_length = hddSparseBlockSize; + + const int ret = fcntl(hddNativeHandle, F_PUNCHHOLE, &sparseRange); + + if (ret == -1) + return false; + +#else + Console.Error("DEV9: ATA: Hole punching not supported on current OS"); + return false; +#endif + if (FileSystem::FSeek64(hddImage, byteOffset + byteSize, SEEK_SET) != 0) + { + Console.Error("DEV9: ATA: File seek error"); + pxAssert(false); + abort(); + } + return true; +} + +bool ATA::IsAllZero(const void* data, size_t len) +{ + intmax_t* pbi = (intmax_t*)data; + intmax_t* pbiUpper = ((intmax_t*)(((char*)data) + len)) - 1; + for (; pbi <= pbiUpper; pbi++) + if (*pbi) + return false; // Check with the biggest int available most of the array, but without aligning it. + for (char* p = (char*)pbi; p < ((char*)data) + len; p++) + if (*p) + return false; // Check end of non aligned array. + return true; +} + void ATA::HDD_ReadAsync(void (ATA::*drqCMD)()) { nsectorLeft = 0; diff --git a/pcsx2/DEV9/ATA/HddCreate.cpp b/pcsx2/DEV9/ATA/HddCreate.cpp index 62eaea78b7..bb23d31d40 100644 --- a/pcsx2/DEV9/ATA/HddCreate.cpp +++ b/pcsx2/DEV9/ATA/HddCreate.cpp @@ -20,17 +20,29 @@ #include #include "HddCreate.h" +#if _WIN32 +#include "common/RedtapeWindows.h" +#include "common/StringUtil.h" +#include +#include +#elif defined(__POSIX__) +#include +#include +#include +#include +#endif + void HddCreate::Start() { Init(); - WriteImage(filePath, neededSize); + WriteImage(filePath, neededSize, 1024); Cleanup(); } -void HddCreate::WriteImage(std::string hddPath, u64 reqSizeBytes) +void HddCreate::WriteImage(std::string hddPath, u64 fileBytes, u64 zeroSizeBytes) { constexpr int buffsize = 4 * 1024; - u8 buff[buffsize] = {0}; //4kb + u8 buff[buffsize] = {0}; // 4kb. if (FileSystem::FileExists(hddPath.c_str())) { @@ -47,35 +59,154 @@ void HddCreate::WriteImage(std::string hddPath, u64 reqSizeBytes) return; } - //Size file - const char zero = 0; - bool success = FileSystem::FSeek64(newImage.get(), reqSizeBytes - 1, SEEK_SET) == 0; - success = success && std::fwrite(&zero, 1, 1, newImage.get()) == 1; - success = success && FileSystem::FSeek64(newImage.get(), 0, SEEK_SET) == 0; + bool sparseSupported = false; +#ifdef _WIN32 + // Handle owned by CFile. + HANDLE nativeFile = reinterpret_cast(_get_osfhandle(_fileno(newImage.get()))); - if (!success) + if (nativeFile == INVALID_HANDLE_VALUE) { + Console.Error("DEV9: HddCreate: failed to get handle"); newImage.reset(); - FileSystem::DeleteFilePath(filePath.c_str()); + FileSystem::DeleteFilePath(hddPath.c_str()); errored.store(true); SetError(); return; } + // Check if we support sparse files. + DWORD dwFlags; + if (GetVolumeInformationByHandleW(nativeFile, nullptr, 0, nullptr, nullptr, &dwFlags, nullptr, 0) == FALSE) + { + Console.Error("DEV9: HddCreate: failed to check sparse"); + newImage.reset(); + FileSystem::DeleteFilePath(hddPath.c_str()); + errored.store(true); + SetError(); + return; + } + + if (dwFlags & FILE_SUPPORTS_SPARSE_FILES) + { + // Sparse files supported. + FILE_SET_SPARSE_BUFFER sparseSetting; + sparseSetting.SetSparse = true; + FILE_ZERO_DATA_INFORMATION sparseRange; + sparseRange.FileOffset.QuadPart = 0; + sparseRange.BeyondFinalZero.QuadPart = fileBytes; + DWORD dwTemp; + + if ((DeviceIoControl(nativeFile, FSCTL_SET_SPARSE, &sparseSetting, sizeof(sparseSetting), nullptr, 0, &dwTemp, nullptr) == FALSE) || + (DeviceIoControl(nativeFile, FSCTL_SET_ZERO_DATA, &sparseRange, sizeof(sparseRange), nullptr, 0, &dwTemp, nullptr) == FALSE)) + { + Console.Error("DEV9: HddCreate: Failed to set sparse"); + newImage.reset(); + FileSystem::DeleteFilePath(hddPath.c_str()); + errored.store(true); + SetError(); + return; + } + + sparseSupported = true; + } + + // Set filesize. + LARGE_INTEGER seekStart; + seekStart.QuadPart = 0; + LARGE_INTEGER seekEnd; + seekEnd.QuadPart = fileBytes; + + if ((SetFilePointerEx(nativeFile, seekEnd, nullptr, FILE_BEGIN) == FALSE) || + (SetEndOfFile(nativeFile) == FALSE) || + (SetFilePointerEx(nativeFile, seekStart, nullptr, FILE_BEGIN) == FALSE)) + { + Console.Error("DEV9: HddCreate: Failed to set size"); + newImage.reset(); + FileSystem::DeleteFilePath(hddPath.c_str()); + errored.store(true); + SetError(); + return; + } + +#elif defined(__POSIX__) + // Handle owned by CFile. + int nativeFile = fileno(newImage.get()); + + if (nativeFile == -1) + { + Console.Error("DEV9: HddCreate: failed to get handle"); + newImage.reset(); + FileSystem::DeleteFilePath(hddPath.c_str()); + errored.store(true); + SetError(); + return; + } + + // Set filesize. + if ((ftruncate(nativeFile, fileBytes) == -1) || + (lseek(nativeFile, 0, SEEK_SET) == -1)) + { + Console.Error("DEV9: HddCreate: Failed to set size"); + newImage.reset(); + FileSystem::DeleteFilePath(hddPath.c_str()); + errored.store(true); + SetError(); + return; + } + + // Check the blocks allocated to determine if file is spasre. + // Assume that we don't get a false positive from filesystems only supporting ValidDataLength. + struct stat fileInfo; + if (fstat(nativeFile, &fileInfo) == -1) + { + Console.Error("DEV9: HddCreate: Failed to check sparse"); + // Set filesize to zero to avoid potential freeze on close. + // Ignore any error, can't do much if this fails anyway. + [[maybe_unused]] int i = ftruncate(nativeFile, 0); + newImage.reset(); + FileSystem::DeleteFilePath(hddPath.c_str()); + errored.store(true); + SetError(); + return; + } + + if (fileInfo.st_blocks != static_cast(fileBytes / 512)) + { + // Sparse files supported. + sparseSupported = true; + // File is automatically sparse. + } +#endif + lastUpdate = std::chrono::steady_clock::now(); - //Round up - const s32 reqMiB = (reqSizeBytes + ((1024 * 1024) - 1)) / (1024 * 1024); - for (s32 iMiB = 0; iMiB < reqMiB; iMiB++) + // Round up. + const s32 reqMiB = (fileBytes + ((1024 * 1024) - 1)) / (1024 * 1024); + const s32 zeroMiB = (zeroSizeBytes + ((1024 * 1024) - 1)) / (1024 * 1024); + + s32 iMiB = 0; + if (sparseSupported) + iMiB = reqMiB - zeroMiB; + + for (; iMiB < reqMiB; iMiB++) { - //Round down - const s32 req4Kib = std::min(1024, (reqSizeBytes / 1024) - (u64)iMiB * 1024) / 4; + // Round down. + const s32 req4Kib = std::min(1024, (fileBytes / 1024) - (u64)iMiB * 1024) / 4; for (s32 i4kb = 0; i4kb < req4Kib; i4kb++) { if (std::fwrite(buff, buffsize, 1, newImage.get()) != 1) { + std::fflush(newImage.get()); + // Set filesize to zero to avoid potential freeze on close. +#ifdef _WIN32 + SetFilePointerEx(nativeFile, seekStart, nullptr, FILE_BEGIN); + SetEndOfFile(nativeFile); +#elif defined(__POSIX__) + // Ignore any error, can't do much if this fails anyway. + [[maybe_unused]] int i = ftruncate(nativeFile, 0); +#endif newImage.reset(); - FileSystem::DeleteFilePath(filePath.c_str()); + FileSystem::DeleteFilePath(hddPath.c_str()); errored.store(true); SetError(); return; @@ -84,11 +215,20 @@ void HddCreate::WriteImage(std::string hddPath, u64 reqSizeBytes) if (req4Kib != 256) { - const s32 remainingBytes = reqSizeBytes - (((u64)iMiB) * (1024 * 1024) + req4Kib * 4096); + const s32 remainingBytes = fileBytes - (((u64)iMiB) * (1024 * 1024) + req4Kib * 4096); if (std::fwrite(buff, remainingBytes, 1, newImage.get()) != 1) { + std::fflush(newImage.get()); + // Set filesize to zero to avoid potential freeze on close. +#ifdef _WIN32 + SetFilePointerEx(nativeFile, seekStart, nullptr, FILE_BEGIN); + SetEndOfFile(nativeFile); +#elif defined(__POSIX__) + // Ignore any error, can't do much if this fails anyway. + [[maybe_unused]] int i = ftruncate(nativeFile, 0); +#endif newImage.reset(); - FileSystem::DeleteFilePath(filePath.c_str()); + FileSystem::DeleteFilePath(hddPath.c_str()); errored.store(true); SetError(); return; @@ -103,8 +243,17 @@ void HddCreate::WriteImage(std::string hddPath, u64 reqSizeBytes) } if (canceled.load()) { + std::fflush(newImage.get()); + // Set filesize to zero to avoid potential freeze on close. +#ifdef _WIN32 + SetFilePointerEx(nativeFile, seekStart, nullptr, FILE_BEGIN); + SetEndOfFile(nativeFile); +#elif defined(__POSIX__) + // Ignore any error, can't do much if this fails anyway. + [[maybe_unused]] int i = ftruncate(nativeFile, 0); +#endif newImage.reset(); - FileSystem::DeleteFilePath(filePath.c_str()); + FileSystem::DeleteFilePath(hddPath.c_str()); errored.store(true); SetError(); return; diff --git a/pcsx2/DEV9/ATA/HddCreate.h b/pcsx2/DEV9/ATA/HddCreate.h index 0bd21fcbae..936247f5ee 100644 --- a/pcsx2/DEV9/ATA/HddCreate.h +++ b/pcsx2/DEV9/ATA/HddCreate.h @@ -49,5 +49,5 @@ protected: void SetCanceled(); private: - void WriteImage(std::string hddPath, u64 reqSizeBytes); + void WriteImage(std::string hddPath, u64 fileBytes, u64 zeroSizeBytes); }; diff --git a/pcsx2/DEV9/DEV9.cpp b/pcsx2/DEV9/DEV9.cpp index 2113c83461..63522df8ee 100644 --- a/pcsx2/DEV9/DEV9.cpp +++ b/pcsx2/DEV9/DEV9.cpp @@ -21,8 +21,7 @@ #ifdef _WIN32 #include "common/RedtapeWindows.h" -#include -#include +#include #else #include #include diff --git a/pcsx2/DEV9/DEV9.h b/pcsx2/DEV9/DEV9.h index c01307e4fc..4102f05beb 100644 --- a/pcsx2/DEV9/DEV9.h +++ b/pcsx2/DEV9/DEV9.h @@ -31,7 +31,7 @@ #ifdef _WIN32 #define usleep(x) Sleep(x / 1000) -#include +#include "common/RedtapeWindows.h" #include #include @@ -257,7 +257,7 @@ EXTERN int ThreadRun; #define SMAP_R_RXFIFO_FRAME_CNT (SMAP_REGBASE + 0xf3C) #define SMAP_R_RXFIFO_FRAME_DEC (SMAP_REGBASE + 0xf40) #define SMAP_R_RXFIFO_DATA (SMAP_REGBASE + 0x1100) - + #define SMAP_R_FIFO_ADDR (SMAP_REGBASE + 0x1200) #define SMAP_FIFO_CMD_READ (1<<1) #define SMAP_FIFO_DATA_SWAP (1<<0) diff --git a/pcsx2/DEV9/InternalServers/DHCP_Server.cpp b/pcsx2/DEV9/InternalServers/DHCP_Server.cpp index 557225bb9a..52e1c1e169 100644 --- a/pcsx2/DEV9/InternalServers/DHCP_Server.cpp +++ b/pcsx2/DEV9/InternalServers/DHCP_Server.cpp @@ -57,7 +57,6 @@ namespace InternalServers void DHCP_Server::Init(ifaddrs* adapter, IP_Address ipOverride, IP_Address subnetOverride, IP_Address gatewayOverride) #endif { - ps2IP = {0}; netmask = {0}; gateway = {0}; dns1 = {0}; @@ -107,7 +106,7 @@ namespace InternalServers break; } - AutoDNS(adapter, EmuConfig.DEV9.ModeDNS1 != Pcsx2Config::DEV9Options::DnsMode::Manual, EmuConfig.DEV9.ModeDNS2 != Pcsx2Config::DEV9Options::DnsMode::Manual); + AutoDNS(adapter, EmuConfig.DEV9.ModeDNS1 == Pcsx2Config::DEV9Options::DnsMode::Auto, EmuConfig.DEV9.ModeDNS2 == Pcsx2Config::DEV9Options::DnsMode::Auto); AutoBroadcast(ps2IP, netmask); } diff --git a/pcsx2/DEV9/PacketReader/ARP/ARP_Packet.cpp b/pcsx2/DEV9/PacketReader/ARP/ARP_Packet.cpp index 818687bd91..79c67976c2 100644 --- a/pcsx2/DEV9/PacketReader/ARP/ARP_Packet.cpp +++ b/pcsx2/DEV9/PacketReader/ARP/ARP_Packet.cpp @@ -66,7 +66,7 @@ namespace PacketReader::ARP , senderProtocolAddress{std::make_unique(original.protocolAddressLength)} , targetHardwareAddress{std::make_unique(original.hardwareAddressLength)} , targetProtocolAddress{std::make_unique(original.protocolAddressLength)} - { + { memcpy(senderHardwareAddress.get(), original.senderHardwareAddress.get(), hardwareAddressLength); memcpy(senderProtocolAddress.get(), original.senderProtocolAddress.get(), protocolAddressLength); memcpy(targetHardwareAddress.get(), original.targetHardwareAddress.get(), hardwareAddressLength); diff --git a/pcsx2/DEV9/PacketReader/IP/IP_Address.h b/pcsx2/DEV9/PacketReader/IP/IP_Address.h index b920043774..2e1ae41910 100644 --- a/pcsx2/DEV9/PacketReader/IP/IP_Address.h +++ b/pcsx2/DEV9/PacketReader/IP/IP_Address.h @@ -19,7 +19,7 @@ namespace PacketReader::IP { struct IP_Address { - union + union { u8 bytes[4]; u32 integer; diff --git a/pcsx2/DEV9/PacketReader/IP/IP_Packet.h b/pcsx2/DEV9/PacketReader/IP/IP_Packet.h index 907e2be9c9..a9c706de59 100644 --- a/pcsx2/DEV9/PacketReader/IP/IP_Packet.h +++ b/pcsx2/DEV9/PacketReader/IP/IP_Packet.h @@ -82,7 +82,7 @@ namespace PacketReader::IP * Not Defined (xxx000) * 6 = Internetwork Control Class 6 * 7 = Network Control Class 7 - * + * * Lower 3 Bits * In TOS, defined as follows * bit 0: Reliability diff --git a/pcsx2/DEV9/PacketReader/IP/UDP/DNS/DNS_Packet.cpp b/pcsx2/DEV9/PacketReader/IP/UDP/DNS/DNS_Packet.cpp index bd1619bc64..dd68e3e282 100644 --- a/pcsx2/DEV9/PacketReader/IP/UDP/DNS/DNS_Packet.cpp +++ b/pcsx2/DEV9/PacketReader/IP/UDP/DNS/DNS_Packet.cpp @@ -107,7 +107,7 @@ namespace PacketReader::IP::UDP::DNS } void DNS_Packet::SetRCode(u8 value) { - flags2 = (flags2 & ~(0xF << 3)) | ((value & 0xF) << 3); + flags2 = (flags2 & ~(0xF)) | ((value & 0xF)); } DNS_Packet::DNS_Packet(u8* buffer, int bufferSize) diff --git a/pcsx2/DEV9/Sessions/ICMP_Session/ICMP_Session.cpp b/pcsx2/DEV9/Sessions/ICMP_Session/ICMP_Session.cpp index e20164184e..d12a533025 100644 --- a/pcsx2/DEV9/Sessions/ICMP_Session/ICMP_Session.cpp +++ b/pcsx2/DEV9/Sessions/ICMP_Session/ICMP_Session.cpp @@ -75,7 +75,7 @@ using namespace std::chrono_literals; FreeBSD Raw sockets restricted No unprivilaged ICMP sockets - Timeouts reported as a normal packet?? + Timeouts reported as a normal packet?? Ping cli Present for all platforms, but command args differ diff --git a/pcsx2/DEV9/Sessions/UDP_Session/UDP_FixedPort.cpp b/pcsx2/DEV9/Sessions/UDP_Session/UDP_FixedPort.cpp index 0b8d819d5b..a59b1a0f0a 100644 --- a/pcsx2/DEV9/Sessions/UDP_Session/UDP_FixedPort.cpp +++ b/pcsx2/DEV9/Sessions/UDP_Session/UDP_FixedPort.cpp @@ -79,6 +79,21 @@ namespace Sessions #elif defined(__POSIX__) errno); #endif + + sockaddr_in endpoint{0}; + endpoint.sin_family = AF_INET; + *(IP_Address*)&endpoint.sin_addr = adapterIP; + endpoint.sin_port = htons(parPort); + + ret = bind(client, (const sockaddr*)&endpoint, sizeof(endpoint)); + + if (ret == SOCKET_ERROR) + Console.Error("DEV9: UDP: Failed to bind socket. Error: %d", +#ifdef _WIN32 + WSAGetLastError()); +#elif defined(__POSIX__) + errno); +#endif } IP_Payload* UDP_FixedPort::Recv() diff --git a/pcsx2/DEV9/SimpleQueue.h b/pcsx2/DEV9/SimpleQueue.h index dcd9e20d0e..e070d2e342 100644 --- a/pcsx2/DEV9/SimpleQueue.h +++ b/pcsx2/DEV9/SimpleQueue.h @@ -18,6 +18,7 @@ #include #include "common/Assertions.h" +#include "common/Console.h" //Designed to allow one thread to queue data to another thread template diff --git a/pcsx2/DEV9/Win32/tap-win32.cpp b/pcsx2/DEV9/Win32/tap-win32.cpp index 5f4a2da411..c632aae587 100644 --- a/pcsx2/DEV9/Win32/tap-win32.cpp +++ b/pcsx2/DEV9/Win32/tap-win32.cpp @@ -21,9 +21,8 @@ #include "fmt/core.h" #include -#include -#include -#include +#include +#include #include #include @@ -371,15 +370,15 @@ bool TAPGetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSES adapter, * but it doesn't tell you whether it's a bridge or an LBFO team or something more exotic. * The way to distinguish exactly which flavor of ms_implat you have is to look at which LWF driver is bound to the *virtual miniport* above the IM driver. * This is two steps then. - * + * * 1. Given a physical NIC, you first want to determine which virtual NIC is layered over it. * 2. Given a virtual NIC, you want to determine whether ms_bridge is bound to it. - * + * * To get the first part, look through the interface stack table (GetIfStackTable). Search the stack table for any entry where the lower is the IfIndex of the physical NIC. * For any such entry (there will probably be a few), check if that entry's upper IfIndex is the IfIndex for a virtual miniport with component ID "COMPOSITEBUS\MS_IMPLAT_MP". * If you find such a thing, that means the physical NIC is a member of a bridge/LBFO/something-else-fancy. * If you don't find it, then you know the NIC isn't part of the bridge that comes with Windows 8 / Windows 10. - * + * * To get the second part, just use the same INetCfg code above on the *virtual* NIC's component. If the ms_bridge component is bound to the virtual NIC, * then that virtual NIC is doing bridging. Otherwise, it's doing something else (like LBFO). */ diff --git a/pcsx2/DEV9/pcap_io.cpp b/pcsx2/DEV9/pcap_io.cpp index be9cbd2adf..7ee049da0b 100644 --- a/pcsx2/DEV9/pcap_io.cpp +++ b/pcsx2/DEV9/pcap_io.cpp @@ -19,12 +19,10 @@ #include #ifdef _WIN32 -#include -#include -#include -//#include -//#include +#include "common/RedtapeWindows.h" #include "common/StringUtil.h" +#include +#include #elif defined(__linux__) #include #include diff --git a/pcsx2/DEV9/smap.cpp b/pcsx2/DEV9/smap.cpp index dbcc20f265..a133238d0d 100644 --- a/pcsx2/DEV9/smap.cpp +++ b/pcsx2/DEV9/smap.cpp @@ -194,8 +194,8 @@ void tx_process() if (dev9.txfifo_rd_ptr==16384) dev9.txfifo_rd_ptr=0; } - - + + if (dev9.txfifo_rd_ptr&(~16383)) { @@ -612,7 +612,7 @@ void smap_write16(u32 addr, u16 value) value = (value >> 8) | (value << 8); dev9Ru16(addr) = value; /* - switch (addr & 0x7) + switch (addr & 0x7) { case 0: // ctrl_stat DevCon.WriteLn("DEV9: TX_CTRL_STAT[%d]: write %x", (addr - SMAP_BD_TX_BASE) / 8, value); @@ -642,7 +642,7 @@ void smap_write16(u32 addr, u16 value) value = (value >> 8) | (value << 8); dev9Ru16(addr) = value; /* - switch (addr & 0x7) + switch (addr & 0x7) { case 0: // ctrl_stat DevCon.WriteLn("DEV9: RX_CTRL_STAT[%d]: write %x", rx_index, value); @@ -772,7 +772,7 @@ void smap_write16(u32 addr, u16 value) emu_printf("SMAP: SMAP_R_EMAC3_TxMODE0_H 16bit write %x\n", value); dev9Ru16(addr) = value; return; - + case SMAP_R_EMAC3_TxMODE1_H: emu_printf("SMAP: SMAP_R_EMAC3_TxMODE1_H 16bit write %x\n", value); dev9Ru16(addr) = value; diff --git a/pcsx2/DEV9/sockets.cpp b/pcsx2/DEV9/sockets.cpp index 4faa316e7d..a6adfba676 100644 --- a/pcsx2/DEV9/sockets.cpp +++ b/pcsx2/DEV9/sockets.cpp @@ -390,6 +390,7 @@ bool SocketAdapter::send(NetPacket* pkt) memcpy(arpRet->senderProtocolAddress.get(), arpPkt.targetProtocolAddress.get(), 4); arpRet->op = 2, arpRet->protocol = arpPkt.protocol; + arpRet->hardwareType = arpPkt.hardwareType; EthernetFrame* retARP = new EthernetFrame(arpRet); memcpy(retARP->destinationMAC, ps2MAC, 6); @@ -590,7 +591,7 @@ bool SocketAdapter::SendUDP(ConnectionKey Key, IP_Packet* ipPkt) fKey.ps2Port = udp.sourcePort; fKey.srvPort = 0; - Console.WriteLn("DEV9: Socket: Creating New UDPFixedPort with port %d", udp.sourcePort); + Console.WriteLn("DEV9: Socket: Creating New UDPFixedPort with port %d", udp.destinationPort); fPort = new UDP_FixedPort(fKey, adapterIP, udp.sourcePort); fPort->AddConnectionClosedHandler([&](BaseSession* session) { HandleFixedPortClosed(session); }); @@ -602,14 +603,14 @@ bool SocketAdapter::SendUDP(ConnectionKey Key, IP_Packet* ipPkt) fixedUDPPorts.Add(udp.sourcePort, fPort); } - Console.WriteLn("DEV9: Socket: Creating New UDP Connection from FixedPort %d", udp.sourcePort); + Console.WriteLn("DEV9: Socket: Creating New UDP Connection from FixedPort %d", udp.destinationPort); s = fPort->NewClientSession(Key, ipPkt->destinationIP == dhcpServer.broadcastIP || ipPkt->destinationIP == IP_Address{255, 255, 255, 255}, (ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0); } else { - Console.WriteLn("DEV9: Socket: Creating New UDP Connection to %d", udp.sourcePort); + Console.WriteLn("DEV9: Socket: Creating New UDP Connection to %d", udp.destinationPort); s = new UDP_Session(Key, adapterIP); } diff --git a/pcsx2/DebugTools/BiosDebugData.h b/pcsx2/DebugTools/BiosDebugData.h index f5c547f806..c474634244 100644 --- a/pcsx2/DebugTools/BiosDebugData.h +++ b/pcsx2/DebugTools/BiosDebugData.h @@ -49,7 +49,7 @@ enum { THS_WAIT_SUSPEND = 0x0C, THS_DORMANT = 0x10, }; - + enum { WAIT_NONE = 0, WAIT_WAKEUP_REQ = 1, diff --git a/pcsx2/DebugTools/Breakpoints.cpp b/pcsx2/DebugTools/Breakpoints.cpp index bd4fbb5a2f..a62ebf800b 100644 --- a/pcsx2/DebugTools/Breakpoints.cpp +++ b/pcsx2/DebugTools/Breakpoints.cpp @@ -52,11 +52,11 @@ MemCheck::MemCheck() , cond(MEMCHECK_READWRITE) , result(MEMCHECK_BOTH) , cpu(BREAKPOINT_EE) + , numHits(0) , lastPC(0) , lastAddr(0) , lastSize(0) { - numHits = 0; } void MemCheck::Log(u32 addr, bool write, int size, u32 pc) diff --git a/pcsx2/DebugTools/Debug.h b/pcsx2/DebugTools/Debug.h index afdd02f0f0..a96e40e245 100644 --- a/pcsx2/DebugTools/Debug.h +++ b/pcsx2/DebugTools/Debug.h @@ -91,7 +91,7 @@ public: { return SysTraceLog::IsActive() && EmuConfig.Trace.EE.m_EnableAll; } - + std::string GetCategory() const override { return "EE"; } }; @@ -266,7 +266,7 @@ struct SysTraceLogPack SysTraceLog_EE_Disasm COP1; SysTraceLog_EE_Disasm COP2; SysTraceLog_EE_Disasm Cache; - + SysTraceLog_EE_Registers KnownHw; SysTraceLog_EE_Registers UnknownHw; SysTraceLog_EE_Registers DMAhw; @@ -281,7 +281,7 @@ struct SysTraceLogPack EE_PACK(); } EE; - + struct IOP_PACK { SysTraceLog_IOP Bios; diff --git a/pcsx2/DebugTools/DebugInterface.cpp b/pcsx2/DebugTools/DebugInterface.cpp index dc770cdb26..9b2c804ccf 100644 --- a/pcsx2/DebugTools/DebugInterface.cpp +++ b/pcsx2/DebugTools/DebugInterface.cpp @@ -294,9 +294,7 @@ u64 R5900DebugInterface::read64(u32 address) if (!isValidAddress(address) || address % 8) return -1; - u64 result; - memRead64(address, result); - return result; + return memRead64(address); } u128 R5900DebugInterface::read128(u32 address) diff --git a/pcsx2/DebugTools/DisassemblyManager.cpp b/pcsx2/DebugTools/DisassemblyManager.cpp index be4a184f6b..3536f1b766 100644 --- a/pcsx2/DebugTools/DisassemblyManager.cpp +++ b/pcsx2/DebugTools/DisassemblyManager.cpp @@ -221,11 +221,11 @@ void DisassemblyManager::analyze(u32 address, u32 size = 1024) std::vector DisassemblyManager::getBranchLines(u32 start, u32 size) { std::vector result; - + auto it = findDisassemblyEntry(entries,start,false); if (it != entries.end()) { - do + do { it->second->getBranchLines(start,size,result); it++; @@ -258,7 +258,7 @@ void DisassemblyManager::getLine(u32 address, bool insertSymbols, DisassemblyLin DisassemblyEntry* entry = it->second; if (entry->disassemble(address,dest,insertSymbols)) return; - + if (address % 4) dest.totalSize = ((address+3) & ~3)-address; else @@ -277,7 +277,7 @@ u32 DisassemblyManager::getStartAddress(u32 address) if (it == entries.end()) return address; } - + DisassemblyEntry* entry = it->second; int line = entry->getLineNum(address,true); return entry->getLineAddress(line); @@ -288,7 +288,7 @@ u32 DisassemblyManager::getNthPreviousAddress(u32 address, int n) while (cpu->isValidAddress(address)) { auto it = findDisassemblyEntry(entries,address,false); - + while (it != entries.end()) { DisassemblyEntry* entry = it->second; @@ -302,10 +302,10 @@ u32 DisassemblyManager::getNthPreviousAddress(u32 address, int n) n -= oldLineNum+1; it = findDisassemblyEntry(entries,address,false); } - + analyze(address-127,128); } - + return address-n*4; } @@ -314,7 +314,7 @@ u32 DisassemblyManager::getNthNextAddress(u32 address, int n) while (cpu->isValidAddress(address)) { auto it = findDisassemblyEntry(entries,address,false); - + while (it != entries.end()) { DisassemblyEntry* entry = it->second; @@ -532,7 +532,7 @@ void DisassemblyFunction::load() break; } } - + u32 funcPos = address; u32 funcEnd = address+size; @@ -563,7 +563,7 @@ void DisassemblyFunction::load() DisassemblyComment* comment = new DisassemblyComment(cpu,funcPos,nextPos-funcPos,".align","4"); entries[funcPos] = comment; lineAddresses.push_back(funcPos); - + funcPos = nextPos; opcodeSequenceStart = funcPos; continue; @@ -572,14 +572,14 @@ void DisassemblyFunction::load() MIPSAnalyst::MipsOpcodeInfo opInfo = MIPSAnalyst::GetOpcodeInfo(cpu,funcPos); u32 opAddress = funcPos; funcPos += 4; - + // skip branches and their delay slots if (opInfo.isBranch) { if (funcPos < funcEnd) funcPos += 4; // only include delay slots within the function bounds continue; } - + // lui if (MIPS_GET_OP(opInfo.encodedOpcode) == 0x0F && funcPos < funcEnd && funcPos != nextData) { @@ -692,7 +692,7 @@ void DisassemblyFunction::clear() bool DisassemblyOpcode::disassemble(u32 address, DisassemblyLineInfo& dest, bool insertSymbols) { char opcode[64],arguments[256]; - + std::string dis = cpu->disasm(address,insertSymbols); parseDisasm(cpu->GetSymbolMap(),dis.c_str(),opcode,arguments,insertSymbols); dest.type = DISTYPE_OPCODE; @@ -770,7 +770,7 @@ bool DisassemblyMacro::disassemble(u32 address, DisassemblyLineInfo& dest, bool { case MACRO_LI: dest.name = name; - + addressSymbol = cpu->GetSymbolMap().GetLabelString(immediate); if (!addressSymbol.empty() && insertSymbols) { @@ -780,7 +780,7 @@ bool DisassemblyMacro::disassemble(u32 address, DisassemblyLineInfo& dest, bool } dest.params = buffer; - + dest.info.hasRelevantAddress = true; dest.info.releventAddress = immediate; break; @@ -883,7 +883,7 @@ void DisassemblyData::createLines() u32 pos = address; u32 end = address+size; u32 maxChars = DisassemblyManager::getMaxParamChars(); - + std::string currentLine; u32 currentLineStart = pos; @@ -904,7 +904,7 @@ void DisassemblyData::createLines() DataEntry entry = {currentLine,pos-1-currentLineStart,lineCount++}; lines[currentLineStart] = entry; lineAddresses.push_back(currentLineStart); - + currentLine = ""; currentLineStart = pos-1; inString = false; @@ -925,11 +925,11 @@ void DisassemblyData::createLines() { if (inString) currentLine += "\""; - + DataEntry entry = {currentLine,pos-1-currentLineStart,lineCount++}; lines[currentLineStart] = entry; lineAddresses.push_back(currentLineStart); - + currentLine = ""; currentLineStart = pos-1; inString = false; diff --git a/pcsx2/DebugTools/ExpressionParser.cpp b/pcsx2/DebugTools/ExpressionParser.cpp index 9312754394..82f7c9fd0b 100644 --- a/pcsx2/DebugTools/ExpressionParser.cpp +++ b/pcsx2/DebugTools/ExpressionParser.cpp @@ -305,7 +305,7 @@ bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, Postf while (true) { if (opcodeStack.empty()) - { + { sprintf(expressionError,"Closing parenthesis without opening one"); return false; } @@ -319,7 +319,7 @@ bool initPostfixExpression(const char* infix, IExpressionFunctions* funcs, Postf while (true) { if (opcodeStack.empty()) - { + { sprintf(expressionError,"Closing bracket without opening one"); return false; } diff --git a/pcsx2/DebugTools/MIPSAnalyst.cpp b/pcsx2/DebugTools/MIPSAnalyst.cpp index e5273227cc..9560531ff2 100644 --- a/pcsx2/DebugTools/MIPSAnalyst.cpp +++ b/pcsx2/DebugTools/MIPSAnalyst.cpp @@ -57,19 +57,19 @@ namespace MIPSAnalyst { u32 op = r5900Debug.read32(addr); const R5900::OPCODE& opcode = R5900::GetInstruction(op); - + int branchType = (opcode.flags & BRANCHTYPE_MASK); if ((opcode.flags & IS_BRANCH) && (branchType == BRANCHTYPE_BRANCH || branchType == BRANCHTYPE_BC1)) return addr + 4 + ((signed short)(op&0xFFFF)<<2); else return INVALIDTARGET; } - + u32 GetBranchTargetNoRA(u32 addr) { u32 op = r5900Debug.read32(addr); const R5900::OPCODE& opcode = R5900::GetInstruction(op); - + int branchType = (opcode.flags & BRANCHTYPE_MASK); if ((opcode.flags & IS_BRANCH) && (branchType == BRANCHTYPE_BRANCH || branchType == BRANCHTYPE_BC1)) { @@ -86,7 +86,7 @@ namespace MIPSAnalyst { u32 op = r5900Debug.read32(addr); const R5900::OPCODE& opcode = R5900::GetInstruction(op); - + if ((opcode.flags & IS_BRANCH) && (opcode.flags & BRANCHTYPE_MASK) == BRANCHTYPE_BRANCH) { bool sure = false; @@ -290,7 +290,7 @@ namespace MIPSAnalyst } } } - + if (end) { // most functions are aligned to 8 or 16 bytes // add the padding to this one @@ -353,7 +353,7 @@ namespace MIPSAnalyst case BRANCHTYPE_BRANCH: info.isConditional = true; info.branchTarget = info.opcodeAddress + 4 + ((s16)(op&0xFFFF)<<2); - + rs = info.cpu->getRegister(0,MIPS_GET_RS(op))._u64[0]; rt = info.cpu->getRegister(0,MIPS_GET_RT(op))._u64[0]; switch (opcode.flags & CONDTYPE_MASK) @@ -381,7 +381,7 @@ namespace MIPSAnalyst info.conditionMet = (((s64)rs) >= 0); break; } - + break; case BRANCHTYPE_REGISTER: info.isConditional = false; @@ -430,7 +430,7 @@ namespace MIPSAnalyst info.lrType = LOADSTORE_LEFT; else if (opcode.flags & IS_RIGHT) info.lrType = LOADSTORE_RIGHT; - + u32 rs = info.cpu->getRegister(0, (int)MIPS_GET_RS(op)); s16 imm16 = op & 0xFFFF; info.dataAddress = rs + imm16; @@ -457,7 +457,7 @@ namespace MIPSAnalyst info.dataSize = 16; break; } - + info.hasRelevantAddress = true; info.releventAddress = info.dataAddress; } diff --git a/pcsx2/DebugTools/MIPSAnalyst.h b/pcsx2/DebugTools/MIPSAnalyst.h index 9f8b5df418..a54dfdeb88 100644 --- a/pcsx2/DebugTools/MIPSAnalyst.h +++ b/pcsx2/DebugTools/MIPSAnalyst.h @@ -49,7 +49,7 @@ namespace MIPSAnalyst DebugInterface* cpu; u32 opcodeAddress; u32 encodedOpcode; - + // shared between branches and conditional moves bool isConditional; bool conditionMet; @@ -72,6 +72,6 @@ namespace MIPSAnalyst bool hasRelevantAddress; u32 releventAddress; } MipsOpcodeInfo; - + MipsOpcodeInfo GetOpcodeInfo(DebugInterface* cpu, u32 address); }; diff --git a/pcsx2/DebugTools/MipsAssembler.cpp b/pcsx2/DebugTools/MipsAssembler.cpp index 0d473a1648..1fb7802d5e 100644 --- a/pcsx2/DebugTools/MipsAssembler.cpp +++ b/pcsx2/DebugTools/MipsAssembler.cpp @@ -27,7 +27,7 @@ public: { // } - + static void queueError(ErrorType type, const wchar_t* text, ...) { // @@ -177,7 +177,7 @@ void SplitLine(const char* Line, char* Name, char* Arguments) *Name++ = *Line++; } *Name = 0; - + while (*Line == ' ' || *Line == '\t') Line++; while (*Line != 0) @@ -587,7 +587,7 @@ bool CMipsInstruction::LoadEncoding(const tMipsOpcode& SourceOpcode, const char* while (*Line == ' ' || *Line == '\t') Line++; if (*Line != 0) return false; // there's something else, bad - + // opcode is ok - now set all flags Opcode = SourceOpcode; immediate.value = immediate.originalValue; @@ -601,13 +601,13 @@ void CMipsInstruction::setOmittedRegisters() // copy over omitted registers if (Opcode.flags & MO_RSD) registers.grd = registers.grs; - + if (Opcode.flags & MO_RST) registers.grt = registers.grs; - + if (Opcode.flags & MO_RDT) registers.grt = registers.grd; - + if (Opcode.flags & MO_FRSD) registers.frd = registers.frs; } @@ -641,7 +641,7 @@ bool CMipsInstruction::Validate() if (immediateType != MIPS_NOIMMEDIATE) { immediate.originalValue = immediate.value; - + if (Opcode.flags & MO_IMMALIGNED) // immediate must be aligned { if (immediate.value % 4) @@ -657,7 +657,7 @@ bool CMipsInstruction::Validate() } else if (Opcode.flags & MO_IPCR) // relative 16 bit value { int num = (immediate.value-RamPos-4); - + if (num > 0x20000 || num < (-0x20000)) { Logger::queueError(Logger::Error,L"Branch target %08X out of range",immediate.value); @@ -665,7 +665,7 @@ bool CMipsInstruction::Validate() } immediate.value = num >> 2; } - + int immediateBits = getImmediateBits(immediateType); unsigned int mask = (0xFFFFFFFF << (32-immediateBits)) >> (32-immediateBits); int digits = (immediateBits+3) / 4; @@ -678,7 +678,7 @@ bool CMipsInstruction::Validate() immediate.value &= mask; } - + return true; } @@ -689,11 +689,11 @@ void CMipsInstruction::encodeNormal() if (registers.grs.num != -1) encoding |= MIPS_RS(registers.grs.num); // source reg if (registers.grt.num != -1) encoding |= MIPS_RT(registers.grt.num); // target reg if (registers.grd.num != -1) encoding |= MIPS_RD(registers.grd.num); // dest reg - + if (registers.frt.num != -1) encoding |= MIPS_FT(registers.frt.num); // float target reg if (registers.frs.num != -1) encoding |= MIPS_FS(registers.frs.num); // float source reg if (registers.frd.num != -1) encoding |= MIPS_FD(registers.frd.num); // float dest reg - + if (registers.ps2vrt.num != -1) encoding |= (registers.ps2vrt.num << 16); // ps2 vector target reg if (registers.ps2vrs.num != -1) encoding |= (registers.ps2vrs.num << 21); // ps2 vector source reg if (registers.ps2vrd.num != -1) encoding |= (registers.ps2vrd.num << 6); // ps2 vector dest reg diff --git a/pcsx2/DebugTools/SymbolMap.cpp b/pcsx2/DebugTools/SymbolMap.cpp index 59139c92c8..6e1a4eb5c7 100644 --- a/pcsx2/DebugTools/SymbolMap.cpp +++ b/pcsx2/DebugTools/SymbolMap.cpp @@ -133,7 +133,7 @@ bool SymbolMap::GetSymbolInfo(SymbolInfo *info, u32 address, SymbolType symmask) return true; } - + if (dataAddress != INVALID_ADDRESS) { if (info != NULL) { info->type = ST_DATA; diff --git a/pcsx2/Dmac.cpp b/pcsx2/Dmac.cpp index 5ed89c0310..a8cfb1596b 100644 --- a/pcsx2/Dmac.cpp +++ b/pcsx2/Dmac.cpp @@ -120,7 +120,7 @@ __fi tDMA_TAG* SPRdmaGetAddr(u32 addr, bool write) DevCon.Warning("MTVU: SPR Accessing VU1 Memory"); vu1Thread.WaitVU(); } - + //Access for VU Memory if((addr >= 0x1100c000) && (addr < 0x11010000)) @@ -134,7 +134,7 @@ __fi tDMA_TAG* SPRdmaGetAddr(u32 addr, bool write) //DevCon.Warning("VU0 Mem %x", addr); return (tDMA_TAG*)(VU0.Mem + (addr & 0xff0)); } - + //Possibly not needed but the manual doesn't say SPR cannot access it. if((addr >= 0x11000000) && (addr < 0x11004000)) { @@ -147,8 +147,8 @@ __fi tDMA_TAG* SPRdmaGetAddr(u32 addr, bool write) //DevCon.Warning("VU1 Micro %x", addr); return (tDMA_TAG*)(VU1.Micro + (addr & 0x3ff0)); } - - + + // Unreachable return NULL; } @@ -255,7 +255,7 @@ static __ri void DmaExec( void (*func)(), u32 mem, u32 value ) cpuClearInt( 11 ); QueuedDMA._u16 &= ~(1 << 11); //Clear any queued DMA requests for this channel } - + cpuClearInt( channel ); QueuedDMA._u16 &= ~(1 << channel); //Clear any queued DMA requests for this channel } @@ -307,7 +307,7 @@ __fi u32 dmacRead32( u32 mem ) // Set OPH and APATH from counter, cycling paths and alternating OPH return gifRegs.stat._u32 & ~(7 << 9) | (counter & 1 ? counter << 9 : 0); } - + return psHu32(mem); } diff --git a/pcsx2/Docs/.gitignore b/pcsx2/Docs/.gitignore index f08278d85a..a136337994 100644 --- a/pcsx2/Docs/.gitignore +++ b/pcsx2/Docs/.gitignore @@ -1 +1 @@ -*.pdf \ No newline at end of file +*.pdf diff --git a/pcsx2/Docs/Configuration_Guide/Configuration_Guide.md b/pcsx2/Docs/Configuration_Guide/Configuration_Guide.md index 5a2c439a0d..aebd27a041 100644 --- a/pcsx2/Docs/Configuration_Guide/Configuration_Guide.md +++ b/pcsx2/Docs/Configuration_Guide/Configuration_Guide.md @@ -41,7 +41,7 @@ Advanced users may wish to use a different folder for their BIOS, you can do so ![PCSX2_First_Time_Configuration_bios.png](PCSX2_First_Time_Configuration_bios.png) ## Post-Setup Configuration -A large number of games work out-of-the-box on default PCSX2 settings. However, a subset of games require special settings to run, and some games require special settings to be upscaled. This guide will briefly cover some frequent problems and configuration settings to address them. +A large number of games work out-of-the-box on default PCSX2 settings. However, a subset of games require special settings to run, and some games require special settings to be upscaled. This guide will briefly cover some frequent problems and configuration settings to address them. ### Multi-Threaded VU1 (MTVU) The MTVU option is a unique case of a recommended setting that is **not** enabled by default. MTVU boosts performance for PCs with at least 3 cores with almost no consequences for the overwhelming majority of games. However, a small number of high profile games are incompabible with MTVU and will break if it is enabled. For these reasons, we do not enable it by default, **but strongly recommend you do so yourself**. If your game fails to boot, crashes, stalls, or has other problems with it enabled, disable it and try again. @@ -50,7 +50,7 @@ The MTVU option is a unique case of a recommended setting that is **not** enable Looking for information specific to a single game? Head to the [PCSX2 Wiki](https://wiki.pcsx2.net/Main_Page) and search for your game using the search bar in the top right. Known issues and solutions should be towards the bottom of a game's wiki page. ### General solutions -Want some general ideas to try that are not specific to a game? Here are some more commonly known issues and solutions to try. +Want some general ideas to try that are not specific to a game? Here are some more commonly known issues and solutions to try. *Note: For some of these issues, multiple solutions are given one after the other. Before moving from one solution to the next, **undo the previous solution**. Stacking multiple fixes on top of each other is usually unnecessary and likely to introduce new issues.* #### Grid-like pattern on screen @@ -74,7 +74,7 @@ Sometimes a game uses blending for lighting effects and needs more accuracy for Increment Blending Accuracy until the problem goes away. Note, higher Blending Accuracy substantially increases performance requirements. #### Flickering or improperly shaped shadows -This can either be a GS or VU problem so solutions will vary wildly by game. +This can either be a GS or VU problem so solutions will vary wildly by game. ##### GS Navigate to the GSdx Advanced Settings and Hacks: diff --git a/pcsx2/Docs/GameIndex.md b/pcsx2/Docs/GameIndex.md index acb88bb67f..d8a55618f1 100644 --- a/pcsx2/Docs/GameIndex.md +++ b/pcsx2/Docs/GameIndex.md @@ -1,6 +1,6 @@ @@ -56,12 +56,10 @@ SERIAL-12345: # !required! Serial number for the game, this is how games are loo # You can define multiple patches, but they are identified by the CRC. patches: default: # Default CRC! - author: "Some Person" content: |- # !required! This allows for multi-line strings in YAML, this type preserves new-line characters comment=Sample Patch patch=1,EE,00000002,word,00000000 crc123: # Specific CRC Patch! - author: "Some Person" content: |- comment=Another Sample patch=1,EE,00000001,word,00000000 @@ -142,9 +140,18 @@ The clamp modes are also numerically based. ### GS Hardware General Fixes -* conservativeFramebuffer [`0` or `1`] {Off or On} Default: On (`1`) -* texturePreloading [`0` or `1` or `2`] {None, Partial or Full Hash Cache} Default: None (`0`) -* deinterlace [Value between `0` to `7`] {Off, WeaveTFF, WeaveBFF, BobTFF, BobBFF, BlendTFF, BlendBFF, Automatic} Default: Automatic (No value, looks up GameDB) +* conservativeFramebuffer + [`0` or `1`] + {Off or On} + Default: On (`1`) +* texturePreloading + [`0` or `1` or `2`] + {None, Partial or Full Hash Cache} + Default: None (`0`) +* deinterlace + [Value between `0` to `9`] + {Automatic, Off, WeaveTFF, WeaveBFF, BobTFF, BobBFF, BlendTFF, BlendBFF, AdaptiveTFF, AdaptiveBFF} + Default: Automatic (No value, looks up GameDB) ### GS Hardware Renderer Fixes @@ -240,9 +247,9 @@ These values are in a key-value format, where the value is assumed to be an inte ## Memory Card Filter Override -By default, the FolderMemoryCard filters save games based on thegame's serial, which means that only saves whose folder names containthe game's serial are loaded. +By default, the FolderMemoryCard filters save games based on the game's serial, which means that only saves whose folder names containthe game's serial are loaded. -This works fine for the vast majority of games, but fails in some cases, for which this override is for.Examples include multi-disc games, where later games often reuse theserial of the previous disc(s), and games that allow transfer of savedata between different games, such as importing data from a prequel. +This works fine for the vast majority of games, but fails in some cases, for which this override is for. Examples include multi-disc games, where later games often reuse the serial of the previous disc(s), and games that allow transfer of savedata between different games, such as importing data from a prequel. > Values should be specified as a list of strings, example shown above. @@ -255,3 +262,20 @@ The patch that corresponds to the running game's CRC will take precedence over t Patches should be defined as multi-line string blocks, where each line would correspond with a line in a conventional `*.pnach` file For more information on how to write a patch, see the following [forum post](https://forums.pcsx2.net/Thread-How-PNACH-files-work-2-0) + +## Editor Tooling + +We provide a [JSON Schema](https://json-schema.org/) for the GameDB's format. You can use this to validate the file, and assist in writing it properly. + +### VSCode Integration + +If you use VSCode and you want it to properly lint the GameIndex.yaml file you should: + +1. Download the YAML extension - https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml +2. Add the following to your settings: + +```json +"yaml.schemas": { + "https://raw.githubusercontent.com/PCSX2/pcsx2/master/pcsx2/Docs/gamedb-schema.json": "**/GameIndex.yaml", +}, +``` diff --git a/pcsx2/Docs/License.txt b/pcsx2/Docs/License.txt index 61fa0f63ac..94d4a2db76 100644 --- a/pcsx2/Docs/License.txt +++ b/pcsx2/Docs/License.txt @@ -5,7 +5,7 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2019 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -17,4 +17,3 @@ * You should have received a copy of the GNU General Public License along with PCSX2. * If not, see . */ - \ No newline at end of file diff --git a/pcsx2/Docs/PCSX2_FAQ.md b/pcsx2/Docs/PCSX2_FAQ.md index 21a683d478..f888c0e8dd 100644 --- a/pcsx2/Docs/PCSX2_FAQ.md +++ b/pcsx2/Docs/PCSX2_FAQ.md @@ -25,7 +25,7 @@ There are a number of ways to help the project, whether it be bug reporting, gam * Want to improve the PCSX2 wiki? [Here is how to contribute](https://wiki.pcsx2.net/Help!_How_to_contribute_guide) ### Question 4: Is PCSX2 ready to run out-of-the-box? -No, first, you must dump your PlayStation 2 console's BIOS using the BIOS dumper. The BIOS dumper is [available on the PCSX2 website](https://pcsx2.net/download/releases/tools.html). +No, first, you must dump your PlayStation 2 console's BIOS using the BIOS dumper. The BIOS dumper is [available on the PCSX2 website](https://pcsx2.net/download/releases/tools.html). After dumping your PlayStation 2 console's BIOS and copying it to your computer, launch PCSX2, step through the first time setup wizard, and then you may begin playing. @@ -44,7 +44,7 @@ After dumping your PlayStation 2 console's BIOS and copying it to your computer, *Note: Recommended Single Thread Performance is based on moderately complex games. Games that pushed the PS2 hardware to its limits will struggle on CPUs at this level. Some release titles and 2D games which underutilized the PS2 hardware may run on CPUs rated as low as 1200. A quick reference for CPU **intensive games**: [Wiki](https://wiki.pcsx2.net/Category:CPU_intensive_games), [Forum](https://forums.pcsx2.net/Thread-LIST-The-Most-CPU-Intensive-Games) and CPU **light** games: [Forum](https://forums.pcsx2.net/Thread-LIST-Games-that-don-t-need-a-strong-CPU-to-emulate)* -#### Recommended +#### Recommended | Operating System | CPU | GPU | RAM | | --- | --- | --- | --- | @@ -66,7 +66,7 @@ The CPU load as reported in software such as Windows' Task Manager is usually a No. PCSX2 does not use or require SLI or Crossfire. ### Question 9: How do I check if a game is playable? -The PCSX2 website has a [compatibility list](https://pcsx2.net/compat/) with every game that has been tested. +The PCSX2 website has a [compatibility list](https://pcsx2.net/compat/) with every game that has been tested. ### Question 10: Do PS1 (PSX) games work on PCSX2? @@ -74,12 +74,12 @@ The PCSX2 website has a [compatibility list](https://pcsx2.net/compat/) with eve No, they will not work without issues. Please use a proper PS1 emulator, such as Duckstation or Mednafen. #### If you are a tinkerer and like to break things: -PS1 games may work on PCSX2, but compatibility is very limited. Specific settings are often required to get a game to boot, and there are other universal problems including missing/pitch-shifted audio and severe FMV corruption. A [forum thread for PS1 compatibility](https://forums.pcsx2.net/Thread-PSX-Mode-Unofficial-Compatibility-List) is tracking some fixes and compatibility reports. +PS1 games may work on PCSX2, but compatibility is very limited. Specific settings are often required to get a game to boot, and there are other universal problems including missing/pitch-shifted audio and severe FMV corruption. A [forum thread for PS1 compatibility](https://forums.pcsx2.net/Thread-PSX-Mode-Unofficial-Compatibility-List) is tracking some fixes and compatibility reports. *While we encourage discussion about PS1 games and improving compatibility, bug reports are NOT being accepted for PS1 games. Any reports for PS1 games will be closed immediately as invalid.* ### Question 11: Why does my game not work like it did in an earlier PCSX2 version? -Any change to the emulator may fix one game, but cause problems for another. If the issue is severe and not fixable with different settings, you can always revert back to the last known PCSX2 version to work, and report the build number that broke the game. [Development builds](https://pcsx2.net/download/development.html) are very helpful for finding the exact change that caused a regression. +Any change to the emulator may fix one game, but cause problems for another. If the issue is severe and not fixable with different settings, you can always revert back to the last known PCSX2 version to work, and report the build number that broke the game. [Development builds](https://pcsx2.net/download/development.html) are very helpful for finding the exact change that caused a regression. ### Question 12: Why is PCSX2 slow? The PlayStation 2 is a complex console, and this substantially raises the PC requirements to emulate it at full speed accurately. [This forum thread](https://forums.pcsx2.net/Thread-Why-is-PCSX2-slow) helps explain some of the technical reasons behind it, and our current guidelines for PC requirements are listed above. @@ -142,12 +142,12 @@ Some settings are greyed out. These are advanced counters that should only be mo ### Question 22: What is the normal speed for a PlayStation 2 game? * NTSC games will play at 59.94 FPS * PAL games will play at 50 FPS -* Keep in mind that there is a difference between the internal framerate (iFPS) and what PCSX2 shows as virtual framerate (vFPS). +* Keep in mind that there is a difference between the internal framerate (iFPS) and what PCSX2 shows as virtual framerate (vFPS). -These framerates are what the PlayStation 2 console would push to a real TV through its video cable. A game itself, typically, internally generates only half of those frames, and repeats frames to fill the gaps. This is why a "full speed" game may not "feel like 60 FPS". The console's "speed" (meaning AI, sound, physics, *everything*) is tied to the playback framerate, which is what PCSX2 reports as its "FPS". +These framerates are what the PlayStation 2 console would push to a real TV through its video cable. A game itself, typically, internally generates only half of those frames, and repeats frames to fill the gaps. This is why a "full speed" game may not "feel like 60 FPS". The console's "speed" (meaning AI, sound, physics, *everything*) is tied to the playback framerate, which is what PCSX2 reports as its "FPS". ### Question 23: What are Gamefixes? -Gamefixes are specialized fixes built into PCSX2 for specific games. Gamefixes mostly fix core emulation problems that would crash or soft lock a game, rather than graphical or performance issues. By default, the "System > Automatic Gamefixes" option is enabled, meaning any games that need gamefixes will have them automatically applied, regardless of what gamefix settings you have enabled. +Gamefixes are specialized fixes built into PCSX2 for specific games. Gamefixes mostly fix core emulation problems that would crash or soft lock a game, rather than graphical or performance issues. By default, the "System > Automatic Gamefixes" option is enabled, meaning any games that need gamefixes will have them automatically applied, regardless of what gamefix settings you have enabled. Most games will not need gamefixes, however if your game is having issues, you can try manually enabling them in Emulation Settings. @@ -161,7 +161,7 @@ As the name says, speedhacks are hacks to make things faster. They will speed up *Bug reports of issues caused by speedhacks will NOT be accepted, and will be immediately closed as invalid.* ### Question 25: What are all these EE/IOP and VU options? -The PS2 EE, IOP and VU processors are substantially different from a PC CPU and require different rounding and clamping modes to do math accurately. Most games work fine on the default options, but some games might need a different setting. You can check the [PCSX2 Wiki](https://wiki.pcsx2.net/Category:Games) to see if your game needs an alternate setting, or check the [PCSX2 Forums](https://forums.pcsx2.net/) to see if anyone else has posted about it there. +The PS2 EE, IOP and VU processors are substantially different from a PC CPU and require different rounding and clamping modes to do math accurately. Most games work fine on the default options, but some games might need a different setting. You can check the [PCSX2 Wiki](https://wiki.pcsx2.net/Category:Games) to see if your game needs an alternate setting, or check the [PCSX2 Forums](https://forums.pcsx2.net/) to see if anyone else has posted about it there. ### Question 26: What are PCSX2 plugins? Older versions of PCSX2 used a plugin framework for various sections of the emulator. A plugin is a small, incomplete piece of software that, when plugged in to another piece of software, provides some sort of additional function. PCSX2 used to use plugins for: @@ -184,7 +184,7 @@ For Linux users, PCSX2 will automatically detect and bind controls to any recogn --- ## Useful Links -### BIOS Dumping Guides +### BIOS Dumping Guides * [pgert's guide to BIOS and memory card tools](https://forums.pcsx2.net/Thread-An-orientation-through-some-of-the-PCSX2-BIOS-memcard-tools-Windows?pid=183709#pid183709) * [One of the original BIOS dumping guides, originally from ngemu](https://forums.pcsx2.net/Thread-Guide-to-Dumping-Your-PS2-Bios-over-LAN) @@ -198,4 +198,4 @@ For Linux users, PCSX2 will automatically detect and bind controls to any recogn * [The original guide, outdated](https://forums.pcsx2.net/Thread-How-pnach-files-work). ### PCSX2 with Netplay Support -* [The latest Netplay fork of PCSX2](https://forums.pcsx2.net/Thread-PCSX2-Online-Plus). \ No newline at end of file +* [The latest Netplay fork of PCSX2](https://forums.pcsx2.net/Thread-PCSX2-Online-Plus). diff --git a/pcsx2/Docs/README.md b/pcsx2/Docs/README.md index a44272da6a..b2b4689c57 100644 --- a/pcsx2/Docs/README.md +++ b/pcsx2/Docs/README.md @@ -20,6 +20,6 @@ If you wish to donate monetarily to the project you can do so via the [GitHub Sp ## Thanks to the following monthly donators We thank everybody for their contributions to the project, but we would like to give a special shout out to: -- noigeaR -- xTVaser -- And 1 anonymous donator! \ No newline at end of file + - noigeaR + - xTVaser + - And 1 anonymous donator! diff --git a/pcsx2/Docs/gamedb-schema.json b/pcsx2/Docs/gamedb-schema.json new file mode 100644 index 0000000000..9f57636806 --- /dev/null +++ b/pcsx2/Docs/gamedb-schema.json @@ -0,0 +1,267 @@ +{ + "$id": "PCSX2 GameDB", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "PCSX2 GameDB", + "description": "JSON Schema for PCSX2's GameDB", + "type": "object", + "patternProperties": { + "^[A-Z\\d]+-[A-Z\\d]+$": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the game, an arbitrary string" + }, + "region": { + "type": "string", + "description": "The region code for the game, for example NTSC-U", + "pattern": "^(?:NTSC-(?:B|C|E|HK|J|K|M|T|U).*|PAL-?(?:A|B|E|F|G|I|M|N|P|R|S|U)?.*|Other)$" + }, + "compat": { + "type": "integer", + "description": "A number indicating the compatibility of the game. 0 (Nothing) to 6 (Perfect)", + "minimum": 0, + "maximum": 6 + }, + "roundModes": { + "type": "object", + "description": "Specify the rounding modes for the EE or VU. 0 (Nearest), 1 (Negative Infinity), 2 (Positive Infinity), 3 (Chop (Zero))", + "properties": { + "eeRoundMode": { + "type": "integer", + "minimum": 0, + "maximum": 3 + }, + "vuRoundMode": { + "type": "integer", + "minimum": 0, + "maximum": 3 + } + }, + "additionalProperties": false + }, + "clampModes": { + "type": "object", + "description": "Specify the clamp modes for the EE or VU.", + "properties": { + "eeClampMode": { + "type": "integer", + "description": "0 (Disables), 1 (Normally), 2 (Extra+Preserve Sign), 3 (Full Clamping)", + "minimum": 0, + "maximum": 3 + }, + "vuClampMode": { + "type": "integer", + "description": "0 (Disables), 1 (Normally), 2 (Extra), 3 (Extra+Preserve Sign)", + "minimum": 0, + "maximum": 3 + } + }, + "additionalProperties": false + }, + "gameFixes": { + "type": "array", + "items": { + "enum": [ + "BlitInternalFPSHack", + "DMABusyHack", + "EETimingHack", + "FpuMulHack", + "FpuNegDivHack", + "GIFFIFOHack", + "GoemonTlbHack", + "IbitHack", + "InstantDMAHack", + "OPHFlagHack", + "SkipMPEGHack", + "SoftwareRendererFMVHack", + "VIF1StallHack", + "VIFFIFOHack", + "VuAddSubHack", + "VUOverflowHack", + "VUSyncHack", + "XGKickHack" + ] + }, + "minItems": 1, + "uniqueItems": true + }, + "gsHWFixes": { + "type": "object", + "properties": { + "autoFlush": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "conservativeFramebuffer": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "cpuFramebufferConversion": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "disableDepthSupport": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "wrapGSMem": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "preloadFrameData": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "disablePartialInvalidation": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "textureInsideRT": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "alignSprite": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "mergeSprite": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "wildArmsHack": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "pointListPalette": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "mipmap": { + "type": "integer", + "minimum": 0, + "maximum": 2 + }, + "trilinearFiltering": { + "type": "integer", + "minimum": 0, + "maximum": 2 + }, + "skipDrawStart": { + "type": "integer", + "minimum": 0, + "maximum": 100000 + }, + "skipDrawEnd": { + "type": "integer", + "minimum": 0, + "maximum": 100000 + }, + "halfBottomOverride": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "halfPixelOffset": { + "type": "integer", + "minimum": 0, + "maximum": 3 + }, + "roundSprite": { + "type": "integer", + "minimum": 0, + "maximum": 2 + }, + "texturePreloading": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "deinterlace": { + "type": "integer", + "minimum": 0, + "maximum": 9 + }, + "cpuSpriteRenderBW": { + "type": "integer", + "minimum": 1, + "maximum": 10 + }, + "cpuCLUTRender": { + "type": "integer", + "minimum": 1, + "maximum": 2 + }, + "gpuPaletteConversion": { + "type": "integer", + "minimum": 0, + "maximum": 2 + } + }, + "additionalProperties": false + }, + "memcardFilters": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[A-Z\\d]+-?[A-Z\\d]+$" + }, + "minItems": 1, + "uniqueItems": true + }, + "speedHacks": { + "type": "object", + "properties": { + "mvuFlagSpeedHack": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "InstantVU1SpeedHack": { + "type": "integer", + "minimum": 0, + "maximum": 1 + }, + "MTVUSpeedHack": { + "type": "integer", + "minimum": 0, + "maximum": 1 + } + }, + "additionalProperties": false + }, + "patches": { + "type": "object", + "patternProperties": { + "^default|[A-Z0-9]{8}$": { + "type": "object", + "properties": { + "content": { + "type": "string" + } + }, + "required": ["content"], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "required": ["name", "region"], + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/pcsx2/Dump.cpp b/pcsx2/Dump.cpp index ddcb5e220c..2543961b40 100644 --- a/pcsx2/Dump.cpp +++ b/pcsx2/Dump.cpp @@ -298,8 +298,8 @@ void iDumpBlock( int startpc, u8 * ptr ) // write the instruction info - std::fprintf(eff, "\n\nlive0 - %x, live2 - %x, lastuse - %x\nxmm - %x, used - %x\n", - EEINST_LIVE0, EEINST_LIVE2, EEINST_LASTUSE, EEINST_XMM, EEINST_USED + std::fprintf(eff, "\n\nlive0 - %x, lastuse - %x\nxmm - %x, used - %x\n", + EEINST_LIVE, EEINST_LASTUSE, EEINST_XMM, EEINST_USED ); memzero(used); diff --git a/pcsx2/Elfheader.cpp b/pcsx2/Elfheader.cpp index 276d3b29cd..90e74f6a14 100644 --- a/pcsx2/Elfheader.cpp +++ b/pcsx2/Elfheader.cpp @@ -150,7 +150,7 @@ std::pair ElfObject::getTextRange() if (start <= header.e_entry && (start+size) > header.e_entry) return std::make_pair(start,size); } - + return std::make_pair(0,0); } diff --git a/pcsx2/Frontend/Achievements.cpp b/pcsx2/Frontend/Achievements.cpp new file mode 100644 index 0000000000..010eb01946 --- /dev/null +++ b/pcsx2/Frontend/Achievements.cpp @@ -0,0 +1,2246 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#include "Frontend/Achievements.h" +#include "Frontend/CommonHost.h" +#include "Frontend/FullscreenUI.h" +#include "Frontend/ImGuiFullscreen.h" +#include "Frontend/ImGuiManager.h" + +#include "common/Assertions.h" +#include "common/FileSystem.h" +#include "common/HTTPDownloader.h" +#include "common/Console.h" +#include "common/General.h" +#include "common/MD5Digest.h" +#include "common/Path.h" +#include "common/ScopedGuard.h" +#include "common/StringUtil.h" +#include "common/Timer.h" + +#include "rc_api_info.h" +#include "rc_api_request.h" +#include "rc_api_runtime.h" +#include "rc_api_user.h" +#include "rcheevos.h" +#include "fmt/core.h" + +#include "CDVD/IsoFS/IsoFSCDVD.h" +#include "CDVD/IsoFS/IsoFS.h" +#include "Elfheader.h" +#include "GS.h" +#include "Host.h" +#include "HostSettings.h" +#include "IopMem.h" +#include "Memory.h" +#include "VMManager.h" +#include "vtlb.h" +#include "svnrev.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef ENABLE_RAINTEGRATION +// RA_Interface ends up including windows.h, with its silly macros. +#include "common/RedtapeWindows.h" +#include "RA_Interface.h" +#endif + +namespace Achievements +{ + enum : s32 + { + HTTP_OK = Common::HTTPDownloader::HTTP_OK, + + // Number of seconds between rich presence pings. RAIntegration uses 2 minutes. + RICH_PRESENCE_PING_FREQUENCY = 2 * 60, + NO_RICH_PRESENCE_PING_FREQUENCY = RICH_PRESENCE_PING_FREQUENCY * 2, + + // Size of the EE physical memory exposed to RetroAchievements. + EXPOSED_EE_MEMORY_SIZE = Ps2MemSize::MainRam + Ps2MemSize::Scratch, + }; + + static constexpr const char* INFO_SOUND_NAME = "sounds/achievements/message.wav"; + static constexpr const char* UNLOCK_SOUND_NAME = "sounds/achievements/unlock.wav"; + static constexpr const char* LBSUBMIT_SOUND_NAME = "sounds/achievements/lbsubmit.wav"; + + static void FormattedError(const char* format, ...); + static void LogFailedResponseJSON(const Common::HTTPDownloader::Request::Data& data); + static void EnsureCacheDirectoriesExist(); + static void CheevosEventHandler(const rc_runtime_event_t* runtime_event); + static unsigned PeekMemory(unsigned address, unsigned num_bytes, void* ud); + static unsigned PeekMemoryBlock(unsigned address, unsigned char* buffer, unsigned num_bytes); + static void PokeMemory(unsigned address, unsigned num_bytes, void* ud, unsigned value); + static bool IsMastered(); + static void ActivateLockedAchievements(); + static bool ActivateAchievement(Achievement* achievement); + static void DeactivateAchievement(Achievement* achievement); + static void SendPing(); + static void SendPlaying(); + static void UpdateRichPresence(); + static Achievement* GetMutableAchievementByID(u32 id); + static void ClearGameInfo(bool clear_achievements = true, bool clear_leaderboards = true); + static void ClearGameHash(); + static std::string GetUserAgent(); + static void BeginLoadingScreen(const char* text, bool* was_running_idle); + static void EndLoadingScreen(bool was_running_idle); + static void LoginCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + static void LoginASyncCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + static void SendLogin(const char* username, const char* password, Common::HTTPDownloader* http_downloader, + Common::HTTPDownloader::Request::Callback callback); + static void DownloadImage(std::string url, std::string cache_filename); + static void DisplayAchievementSummary(); + static void DisplayMasteredNotification(); + static void UnlockAchievement(u32 achievement_id, bool add_notification = true); + static void AchievementPrimed(u32 achievement_id); + static void AchievementUnprimed(u32 achievement_id); + static void SubmitLeaderboard(u32 leaderboard_id, int value); + static void GetUserUnlocksCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + static void GetUserUnlocks(); + static void GetPatchesCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + static void GetLbInfoCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + static void GetPatches(u32 game_id); + static std::string_view GetELFNameForHash(const std::string& elf_path); + static std::optional> ReadELFFromCurrentDisc(const std::string& elf_path); + static std::string GetGameHash(); + static void SetChallengeMode(bool enabled); + static void SendGetGameId(); + static void GetGameIdCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + static void SendPlayingCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + static void UpdateRichPresence(); + static void SendPingCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + static void UnlockAchievementCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + static void SubmitLeaderboardCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data); + + static bool s_active = false; + static bool s_logged_in = false; + static bool s_challenge_mode = false; + static u32 s_game_id = 0; + +#ifdef ENABLE_RAINTEGRATION + static bool s_using_raintegration = false; +#endif + + static std::recursive_mutex s_achievements_mutex; + static rc_runtime_t s_rcheevos_runtime; + static std::string s_game_icon_cache_directory; + static std::string s_achievement_icon_cache_directory; + static std::unique_ptr s_http_downloader; + + static std::string s_username; + static std::string s_api_token; + + static u32 s_last_game_crc; + static std::string s_game_path; + static std::string s_game_hash; + static std::string s_game_title; + static std::string s_game_icon; + static std::vector s_achievements; + static std::vector s_leaderboards; + static std::atomic s_primed_achievement_count{0}; + + static bool s_has_rich_presence = false; + static std::string s_rich_presence_string; + static Common::Timer s_last_ping_time; + + static u32 s_last_queried_lboard = 0; + static u32 s_submitting_lboard_id = 0; + static std::optional> s_lboard_entries; + + template + static const char* RAPIStructName(); + +#define RAPI_STRUCT_NAME(x) \ + template <> \ + const char* RAPIStructName() \ + { \ + return #x; \ + } + + RAPI_STRUCT_NAME(rc_api_login_request_t); + RAPI_STRUCT_NAME(rc_api_fetch_image_request_t); + RAPI_STRUCT_NAME(rc_api_resolve_hash_request_t); + RAPI_STRUCT_NAME(rc_api_fetch_game_data_request_t); + RAPI_STRUCT_NAME(rc_api_fetch_user_unlocks_request_t); + RAPI_STRUCT_NAME(rc_api_start_session_request_t); + RAPI_STRUCT_NAME(rc_api_ping_request_t); + RAPI_STRUCT_NAME(rc_api_award_achievement_request_t); + RAPI_STRUCT_NAME(rc_api_submit_lboard_entry_request_t); + RAPI_STRUCT_NAME(rc_api_fetch_leaderboard_info_request_t); + + RAPI_STRUCT_NAME(rc_api_response_t); + RAPI_STRUCT_NAME(rc_api_login_response_t); + RAPI_STRUCT_NAME(rc_api_resolve_hash_response_t); + RAPI_STRUCT_NAME(rc_api_fetch_game_data_response_t); + RAPI_STRUCT_NAME(rc_api_ping_response_t); + RAPI_STRUCT_NAME(rc_api_award_achievement_response_t); + RAPI_STRUCT_NAME(rc_api_submit_lboard_entry_response_t); + RAPI_STRUCT_NAME(rc_api_start_session_response_t); + RAPI_STRUCT_NAME(rc_api_fetch_user_unlocks_response_t); + RAPI_STRUCT_NAME(rc_api_fetch_leaderboard_info_response_t); + + // Unused for now. + // RAPI_STRUCT_NAME(rc_api_fetch_achievement_info_response_t); + // RAPI_STRUCT_NAME(rc_api_fetch_games_list_response_t); + +#undef RAPI_STRUCT_NAME + + template + struct RAPIRequest : public T + { + private: + rc_api_request_t api_request; + + public: + RAPIRequest() { std::memset(this, 0, sizeof(*this)); } + + ~RAPIRequest() { rc_api_destroy_request(&api_request); } + + void Send(Common::HTTPDownloader::Request::Callback callback) { Send(s_http_downloader.get(), std::move(callback)); } + + void Send(Common::HTTPDownloader* http_downloader, Common::HTTPDownloader::Request::Callback callback) + { + const int error = InitFunc(&api_request, this); + if (error != RC_OK) + { + FormattedError("%s failed: error %d (%s)", RAPIStructName(), error, rc_error_str(error)); + callback(-1, std::string(), Common::HTTPDownloader::Request::Data()); + return; + } + + if (api_request.post_data) + { + // needs to be a post + http_downloader->CreatePostRequest(api_request.url, api_request.post_data, std::move(callback)); + } + else + { + // get is fine + http_downloader->CreateRequest(api_request.url, std::move(callback)); + } + } + + bool DownloadImage(std::string cache_filename) + { + const int error = InitFunc(&api_request, this); + if (error != RC_OK) + { + FormattedError("%s failed: error %d (%s)", RAPIStructName(), error, rc_error_str(error)); + return false; + } + + pxAssertMsg(!api_request.post_data, "Download request does not have POST data"); + Achievements::DownloadImage(api_request.url, std::move(cache_filename)); + return true; + } + + std::string GetURL() + { + const int error = InitFunc(&api_request, this); + if (error != RC_OK) + { + FormattedError("%s failed: error %d (%s)", RAPIStructName(), error, rc_error_str(error)); + return std::string(); + } + + return api_request.url; + } + }; + + template + struct RAPIResponse : public T + { + private: + bool initialized = false; + + public: + RAPIResponse(s32 status_code, Common::HTTPDownloader::Request::Data& data) + { + if (status_code != Common::HTTPDownloader::HTTP_OK || data.empty()) + { + FormattedError("%s failed: empty response and/or status code %d", RAPIStructName(), status_code); + LogFailedResponseJSON(data); + return; + } + + // ensure null termination, rapi needs it + data.push_back(0); + + const int error = ParseFunc(this, reinterpret_cast(data.data())); + initialized = (error == RC_OK); + + const rc_api_response_t& response = static_cast(this)->response; + if (error != RC_OK) + { + FormattedError("%s failed: parse function returned %d (%s)", RAPIStructName(), error, rc_error_str(error)); + LogFailedResponseJSON(data); + } + else if (!response.succeeded) + { + FormattedError("%s failed: %s", RAPIStructName(), response.error_message ? response.error_message : ""); + LogFailedResponseJSON(data); + } + } + + ~RAPIResponse() + { + if (initialized) + DestroyFunc(this); + } + + operator bool() const { return initialized && static_cast(this)->response.succeeded; } + }; + +} // namespace Achievements + +#ifdef ENABLE_RAINTEGRATION +bool Achievements::IsUsingRAIntegration() +{ + return s_using_raintegration; +} +#endif + +void Achievements::FormattedError(const char* format, ...) +{ + std::va_list ap; + va_start(ap, format); + std::string error(fmt::format("Achievements error: {}", StringUtil::StdStringFromFormatV(format, ap))); + va_end(ap); + + Console.Error(error); + Host::AddOSDMessage(std::move(error), 10.0f); +} + +void Achievements::LogFailedResponseJSON(const Common::HTTPDownloader::Request::Data& data) +{ + const std::string str_data(reinterpret_cast(data.data()), data.size()); + Console.Error("API call failed. Response JSON was:\n%s", str_data.c_str()); +} + +const Achievements::Achievement* Achievements::GetAchievementByID(u32 id) +{ + for (const Achievement& ach : s_achievements) + { + if (ach.id == id) + return &ach; + } + + return nullptr; +} + +Achievements::Achievement* Achievements::GetMutableAchievementByID(u32 id) +{ + for (Achievement& ach : s_achievements) + { + if (ach.id == id) + return &ach; + } + + return nullptr; +} + +void Achievements::ClearGameInfo(bool clear_achievements, bool clear_leaderboards) +{ + std::unique_lock lock(s_achievements_mutex); + const bool had_game = (s_game_id != 0); + + if (clear_achievements) + { + while (!s_achievements.empty()) + { + Achievement& ach = s_achievements.back(); + DeactivateAchievement(&ach); + s_achievements.pop_back(); + } + s_primed_achievement_count.store(0, std::memory_order_release); + } + if (clear_leaderboards) + { + while (!s_leaderboards.empty()) + { + Leaderboard& lb = s_leaderboards.back(); + rc_runtime_deactivate_lboard(&s_rcheevos_runtime, lb.id); + s_leaderboards.pop_back(); + } + + s_last_queried_lboard = 0; + s_lboard_entries.reset(); + } + + if (s_achievements.empty() && s_leaderboards.empty()) + { + // Ready to tear down cheevos completely + s_game_title = {}; + s_game_icon = {}; + s_rich_presence_string = {}; + s_has_rich_presence = false; + s_game_id = 0; + +#ifdef ENABLE_DISCORD_PRESENCE + if (EmuConfig.EnableDiscordPresence) + CommonHost::UpdateDiscordPresence(s_rich_presence_string); +#endif + } + + if (had_game) + Host::OnAchievementsRefreshed(); +} + +void Achievements::ClearGameHash() +{ + s_last_game_crc = 0; + std::string().swap(s_game_hash); +} + +std::string Achievements::GetUserAgent() +{ + std::string ret; + if (!PCSX2_isReleaseVersion && GIT_TAGGED_COMMIT) + ret = fmt::format("PCSX2 Nightly - {} ({})", GIT_TAG, GetOSVersionString()); + else if (!PCSX2_isReleaseVersion) + ret = fmt::format("PCSX2 {} ({})", GIT_REV, GetOSVersionString()); + else + ret = fmt::format("PCSX2 {}.{}.{}-{} ({})", PCSX2_VersionHi, PCSX2_VersionMid, PCSX2_VersionLo, SVN_REV, GetOSVersionString()); + + return ret; +} + +void Achievements::BeginLoadingScreen(const char* text, bool* was_running_idle) +{ + GetMTGS().RunOnGSThread(&ImGuiManager::InitializeFullscreenUI); + ImGuiFullscreen::OpenBackgroundProgressDialog("achievements_loading", text, 0, 0, 0); +} + +void Achievements::EndLoadingScreen(bool was_running_idle) +{ + ImGuiFullscreen::CloseBackgroundProgressDialog("achievements_loading"); +} + +bool Achievements::IsActive() +{ + return s_active; +} + +bool Achievements::IsLoggedIn() +{ + return s_logged_in; +} + +bool Achievements::ChallengeModeActive() +{ +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + return RA_HardcoreModeIsActive() != 0; +#endif + + return s_challenge_mode; +} + +bool Achievements::LeaderboardsActive() +{ + return ChallengeModeActive() && EmuConfig.Achievements.Leaderboards; +} + +bool Achievements::IsTestModeActive() +{ + return EmuConfig.Achievements.TestMode; +} + +bool Achievements::IsUnofficialTestModeActive() +{ + return EmuConfig.Achievements.UnofficialTestMode; +} + +bool Achievements::IsRichPresenceEnabled() +{ + return EmuConfig.Achievements.RichPresence; +} + +bool Achievements::HasActiveGame() +{ + return s_game_id != 0; +} + +u32 Achievements::GetGameID() +{ + return s_game_id; +} + +std::unique_lock Achievements::GetLock() +{ + return std::unique_lock(s_achievements_mutex); +} + +void Achievements::Initialize() +{ + if (IsUsingRAIntegration()) + return; + + std::unique_lock lock(s_achievements_mutex); + pxAssertRel(EmuConfig.Achievements.Enabled, "Achievements are enabled"); + + s_http_downloader = Common::HTTPDownloader::Create(GetUserAgent().c_str()); + if (!s_http_downloader) + { + Host::ReportErrorAsync("Achievements Error", "Failed to create HTTPDownloader, cannot use achievements"); + return; + } + + s_active = true; + s_challenge_mode = false; + rc_runtime_init(&s_rcheevos_runtime); + EnsureCacheDirectoriesExist(); + + s_last_ping_time.Reset(); + s_username = Host::GetBaseStringSettingValue("Achievements", "Username"); + s_api_token = Host::GetBaseStringSettingValue("Achievements", "Token"); + s_logged_in = (!s_username.empty() && !s_api_token.empty()); + + if (VMManager::HasValidVM()) + GameChanged(VMManager::GetGameCRC()); +} + +void Achievements::UpdateSettings(const Pcsx2Config::AchievementsOptions& old_config) +{ + if (IsUsingRAIntegration()) + return; + + if (!EmuConfig.Achievements.Enabled) + { + // we're done here + Shutdown(); + return; + } + + if (!s_active) + { + // we just got enabled + Initialize(); + return; + } + + if (EmuConfig.Achievements.ChallengeMode != old_config.ChallengeMode) + { + // Hardcore mode can only be enabled through system boot/reset. + if (s_challenge_mode && !EmuConfig.Achievements.ChallengeMode) + { + ResetChallengeMode(); + } + else if (!s_challenge_mode && EmuConfig.Achievements.ChallengeMode) + { + if (HasActiveGame()) + ImGuiFullscreen::ShowToast(std::string(), "Hardcore mode will be enabled on system reset.", 10.0f); + } + } + + // We *could* handle these separately, but easier to just flush everything. + if (EmuConfig.Achievements.TestMode != old_config.TestMode || + EmuConfig.Achievements.UnofficialTestMode != old_config.UnofficialTestMode || + EmuConfig.Achievements.RichPresence != old_config.RichPresence) + { + Shutdown(); + Initialize(); + return; + } + else if (EmuConfig.Achievements.Leaderboards != old_config.Leaderboards) + { + // If leaderboards were toggled, redisplay the summary (but only when HC mode is active, + // because otherwise leaderboards are irrelevant anyway). + if (HasActiveGame() && ChallengeModeActive()) + DisplayAchievementSummary(); + } + + // in case cache directory changed + EnsureCacheDirectoriesExist(); +} + +bool Achievements::ConfirmChallengeModeDisable(const char* trigger) +{ +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + return (RA_WarnDisableHardcore(trigger) != 0); +#endif + + const bool confirmed = + Host::ConfirmMessage("Confirm Hardcore Mode", fmt::format("{0} cannot be performed while hardcore mode is active. Do you want to " + "disable hardcore mode? {0} will be cancelled if you select No.", + trigger)); + if (!confirmed) + return false; + + DisableChallengeMode(); + return true; +} + +void Achievements::DisableChallengeMode() +{ + if (!s_active) + return; + +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + { + if (RA_HardcoreModeIsActive()) + RA_DisableHardcore(); + + return; + } +#endif + + if (s_challenge_mode) + SetChallengeMode(false); +} + +bool Achievements::ResetChallengeMode() +{ + if (!s_active) + return false; + + Host::RemoveKeyedOSDMessage("challenge_mode_reset"); + + if (s_challenge_mode == EmuConfig.Achievements.ChallengeMode) + return false; + + SetChallengeMode(EmuConfig.Achievements.ChallengeMode); + return true; +} + +void Achievements::SetChallengeMode(bool enabled) +{ + if (enabled == s_challenge_mode) + return; + + // new mode + s_challenge_mode = enabled; + + if (HasActiveGame()) + ImGuiFullscreen::ShowToast(std::string(), enabled ? "Hardcore mode is now enabled." : "Hardcore mode is now disabled.", 10.0f); + + if (HasActiveGame() && !IsTestModeActive()) + { + // deactivate, but don't clear all achievements (getting unlocks will reactivate them) + std::unique_lock lock(s_achievements_mutex); + for (Achievement& achievement : s_achievements) + { + DeactivateAchievement(&achievement); + achievement.locked = true; + } + for (Leaderboard& leaderboard : s_leaderboards) + rc_runtime_deactivate_lboard(&s_rcheevos_runtime, leaderboard.id); + } + + // re-grab unlocks, this will reactivate what's locked in non-hardcore mode later on + if (!s_achievements.empty()) + GetUserUnlocks(); +} + +bool Achievements::Shutdown() +{ +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + { + if (!RA_ConfirmLoadNewRom(true)) + return false; + + RA_SetPaused(false); + RA_ActivateGame(0); + return true; + } +#endif + + if (!s_active) + return true; + + std::unique_lock lock(s_achievements_mutex); + s_http_downloader->WaitForAllRequests(); + + ClearGameInfo(); + ClearGameHash(); + std::string().swap(s_username); + std::string().swap(s_api_token); + s_logged_in = false; + Host::OnAchievementsRefreshed(); + + s_challenge_mode = false; + s_active = false; + rc_runtime_destroy(&s_rcheevos_runtime); + + s_http_downloader.reset(); + return true; +} + +bool Achievements::OnReset() +{ +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + { + if (!RA_ConfirmLoadNewRom(false)) + return false; + + RA_OnReset(); + return true; + } +#endif + + if (!s_active) + return true; + + std::unique_lock lock(s_achievements_mutex); + + // Clear the game out, we'll re-query it once the ELF is loaded. + ClearGameInfo(true, true); + ClearGameHash(); + + // Reset runtime, there shouldn't be anything left in it though. + DevCon.WriteLn("Resetting rcheevos state..."); + rc_runtime_reset(&s_rcheevos_runtime); + return true; +} + +void Achievements::OnPaused(bool paused) +{ +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + RA_SetPaused(paused); +#endif +} + +void Achievements::VSyncUpdate() +{ +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + { + RA_DoAchievementsFrame(); + return; + } +#endif + + s_http_downloader->PollRequests(); + + if (HasActiveGame()) + { + std::unique_lock lock(s_achievements_mutex); + rc_runtime_do_frame(&s_rcheevos_runtime, &CheevosEventHandler, &PeekMemory, nullptr, nullptr); + UpdateRichPresence(); + + if (!IsTestModeActive()) + { + const s32 ping_frequency = EmuConfig.Achievements.RichPresence ? RICH_PRESENCE_PING_FREQUENCY : NO_RICH_PRESENCE_PING_FREQUENCY; + if (static_cast(s_last_ping_time.GetTimeSeconds()) >= ping_frequency) + SendPing(); + } + } +} + +void Achievements::ProcessPendingHTTPRequestsFromGSThread() +{ + // no need to do this if we're running, because VSyncUpdate() will take care of it + if (VMManager::GetState() == VMState::Running) + return; + + if (s_http_downloader->HasAnyRequests()) + Host::RunOnCPUThread([]() { s_http_downloader->PollRequests(); }); +} + +void Achievements::LoadState(const u8* state_data, u32 state_data_size) +{ + if (!s_active) + return; + + // this assumes that the CRC and ELF name has been loaded prior to the cheevos state (it should be). + if (ElfCRC != s_last_game_crc) + GameChanged(ElfCRC); + +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + { + if (state_data_size == 0) + { + Console.Warning("State is missing cheevos data, resetting RAIntegration"); + RA_OnReset(); + } + else + { + RA_RestoreState(reinterpret_cast(state_data)); + } + + return; + } +#endif + + // if we're active, make sure we've downloaded and activated all the achievements + // before deserializing, otherwise that state's going to get lost. + if (s_http_downloader->HasAnyRequests()) + { + bool was_running_idle; + BeginLoadingScreen("Downloading achievements data...", &was_running_idle); + s_http_downloader->WaitForAllRequests(); + EndLoadingScreen(was_running_idle); + } + + std::unique_lock lock(s_achievements_mutex); + if (state_data_size == 0) + { + // reset runtime, no data (state might've been created without cheevos) + Console.Warning("State is missing cheevos data, resetting runtime"); + rc_runtime_reset(&s_rcheevos_runtime); + return; + } + + // These routines scare me a bit.. the data isn't bounds checked. + // Really hope that nobody puts any thing malicious in a save state... + const int result = rc_runtime_deserialize_progress(&s_rcheevos_runtime, state_data, nullptr); + if (result != RC_OK) + { + Console.Warning("Failed to deserialize cheevos state (%d), resetting", result); + rc_runtime_reset(&s_rcheevos_runtime); + } +} + +std::vector Achievements::SaveState() +{ + std::vector ret; + +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + { + const int size = RA_CaptureState(nullptr, 0); + + const u32 data_size = (size >= 0) ? static_cast(size) : 0; + ret.resize(data_size); + + const int result = RA_CaptureState(reinterpret_cast(ret.data()), static_cast(data_size)); + if (result != static_cast(data_size)) + { + Console.Warning("Failed to serialize cheevos state from RAIntegration."); + ret.clear(); + } + + return ret; + } +#endif + + if (s_active) + { + std::unique_lock lock(s_achievements_mutex); + + // internally this happens twice.. not great. + const int size = rc_runtime_progress_size(&s_rcheevos_runtime, nullptr); + + const u32 data_size = (size >= 0) ? static_cast(size) : 0; + ret.resize(data_size); + + const int result = rc_runtime_serialize_progress(ret.data(), &s_rcheevos_runtime, nullptr); + if (result != RC_OK) + { + // set data to zero, effectively serializing nothing + Console.Warning("Failed to serialize cheevos state (%d)", result); + ret.clear(); + } + } + + return ret; +} + +bool Achievements::SafeHasAchievementsOrLeaderboards() +{ + std::unique_lock lock(s_achievements_mutex); + return !s_achievements.empty() || s_leaderboards.empty(); +} + +const std::string& Achievements::GetUsername() +{ + return s_username; +} + +const std::string& Achievements::GetRichPresenceString() +{ + return s_rich_presence_string; +} + +void Achievements::EnsureCacheDirectoriesExist() +{ + s_game_icon_cache_directory = Path::Combine(EmuFolders::Cache, "achievement_gameicon"); + s_achievement_icon_cache_directory = Path::Combine(EmuFolders::Cache, "achievement_badge"); + + if (!FileSystem::DirectoryExists(s_game_icon_cache_directory.c_str()) && + !FileSystem::CreateDirectoryPath(s_game_icon_cache_directory.c_str(), false)) + { + FormattedError("Failed to create cache directory '%s'", s_game_icon_cache_directory.c_str()); + } + + if (!FileSystem::DirectoryExists(s_achievement_icon_cache_directory.c_str()) && + !FileSystem::CreateDirectoryPath(s_achievement_icon_cache_directory.c_str(), false)) + { + FormattedError("Failed to create cache directory '%s'", s_achievement_icon_cache_directory.c_str()); + } +} + +void Achievements::LoginCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + std::unique_lock lock(s_achievements_mutex); + + // NOTE: The strings here can be null if the server returns literal "null" (see rc_json_get_string()), hence the double-check. + RAPIResponse response(status_code, data); + if (!response || !response.username || !response.api_token) + { + FormattedError("Login failed. Please check your user name and password, and try again."); + return; + } + + std::string username(response.username); + std::string api_token(response.api_token); + + // save to config + Host::SetBaseStringSettingValue("Achievements", "Username", username.c_str()); + Host::SetBaseStringSettingValue("Achievements", "Token", api_token.c_str()); + Host::SetBaseStringSettingValue("Achievements", "LoginTimestamp", fmt::format("{}", std::time(nullptr)).c_str()); + Host::CommitBaseSettingChanges(); + + if (s_active) + { + s_username = std::move(username); + s_api_token = std::move(api_token); + s_logged_in = true; + + // If we have a game running, set it up. + if (!s_game_hash.empty()) + SendGetGameId(); + } +} + +void Achievements::LoginASyncCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + ImGuiFullscreen::CloseBackgroundProgressDialog("cheevos_async_login"); + + LoginCallback(status_code, std::move(content_type), std::move(data)); +} + +void Achievements::SendLogin( + const char* username, const char* password, Common::HTTPDownloader* http_downloader, Common::HTTPDownloader::Request::Callback callback) +{ + RAPIRequest request; + request.username = username; + request.password = password; + request.api_token = nullptr; + request.Send(http_downloader, std::move(callback)); +} + +bool Achievements::LoginAsync(const char* username, const char* password) +{ + s_http_downloader->WaitForAllRequests(); + + if (s_logged_in || std::strlen(username) == 0 || std::strlen(password) == 0 || IsUsingRAIntegration()) + return false; + + if (FullscreenUI::IsInitialized()) + { + ImGuiFullscreen::OpenBackgroundProgressDialog("cheevos_async_login", "Logging in to RetroAchievements...", 0, 0, 0); + } + + SendLogin(username, password, s_http_downloader.get(), LoginASyncCallback); + return true; +} + +bool Achievements::Login(const char* username, const char* password) +{ + if (s_active) + s_http_downloader->WaitForAllRequests(); + + if (s_logged_in || std::strlen(username) == 0 || std::strlen(password) == 0 || IsUsingRAIntegration()) + return false; + + if (s_active) + { + SendLogin(username, password, s_http_downloader.get(), LoginCallback); + s_http_downloader->WaitForAllRequests(); + return IsLoggedIn(); + } + + // create a temporary downloader if we're not initialized + pxAssertRel(!s_active, "RetroAchievements is not active on login"); + std::unique_ptr http_downloader = Common::HTTPDownloader::Create(GetUserAgent().c_str()); + if (!http_downloader) + return false; + + SendLogin(username, password, http_downloader.get(), LoginCallback); + http_downloader->WaitForAllRequests(); + + return !Host::GetBaseStringSettingValue("Achievements", "Token").empty(); +} + +void Achievements::Logout() +{ + if (s_active) + { + std::unique_lock lock(s_achievements_mutex); + s_http_downloader->WaitForAllRequests(); + if (s_logged_in) + { + ClearGameInfo(); + std::string().swap(s_username); + std::string().swap(s_api_token); + s_logged_in = false; + Host::OnAchievementsRefreshed(); + } + } + + // remove from config + Host::RemoveBaseSettingValue("Achievements", "Username"); + Host::RemoveBaseSettingValue("Achievements", "Token"); + Host::RemoveBaseSettingValue("Achievements", "LoginTimestamp"); + Host::CommitBaseSettingChanges(); +} + +void Achievements::DownloadImage(std::string url, std::string cache_filename) +{ + auto callback = [cache_filename](s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) { + if (status_code != HTTP_OK) + return; + + if (!FileSystem::WriteBinaryFile(cache_filename.c_str(), data.data(), data.size())) + { + Console.Error("Failed to write badge image to '%s'", cache_filename.c_str()); + return; + } + + GetMTGS().RunOnGSThread([cache_filename]() { ImGuiFullscreen::InvalidateCachedTexture(cache_filename); }); + }; + + s_http_downloader->CreateRequest(std::move(url), std::move(callback)); +} + +void Achievements::DisplayAchievementSummary() +{ + std::string title = s_game_title; + if (ChallengeModeActive()) + title += " (Hardcore Mode)"; + + std::string summary; + if (GetAchievementCount() > 0) + { + summary = StringUtil::StdStringFromFormat("You have earned %u of %u achievements, and %u of %u points.", + GetUnlockedAchiementCount(), GetAchievementCount(), GetCurrentPointsForGame(), GetMaximumPointsForGame()); + } + else + { + summary = "This game has no achievements."; + } + if (GetLeaderboardCount() > 0) + { + summary.push_back('\n'); + if (LeaderboardsActive()) + summary.append("Leaderboard submission is enabled."); + } + + ImGuiFullscreen::AddNotification(10.0f, std::move(title), std::move(summary), s_game_icon); + + // Technically not going through the resource API, but since we're passing this to something else, we can't. + if (EmuConfig.Achievements.SoundEffects) + Common::PlaySoundAsync(Path::Combine(EmuFolders::Resources, INFO_SOUND_NAME).c_str()); +} + +void Achievements::DisplayMasteredNotification() +{ + if (!FullscreenUI::IsInitialized()) + return; + + std::string title(fmt::format("Mastered {}", s_game_title)); + std::string message(fmt::format( + "{} achievements, {} points{}", GetAchievementCount(), GetCurrentPointsForGame(), s_challenge_mode ? " (Hardcore Mode)" : "")); + + ImGuiFullscreen::AddNotification(20.0f, std::move(title), std::move(message), s_game_icon); +} + +void Achievements::GetUserUnlocksCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + RAPIResponse + response(status_code, data); + + std::unique_lock lock(s_achievements_mutex); + if (!response) + { + ClearGameInfo(true, false); + return; + } + + // flag achievements as unlocked + for (u32 i = 0; i < response.num_achievement_ids; i++) + { + Achievement* cheevo = GetMutableAchievementByID(response.achievement_ids[i]); + if (!cheevo) + { + Console.Error("Server returned unknown achievement %u", response.achievement_ids[i]); + continue; + } + + cheevo->locked = false; + } + + // start scanning for locked achievements + ActivateLockedAchievements(); + DisplayAchievementSummary(); + SendPlaying(); + UpdateRichPresence(); + SendPing(); + Host::OnAchievementsRefreshed(); +} + +void Achievements::GetUserUnlocks() +{ + RAPIRequest request; + request.username = s_username.c_str(); + request.api_token = s_api_token.c_str(); + request.game_id = s_game_id; + request.hardcore = static_cast(ChallengeModeActive()); + request.Send(GetUserUnlocksCallback); +} + +void Achievements::GetPatchesCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + if (!VMManager::HasValidVM()) + return; + + RAPIResponse + response(status_code, data); + + std::unique_lock lock(s_achievements_mutex); + ClearGameInfo(); + if (!response || !response.title) + return; + + // ensure fullscreen UI is ready + GetMTGS().RunOnGSThread(&ImGuiManager::InitializeFullscreenUI); + + s_game_id = response.id; + s_game_title = response.title; + + // try for a icon + if (response.image_name && std::strlen(response.image_name) > 0) + { + s_game_icon = Path::Combine(s_game_icon_cache_directory, fmt::format("{}.png", s_game_id)); + if (!FileSystem::FileExists(s_game_icon.c_str())) + { + RAPIRequest request; + request.image_name = response.image_name; + request.image_type = RC_IMAGE_TYPE_GAME; + request.DownloadImage(s_game_icon); + } + } + + // parse achievements + for (u32 i = 0; i < response.num_achievements; i++) + { + const rc_api_achievement_definition_t& defn = response.achievements[i]; + + // Skip local and unofficial achievements for now, unless "Test Unofficial Achievements" is enabled + if (defn.category == RC_ACHIEVEMENT_CATEGORY_UNOFFICIAL) + { + if (!IsUnofficialTestModeActive()) + { + Console.Warning("Skipping unofficial achievement %u (%s)", defn.id, defn.title); + continue; + } + } + // local achievements shouldn't be in this list, but just in case? + else if (defn.category != RC_ACHIEVEMENT_CATEGORY_CORE) + { + continue; + } + + if (GetMutableAchievementByID(defn.id)) + { + Console.Error("Achievement %u already exists", defn.id); + continue; + } + + if (!defn.definition || !defn.title || !defn.description || !defn.badge_name) + { + Console.Error("Incomplete achievement %u", defn.id); + continue; + } + + Achievement cheevo; + cheevo.id = defn.id; + cheevo.memaddr = defn.definition; + cheevo.title = defn.title; + cheevo.description = defn.description; + cheevo.badge_name = defn.badge_name; + cheevo.locked = true; + cheevo.active = false; + cheevo.primed = false; + cheevo.points = defn.points; + cheevo.category = static_cast(defn.category); + s_achievements.push_back(std::move(cheevo)); + } + + for (u32 i = 0; i < response.num_leaderboards; i++) + { + const rc_api_leaderboard_definition_t& defn = response.leaderboards[i]; + if (!defn.title || !defn.description || !defn.definition) + { + Console.Error("Incomplete leaderboard %u", defn.id); + continue; + } + + Leaderboard lboard; + lboard.id = defn.id; + lboard.title = defn.title; + lboard.description = defn.description; + lboard.format = defn.format; + s_leaderboards.push_back(std::move(lboard)); + + // Always track the leaderboard, if we don't have leaderboards enabled we just won't submit it. + // That way if someone activates them later on, current progress will count. + const int err = rc_runtime_activate_lboard(&s_rcheevos_runtime, defn.id, defn.definition, nullptr, 0); + if (err != RC_OK) + Console.Error("Leaderboard %u memaddr parse error: %s", defn.id, rc_error_str(err)); + else + DevCon.WriteLn("Activated leaderboard %s (%u)", defn.title, defn.id); + } + + // Parse rich presence. + if (response.rich_presence_script && std::strlen(response.rich_presence_script) > 0) + { + const int res = rc_runtime_activate_richpresence(&s_rcheevos_runtime, response.rich_presence_script, nullptr, 0); + if (res == RC_OK) + s_has_rich_presence = true; + else + Console.Warning("Failed to activate rich presence: %s", rc_error_str(res)); + } + + Console.WriteLn("Game Title: %s", s_game_title.c_str()); + Console.WriteLn("Achievements: %zu", s_achievements.size()); + Console.WriteLn("Leaderboards: %zu", s_leaderboards.size()); + + // We don't want to block saving/loading states when there's no achievements. + if (s_achievements.empty() && s_leaderboards.empty()) + DisableChallengeMode(); + + if (!s_achievements.empty() || s_has_rich_presence) + { + if (!IsTestModeActive()) + { + GetUserUnlocks(); + } + else + { + ActivateLockedAchievements(); + DisplayAchievementSummary(); + Host::OnAchievementsRefreshed(); + } + } + else + { + DisplayAchievementSummary(); + } + + if (s_achievements.empty() && s_leaderboards.empty() && !s_has_rich_presence) + { + ClearGameInfo(); + } +} + +void Achievements::GetLbInfoCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + if (!VMManager::HasValidVM()) + return; + + RAPIResponse + response(status_code, data); + if (!response) + return; + + std::unique_lock lock(s_achievements_mutex); + if (response.id != s_last_queried_lboard) + { + // User has already requested another leaderboard, drop this data + return; + } + + const Leaderboard* leaderboard = GetLeaderboardByID(response.id); + if (!leaderboard) + { + Console.Error("Attempting to list unknown leaderboard %u", response.id); + return; + } + + s_lboard_entries = std::vector(); + for (u32 i = 0; i < response.num_entries; i++) + { + const rc_api_lboard_info_entry_t& entry = response.entries[i]; + if (!entry.username) + continue; + + char score[128]; + rc_runtime_format_lboard_value(score, sizeof(score), entry.score, leaderboard->format); + + LeaderboardEntry lbe; + lbe.user = entry.username; + lbe.rank = entry.rank; + lbe.formatted_score = score; + lbe.submitted = entry.submitted; + lbe.is_self = lbe.user == s_username; + + s_lboard_entries->push_back(std::move(lbe)); + } +} + +void Achievements::GetPatches(u32 game_id) +{ + RAPIRequest request; + request.username = s_username.c_str(); + request.api_token = s_api_token.c_str(); + request.game_id = game_id; + request.Send(GetPatchesCallback); +} + +std::string_view Achievements::GetELFNameForHash(const std::string& elf_path) +{ + std::string::size_type start = elf_path.rfind('\\'); + if (start == std::string::npos) + start = 0; + else + start++; // skip backslash + + std::string::size_type end = elf_path.rfind(';'); + if (end == std::string::npos) + end = elf_path.size(); + + if (end < start) + end = start; + + return std::string_view(elf_path).substr(start, end - start); +} + +std::optional> Achievements::ReadELFFromCurrentDisc(const std::string& elf_path) +{ + // This CDVD stuff is super nasty and full of exceptions.. + std::optional> ret; + try + { + IsoFSCDVD isofs; + IsoFile file(isofs, elf_path); + const u32 size = file.getLength(); + + ret = std::vector(); + ret->resize(size); + + if (size > 0) + { + const s32 bytes_read = file.read(ret->data(), static_cast(size)); + if (bytes_read != static_cast(size)) + { + Console.Error("(Achievements) Only read %d of %u bytes of ELF '%s'", bytes_read, size, elf_path.c_str()); + ret.reset(); + } + } + } + catch (...) + { + Console.Error("(Achievements) Caught exception while trying to read ELF '%s'.", elf_path.c_str()); + ret.reset(); + } + + return ret; +} + +std::string Achievements::GetGameHash() +{ + const std::string& elf_path = LastELF; + if (elf_path.empty()) + return {}; + + // this.. really shouldn't be invalid + const std::string_view name_for_hash(GetELFNameForHash(elf_path)); + if (name_for_hash.empty()) + return {}; + + std::optional> elf_data(ReadELFFromCurrentDisc(elf_path)); + if (!elf_data.has_value()) + return {}; + + // See rcheevos hash.c - rc_hash_ps2(). + const u32 MAX_HASH_SIZE = 64 * 1024 * 1024; + const u32 hash_size = std::min(static_cast(elf_data->size()), MAX_HASH_SIZE); + pxAssert(hash_size <= elf_data->size()); + + MD5Digest digest; + if (!name_for_hash.empty()) + digest.Update(name_for_hash.data(), static_cast(name_for_hash.size())); + if (hash_size > 0) + digest.Update(elf_data->data(), hash_size); + + u8 hash[16]; + digest.Final(hash); + + std::string hash_str( + StringUtil::StdStringFromFormat("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", hash[0], hash[1], hash[2], + hash[3], hash[4], hash[5], hash[6], hash[7], hash[8], hash[9], hash[10], hash[11], hash[12], hash[13], hash[14], hash[15])); + + Console.WriteLn("Hash for '%.*s' (%zu bytes, %u bytes hashed): %s", static_cast(name_for_hash.size()), name_for_hash.data(), + elf_data->size(), hash_size, hash_str.c_str()); + return hash_str; +} + +void Achievements::GetGameIdCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + if (!VMManager::HasValidVM()) + return; + + RAPIResponse response( + status_code, data); + if (!response) + return; + + const u32 game_id = response.game_id; + Console.WriteLn("Server returned GameID %u", game_id); + if (game_id == 0) + { + // We don't want to block saving/loading states when there's no achievements. + DisableChallengeMode(); + return; + } + + GetPatches(game_id); +} + +void Achievements::GameChanged(u32 crc) +{ + std::unique_lock lock(s_achievements_mutex); + if (!s_active) + return; + + // avoid reading+hashing the executable if the crc hasn't changed + if (s_last_game_crc == crc) + return; + + std::string game_hash(GetGameHash()); + if (s_game_hash == game_hash) + return; + + if (!IsUsingRAIntegration() && s_http_downloader->HasAnyRequests()) + { + bool was_running_idle; + BeginLoadingScreen("Downloading achievements data...", &was_running_idle); + s_http_downloader->WaitForAllRequests(); + EndLoadingScreen(was_running_idle); + } + + ClearGameInfo(); + ClearGameHash(); + s_last_game_crc = crc; + s_game_hash = std::move(game_hash); + +#ifdef ENABLE_RAINTEGRATION + if (IsUsingRAIntegration()) + { + RAIntegration::GameChanged(); + return; + } +#endif + + if (s_game_hash.empty()) + { + // when we're booting the bios, or shutting down, this will fail + if (crc != 0) + { + Host::AddKeyedOSDMessage( + "retroachievements_disc_read_failed", "Failed to read executable from disc. Achievements disabled.", Host::OSD_CRITICAL_ERROR_DURATION); + } + + s_last_game_crc = 0; + return; + } + + if (IsLoggedIn()) + SendGetGameId(); +} + +void Achievements::SendGetGameId() +{ + RAPIRequest request; + request.username = s_username.c_str(); + request.api_token = s_api_token.c_str(); + request.game_hash = s_game_hash.c_str(); + request.Send(GetGameIdCallback); +} + +void Achievements::SendPlayingCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + if (!VMManager::HasValidVM()) + return; + + RAPIResponse response( + status_code, data); + if (!response) + return; + + Console.WriteLn("Playing game updated to %u (%s)", s_game_id, s_game_title.c_str()); +} + +void Achievements::SendPlaying() +{ + if (!HasActiveGame()) + return; + + RAPIRequest request; + request.username = s_username.c_str(); + request.api_token = s_api_token.c_str(); + request.game_id = s_game_id; + request.Send(SendPlayingCallback); +} + +void Achievements::UpdateRichPresence() +{ + if (!s_has_rich_presence) + return; + + char buffer[512]; + const int res = rc_runtime_get_richpresence(&s_rcheevos_runtime, buffer, sizeof(buffer), PeekMemory, nullptr, nullptr); + + std::unique_lock lock(s_achievements_mutex); + const bool had_rich_presence = !s_rich_presence_string.empty(); + if (res <= 0) + { + if (!had_rich_presence) + return; + + s_rich_presence_string.clear(); + } + else + { + if (s_rich_presence_string == buffer) + return; + + s_rich_presence_string.assign(buffer); + } + + Host::OnAchievementsRefreshed(); + +#ifdef ENABLE_DISCORD_PRESENCE + if (EmuConfig.EnableDiscordPresence) + CommonHost::UpdateDiscordPresence(s_rich_presence_string); +#endif +} + +void Achievements::SendPingCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + if (!VMManager::HasValidVM()) + return; + + RAPIResponse response(status_code, data); +} + +void Achievements::SendPing() +{ + if (!HasActiveGame()) + return; + + s_last_ping_time.Reset(); + + RAPIRequest request; + request.api_token = s_api_token.c_str(); + request.username = s_username.c_str(); + request.game_id = s_game_id; + request.rich_presence = s_rich_presence_string.c_str(); + request.Send(SendPingCallback); +} + +const std::string& Achievements::GetGameTitle() +{ + return s_game_title; +} + +const std::string& Achievements::GetGameIcon() +{ + return s_game_icon; +} + +bool Achievements::EnumerateAchievements(std::function callback) +{ + for (const Achievement& cheevo : s_achievements) + { + if (!callback(cheevo)) + return false; + } + + return true; +} + +u32 Achievements::GetUnlockedAchiementCount() +{ + u32 count = 0; + for (const Achievement& cheevo : s_achievements) + { + if (!cheevo.locked) + count++; + } + + return count; +} + +u32 Achievements::GetAchievementCount() +{ + return static_cast(s_achievements.size()); +} + +u32 Achievements::GetMaximumPointsForGame() +{ + u32 points = 0; + for (const Achievement& cheevo : s_achievements) + points += cheevo.points; + + return points; +} + +u32 Achievements::GetCurrentPointsForGame() +{ + u32 points = 0; + for (const Achievement& cheevo : s_achievements) + { + if (!cheevo.locked) + points += cheevo.points; + } + + return points; +} + +bool Achievements::EnumerateLeaderboards(std::function callback) +{ + for (const Leaderboard& lboard : s_leaderboards) + { + if (!callback(lboard)) + return false; + } + + return true; +} + +std::optional Achievements::TryEnumerateLeaderboardEntries(u32 id, std::function callback) +{ + if (id == s_last_queried_lboard) + { + if (s_lboard_entries) + { + for (const LeaderboardEntry& entry : *s_lboard_entries) + { + if (!callback(entry)) + return false; + } + return true; + } + } + else + { + s_last_queried_lboard = id; + s_lboard_entries.reset(); + + // TODO: Add paging? For now, stick to defaults + RAPIRequest request; + request.username = s_username.c_str(); + request.leaderboard_id = id; + request.first_entry = 0; + + // Just over what a single page can store, should be a reasonable amount for now + request.count = 15; + + request.Send(GetLbInfoCallback); + } + + return std::nullopt; +} + +const Achievements::Leaderboard* Achievements::GetLeaderboardByID(u32 id) +{ + for (const Leaderboard& lb : s_leaderboards) + { + if (lb.id == id) + return &lb; + } + + return nullptr; +} + +u32 Achievements::GetLeaderboardCount() +{ + return static_cast(s_leaderboards.size()); +} + +bool Achievements::IsLeaderboardTimeType(const Leaderboard& leaderboard) +{ + return leaderboard.format != RC_FORMAT_SCORE && leaderboard.format != RC_FORMAT_VALUE; +} + +bool Achievements::IsMastered() +{ + for (const Achievement& cheevo : s_achievements) + { + if (cheevo.locked) + return false; + } + + return true; +} + +void Achievements::ActivateLockedAchievements() +{ + for (Achievement& cheevo : s_achievements) + { + if (cheevo.locked) + ActivateAchievement(&cheevo); + } +} + +bool Achievements::ActivateAchievement(Achievement* achievement) +{ + if (achievement->active) + return true; + + const int err = rc_runtime_activate_achievement(&s_rcheevos_runtime, achievement->id, achievement->memaddr.c_str(), nullptr, 0); + if (err != RC_OK) + { + Console.Error("Achievement %u memaddr parse error: %s", achievement->id, rc_error_str(err)); + return false; + } + + achievement->active = true; + + DevCon.WriteLn("Activated achievement %s (%u)", achievement->title.c_str(), achievement->id); + return true; +} + +void Achievements::DeactivateAchievement(Achievement* achievement) +{ + if (!achievement->active) + return; + + rc_runtime_deactivate_achievement(&s_rcheevos_runtime, achievement->id); + achievement->active = false; + + if (achievement->primed) + { + achievement->primed = false; + s_primed_achievement_count.fetch_sub(std::memory_order_acq_rel); + } + + DevCon.WriteLn("Deactivated achievement %s (%u)", achievement->title.c_str(), achievement->id); +} + +void Achievements::UnlockAchievementCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + if (!VMManager::HasValidVM()) + return; + + RAPIResponse + response(status_code, data); + if (!response) + return; + + Console.WriteLn("Successfully unlocked achievement %u, new score %u", response.awarded_achievement_id, response.new_player_score); +} + +void Achievements::SubmitLeaderboardCallback(s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) +{ + if (!VMManager::HasValidVM()) + return; + + RAPIResponse + response(status_code, data); + if (!response) + return; + + // Force the next leaderboard query to repopulate everything, just in case the user wants to see their new score + s_last_queried_lboard = 0; + + // RA API doesn't send us the leaderboard ID back.. hopefully we don't submit two at once :/ + if (s_submitting_lboard_id == 0) + return; + + const Leaderboard* lb = GetLeaderboardByID(std::exchange(s_submitting_lboard_id, 0u)); + if (!lb) + return; + + char submitted_score[128]; + char best_score[128]; + rc_runtime_format_lboard_value(submitted_score, sizeof(submitted_score), response.submitted_score, lb->format); + rc_runtime_format_lboard_value(best_score, sizeof(best_score), response.best_score, lb->format); + + std::string summary = fmt::format( + "Your Score: {} (Best: {})\nLeaderboard Position: {} of {}", submitted_score, best_score, response.new_rank, response.num_entries); + + ImGuiFullscreen::AddNotification(10.0f, lb->title, std::move(summary), s_game_icon); +} + +void Achievements::UnlockAchievement(u32 achievement_id, bool add_notification /* = true*/) +{ + std::unique_lock lock(s_achievements_mutex); + Achievement* achievement = GetMutableAchievementByID(achievement_id); + if (!achievement) + { + Console.Error("Attempting to unlock unknown achievement %u", achievement_id); + return; + } + else if (!achievement->locked) + { + Console.Warning("Achievement %u for game %u is already unlocked", achievement_id, s_game_id); + return; + } + + achievement->locked = false; + DeactivateAchievement(achievement); + + Console.WriteLn("Achievement %s (%u) for game %u unlocked", achievement->title.c_str(), achievement_id, s_game_id); + + std::string title; + switch (achievement->category) + { + case AchievementCategory::Local: + title = fmt::format("{} (Local)", achievement->title); + break; + case AchievementCategory::Unofficial: + title = fmt::format("{} (Unofficial)", achievement->title); + break; + case AchievementCategory::Core: + default: + title = achievement->title; + break; + } + + ImGuiFullscreen::AddNotification(15.0f, std::move(title), achievement->description, GetAchievementBadgePath(*achievement)); + if (EmuConfig.Achievements.SoundEffects) + Common::PlaySoundAsync(Path::Combine(EmuFolders::Resources, UNLOCK_SOUND_NAME).c_str()); + + if (IsMastered()) + DisplayMasteredNotification(); + + if (IsTestModeActive()) + { + Console.Warning("Skipping sending achievement %u unlock to server because of test mode.", achievement_id); + return; + } + + if (achievement->category != AchievementCategory::Core) + { + Console.Warning("Skipping sending achievement %u unlock to server because it's not from the core set.", achievement_id); + return; + } + + RAPIRequest request; + request.username = s_username.c_str(); + request.api_token = s_api_token.c_str(); + request.game_hash = s_game_hash.c_str(); + request.achievement_id = achievement_id; + request.hardcore = static_cast(ChallengeModeActive()); + request.Send(UnlockAchievementCallback); +} + +void Achievements::AchievementPrimed(u32 achievement_id) +{ + std::unique_lock lock(s_achievements_mutex); + Achievement* achievement = GetMutableAchievementByID(achievement_id); + if (!achievement || achievement->primed) + return; + + achievement->primed = true; + s_primed_achievement_count.fetch_add(std::memory_order_acq_rel); +} + +void Achievements::AchievementUnprimed(u32 achievement_id) +{ + std::unique_lock lock(s_achievements_mutex); + Achievement* achievement = GetMutableAchievementByID(achievement_id); + if (!achievement || !achievement->primed) + return; + + achievement->primed = false; + s_primed_achievement_count.fetch_sub(std::memory_order_acq_rel); +} + +void Achievements::SubmitLeaderboard(u32 leaderboard_id, int value) +{ + if (IsTestModeActive()) + { + Console.Warning("Skipping sending leaderboard %u result to server because of test mode.", leaderboard_id); + return; + } + + if (!ChallengeModeActive()) + { + Console.Warning("Skipping sending leaderboard %u result to server because Challenge mode is off.", leaderboard_id); + return; + } + + if (!LeaderboardsActive()) + { + Console.Warning("Skipping sending leaderboard %u result to server because leaderboards are disabled.", leaderboard_id); + return; + } + + std::unique_lock lock(s_achievements_mutex); + s_submitting_lboard_id = leaderboard_id; + + RAPIRequest request; + request.username = s_username.c_str(); + request.api_token = s_api_token.c_str(); + request.game_hash = s_game_hash.c_str(); + request.leaderboard_id = leaderboard_id; + request.score = value; + request.Send(SubmitLeaderboardCallback); + + // Technically not going through the resource API, but since we're passing this to something else, we can't. + if (EmuConfig.Achievements.SoundEffects) + Common::PlaySoundAsync(Path::Combine(EmuFolders::Resources, LBSUBMIT_SOUND_NAME).c_str()); +} + +std::pair Achievements::GetAchievementProgress(const Achievement& achievement) +{ + std::pair result; + rc_runtime_get_achievement_measured(&s_rcheevos_runtime, achievement.id, &result.first, &result.second); + return result; +} + +std::string Achievements::GetAchievementProgressText(const Achievement& achievement) +{ + char buf[256]; + rc_runtime_format_achievement_measured(&s_rcheevos_runtime, achievement.id, buf, std::size(buf)); + return buf; +} + +const std::string& Achievements::GetAchievementBadgePath(const Achievement& achievement, bool download_if_missing, bool force_unlocked_icon) +{ + const bool use_locked = (achievement.locked && !force_unlocked_icon); + std::string& badge_path = use_locked ? achievement.locked_badge_path : achievement.unlocked_badge_path; + if (!badge_path.empty() || achievement.badge_name.empty()) + return badge_path; + + // well, this comes from the internet.... :) + std::string clean_name(Path::SanitizeFileName(achievement.badge_name)); + badge_path = Path::Combine(s_achievement_icon_cache_directory, fmt::format("{}{}.png", clean_name, use_locked ? "_lock" : "")); + if (FileSystem::FileExists(badge_path.c_str())) + return badge_path; + + // need to download it + if (download_if_missing) + { + RAPIRequest request; + request.image_name = achievement.badge_name.c_str(); + request.image_type = use_locked ? RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED : RC_IMAGE_TYPE_ACHIEVEMENT; + request.DownloadImage(badge_path); + } + + return badge_path; +} + +std::string Achievements::GetAchievementBadgeURL(const Achievement& achievement) +{ + RAPIRequest request; + request.image_name = achievement.badge_name.c_str(); + request.image_type = achievement.locked ? RC_IMAGE_TYPE_ACHIEVEMENT_LOCKED : RC_IMAGE_TYPE_ACHIEVEMENT; + return request.GetURL(); +} + +u32 Achievements::GetPrimedAchievementCount() +{ + // Relaxed is fine here, worst that happens is we draw the triggers one frame late. + return s_primed_achievement_count.load(std::memory_order_relaxed); +} + +void Achievements::CheevosEventHandler(const rc_runtime_event_t* runtime_event) +{ + static const char* events[] = {"RC_RUNTIME_EVENT_ACHIEVEMENT_ACTIVATED", "RC_RUNTIME_EVENT_ACHIEVEMENT_PAUSED", + "RC_RUNTIME_EVENT_ACHIEVEMENT_RESET", "RC_RUNTIME_EVENT_ACHIEVEMENT_TRIGGERED", "RC_RUNTIME_EVENT_ACHIEVEMENT_PRIMED", + "RC_RUNTIME_EVENT_LBOARD_STARTED", "RC_RUNTIME_EVENT_LBOARD_CANCELED", "RC_RUNTIME_EVENT_LBOARD_UPDATED", + "RC_RUNTIME_EVENT_LBOARD_TRIGGERED", "RC_RUNTIME_EVENT_ACHIEVEMENT_DISABLED", "RC_RUNTIME_EVENT_LBOARD_DISABLED"}; + const char* event_text = ((unsigned)runtime_event->type >= std::size(events)) ? "unknown" : events[(unsigned)runtime_event->type]; + DevCon.WriteLn("Cheevos Event %s for %u", event_text, runtime_event->id); + + switch (runtime_event->type) + { + case RC_RUNTIME_EVENT_ACHIEVEMENT_TRIGGERED: + UnlockAchievement(runtime_event->id); + break; + + case RC_RUNTIME_EVENT_ACHIEVEMENT_PRIMED: + AchievementPrimed(runtime_event->id); + break; + + case RC_RUNTIME_EVENT_ACHIEVEMENT_UNPRIMED: + AchievementUnprimed(runtime_event->id); + break; + + case RC_RUNTIME_EVENT_LBOARD_TRIGGERED: + SubmitLeaderboard(runtime_event->id, runtime_event->value); + break; + + default: + break; + } +} + +unsigned Achievements::PeekMemory(unsigned address, unsigned num_bytes, void* ud) +{ + if ((static_cast(address) + num_bytes) >= EXPOSED_EE_MEMORY_SIZE) + { + DevCon.Warning("[Achievements] Ignoring out of bounds memory peek of %u bytes at %08X.", num_bytes, address); + return 0u; + } + + switch (num_bytes) + { + case 1: + { + u8 value; + std::memcpy(&value, reinterpret_cast(eeMem) + address, sizeof(value)); + return static_cast(value); + } + + case 2: + { + u16 value; + std::memcpy(&value, reinterpret_cast(eeMem) + address, sizeof(value)); + return static_cast(value); + } + + case 4: + { + u32 value; + std::memcpy(&value, reinterpret_cast(eeMem) + address, sizeof(value)); + return static_cast(value); + } + + default: + return 0u; + } +} + +unsigned Achievements::PeekMemoryBlock(unsigned address, unsigned char* buffer, unsigned num_bytes) +{ + if ((address >= EXPOSED_EE_MEMORY_SIZE)) + { + DevCon.Warning("[Achievements] Ignoring out of bounds block memory read for %u bytes at %08X.", num_bytes, address); + return 0u; + } + + const unsigned read_byte_count = std::min(EXPOSED_EE_MEMORY_SIZE - address, num_bytes); + std::memcpy(buffer, reinterpret_cast(eeMem) + address, read_byte_count); + return read_byte_count; +} + +void Achievements::PokeMemory(unsigned address, unsigned num_bytes, void* ud, unsigned value) +{ + if ((static_cast(address) + num_bytes) >= EXPOSED_EE_MEMORY_SIZE) + { + DevCon.Warning("[Achievements] Ignoring out of bounds memory poke of %u bytes at %08X (value %08X).", num_bytes, address, value); + return; + } + + switch (num_bytes) + { + case 1: + { + const u8 value8 = static_cast(value); + std::memcpy(reinterpret_cast(eeMem) + address, &value8, sizeof(value8)); + } + break; + + case 2: + { + const u16 value16 = static_cast(value); + std::memcpy(reinterpret_cast(eeMem) + address, &value16, sizeof(value16)); + } + break; + + case 4: + { + const u32 value32 = static_cast(value); + std::memcpy(reinterpret_cast(eeMem) + address, &value32, sizeof(value32)); + } + break; + + default: + break; + } +} + +#ifdef ENABLE_RAINTEGRATION + +#include "RA_Consoles.h" + +namespace Achievements::RAIntegration +{ + static void InitializeRAIntegration(void* main_window_handle); + + static int RACallbackIsActive(); + static void RACallbackCauseUnpause(); + static void RACallbackCausePause(); + static void RACallbackRebuildMenu(); + static void RACallbackEstimateTitle(char* buf); + static void RACallbackResetEmulator(); + static void RACallbackLoadROM(const char* unused); + static unsigned char RACallbackReadMemory(unsigned int address); + static unsigned int RACallbackReadBlock(unsigned int address, unsigned char* buffer, unsigned int bytes); + static void RACallbackWriteMemory(unsigned int address, unsigned char value); + + static bool s_raintegration_initialized = false; +} // namespace Achievements::RAIntegration + +void Achievements::SwitchToRAIntegration() +{ + s_using_raintegration = true; + s_active = true; + + // Not strictly the case, but just in case we gate anything by IsLoggedIn(). + s_logged_in = true; +} + +void Achievements::RAIntegration::InitializeRAIntegration(void* main_window_handle) +{ + RA_InitClient((HWND)main_window_handle, "PCSX2", GIT_TAG); + RA_SetUserAgentDetail(Achievements::GetUserAgent().c_str()); + + RA_InstallSharedFunctions(RACallbackIsActive, RACallbackCauseUnpause, RACallbackCausePause, RACallbackRebuildMenu, + RACallbackEstimateTitle, RACallbackResetEmulator, RACallbackLoadROM); + RA_SetConsoleID(PlayStation2); + + // EE physical memory and scratchpad are currently exposed (matching direct rcheevos implementation). + RA_InstallMemoryBank(0, RACallbackReadMemory, RACallbackWriteMemory, EXPOSED_EE_MEMORY_SIZE); + RA_InstallMemoryBankBlockReader(0, RACallbackReadBlock); + + // Fire off a login anyway. Saves going into the menu and doing it. + RA_AttemptLogin(0); + + s_raintegration_initialized = true; + + // this is pretty lame, but we may as well persist until we exit anyway + std::atexit(RA_Shutdown); +} + +void Achievements::RAIntegration::MainWindowChanged(void* new_handle) +{ + if (s_raintegration_initialized) + { + RA_UpdateHWnd((HWND)new_handle); + return; + } + + InitializeRAIntegration(new_handle); +} + +void Achievements::RAIntegration::GameChanged() +{ + s_game_id = s_game_hash.empty() ? 0 : RA_IdentifyHash(s_game_hash.c_str()); + RA_ActivateGame(s_game_id); +} + +std::vector> Achievements::RAIntegration::GetMenuItems() +{ + std::array items; + const int num_items = RA_GetPopupMenuItems(items.data()); + + std::vector> ret; + ret.reserve(static_cast(num_items)); + + for (int i = 0; i < num_items; i++) + { + const RA_MenuItem& it = items[i]; + if (!it.sLabel) + { + // separator + ret.emplace_back(0, std::string(), false); + } + else + { + // option, maybe checkable + ret.emplace_back(static_cast(it.nID), StringUtil::WideStringToUTF8String(it.sLabel), it.bChecked); + } + } + + return ret; +} + +void Achievements::RAIntegration::ActivateMenuItem(int item) +{ + RA_InvokeDialog(item); +} + +int Achievements::RAIntegration::RACallbackIsActive() +{ + return static_cast(HasActiveGame()); +} + +void Achievements::RAIntegration::RACallbackCauseUnpause() +{ + if (VMManager::HasValidVM()) + VMManager::SetState(VMState::Running); +} + +void Achievements::RAIntegration::RACallbackCausePause() +{ + if (VMManager::HasValidVM()) + VMManager::SetState(VMState::Paused); +} + +void Achievements::RAIntegration::RACallbackRebuildMenu() +{ + // unused, we build the menu on demand +} + +void Achievements::RAIntegration::RACallbackEstimateTitle(char* buf) +{ + std::string title(fmt::format("{0} ({1}) [{2:08X}]", VMManager::GetGameName(), VMManager::GetGameSerial(), VMManager::GetGameCRC())); + StringUtil::Strlcpy(buf, title, 256); +} + +void Achievements::RAIntegration::RACallbackResetEmulator() +{ + if (VMManager::HasValidVM()) + VMManager::Reset(); +} + +void Achievements::RAIntegration::RACallbackLoadROM(const char* unused) +{ + // unused + UNREFERENCED_PARAMETER(unused); +} + +unsigned char Achievements::RAIntegration::RACallbackReadMemory(unsigned int address) +{ + return static_cast(PeekMemory(address, sizeof(unsigned char), nullptr)); +} + +unsigned int Achievements::RAIntegration::RACallbackReadBlock(unsigned int address, unsigned char* buffer, unsigned int bytes) +{ + return PeekMemoryBlock(address, buffer, bytes); +} + +void Achievements::RAIntegration::RACallbackWriteMemory(unsigned int address, unsigned char value) +{ + PokeMemory(address, sizeof(value), nullptr, static_cast(value)); +} + +#endif diff --git a/pcsx2/Frontend/Achievements.h b/pcsx2/Frontend/Achievements.h new file mode 100644 index 0000000000..4969bdf266 --- /dev/null +++ b/pcsx2/Frontend/Achievements.h @@ -0,0 +1,173 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "common/Pcsx2Defs.h" +#include "pcsx2/Achievements.h" +#include "Config.h" +#include +#include +#include +#include +#include +#include +#include + +namespace Achievements +{ + enum class AchievementCategory : u8 + { + Local = 0, + Core = 3, + Unofficial = 5 + }; + + struct Achievement + { + u32 id; + std::string title; + std::string description; + std::string memaddr; + std::string badge_name; + + // badge paths are mutable because they're resolved when they're needed. + mutable std::string locked_badge_path; + mutable std::string unlocked_badge_path; + + u32 points; + AchievementCategory category; + bool locked; + bool active; + bool primed; + }; + + struct Leaderboard + { + u32 id; + std::string title; + std::string description; + int format; + }; + + struct LeaderboardEntry + { + std::string user; + std::string formatted_score; + time_t submitted; + u32 rank; + bool is_self; + }; + + // RAIntegration only exists for Windows, so no point checking it on other platforms. +#ifdef ENABLE_RAINTEGRATION + + bool IsUsingRAIntegration(); + +#else + + static __fi bool IsUsingRAIntegration() { return false; } + +#endif + + bool IsActive(); + bool IsLoggedIn(); + bool ChallengeModeActive(); + bool LeaderboardsActive(); + bool IsTestModeActive(); + bool IsUnofficialTestModeActive(); + bool IsRichPresenceEnabled(); + bool HasActiveGame(); + + u32 GetGameID(); + + /// Acquires the achievements lock. Must be held when accessing any achievement state from another thread. + std::unique_lock GetLock(); + + void Initialize(); + void UpdateSettings(const Pcsx2Config::AchievementsOptions& old_config); + + /// Called when the system is being reset. If it returns false, the reset should be aborted. + bool OnReset(); + + /// Called when the system is being shut down. If Shutdown() returns false, the shutdown should be aborted. + bool Shutdown(); + + /// Called when the system is being paused and resumed. + void OnPaused(bool paused); + + /// Called once a frame at vsync time on the CPU thread. + void VSyncUpdate(); + + /// Called to process pending HTTP requests when the VM is paused, because otherwise the vsync event won't fire. + void ProcessPendingHTTPRequestsFromGSThread(); + + void LoadState(const u8* state_data, u32 state_data_size); + std::vector SaveState(); + + /// Returns true if the current game has any achievements or leaderboards. + /// Does not need to have the lock held. + bool SafeHasAchievementsOrLeaderboards(); + + const std::string& GetUsername(); + const std::string& GetRichPresenceString(); + + bool LoginAsync(const char* username, const char* password); + bool Login(const char* username, const char* password); + void Logout(); + + void GameChanged(u32 crc); + + const std::string& GetGameTitle(); + const std::string& GetGameIcon(); + + bool EnumerateAchievements(std::function callback); + u32 GetUnlockedAchiementCount(); + u32 GetAchievementCount(); + u32 GetMaximumPointsForGame(); + u32 GetCurrentPointsForGame(); + + bool EnumerateLeaderboards(std::function callback); + std::optional TryEnumerateLeaderboardEntries(u32 id, std::function callback); + const Leaderboard* GetLeaderboardByID(u32 id); + u32 GetLeaderboardCount(); + bool IsLeaderboardTimeType(const Leaderboard& leaderboard); + + const Achievement* GetAchievementByID(u32 id); + std::pair GetAchievementProgress(const Achievement& achievement); + std::string GetAchievementProgressText(const Achievement& achievement); + const std::string& GetAchievementBadgePath( + const Achievement& achievement, bool download_if_missing = true, bool force_unlocked_icon = false); + std::string GetAchievementBadgeURL(const Achievement& achievement); + u32 GetPrimedAchievementCount(); + +#ifdef ENABLE_RAINTEGRATION + void SwitchToRAIntegration(); + + namespace RAIntegration + { + void MainWindowChanged(void* new_handle); + void GameChanged(); + std::vector> GetMenuItems(); + void ActivateMenuItem(int item); + } // namespace RAIntegration +#endif +} // namespace Achievements + +/// Functions implemented in the frontend. +namespace Host +{ + void OnAchievementsRefreshed(); + void OnAchievementsChallengeModeChanged(); +} // namespace Host diff --git a/pcsx2/Frontend/CommonHost.cpp b/pcsx2/Frontend/CommonHost.cpp new file mode 100644 index 0000000000..7b76a473bb --- /dev/null +++ b/pcsx2/Frontend/CommonHost.cpp @@ -0,0 +1,547 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" +#include "common/Assertions.h" +#include "common/CrashHandler.h" +#include "common/FileSystem.h" +#include "common/Path.h" +#include "common/Timer.h" +#include "common/Threading.h" +#include "Frontend/CommonHost.h" +#include "Frontend/FullscreenUI.h" +#include "Frontend/GameList.h" +#include "Frontend/LayeredSettingsInterface.h" +#include "Frontend/InputManager.h" +#include "Frontend/LogSink.h" +#include "GS.h" +#include "GS/Renderers/HW/GSTextureReplacements.h" +#include "Host.h" +#include "HostDisplay.h" +#include "HostSettings.h" +#include "IconsFontAwesome5.h" +#include "MemoryCardFile.h" +#include "PAD/Host/PAD.h" +#include "PerformanceMetrics.h" +#include "Sio.h" +#include "VMManager.h" + +#ifdef ENABLE_ACHIEVEMENTS +#include "Frontend/Achievements.h" +#endif + +#ifdef ENABLE_DISCORD_PRESENCE +#include "discord_rpc.h" +#endif + +#ifdef _WIN32 +#include "common/RedtapeWindows.h" +#include +#include +#endif + +static constexpr u32 SETTINGS_VERSION = 1; + +namespace CommonHost +{ + static void SetAppRoot(); + static void SetResourcesDirectory(); + static bool ShouldUsePortableMode(); + static void SetDataDirectory(); + static void SetCommonDefaultSettings(SettingsInterface& si); + + static void UpdateInhibitScreensaver(bool allow); + + static void UpdateSessionTime(const std::string& new_serial); + +#ifdef ENABLE_DISCORD_PRESENCE + static void InitializeDiscordPresence(); + static void ShutdownDiscordPresence(); + static void PollDiscordPresence(); + static std::string GetRichPresenceString(); +#endif +} // namespace CommonHost + +// Used to track play time. We use a monotonic timer here, in case of clock changes. +static u64 s_session_start_time = 0; +static std::string s_session_serial; + +static bool s_screensaver_inhibited = false; + +#ifdef ENABLE_DISCORD_PRESENCE +static bool s_discord_presence_active = false; +#endif + +bool CommonHost::InitializeCriticalFolders() +{ + SetAppRoot(); + SetResourcesDirectory(); + SetDataDirectory(); + + // logging of directories in case something goes wrong super early + Console.WriteLn("AppRoot Directory: %s", EmuFolders::AppRoot.c_str()); + Console.WriteLn("DataRoot Directory: %s", EmuFolders::DataRoot.c_str()); + Console.WriteLn("Resources Directory: %s", EmuFolders::Resources.c_str()); + + // allow SetDataDirectory() to change settings directory (if we want to split config later on) + if (EmuFolders::Settings.empty()) + { + EmuFolders::Settings = Path::Combine(EmuFolders::DataRoot, "inis"); + + // Create settings directory if it doesn't exist. If we're not using portable mode, it won't. + if (!FileSystem::DirectoryExists(EmuFolders::Settings.c_str())) + FileSystem::CreateDirectoryPath(EmuFolders::Settings.c_str(), false); + } + + // Write crash dumps to the data directory, since that'll be accessible for certain. + CrashHandler::SetWriteDirectory(EmuFolders::DataRoot); + + // the resources directory should exist, bail out if not + if (!FileSystem::DirectoryExists(EmuFolders::Resources.c_str())) + { + Console.Error("Resources directory is missing."); + return false; + } + + return true; +} + +void CommonHost::SetAppRoot() +{ + std::string program_path(FileSystem::GetProgramPath()); + Console.WriteLn("Program Path: %s", program_path.c_str()); + + EmuFolders::AppRoot = Path::Canonicalize(Path::GetDirectory(program_path)); +} + +void CommonHost::SetResourcesDirectory() +{ +#ifndef __APPLE__ + // On Windows/Linux, these are in the binary directory. + EmuFolders::Resources = Path::Combine(EmuFolders::AppRoot, "resources"); +#else + // On macOS, this is in the bundle resources directory. + EmuFolders::Resources = Path::Canonicalize(Path::Combine(EmuFolders::AppRoot, "../Resources")); +#endif +} + +bool CommonHost::ShouldUsePortableMode() +{ + // Check whether portable.ini exists in the program directory. + return FileSystem::FileExists(Path::Combine(EmuFolders::AppRoot, "portable.ini").c_str()); +} + +void CommonHost::SetDataDirectory() +{ + if (ShouldUsePortableMode()) + { + EmuFolders::DataRoot = EmuFolders::AppRoot; + return; + } + +#if defined(_WIN32) + // On Windows, use My Documents\PCSX2 to match old installs. + PWSTR documents_directory; + if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &documents_directory))) + { + if (std::wcslen(documents_directory) > 0) + EmuFolders::DataRoot = Path::Combine(StringUtil::WideStringToUTF8String(documents_directory), "PCSX2"); + CoTaskMemFree(documents_directory); + } +#elif defined(__linux__) + // Use $XDG_CONFIG_HOME/PCSX2 if it exists. + const char* xdg_config_home = getenv("XDG_CONFIG_HOME"); + if (xdg_config_home && Path::IsAbsolute(xdg_config_home)) + { + EmuFolders::DataRoot = Path::Combine(xdg_config_home, "PCSX2"); + } + else + { + // Use ~/PCSX2 for non-XDG, and ~/.config/PCSX2 for XDG. + // Maybe we should drop the former when Qt goes live. + const char* home_dir = getenv("HOME"); + if (home_dir) + { +#ifndef XDG_STD + EmuFolders::DataRoot = Path::Combine(home_dir, "PCSX2"); +#else + // ~/.config should exist, but just in case it doesn't and this is a fresh profile.. + const std::string config_dir(Path::Combine(home_dir, ".config")); + if (!FileSystem::DirectoryExists(config_dir.c_str())) + FileSystem::CreateDirectoryPath(config_dir.c_str(), false); + + EmuFolders::DataRoot = Path::Combine(config_dir, "PCSX2"); +#endif + } + } +#elif defined(__APPLE__) + static constexpr char MAC_DATA_DIR[] = "Library/Application Support/PCSX2"; + const char* home_dir = getenv("HOME"); + if (home_dir) + EmuFolders::DataRoot = Path::Combine(home_dir, MAC_DATA_DIR); +#endif + + // make sure it exists + if (!EmuFolders::DataRoot.empty() && !FileSystem::DirectoryExists(EmuFolders::DataRoot.c_str())) + { + // we're in trouble if we fail to create this directory... but try to hobble on with portable + if (!FileSystem::CreateDirectoryPath(EmuFolders::DataRoot.c_str(), false)) + EmuFolders::DataRoot.clear(); + } + + // couldn't determine the data directory? fallback to portable. + if (EmuFolders::DataRoot.empty()) + EmuFolders::DataRoot = EmuFolders::AppRoot; +} + +bool CommonHost::CheckSettingsVersion() +{ + SettingsInterface* bsi = Host::Internal::GetBaseSettingsLayer(); + + uint settings_version; + return (bsi->GetUIntValue("UI", "SettingsVersion", &settings_version) && settings_version == SETTINGS_VERSION); +} + +void CommonHost::LoadStartupSettings() +{ + SettingsInterface* bsi = Host::Internal::GetBaseSettingsLayer(); + EmuFolders::LoadConfig(*bsi); + EmuFolders::EnsureFoldersExist(); + UpdateLogging(*bsi); + +#ifdef ENABLE_RAINTEGRATION + // RAIntegration switch must happen before the UI is created. + if (Host::GetBaseBoolSettingValue("Achievements", "UseRAIntegration", false)) + Achievements::SwitchToRAIntegration(); +#endif +} + +void CommonHost::SetDefaultSettings(SettingsInterface& si, bool folders, bool core, bool controllers, bool hotkeys, bool ui) +{ + if (si.GetUIntValue("UI", "SettingsVersion", 0u) != SETTINGS_VERSION) + si.SetUIntValue("UI", "SettingsVersion", SETTINGS_VERSION); + + if (folders) + EmuFolders::SetDefaults(si); + if (core) + { + VMManager::SetDefaultSettings(si); + SetCommonDefaultSettings(si); + } + if (controllers) + PAD::SetDefaultControllerConfig(si); + if (hotkeys) + PAD::SetDefaultHotkeyConfig(si); + if (ui) + Host::SetDefaultUISettings(si); +} + +void CommonHost::SetCommonDefaultSettings(SettingsInterface& si) +{ + SetDefaultLoggingSettings(si); +} + +void CommonHost::CPUThreadInitialize() +{ + Threading::SetNameOfCurrentThread("CPU Thread"); + PerformanceMetrics::SetCPUThread(Threading::ThreadHandle::GetForCallingThread()); + + // neither of these should ever fail. + if (!VMManager::Internal::InitializeGlobals() || !VMManager::Internal::InitializeMemory()) + pxFailRel("Failed to allocate memory map"); + + // We want settings loaded so we choose the correct renderer for big picture mode. + // This also sorts out input sources. + VMManager::LoadSettings(); + +#ifdef ENABLE_ACHIEVEMENTS + if (EmuConfig.Achievements.Enabled) + Achievements::Initialize(); +#endif + +#ifdef ENABLE_DISCORD_PRESENCE + if (EmuConfig.EnableDiscordPresence) + InitializeDiscordPresence(); +#endif +} + +void CommonHost::CPUThreadShutdown() +{ +#ifdef ENABLE_DISCORD_PRESENCE + ShutdownDiscordPresence(); +#endif + +#ifdef ENABLE_ACHIEVEMENTS + Achievements::Shutdown(); +#endif + + InputManager::CloseSources(); + VMManager::WaitForSaveStateFlush(); + VMManager::Internal::ReleaseMemory(); + VMManager::Internal::ReleaseGlobals(); + PerformanceMetrics::SetCPUThread(Threading::ThreadHandle()); +} + +void CommonHost::LoadSettings(SettingsInterface& si, std::unique_lock& lock) +{ + SettingsInterface* binding_si = Host::GetSettingsInterfaceForBindings(); + InputManager::ReloadSources(si, lock); + InputManager::ReloadBindings(si, *binding_si); + + UpdateLogging(si); +} + +void CommonHost::CheckForSettingsChanges(const Pcsx2Config& old_config) +{ +#ifdef ENABLE_ACHIEVEMENTS + if (EmuConfig.Achievements != old_config.Achievements) + Achievements::UpdateSettings(old_config.Achievements); +#endif + + FullscreenUI::CheckForConfigChanges(old_config); + + if (EmuConfig.InhibitScreensaver != old_config.InhibitScreensaver) + UpdateInhibitScreensaver(EmuConfig.InhibitScreensaver && VMManager::GetState() == VMState::Running); + +#ifdef ENABLE_DISCORD_PRESENCE + if (EmuConfig.EnableDiscordPresence != old_config.EnableDiscordPresence) + { + if (EmuConfig.EnableDiscordPresence) + InitializeDiscordPresence(); + else + ShutdownDiscordPresence(); + } +#endif +} + +void CommonHost::OnVMStarting() +{ + CommonHost::Internal::ResetVMHotkeyState(); +} + +void CommonHost::OnVMStarted() +{ + FullscreenUI::OnVMStarted(); + UpdateInhibitScreensaver(EmuConfig.InhibitScreensaver); +} + +void CommonHost::OnVMDestroyed() +{ + FullscreenUI::OnVMDestroyed(); + UpdateInhibitScreensaver(false); +} + +void CommonHost::OnVMPaused() +{ + InputManager::PauseVibration(); + FullscreenUI::OnVMPaused(); + +#ifdef ENABLE_ACHIEVEMENTS + Achievements::OnPaused(true); +#endif + + UpdateInhibitScreensaver(false); +} + +void CommonHost::OnVMResumed() +{ + FullscreenUI::OnVMResumed(); + +#ifdef ENABLE_ACHIEVEMENTS + Achievements::OnPaused(false); +#endif + + UpdateInhibitScreensaver(EmuConfig.InhibitScreensaver); +} + +void CommonHost::OnGameChanged(const std::string& disc_path, const std::string& game_serial, const std::string& game_name, u32 game_crc) +{ + UpdateSessionTime(game_serial); + + if (FullscreenUI::IsInitialized()) + { + GetMTGS().RunOnGSThread([disc_path, game_serial, game_name, game_crc]() { + FullscreenUI::OnRunningGameChanged(std::move(disc_path), std::move(game_serial), std::move(game_name), game_crc); + }); + } + +#ifdef ENABLE_ACHIEVEMENTS + Achievements::GameChanged(game_crc); +#endif + +#ifdef ENABLE_DISCORD_PRESENCE + UpdateDiscordPresence(GetRichPresenceString()); +#endif +} + +void CommonHost::CPUThreadVSync() +{ +#ifdef ENABLE_ACHIEVEMENTS + if (Achievements::IsActive()) + Achievements::VSyncUpdate(); +#endif + +#ifdef ENABLE_DISCORD_PRESENCE + PollDiscordPresence(); +#endif + + InputManager::PollSources(); +} + +bool Host::GetSerialAndCRCForFilename(const char* filename, std::string* serial, u32* crc) +{ + { + auto lock = GameList::GetLock(); + if (const GameList::Entry* entry = GameList::GetEntryForPath(filename); entry) + { + *serial = entry->serial; + *crc = entry->crc; + return true; + } + } + + // Just scan it.. hopefully it'll come back okay. + GameList::Entry temp_entry; + if (GameList::PopulateEntryFromPath(filename, &temp_entry)) + { + *serial = std::move(temp_entry.serial); + *crc = temp_entry.crc; + return true; + } + + return false; +} + +void CommonHost::UpdateInhibitScreensaver(bool inhibit) +{ + if (s_screensaver_inhibited == inhibit) + return; + + WindowInfo wi; + auto top_level_wi = Host::GetTopLevelWindowInfo(); + if (top_level_wi.has_value()) + wi = top_level_wi.value(); + + s_screensaver_inhibited = inhibit; + if (!WindowInfo::InhibitScreensaver(wi, inhibit) && inhibit) + Console.Warning("Failed to inhibit screen saver."); +} + +void CommonHost::UpdateSessionTime(const std::string& new_serial) +{ + if (s_session_serial == new_serial) + return; + + const u64 ctime = Common::Timer::GetCurrentValue(); + if (!s_session_serial.empty()) + { + // round up to seconds + const std::time_t etime = static_cast(std::round(Common::Timer::ConvertValueToSeconds(ctime - s_session_start_time))); + const std::time_t wtime = std::time(nullptr); + GameList::AddPlayedTimeForSerial(s_session_serial, wtime, etime); + } + + s_session_serial = new_serial; + s_session_start_time = ctime; +} + +u64 CommonHost::GetSessionPlayedTime() +{ + const u64 ctime = Common::Timer::GetCurrentValue(); + return static_cast(std::round(Common::Timer::ConvertValueToSeconds(ctime - s_session_start_time))); +} + +#ifdef ENABLE_DISCORD_PRESENCE + +void CommonHost::InitializeDiscordPresence() +{ + if (s_discord_presence_active) + return; + + DiscordEventHandlers handlers = {}; + Discord_Initialize("1025789002055430154", &handlers, 0, nullptr); + s_discord_presence_active = true; + + UpdateDiscordPresence(GetRichPresenceString()); +} + +void CommonHost::ShutdownDiscordPresence() +{ + if (!s_discord_presence_active) + return; + + Discord_ClearPresence(); + Discord_RunCallbacks(); + Discord_Shutdown(); + s_discord_presence_active = false; +} + +void CommonHost::UpdateDiscordPresence(const std::string& rich_presence) +{ + if (!s_discord_presence_active) + return; + + // https://discord.com/developers/docs/rich-presence/how-to#updating-presence-update-presence-payload-fields + DiscordRichPresence rp = {}; + rp.largeImageKey = "4k-pcsx2"; + rp.largeImageText = "PCSX2 Emulator"; + rp.startTimestamp = std::time(nullptr); + + std::string details_string; + if (VMManager::HasValidVM()) + details_string = VMManager::GetGameName(); + else + details_string = "No Game Running"; + rp.details = details_string.c_str(); + + // Trim to 128 bytes as per Discord-RPC requirements + std::string state_string; + if (rich_presence.length() >= 128) + { + // 124 characters + 3 dots + null terminator + state_string = fmt::format("{}...", std::string_view(rich_presence).substr(0, 124)); + } + else + { + state_string = rich_presence; + } + rp.state = state_string.c_str(); + + Discord_UpdatePresence(&rp); + Discord_RunCallbacks(); +} + +void CommonHost::PollDiscordPresence() +{ + if (!s_discord_presence_active) + return; + + Discord_RunCallbacks(); +} + +std::string CommonHost::GetRichPresenceString() +{ + std::string rich_presence_string; +#ifdef ENABLE_ACHIEVEMENTS + if (Achievements::IsActive() && EmuConfig.Achievements.RichPresence) + { + auto lock = Achievements::GetLock(); + rich_presence_string = Achievements::GetRichPresenceString(); + } +#endif + return rich_presence_string; +} + +#endif \ No newline at end of file diff --git a/pcsx2/Frontend/CommonHost.h b/pcsx2/Frontend/CommonHost.h new file mode 100644 index 0000000000..ef467b9383 --- /dev/null +++ b/pcsx2/Frontend/CommonHost.h @@ -0,0 +1,92 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +#include "common/Pcsx2Defs.h" +#include +#include + +#include "Config.h" + +class SettingsInterface; + +namespace Host +{ + /// Sets host-specific default settings. + void SetDefaultUISettings(SettingsInterface& si); +} // namespace Host + +namespace CommonHost +{ + /// Initializes critical folders (AppRoot, DataRoot, Settings). Call once on startup. + bool InitializeCriticalFolders(); + + /// Checks settings version. Call once on startup. If it returns false, you should prompt the user to reset. + bool CheckSettingsVersion(); + + /// Loads early settings. Call once on startup. + void LoadStartupSettings(); + + /// Sets default settings for the specified categories. + void SetDefaultSettings(SettingsInterface& si, bool folders, bool core, bool controllers, bool hotkeys, bool ui); + + /// Initializes common host state, called on the CPU thread. + void CPUThreadInitialize(); + + /// Cleans up common host state, called on the CPU thread. + void CPUThreadShutdown(); + + /// Loads common host settings (including input bindings). + void LoadSettings(SettingsInterface& si, std::unique_lock& lock); + + /// Called after settings are updated. + void CheckForSettingsChanges(const Pcsx2Config& old_config); + + /// Called when the VM is starting initialization, but has not been completed yet. + void OnVMStarting(); + + /// Called when the VM is created. + void OnVMStarted(); + + /// Called when the VM is shut down or destroyed. + void OnVMDestroyed(); + + /// Called when the VM is paused. + void OnVMPaused(); + + /// Called when the VM is resumed after being paused. + void OnVMResumed(); + + /// Called when the running executable changes. + void OnGameChanged(const std::string& disc_path, const std::string& game_serial, const std::string& game_name, u32 game_crc); + + /// Provided by the host; called once per frame at guest vsync. + void CPUThreadVSync(); + + /// Returns the time elapsed in the current play session. + u64 GetSessionPlayedTime(); + +#ifdef ENABLE_DISCORD_PRESENCE + /// Called when the rich presence string, provided by RetroAchievements, changes. + void UpdateDiscordPresence(const std::string& rich_presence); +#endif + + namespace Internal + { + /// Resets any state for hotkey-related VMs, called on VM startup. + void ResetVMHotkeyState(); + } // namespace Internal +} // namespace CommonHost diff --git a/pcsx2/Frontend/CommonHotkeys.cpp b/pcsx2/Frontend/CommonHotkeys.cpp new file mode 100644 index 0000000000..ce387af13a --- /dev/null +++ b/pcsx2/Frontend/CommonHotkeys.cpp @@ -0,0 +1,257 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" +#include "common/Assertions.h" +#include "common/FileSystem.h" +#include "common/Path.h" +#include "Frontend/CommonHost.h" +#include "Frontend/FullscreenUI.h" +#include "Frontend/InputManager.h" +#include "GS.h" +#include "Host.h" +#include "HostDisplay.h" +#include "IconsFontAwesome5.h" +#include "Recording/InputRecording.h" +#include "VMManager.h" + +#ifdef ENABLE_ACHIEVEMENTS +#include "Frontend/Achievements.h" +#endif + +static s32 s_current_save_slot = 1; +static std::optional s_limiter_mode_prior_to_hold_interaction; + +void CommonHost::Internal::ResetVMHotkeyState() +{ + s_current_save_slot = 1; + s_limiter_mode_prior_to_hold_interaction.reset(); +} + +static void HotkeyAdjustTargetSpeed(double delta) +{ + const double min_speed = Achievements::ChallengeModeActive() ? 1.0 : 0.1; + EmuConfig.Framerate.NominalScalar = std::max(min_speed, EmuConfig.GS.LimitScalar + delta); + VMManager::SetLimiterMode(LimiterModeType::Nominal); + gsUpdateFrequency(EmuConfig); + GetMTGS().UpdateVSyncMode(); + Host::AddIconOSDMessage("SpeedChanged", ICON_FA_CLOCK, + fmt::format("Target speed set to {:.0f}%.", std::round(EmuConfig.Framerate.NominalScalar * 100.0)), Host::OSD_QUICK_DURATION); +} + +static constexpr s32 CYCLE_SAVE_STATE_SLOTS = 10; + +static void HotkeyCycleSaveSlot(s32 delta) +{ + // 1..10 + s_current_save_slot = ((s_current_save_slot - 1) + delta); + if (s_current_save_slot < 0) + s_current_save_slot = CYCLE_SAVE_STATE_SLOTS; + else + s_current_save_slot = (s_current_save_slot % CYCLE_SAVE_STATE_SLOTS) + 1; + + const u32 crc = VMManager::GetGameCRC(); + const std::string serial(VMManager::GetGameSerial()); + const std::string filename(VMManager::GetSaveStateFileName(serial.c_str(), crc, s_current_save_slot)); + FILESYSTEM_STAT_DATA sd; + if (!filename.empty() && FileSystem::StatFile(filename.c_str(), &sd)) + { + char date_buf[128] = {}; +#ifdef _WIN32 + ctime_s(date_buf, std::size(date_buf), &sd.ModificationTime); +#else + ctime_r(&sd.ModificationTime, date_buf); +#endif + + // remove terminating \n + size_t len = std::strlen(date_buf); + if (len > 0 && date_buf[len - 1] == '\n') + date_buf[len - 1] = 0; + + Host::AddIconOSDMessage("CycleSaveSlot", ICON_FA_SEARCH, + fmt::format("Save slot {} selected (last save: {}).", s_current_save_slot, date_buf), Host::OSD_QUICK_DURATION); + } + else + { + Host::AddIconOSDMessage("CycleSaveSlot", ICON_FA_SEARCH, fmt::format("Save slot {} selected (no save yet).", s_current_save_slot), + Host::OSD_QUICK_DURATION); + } +} + +static void HotkeyLoadStateSlot(s32 slot) +{ + const u32 crc = VMManager::GetGameCRC(); + if (crc == 0) + { + Host::AddIconOSDMessage("LoadStateFromSlot", ICON_FA_EXCLAMATION_TRIANGLE, "Cannot load state from a slot without a game running.", + Host::OSD_INFO_DURATION); + return; + } + + const std::string serial(VMManager::GetGameSerial()); + if (!VMManager::HasSaveStateInSlot(serial.c_str(), crc, slot)) + { + Host::AddIconOSDMessage("LoadStateFromSlot", ICON_FA_EXCLAMATION_TRIANGLE, fmt::format("No save state found in slot {}.", slot), + Host::OSD_INFO_DURATION); + return; + } + + VMManager::LoadStateFromSlot(slot); +} + +static void HotkeySaveStateSlot(s32 slot) +{ + if (VMManager::GetGameCRC() == 0) + { + Host::AddIconOSDMessage("SaveStateToSlot", ICON_FA_EXCLAMATION_TRIANGLE, "Cannot save state to a slot without a game running.", + Host::OSD_INFO_DURATION); + return; + } + + VMManager::SaveStateToSlot(slot); +} + +BEGIN_HOTKEY_LIST(g_common_hotkeys) +DEFINE_HOTKEY("OpenPauseMenu", "System", "Open Pause Menu", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + FullscreenUI::OpenPauseMenu(); +}) +#ifdef ENABLE_ACHIEVEMENTS +DEFINE_HOTKEY("OpenAchievementsList", "System", "Open Achievements List", [](s32 pressed) { + if (!pressed) + FullscreenUI::OpenAchievementsWindow(); +}) +DEFINE_HOTKEY("OpenLeaderboardsList", "System", "Open Leaderboards List", [](s32 pressed) { + if (!pressed) + FullscreenUI::OpenLeaderboardsWindow(); +}) +#endif +DEFINE_HOTKEY("TogglePause", "System", "Toggle Pause", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + VMManager::SetPaused(VMManager::GetState() != VMState::Paused); +}) +DEFINE_HOTKEY("ToggleFullscreen", "System", "Toggle Fullscreen", [](s32 pressed) { + if (!pressed) + Host::SetFullscreen(!Host::IsFullscreen()); +}) +DEFINE_HOTKEY("ToggleFrameLimit", "System", "Toggle Frame Limit", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + { + VMManager::SetLimiterMode( + (EmuConfig.LimiterMode != LimiterModeType::Unlimited) ? LimiterModeType::Unlimited : LimiterModeType::Nominal); + } +}) +DEFINE_HOTKEY("ToggleTurbo", "System", "Toggle Turbo / Fast Forward", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + { + VMManager::SetLimiterMode((EmuConfig.LimiterMode != LimiterModeType::Turbo) ? LimiterModeType::Turbo : LimiterModeType::Nominal); + } +}) +DEFINE_HOTKEY("ToggleSlowMotion", "System", "Toggle Slow Motion", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + { + VMManager::SetLimiterMode((EmuConfig.LimiterMode != LimiterModeType::Slomo) ? LimiterModeType::Slomo : LimiterModeType::Nominal); + } +}) +DEFINE_HOTKEY("HoldTurbo", "System", "Turbo / Fast Forward (Hold)", [](s32 pressed) { + if (!VMManager::HasValidVM()) + return; + if (pressed > 0 && !s_limiter_mode_prior_to_hold_interaction.has_value()) + { + s_limiter_mode_prior_to_hold_interaction = VMManager::GetLimiterMode(); + VMManager::SetLimiterMode((s_limiter_mode_prior_to_hold_interaction.value() != LimiterModeType::Turbo) ? LimiterModeType::Turbo : + LimiterModeType::Nominal); + } + else if (pressed >= 0 && s_limiter_mode_prior_to_hold_interaction.has_value()) + { + VMManager::SetLimiterMode(s_limiter_mode_prior_to_hold_interaction.value()); + s_limiter_mode_prior_to_hold_interaction.reset(); + } +}) +DEFINE_HOTKEY("IncreaseSpeed", "System", "Increase Target Speed", [](s32 pressed) { + if (!pressed) + HotkeyAdjustTargetSpeed(0.1); +}) +DEFINE_HOTKEY("DecreaseSpeed", "System", "Decrease Target Speed", [](s32 pressed) { + if (!pressed) + HotkeyAdjustTargetSpeed(-0.1); +}) +DEFINE_HOTKEY("FrameAdvance", "System", "Frame Advance", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + VMManager::FrameAdvance(1); +}) +DEFINE_HOTKEY("ShutdownVM", "System", "Shut Down Virtual Machine", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + Host::RequestVMShutdown(true, true, EmuConfig.SaveStateOnShutdown); +}) +DEFINE_HOTKEY("ResetVM", "System", "Reset Virtual Machine", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + VMManager::Reset(); +}) +DEFINE_HOTKEY("InputRecToggleMode", "System", "Toggle Input Recording Mode", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + g_InputRecording.getControls().toggleRecordMode(); +}) + +DEFINE_HOTKEY("PreviousSaveStateSlot", "Save States", "Select Previous Save Slot", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + HotkeyCycleSaveSlot(-1); +}) +DEFINE_HOTKEY("NextSaveStateSlot", "Save States", "Select Next Save Slot", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + HotkeyCycleSaveSlot(1); +}) +DEFINE_HOTKEY("SaveStateToSlot", "Save States", "Save State To Selected Slot", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + VMManager::SaveStateToSlot(s_current_save_slot); +}) +DEFINE_HOTKEY("LoadStateFromSlot", "Save States", "Load State From Selected Slot", [](s32 pressed) { + if (!pressed && VMManager::HasValidVM()) + HotkeyLoadStateSlot(s_current_save_slot); +}) + +#define DEFINE_HOTKEY_SAVESTATE_X(slotnum) \ + DEFINE_HOTKEY("SaveStateToSlot" #slotnum, "Save States", "Save State To Slot " #slotnum, [](s32 pressed) { \ + if (!pressed) \ + HotkeySaveStateSlot(slotnum); \ + }) +#define DEFINE_HOTKEY_LOADSTATE_X(slotnum) \ + DEFINE_HOTKEY("LoadStateFromSlot" #slotnum, "Save States", "Load State From Slot " #slotnum, [](s32 pressed) { \ + if (!pressed) \ + HotkeyLoadStateSlot(slotnum); \ + }) +DEFINE_HOTKEY_SAVESTATE_X(1) +DEFINE_HOTKEY_LOADSTATE_X(1) +DEFINE_HOTKEY_SAVESTATE_X(2) +DEFINE_HOTKEY_LOADSTATE_X(2) +DEFINE_HOTKEY_SAVESTATE_X(3) +DEFINE_HOTKEY_LOADSTATE_X(3) +DEFINE_HOTKEY_SAVESTATE_X(4) +DEFINE_HOTKEY_LOADSTATE_X(4) +DEFINE_HOTKEY_SAVESTATE_X(5) +DEFINE_HOTKEY_LOADSTATE_X(5) +DEFINE_HOTKEY_SAVESTATE_X(6) +DEFINE_HOTKEY_LOADSTATE_X(6) +DEFINE_HOTKEY_SAVESTATE_X(7) +DEFINE_HOTKEY_LOADSTATE_X(7) +DEFINE_HOTKEY_SAVESTATE_X(8) +DEFINE_HOTKEY_LOADSTATE_X(8) +DEFINE_HOTKEY_SAVESTATE_X(9) +DEFINE_HOTKEY_LOADSTATE_X(9) +DEFINE_HOTKEY_SAVESTATE_X(10) +DEFINE_HOTKEY_LOADSTATE_X(10) +#undef DEFINE_HOTKEY_SAVESTATE_X +#undef DEFINE_HOTKEY_LOADSTATE_X +END_HOTKEY_LIST() \ No newline at end of file diff --git a/pcsx2/Frontend/D3D11HostDisplay.cpp b/pcsx2/Frontend/D3D11HostDisplay.cpp index 45d097c189..865fae31f7 100644 --- a/pcsx2/Frontend/D3D11HostDisplay.cpp +++ b/pcsx2/Frontend/D3D11HostDisplay.cpp @@ -35,8 +35,8 @@ class D3D11HostDisplayTexture : public HostDisplayTexture { public: - D3D11HostDisplayTexture(Microsoft::WRL::ComPtr texture, - Microsoft::WRL::ComPtr srv, u32 width, u32 height, bool dynamic) + D3D11HostDisplayTexture(wil::com_ptr_nothrow texture, + wil::com_ptr_nothrow srv, u32 width, u32 height, bool dynamic) : m_texture(std::move(texture)) , m_srv(std::move(srv)) , m_width(width) @@ -46,28 +46,28 @@ public: } ~D3D11HostDisplayTexture() override = default; - void* GetHandle() const override { return m_srv.Get(); } + void* GetHandle() const override { return m_srv.get(); } u32 GetWidth() const override { return m_width; } u32 GetHeight() const override { return m_height; } - __fi ID3D11Texture2D* GetD3DTexture() const { return m_texture.Get(); } - __fi ID3D11ShaderResourceView* GetD3DSRV() const { return m_srv.Get(); } - __fi ID3D11ShaderResourceView* const* GetD3DSRVArray() const { return m_srv.GetAddressOf(); } + __fi ID3D11Texture2D* GetD3DTexture() const { return m_texture.get(); } + __fi ID3D11ShaderResourceView* GetD3DSRV() const { return m_srv.get(); } + __fi ID3D11ShaderResourceView* const* GetD3DSRVArray() const { return m_srv.addressof(); } __fi bool IsDynamic() const { return m_dynamic; } private: - Microsoft::WRL::ComPtr m_texture; - Microsoft::WRL::ComPtr m_srv; + wil::com_ptr_nothrow m_texture; + wil::com_ptr_nothrow m_srv; u32 m_width; u32 m_height; bool m_dynamic; }; -static Microsoft::WRL::ComPtr CreateVertexShader(ID3D11Device* device, const void* bytecode, +static wil::com_ptr_nothrow CreateVertexShader(ID3D11Device* device, const void* bytecode, size_t bytecode_length) { - Microsoft::WRL::ComPtr shader; - const HRESULT hr = device->CreateVertexShader(bytecode, bytecode_length, nullptr, shader.GetAddressOf()); + wil::com_ptr_nothrow shader; + const HRESULT hr = device->CreateVertexShader(bytecode, bytecode_length, nullptr, shader.put()); if (FAILED(hr)) { Console.Error("Failed to create vertex shader: 0x%08X", hr); @@ -77,11 +77,11 @@ static Microsoft::WRL::ComPtr CreateVertexShader(ID3D11Devic return shader; } -static Microsoft::WRL::ComPtr CreatePixelShader(ID3D11Device* device, const void* bytecode, +static wil::com_ptr_nothrow CreatePixelShader(ID3D11Device* device, const void* bytecode, size_t bytecode_length) { - Microsoft::WRL::ComPtr shader; - const HRESULT hr = device->CreatePixelShader(bytecode, bytecode_length, nullptr, shader.GetAddressOf()); + wil::com_ptr_nothrow shader; + const HRESULT hr = device->CreatePixelShader(bytecode, bytecode_length, nullptr, shader.put()); if (FAILED(hr)) { Console.Error("Failed to create pixel shader: 0x%08X", hr); @@ -95,37 +95,37 @@ D3D11HostDisplay::D3D11HostDisplay() = default; D3D11HostDisplay::~D3D11HostDisplay() { - D3D11HostDisplay::DestroyRenderSurface(); - m_context.Reset(); - m_device.Reset(); + D3D11HostDisplay::DestroySurface(); + m_context.reset(); + m_device.reset(); } -HostDisplay::RenderAPI D3D11HostDisplay::GetRenderAPI() const +RenderAPI D3D11HostDisplay::GetRenderAPI() const { - return HostDisplay::RenderAPI::D3D11; + return RenderAPI::D3D11; } -void* D3D11HostDisplay::GetRenderDevice() const +void* D3D11HostDisplay::GetDevice() const { - return m_device.Get(); + return m_device.get(); } -void* D3D11HostDisplay::GetRenderContext() const +void* D3D11HostDisplay::GetContext() const { - return m_context.Get(); + return m_context.get(); } -void* D3D11HostDisplay::GetRenderSurface() const +void* D3D11HostDisplay::GetSurface() const { - return m_swap_chain.Get(); + return m_swap_chain.get(); } -bool D3D11HostDisplay::HasRenderDevice() const +bool D3D11HostDisplay::HasDevice() const { return static_cast(m_device); } -bool D3D11HostDisplay::HasRenderSurface() const +bool D3D11HostDisplay::HasSurface() const { return static_cast(m_swap_chain); } @@ -137,14 +137,14 @@ std::unique_ptr D3D11HostDisplay::CreateTexture(u32 width, u dynamic ? D3D11_CPU_ACCESS_WRITE : 0, 1, 0, 0); const D3D11_SUBRESOURCE_DATA srd{data, data_stride, data_stride * height}; ComPtr texture; - HRESULT hr = m_device->CreateTexture2D(&desc, data ? &srd : nullptr, texture.GetAddressOf()); + HRESULT hr = m_device->CreateTexture2D(&desc, data ? &srd : nullptr, texture.addressof()); if (FAILED(hr)) return {}; const CD3D11_SHADER_RESOURCE_VIEW_DESC srv_desc(D3D11_SRV_DIMENSION_TEXTURE2D, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 1, 0, 1); ComPtr srv; - hr = m_device->CreateShaderResourceView(texture.Get(), &srv_desc, srv.GetAddressOf()); + hr = m_device->CreateShaderResourceView(texture.get(), &srv_desc, srv.addressof()); if (FAILED(hr)) return {}; @@ -210,18 +210,14 @@ void D3D11HostDisplay::SetVSync(VsyncMode mode) m_vsync_mode = mode; } -bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) +bool D3D11HostDisplay::CreateDevice(const WindowInfo& wi) { UINT create_flags = 0; - if (debug_device) + if (EmuConfig.GS.UseDebugDevice) create_flags |= D3D11_CREATE_DEVICE_DEBUG; ComPtr temp_dxgi_factory; -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(temp_dxgi_factory.GetAddressOf())); -#else - HRESULT hr = CreateDXGIFactory2(0, IID_PPV_ARGS(temp_dxgi_factory.GetAddressOf())); -#endif + HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(temp_dxgi_factory.put())); if (FAILED(hr)) { Console.Error("Failed to create DXGI factory: 0x%08X", hr); @@ -229,17 +225,17 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view } u32 adapter_index; - if (!adapter_name.empty()) + if (!EmuConfig.GS.Adapter.empty()) { - AdapterAndModeList adapter_info(GetAdapterAndModeList(temp_dxgi_factory.Get())); + AdapterAndModeList adapter_info(GetAdapterAndModeList(temp_dxgi_factory.get())); for (adapter_index = 0; adapter_index < static_cast(adapter_info.adapter_names.size()); adapter_index++) { - if (adapter_name == adapter_info.adapter_names[adapter_index]) + if (EmuConfig.GS.Adapter == adapter_info.adapter_names[adapter_index]) break; } if (adapter_index == static_cast(adapter_info.adapter_names.size())) { - Console.Warning("Could not find adapter '%s', using first (%s)", std::string(adapter_name).c_str(), + Console.Warning("Could not find adapter '%s', using first (%s)", EmuConfig.GS.Adapter.c_str(), adapter_info.adapter_names[0].c_str()); adapter_index = 0; } @@ -251,7 +247,7 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view } ComPtr dxgi_adapter; - hr = temp_dxgi_factory->EnumAdapters(adapter_index, dxgi_adapter.GetAddressOf()); + hr = temp_dxgi_factory->EnumAdapters(adapter_index, dxgi_adapter.put()); if (FAILED(hr)) Console.Warning("Failed to enumerate adapter %u, using default", adapter_index); @@ -259,13 +255,13 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view {D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0}}; hr = - D3D11CreateDevice(dxgi_adapter.Get(), dxgi_adapter ? D3D_DRIVER_TYPE_UNKNOWN : D3D_DRIVER_TYPE_HARDWARE, nullptr, + D3D11CreateDevice(dxgi_adapter.get(), dxgi_adapter ? D3D_DRIVER_TYPE_UNKNOWN : D3D_DRIVER_TYPE_HARDWARE, nullptr, create_flags, requested_feature_levels.data(), static_cast(requested_feature_levels.size()), - D3D11_SDK_VERSION, m_device.GetAddressOf(), nullptr, m_context.GetAddressOf()); + D3D11_SDK_VERSION, m_device.put(), nullptr, m_context.put()); // we re-grab these later, see below - dxgi_adapter.Reset(); - temp_dxgi_factory.Reset(); + dxgi_adapter.reset(); + temp_dxgi_factory.reset(); if (FAILED(hr)) { @@ -273,11 +269,10 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view return false; } - if (debug_device && IsDebuggerPresent()) + if (EmuConfig.GS.UseDebugDevice && IsDebuggerPresent()) { ComPtr info; - hr = m_device.As(&info); - if (SUCCEEDED(hr)) + if (m_device.try_query_to(&info)) { info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, TRUE); info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_WARNING, TRUE); @@ -286,8 +281,8 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view // we need the specific factory for the device, otherwise MakeWindowAssociation() is flaky. ComPtr dxgi_device; - if (FAILED(m_device.As(&dxgi_device)) || FAILED(dxgi_device->GetParent(IID_PPV_ARGS(dxgi_adapter.GetAddressOf()))) || - FAILED(dxgi_adapter->GetParent(IID_PPV_ARGS(m_dxgi_factory.GetAddressOf())))) + if (!m_device.try_query_to(&dxgi_device) || FAILED(dxgi_device->GetParent(IID_PPV_ARGS(dxgi_adapter.put()))) || + FAILED(dxgi_adapter->GetParent(IID_PPV_ARGS(m_dxgi_factory.put())))) { Console.Warning("Failed to get parent adapter/device/factory"); return false; @@ -309,8 +304,7 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view m_allow_tearing_supported = false; ComPtr dxgi_factory5; - hr = m_dxgi_factory.As(&dxgi_factory5); - if (SUCCEEDED(hr)) + if (m_dxgi_factory.try_query_to(&dxgi_factory5)) { BOOL allow_tearing_supported = false; hr = dxgi_factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allow_tearing_supported, @@ -320,7 +314,7 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view } m_window_info = wi; - m_vsync_mode = vsync; + m_vsync_mode = Host::GetEffectiveVSyncMode(); if (m_window_info.type != WindowInfo::Type::Surfaceless && !CreateSwapChain(nullptr)) return false; @@ -328,26 +322,23 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view return true; } -bool D3D11HostDisplay::InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) +bool D3D11HostDisplay::SetupDevice() { return true; } -bool D3D11HostDisplay::MakeRenderContextCurrent() +bool D3D11HostDisplay::MakeCurrent() { return true; } -bool D3D11HostDisplay::DoneRenderContextCurrent() +bool D3D11HostDisplay::DoneCurrent() { return true; } bool D3D11HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode) { - HRESULT hr; - -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) if (m_window_info.type != WindowInfo::Type::Win32) return false; @@ -385,7 +376,7 @@ bool D3D11HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode) swap_chain_desc.BufferDesc.Height, m_using_flip_model_swap_chain ? "flip-discard" : "discard", swap_chain_desc.Windowed ? "windowed" : "full-screen"); - hr = m_dxgi_factory->CreateSwapChain(m_device.Get(), &swap_chain_desc, m_swap_chain.GetAddressOf()); + HRESULT hr = m_dxgi_factory->CreateSwapChain(m_device.get(), &swap_chain_desc, m_swap_chain.put()); if (FAILED(hr) && m_using_flip_model_swap_chain) { Console.Warning("Failed to create a flip-discard swap chain, trying discard."); @@ -394,7 +385,7 @@ bool D3D11HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode) m_using_flip_model_swap_chain = false; m_using_allow_tearing = false; - hr = m_dxgi_factory->CreateSwapChain(m_device.Get(), &swap_chain_desc, m_swap_chain.GetAddressOf()); + hr = m_dxgi_factory->CreateSwapChain(m_device.get(), &swap_chain_desc, m_swap_chain.put()); if (FAILED(hr)) { Console.Error("CreateSwapChain failed: 0x%08X", hr); @@ -403,49 +394,13 @@ bool D3D11HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode) } ComPtr dxgi_factory; - hr = m_swap_chain->GetParent(IID_PPV_ARGS(dxgi_factory.GetAddressOf())); + hr = m_swap_chain->GetParent(IID_PPV_ARGS(dxgi_factory.put())); if (SUCCEEDED(hr)) { hr = dxgi_factory->MakeWindowAssociation(swap_chain_desc.OutputWindow, DXGI_MWA_NO_WINDOW_CHANGES); if (FAILED(hr)) Console.Warning("MakeWindowAssociation() to disable ALT+ENTER failed"); } -#else - if (m_window_info.type != WindowInfo::Type::WinRT) - return false; - - ComPtr factory2; - hr = m_dxgi_factory.As(&factory2); - if (FAILED(hr)) - { - Console.Error("Failed to get DXGI factory: %08X", hr); - return false; - } - - DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {}; - swap_chain_desc.Width = m_window_info.surface_width; - swap_chain_desc.Height = m_window_info.surface_height; - swap_chain_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - swap_chain_desc.SampleDesc.Count = 1; - swap_chain_desc.BufferCount = 3; - swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - swap_chain_desc.SwapEffect = m_using_flip_model_swap_chain ? DXGI_SWAP_EFFECT_FLIP_DISCARD : DXGI_SWAP_EFFECT_DISCARD; - - m_using_allow_tearing = (m_allow_tearing_supported && m_using_flip_model_swap_chain && !fullscreen_mode); - if (m_using_allow_tearing) - swap_chain_desc.Flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; - - ComPtr swap_chain1; - hr = factory2->CreateSwapChainForCoreWindow(m_device.Get(), static_cast(m_window_info.window_handle), - &swap_chain_desc, nullptr, swap_chain1.GetAddressOf()); - if (FAILED(hr)) - { - Console.Error("CreateSwapChainForCoreWindow failed: 0x%08X", hr); - return false; - } - - m_swap_chain = swap_chain1; -#endif return CreateSwapChainRTV(); } @@ -453,7 +408,7 @@ bool D3D11HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode) bool D3D11HostDisplay::CreateSwapChainRTV() { ComPtr backbuffer; - HRESULT hr = m_swap_chain->GetBuffer(0, IID_PPV_ARGS(backbuffer.GetAddressOf())); + HRESULT hr = m_swap_chain->GetBuffer(0, IID_PPV_ARGS(backbuffer.put())); if (FAILED(hr)) { Console.Error("GetBuffer for RTV failed: 0x%08X", hr); @@ -465,7 +420,7 @@ bool D3D11HostDisplay::CreateSwapChainRTV() CD3D11_RENDER_TARGET_VIEW_DESC rtv_desc(D3D11_RTV_DIMENSION_TEXTURE2D, backbuffer_desc.Format, 0, 0, backbuffer_desc.ArraySize); - hr = m_device->CreateRenderTargetView(backbuffer.Get(), &rtv_desc, m_swap_chain_rtv.GetAddressOf()); + hr = m_device->CreateRenderTargetView(backbuffer.get(), &rtv_desc, m_swap_chain_rtv.put()); if (FAILED(hr)) { Console.Error("CreateRenderTargetView for swap chain failed: 0x%08X", hr); @@ -495,21 +450,21 @@ bool D3D11HostDisplay::CreateSwapChainRTV() return true; } -bool D3D11HostDisplay::ChangeRenderWindow(const WindowInfo& new_wi) +bool D3D11HostDisplay::ChangeWindow(const WindowInfo& new_wi) { - DestroyRenderSurface(); + DestroySurface(); m_window_info = new_wi; return CreateSwapChain(nullptr); } -void D3D11HostDisplay::DestroyRenderSurface() +void D3D11HostDisplay::DestroySurface() { if (IsFullscreen()) SetFullscreen(false, 0, 0, 0.0f); - m_swap_chain_rtv.Reset(); - m_swap_chain.Reset(); + m_swap_chain_rtv.reset(); + m_swap_chain.reset(); } static std::string GetDriverVersionFromLUID(const LUID& luid) @@ -517,26 +472,26 @@ static std::string GetDriverVersionFromLUID(const LUID& luid) std::string ret; HKEY hKey; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\DirectX"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\DirectX", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { DWORD max_key_len = 0, adapter_count = 0; - if (RegQueryInfoKey(hKey, nullptr, nullptr, nullptr, &adapter_count, &max_key_len, + if (RegQueryInfoKeyW(hKey, nullptr, nullptr, nullptr, &adapter_count, &max_key_len, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr) == ERROR_SUCCESS) { std::vector current_name(max_key_len + 1); for (DWORD i = 0; i < adapter_count; ++i) { DWORD subKeyLength = static_cast(current_name.size()); - if (RegEnumKeyEx(hKey, i, current_name.data(), &subKeyLength, nullptr, nullptr, nullptr, nullptr) == ERROR_SUCCESS) + if (RegEnumKeyExW(hKey, i, current_name.data(), &subKeyLength, nullptr, nullptr, nullptr, nullptr) == ERROR_SUCCESS) { LUID current_luid = {}; DWORD current_luid_size = sizeof(uint64_t); - if (RegGetValue(hKey, current_name.data(), _T("AdapterLuid"), RRF_RT_QWORD, nullptr, ¤t_luid, ¤t_luid_size) == ERROR_SUCCESS && + if (RegGetValueW(hKey, current_name.data(), L"AdapterLuid", RRF_RT_QWORD, nullptr, ¤t_luid, ¤t_luid_size) == ERROR_SUCCESS && current_luid.HighPart == luid.HighPart && current_luid.LowPart == luid.LowPart) { LARGE_INTEGER driver_version = {}; DWORD driver_version_size = sizeof(driver_version); - if (RegGetValue(hKey, current_name.data(), _T("DriverVersion"), RRF_RT_QWORD, nullptr, &driver_version, &driver_version_size) == ERROR_SUCCESS) + if (RegGetValueW(hKey, current_name.data(), L"DriverVersion", RRF_RT_QWORD, nullptr, &driver_version, &driver_version_size) == ERROR_SUCCESS) { WORD nProduct = HIWORD(driver_version.HighPart); WORD nVersion = LOWORD(driver_version.HighPart); @@ -579,10 +534,10 @@ std::string D3D11HostDisplay::GetDriverInfo() const ret += "\n"; ComPtr dxgi_dev; - if (SUCCEEDED(m_device.As(&dxgi_dev))) + if (m_device.try_query_to(&dxgi_dev)) { ComPtr dxgi_adapter; - if (SUCCEEDED(dxgi_dev->GetAdapter(dxgi_adapter.ReleaseAndGetAddressOf()))) + if (SUCCEEDED(dxgi_dev->GetAdapter(dxgi_adapter.put()))) { DXGI_ADAPTER_DESC desc; if (SUCCEEDED(dxgi_adapter->GetDesc(&desc))) @@ -604,7 +559,7 @@ std::string D3D11HostDisplay::GetDriverInfo() const return ret; } -void D3D11HostDisplay::ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) +void D3D11HostDisplay::ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) { if (!m_swap_chain) return; @@ -614,7 +569,7 @@ void D3D11HostDisplay::ResizeRenderWindow(s32 new_window_width, s32 new_window_h if (m_window_info.surface_width == new_window_width && m_window_info.surface_height == new_window_height) return; - m_swap_chain_rtv.Reset(); + m_swap_chain_rtv.reset(); HRESULT hr = m_swap_chain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, m_using_allow_tearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0); @@ -683,8 +638,8 @@ bool D3D11HostDisplay::SetFullscreen(bool fullscreen, u32 width, u32 height, flo return true; } - m_swap_chain_rtv.Reset(); - m_swap_chain.Reset(); + m_swap_chain_rtv.reset(); + m_swap_chain.reset(); if (!CreateSwapChain(&closest_mode)) { @@ -700,7 +655,7 @@ bool D3D11HostDisplay::SetFullscreen(bool fullscreen, u32 width, u32 height, flo bool D3D11HostDisplay::CreateImGuiContext() { - return ImGui_ImplDX11_Init(m_device.Get(), m_context.Get()); + return ImGui_ImplDX11_Init(m_device.get(), m_context.get()); } void D3D11HostDisplay::DestroyImGuiContext() @@ -722,9 +677,16 @@ bool D3D11HostDisplay::BeginPresent(bool frame_skip) return false; } + // When using vsync, the time here seems to include the time for the buffer to become available. + // This blows our our GPU usage number considerably, so read the timestamp before the final blit + // in this configuration. It does reduce accuracy a little, but better than seeing 100% all of + // the time, when it's more like a couple of percent. + if (m_vsync_mode != VsyncMode::Off && m_gpu_timing_enabled) + PopTimestampQuery(); + static constexpr std::array clear_color = {}; - m_context->ClearRenderTargetView(m_swap_chain_rtv.Get(), clear_color.data()); - m_context->OMSetRenderTargets(1, m_swap_chain_rtv.GetAddressOf(), nullptr); + m_context->ClearRenderTargetView(m_swap_chain_rtv.get(), clear_color.data()); + m_context->OMSetRenderTargets(1, m_swap_chain_rtv.addressof(), nullptr); const CD3D11_VIEWPORT vp(0.0f, 0.0f, static_cast(m_window_info.surface_width), static_cast(m_window_info.surface_height)); const CD3D11_RECT scissor(0, 0, m_window_info.surface_width, m_window_info.surface_height); @@ -738,14 +700,15 @@ void D3D11HostDisplay::EndPresent() ImGui::Render(); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); - if (m_gpu_timing_enabled) + // See note in BeginPresent() for why it's conditional on vsync-off. + const bool vsync_on = m_vsync_mode != VsyncMode::Off; + if (!vsync_on && m_gpu_timing_enabled) PopTimestampQuery(); - const UINT vsync_rate = static_cast(m_vsync_mode != VsyncMode::Off); - if (vsync_rate == 0 && m_using_allow_tearing) + if (!vsync_on && m_using_allow_tearing) m_swap_chain->Present(0, DXGI_PRESENT_ALLOW_TEARING); else - m_swap_chain->Present(vsync_rate, 0); + m_swap_chain->Present(static_cast(vsync_on), 0); if (m_gpu_timing_enabled) KickTimestampQuery(); @@ -758,7 +721,7 @@ bool D3D11HostDisplay::CreateTimestampQueries() for (u32 j = 0; j < 3; j++) { const CD3D11_QUERY_DESC qdesc((j == 0) ? D3D11_QUERY_TIMESTAMP_DISJOINT : D3D11_QUERY_TIMESTAMP); - const HRESULT hr = m_device->CreateQuery(&qdesc, m_timestamp_queries[i][j].ReleaseAndGetAddressOf()); + const HRESULT hr = m_device->CreateQuery(&qdesc, m_timestamp_queries[i][j].put()); if (FAILED(hr)) { m_timestamp_queries = {}; @@ -777,7 +740,7 @@ void D3D11HostDisplay::DestroyTimestampQueries() return; if (m_timestamp_query_started) - m_context->End(m_timestamp_queries[m_write_timestamp_query][1].Get()); + m_context->End(m_timestamp_queries[m_write_timestamp_query][1].get()); m_timestamp_queries = {}; m_read_timestamp_query = 0; @@ -791,7 +754,7 @@ void D3D11HostDisplay::PopTimestampQuery() while (m_waiting_timestamp_queries > 0) { D3D11_QUERY_DATA_TIMESTAMP_DISJOINT disjoint; - const HRESULT disjoint_hr = m_context->GetData(m_timestamp_queries[m_read_timestamp_query][0].Get(), &disjoint, sizeof(disjoint), D3D11_ASYNC_GETDATA_DONOTFLUSH); + const HRESULT disjoint_hr = m_context->GetData(m_timestamp_queries[m_read_timestamp_query][0].get(), &disjoint, sizeof(disjoint), D3D11_ASYNC_GETDATA_DONOTFLUSH); if (disjoint_hr != S_OK) break; @@ -806,8 +769,8 @@ void D3D11HostDisplay::PopTimestampQuery() else { u64 start = 0, end = 0; - const HRESULT start_hr = m_context->GetData(m_timestamp_queries[m_read_timestamp_query][1].Get(), &start, sizeof(start), D3D11_ASYNC_GETDATA_DONOTFLUSH); - const HRESULT end_hr = m_context->GetData(m_timestamp_queries[m_read_timestamp_query][2].Get(), &end, sizeof(end), D3D11_ASYNC_GETDATA_DONOTFLUSH); + const HRESULT start_hr = m_context->GetData(m_timestamp_queries[m_read_timestamp_query][1].get(), &start, sizeof(start), D3D11_ASYNC_GETDATA_DONOTFLUSH); + const HRESULT end_hr = m_context->GetData(m_timestamp_queries[m_read_timestamp_query][2].get(), &end, sizeof(end), D3D11_ASYNC_GETDATA_DONOTFLUSH); if (start_hr == S_OK && end_hr == S_OK) { m_accumulated_gpu_time += static_cast(static_cast(end - start) / (static_cast(disjoint.Frequency) / 1000.0)); @@ -817,11 +780,10 @@ void D3D11HostDisplay::PopTimestampQuery() } } - // delay ending the current query until we've read back some - if (m_timestamp_query_started && m_waiting_timestamp_queries < (NUM_TIMESTAMP_QUERIES - 1)) + if (m_timestamp_query_started) { - m_context->End(m_timestamp_queries[m_write_timestamp_query][2].Get()); - m_context->End(m_timestamp_queries[m_write_timestamp_query][0].Get()); + m_context->End(m_timestamp_queries[m_write_timestamp_query][2].get()); + m_context->End(m_timestamp_queries[m_write_timestamp_query][0].get()); m_write_timestamp_query = (m_write_timestamp_query + 1) % NUM_TIMESTAMP_QUERIES; m_timestamp_query_started = false; m_waiting_timestamp_queries++; @@ -830,11 +792,11 @@ void D3D11HostDisplay::PopTimestampQuery() void D3D11HostDisplay::KickTimestampQuery() { - if (m_timestamp_query_started || !m_timestamp_queries[0][0]) + if (m_timestamp_query_started || !m_timestamp_queries[0][0] || m_waiting_timestamp_queries == NUM_TIMESTAMP_QUERIES) return; - m_context->Begin(m_timestamp_queries[m_write_timestamp_query][0].Get()); - m_context->End(m_timestamp_queries[m_write_timestamp_query][1].Get()); + m_context->Begin(m_timestamp_queries[m_write_timestamp_query][0].get()); + m_context->End(m_timestamp_queries[m_write_timestamp_query][1].get()); m_timestamp_query_started = true; } @@ -865,15 +827,11 @@ float D3D11HostDisplay::GetAndResetAccumulatedGPUTime() HostDisplay::AdapterAndModeList D3D11HostDisplay::StaticGetAdapterAndModeList() { ComPtr dxgi_factory; -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(dxgi_factory.GetAddressOf())); -#else - HRESULT hr = CreateDXGIFactory2(0, IID_PPV_ARGS(dxgi_factory.GetAddressOf())); -#endif + const HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(dxgi_factory.put())); if (FAILED(hr)) return {}; - return GetAdapterAndModeList(dxgi_factory.Get()); + return GetAdapterAndModeList(dxgi_factory.get()); } HostDisplay::AdapterAndModeList D3D11HostDisplay::GetAdapterAndModeList(IDXGIFactory* dxgi_factory) @@ -881,7 +839,7 @@ HostDisplay::AdapterAndModeList D3D11HostDisplay::GetAdapterAndModeList(IDXGIFac AdapterAndModeList adapter_info; ComPtr current_adapter; while (SUCCEEDED(dxgi_factory->EnumAdapters(static_cast(adapter_info.adapter_names.size()), - current_adapter.ReleaseAndGetAddressOf()))) + current_adapter.put()))) { DXGI_ADAPTER_DESC adapter_desc; std::string adapter_name; @@ -946,6 +904,6 @@ HostDisplay::AdapterAndModeList D3D11HostDisplay::GetAdapterAndModeList(IDXGIFac HostDisplay::AdapterAndModeList D3D11HostDisplay::GetAdapterAndModeList() { - return GetAdapterAndModeList(m_dxgi_factory.Get()); + return GetAdapterAndModeList(m_dxgi_factory.get()); } diff --git a/pcsx2/Frontend/D3D11HostDisplay.h b/pcsx2/Frontend/D3D11HostDisplay.h index 9040284f4f..6eccfd8afe 100644 --- a/pcsx2/Frontend/D3D11HostDisplay.h +++ b/pcsx2/Frontend/D3D11HostDisplay.h @@ -24,38 +24,38 @@ #include #include #include -#include +#include class D3D11HostDisplay final : public HostDisplay { public: template - using ComPtr = Microsoft::WRL::ComPtr; + using ComPtr = wil::com_ptr_nothrow; D3D11HostDisplay(); ~D3D11HostDisplay(); RenderAPI GetRenderAPI() const override; - void* GetRenderDevice() const override; - void* GetRenderContext() const override; - void* GetRenderSurface() const override; + void* GetDevice() const override; + void* GetContext() const override; + void* GetSurface() const override; - bool HasRenderDevice() const override; - bool HasRenderSurface() const override; + bool HasDevice() const override; + bool HasSurface() const override; - bool CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) override; - bool InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) override; + bool CreateDevice(const WindowInfo& wi) override; + bool SetupDevice() override; - bool MakeRenderContextCurrent() override; - bool DoneRenderContextCurrent() override; + bool MakeCurrent() override; + bool DoneCurrent() override; - bool ChangeRenderWindow(const WindowInfo& new_wi) override; - void ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; + bool ChangeWindow(const WindowInfo& new_wi) override; + void ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; bool SupportsFullscreen() const override; bool IsFullscreen() override; bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override; AdapterAndModeList GetAdapterAndModeList() override; - void DestroyRenderSurface() override; + void DestroySurface() override; std::string GetDriverInfo() const override; std::unique_ptr CreateTexture(u32 width, u32 height, const void* data, u32 data_stride, bool dynamic = false) override; @@ -75,7 +75,7 @@ public: protected: static constexpr u32 DISPLAY_CONSTANT_BUFFER_SIZE = 16; - static constexpr u8 NUM_TIMESTAMP_QUERIES = 3; + static constexpr u8 NUM_TIMESTAMP_QUERIES = 5; static AdapterAndModeList GetAdapterAndModeList(IDXGIFactory* dxgi_factory); diff --git a/pcsx2/Frontend/D3D12HostDisplay.cpp b/pcsx2/Frontend/D3D12HostDisplay.cpp index a1fec8f147..eec5aa02f1 100644 --- a/pcsx2/Frontend/D3D12HostDisplay.cpp +++ b/pcsx2/Frontend/D3D12HostDisplay.cpp @@ -54,37 +54,37 @@ D3D12HostDisplay::~D3D12HostDisplay() if (g_d3d12_context) { g_d3d12_context->WaitForGPUIdle(); - D3D12HostDisplay::DestroyRenderSurface(); + D3D12HostDisplay::DestroySurface(); g_d3d12_context->Destroy(); } } -HostDisplay::RenderAPI D3D12HostDisplay::GetRenderAPI() const +RenderAPI D3D12HostDisplay::GetRenderAPI() const { - return HostDisplay::RenderAPI::D3D12; + return RenderAPI::D3D12; } -void* D3D12HostDisplay::GetRenderDevice() const +void* D3D12HostDisplay::GetDevice() const { return g_d3d12_context->GetDevice(); } -void* D3D12HostDisplay::GetRenderContext() const +void* D3D12HostDisplay::GetContext() const { return g_d3d12_context.get(); } -void* D3D12HostDisplay::GetRenderSurface() const +void* D3D12HostDisplay::GetSurface() const { return m_swap_chain.get(); } -bool D3D12HostDisplay::HasRenderDevice() const +bool D3D12HostDisplay::HasDevice() const { return static_cast(g_d3d12_context); } -bool D3D12HostDisplay::HasRenderSurface() const +bool D3D12HostDisplay::HasSurface() const { return static_cast(m_swap_chain); } @@ -136,15 +136,10 @@ void D3D12HostDisplay::SetVSync(VsyncMode mode) m_vsync_mode = mode; } -bool D3D12HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) +bool D3D12HostDisplay::CreateDevice(const WindowInfo& wi) { ComPtr temp_dxgi_factory; -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(temp_dxgi_factory.put())); -#else - HRESULT hr = CreateDXGIFactory2(0, IID_PPV_ARGS(temp_dxgi_factory.put())); -#endif - if (FAILED(hr)) { Console.Error("Failed to create DXGI factory: 0x%08X", hr); @@ -152,18 +147,17 @@ bool D3D12HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view } u32 adapter_index; - if (!adapter_name.empty()) + if (!EmuConfig.GS.Adapter.empty()) { AdapterAndModeList adapter_info(GetAdapterAndModeList(temp_dxgi_factory.get())); for (adapter_index = 0; adapter_index < static_cast(adapter_info.adapter_names.size()); adapter_index++) { - if (adapter_name == adapter_info.adapter_names[adapter_index]) + if (EmuConfig.GS.Adapter == adapter_info.adapter_names[adapter_index]) break; } if (adapter_index == static_cast(adapter_info.adapter_names.size())) { - Console.Warning("Could not find adapter '%*s', using first (%s)", static_cast(adapter_name.size()), - adapter_name.data(), adapter_info.adapter_names[0].c_str()); + Console.Warning("Could not find adapter '%s', using first (%s)", EmuConfig.GS.Adapter.c_str(), adapter_info.adapter_names[0].c_str()); adapter_index = 0; } } @@ -173,7 +167,7 @@ bool D3D12HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_index = 0; } - if (!D3D12::Context::Create(temp_dxgi_factory.get(), adapter_index, debug_device)) + if (!D3D12::Context::Create(temp_dxgi_factory.get(), adapter_index, EmuConfig.GS.UseDebugDevice)) return false; if (FAILED(hr)) @@ -196,6 +190,7 @@ bool D3D12HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view } m_window_info = wi; + m_vsync_mode = Host::GetEffectiveVSyncMode(); if (m_window_info.type != WindowInfo::Type::Surfaceless && !CreateSwapChain(nullptr)) return false; @@ -203,26 +198,23 @@ bool D3D12HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view return true; } -bool D3D12HostDisplay::InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) +bool D3D12HostDisplay::SetupDevice() { return true; } -bool D3D12HostDisplay::MakeRenderContextCurrent() +bool D3D12HostDisplay::MakeCurrent() { return true; } -bool D3D12HostDisplay::DoneRenderContextCurrent() +bool D3D12HostDisplay::DoneCurrent() { return true; } bool D3D12HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode) { - HRESULT hr; - -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) if (m_window_info.type != WindowInfo::Type::Win32) return false; @@ -257,7 +249,7 @@ bool D3D12HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode) DevCon.WriteLn("Creating a %dx%d %s swap chain", swap_chain_desc.BufferDesc.Width, swap_chain_desc.BufferDesc.Height, swap_chain_desc.Windowed ? "windowed" : "full-screen"); - hr = + HRESULT hr = m_dxgi_factory->CreateSwapChain(g_d3d12_context->GetCommandQueue(), &swap_chain_desc, m_swap_chain.put()); if (FAILED(hr)) { @@ -268,43 +260,6 @@ bool D3D12HostDisplay::CreateSwapChain(const DXGI_MODE_DESC* fullscreen_mode) hr = m_dxgi_factory->MakeWindowAssociation(swap_chain_desc.OutputWindow, DXGI_MWA_NO_WINDOW_CHANGES); if (FAILED(hr)) Console.Warning("MakeWindowAssociation() to disable ALT+ENTER failed"); -#else - if (m_window_info.type != WindowInfo::Type::WinRT) - return false; - - ComPtr factory2; - hr = m_dxgi_factory.As(&factory2); - if (FAILED(hr)) - { - Console.Error("Failed to get DXGI factory: %08X", hr); - return false; - } - - DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {}; - swap_chain_desc.Width = m_window_info.surface_width; - swap_chain_desc.Height = m_window_info.surface_height; - swap_chain_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - swap_chain_desc.SampleDesc.Count = 1; - swap_chain_desc.BufferCount = 3; - swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; - - m_using_allow_tearing = (m_allow_tearing_supported && !fullscreen_mode); - if (m_using_allow_tearing) - swap_chain_desc.Flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING; - - ComPtr swap_chain1; - hr = factory2->CreateSwapChainForCoreWindow(g_d3d12_context->GetCommandQueue(), - static_cast(m_window_info.window_handle), &swap_chain_desc, - nullptr, swap_chain1.GetAddressOf()); - if (FAILED(hr)) - { - Console.Error("CreateSwapChainForCoreWindow failed: 0x%08X", hr); - return false; - } - - m_swap_chain = swap_chain1; -#endif return CreateSwapChainRTV(); } @@ -368,18 +323,18 @@ void D3D12HostDisplay::DestroySwapChainRTVs() m_current_swap_chain_buffer = 0; } -bool D3D12HostDisplay::ChangeRenderWindow(const WindowInfo& new_wi) +bool D3D12HostDisplay::ChangeWindow(const WindowInfo& new_wi) { - DestroyRenderSurface(); + DestroySurface(); m_window_info = new_wi; return CreateSwapChain(nullptr); } -void D3D12HostDisplay::DestroyRenderSurface() +void D3D12HostDisplay::DestroySurface() { // For some reason if we don't execute the command list here, the swap chain is in use.. not sure where. - g_d3d12_context->ExecuteCommandList(true); + g_d3d12_context->ExecuteCommandList(D3D12::Context::WaitType::Sleep); if (IsFullscreen()) SetFullscreen(false, 0, 0, 0.0f); @@ -393,7 +348,7 @@ static std::string GetDriverVersionFromLUID(const LUID& luid) std::string ret; HKEY hKey; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\DirectX"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\DirectX", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { DWORD max_key_len = 0, adapter_count = 0; if (RegQueryInfoKey(hKey, nullptr, nullptr, nullptr, &adapter_count, &max_key_len, @@ -403,16 +358,16 @@ static std::string GetDriverVersionFromLUID(const LUID& luid) for (DWORD i = 0; i < adapter_count; ++i) { DWORD subKeyLength = static_cast(current_name.size()); - if (RegEnumKeyEx(hKey, i, current_name.data(), &subKeyLength, nullptr, nullptr, nullptr, nullptr) == ERROR_SUCCESS) + if (RegEnumKeyExW(hKey, i, current_name.data(), &subKeyLength, nullptr, nullptr, nullptr, nullptr) == ERROR_SUCCESS) { LUID current_luid = {}; DWORD current_luid_size = sizeof(uint64_t); - if (RegGetValue(hKey, current_name.data(), _T("AdapterLuid"), RRF_RT_QWORD, nullptr, ¤t_luid, ¤t_luid_size) == ERROR_SUCCESS && + if (RegGetValueW(hKey, current_name.data(), L"AdapterLuid", RRF_RT_QWORD, nullptr, ¤t_luid, ¤t_luid_size) == ERROR_SUCCESS && current_luid.HighPart == luid.HighPart && current_luid.LowPart == luid.LowPart) { LARGE_INTEGER driver_version = {}; DWORD driver_version_size = sizeof(driver_version); - if (RegGetValue(hKey, current_name.data(), _T("DriverVersion"), RRF_RT_QWORD, nullptr, &driver_version, &driver_version_size) == ERROR_SUCCESS) + if (RegGetValueW(hKey, current_name.data(), L"DriverVersion", RRF_RT_QWORD, nullptr, &driver_version, &driver_version_size) == ERROR_SUCCESS) { WORD nProduct = HIWORD(driver_version.HighPart); WORD nVersion = LOWORD(driver_version.HighPart); @@ -473,7 +428,7 @@ std::string D3D12HostDisplay::GetDriverInfo() const return ret; } -void D3D12HostDisplay::ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) +void D3D12HostDisplay::ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) { if (!m_swap_chain) return; @@ -484,7 +439,7 @@ void D3D12HostDisplay::ResizeRenderWindow(s32 new_window_width, s32 new_window_h return; // For some reason if we don't execute the command list here, the swap chain is in use.. not sure where. - g_d3d12_context->ExecuteCommandList(true); + g_d3d12_context->ExecuteCommandList(D3D12::Context::WaitType::Sleep); DestroySwapChainRTVs(); @@ -555,7 +510,7 @@ bool D3D12HostDisplay::SetFullscreen(bool fullscreen, u32 width, u32 height, flo return true; } - g_d3d12_context->ExecuteCommandList(true); + g_d3d12_context->ExecuteCommandList(D3D12::Context::WaitType::Sleep); DestroySwapChainRTVs(); m_swap_chain.reset(); @@ -612,8 +567,8 @@ bool D3D12HostDisplay::BeginPresent(bool frame_skip) ID3D12GraphicsCommandList* cmdlist = g_d3d12_context->GetCommandList(); swap_chain_buf.TransitionToState(cmdlist, D3D12_RESOURCE_STATE_RENDER_TARGET); - cmdlist->ClearRenderTargetView(swap_chain_buf.GetRTVOrDSVDescriptor(), clear_color.data(), 0, nullptr); - cmdlist->OMSetRenderTargets(1, &swap_chain_buf.GetRTVOrDSVDescriptor().cpu_handle, FALSE, nullptr); + cmdlist->ClearRenderTargetView(swap_chain_buf.GetWriteDescriptor(), clear_color.data(), 0, nullptr); + cmdlist->OMSetRenderTargets(1, &swap_chain_buf.GetWriteDescriptor().cpu_handle, FALSE, nullptr); const D3D12_VIEWPORT vp{0.0f, 0.0f, static_cast(m_window_info.surface_width), static_cast(m_window_info.surface_height), 0.0f, 1.0f}; const D3D12_RECT scissor{0, 0, static_cast(m_window_info.surface_width), static_cast(m_window_info.surface_height)}; @@ -631,7 +586,7 @@ void D3D12HostDisplay::EndPresent() m_current_swap_chain_buffer = ((m_current_swap_chain_buffer + 1) % static_cast(m_swap_chain_buffers.size())); swap_chain_buf.TransitionToState(g_d3d12_context->GetCommandList(), D3D12_RESOURCE_STATE_PRESENT); - g_d3d12_context->ExecuteCommandList(false); + g_d3d12_context->ExecuteCommandList(D3D12::Context::WaitType::None); const bool vsync = static_cast(m_vsync_mode != VsyncMode::Off); if (!vsync && m_using_allow_tearing) @@ -654,11 +609,7 @@ float D3D12HostDisplay::GetAndResetAccumulatedGPUTime() HostDisplay::AdapterAndModeList D3D12HostDisplay::StaticGetAdapterAndModeList() { ComPtr dxgi_factory; -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) - HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(dxgi_factory.put())); -#else - HRESULT hr = CreateDXGIFactory2(0, IID_PPV_ARGS(dxgi_factory.put())); -#endif + const HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(dxgi_factory.put())); if (FAILED(hr)) return {}; diff --git a/pcsx2/Frontend/D3D12HostDisplay.h b/pcsx2/Frontend/D3D12HostDisplay.h index 7003131abf..2377cf4fe8 100644 --- a/pcsx2/Frontend/D3D12HostDisplay.h +++ b/pcsx2/Frontend/D3D12HostDisplay.h @@ -42,26 +42,26 @@ public: ~D3D12HostDisplay(); RenderAPI GetRenderAPI() const override; - void* GetRenderDevice() const override; - void* GetRenderContext() const override; - void* GetRenderSurface() const override; + void* GetDevice() const override; + void* GetContext() const override; + void* GetSurface() const override; - bool HasRenderDevice() const override; - bool HasRenderSurface() const override; + bool HasDevice() const override; + bool HasSurface() const override; - bool CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) override; - bool InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) override; + bool CreateDevice(const WindowInfo& wi) override; + bool SetupDevice() override; - bool MakeRenderContextCurrent() override; - bool DoneRenderContextCurrent() override; + bool MakeCurrent() override; + bool DoneCurrent() override; - bool ChangeRenderWindow(const WindowInfo& new_wi) override; - void ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; + bool ChangeWindow(const WindowInfo& new_wi) override; + void ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; bool SupportsFullscreen() const override; bool IsFullscreen() override; bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override; AdapterAndModeList GetAdapterAndModeList() override; - void DestroyRenderSurface() override; + void DestroySurface() override; std::string GetDriverInfo() const override; std::unique_ptr CreateTexture(u32 width, u32 height, const void* data, u32 data_stride, bool dynamic = false) override; diff --git a/pcsx2/Frontend/DInputSource.cpp b/pcsx2/Frontend/DInputSource.cpp new file mode 100644 index 0000000000..8dbc7cc433 --- /dev/null +++ b/pcsx2/Frontend/DInputSource.cpp @@ -0,0 +1,466 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#define INITGUID + +#include "Frontend/DInputSource.h" +#include "Frontend/InputManager.h" +#include "common/Assertions.h" +#include "common/Console.h" +#include "common/StringUtil.h" + +#include "fmt/format.h" +#include +#include + +using PFNDIRECTINPUT8CREATE = HRESULT(WINAPI*)(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID* ppvOut, LPUNKNOWN punkOuter); +using PFNGETDFDIJOYSTICK = LPCDIDATAFORMAT(WINAPI*)(); + +DInputSource::DInputSource() = default; + +DInputSource::~DInputSource() +{ + m_controllers.clear(); + m_dinput.reset(); + if (m_dinput_module) + FreeLibrary(m_dinput_module); +} + +std::array DInputSource::GetHatButtons(DWORD hat) +{ + std::array buttons = {}; + + const WORD hv = LOWORD(hat); + if (hv != 0xFFFF) + { + if ((hv >= 0 && hv < 9000) || hv >= 31500) + buttons[HAT_DIRECTION_UP] = true; + if (hv >= 4500 && hv < 18000) + buttons[HAT_DIRECTION_RIGHT] = true; + if (hv >= 13500 && hv < 27000) + buttons[HAT_DIRECTION_DOWN] = true; + if (hv >= 22500) + buttons[HAT_DIRECTION_LEFT] = true; + } + + return buttons; +} + +std::string DInputSource::GetDeviceIdentifier(u32 index) +{ + return fmt::format("DInput-{}", index); +} + +static constexpr std::array s_hat_directions = {{"Up", "Right", "Down", "Left"}}; + +bool DInputSource::Initialize(SettingsInterface& si, std::unique_lock& settings_lock) +{ + m_dinput_module = LoadLibraryW(L"dinput8"); + if (!m_dinput_module) + { + Console.Error("Failed to load DInput module."); + return false; + } + + PFNDIRECTINPUT8CREATE create = reinterpret_cast(GetProcAddress(m_dinput_module, "DirectInput8Create")); + PFNGETDFDIJOYSTICK get_joystick_data_format = reinterpret_cast(GetProcAddress(m_dinput_module, "GetdfDIJoystick")); + if (!create || !get_joystick_data_format) + { + Console.Error("Failed to get DInput function pointers."); + return false; + } + + HRESULT hr = create( + GetModuleHandleA(nullptr), DIRECTINPUT_VERSION, IID_IDirectInput8W, reinterpret_cast(m_dinput.put()), nullptr); + m_joystick_data_format = get_joystick_data_format(); + if (FAILED(hr) || !m_joystick_data_format) + { + Console.Error("DirectInput8Create() failed: %08X", hr); + return false; + } + + // need to release the lock while we're enumerating, because we call winId(). + settings_lock.unlock(); + const std::optional toplevel_wi(Host::GetTopLevelWindowInfo()); + if (!toplevel_wi.has_value() || toplevel_wi->type != WindowInfo::Type::Win32) + { + Console.Error("Missing top level window, cannot add DInput devices."); + return false; + } + settings_lock.lock(); + + m_toplevel_window = static_cast(toplevel_wi->window_handle); + ReloadDevices(); + return true; +} + +void DInputSource::UpdateSettings(SettingsInterface& si, std::unique_lock& settings_lock) +{ + // noop +} + +static BOOL CALLBACK EnumCallback(LPCDIDEVICEINSTANCEW lpddi, LPVOID pvRef) +{ + static_cast*>(pvRef)->push_back(*lpddi); + return DIENUM_CONTINUE; +} + +bool DInputSource::ReloadDevices() +{ + // detect any removals + PollEvents(); + + // look for new devices + std::vector devices; + m_dinput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumCallback, &devices, DIEDFL_ATTACHEDONLY); + + DevCon.WriteLn("Enumerated %zu devices", devices.size()); + + bool changed = false; + for (DIDEVICEINSTANCEW inst : devices) + { + // do we already have this one? + if (std::any_of( + m_controllers.begin(), m_controllers.end(), [&inst](const ControllerData& cd) { return inst.guidInstance == cd.guid; })) + { + // yup, so skip it + continue; + } + + ControllerData cd; + cd.guid = inst.guidInstance; + HRESULT hr = m_dinput->CreateDevice(inst.guidInstance, cd.device.put(), nullptr); + if (FAILED(hr)) + { + Console.Warning("Failed to create instance of device [%s, %s]", inst.tszProductName, inst.tszInstanceName); + continue; + } + + const std::string name(StringUtil::WideStringToUTF8String(inst.tszProductName)); + if (AddDevice(cd, name)) + { + const u32 index = static_cast(m_controllers.size()); + m_controllers.push_back(std::move(cd)); + Host::OnInputDeviceConnected(GetDeviceIdentifier(index), name); + changed = true; + } + } + + return changed; +} + +void DInputSource::Shutdown() +{ + while (!m_controllers.empty()) + { + Host::OnInputDeviceDisconnected(GetDeviceIdentifier(static_cast(m_controllers.size() - 1))); + m_controllers.pop_back(); + } +} + +bool DInputSource::AddDevice(ControllerData& cd, const std::string& name) +{ + HRESULT hr = cd.device->SetCooperativeLevel(m_toplevel_window, DISCL_BACKGROUND | DISCL_EXCLUSIVE); + if (FAILED(hr)) + { + hr = cd.device->SetCooperativeLevel(m_toplevel_window, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE); + if (FAILED(hr)) + { + Console.Error("Failed to set cooperative level for '%s'", name.c_str()); + return false; + } + + Console.Warning("Failed to set exclusive mode for '%s'", name.c_str()); + } + + hr = cd.device->SetDataFormat(m_joystick_data_format); + if (FAILED(hr)) + { + Console.Error("Failed to set data format for '%s'", name.c_str()); + return false; + } + + hr = cd.device->Acquire(); + if (FAILED(hr)) + { + Console.Error("Failed to acquire device '%s'", name.c_str()); + return false; + } + + DIDEVCAPS caps = {}; + caps.dwSize = sizeof(caps); + hr = cd.device->GetCapabilities(&caps); + if (FAILED(hr)) + { + Console.Error("Failed to get capabilities for '%s'", name.c_str()); + return false; + } + + cd.num_buttons = caps.dwButtons; + + static constexpr const u32 axis_offsets[] = {offsetof(DIJOYSTATE, lX), offsetof(DIJOYSTATE, lY), offsetof(DIJOYSTATE, lZ), + offsetof(DIJOYSTATE, lRz), offsetof(DIJOYSTATE, lRx), offsetof(DIJOYSTATE, lRy), offsetof(DIJOYSTATE, rglSlider[0]), + offsetof(DIJOYSTATE, rglSlider[1])}; + for (const u32 offset : axis_offsets) + { + // ask for 16 bits of axis range + DIPROPRANGE range = {}; + range.diph.dwSize = sizeof(range); + range.diph.dwHeaderSize = sizeof(range.diph); + range.diph.dwHow = DIPH_BYOFFSET; + range.diph.dwObj = static_cast(offset); + range.lMin = std::numeric_limits::min(); + range.lMax = std::numeric_limits::max(); + hr = cd.device->SetProperty(DIPROP_RANGE, &range.diph); + + // did it apply? + if (SUCCEEDED(cd.device->GetProperty(DIPROP_RANGE, &range.diph))) + cd.axis_offsets.push_back(offset); + } + + cd.num_hats = caps.dwPOVs; + + hr = cd.device->Poll(); + if (hr == DI_NOEFFECT) + cd.needs_poll = false; + else if (hr != DI_OK) + Console.Warning("Polling device '%s' failed: %08X", name.c_str(), hr); + + hr = cd.device->GetDeviceState(sizeof(cd.last_state), &cd.last_state); + if (hr != DI_OK) + Console.Warning("GetDeviceState() for '%s' failed: %08X", name.c_str(), hr); + + Console.WriteLn( + "%s has %u buttons, %u axes, %u hats", name.c_str(), cd.num_buttons, static_cast(cd.axis_offsets.size()), cd.num_hats); + + return (cd.num_buttons > 0 || !cd.axis_offsets.empty() || cd.num_hats > 0); +} + +void DInputSource::PollEvents() +{ + for (size_t i = 0; i < m_controllers.size();) + { + ControllerData& cd = m_controllers[i]; + if (cd.needs_poll) + cd.device->Poll(); + + DIJOYSTATE js; + HRESULT hr = cd.device->GetDeviceState(sizeof(js), &js); + if (hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED) + { + hr = cd.device->Acquire(); + if (hr == DI_OK) + hr = cd.device->GetDeviceState(sizeof(js), &js); + + if (hr != DI_OK) + { + Host::OnInputDeviceDisconnected(GetDeviceIdentifier(static_cast(i))); + m_controllers.erase(m_controllers.begin() + i); + continue; + } + } + else if (hr != DI_OK) + { + Console.Warning("GetDeviceState() failed: %08X", hr); + i++; + continue; + } + + CheckForStateChanges(i, js); + i++; + } +} + +std::vector> DInputSource::EnumerateDevices() +{ + std::vector> ret; + for (size_t i = 0; i < m_controllers.size(); i++) + { + DIDEVICEINSTANCEW dii = {sizeof(DIDEVICEINSTANCEW)}; + std::string name; + if (SUCCEEDED(m_controllers[i].device->GetDeviceInfo(&dii))) + name = StringUtil::WideStringToUTF8String(dii.tszProductName); + + if (name.empty()) + name = "Unknown"; + + ret.emplace_back(GetDeviceIdentifier(static_cast(i)), std::move(name)); + } + + return ret; +} + +std::vector DInputSource::EnumerateMotors() +{ + return {}; +} + +bool DInputSource::GetGenericBindingMapping(const std::string_view& device, GenericInputBindingMapping* mapping) +{ + return {}; +} + +void DInputSource::UpdateMotorState(InputBindingKey key, float intensity) +{ + // not supported +} + +void DInputSource::UpdateMotorState(InputBindingKey large_key, InputBindingKey small_key, float large_intensity, float small_intensity) +{ + // not supported +} + +std::optional DInputSource::ParseKeyString(const std::string_view& device, const std::string_view& binding) +{ + if (!StringUtil::StartsWith(device, "DInput-") || binding.empty()) + return std::nullopt; + + const std::optional player_id = StringUtil::FromChars(device.substr(7)); + if (!player_id.has_value() || player_id.value() < 0) + return std::nullopt; + + InputBindingKey key = {}; + key.source_type = InputSourceType::DInput; + key.source_index = static_cast(player_id.value()); + + if (StringUtil::StartsWith(binding, "+Axis") || StringUtil::StartsWith(binding, "-Axis")) + { + const std::optional axis_index = StringUtil::FromChars(binding.substr(5)); + if (!axis_index.has_value()) + return std::nullopt; + + key.source_subtype = InputSubclass::ControllerAxis; + key.data = axis_index.value(); + key.modifier = (binding[0] == '-') ? InputModifier::Negate : InputModifier::None; + return key; + } + else if (StringUtil::StartsWith(binding, "Hat")) + { + if (binding[3] < '0' || binding[3] > '9' || binding.length() < 5) + return std::nullopt; + + const u32 hat_index = binding[3] - '0'; + const std::string_view hat_dir(binding.substr(4)); + for (u32 i = 0; i < NUM_HAT_DIRECTIONS; i++) + { + if (hat_dir == s_hat_directions[i]) + { + key.source_subtype = InputSubclass::ControllerButton; + key.data = MAX_NUM_BUTTONS + hat_index * NUM_HAT_DIRECTIONS + i; + return key; + } + } + + // bad direction + return std::nullopt; + } + else if (StringUtil::StartsWith(binding, "Button")) + { + const std::optional button_index = StringUtil::FromChars(binding.substr(6)); + if (!button_index.has_value()) + return std::nullopt; + + key.source_subtype = InputSubclass::ControllerButton; + key.data = button_index.value(); + return key; + } + + // unknown axis/button + return std::nullopt; +} + +std::string DInputSource::ConvertKeyToString(InputBindingKey key) +{ + std::string ret; + + if (key.source_type == InputSourceType::DInput) + { + if (key.source_subtype == InputSubclass::ControllerAxis) + { + ret = fmt::format("DInput-{}/{}Axis{}", u32(key.source_index), key.modifier == InputModifier::Negate ? '-' : '+', u32(key.data)); + } + else if (key.source_subtype == InputSubclass::ControllerButton && key.data >= MAX_NUM_BUTTONS) + { + const u32 hat_num = (key.data - MAX_NUM_BUTTONS) / NUM_HAT_DIRECTIONS; + const u32 hat_dir = (key.data - MAX_NUM_BUTTONS) % NUM_HAT_DIRECTIONS; + ret = fmt::format("DInput-{}/Hat{}{}", u32(key.source_index), hat_num, s_hat_directions[hat_dir]); + } + else if (key.source_subtype == InputSubclass::ControllerButton) + { + ret = fmt::format("DInput-{}/Button{}", u32(key.source_index), u32(key.data)); + } + } + + return ret; +} + +void DInputSource::CheckForStateChanges(size_t index, const DIJOYSTATE& new_state) +{ + ControllerData& cd = m_controllers[index]; + DIJOYSTATE& last_state = cd.last_state; + + for (size_t i = 0; i < cd.axis_offsets.size(); i++) + { + LONG new_value; + LONG old_value; + std::memcpy(&old_value, reinterpret_cast(&cd.last_state) + cd.axis_offsets[i], sizeof(old_value)); + std::memcpy(&new_value, reinterpret_cast(&new_state) + cd.axis_offsets[i], sizeof(new_value)); + if (old_value != new_value) + { + std::memcpy(reinterpret_cast(&cd.last_state) + cd.axis_offsets[i], &new_value, sizeof(new_value)); + + // TODO: Use the range from caps? + const float value = static_cast(new_value) / (new_value < 0 ? 32768.0f : 32767.0f); + InputManager::InvokeEvents(MakeGenericControllerAxisKey(InputSourceType::DInput, static_cast(index), static_cast(i)), + value, GenericInputBinding::Unknown); + } + } + + for (u32 i = 0; i < cd.num_buttons; i++) + { + if (last_state.rgbButtons[i] != new_state.rgbButtons[i]) + { + last_state.rgbButtons[i] = new_state.rgbButtons[i]; + + const float value = (new_state.rgbButtons[i] != 0) ? 1.0f : 0.0f; + InputManager::InvokeEvents( + MakeGenericControllerButtonKey(InputSourceType::DInput, static_cast(index), i), value, GenericInputBinding::Unknown); + } + } + + for (u32 i = 0; i < cd.num_hats; i++) + { + if (last_state.rgdwPOV[i] != new_state.rgdwPOV[i]) + { + // map hats to the last buttons + const std::array old_buttons(GetHatButtons(last_state.rgdwPOV[i])); + const std::array new_buttons(GetHatButtons(new_state.rgdwPOV[i])); + last_state.rgdwPOV[i] = new_state.rgdwPOV[i]; + + for (u32 j = 0; j < NUM_HAT_DIRECTIONS; j++) + { + if (old_buttons[j] != new_buttons[j]) + { + const float value = (new_buttons[j] ? 1.0f : 0.0f); + InputManager::InvokeEvents(MakeGenericControllerButtonKey(InputSourceType::DInput, static_cast(index), + cd.num_buttons + (i * NUM_HAT_DIRECTIONS) + j), + value, GenericInputBinding::Unknown); + } + } + } + } +} diff --git a/pcsx2/Frontend/DInputSource.h b/pcsx2/Frontend/DInputSource.h new file mode 100644 index 0000000000..1fb1415a01 --- /dev/null +++ b/pcsx2/Frontend/DInputSource.h @@ -0,0 +1,92 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#define DIRECTINPUT_VERSION 0x0800 +#include "common/RedtapeWindows.h" +#include "Frontend/InputSource.h" +#include +#include +#include +#include +#include +#include + +class DInputSource final : public InputSource +{ +public: + enum HAT_DIRECTION : u32 + { + HAT_DIRECTION_UP = 0, + HAT_DIRECTION_DOWN = 1, + HAT_DIRECTION_LEFT = 2, + HAT_DIRECTION_RIGHT = 3, + NUM_HAT_DIRECTIONS = 4, + }; + + enum : u32 + { + MAX_NUM_BUTTONS = 32, + }; + + DInputSource(); + ~DInputSource() override; + + bool Initialize(SettingsInterface& si, std::unique_lock& settings_lock) override; + void UpdateSettings(SettingsInterface& si, std::unique_lock& settings_lock) override; + bool ReloadDevices() override; + void Shutdown() override; + + void PollEvents() override; + std::vector> EnumerateDevices() override; + std::vector EnumerateMotors() override; + bool GetGenericBindingMapping(const std::string_view& device, GenericInputBindingMapping* mapping) override; + void UpdateMotorState(InputBindingKey key, float intensity) override; + void UpdateMotorState(InputBindingKey large_key, InputBindingKey small_key, float large_intensity, float small_intensity) override; + + std::optional ParseKeyString(const std::string_view& device, const std::string_view& binding) override; + std::string ConvertKeyToString(InputBindingKey key) override; + +private: + struct ControllerData + { + wil::com_ptr_nothrow device; + DIJOYSTATE last_state = {}; + GUID guid = {}; + std::vector axis_offsets; + u32 num_buttons = 0; + + // NOTE: We expose hats as num_buttons + (hat_index * 4) + direction. + u32 num_hats = 0; + + bool needs_poll = true; + }; + + using ControllerDataArray = std::vector; + + static std::array GetHatButtons(DWORD hat); + static std::string GetDeviceIdentifier(u32 index); + + bool AddDevice(ControllerData& cd, const std::string& name); + + void CheckForStateChanges(size_t index, const DIJOYSTATE& new_state); + + ControllerDataArray m_controllers; + + HMODULE m_dinput_module{}; + wil::com_ptr_nothrow m_dinput; + LPCDIDATAFORMAT m_joystick_data_format{}; + HWND m_toplevel_window = NULL; +}; diff --git a/pcsx2/Frontend/FullscreenUI.cpp b/pcsx2/Frontend/FullscreenUI.cpp new file mode 100644 index 0000000000..b43500fa7b --- /dev/null +++ b/pcsx2/Frontend/FullscreenUI.cpp @@ -0,0 +1,6658 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#define IMGUI_DEFINE_MATH_OPERATORS + +#include "Frontend/CommonHost.h" +#include "Frontend/FullscreenUI.h" +#include "Frontend/ImGuiManager.h" +#include "Frontend/ImGuiFullscreen.h" +#include "Frontend/InputManager.h" +#include "Frontend/GameList.h" +#include "IconsFontAwesome5.h" + +#include "common/FileSystem.h" +#include "common/Console.h" +#include "common/Image.h" +#include "common/Path.h" +#include "common/SettingsInterface.h" +#include "common/SettingsWrapper.h" +#include "common/StringUtil.h" +#include "common/Timer.h" + +#include "CDVD/CDVDcommon.h" +#include "CDVD/CDVDdiscReader.h" +#include "GS.h" +#include "Host.h" +#include "HostDisplay.h" +#include "HostSettings.h" +#include "INISettingsInterface.h" +#include "MemoryCardFile.h" +#include "PAD/Host/PAD.h" +#include "ps2/BiosTools.h" +#include "Sio.h" +#include "VMManager.h" + +#include "svnrev.h" + +#include "imgui.h" +#include "imgui_internal.h" + +#include "fmt/core.h" + +#include +#include +#include + +#ifdef ENABLE_ACHIEVEMENTS +#include "Frontend/Achievements.h" +#endif + +using ImGuiFullscreen::g_large_font; +using ImGuiFullscreen::g_layout_padding_left; +using ImGuiFullscreen::g_layout_padding_top; +using ImGuiFullscreen::g_medium_font; +using ImGuiFullscreen::LAYOUT_LARGE_FONT_SIZE; +using ImGuiFullscreen::LAYOUT_MEDIUM_FONT_SIZE; +using ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT; +using ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY; +using ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING; +using ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING; +using ImGuiFullscreen::LAYOUT_SCREEN_HEIGHT; +using ImGuiFullscreen::LAYOUT_SCREEN_WIDTH; +using ImGuiFullscreen::UIBackgroundColor; +using ImGuiFullscreen::UIBackgroundHighlightColor; +using ImGuiFullscreen::UIBackgroundLineColor; +using ImGuiFullscreen::UIBackgroundTextColor; +using ImGuiFullscreen::UIDisabledColor; +using ImGuiFullscreen::UIPrimaryColor; +using ImGuiFullscreen::UIPrimaryDarkColor; +using ImGuiFullscreen::UIPrimaryLightColor; +using ImGuiFullscreen::UIPrimaryLineColor; +using ImGuiFullscreen::UIPrimaryTextColor; +using ImGuiFullscreen::UISecondaryColor; +using ImGuiFullscreen::UISecondaryDarkColor; +using ImGuiFullscreen::UISecondaryLightColor; +using ImGuiFullscreen::UISecondaryTextColor; +using ImGuiFullscreen::UITextHighlightColor; + +using ImGuiFullscreen::ActiveButton; +using ImGuiFullscreen::AddNotification; +using ImGuiFullscreen::BeginFullscreenColumns; +using ImGuiFullscreen::BeginFullscreenColumnWindow; +using ImGuiFullscreen::BeginFullscreenWindow; +using ImGuiFullscreen::BeginMenuButtons; +using ImGuiFullscreen::BeginNavBar; +using ImGuiFullscreen::CenterImage; +using ImGuiFullscreen::CloseChoiceDialog; +using ImGuiFullscreen::CloseFileSelector; +using ImGuiFullscreen::DPIScale; +using ImGuiFullscreen::EndFullscreenColumns; +using ImGuiFullscreen::EndFullscreenColumnWindow; +using ImGuiFullscreen::EndFullscreenWindow; +using ImGuiFullscreen::EndMenuButtons; +using ImGuiFullscreen::EndNavBar; +using ImGuiFullscreen::EnumChoiceButton; +using ImGuiFullscreen::FloatingButton; +using ImGuiFullscreen::GetCachedTexture; +using ImGuiFullscreen::GetCachedTextureAsync; +using ImGuiFullscreen::GetPlaceholderTexture; +using ImGuiFullscreen::LayoutScale; +using ImGuiFullscreen::LoadTexture; +using ImGuiFullscreen::MenuButton; +using ImGuiFullscreen::MenuButtonFrame; +using ImGuiFullscreen::MenuButtonWithoutSummary; +using ImGuiFullscreen::MenuButtonWithValue; +using ImGuiFullscreen::MenuHeading; +using ImGuiFullscreen::MenuHeadingButton; +using ImGuiFullscreen::MenuImageButton; +using ImGuiFullscreen::ModAlpha; +using ImGuiFullscreen::MulAlpha; +using ImGuiFullscreen::NavButton; +using ImGuiFullscreen::NavTitle; +using ImGuiFullscreen::OpenChoiceDialog; +using ImGuiFullscreen::OpenConfirmMessageDialog; +using ImGuiFullscreen::OpenFileSelector; +using ImGuiFullscreen::OpenInfoMessageDialog; +using ImGuiFullscreen::OpenInputStringDialog; +using ImGuiFullscreen::PopPrimaryColor; +using ImGuiFullscreen::PushPrimaryColor; +using ImGuiFullscreen::QueueResetFocus; +using ImGuiFullscreen::RangeButton; +using ImGuiFullscreen::ResetFocusHere; +using ImGuiFullscreen::RightAlignNavButtons; +using ImGuiFullscreen::ShowToast; +using ImGuiFullscreen::ThreeWayToggleButton; +using ImGuiFullscreen::ToggleButton; +using ImGuiFullscreen::WantsToCloseMenu; + +namespace FullscreenUI +{ + enum class MainWindowType + { + None, + Landing, + GameList, + Settings, + PauseMenu, +#ifdef ENABLE_ACHIEVEMENTS + Achievements, + Leaderboards, +#endif + }; + + enum class PauseSubMenu + { + None, + Exit, +#ifdef ENABLE_ACHIEVEMENTS + Achievements, +#endif + }; + + enum class SettingsPage + { + Summary, + Interface, + BIOS, + Emulation, + Graphics, + Audio, + MemoryCard, + Controller, + Hotkey, + Achievements, + Folders, + Advanced, + GameFixes, + Count + }; + + enum class GameListPage + { + Grid, + List, + Settings, + Count + }; + + ////////////////////////////////////////////////////////////////////////// + // Utility + ////////////////////////////////////////////////////////////////////////// + static std::string TimeToPrintableString(time_t t); + static void StartAsyncOp(std::function callback, std::string name); + static void AsyncOpThreadEntryPoint(std::function callback, FullscreenUI::ProgressCallback* progress); + static void CancelAsyncOpWithName(const std::string_view& name); + static void CancelAsyncOps(); + + ////////////////////////////////////////////////////////////////////////// + // Main + ////////////////////////////////////////////////////////////////////////// + static void UpdateGameDetails(std::string path, std::string serial, std::string title, u32 crc); + static void ToggleTheme(); + static void PauseForMenuOpen(); + static void ClosePauseMenu(); + static void OpenPauseSubMenu(PauseSubMenu submenu); + static void ReturnToMainWindow(); + static void DrawLandingWindow(); + static void DrawPauseMenu(MainWindowType type); + static void ExitFullscreenAndOpenURL(const std::string_view& url); + static void CopyTextToClipboard(std::string title, const std::string_view& text); + static void DrawAboutWindow(); + static void OpenAboutWindow(); + + static MainWindowType s_current_main_window = MainWindowType::None; + static PauseSubMenu s_current_pause_submenu = PauseSubMenu::None; + static bool s_initialized = false; + static bool s_tried_to_initialize = false; + static bool s_pause_menu_was_open = false; + static bool s_was_paused_on_quick_menu_open = false; + static bool s_about_window_open = false; + + // async operations (e.g. cover downloads) + using AsyncOpEntry = std::pair>; + static std::mutex s_async_op_mutex; + static std::deque s_async_ops; + + // local copies of the currently-running game + static std::string s_current_game_title; + static std::string s_current_game_subtitle; + static std::string s_current_game_serial; + static std::string s_current_game_path; + static u32 s_current_game_crc; + + ////////////////////////////////////////////////////////////////////////// + // Resources + ////////////////////////////////////////////////////////////////////////// + static bool LoadResources(); + static void DestroyResources(); + + static std::shared_ptr s_app_icon_texture; + static std::array, static_cast(GameDatabaseSchema::Compatibility::Perfect)> + s_game_compatibility_textures; + static std::shared_ptr s_fallback_disc_texture; + static std::shared_ptr s_fallback_exe_texture; + static std::vector> s_cleanup_textures; + + ////////////////////////////////////////////////////////////////////////// + // Landing + ////////////////////////////////////////////////////////////////////////// + static void SwitchToLanding(); + static ImGuiFullscreen::FileSelectorFilters GetDiscImageFilters(); + static void DoStartPath( + const std::string& path, std::optional state_index = std::nullopt, std::optional fast_boot = std::nullopt); + static void DoStartFile(); + static void DoStartBIOS(); + static void DoStartDisc(const std::string& drive); + static void DoStartDisc(); + static void DoToggleFrameLimit(); + static void DoToggleSoftwareRenderer(); + static void DoShutdown(bool save_state); + static void DoReset(); + static void DoChangeDiscFromFile(); + static void DoChangeDisc(); + static void DoRequestExit(); + static void DoToggleFullscreen(); + + ////////////////////////////////////////////////////////////////////////// + // Settings + ////////////////////////////////////////////////////////////////////////// + + static constexpr double INPUT_BINDING_TIMEOUT_SECONDS = 5.0; + static constexpr u32 NUM_MEMORY_CARD_PORTS = 2; + + static void SwitchToSettings(); + static void SwitchToGameSettings(); + static void SwitchToGameSettings(const std::string& path); + static void SwitchToGameSettings(const GameList::Entry* entry); + static void SwitchToGameSettings(const std::string_view& serial, u32 crc); + static void DrawSettingsWindow(); + static void DrawSummarySettingsPage(); + static void DrawInterfaceSettingsPage(); + static void DrawCoverDownloaderWindow(); + static void DrawBIOSSettingsPage(); + static void DrawEmulationSettingsPage(); + static void DrawGraphicsSettingsPage(); + static void DrawAudioSettingsPage(); + static void DrawMemoryCardSettingsPage(); + static void DrawCreateMemoryCardWindow(); + static void DrawControllerSettingsPage(); + static void DrawHotkeySettingsPage(); + static void DrawAchievementsSettingsPage(std::unique_lock& settings_lock); + static void DrawFoldersSettingsPage(); + static void DrawAchievementsLoginWindow(); + static void DrawAdvancedSettingsPage(); + static void DrawGameFixesSettingsPage(); + + static bool IsEditingGameSettings(SettingsInterface* bsi); + static SettingsInterface* GetEditingSettingsInterface(); + static SettingsInterface* GetEditingSettingsInterface(bool game_settings); + static bool ShouldShowAdvancedSettings(SettingsInterface* bsi); + static void SetSettingsChanged(SettingsInterface* bsi); + static bool GetEffectiveBoolSetting(SettingsInterface* bsi, const char* section, const char* key, bool default_value); + static s32 GetEffectiveIntSetting(SettingsInterface* bsi, const char* section, const char* key, s32 default_value); + static void DoCopyGameSettings(); + static void DoClearGameSettings(); + static void CopyGlobalControllerSettingsToGame(); + static void ResetControllerSettings(); + static void DoLoadInputProfile(); + static void DoSaveInputProfile(); + static void DoSaveInputProfile(const std::string& name); + static void DoResetSettings(); + + static bool DrawToggleSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + bool default_value, bool enabled = true, bool allow_tristate = true, float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, + ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + static void DrawIntListSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + int default_value, const char* const* options, size_t option_count, int option_offset = 0, bool enabled = true, + float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + static void DrawIntRangeSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + int default_value, int min_value, int max_value, const char* format = "%d", bool enabled = true, + float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + static void DrawIntSpinBoxSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + int default_value, int min_value, int max_value, int step_value, const char* format = "%d", bool enabled = true, + float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + static void DrawFloatRangeSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + float default_value, float min_value, float max_value, const char* format = "%f", float multiplier = 1.0f, bool enabled = true, + float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + static void DrawFloatSpinBoxSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, + const char* key, float default_value, float min_value, float max_value, float step_value, float multiplier, + const char* format = "%f", bool enabled = true, float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, + ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + static void DrawIntRectSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, + const char* left_key, int default_left, const char* top_key, int default_top, const char* right_key, int default_right, + const char* bottom_key, int default_bottom, int min_value, int max_value, const char* format = "%d", bool enabled = true, + float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + static void DrawStringListSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + const char* default_value, const char* const* options, const char* const* option_values, size_t option_count, bool enabled = true, + float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + static void DrawFloatListSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + float default_value, const char* const* options, const float* option_values, size_t option_count, bool enabled = true, + float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + static void DrawFolderSetting(SettingsInterface* bsi, const char* title, const char* section, const char* key, + const std::string& runtime_var, float height = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, + ImFont* summary_font = g_medium_font); + static void DrawClampingModeSetting(SettingsInterface* bsi, const char* title, const char* summary, bool vu); + static void PopulateGraphicsAdapterList(); + static void PopulateGameListDirectoryCache(SettingsInterface* si); + static void BeginInputBinding(SettingsInterface* bsi, PAD::ControllerBindingType type, const std::string_view& section, + const std::string_view& key, const std::string_view& display_name); + static void DrawInputBindingWindow(); + static void DrawInputBindingButton(SettingsInterface* bsi, PAD::ControllerBindingType type, const char* section, const char* name, + const char* display_name, bool show_type = true); + static void ClearInputBindingVariables(); + static void StartAutomaticBinding(u32 port); + + static SettingsPage s_settings_page = SettingsPage::Interface; + static std::unique_ptr s_game_settings_interface; + static std::unique_ptr s_game_settings_entry; + static std::vector> s_game_list_directories_cache; + static std::vector s_graphics_adapter_list_cache; + static std::vector s_fullscreen_mode_list_cache; + static std::vector s_hotkey_list_cache; + static std::atomic_bool s_settings_changed{false}; + static std::atomic_bool s_game_settings_changed{false}; + static PAD::ControllerBindingType s_input_binding_type = PAD::ControllerBindingType::Unknown; + static std::string s_input_binding_section; + static std::string s_input_binding_key; + static std::string s_input_binding_display_name; + static std::vector s_input_binding_new_bindings; + static Common::Timer s_input_binding_timer; + + ////////////////////////////////////////////////////////////////////////// + // Save State List + ////////////////////////////////////////////////////////////////////////// + struct SaveStateListEntry + { + std::string title; + std::string summary; + std::string path; + std::unique_ptr preview_texture; + time_t timestamp; + s32 slot; + }; + + static void InitializePlaceholderSaveStateListEntry( + SaveStateListEntry* li, const std::string& title, const std::string& serial, u32 crc, s32 slot); + static bool InitializeSaveStateListEntry( + SaveStateListEntry* li, const std::string& title, const std::string& serial, u32 crc, s32 slot); + static void ClearSaveStateEntryList(); + static u32 PopulateSaveStateListEntries(const std::string& title, const std::string& serial, u32 crc); + static bool OpenLoadStateSelectorForGame(const std::string& game_path); + static bool OpenSaveStateSelector(bool is_loading); + static void CloseSaveStateSelector(); + static void DrawSaveStateSelector(bool is_loading); + static bool OpenLoadStateSelectorForGameResume(const GameList::Entry* entry); + static void DrawResumeStateSelector(); + static void DoLoadState(std::string path); + + static std::vector s_save_state_selector_slots; + static std::string s_save_state_selector_game_path; + static s32 s_save_state_selector_submenu_index = -1; + static bool s_save_state_selector_open = false; + static bool s_save_state_selector_loading = true; + static bool s_save_state_selector_resuming = false; + + ////////////////////////////////////////////////////////////////////////// + // Game List + ////////////////////////////////////////////////////////////////////////// + static void DrawGameListWindow(); + static void DrawGameList(const ImVec2& heading_size); + static void DrawGameGrid(const ImVec2& heading_size); + static void HandleGameListActivate(const GameList::Entry* entry); + static void HandleGameListOptions(const GameList::Entry* entry); + static void DrawGameListSettingsPage(const ImVec2& heading_size); + static void SwitchToGameList(); + static void PopulateGameListEntryList(); + static HostDisplayTexture* GetTextureForGameListEntryType(GameList::EntryType type); + static HostDisplayTexture* GetGameListCover(const GameList::Entry* entry); + static HostDisplayTexture* GetCoverForCurrentGame(); + static std::string GetNotificationImageForGame(const GameList::Entry* entry); + static std::string GetNotificationImageForGame(const std::string& game_path); + + // Lazily populated cover images. + static std::unordered_map s_cover_image_map; + static std::vector s_game_list_sorted_entries; + static GameListPage s_game_list_page = GameListPage::Grid; + +#ifdef ENABLE_ACHIEVEMENTS + ////////////////////////////////////////////////////////////////////////// + // Achievements + ////////////////////////////////////////////////////////////////////////// + static void SwitchToAchievementsWindow(); + static void DrawAchievementsWindow(); + static void DrawAchievement(const Achievements::Achievement& cheevo); + static void DrawPrimedAchievementsIcons(); + static void DrawPrimedAchievementsList(); + static void SwitchToLeaderboardsWindow(); + static void DrawLeaderboardsWindow(); + static void DrawLeaderboardListEntry(const Achievements::Leaderboard& lboard); + static void DrawLeaderboardEntry( + const Achievements::LeaderboardEntry& lbEntry, float rank_column_width, float name_column_width, float column_spacing); + + static std::optional s_open_leaderboard_id; +#endif +} // namespace FullscreenUI + +////////////////////////////////////////////////////////////////////////// +// Utility +////////////////////////////////////////////////////////////////////////// + +std::string FullscreenUI::TimeToPrintableString(time_t t) +{ + struct tm lt = {}; +#ifdef _MSC_VER + localtime_s(<, &t); +#else + localtime_r(&t, <); +#endif + + char buf[256]; + std::strftime(buf, sizeof(buf), "%c", <); + return std::string(buf); +} + +void FullscreenUI::StartAsyncOp(std::function callback, std::string name) +{ + CancelAsyncOpWithName(name); + + std::unique_lock lock(s_async_op_mutex); + std::unique_ptr progress(std::make_unique(std::move(name))); + std::thread thread(AsyncOpThreadEntryPoint, std::move(callback), progress.get()); + s_async_ops.emplace_back(std::move(thread), std::move(progress)); +} + +void FullscreenUI::CancelAsyncOpWithName(const std::string_view& name) +{ + std::unique_lock lock(s_async_op_mutex); + for (auto iter = s_async_ops.begin(); iter != s_async_ops.end(); ++iter) + { + if (name != iter->second->GetName()) + continue; + + // move the thread out so it doesn't detach itself, then join + std::unique_ptr progress(std::move(iter->second)); + std::thread thread(std::move(iter->first)); + progress->SetCancelled(); + s_async_ops.erase(iter); + lock.unlock(); + if (thread.joinable()) + thread.join(); + lock.lock(); + break; + } +} + +void FullscreenUI::CancelAsyncOps() +{ + std::unique_lock lock(s_async_op_mutex); + while (!s_async_ops.empty()) + { + auto iter = s_async_ops.begin(); + + // move the thread out so it doesn't detach itself, then join + std::unique_ptr progress(std::move(iter->second)); + std::thread thread(std::move(iter->first)); + progress->SetCancelled(); + s_async_ops.erase(iter); + lock.unlock(); + if (thread.joinable()) + thread.join(); + lock.lock(); + } +} + +void FullscreenUI::AsyncOpThreadEntryPoint(std::function callback, FullscreenUI::ProgressCallback* progress) +{ + Threading::SetNameOfCurrentThread(fmt::format("{} Async Op", progress->GetName()).c_str()); + + callback(progress); + + // if we were removed from the list, it means we got cancelled, and the main thread is blocking + std::unique_lock lock(s_async_op_mutex); + for (auto iter = s_async_ops.begin(); iter != s_async_ops.end(); ++iter) + { + if (iter->second.get() == progress) + { + iter->first.detach(); + s_async_ops.erase(iter); + break; + } + } +} + +////////////////////////////////////////////////////////////////////////// +// Main +////////////////////////////////////////////////////////////////////////// + +bool FullscreenUI::Initialize() +{ + if (s_initialized) + return true; + + if (s_tried_to_initialize) + return false; + + ImGuiFullscreen::SetTheme(Host::GetBaseBoolSettingValue("UI", "UseLightFullscreenUITheme", false)); + ImGuiFullscreen::UpdateLayoutScale(); + + if (!ImGuiManager::AddFullscreenFontsIfMissing() || !ImGuiFullscreen::Initialize("fullscreenui/placeholder.png") || !LoadResources()) + { + DestroyResources(); + ImGuiFullscreen::Shutdown(true); + s_tried_to_initialize = true; + return false; + } + + s_initialized = true; + s_hotkey_list_cache = InputManager::GetHotkeyList(); + GetMTGS().SetRunIdle(true); + + if (VMManager::HasValidVM()) + { + UpdateGameDetails(VMManager::GetDiscPath(), VMManager::GetGameSerial(), VMManager::GetGameName(), VMManager::GetGameCRC()); + } + else + { + // only switch to landing if we weren't e.g. in settings + if (s_current_main_window == MainWindowType::None) + SwitchToLanding(); + } + + return true; +} + +bool FullscreenUI::IsInitialized() +{ + return s_initialized; +} + +bool FullscreenUI::HasActiveWindow() +{ + return s_current_main_window != MainWindowType::None || s_save_state_selector_open || ImGuiFullscreen::IsChoiceDialogOpen() || + ImGuiFullscreen::IsFileSelectorOpen(); +} + +void FullscreenUI::CheckForConfigChanges(const Pcsx2Config& old_config) +{ + if (!IsInitialized()) + return; + +#ifdef ENABLE_ACHIEVEMENTS + // If achievements got disabled, we might have the menu open... + // That means we're going to be reaching achievement state. + if (old_config.Achievements.Enabled && !EmuConfig.Achievements.Enabled) + { + // So, wait just in case. + GetMTGS().RunOnGSThread([]() { + if (s_current_main_window == MainWindowType::Achievements || s_current_main_window == MainWindowType::Leaderboards) + { + ReturnToMainWindow(); + } + }); + GetMTGS().WaitGS(false, false, false); + } +#endif +} + +void FullscreenUI::OnVMStarted() +{ + if (!IsInitialized()) + return; + + GetMTGS().RunOnGSThread([]() { + if (!IsInitialized()) + return; + + s_current_main_window = MainWindowType::None; + QueueResetFocus(); + }); +} + +void FullscreenUI::OnVMPaused() +{ + if (!IsInitialized()) + return; + + // Force vsync on. + GetMTGS().UpdateVSyncMode(); +} + +void FullscreenUI::OnVMResumed() +{ + if (!IsInitialized()) + return; + + // Restore game vsync. + GetMTGS().UpdateVSyncMode(); +} + +void FullscreenUI::OnVMDestroyed() +{ + if (!IsInitialized()) + return; + + GetMTGS().RunOnGSThread([]() { + if (!IsInitialized()) + return; + + s_pause_menu_was_open = false; + SwitchToLanding(); + GetMTGS().UpdateVSyncMode(); + }); +} + +void FullscreenUI::OnRunningGameChanged(std::string path, std::string serial, std::string title, u32 crc) +{ + if (!IsInitialized()) + return; + + GetMTGS().RunOnGSThread([path = std::move(path), serial = std::move(serial), title = std::move(title), crc]() { + if (!IsInitialized()) + return; + + UpdateGameDetails(std::move(path), std::move(serial), std::move(title), crc); + }); +} + +void FullscreenUI::UpdateGameDetails(std::string path, std::string serial, std::string title, u32 crc) +{ + if (!serial.empty()) + s_current_game_subtitle = fmt::format("{} / {:08X}", serial, crc); + else + s_current_game_subtitle = {}; + + s_current_game_title = std::move(title); + s_current_game_serial = std::move(serial); + s_current_game_path = std::move(path); + s_current_game_crc = crc; +} + +void FullscreenUI::ToggleTheme() +{ + const bool new_light = !Host::GetBaseBoolSettingValue("UI", "UseLightFullscreenUITheme", false); + Host::SetBaseBoolSettingValue("UI", "UseLightFullscreenUITheme", new_light); + Host::CommitBaseSettingChanges(); + ImGuiFullscreen::SetTheme(new_light); +} + +void FullscreenUI::PauseForMenuOpen() +{ + s_was_paused_on_quick_menu_open = (VMManager::GetState() == VMState::Paused); + if (Host::GetBoolSettingValue("UI", "PauseOnMenu", true) && !s_was_paused_on_quick_menu_open) + Host::RunOnCPUThread([]() { VMManager::SetPaused(true); }); + + s_pause_menu_was_open = true; +} + +void FullscreenUI::OpenPauseMenu() +{ + if (!VMManager::HasValidVM()) + return; + + GetMTGS().RunOnGSThread([]() { + if (!ImGuiManager::InitializeFullscreenUI() || s_current_main_window != MainWindowType::None) + return; + + PauseForMenuOpen(); + s_current_main_window = MainWindowType::PauseMenu; + s_current_pause_submenu = PauseSubMenu::None; + QueueResetFocus(); + }); +} + +void FullscreenUI::ClosePauseMenu() +{ + if (!IsInitialized() || !VMManager::HasValidVM()) + return; + + if (VMManager::GetState() == VMState::Paused && !s_was_paused_on_quick_menu_open) + Host::RunOnCPUThread([]() { VMManager::SetPaused(false); }); + + s_current_main_window = MainWindowType::None; + s_current_pause_submenu = PauseSubMenu::None; + s_pause_menu_was_open = false; + QueueResetFocus(); +} + +void FullscreenUI::OpenPauseSubMenu(PauseSubMenu submenu) +{ + s_current_main_window = MainWindowType::PauseMenu; + s_current_pause_submenu = submenu; + QueueResetFocus(); +} + +void FullscreenUI::Shutdown(bool clear_state) +{ + if (clear_state) + { + CancelAsyncOps(); + CloseSaveStateSelector(); + s_cover_image_map.clear(); + s_game_list_sorted_entries = {}; + s_game_list_directories_cache = {}; + s_fullscreen_mode_list_cache = {}; + s_graphics_adapter_list_cache = {}; + s_current_game_title = {}; + s_current_game_subtitle = {}; + s_current_game_serial = {}; + s_current_game_path = {}; + s_current_game_crc = 0; + + s_current_main_window = MainWindowType::None; + s_current_pause_submenu = PauseSubMenu::None; + s_pause_menu_was_open = false; + s_was_paused_on_quick_menu_open = false; + s_about_window_open = false; + } + s_hotkey_list_cache = {}; + DestroyResources(); + ImGuiFullscreen::Shutdown(clear_state); + s_initialized = false; + s_tried_to_initialize = false; +} + +void FullscreenUI::Render() +{ + if (!s_initialized) + return; + + for (std::unique_ptr& tex : s_cleanup_textures) + tex.reset(); + s_cleanup_textures.clear(); + ImGuiFullscreen::UploadAsyncTextures(); + + ImGuiFullscreen::BeginLayout(); + +#ifdef ENABLE_ACHIEVEMENTS + // Primed achievements must come first, because we don't want the pause screen to be behind them. + if (EmuConfig.Achievements.PrimedIndicators && s_current_main_window == MainWindowType::None && + Achievements::GetPrimedAchievementCount() > 0) + { + DrawPrimedAchievementsIcons(); + } +#endif + + switch (s_current_main_window) + { + case MainWindowType::Landing: + DrawLandingWindow(); + break; + case MainWindowType::GameList: + DrawGameListWindow(); + break; + case MainWindowType::Settings: + DrawSettingsWindow(); + break; + case MainWindowType::PauseMenu: + DrawPauseMenu(s_current_main_window); + break; +#ifdef ENABLE_ACHIEVEMENTS + case MainWindowType::Achievements: + DrawAchievementsWindow(); + break; + case MainWindowType::Leaderboards: + DrawLeaderboardsWindow(); + break; +#endif + default: + break; + } + + if (s_save_state_selector_open) + { + if (s_save_state_selector_resuming) + DrawResumeStateSelector(); + else + DrawSaveStateSelector(s_save_state_selector_loading); + } + + if (s_about_window_open) + DrawAboutWindow(); + + if (s_input_binding_type != PAD::ControllerBindingType::Unknown) + DrawInputBindingWindow(); + + ImGuiFullscreen::EndLayout(); + + if (s_settings_changed.load(std::memory_order_relaxed)) + { + Host::CommitBaseSettingChanges(); + Host::RunOnCPUThread([]() { VMManager::ApplySettings(); }); + s_settings_changed.store(false, std::memory_order_release); + } + if (s_game_settings_changed.load(std::memory_order_relaxed)) + { + if (s_game_settings_interface) + { + s_game_settings_interface->Save(); + if (VMManager::HasValidVM()) + Host::RunOnCPUThread([]() { VMManager::ReloadGameSettings(); }); + } + s_game_settings_changed.store(false, std::memory_order_release); + } + + ImGuiFullscreen::ResetCloseMenuIfNeeded(); +} + +void FullscreenUI::InvalidateCoverCache() +{ + if (!IsInitialized()) + return; + + GetMTGS().RunOnGSThread([]() { s_cover_image_map.clear(); }); +} + +void FullscreenUI::ReturnToMainWindow() +{ + if (s_pause_menu_was_open) + ClosePauseMenu(); + + s_current_main_window = VMManager::HasValidVM() ? MainWindowType::None : MainWindowType::Landing; +} + +bool FullscreenUI::LoadResources() +{ + s_app_icon_texture = LoadTexture("icons/AppIconLarge.png"); + + s_fallback_disc_texture = LoadTexture("fullscreenui/media-cdrom.png"); + s_fallback_exe_texture = LoadTexture("fullscreenui/applications-system.png"); + + for (u32 i = static_cast(GameDatabaseSchema::Compatibility::Nothing); + i <= static_cast(GameDatabaseSchema::Compatibility::Perfect); i++) + { + s_game_compatibility_textures[i - 1] = LoadTexture(fmt::format("icons/star-{}.png", i - 1).c_str()); + } + + return true; +} + +void FullscreenUI::DestroyResources() +{ + s_app_icon_texture.reset(); + s_fallback_exe_texture.reset(); + s_fallback_disc_texture.reset(); + for (auto& tex : s_game_compatibility_textures) + tex.reset(); + for (auto& tex : s_cleanup_textures) + tex.reset(); +} + +////////////////////////////////////////////////////////////////////////// +// Utility +////////////////////////////////////////////////////////////////////////// + +ImGuiFullscreen::FileSelectorFilters FullscreenUI::GetDiscImageFilters() +{ + return {"*.bin", "*.iso", "*.cue", "*.chd", "*.cso", "*.gz", "*.elf", "*.irx", "*.gs", "*.gs.xz", "*.gs.zst", "*.dump"}; +} + +void FullscreenUI::DoStartPath(const std::string& path, std::optional state_index, std::optional fast_boot) +{ + VMBootParameters params; + params.filename = path; + params.state_index = state_index; + params.fast_boot = fast_boot; + + // switch to nothing, we'll get brought back if init fails + const MainWindowType prev_window = s_current_main_window; + s_current_main_window = MainWindowType::None; + + Host::RunOnCPUThread([params = std::move(params), prev_window]() { + if (VMManager::HasValidVM()) + return; + + if (VMManager::Initialize(std::move(params))) + VMManager::SetState(VMState::Running); + else + s_current_main_window = prev_window; + }); +} + +void FullscreenUI::DoStartFile() +{ + auto callback = [](const std::string& path) { + if (!path.empty()) + DoStartPath(path); + + QueueResetFocus(); + CloseFileSelector(); + }; + + OpenFileSelector(ICON_FA_FOLDER_OPEN " Select Disc Image", false, std::move(callback), GetDiscImageFilters()); +} + +void FullscreenUI::DoStartBIOS() +{ + Host::RunOnCPUThread([]() { + if (VMManager::HasValidVM()) + return; + + VMBootParameters params; + if (VMManager::Initialize(std::move(params))) + VMManager::SetState(VMState::Running); + else + SwitchToLanding(); + }); + + // switch to nothing, we'll get brought back if init fails + s_current_main_window = MainWindowType::None; +} + +void FullscreenUI::DoStartDisc(const std::string& drive) +{ + Host::RunOnCPUThread([drive]() { + if (VMManager::HasValidVM()) + return; + + VMBootParameters params; + params.filename = std::move(drive); + params.source_type = CDVD_SourceType::Disc; + if (VMManager::Initialize(params)) + VMManager::SetState(VMState::Running); + else + SwitchToLanding(); + }); +} + +void FullscreenUI::DoStartDisc() +{ + std::vector devices(GetOpticalDriveList()); + if (devices.empty()) + { + ShowToast(std::string(), + "Could not find any CD/DVD-ROM devices. Please ensure you have a drive connected and sufficient permissions to access it."); + return; + } + + // if there's only one, select it automatically + if (devices.size() == 1) + { + DoStartDisc(devices.front()); + return; + } + + ImGuiFullscreen::ChoiceDialogOptions options; + for (std::string& drive : devices) + options.emplace_back(std::move(drive), false); + OpenChoiceDialog(ICON_FA_COMPACT_DISC " Select Disc Drive", false, std::move(options), [](s32, const std::string& path, bool) { + DoStartDisc(path); + CloseChoiceDialog(); + QueueResetFocus(); + }); +} + +void FullscreenUI::DoToggleFrameLimit() +{ + Host::RunOnCPUThread([]() { + if (!VMManager::HasValidVM()) + return; + + VMManager::SetLimiterMode( + (EmuConfig.LimiterMode != LimiterModeType::Unlimited) ? LimiterModeType::Unlimited : LimiterModeType::Nominal); + }); +} + +void FullscreenUI::DoToggleSoftwareRenderer() +{ + Host::RunOnCPUThread([]() { + if (!VMManager::HasValidVM()) + return; + + GetMTGS().ToggleSoftwareRendering(); + }); +} + +void FullscreenUI::DoShutdown(bool save_state) +{ + Host::RunOnCPUThread([save_state]() { Host::RequestVMShutdown(false, save_state, save_state); }); +} + +void FullscreenUI::DoReset() +{ + Host::RunOnCPUThread([]() { + if (!VMManager::HasValidVM()) + return; + + VMManager::Reset(); + }); +} + +void FullscreenUI::DoChangeDiscFromFile() +{ + auto callback = [](const std::string& path) { + if (!path.empty()) + { + if (!VMManager::IsDiscFileName(path)) + { + ShowToast({}, fmt::format("{} is not a valid disc image.", FileSystem::GetDisplayNameFromPath(path))); + } + else + { + Host::RunOnCPUThread([path]() { VMManager::ChangeDisc(CDVD_SourceType::Iso, std::move(path)); }); + } + } + + QueueResetFocus(); + CloseFileSelector(); + ReturnToMainWindow(); + }; + + OpenFileSelector(ICON_FA_COMPACT_DISC " Select Disc Image", false, std::move(callback), GetDiscImageFilters(), + std::string(Path::GetDirectory(s_current_game_path))); +} + +void FullscreenUI::DoChangeDisc() +{ + DoChangeDiscFromFile(); +} + +void FullscreenUI::DoRequestExit() +{ + Host::RunOnCPUThread([]() { Host::RequestExit(EmuConfig.SaveStateOnShutdown); }); +} + +void FullscreenUI::DoToggleFullscreen() +{ + Host::RunOnCPUThread([]() { Host::SetFullscreen(!Host::IsFullscreen()); }); +} + +////////////////////////////////////////////////////////////////////////// +// Landing Window +////////////////////////////////////////////////////////////////////////// + +void FullscreenUI::SwitchToLanding() +{ + s_current_main_window = MainWindowType::Landing; + QueueResetFocus(); +} + +void FullscreenUI::DrawLandingWindow() +{ + BeginFullscreenColumns(nullptr, 0.0f, true); + + if (BeginFullscreenColumnWindow(0.0f, -710.0f, "logo", UIPrimaryDarkColor)) + { + const float image_size = LayoutScale(380.f); + ImGui::SetCursorPos( + ImVec2((ImGui::GetWindowWidth() * 0.5f) - (image_size * 0.5f), (ImGui::GetWindowHeight() * 0.5f) - (image_size * 0.5f))); + ImGui::Image(s_app_icon_texture->GetHandle(), ImVec2(image_size, image_size)); + } + EndFullscreenColumnWindow(); + + if (BeginFullscreenColumnWindow(-710.0f, 0.0f, "menu", UIBackgroundColor)) + { + ResetFocusHere(); + + BeginMenuButtons(6, 0.5f); + + if (MenuButton(ICON_FA_LIST " Game List", "Launch a game from images scanned from your game directories.")) + { + SwitchToGameList(); + } + + if (MenuButton(ICON_FA_FOLDER_OPEN " Start File", "Launch a game by selecting a file/disc image.")) + { + DoStartFile(); + } + + if (MenuButton(ICON_FA_TOOLBOX " Start BIOS", "Start the console without any disc inserted.")) + { + DoStartBIOS(); + } + + if (MenuButton(ICON_FA_COMPACT_DISC " Start Disc", "Start a game from a disc in your PC's DVD drive.")) + { + DoStartDisc(); + } + + if (MenuButton(ICON_FA_SLIDERS_H " Settings", "Change settings for the emulator.")) + SwitchToSettings(); + + if (MenuButton(ICON_FA_SIGN_OUT_ALT " Exit", "Exits the program.")) + { + DoRequestExit(); + } + + { + ImVec2 fullscreen_pos; + if (FloatingButton(ICON_FA_WINDOW_CLOSE, 0.0f, 0.0f, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font, &fullscreen_pos)) + DoRequestExit(); + + if (FloatingButton(ICON_FA_EXPAND, fullscreen_pos.x, 0.0f, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font, &fullscreen_pos)) + DoToggleFullscreen(); + + if (FloatingButton( + ICON_FA_QUESTION_CIRCLE, fullscreen_pos.x, 0.0f, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font, &fullscreen_pos)) + OpenAboutWindow(); + + if (FloatingButton(ICON_FA_LIGHTBULB, fullscreen_pos.x, 0.0f, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font, &fullscreen_pos)) + ToggleTheme(); + } + + EndMenuButtons(); + + const ImVec2 rev_size(g_medium_font->CalcTextSizeA(g_medium_font->FontSize, FLT_MAX, 0.0f, GIT_REV)); + ImGui::SetCursorPos( + ImVec2(ImGui::GetWindowWidth() - rev_size.x - LayoutScale(20.0f), ImGui::GetWindowHeight() - rev_size.y - LayoutScale(20.0f))); + ImGui::PushFont(g_medium_font); + ImGui::Text(GIT_REV); + ImGui::PopFont(); + } + + EndFullscreenColumnWindow(); + + EndFullscreenColumns(); +} + +bool FullscreenUI::IsEditingGameSettings(SettingsInterface* bsi) +{ + return (bsi == s_game_settings_interface.get()); +} + +SettingsInterface* FullscreenUI::GetEditingSettingsInterface() +{ + return s_game_settings_interface ? s_game_settings_interface.get() : Host::Internal::GetBaseSettingsLayer(); +} + +SettingsInterface* FullscreenUI::GetEditingSettingsInterface(bool game_settings) +{ + return (game_settings && s_game_settings_interface) ? s_game_settings_interface.get() : Host::Internal::GetBaseSettingsLayer(); +} + +bool FullscreenUI::ShouldShowAdvancedSettings(SettingsInterface* bsi) +{ + return IsEditingGameSettings(bsi) ? Host::GetBaseBoolSettingValue("UI", "ShowAdvancedSettings", false) : + bsi->GetBoolValue("UI", "ShowAdvancedSettings", false); +} + +void FullscreenUI::SetSettingsChanged(SettingsInterface* bsi) +{ + if (bsi && bsi == s_game_settings_interface.get()) + s_game_settings_changed.store(true, std::memory_order_release); + else + s_settings_changed.store(true, std::memory_order_release); +} + +bool FullscreenUI::GetEffectiveBoolSetting(SettingsInterface* bsi, const char* section, const char* key, bool default_value) +{ + if (IsEditingGameSettings(bsi)) + { + std::optional value = bsi->GetOptionalBoolValue(section, key, std::nullopt); + if (value.has_value()) + return value.value(); + } + + return Host::Internal::GetBaseSettingsLayer()->GetBoolValue(section, key, default_value); +} + +s32 FullscreenUI::GetEffectiveIntSetting(SettingsInterface* bsi, const char* section, const char* key, s32 default_value) +{ + if (IsEditingGameSettings(bsi)) + { + std::optional value = bsi->GetOptionalIntValue(section, key, std::nullopt); + if (value.has_value()) + return value.value(); + } + + return Host::Internal::GetBaseSettingsLayer()->GetIntValue(section, key, default_value); +} + +void FullscreenUI::DrawInputBindingButton(SettingsInterface* bsi, PAD::ControllerBindingType type, const char* section, const char* name, + const char* display_name, bool show_type) +{ + std::string title(fmt::format("{}/{}", section, name)); + + ImRect bb; + bool visible, hovered, clicked; + clicked = MenuButtonFrame(title.c_str(), true, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT, &visible, &hovered, &bb.Min, &bb.Max); + if (!visible) + return; + + const float midpoint = bb.Min.y + g_large_font->FontSize + LayoutScale(4.0f); + const ImRect title_bb(bb.Min, ImVec2(bb.Max.x, midpoint)); + const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), bb.Max); + + if (show_type) + { + switch (type) + { + case PAD::ControllerBindingType::Button: + title = fmt::format(ICON_FA_DOT_CIRCLE " {}", display_name); + break; + case PAD::ControllerBindingType::Axis: + case PAD::ControllerBindingType::HalfAxis: + title = fmt::format(ICON_FA_BULLSEYE " {}", display_name); + break; + case PAD::ControllerBindingType::Motor: + title = fmt::format(ICON_FA_BELL " {}", display_name); + break; + case PAD::ControllerBindingType::Macro: + title = fmt::format(ICON_FA_PIZZA_SLICE " {}", display_name); + break; + default: + title = display_name; + break; + } + } + + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped( + title_bb.Min, title_bb.Max, show_type ? title.c_str() : display_name, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + const std::string value(bsi->GetStringValue(section, name)); + ImGui::PushFont(g_medium_font); + ImGui::RenderTextClipped( + summary_bb.Min, summary_bb.Max, value.empty() ? "No Binding" : value.c_str(), nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + + if (clicked) + { + BeginInputBinding(bsi, type, section, name, display_name); + } + else if (ImGui::IsItemClicked(ImGuiMouseButton_Right) || ImGui::IsNavInputTest(ImGuiNavInput_Input, ImGuiNavReadMode_Pressed)) + { + bsi->DeleteValue(section, name); + SetSettingsChanged(bsi); + } +} + +void FullscreenUI::ClearInputBindingVariables() +{ + s_input_binding_type = PAD::ControllerBindingType::Unknown; + s_input_binding_section = {}; + s_input_binding_key = {}; + s_input_binding_display_name = {}; + s_input_binding_new_bindings = {}; +} + +void FullscreenUI::BeginInputBinding(SettingsInterface* bsi, PAD::ControllerBindingType type, const std::string_view& section, + const std::string_view& key, const std::string_view& display_name) +{ + if (s_input_binding_type != PAD::ControllerBindingType::Unknown) + { + InputManager::RemoveHook(); + ClearInputBindingVariables(); + } + + s_input_binding_type = type; + s_input_binding_section = section; + s_input_binding_key = key; + s_input_binding_display_name = display_name; + s_input_binding_new_bindings = {}; + s_input_binding_timer.Reset(); + + const bool game_settings = IsEditingGameSettings(bsi); + + InputManager::SetHook([game_settings](InputBindingKey key, float value) -> InputInterceptHook::CallbackResult { + // holding the settings lock here will protect the input binding list + auto lock = Host::GetSettingsLock(); + + const float abs_value = std::abs(value); + + for (InputBindingKey other_key : s_input_binding_new_bindings) + { + if (other_key.MaskDirection() == key.MaskDirection()) + { + if (abs_value < 0.5f) + { + // if this key is in our new binding list, it's a "release", and we're done + SettingsInterface* bsi = GetEditingSettingsInterface(game_settings); + const std::string new_binding(InputManager::ConvertInputBindingKeysToString( + s_input_binding_new_bindings.data(), s_input_binding_new_bindings.size())); + bsi->SetStringValue(s_input_binding_section.c_str(), s_input_binding_key.c_str(), new_binding.c_str()); + SetSettingsChanged(bsi); + ClearInputBindingVariables(); + return InputInterceptHook::CallbackResult::RemoveHookAndStopProcessingEvent; + } + + // otherwise, keep waiting + return InputInterceptHook::CallbackResult::StopProcessingEvent; + } + } + + // new binding, add it to the list, but wait for a decent distance first, and then wait for release + if (abs_value >= 0.5f) + { + InputBindingKey key_to_add = key; + key_to_add.modifier = (value < 0.0f) ? InputModifier::Negate : InputModifier::None; + s_input_binding_new_bindings.push_back(key_to_add); + } + + return InputInterceptHook::CallbackResult::StopProcessingEvent; + }); +} + +void FullscreenUI::DrawInputBindingWindow() +{ + pxAssert(s_input_binding_type != PAD::ControllerBindingType::Unknown); + + const double time_remaining = INPUT_BINDING_TIMEOUT_SECONDS - s_input_binding_timer.GetTimeSeconds(); + if (time_remaining <= 0.0) + { + InputManager::RemoveHook(); + ClearInputBindingVariables(); + return; + } + + const char* title = ICON_FA_GAMEPAD " Set Input Binding"; + ImGui::SetNextWindowSize(LayoutScale(500.0f, 0.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + ImGui::OpenPopup(title); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, + LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING)); + + if (ImGui::BeginPopupModal(title, nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoInputs)) + { + ImGui::TextWrapped("Setting %s binding %s.", s_input_binding_section.c_str(), s_input_binding_display_name.c_str()); + ImGui::TextUnformatted("Push a controller button or axis now."); + ImGui::NewLine(); + ImGui::Text("Timing out in %.0f seconds...", time_remaining); + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(4); + ImGui::PopFont(); +} + +bool FullscreenUI::DrawToggleSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + bool default_value, bool enabled, bool allow_tristate, float height, ImFont* font, ImFont* summary_font) +{ + if (!allow_tristate || !IsEditingGameSettings(bsi)) + { + bool value = bsi->GetBoolValue(section, key, default_value); + if (!ToggleButton(title, summary, &value, enabled, height, font, summary_font)) + return false; + + bsi->SetBoolValue(section, key, value); + } + else + { + std::optional value(false); + if (!bsi->GetBoolValue(section, key, &value.value())) + value.reset(); + if (!ThreeWayToggleButton(title, summary, &value, enabled, height, font, summary_font)) + return false; + + if (value.has_value()) + bsi->SetBoolValue(section, key, value.value()); + else + bsi->DeleteValue(section, key); + } + + SetSettingsChanged(bsi); + return true; +} + +void FullscreenUI::DrawIntListSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + int default_value, const char* const* options, size_t option_count, int option_offset, bool enabled, float height, ImFont* font, + ImFont* summary_font) +{ + if (options && option_count == 0) + { + while (options[option_count] != nullptr) + option_count++; + } + + const bool game_settings = IsEditingGameSettings(bsi); + const std::optional value = + bsi->GetOptionalIntValue(section, key, game_settings ? std::nullopt : std::optional(default_value)); + const int index = value.has_value() ? (value.value() - option_offset) : std::numeric_limits::min(); + const char* value_text = (value.has_value()) ? + ((index < 0 || static_cast(index) >= option_count) ? "Unknown" : options[index]) : + "Use Global Setting"; + + if (MenuButtonWithValue(title, summary, value_text, enabled, height, font, summary_font)) + { + ImGuiFullscreen::ChoiceDialogOptions cd_options; + cd_options.reserve(option_count + 1); + if (game_settings) + cd_options.emplace_back("Use Global Setting", !value.has_value()); + for (size_t i = 0; i < option_count; i++) + cd_options.emplace_back(options[i], (i == static_cast(index))); + OpenChoiceDialog(title, false, std::move(cd_options), + [game_settings, section, key, option_offset](s32 index, const std::string& title, bool checked) { + if (index >= 0) + { + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(game_settings); + if (game_settings) + { + if (index == 0) + bsi->DeleteValue(section, key); + else + bsi->SetIntValue(section, key, index - 1 + option_offset); + } + else + { + bsi->SetIntValue(section, key, index + option_offset); + } + + SetSettingsChanged(bsi); + } + + CloseChoiceDialog(); + }); + } +} + +void FullscreenUI::DrawIntRangeSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, const char* key, + int default_value, int min_value, int max_value, const char* format, bool enabled, float height, ImFont* font, ImFont* summary_font) +{ + const bool game_settings = IsEditingGameSettings(bsi); + const std::optional value = + bsi->GetOptionalIntValue(section, key, game_settings ? std::nullopt : std::optional(default_value)); + const std::string value_text( + value.has_value() ? StringUtil::StdStringFromFormat(format, value.value()) : std::string("Use Global Setting")); + + if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font)) + ImGui::OpenPopup(title); + + ImGui::SetNextWindowSize(LayoutScale(500.0f, 190.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, + LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING)); + + bool is_open = true; + if (ImGui::BeginPopupModal(title, &is_open, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + BeginMenuButtons(); + + const float end = ImGui::GetCurrentWindow()->WorkRect.GetWidth(); + ImGui::SetNextItemWidth(end); + s32 dlg_value = static_cast(value.value_or(default_value)); + if (ImGui::SliderInt("##value", &dlg_value, min_value, max_value, format, ImGuiSliderFlags_NoInput)) + { + if (IsEditingGameSettings(bsi) && dlg_value == default_value) + bsi->DeleteValue(section, key); + else + bsi->SetIntValue(section, key, dlg_value); + + SetSettingsChanged(bsi); + } + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + if (MenuButtonWithoutSummary("OK", true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, g_large_font, ImVec2(0.5f, 0.0f))) + { + ImGui::CloseCurrentPopup(); + } + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(4); + ImGui::PopFont(); +} + +void FullscreenUI::DrawIntSpinBoxSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, + const char* key, int default_value, int min_value, int max_value, int step_value, const char* format, bool enabled, float height, + ImFont* font, ImFont* summary_font) +{ + const bool game_settings = IsEditingGameSettings(bsi); + const std::optional value = + bsi->GetOptionalIntValue(section, key, game_settings ? std::nullopt : std::optional(default_value)); + const std::string value_text( + value.has_value() ? StringUtil::StdStringFromFormat(format, value.value()) : std::string("Use Global Setting")); + + static bool manual_input = false; + + if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font)) + { + ImGui::OpenPopup(title); + manual_input = false; + } + + ImGui::SetNextWindowSize(LayoutScale(500.0f, 190.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, + LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING)); + + bool is_open = true; + if (ImGui::BeginPopupModal(title, &is_open, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + BeginMenuButtons(); + + s32 dlg_value = static_cast(value.value_or(default_value)); + bool dlg_value_changed = false; + + char str_value[32]; + std::snprintf(str_value, std::size(str_value), format, dlg_value); + + if (manual_input) + { + const float end = ImGui::GetCurrentWindow()->WorkRect.GetWidth(); + ImGui::SetNextItemWidth(end); + + if (ImGui::InputText("##value", str_value, std::size(str_value), ImGuiInputTextFlags_CharsDecimal)) + { + dlg_value = StringUtil::FromChars(str_value).value_or(dlg_value); + dlg_value_changed = true; + } + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + } + else + { + const ImVec2& padding(ImGui::GetStyle().FramePadding); + ImVec2 button_pos(ImGui::GetCursorPos()); + + // Align value text in middle. + ImGui::SetCursorPosY( + button_pos.y + ((LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY) + padding.y * 2.0f) - g_large_font->FontSize) * 0.5f); + ImGui::TextUnformatted(str_value); + + s32 step = 0; + if (FloatingButton( + ICON_FA_CHEVRON_UP, padding.x, button_pos.y, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font, &button_pos, true)) + { + step = step_value; + } + if (FloatingButton(ICON_FA_CHEVRON_DOWN, button_pos.x - padding.x, button_pos.y, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font, + &button_pos, true)) + { + step = -step_value; + } + if (FloatingButton( + ICON_FA_KEYBOARD, button_pos.x - padding.x, button_pos.y, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font, &button_pos)) + { + manual_input = true; + } + if (FloatingButton( + ICON_FA_TRASH, button_pos.x - padding.x, button_pos.y, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font, &button_pos)) + { + dlg_value = default_value; + dlg_value_changed = true; + } + + if (step != 0) + { + dlg_value += step; + dlg_value_changed = true; + } + + ImGui::SetCursorPosY(button_pos.y + (padding.y * 2.0f) + LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + 10.0f)); + } + + if (dlg_value_changed) + { + dlg_value = std::clamp(dlg_value, min_value, max_value); + if (IsEditingGameSettings(bsi) && dlg_value == default_value) + bsi->DeleteValue(section, key); + else + bsi->SetIntValue(section, key, dlg_value); + + SetSettingsChanged(bsi); + } + + if (MenuButtonWithoutSummary("OK", true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, g_large_font, ImVec2(0.5f, 0.0f))) + { + ImGui::CloseCurrentPopup(); + } + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(4); + ImGui::PopFont(); +} + +void FullscreenUI::DrawFloatRangeSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, + const char* key, float default_value, float min_value, float max_value, const char* format, float multiplier, bool enabled, + float height, ImFont* font, ImFont* summary_font) +{ + const bool game_settings = IsEditingGameSettings(bsi); + const std::optional value = + bsi->GetOptionalFloatValue(section, key, game_settings ? std::nullopt : std::optional(default_value)); + const std::string value_text( + value.has_value() ? StringUtil::StdStringFromFormat(format, value.value() * multiplier) : std::string("Use Global Setting")); + + if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font)) + ImGui::OpenPopup(title); + + ImGui::SetNextWindowSize(LayoutScale(500.0f, 190.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, + LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING)); + + bool is_open = true; + if (ImGui::BeginPopupModal(title, &is_open, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + BeginMenuButtons(); + + const float end = ImGui::GetCurrentWindow()->WorkRect.GetWidth(); + ImGui::SetNextItemWidth(end); + float dlg_value = value.value_or(default_value) * multiplier; + if (ImGui::SliderFloat("##value", &dlg_value, min_value * multiplier, max_value * multiplier, format, ImGuiSliderFlags_NoInput)) + { + dlg_value /= multiplier; + + if (IsEditingGameSettings(bsi) && dlg_value == default_value) + bsi->DeleteValue(section, key); + else + bsi->SetFloatValue(section, key, dlg_value); + + SetSettingsChanged(bsi); + } + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + if (MenuButtonWithoutSummary("OK", true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, g_large_font, ImVec2(0.5f, 0.0f))) + { + ImGui::CloseCurrentPopup(); + } + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(4); + ImGui::PopFont(); +} + +void FullscreenUI::DrawFloatSpinBoxSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, + const char* key, float default_value, float min_value, float max_value, float step_value, float multiplier, const char* format, + bool enabled, float height, ImFont* font, ImFont* summary_font) +{ + const bool game_settings = IsEditingGameSettings(bsi); + const std::optional value = + bsi->GetOptionalFloatValue(section, key, game_settings ? std::nullopt : std::optional(default_value)); + const std::string value_text( + value.has_value() ? StringUtil::StdStringFromFormat(format, value.value() * multiplier) : std::string("Use Global Setting")); + + static bool manual_input = false; + + if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font)) + { + ImGui::OpenPopup(title); + manual_input = false; + } + + ImGui::SetNextWindowSize(LayoutScale(500.0f, 190.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, + LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING)); + + bool is_open = true; + if (ImGui::BeginPopupModal(title, &is_open, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + BeginMenuButtons(); + + float dlg_value = value.value_or(default_value) * multiplier; + bool dlg_value_changed = false; + + char str_value[32]; + std::snprintf(str_value, std::size(str_value), format, dlg_value); + + if (manual_input) + { + const float end = ImGui::GetCurrentWindow()->WorkRect.GetWidth(); + ImGui::SetNextItemWidth(end); + + // round trip to drop any suffixes (e.g. percent) + if (auto tmp_value = StringUtil::FromChars(str_value); tmp_value.has_value()) + { + std::snprintf(str_value, std::size(str_value), + ((tmp_value.value() - std::floor(tmp_value.value())) < 0.01f) ? "%.0f" : "%f", tmp_value.value()); + } + + if (ImGui::InputText("##value", str_value, std::size(str_value), ImGuiInputTextFlags_CharsDecimal)) + { + dlg_value = StringUtil::FromChars(str_value).value_or(dlg_value); + dlg_value_changed = true; + } + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + } + else + { + const ImVec2& padding(ImGui::GetStyle().FramePadding); + ImVec2 button_pos(ImGui::GetCursorPos()); + + // Align value text in middle. + ImGui::SetCursorPosY( + button_pos.y + ((LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY) + padding.y * 2.0f) - g_large_font->FontSize) * 0.5f); + ImGui::TextUnformatted(str_value); + + float step = 0; + if (FloatingButton( + ICON_FA_CHEVRON_UP, padding.x, button_pos.y, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font, &button_pos, true)) + { + step = step_value; + } + if (FloatingButton(ICON_FA_CHEVRON_DOWN, button_pos.x - padding.x, button_pos.y, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font, + &button_pos, true)) + { + step = -step_value; + } + if (FloatingButton( + ICON_FA_KEYBOARD, button_pos.x - padding.x, button_pos.y, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font, &button_pos)) + { + manual_input = true; + } + if (FloatingButton( + ICON_FA_TRASH, button_pos.x - padding.x, button_pos.y, -1.0f, -1.0f, -1.0f, 0.0f, true, g_large_font, &button_pos)) + { + dlg_value = default_value * multiplier; + dlg_value_changed = true; + } + + if (step != 0) + { + dlg_value += step * multiplier; + dlg_value_changed = true; + } + + ImGui::SetCursorPosY(button_pos.y + (padding.y * 2.0f) + LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + 10.0f)); + } + + if (dlg_value_changed) + { + dlg_value = std::clamp(dlg_value / multiplier, min_value, max_value); + if (IsEditingGameSettings(bsi) && dlg_value == default_value) + bsi->DeleteValue(section, key); + else + bsi->SetFloatValue(section, key, dlg_value); + + SetSettingsChanged(bsi); + } + + if (MenuButtonWithoutSummary("OK", true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, g_large_font, ImVec2(0.5f, 0.0f))) + { + ImGui::CloseCurrentPopup(); + } + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(4); + ImGui::PopFont(); +} + +void FullscreenUI::DrawIntRectSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, + const char* left_key, int default_left, const char* top_key, int default_top, const char* right_key, int default_right, + const char* bottom_key, int default_bottom, int min_value, int max_value, const char* format, bool enabled, float height, ImFont* font, + ImFont* summary_font) +{ + const bool game_settings = IsEditingGameSettings(bsi); + const std::optional left_value = + bsi->GetOptionalIntValue(section, left_key, game_settings ? std::nullopt : std::optional(default_left)); + const std::optional top_value = + bsi->GetOptionalIntValue(section, top_key, game_settings ? std::nullopt : std::optional(default_top)); + const std::optional right_value = + bsi->GetOptionalIntValue(section, right_key, game_settings ? std::nullopt : std::optional(default_right)); + const std::optional bottom_value = + bsi->GetOptionalIntValue(section, bottom_key, game_settings ? std::nullopt : std::optional(default_bottom)); + const std::string value_text(fmt::format("{}/{}/{}/{}", + left_value.has_value() ? StringUtil::StdStringFromFormat(format, left_value.value()) : std::string("Default"), + top_value.has_value() ? StringUtil::StdStringFromFormat(format, top_value.value()) : std::string("Default"), + right_value.has_value() ? StringUtil::StdStringFromFormat(format, right_value.value()) : std::string("Default"), + bottom_value.has_value() ? StringUtil::StdStringFromFormat(format, bottom_value.value()) : std::string("Default"))); + + if (MenuButtonWithValue(title, summary, value_text.c_str(), enabled, height, font, summary_font)) + ImGui::OpenPopup(title); + + ImGui::SetNextWindowSize(LayoutScale(500.0f, 370.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, + LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING)); + + bool is_open = true; + if (ImGui::BeginPopupModal(title, &is_open, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + s32 dlg_left_value = static_cast(left_value.value_or(default_left)); + s32 dlg_top_value = static_cast(top_value.value_or(default_top)); + s32 dlg_right_value = static_cast(right_value.value_or(default_right)); + s32 dlg_bottom_value = static_cast(bottom_value.value_or(default_bottom)); + + BeginMenuButtons(); + + const float midpoint = LayoutScale(150.0f); + const float end = (ImGui::GetCurrentWindow()->WorkRect.GetWidth() - midpoint) + ImGui::GetStyle().WindowPadding.x; + ImGui::TextUnformatted("Left: "); + ImGui::SameLine(midpoint); + ImGui::SetNextItemWidth(end); + const bool left_modified = ImGui::SliderInt("##left", &dlg_left_value, min_value, max_value, format, ImGuiSliderFlags_NoInput); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + ImGui::TextUnformatted("Top: "); + ImGui::SameLine(midpoint); + ImGui::SetNextItemWidth(end); + const bool top_modified = ImGui::SliderInt("##top", &dlg_top_value, min_value, max_value, format, ImGuiSliderFlags_NoInput); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + ImGui::TextUnformatted("Right: "); + ImGui::SameLine(midpoint); + ImGui::SetNextItemWidth(end); + const bool right_modified = ImGui::SliderInt("##right", &dlg_right_value, min_value, max_value, format, ImGuiSliderFlags_NoInput); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + ImGui::TextUnformatted("Bottom: "); + ImGui::SameLine(midpoint); + ImGui::SetNextItemWidth(end); + const bool bottom_modified = + ImGui::SliderInt("##bottom", &dlg_bottom_value, min_value, max_value, format, ImGuiSliderFlags_NoInput); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + if (left_modified) + { + if (IsEditingGameSettings(bsi) && dlg_left_value == default_left) + bsi->DeleteValue(section, left_key); + else + bsi->SetIntValue(section, left_key, dlg_left_value); + } + if (top_modified) + { + if (IsEditingGameSettings(bsi) && dlg_top_value == default_top) + bsi->DeleteValue(section, top_key); + else + bsi->SetIntValue(section, top_key, dlg_top_value); + } + if (right_modified) + { + if (IsEditingGameSettings(bsi) && dlg_right_value == default_right) + bsi->DeleteValue(section, right_key); + else + bsi->SetIntValue(section, right_key, dlg_right_value); + } + if (bottom_modified) + { + if (IsEditingGameSettings(bsi) && dlg_bottom_value == default_bottom) + bsi->DeleteValue(section, bottom_key); + else + bsi->SetIntValue(section, bottom_key, dlg_bottom_value); + } + + if (left_modified || top_modified || right_modified || bottom_modified) + SetSettingsChanged(bsi); + + if (MenuButtonWithoutSummary("OK", true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, g_large_font, ImVec2(0.5f, 0.0f))) + { + ImGui::CloseCurrentPopup(); + } + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(4); + ImGui::PopFont(); +} + +void FullscreenUI::DrawStringListSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, + const char* key, const char* default_value, const char* const* options, const char* const* option_values, size_t option_count, + bool enabled, float height, ImFont* font, ImFont* summary_font) +{ + const bool game_settings = IsEditingGameSettings(bsi); + const std::optional value( + bsi->GetOptionalStringValue(section, key, game_settings ? std::nullopt : std::optional(default_value))); + + if (option_count == 0) + { + // select from null entry + while (options && options[option_count] != nullptr) + option_count++; + } + + size_t index = option_count; + if (value.has_value()) + { + for (size_t i = 0; i < option_count; i++) + { + if (value == option_values[i]) + { + index = i; + break; + } + } + } + + if (MenuButtonWithValue(title, summary, + value.has_value() ? ((index < option_count) ? options[index] : "Unknown") : "Use Global Setting", enabled, height, font, + summary_font)) + { + ImGuiFullscreen::ChoiceDialogOptions cd_options; + cd_options.reserve(option_count + 1); + if (game_settings) + cd_options.emplace_back("Use Global Setting", !value.has_value()); + for (size_t i = 0; i < option_count; i++) + cd_options.emplace_back(options[i], (value.has_value() && i == static_cast(index))); + OpenChoiceDialog(title, false, std::move(cd_options), + [game_settings, section, key, option_values](s32 index, const std::string& title, bool checked) { + if (index >= 0) + { + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(game_settings); + if (game_settings) + { + if (index == 0) + bsi->DeleteValue(section, key); + else + bsi->SetStringValue(section, key, option_values[index - 1]); + } + else + { + bsi->SetStringValue(section, key, option_values[index]); + } + + SetSettingsChanged(bsi); + } + + CloseChoiceDialog(); + }); + } +} + +void FullscreenUI::DrawFloatListSetting(SettingsInterface* bsi, const char* title, const char* summary, const char* section, + const char* key, float default_value, const char* const* options, const float* option_values, size_t option_count, bool enabled, + float height, ImFont* font, ImFont* summary_font) +{ + const bool game_settings = IsEditingGameSettings(bsi); + const std::optional value( + bsi->GetOptionalFloatValue(section, key, game_settings ? std::nullopt : std::optional(default_value))); + + if (option_count == 0) + { + // select from null entry + while (options && options[option_count] != nullptr) + option_count++; + } + + size_t index = option_count; + if (value.has_value()) + { + for (size_t i = 0; i < option_count; i++) + { + if (value == option_values[i]) + { + index = i; + break; + } + } + } + + if (MenuButtonWithValue(title, summary, + value.has_value() ? ((index < option_count) ? options[index] : "Unknown") : "Use Global Setting", enabled, height, font, + summary_font)) + { + ImGuiFullscreen::ChoiceDialogOptions cd_options; + cd_options.reserve(option_count + 1); + if (game_settings) + cd_options.emplace_back("Use Global Setting", !value.has_value()); + for (size_t i = 0; i < option_count; i++) + cd_options.emplace_back(options[i], (value.has_value() && i == static_cast(index))); + OpenChoiceDialog(title, false, std::move(cd_options), + [game_settings, section, key, option_values](s32 index, const std::string& title, bool checked) { + if (index >= 0) + { + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(game_settings); + if (game_settings) + { + if (index == 0) + bsi->DeleteValue(section, key); + else + bsi->SetFloatValue(section, key, option_values[index - 1]); + } + else + { + bsi->SetFloatValue(section, key, option_values[index]); + } + + SetSettingsChanged(bsi); + } + + CloseChoiceDialog(); + }); + } +} + +void FullscreenUI::DrawFolderSetting(SettingsInterface* bsi, const char* title, const char* section, const char* key, + const std::string& runtime_var, float height /* = ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT */, ImFont* font /* = g_large_font */, + ImFont* summary_font /* = g_medium_font */) +{ + if (MenuButton(title, runtime_var.c_str())) + { + OpenFileSelector(title, true, + [game_settings = IsEditingGameSettings(bsi), section = std::string(section), key = std::string(key)](const std::string& dir) { + if (dir.empty()) + return; + + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(game_settings); + std::string relative_path(Path::MakeRelative(dir, EmuFolders::DataRoot)); + bsi->SetStringValue(section.c_str(), key.c_str(), relative_path.c_str()); + SetSettingsChanged(bsi); + + Host::RunOnCPUThread(&Host::Internal::UpdateEmuFolders); + s_cover_image_map.clear(); + + CloseFileSelector(); + }); + } +} + +void FullscreenUI::StartAutomaticBinding(u32 port) +{ + // messy because the enumeration has to happen on the input thread + Host::RunOnCPUThread([port]() { + std::vector> devices(InputManager::EnumerateDevices()); + GetMTGS().RunOnGSThread([port, devices = std::move(devices)]() { + if (devices.empty()) + { + ShowToast({}, "Automatic binding failed, no devices are available."); + return; + } + + std::vector names; + ImGuiFullscreen::ChoiceDialogOptions options; + options.reserve(devices.size()); + names.reserve(devices.size()); + for (auto& [name, display_name] : devices) + { + names.push_back(std::move(name)); + options.emplace_back(std::move(display_name), false); + } + OpenChoiceDialog("Select Device", false, std::move(options), + [port, names = std::move(names)](s32 index, const std::string& title, bool checked) { + if (index < 0) + return; + + // since this is working with the device, it has to happen on the input thread too + Host::RunOnCPUThread([port, name = std::move(names[index])]() { + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(); + const bool result = PAD::MapController(*bsi, port, InputManager::GetGenericBindingMapping(name)); + SetSettingsChanged(bsi); + + + // and the toast needs to happen on the UI thread. + GetMTGS().RunOnGSThread([result, name = std::move(name)]() { + ShowToast({}, result ? fmt::format("Automatic mapping completed for {}.", name) : + fmt::format("Automatic mapping failed for {}.", name)); + }); + }); + CloseChoiceDialog(); + }); + }); + }); +} + +void FullscreenUI::SwitchToSettings() +{ + s_game_settings_entry.reset(); + s_game_settings_interface.reset(); + PopulateGraphicsAdapterList(); + + s_current_main_window = MainWindowType::Settings; + s_settings_page = SettingsPage::Interface; +} + +void FullscreenUI::SwitchToGameSettings(const std::string_view& serial, u32 crc) +{ + s_game_settings_entry.reset(); + s_game_settings_interface = std::make_unique(VMManager::GetGameSettingsPath(serial, crc)); + s_game_settings_interface->Load(); + s_current_main_window = MainWindowType::Settings; + s_settings_page = SettingsPage::Summary; + QueueResetFocus(); +} + +void FullscreenUI::SwitchToGameSettings() +{ + if (s_current_game_serial.empty() || s_current_game_crc == 0) + return; + + auto lock = GameList::GetLock(); + const GameList::Entry* entry = GameList::GetEntryForPath(s_current_game_path.c_str()); + if (!entry) + { + entry = GameList::GetEntryBySerialAndCRC(s_current_game_serial.c_str(), s_current_game_crc); + if (!entry) + { + SwitchToGameSettings(s_current_game_serial.c_str(), s_current_game_crc); + return; + } + } + + SwitchToGameSettings(entry); +} + +void FullscreenUI::SwitchToGameSettings(const std::string& path) +{ + auto lock = GameList::GetLock(); + const GameList::Entry* entry = GameList::GetEntryForPath(path.c_str()); + if (entry) + SwitchToGameSettings(entry); +} + +void FullscreenUI::SwitchToGameSettings(const GameList::Entry* entry) +{ + SwitchToGameSettings(entry->serial.c_str(), entry->crc); + s_game_settings_entry = std::make_unique(*entry); +} + +void FullscreenUI::PopulateGraphicsAdapterList() +{ + HostDisplay::AdapterAndModeList ml(g_host_display->GetAdapterAndModeList()); + s_graphics_adapter_list_cache = std::move(ml.adapter_names); + s_fullscreen_mode_list_cache = std::move(ml.fullscreen_modes); + s_fullscreen_mode_list_cache.insert(s_fullscreen_mode_list_cache.begin(), "Borderless Fullscreen"); +} + +void FullscreenUI::PopulateGameListDirectoryCache(SettingsInterface* si) +{ + s_game_list_directories_cache.clear(); + for (std::string& dir : si->GetStringList("GameList", "Paths")) + s_game_list_directories_cache.emplace_back(std::move(dir), false); + for (std::string& dir : si->GetStringList("GameList", "RecursivePaths")) + s_game_list_directories_cache.emplace_back(std::move(dir), true); +} + +void FullscreenUI::DoCopyGameSettings() +{ + if (!s_game_settings_interface) + return; + + Pcsx2Config temp; + { + SettingsLoadWrapper wrapper(*GetEditingSettingsInterface(false)); + temp.LoadSave(wrapper); + } + { + SettingsSaveWrapper wrapper(*s_game_settings_interface.get()); + temp.LoadSave(wrapper); + } + + SetSettingsChanged(s_game_settings_interface.get()); + + ShowToast(std::string(), fmt::format("Game settings initialized with global settings for '{}'.", + Path::GetFileTitle(s_game_settings_interface->GetFileName()))); +} + +void FullscreenUI::DoClearGameSettings() +{ + if (!s_game_settings_interface) + return; + + s_game_settings_interface->Clear(); + if (!s_game_settings_interface->GetFileName().empty()) + FileSystem::DeleteFilePath(s_game_settings_interface->GetFileName().c_str()); + + SetSettingsChanged(s_game_settings_interface.get()); + + ShowToast(std::string(), + fmt::format("Game settings have been cleared for '{}'.", Path::GetFileTitle(s_game_settings_interface->GetFileName()))); +} + +void FullscreenUI::DrawSettingsWindow() +{ + ImGuiIO& io = ImGui::GetIO(); + ImVec2 heading_size = + ImVec2(io.DisplaySize.x, LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + LAYOUT_MENU_BUTTON_Y_PADDING * 2.0f + 2.0f)); + + const float bg_alpha = VMManager::HasValidVM() ? 0.90f : 1.0f; + + if (BeginFullscreenWindow( + ImVec2(0.0f, 0.0f), heading_size, "settings_category", ImVec4(UIPrimaryColor.x, UIPrimaryColor.y, UIPrimaryColor.z, bg_alpha))) + { + static constexpr float ITEM_WIDTH = 25.0f; + + static constexpr const char* global_icons[] = {ICON_FA_WINDOW_MAXIMIZE, ICON_FA_MICROCHIP, ICON_FA_SLIDERS_H, ICON_FA_MAGIC, + ICON_FA_HEADPHONES, ICON_FA_SD_CARD, ICON_FA_GAMEPAD, ICON_FA_KEYBOARD, ICON_FA_TROPHY, ICON_FA_FOLDER_OPEN, ICON_FA_COGS}; + static constexpr const char* per_game_icons[] = { + ICON_FA_PARAGRAPH, ICON_FA_SLIDERS_H, ICON_FA_MAGIC, ICON_FA_HEADPHONES, ICON_FA_SD_CARD, ICON_FA_GAMEPAD, ICON_FA_BAN}; + static constexpr SettingsPage global_pages[] = {SettingsPage::Interface, SettingsPage::BIOS, SettingsPage::Emulation, + SettingsPage::Graphics, SettingsPage::Audio, SettingsPage::MemoryCard, SettingsPage::Controller, SettingsPage::Hotkey, + SettingsPage::Achievements, SettingsPage::Folders, SettingsPage::Advanced}; + static constexpr SettingsPage per_game_pages[] = {SettingsPage::Summary, SettingsPage::Emulation, SettingsPage::Graphics, + SettingsPage::Audio, SettingsPage::MemoryCard, SettingsPage::Controller, SettingsPage::GameFixes}; + static constexpr const char* titles[] = {"Summary", "Interface Settings", "BIOS Settings", "Emulation Settings", + "Graphics Settings", "Audio Settings", "Memory Card Settings", "Controller Settings", "Hotkey Settings", + "Achievements Settings", "Folder Settings", "Advanced Settings", "Game Fixes"}; + + SettingsInterface* bsi = GetEditingSettingsInterface(); + const bool game_settings = IsEditingGameSettings(bsi); + + const u32 count = game_settings ? (ShouldShowAdvancedSettings(bsi) ? std::size(per_game_pages) : (std::size(per_game_pages) - 1)) : + std::size(global_pages); + const char* const* icons = game_settings ? per_game_icons : global_icons; + const SettingsPage* pages = game_settings ? per_game_pages : global_pages; + u32 index = 0; + for (u32 i = 0; i < count; i++) + { + if (pages[i] == s_settings_page) + { + index = i; + break; + } + } + + BeginNavBar(); + + if (!ImGui::IsPopupOpen(0u, ImGuiPopupFlags_AnyPopup)) + { + if (ImGui::IsNavInputTest(ImGuiNavInput_FocusPrev, ImGuiNavReadMode_Pressed)) + { + index = (index == 0) ? (count - 1) : (index - 1); + s_settings_page = pages[index]; + } + else if (ImGui::IsNavInputTest(ImGuiNavInput_FocusNext, ImGuiNavReadMode_Pressed)) + { + index = (index + 1) % count; + s_settings_page = pages[index]; + } + } + + if (NavButton(ICON_FA_BACKWARD, true, true)) + ReturnToMainWindow(); + + if (s_game_settings_entry) + NavTitle(fmt::format("{} ({})", titles[static_cast(pages[index])], s_game_settings_entry->title).c_str()); + else + NavTitle(titles[static_cast(pages[index])]); + + RightAlignNavButtons(count, ITEM_WIDTH, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + + for (u32 i = 0; i < count; i++) + { + if (NavButton(icons[i], i == index, true, ITEM_WIDTH, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + { + s_settings_page = pages[i]; + } + } + + EndNavBar(); + } + + EndFullscreenWindow(); + + if (BeginFullscreenWindow(ImVec2(0.0f, heading_size.y), ImVec2(io.DisplaySize.x, io.DisplaySize.y - heading_size.y), "settings_parent", + ImVec4(UIBackgroundColor.x, UIBackgroundColor.y, UIBackgroundColor.z, bg_alpha))) + { + ResetFocusHere(); + + if (WantsToCloseMenu()) + { + if (ImGui::IsWindowFocused()) + ReturnToMainWindow(); + } + + auto lock = Host::GetSettingsLock(); + + switch (s_settings_page) + { + case SettingsPage::Summary: + DrawSummarySettingsPage(); + break; + + case SettingsPage::Interface: + DrawInterfaceSettingsPage(); + break; + + case SettingsPage::BIOS: + DrawBIOSSettingsPage(); + break; + + case SettingsPage::Emulation: + DrawEmulationSettingsPage(); + break; + + case SettingsPage::Graphics: + DrawGraphicsSettingsPage(); + break; + + case SettingsPage::Audio: + DrawAudioSettingsPage(); + break; + + case SettingsPage::MemoryCard: + DrawMemoryCardSettingsPage(); + break; + + case SettingsPage::Controller: + DrawControllerSettingsPage(); + break; + + case SettingsPage::Hotkey: + DrawHotkeySettingsPage(); + break; + + case SettingsPage::Achievements: + DrawAchievementsSettingsPage(lock); + break; + + case SettingsPage::Folders: + DrawFoldersSettingsPage(); + break; + + case SettingsPage::Advanced: + DrawAdvancedSettingsPage(); + break; + + case SettingsPage::GameFixes: + DrawGameFixesSettingsPage(); + break; + + default: + break; + } + } + + EndFullscreenWindow(); +} + +void FullscreenUI::DrawSummarySettingsPage() +{ + BeginMenuButtons(); + + MenuHeading("Details"); + + if (s_game_settings_entry) + { + if (MenuButton(ICON_FA_WINDOW_MAXIMIZE " Title", s_game_settings_entry->title.c_str(), true)) + CopyTextToClipboard("Game title copied to clipboard.", s_game_settings_entry->title); + if (MenuButton(ICON_FA_PAGER " Serial", s_game_settings_entry->serial.c_str(), true)) + CopyTextToClipboard("Game serial copied to clipboard.", s_game_settings_entry->serial); + if (MenuButton(ICON_FA_CODE " CRC", fmt::format("{:08X}", s_game_settings_entry->crc).c_str(), true)) + CopyTextToClipboard("Game CRC copied to clipboard.", fmt::format("{:08X}", s_game_settings_entry->crc)); + if (MenuButton(ICON_FA_COMPACT_DISC " Type", GameList::EntryTypeToString(s_game_settings_entry->type), true)) + CopyTextToClipboard("Game type copied to clipboard.", GameList::EntryTypeToString(s_game_settings_entry->type)); + if (MenuButton(ICON_FA_BOX " Region", GameList::RegionToString(s_game_settings_entry->region), true)) + CopyTextToClipboard("Game region copied to clipboard.", GameList::RegionToString(s_game_settings_entry->region)); + if (MenuButton(ICON_FA_STAR " Compatibility Rating", + GameList::EntryCompatibilityRatingToString(s_game_settings_entry->compatibility_rating), true)) + { + CopyTextToClipboard("Game compatibility copied to clipboard.", + GameList::EntryCompatibilityRatingToString(s_game_settings_entry->compatibility_rating)); + } + if (MenuButton(ICON_FA_FOLDER_OPEN " Path", s_game_settings_entry->path.c_str(), true)) + CopyTextToClipboard("Game path copied to clipboard.", s_game_settings_entry->path); + } + else + { + MenuButton(ICON_FA_BAN " Details unavailable for game not scanned in game list.", ""); + } + + MenuHeading("Options"); + + if (MenuButton(ICON_FA_COPY " Copy Settings", "Copies the current global settings to this game.")) + DoCopyGameSettings(); + if (MenuButton(ICON_FA_TRASH " Clear Settings", "Clears all settings set for this game.")) + DoClearGameSettings(); + + EndMenuButtons(); +} + +void FullscreenUI::DrawInterfaceSettingsPage() +{ + SettingsInterface* bsi = GetEditingSettingsInterface(); + + BeginMenuButtons(); + + MenuHeading("Behaviour"); + + DrawToggleSetting(bsi, ICON_FA_MAGIC " Inhibit Screensaver", + "Prevents the screen saver from activating and the host from sleeping while emulation is running.", "EmuCore", "InhibitScreensaver", + true); +#ifdef WITH_DISCORD_PRESENCE + DrawToggleSetting(bsi, "Enable Discord Presence", "Shows the game you are currently playing as part of your profile on Discord.", "UI", + "DiscordPresence", false); +#endif + DrawToggleSetting(bsi, ICON_FA_PAUSE " Pause On Start", "Pauses the emulator when a game is started.", "UI", "StartPaused", false); + DrawToggleSetting(bsi, ICON_FA_VIDEO " Pause On Focus Loss", + "Pauses the emulator when you minimize the window or switch to another application, and unpauses when you switch back.", "UI", + "PauseOnFocusLoss", false); + DrawToggleSetting(bsi, ICON_FA_WINDOW_MAXIMIZE " Pause On Menu", + "Pauses the emulator when you open the quick menu, and unpauses when you close it.", "UI", "PauseOnMenu", true); + DrawToggleSetting(bsi, ICON_FA_POWER_OFF " Confirm Shutdown", + "Determines whether a prompt will be displayed to confirm shutting down the emulator/game when the hotkey is pressed.", "UI", + "ConfirmShutdown", true); + DrawToggleSetting(bsi, ICON_FA_SAVE " Save State On Shutdown", + "Automatically saves the emulator state when powering down or exiting. You can then resume directly from where you left off next " + "time.", + "EmuCore", "SaveStateOnShutdown", false); + if (DrawToggleSetting(bsi, ICON_FA_WRENCH " Enable Per-Game Settings", + "Enables loading ini overlays from gamesettings, or custom settings per-game.", "EmuCore", "EnablePerGameSettings", + IsEditingGameSettings(bsi))) + { + Host::RunOnCPUThread(&VMManager::ReloadGameSettings); + } + if (DrawToggleSetting(bsi, ICON_FA_PAINT_BRUSH " Use Light Theme", "Uses a light coloured theme instead of the default dark theme.", + "UI", "UseLightFullscreenUITheme", false)) + { + ImGuiFullscreen::SetTheme(bsi->GetBoolValue("UI", "UseLightFullscreenUITheme", false)); + } + + MenuHeading("Game Display"); + DrawToggleSetting(bsi, ICON_FA_TV " Start Fullscreen", "Automatically switches to fullscreen mode when the program is started.", "UI", + "StartFullscreen", false); + DrawToggleSetting(bsi, ICON_FA_MOUSE " Double-Click Toggles Fullscreen", + "Switches between full screen and windowed when the window is double-clicked.", "UI", "DoubleClickTogglesFullscreen", true); + DrawToggleSetting(bsi, ICON_FA_MOUSE_POINTER " Hide Cursor In Fullscreen", + "Hides the mouse pointer/cursor when the emulator is in fullscreen mode.", "UI", "HideMouseCursor", false); + + MenuHeading("On-Screen Display"); + DrawIntSpinBoxSetting(bsi, ICON_FA_SEARCH " OSD Scale", "Determines how large the on-screen messages and monitor are.", "EmuCore/GS", + "OsdScale", 100, 25, 500, 1, "%d%%"); + DrawToggleSetting(bsi, ICON_FA_LIST " Show Messages", + "Shows on-screen-display messages when events occur such as save states being created/loaded, screenshots being taken, etc.", + "EmuCore/GS", "OsdShowMessages", true); + DrawToggleSetting(bsi, ICON_FA_CLOCK " Show Speed", + "Shows the current emulation speed of the system in the top-right corner of the display as a percentage.", "EmuCore/GS", + "OsdShowSpeed", false); + DrawToggleSetting(bsi, ICON_FA_RULER " Show FPS", + "Shows the number of video frames (or v-syncs) displayed per second by the system in the top-right corner of the display.", + "EmuCore/GS", "OsdShowFPS", false); + DrawToggleSetting(bsi, ICON_FA_BATTERY_HALF " Show CPU Usage", + "Shows the CPU usage based on threads in the top-right corner of the display.", "EmuCore/GS", "OsdShowCPU", false); + DrawToggleSetting(bsi, ICON_FA_SPINNER " Show GPU Usage", "Shows the host's GPU usage in the top-right corner of the display.", + "EmuCore/GS", "OsdShowGPU", false); + DrawToggleSetting(bsi, ICON_FA_RULER_VERTICAL " Show Resolution", + "Shows the resolution the game is rendering at in the top-right corner of the display.", "EmuCore/GS", "OsdShowResolution", false); + DrawToggleSetting(bsi, ICON_FA_BARS " Show GS Statistics", + "Shows statistics about GS (primitives, draw calls) in the top-right corner of the display.", "EmuCore/GS", "OsdShowGSStats", + false); + DrawToggleSetting(bsi, ICON_FA_PLAY " Show Status Indicators", + "Shows indicators when fast forwarding, pausing, and other abnormal states are active.", "EmuCore/GS", "OsdShowIndicators", true); + DrawToggleSetting(bsi, ICON_FA_SLIDERS_H " Show Settings", "Shows the current configuration in the bottom-right corner of the display.", + "EmuCore/GS", "OsdShowSettings", false); + DrawToggleSetting(bsi, ICON_FA_GAMEPAD " Show Inputs", + "Shows the current controller state of the system in the bottom-left corner of the display.", "EmuCore/GS", "OsdShowInputs", false); + DrawToggleSetting(bsi, ICON_FA_RULER_HORIZONTAL " Show Frame Times", + "Shows a visual history of frame times in the upper-left corner of the display.", "EmuCore/GS", "OsdShowFrameTimes", false); + DrawToggleSetting(bsi, ICON_FA_EXCLAMATION_CIRCLE " Warn About Unsafe Settings", + "Displays warnings when settings are enabled which may break games.", "EmuCore", "WarnAboutUnsafeSettings", true); + + MenuHeading("Operations"); + if (MenuButton(ICON_FA_FOLDER_MINUS " Reset Settings", "Resets configuration to defaults (excluding controller settings).", + !IsEditingGameSettings(bsi))) + { + DoResetSettings(); + } + + EndMenuButtons(); +} + +void FullscreenUI::DrawBIOSSettingsPage() +{ + SettingsInterface* bsi = GetEditingSettingsInterface(); + + BeginMenuButtons(); + + MenuHeading("BIOS Configuration"); + + DrawFolderSetting(bsi, ICON_FA_FOLDER_OPEN " Change Search Directory", "Folders", "Bios", EmuFolders::Bios); + + const std::string bios_selection(GetEditingSettingsInterface()->GetStringValue("Filenames", "BIOS", "")); + if (MenuButtonWithValue(ICON_FA_MICROCHIP " BIOS Selection", "Changes the BIOS image used to start future sessions.", + bios_selection.empty() ? "Automatic" : bios_selection.c_str())) + { + ImGuiFullscreen::ChoiceDialogOptions choices; + choices.emplace_back("Automatic", bios_selection.empty()); + + std::vector values; + values.push_back(""); + + FileSystem::FindResultsArray results; + FileSystem::FindFiles(EmuFolders::Bios.c_str(), "*", FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_HIDDEN_FILES, &results); + for (const FILESYSTEM_FIND_DATA& fd : results) + { + u32 version, region; + std::string description, zone; + if (!IsBIOS(fd.FileName.c_str(), version, description, region, zone)) + continue; + + const std::string_view filename(Path::GetFileName(fd.FileName)); + choices.emplace_back(fmt::format("{} ({})", description, filename), bios_selection == filename); + values.emplace_back(filename); + } + + OpenChoiceDialog("BIOS Selection", false, std::move(choices), + [game_settings = IsEditingGameSettings(bsi), values = std::move(values)](s32 index, const std::string& title, bool checked) { + if (index < 0) + return; + + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(game_settings); + bsi->SetStringValue("Filenames", "BIOS", values[index].c_str()); + SetSettingsChanged(bsi); + CloseChoiceDialog(); + }); + } + + MenuHeading("Options and Patches"); + DrawToggleSetting( + bsi, ICON_FA_LIGHTBULB " Fast Boot", "Skips the intro screen, and bypasses region checks.", "EmuCore", "EnableFastBoot", true); + + EndMenuButtons(); +} + +void FullscreenUI::DrawEmulationSettingsPage() +{ + static constexpr int DEFAULT_FRAME_LATENCY = 2; + + static constexpr const char* speed_entries[] = { + "2% [1 FPS (NTSC) / 1 FPS (PAL)]", + "10% [6 FPS (NTSC) / 5 FPS (PAL)]", + "25% [15 FPS (NTSC) / 12 FPS (PAL)]", + "50% [30 FPS (NTSC) / 25 FPS (PAL)]", + "75% [45 FPS (NTSC) / 37 FPS (PAL)]", + "90% [54 FPS (NTSC) / 45 FPS (PAL)]", + "100% [60 FPS (NTSC) / 50 FPS (PAL)]", + "110% [66 FPS (NTSC) / 55 FPS (PAL)]", + "120% [72 FPS (NTSC) / 60 FPS (PAL)]", + "150% [90 FPS (NTSC) / 75 FPS (PAL)]", + "175% [105 FPS (NTSC) / 87 FPS (PAL)]", + "200% [120 FPS (NTSC) / 100 FPS (PAL)]", + "300% [180 FPS (NTSC) / 150 FPS (PAL)]", + "400% [240 FPS (NTSC) / 200 FPS (PAL)]", + "500% [300 FPS (NTSC) / 250 FPS (PAL)]", + "1000% [600 FPS (NTSC) / 500 FPS (PAL)]", + }; + static constexpr const float speed_values[] = { + 0.02f, + 0.10f, + 0.25f, + 0.50f, + 0.75f, + 0.90f, + 1.00f, + 1.10f, + 1.20f, + 1.50f, + 1.75f, + 2.00f, + 3.00f, + 4.00f, + 5.00f, + 10.00f, + }; + static constexpr const char* ee_cycle_rate_settings[] = { + "50% Speed", "60% Speed", "75% Speed", "100% Speed (Default)", "130% Speed", "180% Speed", "300% Speed"}; + static constexpr const char* ee_cycle_skip_settings[] = { + "Normal (Default)", "Mild Underclock", "Moderate Underclock", "Maximum Underclock"}; + static constexpr const char* affinity_control_settings[] = { + "Disabled", "EE > VU > GS", "EE > GS > VU", "VU > EE > GS", "VU > GS > EE", "GS > EE > VU", "GS > VU > EE"}; + static constexpr const char* queue_entries[] = {"0 Frames (Hard Sync)", "1 Frame", "2 Frames", "3 Frames"}; + + SettingsInterface* bsi = GetEditingSettingsInterface(); + + BeginMenuButtons(); + + MenuHeading("Speed Control"); + + DrawFloatListSetting(bsi, "Normal Speed", "Sets the speed when running without fast forwarding.", "Framerate", "NominalScalar", 1.00f, + speed_entries, speed_values, std::size(speed_entries)); + DrawFloatListSetting(bsi, "Fast Forward Speed", "Sets the speed when using the fast forward hotkey.", "Framerate", "TurboScalar", 2.00f, + speed_entries, speed_values, std::size(speed_entries)); + DrawFloatListSetting(bsi, "Slow Motion Speed", "Sets the speed when using the slow motion hotkey.", "Framerate", "SlomoScalar", 0.50f, + speed_entries, speed_values, std::size(speed_entries)); + DrawToggleSetting( + bsi, "Enable Speed Limiter", "When disabled, the game will run as fast as possible.", "EmuCore/GS", "FrameLimitEnable", true); + + MenuHeading("System Settings"); + + DrawIntListSetting(bsi, "EE Cycle Rate", "Underclocks or overclocks the emulated Emotion Engine CPU.", "EmuCore/Speedhacks", + "EECycleRate", 0, ee_cycle_rate_settings, std::size(ee_cycle_rate_settings), -3); + DrawIntListSetting(bsi, "EE Cycle Skipping", "Adds a penalty to the Emulated Emotion Engine for executing VU programs.", + "EmuCore/Speedhacks", "EECycleSkip", 0, ee_cycle_skip_settings, std::size(ee_cycle_skip_settings)); + DrawIntListSetting(bsi, "Affinity Control Mode", + "Pins emulation threads to CPU cores to potentially improve performance/frame time variance.", "EmuCore/CPU", "AffinityControlMode", + 0, affinity_control_settings, std::size(affinity_control_settings), 0); + DrawToggleSetting(bsi, "Enable MTVU (Multi-Threaded VU1)", "Uses a second thread for VU1 micro programs. Sizable speed boost.", + "EmuCore/Speedhacks", "vuThread", false); + DrawToggleSetting(bsi, "Enable Instant VU1", + "Reduces timeslicing between VU1 and EE recompilers, effectively running VU1 at an infinite clock speed.", "EmuCore/Speedhacks", + "vu1Instant", true); + DrawToggleSetting(bsi, "Enable Cheats", "Enables loading cheats from pnach files.", "EmuCore", "EnableCheats", false); + DrawToggleSetting(bsi, "Enable Host Filesystem", "Enables access to files from the host: namespace in the virtual machine.", "EmuCore", + "HostFs", false); + + if (IsEditingGameSettings(bsi)) + { + DrawToggleSetting( + bsi, "Enable Fast CDVD", "Fast disc access, less loading times. Not recommended.", "EmuCore/Speedhacks", "fastCDVD", false); + } + + MenuHeading("Frame Pacing/Latency Control"); + + bool optimal_frame_pacing = (bsi->GetIntValue("EmuCore/GS", "VsyncQueueSize", DEFAULT_FRAME_LATENCY) == 0); + + DrawIntListSetting(bsi, "Maximum Frame Latency", "Sets the number of frames which can be queued.", "EmuCore/GS", "VsyncQueueSize", + DEFAULT_FRAME_LATENCY, queue_entries, std::size(queue_entries), 0, !optimal_frame_pacing); + + if (ToggleButton("Optimal Frame Pacing", + "Synchronize EE and GS threads after each frame. Lowest input latency, but increases system requirements.", + &optimal_frame_pacing)) + { + bsi->SetIntValue("EmuCore/GS", "VsyncQueueSize", optimal_frame_pacing ? 0 : DEFAULT_FRAME_LATENCY); + SetSettingsChanged(bsi); + } + + DrawToggleSetting(bsi, "Adjust To Host Refresh Rate", "Speeds up emulation so that the guest refresh rate matches the host.", + "EmuCore/GS", "SyncToHostRefreshRate", false); + + EndMenuButtons(); +} + +void FullscreenUI::DrawClampingModeSetting(SettingsInterface* bsi, const char* title, const char* summary, bool vu) +{ + // This is so messy... maybe we should just make the mode an int in the settings too... + const bool base = IsEditingGameSettings(bsi) ? 1 : 0; + std::optional default_false = IsEditingGameSettings(bsi) ? std::nullopt : std::optional(false); + std::optional default_true = IsEditingGameSettings(bsi) ? std::nullopt : std::optional(true); + + std::optional third = bsi->GetOptionalBoolValue("EmuCore/CPU/Recompiler", vu ? "vuSignOverflow" : "fpuFullMode", default_false); + std::optional second = + bsi->GetOptionalBoolValue("EmuCore/CPU/Recompiler", vu ? "vuExtraOverflow" : "fpuExtraOverflow", default_false); + std::optional first = bsi->GetOptionalBoolValue("EmuCore/CPU/Recompiler", vu ? "vuOverflow" : "fpuOverflow", default_true); + + int index; + if (third.has_value() && third.value()) + index = base + 3; + else if (second.has_value() && second.value()) + index = base + 2; + else if (first.has_value() && first.value()) + index = base + 1; + else if (first.has_value()) + index = base + 0; // none + else + index = 0; // no per game override + + static constexpr const char* ee_clamping_mode_settings[] = { + "Use Global Setting", "None", "Normal (Default)", "Extra + Preserve Sign", "Full"}; + static constexpr const char* vu_clamping_mode_settings[] = { + "Use Global Setting", "None", "Normal (Default)", "Extra", "Extra + Preserve Sign"}; + const char* const* options = vu ? vu_clamping_mode_settings : ee_clamping_mode_settings; + const int setting_offset = IsEditingGameSettings(bsi) ? 0 : 1; + + if (MenuButtonWithValue(title, summary, options[index + setting_offset])) + { + ImGuiFullscreen::ChoiceDialogOptions cd_options; + cd_options.reserve(std::size(ee_clamping_mode_settings)); + for (int i = setting_offset; i < static_cast(std::size(ee_clamping_mode_settings)); i++) + cd_options.emplace_back(options[i], (i == (index + setting_offset))); + OpenChoiceDialog(title, false, std::move(cd_options), + [game_settings = IsEditingGameSettings(bsi), vu](s32 index, const std::string& title, bool checked) { + if (index >= 0) + { + auto lock = Host::GetSettingsLock(); + + std::optional first, second, third; + + if (!game_settings || index > 0) + { + const bool base = game_settings ? 1 : 0; + third = (index >= (base + 3)); + second = (index >= (base + 2)); + first = (index >= (base + 1)); + } + + SettingsInterface* bsi = GetEditingSettingsInterface(game_settings); + bsi->SetOptionalBoolValue("EmuCore/CPU/Recompiler", vu ? "vuSignOverflow" : "fpuFullMode", third); + bsi->SetOptionalBoolValue("EmuCore/CPU/Recompiler", vu ? "vuExtraOverflow" : "fpuExtraOverflow", second); + bsi->SetOptionalBoolValue("EmuCore/CPU/Recompiler", vu ? "vuOverflow" : "fpuOverflow", first); + SetSettingsChanged(bsi); + } + + CloseChoiceDialog(); + }); + } +} + +void FullscreenUI::DrawGraphicsSettingsPage() +{ + static constexpr const char* s_renderer_names[] = {"Automatic", +#ifdef _WIN32 + "Direct3D 11", "Direct3D 12", +#endif +#ifdef ENABLE_OPENGL + "OpenGL", +#endif +#ifdef ENABLE_VULKAN + "Vulkan", +#endif +#ifdef __APPLE__ + "Metal", +#endif + "Software", "Null"}; + static constexpr const char* s_renderer_values[] = { + "-1", //GSRendererType::Auto, +#ifdef _WIN32 + "3", //GSRendererType::DX11, + "15", //GSRendererType::DX12, +#endif +#ifdef ENABLE_OPENGL + "12", //GSRendererType::OGL, +#endif +#ifdef ENABLE_VULKAN + "14", //GSRendererType::VK, +#endif +#ifdef __APPLE__ + "17", //GSRendererType::Metal, +#endif + "13", //GSRendererType::SW, + "11", //GSRendererType::Null + }; + static constexpr const char* s_vsync_values[] = {"Off", "On", "Adaptive"}; + static constexpr const char* s_bilinear_present_options[] = {"Off", "Bilinear (Smooth)", "Bilinear (Sharp)"}; + static constexpr const char* s_deinterlacing_options[] = {"Automatic (Default)", "None", "Weave (Top Field First, Sawtooth)", + "Weave (Bottom Field First, Sawtooth)", "Bob (Top Field First)", "Bob (Bottom Field First)", "Blend (Top Field First, Half FPS)", + "Blend (Bottom Field First, Half FPS)", "Adaptive (Top Field First)", "Adaptive (Bottom Field First)"}; + static const char* s_resolution_options[] = { + "Native (PS2)", + "1.25x Native", + "1.5x Native", + "1.75x Native", + "2x Native (~720p)", + "2.25x Native", + "2.5x Native", + "2.75x Native", + "3x Native (~1080p)", + "3.5x Native", + "4x Native (~1440p/2K)", + "5x Native (~1620p)", + "6x Native (~2160p/4K)", + "7x Native (~2520p)", + "8x Native (~2880p)", + }; + static const char* s_resolution_values[] = { + "1", + "1.25", + "1.5", + "1.75", + "2", + "2.25", + "2.5", + "2.75", + "3", + "3.5", + "4", + "5", + "6", + "7", + "8", + }; + static constexpr const char* s_mipmapping_options[] = {"Automatic (Default)", "Off", "Basic (Generated Mipmaps)", "Full (PS2 Mipmaps)"}; + static constexpr const char* s_bilinear_options[] = { + "Nearest", "Bilinear (Forced)", "Bilinear (PS2)", "Bilinear (Forced excluding sprite)"}; + static constexpr const char* s_trilinear_options[] = {"Automatic (Default)", "Off (None)", "Trilinear (PS2)", "Trilinear (Forced)"}; + static constexpr const char* s_dithering_options[] = {"Off", "Scaled", "Unscaled (Default)"}; + static constexpr const char* s_crc_fix_options[] = { + "Automatic (Default)", "None (Debug)", "Minimum (Debug)", "Partial (OpenGL)", "Full (Direct3D)", "Aggressive"}; + static constexpr const char* s_blending_options[] = { + "Minimum", "Basic (Recommended)", "Medium", "High", "Full (Slow)", "Maximum (Very Slow)"}; + static constexpr const char* s_anisotropic_filtering_entries[] = {"Off (Default)", "2x", "4x", "8x", "16x"}; + static constexpr const char* s_anisotropic_filtering_values[] = {"0", "2", "4", "8", "16"}; + static constexpr const char* s_preloading_options[] = {"None", "Partial", "Full (Hash Cache)"}; + static constexpr const char* s_generic_options[] = {"Automatic (Default)", "Force Disabled", "Force Enabled"}; + static constexpr const char* s_hw_download[] = {"Accurate (Recommended)", "Disable Readbacks (Synchronize GS Thread)", + "Unsynchronized (Non-Deterministic)", "Disabled (Ignore Transfers)"}; + + SettingsInterface* bsi = GetEditingSettingsInterface(); + + const GSRendererType renderer = + static_cast(GetEffectiveIntSetting(bsi, "EmuCore/GS", "Renderer", static_cast(GSRendererType::Auto))); + const bool is_hardware = (renderer == GSRendererType::Auto || renderer == GSRendererType::DX11 || renderer == GSRendererType::DX12 || + renderer == GSRendererType::OGL || renderer == GSRendererType::VK || renderer == GSRendererType::Metal); + //const bool is_software = (renderer == GSRendererType::SW); + + BeginMenuButtons(); + + MenuHeading("Renderer"); + DrawStringListSetting(bsi, "Renderer", "Selects the API used to render the emulated GS.", "EmuCore/GS", "Renderer", "-1", + s_renderer_names, s_renderer_values, std::size(s_renderer_names)); + DrawIntListSetting(bsi, "Sync To Host Refresh (VSync)", "Synchronizes frame presentation with host refresh.", "EmuCore/GS", + "VsyncEnable", static_cast(VsyncMode::Off), s_vsync_values, std::size(s_vsync_values)); + + MenuHeading("Display"); + DrawStringListSetting(bsi, "Aspect Ratio", "Selects the aspect ratio to display the game content at.", "EmuCore/GS", "AspectRatio", + "Auto 4:3/3:2", Pcsx2Config::GSOptions::AspectRatioNames, Pcsx2Config::GSOptions::AspectRatioNames, 0); + DrawStringListSetting(bsi, "FMV Aspect Ratio", "Selects the aspect ratio for display when a FMV is detected as playing.", "EmuCore/GS", + "FMVAspectRatioSwitch", "Auto 4:3/3:2", Pcsx2Config::GSOptions::FMVAspectRatioSwitchNames, + Pcsx2Config::GSOptions::FMVAspectRatioSwitchNames, 0); + DrawIntListSetting(bsi, "Deinterlacing", + "Selects the algorithm used to convert the PS2's interlaced output to progressive for display.", "EmuCore/GS", "deinterlace_mode", + static_cast(GSInterlaceMode::Automatic), s_deinterlacing_options, std::size(s_deinterlacing_options)); + DrawIntRangeSetting(bsi, "Zoom", "Increases or decreases the virtual picture size both horizontally and vertically.", "EmuCore/GS", + "Zoom", 100, 10, 300, "%d%%"); + DrawIntRangeSetting(bsi, "Vertical Stretch", "Increases or decreases the virtual picture size vertically.", "EmuCore/GS", "StretchY", + 100, 10, 300, "%d%%"); + DrawIntRectSetting(bsi, "Crop", "Crops the image, while respecting aspect ratio.", "EmuCore/GS", "CropLeft", 0, "CropTop", 0, + "CropRight", 0, "CropBottom", 0, 0, 720, "%dpx"); + DrawToggleSetting(bsi, "Enable Widescreen Patches", "Enables loading widescreen patches from pnach files.", "EmuCore", + "EnableWideScreenPatches", false); + DrawToggleSetting(bsi, "Enable No-Interlacing Patches", "Enables loading no-interlacing patches from pnach files.", "EmuCore", + "EnableNoInterlacingPatches", false); + DrawIntListSetting(bsi, "Bilinear Upscaling", "Smooths out the image when upscaling the console to the screen.", "EmuCore/GS", + "linear_present_mode", static_cast(GSPostBilinearMode::BilinearSharp), s_bilinear_present_options, + std::size(s_bilinear_present_options)); + DrawToggleSetting(bsi, "Integer Upscaling", + "Adds padding to the display area to ensure that the ratio between pixels on the host to pixels in the console is an integer " + "number. May result in a sharper image in some 2D games.", + "EmuCore/GS", "IntegerScaling", false); + DrawToggleSetting(bsi, "Screen Offsets", "Enables PCRTC Offsets which position the screen as the game requests.", "EmuCore/GS", + "pcrtc_offsets", false); + DrawToggleSetting(bsi, "Show Overscan", + "Enables the option to show the overscan area on games which draw more than the safe area of the screen.", "EmuCore/GS", + "pcrtc_overscan", false); + DrawToggleSetting(bsi, "Anti-Blur", + "Enables internal Anti-Blur hacks. Less accurate to PS2 rendering but will make a lot of games look less blurry.", "EmuCore/GS", + "pcrtc_antiblur", true); + + MenuHeading("Rendering"); + if (is_hardware) + { + DrawStringListSetting(bsi, "Internal Resolution", "Multiplies the render resolution by the specified factor (upscaling).", + "EmuCore/GS", "upscale_multiplier", "1.000000", s_resolution_options, s_resolution_values, std::size(s_resolution_options)); + DrawIntListSetting(bsi, "Mipmapping", "Determines how mipmaps are used when rendering textures.", "EmuCore/GS", "mipmap_hw", + static_cast(HWMipmapLevel::Automatic), s_mipmapping_options, std::size(s_mipmapping_options), -1); + DrawIntListSetting(bsi, "Bilinear Filtering", "Selects where bilinear filtering is utilized when rendering textures.", "EmuCore/GS", + "filter", static_cast(BiFiltering::PS2), s_bilinear_options, std::size(s_bilinear_options)); + DrawIntListSetting(bsi, "Trilinear Filtering", "Selects where trilinear filtering is utilized when rendering textures.", + "EmuCore/GS", "TriFilter", static_cast(TriFiltering::Automatic), s_trilinear_options, std::size(s_trilinear_options), -1); + DrawStringListSetting(bsi, "Anisotropic Filtering", "Selects where anistropic filtering is utilized when rendering textures.", + "EmuCore/GS", "MaxAnisotropy", "0", s_anisotropic_filtering_entries, s_anisotropic_filtering_values, + std::size(s_anisotropic_filtering_entries)); + DrawIntListSetting(bsi, "Dithering", "Selects the type of dithering applies when the game requests it.", "EmuCore/GS", + "dithering_ps2", 2, s_dithering_options, std::size(s_dithering_options)); + DrawIntListSetting(bsi, "CRC Fix Level", "Applies manual fixes to difficult-to-emulate effects in the hardware renderers.", + "EmuCore/GS", "crc_hack_level", static_cast(CRCHackLevel::Automatic), s_crc_fix_options, std::size(s_crc_fix_options), -1); + DrawIntListSetting(bsi, "Blending Accuracy", + "Determines the level of accuracy when emulating blend modes not supported by the host graphics API.", "EmuCore/GS", + "accurate_blending_unit", static_cast(AccBlendLevel::Basic), s_blending_options, std::size(s_blending_options)); + DrawIntListSetting(bsi, "Texture Preloading", + "Uploads full textures to the GPU on use, rather than only the utilized regions. Can improve performance in some games.", + "EmuCore/GS", "texture_preloading", static_cast(TexturePreloadingLevel::Off), s_preloading_options, + std::size(s_preloading_options)); + DrawIntListSetting(bsi, "Hardware Download Mode", "Changes synchronization behavior for GS downloads.", "EmuCore/GS", + "HWDownloadMode", static_cast(GSHardwareDownloadMode::Enabled), s_hw_download, std::size(s_hw_download)); + DrawToggleSetting(bsi, "GPU Palette Conversion", + "Applies palettes to textures on the GPU instead of the CPU. Can result in speed improvements in some games.", "EmuCore/GS", + "paltex", false); + } + else + { + } + + if (is_hardware) + { + MenuHeading("Hardware Fixes"); + DrawToggleSetting(bsi, "Manual Hardware Fixes", "Disables automatic hardware fixes, allowing you to set fixes manually.", + "EmuCore/GS", "UserHacks", false); + + const bool manual_hw_fixes = GetEffectiveBoolSetting(bsi, "EmuCore/GS", "UserHacks", false); + if (manual_hw_fixes) + { + static constexpr const char* s_cpu_sprite_render_bw_options[] = {"0 (Disabled)", "1 (64 Max Width)", "2 (128 Max Width)", + "3 (192 Max Width)", "4 (256 Max Width)", "5 (320 Max Width)", "6 (384 Max Width)", "7 (448 Max Width)", + "8 (512 Max Width)", "9 (576 Max Width)", "10 (640 Max Width)"}; + static constexpr const char* s_cpu_clut_render_options[] = {"0 (Disabled)", "1 (Normal)", "2 (Aggressive)"}; + static constexpr const char* s_half_pixel_offset_options[] = { + "Off (Default)", "Normal (Vertex)", "Special (Texture)", "Special (Texture - Aggressive)"}; + static constexpr const char* s_round_sprite_options[] = {"Off (Default)", "Half", "Full"}; + + DrawIntListSetting(bsi, "Half-Bottom Override", "Control the half-screen fix detection on texture shuffling.", "EmuCore/GS", + "UserHacks_Half_Bottom_Override", -1, s_generic_options, std::size(s_generic_options), -1); + DrawIntListSetting(bsi, "CPU Sprite Render Size", "Uses software renderer to draw texture decompression-like sprites.", + "EmuCore/GS", "UserHacks_CPUSpriteRenderBW", 0, s_cpu_sprite_render_bw_options, std::size(s_cpu_sprite_render_bw_options)); + DrawIntListSetting(bsi, "Software CLUT Render", "Uses software renderer to draw texture CLUT points/sprites.", "EmuCore/GS", + "UserHacks_CPUCLUTRender", 0, s_cpu_clut_render_options, std::size(s_cpu_clut_render_options)); + DrawIntSpinBoxSetting( + bsi, "Skip Draw Start", "Object range to skip drawing.", "EmuCore/GS", "UserHacks_SkipDraw_Start", 0, 0, 5000, 1); + DrawIntSpinBoxSetting( + bsi, "Skip Draw End", "Object range to skip drawing.", "EmuCore/GS", "UserHacks_SkipDraw_End", 0, 0, 5000, 1); + DrawToggleSetting(bsi, "Auto Flush (Hardware)", "Force a primitive flush when a framebuffer is also an input texture.", + "EmuCore/GS", "UserHacks_AutoFlush", false, manual_hw_fixes); + DrawToggleSetting(bsi, "CPU Framebuffer Conversion", "Convert 4-bit and 8-bit frame buffer on the CPU instead of the GPU.", + "EmuCore/GS", "UserHacks_CPU_FB_Conversion", false, manual_hw_fixes); + DrawToggleSetting(bsi, "Disable Depth Support", "Disable the support of depth buffer in the texture cache.", "EmuCore/GS", + "UserHacks_DisableDepthSupport", false, manual_hw_fixes); + DrawToggleSetting( + bsi, "Wrap GS Memory", "Emulates GS memory wrapping accurately.", "EmuCore/GS", "wrap_gs_mem", false, manual_hw_fixes); + DrawToggleSetting(bsi, "Disable Safe Features", "This option disables multiple safe features.", "EmuCore/GS", + "UserHacks_Disable_Safe_Features", false, manual_hw_fixes); + DrawToggleSetting(bsi, "Preload Frame", "Uploads GS data when rendering a new frame to reproduce some effects accurately.", + "EmuCore/GS", "preload_frame_with_gs_data", false, manual_hw_fixes); + DrawToggleSetting(bsi, "Disable Partial Invalidation", + "Removes texture cache entries when there is any intersection, rather than only the intersected areas.", "EmuCore/GS", + "UserHacks_DisablePartialInvalidation", false, manual_hw_fixes); + DrawToggleSetting(bsi, "Texture Inside Render Target", + "Allows the texture cache to reuse as an input texture the inner portion of a previous framebuffer.", "EmuCore/GS", + "UserHacks_TextureInsideRt", false, manual_hw_fixes); + + MenuHeading("Upscaling Fixes"); + DrawIntListSetting(bsi, "Half-Pixel Offset", "Adjusts vertices relative to upscaling.", "EmuCore/GS", + "UserHacks_HalfPixelOffset", 0, s_half_pixel_offset_options, std::size(s_half_pixel_offset_options)); + DrawIntListSetting(bsi, "Round Sprite", "Adjusts sprite coordinates.", "EmuCore/GS", "UserHacks_round_sprite_offset", 0, + s_round_sprite_options, std::size(s_round_sprite_options)); + DrawIntSpinBoxSetting( + bsi, "TC Offset X", "Adjusts target texture offsets.", "EmuCore/GS", "UserHacks_TCOffsetX", 0, -4096, 4096, 1); + DrawIntSpinBoxSetting( + bsi, "TC Offset Y", "Adjusts target texture offsets.", "EmuCore/GS", "UserHacks_TCOffsetY", 0, -4096, 4096, 1); + DrawToggleSetting(bsi, "Align Sprite", "Fixes issues with upscaling (vertical lines) in some games.", "EmuCore/GS", + "UserHacks_align_sprite_X", false, manual_hw_fixes); + DrawToggleSetting(bsi, "Merge Sprite", "Replaces multiple post-processing sprites with a larger single sprite.", "EmuCore/GS", + "UserHacks_merge_pp_sprite", false, manual_hw_fixes); + DrawToggleSetting(bsi, "Wild Arms Hack", + "Lowers the GS precision to avoid gaps between pixels when upscaling. Fixes the text on Wild Arms games.", "EmuCore/GS", + "UserHacks_WildHack", false, manual_hw_fixes); + } + } + else + { + // extrathreads + DrawIntRangeSetting(bsi, "Software Rendering Threads", + "Number of threads to use in addition to the main GS thread for rasterization.", "EmuCore/GS", "extrathreads", 2, 0, 10); + DrawToggleSetting(bsi, "Auto Flush (Software)", "Force a primitive flush when a framebuffer is also an input texture.", + "EmuCore/GS", "autoflush_sw", true); + DrawToggleSetting(bsi, "Edge AA (AA1)", "Enables emulation of the GS's edge anti-aliasing (AA1).", "EmuCore/GS", "aa1", true); + DrawToggleSetting(bsi, "Mipmapping", "Enables emulation of the GS's texture mipmapping.", "EmuCore/GS", "mipmap", true); + } + + if (is_hardware) + { + const bool dumping_active = GetEffectiveBoolSetting(bsi, "EmuCore/GS", "DumpReplaceableTextures", false); + const bool replacement_active = GetEffectiveBoolSetting(bsi, "EmuCore/GS", "LoadTextureReplacements", false); + + MenuHeading("Texture Replacement"); + DrawToggleSetting(bsi, "Load Textures", "Loads replacement textures where available and user-provided.", "EmuCore/GS", + "LoadTextureReplacements", false); + DrawToggleSetting(bsi, "Asynchronous Texture Loading", + "Loads replacement textures on a worker thread, reducing microstutter when replacements are enabled.", "EmuCore/GS", + "LoadTextureReplacementsAsync", true, replacement_active); + DrawToggleSetting(bsi, "Precache Replacements", + "Preloads all replacement textures to memory. Not necessary with asynchronous loading.", "EmuCore/GS", + "PrecacheTextureReplacements", false, replacement_active); + DrawFolderSetting(bsi, "Replacements Directory", "Folders", "Textures", EmuFolders::Textures); + + MenuHeading("Texture Dumping"); + DrawToggleSetting(bsi, "Dump Textures", "Dumps replacable textures to disk. Will reduce performance.", "EmuCore/GS", + "DumpReplaceableTextures", false); + DrawToggleSetting( + bsi, "Dump Mipmaps", "Includes mipmaps when dumping textures.", "EmuCore/GS", "DumpReplaceableMipmaps", false, dumping_active); + DrawToggleSetting(bsi, "Dump FMV Textures", "Allows texture dumping when FMVs are active. You should not enable this.", + "EmuCore/GS", "DumpTexturesWithFMVActive", false, dumping_active); + } + + MenuHeading("Post-Processing"); + { + static constexpr const char* s_cas_options[] = { + "Disabled", "Sharpen Only (Internal Resolution)", "Sharpen and Resize (Display Resolution)"}; + const bool cas_active = (GetEffectiveIntSetting(bsi, "EmuCore/GS", "CASMode", 0) != static_cast(GSCASMode::Disabled)); + + DrawToggleSetting(bsi, "FXAA", "Enables FXAA post-processing shader.", "EmuCore/GS", "fxaa", false); + DrawIntListSetting(bsi, "Contrast Adaptive Sharpening", "Enables FidelityFX Contrast Adaptive Sharpening.", "EmuCore/GS", "CASMode", + static_cast(GSCASMode::Disabled), s_cas_options, std::size(s_cas_options)); + DrawIntSpinBoxSetting(bsi, "CAS Sharpness", "Determines the intensity the sharpening effect in CAS post-processing.", "EmuCore/GS", + "CASSharpness", 50, 0, 100, 1, "%d%%", cas_active); + } + + MenuHeading("Filters"); + { + const bool shadeboost_active = GetEffectiveBoolSetting(bsi, "EmuCore/GS", "ShadeBoost", false); + + DrawToggleSetting(bsi, "Shade Boost", "Enables brightness/contrast/saturation adjustment.", "EmuCore/GS", "ShadeBoost", false); + DrawIntRangeSetting(bsi, "Shade Boost Brightness", "Adjusts brightness. 50 is normal.", "EmuCore/GS", "ShadeBoost_Brightness", 50, + 1, 100, "%d", shadeboost_active); + DrawIntRangeSetting(bsi, "Shade Boost Contrast", "Adjusts contrast. 50 is normal.", "EmuCore/GS", "ShadeBoost_Contrast", 50, 1, 100, + "%d", shadeboost_active); + DrawIntRangeSetting(bsi, "Shade Boost Saturation", "Adjusts saturation. 50 is normal.", "EmuCore/GS", "ShadeBoost_Saturation", 50, + 1, 100, "%d", shadeboost_active); + + static constexpr const char* s_tv_shaders[] = { + "None", "Scanline Filter", "Diagonal Filter", "Triangular Filter", "Wave Filter", "Lottes CRT"}; + DrawIntListSetting( + bsi, "TV Shaders", "Selects post-processing TV shader.", "EmuCore/GS", "TVShader", 0, s_tv_shaders, std::size(s_tv_shaders)); + } + + static constexpr const char* s_gsdump_compression[] = {"Uncompressed", "LZMA (xz)", "Zstandard (zst)"}; + + MenuHeading("Advanced"); + DrawToggleSetting(bsi, "Skip Presenting Duplicate Frames", + "Skips displaying frames that don't change in 25/30fps games. Can improve speed but increase input lag/make frame pacing worse.", + "EmuCore/GS", "SkipDuplicateFrames", false); + DrawIntListSetting(bsi, "Override Texture Barriers", "Forces texture barrier functionality to the specified value.", "EmuCore/GS", + "OverrideTextureBarriers", -1, s_generic_options, std::size(s_generic_options), -1); + DrawIntListSetting(bsi, "Override Geometry Shaders", "Forces geometry shader functionality to the specified value.", "EmuCore/GS", + "OverrideGeometryShaders", -1, s_generic_options, std::size(s_generic_options), -1); + DrawIntListSetting(bsi, "GS Dump Compression", "Sets the compression algorithm for GS dumps.", "EmuCore/GS", "GSDumpCompression", + static_cast(GSDumpCompressionMethod::LZMA), s_gsdump_compression, std::size(s_gsdump_compression)); + DrawToggleSetting(bsi, "Disable Framebuffer Fetch", "Prevents the usage of framebuffer fetch when supported by host GPU.", "EmuCore/GS", + "DisableFramebufferFetch", false); + DrawToggleSetting(bsi, "Disable Dual-Source Blending", "Prevents the usage of dual-source blending when supported by host GPU.", + "EmuCore/GS", "DisableDualSourceBlend", false); + + EndMenuButtons(); +} + +void FullscreenUI::DrawAudioSettingsPage() +{ + static constexpr const char* interpolation_modes[] = { + "Nearest (Fastest / worst quality)", + "Linear (Simple / okay sound)", + "Cubic (Fake highs / okay sound)", + "Hermite (Better highs / okay sound)", + "Catmull-Rom (PS2-like / good sound)", + "Gaussian (PS2-like / great sound)", + }; + static constexpr const char* synchronization_modes[] = { + "TimeStretch (Recommended)", + "Async Mix (Breaks some games!)", + "None (Audio can skip.)", + }; + static constexpr const char* expansion_modes[] = { + "Stereo (None, Default)", + "Quadrafonic", + "Surround 5.1", + "Surround 7.1", + }; + static constexpr const char* output_entries[] = { + "No Sound (Emulate SPU2 only)", +#ifdef SPU2X_CUBEB + "Cubeb (Cross-platform)", +#endif +#ifdef _WIN32 + "XAudio2", +#endif + }; + static constexpr const char* output_values[] = { + "nullout", +#ifdef SPU2X_CUBEB + "cubeb", +#endif +#ifdef _WIN32 + "xaudio2", +#endif + }; +#if defined(SPU2X_CUBEB) + static constexpr const char* default_output_module = "cubeb"; +#elif defined(_WIN32) + static constexpr const char* default_output_module = "xaudio2"; +#else + static constexpr const char* default_output_module = "nullout"; +#endif + + SettingsInterface* bsi = GetEditingSettingsInterface(); + + BeginMenuButtons(); + + MenuHeading("Runtime Settings"); + DrawIntRangeSetting(bsi, ICON_FA_VOLUME_UP " Output Volume", "Applies a global volume modifier to all sound produced by the game.", + "SPU2/Mixing", "FinalVolume", 100, 0, 200, "%d%%"); + + MenuHeading("Mixing Settings"); + DrawIntListSetting(bsi, ICON_FA_MUSIC " Interpolation Mode", "Determines how ADPCM samples are interpolated to the target pitch.", + "SPU2/Mixing", "Interpolation", static_cast(Pcsx2Config::SPU2Options::InterpolationMode::Gaussian), interpolation_modes, + std::size(interpolation_modes)); + DrawIntListSetting(bsi, ICON_FA_RULER " Synchronization Mode", "Changes when SPU samples are generated relative to system emulation.", + "SPU2/Output", "SynchMode", static_cast(Pcsx2Config::SPU2Options::SynchronizationMode::TimeStretch), synchronization_modes, + std::size(synchronization_modes)); + DrawIntListSetting(bsi, ICON_FA_PLUS " Expansion Mode", "Determines how the stereo output is transformed to greater speaker counts.", + "SPU2/Output", "SpeakerConfiguration", 0, expansion_modes, std::size(expansion_modes)); + + MenuHeading("Output Settings"); + DrawStringListSetting(bsi, ICON_FA_PLAY_CIRCLE " Output Module", "Determines which API is used to play back audio samples on the host.", + "SPU2/Output", "OutputModule", default_output_module, output_entries, output_values, std::size(output_entries)); + DrawIntRangeSetting(bsi, ICON_FA_CLOCK " Latency", "Sets the average output latency when using the cubeb backend.", "SPU2/Output", + "Latency", 100, 15, 200, "%d ms (avg)"); + + MenuHeading("Timestretch Settings"); + DrawIntRangeSetting(bsi, ICON_FA_RULER_HORIZONTAL " Sequence Length", + "Affects how the timestretcher operates when not running at 100% speed.", "Soundtouch", "SequenceLengthMS", 30, 20, 100, "%d ms"); + DrawIntRangeSetting(bsi, ICON_FA_WINDOW_MAXIMIZE " Seekwindow Size", + "Affects how the timestretcher operates when not running at 100% speed.", "Soundtouch", "SeekWindowMS", 20, 10, 30, "%d ms"); + DrawIntRangeSetting(bsi, ICON_FA_RECEIPT " Overlap", "Affects how the timestretcher operates when not running at 100% speed.", + "Soundtouch", "OverlapMS", 20, 5, 15, "%d ms"); + + EndMenuButtons(); +} + +void FullscreenUI::DrawMemoryCardSettingsPage() +{ + BeginMenuButtons(); + + SettingsInterface* bsi = GetEditingSettingsInterface(); + + MenuHeading("Settings and Operations"); + if (MenuButton(ICON_FA_PLUS " Create Memory Card", "Creates a new memory card file or folder.")) + ImGui::OpenPopup("Create Memory Card"); + DrawCreateMemoryCardWindow(); + + DrawFolderSetting(bsi, ICON_FA_FOLDER_OPEN " Memory Card Directory", "Folders", "MemoryCards", EmuFolders::MemoryCards); + DrawToggleSetting(bsi, ICON_FA_SEARCH " Folder Memory Card Filter", + "Simulates a larger memory card by filtering saves only to the current game.", "EmuCore", "McdFolderAutoManage", true); + DrawToggleSetting(bsi, ICON_FA_MAGIC " Auto Eject When Loading", + "Automatically ejects memory cards when they differ after loading a state.", "EmuCore", "McdEnableEjection", true); + + for (u32 port = 0; port < NUM_MEMORY_CARD_PORTS; port++) + { + const std::string title(fmt::format("Console Port {}", port + 1)); + MenuHeading(title.c_str()); + + std::string enable_key(fmt::format("Slot{}_Enable", port + 1)); + std::string file_key(fmt::format("Slot{}_Filename", port + 1)); + + DrawToggleSetting(bsi, fmt::format(ICON_FA_SD_CARD " Card Enabled##card_enabled_{}", port).c_str(), + "If not set, this card will be considered unplugged.", "MemoryCards", enable_key.c_str(), true); + + const bool enabled = GetEffectiveBoolSetting(bsi, "MemoryCards", enable_key.c_str(), true); + + std::optional value(bsi->GetOptionalStringValue("MemoryCards", file_key.c_str(), + IsEditingGameSettings(bsi) ? std::nullopt : std::optional(FileMcd_GetDefaultName(port).c_str()))); + + if (MenuButtonWithValue(fmt::format(ICON_FA_FILE " Card Name##card_name_{}", port).c_str(), + "The selected memory card image will be used for this slot.", value.has_value() ? value->c_str() : "Use Global Setting", + enabled)) + { + ImGuiFullscreen::ChoiceDialogOptions options; + std::vector names; + if (IsEditingGameSettings(bsi)) + options.emplace_back("Use Global Setting", !value.has_value()); + if (value.has_value() && !value->empty()) + { + options.emplace_back(fmt::format("{} (Current)", value.value()), true); + names.push_back(std::move(value.value())); + } + for (AvailableMcdInfo& mci : FileMcd_GetAvailableCards(IsEditingGameSettings(bsi))) + { + if (mci.type == MemoryCardType::Folder) + { + options.emplace_back(fmt::format("{} (Folder)", mci.name), false); + } + else + { + static constexpr const char* file_type_names[] = { + "Unknown", "PS2 (8MB)", "PS2 (16MB)", "PS2 (32MB)", "PS2 (64MB)", "PS1"}; + options.emplace_back(fmt::format("{} ({})", mci.name, file_type_names[static_cast(mci.file_type)]), false); + } + names.push_back(std::move(mci.name)); + } + OpenChoiceDialog(title.c_str(), false, std::move(options), + [game_settings = IsEditingGameSettings(bsi), names = std::move(names), file_key = std::move(file_key)]( + s32 index, const std::string& title, bool checked) { + if (index < 0) + return; + + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(game_settings); + if (game_settings && index == 0) + { + bsi->DeleteValue("MemoryCards", file_key.c_str()); + } + else + { + if (game_settings) + index--; + bsi->SetStringValue("MemoryCards", file_key.c_str(), names[index].c_str()); + } + SetSettingsChanged(bsi); + CloseChoiceDialog(); + }); + } + + if (MenuButton( + fmt::format(ICON_FA_EJECT " Eject Card##eject_card_{}", port).c_str(), "Resets the card name for this slot.", enabled)) + { + bsi->SetStringValue("MemoryCards", file_key.c_str(), ""); + SetSettingsChanged(bsi); + } + } + + + EndMenuButtons(); +} + +void FullscreenUI::DrawCreateMemoryCardWindow() +{ + ImGui::SetNextWindowSize(LayoutScale(700.0f, 0.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushFont(g_large_font); + + bool is_open = true; + if (ImGui::BeginPopupModal("Create Memory Card", &is_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize)) + { + ImGui::TextWrapped("Enter the name of the memory card you wish to create, and choose a size. We recommend either using 8MB memory " + "cards, or folder memory cards for best compatibility."); + ImGui::NewLine(); + + static char memcard_name[256] = {}; + ImGui::Text("Card Name: "); + ImGui::InputText("##name", memcard_name, sizeof(memcard_name)); + + ImGui::NewLine(); + + static constexpr std::tuple memcard_types[] = { + {"8 MB [Most Compatible]", MemoryCardType::File, MemoryCardFileType::PS2_8MB}, + {"16 MB", MemoryCardType::File, MemoryCardFileType::PS2_8MB}, + {"32 MB", MemoryCardType::File, MemoryCardFileType::PS2_8MB}, + {"64 MB", MemoryCardType::File, MemoryCardFileType::PS2_8MB}, + {"Folder [Recommended]", MemoryCardType::Folder, MemoryCardFileType::PS2_8MB}, + {"128 KB [PS1]", MemoryCardType::File, MemoryCardFileType::PS1}, + }; + + static int memcard_type = 0; + for (int i = 0; i < static_cast(std::size(memcard_types)); i++) + ImGui::RadioButton(std::get<0>(memcard_types[i]), &memcard_type, i); + + ImGui::NewLine(); + + BeginMenuButtons(); + + const bool create_enabled = (std::strlen(memcard_name) > 0); + + if (ActiveButton(ICON_FA_FOLDER_OPEN " Create", false, create_enabled) && std::strlen(memcard_name) > 0) + { + const std::string real_card_name(fmt::format("{}.ps2", memcard_name)); + if (!FileMcd_GetCardInfo(real_card_name).has_value()) + { + const auto& [type_title, type, file_type] = memcard_types[memcard_type]; + if (FileMcd_CreateNewCard(real_card_name, type, file_type)) + { + ShowToast(std::string(), fmt::format("Memory card '{}' created.", real_card_name)); + + std::memset(memcard_name, 0, sizeof(memcard_name)); + memcard_type = 0; + ImGui::CloseCurrentPopup(); + } + else + { + ShowToast(std::string(), fmt::format("Failed to create memory card '{}'.", real_card_name)); + } + } + else + { + ShowToast(std::string(), fmt::format("A memory card with the name '{}' already exists.", real_card_name)); + } + } + + if (ActiveButton(ICON_FA_TIMES " Cancel", false)) + { + std::memset(memcard_name, 0, sizeof(memcard_name)); + memcard_type = 0; + + ImGui::CloseCurrentPopup(); + } + + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopFont(); + ImGui::PopStyleVar(2); +} + +void FullscreenUI::CopyGlobalControllerSettingsToGame() +{ + SettingsInterface* dsi = GetEditingSettingsInterface(true); + SettingsInterface* ssi = GetEditingSettingsInterface(false); + + PAD::CopyConfiguration(dsi, *ssi, true, true, false); + SetSettingsChanged(dsi); + + ShowToast(std::string(), "Per-game controller configuration initialized with global settings."); +} + +void FullscreenUI::ResetControllerSettings() +{ + SettingsInterface* dsi = GetEditingSettingsInterface(); + + PAD::SetDefaultControllerConfig(*dsi); + PAD::SetDefaultHotkeyConfig(*dsi); + ShowToast(std::string(), "Controller settings reset to default."); +} + +void FullscreenUI::DoLoadInputProfile() +{ + std::vector profiles(PAD::GetInputProfileNames()); + if (profiles.empty()) + { + ShowToast(std::string(), "No input profiles available."); + return; + } + + ImGuiFullscreen::ChoiceDialogOptions coptions; + coptions.reserve(profiles.size()); + for (std::string& name : profiles) + coptions.emplace_back(std::move(name), false); + OpenChoiceDialog( + ICON_FA_FOLDER_OPEN " Load Profile", false, std::move(coptions), [](s32 index, const std::string& title, bool checked) { + if (index < 0) + return; + + INISettingsInterface ssi(VMManager::GetInputProfilePath(title)); + if (!ssi.Load()) + { + ShowToast(std::string(), fmt::format("Failed to load '{}'.", title)); + CloseChoiceDialog(); + return; + } + + auto lock = Host::GetSettingsLock(); + SettingsInterface* dsi = GetEditingSettingsInterface(); + PAD::CopyConfiguration(dsi, ssi, true, true, IsEditingGameSettings(dsi)); + SetSettingsChanged(dsi); + ShowToast(std::string(), fmt::format("Input profile '{}' loaded.", title)); + CloseChoiceDialog(); + }); +} + +void FullscreenUI::DoSaveInputProfile(const std::string& name) +{ + INISettingsInterface dsi(VMManager::GetInputProfilePath(name)); + + auto lock = Host::GetSettingsLock(); + SettingsInterface* ssi = GetEditingSettingsInterface(); + PAD::CopyConfiguration(&dsi, *ssi, true, true, IsEditingGameSettings(ssi)); + if (dsi.Save()) + ShowToast(std::string(), fmt::format("Input profile '{}' saved.", name)); + else + ShowToast(std::string(), fmt::format("Failed to save input profile '{}'.", name)); +} + +void FullscreenUI::DoSaveInputProfile() +{ + std::vector profiles(PAD::GetInputProfileNames()); + + ImGuiFullscreen::ChoiceDialogOptions coptions; + coptions.reserve(profiles.size() + 1); + coptions.emplace_back("Create New...", false); + for (std::string& name : profiles) + coptions.emplace_back(std::move(name), false); + OpenChoiceDialog(ICON_FA_SAVE " Save Profile", false, std::move(coptions), [](s32 index, const std::string& title, bool checked) { + if (index < 0) + return; + + if (index > 0) + { + DoSaveInputProfile(title); + CloseChoiceDialog(); + return; + } + + CloseChoiceDialog(); + + OpenInputStringDialog(ICON_FA_SAVE " Save Profile", "Enter the name of the input profile you wish to create.", std::string(), + ICON_FA_FOLDER_PLUS " Create", [](std::string title) { + if (!title.empty()) + DoSaveInputProfile(title); + }); + }); +} + +void FullscreenUI::DoResetSettings() +{ + OpenConfirmMessageDialog(ICON_FA_FOLDER_MINUS " Reset Settings", + "Are you sure you want to restore the default settings? Any preferences will be lost.", [](bool result) { + if (result) + { + Host::RunOnCPUThread([]() { Host::RequestResetSettings(false, true, false, false, false); }); + ShowToast(std::string(), "Settings reset to defaults."); + } + }); +} + +void FullscreenUI::DrawControllerSettingsPage() +{ + BeginMenuButtons(); + + SettingsInterface* bsi = GetEditingSettingsInterface(); + + MenuHeading("Configuration"); + + if (IsEditingGameSettings(bsi)) + { + if (DrawToggleSetting(bsi, ICON_FA_COG " Per-Game Configuration", "Uses game-specific settings for controllers for this game.", + "Pad", "UseGameSettingsForController", false, IsEditingGameSettings(bsi), false)) + { + // did we just enable per-game for the first time? + if (bsi->GetBoolValue("Pad", "UseGameSettingsForController", false) && + !bsi->GetBoolValue("Pad", "GameSettingsInitialized", false)) + { + bsi->SetBoolValue("Pad", "GameSettingsInitialized", true); + CopyGlobalControllerSettingsToGame(); + } + } + } + + if (IsEditingGameSettings(bsi) && !bsi->GetBoolValue("Pad", "UseGameSettingsForController", false)) + { + // nothing to edit.. + EndMenuButtons(); + return; + } + + if (IsEditingGameSettings(bsi)) + { + if (MenuButton(ICON_FA_COPY " Copy Global Settings", "Copies the global controller configuration to this game.")) + CopyGlobalControllerSettingsToGame(); + } + else + { + if (MenuButton(ICON_FA_FOLDER_MINUS " Reset Settings", "Resets all configuration to defaults (including bindings).")) + ResetControllerSettings(); + } + + if (MenuButton(ICON_FA_FOLDER_OPEN " Load Profile", "Replaces these settings with a previously saved input profile.")) + DoLoadInputProfile(); + if (MenuButton(ICON_FA_SAVE " Save Profile", "Stores the current settings to an input profile.")) + DoSaveInputProfile(); + + MenuHeading("Input Sources"); + +#ifdef SDL_BUILD + DrawToggleSetting(bsi, ICON_FA_COG " Enable SDL Input Source", "The SDL input source supports most controllers.", "InputSources", "SDL", + true, true, false); + DrawToggleSetting(bsi, ICON_FA_WIFI " SDL DualShock 4 / DualSense Enhanced Mode", + "Provides vibration and LED control support over Bluetooth.", "InputSources", "SDLControllerEnhancedMode", false, + bsi->GetBoolValue("InputSources", "SDL", true), false); +#endif +#ifdef _WIN32 + DrawToggleSetting(bsi, ICON_FA_COG " Enable XInput Input Source", + "The XInput source provides support for XBox 360/XBox One/XBox Series controllers.", "InputSources", "XInput", false, true, false); +#endif + + MenuHeading("Multitap"); + DrawToggleSetting(bsi, ICON_FA_PLUS_SQUARE " Enable Console Port 1 Multitap", + "Enables an additional three controller slots. Not supported in all games.", "Pad", "MultitapPort1", false, true, false); + DrawToggleSetting(bsi, ICON_FA_PLUS_SQUARE " Enable Console Port 2 Multitap", + "Enables an additional three controller slots. Not supported in all games.", "Pad", "MultitapPort2", false, true, false); + + const std::array mtap_enabled = { + {bsi->GetBoolValue("Pad", "MultitapPort1", false), bsi->GetBoolValue("Pad", "MultitapPort2", false)}}; + + // we reorder things a little to make it look less silly for mtap + static constexpr const std::array mtap_slot_names = {{'A', 'B', 'C', 'D'}}; + static constexpr const std::array mtap_port_order = {{0, 2, 3, 4, 1, 5, 6, 7}}; + static constexpr const std::array sections = { + {"Pad1", "Pad2", "Pad3", "Pad4", "Pad5", "Pad6", "Pad7", "Pad8"}}; + + // create the ports + for (u32 global_slot : mtap_port_order) + { + const bool is_mtap_port = sioPadIsMultitapSlot(global_slot); + const auto [mtap_port, mtap_slot] = sioConvertPadToPortAndSlot(global_slot); + if (is_mtap_port && !mtap_enabled[mtap_port]) + continue; + + MenuHeading( + (mtap_enabled[mtap_port] ? fmt::format(ICON_FA_PLUG " Controller Port {}{}", mtap_port + 1, mtap_slot_names[mtap_slot]) : + fmt::format(ICON_FA_PLUG " Controller Port {}", mtap_port + 1)) + .c_str()); + + const char* section = sections[global_slot]; + const std::string type(bsi->GetStringValue(section, "Type", PAD::GetDefaultPadType(global_slot))); + const PAD::ControllerInfo* ci = PAD::GetControllerInfo(type); + if (MenuButton(fmt::format(ICON_FA_GAMEPAD " Controller Type##type{}", global_slot).c_str(), ci ? ci->display_name : "Unknown")) + { + std::vector> raw_options(PAD::GetControllerTypeNames()); + ImGuiFullscreen::ChoiceDialogOptions options; + options.reserve(raw_options.size()); + for (auto& it : raw_options) + { + options.emplace_back(std::move(it.second), type == it.first); + } + OpenChoiceDialog(fmt::format("Port {} Controller Type", global_slot + 1).c_str(), false, std::move(options), + [game_settings = IsEditingGameSettings(bsi), section, raw_options = std::move(raw_options)]( + s32 index, const std::string& title, bool checked) { + if (index < 0) + return; + + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(game_settings); + bsi->SetStringValue(section, "Type", raw_options[index].first.c_str()); + SetSettingsChanged(bsi); + CloseChoiceDialog(); + }); + } + + if (!ci || ci->num_bindings == 0) + continue; + + if (MenuButton(ICON_FA_MAGIC " Automatic Mapping", "Attempts to map the selected port to a chosen controller.")) + StartAutomaticBinding(global_slot); + + for (u32 i = 0; i < ci->num_bindings; i++) + { + const PAD::ControllerBindingInfo& bi = ci->bindings[i]; + DrawInputBindingButton(bsi, bi.type, section, bi.name, bi.display_name, true); + } + + MenuHeading((mtap_enabled[mtap_port] ? + fmt::format(ICON_FA_MICROCHIP " Controller Port {}{} Macros", mtap_port + 1, mtap_slot_names[mtap_slot]) : + fmt::format(ICON_FA_MICROCHIP " Controller Port {} Macros", mtap_port + 1)) + .c_str()); + + for (u32 macro_index = 0; macro_index < PAD::NUM_MACRO_BUTTONS_PER_CONTROLLER; macro_index++) + { + DrawInputBindingButton(bsi, PAD::ControllerBindingType::Macro, section, fmt::format("Macro{}", macro_index + 1).c_str(), + fmt::format("Macro {} Trigger", macro_index + 1).c_str()); + + std::string binds_string(bsi->GetStringValue(section, fmt::format("Macro{}Binds", macro_index + 1).c_str())); + if (MenuButton(fmt::format(ICON_FA_KEYBOARD " Macro {} Buttons", macro_index + 1).c_str(), + binds_string.empty() ? "No Buttons Selected" : binds_string.c_str())) + { + std::vector buttons_split(StringUtil::SplitString(binds_string, '&', true)); + ImGuiFullscreen::ChoiceDialogOptions options; + for (u32 i = 0; i < ci->num_bindings; i++) + { + const PAD::ControllerBindingInfo& bi = ci->bindings[i]; + if (bi.type != PAD::ControllerBindingType::Button && bi.type != PAD::ControllerBindingType::Axis && + bi.type != PAD::ControllerBindingType::HalfAxis) + { + continue; + } + options.emplace_back(bi.display_name, std::any_of(buttons_split.begin(), buttons_split.end(), + [bi](const std::string_view& it) { return (it == bi.name); })); + } + + OpenChoiceDialog(fmt::format("Select Macro {} Binds", macro_index + 1).c_str(), true, std::move(options), + [section, macro_index, ci](s32 index, const std::string& title, bool checked) { + // convert display name back to bind name + std::string_view to_modify; + for (u32 j = 0; j < ci->num_bindings; j++) + { + const PAD::ControllerBindingInfo& bi = ci->bindings[j]; + if (bi.display_name == title) + { + to_modify = bi.name; + break; + } + } + if (to_modify.empty()) + { + // wtf? + return; + } + + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(); + const std::string key(fmt::format("Macro{}Binds", macro_index + 1)); + + std::string binds_string(bsi->GetStringValue(section, key.c_str())); + std::vector buttons_split(StringUtil::SplitString(binds_string, '&', true)); + auto it = std::find(buttons_split.begin(), buttons_split.end(), to_modify); + if (checked) + { + if (it == buttons_split.end()) + buttons_split.push_back(to_modify); + } + else + { + if (it != buttons_split.end()) + buttons_split.erase(it); + } + + binds_string = StringUtil::JoinString(buttons_split.begin(), buttons_split.end(), " & "); + if (binds_string.empty()) + bsi->DeleteValue(section, key.c_str()); + else + bsi->SetStringValue(section, key.c_str(), binds_string.c_str()); + }); + } + + const std::string freq_key(fmt::format("Macro{}Frequency", macro_index + 1)); + const std::string freq_title(fmt::format(ICON_FA_LIGHTBULB " Macro {} Frequency", macro_index + 1)); + s32 frequency = bsi->GetIntValue(section, freq_key.c_str(), 0); + const std::string freq_summary((frequency == 0) ? std::string("Macro will not auto-toggle.") : + fmt::format("Macro will toggle every {} frames.", frequency)); + if (MenuButton(freq_title.c_str(), freq_summary.c_str())) + ImGui::OpenPopup(freq_title.c_str()); + + ImGui::SetNextWindowSize(LayoutScale(500.0f, 180.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, + LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING)); + + if (ImGui::BeginPopupModal( + freq_title.c_str(), nullptr, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::SetNextItemWidth(LayoutScale(450.0f)); + if (ImGui::SliderInt("##value", &frequency, 0, 60, "Toggle every %d frames", ImGuiSliderFlags_NoInput)) + { + if (frequency == 0) + bsi->DeleteValue(section, freq_key.c_str()); + else + bsi->SetIntValue(section, freq_key.c_str(), frequency); + } + + BeginMenuButtons(); + if (MenuButton("OK", nullptr, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + ImGui::CloseCurrentPopup(); + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(4); + ImGui::PopFont(); + } + + if (ci->num_settings > 0) + { + MenuHeading((mtap_enabled[mtap_port] ? + fmt::format(ICON_FA_SLIDERS_H " Controller Port {}{} Settings", mtap_port + 1, mtap_slot_names[mtap_slot]) : + fmt::format(ICON_FA_SLIDERS_H " Controller Port {} Settings", mtap_port + 1)) + .c_str()); + + for (u32 i = 0; i < ci->num_settings; i++) + { + const PAD::ControllerSettingInfo& si = ci->settings[i]; + std::string title(fmt::format(ICON_FA_COG " {}", si.display_name)); + switch (si.type) + { + case PAD::ControllerSettingInfo::Type::Boolean: + DrawToggleSetting(bsi, title.c_str(), si.description, section, si.name, si.BooleanDefaultValue(), true, false); + break; + case PAD::ControllerSettingInfo::Type::Integer: + DrawIntRangeSetting(bsi, title.c_str(), si.description, section, si.name, si.IntegerDefaultValue(), + si.IntegerMinValue(), si.IntegerMaxValue(), si.format, true); + break; + case PAD::ControllerSettingInfo::Type::IntegerList: + DrawIntListSetting(bsi, title.c_str(), si.description, section, si.name, si.IntegerDefaultValue(), si.options, 0, + si.IntegerMinValue(), true); + break; + case PAD::ControllerSettingInfo::Type::Float: + DrawFloatSpinBoxSetting(bsi, title.c_str(), si.description, section, si.name, si.FloatDefaultValue(), + si.FloatMinValue(), si.FloatMaxValue(), si.FloatStepValue(), si.multiplier, si.format, true); + break; + default: + break; + } + } + } + } + + EndMenuButtons(); +} + +void FullscreenUI::DrawHotkeySettingsPage() +{ + SettingsInterface* bsi = GetEditingSettingsInterface(); + + BeginMenuButtons(); + + InputManager::GetHotkeyList(); + + const HotkeyInfo* last_category = nullptr; + for (const HotkeyInfo* hotkey : s_hotkey_list_cache) + { + if (!last_category || std::strcmp(hotkey->category, last_category->category) != 0) + { + MenuHeading(hotkey->category); + last_category = hotkey; + } + + DrawInputBindingButton(bsi, PAD::ControllerBindingType::Button, "Hotkeys", hotkey->name, hotkey->display_name, false); + } + + EndMenuButtons(); +} + +void FullscreenUI::DrawFoldersSettingsPage() +{ + SettingsInterface* bsi = GetEditingSettingsInterface(); + + BeginMenuButtons(); + + MenuHeading("Data Save Locations"); + + DrawFolderSetting(bsi, ICON_FA_CALENDAR " Cache Directory", "Folders", "Cache", EmuFolders::Cache); + DrawFolderSetting(bsi, ICON_FA_FOLDER " Covers Directory", "Folders", "Covers", EmuFolders::Covers); + DrawFolderSetting(bsi, ICON_FA_CAMERA " Snapshots Directory", "Folders", "Snapshots", EmuFolders::Snapshots); + DrawFolderSetting(bsi, ICON_FA_DOWNLOAD " Save States Directory", "Folders", "Savestates", EmuFolders::Savestates); + DrawFolderSetting(bsi, ICON_FA_WRENCH " Game Settings Directory", "Folders", "GameSettings", EmuFolders::GameSettings); + DrawFolderSetting(bsi, ICON_FA_GAMEPAD " Input Profile Directory", "Folders", "InputProfiles", EmuFolders::InputProfiles); + DrawFolderSetting(bsi, ICON_FA_FROWN " Cheats Directory", "Folders", "Cheats", EmuFolders::Cheats); + DrawFolderSetting(bsi, ICON_FA_TV " Widescreen Cheats Directory", "Folders", "CheatsWS", EmuFolders::CheatsWS); + DrawFolderSetting(bsi, ICON_FA_MAGIC " No-Interlace Cheats Directory", "Folders", "CheatsNI", EmuFolders::CheatsNI); + DrawFolderSetting(bsi, ICON_FA_SLIDERS_H "Texture Replacements Directory", "Folders", "Textures", EmuFolders::Textures); + + EndMenuButtons(); +} + +#ifndef ENABLE_ACHIEVEMENTS + +void FullscreenUI::DrawAchievementsSettingsPage(std::unique_lock& settings_lock) +{ + BeginMenuButtons(); + ActiveButton(ICON_FA_BAN " This build was not compiled with Achievements support.", false, false, + ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + EndMenuButtons(); +} + +#endif + +void FullscreenUI::DrawAdvancedSettingsPage() +{ + static constexpr const char* ee_rounding_mode_settings[] = {"Nearest", "Negative", "Positive", "Chop/Zero (Default)"}; + + SettingsInterface* bsi = GetEditingSettingsInterface(); + + const bool show_advanced_settings = ShouldShowAdvancedSettings(bsi); + + BeginMenuButtons(); + + if (!IsEditingGameSettings(bsi)) + { + DrawToggleSetting(bsi, "Show Advanced Settings", + "Changing these options may cause games to become non-functional. Modify at your own risk, the PCSX2 team will not provide " + "support for configurations with these settings changed.", + "UI", "ShowAdvancedSettings", false); + } + + MenuHeading("Logging"); + + DrawToggleSetting(bsi, "System Console", "Writes log messages to the system console (console window/standard output).", "Logging", + "EnableSystemConsole", false); + DrawToggleSetting(bsi, "File Logging", "Writes log messages to emulog.txt.", "Logging", "EnableFileLogging", false); + DrawToggleSetting(bsi, "Verbose Logging", "Writes dev log messages to log sinks.", "Logging", "EnableVerbose", false, !IsDevBuild); + + if (show_advanced_settings) + { + DrawToggleSetting(bsi, "Log Timestamps", "Writes timestamps alongside log messages.", "Logging", "EnableTimestamps", true); + DrawToggleSetting( + bsi, "EE Console", "Writes debug messages from the game's EE code to the console.", "Logging", "EnableEEConsole", true); + DrawToggleSetting( + bsi, "IOP Console", "Writes debug messages from the game's IOP code to the console.", "Logging", "EnableIOPConsole", true); + DrawToggleSetting(bsi, "CDVD Verbose Reads", "Logs disc reads from games.", "EmuCore", "CdvdVerboseReads", false); + } + + if (show_advanced_settings) + { + MenuHeading("Emotion Engine"); + + DrawIntListSetting(bsi, "Rounding Mode##ee_rounding_mode", + "Determines how the results of floating-point operations are rounded. Some games need specific settings.", "EmuCore/CPU", + "FPU.Roundmode", 3, ee_rounding_mode_settings, std::size(ee_rounding_mode_settings)); + DrawClampingModeSetting(bsi, "Clamping Mode##ee_clamping_mode", + "Determines how out-of-range floating point numbers are handled. Some games need specific settings.", false); + + DrawToggleSetting(bsi, "Enable EE Recompiler", + "Performs just-in-time binary translation of 64-bit MIPS-IV machine code to native code.", "EmuCore/CPU/Recompiler", "EnableEE", + true); + DrawToggleSetting( + bsi, "Enable EE Cache", "Enables simulation of the EE's cache. Slow.", "EmuCore/CPU/Recompiler", "EnableEECache", false); + DrawToggleSetting(bsi, "Enable INTC Spin Detection", "Huge speedup for some games, with almost no compatibility side effects.", + "EmuCore/Speedhacks", "IntcStat", true); + DrawToggleSetting(bsi, "Enable Wait Loop Detection", "Moderate speedup for some games, with no known side effects.", + "EmuCore/Speedhacks", "WaitLoop", true); + DrawToggleSetting(bsi, "Enable Fast Memory Access", "Uses backpatching to avoid register flushing on every memory access.", + "EmuCore/CPU/Recompiler", "EnableFastmem", true); + + MenuHeading("Vector Units"); + DrawIntListSetting(bsi, "Rounding Mode##vu_rounding_mode", + "Determines how the results of floating-point operations are rounded. Some games need specific settings.", "EmuCore/CPU", + "VU.Roundmode", 3, ee_rounding_mode_settings, std::size(ee_rounding_mode_settings)); + DrawClampingModeSetting(bsi, "Clamping Mode##vu_clamping_mode", + "Determines how out-of-range floating point numbers are handled. Some games need specific settings.", true); + DrawToggleSetting(bsi, "Enable VU0 Recompiler (Micro Mode)", + "New Vector Unit recompiler with much improved compatibility. Recommended.", "EmuCore/CPU/Recompiler", "EnableVU0", true); + DrawToggleSetting(bsi, "Enable VU1 Recompiler", "New Vector Unit recompiler with much improved compatibility. Recommended.", + "EmuCore/CPU/Recompiler", "EnableVU1", true); + DrawToggleSetting(bsi, "Enable VU Flag Optimization", "Good speedup and high compatibility, may cause graphical errors.", + "EmuCore/Speedhacks", "vuFlagHack", true); + + MenuHeading("I/O Processor"); + DrawToggleSetting(bsi, "Enable IOP Recompiler", + "Performs just-in-time binary translation of 32-bit MIPS-I machine code to native code.", "EmuCore/CPU/Recompiler", "EnableIOP", + true); + + MenuHeading("Graphics"); + DrawToggleSetting( + bsi, "Use Debug Device", "Enables API-level validation of graphics commands", "EmuCore/GS", "UseDebugDevice", false); + } + + EndMenuButtons(); +} + +void FullscreenUI::DrawGameFixesSettingsPage() +{ + SettingsInterface* bsi = GetEditingSettingsInterface(); + + BeginMenuButtons(); + + MenuHeading("Game Fixes"); + ActiveButton("Game fixes should not be modified unless you are aware of what each option does and the implications of doing so.", false, + false, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + + DrawToggleSetting(bsi, "FPU Multiply Hack", "For Tales of Destiny.", "EmuCore/Gamefixes", "FpuMulHack", false); + DrawToggleSetting(bsi, "FPU Negative Div Hack", "For Gundam games.", "EmuCore/Gamefixes", "FpuNegDivHack", false); + DrawToggleSetting(bsi, "Preload TLB Hack", "To avoid tlb miss on Goemon.", "EmuCore/Gamefixes", "GoemonTlbHack", false); + DrawToggleSetting(bsi, "Switch to Software renderer for FMVs.", "Needed for some games with complex FMV rendering.", + "EmuCore/Gamefixes", "SoftwareRendererFMVHack", false); + DrawToggleSetting( + bsi, "Skip MPEG Hack", "Skips videos/FMVs in games to avoid game hanging/freezes.", "EmuCore/Gamefixes", "SkipMPEGHack", false); + DrawToggleSetting(bsi, "OPH Flag Hack", "Known to affect following games: Bleach Blade Battler, Growlanser II and III, Wizardry.", + "EmuCore/Gamefixes", "OPHFlagHack", false); + DrawToggleSetting(bsi, "EE Timing Hack", + "Known to affect following games: Digital Devil Saga (Fixes FMV and crashes), SSX (Fixes bad graphics and crashes).", + "EmuCore/Gamefixes", "EETimingHack", false); + DrawToggleSetting(bsi, "Instant DMA Hack", "Known to affect following games: Fire Pro Wrestling Z (Bad ring graphics).", + "EmuCore/Gamefixes", "InstantDMAHack", false); + DrawToggleSetting(bsi, "Handle DMAC writes when it is busy.", + "Known to affect following games: Mana Khemia 1 (Going \"off campus\"), Metal Saga (Intro FMV), Pilot Down Behind Enemy Lines.", + "EmuCore/Gamefixes", "DMABusyHack", false); + DrawToggleSetting(bsi, "Force GIF PATH3 transfers through FIFO", "(Fifa Street 2).", "EmuCore/Gamefixes", "GIFFIFOHack", false); + DrawToggleSetting(bsi, "Simulate VIF1 FIFO read ahead. Fixes slow loading games.", + "Known to affect following games: Test Drive Unlimited, Transformers.", "EmuCore/Gamefixes", "VIFFIFOHack", false); + DrawToggleSetting( + bsi, "Delay VIF1 Stalls (VIF1 FIFO)", "For SOCOM 2 HUD and Spy Hunter loading hang.", "EmuCore/Gamefixes", "VIF1StallHack", false); + DrawToggleSetting(bsi, "VU Add Hack", "Games that need this hack to boot: Star Ocean 3, Radiata Stories, Valkyrie Profile 2.", + "EmuCore/Gamefixes", "VuAddSubHack", false); + DrawToggleSetting(bsi, "VU I bit Hack avoid constant recompilation in some games", + "Scarface The World Is Yours, Crash Tag Team Racing.", "EmuCore/Gamefixes", "IbitHack", false); + DrawToggleSetting( + bsi, "Full VU0 Synchronization", "Forces tight VU0 sync on every COP2 instruction.", "EmuCore/Gamefixes", "FullVU0SyncHack", false); + DrawToggleSetting(bsi, "VU Sync (Run behind)", "To avoid sync problems when reading or writing VU registers.", "EmuCore/Gamefixes", + "VUSyncHack", false); + DrawToggleSetting( + bsi, "VU Overflow Hack", "To check for possible float overflows (Superman Returns).", "EmuCore/Gamefixes", "VUOverflowHack", false); + DrawToggleSetting(bsi, "VU XGkick Sync", "Use accurate timing for VU XGKicks (slower).", "EmuCore/Gamefixes", "XgKickHack", false); + DrawToggleSetting(bsi, "Use Blit for internal FPS", + "Use alternative method to calclate internal FPS to avoid false readings in some games.", "EmuCore/Gamefixes", + "BlitInternalFPSHack", false); + + EndMenuButtons(); +} + +static void DrawShadowedText( + ImDrawList* dl, ImFont* font, const ImVec2& pos, u32 col, const char* text, const char* text_end = nullptr, float wrap_width = 0.0f) +{ + dl->AddText(font, font->FontSize, pos + LayoutScale(1.0f, 1.0f), IM_COL32(0, 0, 0, 100), text, text_end, wrap_width); + dl->AddText(font, font->FontSize, pos, col, text, text_end, wrap_width); +} + +void FullscreenUI::DrawPauseMenu(MainWindowType type) +{ + ImDrawList* dl = ImGui::GetBackgroundDrawList(); + const ImVec2 display_size(ImGui::GetIO().DisplaySize); + dl->AddRectFilled(ImVec2(0.0f, 0.0f), display_size, IM_COL32(0x21, 0x21, 0x21, 200)); + + // title info + { +#ifdef ENABLE_ACHIEVEMENTS + const bool has_rich_presence = Achievements::IsActive() && !Achievements::GetRichPresenceString().empty(); +#else + const bool has_rich_presence = false; +#endif + + const float image_width = has_rich_presence ? 60.0f : 50.0f; + const float image_height = has_rich_presence ? 90.0f : 75.0f; + const std::string_view path_string(Path::GetFileName(s_current_game_path)); + const ImVec2 title_size( + g_large_font->CalcTextSizeA(g_large_font->FontSize, std::numeric_limits::max(), -1.0f, s_current_game_title.c_str())); + const ImVec2 path_size(path_string.empty() ? + ImVec2(0.0f, 0.0f) : + g_medium_font->CalcTextSizeA(g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, + path_string.data(), path_string.data() + path_string.length())); + const ImVec2 subtitle_size(g_medium_font->CalcTextSizeA( + g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, s_current_game_subtitle.c_str())); + + ImVec2 title_pos( + display_size.x - LayoutScale(10.0f + image_width + 20.0f) - title_size.x, display_size.y - LayoutScale(10.0f + image_height)); + ImVec2 path_pos(display_size.x - LayoutScale(10.0f + image_width + 20.0f) - path_size.x, + title_pos.y + g_large_font->FontSize + LayoutScale(4.0f)); + ImVec2 subtitle_pos(display_size.x - LayoutScale(10.0f + image_width + 20.0f) - subtitle_size.x, + (path_string.empty() ? title_pos.y : path_pos.y) + g_medium_font->FontSize + LayoutScale(4.0f)); + + float rp_height = 0.0f; + + DrawShadowedText(dl, g_large_font, title_pos, IM_COL32(255, 255, 255, 255), s_current_game_title.c_str()); + if (!path_string.empty()) + { + DrawShadowedText( + dl, g_medium_font, path_pos, IM_COL32(255, 255, 255, 255), path_string.data(), path_string.data() + path_string.length()); + } + DrawShadowedText(dl, g_medium_font, subtitle_pos, IM_COL32(255, 255, 255, 255), s_current_game_subtitle.c_str()); + +#ifdef ENABLE_ACHIEVEMENTS + if (has_rich_presence) + { + const auto lock = Achievements::GetLock(); + const std::string& rp = Achievements::GetRichPresenceString(); + if (!rp.empty()) + { + const float wrap_width = LayoutScale(350.0f); + const ImVec2 rp_size = g_medium_font->CalcTextSizeA( + g_medium_font->FontSize, std::numeric_limits::max(), wrap_width, rp.data(), rp.data() + rp.size()); + + // we make the image one line higher, so we only need to compensate when it's multiline RP + rp_height = rp_size.y - g_medium_font->FontSize; + + const ImVec2 rp_pos(display_size.x - LayoutScale(20.0f + 50.0f + 20.0f) - rp_size.x - rp_height, + subtitle_pos.y + g_medium_font->FontSize + LayoutScale(4.0f)); + + title_pos.y -= rp_height; + path_pos.y -= rp_height; + subtitle_pos.y -= rp_height; + + DrawShadowedText(dl, g_medium_font, rp_pos, IM_COL32(255, 255, 255, 255), rp.data(), rp.data() + rp.size(), wrap_width); + } + } +#endif + + + HostDisplayTexture* const cover = GetCoverForCurrentGame(); + const ImVec2 image_min( + display_size.x - LayoutScale(10.0f + image_width) - rp_height, display_size.y - LayoutScale(10.0f + image_height) - rp_height); + const ImVec2 image_max(image_min.x + LayoutScale(image_width) + rp_height, image_min.y + LayoutScale(image_height) + rp_height); + const ImRect image_rect(CenterImage( + ImRect(image_min, image_max), ImVec2(static_cast(cover->GetWidth()), static_cast(cover->GetHeight())))); + dl->AddImage(cover->GetHandle(), image_rect.Min, image_rect.Max); + } + + // current time / play time + { + char buf[256]; + struct tm ltime; + const std::time_t ctime(std::time(nullptr)); +#ifdef _MSC_VER + localtime_s(<ime, &ctime); +#else + localtime_r(&ctime, <ime); +#endif + std::strftime(buf, sizeof(buf), "%X", <ime); + + const ImVec2 time_size(g_large_font->CalcTextSizeA(g_large_font->FontSize, std::numeric_limits::max(), -1.0f, buf)); + const ImVec2 time_pos(display_size.x - LayoutScale(10.0f) - time_size.x, LayoutScale(10.0f)); + DrawShadowedText(dl, g_large_font, time_pos, IM_COL32(255, 255, 255, 255), buf); + + if (!s_current_game_serial.empty()) + { + const std::time_t cached_played_time = GameList::GetCachedPlayedTimeForSerial(s_current_game_serial); + const std::time_t session_time = static_cast(CommonHost::GetSessionPlayedTime()); + const std::string played_time_str(GameList::FormatTimespan(cached_played_time + session_time, true)); + const std::string session_time_str(GameList::FormatTimespan(session_time, true)); + + std::snprintf(buf, std::size(buf), "This Session: %s", session_time_str.c_str()); + const ImVec2 session_size(g_medium_font->CalcTextSizeA(g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, buf)); + const ImVec2 session_pos( + display_size.x - LayoutScale(10.0f) - session_size.x, time_pos.y + g_large_font->FontSize + LayoutScale(4.0f)); + DrawShadowedText(dl, g_medium_font, session_pos, IM_COL32(255, 255, 255, 255), buf); + + std::snprintf(buf, std::size(buf), "All Time: %s", played_time_str.c_str()); + const ImVec2 total_size(g_medium_font->CalcTextSizeA(g_medium_font->FontSize, std::numeric_limits::max(), -1.0f, buf)); + const ImVec2 total_pos( + display_size.x - LayoutScale(10.0f) - total_size.x, session_pos.y + g_medium_font->FontSize + LayoutScale(4.0f)); + DrawShadowedText(dl, g_medium_font, total_pos, IM_COL32(255, 255, 255, 255), buf); + } + } + + const ImVec2 window_size(LayoutScale(500.0f, LAYOUT_SCREEN_HEIGHT)); + const ImVec2 window_pos(0.0f, display_size.y - window_size.y); + + if (BeginFullscreenWindow( + window_pos, window_size, "pause_menu", ImVec4(0.0f, 0.0f, 0.0f, 0.0f), 0.0f, 10.0f, ImGuiWindowFlags_NoBackground)) + { + static constexpr u32 submenu_item_count[] = { + 11, // None + 4, // Exit +#ifdef ENABLE_ACHIEVEMENTS + 3, // Achievements +#endif + }; + + const bool just_focused = ResetFocusHere(); + BeginMenuButtons(submenu_item_count[static_cast(s_current_pause_submenu)], 1.0f, ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, + ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + + switch (s_current_pause_submenu) + { + case PauseSubMenu::None: + { + // NOTE: Menu close must come first, because otherwise VM destruction options will race. + const bool can_load_or_save_state = s_current_game_crc != 0; + + if (ActiveButton(ICON_FA_PLAY " Resume Game", false) || WantsToCloseMenu()) + ClosePauseMenu(); + + if (ActiveButton(ICON_FA_FAST_FORWARD " Toggle Frame Limit", false)) + { + ClosePauseMenu(); + DoToggleFrameLimit(); + } + + if (ActiveButton(ICON_FA_UNDO " Load State", false, can_load_or_save_state)) + { + if (OpenSaveStateSelector(true)) + s_current_main_window = MainWindowType::None; + } + + if (ActiveButton(ICON_FA_DOWNLOAD " Save State", false, can_load_or_save_state)) + { + if (OpenSaveStateSelector(false)) + s_current_main_window = MainWindowType::None; + } + + if (ActiveButton(ICON_FA_WRENCH " Game Properties", false, can_load_or_save_state)) + { + SwitchToGameSettings(); + } + +#ifdef ENABLE_ACHIEVEMENTS + if (ActiveButton(ICON_FA_TROPHY " Achievements", false, + Achievements::HasActiveGame() && Achievements::SafeHasAchievementsOrLeaderboards())) + { + const auto lock = Achievements::GetLock(); + + // skip second menu and go straight to cheevos if there's no lbs + if (Achievements::GetLeaderboardCount() == 0) + SwitchToAchievementsWindow(); + else + OpenPauseSubMenu(PauseSubMenu::Achievements); + } +#else + ActiveButton(ICON_FA_TROPHY " Achievements", false, false); +#endif + + if (ActiveButton(ICON_FA_CAMERA " Save Screenshot", false)) + { + GSQueueSnapshot(std::string()); + ClosePauseMenu(); + } + + if (ActiveButton(GSConfig.UseHardwareRenderer() ? (ICON_FA_PAINT_BRUSH " Switch To Software Renderer") : + (ICON_FA_PAINT_BRUSH " Switch To Hardware Renderer"), + false)) + { + ClosePauseMenu(); + DoToggleSoftwareRenderer(); + } + + if (ActiveButton(ICON_FA_COMPACT_DISC " Change Disc", false)) + { + s_current_main_window = MainWindowType::None; + DoChangeDisc(); + } + + if (ActiveButton(ICON_FA_SLIDERS_H " Settings", false)) + SwitchToSettings(); + + if (ActiveButton(ICON_FA_POWER_OFF " Close Game", false)) + { + // skip submenu when we can't save anyway + if (!can_load_or_save_state) + DoShutdown(false); + else + OpenPauseSubMenu(PauseSubMenu::Exit); + } + } + break; + + case PauseSubMenu::Exit: + { + if (just_focused) + ImGui::SetFocusID(ImGui::GetID(ICON_FA_POWER_OFF " Exit Without Saving"), ImGui::GetCurrentWindow()); + + if (ActiveButton(ICON_FA_BACKWARD " Back To Pause Menu", false)) + { + OpenPauseSubMenu(PauseSubMenu::None); + } + + if (ActiveButton(ICON_FA_SYNC " Reset System", false)) + { + ClosePauseMenu(); + DoReset(); + } + + if (ActiveButton(ICON_FA_SAVE " Exit And Save State", false)) + DoShutdown(true); + + if (ActiveButton(ICON_FA_POWER_OFF " Exit Without Saving", false)) + DoShutdown(false); + } + break; + +#ifdef ENABLE_ACHIEVEMENTS + case PauseSubMenu::Achievements: + { + if (ActiveButton(ICON_FA_BACKWARD " Back To Pause Menu", false)) + OpenPauseSubMenu(PauseSubMenu::None); + + if (ActiveButton(ICON_FA_TROPHY " Achievements", false)) + SwitchToAchievementsWindow(); + + if (ActiveButton(ICON_FA_STOPWATCH " Leaderboards", false)) + SwitchToLeaderboardsWindow(); + } + break; +#endif + } + + EndMenuButtons(); + + EndFullscreenWindow(); + } + +#ifdef ENABLE_ACHIEVEMENTS + // Primed achievements must come first, because we don't want the pause screen to be behind them. + if (Achievements::GetPrimedAchievementCount() > 0) + DrawPrimedAchievementsList(); +#endif +} + +void FullscreenUI::InitializePlaceholderSaveStateListEntry( + SaveStateListEntry* li, const std::string& title, const std::string& serial, u32 crc, s32 slot) +{ + li->title = (slot == 0) ? std::string("Quick Save Slot") : fmt::format("Save Slot {0}##game_slot_{0}", slot); + li->summary = "No save present in this slot."; + li->path = {}; + li->timestamp = 0; + li->slot = slot; + li->preview_texture = {}; +} + +bool FullscreenUI::InitializeSaveStateListEntry( + SaveStateListEntry* li, const std::string& title, const std::string& serial, u32 crc, s32 slot) +{ + std::string filename(VMManager::GetSaveStateFileName(serial.c_str(), crc, slot)); + FILESYSTEM_STAT_DATA sd; + if (filename.empty() || !FileSystem::StatFile(filename.c_str(), &sd)) + { + InitializePlaceholderSaveStateListEntry(li, title, serial, crc, slot); + return false; + } + + li->title = (slot == 0) ? std::string("Quick Save Slot") : fmt::format("Save Slot {0}##game_slot_{0}", slot); + li->summary = fmt::format("Saved {}", TimeToPrintableString(sd.ModificationTime)); + li->slot = slot; + li->timestamp = sd.ModificationTime; + li->path = std::move(filename); + + li->preview_texture.reset(); + + u32 screenshot_width, screenshot_height; + std::vector screenshot_pixels; + if (SaveState_ReadScreenshot(li->path, &screenshot_width, &screenshot_height, &screenshot_pixels)) + { + li->preview_texture = g_host_display->CreateTexture( + screenshot_width, screenshot_height, screenshot_pixels.data(), sizeof(u32) * screenshot_width, false); + if (!li->preview_texture) + Console.Error("Failed to upload save state image to GPU"); + } + + return true; +} + +void FullscreenUI::ClearSaveStateEntryList() +{ + for (SaveStateListEntry& entry : s_save_state_selector_slots) + { + if (entry.preview_texture) + s_cleanup_textures.push_back(std::move(entry.preview_texture)); + } + s_save_state_selector_slots.clear(); +} + +u32 FullscreenUI::PopulateSaveStateListEntries(const std::string& title, const std::string& serial, u32 crc) +{ + ClearSaveStateEntryList(); + + for (s32 i = 1; i <= VMManager::NUM_SAVE_STATE_SLOTS; i++) + { + SaveStateListEntry li; + if (InitializeSaveStateListEntry(&li, title, serial, crc, i) || !s_save_state_selector_loading) + s_save_state_selector_slots.push_back(std::move(li)); + } + + return static_cast(s_save_state_selector_slots.size()); +} + +bool FullscreenUI::OpenLoadStateSelectorForGame(const std::string& game_path) +{ + auto lock = GameList::GetLock(); + const GameList::Entry* entry = GameList::GetEntryForPath(game_path.c_str()); + if (entry) + { + s_save_state_selector_loading = true; + if (PopulateSaveStateListEntries(entry->title.c_str(), entry->serial.c_str(), entry->crc) > 0) + { + s_save_state_selector_open = true; + s_save_state_selector_resuming = false; + s_save_state_selector_game_path = game_path; + return true; + } + } + + ShowToast({}, "No save states found.", 5.0f); + return false; +} + +bool FullscreenUI::OpenSaveStateSelector(bool is_loading) +{ + s_save_state_selector_game_path = {}; + s_save_state_selector_loading = is_loading; + s_save_state_selector_resuming = false; + if (PopulateSaveStateListEntries(s_current_game_title.c_str(), s_current_game_serial.c_str(), s_current_game_crc) > 0) + { + s_save_state_selector_open = true; + return true; + } + + ShowToast({}, "No save states found.", 5.0f); + return false; +} + +void FullscreenUI::CloseSaveStateSelector() +{ + ClearSaveStateEntryList(); + s_save_state_selector_open = false; + s_save_state_selector_submenu_index = -1; + s_save_state_selector_loading = false; + s_save_state_selector_resuming = false; + s_save_state_selector_game_path = {}; + if (s_current_main_window != MainWindowType::GameList) + ReturnToMainWindow(); +} + +void FullscreenUI::DrawSaveStateSelector(bool is_loading) +{ + ImGuiIO& io = ImGui::GetIO(); + + ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f)); + ImGui::SetNextWindowSize(io.DisplaySize); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_ChildBorderSize, 0.0f); + + const char* window_title = is_loading ? "Load State" : "Save State"; + ImGui::OpenPopup(window_title); + + bool is_open = true; + const bool valid = ImGui::BeginPopupModal(window_title, &is_open, + ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | + ImGuiWindowFlags_NoBackground); + if (!valid || !is_open) + { + if (valid) + ImGui::EndPopup(); + + ImGui::PopStyleVar(5); + if (!is_open) + CloseSaveStateSelector(); + return; + } + + ImVec2 heading_size = + ImVec2(io.DisplaySize.x, LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + LAYOUT_MENU_BUTTON_Y_PADDING * 2.0f + 2.0f)); + + ImGui::PushStyleColor(ImGuiCol_ChildBg, ModAlpha(UIPrimaryColor, 0.9f)); + + if (ImGui::BeginChild("state_titlebar", heading_size, false, ImGuiWindowFlags_NavFlattened)) + { + BeginNavBar(); + if (NavButton(ICON_FA_BACKWARD, true, true)) + CloseSaveStateSelector(); + + NavTitle(is_loading ? "Load State" : "Save State"); + EndNavBar(); + ImGui::EndChild(); + } + + ImGui::PopStyleColor(); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ModAlpha(UIBackgroundColor, 0.9f)); + ImGui::SetCursorPos(ImVec2(0.0f, heading_size.y)); + + bool close_handled = false; + if (s_save_state_selector_open && + ImGui::BeginChild("state_list", ImVec2(io.DisplaySize.x, io.DisplaySize.y - heading_size.y), false, ImGuiWindowFlags_NavFlattened)) + { + BeginMenuButtons(); + + const ImGuiStyle& style = ImGui::GetStyle(); + + const float title_spacing = LayoutScale(10.0f); + const float summary_spacing = LayoutScale(4.0f); + const float item_spacing = LayoutScale(20.0f); + const float item_width_with_spacing = std::floor(LayoutScale(LAYOUT_SCREEN_WIDTH / 4.0f)); + const float item_width = item_width_with_spacing - item_spacing; + const float image_width = item_width - (style.FramePadding.x * 2.0f); + const float image_height = image_width / 1.33f; + const ImVec2 image_size(image_width, image_height); + const float item_height = (style.FramePadding.y * 2.0f) + image_height + title_spacing + g_large_font->FontSize + summary_spacing + + g_medium_font->FontSize; + const ImVec2 item_size(item_width, item_height); + const u32 grid_count_x = std::floor(ImGui::GetWindowWidth() / item_width_with_spacing); + const float start_x = + (static_cast(ImGui::GetWindowWidth()) - (item_width_with_spacing * static_cast(grid_count_x))) * 0.5f; + + u32 grid_x = 0; + u32 grid_y = 0; + ImGui::SetCursorPos(ImVec2(start_x, 0.0f)); + for (u32 i = 0; i < s_save_state_selector_slots.size(); i++) + { + if (i == 0) + ResetFocusHere(); + + const SaveStateListEntry& entry = s_save_state_selector_slots[i]; + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + continue; + + const ImGuiID id = window->GetID(static_cast(i)); + const ImVec2 pos(window->DC.CursorPos); + ImRect bb(pos, pos + item_size); + ImGui::ItemSize(item_size); + if (ImGui::ItemAdd(bb, id)) + { + bool held; + bool hovered; + bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, 0); + if (hovered) + { + const ImU32 col = ImGui::GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered, 1.0f); + + const float t = std::min(std::abs(std::sin(ImGui::GetTime() * 0.75) * 1.1), 1.0f); + ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetColorU32(ImGuiCol_Border, t)); + + ImGui::RenderFrame(bb.Min, bb.Max, col, true, 0.0f); + + ImGui::PopStyleColor(); + } + + bb.Min += style.FramePadding; + bb.Max -= style.FramePadding; + + const HostDisplayTexture* const screenshot = + entry.preview_texture ? entry.preview_texture.get() : GetPlaceholderTexture().get(); + const ImRect image_rect(CenterImage(ImRect(bb.Min, bb.Min + image_size), + ImVec2(static_cast(screenshot->GetWidth()), static_cast(screenshot->GetHeight())))); + + ImGui::GetWindowDrawList()->AddImage(screenshot->GetHandle(), image_rect.Min, image_rect.Max, ImVec2(0.0f, 0.0f), + ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255)); + + const ImVec2 title_pos(bb.Min.x, bb.Min.y + image_height + title_spacing); + const ImRect title_bb(title_pos, ImVec2(bb.Max.x, title_pos.y + g_large_font->FontSize)); + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, entry.title.c_str(), nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + if (!entry.summary.empty()) + { + const ImVec2 summary_pos(bb.Min.x, title_pos.y + g_large_font->FontSize + summary_spacing); + const ImRect summary_bb(summary_pos, ImVec2(bb.Max.x, summary_pos.y + g_medium_font->FontSize)); + ImGui::PushFont(g_medium_font); + ImGui::RenderTextClipped( + summary_bb.Min, summary_bb.Max, entry.summary.c_str(), nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (pressed) + { + if (is_loading) + { + DoLoadState(entry.path); + CloseSaveStateSelector(); + break; + } + else + { + Host::RunOnCPUThread([slot = entry.slot]() { VMManager::SaveStateToSlot(slot); }); + CloseSaveStateSelector(); + break; + } + } + + if (hovered && + (ImGui::IsItemClicked(ImGuiMouseButton_Right) || ImGui::IsNavInputTest(ImGuiNavInput_Input, ImGuiNavReadMode_Pressed))) + { + s_save_state_selector_submenu_index = static_cast(i); + } + + if (static_cast(i) == s_save_state_selector_submenu_index) + { + // can't use a choice dialog here, because we're already in a modal... + ImGuiFullscreen::PushResetLayout(); + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar( + ImGuiStyleVar_FramePadding, LayoutScale(LAYOUT_MENU_BUTTON_X_PADDING, LAYOUT_MENU_BUTTON_Y_PADDING)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, UIPrimaryTextColor); + ImGui::PushStyleColor(ImGuiCol_TitleBg, UIPrimaryDarkColor); + ImGui::PushStyleColor(ImGuiCol_TitleBgActive, UIPrimaryColor); + ImGui::PushStyleColor(ImGuiCol_PopupBg, MulAlpha(UIBackgroundColor, 0.95f)); + + const float width = LayoutScale(600.0f); + const float title_height = + g_large_font->FontSize + ImGui::GetStyle().FramePadding.y * 2.0f + ImGui::GetStyle().WindowPadding.y * 2.0f; + const float height = + title_height + LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + (LAYOUT_MENU_BUTTON_Y_PADDING * 2.0f)) * 3.0f; + ImGui::SetNextWindowSize(ImVec2(width, height)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + ImGui::OpenPopup(entry.title.c_str()); + + // don't let the back button flow through to the main window + bool submenu_open = !WantsToCloseMenu(); + close_handled ^= submenu_open; + + bool closed = false; + if (ImGui::BeginPopupModal(entry.title.c_str(), &is_open, + ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::PushStyleColor(ImGuiCol_Text, UIBackgroundTextColor); + + BeginMenuButtons(); + + if (ActiveButton(is_loading ? ICON_FA_FOLDER_OPEN " Load State" : ICON_FA_FOLDER_OPEN " Save State", false, true, + LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + { + if (is_loading) + DoLoadState(std::move(entry.path)); + else + Host::RunOnCPUThread([slot = entry.slot]() { VMManager::SaveStateToSlot(slot); }); + + CloseSaveStateSelector(); + closed = true; + } + + if (ActiveButton(ICON_FA_FOLDER_MINUS " Delete Save", false, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + { + if (!FileSystem::FileExists(entry.path.c_str())) + { + ShowToast({}, fmt::format("{} does not exist.", ImGuiFullscreen::RemoveHash(entry.title))); + is_open = true; + } + else if (FileSystem::DeleteFilePath(entry.path.c_str())) + { + ShowToast({}, fmt::format("{} deleted.", ImGuiFullscreen::RemoveHash(entry.title))); + s_save_state_selector_slots.erase(s_save_state_selector_slots.begin() + i); + + if (s_save_state_selector_slots.empty()) + { + CloseSaveStateSelector(); + closed = true; + } + else + { + is_open = false; + } + } + else + { + ShowToast({}, fmt::format("Failed to delete {}.", ImGuiFullscreen::RemoveHash(entry.title))); + is_open = false; + } + } + + if (ActiveButton(ICON_FA_WINDOW_CLOSE " Close Menu", false, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + { + is_open = false; + } + + EndMenuButtons(); + + ImGui::PopStyleColor(); + ImGui::EndPopup(); + } + if (!is_open) + { + s_save_state_selector_submenu_index = -1; + if (!closed) + QueueResetFocus(); + } + + ImGui::PopStyleColor(4); + ImGui::PopStyleVar(3); + ImGui::PopFont(); + ImGuiFullscreen::PopResetLayout(); + + if (closed) + break; + } + } + + grid_x++; + if (grid_x == grid_count_x) + { + grid_x = 0; + grid_y++; + ImGui::SetCursorPosX(start_x); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + item_spacing); + } + else + { + ImGui::SameLine(start_x + static_cast(grid_x) * (item_width + item_spacing)); + } + } + + EndMenuButtons(); + ImGui::EndChild(); + } + + ImGui::PopStyleColor(); + + ImGui::EndPopup(); + ImGui::PopStyleVar(5); + + if (!close_handled && WantsToCloseMenu()) + CloseSaveStateSelector(); +} + +bool FullscreenUI::OpenLoadStateSelectorForGameResume(const GameList::Entry* entry) +{ + SaveStateListEntry slentry; + if (!InitializeSaveStateListEntry(&slentry, entry->title, entry->serial, entry->crc, -1)) + return false; + + CloseSaveStateSelector(); + s_save_state_selector_slots.push_back(std::move(slentry)); + s_save_state_selector_game_path = entry->path; + s_save_state_selector_loading = true; + s_save_state_selector_open = true; + s_save_state_selector_resuming = true; + return true; +} + +void FullscreenUI::DrawResumeStateSelector() +{ + ImGui::SetNextWindowSize(LayoutScale(800.0f, 600.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + ImGui::OpenPopup("Load Resume State"); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + + bool is_open = true; + if (ImGui::BeginPopupModal("Load Resume State", &is_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize)) + { + const SaveStateListEntry& entry = s_save_state_selector_slots.front(); + ImGui::TextWrapped("A resume save state created at %s was found.\n\nDo you want to load this save and continue?", + TimeToPrintableString(entry.timestamp).c_str()); + + const HostDisplayTexture* image = entry.preview_texture ? entry.preview_texture.get() : GetPlaceholderTexture().get(); + const float image_height = LayoutScale(250.0f); + const float image_width = image_height * (static_cast(image->GetWidth()) / static_cast(image->GetHeight())); + const ImVec2 pos(ImGui::GetCursorScreenPos() + + ImVec2((ImGui::GetCurrentWindow()->WorkRect.GetWidth() - image_width) * 0.5f, LayoutScale(20.0f))); + const ImRect image_bb(pos, pos + ImVec2(image_width, image_height)); + ImGui::GetWindowDrawList()->AddImage( + static_cast(entry.preview_texture ? entry.preview_texture->GetHandle() : GetPlaceholderTexture()->GetHandle()), + image_bb.Min, image_bb.Max); + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + image_height + LayoutScale(40.0f)); + + BeginMenuButtons(); + + if (ActiveButton(ICON_FA_PLAY " Load State", false)) + { + DoStartPath(s_save_state_selector_game_path, -1); + is_open = false; + } + + if (ActiveButton(ICON_FA_LIGHTBULB " Clean Boot", false)) + { + DoStartPath(s_save_state_selector_game_path); + is_open = false; + } + + if (ActiveButton(ICON_FA_FOLDER_MINUS " Delete State", false)) + { + if (FileSystem::DeleteFilePath(entry.path.c_str())) + { + DoStartPath(s_save_state_selector_game_path); + is_open = false; + } + else + { + ShowToast(std::string(), "Failed to delete save state."); + } + } + + if (ActiveButton(ICON_FA_WINDOW_CLOSE " Cancel", false)) + { + ImGui::CloseCurrentPopup(); + is_open = false; + } + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(2); + ImGui::PopFont(); + + if (!is_open) + { + ClearSaveStateEntryList(); + s_save_state_selector_open = false; + s_save_state_selector_loading = false; + s_save_state_selector_resuming = false; + s_save_state_selector_game_path = {}; + } +} + +void FullscreenUI::DoLoadState(std::string path) +{ + Host::RunOnCPUThread([boot_path = s_save_state_selector_game_path, path = std::move(path)]() { + if (VMManager::HasValidVM()) + { + VMManager::LoadState(path.c_str()); + if (!boot_path.empty() && VMManager::GetDiscPath() != boot_path) + VMManager::ChangeDisc(CDVD_SourceType::Iso, std::move(boot_path)); + } + else + { + VMBootParameters params; + params.filename = std::move(boot_path); + params.save_state = std::move(path); + if (VMManager::Initialize(std::move(params))) + VMManager::SetState(VMState::Running); + } + }); +} + +void FullscreenUI::PopulateGameListEntryList() +{ + const int sort = Host::GetBaseIntSettingValue("UI", "FullscreenUIGameSort", 0); + const bool reverse = Host::GetBaseBoolSettingValue("UI", "FullscreenUIGameSortReverse", false); + + const u32 count = GameList::GetEntryCount(); + s_game_list_sorted_entries.resize(count); + for (u32 i = 0; i < count; i++) + s_game_list_sorted_entries[i] = GameList::GetEntryByIndex(i); + + std::sort(s_game_list_sorted_entries.begin(), s_game_list_sorted_entries.end(), + [sort, reverse](const GameList::Entry* lhs, const GameList::Entry* rhs) { + switch (sort) + { + case 0: // Type + { + if (lhs->type != rhs->type) + return reverse ? (lhs->type > rhs->type) : (lhs->type < rhs->type); + } + break; + + case 1: // Serial + { + if (lhs->serial != rhs->serial) + return reverse ? (lhs->serial > rhs->serial) : (lhs->serial < rhs->serial); + } + break; + + case 2: // Title + break; + + case 3: // File Title + { + const std::string_view lhs_title(Path::GetFileTitle(lhs->path)); + const std::string_view rhs_title(Path::GetFileTitle(rhs->path)); + const int res = + StringUtil::Strncasecmp(lhs_title.data(), rhs_title.data(), std::min(lhs_title.size(), rhs_title.size())); + if (res != 0) + return reverse ? (res > 0) : (res < 0); + } + break; + + case 4: // CRC + { + if (lhs->crc != rhs->crc) + return reverse ? (lhs->crc >= rhs->crc) : (lhs->crc < rhs->crc); + } + break; + + case 5: // Time Played + { + if (lhs->total_played_time != rhs->total_played_time) + { + return reverse ? (lhs->total_played_time > rhs->total_played_time) : + (lhs->total_played_time < rhs->total_played_time); + } + } + break; + + case 6: // Last Played (reversed by default) + { + if (lhs->last_played_time != rhs->last_played_time) + { + return reverse ? (lhs->last_played_time < rhs->last_played_time) : (lhs->last_played_time > rhs->last_played_time); + } + } + break; + + case 7: // Size + { + if (lhs->total_size != rhs->total_size) + { + return reverse ? (lhs->total_size > rhs->total_size) : (lhs->total_size < rhs->total_size); + } + } + break; + } + + // fallback to title when all else is equal + const int res = StringUtil::Strcasecmp(lhs->title.c_str(), rhs->title.c_str()); + return reverse ? (res > 0) : (res < 0); + }); +} + +void FullscreenUI::DrawGameListWindow() +{ + auto game_list_lock = GameList::GetLock(); + PopulateGameListEntryList(); + + ImGuiIO& io = ImGui::GetIO(); + ImVec2 heading_size = + ImVec2(io.DisplaySize.x, LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + LAYOUT_MENU_BUTTON_Y_PADDING * 2.0f + 2.0f)); + + const float bg_alpha = VMManager::HasValidVM() ? 0.90f : 1.0f; + + if (BeginFullscreenWindow(ImVec2(0.0f, 0.0f), heading_size, "gamelist_view", MulAlpha(UIPrimaryColor, bg_alpha))) + { + static constexpr float ITEM_WIDTH = 25.0f; + static constexpr const char* icons[] = {ICON_FA_BORDER_ALL, ICON_FA_LIST, ICON_FA_COG}; + static constexpr const char* titles[] = {"Game Grid", "Game List", "Game List Settings"}; + static constexpr u32 count = std::size(titles); + + BeginNavBar(); + + if (!ImGui::IsPopupOpen(0u, ImGuiPopupFlags_AnyPopup)) + { + if (ImGui::IsNavInputTest(ImGuiNavInput_FocusPrev, ImGuiNavReadMode_Pressed)) + { + s_game_list_page = static_cast( + (s_game_list_page == static_cast(0)) ? (count - 1) : (static_cast(s_game_list_page) - 1)); + } + else if (ImGui::IsNavInputTest(ImGuiNavInput_FocusNext, ImGuiNavReadMode_Pressed)) + { + s_game_list_page = static_cast((static_cast(s_game_list_page) + 1) % count); + } + } + + if (NavButton(ICON_FA_BACKWARD, true, true)) + ReturnToMainWindow(); + + NavTitle(titles[static_cast(s_game_list_page)]); + RightAlignNavButtons(count, ITEM_WIDTH, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + + for (u32 i = 0; i < count; i++) + { + if (NavButton( + icons[i], static_cast(i) == s_game_list_page, true, ITEM_WIDTH, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + { + s_game_list_page = static_cast(i); + } + } + + EndNavBar(); + } + + EndFullscreenWindow(); + + switch (s_game_list_page) + { + case GameListPage::Grid: + DrawGameGrid(heading_size); + break; + case GameListPage::List: + DrawGameList(heading_size); + break; + case GameListPage::Settings: + DrawGameListSettingsPage(heading_size); + break; + default: + break; + } +} + +void FullscreenUI::DrawGameList(const ImVec2& heading_size) +{ + if (!BeginFullscreenColumns(nullptr, heading_size.y, true)) + { + EndFullscreenColumns(); + return; + } + + if (WantsToCloseMenu()) + { + if (ImGui::IsWindowFocused()) + ReturnToMainWindow(); + } + + const GameList::Entry* selected_entry = nullptr; + + if (BeginFullscreenColumnWindow(0.0f, -530.0f, "game_list_entries")) + { + const ImVec2 image_size(LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT * 0.68f, LAYOUT_MENU_BUTTON_HEIGHT)); + + ResetFocusHere(); + + BeginMenuButtons(); + + // TODO: replace with something not heap allocating + std::string summary; + + for (const GameList::Entry* entry : s_game_list_sorted_entries) + { + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(entry->path.c_str(), true, LAYOUT_MENU_BUTTON_HEIGHT, &visible, &hovered, &bb.Min, &bb.Max); + if (!visible) + continue; + + HostDisplayTexture* cover_texture = GetGameListCover(entry); + + summary.clear(); + if (entry->serial.empty()) + fmt::format_to(std::back_inserter(summary), "{} - ", GameList::RegionToString(entry->region)); + else + fmt::format_to(std::back_inserter(summary), "{} - {} - ", entry->serial, GameList::RegionToString(entry->region)); + + const std::string_view filename(Path::GetFileName(entry->path)); + summary.append(filename); + + const ImRect image_rect(CenterImage(ImRect(bb.Min, bb.Min + image_size), + ImVec2(static_cast(cover_texture->GetWidth()), static_cast(cover_texture->GetHeight())))); + + ImGui::GetWindowDrawList()->AddImage(cover_texture->GetHandle(), image_rect.Min, image_rect.Max, ImVec2(0.0f, 0.0f), + ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255)); + + const float midpoint = bb.Min.y + g_large_font->FontSize + LayoutScale(4.0f); + const float text_start_x = bb.Min.x + image_size.x + LayoutScale(15.0f); + const ImRect title_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint)); + const ImRect summary_bb(ImVec2(text_start_x, midpoint), bb.Max); + + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, entry->title.c_str(), entry->title.c_str() + entry->title.size(), nullptr, + ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + if (!summary.empty()) + { + ImGui::PushFont(g_medium_font); + ImGui::RenderTextClipped( + summary_bb.Min, summary_bb.Max, summary.c_str(), nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (pressed) + HandleGameListActivate(entry); + + if (hovered) + selected_entry = entry; + + if (selected_entry && + (ImGui::IsItemClicked(ImGuiMouseButton_Right) || ImGui::IsNavInputTest(ImGuiNavInput_Input, ImGuiNavReadMode_Pressed))) + { + HandleGameListOptions(selected_entry); + } + } + + EndMenuButtons(); + } + EndFullscreenColumnWindow(); + + if (BeginFullscreenColumnWindow(-530.0f, 0.0f, "game_list_info", UIPrimaryDarkColor)) + { + const HostDisplayTexture* cover_texture = + selected_entry ? GetGameListCover(selected_entry) : GetTextureForGameListEntryType(GameList::EntryType::Count); + if (cover_texture) + { + const ImRect image_rect(CenterImage(LayoutScale(ImVec2(275.0f, 400.0f)), + ImVec2(static_cast(cover_texture->GetWidth()), static_cast(cover_texture->GetHeight())))); + + ImGui::SetCursorPos(LayoutScale(ImVec2(128.0f, 20.0f)) + image_rect.Min); + ImGui::Image(selected_entry ? GetGameListCover(selected_entry)->GetHandle() : + GetTextureForGameListEntryType(GameList::EntryType::Count)->GetHandle(), + image_rect.GetSize()); + } + + const float work_width = ImGui::GetCurrentWindow()->WorkRect.GetWidth(); + constexpr float field_margin_y = 10.0f; + constexpr float start_x = 50.0f; + float text_y = 440.0f; + float text_width; + + PushPrimaryColor(); + ImGui::SetCursorPos(LayoutScale(start_x, text_y)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, field_margin_y)); + ImGui::PushTextWrapPos(LayoutScale(480.0f)); + ImGui::BeginGroup(); + + if (selected_entry) + { + // title + ImGui::PushFont(g_large_font); + const std::string_view title( + std::string_view(selected_entry->title).substr(0, (selected_entry->title.length() > 37) ? 37 : std::string_view::npos)); + text_width = ImGui::CalcTextSize(title.data(), title.data() + title.length(), false, work_width).x; + ImGui::SetCursorPosX((work_width - text_width) / 2.0f); + ImGui::TextWrapped( + "%.*s%s", static_cast(title.size()), title.data(), (title.length() == selected_entry->title.length()) ? "" : "..."); + ImGui::PopFont(); + + ImGui::PushFont(g_medium_font); + + // code + text_width = ImGui::CalcTextSize(selected_entry->serial.c_str(), nullptr, false, work_width).x; + ImGui::SetCursorPosX((work_width - text_width) / 2.0f); + ImGui::TextWrapped("%s", selected_entry->serial.c_str()); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 15.0f); + + // file tile + const std::string_view filename(Path::GetFileName(selected_entry->path)); + ImGui::TextWrapped("File: %.*s", static_cast(filename.size()), filename.data()); + + // crc + ImGui::Text("CRC: %08X", selected_entry->crc); + + // region + { + std::string flag_texture(fmt::format("icons/flags/{}.png", GameList::RegionToString(selected_entry->region))); + ImGui::TextUnformatted("Region: "); + ImGui::SameLine(); + ImGui::Image(GetCachedTextureAsync(flag_texture.c_str())->GetHandle(), LayoutScale(23.0f, 16.0f)); + ImGui::SameLine(); + ImGui::Text(" (%s)", GameList::RegionToString(selected_entry->region)); + } + + // compatibility + ImGui::TextUnformatted("Compatibility: "); + ImGui::SameLine(); + if (selected_entry->compatibility_rating != GameDatabaseSchema::Compatibility::Unknown) + { + ImGui::Image(s_game_compatibility_textures[static_cast(selected_entry->compatibility_rating) - 1]->GetHandle(), + LayoutScale(64.0f, 16.0f)); + ImGui::SameLine(); + } + ImGui::Text(" (%s)", GameList::EntryCompatibilityRatingToString(selected_entry->compatibility_rating)); + + // play time + ImGui::Text("Time Played: %s", GameList::FormatTimespan(selected_entry->total_played_time).c_str()); + ImGui::Text("Last Played: %s", GameList::FormatTimestamp(selected_entry->last_played_time).c_str()); + + // size + ImGui::Text("Size: %.2f MB", static_cast(selected_entry->total_size) / 1048576.0f); + + ImGui::PopFont(); + } + else + { + // title + const char* title = "No Game Selected"; + ImGui::PushFont(g_large_font); + text_width = ImGui::CalcTextSize(title, nullptr, false, work_width).x; + ImGui::SetCursorPosX((work_width - text_width) / 2.0f); + ImGui::TextWrapped("%s", title); + ImGui::PopFont(); + } + + ImGui::EndGroup(); + ImGui::PopTextWrapPos(); + ImGui::PopStyleVar(); + PopPrimaryColor(); + } + EndFullscreenColumnWindow(); + EndFullscreenColumns(); +} + +void FullscreenUI::DrawGameGrid(const ImVec2& heading_size) +{ + ImGuiIO& io = ImGui::GetIO(); + if (!BeginFullscreenWindow( + ImVec2(0.0f, heading_size.y), ImVec2(io.DisplaySize.x, io.DisplaySize.y - heading_size.y), "game_grid", UIBackgroundColor)) + { + EndFullscreenWindow(); + return; + } + + if (WantsToCloseMenu()) + { + if (ImGui::IsWindowFocused()) + ReturnToMainWindow(); + } + + ResetFocusHere(); + BeginMenuButtons(); + + const ImGuiStyle& style = ImGui::GetStyle(); + + const float title_spacing = LayoutScale(10.0f); + const float item_spacing = LayoutScale(20.0f); + const float item_width_with_spacing = std::floor(LayoutScale(LAYOUT_SCREEN_WIDTH / 5.0f)); + const float item_width = item_width_with_spacing - item_spacing; + const float image_width = item_width - (style.FramePadding.x * 2.0f); + const float image_height = image_width * 1.33f; + const ImVec2 image_size(image_width, image_height); + const float item_height = (style.FramePadding.y * 2.0f) + image_height + title_spacing + g_medium_font->FontSize; + const ImVec2 item_size(item_width, item_height); + const u32 grid_count_x = std::floor(ImGui::GetWindowWidth() / item_width_with_spacing); + const float start_x = + (static_cast(ImGui::GetWindowWidth()) - (item_width_with_spacing * static_cast(grid_count_x))) * 0.5f; + + // TODO: replace with something not heap allocating + std::string draw_title; + + u32 grid_x = 0; + u32 grid_y = 0; + ImGui::SetCursorPos(ImVec2(start_x, 0.0f)); + for (const GameList::Entry* entry : s_game_list_sorted_entries) + { + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + continue; + + const ImGuiID id = window->GetID(entry->path.c_str(), entry->path.c_str() + entry->path.length()); + const ImVec2 pos(window->DC.CursorPos); + ImRect bb(pos, pos + item_size); + ImGui::ItemSize(item_size); + if (ImGui::ItemAdd(bb, id)) + { + bool held; + bool hovered; + bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, 0); + if (hovered) + { + const ImU32 col = ImGui::GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered, 1.0f); + + const float t = std::min(std::abs(std::sin(ImGui::GetTime() * 0.75) * 1.1), 1.0f); + ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetColorU32(ImGuiCol_Border, t)); + + ImGui::RenderFrame(bb.Min, bb.Max, col, true, 0.0f); + + ImGui::PopStyleColor(); + } + + bb.Min += style.FramePadding; + bb.Max -= style.FramePadding; + + const HostDisplayTexture* const cover_texture = GetGameListCover(entry); + const ImRect image_rect(CenterImage(ImRect(bb.Min, bb.Min + image_size), + ImVec2(static_cast(cover_texture->GetWidth()), static_cast(cover_texture->GetHeight())))); + + ImGui::GetWindowDrawList()->AddImage(cover_texture->GetHandle(), image_rect.Min, image_rect.Max, ImVec2(0.0f, 0.0f), + ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255)); + + const ImRect title_bb(ImVec2(bb.Min.x, bb.Min.y + image_height + title_spacing), bb.Max); + const std::string_view title( + std::string_view(entry->title).substr(0, (entry->title.length() > 31) ? 31 : std::string_view::npos)); + draw_title.clear(); + fmt::format_to(std::back_inserter(draw_title), "{}{}", title, (title.length() == entry->title.length()) ? "" : "..."); + ImGui::PushFont(g_medium_font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, draw_title.c_str(), draw_title.c_str() + draw_title.length(), nullptr, + ImVec2(0.5f, 0.0f), &title_bb); + ImGui::PopFont(); + + if (pressed) + HandleGameListActivate(entry); + + if (hovered && + (ImGui::IsItemClicked(ImGuiMouseButton_Right) || ImGui::IsNavInputTest(ImGuiNavInput_Input, ImGuiNavReadMode_Pressed))) + { + HandleGameListOptions(entry); + } + } + + grid_x++; + if (grid_x == grid_count_x) + { + grid_x = 0; + grid_y++; + ImGui::SetCursorPosX(start_x); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + item_spacing); + } + else + { + ImGui::SameLine(start_x + static_cast(grid_x) * (item_width + item_spacing)); + } + } + + EndMenuButtons(); + EndFullscreenWindow(); +} + +void FullscreenUI::HandleGameListActivate(const GameList::Entry* entry) +{ + // launch game + if (!OpenLoadStateSelectorForGameResume(entry)) + DoStartPath(entry->path); +} + +void FullscreenUI::HandleGameListOptions(const GameList::Entry* entry) +{ + ImGuiFullscreen::ChoiceDialogOptions options = { + {ICON_FA_WRENCH " Game Properties", false}, + {ICON_FA_PLAY " Resume Game", false}, + {ICON_FA_UNDO " Load State", false}, + {ICON_FA_COMPACT_DISC " Default Boot", false}, + {ICON_FA_LIGHTBULB " Fast Boot", false}, + {ICON_FA_MAGIC " Slow Boot", false}, + {ICON_FA_FOLDER_MINUS " Reset Play Time", false}, + {ICON_FA_WINDOW_CLOSE " Close Menu", false}, + }; + + const bool has_resume_state = VMManager::HasSaveStateInSlot(entry->serial.c_str(), entry->crc, -1); + OpenChoiceDialog(entry->title.c_str(), false, std::move(options), + [has_resume_state, entry_path = entry->path, entry_serial = entry->serial](s32 index, const std::string& title, bool checked) { + switch (index) + { + case 0: // Open Game Properties + SwitchToGameSettings(entry_path); + break; + case 1: // Resume Game + DoStartPath(entry_path, has_resume_state ? std::optional(-1) : std::optional()); + break; + case 2: // Load State + OpenLoadStateSelectorForGame(entry_path); + break; + case 3: // Default Boot + DoStartPath(entry_path); + break; + case 4: // Fast Boot + DoStartPath(entry_path, std::nullopt, true); + break; + case 5: // Slow Boot + DoStartPath(entry_path, std::nullopt, false); + break; + case 6: // Reset Play Time + GameList::ClearPlayedTimeForSerial(entry_serial); + break; + default: + break; + } + + CloseChoiceDialog(); + }); +} + +void FullscreenUI::DrawGameListSettingsPage(const ImVec2& heading_size) +{ + const ImGuiIO& io = ImGui::GetIO(); + if (!BeginFullscreenWindow(ImVec2(0.0f, heading_size.y), ImVec2(io.DisplaySize.x, io.DisplaySize.y - heading_size.y), "settings_parent", + UIBackgroundColor)) + { + EndFullscreenWindow(); + return; + } + + if (WantsToCloseMenu()) + { + if (ImGui::IsWindowFocused()) + ReturnToMainWindow(); + } + + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = GetEditingSettingsInterface(false); + + BeginMenuButtons(); + + MenuHeading("Search Directories"); + if (MenuButton(ICON_FA_FOLDER_PLUS " Add Search Directory", "Adds a new directory to the game search list.")) + { + OpenFileSelector(ICON_FA_FOLDER_PLUS " Add Search Directory", true, [](const std::string& dir) { + if (!dir.empty()) + { + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = Host::Internal::GetBaseSettingsLayer(); + + bsi->AddToStringList("GameList", "RecursivePaths", dir.c_str()); + bsi->RemoveFromStringList("GameList", "Paths", dir.c_str()); + SetSettingsChanged(bsi); + PopulateGameListDirectoryCache(bsi); + Host::RefreshGameListAsync(false); + } + + CloseFileSelector(); + }); + } + + for (const auto& it : s_game_list_directories_cache) + { + if (MenuButton(it.first.c_str(), it.second ? "Scanning Subdirectories" : "Not Scanning Subdirectories")) + { + ImGuiFullscreen::ChoiceDialogOptions options = { + {ICON_FA_FOLDER_OPEN " Open in File Browser", false}, + {it.second ? (ICON_FA_FOLDER_MINUS " Disable Subdirectory Scanning") : + (ICON_FA_FOLDER_PLUS " Enable Subdirectory Scanning"), + false}, + {ICON_FA_TIMES " Remove From List", false}, + {ICON_FA_WINDOW_CLOSE " Close Menu", false}, + }; + + OpenChoiceDialog(fmt::format(ICON_FA_FOLDER " {}", it.first).c_str(), false, std::move(options), + [dir = it.first, recursive = it.second](s32 index, const std::string& title, bool checked) { + if (index < 0) + return; + + if (index == 0) + { + // Open in file browser... todo + Host::ReportErrorAsync("Error", "Not implemented"); + } + else if (index == 1) + { + // toggle subdirectory scanning + { + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = Host::Internal::GetBaseSettingsLayer(); + if (!recursive) + { + bsi->RemoveFromStringList("GameList", "Paths", dir.c_str()); + bsi->AddToStringList("GameList", "RecursivePaths", dir.c_str()); + } + else + { + bsi->RemoveFromStringList("GameList", "RecursivePaths", dir.c_str()); + bsi->AddToStringList("GameList", "Paths", dir.c_str()); + } + + SetSettingsChanged(bsi); + PopulateGameListDirectoryCache(bsi); + } + + Host::RefreshGameListAsync(false); + } + else if (index == 2) + { + // remove from list + auto lock = Host::GetSettingsLock(); + SettingsInterface* bsi = Host::Internal::GetBaseSettingsLayer(); + bsi->RemoveFromStringList("GameList", "Paths", dir.c_str()); + bsi->RemoveFromStringList("GameList", "RecursivePaths", dir.c_str()); + SetSettingsChanged(bsi); + PopulateGameListDirectoryCache(bsi); + Host::RefreshGameListAsync(false); + } + + CloseChoiceDialog(); + }); + } + } + + static constexpr const char* view_types[] = {"Game Grid", "Game List"}; + static constexpr const char* sort_types[] = {"Type", "Serial", "Title", "File Title", "CRC", "Time Played", "Last Played", "Size"}; + + MenuHeading("List Settings"); + { + DrawIntListSetting(bsi, ICON_FA_BORDER_ALL " Default View", "Sets which view the game list will open to.", "UI", + "DefaultFullscreenUIGameView", 0, view_types, std::size(view_types)); + DrawIntListSetting(bsi, ICON_FA_SORT " Sort By", "Determines which field the game list will be sorted by.", "UI", + "FullscreenUIGameSort", 0, sort_types, std::size(sort_types)); + DrawToggleSetting(bsi, ICON_FA_SORT_ALPHA_DOWN " Sort Reversed", + "Reverses the game list sort order from the default (usually ascending to descending).", "UI", "FullscreenUIGameSortReverse", + false); + } + + MenuHeading("Cover Settings"); + { + DrawFolderSetting(bsi, ICON_FA_FOLDER " Covers Directory", "Folders", "Covers", EmuFolders::Covers); + if (MenuButton(ICON_FA_DOWNLOAD " Download Covers", "Downloads covers from a user-specified URL template.")) + ImGui::OpenPopup("Download Covers"); + } + + MenuHeading("Operations"); + { + if (MenuButton(ICON_FA_SEARCH " Scan For New Games", "Identifies any new files added to the game directories.")) + Host::RefreshGameListAsync(false); + if (MenuButton(ICON_FA_SEARCH_PLUS " Rescan All Games", "Forces a full rescan of all games previously identified.")) + Host::RefreshGameListAsync(true); + } + + EndMenuButtons(); + + DrawCoverDownloaderWindow(); + EndFullscreenWindow(); +} + +void FullscreenUI::DrawCoverDownloaderWindow() +{ + ImGui::SetNextWindowSize(LayoutScale(1000.0f, 0.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushFont(g_large_font); + + bool is_open = true; + if (ImGui::BeginPopupModal("Download Covers", &is_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize)) + { + ImGui::TextWrapped("PCSX2 can automatically download covers for games which do not currently have a cover set. We do not host any " + "cover images, the user must provide their own source for images."); + ImGui::NewLine(); + ImGui::TextWrapped("In the form below, specify the URLs to download covers from, with one template URL per line. The following " + "variables are available:"); + ImGui::NewLine(); + ImGui::TextWrapped( + "${title}: Title of the game.\n${filetitle}: Name component of the game's filename.\n${serial}: Serial of the game."); + ImGui::NewLine(); + ImGui::TextWrapped("Example: https://www.example-not-a-real-domain.com/covers/${serial}.jpg"); + ImGui::NewLine(); + + BeginMenuButtons(); + + static char template_urls[512]; + ImGui::InputTextMultiline("##templates", template_urls, sizeof(template_urls), + ImVec2(ImGui::GetCurrentWindow()->WorkRect.GetWidth(), LayoutScale(175.0f))); + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(5.0f)); + + static bool use_serial_names; + ImGui::PushFont(g_medium_font); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, LayoutScale(2.0f, 2.0f)); + ImGui::Checkbox("Use Serial File Names", &use_serial_names); + ImGui::PopStyleVar(1); + ImGui::PopFont(); + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + + const bool download_enabled = (std::strlen(template_urls) > 0); + + if (ActiveButton(ICON_FA_DOWNLOAD " Start Download", false, download_enabled)) + { + StartAsyncOp( + [urls = StringUtil::splitOnNewLine(template_urls), use_serial_names = use_serial_names](::ProgressCallback* progress) { + GameList::DownloadCovers(urls, use_serial_names, progress, [](const GameList::Entry* entry, std::string save_path) { + // cache the cover path on our side once it's saved + Host::RunOnCPUThread([path = entry->path, save_path = std::move(save_path)]() { + GetMTGS().RunOnGSThread([path = std::move(path), save_path = std::move(save_path)]() { + s_cover_image_map[std::move(path)] = std::move(save_path); + }); + }); + }); + }, + "Download Covers"); + std::memset(template_urls, 0, sizeof(template_urls)); + use_serial_names = false; + ImGui::CloseCurrentPopup(); + } + + if (ActiveButton(ICON_FA_TIMES " Cancel", false)) + { + std::memset(template_urls, 0, sizeof(template_urls)); + use_serial_names = false; + ImGui::CloseCurrentPopup(); + } + + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopFont(); + ImGui::PopStyleVar(2); +} + +void FullscreenUI::SwitchToGameList() +{ + s_current_main_window = MainWindowType::GameList; + s_game_list_page = static_cast(Host::GetBaseIntSettingValue("UI", "DefaultFullscreenUIGameView", 0)); + { + auto lock = Host::GetSettingsLock(); + PopulateGameListDirectoryCache(Host::Internal::GetBaseSettingsLayer()); + } + QueueResetFocus(); +} + +HostDisplayTexture* FullscreenUI::GetGameListCover(const GameList::Entry* entry) +{ + // lookup and grab cover image + auto cover_it = s_cover_image_map.find(entry->path); + if (cover_it == s_cover_image_map.end()) + { + std::string cover_path(GameList::GetCoverImagePathForEntry(entry)); + cover_it = s_cover_image_map.emplace(entry->path, std::move(cover_path)).first; + } + + HostDisplayTexture* tex = (!cover_it->second.empty()) ? GetCachedTextureAsync(cover_it->second.c_str()) : nullptr; + return tex ? tex : GetTextureForGameListEntryType(entry->type); +} + +HostDisplayTexture* FullscreenUI::GetTextureForGameListEntryType(GameList::EntryType type) +{ + switch (type) + { + case GameList::EntryType::ELF: + return s_fallback_exe_texture.get(); + + case GameList::EntryType::PS1Disc: + case GameList::EntryType::PS2Disc: + default: + return s_fallback_disc_texture.get(); + } +} + +HostDisplayTexture* FullscreenUI::GetCoverForCurrentGame() +{ + auto lock = GameList::GetLock(); + + const GameList::Entry* entry = GameList::GetEntryForPath(s_current_game_path.c_str()); + if (!entry) + return s_fallback_disc_texture.get(); + + return GetGameListCover(entry); +} + +std::string FullscreenUI::GetNotificationImageForGame(const GameList::Entry* entry) +{ + std::string ret; + + if (entry) + ret = GameList::GetCoverImagePathForEntry(entry); + + return ret; +} + +std::string FullscreenUI::GetNotificationImageForGame(const std::string& game_path) +{ + auto lock = GameList::GetLock(); + const GameList::Entry* entry = GameList::GetEntryForPath(game_path.c_str()); + return entry ? GetNotificationImageForGame(entry) : std::string(); +} + +////////////////////////////////////////////////////////////////////////// +// Overlays +////////////////////////////////////////////////////////////////////////// + +void FullscreenUI::ExitFullscreenAndOpenURL(const std::string_view& url) +{ + Host::RunOnCPUThread([url = std::string(url)]() { + if (Host::IsFullscreen()) + Host::SetFullscreen(false); + + Host::OpenURL(url); + }); +} + +void FullscreenUI::CopyTextToClipboard(std::string title, const std::string_view& text) +{ + if (Host::CopyTextToClipboard(text)) + ShowToast(std::string(), std::move(title)); + else + ShowToast(std::string(), "Failed to copy text to clipboard."); +} + +void FullscreenUI::OpenAboutWindow() +{ + s_about_window_open = true; +} + +void FullscreenUI::DrawAboutWindow() +{ + ImGui::SetNextWindowSize(LayoutScale(1000.0f, 500.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + ImGui::OpenPopup("About PCSX2"); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + + if (ImGui::BeginPopupModal("About PCSX2", &s_about_window_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize)) + { + ImGui::TextWrapped( + "PCSX2 is a free and open-source PlayStation 2 (PS2) emulator. Its purpose is to emulate the PS2's hardware, using a " + "combination of MIPS CPU Interpreters, Recompilers and a Virtual Machine which manages hardware states and PS2 system memory. " + "This allows you to play PS2 games on your PC, with many additional features and benefits."); + + ImGui::NewLine(); + + ImGui::TextWrapped("PlayStation 2 and PS2 are registered trademarks of Sony Interactive Entertainment. This application is not " + "affiliated in any way with Sony Interactive Entertainment."); + + ImGui::NewLine(); + + BeginMenuButtons(); + + if (ActiveButton(ICON_FA_GLOBE " Website", false)) + ExitFullscreenAndOpenURL(PCSX2_WEBSITE_URL); + + if (ActiveButton(ICON_FA_PERSON_BOOTH " Support Forums", false)) + ExitFullscreenAndOpenURL(PCSX2_FORUMS_URL); + + if (ActiveButton(ICON_FA_BUG " GitHub Repository", false)) + ExitFullscreenAndOpenURL(PCSX2_GITHUB_URL); + + if (ActiveButton(ICON_FA_NEWSPAPER " License", false)) + ExitFullscreenAndOpenURL(PCSX2_LICENSE_URL); + + if (ActiveButton(ICON_FA_WINDOW_CLOSE " Close", false)) + { + ImGui::CloseCurrentPopup(); + s_about_window_open = false; + } + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(2); + ImGui::PopFont(); +} + +FullscreenUI::ProgressCallback::ProgressCallback(std::string name) + : BaseProgressCallback() + , m_name(std::move(name)) +{ + ImGuiFullscreen::OpenBackgroundProgressDialog(m_name.c_str(), "", 0, 100, 0); +} + +FullscreenUI::ProgressCallback::~ProgressCallback() +{ + ImGuiFullscreen::CloseBackgroundProgressDialog(m_name.c_str()); +} + +void FullscreenUI::ProgressCallback::PushState() +{ + BaseProgressCallback::PushState(); +} + +void FullscreenUI::ProgressCallback::PopState() +{ + BaseProgressCallback::PopState(); + Redraw(true); +} + +void FullscreenUI::ProgressCallback::SetCancellable(bool cancellable) +{ + BaseProgressCallback::SetCancellable(cancellable); + Redraw(true); +} + +void FullscreenUI::ProgressCallback::SetTitle(const char* title) +{ + // todo? +} + +void FullscreenUI::ProgressCallback::SetStatusText(const char* text) +{ + BaseProgressCallback::SetStatusText(text); + Redraw(true); +} + +void FullscreenUI::ProgressCallback::SetProgressRange(u32 range) +{ + u32 last_range = m_progress_range; + + BaseProgressCallback::SetProgressRange(range); + + if (m_progress_range != last_range) + Redraw(false); +} + +void FullscreenUI::ProgressCallback::SetProgressValue(u32 value) +{ + u32 lastValue = m_progress_value; + + BaseProgressCallback::SetProgressValue(value); + + if (m_progress_value != lastValue) + Redraw(false); +} + +void FullscreenUI::ProgressCallback::Redraw(bool force) +{ + const int percent = static_cast((static_cast(m_progress_value) / static_cast(m_progress_range)) * 100.0f); + if (percent == m_last_progress_percent && !force) + return; + + m_last_progress_percent = percent; + ImGuiFullscreen::UpdateBackgroundProgressDialog(m_name.c_str(), m_status_text.c_str(), 0, 100, percent); +} + +void FullscreenUI::ProgressCallback::DisplayError(const char* message) +{ + Console.Error(message); + ShowToast(std::string(), message); +} + +void FullscreenUI::ProgressCallback::DisplayWarning(const char* message) +{ + Console.Warning(message); +} + +void FullscreenUI::ProgressCallback::DisplayInformation(const char* message) +{ + Console.WriteLn(message); +} + +void FullscreenUI::ProgressCallback::DisplayDebugMessage(const char* message) +{ + DevCon.WriteLn(message); +} + +void FullscreenUI::ProgressCallback::ModalError(const char* message) +{ + Console.Error(message); + Host::ReportErrorAsync("Error", message); +} + +bool FullscreenUI::ProgressCallback::ModalConfirmation(const char* message) +{ + return false; +} + +void FullscreenUI::ProgressCallback::ModalInformation(const char* message) +{ + Console.WriteLn(message); +} + +void FullscreenUI::ProgressCallback::SetCancelled() +{ + if (m_cancellable) + m_cancelled = true; +} + +#ifdef ENABLE_ACHIEVEMENTS + +void FullscreenUI::OpenAchievementsWindow() +{ + if (!VMManager::HasValidVM() || !Achievements::IsActive()) + return; + + GetMTGS().RunOnGSThread([]() { + if (!ImGuiManager::InitializeFullscreenUI()) + return; + + SwitchToAchievementsWindow(); + }); +} + +void FullscreenUI::SwitchToAchievementsWindow() +{ + if (!VMManager::HasValidVM()) + return; + + if (!Achievements::HasActiveGame() || Achievements::GetAchievementCount() == 0) + { + ShowToast(std::string(), "This game has no achievements."); + return; + } + + if (s_current_main_window != MainWindowType::PauseMenu) + PauseForMenuOpen(); + + s_current_main_window = MainWindowType::Achievements; + QueueResetFocus(); +} + +void FullscreenUI::DrawAchievement(const Achievements::Achievement& cheevo) +{ + static constexpr float alpha = 0.8f; + static constexpr float progress_height_unscaled = 20.0f; + static constexpr float progress_spacing_unscaled = 5.0f; + + std::string id_str(fmt::format("chv_{}", cheevo.id)); + + const auto progress = Achievements::GetAchievementProgress(cheevo); + const bool is_measured = progress.second != 0; + + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(id_str.c_str(), true, + !is_measured ? LAYOUT_MENU_BUTTON_HEIGHT : LAYOUT_MENU_BUTTON_HEIGHT + progress_height_unscaled + progress_spacing_unscaled, + &visible, &hovered, &bb.Min, &bb.Max, 0, alpha); + if (!visible) + return; + + const ImVec2 image_size(LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT, LAYOUT_MENU_BUTTON_HEIGHT)); + const std::string& badge_path = Achievements::GetAchievementBadgePath(cheevo); + if (!badge_path.empty()) + { + HostDisplayTexture* badge = GetCachedTextureAsync(badge_path.c_str()); + if (badge) + { + ImGui::GetWindowDrawList()->AddImage( + badge->GetHandle(), bb.Min, bb.Min + image_size, ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255)); + } + } + + const float midpoint = bb.Min.y + g_large_font->FontSize + LayoutScale(4.0f); + std::string points_text(fmt::format("{} point{}", cheevo.points, cheevo.points != 1 ? "s" : "")); + const ImVec2 points_template_size(g_medium_font->CalcTextSizeA(g_medium_font->FontSize, FLT_MAX, 0.0f, "XXX points")); + const ImVec2 points_size(g_medium_font->CalcTextSizeA( + g_medium_font->FontSize, FLT_MAX, 0.0f, points_text.c_str(), points_text.c_str() + points_text.length())); + const float points_template_start = bb.Max.x - points_template_size.x; + const float points_start = points_template_start + ((points_template_size.x - points_size.x) * 0.5f); + const char* lock_text = cheevo.locked ? ICON_FA_LOCK : ICON_FA_LOCK_OPEN; + const ImVec2 lock_size(g_large_font->CalcTextSizeA(g_large_font->FontSize, FLT_MAX, 0.0f, lock_text)); + + const float text_start_x = bb.Min.x + image_size.x + LayoutScale(15.0f); + const ImRect title_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(points_start, midpoint)); + const ImRect summary_bb(ImVec2(text_start_x, midpoint), ImVec2(points_start, bb.Max.y)); + const ImRect points_bb(ImVec2(points_start, midpoint), bb.Max); + const ImRect lock_bb( + ImVec2(points_template_start + ((points_template_size.x - lock_size.x) * 0.5f), bb.Min.y), ImVec2(bb.Max.x, midpoint)); + + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, cheevo.title.c_str(), cheevo.title.c_str() + cheevo.title.size(), nullptr, + ImVec2(0.0f, 0.0f), &title_bb); + ImGui::RenderTextClipped(lock_bb.Min, lock_bb.Max, lock_text, nullptr, &lock_size, ImVec2(0.0f, 0.0f), &lock_bb); + ImGui::PopFont(); + + ImGui::PushFont(g_medium_font); + if (!cheevo.description.empty()) + { + ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, cheevo.description.c_str(), + cheevo.description.c_str() + cheevo.description.size(), nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + } + ImGui::RenderTextClipped(points_bb.Min, points_bb.Max, points_text.c_str(), points_text.c_str() + points_text.length(), &points_size, + ImVec2(0.0f, 0.0f), &points_bb); + ImGui::PopFont(); + + if (is_measured) + { + ImDrawList* dl = ImGui::GetWindowDrawList(); + const float progress_height = LayoutScale(progress_height_unscaled); + const float progress_spacing = LayoutScale(progress_spacing_unscaled); + const float top = midpoint + g_medium_font->FontSize + progress_spacing; + const ImRect progress_bb(ImVec2(text_start_x, top), ImVec2(bb.Max.x, top + progress_height)); + const float fraction = static_cast(progress.first) / static_cast(progress.second); + dl->AddRectFilled(progress_bb.Min, progress_bb.Max, ImGui::GetColorU32(ImGuiFullscreen::UIPrimaryDarkColor)); + dl->AddRectFilled(progress_bb.Min, ImVec2(progress_bb.Min.x + fraction * progress_bb.GetWidth(), progress_bb.Max.y), + ImGui::GetColorU32(ImGuiFullscreen::UISecondaryColor)); + + const std::string text(Achievements::GetAchievementProgressText(cheevo)); + const ImVec2 text_size = ImGui::CalcTextSize(text.c_str()); + const ImVec2 text_pos(progress_bb.Min.x + ((progress_bb.Max.x - progress_bb.Min.x) / 2.0f) - (text_size.x / 2.0f), + progress_bb.Min.y + ((progress_bb.Max.y - progress_bb.Min.y) / 2.0f) - (text_size.y / 2.0f)); + dl->AddText(g_medium_font, g_medium_font->FontSize, text_pos, ImGui::GetColorU32(ImGuiFullscreen::UIPrimaryTextColor), text.c_str(), + text.c_str() + text.size()); + } + +#if 0 + // The API doesn't seem to send us this :( + if (!cheevo.locked) + { + ImGui::PushFont(g_medium_font); + + const ImRect time_bb(ImVec2(text_start_x, bb.Min.y), + ImVec2(bb.Max.x, bb.Min.y + g_medium_font->FontSize + LayoutScale(4.0f))); + text.Format("Unlocked 21 Feb, 2019 @ 3:14am"); + ImGui::RenderTextClipped(time_bb.Min, time_bb.Max, text.GetCharArray(), text.GetCharArray() + text.GetLength(), + nullptr, ImVec2(1.0f, 0.0f), &time_bb); + ImGui::PopFont(); + } +#endif + + if (pressed) + { + // TODO: What should we do here? + // Display information or something.. + } +} + +void FullscreenUI::DrawAchievementsWindow() +{ + // ensure image downloads still happen while we're paused + Achievements::ProcessPendingHTTPRequestsFromGSThread(); + + static constexpr float alpha = 0.8f; + static constexpr float heading_height_unscaled = 110.0f; + + ImGui::SetNextWindowBgAlpha(alpha); + + const ImVec4 background(0.13f, 0.13f, 0.13f, alpha); + const ImVec2 display_size(ImGui::GetIO().DisplaySize); + const float heading_height = LayoutScale(heading_height_unscaled); + + if (BeginFullscreenWindow(ImVec2(0.0f, 0.0f), ImVec2(display_size.x, heading_height), "achievements_heading", background, 0.0f, 0.0f, + ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoScrollWithMouse)) + { + auto lock = Achievements::GetLock(); + + ImRect bb; + bool visible, hovered; + /*bool pressed = */ MenuButtonFrame( + "achievements_heading", false, heading_height_unscaled, &visible, &hovered, &bb.Min, &bb.Max, 0, alpha); + + if (visible) + { + const float padding = LayoutScale(10.0f); + const float spacing = LayoutScale(10.0f); + const float image_height = LayoutScale(85.0f); + + const ImVec2 icon_min(bb.Min + ImVec2(padding, padding)); + const ImVec2 icon_max(icon_min + ImVec2(image_height, image_height)); + + const std::string& icon_path = Achievements::GetGameIcon(); + if (!icon_path.empty()) + { + HostDisplayTexture* badge = GetCachedTexture(icon_path.c_str()); + if (badge) + { + ImGui::GetWindowDrawList()->AddImage( + badge->GetHandle(), icon_min, icon_max, ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255)); + } + } + + float left = bb.Min.x + padding + image_height + spacing; + float right = bb.Max.x - padding; + float top = bb.Min.y + padding; + ImDrawList* dl = ImGui::GetWindowDrawList(); + std::string text; + ImVec2 text_size; + + const u32 unlocked_count = Achievements::GetUnlockedAchiementCount(); + const u32 achievement_count = Achievements::GetAchievementCount(); + const u32 current_points = Achievements::GetCurrentPointsForGame(); + const u32 total_points = Achievements::GetMaximumPointsForGame(); + + if (FloatingButton(ICON_FA_WINDOW_CLOSE, 10.0f, 10.0f, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font) || WantsToCloseMenu()) + { + ReturnToMainWindow(); + } + + const ImRect title_bb(ImVec2(left, top), ImVec2(right, top + g_large_font->FontSize)); + text = Achievements::GetGameTitle(); + + if (Achievements::ChallengeModeActive()) + text += " (Hardcore Mode)"; + + top += g_large_font->FontSize + spacing; + + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped( + title_bb.Min, title_bb.Max, text.c_str(), text.c_str() + text.length(), nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + const ImRect summary_bb(ImVec2(left, top), ImVec2(right, top + g_medium_font->FontSize)); + if (unlocked_count == achievement_count) + { + text = fmt::format("You have unlocked all achievements and earned {} points!", total_points); + } + else + { + text = fmt::format("You have unlocked {} of {} achievements, earning {} of {} possible points.", unlocked_count, + achievement_count, current_points, total_points); + } + + top += g_medium_font->FontSize + spacing; + + ImGui::PushFont(g_medium_font); + ImGui::RenderTextClipped( + summary_bb.Min, summary_bb.Max, text.c_str(), text.c_str() + text.length(), nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + + const float progress_height = LayoutScale(20.0f); + const ImRect progress_bb(ImVec2(left, top), ImVec2(right, top + progress_height)); + const float fraction = static_cast(unlocked_count) / static_cast(achievement_count); + dl->AddRectFilled(progress_bb.Min, progress_bb.Max, ImGui::GetColorU32(ImGuiFullscreen::UIPrimaryDarkColor)); + dl->AddRectFilled(progress_bb.Min, ImVec2(progress_bb.Min.x + fraction * progress_bb.GetWidth(), progress_bb.Max.y), + ImGui::GetColorU32(ImGuiFullscreen::UISecondaryColor)); + + text = fmt::format("{}%", static_cast(std::round(fraction * 100.0f))); + text_size = ImGui::CalcTextSize(text.c_str()); + const ImVec2 text_pos(progress_bb.Min.x + ((progress_bb.Max.x - progress_bb.Min.x) / 2.0f) - (text_size.x / 2.0f), + progress_bb.Min.y + ((progress_bb.Max.y - progress_bb.Min.y) / 2.0f) - (text_size.y / 2.0f)); + dl->AddText(g_medium_font, g_medium_font->FontSize, text_pos, ImGui::GetColorU32(ImGuiFullscreen::UIPrimaryTextColor), + text.c_str(), text.c_str() + text.length()); + top += progress_height + spacing; + } + } + EndFullscreenWindow(); + + ImGui::SetNextWindowBgAlpha(alpha); + + if (BeginFullscreenWindow(ImVec2(0.0f, heading_height), ImVec2(display_size.x, display_size.y - heading_height), "achievements", + background, 0.0f, 0.0f, 0)) + { + BeginMenuButtons(); + + static bool unlocked_achievements_collapsed = false; + + unlocked_achievements_collapsed ^= + MenuHeadingButton("Unlocked Achievements", unlocked_achievements_collapsed ? ICON_FA_CHEVRON_DOWN : ICON_FA_CHEVRON_UP); + if (!unlocked_achievements_collapsed) + { + Achievements::EnumerateAchievements([](const Achievements::Achievement& cheevo) -> bool { + if (!cheevo.locked) + DrawAchievement(cheevo); + + return true; + }); + } + + if (Achievements::GetUnlockedAchiementCount() != Achievements::GetAchievementCount()) + { + static bool locked_achievements_collapsed = false; + locked_achievements_collapsed ^= + MenuHeadingButton("Locked Achievements", locked_achievements_collapsed ? ICON_FA_CHEVRON_DOWN : ICON_FA_CHEVRON_UP); + if (!locked_achievements_collapsed) + { + Achievements::EnumerateAchievements([](const Achievements::Achievement& cheevo) -> bool { + if (cheevo.locked) + DrawAchievement(cheevo); + + return true; + }); + } + } + + EndMenuButtons(); + } + EndFullscreenWindow(); +} + +void FullscreenUI::DrawPrimedAchievementsIcons() +{ + const ImVec2 image_size(LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT, LAYOUT_MENU_BUTTON_HEIGHT)); + const float spacing = LayoutScale(10.0f); + const float padding = LayoutScale(10.0f); + + const ImGuiIO& io = ImGui::GetIO(); + const float x_advance = image_size.x + spacing; + ImVec2 position(io.DisplaySize.x - padding - image_size.x, io.DisplaySize.y - padding - image_size.y); + + auto lock = Achievements::GetLock(); + Achievements::EnumerateAchievements([&image_size, &x_advance, &position](const Achievements::Achievement& achievement) { + if (!achievement.primed) + return true; + + const std::string& badge_path = Achievements::GetAchievementBadgePath(achievement, true, true); + if (badge_path.empty()) + return true; + + HostDisplayTexture* badge = GetCachedTextureAsync(badge_path.c_str()); + if (!badge) + return true; + + ImDrawList* dl = ImGui::GetBackgroundDrawList(); + dl->AddImage(badge->GetHandle(), position, position + image_size); + position.x -= x_advance; + return true; + }); +} + +void FullscreenUI::DrawPrimedAchievementsList() +{ + auto lock = Achievements::GetLock(); + const u32 primed_count = Achievements::GetPrimedAchievementCount(); + + const ImGuiIO& io = ImGui::GetIO(); + ImFont* font = g_medium_font; + + const ImVec2 image_size(LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)); + const float margin = LayoutScale(10.0f); + const float spacing = LayoutScale(10.0f); + const float padding = LayoutScale(10.0f); + + const float max_text_width = LayoutScale(300.0f); + const float row_width = max_text_width + padding + padding + image_size.x + spacing; + const float title_height = padding + font->FontSize + padding; + const ImVec2 box_min(io.DisplaySize.x - row_width - margin, margin); + const ImVec2 box_max(box_min.x + row_width, box_min.y + title_height + (static_cast(primed_count) * (image_size.y + padding))); + + ImDrawList* dl = ImGui::GetBackgroundDrawList(); + dl->AddRectFilled(box_min, box_max, IM_COL32(0x21, 0x21, 0x21, 200), LayoutScale(10.0f)); + dl->AddText(font, font->FontSize, ImVec2(box_min.x + padding, box_min.y + padding), IM_COL32(255, 255, 255, 255), + "Active Challenge Achievements"); + + const float y_advance = image_size.y + spacing; + const float acheivement_name_offset = (image_size.y - font->FontSize) / 2.0f; + const float max_non_ellipised_text_width = max_text_width - LayoutScale(10.0f); + ImVec2 position(box_min.x + padding, box_min.y + title_height); + + Achievements::EnumerateAchievements([font, &image_size, max_text_width, spacing, y_advance, acheivement_name_offset, + max_non_ellipised_text_width, &position](const Achievements::Achievement& achievement) { + if (!achievement.primed) + return true; + + const std::string& badge_path = Achievements::GetAchievementBadgePath(achievement, true, true); + if (badge_path.empty()) + return true; + + HostDisplayTexture* badge = GetCachedTextureAsync(badge_path.c_str()); + if (!badge) + return true; + + ImDrawList* dl = ImGui::GetBackgroundDrawList(); + dl->AddImage(badge->GetHandle(), position, position + image_size); + + const char* achievement_title = achievement.title.c_str(); + const char* achievement_tile_end = achievement_title + achievement.title.length(); + const char* remaining_text = nullptr; + const ImVec2 text_width(font->CalcTextSizeA( + font->FontSize, max_non_ellipised_text_width, 0.0f, achievement_title, achievement_tile_end, &remaining_text)); + const ImVec2 text_position(position.x + image_size.x + spacing, position.y + acheivement_name_offset); + const ImVec4 text_bbox(text_position.x, text_position.y, text_position.x + max_text_width, text_position.y + image_size.y); + const u32 text_color = IM_COL32(255, 255, 255, 255); + + if (remaining_text < achievement_tile_end) + { + dl->AddText(font, font->FontSize, text_position, text_color, achievement_title, remaining_text, 0.0f, &text_bbox); + dl->AddText(font, font->FontSize, ImVec2(text_position.x + text_width.x, text_position.y), text_color, "...", nullptr, 0.0f, + &text_bbox); + } + else + { + dl->AddText(font, font->FontSize, text_position, text_color, achievement_title, achievement_title + achievement.title.length(), + 0.0f, &text_bbox); + } + + position.y += y_advance; + return true; + }); +} + +void FullscreenUI::OpenLeaderboardsWindow() +{ + if (!VMManager::HasValidVM() || !Achievements::IsActive()) + return; + + GetMTGS().RunOnGSThread([]() { + if (!ImGuiManager::InitializeFullscreenUI()) + return; + + SwitchToLeaderboardsWindow(); + }); +} + +void FullscreenUI::SwitchToLeaderboardsWindow() +{ + if (!VMManager::HasValidVM()) + return; + + if (!Achievements::HasActiveGame() || Achievements::GetLeaderboardCount() == 0) + { + ShowToast(std::string(), "This game has no leaderboards."); + return; + } + + if (s_current_main_window != MainWindowType::PauseMenu) + PauseForMenuOpen(); + + s_current_main_window = MainWindowType::Leaderboards; + s_open_leaderboard_id.reset(); + QueueResetFocus(); +} + +void FullscreenUI::DrawLeaderboardListEntry(const Achievements::Leaderboard& lboard) +{ + static constexpr float alpha = 0.8f; + + std::string id_str(fmt::format("lb_{}", lboard.id)); + + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(id_str.c_str(), true, LAYOUT_MENU_BUTTON_HEIGHT, &visible, &hovered, &bb.Min, &bb.Max, 0, alpha); + if (!visible) + return; + + const float midpoint = bb.Min.y + g_large_font->FontSize + LayoutScale(4.0f); + const float text_start_x = bb.Min.x + LayoutScale(15.0f); + const ImRect title_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint)); + const ImRect summary_bb(ImVec2(text_start_x, midpoint), bb.Max); + + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, lboard.title.c_str(), lboard.title.c_str() + lboard.title.size(), nullptr, + ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + if (!lboard.description.empty()) + { + ImGui::PushFont(g_medium_font); + ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, lboard.description.c_str(), + lboard.description.c_str() + lboard.description.size(), nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (pressed) + { + s_open_leaderboard_id = lboard.id; + } +} + +void FullscreenUI::DrawLeaderboardEntry( + const Achievements::LeaderboardEntry& lbEntry, float rank_column_width, float name_column_width, float column_spacing) +{ + static constexpr float alpha = 0.8f; + + ImRect bb; + bool visible, hovered; + bool pressed = + MenuButtonFrame(lbEntry.user.c_str(), true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, &visible, &hovered, &bb.Min, &bb.Max, 0, alpha); + if (!visible) + return; + + const float midpoint = bb.Min.y + g_large_font->FontSize + LayoutScale(4.0f); + float text_start_x = bb.Min.x + LayoutScale(15.0f); + std::string rank_str(fmt::format("{}", lbEntry.rank)); + + ImGui::PushFont(g_large_font); + if (lbEntry.is_self) + { + ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(255, 242, 0, 255)); + } + + const ImRect rank_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint)); + ImGui::RenderTextClipped(rank_bb.Min, rank_bb.Max, rank_str.c_str(), nullptr, nullptr, ImVec2(0.0f, 0.0f), &rank_bb); + text_start_x += rank_column_width + column_spacing; + + const ImRect user_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint)); + ImGui::RenderTextClipped( + user_bb.Min, user_bb.Max, lbEntry.user.c_str(), lbEntry.user.c_str() + lbEntry.user.size(), nullptr, ImVec2(0.0f, 0.0f), &user_bb); + text_start_x += name_column_width + column_spacing; + + const ImRect score_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint)); + ImGui::RenderTextClipped(score_bb.Min, score_bb.Max, lbEntry.formatted_score.c_str(), + lbEntry.formatted_score.c_str() + lbEntry.formatted_score.size(), nullptr, ImVec2(0.0f, 0.0f), &score_bb); + + if (lbEntry.is_self) + { + ImGui::PopStyleColor(); + } + + ImGui::PopFont(); + + // This API DOES list the submission date/time, but is it relevant? +#if 0 + if (!cheevo.locked) + { + ImGui::PushFont(g_medium_font); + + const ImRect time_bb(ImVec2(text_start_x, bb.Min.y), + ImVec2(bb.Max.x, bb.Min.y + g_medium_font->FontSize + LayoutScale(4.0f))); + text.Format("Unlocked 21 Feb, 2019 @ 3:14am"); + ImGui::RenderTextClipped(time_bb.Min, time_bb.Max, text.GetCharArray(), text.GetCharArray() + text.GetLength(), + nullptr, ImVec2(1.0f, 0.0f), &time_bb); + ImGui::PopFont(); + } +#endif + + if (pressed) + { + // Anything? + } +} + +void FullscreenUI::DrawLeaderboardsWindow() +{ + static constexpr float alpha = 0.8f; + static constexpr float heading_height_unscaled = 110.0f; + + // ensure image downloads still happen while we're paused + Achievements::ProcessPendingHTTPRequestsFromGSThread(); + + ImGui::SetNextWindowBgAlpha(alpha); + + const bool is_leaderboard_open = s_open_leaderboard_id.has_value(); + bool close_leaderboard_on_exit = false; + + const ImVec4 background(0.13f, 0.13f, 0.13f, alpha); + const ImVec2 display_size(ImGui::GetIO().DisplaySize); + const float padding = LayoutScale(10.0f); + const float spacing = LayoutScale(10.0f); + const float spacing_small = spacing / 2.0f; + float heading_height = LayoutScale(heading_height_unscaled); + if (is_leaderboard_open) + { + // Add space for a legend - spacing + 1 line of text + spacing + line + heading_height += spacing + LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY) + spacing; + } + + const float rank_column_width = + g_large_font->CalcTextSizeA(g_large_font->FontSize, std::numeric_limits::max(), -1.0f, "99999").x; + const float name_column_width = + g_large_font->CalcTextSizeA(g_large_font->FontSize, std::numeric_limits::max(), -1.0f, "WWWWWWWWWWWWWWWWWWWW").x; + const float column_spacing = spacing * 2.0f; + + if (BeginFullscreenWindow(ImVec2(0.0f, 0.0f), ImVec2(display_size.x, heading_height), "leaderboards_heading", background, 0.0f, 0.0f, + ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoScrollWithMouse)) + { + ImRect bb; + bool visible, hovered; + /*bool pressed = */ + MenuButtonFrame("leaderboards_heading", false, heading_height_unscaled, &visible, &hovered, &bb.Min, &bb.Max, 0, alpha); + + if (visible) + { + const float image_height = LayoutScale(85.0f); + + const ImVec2 icon_min(bb.Min + ImVec2(padding, padding)); + const ImVec2 icon_max(icon_min + ImVec2(image_height, image_height)); + + const std::string& icon_path = Achievements::GetGameIcon(); + if (!icon_path.empty()) + { + HostDisplayTexture* badge = GetCachedTexture(icon_path.c_str()); + if (badge) + { + ImGui::GetWindowDrawList()->AddImage( + badge->GetHandle(), icon_min, icon_max, ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), IM_COL32(255, 255, 255, 255)); + } + } + + float left = bb.Min.x + padding + image_height + spacing; + float right = bb.Max.x - padding; + float top = bb.Min.y + padding; + + const u32 leaderboard_count = Achievements::GetLeaderboardCount(); + + if (!is_leaderboard_open) + { + if (FloatingButton(ICON_FA_WINDOW_CLOSE, 10.0f, 10.0f, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font) || WantsToCloseMenu()) + { + ReturnToMainWindow(); + } + } + else + { + if (FloatingButton(ICON_FA_CARET_SQUARE_LEFT, 10.0f, 10.0f, -1.0f, -1.0f, 1.0f, 0.0f, true, g_large_font) || + WantsToCloseMenu()) + { + close_leaderboard_on_exit = true; + } + } + + const ImRect title_bb(ImVec2(left, top), ImVec2(right, top + g_large_font->FontSize)); + const std::string& title = Achievements::GetGameTitle(); + + top += g_large_font->FontSize + spacing; + + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title.c_str(), nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + std::string lb_description; + if (s_open_leaderboard_id.has_value()) + { + const Achievements::Leaderboard* lboard = Achievements::GetLeaderboardByID(s_open_leaderboard_id.value()); + if (lboard != nullptr) + { + const ImRect subtitle_bb(ImVec2(left, top), ImVec2(right, top + g_large_font->FontSize)); + const std::string& subtitle = lboard->title; + + top += g_large_font->FontSize + spacing_small; + + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped( + subtitle_bb.Min, subtitle_bb.Max, subtitle.c_str(), nullptr, nullptr, ImVec2(0.0f, 0.0f), &subtitle_bb); + ImGui::PopFont(); + + lb_description = lboard->description; + } + } + else + { + lb_description = fmt::format("This game has {} leaderboards.", leaderboard_count); + } + + const ImRect summary_bb(ImVec2(left, top), ImVec2(right, top + g_medium_font->FontSize)); + top += g_medium_font->FontSize + spacing_small; + + ImGui::PushFont(g_medium_font); + ImGui::RenderTextClipped( + summary_bb.Min, summary_bb.Max, lb_description.c_str(), nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + + if (!Achievements::ChallengeModeActive()) + { + const ImRect hardcore_warning_bb(ImVec2(left, top), ImVec2(right, top + g_medium_font->FontSize)); + top += g_medium_font->FontSize + spacing_small; + + ImGui::RenderTextClipped(hardcore_warning_bb.Min, hardcore_warning_bb.Max, + "Submitting scores is disabled because hardcore mode is off. Leaderboards are read-only.", nullptr, nullptr, + ImVec2(0.0f, 0.0f), &hardcore_warning_bb); + } + + ImGui::PopFont(); + } + + if (is_leaderboard_open) + { + /*bool pressed = */ + MenuButtonFrame("legend", false, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, &visible, &hovered, &bb.Min, &bb.Max, 0, alpha); + + if (visible) + { + const Achievements::Leaderboard* lboard = Achievements::GetLeaderboardByID(s_open_leaderboard_id.value()); + + const float midpoint = bb.Min.y + g_large_font->FontSize + LayoutScale(4.0f); + float text_start_x = bb.Min.x + LayoutScale(15.0f) + padding; + + ImGui::PushFont(g_large_font); + + const ImRect rank_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint)); + ImGui::RenderTextClipped(rank_bb.Min, rank_bb.Max, "Rank", nullptr, nullptr, ImVec2(0.0f, 0.0f), &rank_bb); + text_start_x += rank_column_width + column_spacing; + + const ImRect user_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint)); + ImGui::RenderTextClipped(user_bb.Min, user_bb.Max, "Name", nullptr, nullptr, ImVec2(0.0f, 0.0f), &user_bb); + text_start_x += name_column_width + column_spacing; + + const ImRect score_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint)); + ImGui::RenderTextClipped(score_bb.Min, score_bb.Max, + lboard != nullptr && Achievements::IsLeaderboardTimeType(*lboard) ? "Time" : "Score", nullptr, nullptr, + ImVec2(0.0f, 0.0f), &score_bb); + + ImGui::PopFont(); + + const float line_thickness = LayoutScale(1.0f); + const float line_padding = LayoutScale(5.0f); + const ImVec2 line_start(bb.Min.x, bb.Min.y + g_large_font->FontSize + line_padding); + const ImVec2 line_end(bb.Max.x, line_start.y); + ImGui::GetWindowDrawList()->AddLine(line_start, line_end, ImGui::GetColorU32(ImGuiCol_TextDisabled), line_thickness); + } + } + } + EndFullscreenWindow(); + + ImGui::SetNextWindowBgAlpha(alpha); + + if (!is_leaderboard_open) + { + if (BeginFullscreenWindow(ImVec2(0.0f, heading_height), ImVec2(display_size.x, display_size.y - heading_height), "leaderboards", + background, 0.0f, 0.0f, 0)) + { + BeginMenuButtons(); + + Achievements::EnumerateLeaderboards([](const Achievements::Leaderboard& lboard) -> bool { + DrawLeaderboardListEntry(lboard); + + return true; + }); + + EndMenuButtons(); + } + EndFullscreenWindow(); + } + else + { + if (BeginFullscreenWindow(ImVec2(0.0f, heading_height), ImVec2(display_size.x, display_size.y - heading_height), "leaderboard", + background, 0.0f, 0.0f, 0)) + { + BeginMenuButtons(); + + const auto result = Achievements::TryEnumerateLeaderboardEntries(s_open_leaderboard_id.value(), + [rank_column_width, name_column_width, column_spacing](const Achievements::LeaderboardEntry& lbEntry) -> bool { + DrawLeaderboardEntry(lbEntry, rank_column_width, name_column_width, column_spacing); + return true; + }); + + if (!result.has_value()) + { + ImGui::PushFont(g_large_font); + + const ImVec2 pos_min(0.0f, heading_height); + const ImVec2 pos_max(display_size.x, display_size.y); + ImGui::RenderTextClipped( + pos_min, pos_max, "Downloading leaderboard data, please wait...", nullptr, nullptr, ImVec2(0.5f, 0.5f)); + + ImGui::PopFont(); + } + + EndMenuButtons(); + } + EndFullscreenWindow(); + } + + if (close_leaderboard_on_exit) + s_open_leaderboard_id.reset(); +} + +void FullscreenUI::DrawAchievementsSettingsPage(std::unique_lock& settings_lock) +{ +#ifdef ENABLE_RAINTEGRATION + if (Achievements::IsUsingRAIntegration()) + { + BeginMenuButtons(); + ActiveButton(ICON_FA_BAN " RAIntegration is being used instead of the built-in achievements implementation.", false, false, + LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + EndMenuButtons(); + return; + } +#endif + + SettingsInterface* bsi = GetEditingSettingsInterface(); + bool check_challenge_state = false; + + BeginMenuButtons(); + + MenuHeading("Settings"); + check_challenge_state = DrawToggleSetting(bsi, ICON_FA_TROPHY " Enable Achievements", + "When enabled and logged in, PCSX2 will scan for achievements on startup.", "Achievements", "Enabled", false); + + const bool enabled = bsi->GetBoolValue("Achievements", "Enabled", false); + const bool challenge = bsi->GetBoolValue("Achievements", "ChallengeMode", false); + + DrawToggleSetting(bsi, ICON_FA_USER_FRIENDS " Rich Presence", + "When enabled, rich presence information will be collected and sent to the server where supported.", "Achievements", "RichPresence", + true, enabled); + check_challenge_state |= DrawToggleSetting(bsi, ICON_FA_HARD_HAT " Hardcore Mode", + "\"Challenge\" mode for achievements, including leaderboard tracking. Disables save state, cheats, and slowdown functions.", + "Achievements", "ChallengeMode", false, enabled); + DrawToggleSetting(bsi, ICON_FA_LIST_OL " Leaderboards", "Enables tracking and submission of leaderboards in supported games.", + "Achievements", "Leaderboards", true, enabled && challenge); + DrawToggleSetting(bsi, ICON_FA_HEADPHONES " Sound Effects", + "Plays sound effects for events such as achievement unlocks and leaderboard submissions.", "Achievements", "SoundEffects", true, + enabled); + DrawToggleSetting(bsi, ICON_FA_MAGIC " Show Challenge Indicators", + "Shows icons in the lower-right corner of the screen when a challenge/primed achievement is active.", "Achievements", + "PrimedIndicators", true, enabled); + DrawToggleSetting(bsi, ICON_FA_MEDAL " Test Unofficial Achievements", + "When enabled, PCSX2 will list achievements from unofficial sets. These achievements are not tracked by RetroAchievements.", + "Achievements", "UnofficialTestMode", false, enabled); + DrawToggleSetting(bsi, ICON_FA_STETHOSCOPE " Test Mode", + "When enabled, PCSX2 will assume all achievements are locked and not send any unlock notifications to the server.", "Achievements", + "TestMode", false, enabled); + + // Check for challenge mode just being enabled. + if (check_challenge_state && enabled && bsi->GetBoolValue("Achievements", "ChallengeMode", false) && VMManager::HasValidVM()) + { + ImGuiFullscreen::OpenConfirmMessageDialog("Reset System", + "Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?", [](bool reset) { + if (!VMManager::HasValidVM()) + return; + + if (reset) + DoReset(); + }); + } + + // Potential deadlock here: when we enable achievements, CPU thread reads settings, releases lock, then there's a brief + // time when we can progress here and get the setting lock, by the time it goes to read the username out of settings, + // we've got it here, but can't get the achievements lock. So only hold one at once. + const u64 ts = StringUtil::FromChars(bsi->GetStringValue("Achievements", "LoginTimestamp", "0")).value_or(0); + settings_lock.unlock(); + { + const auto achievements_lock = Achievements::GetLock(); + if (Achievements::IsActive()) + Achievements::ProcessPendingHTTPRequestsFromGSThread(); + + MenuHeading("Account"); + if (Achievements::IsLoggedIn()) + { + ImGui::PushStyleColor(ImGuiCol_TextDisabled, ImGui::GetStyle().Colors[ImGuiCol_Text]); + ActiveButton(fmt::format(ICON_FA_USER " Username: {}", Achievements::GetUsername()).c_str(), false, false, + LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + + ActiveButton(fmt::format(ICON_FA_CLOCK " Login token generated on {}", TimeToPrintableString(static_cast(ts))).c_str(), + false, false, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + ImGui::PopStyleColor(); + + if (MenuButton(ICON_FA_KEY " Logout", "Logs out of RetroAchievements.")) + { + Host::RunOnCPUThread([]() { Achievements::Logout(); }); + } + } + else if (Achievements::IsActive()) + { + ActiveButton(ICON_FA_USER " Not Logged In", false, false, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + + if (MenuButton(ICON_FA_KEY " Login", "Logs in to RetroAchievements.")) + ImGui::OpenPopup("Achievements Login"); + + DrawAchievementsLoginWindow(); + } + else + { + ActiveButton(ICON_FA_USER " Achievements are disabled.", false, false, ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + } + } + + MenuHeading("Current Game"); + if (Achievements::HasActiveGame()) + { + ImGui::PushStyleColor(ImGuiCol_TextDisabled, ImGui::GetStyle().Colors[ImGuiCol_Text]); + ActiveButton(fmt::format(ICON_FA_BOOKMARK " Game ID: {}", Achievements::GetGameID()).c_str(), false, false, + LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + ActiveButton(fmt::format(ICON_FA_BOOK " Game Title: {}", Achievements::GetGameTitle()).c_str(), false, false, + LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + ActiveButton(fmt::format(ICON_FA_TROPHY " Achievements: {} ({} points)", Achievements::GetAchievementCount(), + Achievements::GetMaximumPointsForGame()) + .c_str(), + false, false, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + + const std::string& rich_presence_string = Achievements::GetRichPresenceString(); + if (!rich_presence_string.empty()) + { + ActiveButton(fmt::format(ICON_FA_MAP " {}", rich_presence_string).c_str(), false, false, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + } + else + { + ActiveButton(ICON_FA_MAP " Rich presence inactive or unsupported.", false, false, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + } + + ImGui::PopStyleColor(); + } + else + { + ActiveButton( + ICON_FA_BAN " Game not loaded or no RetroAchievements available.", false, false, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + } + + EndMenuButtons(); + + settings_lock.lock(); +} + +void FullscreenUI::DrawAchievementsLoginWindow() +{ + ImGui::SetNextWindowSize(LayoutScale(700.0f, 0.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushFont(g_large_font); + + bool is_open = true; + if (ImGui::BeginPopupModal("Achievements Login", &is_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize)) + { + + ImGui::TextWrapped("Please enter your user name and password for retroachievements.org."); + ImGui::NewLine(); + ImGui::TextWrapped("Your password will not be saved in PCSX2, an access token will be generated and used instead."); + + ImGui::NewLine(); + + static char username[256] = {}; + static char password[256] = {}; + + ImGui::Text("User Name: "); + ImGui::SameLine(LayoutScale(200.0f)); + ImGui::InputText("##username", username, sizeof(username)); + + ImGui::Text("Password: "); + ImGui::SameLine(LayoutScale(200.0f)); + ImGui::InputText("##password", password, sizeof(password), ImGuiInputTextFlags_Password); + + ImGui::NewLine(); + + BeginMenuButtons(); + + const bool login_enabled = (std::strlen(username) > 0 && std::strlen(password) > 0); + + if (ActiveButton(ICON_FA_KEY " Login", false, login_enabled)) + { + Achievements::LoginAsync(username, password); + std::memset(username, 0, sizeof(username)); + std::memset(password, 0, sizeof(password)); + ImGui::CloseCurrentPopup(); + } + + if (ActiveButton(ICON_FA_TIMES " Cancel", false)) + { + std::memset(username, 0, sizeof(username)); + std::memset(password, 0, sizeof(password)); + ImGui::CloseCurrentPopup(); + } + + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopFont(); + ImGui::PopStyleVar(2); +} + +#else + +bool FullscreenUI::OpenAchievementsWindow() +{ + return false; +} + +bool FullscreenUI::OpenLeaderboardsWindow() +{ + return false; +} + +void FullscreenUI::DrawAchievementsSettingsPage() +{ + BeginMenuButtons(); + ActiveButton(ICON_FA_BAN " This build was not compiled with RetroAchievements support.", false, false, + ImGuiFullscreen::LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + EndMenuButtons(); +} + +void FullscreenUI::DrawAchievementsLoginWindow() +{ +} + +#endif diff --git a/pcsx2/Frontend/FullscreenUI.h b/pcsx2/Frontend/FullscreenUI.h new file mode 100644 index 0000000000..6ac421e21e --- /dev/null +++ b/pcsx2/Frontend/FullscreenUI.h @@ -0,0 +1,79 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "common/Pcsx2Defs.h" +#include "common/ProgressCallback.h" +#include +#include + +class HostDisplayTexture; + +struct Pcsx2Config; + +namespace FullscreenUI +{ + bool Initialize(); + bool IsInitialized(); + bool HasActiveWindow(); + void CheckForConfigChanges(const Pcsx2Config& old_config); + void OnVMStarted(); + void OnVMPaused(); + void OnVMResumed(); + void OnVMDestroyed(); + void OnRunningGameChanged(std::string path, std::string serial, std::string title, u32 crc); + void OpenPauseMenu(); + void OpenAchievementsWindow(); + void OpenLeaderboardsWindow(); + + void Shutdown(bool clear_state); + void Render(); + void InvalidateCoverCache(); + + class ProgressCallback final : public BaseProgressCallback + { + public: + ProgressCallback(std::string name); + ~ProgressCallback() override; + + __fi const std::string& GetName() const { return m_name; } + + void PushState() override; + void PopState() override; + + void SetCancellable(bool cancellable) override; + void SetTitle(const char* title) override; + void SetStatusText(const char* text) override; + void SetProgressRange(u32 range) override; + void SetProgressValue(u32 value) override; + + void DisplayError(const char* message) override; + void DisplayWarning(const char* message) override; + void DisplayInformation(const char* message) override; + void DisplayDebugMessage(const char* message) override; + + void ModalError(const char* message) override; + bool ModalConfirmation(const char* message) override; + void ModalInformation(const char* message) override; + + void SetCancelled(); + + private: + void Redraw(bool force); + + std::string m_name; + int m_last_progress_percent = -1; + }; +} // namespace FullscreenUI diff --git a/pcsx2/Frontend/GameList.cpp b/pcsx2/Frontend/GameList.cpp index 2ef62b7029..7237318a4f 100644 --- a/pcsx2/Frontend/GameList.cpp +++ b/pcsx2/Frontend/GameList.cpp @@ -20,6 +20,8 @@ #include "common/Assertions.h" #include "common/Console.h" #include "common/FileSystem.h" +#include "common/HeterogeneousContainers.h" +#include "common/HTTPDownloader.h" #include "common/Path.h" #include "common/ProgressCallback.h" #include "common/StringUtil.h" @@ -36,15 +38,34 @@ #include "Elfheader.h" #include "VMManager.h" -enum : u32 -{ - GAME_LIST_CACHE_SIGNATURE = 0x45434C47, - GAME_LIST_CACHE_VERSION = 32 -}; +#ifdef _WIN32 +#include "common/RedtapeWindows.h" +#endif namespace GameList { - using CacheMap = std::unordered_map; + enum : u32 + { + GAME_LIST_CACHE_SIGNATURE = 0x45434C47, + GAME_LIST_CACHE_VERSION = 32, + + + PLAYED_TIME_SERIAL_LENGTH = 32, + PLAYED_TIME_LAST_TIME_LENGTH = 20, // uint64 + PLAYED_TIME_TOTAL_TIME_LENGTH = 20, // uint64 + PLAYED_TIME_LINE_LENGTH = PLAYED_TIME_SERIAL_LENGTH + 1 + PLAYED_TIME_LAST_TIME_LENGTH + 1 + PLAYED_TIME_TOTAL_TIME_LENGTH, + }; + + struct PlayedTimeEntry + { + std::time_t last_played_time; + std::time_t total_played_time; + }; + + using CacheMap = UnorderedStringMap; + using PlayedTimeMap = UnorderedStringMap; + + static bool IsScannableFilename(const std::string_view& path); static Entry* GetMutableEntryForPath(const char* path); @@ -52,10 +73,11 @@ namespace GameList static bool GetIsoListEntry(const std::string& path, GameList::Entry* entry); static bool GetGameListEntryFromCache(const std::string& path, GameList::Entry* entry); - static void ScanDirectory(const char* path, bool recursive, const std::vector& excluded_paths, - ProgressCallback* progress); - static bool AddFileFromCache(const std::string& path, std::time_t timestamp); - static bool ScanFile(std::string path, std::time_t timestamp); + static void ScanDirectory(const char* path, bool recursive, bool only_cache, const std::vector& excluded_paths, + const PlayedTimeMap& played_time_map, ProgressCallback* progress); + static bool AddFileFromCache(const std::string& path, std::time_t timestamp, const PlayedTimeMap& played_time_map); + static bool ScanFile( + std::string path, std::time_t timestamp, std::unique_lock& lock, const PlayedTimeMap& played_time_map); static void LoadCache(); static bool LoadEntriesFromCache(std::FILE* stream); @@ -64,35 +86,37 @@ namespace GameList static void CloseCacheFileStream(); static void DeleteCacheFile(); - static void LoadDatabase(); + static std::string GetPlayedTimeFile(); + static bool ParsePlayedTimeLine(char* line, std::string& serial, PlayedTimeEntry& entry); + static std::string MakePlayedTimeLine(const std::string& serial, const PlayedTimeEntry& entry); + static PlayedTimeMap LoadPlayedTimeMap(const std::string& path); + static PlayedTimeEntry UpdatePlayedTimeFile( + const std::string& path, const std::string& serial, std::time_t last_time, std::time_t add_time); } // namespace GameList -static std::vector m_entries; +static std::vector s_entries; static std::recursive_mutex s_mutex; -static GameList::CacheMap m_cache_map; -static std::FILE* m_cache_write_stream = nullptr; - -static bool m_game_list_loaded = false; - -bool GameList::IsGameListLoaded() -{ - return m_game_list_loaded; -} +static GameList::CacheMap s_cache_map; +static std::FILE* s_cache_write_stream = nullptr; const char* GameList::EntryTypeToString(EntryType type) { - static std::array(EntryType::Count)> names = { - {"PS2Disc", "PS1Disc", "ELF", "Playlist"}}; + static std::array(EntryType::Count)> names = {{"PS2Disc", "PS1Disc", "ELF"}}; + return names[static_cast(type)]; +} + +const char* GameList::EntryTypeToDisplayString(EntryType type) +{ + static std::array(EntryType::Count)> names = {{"PS2 Disc", "PS1 Disc", "ELF"}}; return names[static_cast(type)]; } const char* GameList::RegionToString(Region region) { - static std::array(Region::Count)> names = { - {"NTSC-B", "NTSC-C", "NTSC-HK", "NTSC-J", "NTSC-K", "NTSC-T", "NTSC-U", - "Other", - "PAL-A", "PAL-AF", "PAL-AU", "PAL-BE", "PAL-E", "PAL-F", "PAL-FI", "PAL-G", "PAL-GR", "PAL-I", "PAL-IN", "PAL-M", "PAL-NL", "PAL-NO", "PAL-P", "PAL-R", "PAL-S", "PAL-SC", "PAL-SW", "PAL-SWI", "PAL-UK"}}; - + static std::array(Region::Count)> names = {{"NTSC-B", "NTSC-C", "NTSC-HK", "NTSC-J", "NTSC-K", "NTSC-T", + "NTSC-U", "Other", "PAL-A", "PAL-AF", "PAL-AU", "PAL-BE", "PAL-E", "PAL-F", "PAL-FI", "PAL-G", "PAL-GR", "PAL-I", "PAL-IN", "PAL-M", + "PAL-NL", "PAL-NO", "PAL-P", "PAL-R", "PAL-S", "PAL-SC", "PAL-SW", "PAL-SWI", "PAL-UK"}}; + return names[static_cast(region)]; } @@ -115,15 +139,7 @@ const char* GameList::EntryCompatibilityRatingToString(CompatibilityRating ratin bool GameList::IsScannableFilename(const std::string_view& path) { - static const char* extensions[] = {".iso", ".mdf", ".nrg", ".bin", ".img", ".gz", ".cso", ".chd", ".elf", ".irx"}; - - for (const char* test_extension : extensions) - { - if (StringUtil::EndsWithNoCase(path, test_extension)) - return true; - } - - return false; + return VMManager::IsDiscFileName(path) || VMManager::IsElfFileName(path); } void GameList::FillBootParametersForEntry(VMBootParameters* params, const Entry* entry) @@ -168,7 +184,7 @@ bool GameList::GetElfListEntry(const std::string& path, GameList::Entry* entry) const std::string display_name(FileSystem::GetDisplayNameFromPath(path)); entry->path = path; entry->serial.clear(); - entry->title = Path::StripExtension(display_name); + entry->title = Path::GetFileTitle(display_name); entry->region = Region::Other; entry->total_size = static_cast(file_size); entry->type = EntryType::ELF; @@ -309,12 +325,12 @@ bool GameList::PopulateEntryFromPath(const std::string& path, GameList::Entry* e bool GameList::GetGameListEntryFromCache(const std::string& path, GameList::Entry* entry) { - auto iter = m_cache_map.find(path); - if (iter == m_cache_map.end()) + auto iter = UnorderedStringMapFind(s_cache_map, path); + if (iter == s_cache_map.end()) return false; *entry = std::move(iter->second); - m_cache_map.erase(iter); + s_cache_map.erase(iter); return true; } @@ -407,11 +423,11 @@ bool GameList::LoadEntriesFromCache(std::FILE* stream) ge.compatibility_rating = static_cast(compatibility_rating); ge.last_modified_time = static_cast(last_modified_time); - auto iter = m_cache_map.find(ge.path); - if (iter != m_cache_map.end()) + auto iter = UnorderedStringMapFind(s_cache_map, ge.path); + if (iter != s_cache_map.end()) iter->second = std::move(ge); else - m_cache_map.emplace(std::move(path), std::move(ge)); + s_cache_map.emplace(std::move(path), std::move(ge)); } return true; @@ -433,7 +449,7 @@ void GameList::LoadCache() { Console.Warning("Deleting corrupted cache file '%s'", cache_filename.c_str()); stream.reset(); - m_cache_map.clear(); + s_cache_map.clear(); DeleteCacheFile(); return; } @@ -445,36 +461,36 @@ bool GameList::OpenCacheForWriting() if (cache_filename.empty()) return false; - pxAssert(!m_cache_write_stream); - m_cache_write_stream = FileSystem::OpenCFile(cache_filename.c_str(), "r+b"); - if (m_cache_write_stream) + pxAssert(!s_cache_write_stream); + s_cache_write_stream = FileSystem::OpenCFile(cache_filename.c_str(), "r+b"); + if (s_cache_write_stream) { // check the header u32 signature, version; - if (ReadU32(m_cache_write_stream, &signature) && signature == GAME_LIST_CACHE_SIGNATURE && - ReadU32(m_cache_write_stream, &version) && version == GAME_LIST_CACHE_VERSION && - FileSystem::FSeek64(m_cache_write_stream, 0, SEEK_END) == 0) + if (ReadU32(s_cache_write_stream, &signature) && signature == GAME_LIST_CACHE_SIGNATURE && + ReadU32(s_cache_write_stream, &version) && version == GAME_LIST_CACHE_VERSION && + FileSystem::FSeek64(s_cache_write_stream, 0, SEEK_END) == 0) { return true; } - std::fclose(m_cache_write_stream); + std::fclose(s_cache_write_stream); } Console.WriteLn("Creating new game list cache file: '%s'", cache_filename.c_str()); - m_cache_write_stream = FileSystem::OpenCFile(cache_filename.c_str(), "w+b"); - if (!m_cache_write_stream) + s_cache_write_stream = FileSystem::OpenCFile(cache_filename.c_str(), "w+b"); + if (!s_cache_write_stream) return false; // new cache file, write header - if (!WriteU32(m_cache_write_stream, GAME_LIST_CACHE_SIGNATURE) || - !WriteU32(m_cache_write_stream, GAME_LIST_CACHE_VERSION)) + if (!WriteU32(s_cache_write_stream, GAME_LIST_CACHE_SIGNATURE) || + !WriteU32(s_cache_write_stream, GAME_LIST_CACHE_VERSION)) { Console.Error("Failed to write game list cache header"); - std::fclose(m_cache_write_stream); - m_cache_write_stream = nullptr; + std::fclose(s_cache_write_stream); + s_cache_write_stream = nullptr; FileSystem::DeleteFilePath(cache_filename.c_str()); return false; } @@ -485,35 +501,35 @@ bool GameList::OpenCacheForWriting() bool GameList::WriteEntryToCache(const Entry* entry) { bool result = true; - result &= WriteString(m_cache_write_stream, entry->path); - result &= WriteString(m_cache_write_stream, entry->serial); - result &= WriteString(m_cache_write_stream, entry->title); - result &= WriteU8(m_cache_write_stream, static_cast(entry->type)); - result &= WriteU8(m_cache_write_stream, static_cast(entry->region)); - result &= WriteU64(m_cache_write_stream, entry->total_size); - result &= WriteU64(m_cache_write_stream, static_cast(entry->last_modified_time)); - result &= WriteU32(m_cache_write_stream, entry->crc); - result &= WriteU8(m_cache_write_stream, static_cast(entry->compatibility_rating)); + result &= WriteString(s_cache_write_stream, entry->path); + result &= WriteString(s_cache_write_stream, entry->serial); + result &= WriteString(s_cache_write_stream, entry->title); + result &= WriteU8(s_cache_write_stream, static_cast(entry->type)); + result &= WriteU8(s_cache_write_stream, static_cast(entry->region)); + result &= WriteU64(s_cache_write_stream, entry->total_size); + result &= WriteU64(s_cache_write_stream, static_cast(entry->last_modified_time)); + result &= WriteU32(s_cache_write_stream, entry->crc); + result &= WriteU8(s_cache_write_stream, static_cast(entry->compatibility_rating)); // flush after each entry, that way we don't end up with a corrupted file if we crash scanning. if (result) - result = (std::fflush(m_cache_write_stream) == 0); + result = (std::fflush(s_cache_write_stream) == 0); return result; } void GameList::CloseCacheFileStream() { - if (!m_cache_write_stream) + if (!s_cache_write_stream) return; - std::fclose(m_cache_write_stream); - m_cache_write_stream = nullptr; + std::fclose(s_cache_write_stream); + s_cache_write_stream = nullptr; } void GameList::DeleteCacheFile() { - pxAssert(!m_cache_write_stream); + pxAssert(!s_cache_write_stream); const std::string cache_filename(GetCacheFilename()); if (cache_filename.empty() || !FileSystem::FileExists(cache_filename.c_str())) @@ -530,7 +546,7 @@ static bool IsPathExcluded(const std::vector& excluded_paths, const return (std::find(excluded_paths.begin(), excluded_paths.end(), path) != excluded_paths.end()); } -void GameList::ScanDirectory(const char* path, bool recursive, const std::vector& excluded_paths, +void GameList::ScanDirectory(const char* path, bool recursive, bool only_cache, const std::vector& excluded_paths, const PlayedTimeMap& played_time_map, ProgressCallback* progress) { Console.WriteLn("Scanning %s%s", path, recursive ? " (recursively)" : ""); @@ -544,54 +560,59 @@ void GameList::ScanDirectory(const char* path, bool recursive, const std::vector (FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_HIDDEN_FILES), &files); + u32 files_scanned = 0; progress->SetProgressRange(static_cast(files.size())); progress->SetProgressValue(0); for (FILESYSTEM_FIND_DATA& ffd : files) { + files_scanned++; + if (progress->IsCancelled() || !GameList::IsScannableFilename(ffd.FileName) || IsPathExcluded(excluded_paths, ffd.FileName)) { continue; } + std::unique_lock lock(s_mutex); + if (GetEntryForPath(ffd.FileName.c_str()) || + AddFileFromCache(ffd.FileName, ffd.ModificationTime, played_time_map) || only_cache) { - std::unique_lock lock(s_mutex); - if (GetEntryForPath(ffd.FileName.c_str()) || AddFileFromCache(ffd.FileName, ffd.ModificationTime)) - { - progress->IncrementProgressValue(); - continue; - } + continue; } - // ownership of fp is transferred progress->SetFormattedStatusText("Scanning '%s'...", FileSystem::GetDisplayNameFromPath(ffd.FileName).c_str()); - ScanFile(std::move(ffd.FileName), ffd.ModificationTime); - progress->IncrementProgressValue(); + ScanFile(std::move(ffd.FileName), ffd.ModificationTime, lock, played_time_map); + progress->SetProgressValue(files_scanned); } - progress->SetProgressValue(static_cast(files.size())); + progress->SetProgressValue(files_scanned); progress->PopState(); } -bool GameList::AddFileFromCache(const std::string& path, std::time_t timestamp) +bool GameList::AddFileFromCache(const std::string& path, std::time_t timestamp, const PlayedTimeMap& played_time_map) { - if (std::any_of(m_entries.begin(), m_entries.end(), [&path](const Entry& other) { return other.path == path; })) - { - // already exists - return true; - } - Entry entry; if (!GetGameListEntryFromCache(path, &entry) || entry.last_modified_time != timestamp) return false; - m_entries.push_back(std::move(entry)); + auto iter = UnorderedStringMapFind(played_time_map, entry.serial); + if (iter != played_time_map.end()) + { + entry.last_played_time = iter->second.last_played_time; + entry.total_played_time = iter->second.total_played_time; + } + + s_entries.push_back(std::move(entry)); return true; } -bool GameList::ScanFile(std::string path, std::time_t timestamp) +bool GameList::ScanFile(std::string path, std::time_t timestamp, std::unique_lock& lock, + const PlayedTimeMap& played_time_map) { + // don't block UI while scanning + lock.unlock(); + DevCon.WriteLn("Scanning '%s'...", path.c_str()); Entry entry; @@ -601,14 +622,21 @@ bool GameList::ScanFile(std::string path, std::time_t timestamp) entry.path = std::move(path); entry.last_modified_time = timestamp; - if (m_cache_write_stream || OpenCacheForWriting()) + if (s_cache_write_stream || OpenCacheForWriting()) { if (!WriteEntryToCache(&entry)) Console.Warning("Failed to write entry '%s' to cache", entry.path.c_str()); } - std::unique_lock lock(s_mutex); - m_entries.push_back(std::move(entry)); + auto iter = UnorderedStringMapFind(played_time_map, entry.serial); + if (iter != played_time_map.end()) + { + entry.last_played_time = iter->second.last_played_time; + entry.total_played_time = iter->second.total_played_time; + } + + lock.lock(); + s_entries.push_back(std::move(entry)); return true; } @@ -619,13 +647,13 @@ std::unique_lock GameList::GetLock() const GameList::Entry* GameList::GetEntryByIndex(u32 index) { - return (index < m_entries.size()) ? &m_entries[index] : nullptr; + return (index < s_entries.size()) ? &s_entries[index] : nullptr; } const GameList::Entry* GameList::GetEntryForPath(const char* path) { const size_t path_length = std::strlen(path); - for (const Entry& entry : m_entries) + for (const Entry& entry : s_entries) { if (entry.path.size() == path_length && StringUtil::Strcasecmp(entry.path.c_str(), path) == 0) return &entry; @@ -636,7 +664,7 @@ const GameList::Entry* GameList::GetEntryForPath(const char* path) const GameList::Entry* GameList::GetEntryByCRC(u32 crc) { - for (const Entry& entry : m_entries) + for (const Entry& entry : s_entries) { if (entry.crc == crc) return &entry; @@ -647,7 +675,7 @@ const GameList::Entry* GameList::GetEntryByCRC(u32 crc) const GameList::Entry* GameList::GetEntryBySerialAndCRC(const std::string_view& serial, u32 crc) { - for (const Entry& entry : m_entries) + for (const Entry& entry : s_entries) { if (entry.crc == crc && StringUtil::compareNoCase(entry.serial, serial)) return &entry; @@ -659,7 +687,7 @@ const GameList::Entry* GameList::GetEntryBySerialAndCRC(const std::string_view& GameList::Entry* GameList::GetMutableEntryForPath(const char* path) { const size_t path_length = std::strlen(path); - for (Entry& entry : m_entries) + for (Entry& entry : s_entries) { if (entry.path.size() == path_length && StringUtil::Strcasecmp(entry.path.c_str(), path) == 0) return &entry; @@ -670,13 +698,11 @@ GameList::Entry* GameList::GetMutableEntryForPath(const char* path) u32 GameList::GetEntryCount() { - return static_cast(m_entries.size()); + return static_cast(s_entries.size()); } -void GameList::Refresh(bool invalidate_cache, ProgressCallback* progress /* = nullptr */) +void GameList::Refresh(bool invalidate_cache, bool only_cache, ProgressCallback* progress /* = nullptr */) { - m_game_list_loaded = true; - if (!progress) progress = ProgressCallback::NullProgressCallback; @@ -689,12 +715,13 @@ void GameList::Refresh(bool invalidate_cache, ProgressCallback* progress /* = nu std::vector old_entries; { std::unique_lock lock(s_mutex); - old_entries.swap(m_entries); + old_entries.swap(s_entries); } - const std::vector excluded_paths(Host::GetStringListSetting("GameList", "ExcludedPaths")); - const std::vector dirs(Host::GetStringListSetting("GameList", "Paths")); - const std::vector recursive_dirs(Host::GetStringListSetting("GameList", "RecursivePaths")); + const std::vector excluded_paths(Host::GetBaseStringListSetting("GameList", "ExcludedPaths")); + const std::vector dirs(Host::GetBaseStringListSetting("GameList", "Paths")); + const std::vector recursive_dirs(Host::GetBaseStringListSetting("GameList", "RecursivePaths")); + const PlayedTimeMap played_time(LoadPlayedTimeMap(GetPlayedTimeFile())); if (!dirs.empty() || !recursive_dirs.empty()) { @@ -708,7 +735,7 @@ void GameList::Refresh(bool invalidate_cache, ProgressCallback* progress /* = nu if (progress->IsCancelled()) break; - ScanDirectory(dir.c_str(), false, excluded_paths, progress); + ScanDirectory(dir.c_str(), false, only_cache, excluded_paths, played_time, progress); progress->SetProgressValue(++directory_counter); } for (const std::string& dir : recursive_dirs) @@ -716,14 +743,299 @@ void GameList::Refresh(bool invalidate_cache, ProgressCallback* progress /* = nu if (progress->IsCancelled()) break; - ScanDirectory(dir.c_str(), true, excluded_paths, progress); + ScanDirectory(dir.c_str(), true, only_cache, excluded_paths, played_time, progress); progress->SetProgressValue(++directory_counter); } } // don't need unused cache entries CloseCacheFileStream(); - m_cache_map.clear(); + s_cache_map.clear(); +} + +std::string GameList::GetPlayedTimeFile() +{ + return Path::Combine(EmuFolders::Settings, "playtime.dat"); +} + +bool GameList::ParsePlayedTimeLine(char* line, std::string& serial, PlayedTimeEntry& entry) +{ + size_t len = std::strlen(line); + if (len != (PLAYED_TIME_LINE_LENGTH + 1)) // \n + { + Console.Warning("(ParsePlayedTimeLine) Malformed line: '%s'", line); + return false; + } + + const std::string_view serial_tok(StringUtil::StripWhitespace(std::string_view(line, PLAYED_TIME_SERIAL_LENGTH))); + const std::string_view total_played_time_tok( + StringUtil::StripWhitespace(std::string_view(line + PLAYED_TIME_SERIAL_LENGTH + 1, PLAYED_TIME_LAST_TIME_LENGTH))); + const std::string_view last_played_time_tok(StringUtil::StripWhitespace(std::string_view( + line + PLAYED_TIME_SERIAL_LENGTH + 1 + PLAYED_TIME_LAST_TIME_LENGTH + 1, PLAYED_TIME_TOTAL_TIME_LENGTH))); + + const std::optional total_played_time(StringUtil::FromChars(total_played_time_tok)); + const std::optional last_played_time(StringUtil::FromChars(last_played_time_tok)); + if (serial_tok.empty() || !last_played_time.has_value() || !total_played_time.has_value()) + { + Console.Warning("(ParsePlayedTimeLine) Malformed line: '%s'", line); + return false; + } + + serial = serial_tok; + entry.last_played_time = static_cast(last_played_time.value()); + entry.total_played_time = static_cast(total_played_time.value()); + return true; +} + +std::string GameList::MakePlayedTimeLine(const std::string& serial, const PlayedTimeEntry& entry) +{ + return fmt::format("{:<{}} {:<{}} {:<{}}\n", serial, static_cast(PLAYED_TIME_SERIAL_LENGTH), + entry.total_played_time, static_cast(PLAYED_TIME_TOTAL_TIME_LENGTH), + entry.last_played_time, static_cast(PLAYED_TIME_LAST_TIME_LENGTH)); +} + +GameList::PlayedTimeMap GameList::LoadPlayedTimeMap(const std::string& path) +{ + PlayedTimeMap ret; + + // Use write mode here, even though we're not writing, so we can lock the file from other updates. + auto fp = FileSystem::OpenManagedCFile(path.c_str(), "r+b"); + +#ifdef _WIN32 + // On Windows, the file is implicitly locked. + while (!fp && GetLastError() == ERROR_SHARING_VIOLATION) + { + Sleep(10); + fp = FileSystem::OpenManagedCFile(path.c_str(), "r+b"); + } +#endif + + if (fp) + { +#ifndef _WIN32 + FileSystem::POSIXLock flock(fp.get()); +#endif + + char line[256]; + while (std::fgets(line, sizeof(line), fp.get())) + { + std::string serial; + PlayedTimeEntry entry; + if (!ParsePlayedTimeLine(line, serial, entry)) + continue; + + if (UnorderedStringMapFind(ret, serial) != ret.end()) + { + Console.Warning("(LoadPlayedTimeMap) Duplicate entry: '%s'", serial.c_str()); + continue; + } + + ret.emplace(std::move(serial), entry); + } + } + + return ret; +} + +GameList::PlayedTimeEntry GameList::UpdatePlayedTimeFile(const std::string& path, const std::string& serial, + std::time_t last_time, std::time_t add_time) +{ + const PlayedTimeEntry new_entry{ last_time, add_time }; + + auto fp = FileSystem::OpenManagedCFile(path.c_str(), "r+b"); + +#ifdef _WIN32 + // On Windows, the file is implicitly locked. + while (!fp && GetLastError() == ERROR_SHARING_VIOLATION) + { + Sleep(10); + fp = FileSystem::OpenManagedCFile(path.c_str(), "r+b"); + } +#endif + + // Doesn't exist? Create it. + if (!fp && errno == ENOENT) + fp = FileSystem::OpenManagedCFile(path.c_str(), "w+b"); + + if (!fp) + { + Console.Error("Failed to open '%s' for update.", path.c_str()); + return new_entry; + } + +#ifndef _WIN32 + FileSystem::POSIXLock flock(fp.get()); +#endif + + for (;;) + { + char line[256]; + const s64 line_pos = FileSystem::FTell64(fp.get()); + if (!std::fgets(line, sizeof(line), fp.get())) + break; + + std::string line_serial; + PlayedTimeEntry line_entry; + if (!ParsePlayedTimeLine(line, line_serial, line_entry)) + continue; + + if (line_serial != serial) + continue; + + // found it! + line_entry.last_played_time = (last_time != 0) ? last_time : 0; + line_entry.total_played_time = (last_time != 0) ? (line_entry.total_played_time + add_time) : 0; + + std::string new_line(MakePlayedTimeLine(serial, line_entry)); + if (FileSystem::FSeek64(fp.get(), line_pos, SEEK_SET) != 0 || + std::fwrite(new_line.data(), new_line.length(), 1, fp.get()) != 1 || + std::fflush(fp.get()) != 0) + { + Console.Error("Failed to update '%s'.", path.c_str()); + } + + return line_entry; + } + + if (last_time != 0) + { + // new entry. + std::string new_line(MakePlayedTimeLine(serial, new_entry)); + if (FileSystem::FSeek64(fp.get(), 0, SEEK_END) != 0 || + std::fwrite(new_line.data(), new_line.length(), 1, fp.get()) != 1) + { + Console.Error("Failed to write '%s'.", path.c_str()); + } + } + + return new_entry; +} + +void GameList::AddPlayedTimeForSerial(const std::string& serial, std::time_t last_time, std::time_t add_time) +{ + if (serial.empty()) + return; + + const PlayedTimeEntry pt(UpdatePlayedTimeFile(GetPlayedTimeFile(), serial, last_time, add_time)); + Console.WriteLn("Add %u seconds play time to %s -> now %u", static_cast(add_time), serial.c_str(), + static_cast(pt.total_played_time)); + + std::unique_lock lock(s_mutex); + for (GameList::Entry& entry : s_entries) + { + if (entry.serial != serial) + continue; + + entry.last_played_time = pt.last_played_time; + entry.total_played_time = pt.total_played_time; + } +} + +void GameList::ClearPlayedTimeForSerial(const std::string& serial) +{ + if (serial.empty()) + return; + + UpdatePlayedTimeFile(GetPlayedTimeFile(), serial, 0, 0); + + std::unique_lock lock(s_mutex); + for (GameList::Entry& entry : s_entries) + { + if (entry.serial != serial) + continue; + + entry.last_played_time = 0; + entry.total_played_time = 0; + } +} + + +std::time_t GameList::GetCachedPlayedTimeForSerial(const std::string& serial) +{ + if (serial.empty()) + return 0; + + std::unique_lock lock(s_mutex); + for (GameList::Entry& entry : s_entries) + { + if (entry.serial == serial) + return entry.total_played_time; + } + + return 0; +} + +std::string GameList::FormatTimestamp(std::time_t timestamp) +{ + // TODO: All these strings should be translateable. + std::string ret; + + if (timestamp == 0) + { + ret = "Never"; + } + else + { + struct tm ctime = {}; + struct tm ttime = {}; + const std::time_t ctimestamp = std::time(nullptr); +#ifdef _MSC_VER + localtime_s(&ctime, &ctimestamp); + localtime_s(&ttime, ×tamp); +#else + localtime_r(&ctimestamp, &ctime); + localtime_r(×tamp, &ttime); +#endif + + if (ctime.tm_year == ttime.tm_year && ctime.tm_yday == ttime.tm_yday) + { + ret = "Today"; + } + else if ((ctime.tm_year == ttime.tm_year && ctime.tm_yday == (ttime.tm_yday + 1)) || + (ctime.tm_yday == 0 && (ctime.tm_year - 1) == ttime.tm_year)) + { + ret = "Yesterday"; + } + else + { + char buf[128]; + std::strftime(buf, std::size(buf), "%x", &ttime); + ret.assign(buf); + } + } + + return ret; +} + +std::string GameList::FormatTimespan(std::time_t timespan, bool long_format) +{ + const u32 hours = static_cast(timespan / 3600); + const u32 minutes = static_cast((timespan % 3600) / 60); + const u32 seconds = static_cast((timespan % 3600) % 60); + + std::string ret; + if (!long_format) + { + if (hours >= 100) + ret = fmt::format("{}h {}m", hours, minutes); + else if (hours > 0) + ret = fmt::format("{}h {}m {}s", hours, minutes, seconds); + else if (minutes > 0) + ret = fmt::format("{}m {}s", minutes, seconds); + else if (seconds > 0) + ret = fmt::format("{}s", seconds); + else + ret = "None"; + } + else + { + if (hours > 0) + ret = fmt::format("{} hours", hours); + else + ret = fmt::format("{} minutes", minutes); + } + + return ret; } std::string GameList::GetCoverImagePathForEntry(const Entry* entry) @@ -765,7 +1077,8 @@ std::string GameList::GetCoverImagePath(const std::string& path, const std::stri // Last resort, check the game title if (!title.empty()) { - const std::string cover_filename(title + extension); + std::string cover_filename(title + extension); + Path::SanitizeFileName(&cover_filename); cover_path = Path::Combine(EmuFolders::Covers, cover_filename); if (FileSystem::FileExists(cover_path.c_str())) return cover_path; @@ -776,7 +1089,7 @@ std::string GameList::GetCoverImagePath(const std::string& path, const std::stri return cover_path; } -std::string GameList::GetNewCoverImagePathForEntry(const Entry* entry, const char* new_filename) +std::string GameList::GetNewCoverImagePathForEntry(const Entry* entry, const char* new_filename, bool use_serial) { const char* extension = std::strrchr(new_filename, '.'); if (!extension) @@ -790,6 +1103,132 @@ std::string GameList::GetNewCoverImagePathForEntry(const Entry* entry, const cha return existing_filename; } - const std::string cover_filename(entry->title + extension); + std::string cover_filename(use_serial ? (entry->serial + extension) : (entry->title + extension)); + Path::SanitizeFileName(&cover_filename); return Path::Combine(EmuFolders::Covers, cover_filename); } + +bool GameList::DownloadCovers(const std::vector& url_templates, bool use_serial, ProgressCallback* progress, + std::function save_callback) +{ + if (!progress) + progress = ProgressCallback::NullProgressCallback; + + bool has_title = false; + bool has_file_title = false; + bool has_serial = false; + for (const std::string& url_template : url_templates) + { + if (!has_title && url_template.find("${title}") != std::string::npos) + has_title = true; + if (!has_file_title && url_template.find("${filetitle}") != std::string::npos) + has_file_title = true; + if (!has_serial && url_template.find("${serial}") != std::string::npos) + has_serial = true; + } + if (!has_title && !has_file_title && !has_serial) + { + progress->DisplayError("URL template must contain at least one of ${title}, ${filetitle}, or ${serial}."); + return false; + } + + std::vector> download_urls; + { + std::unique_lock lock(s_mutex); + for (const GameList::Entry& entry : s_entries) + { + const std::string existing_path(GetCoverImagePathForEntry(&entry)); + if (!existing_path.empty()) + continue; + + for (const std::string& url_template : url_templates) + { + std::string url(url_template); + if (has_title) + StringUtil::ReplaceAll(&url, "${title}", Common::HTTPDownloader::URLEncode(entry.title)); + if (has_file_title) + { + std::string display_name(FileSystem::GetDisplayNameFromPath(entry.path)); + StringUtil::ReplaceAll(&url, "${filetitle}", Common::HTTPDownloader::URLEncode(Path::GetFileTitle(display_name))); + } + if (has_serial) + StringUtil::ReplaceAll(&url, "${serial}", Common::HTTPDownloader::URLEncode(entry.serial)); + + download_urls.emplace_back(entry.path, std::move(url)); + } + } + } + if (download_urls.empty()) + { + progress->DisplayError("No URLs to download enumerated."); + return false; + } + + std::unique_ptr downloader(Common::HTTPDownloader::Create()); + if (!downloader) + { + progress->DisplayError("Failed to create HTTP downloader."); + return false; + } + + progress->SetCancellable(true); + progress->SetProgressRange(static_cast(download_urls.size())); + + for (auto& [entry_path, url] : download_urls) + { + if (progress->IsCancelled()) + break; + + // make sure it didn't get done already + { + std::unique_lock lock(s_mutex); + const GameList::Entry* entry = GetEntryForPath(entry_path.c_str()); + if (!entry || !GetCoverImagePathForEntry(entry).empty()) + { + progress->IncrementProgressValue(); + continue; + } + + progress->SetFormattedStatusText("Downloading cover for %s [%s]...", entry->title.c_str(), entry->serial.c_str()); + } + + // we could actually do a few in parallel here... + std::string filename(Common::HTTPDownloader::URLDecode(url)); + downloader->CreateRequest(std::move(url), [use_serial, &save_callback, entry_path = std::move(entry_path), + filename = std::move(filename)](s32 status_code, const std::string& content_type, Common::HTTPDownloader::Request::Data data) { + if (status_code != Common::HTTPDownloader::HTTP_OK || data.empty()) + return; + + std::unique_lock lock(s_mutex); + const GameList::Entry* entry = GetEntryForPath(entry_path.c_str()); + if (!entry || !GetCoverImagePathForEntry(entry).empty()) + return; + + // prefer the content type from the response for the extension + // otherwise, if it's missing, and the request didn't have an extension.. fall back to jpegs. + std::string template_filename; + std::string content_type_extension(Common::HTTPDownloader::GetExtensionForContentType(content_type)); + + // don't treat the domain name as an extension.. + const std::string::size_type last_slash = filename.find('/'); + const std::string::size_type last_dot = filename.find('.'); + if (!content_type_extension.empty()) + template_filename = fmt::format("cover.{}", content_type_extension); + else if (last_slash != std::string::npos && last_dot != std::string::npos && last_dot > last_slash) + template_filename = Path::GetFileName(filename); + else + template_filename = "cover.jpg"; + + std::string write_path(GetNewCoverImagePathForEntry(entry, template_filename.c_str(), use_serial)); + if (write_path.empty()) + return; + + if (FileSystem::WriteBinaryFile(write_path.c_str(), data.data(), data.size()) && save_callback) + save_callback(entry, std::move(write_path)); + }); + downloader->WaitForAllRequests(); + progress->IncrementProgressValue(); + } + + return true; +} diff --git a/pcsx2/Frontend/GameList.h b/pcsx2/Frontend/GameList.h index 3eb2cdd40a..09e1b6dd99 100644 --- a/pcsx2/Frontend/GameList.h +++ b/pcsx2/Frontend/GameList.h @@ -17,6 +17,7 @@ #include "GameDatabase.h" #include "common/Pcsx2Defs.h" #include +#include #include #include #include @@ -36,7 +37,6 @@ namespace GameList PS2Disc, PS1Disc, ELF, - Playlist, Count }; @@ -87,6 +87,8 @@ namespace GameList std::string title; u64 total_size = 0; std::time_t last_modified_time = 0; + std::time_t last_played_time = 0; + std::time_t total_played_time = 0; u32 crc = 0; @@ -96,11 +98,10 @@ namespace GameList }; const char* EntryTypeToString(EntryType type); + const char* EntryTypeToDisplayString(EntryType type); const char* RegionToString(Region region); const char* EntryCompatibilityRatingToString(CompatibilityRating rating); - bool IsScannableFilename(const std::string_view& path); - /// Fills in boot parameters (iso or elf) based on the game list entry. void FillBootParametersForEntry(VMBootParameters* params, const Entry* entry); @@ -116,10 +117,30 @@ namespace GameList const Entry* GetEntryBySerialAndCRC(const std::string_view& serial, u32 crc); u32 GetEntryCount(); - bool IsGameListLoaded(); - void Refresh(bool invalidate_cache, ProgressCallback* progress = nullptr); + /// Populates the game list with files in the configured directories. + /// If invalidate_cache is set, all files will be re-scanned. + /// If only_cache is set, no new files will be scanned, only those present in the cache. + void Refresh(bool invalidate_cache, bool only_cache = false, ProgressCallback* progress = nullptr); + + /// Add played time for the specified serial. + void AddPlayedTimeForSerial(const std::string& serial, std::time_t last_time, std::time_t add_time); + void ClearPlayedTimeForSerial(const std::string& serial); + + /// Returns the total time played for a game. Requires the game to be scanned in the list. + std::time_t GetCachedPlayedTimeForSerial(const std::string& serial); + + /// Formats a timestamp to something human readable (e.g. Today, Yesterday, 10/11/12). + std::string FormatTimestamp(std::time_t timestamp); + + /// Formats a timespan to something human readable (e.g. 1h2m3s or 1 hour). + std::string FormatTimespan(std::time_t timespan, bool long_format = false); std::string GetCoverImagePathForEntry(const Entry* entry); std::string GetCoverImagePath(const std::string& path, const std::string& code, const std::string& title); - std::string GetNewCoverImagePathForEntry(const Entry* entry, const char* new_filename); + std::string GetNewCoverImagePathForEntry(const Entry* entry, const char* new_filename, bool use_serial = false); + + /// Downloads covers using the specified URL templates. By default, covers are saved by title, but this can be changed with + /// the use_serial parameter. save_callback optionall takes the entry and the path the new cover is saved to. + bool DownloadCovers(const std::vector& url_templates, bool use_serial = false, ProgressCallback* progress = nullptr, + std::function save_callback = {}); } // namespace GameList diff --git a/pcsx2/HostSettings.cpp b/pcsx2/Frontend/HostSettings.cpp similarity index 92% rename from pcsx2/HostSettings.cpp rename to pcsx2/Frontend/HostSettings.cpp index 7844864e61..c99fce06cf 100644 --- a/pcsx2/HostSettings.cpp +++ b/pcsx2/Frontend/HostSettings.cpp @@ -15,6 +15,9 @@ #include "PrecompiledHeader.h" #include "common/Assertions.h" +#include "common/CrashHandler.h" +#include "common/FileSystem.h" +#include "common/Path.h" #include "Frontend/LayeredSettingsInterface.h" #include "GS.h" #include "GS/Renderers/HW/GSTextureReplacements.h" @@ -121,18 +124,24 @@ void Host::SetBaseStringListSettingValue(const char* section, const char* key, c s_layered_settings_interface.GetLayer(LayeredSettingsInterface::LAYER_BASE)->SetStringList(section, key, values); } -void Host::DeleteBaseSettingValue(const char* section, const char* key) +bool Host::AddBaseValueToStringList(const char* section, const char* key, const char* value) +{ + std::unique_lock lock(s_settings_mutex); + return s_layered_settings_interface.GetLayer(LayeredSettingsInterface::LAYER_BASE)->AddToStringList(section, key, value); +} + +bool Host::RemoveBaseValueFromStringList(const char* section, const char* key, const char* value) +{ + std::unique_lock lock(s_settings_mutex); + return s_layered_settings_interface.GetLayer(LayeredSettingsInterface::LAYER_BASE)->RemoveFromStringList(section, key, value); +} + +void Host::RemoveBaseSettingValue(const char* section, const char* key) { std::unique_lock lock(s_settings_mutex); s_layered_settings_interface.GetLayer(LayeredSettingsInterface::LAYER_BASE)->DeleteValue(section, key); } -void Host::CommitBaseSettingChanges() -{ - std::unique_lock lock(s_settings_mutex); - s_layered_settings_interface.GetLayer(LayeredSettingsInterface::LAYER_BASE)->Save(); -} - std::string Host::GetStringSettingValue(const char* section, const char* key, const char* default_value /*= ""*/) { std::unique_lock lock(s_settings_mutex); @@ -221,8 +230,7 @@ void Host::Internal::UpdateEmuFolders() if (VMManager::HasValidVM()) { - if (EmuFolders::Cheats != old_cheats_directory || - EmuFolders::CheatsWS != old_cheats_ws_directory || + if (EmuFolders::Cheats != old_cheats_directory || EmuFolders::CheatsWS != old_cheats_ws_directory || EmuFolders::CheatsNI != old_cheats_ni_directory) { VMManager::ReloadPatches(true, true); @@ -232,12 +240,7 @@ void Host::Internal::UpdateEmuFolders() { FileMcd_EmuClose(); FileMcd_EmuOpen(); - - for (u32 port = 0; port < 2; port++) - { - for (u32 slot = 0; slot < 4; slot++) - SetForceMcdEjectTimeoutNow(port, slot); - } + AutoEject::SetAll(); } if (EmuFolders::Textures != old_textures_directory) diff --git a/pcsx2/Frontend/ImGuiFullscreen.cpp b/pcsx2/Frontend/ImGuiFullscreen.cpp new file mode 100644 index 0000000000..ab783ab91a --- /dev/null +++ b/pcsx2/Frontend/ImGuiFullscreen.cpp @@ -0,0 +1,2510 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#define IMGUI_DEFINE_MATH_OPERATORS + +#include "ImGuiFullscreen.h" +#include "IconsFontAwesome5.h" +#include "common/Assertions.h" +#include "common/Easing.h" +#include "common/Image.h" +#include "common/LRUCache.h" +#include "common/FileSystem.h" +#include "common/Path.h" +#include "common/StringUtil.h" +#include "common/Threading.h" +#include "common/Timer.h" +#include "fmt/core.h" +#include "HostDisplay.h" +#include "imgui_internal.h" +#include "imgui_stdlib.h" +#include +#include +#include +#include +#include + +namespace ImGuiFullscreen +{ + using MessageDialogCallbackVariant = std::variant; + + static std::optional LoadTextureImage(const char* path); + static std::shared_ptr UploadTexture(const char* path, const Common::RGBA8Image& image); + static void TextureLoaderThread(); + + static void DrawFileSelector(); + static void DrawChoiceDialog(); + static void DrawInputDialog(); + static void DrawMessageDialog(); + static void DrawBackgroundProgressDialogs(ImVec2& position, float spacing); + static void DrawNotifications(ImVec2& position, float spacing); + static void DrawToast(); + static void GetMenuButtonFrameBounds(float height, ImVec2* pos, ImVec2* size); + static bool MenuButtonFrame(const char* str_id, bool enabled, float height, bool* visible, bool* hovered, ImRect* bb, + ImGuiButtonFlags flags = 0, float hover_alpha = 1.0f); + static void PopulateFileSelectorItems(); + static void SetFileSelectorDirectory(std::string dir); + static ImGuiID GetBackgroundProgressID(const char* str_id); + + ImFont* g_standard_font = nullptr; + ImFont* g_medium_font = nullptr; + ImFont* g_large_font = nullptr; + ImFont* g_icon_font = nullptr; + + float g_layout_scale = 1.0f; + float g_layout_padding_left = 0.0f; + float g_layout_padding_top = 0.0f; + + ImVec4 UIBackgroundColor; + ImVec4 UIBackgroundTextColor; + ImVec4 UIBackgroundLineColor; + ImVec4 UIBackgroundHighlightColor; + ImVec4 UIDisabledColor; + ImVec4 UIPrimaryColor; + ImVec4 UIPrimaryLightColor; + ImVec4 UIPrimaryDarkColor; + ImVec4 UIPrimaryTextColor; + ImVec4 UITextHighlightColor; + ImVec4 UIPrimaryLineColor; + ImVec4 UISecondaryColor; + ImVec4 UISecondaryLightColor; + ImVec4 UISecondaryDarkColor; + ImVec4 UISecondaryTextColor; + + static u32 s_menu_button_index = 0; + static u32 s_close_button_state = 0; + static bool s_focus_reset_queued = false; + + static LRUCache> s_texture_cache(128, true); + static std::shared_ptr s_placeholder_texture; + static std::atomic_bool s_texture_load_thread_quit{false}; + static std::mutex s_texture_load_mutex; + static std::condition_variable s_texture_load_cv; + static std::deque s_texture_load_queue; + static std::deque> s_texture_upload_queue; + static Threading::Thread s_texture_load_thread; + + static bool s_choice_dialog_open = false; + static bool s_choice_dialog_checkable = false; + static std::string s_choice_dialog_title; + static ChoiceDialogOptions s_choice_dialog_options; + static ChoiceDialogCallback s_choice_dialog_callback; + static ImGuiID s_enum_choice_button_id = 0; + static s32 s_enum_choice_button_value = 0; + static bool s_enum_choice_button_set = false; + + static bool s_input_dialog_open = false; + static std::string s_input_dialog_title; + static std::string s_input_dialog_message; + static std::string s_input_dialog_caption; + static std::string s_input_dialog_text; + static std::string s_input_dialog_ok_text; + static InputStringDialogCallback s_input_dialog_callback; + + static bool s_message_dialog_open = false; + static std::string s_message_dialog_title; + static std::string s_message_dialog_message; + static std::array s_message_dialog_buttons; + static MessageDialogCallbackVariant s_message_dialog_callback; + + struct FileSelectorItem + { + FileSelectorItem() = default; + FileSelectorItem(std::string display_name_, std::string full_path_, bool is_file_) + : display_name(std::move(display_name_)) + , full_path(std::move(full_path_)) + , is_file(is_file_) + { + } + FileSelectorItem(const FileSelectorItem&) = default; + FileSelectorItem(FileSelectorItem&&) = default; + ~FileSelectorItem() = default; + + FileSelectorItem& operator=(const FileSelectorItem&) = default; + FileSelectorItem& operator=(FileSelectorItem&&) = default; + + std::string display_name; + std::string full_path; + bool is_file; + }; + + static bool s_file_selector_open = false; + static bool s_file_selector_directory = false; + static std::string s_file_selector_title; + static ImGuiFullscreen::FileSelectorCallback s_file_selector_callback; + static std::string s_file_selector_current_directory; + static std::vector s_file_selector_filters; + static std::vector s_file_selector_items; + + struct Notification + { + std::string title; + std::string text; + std::string badge_path; + Common::Timer::Value start_time; + float duration; + }; + + static std::vector s_notifications; + + static std::string s_toast_title; + static std::string s_toast_message; + static Common::Timer::Value s_toast_start_time; + static float s_toast_duration; + + struct BackgroundProgressDialogData + { + std::string message; + ImGuiID id; + s32 min; + s32 max; + s32 value; + }; + + static std::vector s_background_progress_dialogs; + static std::mutex s_background_progress_lock; +} // namespace ImGuiFullscreen + +void ImGuiFullscreen::SetFonts(ImFont* standard_font, ImFont* medium_font, ImFont* large_font) +{ + g_standard_font = standard_font; + g_medium_font = medium_font; + g_large_font = large_font; +} + +bool ImGuiFullscreen::Initialize(const char* placeholder_image_path) +{ + s_focus_reset_queued = true; + s_close_button_state = 0; + + s_placeholder_texture = LoadTexture(placeholder_image_path); + if (!s_placeholder_texture) + { + Console.Error("Missing placeholder texture '%s', cannot continue", placeholder_image_path); + return false; + } + + s_texture_load_thread_quit.store(false, std::memory_order_release); + s_texture_load_thread.Start(TextureLoaderThread); + return true; +} + +void ImGuiFullscreen::Shutdown(bool clear_state) +{ + if (s_texture_load_thread.Joinable()) + { + { + std::unique_lock lock(s_texture_load_mutex); + s_texture_load_thread_quit.store(true, std::memory_order_release); + s_texture_load_cv.notify_one(); + } + s_texture_load_thread.Join(); + } + + s_texture_upload_queue.clear(); + s_placeholder_texture.reset(); + g_standard_font = nullptr; + g_medium_font = nullptr; + g_large_font = nullptr; + + s_texture_cache.Clear(); + + if (clear_state) + { + s_notifications.clear(); + s_background_progress_dialogs.clear(); + CloseInputDialog(); + CloseMessageDialog(); + s_choice_dialog_open = false; + s_choice_dialog_checkable = false; + s_choice_dialog_title = {}; + s_choice_dialog_options.clear(); + s_choice_dialog_callback = {}; + s_enum_choice_button_id = 0; + s_enum_choice_button_value = 0; + s_enum_choice_button_set = false; + s_file_selector_open = false; + s_file_selector_directory = false; + s_file_selector_title = {}; + s_file_selector_callback = {}; + s_file_selector_current_directory = {}; + s_file_selector_filters.clear(); + s_file_selector_items.clear(); + } +} + +const std::shared_ptr& ImGuiFullscreen::GetPlaceholderTexture() +{ + return s_placeholder_texture; +} + +std::optional ImGuiFullscreen::LoadTextureImage(const char* path) +{ + std::optional image; + + std::optional> data; + if (Path::IsAbsolute(path)) + data = FileSystem::ReadBinaryFile(path); + else + data = Host::ReadResourceFile(path); + if (data.has_value()) + { + image = Common::RGBA8Image(); + if (!image->LoadFromBuffer(path, data->data(), data->size())) + { + Console.Error("Failed to read texture resource '%s'", path); + image.reset(); + } + } + else + { + Console.Error("Failed to open texture resource '%s'", path); + } + + return image; +} + +std::shared_ptr ImGuiFullscreen::UploadTexture(const char* path, const Common::RGBA8Image& image) +{ + std::unique_ptr texture = + g_host_display->CreateTexture(image.GetWidth(), image.GetHeight(), image.GetPixels(), image.GetByteStride()); + if (!texture) + { + Console.Error("failed to create %ux%u texture for resource", image.GetWidth(), image.GetHeight()); + return {}; + } + + DevCon.WriteLn("Uploaded texture resource '%s' (%ux%u)", path, image.GetWidth(), image.GetHeight()); + return std::shared_ptr(std::move(texture)); +} + +std::shared_ptr ImGuiFullscreen::LoadTexture(const char* path) +{ + std::optional image(LoadTextureImage(path)); + if (image.has_value()) + { + std::shared_ptr ret(UploadTexture(path, image.value())); + if (ret) + return ret; + } + + return s_placeholder_texture; +} + +HostDisplayTexture* ImGuiFullscreen::GetCachedTexture(const char* name) +{ + std::shared_ptr* tex_ptr = s_texture_cache.Lookup(name); + if (!tex_ptr) + { + std::shared_ptr tex(LoadTexture(name)); + tex_ptr = s_texture_cache.Insert(name, std::move(tex)); + } + + return tex_ptr->get(); +} + +HostDisplayTexture* ImGuiFullscreen::GetCachedTextureAsync(const char* name) +{ + std::shared_ptr* tex_ptr = s_texture_cache.Lookup(name); + if (!tex_ptr) + { + // insert the placeholder + tex_ptr = s_texture_cache.Insert(name, s_placeholder_texture); + + // queue the actual load + std::unique_lock lock(s_texture_load_mutex); + s_texture_load_queue.emplace_back(name); + s_texture_load_cv.notify_one(); + } + + return tex_ptr->get(); +} + +bool ImGuiFullscreen::InvalidateCachedTexture(const std::string& path) +{ + return s_texture_cache.Remove(path); +} + +void ImGuiFullscreen::UploadAsyncTextures() +{ + std::unique_lock lock(s_texture_load_mutex); + while (!s_texture_upload_queue.empty()) + { + std::pair it(std::move(s_texture_upload_queue.front())); + s_texture_upload_queue.pop_front(); + lock.unlock(); + + std::shared_ptr tex = UploadTexture(it.first.c_str(), it.second); + if (tex) + s_texture_cache.Insert(std::move(it.first), std::move(tex)); + + lock.lock(); + } +} + +void ImGuiFullscreen::TextureLoaderThread() +{ + Threading::SetNameOfCurrentThread("ImGuiFullscreen Texture Loader"); + + std::unique_lock lock(s_texture_load_mutex); + + for (;;) + { + s_texture_load_cv.wait( + lock, []() { return (s_texture_load_thread_quit.load(std::memory_order_acquire) || !s_texture_load_queue.empty()); }); + + if (s_texture_load_thread_quit.load(std::memory_order_acquire)) + break; + + while (!s_texture_load_queue.empty()) + { + std::string path(std::move(s_texture_load_queue.front())); + s_texture_load_queue.pop_front(); + + lock.unlock(); + std::optional image(LoadTextureImage(path.c_str())); + lock.lock(); + + // don't bother queuing back if it doesn't exist + if (image) + s_texture_upload_queue.emplace_back(std::move(path), std::move(image.value())); + } + } + + s_texture_load_queue.clear(); +} + +bool ImGuiFullscreen::UpdateLayoutScale() +{ + static constexpr float LAYOUT_RATIO = LAYOUT_SCREEN_WIDTH / LAYOUT_SCREEN_HEIGHT; + const ImGuiIO& io = ImGui::GetIO(); + + const float screen_width = io.DisplaySize.x; + const float screen_height = io.DisplaySize.y; + const float screen_ratio = screen_width / screen_height; + const float old_scale = g_layout_scale; + + if (screen_ratio > LAYOUT_RATIO) + { + // screen is wider, use height, pad width + g_layout_scale = screen_height / LAYOUT_SCREEN_HEIGHT; + g_layout_padding_top = 0.0f; + g_layout_padding_left = (screen_width - (LAYOUT_SCREEN_WIDTH * g_layout_scale)) / 2.0f; + } + else + { + // screen is taller, use width, pad height + g_layout_scale = screen_width / LAYOUT_SCREEN_WIDTH; + g_layout_padding_top = (screen_height - (LAYOUT_SCREEN_HEIGHT * g_layout_scale)) / 2.0f; + g_layout_padding_left = 0.0f; + } + + return g_layout_scale != old_scale; +} + +ImRect ImGuiFullscreen::CenterImage(const ImVec2& fit_size, const ImVec2& image_size) +{ + const float fit_ar = fit_size.x / fit_size.y; + const float image_ar = image_size.x / image_size.y; + + ImRect ret; + if (fit_ar > image_ar) + { + // center horizontally + const float width = fit_size.y * image_ar; + const float offset = (fit_size.x - width) / 2.0f; + const float height = fit_size.y; + ret = ImRect(ImVec2(offset, 0.0f), ImVec2(offset + width, height)); + } + else + { + // center vertically + const float height = fit_size.x / image_ar; + const float offset = (fit_size.y - height) / 2.0f; + const float width = fit_size.x; + ret = ImRect(ImVec2(0.0f, offset), ImVec2(width, offset + height)); + } + + return ret; +} + +ImRect ImGuiFullscreen::CenterImage(const ImRect& fit_rect, const ImVec2& image_size) +{ + ImRect ret(CenterImage(fit_rect.Max - fit_rect.Min, image_size)); + ret.Translate(fit_rect.Min); + return ret; +} + +void ImGuiFullscreen::BeginLayout() +{ + // we evict from the texture cache at the start of the frame, in case we go over mid-frame, + // we need to keep all those textures alive until the end of the frame + s_texture_cache.ManualEvict(); + + PushResetLayout(); +} + +void ImGuiFullscreen::EndLayout() +{ + DrawFileSelector(); + DrawChoiceDialog(); + DrawInputDialog(); + DrawMessageDialog(); + + const float notification_margin = LayoutScale(10.0f); + const float spacing = LayoutScale(10.0f); + const float notification_vertical_pos = GetNotificationVerticalPosition(); + ImVec2 position(notification_margin, notification_vertical_pos * ImGui::GetIO().DisplaySize.y + + ((notification_vertical_pos >= 0.5f) ? -notification_margin : notification_margin)); + DrawBackgroundProgressDialogs(position, spacing); + DrawNotifications(position, spacing); + DrawToast(); + + PopResetLayout(); +} + +void ImGuiFullscreen::PushResetLayout() +{ + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(8.0f, 8.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, LayoutScale(4.0f, 3.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, LayoutScale(8.0f, 4.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemInnerSpacing, LayoutScale(4.0f, 4.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, LayoutScale(4.0f, 2.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, LayoutScale(21.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_ScrollbarSize, LayoutScale(14.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_ScrollbarRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_TabRounding, LayoutScale(4.0f)); + + ImGui::PushStyleColor(ImGuiCol_Text, UISecondaryTextColor); + ImGui::PushStyleColor(ImGuiCol_TextDisabled, UIDisabledColor); + ImGui::PushStyleColor(ImGuiCol_Button, UISecondaryColor); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, UIBackgroundColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, UIBackgroundHighlightColor); + ImGui::PushStyleColor(ImGuiCol_Border, UIBackgroundLineColor); + ImGui::PushStyleColor(ImGuiCol_ScrollbarBg, UIBackgroundColor); + ImGui::PushStyleColor(ImGuiCol_ScrollbarGrab, UIPrimaryColor); + ImGui::PushStyleColor(ImGuiCol_ScrollbarGrabHovered, UIPrimaryLightColor); + ImGui::PushStyleColor(ImGuiCol_ScrollbarGrabActive, UIPrimaryDarkColor); +} + +void ImGuiFullscreen::PopResetLayout() +{ + ImGui::PopStyleColor(10); + ImGui::PopStyleVar(12); +} + +void ImGuiFullscreen::QueueResetFocus() +{ + s_focus_reset_queued = true; + s_close_button_state = 0; +} + +bool ImGuiFullscreen::ResetFocusHere() +{ + if (!s_focus_reset_queued) + return false; + + s_focus_reset_queued = false; + ImGui::SetWindowFocus(); + + // only do the active selection magic when we're using keyboard/gamepad + return (GImGui->NavInputSource == ImGuiInputSource_Keyboard || GImGui->NavInputSource == ImGuiInputSource_Gamepad); +} + +bool ImGuiFullscreen::WantsToCloseMenu() +{ + // Wait for the Close button to be released, THEN pressed + if (s_close_button_state == 0) + { + if (ImGui::IsNavInputTest(ImGuiNavInput_Cancel, ImGuiNavReadMode_Pressed)) + s_close_button_state = 1; + } + else if (s_close_button_state == 1) + { + if (ImGui::IsNavInputTest(ImGuiNavInput_Cancel, ImGuiNavReadMode_Released)) + { + s_close_button_state = 2; + } + } + return s_close_button_state > 1; +} + +void ImGuiFullscreen::ResetCloseMenuIfNeeded() +{ + // If s_close_button_state reached the "Released" state, reset it after the tick + if (s_close_button_state > 1) + { + s_close_button_state = 0; + } +} + +void ImGuiFullscreen::PushPrimaryColor() +{ + ImGui::PushStyleColor(ImGuiCol_Text, UIPrimaryTextColor); + ImGui::PushStyleColor(ImGuiCol_Button, UIPrimaryDarkColor); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, UIPrimaryColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, UIPrimaryLightColor); + ImGui::PushStyleColor(ImGuiCol_Border, UIPrimaryLightColor); +} + +void ImGuiFullscreen::PopPrimaryColor() +{ + ImGui::PopStyleColor(5); +} + +void ImGuiFullscreen::PushSecondaryColor() +{ + ImGui::PushStyleColor(ImGuiCol_Text, UISecondaryTextColor); + ImGui::PushStyleColor(ImGuiCol_Button, UISecondaryDarkColor); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, UISecondaryColor); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, UISecondaryLightColor); + ImGui::PushStyleColor(ImGuiCol_Border, UISecondaryLightColor); +} + +void ImGuiFullscreen::PopSecondaryColor() +{ + ImGui::PopStyleColor(5); +} + +bool ImGuiFullscreen::BeginFullscreenColumns(const char* title, float pos_y, bool expand_to_screen_width) +{ + ImGui::SetNextWindowPos(ImVec2(expand_to_screen_width ? 0.0f : g_layout_padding_left, pos_y)); + ImGui::SetNextWindowSize(ImVec2( + expand_to_screen_width ? ImGui::GetIO().DisplaySize.x : LayoutScale(LAYOUT_SCREEN_WIDTH), ImGui::GetIO().DisplaySize.y - pos_y)); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + + bool clipped; + if (title) + { + ImGui::PushFont(g_large_font); + clipped = ImGui::Begin(title, nullptr, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize); + ImGui::PopFont(); + } + else + { + clipped = ImGui::Begin( + "fullscreen_ui_columns_parent", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize); + } + + return clipped; +} + +void ImGuiFullscreen::EndFullscreenColumns() +{ + ImGui::End(); + ImGui::PopStyleVar(3); +} + +bool ImGuiFullscreen::BeginFullscreenColumnWindow(float start, float end, const char* name, const ImVec4& background) +{ + start = LayoutScale(start); + end = LayoutScale(end); + + if (start < 0.0f) + start = ImGui::GetIO().DisplaySize.x + start; + if (end <= 0.0f) + end = ImGui::GetIO().DisplaySize.x + end; + + const ImVec2 pos(start, 0.0f); + const ImVec2 size(end - start, ImGui::GetCurrentWindow()->Size.y); + + ImGui::PushStyleColor(ImGuiCol_ChildBg, background); + + ImGui::SetCursorPos(pos); + + return ImGui::BeginChild(name, size, false, ImGuiWindowFlags_NavFlattened); +} + +void ImGuiFullscreen::EndFullscreenColumnWindow() +{ + ImGui::EndChild(); + ImGui::PopStyleColor(); +} + +bool ImGuiFullscreen::BeginFullscreenWindow(float left, float top, float width, float height, const char* name, + const ImVec4& background /* = HEX_TO_IMVEC4(0x212121, 0xFF) */, float rounding /*= 0.0f*/, float padding /*= 0.0f*/, + ImGuiWindowFlags flags /*= 0*/) +{ + if (left < 0.0f) + left = (LAYOUT_SCREEN_WIDTH - width) * -left; + if (top < 0.0f) + top = (LAYOUT_SCREEN_HEIGHT - height) * -top; + + const ImVec2 pos(ImVec2(LayoutScale(left) + g_layout_padding_left, LayoutScale(top) + g_layout_padding_top)); + const ImVec2 size(LayoutScale(ImVec2(width, height))); + return BeginFullscreenWindow(pos, size, name, background, rounding, padding, flags); +} + +bool ImGuiFullscreen::BeginFullscreenWindow(const ImVec2& position, const ImVec2& size, const char* name, + const ImVec4& background /* = HEX_TO_IMVEC4(0x212121, 0xFF) */, float rounding /*= 0.0f*/, float padding /*= 0.0f*/, + ImGuiWindowFlags flags /*= 0*/) +{ + ImGui::SetNextWindowPos(position); + ImGui::SetNextWindowSize(size); + + ImGui::PushStyleColor(ImGuiCol_WindowBg, background); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(padding, padding)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(rounding)); + + return ImGui::Begin(name, nullptr, + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBringToFrontOnFocus | + flags); +} + +void ImGuiFullscreen::EndFullscreenWindow() +{ + ImGui::End(); + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(); +} + +void ImGuiFullscreen::BeginMenuButtons(u32 num_items, float y_align, float x_padding, float y_padding, float item_height) +{ + s_menu_button_index = 0; + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, LayoutScale(x_padding, y_padding)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, LayoutScale(1.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f)); + + if (y_align != 0.0f) + { + const float total_size = + static_cast(num_items) * LayoutScale(item_height + (y_padding * 2.0f)) + LayoutScale(y_padding * 2.0f); + const float window_height = ImGui::GetWindowHeight(); + if (window_height > total_size) + ImGui::SetCursorPosY((window_height - total_size) * y_align); + } +} + +void ImGuiFullscreen::EndMenuButtons() +{ + ImGui::PopStyleVar(4); +} + +void ImGuiFullscreen::DrawWindowTitle(const char* title) +{ + ImGuiWindow* window = ImGui::GetCurrentWindow(); + const ImVec2 pos(window->DC.CursorPos + LayoutScale(LAYOUT_MENU_BUTTON_X_PADDING, LAYOUT_MENU_BUTTON_Y_PADDING)); + const ImVec2 size(window->WorkRect.GetWidth() - (LayoutScale(LAYOUT_MENU_BUTTON_X_PADDING) * 2.0f), + g_large_font->FontSize + LayoutScale(LAYOUT_MENU_BUTTON_Y_PADDING) * 2.0f); + const ImRect rect(pos, pos + size); + + ImGui::ItemSize(size); + if (!ImGui::ItemAdd(rect, window->GetID("window_title"))) + return; + + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped(rect.Min, rect.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &rect); + ImGui::PopFont(); + + const ImVec2 line_start(pos.x, pos.y + g_large_font->FontSize + LayoutScale(LAYOUT_MENU_BUTTON_Y_PADDING)); + const ImVec2 line_end(pos.x + size.x, line_start.y); + const float line_thickness = LayoutScale(1.0f); + ImDrawList* dl = ImGui::GetWindowDrawList(); + dl->AddLine(line_start, line_end, IM_COL32(255, 255, 255, 255), line_thickness); +} + +void ImGuiFullscreen::GetMenuButtonFrameBounds(float height, ImVec2* pos, ImVec2* size) +{ + ImGuiWindow* window = ImGui::GetCurrentWindow(); + *pos = window->DC.CursorPos; + *size = ImVec2(window->WorkRect.GetWidth(), LayoutScale(height) + ImGui::GetStyle().FramePadding.y * 2.0f); +} + +bool ImGuiFullscreen::MenuButtonFrame( + const char* str_id, bool enabled, float height, bool* visible, bool* hovered, ImRect* bb, ImGuiButtonFlags flags, float hover_alpha) +{ + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + { + *visible = false; + *hovered = false; + return false; + } + + ImVec2 pos, size; + GetMenuButtonFrameBounds(height, &pos, &size); + *bb = ImRect(pos, pos + size); + + const ImGuiID id = window->GetID(str_id); + ImGui::ItemSize(size); + if (enabled) + { + if (!ImGui::ItemAdd(*bb, id)) + { + *visible = false; + *hovered = false; + return false; + } + } + else + { + if (ImGui::IsClippedEx(*bb, id)) + { + *visible = false; + *hovered = false; + return false; + } + } + + *visible = true; + + bool held; + bool pressed; + if (enabled) + { + pressed = ImGui::ButtonBehavior(*bb, id, hovered, &held, flags); + if (*hovered) + { + const ImU32 col = ImGui::GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered, hover_alpha); + + const float t = std::min(std::abs(std::sin(ImGui::GetTime() * 0.75) * 1.1), 1.0f); + ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetColorU32(ImGuiCol_Border, t)); + + ImGui::RenderFrame(bb->Min, bb->Max, col, true, 0.0f); + + ImGui::PopStyleColor(); + } + } + else + { + pressed = false; + held = false; + } + + const ImGuiStyle& style = ImGui::GetStyle(); + bb->Min += style.FramePadding; + bb->Max -= style.FramePadding; + + return pressed; +} + +bool ImGuiFullscreen::MenuButtonFrame(const char* str_id, bool enabled, float height, bool* visible, bool* hovered, ImVec2* min, + ImVec2* max, ImGuiButtonFlags flags /*= 0*/, float hover_alpha /*= 0*/) +{ + ImRect bb; + const bool result = MenuButtonFrame(str_id, enabled, height, visible, hovered, &bb, flags, hover_alpha); + *min = bb.Min; + *max = bb.Max; + return result; +} + +void ImGuiFullscreen::MenuHeading(const char* title, bool draw_line /*= true*/) +{ + const float line_thickness = draw_line ? LayoutScale(1.0f) : 0.0f; + const float line_padding = draw_line ? LayoutScale(5.0f) : 0.0f; + + bool visible, hovered; + ImRect bb; + MenuButtonFrame(title, false, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, &visible, &hovered, &bb); + if (!visible) + return; + + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped(bb.Min, bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &bb); + ImGui::PopFont(); + ImGui::PopStyleColor(); + + if (draw_line) + { + const ImVec2 line_start(bb.Min.x, bb.Min.y + g_large_font->FontSize + line_padding); + const ImVec2 line_end(bb.Max.x, line_start.y); + ImGui::GetWindowDrawList()->AddLine(line_start, line_end, ImGui::GetColorU32(ImGuiCol_TextDisabled), line_thickness); + } +} + +bool ImGuiFullscreen::MenuHeadingButton( + const char* title, const char* value /*= nullptr*/, bool enabled /*= true*/, bool draw_line /*= true*/) +{ + const float line_thickness = draw_line ? LayoutScale(1.0f) : 0.0f; + const float line_padding = draw_line ? LayoutScale(5.0f) : 0.0f; + + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, &visible, &hovered, &bb); + if (!visible) + return false; + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + ImGui::PushFont(g_large_font); + ImGui::RenderTextClipped(bb.Min, bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &bb); + + if (value) + { + const ImVec2 value_size(g_large_font->CalcTextSizeA(g_large_font->FontSize, std::numeric_limits::max(), 0.0f, value)); + const ImRect value_bb(ImVec2(bb.Max.x - value_size.x, bb.Min.y), ImVec2(bb.Max.x, bb.Max.y)); + ImGui::RenderTextClipped(value_bb.Min, value_bb.Max, value, nullptr, nullptr, ImVec2(0.0f, 0.0f), &value_bb); + } + + ImGui::PopFont(); + if (!enabled) + ImGui::PopStyleColor(); + + if (draw_line) + { + const ImVec2 line_start(bb.Min.x, bb.Min.y + g_large_font->FontSize + line_padding); + const ImVec2 line_end(bb.Max.x, line_start.y); + ImGui::GetWindowDrawList()->AddLine(line_start, line_end, ImGui::GetColorU32(ImGuiCol_TextDisabled), line_thickness); + } + + return pressed; +} + +bool ImGuiFullscreen::ActiveButton(const char* title, bool is_active, bool enabled, float height, ImFont* font) +{ + if (is_active) + { + ImVec2 pos, size; + GetMenuButtonFrameBounds(height, &pos, &size); + ImGui::RenderFrame(pos, pos + size, ImGui::GetColorU32(UIPrimaryColor), false); + } + + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, height, &visible, &hovered, &bb); + if (!visible) + return false; + + const ImRect title_bb(bb.GetTL(), bb.GetBR()); + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + if (!enabled) + ImGui::PopStyleColor(); + + s_menu_button_index++; + return pressed; +} + +bool ImGuiFullscreen::MenuButton(const char* title, const char* summary, bool enabled, float height, ImFont* font, ImFont* summary_font) +{ + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, height, &visible, &hovered, &bb); + if (!visible) + return false; + + const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f); + const ImRect title_bb(bb.Min, ImVec2(bb.Max.x, midpoint)); + const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), bb.Max); + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + if (summary) + { + ImGui::PushFont(summary_font); + ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, summary, nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (!enabled) + ImGui::PopStyleColor(); + + s_menu_button_index++; + return pressed; +} + +bool ImGuiFullscreen::MenuButtonWithoutSummary(const char* title, bool enabled, float height, ImFont* font, const ImVec2& text_align) +{ + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, height, &visible, &hovered, &bb); + if (!visible) + return false; + + const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f); + const ImRect title_bb(bb.Min, ImVec2(bb.Max.x, midpoint)); + const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), bb.Max); + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title, nullptr, nullptr, text_align, &title_bb); + ImGui::PopFont(); + + if (!enabled) + ImGui::PopStyleColor(); + + s_menu_button_index++; + return pressed; +} + +bool ImGuiFullscreen::MenuImageButton(const char* title, const char* summary, ImTextureID user_texture_id, const ImVec2& image_size, + bool enabled, float height, const ImVec2& uv0, const ImVec2& uv1, ImFont* title_font, ImFont* summary_font) +{ + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, height, &visible, &hovered, &bb); + if (!visible) + return false; + + ImGui::GetWindowDrawList()->AddImage(user_texture_id, bb.Min, bb.Min + image_size, uv0, uv1, + enabled ? IM_COL32(255, 255, 255, 255) : ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + const float midpoint = bb.Min.y + title_font->FontSize + LayoutScale(4.0f); + const float text_start_x = bb.Min.x + image_size.x + LayoutScale(15.0f); + const ImRect title_bb(ImVec2(text_start_x, bb.Min.y), ImVec2(bb.Max.x, midpoint)); + const ImRect summary_bb(ImVec2(text_start_x, midpoint), bb.Max); + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(title_font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + if (summary) + { + ImGui::PushFont(summary_font); + ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, summary, nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (!enabled) + ImGui::PopStyleColor(); + + s_menu_button_index++; + return pressed; +} + +bool ImGuiFullscreen::FloatingButton(const char* text, float x, float y, float width, float height, float anchor_x, float anchor_y, + bool enabled, ImFont* font, ImVec2* out_position, bool repeat_button) +{ + const ImVec2 text_size(font->CalcTextSizeA(font->FontSize, std::numeric_limits::max(), 0.0f, text)); + const ImVec2& padding(ImGui::GetStyle().FramePadding); + if (width < 0.0f) + width = (padding.x * 2.0f) + text_size.x; + if (height < 0.0f) + height = (padding.y * 2.0f) + text_size.y; + + const ImVec2 window_size(ImGui::GetWindowSize()); + if (anchor_x == -1.0f) + x -= width; + else if (anchor_x == -0.5f) + x -= (width * 0.5f); + else if (anchor_x == 0.5f) + x = (window_size.x * 0.5f) - (width * 0.5f) - x; + else if (anchor_x == 1.0f) + x = window_size.x - width - x; + if (anchor_y == -1.0f) + y -= height; + else if (anchor_y == -0.5f) + y -= (height * 0.5f); + else if (anchor_y == 0.5f) + y = (window_size.y * 0.5f) - (height * 0.5f) - y; + else if (anchor_y == 1.0f) + y = window_size.y - height - y; + + if (out_position) + *out_position = ImVec2(x, y); + + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImVec2 base(ImGui::GetWindowPos() + ImVec2(x, y)); + ImRect bb(base, base + ImVec2(width, height)); + + const ImGuiID id = window->GetID(text); + if (enabled) + { + if (!ImGui::ItemAdd(bb, id)) + return false; + } + else + { + if (ImGui::IsClippedEx(bb, id)) + return false; + } + + bool hovered; + bool held; + bool pressed; + if (enabled) + { + pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, repeat_button ? ImGuiButtonFlags_Repeat : 0); + if (hovered) + { + const float t = std::min(std::abs(std::sin(ImGui::GetTime() * 0.75) * 1.1), 1.0f); + const ImU32 col = ImGui::GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered, 1.0f); + ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetColorU32(ImGuiCol_Border, t)); + ImGui::RenderFrame(bb.Min, bb.Max, col, true, 0.0f); + ImGui::PopStyleColor(); + } + } + else + { + hovered = false; + pressed = false; + held = false; + } + + bb.Min += padding; + bb.Max -= padding; + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(bb.Min, bb.Max, text, nullptr, nullptr, ImVec2(0.0f, 0.0f), &bb); + ImGui::PopFont(); + + if (!enabled) + ImGui::PopStyleColor(); + + return pressed; +} + +bool ImGuiFullscreen::ToggleButton( + const char* title, const char* summary, bool* v, bool enabled, float height, ImFont* font, ImFont* summary_font) +{ + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, height, &visible, &hovered, &bb, ImGuiButtonFlags_PressedOnClick); + if (!visible) + return false; + + const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f); + const ImRect title_bb(bb.Min, ImVec2(bb.Max.x, midpoint)); + const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), bb.Max); + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + if (summary) + { + ImGui::PushFont(summary_font); + ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, summary, nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (!enabled) + ImGui::PopStyleColor(); + + const float toggle_width = LayoutScale(50.0f); + const float toggle_height = LayoutScale(25.0f); + const float toggle_x = LayoutScale(8.0f); + const float toggle_y = (LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT) - toggle_height) * 0.5f; + const float toggle_radius = toggle_height * 0.5f; + const ImVec2 toggle_pos(bb.Max.x - toggle_width - toggle_x, bb.Min.y + toggle_y); + + if (pressed) + *v = !*v; + + float t = *v ? 1.0f : 0.0f; + ImDrawList* dl = ImGui::GetWindowDrawList(); + ImGuiContext& g = *GImGui; + if (g.LastActiveId == g.CurrentWindow->GetID(title)) + { + static constexpr const float ANIM_SPEED = 0.08f; + float t_anim = ImSaturate(g.LastActiveIdTimer / ANIM_SPEED); + t = *v ? (t_anim) : (1.0f - t_anim); + } + + ImU32 col_bg; + ImU32 col_knob; + if (!enabled) + { + col_bg = ImGui::GetColorU32(UIDisabledColor); + col_knob = IM_COL32(200, 200, 200, 200); + } + else + { + col_bg = ImGui::GetColorU32(ImLerp(HEX_TO_IMVEC4(0x8C8C8C, 0xff), UISecondaryLightColor, t)); + col_knob = IM_COL32(255, 255, 255, 255); + } + + dl->AddRectFilled(toggle_pos, ImVec2(toggle_pos.x + toggle_width, toggle_pos.y + toggle_height), col_bg, toggle_height * 0.5f); + dl->AddCircleFilled(ImVec2(toggle_pos.x + toggle_radius + t * (toggle_width - toggle_radius * 2.0f), toggle_pos.y + toggle_radius), + toggle_radius - 1.5f, col_knob, 32); + + s_menu_button_index++; + return pressed; +} + +bool ImGuiFullscreen::ThreeWayToggleButton( + const char* title, const char* summary, std::optional* v, bool enabled, float height, ImFont* font, ImFont* summary_font) +{ + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, height, &visible, &hovered, &bb, ImGuiButtonFlags_PressedOnClick); + if (!visible) + return false; + + const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f); + const ImRect title_bb(bb.Min, ImVec2(bb.Max.x, midpoint)); + const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), bb.Max); + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::PopFont(); + + if (summary) + { + ImGui::PushFont(summary_font); + ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, summary, nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (!enabled) + ImGui::PopStyleColor(); + + const float toggle_width = LayoutScale(50.0f); + const float toggle_height = LayoutScale(25.0f); + const float toggle_x = LayoutScale(8.0f); + const float toggle_y = (LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT) - toggle_height) * 0.5f; + const float toggle_radius = toggle_height * 0.5f; + const ImVec2 toggle_pos(bb.Max.x - toggle_width - toggle_x, bb.Min.y + toggle_y); + + if (pressed) + { + if (v->has_value() && v->value()) + *v = false; + else if (v->has_value() && !v->value()) + v->reset(); + else + *v = true; + } + + float t = v->has_value() ? (v->value() ? 1.0f : 0.0f) : 0.5f; + ImDrawList* dl = ImGui::GetWindowDrawList(); + ImGuiContext& g = *GImGui; + if (g.LastActiveId == g.CurrentWindow->GetID(title)) + { + static constexpr const float ANIM_SPEED = 0.08f; + float t_anim = ImSaturate(g.LastActiveIdTimer / ANIM_SPEED); + t = (v->has_value() ? (v->value() ? std::min(t_anim + 0.5f, 1.0f) : (1.0f - t_anim)) : (t_anim * 0.5f)); + } + + const float color_t = v->has_value() ? t : 0.0f; + + ImU32 col_bg; + if (!enabled) + col_bg = IM_COL32(0x75, 0x75, 0x75, 0xff); + else if (hovered) + col_bg = ImGui::GetColorU32( + ImLerp(v->has_value() ? HEX_TO_IMVEC4(0xf05100, 0xff) : HEX_TO_IMVEC4(0x9e9e9e, 0xff), UISecondaryLightColor, color_t)); + else + col_bg = ImGui::GetColorU32( + ImLerp(v->has_value() ? HEX_TO_IMVEC4(0xc45100, 0xff) : HEX_TO_IMVEC4(0x757575, 0xff), UISecondaryLightColor, color_t)); + + dl->AddRectFilled(toggle_pos, ImVec2(toggle_pos.x + toggle_width, toggle_pos.y + toggle_height), col_bg, toggle_height * 0.5f); + dl->AddCircleFilled(ImVec2(toggle_pos.x + toggle_radius + t * (toggle_width - toggle_radius * 2.0f), toggle_pos.y + toggle_radius), + toggle_radius - 1.5f, IM_COL32(255, 255, 255, 255), 32); + + s_menu_button_index++; + return pressed; +} + +bool ImGuiFullscreen::RangeButton(const char* title, const char* summary, s32* value, s32 min, s32 max, s32 increment, const char* format, + bool enabled /*= true*/, float height /*= LAYOUT_MENU_BUTTON_HEIGHT*/, ImFont* font /*= g_large_font*/, + ImFont* summary_font /*= g_medium_font*/) +{ + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, height, &visible, &hovered, &bb); + if (!visible) + return false; + + const std::string value_text(StringUtil::StdStringFromFormat(format, *value)); + const ImVec2 value_size(ImGui::CalcTextSize(value_text.c_str())); + + const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f); + const float text_end = bb.Max.x - value_size.x; + const ImRect title_bb(bb.Min, ImVec2(text_end, midpoint)); + const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), ImVec2(text_end, bb.Max.y)); + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::RenderTextClipped(bb.Min, bb.Max, value_text.c_str(), nullptr, nullptr, ImVec2(1.0f, 0.5f), &bb); + ImGui::PopFont(); + + if (summary) + { + ImGui::PushFont(summary_font); + ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, summary, nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (!enabled) + ImGui::PopStyleColor(); + + if (pressed) + ImGui::OpenPopup(title); + + bool changed = false; + + ImGui::SetNextWindowSize(LayoutScale(500.0f, 180.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, + LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING)); + + if (ImGui::BeginPopupModal(title, nullptr, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::SetNextItemWidth(LayoutScale(450.0f)); + changed = ImGui::SliderInt("##value", value, min, max, format, ImGuiSliderFlags_NoInput); + + BeginMenuButtons(); + if (MenuButton("OK", nullptr, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + ImGui::CloseCurrentPopup(); + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(4); + ImGui::PopFont(); + + return changed; +} + +bool ImGuiFullscreen::RangeButton(const char* title, const char* summary, float* value, float min, float max, float increment, + const char* format, bool enabled /*= true*/, float height /*= LAYOUT_MENU_BUTTON_HEIGHT*/, ImFont* font /*= g_large_font*/, + ImFont* summary_font /*= g_medium_font*/) +{ + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, height, &visible, &hovered, &bb); + if (!visible) + return false; + + const std::string value_text(StringUtil::StdStringFromFormat(format, *value)); + const ImVec2 value_size(ImGui::CalcTextSize(value_text.c_str())); + + const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f); + const float text_end = bb.Max.x - value_size.x; + const ImRect title_bb(bb.Min, ImVec2(text_end, midpoint)); + const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), ImVec2(text_end, bb.Max.y)); + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::RenderTextClipped(bb.Min, bb.Max, value_text.c_str(), nullptr, nullptr, ImVec2(1.0f, 0.5f), &bb); + ImGui::PopFont(); + + if (summary) + { + ImGui::PushFont(summary_font); + ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, summary, nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (!enabled) + ImGui::PopStyleColor(); + + if (pressed) + ImGui::OpenPopup(title); + + bool changed = false; + + ImGui::SetNextWindowSize(LayoutScale(500.0f, 180.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, + LayoutScale(ImGuiFullscreen::LAYOUT_MENU_BUTTON_X_PADDING, ImGuiFullscreen::LAYOUT_MENU_BUTTON_Y_PADDING)); + + if (ImGui::BeginPopupModal(title, nullptr, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::SetNextItemWidth(LayoutScale(450.0f)); + changed = ImGui::SliderFloat("##value", value, min, max, format, ImGuiSliderFlags_NoInput); + + BeginMenuButtons(); + if (MenuButton("OK", nullptr, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + ImGui::CloseCurrentPopup(); + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleVar(4); + ImGui::PopFont(); + + return changed; +} + +bool ImGuiFullscreen::MenuButtonWithValue( + const char* title, const char* summary, const char* value, bool enabled, float height, ImFont* font, ImFont* summary_font) +{ + ImRect bb; + bool visible, hovered; + bool pressed = MenuButtonFrame(title, enabled, height, &visible, &hovered, &bb); + if (!visible) + return false; + + const ImVec2 value_size(ImGui::CalcTextSize(value)); + + const float midpoint = bb.Min.y + font->FontSize + LayoutScale(4.0f); + const float text_end = bb.Max.x - value_size.x; + const ImRect title_bb(bb.Min, ImVec2(text_end, midpoint)); + const ImRect summary_bb(ImVec2(bb.Min.x, midpoint), ImVec2(text_end, bb.Max.y)); + + if (!enabled) + ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetColorU32(ImGuiCol_TextDisabled)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(title_bb.Min, title_bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &title_bb); + ImGui::RenderTextClipped(bb.Min, bb.Max, value, nullptr, nullptr, ImVec2(1.0f, 0.5f), &bb); + ImGui::PopFont(); + + if (summary) + { + ImGui::PushFont(summary_font); + ImGui::RenderTextClipped(summary_bb.Min, summary_bb.Max, summary, nullptr, nullptr, ImVec2(0.0f, 0.0f), &summary_bb); + ImGui::PopFont(); + } + + if (!enabled) + ImGui::PopStyleColor(); + + return pressed; +} + +bool ImGuiFullscreen::EnumChoiceButtonImpl(const char* title, const char* summary, s32* value_pointer, + const char* (*to_display_name_function)(s32 value, void* opaque), void* opaque, u32 count, bool enabled, float height, ImFont* font, + ImFont* summary_font) +{ + const bool pressed = + MenuButtonWithValue(title, summary, to_display_name_function(*value_pointer, opaque), enabled, height, font, summary_font); + + if (pressed) + { + s_enum_choice_button_id = ImGui::GetID(title); + s_enum_choice_button_value = *value_pointer; + s_enum_choice_button_set = false; + + ChoiceDialogOptions options; + options.reserve(count); + for (u32 i = 0; i < count; i++) + options.emplace_back(to_display_name_function(static_cast(i), opaque), static_cast(*value_pointer) == i); + OpenChoiceDialog(title, false, std::move(options), [](s32 index, const std::string& title, bool checked) { + if (index >= 0) + s_enum_choice_button_value = index; + + s_enum_choice_button_set = true; + CloseChoiceDialog(); + }); + } + + bool changed = false; + if (s_enum_choice_button_set && s_enum_choice_button_id == ImGui::GetID(title)) + { + changed = s_enum_choice_button_value != *value_pointer; + if (changed) + *value_pointer = s_enum_choice_button_value; + + s_enum_choice_button_id = 0; + s_enum_choice_button_value = 0; + s_enum_choice_button_set = false; + } + + return changed; +} + +void ImGuiFullscreen::BeginNavBar(float x_padding /*= LAYOUT_MENU_BUTTON_X_PADDING*/, float y_padding /*= LAYOUT_MENU_BUTTON_Y_PADDING*/) +{ + s_menu_button_index = 0; + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, LayoutScale(x_padding, y_padding)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, LayoutScale(1.0f, 1.0f)); + PushPrimaryColor(); +} + +void ImGuiFullscreen::EndNavBar() +{ + PopPrimaryColor(); + ImGui::PopStyleVar(4); +} + +void ImGuiFullscreen::NavTitle(const char* title, float height /*= LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY*/, ImFont* font /*= g_large_font*/) +{ + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + return; + + s_menu_button_index++; + + const ImVec2 text_size(font->CalcTextSizeA(font->FontSize, std::numeric_limits::max(), 0.0f, title)); + const ImVec2 pos(window->DC.CursorPos); + const ImGuiStyle& style = ImGui::GetStyle(); + const ImVec2 size = ImVec2(text_size.x, LayoutScale(height) + style.FramePadding.y * 2.0f); + + ImGui::ItemSize(ImVec2(size.x + style.FrameBorderSize + style.ItemSpacing.x, size.y + style.FrameBorderSize + style.ItemSpacing.y)); + ImGui::SameLine(); + + ImRect bb(pos, pos + size); + if (ImGui::IsClippedEx(bb, 0)) + return; + + bb.Min.y += style.FramePadding.y; + bb.Max.y -= style.FramePadding.y; + + ImGui::PushFont(font); + ImGui::RenderTextClipped(bb.Min, bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &bb); + ImGui::PopFont(); +} + +void ImGuiFullscreen::RightAlignNavButtons(u32 num_items /*= 0*/, float item_width /*= LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY*/, + float item_height /*= LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY*/) +{ + ImGuiWindow* window = ImGui::GetCurrentWindow(); + const ImGuiStyle& style = ImGui::GetStyle(); + + const float total_item_width = style.FramePadding.x * 2.0f + style.FrameBorderSize + style.ItemSpacing.x + LayoutScale(item_width); + const float margin = total_item_width * static_cast(num_items); + ImGui::SetCursorPosX(window->InnerClipRect.Max.x - margin - style.FramePadding.x); +} + +bool ImGuiFullscreen::NavButton(const char* title, bool is_active, bool enabled /* = true */, float width /* = -1.0f */, + float height /* = LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY */, ImFont* font /* = g_large_font */) +{ + ImGuiWindow* window = ImGui::GetCurrentWindow(); + if (window->SkipItems) + return false; + + s_menu_button_index++; + + const ImVec2 text_size(font->CalcTextSizeA(font->FontSize, std::numeric_limits::max(), 0.0f, title)); + const ImVec2 pos(window->DC.CursorPos); + const ImGuiStyle& style = ImGui::GetStyle(); + const ImVec2 size = ImVec2(((width < 0.0f) ? text_size.x : LayoutScale(width)) + style.FramePadding.x * 2.0f, + LayoutScale(height) + style.FramePadding.y * 2.0f); + + ImGui::ItemSize(ImVec2(size.x + style.FrameBorderSize + style.ItemSpacing.x, size.y + style.FrameBorderSize + style.ItemSpacing.y)); + ImGui::SameLine(); + + ImRect bb(pos, pos + size); + const ImGuiID id = window->GetID(title); + if (enabled) + { + // bit contradictory - we don't want this button to be used for *gamepad* navigation, since they're usually + // activated with the bumpers and/or the back button. + if (!ImGui::ItemAdd(bb, id, nullptr, ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus)) + return false; + } + else + { + if (ImGui::IsClippedEx(bb, id)) + return false; + } + + bool held; + bool pressed; + bool hovered; + if (enabled) + { + pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_NoNavFocus); + if (hovered) + { + const ImU32 col = ImGui::GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered, 1.0f); + ImGui::RenderFrame(bb.Min, bb.Max, col, true, 0.0f); + } + } + else + { + pressed = false; + held = false; + hovered = false; + } + + bb.Min += style.FramePadding; + bb.Max -= style.FramePadding; + + ImGui::PushStyleColor( + ImGuiCol_Text, ImGui::GetColorU32(enabled ? (is_active ? ImGuiCol_Text : ImGuiCol_TextDisabled) : ImGuiCol_ButtonHovered)); + + ImGui::PushFont(font); + ImGui::RenderTextClipped(bb.Min, bb.Max, title, nullptr, nullptr, ImVec2(0.0f, 0.0f), &bb); + ImGui::PopFont(); + + ImGui::PopStyleColor(); + + return pressed; +} + +void ImGuiFullscreen::PopulateFileSelectorItems() +{ + s_file_selector_items.clear(); + + if (s_file_selector_current_directory.empty()) + { + for (std::string& root_path : FileSystem::GetRootDirectoryList()) + { + std::string title(fmt::format(ICON_FA_FOLDER " {}", root_path)); + s_file_selector_items.emplace_back(std::move(title), std::move(root_path), false); + } + } + else + { + FileSystem::FindResultsArray results; + FileSystem::FindFiles(s_file_selector_current_directory.c_str(), "*", + FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_FOLDERS | FILESYSTEM_FIND_HIDDEN_FILES | FILESYSTEM_FIND_RELATIVE_PATHS, &results); + + std::string parent_path; + std::string::size_type sep_pos = s_file_selector_current_directory.rfind(FS_OSPATH_SEPARATOR_CHARACTER); + if (sep_pos != std::string::npos) + { + parent_path = s_file_selector_current_directory.substr(0, sep_pos); + +#ifndef _WIN32 + // Special case for going to root list on Linux. + if (parent_path.empty() && s_file_selector_current_directory.size() > 1) + parent_path = "/"; +#endif + } + + s_file_selector_items.emplace_back(ICON_FA_FOLDER_OPEN " ", std::move(parent_path), false); + std::sort(results.begin(), results.end(), [](const FILESYSTEM_FIND_DATA& lhs, const FILESYSTEM_FIND_DATA& rhs) { + if ((lhs.Attributes & FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY) != (rhs.Attributes & FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY)) + return (lhs.Attributes & FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY) != 0; + + return std::lexicographical_compare(lhs.FileName.begin(), lhs.FileName.end(), rhs.FileName.begin(), rhs.FileName.end()); + }); + + for (const FILESYSTEM_FIND_DATA& fd : results) + { + std::string full_path(Path::Combine(s_file_selector_current_directory, fd.FileName)); + + if (fd.Attributes & FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY) + { + std::string title(fmt::format(ICON_FA_FOLDER " {}", fd.FileName)); + s_file_selector_items.emplace_back(std::move(title), std::move(full_path), false); + } + else + { + if (s_file_selector_filters.empty() || + std::none_of(s_file_selector_filters.begin(), s_file_selector_filters.end(), + [&fd](const std::string& filter) { return StringUtil::WildcardMatch(fd.FileName.c_str(), filter.c_str()); })) + { + continue; + } + + std::string title(fmt::format(ICON_FA_FILE " {}", fd.FileName)); + s_file_selector_items.emplace_back(std::move(title), std::move(full_path), true); + } + } + } +} + +void ImGuiFullscreen::SetFileSelectorDirectory(std::string dir) +{ + while (dir.size() > 1 && dir.back() == FS_OSPATH_SEPARATOR_CHARACTER) + dir.erase(dir.size() - 1); + + s_file_selector_current_directory = std::move(dir); + PopulateFileSelectorItems(); +} + +bool ImGuiFullscreen::IsFileSelectorOpen() +{ + return s_file_selector_open; +} + +void ImGuiFullscreen::OpenFileSelector( + const char* title, bool select_directory, FileSelectorCallback callback, FileSelectorFilters filters, std::string initial_directory) +{ + if (s_file_selector_open) + CloseFileSelector(); + + s_file_selector_open = true; + s_file_selector_directory = select_directory; + s_file_selector_title = StringUtil::StdStringFromFormat("%s##file_selector", title); + s_file_selector_callback = std::move(callback); + s_file_selector_filters = std::move(filters); + + if (initial_directory.empty() || !FileSystem::DirectoryExists(initial_directory.c_str())) + initial_directory = FileSystem::GetWorkingDirectory(); + SetFileSelectorDirectory(std::move(initial_directory)); +} + +void ImGuiFullscreen::CloseFileSelector() +{ + if (!s_file_selector_open) + return; + + s_file_selector_open = false; + s_file_selector_directory = false; + std::string().swap(s_file_selector_title); + FileSelectorCallback().swap(s_file_selector_callback); + FileSelectorFilters().swap(s_file_selector_filters); + std::string().swap(s_file_selector_current_directory); + s_file_selector_items.clear(); + ImGui::CloseCurrentPopup(); + QueueResetFocus(); +} + +void ImGuiFullscreen::DrawFileSelector() +{ + if (!s_file_selector_open) + return; + + ImGui::SetNextWindowSize(LayoutScale(1000.0f, 680.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + ImGui::OpenPopup(s_file_selector_title.c_str()); + + FileSelectorItem* selected = nullptr; + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, LayoutScale(LAYOUT_MENU_BUTTON_X_PADDING, LAYOUT_MENU_BUTTON_Y_PADDING)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, UIPrimaryTextColor); + ImGui::PushStyleColor(ImGuiCol_TitleBg, UIPrimaryDarkColor); + ImGui::PushStyleColor(ImGuiCol_TitleBgActive, UIPrimaryColor); + ImGui::PushStyleColor(ImGuiCol_PopupBg, MulAlpha(UIBackgroundColor, 0.95f)); + + bool is_open = !WantsToCloseMenu(); + bool directory_selected = false; + if (ImGui::BeginPopupModal( + s_file_selector_title.c_str(), &is_open, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::PushStyleColor(ImGuiCol_Text, UIBackgroundTextColor); + + BeginMenuButtons(); + + if (!s_file_selector_current_directory.empty()) + { + MenuButton(fmt::format(ICON_FA_FOLDER_OPEN " {}", s_file_selector_current_directory).c_str(), nullptr, false, + LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + } + + if (s_file_selector_directory && !s_file_selector_current_directory.empty()) + { + if (MenuButton(ICON_FA_FOLDER_PLUS " ", nullptr, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + directory_selected = true; + } + + for (FileSelectorItem& item : s_file_selector_items) + { + if (MenuButton(item.display_name.c_str(), nullptr, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + selected = &item; + } + + EndMenuButtons(); + + ImGui::PopStyleColor(1); + + ImGui::EndPopup(); + } + else + { + is_open = false; + } + + ImGui::PopStyleColor(4); + ImGui::PopStyleVar(3); + ImGui::PopFont(); + + if (selected) + { + if (selected->is_file) + { + s_file_selector_callback(selected->full_path); + } + else + { + SetFileSelectorDirectory(std::move(selected->full_path)); + } + } + else if (directory_selected) + { + s_file_selector_callback(s_file_selector_current_directory); + } + else if (!is_open) + { + std::string no_path; + s_file_selector_callback(no_path); + CloseFileSelector(); + } +} + +bool ImGuiFullscreen::IsChoiceDialogOpen() +{ + return s_choice_dialog_open; +} + +void ImGuiFullscreen::OpenChoiceDialog(const char* title, bool checkable, ChoiceDialogOptions options, ChoiceDialogCallback callback) +{ + if (s_choice_dialog_open) + CloseChoiceDialog(); + + s_choice_dialog_open = true; + s_choice_dialog_checkable = checkable; + s_choice_dialog_title = StringUtil::StdStringFromFormat("%s##choice_dialog", title); + s_choice_dialog_options = std::move(options); + s_choice_dialog_callback = std::move(callback); +} + +void ImGuiFullscreen::CloseChoiceDialog() +{ + if (!s_choice_dialog_open) + return; + + s_choice_dialog_open = false; + s_choice_dialog_checkable = false; + std::string().swap(s_choice_dialog_title); + ChoiceDialogOptions().swap(s_choice_dialog_options); + ChoiceDialogCallback().swap(s_choice_dialog_callback); + QueueResetFocus(); +} + +void ImGuiFullscreen::DrawChoiceDialog() +{ + if (!s_choice_dialog_open) + return; + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, LayoutScale(LAYOUT_MENU_BUTTON_X_PADDING, LAYOUT_MENU_BUTTON_Y_PADDING)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, UIPrimaryTextColor); + ImGui::PushStyleColor(ImGuiCol_TitleBg, UIPrimaryDarkColor); + ImGui::PushStyleColor(ImGuiCol_TitleBgActive, UIPrimaryColor); + ImGui::PushStyleColor(ImGuiCol_PopupBg, MulAlpha(UIBackgroundColor, 0.95f)); + + const float width = LayoutScale(600.0f); + const float title_height = g_large_font->FontSize + ImGui::GetStyle().FramePadding.y * 2.0f + ImGui::GetStyle().WindowPadding.y * 2.0f; + const float height = std::min( + LayoutScale(450.0f), title_height + LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + (LAYOUT_MENU_BUTTON_Y_PADDING * 2.0f)) * + static_cast(s_choice_dialog_options.size())); + ImGui::SetNextWindowSize(ImVec2(width, height)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + ImGui::OpenPopup(s_choice_dialog_title.c_str()); + + bool is_open = !WantsToCloseMenu(); + s32 choice = -1; + + if (ImGui::BeginPopupModal( + s_choice_dialog_title.c_str(), &is_open, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::PushStyleColor(ImGuiCol_Text, UIBackgroundTextColor); + + BeginMenuButtons(); + + if (s_choice_dialog_checkable) + { + for (s32 i = 0; i < static_cast(s_choice_dialog_options.size()); i++) + { + auto& option = s_choice_dialog_options[i]; + + const std::string title(fmt::format("{0} {1}", option.second ? ICON_FA_CHECK_SQUARE : ICON_FA_SQUARE, option.first)); + if (MenuButton(title.c_str(), nullptr, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + { + choice = i; + option.second = !option.second; + } + } + } + else + { + for (s32 i = 0; i < static_cast(s_choice_dialog_options.size()); i++) + { + auto& option = s_choice_dialog_options[i]; + std::string title; + if (option.second) + title += ICON_FA_CHECK " "; + title += option.first; + + if (ActiveButton(title.c_str(), option.second, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + { + choice = i; + for (s32 j = 0; j < static_cast(s_choice_dialog_options.size()); j++) + s_choice_dialog_options[j].second = (j == i); + } + } + } + + EndMenuButtons(); + + ImGui::PopStyleColor(1); + + ImGui::EndPopup(); + } + else + { + is_open = false; + } + + ImGui::PopStyleColor(4); + ImGui::PopStyleVar(3); + ImGui::PopFont(); + + if (choice >= 0) + { + const auto& option = s_choice_dialog_options[choice]; + s_choice_dialog_callback(choice, option.first, option.second); + } + else if (!is_open) + { + std::string no_string; + s_choice_dialog_callback(-1, no_string, false); + CloseChoiceDialog(); + } +} + + +bool ImGuiFullscreen::IsInputDialogOpen() +{ + return s_input_dialog_open; +} + +void ImGuiFullscreen::OpenInputStringDialog( + std::string title, std::string message, std::string caption, std::string ok_button_text, InputStringDialogCallback callback) +{ + s_input_dialog_open = true; + s_input_dialog_title = std::move(title); + s_input_dialog_message = std::move(message); + s_input_dialog_caption = std::move(caption); + s_input_dialog_ok_text = std::move(ok_button_text); + s_input_dialog_callback = std::move(callback); +} + +void ImGuiFullscreen::DrawInputDialog() +{ + if (!s_input_dialog_open) + return; + + ImGui::SetNextWindowSize(LayoutScale(700.0f, 0.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + ImGui::OpenPopup(s_input_dialog_title.c_str()); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, LayoutScale(LAYOUT_MENU_BUTTON_X_PADDING, LAYOUT_MENU_BUTTON_Y_PADDING)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, UIPrimaryTextColor); + ImGui::PushStyleColor(ImGuiCol_TitleBg, UIPrimaryDarkColor); + ImGui::PushStyleColor(ImGuiCol_TitleBgActive, UIPrimaryColor); + ImGui::PushStyleColor(ImGuiCol_PopupBg, MulAlpha(UIBackgroundColor, 0.95f)); + + bool is_open = true; + if (ImGui::BeginPopupModal(s_input_dialog_title.c_str(), &is_open, + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) + { + ImGui::TextWrapped("%s", s_input_dialog_message.c_str()); + + BeginMenuButtons(); + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + + if (!s_input_dialog_caption.empty()) + { + const float prev = ImGui::GetCursorPosX(); + ImGui::TextUnformatted(s_input_dialog_caption.c_str()); + ImGui::SetNextItemWidth(ImGui::GetCursorPosX() - prev); + } + else + { + ImGui::SetNextItemWidth(ImGui::GetCurrentWindow()->WorkRect.GetWidth()); + } + ImGui::InputText("##input", &s_input_dialog_text); + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(10.0f)); + + const bool ok_enabled = !s_input_dialog_text.empty(); + + if (ActiveButton(s_input_dialog_ok_text.c_str(), false, ok_enabled) && ok_enabled) + { + // have to move out in case they open another dialog in the callback + InputStringDialogCallback cb(std::move(s_input_dialog_callback)); + std::string text(std::move(s_input_dialog_text)); + CloseInputDialog(); + ImGui::CloseCurrentPopup(); + cb(std::move(text)); + } + + if (ActiveButton(ICON_FA_TIMES " Cancel", false)) + { + CloseInputDialog(); + + ImGui::CloseCurrentPopup(); + } + + EndMenuButtons(); + + ImGui::EndPopup(); + } + if (!is_open) + CloseInputDialog(); + + ImGui::PopStyleColor(4); + ImGui::PopStyleVar(3); + ImGui::PopFont(); +} + +void ImGuiFullscreen::CloseInputDialog() +{ + if (!s_input_dialog_open) + return; + + s_input_dialog_open = false; + s_input_dialog_title = {}; + s_input_dialog_message = {}; + s_input_dialog_caption = {}; + s_input_dialog_ok_text = {}; + s_input_dialog_text = {}; + s_input_dialog_callback = {}; +} + +bool ImGuiFullscreen::IsMessageBoxDialogOpen() +{ + return s_message_dialog_open; +} + +void ImGuiFullscreen::OpenConfirmMessageDialog( + std::string title, std::string message, ConfirmMessageDialogCallback callback, std::string yes_button_text, std::string no_button_text) +{ + CloseMessageDialog(); + + s_message_dialog_open = true; + s_message_dialog_title = std::move(title); + s_message_dialog_message = std::move(message); + s_message_dialog_callback = std::move(callback); + s_message_dialog_buttons[0] = std::move(yes_button_text); + s_message_dialog_buttons[1] = std::move(no_button_text); +} + +void ImGuiFullscreen::OpenInfoMessageDialog( + std::string title, std::string message, InfoMessageDialogCallback callback, std::string button_text) +{ + CloseMessageDialog(); + + s_message_dialog_open = true; + s_message_dialog_title = std::move(title); + s_message_dialog_message = std::move(message); + s_message_dialog_callback = std::move(callback); + s_message_dialog_buttons[0] = std::move(button_text); +} + +void ImGuiFullscreen::OpenMessageDialog(std::string title, std::string message, MessageDialogCallback callback, + std::string first_button_text, std::string second_button_text, std::string third_button_text) +{ + CloseMessageDialog(); + + s_message_dialog_open = true; + s_message_dialog_title = std::move(title); + s_message_dialog_message = std::move(message); + s_message_dialog_callback = std::move(callback); + s_message_dialog_buttons[0] = std::move(first_button_text); + s_message_dialog_buttons[1] = std::move(second_button_text); + s_message_dialog_buttons[2] = std::move(third_button_text); +} + +void ImGuiFullscreen::CloseMessageDialog() +{ + if (!s_message_dialog_open) + return; + + s_message_dialog_open = false; + s_message_dialog_title = {}; + s_message_dialog_message = {}; + s_message_dialog_buttons = {}; + s_message_dialog_callback = {}; +} + +void ImGuiFullscreen::DrawMessageDialog() +{ + if (!s_message_dialog_open) + return; + + const char* win_id = s_message_dialog_title.empty() ? "##messagedialog" : s_message_dialog_title.c_str(); + + ImGui::SetNextWindowSize(LayoutScale(700.0f, 0.0f)); + ImGui::SetNextWindowPos(ImGui::GetIO().DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + ImGui::OpenPopup(win_id); + + ImGui::PushFont(g_large_font); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(20.0f, 20.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, LayoutScale(10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, LayoutScale(LAYOUT_MENU_BUTTON_X_PADDING, LAYOUT_MENU_BUTTON_Y_PADDING)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Text, UIPrimaryTextColor); + ImGui::PushStyleColor(ImGuiCol_TitleBg, UIPrimaryDarkColor); + ImGui::PushStyleColor(ImGuiCol_TitleBgActive, UIPrimaryColor); + ImGui::PushStyleColor(ImGuiCol_PopupBg, MulAlpha(UIBackgroundColor, 0.95f)); + + bool is_open = true; + const u32 flags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | + (s_message_dialog_title.empty() ? ImGuiWindowFlags_NoTitleBar : 0); + std::optional result; + + if (ImGui::BeginPopupModal(win_id, &is_open, flags)) + { + BeginMenuButtons(); + + ImGui::TextWrapped("%s", s_message_dialog_message.c_str()); + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + LayoutScale(20.0f)); + + for (s32 button_index = 0; button_index < static_cast(s_message_dialog_buttons.size()); button_index++) + { + if (!s_message_dialog_buttons[button_index].empty() && ActiveButton(s_message_dialog_buttons[button_index].c_str(), false)) + { + result = button_index; + ImGui::CloseCurrentPopup(); + } + } + + EndMenuButtons(); + + ImGui::EndPopup(); + } + + ImGui::PopStyleColor(4); + ImGui::PopStyleVar(4); + ImGui::PopFont(); + + if (!is_open || result.has_value()) + { + // have to move out in case they open another dialog in the callback + auto cb = (std::move(s_message_dialog_callback)); + CloseMessageDialog(); + + if (std::holds_alternative(cb)) + { + const InfoMessageDialogCallback& func = std::get(cb); + if (func) + func(); + } + else if (std::holds_alternative(cb)) + { + const ConfirmMessageDialogCallback& func = std::get(cb); + if (func) + func(result.value_or(1) == 0); + } + } +} + +static float s_notification_vertical_position = 0.15f; +static float s_notification_vertical_direction = 1.0f; + +float ImGuiFullscreen::GetNotificationVerticalPosition() +{ + return s_notification_vertical_position; +} + +float ImGuiFullscreen::GetNotificationVerticalDirection() +{ + return s_notification_vertical_direction; +} + +void ImGuiFullscreen::SetNotificationVerticalPosition(float position, float direction) +{ + s_notification_vertical_position = position; + s_notification_vertical_direction = direction; +} + +ImGuiID ImGuiFullscreen::GetBackgroundProgressID(const char* str_id) +{ + return ImHashStr(str_id); +} + +void ImGuiFullscreen::OpenBackgroundProgressDialog(const char* str_id, std::string message, s32 min, s32 max, s32 value) +{ + const ImGuiID id = GetBackgroundProgressID(str_id); + + std::unique_lock lock(s_background_progress_lock); + + for (const BackgroundProgressDialogData& data : s_background_progress_dialogs) + { + pxAssert(data.id != id); + } + + BackgroundProgressDialogData data; + data.id = id; + data.message = std::move(message); + data.min = min; + data.max = max; + data.value = value; + s_background_progress_dialogs.push_back(std::move(data)); +} + +void ImGuiFullscreen::UpdateBackgroundProgressDialog(const char* str_id, std::string message, s32 min, s32 max, s32 value) +{ + const ImGuiID id = GetBackgroundProgressID(str_id); + + std::unique_lock lock(s_background_progress_lock); + + for (BackgroundProgressDialogData& data : s_background_progress_dialogs) + { + if (data.id == id) + { + data.message = std::move(message); + data.min = min; + data.max = max; + data.value = value; + return; + } + } + + pxFailRel("Updating unknown progress entry."); +} + +void ImGuiFullscreen::CloseBackgroundProgressDialog(const char* str_id) +{ + const ImGuiID id = GetBackgroundProgressID(str_id); + + std::unique_lock lock(s_background_progress_lock); + + for (auto it = s_background_progress_dialogs.begin(); it != s_background_progress_dialogs.end(); ++it) + { + if (it->id == id) + { + s_background_progress_dialogs.erase(it); + return; + } + } + + pxFailRel("Closing unknown progress entry."); +} + +void ImGuiFullscreen::DrawBackgroundProgressDialogs(ImVec2& position, float spacing) +{ + std::unique_lock lock(s_background_progress_lock); + if (s_background_progress_dialogs.empty()) + return; + + const float window_width = LayoutScale(500.0f); + const float window_height = LayoutScale(75.0f); + + ImGui::PushStyleColor(ImGuiCol_WindowBg, UIPrimaryDarkColor); + ImGui::PushStyleColor(ImGuiCol_PlotHistogram, UISecondaryLightColor); + ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding, LayoutScale(4.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, LayoutScale(1.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(10.0f, 10.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, LayoutScale(10.0f, 10.0f)); + ImGui::PushFont(g_medium_font); + + ImDrawList* dl = ImGui::GetForegroundDrawList(); + + for (const BackgroundProgressDialogData& data : s_background_progress_dialogs) + { + const float window_pos_x = position.x; + const float window_pos_y = position.y - ((s_notification_vertical_direction < 0.0f) ? window_height : 0.0f); + + dl->AddRectFilled(ImVec2(window_pos_x, window_pos_y), ImVec2(window_pos_x + window_width, window_pos_y + window_height), + IM_COL32(0x11, 0x11, 0x11, 200), LayoutScale(10.0f)); + + ImVec2 pos(window_pos_x + LayoutScale(10.0f), window_pos_y + LayoutScale(10.0f)); + dl->AddText(g_medium_font, g_medium_font->FontSize, pos, IM_COL32(255, 255, 255, 255), data.message.c_str(), nullptr, 0.0f); + pos.y += g_medium_font->FontSize + LayoutScale(10.0f); + + const ImVec2 box_end(pos.x + window_width - LayoutScale(10.0f * 2.0f), pos.y + LayoutScale(25.0f)); + dl->AddRectFilled(pos, box_end, ImGui::GetColorU32(UIPrimaryDarkColor)); + + if (data.min != data.max) + { + const float fraction = static_cast(data.value - data.min) / static_cast(data.max - data.min); + dl->AddRectFilled(pos, ImVec2(pos.x + fraction * (box_end.x - pos.x), box_end.y), ImGui::GetColorU32(UISecondaryColor)); + + const std::string text(fmt::format("{}%", static_cast(std::round(fraction * 100.0f)))); + const ImVec2 text_size(ImGui::CalcTextSize(text.c_str())); + const ImVec2 text_pos( + pos.x + ((box_end.x - pos.x) / 2.0f) - (text_size.x / 2.0f), pos.y + ((box_end.y - pos.y) / 2.0f) - (text_size.y / 2.0f)); + dl->AddText(g_medium_font, g_medium_font->FontSize, text_pos, ImGui::GetColorU32(UIPrimaryTextColor), text.c_str()); + } + else + { + // indeterminate, so draw a scrolling bar + const float bar_width = LayoutScale(30.0f); + const float fraction = std::fmod(ImGui::GetTime(), 2.0f) * 0.5f; + const ImVec2 bar_start(pos.x + ImLerp(0.0f, box_end.x, fraction) - bar_width, pos.y); + const ImVec2 bar_end(std::min(bar_start.x + bar_width, box_end.x), pos.y + LayoutScale(25.0f)); + dl->AddRectFilled(ImClamp(bar_start, pos, box_end), ImClamp(bar_end, pos, box_end), ImGui::GetColorU32(UISecondaryColor)); + } + + position.y += s_notification_vertical_direction * (window_height + spacing); + } + + ImGui::PopFont(); + ImGui::PopStyleVar(4); + ImGui::PopStyleColor(2); +} + +////////////////////////////////////////////////////////////////////////// +// Notifications +////////////////////////////////////////////////////////////////////////// + +void ImGuiFullscreen::AddNotification(float duration, std::string title, std::string text, std::string image_path) +{ + Notification notif; + notif.duration = duration; + notif.title = std::move(title); + notif.text = std::move(text); + notif.badge_path = std::move(image_path); + notif.start_time = Common::Timer::GetCurrentValue(); + s_notifications.push_back(std::move(notif)); +} + +void ImGuiFullscreen::ClearNotifications() +{ + s_notifications.clear(); +} + +void ImGuiFullscreen::DrawNotifications(ImVec2& position, float spacing) +{ + if (s_notifications.empty()) + return; + + static constexpr float EASE_IN_TIME = 0.6f; + static constexpr float EASE_OUT_TIME = 0.6f; + const Common::Timer::Value current_time = Common::Timer::GetCurrentValue(); + + const float horizontal_padding = ImGuiFullscreen::LayoutScale(20.0f); + const float vertical_padding = ImGuiFullscreen::LayoutScale(10.0f); + const float horizontal_spacing = ImGuiFullscreen::LayoutScale(10.0f); + const float vertical_spacing = ImGuiFullscreen::LayoutScale(4.0f); + const float badge_size = ImGuiFullscreen::LayoutScale(48.0f); + const float min_width = ImGuiFullscreen::LayoutScale(200.0f); + const float max_width = ImGuiFullscreen::LayoutScale(800.0f); + const float max_text_width = max_width - badge_size - (horizontal_padding * 2.0f) - horizontal_spacing; + const float min_height = (vertical_padding * 2.0f) + badge_size; + const float shadow_size = ImGuiFullscreen::LayoutScale(4.0f); + const float rounding = ImGuiFullscreen::LayoutScale(4.0f); + + ImFont* const title_font = ImGuiFullscreen::g_large_font; + ImFont* const text_font = ImGuiFullscreen::g_medium_font; + +#if 0 + static constexpr u32 toast_background_color = IM_COL32(241, 241, 241, 255); + static constexpr u32 toast_border_color = IM_COL32(0x88, 0x88, 0x88, 255); + static constexpr u32 toast_title_color = IM_COL32(1, 1, 1, 255); + static constexpr u32 toast_text_color = IM_COL32(0, 0, 0, 255); +#else + static constexpr u32 toast_background_color = IM_COL32(0x21, 0x21, 0x21, 255); + static constexpr u32 toast_border_color = IM_COL32(0x48, 0x48, 0x48, 255); + static constexpr u32 toast_title_color = IM_COL32(0xff, 0xff, 0xff, 255); + static constexpr u32 toast_text_color = IM_COL32(0xff, 0xff, 0xff, 255); +#endif + + for (u32 index = 0; index < static_cast(s_notifications.size());) + { + const Notification& notif = s_notifications[index]; + const float time_passed = static_cast(Common::Timer::ConvertValueToSeconds(current_time - notif.start_time)); + if (time_passed >= notif.duration) + { + s_notifications.erase(s_notifications.begin() + index); + continue; + } + + const ImVec2 title_size(text_font->CalcTextSizeA( + title_font->FontSize, max_text_width, max_text_width, notif.title.c_str(), notif.title.c_str() + notif.title.size())); + + const ImVec2 text_size(text_font->CalcTextSizeA( + text_font->FontSize, max_text_width, max_text_width, notif.text.c_str(), notif.text.c_str() + notif.text.size())); + + const float box_width = + std::max((horizontal_padding * 2.0f) + badge_size + horizontal_spacing + std::max(title_size.x, text_size.x), min_width); + const float box_height = std::max((vertical_padding * 2.0f) + title_size.y + vertical_spacing + text_size.y, min_height); + + float x_offset = 0.0f; + if (time_passed < EASE_IN_TIME) + { + const float disp = (box_width + position.x); + x_offset = -(disp - (disp * Easing::InBack(time_passed / EASE_IN_TIME))); + } + else if (time_passed > (notif.duration - EASE_OUT_TIME)) + { + const float disp = (box_width + position.x); + x_offset = -(disp - (disp * Easing::OutBack((notif.duration - time_passed) / EASE_OUT_TIME))); + } + + const ImVec2 box_min(position.x + x_offset, position.y - ((s_notification_vertical_direction < 0.0f) ? box_height : 0.0f)); + const ImVec2 box_max(box_min.x + box_width, box_min.y + box_height); + + ImDrawList* dl = ImGui::GetForegroundDrawList(); + dl->AddRectFilled(ImVec2(box_min.x + shadow_size, box_min.y + shadow_size), + ImVec2(box_max.x + shadow_size, box_max.y + shadow_size), IM_COL32(20, 20, 20, 180), rounding, ImDrawCornerFlags_All); + dl->AddRectFilled(box_min, box_max, toast_background_color, rounding, ImDrawCornerFlags_All); + dl->AddRect(box_min, box_max, toast_border_color, rounding, ImDrawCornerFlags_All, ImGuiFullscreen::LayoutScale(1.0f)); + + const ImVec2 badge_min(box_min.x + horizontal_padding, box_min.y + vertical_padding); + const ImVec2 badge_max(badge_min.x + badge_size, badge_min.y + badge_size); + if (!notif.badge_path.empty()) + { + HostDisplayTexture* tex = GetCachedTexture(notif.badge_path.c_str()); + if (tex) + dl->AddImage(static_cast(tex->GetHandle()), badge_min, badge_max); + } + + const ImVec2 title_min(badge_max.x + horizontal_spacing, box_min.y + vertical_padding); + const ImVec2 title_max(title_min.x + title_size.x, title_min.y + title_size.y); + dl->AddText(title_font, title_font->FontSize, title_min, toast_title_color, notif.title.c_str(), + notif.title.c_str() + notif.title.size(), max_text_width); + + const ImVec2 text_min(badge_max.x + horizontal_spacing, title_max.y + vertical_spacing); + const ImVec2 text_max(text_min.x + text_size.x, text_min.y + text_size.y); + dl->AddText(text_font, text_font->FontSize, text_min, toast_text_color, notif.text.c_str(), notif.text.c_str() + notif.text.size(), + max_text_width); + + position.y += s_notification_vertical_direction * (box_height + shadow_size + spacing); + index++; + } +} + +void ImGuiFullscreen::ShowToast(std::string title, std::string message, float duration) +{ + s_toast_title = std::move(title); + s_toast_message = std::move(message); + s_toast_start_time = Common::Timer::GetCurrentValue(); + s_toast_duration = duration; +} + +void ImGuiFullscreen::ClearToast() +{ + s_toast_message = {}; + s_toast_title = {}; + s_toast_start_time = 0; + s_toast_duration = 0.0f; +} + +void ImGuiFullscreen::DrawToast() +{ + if (s_toast_title.empty() && s_toast_message.empty()) + return; + + const float elapsed = static_cast(Common::Timer::ConvertValueToSeconds(Common::Timer::GetCurrentValue() - s_toast_start_time)); + if (elapsed >= s_toast_duration) + { + ClearToast(); + return; + } + + // fade out the last second + const float alpha = std::min(std::min(elapsed * 4.0f, s_toast_duration - elapsed), 1.0f); + + const float max_width = LayoutScale(600.0f); + + ImFont* title_font = g_large_font; + ImFont* message_font = g_medium_font; + const float padding = LayoutScale(20.0f); + const float total_padding = padding * 2.0f; + const float margin = LayoutScale(20.0f); + const float spacing = s_toast_title.empty() ? 0.0f : LayoutScale(10.0f); + const ImVec2 display_size(ImGui::GetIO().DisplaySize); + const ImVec2 title_size(s_toast_title.empty() ? ImVec2(0.0f, 0.0f) : + title_font->CalcTextSizeA(title_font->FontSize, FLT_MAX, max_width, + s_toast_title.c_str(), s_toast_title.c_str() + s_toast_title.length())); + const ImVec2 message_size(s_toast_message.empty() ? ImVec2(0.0f, 0.0f) : + message_font->CalcTextSizeA(message_font->FontSize, FLT_MAX, max_width, + s_toast_message.c_str(), s_toast_message.c_str() + s_toast_message.length())); + const ImVec2 comb_size(std::max(title_size.x, message_size.x), title_size.y + spacing + message_size.y); + + const ImVec2 box_size(comb_size.x + total_padding, comb_size.y + total_padding); + const ImVec2 box_pos((display_size.x - box_size.x) * 0.5f, (display_size.y - margin - box_size.y)); + + ImDrawList* dl = ImGui::GetForegroundDrawList(); + dl->AddRectFilled(box_pos, box_pos + box_size, ImGui::GetColorU32(ModAlpha(UIPrimaryColor, alpha)), padding); + if (!s_toast_title.empty()) + { + const float offset = (comb_size.x - title_size.x) * 0.5f; + dl->AddText(title_font, title_font->FontSize, box_pos + ImVec2(offset + padding, padding), + ImGui::GetColorU32(ModAlpha(UIPrimaryTextColor, alpha)), s_toast_title.c_str(), s_toast_title.c_str() + s_toast_title.length(), + max_width); + } + if (!s_toast_message.empty()) + { + const float offset = (comb_size.x - message_size.x) * 0.5f; + dl->AddText(message_font, message_font->FontSize, box_pos + ImVec2(offset + padding, padding + spacing + title_size.y), + ImGui::GetColorU32(ModAlpha(UIPrimaryTextColor, alpha)), s_toast_message.c_str(), + s_toast_message.c_str() + s_toast_message.length(), max_width); + } +} + +void ImGuiFullscreen::SetTheme(bool light) +{ + if (!light) + { + // dark + UIBackgroundColor = HEX_TO_IMVEC4(0x212121, 0xff); + UIBackgroundTextColor = HEX_TO_IMVEC4(0xffffff, 0xff); + UIBackgroundLineColor = HEX_TO_IMVEC4(0xf0f0f0, 0xff); + UIBackgroundHighlightColor = HEX_TO_IMVEC4(0x4b4b4b, 0xff); + UIPrimaryColor = HEX_TO_IMVEC4(0x2e2e2e, 0xff); + UIPrimaryLightColor = HEX_TO_IMVEC4(0x484848, 0xff); + UIPrimaryDarkColor = HEX_TO_IMVEC4(0x000000, 0xff); + UIPrimaryTextColor = HEX_TO_IMVEC4(0xffffff, 0xff); + UIDisabledColor = HEX_TO_IMVEC4(0xaaaaaa, 0xff); + UITextHighlightColor = HEX_TO_IMVEC4(0x90caf9, 0xff); + UIPrimaryLineColor = HEX_TO_IMVEC4(0xffffff, 0xff); + UISecondaryColor = HEX_TO_IMVEC4(0x0d47a1, 0xff); + UISecondaryLightColor = HEX_TO_IMVEC4(0x63a4ff, 0xff); + UISecondaryDarkColor = HEX_TO_IMVEC4(0x002171, 0xff); + UISecondaryTextColor = HEX_TO_IMVEC4(0xffffff, 0xff); + } + else + { + // light + UIBackgroundColor = HEX_TO_IMVEC4(0xf5f5f6, 0xff); + UIBackgroundTextColor = HEX_TO_IMVEC4(0x000000, 0xff); + UIBackgroundLineColor = HEX_TO_IMVEC4(0xe1e2e1, 0xff); + UIBackgroundHighlightColor = HEX_TO_IMVEC4(0xe1e2e1, 0xff); + UIPrimaryColor = HEX_TO_IMVEC4(0x0d47a1, 0xff); + UIPrimaryLightColor = HEX_TO_IMVEC4(0x5472d3, 0xff); + UIPrimaryDarkColor = HEX_TO_IMVEC4(0x002171, 0xff); + UIPrimaryTextColor = HEX_TO_IMVEC4(0xffffff, 0xff); + UIDisabledColor = HEX_TO_IMVEC4(0xaaaaaa, 0xff); + UITextHighlightColor = HEX_TO_IMVEC4(0x8e8e8e, 0xff); + UIPrimaryLineColor = HEX_TO_IMVEC4(0x000000, 0xff); + UISecondaryColor = HEX_TO_IMVEC4(0x3d5afe, 0xff); + UISecondaryLightColor = HEX_TO_IMVEC4(0xc0cfff, 0xff); + UISecondaryDarkColor = HEX_TO_IMVEC4(0x0031ca, 0xff); + UISecondaryTextColor = HEX_TO_IMVEC4(0x000000, 0xff); + } +} diff --git a/pcsx2/Frontend/ImGuiFullscreen.h b/pcsx2/Frontend/ImGuiFullscreen.h new file mode 100644 index 0000000000..5b8788e60b --- /dev/null +++ b/pcsx2/Frontend/ImGuiFullscreen.h @@ -0,0 +1,263 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once +#include "common/Pcsx2Defs.h" +#include "IconsFontAwesome5.h" +#include "imgui.h" +#include "imgui_internal.h" +#include +#include +#include +#include +#include +#include + +class HostDisplayTexture; + +namespace ImGuiFullscreen +{ +#define HEX_TO_IMVEC4(hex, alpha) \ + ImVec4(static_cast((hex >> 16) & 0xFFu) / 255.0f, static_cast((hex >> 8) & 0xFFu) / 255.0f, \ + static_cast(hex & 0xFFu) / 255.0f, static_cast(alpha) / 255.0f) + + static constexpr float LAYOUT_SCREEN_WIDTH = 1280.0f; + static constexpr float LAYOUT_SCREEN_HEIGHT = 720.0f; + static constexpr float LAYOUT_LARGE_FONT_SIZE = 26.0f; + static constexpr float LAYOUT_MEDIUM_FONT_SIZE = 16.0f; + static constexpr float LAYOUT_SMALL_FONT_SIZE = 10.0f; + static constexpr float LAYOUT_MENU_BUTTON_HEIGHT = 50.0f; + static constexpr float LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY = 26.0f; + static constexpr float LAYOUT_MENU_BUTTON_X_PADDING = 15.0f; + static constexpr float LAYOUT_MENU_BUTTON_Y_PADDING = 10.0f; + + extern ImFont* g_standard_font; + extern ImFont* g_medium_font; + extern ImFont* g_large_font; + + extern float g_layout_scale; + extern float g_layout_padding_left; + extern float g_layout_padding_top; + + extern ImVec4 UIBackgroundColor; + extern ImVec4 UIBackgroundTextColor; + extern ImVec4 UIBackgroundLineColor; + extern ImVec4 UIBackgroundHighlightColor; + extern ImVec4 UIDisabledColor; + extern ImVec4 UIPrimaryColor; + extern ImVec4 UIPrimaryLightColor; + extern ImVec4 UIPrimaryDarkColor; + extern ImVec4 UIPrimaryTextColor; + extern ImVec4 UITextHighlightColor; + extern ImVec4 UIPrimaryLineColor; + extern ImVec4 UISecondaryColor; + extern ImVec4 UISecondaryLightColor; + extern ImVec4 UISecondaryDarkColor; + extern ImVec4 UISecondaryTextColor; + + static __fi float DPIScale(float v) { return ImGui::GetIO().DisplayFramebufferScale.x * v; } + + static __fi float DPIScale(int v) { return ImGui::GetIO().DisplayFramebufferScale.x * static_cast(v); } + + static __fi ImVec2 DPIScale(const ImVec2& v) + { + const ImVec2& fbs = ImGui::GetIO().DisplayFramebufferScale; + return ImVec2(v.x * fbs.x, v.y * fbs.y); + } + + static __fi float WindowWidthScale(float v) { return ImGui::GetWindowWidth() * v; } + + static __fi float WindowHeightScale(float v) { return ImGui::GetWindowHeight() * v; } + + static __fi float LayoutScale(float v) { return g_layout_scale * v; } + + static __fi ImVec2 LayoutScale(const ImVec2& v) { return ImVec2(v.x * g_layout_scale, v.y * g_layout_scale); } + + static __fi ImVec2 LayoutScale(float x, float y) { return ImVec2(x * g_layout_scale, y * g_layout_scale); } + + static __fi ImVec2 LayoutScaleAndOffset(float x, float y) + { + return ImVec2(g_layout_padding_left + x * g_layout_scale, g_layout_padding_top + y * g_layout_scale); + } + + static __fi ImVec4 ModAlpha(const ImVec4& v, float a) { return ImVec4(v.x, v.y, v.z, a); } + static __fi ImVec4 MulAlpha(const ImVec4& v, float a) { return ImVec4(v.x, v.y, v.z, v.w * a); } + + static __fi std::string_view RemoveHash(const std::string_view& s) + { + const std::string_view::size_type pos = s.find('#'); + return (pos != std::string_view::npos) ? s.substr(0, pos) : s; + } + + /// Centers an image within the specified bounds, scaling up or down as needed. + ImRect CenterImage(const ImVec2& fit_size, const ImVec2& image_size); + ImRect CenterImage(const ImRect& fit_rect, const ImVec2& image_size); + + /// Initializes, setting up any state. + bool Initialize(const char* placeholder_image_path); + + void SetTheme(bool light); + void SetFonts(ImFont* standard_font, ImFont* medium_font, ImFont* large_font); + bool UpdateLayoutScale(); + + /// Shuts down, optionally clearing all state (including notifications). + void Shutdown(bool clear_state); + + /// Texture cache. + const std::shared_ptr& GetPlaceholderTexture(); + std::shared_ptr LoadTexture(const char* path); + HostDisplayTexture* GetCachedTexture(const char* name); + HostDisplayTexture* GetCachedTextureAsync(const char* name); + bool InvalidateCachedTexture(const std::string& path); + void UploadAsyncTextures(); + + void BeginLayout(); + void EndLayout(); + + void PushResetLayout(); + void PopResetLayout(); + + void QueueResetFocus(); + bool ResetFocusHere(); + bool WantsToCloseMenu(); + void ResetCloseMenuIfNeeded(); + + void PushPrimaryColor(); + void PopPrimaryColor(); + void PushSecondaryColor(); + void PopSecondaryColor(); + + void DrawWindowTitle(const char* title); + + bool BeginFullscreenColumns(const char* title = nullptr, float pos_y = 0.0f, bool expand_to_screen_width = false); + void EndFullscreenColumns(); + + bool BeginFullscreenColumnWindow(float start, float end, const char* name, const ImVec4& background = UIBackgroundColor); + void EndFullscreenColumnWindow(); + + bool BeginFullscreenWindow(float left, float top, float width, float height, const char* name, + const ImVec4& background = HEX_TO_IMVEC4(0x212121, 0xFF), float rounding = 0.0f, float padding = 0.0f, ImGuiWindowFlags flags = 0); + bool BeginFullscreenWindow(const ImVec2& position, const ImVec2& size, const char* name, + const ImVec4& background = HEX_TO_IMVEC4(0x212121, 0xFF), float rounding = 0.0f, float padding = 0.0f, ImGuiWindowFlags flags = 0); + void EndFullscreenWindow(); + + void BeginMenuButtons(u32 num_items = 0, float y_align = 0.0f, float x_padding = LAYOUT_MENU_BUTTON_X_PADDING, + float y_padding = LAYOUT_MENU_BUTTON_Y_PADDING, float item_height = LAYOUT_MENU_BUTTON_HEIGHT); + void EndMenuButtons(); + bool MenuButtonFrame(const char* str_id, bool enabled, float height, bool* visible, bool* hovered, ImVec2* min, ImVec2* max, + ImGuiButtonFlags flags = 0, float hover_alpha = 1.0f); + void MenuHeading(const char* title, bool draw_line = true); + bool MenuHeadingButton(const char* title, const char* value = nullptr, bool enabled = true, bool draw_line = true); + bool ActiveButton(const char* title, bool is_active, bool enabled = true, float height = LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, + ImFont* font = g_large_font); + bool MenuButton(const char* title, const char* summary, bool enabled = true, float height = LAYOUT_MENU_BUTTON_HEIGHT, + ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + bool MenuButtonWithoutSummary(const char* title, bool enabled = true, float height = LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, + ImFont* font = g_large_font, const ImVec2& text_align = ImVec2(0.0f, 0.0f)); + bool MenuButtonWithValue(const char* title, const char* summary, const char* value, bool enabled = true, + float height = LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + bool MenuImageButton(const char* title, const char* summary, ImTextureID user_texture_id, const ImVec2& image_size, bool enabled = true, + float height = LAYOUT_MENU_BUTTON_HEIGHT, const ImVec2& uv0 = ImVec2(0.0f, 0.0f), const ImVec2& uv1 = ImVec2(1.0f, 1.0f), + ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + bool FloatingButton(const char* text, float x, float y, float width = -1.0f, float height = LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, + float anchor_x = 0.0f, float anchor_y = 0.0f, bool enabled = true, ImFont* font = g_large_font, ImVec2* out_position = nullptr, + bool repeat_button = false); + bool ToggleButton(const char* title, const char* summary, bool* v, bool enabled = true, float height = LAYOUT_MENU_BUTTON_HEIGHT, + ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + bool ThreeWayToggleButton(const char* title, const char* summary, std::optional* v, bool enabled = true, + float height = LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + bool RangeButton(const char* title, const char* summary, s32* value, s32 min, s32 max, s32 increment, const char* format = "%d", + bool enabled = true, float height = LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + bool RangeButton(const char* title, const char* summary, float* value, float min, float max, float increment, const char* format = "%f", + bool enabled = true, float height = LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font); + bool EnumChoiceButtonImpl(const char* title, const char* summary, s32* value_pointer, + const char* (*to_display_name_function)(s32 value, void* opaque), void* opaque, u32 count, bool enabled, float height, ImFont* font, + ImFont* summary_font); + + template + static __fi bool EnumChoiceButton(const char* title, const char* summary, DataType* value_pointer, + const char* (*to_display_name_function)(DataType value), CountType count, bool enabled = true, + float height = LAYOUT_MENU_BUTTON_HEIGHT, ImFont* font = g_large_font, ImFont* summary_font = g_medium_font) + { + s32 value = static_cast(*value_pointer); + auto to_display_name_wrapper = [](s32 value, void* opaque) -> const char* { + return (*static_cast(opaque))(static_cast(value)); + }; + + if (EnumChoiceButtonImpl(title, summary, &value, to_display_name_wrapper, &to_display_name_function, static_cast(count), + enabled, height, font, summary_font)) + { + *value_pointer = static_cast(value); + return true; + } + else + { + return false; + } + } + + void BeginNavBar(float x_padding = LAYOUT_MENU_BUTTON_X_PADDING, float y_padding = LAYOUT_MENU_BUTTON_Y_PADDING); + void EndNavBar(); + void NavTitle(const char* title, float height = LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, ImFont* font = g_large_font); + void RightAlignNavButtons(u32 num_items = 0, float item_width = LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, + float item_height = LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY); + bool NavButton(const char* title, bool is_active, bool enabled = true, float width = -1.0f, + float height = LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY, ImFont* font = g_large_font); + + using FileSelectorCallback = std::function; + using FileSelectorFilters = std::vector; + bool IsFileSelectorOpen(); + void OpenFileSelector(const char* title, bool select_directory, FileSelectorCallback callback, + FileSelectorFilters filters = FileSelectorFilters(), std::string initial_directory = std::string()); + void CloseFileSelector(); + + using ChoiceDialogCallback = std::function; + using ChoiceDialogOptions = std::vector>; + bool IsChoiceDialogOpen(); + void OpenChoiceDialog(const char* title, bool checkable, ChoiceDialogOptions options, ChoiceDialogCallback callback); + void CloseChoiceDialog(); + + using InputStringDialogCallback = std::function; + bool IsInputDialogOpen(); + void OpenInputStringDialog( + std::string title, std::string message, std::string caption, std::string ok_button_text, InputStringDialogCallback callback); + void CloseInputDialog(); + + using ConfirmMessageDialogCallback = std::function; + using InfoMessageDialogCallback = std::function; + using MessageDialogCallback = std::function; + bool IsMessageBoxDialogOpen(); + void OpenConfirmMessageDialog(std::string title, std::string message, ConfirmMessageDialogCallback callback, + std::string yes_button_text = ICON_FA_CHECK " Yes", std::string no_button_text = ICON_FA_TIMES " No"); + void OpenInfoMessageDialog(std::string title, std::string message, InfoMessageDialogCallback callback = {}, + std::string button_text = ICON_FA_WINDOW_CLOSE " Close"); + void OpenMessageDialog(std::string title, std::string message, MessageDialogCallback callback, std::string first_button_text, + std::string second_button_text, std::string third_button_text); + void CloseMessageDialog(); + + float GetNotificationVerticalPosition(); + float GetNotificationVerticalDirection(); + void SetNotificationVerticalPosition(float position, float direction); + + void OpenBackgroundProgressDialog(const char* str_id, std::string message, s32 min, s32 max, s32 value); + void UpdateBackgroundProgressDialog(const char* str_id, std::string message, s32 min, s32 max, s32 value); + void CloseBackgroundProgressDialog(const char* str_id); + + void AddNotification(float duration, std::string title, std::string text, std::string image_path); + void ClearNotifications(); + + void ShowToast(std::string title, std::string message, float duration = 10.0f); + void ClearToast(); +} // namespace ImGuiFullscreen diff --git a/pcsx2/Frontend/ImGuiManager.cpp b/pcsx2/Frontend/ImGuiManager.cpp index b58fcbeb90..384a4fcb9f 100644 --- a/pcsx2/Frontend/ImGuiManager.cpp +++ b/pcsx2/Frontend/ImGuiManager.cpp @@ -34,7 +34,7 @@ #include "Config.h" #include "Counters.h" #include "Frontend/ImGuiManager.h" -#include "Frontend/InputManager.h" +#include "Frontend/ImGuiOverlays.h" #include "GS.h" #include "GS/GS.h" #include "Host.h" @@ -43,8 +43,12 @@ #include "PerformanceMetrics.h" #ifdef PCSX2_CORE +#include "Frontend/FullscreenUI.h" +#include "Frontend/ImGuiFullscreen.h" +#include "Frontend/InputManager.h" #include "VMManager.h" #endif +#include namespace ImGuiManager { @@ -52,20 +56,20 @@ namespace ImGuiManager static void SetKeyMap(); static bool LoadFontData(); static void UnloadFontData(); - static bool AddImGuiFonts(); + static bool AddImGuiFonts(bool fullscreen_fonts); static ImFont* AddTextFont(float size); static ImFont* AddFixedFont(float size); static bool AddIconFonts(float size); static void AcquirePendingOSDMessages(); static void DrawOSDMessages(); - static void FormatProcessorStat(std::string& text, double usage, double time); - static void DrawPerformanceOverlay(); } // namespace ImGuiManager static float s_global_scale = 1.0f; static ImFont* s_standard_font; static ImFont* s_fixed_font; +static ImFont* s_medium_font; +static ImFont* s_large_font; static std::vector s_standard_font_data; static std::vector s_fixed_font_data; @@ -77,9 +81,13 @@ static Common::Timer s_last_render_time; // cached copies of WantCaptureKeyboard/Mouse, used to know when to dispatch events static std::atomic_bool s_imgui_wants_keyboard{false}; static std::atomic_bool s_imgui_wants_mouse{false}; +static std::atomic_bool s_imgui_wants_text{false}; // mapping of host key -> imgui key static std::unordered_map s_imgui_key_map; + +// need to keep track of this, so we can reinitialize on renderer switch +static bool s_fullscreen_ui_was_initialized = false; #endif bool ImGuiManager::Initialize() @@ -90,8 +98,7 @@ bool ImGuiManager::Initialize() return false; } - HostDisplay* display = Host::GetHostDisplay(); - s_global_scale = std::max(1.0f, display->GetWindowScale() * static_cast(EmuConfig.GS.OsdScale / 100.0)); + s_global_scale = std::max(1.0f, g_host_display->GetWindowScale() * (EmuConfig.GS.OsdScale / 100.0f)); ImGui::CreateContext(); @@ -105,25 +112,32 @@ bool ImGuiManager::Initialize() #endif io.DisplayFramebufferScale = ImVec2(1, 1); // We already scale things ourselves, this would double-apply scaling - io.DisplaySize.x = static_cast(display->GetWindowWidth()); - io.DisplaySize.y = static_cast(display->GetWindowHeight()); + io.DisplaySize.x = static_cast(g_host_display->GetWindowWidth()); + io.DisplaySize.y = static_cast(g_host_display->GetWindowHeight()); SetKeyMap(); SetStyle(); - if (!display->CreateImGuiContext()) +#ifdef PCSX2_CORE + const bool add_fullscreen_fonts = s_fullscreen_ui_was_initialized; + pxAssertRel(!FullscreenUI::IsInitialized(), "Fullscreen UI is not initialized on ImGui init"); +#else + const bool add_fullscreen_fonts = false; +#endif + + if (!g_host_display->CreateImGuiContext()) { pxFailRel("Failed to create ImGui device context"); - display->DestroyImGuiContext(); + g_host_display->DestroyImGuiContext(); ImGui::DestroyContext(); UnloadFontData(); return false; } - if (!AddImGuiFonts() || !display->UpdateImGuiFontTexture()) + if (!AddImGuiFonts(add_fullscreen_fonts) || !g_host_display->UpdateImGuiFontTexture()) { pxFailRel("Failed to create ImGui font text"); - display->DestroyImGuiContext(); + g_host_display->DestroyImGuiContext(); ImGui::DestroyContext(); UnloadFontData(); return false; @@ -133,29 +147,53 @@ bool ImGuiManager::Initialize() ImGui::GetIO().Fonts->ClearTexData(); NewFrame(); + + // reinitialize fsui if it was previously enabled +#ifdef PCSX2_CORE + if (add_fullscreen_fonts) + InitializeFullscreenUI(); +#endif + return true; } -void ImGuiManager::Shutdown() +bool ImGuiManager::InitializeFullscreenUI() { - HostDisplay* display = Host::GetHostDisplay(); - if (display) - display->DestroyImGuiContext(); +#ifdef PCSX2_CORE + s_fullscreen_ui_was_initialized = FullscreenUI::Initialize(); + return s_fullscreen_ui_was_initialized; +#else + return false; +#endif +} + +void ImGuiManager::Shutdown(bool clear_state) +{ +#ifdef PCSX2_CORE + FullscreenUI::Shutdown(clear_state); + ImGuiFullscreen::SetFonts(nullptr, nullptr, nullptr); + if (clear_state) + s_fullscreen_ui_was_initialized = false; +#endif + + if (g_host_display) + g_host_display->DestroyImGuiContext(); if (ImGui::GetCurrentContext()) ImGui::DestroyContext(); s_standard_font = nullptr; s_fixed_font = nullptr; + s_medium_font = nullptr; + s_large_font = nullptr; - UnloadFontData(); + if (clear_state) + UnloadFontData(); } void ImGuiManager::WindowResized() { - HostDisplay* display = Host::GetHostDisplay(); - - const u32 new_width = display ? display->GetWindowWidth() : 0; - const u32 new_height = display ? display->GetWindowHeight() : 0; + const u32 new_width = g_host_display ? g_host_display->GetWindowWidth() : 0; + const u32 new_height = g_host_display ? g_host_display->GetWindowHeight() : 0; ImGui::GetIO().DisplaySize = ImVec2(static_cast(new_width), static_cast(new_height)); @@ -168,27 +206,27 @@ void ImGuiManager::WindowResized() void ImGuiManager::UpdateScale() { - HostDisplay* display = Host::GetHostDisplay(); - const float window_scale = display ? display->GetWindowScale() : 1.0f; - const float scale = std::max(window_scale * static_cast(EmuConfig.GS.OsdScale / 100.0), 1.0f); + const float window_scale = g_host_display ? g_host_display->GetWindowScale() : 1.0f; + const float scale = std::max(window_scale * (EmuConfig.GS.OsdScale / 100.0f), 1.0f); +#ifdef PCSX2_CORE + if (scale == s_global_scale && (!HasFullscreenFonts() || !ImGuiFullscreen::UpdateLayoutScale())) + return; +#else if (scale == s_global_scale) return; +#endif // This is assumed to be called mid-frame. ImGui::EndFrame(); s_global_scale = scale; - - ImGui::GetStyle() = ImGuiStyle(); - ImGui::GetStyle().WindowMinSize = ImVec2(1.0f, 1.0f); SetStyle(); - ImGui::GetStyle().ScaleAllSizes(scale); - if (!AddImGuiFonts()) + if (!AddImGuiFonts(HasFullscreenFonts())) pxFailRel("Failed to create ImGui font text"); - if (!display->UpdateImGuiFontTexture()) + if (!g_host_display->UpdateImGuiFontTexture()) pxFailRel("Failed to recreate font texture after scale+resize"); NewFrame(); @@ -207,6 +245,16 @@ void ImGuiManager::NewFrame() ImGui::GetCurrentWindowRead()->Flags |= ImGuiWindowFlags_NoNavInputs; s_imgui_wants_keyboard.store(io.WantCaptureKeyboard, std::memory_order_relaxed); s_imgui_wants_mouse.store(io.WantCaptureMouse, std::memory_order_release); + + const bool want_text_input = io.WantTextInput; + if (s_imgui_wants_text.load(std::memory_order_relaxed) != want_text_input) + { + s_imgui_wants_text.store(want_text_input, std::memory_order_release); + if (want_text_input) + Host::BeginTextInput(); + else + Host::EndTextInput(); + } #endif } @@ -393,20 +441,22 @@ ImFont* ImGuiManager::AddFixedFont(float size) bool ImGuiManager::AddIconFonts(float size) { - static const ImWchar range_fa[] = {ICON_MIN_FA, ICON_MAX_FA, 0}; + // clang-format off + static constexpr ImWchar range_fa[] = { 0xf001,0xf002,0xf005,0xf005,0xf007,0xf007,0xf00c,0xf00e,0xf011,0xf011,0xf013,0xf013,0xf017,0xf017,0xf019,0xf019,0xf021,0xf021,0xf023,0xf023,0xf025,0xf025,0xf028,0xf028,0xf02d,0xf02e,0xf030,0xf030,0xf03a,0xf03a,0xf03d,0xf03d,0xf04a,0xf04c,0xf04e,0xf04e,0xf050,0xf050,0xf052,0xf052,0xf059,0xf059,0xf05e,0xf05e,0xf065,0xf065,0xf067,0xf067,0xf06a,0xf06a,0xf071,0xf071,0xf077,0xf078,0xf07b,0xf07c,0xf084,0xf085,0xf091,0xf091,0xf0a0,0xf0a0,0xf0ac,0xf0ad,0xf0b0,0xf0b0,0xf0c5,0xf0c5,0xf0c7,0xf0c9,0xf0cb,0xf0cb,0xf0d0,0xf0d0,0xf0dc,0xf0dc,0xf0e2,0xf0e2,0xf0eb,0xf0eb,0xf0f1,0xf0f1,0xf0f3,0xf0f3,0xf0fe,0xf0fe,0xf110,0xf110,0xf119,0xf119,0xf11b,0xf11c,0xf121,0xf121,0xf133,0xf133,0xf140,0xf140,0xf144,0xf144,0xf14a,0xf14a,0xf15b,0xf15b,0xf15d,0xf15d,0xf188,0xf188,0xf191,0xf192,0xf1c9,0xf1c9,0xf1dd,0xf1de,0xf1e6,0xf1e6,0xf1ea,0xf1eb,0xf1f8,0xf1f8,0xf1fc,0xf1fc,0xf242,0xf242,0xf245,0xf245,0xf26c,0xf26c,0xf279,0xf279,0xf2d0,0xf2d0,0xf2db,0xf2db,0xf2f2,0xf2f2,0xf2f5,0xf2f5,0xf302,0xf302,0xf3c1,0xf3c1,0xf3fd,0xf3fd,0xf410,0xf410,0xf466,0xf466,0xf479,0xf479,0xf500,0xf500,0xf517,0xf517,0xf51f,0xf51f,0xf543,0xf543,0xf545,0xf545,0xf547,0xf548,0xf552,0xf552,0xf5a2,0xf5a2,0xf65d,0xf65e,0xf6a9,0xf6a9,0xf756,0xf756,0xf7c2,0xf7c2,0xf807,0xf807,0xf815,0xf815,0xf818,0xf818,0xf84c,0xf84c,0xf8cc,0xf8cc,0xf8d9,0xf8d9,0x0,0x0 }; + // clang-format on ImFontConfig cfg; cfg.MergeMode = true; cfg.PixelSnapH = true; - cfg.GlyphMinAdvanceX = size * 0.75f; - cfg.GlyphMaxAdvanceX = size * 0.75f; + cfg.GlyphMinAdvanceX = size; + cfg.GlyphMaxAdvanceX = size; cfg.FontDataOwnedByAtlas = false; return (ImGui::GetIO().Fonts->AddFontFromMemoryTTF( s_icon_font_data.data(), static_cast(s_icon_font_data.size()), size * 0.75f, &cfg, range_fa) != nullptr); } -bool ImGuiManager::AddImGuiFonts() +bool ImGuiManager::AddImGuiFonts(bool fullscreen_fonts) { const float standard_font_size = std::ceil(15.0f * s_global_scale); @@ -421,9 +471,56 @@ bool ImGuiManager::AddImGuiFonts() if (!s_fixed_font) return false; +#ifdef PCSX2_CORE + if (fullscreen_fonts) + { + const float medium_font_size = std::ceil(ImGuiFullscreen::LayoutScale(ImGuiFullscreen::LAYOUT_MEDIUM_FONT_SIZE)); + s_medium_font = AddTextFont(medium_font_size); + if (!s_medium_font || !AddIconFonts(medium_font_size)) + return false; + + const float large_font_size = std::ceil(ImGuiFullscreen::LayoutScale(ImGuiFullscreen::LAYOUT_LARGE_FONT_SIZE)); + s_large_font = AddTextFont(large_font_size); + if (!s_large_font || !AddIconFonts(large_font_size)) + return false; + } + else + { + s_medium_font = nullptr; + s_large_font = nullptr; + } + + ImGuiFullscreen::SetFonts(s_standard_font, s_medium_font, s_large_font); +#endif + return io.Fonts->Build(); } +bool ImGuiManager::AddFullscreenFontsIfMissing() +{ + if (HasFullscreenFonts()) + return true; + + // can't do this in the middle of a frame + ImGui::EndFrame(); + + if (!AddImGuiFonts(true)) + { + Console.Error("Failed to lazily allocate fullscreen fonts."); + AddImGuiFonts(false); + } + + g_host_display->UpdateImGuiFontTexture(); + NewFrame(); + + return HasFullscreenFonts(); +} + +bool ImGuiManager::HasFullscreenFonts() +{ + return (s_medium_font && s_large_font); +} + struct OSDMessage { std::string key; @@ -453,6 +550,18 @@ void Host::AddKeyedOSDMessage(std::string key, std::string message, float durati s_osd_posted_messages.push_back(std::move(msg)); } +void Host::AddIconOSDMessage(std::string key, const char* icon, const std::string_view& message, float duration /* = 2.0f */) +{ + OSDMessage msg; + msg.key = std::move(key); + msg.text = fmt::format("{} {}", icon, message); + msg.duration = duration; + msg.time = std::chrono::steady_clock::now(); + + std::unique_lock lock(s_osd_messages_lock); + s_osd_posted_messages.push_back(std::move(msg)); +} + void Host::AddFormattedOSDMessage(float duration, const char* format, ...) { std::va_list ap; @@ -579,185 +688,18 @@ void ImGuiManager::DrawOSDMessages() } } -void ImGuiManager::FormatProcessorStat(std::string& text, double usage, double time) -{ - // Some values, such as GPU (and even CPU to some extent) can be out of phase with the wall clock, - // which the processor time is divided by to get a utilization percentage. Let's clamp it at 100%, - // so that people don't get confused, and remove the decimal places when it's there while we're at it. - if (usage >= 99.95) - fmt::format_to(std::back_inserter(text), "100% ({:.2f}ms)", time); - else - fmt::format_to(std::back_inserter(text), "{:.1f}% ({:.2f}ms)", usage, time); -} - -void ImGuiManager::DrawPerformanceOverlay() -{ - const float scale = s_global_scale; - const float shadow_offset = std::ceil(1.0f * scale); - const float margin = std::ceil(10.0f * scale); - const float spacing = std::ceil(5.0f * scale); - float position_y = margin; - - ImDrawList* dl = ImGui::GetBackgroundDrawList(); - std::string text; - ImVec2 text_size; - bool first = true; - - text.reserve(128); - -#define DRAW_LINE(font, text, color) \ - do \ - { \ - text_size = font->CalcTextSizeA(font->FontSize, std::numeric_limits::max(), -1.0f, (text), nullptr, nullptr); \ - dl->AddText(font, font->FontSize, \ - ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x + shadow_offset, position_y + shadow_offset), \ - IM_COL32(0, 0, 0, 100), (text)); \ - dl->AddText(font, font->FontSize, ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x, position_y), color, (text)); \ - position_y += text_size.y + spacing; \ - } while (0) - -#ifdef PCSX2_CORE - const bool paused = (VMManager::GetState() == VMState::Paused); -#else - constexpr bool paused = false; -#endif - - if (!paused) - { - const float speed = PerformanceMetrics::GetSpeed(); - if (GSConfig.OsdShowFPS) - { - switch (PerformanceMetrics::GetInternalFPSMethod()) - { - case PerformanceMetrics::InternalFPSMethod::GSPrivilegedRegister: - fmt::format_to(std::back_inserter(text), "G: {:.2f} [P] | V: {:.2f}", PerformanceMetrics::GetInternalFPS(), - PerformanceMetrics::GetFPS()); - break; - - case PerformanceMetrics::InternalFPSMethod::DISPFBBlit: - fmt::format_to(std::back_inserter(text), "G: {:.2f} [B] | V: {:.2f}", PerformanceMetrics::GetInternalFPS(), - PerformanceMetrics::GetFPS()); - break; - - case PerformanceMetrics::InternalFPSMethod::None: - default: - fmt::format_to(std::back_inserter(text), "V: {:.2f}", PerformanceMetrics::GetFPS()); - break; - } - first = false; - } - if (GSConfig.OsdShowSpeed) - { - fmt::format_to(std::back_inserter(text), "{}{}%", first ? "" : " | ", static_cast(std::round(speed))); - - // We read the main config here, since MTGS doesn't get updated with speed toggles. - if (EmuConfig.GS.LimitScalar == 0.0) - text += " (Max)"; - else - fmt::format_to(std::back_inserter(text), " ({:.0f}%)", EmuConfig.GS.LimitScalar * 100.0); - - first = false; - } - if (!text.empty()) - { - ImU32 color; - if (speed < 95.0f) - color = IM_COL32(255, 100, 100, 255); - else if (speed > 105.0f) - color = IM_COL32(100, 255, 100, 255); - else - color = IM_COL32(255, 255, 255, 255); - - DRAW_LINE(s_fixed_font, text.c_str(), color); - } - - if (GSConfig.OsdShowGSStats) - { - std::string gs_stats; - GSgetStats(gs_stats); - DRAW_LINE(s_fixed_font, gs_stats.c_str(), IM_COL32(255, 255, 255, 255)); - } - - if (GSConfig.OsdShowResolution) - { - int width, height; - GSgetInternalResolution(&width, &height); - - text.clear(); - fmt::format_to(std::back_inserter(text), "{}x{} {} {}", width, height, ReportVideoMode(), ReportInterlaceMode()); - DRAW_LINE(s_fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); - } - - if (GSConfig.OsdShowCPU) - { - text.clear(); - fmt::format_to(std::back_inserter(text), "{:.2f}ms ({:.2f}ms worst)", PerformanceMetrics::GetAverageFrameTime(), - PerformanceMetrics::GetWorstFrameTime()); - DRAW_LINE(s_fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); - - text.clear(); - if (EmuConfig.Speedhacks.EECycleRate != 0 || EmuConfig.Speedhacks.EECycleSkip != 0) - fmt::format_to(std::back_inserter(text), "EE[{}/{}]: ", EmuConfig.Speedhacks.EECycleRate, EmuConfig.Speedhacks.EECycleSkip); - else - text = "EE: "; - FormatProcessorStat(text, PerformanceMetrics::GetCPUThreadUsage(), PerformanceMetrics::GetCPUThreadAverageTime()); - DRAW_LINE(s_fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); - - text = "GS: "; - FormatProcessorStat(text, PerformanceMetrics::GetGSThreadUsage(), PerformanceMetrics::GetGSThreadAverageTime()); - DRAW_LINE(s_fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); - - const u32 gs_sw_threads = PerformanceMetrics::GetGSSWThreadCount(); - for (u32 i = 0; i < gs_sw_threads; i++) - { - text.clear(); - fmt::format_to(std::back_inserter(text), "SW-{}: ", i); - FormatProcessorStat(text, PerformanceMetrics::GetGSSWThreadUsage(i), PerformanceMetrics::GetGSSWThreadAverageTime(i)); - DRAW_LINE(s_fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); - } - - if (THREAD_VU1) - { - text = "VU: "; - FormatProcessorStat(text, PerformanceMetrics::GetVUThreadUsage(), PerformanceMetrics::GetVUThreadAverageTime()); - DRAW_LINE(s_fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); - } - } - - if (GSConfig.OsdShowGPU) - { - text = "GPU: "; - FormatProcessorStat(text, PerformanceMetrics::GetGPUUsage(), PerformanceMetrics::GetGPUAverageTime()); - DRAW_LINE(s_fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); - } - - if (GSConfig.OsdShowIndicators) - { - const bool is_normal_speed = (EmuConfig.GS.LimitScalar == EmuConfig.Framerate.NominalScalar); - if (!is_normal_speed) - { - const bool is_slowmo = (EmuConfig.GS.LimitScalar < EmuConfig.Framerate.NominalScalar); - DRAW_LINE(s_standard_font, is_slowmo ? ICON_FA_FORWARD : ICON_FA_FAST_FORWARD, IM_COL32(255, 255, 255, 255)); - } - } - } - else - { - if (GSConfig.OsdShowIndicators) - { - DRAW_LINE(s_standard_font, ICON_FA_PAUSE, IM_COL32(255, 255, 255, 255)); - } - } - -#undef DRAW_LINE -} - void ImGuiManager::RenderOSD() { // acquire for IO.MousePos. std::atomic_thread_fence(std::memory_order_acquire); - DrawPerformanceOverlay(); +#ifdef PCSX2_CORE + // Don't draw OSD when we're just running big picture. + if (VMManager::HasValidVM()) + RenderOverlays(); +#else + RenderOverlays(); +#endif AcquirePendingOSDMessages(); DrawOSDMessages(); @@ -778,8 +720,41 @@ ImFont* ImGuiManager::GetFixedFont() return s_fixed_font; } +ImFont* ImGuiManager::GetMediumFont() +{ + AddFullscreenFontsIfMissing(); + return s_medium_font; +} + +ImFont* ImGuiManager::GetLargeFont() +{ + AddFullscreenFontsIfMissing(); + return s_large_font; +} + #ifdef PCSX2_CORE +bool ImGuiManager::WantsTextInput() +{ + return s_imgui_wants_text.load(std::memory_order_acquire); +} + +void ImGuiManager::AddTextInput(std::string str) +{ + if (!s_imgui_wants_text.load(std::memory_order_acquire)) + return; + + // Has to go through the CPU -> GS thread :( + Host::RunOnCPUThread([str = std::move(str)]() { + GetMTGS().RunOnGSThread([str = std::move(str)]() { + if (!ImGui::GetCurrentContext()) + return; + + ImGui::GetIO().AddInputCharactersUTF8(str.c_str()); + }); + }); +} + void ImGuiManager::UpdateMousePosition(float x, float y) { if (!ImGui::GetCurrentContext()) @@ -869,4 +844,4 @@ bool ImGuiManager::ProcessGenericInputEvent(GenericInputBinding key, float value return true; } -#endif // PCSX2_CORE \ No newline at end of file +#endif // PCSX2_CORE diff --git a/pcsx2/Frontend/ImGuiManager.h b/pcsx2/Frontend/ImGuiManager.h index 10d931cf8c..af1aa6e239 100644 --- a/pcsx2/Frontend/ImGuiManager.h +++ b/pcsx2/Frontend/ImGuiManager.h @@ -25,8 +25,11 @@ namespace ImGuiManager /// Initializes ImGui, creates fonts, etc. bool Initialize(); + /// Initializes fullscreen UI. + bool InitializeFullscreenUI(); + /// Frees all ImGui resources. - void Shutdown(); + void Shutdown(bool clear_state); /// Updates internal state when the window is size. void WindowResized(); @@ -43,13 +46,33 @@ namespace ImGuiManager /// Returns the scale of all on-screen elements. float GetGlobalScale(); + /// Returns true if fullscreen fonts are present. + bool HasFullscreenFonts(); + + /// Allocates/adds fullscreen fonts if they're not loaded. + bool AddFullscreenFontsIfMissing(); + /// Returns the standard font for external drawing. ImFont* GetStandardFont(); /// Returns the fixed-width font for external drawing. ImFont* GetFixedFont(); + /// Returns the medium font for external drawing, scaled by ImGuiFullscreen. + /// This font is allocated on demand. + ImFont* GetMediumFont(); + + /// Returns the large font for external drawing, scaled by ImGuiFullscreen. + /// This font is allocated on demand. + ImFont* GetLargeFont(); + #ifdef PCSX2_CORE + /// Returns true if imgui wants to intercept text input. + bool WantsTextInput(); + + /// Called on the UI or CPU thread in response to a key press. String is UTF-8. + void AddTextInput(std::string str); + /// Called on the UI or CPU thread in response to mouse movement. void UpdateMousePosition(float x, float y); @@ -70,3 +93,12 @@ namespace ImGuiManager #endif } // namespace ImGuiManager +namespace Host +{ + /// Called by ImGuiManager when the cursor enters a text field. The host may choose to open an on-screen + /// keyboard for devices without a physical keyboard. + void BeginTextInput(); + + /// Called by ImGuiManager when the cursor leaves a text field. + void EndTextInput(); +} \ No newline at end of file diff --git a/pcsx2/Frontend/ImGuiOverlays.cpp b/pcsx2/Frontend/ImGuiOverlays.cpp new file mode 100644 index 0000000000..7cfac469f6 --- /dev/null +++ b/pcsx2/Frontend/ImGuiOverlays.cpp @@ -0,0 +1,610 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "gsl/span" +#include "fmt/core.h" + +#include "common/Align.h" +#include "common/StringUtil.h" +#include "common/Timer.h" +#include "imgui.h" + +#include "Config.h" +#include "Counters.h" +#include "Frontend/ImGuiManager.h" +#include "Frontend/ImGuiOverlays.h" +#include "GS.h" +#include "GS/GS.h" +#include "GS/GSVector.h" +#include "Host.h" +#include "HostDisplay.h" +#include "IconsFontAwesome5.h" +#include "PerformanceMetrics.h" + +#ifdef PCSX2_CORE +#include "PAD/Host/PAD.h" +#include "PAD/Host/KeyStatus.h" +#include "Frontend/FullscreenUI.h" +#include "Frontend/ImGuiManager.h" +#include "Frontend/ImGuiFullscreen.h" +#include "Frontend/InputManager.h" +#include "VMManager.h" +#include "pcsx2/Recording/InputRecording.h" +#endif + +namespace ImGuiManager +{ + static void FormatProcessorStat(std::string& text, double usage, double time); + static void DrawPerformanceOverlay(); +#ifdef PCSX2_CORE + static void DrawSettingsOverlay(); + static void DrawInputsOverlay(); + static void DrawInputRecordingOverlay(); +#endif +} // namespace ImGuiManager + +static std::tuple GetMinMax(gsl::span values) +{ + GSVector4 vmin(GSVector4::load(values.data())); + GSVector4 vmax(vmin); + + const u32 count = static_cast(values.size()); + const u32 aligned_count = Common::AlignDownPow2(count, 4); + u32 i = 4; + for (; i < aligned_count; i += 4) + { + const GSVector4 v(GSVector4::load(&values[i])); + vmin = vmin.min(v); + vmax = vmax.max(v); + } + + float min = std::min(vmin.x, std::min(vmin.y, std::min(vmin.z, vmin.w))); + float max = std::max(vmax.x, std::max(vmax.y, std::max(vmax.z, vmax.w))); + for (; i < count; i++) + { + min = std::min(min, values[i]); + max = std::max(max, values[i]); + } + + return std::tie(min, max); +} + +void ImGuiManager::FormatProcessorStat(std::string& text, double usage, double time) +{ + // Some values, such as GPU (and even CPU to some extent) can be out of phase with the wall clock, + // which the processor time is divided by to get a utilization percentage. Let's clamp it at 100%, + // so that people don't get confused, and remove the decimal places when it's there while we're at it. + if (usage >= 99.95) + fmt::format_to(std::back_inserter(text), "100% ({:.2f}ms)", time); + else + fmt::format_to(std::back_inserter(text), "{:.1f}% ({:.2f}ms)", usage, time); +} + +void ImGuiManager::DrawPerformanceOverlay() +{ + const float scale = ImGuiManager::GetGlobalScale(); + const float shadow_offset = std::ceil(1.0f * scale); + const float margin = std::ceil(10.0f * scale); + const float spacing = std::ceil(5.0f * scale); + float position_y = margin; + + ImFont* const fixed_font = ImGuiManager::GetFixedFont(); + ImFont* const standard_font = ImGuiManager::GetStandardFont(); + + ImDrawList* dl = ImGui::GetBackgroundDrawList(); + std::string text; + ImVec2 text_size; + bool first = true; + + text.reserve(128); + +#define DRAW_LINE(font, text, color) \ + do \ + { \ + text_size = font->CalcTextSizeA(font->FontSize, std::numeric_limits::max(), -1.0f, (text), nullptr, nullptr); \ + dl->AddText(font, font->FontSize, \ + ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x + shadow_offset, position_y + shadow_offset), \ + IM_COL32(0, 0, 0, 100), (text)); \ + dl->AddText(font, font->FontSize, ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x, position_y), color, (text)); \ + position_y += text_size.y + spacing; \ + } while (0) + +#ifdef PCSX2_CORE + const bool paused = (VMManager::GetState() == VMState::Paused); + const bool fsui_active = FullscreenUI::HasActiveWindow(); +#else + const bool paused = false; + const bool fsui_active = false; +#endif + + if (!paused) + { + const float speed = PerformanceMetrics::GetSpeed(); + if (GSConfig.OsdShowFPS) + { + switch (PerformanceMetrics::GetInternalFPSMethod()) + { + case PerformanceMetrics::InternalFPSMethod::GSPrivilegedRegister: + fmt::format_to(std::back_inserter(text), "G: {:.2f} [P] | V: {:.2f}", PerformanceMetrics::GetInternalFPS(), + PerformanceMetrics::GetFPS()); + break; + + case PerformanceMetrics::InternalFPSMethod::DISPFBBlit: + fmt::format_to(std::back_inserter(text), "G: {:.2f} [B] | V: {:.2f}", PerformanceMetrics::GetInternalFPS(), + PerformanceMetrics::GetFPS()); + break; + + case PerformanceMetrics::InternalFPSMethod::None: + default: + fmt::format_to(std::back_inserter(text), "V: {:.2f}", PerformanceMetrics::GetFPS()); + break; + } + first = false; + } + if (GSConfig.OsdShowSpeed) + { + fmt::format_to(std::back_inserter(text), "{}{}%", first ? "" : " | ", static_cast(std::round(speed))); + + // We read the main config here, since MTGS doesn't get updated with speed toggles. + if (EmuConfig.GS.LimitScalar == 0.0f) + text += " (Max)"; + else + fmt::format_to(std::back_inserter(text), " ({:.0f}%)", EmuConfig.GS.LimitScalar * 100.0f); + } + if (!text.empty()) + { + ImU32 color; + if (speed < 95.0f) + color = IM_COL32(255, 100, 100, 255); + else if (speed > 105.0f) + color = IM_COL32(100, 255, 100, 255); + else + color = IM_COL32(255, 255, 255, 255); + + DRAW_LINE(fixed_font, text.c_str(), color); + } + + if (GSConfig.OsdShowGSStats) + { + std::string gs_stats; + GSgetStats(gs_stats); + DRAW_LINE(fixed_font, gs_stats.c_str(), IM_COL32(255, 255, 255, 255)); + } + + if (GSConfig.OsdShowResolution) + { + int width, height; + GSgetInternalResolution(&width, &height); + + text.clear(); + fmt::format_to(std::back_inserter(text), "{}x{} {} {}", width, height, ReportVideoMode(), ReportInterlaceMode()); + DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); + } + + if (GSConfig.OsdShowCPU) + { + text.clear(); + fmt::format_to(std::back_inserter(text), "{:.2f}ms ({:.2f}ms worst)", PerformanceMetrics::GetAverageFrameTime(), + PerformanceMetrics::GetWorstFrameTime()); + DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); + + text.clear(); + if (EmuConfig.Speedhacks.EECycleRate != 0 || EmuConfig.Speedhacks.EECycleSkip != 0) + fmt::format_to(std::back_inserter(text), "EE[{}/{}]: ", EmuConfig.Speedhacks.EECycleRate, EmuConfig.Speedhacks.EECycleSkip); + else + text = "EE: "; + FormatProcessorStat(text, PerformanceMetrics::GetCPUThreadUsage(), PerformanceMetrics::GetCPUThreadAverageTime()); + DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); + + text = "GS: "; + FormatProcessorStat(text, PerformanceMetrics::GetGSThreadUsage(), PerformanceMetrics::GetGSThreadAverageTime()); + DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); + + const u32 gs_sw_threads = PerformanceMetrics::GetGSSWThreadCount(); + for (u32 i = 0; i < gs_sw_threads; i++) + { + text.clear(); + fmt::format_to(std::back_inserter(text), "SW-{}: ", i); + FormatProcessorStat(text, PerformanceMetrics::GetGSSWThreadUsage(i), PerformanceMetrics::GetGSSWThreadAverageTime(i)); + DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); + } + + if (THREAD_VU1) + { + text = "VU: "; + FormatProcessorStat(text, PerformanceMetrics::GetVUThreadUsage(), PerformanceMetrics::GetVUThreadAverageTime()); + DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); + } + } + + if (GSConfig.OsdShowGPU) + { + text = "GPU: "; + FormatProcessorStat(text, PerformanceMetrics::GetGPUUsage(), PerformanceMetrics::GetGPUAverageTime()); + DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); + } + + if (GSConfig.OsdShowIndicators) + { + const bool is_normal_speed = (EmuConfig.GS.LimitScalar == EmuConfig.Framerate.NominalScalar); + if (!is_normal_speed) + { + const bool is_slowmo = (EmuConfig.GS.LimitScalar < EmuConfig.Framerate.NominalScalar); + DRAW_LINE(standard_font, is_slowmo ? ICON_FA_FORWARD : ICON_FA_FAST_FORWARD, IM_COL32(255, 255, 255, 255)); + } + } + +#ifdef PCSX2_CORE + if (GSConfig.OsdShowFrameTimes) + { + const ImVec2 history_size(200.0f * scale, 50.0f * scale); + ImGui::SetNextWindowSize(ImVec2(history_size.x, history_size.y)); + ImGui::SetNextWindowPos(ImVec2(ImGui::GetIO().DisplaySize.x - margin - history_size.x, position_y)); + ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.0f, 0.0f, 0.0f, 0.25f)); + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); + ImGui::PushStyleColor(ImGuiCol_PlotLines, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + ImGui::PushFont(fixed_font); + if (ImGui::Begin("##frame_times", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoInputs)) + { + auto [min, max] = GetMinMax(PerformanceMetrics::GetFrameTimeHistory()); + + // add a little bit of space either side, so we're not constantly resizing + if ((max - min) < 4.0f) + { + min = min - std::fmod(min, 1.0f); + max = max - std::fmod(max, 1.0f) + 1.0f; + min = std::max(min - 2.0f, 0.0f); + max += 2.0f; + } + + ImGui::PlotEx( + ImGuiPlotType_Lines, "##frame_times", + [](void*, int idx) -> float { + return PerformanceMetrics::GetFrameTimeHistory()[( + (PerformanceMetrics::GetFrameTimeHistoryPos() + idx) % PerformanceMetrics::NUM_FRAME_TIME_SAMPLES)]; + }, + nullptr, PerformanceMetrics::NUM_FRAME_TIME_SAMPLES, 0, nullptr, min, max, history_size); + + ImDrawList* win_dl = ImGui::GetCurrentWindow()->DrawList; + const ImVec2 wpos(ImGui::GetCurrentWindow()->Pos); + + text.clear(); + fmt::format_to(std::back_inserter(text), "{:.1f} ms", max); + text_size = fixed_font->CalcTextSizeA(fixed_font->FontSize, FLT_MAX, 0.0f, text.c_str(), text.c_str() + text.length()); + win_dl->AddText(ImVec2(wpos.x + history_size.x - text_size.x - spacing + shadow_offset, wpos.y + shadow_offset), + IM_COL32(0, 0, 0, 100), text.c_str(), text.c_str() + text.length()); + win_dl->AddText(ImVec2(wpos.x + history_size.x - text_size.x - spacing, wpos.y), IM_COL32(255, 255, 255, 255), text.c_str(), + text.c_str() + text.length()); + + text.clear(); + fmt::format_to(std::back_inserter(text), "{:.1f} ms", min); + text_size = fixed_font->CalcTextSizeA(fixed_font->FontSize, FLT_MAX, 0.0f, text.c_str(), text.c_str() + text.length()); + win_dl->AddText(ImVec2(wpos.x + history_size.x - text_size.x - spacing + shadow_offset, + wpos.y + history_size.y - fixed_font->FontSize + shadow_offset), + IM_COL32(0, 0, 0, 100), text.c_str(), text.c_str() + text.length()); + win_dl->AddText(ImVec2(wpos.x + history_size.x - text_size.x - spacing, wpos.y + history_size.y - fixed_font->FontSize), + IM_COL32(255, 255, 255, 255), text.c_str(), text.c_str() + text.length()); + } + ImGui::End(); + ImGui::PopFont(); + ImGui::PopStyleVar(5); + ImGui::PopStyleColor(3); + } +#endif + } + else if (!fsui_active) + { + if (GSConfig.OsdShowIndicators) + { + DRAW_LINE(standard_font, ICON_FA_PAUSE, IM_COL32(255, 255, 255, 255)); + } + } + +#undef DRAW_LINE +} + +#ifdef PCSX2_CORE + +void ImGuiManager::DrawSettingsOverlay() +{ + if (!GSConfig.OsdShowSettings || VMManager::GetState() != VMState::Running) + return; + + std::string text; + text.reserve(512); + +#define APPEND(...) \ + do \ + { \ + fmt::format_to(std::back_inserter(text), __VA_ARGS__); \ + } while (0) + + if (EmuConfig.Speedhacks.EECycleRate != 0) + APPEND("CR={} ", EmuConfig.Speedhacks.EECycleRate); + if (EmuConfig.Speedhacks.EECycleSkip != 0) + APPEND("CS={} ", EmuConfig.Speedhacks.EECycleSkip); + if (EmuConfig.Speedhacks.fastCDVD) + APPEND("FCDVD "); + if (EmuConfig.Speedhacks.vu1Instant) + APPEND("IVU "); + if (EmuConfig.Speedhacks.vuThread) + APPEND("MTVU "); + + APPEND("EER={} EEC={} VUR={} VUC={} VQS={} ", static_cast(EmuConfig.Cpu.sseMXCSR.GetRoundMode()), + EmuConfig.Cpu.Recompiler.GetEEClampMode(), static_cast(EmuConfig.Cpu.sseVUMXCSR.GetRoundMode()), + EmuConfig.Cpu.Recompiler.GetVUClampMode(), EmuConfig.GS.VsyncQueueSize); + + if (EmuConfig.EnableCheats || EmuConfig.EnableWideScreenPatches || EmuConfig.EnableNoInterlacingPatches) + { + APPEND("C={}{}{} ", EmuConfig.EnableCheats ? "C" : "", EmuConfig.EnableWideScreenPatches ? "W" : "", + EmuConfig.EnableNoInterlacingPatches ? "N" : ""); + } + + if (GSConfig.UseHardwareRenderer()) + { + if ((GSConfig.UpscaleMultiplier - std::floor(GSConfig.UpscaleMultiplier)) > 0.01) + APPEND("IR={:.2f} ", static_cast(GSConfig.UpscaleMultiplier)); + else + APPEND("IR={} ", static_cast(GSConfig.UpscaleMultiplier)); + + APPEND("B={} PL={} ", static_cast(GSConfig.AccurateBlendingUnit), static_cast(GSConfig.TexturePreloading)); + if (GSConfig.GPUPaletteConversion) + APPEND("PT "); + + if (GSConfig.HWDownloadMode != GSHardwareDownloadMode::Enabled) + APPEND("DL={} ", static_cast(GSConfig.HWDownloadMode)); + + if (GSConfig.HWMipmap != HWMipmapLevel::Automatic) + APPEND("MM={} ", static_cast(GSConfig.HWMipmap)); + + // deliberately test global and print local here for auto values + if (EmuConfig.GS.TextureFiltering != BiFiltering::PS2) + APPEND("BF={} ", static_cast(GSConfig.TextureFiltering)); + if (EmuConfig.GS.TriFilter != TriFiltering::Automatic) + APPEND("TF={} ", static_cast(GSConfig.TriFilter)); + if (GSConfig.MaxAnisotropy > 1) + APPEND("AF={} ", EmuConfig.GS.MaxAnisotropy); + if (GSConfig.Dithering != 2) + APPEND("DI={} ", GSConfig.Dithering); + if (EmuConfig.GS.CRCHack != CRCHackLevel::Automatic) + APPEND("CRC={} ", static_cast(EmuConfig.GS.CRCHack)); + if (GSConfig.UserHacks_HalfBottomOverride >= 0) + APPEND("HBO={} ", GSConfig.UserHacks_HalfBottomOverride); + if (GSConfig.UserHacks_HalfPixelOffset > 0) + APPEND("HPO={} ", GSConfig.UserHacks_HalfPixelOffset); + if (GSConfig.UserHacks_RoundSprite > 0) + APPEND("RS={} ", GSConfig.UserHacks_RoundSprite); + if (GSConfig.UserHacks_TCOffsetX != 0 || GSConfig.UserHacks_TCOffsetY != 0) + APPEND("TCO={}/{} ", GSConfig.UserHacks_TCOffsetX, GSConfig.UserHacks_TCOffsetY); + if (GSConfig.UserHacks_CPUSpriteRenderBW != 0) + APPEND("CSBW={} ", GSConfig.UserHacks_CPUSpriteRenderBW); + if (GSConfig.UserHacks_CPUCLUTRender != 0) + APPEND("CCD={} ", GSConfig.UserHacks_CPUCLUTRender); + if (GSConfig.SkipDrawStart != 0 || GSConfig.SkipDrawEnd != 0) + APPEND("SD={}/{} ", GSConfig.SkipDrawStart, GSConfig.SkipDrawEnd); + if (GSConfig.UserHacks_TextureInsideRt) + APPEND("TexRT "); + if (GSConfig.UserHacks_WildHack) + APPEND("WA "); + if (GSConfig.UserHacks_MergePPSprite) + APPEND("MS "); + if (GSConfig.UserHacks_AlignSpriteX) + APPEND("AS "); + if (GSConfig.UserHacks_AutoFlush) + APPEND("AF "); + if (GSConfig.UserHacks_CPUFBConversion) + APPEND("FBC "); + if(GSConfig.UserHacks_DisableDepthSupport) + APPEND("DDE "); + if (GSConfig.UserHacks_DisablePartialInvalidation) + APPEND("DPIV "); + if (GSConfig.UserHacks_DisableSafeFeatures) + APPEND("DSF "); + if (GSConfig.WrapGSMem) + APPEND("WGSM "); + if (GSConfig.PreloadFrameWithGSData) + APPEND("PLFD "); + } + +#undef APPEND + + if (text.empty()) + return; + else if (text.back() == ' ') + text.pop_back(); + + const float scale = ImGuiManager::GetGlobalScale(); + const float shadow_offset = 1.0f * scale; + const float margin = 10.0f * scale; + ImFont* font = ImGuiManager::GetFixedFont(); + const float position_y = ImGui::GetIO().DisplaySize.y - margin - font->FontSize; + + ImDrawList* dl = ImGui::GetBackgroundDrawList(); + ImVec2 text_size = + font->CalcTextSizeA(font->FontSize, std::numeric_limits::max(), -1.0f, text.c_str(), text.c_str() + text.length(), nullptr); + dl->AddText(font, font->FontSize, + ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x + shadow_offset, position_y + shadow_offset), IM_COL32(0, 0, 0, 100), + text.c_str(), text.c_str() + text.length()); + dl->AddText(font, font->FontSize, ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x, position_y), IM_COL32(255, 255, 255, 255), + text.c_str(), text.c_str() + text.length()); +} + +void ImGuiManager::DrawInputsOverlay() +{ + // Technically this is racing the CPU thread.. but it doesn't really matter, at worst, the inputs get displayed onscreen late. + if (!GSConfig.OsdShowInputs || VMManager::GetState() != VMState::Running) + return; + + const float scale = ImGuiManager::GetGlobalScale(); + const float shadow_offset = 1.0f * scale; + const float margin = 10.0f * scale; + const float spacing = 5.0f * scale; + ImFont* font = ImGuiManager::GetFixedFont(); + + static constexpr u32 text_color = IM_COL32(0xff, 0xff, 0xff, 255); + static constexpr u32 shadow_color = IM_COL32(0x00, 0x00, 0x00, 100); + + const ImVec2& display_size = ImGui::GetIO().DisplaySize; + ImDrawList* dl = ImGui::GetBackgroundDrawList(); + + u32 num_ports = 0; + for (u32 port = 0; port < PAD::NUM_CONTROLLER_PORTS; port++) + { + const PAD::ControllerType ctype = g_key_status.GetType(port); + if (ctype != PAD::ControllerType::NotConnected) + num_ports++; + } + + float current_x = margin; + float current_y = display_size.y - margin - ((static_cast(num_ports) * (font->FontSize + spacing)) - spacing); + + const ImVec4 clip_rect(current_x, current_y, display_size.x - margin, display_size.y - margin); + + std::string text; + text.reserve(256); + + for (u32 port = 0; port < PAD::NUM_CONTROLLER_PORTS; port++) + { + const PAD::ControllerType ctype = g_key_status.GetType(port); + if (ctype == PAD::ControllerType::NotConnected) + continue; + + const PAD::ControllerInfo* cinfo = PAD::GetControllerInfo(ctype); + if (!cinfo) + continue; + + text.clear(); + fmt::format_to(std::back_inserter(text), "P{} |", port + 1u); + + for (u32 bind = 0; bind < cinfo->num_bindings; bind++) + { + const PAD::ControllerBindingInfo& bi = cinfo->bindings[bind]; + switch (bi.type) + { + case PAD::ControllerBindingType::Axis: + case PAD::ControllerBindingType::HalfAxis: + { + // axes are always shown + const float value = static_cast(g_key_status.GetRawPressure(port, bind)) * (1.0f / 255.0f); + if (value >= (254.0f / 255.0f)) + fmt::format_to(std::back_inserter(text), " {}", bi.name); + else if (value > (1.0f / 255.0f)) + fmt::format_to(std::back_inserter(text), " {}: {:.2f}", bi.name, value); + } + break; + + case PAD::ControllerBindingType::Button: + { + // buttons only shown when active + const float value = static_cast(g_key_status.GetRawPressure(port, bind)) * (1.0f / 255.0f); + if (value >= 0.5f) + fmt::format_to(std::back_inserter(text), " {}", bi.name); + } + break; + + case PAD::ControllerBindingType::Motor: + case PAD::ControllerBindingType::Macro: + case PAD::ControllerBindingType::Unknown: + default: + break; + } + } + + dl->AddText(font, font->FontSize, ImVec2(current_x + shadow_offset, current_y + shadow_offset), shadow_color, text.c_str(), + text.c_str() + text.length(), 0.0f, &clip_rect); + dl->AddText( + font, font->FontSize, ImVec2(current_x, current_y), text_color, text.c_str(), text.c_str() + text.length(), 0.0f, &clip_rect); + + current_y += font->FontSize + spacing; + } +} + +#endif + +#ifdef PCSX2_CORE +void ImGuiManager::DrawInputRecordingOverlay() +{ + const float scale = ImGuiManager::GetGlobalScale(); + const float shadow_offset = std::ceil(1.0f * scale); + const float margin = std::ceil(10.0f * scale); + const float spacing = std::ceil(5.0f * scale); + float position_y = margin; + + ImFont* const fixed_font = ImGuiManager::GetFixedFont(); + ImFont* const standard_font = ImGuiManager::GetStandardFont(); + + ImDrawList* dl = ImGui::GetBackgroundDrawList(); + std::string text; + ImVec2 text_size; + + text.reserve(128); +#define DRAW_LINE(font, text, color) \ + do \ + { \ + text_size = font->CalcTextSizeA(font->FontSize, std::numeric_limits::max(), -1.0f, (text), nullptr, nullptr); \ + dl->AddText(font, font->FontSize, \ + ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x + shadow_offset, position_y + shadow_offset), \ + IM_COL32(0, 0, 0, 100), (text)); \ + dl->AddText(font, font->FontSize, ImVec2(ImGui::GetIO().DisplaySize.x - margin - text_size.x, position_y), color, (text)); \ + position_y += text_size.y + spacing; \ + } while (0) + // TODO - icon list that would be nice to add + // - 'video' when screen capturing + if (g_InputRecording.isActive()) + { + // Status Indicators + if (g_InputRecording.getControls().isRecording()) + { + DRAW_LINE(standard_font, fmt::format("{} Recording", ICON_FA_RECORD_VINYL).c_str(), IM_COL32(255, 0, 0, 255)); + } + else + { + DRAW_LINE(standard_font, fmt::format("{} Replaying", ICON_FA_PLAY).c_str(), IM_COL32(97, 240, 84, 255)); + } + + // Input Recording Metadata + DRAW_LINE(fixed_font, fmt::format("Input Recording Active: {}", g_InputRecording.getData().getFilename()).c_str(), IM_COL32(117, 255, 241, 255)); + DRAW_LINE(fixed_font, fmt::format("Frame: {}/{} ({})", g_InputRecording.getFrameCounter() + 1, g_InputRecording.getData().getTotalFrames(), g_FrameCount).c_str(), IM_COL32(117, 255, 241, 255)); + DRAW_LINE(fixed_font, fmt::format("Undo Count: {}", g_InputRecording.getData().getUndoCount()).c_str(), IM_COL32(117, 255, 241, 255)); + } + +#undef DRAW_LINE +} +#endif + +void ImGuiManager::RenderOverlays() +{ + DrawPerformanceOverlay(); +#ifdef PCSX2_CORE + DrawInputRecordingOverlay(); + DrawSettingsOverlay(); + DrawInputsOverlay(); +#endif +} diff --git a/pcsx2-qt/Settings/AdvancedSystemSettingsWidget.h b/pcsx2/Frontend/ImGuiOverlays.h similarity index 69% rename from pcsx2-qt/Settings/AdvancedSystemSettingsWidget.h rename to pcsx2/Frontend/ImGuiOverlays.h index 63a494ae2b..39736d3e59 100644 --- a/pcsx2-qt/Settings/AdvancedSystemSettingsWidget.h +++ b/pcsx2/Frontend/ImGuiOverlays.h @@ -15,20 +15,11 @@ #pragma once -#include +#pragma once -#include "ui_AdvancedSystemSettingsWidget.h" +#include "ImGuiManager.h" -class SettingsDialog; - -class AdvancedSystemSettingsWidget : public QWidget +namespace ImGuiManager { - Q_OBJECT - -public: - AdvancedSystemSettingsWidget(SettingsDialog* dialog, QWidget* parent); - ~AdvancedSystemSettingsWidget(); - -private: - Ui::AdvancedSystemSettingsWidget m_ui; -}; + void RenderOverlays(); +} diff --git a/pcsx2/Frontend/InputManager.cpp b/pcsx2/Frontend/InputManager.cpp index ab135f423b..df49f5718e 100644 --- a/pcsx2/Frontend/InputManager.cpp +++ b/pcsx2/Frontend/InputManager.cpp @@ -99,6 +99,7 @@ namespace InputManager static std::vector SplitChord(const std::string_view& binding); static bool SplitBinding(const std::string_view& binding, std::string_view* source, std::string_view* sub_binding); + static void AddBinding(const std::string_view& binding, const InputEventHandler& handler); static void AddBindings(const std::vector& bindings, const InputEventHandler& handler); static bool ParseBindingAndGetSource(const std::string_view& binding, InputBindingKey* key, InputSource** source); @@ -111,6 +112,9 @@ namespace InputManager static bool DoEventHook(InputBindingKey key, float value); static bool PreprocessEvent(InputBindingKey key, float value, GenericInputBinding generic_key); + + template + static void UpdateInputSourceState(SettingsInterface& si, std::unique_lock& settings_lock, InputSourceType type); } // namespace InputManager // ------------------------------------------------------------------------ @@ -134,7 +138,7 @@ static std::array, static_cast(InputSourceType // ------------------------------------------------------------------------ // Hotkeys // ------------------------------------------------------------------------ -static const HotkeyInfo* const s_hotkey_list[] = {g_vm_manager_hotkeys, g_gs_hotkeys, g_host_hotkeys}; +static const HotkeyInfo* const s_hotkey_list[] = {g_common_hotkeys, g_gs_hotkeys, g_host_hotkeys}; // ------------------------------------------------------------------------ // Tracking host mouse movement and turning into relative events @@ -275,7 +279,8 @@ std::string InputManager::ConvertInputBindingKeyToString(InputBindingKey key) } else if (key.source_subtype == InputSubclass::PointerAxis) { - return fmt::format("Pointer-{}/{}{:c}", u32{key.source_index}, s_pointer_axis_names[key.data], key.negative ? '-' : '+'); + return fmt::format("Pointer-{}/{}{:c}", u32{key.source_index}, s_pointer_axis_names[key.data], + key.modifier == InputModifier::Negate ? '-' : '+'); } } else if (key.source_type < InputSourceType::Count && s_input_sources[static_cast(key.source_type)]) @@ -304,48 +309,51 @@ std::string InputManager::ConvertInputBindingKeysToString(const InputBindingKey* return ss.str(); } -void InputManager::AddBindings(const std::vector& bindings, const InputEventHandler& handler) +void InputManager::AddBinding(const std::string_view& binding, const InputEventHandler& handler) { - for (const std::string& binding : bindings) + std::shared_ptr ibinding; + const std::vector chord_bindings(SplitChord(binding)); + + for (const std::string_view& chord_binding : chord_bindings) { - std::shared_ptr ibinding; - const std::vector chord_bindings(SplitChord(binding)); - - for (const std::string_view& chord_binding : chord_bindings) + std::optional key = ParseInputBindingKey(chord_binding); + if (!key.has_value()) { - std::optional key = ParseInputBindingKey(chord_binding); - if (!key.has_value()) - { - Console.WriteLn("Invalid binding: '%s'", binding.c_str()); - ibinding.reset(); - break; - } - - if (!ibinding) - { - ibinding = std::make_shared(); - ibinding->handler = handler; - } - - if (ibinding->num_keys == MAX_KEYS_PER_BINDING) - { - Console.WriteLn("Too many chord parts, max is %u (%s)", MAX_KEYS_PER_BINDING, binding.c_str()); - ibinding.reset(); - break; - } - - ibinding->keys[ibinding->num_keys] = key.value(); - ibinding->full_mask |= (static_cast(1) << ibinding->num_keys); - ibinding->num_keys++; + Console.WriteLn(fmt::format("Invalid binding: '{}'", binding)); + ibinding.reset(); + break; } if (!ibinding) - continue; + { + ibinding = std::make_shared(); + ibinding->handler = handler; + } - // plop it in the input map for all the keys - for (u32 i = 0; i < ibinding->num_keys; i++) - s_binding_map.emplace(ibinding->keys[i].MaskDirection(), ibinding); + if (ibinding->num_keys == MAX_KEYS_PER_BINDING) + { + Console.WriteLn(fmt::format("Too many chord parts, max is {} ({})", MAX_KEYS_PER_BINDING, binding)); + ibinding.reset(); + break; + } + + ibinding->keys[ibinding->num_keys] = key.value(); + ibinding->full_mask |= (static_cast(1) << ibinding->num_keys); + ibinding->num_keys++; } + + if (!ibinding) + return; + + // plop it in the input map for all the keys + for (u32 i = 0; i < ibinding->num_keys; i++) + s_binding_map.emplace(ibinding->keys[i].MaskDirection(), ibinding); +} + +void InputManager::AddBindings(const std::vector& bindings, const InputEventHandler& handler) +{ + for (const std::string& binding : bindings) + AddBinding(binding, handler); } // ------------------------------------------------------------------------ @@ -388,6 +396,7 @@ static std::array(InputSourceType::Count)> s_input "Keyboard", "Mouse", #ifdef _WIN32 + "DInput", "XInput", #endif #ifdef SDL_BUILD @@ -405,6 +414,37 @@ const char* InputManager::InputSourceToString(InputSourceType clazz) return s_input_class_names[static_cast(clazz)]; } +bool InputManager::GetInputSourceDefaultEnabled(InputSourceType type) +{ + switch (type) + { + case InputSourceType::Keyboard: + case InputSourceType::Pointer: + return true; + +#ifdef _WIN32 + case InputSourceType::DInput: + return false; + + case InputSourceType::XInput: + // Disable xinput by default if we have SDL. +#ifdef SDL_BUILD + return false; +#else + return true; +#endif +#endif + +#ifdef SDL_BUILD + case InputSourceType::SDL: + return true; +#endif + + default: + return false; + } +} + std::optional InputManager::ParseInputSourceString(const std::string_view& str) { for (u32 i = 0; i < static_cast(InputSourceType::Count); i++) @@ -461,9 +501,9 @@ std::optional InputManager::ParsePointerKey(const std::string_v const std::string_view dir_part(sub_binding.substr(std::strlen(s_pointer_axis_names[i]))); if (dir_part == "+") - key.negative = false; + key.modifier = InputModifier::None; else if (dir_part == "-") - key.negative = true; + key.modifier = InputModifier::Negate; else return std::nullopt; @@ -496,12 +536,6 @@ std::vector InputManager::GetHotkeyList() for (const HotkeyInfo* hotkey = hotkey_list; hotkey->name != nullptr; hotkey++) ret.push_back(hotkey); } - std::sort(ret.begin(), ret.end(), [](const HotkeyInfo* left, const HotkeyInfo* right) { - // category -> display name - if (const int res = StringUtil::Strcasecmp(left->category, right->category); res != 0) - return (res < 0); - return (StringUtil::Strcasecmp(left->display_name, right->display_name) < 0); - }); return ret; } @@ -537,8 +571,8 @@ void InputManager::AddPadBindings(SettingsInterface& si, u32 pad_index, const ch if (!bindings.empty()) { // we use axes for all pad bindings to simplify things, and because they are pressure sensitive - AddBindings(bindings, InputAxisEventHandler{[pad_index, bind_index, bind_names]( - float value) { PAD::SetControllerState(pad_index, bind_index, value); }}); + AddBindings(bindings, + InputAxisEventHandler{[pad_index, bind_index](float value) { PAD::SetControllerState(pad_index, bind_index, value); }}); } } } @@ -647,11 +681,24 @@ bool InputManager::InvokeEvents(InputBindingKey key, float value, GenericInputBi continue; const u8 bit = static_cast(1) << i; - const bool negative = binding->keys[i].negative; + const bool negative = binding->keys[i].modifier == InputModifier::Negate; const bool new_state = (negative ? (value < 0.0f) : (value > 0.0f)); - // invert if we're negative, since the handler expects 0..1 - const float value_to_pass = (negative ? ((value < 0.0f) ? -value : 0.0f) : (value > 0.0f) ? value : 0.0f); + float value_to_pass = 0.0f; + switch (binding->keys[i].modifier) + { + case InputModifier::None: + if (value > 0.0f) + value_to_pass = value; + break; + case InputModifier::Negate: + if (value < 0.0f) + value_to_pass = -value; + break; + case InputModifier::FullAxis: + value_to_pass = value * 0.5f + 0.5f; + break; + } // axes are fired regardless of a state change, unless they're zero // (but going from not-zero to zero will still fire, because of the full state) @@ -984,10 +1031,8 @@ void InputManager::ReloadBindings(SettingsInterface& si, SettingsInterface& bind { // From lilypad: 1 mouse pixel = 1/8th way down. const float default_scale = (axis <= static_cast(InputPointerAxis::Y)) ? 8.0f : 1.0f; - const float invert = - si.GetBoolValue("Pad", fmt::format("Pointer{}Invert", s_pointer_axis_names[axis]).c_str(), false) ? -1.0f : 1.0f; s_pointer_axis_scale[axis] = - invert / + 1.0f / std::max(si.GetFloatValue("Pad", fmt::format("Pointer{}Scale", s_pointer_axis_names[axis]).c_str(), default_scale), 1.0f); } } @@ -996,6 +1041,19 @@ void InputManager::ReloadBindings(SettingsInterface& si, SettingsInterface& bind // Source Management // ------------------------------------------------------------------------ +bool InputManager::ReloadDevices() +{ + bool changed = false; + + for (u32 i = FIRST_EXTERNAL_INPUT_SOURCE; i < LAST_EXTERNAL_INPUT_SOURCE; i++) + { + if (s_input_sources[i]) + changed |= s_input_sources[i]->ReloadDevices(); + } + + return changed; +} + void InputManager::CloseSources() { for (u32 i = FIRST_EXTERNAL_INPUT_SOURCE; i < LAST_EXTERNAL_INPUT_SOURCE; i++) @@ -1119,11 +1177,15 @@ GenericInputBindingMapping InputManager::GetGenericBindingMapping(const std::str return mapping; } -template -static void UpdateInputSourceState( - SettingsInterface& si, std::unique_lock& settings_lock, InputSourceType type, bool default_state) +bool InputManager::IsInputSourceEnabled(SettingsInterface& si, InputSourceType type) { - const bool enabled = si.GetBoolValue("InputSources", InputManager::InputSourceToString(type), default_state); + return si.GetBoolValue("InputSources", InputManager::InputSourceToString(type), InputManager::GetInputSourceDefaultEnabled(type)); +} + +template +void InputManager::UpdateInputSourceState(SettingsInterface& si, std::unique_lock& settings_lock, InputSourceType type) +{ + const bool enabled = IsInputSourceEnabled(si, type); if (enabled) { if (s_input_sources[static_cast(type)]) @@ -1135,7 +1197,7 @@ static void UpdateInputSourceState( std::unique_ptr source = std::make_unique(); if (!source->Initialize(si, settings_lock)) { - Console.Error("(InputManager) Source '%s' failed to initialize.", InputManager::InputSourceToString(type)); + Console.Error("(InputManager) Source '%s' failed to initialize.", InputSourceToString(type)); return; } @@ -1153,6 +1215,7 @@ static void UpdateInputSourceState( } #ifdef _WIN32 +#include "Frontend/DInputSource.h" #include "Frontend/XInputSource.h" #endif @@ -1163,9 +1226,10 @@ static void UpdateInputSourceState( void InputManager::ReloadSources(SettingsInterface& si, std::unique_lock& settings_lock) { #ifdef _WIN32 - UpdateInputSourceState(si, settings_lock, InputSourceType::XInput, false); + UpdateInputSourceState(si, settings_lock, InputSourceType::DInput); + UpdateInputSourceState(si, settings_lock, InputSourceType::XInput); #endif #ifdef SDL_BUILD - UpdateInputSourceState(si, settings_lock, InputSourceType::SDL, true); + UpdateInputSourceState(si, settings_lock, InputSourceType::SDL); #endif } diff --git a/pcsx2/Frontend/InputManager.h b/pcsx2/Frontend/InputManager.h index 0b9f721dbb..7043cdcf97 100644 --- a/pcsx2/Frontend/InputManager.h +++ b/pcsx2/Frontend/InputManager.h @@ -16,6 +16,7 @@ #pragma once #include +#include #include #include #include @@ -23,6 +24,7 @@ #include "common/Pcsx2Types.h" #include "common/SettingsInterface.h" +#include "common/WindowInfo.h" /// Class, or source of an input event. enum class InputSourceType : u32 @@ -30,7 +32,7 @@ enum class InputSourceType : u32 Keyboard, Pointer, #ifdef _WIN32 - //DInput, + DInput, XInput, #endif #ifdef SDL_BUILD @@ -53,6 +55,13 @@ enum class InputSubclass : u32 ControllerHaptic = 3, }; +enum class InputModifier : u32 +{ + None = 0, + Negate, ///< Input * -1, gets the negative side of the axis + FullAxis, ///< (Input * 0.5) + 0.5, uses both the negative and positive side of the axis together +}; + /// A composite type representing a full input key which is part of an event. union InputBindingKey { @@ -61,8 +70,8 @@ union InputBindingKey InputSourceType source_type : 4; u32 source_index : 8; ///< controller number InputSubclass source_subtype : 2; ///< if 1, binding is for an axis and not a button (used for controllers) - u32 negative : 1; ///< if 1, binding is for the negative side of the axis - u32 unused : 17; + InputModifier modifier : 2; + u32 unused : 16; u32 data; }; @@ -77,7 +86,7 @@ union InputBindingKey { InputBindingKey r; r.bits = bits; - r.negative = false; + r.modifier = InputModifier::None; return r; } }; @@ -130,7 +139,7 @@ struct HotkeyInfo } \ ; -DECLARE_HOTKEY_LIST(g_vm_manager_hotkeys); +DECLARE_HOTKEY_LIST(g_common_hotkeys); DECLARE_HOTKEY_LIST(g_gs_hotkeys); DECLARE_HOTKEY_LIST(g_host_hotkeys); @@ -205,6 +214,9 @@ namespace InputManager /// Converts an input class to a string. const char* InputSourceToString(InputSourceType clazz); + /// Returns the default state for an input source. + bool GetInputSourceDefaultEnabled(InputSourceType type); + /// Parses an input class string. std::optional ParseInputSourceString(const std::string_view& str); @@ -245,12 +257,19 @@ namespace InputManager /// Retrieves bindings that match the generic bindings for the specified device. GenericInputBindingMapping GetGenericBindingMapping(const std::string_view& device); + /// Returns whether a given input source is enabled. + bool IsInputSourceEnabled(SettingsInterface& si, InputSourceType type); + /// Re-parses the config and registers all hotkey and pad bindings. void ReloadBindings(SettingsInterface& si, SettingsInterface& binding_si); /// Re-parses the sources part of the config and initializes any backends. void ReloadSources(SettingsInterface& si, std::unique_lock& settings_lock); + /// Called when a device change is triggered by the system (DBT_DEVNODES_CHANGED on Windows). + /// Returns true if any device changes are detected. + bool ReloadDevices(); + /// Shuts down any enabled input sources. void CloseSources(); @@ -299,6 +318,9 @@ namespace InputManager namespace Host { + /// Return the current window handle. Needed for DInput. + std::optional GetTopLevelWindowInfo(); + /// Called when a new input device is connected. void OnInputDeviceConnected(const std::string_view& identifier, const std::string_view& device_name); diff --git a/pcsx2/Frontend/InputSource.cpp b/pcsx2/Frontend/InputSource.cpp index 2f6c09387d..6d195e9924 100644 --- a/pcsx2/Frontend/InputSource.cpp +++ b/pcsx2/Frontend/InputSource.cpp @@ -92,12 +92,21 @@ std::optional InputSource::ParseGenericControllerKey( key.data = static_cast(axis_number.value()); if (sub_binding[0] == '+') - key.negative = false; + key.modifier = InputModifier::None; else if (sub_binding[0] == '-') - key.negative = true; + key.modifier = InputModifier::Negate; else return std::nullopt; } + else if (StringUtil::StartsWith(sub_binding, "FullAxis")) + { + const std::optional axis_number = StringUtil::FromChars(sub_binding.substr(8)); + if (!axis_number.has_value() || axis_number.value() < 0) + return std::nullopt; + key.source_subtype = InputSubclass::ControllerAxis; + key.data = static_cast(axis_number.value()); + key.modifier = InputModifier::FullAxis; + } else if (StringUtil::StartsWith(sub_binding, "Button")) { const std::optional button_number = StringUtil::FromChars(sub_binding.substr(6)); @@ -119,8 +128,14 @@ std::string InputSource::ConvertGenericControllerKeyToString(InputBindingKey key { if (key.source_subtype == InputSubclass::ControllerAxis) { - return StringUtil::StdStringFromFormat("%s-%u/%cAxis%u", InputManager::InputSourceToString(key.source_type), - key.source_index, key.negative ? '+' : '-', key.data); + const char* modifier = ""; + switch (key.modifier) { + case InputModifier::None: modifier = "+"; break; + case InputModifier::Negate: modifier = "-"; break; + case InputModifier::FullAxis: modifier = "Full"; break; + } + return StringUtil::StdStringFromFormat("%s-%u/%sAxis%u", InputManager::InputSourceToString(key.source_type), + key.source_index, modifier, key.data); } else if (key.source_subtype == InputSubclass::ControllerButton) { diff --git a/pcsx2/Frontend/InputSource.h b/pcsx2/Frontend/InputSource.h index fee3ebe46c..3f9ada3fac 100644 --- a/pcsx2/Frontend/InputSource.h +++ b/pcsx2/Frontend/InputSource.h @@ -33,6 +33,7 @@ public: virtual bool Initialize(SettingsInterface& si, std::unique_lock& settings_lock) = 0; virtual void UpdateSettings(SettingsInterface& si, std::unique_lock& settings_lock) = 0; + virtual bool ReloadDevices() = 0; virtual void Shutdown() = 0; virtual void PollEvents() = 0; diff --git a/pcsx2/Frontend/LayeredSettingsInterface.cpp b/pcsx2/Frontend/LayeredSettingsInterface.cpp index 453e76c546..b16b5290c0 100644 --- a/pcsx2/Frontend/LayeredSettingsInterface.cpp +++ b/pcsx2/Frontend/LayeredSettingsInterface.cpp @@ -139,7 +139,7 @@ void LayeredSettingsInterface::SetDoubleValue(const char* section, const char* k void LayeredSettingsInterface::SetBoolValue(const char* section, const char* key, bool value) { - pxFailRel("Attempt to call SetBoolValue() on layered settings interface"); + pxFailRel("Attempt to call SetBoolValue() on layered settings interface"); } void LayeredSettingsInterface::SetStringValue(const char* section, const char* key, const char* value) diff --git a/pcsx2/Frontend/LogSink.cpp b/pcsx2/Frontend/LogSink.cpp index 60dafd0eba..dec8b66c4d 100644 --- a/pcsx2/Frontend/LogSink.cpp +++ b/pcsx2/Frontend/LogSink.cpp @@ -23,6 +23,7 @@ #include "common/Console.h" #include "common/FileSystem.h" #include "common/Path.h" +#include "common/SettingsInterface.h" #include "common/StringUtil.h" #include "common/Timer.h" @@ -36,7 +37,7 @@ // Used on both Windows and Linux. #ifdef _WIN32 static const wchar_t s_console_colors[][ConsoleColors_Count] = { -#define CC(x) L ## x +#define CC(x) L##x #else static const char s_console_colors[][ConsoleColors_Count] = { #define CC(x) x @@ -65,6 +66,7 @@ static const char s_console_colors[][ConsoleColors_Count] = { }; #undef CC +static bool s_block_system_console = false; static Common::Timer::Value s_log_start_timestamp = Common::Timer::GetCurrentValue(); static bool s_log_timestamps = false; static std::mutex s_log_mutex; @@ -153,7 +155,6 @@ static void ConsoleQt_DoWrite(const char* fmt) } #else std::fputs(fmt, stdout); - std::fputc('\n', stdout); #endif if (emuLog) @@ -167,10 +168,10 @@ static void ConsoleQt_DoWriteLn(const char* fmt) std::unique_lock lock(s_log_mutex); // find time since start of process, but save a syscall if we're not writing timestamps - float message_time = s_log_timestamps ? - static_cast( - Common::Timer::ConvertValueToSeconds(Common::Timer::GetCurrentValue() - s_log_start_timestamp)) : - 0.0f; + float message_time = + s_log_timestamps ? + static_cast(Common::Timer::ConvertValueToSeconds(Common::Timer::GetCurrentValue() - s_log_start_timestamp)) : + 0.0f; // split newlines up const char* start = fmt; @@ -253,15 +254,14 @@ static void ConsoleQt_Newline() ConsoleQt_DoWriteLn(""); } -static const IConsoleWriter ConsoleWriter_WinQt = - { - ConsoleQt_DoWrite, - ConsoleQt_DoWriteLn, - ConsoleQt_DoSetColor, +static const IConsoleWriter ConsoleWriter_WinQt = { + ConsoleQt_DoWrite, + ConsoleQt_DoWriteLn, + ConsoleQt_DoSetColor, - ConsoleQt_DoWrite, - ConsoleQt_Newline, - ConsoleQt_SetTitle, + ConsoleQt_DoWrite, + ConsoleQt_Newline, + ConsoleQt_SetTitle, }; static void UpdateLoggingSinks(bool system_console, bool file_log) @@ -343,7 +343,9 @@ static void UpdateLoggingSinks(bool system_console, bool file_log) { if (!emuLog) { - emuLogName = Path::Combine(EmuFolders::Logs, "emulog.txt"); + if (emuLogName.empty()) + emuLogName = Path::Combine(EmuFolders::Logs, "emulog.txt"); + emuLog = FileSystem::OpenCFile(emuLogName.c_str(), "wb"); file_log = (emuLog != nullptr); } @@ -365,26 +367,63 @@ static void UpdateLoggingSinks(bool system_console, bool file_log) Console_SetActiveHandler(ConsoleWriter_Null); } -void Host::InitializeEarlyConsole() +void CommonHost::SetFileLogPath(std::string path) +{ + if (emuLogName == path) + return; + + emuLogName = std::move(path); + + // reopen on change + if (emuLog) + { + std::fclose(emuLog); + if (!emuLogName.empty()) + emuLog = FileSystem::OpenCFile(emuLogName.c_str(), "wb"); + } +} + +void CommonHost::SetBlockSystemConsole(bool block) +{ + s_block_system_console = block; +} + +void CommonHost::InitializeEarlyConsole() { UpdateLoggingSinks(true, false); } -void Host::UpdateLogging() +void CommonHost::UpdateLogging(SettingsInterface& si) { - const bool system_console_enabled = Host::GetBaseBoolSettingValue("Logging", "EnableSystemConsole", false); - const bool file_logging_enabled = Host::GetBaseBoolSettingValue("Logging", "EnableFileLogging", false); + const bool system_console_enabled = !s_block_system_console && si.GetBoolValue("Logging", "EnableSystemConsole", false); + const bool file_logging_enabled = si.GetBoolValue("Logging", "EnableFileLogging", false); - s_log_timestamps = Host::GetBaseBoolSettingValue("Logging", "EnableTimestamps", true); + s_log_timestamps = si.GetBoolValue("Logging", "EnableTimestamps", true); const bool any_logging_sinks = system_console_enabled || file_logging_enabled; - DevConWriterEnabled = any_logging_sinks && (IsDevBuild || Host::GetBaseBoolSettingValue("Logging", "EnableVerbose", false)); - SysConsole.eeConsole.Enabled = any_logging_sinks && Host::GetBaseBoolSettingValue("Logging", "EnableEEConsole", false); - SysConsole.iopConsole.Enabled = any_logging_sinks && Host::GetBaseBoolSettingValue("Logging", "EnableIOPConsole", false); - + DevConWriterEnabled = any_logging_sinks && (IsDevBuild || si.GetBoolValue("Logging", "EnableVerbose", false)); + SysConsole.eeConsole.Enabled = any_logging_sinks && si.GetBoolValue("Logging", "EnableEEConsole", false); + SysConsole.iopConsole.Enabled = any_logging_sinks && si.GetBoolValue("Logging", "EnableIOPConsole", false); + SysTrace.IOP.R3000A.Enabled = true; + SysTrace.IOP.COP2.Enabled = true; + SysTrace.IOP.Memory.Enabled = true; + SysTrace.SIF.Enabled = true; + // Input Recording Logs - SysConsole.recordingConsole.Enabled = any_logging_sinks && Host::GetBaseBoolSettingValue("Logging", "EnableInputRecordingLogs", true); - SysConsole.controlInfo.Enabled = any_logging_sinks && Host::GetBaseBoolSettingValue("Logging", "EnableControllerLogs", false); + SysConsole.recordingConsole.Enabled = any_logging_sinks && si.GetBoolValue("Logging", "EnableInputRecordingLogs", true); + SysConsole.controlInfo.Enabled = any_logging_sinks && si.GetBoolValue("Logging", "EnableControllerLogs", false); UpdateLoggingSinks(system_console_enabled, file_logging_enabled); } + +void CommonHost::SetDefaultLoggingSettings(SettingsInterface& si) +{ + si.SetBoolValue("Logging", "EnableSystemConsole", false); + si.SetBoolValue("Logging", "EnableFileLogging", false); + si.SetBoolValue("Logging", "EnableTimestamps", true); + si.SetBoolValue("Logging", "EnableVerbose", false); + si.SetBoolValue("Logging", "EnableEEConsole", false); + si.SetBoolValue("Logging", "EnableIOPConsole", false); + si.SetBoolValue("Logging", "EnableInputRecordingLogs", true); + si.SetBoolValue("Logging", "EnableControllerLogs", false); +} diff --git a/pcsx2/Frontend/LogSink.h b/pcsx2/Frontend/LogSink.h index 029c062547..ca601ac33e 100644 --- a/pcsx2/Frontend/LogSink.h +++ b/pcsx2/Frontend/LogSink.h @@ -15,11 +15,22 @@ #pragma once -namespace Host +class SettingsInterface; + +namespace CommonHost { + /// Overrides the filename used for the file log. + void SetFileLogPath(std::string path); + + /// Prevents the system console from being displayed. + void SetBlockSystemConsole(bool block); + /// Updates the Console handler based on the current configuration. - void UpdateLogging(); + void UpdateLogging(SettingsInterface& si); /// Initializes early console logging (for printing command line arguments). void InitializeEarlyConsole(); + + /// Stores default logging settings to the specified file. + void SetDefaultLoggingSettings(SettingsInterface& si); } diff --git a/pcsx2/Frontend/MetalHostDisplay.h b/pcsx2/Frontend/MetalHostDisplay.h index 4f6a306eb1..aed0b5f5c2 100644 --- a/pcsx2/Frontend/MetalHostDisplay.h +++ b/pcsx2/Frontend/MetalHostDisplay.h @@ -24,12 +24,19 @@ #ifdef __APPLE__ #include "GS/Renderers/Metal/GSMTLDeviceInfo.h" +#include #include #include #include class MetalHostDisplay final : public HostDisplay { + enum class UsePresentDrawable : u8 + { + Never = 0, + Always = 1, + IfVsync = 2, + }; MRCOwned m_view; MRCOwned m_layer; GSMTLDevice m_dev; @@ -38,6 +45,11 @@ class MetalHostDisplay final : public HostDisplay MRCOwned> m_current_drawable; MRCOwned m_pass_desc; u32 m_capture_start_frame; + UsePresentDrawable m_use_present_drawable; + bool m_gpu_timing_enabled = false; + double m_accumulated_gpu_time = 0; + double m_last_gpu_time_end = 0; + std::mutex m_mtx; void AttachSurfaceOnMainThread(); void DetachSurfaceOnMainThread(); @@ -46,25 +58,25 @@ public: MetalHostDisplay(); ~MetalHostDisplay(); RenderAPI GetRenderAPI() const override; - void* GetRenderDevice() const override; - void* GetRenderContext() const override; - void* GetRenderSurface() const override; + void* GetDevice() const override; + void* GetContext() const override; + void* GetSurface() const override; - bool HasRenderDevice() const override; - bool HasRenderSurface() const override; - bool CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) override; - bool InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) override; - bool MakeRenderContextCurrent() override; - bool DoneRenderContextCurrent() override; - void DestroyRenderSurface() override; - bool ChangeRenderWindow(const WindowInfo& wi) override; + bool HasDevice() const override; + bool HasSurface() const override; + bool CreateDevice(const WindowInfo& wi) override; + bool SetupDevice() override; + bool MakeCurrent() override; + bool DoneCurrent() override; + void DestroySurface() override; + bool ChangeWindow(const WindowInfo& wi) override; bool SupportsFullscreen() const override; bool IsFullscreen() override; bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override; AdapterAndModeList GetAdapterAndModeList() override; std::string GetDriverInfo() const override; - void ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; + void ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; std::unique_ptr CreateTexture(u32 width, u32 height, const void* data, u32 data_stride, bool dynamic = false) override; void UpdateTexture(id texture, u32 x, u32 y, u32 width, u32 height, const void* data, u32 data_stride); @@ -78,6 +90,10 @@ public: bool UpdateImGuiFontTexture() override; bool GetHostRefreshRate(float* refresh_rate) override; + + bool SetGPUTimingEnabled(bool enabled) override; + float GetAndResetAccumulatedGPUTime() override; + void AccumulateCommandBufferTime(id buffer); }; #endif diff --git a/pcsx2/Frontend/MetalHostDisplay.mm b/pcsx2/Frontend/MetalHostDisplay.mm index 87751c349e..e51b567756 100644 --- a/pcsx2/Frontend/MetalHostDisplay.mm +++ b/pcsx2/Frontend/MetalHostDisplay.mm @@ -49,7 +49,7 @@ MetalHostDisplay::MetalHostDisplay() MetalHostDisplay::~MetalHostDisplay() { - MetalHostDisplay::DestroyRenderSurface(); + MetalHostDisplay::DestroySurface(); m_queue = nullptr; m_dev.Reset(); } @@ -72,16 +72,16 @@ static void OnMainThread(Fn&& fn) dispatch_sync(dispatch_get_main_queue(), fn); } -HostDisplay::RenderAPI MetalHostDisplay::GetRenderAPI() const +RenderAPI MetalHostDisplay::GetRenderAPI() const { return RenderAPI::Metal; } -void* MetalHostDisplay::GetRenderDevice() const { return const_cast(static_cast(&m_dev)); } -void* MetalHostDisplay::GetRenderContext() const { return (__bridge void*)m_queue; } -void* MetalHostDisplay::GetRenderSurface() const { return (__bridge void*)m_layer; } -bool MetalHostDisplay::HasRenderDevice() const { return m_dev.IsOk(); } -bool MetalHostDisplay::HasRenderSurface() const { return static_cast(m_layer);} +void* MetalHostDisplay::GetDevice() const { return const_cast(static_cast(&m_dev)); } +void* MetalHostDisplay::GetContext() const { return (__bridge void*)m_queue; } +void* MetalHostDisplay::GetSurface() const { return (__bridge void*)m_layer; } +bool MetalHostDisplay::HasDevice() const { return m_dev.IsOk(); } +bool MetalHostDisplay::HasSurface() const { return static_cast(m_layer);} void MetalHostDisplay::AttachSurfaceOnMainThread() { @@ -103,12 +103,11 @@ void MetalHostDisplay::DetachSurfaceOnMainThread() m_layer = nullptr; } -bool MetalHostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) +bool MetalHostDisplay::CreateDevice(const WindowInfo& wi) { @autoreleasepool { m_window_info = wi; pxAssertRel(!m_dev.dev, "Device already created!"); - std::string null_terminated_adapter_name(adapter_name); - NSString* ns_adapter_name = [NSString stringWithUTF8String:null_terminated_adapter_name.c_str()]; + NSString* ns_adapter_name = [NSString stringWithUTF8String:EmuConfig.GS.Adapter.c_str()]; auto devs = MRCTransfer(MTLCopyAllDevices()); for (id dev in devs.Get()) { @@ -117,8 +116,8 @@ bool MetalHostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view } if (!m_dev.dev) { - if (!adapter_name.empty()) - Console.Warning("Metal: Couldn't find adapter %s, using default", null_terminated_adapter_name.c_str()); + if (!EmuConfig.GS.Adapter.empty()) + Console.Warning("Metal: Couldn't find adapter %s, using default", EmuConfig.GS.Adapter.c_str()); m_dev = GSMTLDevice(MRCTransfer(MTLCreateSystemDefaultDevice())); if (!m_dev.dev) Host::ReportErrorAsync("No Metal Devices Available", "No Metal-supporting GPUs were found. PCSX2 requires a Metal GPU (available on all macs from 2012 onwards)."); @@ -130,6 +129,13 @@ bool MetalHostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view [m_pass_desc colorAttachments][0].clearColor = MTLClearColorMake(0, 0, 0, 0); [m_pass_desc colorAttachments][0].storeAction = MTLStoreActionStore; + if (char* env = getenv("MTL_USE_PRESENT_DRAWABLE")) + m_use_present_drawable = static_cast(atoi(env)); + else if (@available(macOS 13.0, *)) + m_use_present_drawable = UsePresentDrawable::Always; + else // Before Ventura, presentDrawable acts like vsync is on when windowed + m_use_present_drawable = UsePresentDrawable::IfVsync; + m_capture_start_frame = 0; if (char* env = getenv("MTL_CAPTURE")) { @@ -146,22 +152,22 @@ bool MetalHostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view { AttachSurfaceOnMainThread(); }); - SetVSync(vsync); + SetVSync(Host::GetEffectiveVSyncMode()); return true; } else return false; }} -bool MetalHostDisplay::InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) +bool MetalHostDisplay::SetupDevice() { return true; } -bool MetalHostDisplay::MakeRenderContextCurrent() { return true; } -bool MetalHostDisplay::DoneRenderContextCurrent() { return true; } +bool MetalHostDisplay::MakeCurrent() { return true; } +bool MetalHostDisplay::DoneCurrent() { return true; } -void MetalHostDisplay::DestroyRenderSurface() +void MetalHostDisplay::DestroySurface() { if (!m_layer) return; @@ -169,7 +175,7 @@ void MetalHostDisplay::DestroyRenderSurface() m_layer = nullptr; } -bool MetalHostDisplay::ChangeRenderWindow(const WindowInfo& wi) +bool MetalHostDisplay::ChangeWindow(const WindowInfo& wi) { OnMainThread([this, &wi] { @@ -201,7 +207,7 @@ std::string MetalHostDisplay::GetDriverInfo() const return desc; }} -void MetalHostDisplay::ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) +void MetalHostDisplay::ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) { m_window_info.surface_scale = new_window_scale; if (m_window_info.surface_width == static_cast(new_window_width) && m_window_info.surface_height == static_cast(new_window_height)) @@ -295,10 +301,19 @@ void MetalHostDisplay::EndPresent() dev->RenderImGui(ImGui::GetDrawData()); dev->EndRenderPass(); if (m_current_drawable) - [dev->m_current_render_cmdbuf addScheduledHandler:[drawable = std::move(m_current_drawable)](id){ - [drawable present]; - }]; + { + const bool use_present_drawable = m_use_present_drawable == UsePresentDrawable::Always || + (m_use_present_drawable == UsePresentDrawable::IfVsync && m_vsync_mode != VsyncMode::Off); + + if (use_present_drawable) + [dev->m_current_render_cmdbuf presentDrawable:m_current_drawable]; + else + [dev->m_current_render_cmdbuf addScheduledHandler:[drawable = std::move(m_current_drawable)](id){ + [drawable present]; + }]; + } dev->FlushEncoders(); + dev->FrameCompleted(); m_current_drawable = nullptr; if (m_capture_start_frame) { @@ -406,4 +421,47 @@ bool MetalHostDisplay::GetHostRefreshRate(float* refresh_rate) return *refresh_rate != 0; } +bool MetalHostDisplay::SetGPUTimingEnabled(bool enabled) +{ + if (enabled == m_gpu_timing_enabled) + return true; + if (@available(macOS 10.15, iOS 10.3, *)) + { + std::lock_guard l(m_mtx); + m_gpu_timing_enabled = enabled; + m_accumulated_gpu_time = 0; + m_last_gpu_time_end = 0; + return true; + } + return false; +} + +float MetalHostDisplay::GetAndResetAccumulatedGPUTime() +{ + std::lock_guard l(m_mtx); + float time = m_accumulated_gpu_time * 1000; + m_accumulated_gpu_time = 0; + return time; +} + +void MetalHostDisplay::AccumulateCommandBufferTime(id buffer) +{ + std::lock_guard l(m_mtx); + if (!m_gpu_timing_enabled) + return; + // We do the check before enabling m_gpu_timing_enabled +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + // It's unlikely, but command buffers can overlap or run out of order + // This doesn't handle every case (fully out of order), but it should at least handle overlapping + double begin = std::max(m_last_gpu_time_end, [buffer GPUStartTime]); + double end = [buffer GPUEndTime]; + if (end > begin) + { + m_accumulated_gpu_time += end - begin; + m_last_gpu_time_end = end; + } +#pragma clang diagnostic pop +} + #endif // __APPLE__ diff --git a/pcsx2/Frontend/OpenGLHostDisplay.cpp b/pcsx2/Frontend/OpenGLHostDisplay.cpp index 80bc5cf3de..b6a332460d 100644 --- a/pcsx2/Frontend/OpenGLHostDisplay.cpp +++ b/pcsx2/Frontend/OpenGLHostDisplay.cpp @@ -60,22 +60,22 @@ OpenGLHostDisplay::~OpenGLHostDisplay() } } -HostDisplay::RenderAPI OpenGLHostDisplay::GetRenderAPI() const +RenderAPI OpenGLHostDisplay::GetRenderAPI() const { return m_gl_context->IsGLES() ? RenderAPI::OpenGLES : RenderAPI::OpenGL; } -void* OpenGLHostDisplay::GetRenderDevice() const +void* OpenGLHostDisplay::GetDevice() const { return nullptr; } -void* OpenGLHostDisplay::GetRenderContext() const +void* OpenGLHostDisplay::GetContext() const { return m_gl_context.get(); } -void* OpenGLHostDisplay::GetRenderSurface() const +void* OpenGLHostDisplay::GetSurface() const { return nullptr; } @@ -188,17 +188,17 @@ std::string OpenGLHostDisplay::GetGLSLVersionHeader() const return header; } -bool OpenGLHostDisplay::HasRenderDevice() const +bool OpenGLHostDisplay::HasDevice() const { return static_cast(m_gl_context); } -bool OpenGLHostDisplay::HasRenderSurface() const +bool OpenGLHostDisplay::HasSurface() const { return m_window_info.type != WindowInfo::Type::Surfaceless; } -bool OpenGLHostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) +bool OpenGLHostDisplay::CreateDevice(const WindowInfo& wi) { m_gl_context = GL::Context::Create(wi); if (!m_gl_context) @@ -209,11 +209,11 @@ bool OpenGLHostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_vie } m_window_info = m_gl_context->GetWindowInfo(); - m_vsync_mode = vsync; + m_vsync_mode = Host::GetEffectiveVSyncMode(); return true; } -bool OpenGLHostDisplay::InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) +bool OpenGLHostDisplay::SetupDevice() { SetSwapInterval(); GL::Program::ResetLastProgram(); @@ -226,7 +226,7 @@ void OpenGLHostDisplay::SetSwapInterval() m_gl_context->SetSwapInterval(interval); } -bool OpenGLHostDisplay::MakeRenderContextCurrent() +bool OpenGLHostDisplay::MakeCurrent() { if (!m_gl_context->MakeCurrent()) { @@ -238,12 +238,12 @@ bool OpenGLHostDisplay::MakeRenderContextCurrent() return true; } -bool OpenGLHostDisplay::DoneRenderContextCurrent() +bool OpenGLHostDisplay::DoneCurrent() { return m_gl_context->DoneCurrent(); } -bool OpenGLHostDisplay::ChangeRenderWindow(const WindowInfo& new_wi) +bool OpenGLHostDisplay::ChangeWindow(const WindowInfo& new_wi) { pxAssert(m_gl_context); @@ -265,7 +265,7 @@ bool OpenGLHostDisplay::ChangeRenderWindow(const WindowInfo& new_wi) return true; } -void OpenGLHostDisplay::ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) +void OpenGLHostDisplay::ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) { if (!m_gl_context) return; @@ -309,7 +309,7 @@ HostDisplay::AdapterAndModeList OpenGLHostDisplay::GetAdapterAndModeList() return aml; } -void OpenGLHostDisplay::DestroyRenderSurface() +void OpenGLHostDisplay::DestroySurface() { if (!m_gl_context) return; @@ -440,7 +440,6 @@ void OpenGLHostDisplay::PopTimestampQuery() GLint available = 0; GetQueryObjectiv(m_timestamp_queries[m_read_timestamp_query], GL_QUERY_RESULT_AVAILABLE, &available); - pxAssert(m_read_timestamp_query != m_write_timestamp_query); if (!available) break; @@ -452,8 +451,7 @@ void OpenGLHostDisplay::PopTimestampQuery() m_waiting_timestamp_queries--; } - // delay ending the current query until we've read back some - if (m_timestamp_query_started && m_waiting_timestamp_queries < (NUM_TIMESTAMP_QUERIES - 1)) + if (m_timestamp_query_started) { const auto EndQuery = gles ? glEndQueryEXT : glEndQuery; EndQuery(GL_TIME_ELAPSED); @@ -466,7 +464,7 @@ void OpenGLHostDisplay::PopTimestampQuery() void OpenGLHostDisplay::KickTimestampQuery() { - if (m_timestamp_query_started) + if (m_timestamp_query_started || m_waiting_timestamp_queries == NUM_TIMESTAMP_QUERIES) return; const bool gles = m_gl_context->IsGLES(); diff --git a/pcsx2/Frontend/OpenGLHostDisplay.h b/pcsx2/Frontend/OpenGLHostDisplay.h index c87146b05b..345592e251 100644 --- a/pcsx2/Frontend/OpenGLHostDisplay.h +++ b/pcsx2/Frontend/OpenGLHostDisplay.h @@ -31,26 +31,26 @@ public: ~OpenGLHostDisplay(); RenderAPI GetRenderAPI() const override; - void* GetRenderDevice() const override; - void* GetRenderContext() const override; - void* GetRenderSurface() const override; + void* GetDevice() const override; + void* GetContext() const override; + void* GetSurface() const override; - bool HasRenderDevice() const override; - bool HasRenderSurface() const override; + bool HasDevice() const override; + bool HasSurface() const override; - bool CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) override; - bool InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) override; + bool CreateDevice(const WindowInfo& wi) override; + bool SetupDevice() override; - bool MakeRenderContextCurrent() override; - bool DoneRenderContextCurrent() override; + bool MakeCurrent() override; + bool DoneCurrent() override; - bool ChangeRenderWindow(const WindowInfo& new_wi) override; - void ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; + bool ChangeWindow(const WindowInfo& new_wi) override; + void ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; bool SupportsFullscreen() const override; bool IsFullscreen() override; bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override; AdapterAndModeList GetAdapterAndModeList() override; - void DestroyRenderSurface() override; + void DestroySurface() override; std::string GetDriverInfo() const override; std::unique_ptr CreateTexture(u32 width, u32 height, const void* data, u32 data_stride, bool dynamic) override; @@ -65,7 +65,7 @@ public: float GetAndResetAccumulatedGPUTime() override; protected: - static constexpr u8 NUM_TIMESTAMP_QUERIES = 3; + static constexpr u8 NUM_TIMESTAMP_QUERIES = 5; const char* GetGLSLVersionString() const; std::string GetGLSLVersionHeader() const; diff --git a/pcsx2/Frontend/SDLInputSource.cpp b/pcsx2/Frontend/SDLInputSource.cpp index 9c74576a4b..c77858156b 100644 --- a/pcsx2/Frontend/SDLInputSource.cpp +++ b/pcsx2/Frontend/SDLInputSource.cpp @@ -22,9 +22,6 @@ #include "common/StringUtil.h" #include "common/Console.h" #include -#ifdef __APPLE__ -#include -#endif static const char* s_sdl_axis_names[] = { "LeftX", // SDL_CONTROLLER_AXIS_LEFTX @@ -132,6 +129,13 @@ void SDLInputSource::UpdateSettings(SettingsInterface& si, std::unique_lock(ctx) = SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC); - }); -#else - result = SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC); -#endif - if (result < 0) + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) < 0) { Console.Error("SDL_InitSubSystem(SDL_INIT_JOYSTICK |SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) failed"); return false; @@ -178,13 +172,7 @@ void SDLInputSource::ShutdownSubsystem() if (m_sdl_subsystem_initialized) { -#ifdef __APPLE__ - dispatch_sync_f(dispatch_get_main_queue(), nullptr, [](void*){ - SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC); - }); -#else SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC); -#endif m_sdl_subsystem_initialized = false; } } @@ -261,6 +249,17 @@ std::optional SDLInputSource::ParseKeyString( { // likely an axis const std::string_view axis_name(binding.substr(1)); + + if (StringUtil::StartsWith(axis_name, "Axis")) + { + if (auto value = StringUtil::FromChars(axis_name.substr(4))) + { + key.source_subtype = InputSubclass::ControllerAxis; + key.data = *value; + key.modifier = (binding[0] == '-') ? InputModifier::Negate : InputModifier::None; + return key; + } + } for (u32 i = 0; i < std::size(s_sdl_axis_names); i++) { if (axis_name == s_sdl_axis_names[i]) @@ -268,14 +267,33 @@ std::optional SDLInputSource::ParseKeyString( // found an axis! key.source_subtype = InputSubclass::ControllerAxis; key.data = i; - key.negative = (binding[0] == '-'); + key.modifier = (binding[0] == '-') ? InputModifier::Negate : InputModifier::None; return key; } } } + else if (StringUtil::StartsWith(binding, "FullAxis")) + { + if (auto value = StringUtil::FromChars(binding.substr(8))) + { + key.source_subtype = InputSubclass::ControllerAxis; + key.data = *value; + key.modifier = InputModifier::FullAxis; + return key; + } + } else { // must be a button + if (StringUtil::StartsWith(binding, "Button")) + { + if (auto value = StringUtil::FromChars(binding.substr(6))) + { + key.source_subtype = InputSubclass::ControllerButton; + key.data = *value; + return key; + } + } for (u32 i = 0; i < std::size(s_sdl_button_names); i++) { if (binding == s_sdl_button_names[i]) @@ -297,14 +315,26 @@ std::string SDLInputSource::ConvertKeyToString(InputBindingKey key) if (key.source_type == InputSourceType::SDL) { - if (key.source_subtype == InputSubclass::ControllerAxis && key.data < std::size(s_sdl_axis_names)) + if (key.source_subtype == InputSubclass::ControllerAxis) { - ret = StringUtil::StdStringFromFormat( - "SDL-%u/%c%s", key.source_index, key.negative ? '-' : '+', s_sdl_axis_names[key.data]); + const char* modifier = key.modifier == InputModifier::Negate ? "-" : "+"; + if (key.data < std::size(s_sdl_axis_names)) + { + ret = StringUtil::StdStringFromFormat("SDL-%u/%s%s", key.source_index, modifier, s_sdl_axis_names[key.data]); + } + else + { + if (key.modifier == InputModifier::FullAxis) + modifier = "Full"; + ret = StringUtil::StdStringFromFormat("SDL-%u/%sAxis%u", key.source_index, modifier, key.data); + } } - else if (key.source_subtype == InputSubclass::ControllerButton && key.data < std::size(s_sdl_button_names)) + else if (key.source_subtype == InputSubclass::ControllerButton) { - ret = StringUtil::StdStringFromFormat("SDL-%u/%s", key.source_index, s_sdl_button_names[key.data]); + if (key.data < std::size(s_sdl_button_names)) + ret = StringUtil::StdStringFromFormat("SDL-%u/%s", key.source_index, s_sdl_button_names[key.data]); + else + ret = StringUtil::StdStringFromFormat("SDL-%u/Button%u", key.source_index, key.data); } else if (key.source_subtype == InputSubclass::ControllerMotor) { @@ -344,6 +374,13 @@ bool SDLInputSource::ProcessSDLEvent(const SDL_Event* event) case SDL_CONTROLLERBUTTONUP: return HandleControllerButtonEvent(&event->cbutton); + case SDL_JOYAXISMOTION: + return HandleJoystickAxisEvent(&event->jaxis); + + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + return HandleJoystickButtonEvent(&event->jbutton); + default: return false; } @@ -411,6 +448,21 @@ bool SDLInputSource::OpenGameController(int index) cd.haptic_left_right_effect = -1; cd.game_controller = gcontroller; + const int num_axes = SDL_JoystickNumAxes(joystick); + const int num_buttons = SDL_JoystickNumButtons(joystick); + cd.joy_axis_used_in_gc.resize(num_axes, false); + cd.joy_button_used_in_gc.resize(num_buttons, false); + auto mark_bind = [&](SDL_GameControllerButtonBind bind){ + if (bind.bindType == SDL_CONTROLLER_BINDTYPE_AXIS && bind.value.axis < num_axes) + cd.joy_axis_used_in_gc[bind.value.axis] = true; + if (bind.bindType == SDL_CONTROLLER_BINDTYPE_BUTTON && bind.value.button < num_buttons) + cd.joy_button_used_in_gc[bind.value.button] = true; + }; + for (size_t i = 0; i < std::size(s_sdl_axis_names); i++) + mark_bind(SDL_GameControllerGetBindForAxis(gcontroller, static_cast(i))); + for (size_t i = 0; i < std::size(s_sdl_button_names); i++) + mark_bind(SDL_GameControllerGetBindForButton(gcontroller, static_cast(i))); + cd.use_game_controller_rumble = (SDL_GameControllerRumble(gcontroller, 0, 0, 0) == 0); if (cd.use_game_controller_rumble) { @@ -480,6 +532,11 @@ bool SDLInputSource::CloseGameController(int joystick_index) return true; } +static float NormalizeS16(s16 value) +{ + return static_cast(value) / (value < 0 ? 32768.0f : 32767.0f); +} + bool SDLInputSource::HandleControllerAxisEvent(const SDL_ControllerAxisEvent* ev) { auto it = GetControllerDataForJoystickId(ev->which); @@ -487,8 +544,7 @@ bool SDLInputSource::HandleControllerAxisEvent(const SDL_ControllerAxisEvent* ev return false; const InputBindingKey key(MakeGenericControllerAxisKey(InputSourceType::SDL, it->player_id, ev->axis)); - const float value = static_cast(ev->value) / (ev->value < 0 ? 32768.0f : 32767.0f); - return InputManager::InvokeEvents(key, value); + return InputManager::InvokeEvents(key, NormalizeS16(ev->value)); } bool SDLInputSource::HandleControllerButtonEvent(const SDL_ControllerButtonEvent* ev) @@ -499,11 +555,35 @@ bool SDLInputSource::HandleControllerButtonEvent(const SDL_ControllerButtonEvent const InputBindingKey key(MakeGenericControllerButtonKey(InputSourceType::SDL, it->player_id, ev->button)); const GenericInputBinding generic_key = (ev->button < std::size(s_sdl_generic_binding_button_mapping)) ? - s_sdl_generic_binding_button_mapping[ev->button] : - GenericInputBinding::Unknown; + s_sdl_generic_binding_button_mapping[ev->button] : + GenericInputBinding::Unknown; return InputManager::InvokeEvents(key, (ev->state == SDL_PRESSED) ? 1.0f : 0.0f, generic_key); } +bool SDLInputSource::HandleJoystickAxisEvent(const SDL_JoyAxisEvent* ev) +{ + auto it = GetControllerDataForJoystickId(ev->which); + if (it == m_controllers.end()) + return false; + if (ev->axis < it->joy_axis_used_in_gc.size() && it->joy_axis_used_in_gc[ev->axis]) + return false; // Will get handled by GC event + const u32 axis = ev->axis + std::size(s_sdl_axis_names); // Ensure we don't conflict with GC axes + const InputBindingKey key(MakeGenericControllerAxisKey(InputSourceType::SDL, it->player_id, axis)); + return InputManager::InvokeEvents(key, NormalizeS16(ev->value)); +} + +bool SDLInputSource::HandleJoystickButtonEvent(const SDL_JoyButtonEvent* ev) +{ + auto it = GetControllerDataForJoystickId(ev->which); + if (it == m_controllers.end()) + return false; + if (ev->button < it->joy_button_used_in_gc.size() && it->joy_button_used_in_gc[ev->button]) + return false; // Will get handled by GC event + const u32 button = ev->button + std::size(s_sdl_button_names); // Ensure we don't conflict with GC buttons + const InputBindingKey key(MakeGenericControllerAxisKey(InputSourceType::SDL, it->player_id, button)); + return InputManager::InvokeEvents(key, (ev->state == SDL_PRESSED) ? 1.0f : 0.0f); +} + std::vector SDLInputSource::EnumerateMotors() { std::vector ret; diff --git a/pcsx2/Frontend/SDLInputSource.h b/pcsx2/Frontend/SDLInputSource.h index 582994f0cc..c560782521 100644 --- a/pcsx2/Frontend/SDLInputSource.h +++ b/pcsx2/Frontend/SDLInputSource.h @@ -31,6 +31,7 @@ public: bool Initialize(SettingsInterface& si, std::unique_lock& settings_lock) override; void UpdateSettings(SettingsInterface& si, std::unique_lock& settings_lock) override; + bool ReloadDevices() override; void Shutdown() override; void PollEvents() override; @@ -46,12 +47,6 @@ public: bool ProcessSDLEvent(const SDL_Event* event); private: - enum : int - { - MAX_NUM_AXES = 7, - MAX_NUM_BUTTONS = 16, - }; - struct ControllerData { SDL_Haptic* haptic; @@ -61,6 +56,10 @@ private: int joystick_id; int player_id; bool use_game_controller_rumble; + + // Used to disable Joystick controls that are used in GameController inputs so we don't get double events + std::vector joy_button_used_in_gc; + std::vector joy_axis_used_in_gc; }; using ControllerDataVector = std::vector; @@ -78,6 +77,8 @@ private: bool CloseGameController(int joystick_index); bool HandleControllerAxisEvent(const SDL_ControllerAxisEvent* event); bool HandleControllerButtonEvent(const SDL_ControllerButtonEvent* event); + bool HandleJoystickAxisEvent(const SDL_JoyAxisEvent* event); + bool HandleJoystickButtonEvent(const SDL_JoyButtonEvent* event); void SendRumbleUpdate(ControllerData* cd); ControllerDataVector m_controllers; diff --git a/pcsx2/Frontend/VulkanHostDisplay.cpp b/pcsx2/Frontend/VulkanHostDisplay.cpp index 23b36445f1..f19de05657 100644 --- a/pcsx2/Frontend/VulkanHostDisplay.cpp +++ b/pcsx2/Frontend/VulkanHostDisplay.cpp @@ -1,6 +1,7 @@ #include "PrecompiledHeader.h" #include "VulkanHostDisplay.h" +#include "ShaderCacheVersion.h" #include "common/Align.h" #include "common/Assertions.h" #include "common/Console.h" @@ -15,8 +16,6 @@ #include "imgui_impl_vulkan.h" #include -static constexpr u32 SHADER_CACHE_VERSION = 4; - class VulkanHostDisplayTexture : public HostDisplayTexture { public: @@ -61,33 +60,33 @@ VulkanHostDisplay::~VulkanHostDisplay() } } -HostDisplay::RenderAPI VulkanHostDisplay::GetRenderAPI() const +RenderAPI VulkanHostDisplay::GetRenderAPI() const { - return HostDisplay::RenderAPI::Vulkan; + return RenderAPI::Vulkan; } -void* VulkanHostDisplay::GetRenderDevice() const +void* VulkanHostDisplay::GetDevice() const { return nullptr; } -void* VulkanHostDisplay::GetRenderContext() const +void* VulkanHostDisplay::GetContext() const { return nullptr; } -void* VulkanHostDisplay::GetRenderSurface() const +void* VulkanHostDisplay::GetSurface() const { return m_swap_chain.get(); } -bool VulkanHostDisplay::ChangeRenderWindow(const WindowInfo& new_wi) +bool VulkanHostDisplay::ChangeWindow(const WindowInfo& new_wi) { g_vulkan_context->WaitForGPUIdle(); if (new_wi.type == WindowInfo::Type::Surfaceless) { - g_vulkan_context->ExecuteCommandBuffer(true); + g_vulkan_context->ExecuteCommandBuffer(Vulkan::Context::WaitType::Sleep); m_swap_chain.reset(); m_window_info = new_wi; return true; @@ -126,7 +125,7 @@ bool VulkanHostDisplay::ChangeRenderWindow(const WindowInfo& new_wi) return true; } -void VulkanHostDisplay::ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) +void VulkanHostDisplay::ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) { if (m_swap_chain->GetWidth() == static_cast(new_window_width) && m_swap_chain->GetHeight() == static_cast(new_window_height)) { @@ -167,7 +166,7 @@ HostDisplay::AdapterAndModeList VulkanHostDisplay::GetAdapterAndModeList() return StaticGetAdapterAndModeList(m_window_info.type != WindowInfo::Type::Surfaceless ? &m_window_info : nullptr); } -void VulkanHostDisplay::DestroyRenderSurface() +void VulkanHostDisplay::DestroySurface() { g_vulkan_context->WaitForGPUIdle(); m_swap_chain.reset(); @@ -201,14 +200,16 @@ static bool UploadBufferToTexture( Vulkan::Texture* texture, VkCommandBuffer cmdbuf, u32 width, u32 height, const void* data, u32 data_stride) { const u32 texel_size = Vulkan::Util::GetTexelSize(texture->GetFormat()); - const u32 upload_stride = Common::AlignUpPow2(texel_size * width, g_vulkan_context->GetBufferCopyRowPitchAlignment()); + const u32 row_size = texel_size * width; + const u32 upload_stride = Common::AlignUpPow2(row_size, g_vulkan_context->GetBufferCopyRowPitchAlignment()); const u32 upload_size = upload_stride * height; + pxAssert(row_size <= data_stride); Vulkan::StreamBuffer& buf = g_vulkan_context->GetTextureUploadBuffer(); if (!buf.ReserveMemory(upload_size, g_vulkan_context->GetBufferCopyOffsetAlignment())) { Console.WriteLn("Executing command buffer for UploadBufferToTexture()"); - g_vulkan_context->ExecuteCommandBuffer(false); + g_vulkan_context->ExecuteCommandBuffer(Vulkan::Context::WaitType::None); if (!buf.ReserveMemory(upload_size, g_vulkan_context->GetBufferCopyOffsetAlignment())) { Console.WriteLn("Failed to allocate %u bytes in stream buffer for UploadBufferToTexture()", upload_size); @@ -218,10 +219,10 @@ static bool UploadBufferToTexture( } const u32 buf_offset = buf.GetCurrentOffset(); - StringUtil::StrideMemCpy(buf.GetCurrentHostPointer(), upload_stride, data, data_stride, upload_stride, height); + StringUtil::StrideMemCpy(buf.GetCurrentHostPointer(), upload_stride, data, data_stride, row_size, height); buf.CommitMemory(upload_size); - texture->UpdateFromBuffer(cmdbuf, 0, 0, 0, 0, width, height, upload_stride / texel_size, buf.GetBuffer(), buf_offset); + texture->UpdateFromBuffer(cmdbuf, 0, 0, 0, 0, width, height, height, upload_stride / texel_size, buf.GetBuffer(), buf_offset); return true; } @@ -273,14 +274,13 @@ void VulkanHostDisplay::SetVSync(VsyncMode mode) m_vsync_mode = mode; } -bool VulkanHostDisplay::CreateRenderDevice( - const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) +bool VulkanHostDisplay::CreateDevice(const WindowInfo& wi) { - // debug_device = true; - WindowInfo local_wi(wi); - if (!Vulkan::Context::Create(adapter_name, &local_wi, &m_swap_chain, GetPreferredPresentModeForVsyncMode(vsync), threaded_presentation, - debug_device, debug_device)) + const VsyncMode vsync = Host::GetEffectiveVSyncMode(); + const bool debug_device = EmuConfig.GS.UseDebugDevice; + if (!Vulkan::Context::Create(EmuConfig.GS.Adapter, &local_wi, &m_swap_chain, GetPreferredPresentModeForVsyncMode(vsync), + EmuConfig.GS.ThreadedPresentation, debug_device, debug_device)) { Console.Error("Failed to create Vulkan context"); m_window_info = {}; @@ -293,25 +293,30 @@ bool VulkanHostDisplay::CreateRenderDevice( return true; } -bool VulkanHostDisplay::InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) +bool VulkanHostDisplay::SetupDevice() { - Vulkan::ShaderCache::Create(shader_cache_directory, SHADER_CACHE_VERSION, debug_device); + Vulkan::ShaderCache::Create(EmuFolders::Cache, SHADER_CACHE_VERSION, EmuConfig.GS.UseDebugDevice); return true; } -bool VulkanHostDisplay::HasRenderDevice() const +bool VulkanHostDisplay::HasDevice() const { return static_cast(g_vulkan_context); } -bool VulkanHostDisplay::HasRenderSurface() const +bool VulkanHostDisplay::HasSurface() const { return static_cast(m_swap_chain); } bool VulkanHostDisplay::CreateImGuiContext() { - return ImGui_ImplVulkan_Init(m_swap_chain->GetClearRenderPass()); + const VkRenderPass render_pass = + m_swap_chain ? m_swap_chain->GetClearRenderPass() : g_vulkan_context->GetRenderPass(VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_UNDEFINED); + if (render_pass == VK_NULL_HANDLE) + return false; + + return ImGui_ImplVulkan_Init(render_pass); } void VulkanHostDisplay::DestroyImGuiContext() @@ -325,12 +330,12 @@ bool VulkanHostDisplay::UpdateImGuiFontTexture() return ImGui_ImplVulkan_CreateFontsTexture(); } -bool VulkanHostDisplay::MakeRenderContextCurrent() +bool VulkanHostDisplay::MakeCurrent() { return true; } -bool VulkanHostDisplay::DoneRenderContextCurrent() +bool VulkanHostDisplay::DoneCurrent() { return true; } @@ -351,7 +356,7 @@ bool VulkanHostDisplay::BeginPresent(bool frame_skip) { if (res == VK_SUBOPTIMAL_KHR || res == VK_ERROR_OUT_OF_DATE_KHR) { - ResizeRenderWindow(0, 0, m_window_info.surface_scale); + ResizeWindow(0, 0, m_window_info.surface_scale); res = m_swap_chain->AcquireNextImage(); } else if (res == VK_ERROR_SURFACE_LOST_KHR) @@ -360,7 +365,7 @@ bool VulkanHostDisplay::BeginPresent(bool frame_skip) if (!m_swap_chain->RecreateSurface(m_window_info)) { Console.Error("Failed to recreate surface after loss"); - g_vulkan_context->ExecuteCommandBuffer(false); + g_vulkan_context->ExecuteCommandBuffer(Vulkan::Context::WaitType::None); return false; } @@ -373,7 +378,7 @@ bool VulkanHostDisplay::BeginPresent(bool frame_skip) { // Still submit the command buffer, otherwise we'll end up with several frames waiting. LOG_VULKAN_ERROR(res, "vkAcquireNextImageKHR() failed: "); - g_vulkan_context->ExecuteCommandBuffer(false); + g_vulkan_context->ExecuteCommandBuffer(Vulkan::Context::WaitType::None); return false; } } diff --git a/pcsx2/Frontend/VulkanHostDisplay.h b/pcsx2/Frontend/VulkanHostDisplay.h index 90d0a4f42d..f308cc1cbc 100644 --- a/pcsx2/Frontend/VulkanHostDisplay.h +++ b/pcsx2/Frontend/VulkanHostDisplay.h @@ -20,26 +20,26 @@ public: ~VulkanHostDisplay(); RenderAPI GetRenderAPI() const override; - void* GetRenderDevice() const override; - void* GetRenderContext() const override; - void* GetRenderSurface() const override; + void* GetDevice() const override; + void* GetContext() const override; + void* GetSurface() const override; - bool HasRenderDevice() const override; - bool HasRenderSurface() const override; + bool HasDevice() const override; + bool HasSurface() const override; - bool CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) override; - bool InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) override; + bool CreateDevice(const WindowInfo& wi) override; + bool SetupDevice() override; - bool MakeRenderContextCurrent() override; - bool DoneRenderContextCurrent() override; + bool MakeCurrent() override; + bool DoneCurrent() override; - bool ChangeRenderWindow(const WindowInfo& new_wi) override; - void ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; + bool ChangeWindow(const WindowInfo& new_wi) override; + void ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) override; bool SupportsFullscreen() const override; bool IsFullscreen() override; bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override; AdapterAndModeList GetAdapterAndModeList() override; - void DestroyRenderSurface() override; + void DestroySurface() override; std::string GetDriverInfo() const override; std::unique_ptr CreateTexture(u32 width, u32 height, const void* data, u32 data_stride, bool dynamic = false) override; diff --git a/pcsx2/Frontend/XInputSource.cpp b/pcsx2/Frontend/XInputSource.cpp index f467faabfc..dc6ce7a46a 100644 --- a/pcsx2/Frontend/XInputSource.cpp +++ b/pcsx2/Frontend/XInputSource.cpp @@ -96,7 +96,6 @@ XInputSource::~XInputSource() = default; bool XInputSource::Initialize(SettingsInterface& si, std::unique_lock& settings_lock) { -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) // xinput1_3.dll is flawed and obsolete, but it's also commonly used by wrappers. // For this reason, try to load it *only* from the application directory, and not system32. m_xinput_module = LoadLibraryExW(L"xinput1_3", nullptr, LOAD_LIBRARY_SEARCH_APPLICATION_DIR); @@ -127,18 +126,13 @@ bool XInputSource::Initialize(SettingsInterface& si, std::unique_lock(GetProcAddress(m_xinput_module, "XInputGetExtended")); -#else - m_xinput_get_state = XInputGetState; - m_xinput_set_state = XInputSetState; - m_xinput_get_capabilities = XInputGetCapabilities; - m_xinput_get_extended = nullptr; -#endif if (!m_xinput_get_state || !m_xinput_set_state || !m_xinput_get_capabilities) { Console.Error("Failed to get XInput function pointers."); return false; } + ReloadDevices(); return true; } @@ -146,6 +140,38 @@ void XInputSource::UpdateSettings(SettingsInterface& si, std::unique_lock XInputSource::ParseKeyString( // found an axis! key.source_subtype = InputSubclass::ControllerAxis; key.data = i; - key.negative = (binding[0] == '-'); + key.modifier = binding[0] == '-' ? InputModifier::Negate : InputModifier::None; return key; } } @@ -297,8 +323,9 @@ std::string XInputSource::ConvertKeyToString(InputBindingKey key) { if (key.source_subtype == InputSubclass::ControllerAxis && key.data < std::size(s_axis_names)) { + const char modifier = key.modifier == InputModifier::Negate ? '-' : '+'; ret = StringUtil::StdStringFromFormat( - "XInput-%u/%c%s", key.source_index, key.negative ? '-' : '+', s_axis_names[key.data]); + "XInput-%u/%c%s", key.source_index, modifier, s_axis_names[key.data]); } else if (key.source_subtype == InputSubclass::ControllerButton && key.data < std::size(s_button_names)) { diff --git a/pcsx2/Frontend/XInputSource.h b/pcsx2/Frontend/XInputSource.h index 0c48dfda5c..6e972f39f9 100644 --- a/pcsx2/Frontend/XInputSource.h +++ b/pcsx2/Frontend/XInputSource.h @@ -65,6 +65,7 @@ public: bool Initialize(SettingsInterface& si, std::unique_lock& settings_lock) override; void UpdateSettings(SettingsInterface& si, std::unique_lock& settings_lock) override; + bool ReloadDevices() override; void Shutdown() override; void PollEvents() override; diff --git a/pcsx2/Frontend/imgui_impl_dx12.cpp b/pcsx2/Frontend/imgui_impl_dx12.cpp index 512900f39f..a98f2b1bd3 100644 --- a/pcsx2/Frontend/imgui_impl_dx12.cpp +++ b/pcsx2/Frontend/imgui_impl_dx12.cpp @@ -165,7 +165,7 @@ void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data) if (!bd->VertexStreamBuffer.ReserveMemory(needed_vb, sizeof(ImDrawVert)) || !bd->IndexStreamBuffer.ReserveMemory(needed_ib, sizeof(ImDrawIdx))) { - g_d3d12_context->ExecuteCommandList(false); + g_d3d12_context->ExecuteCommandList(D3D12::Context::WaitType::None); if (!bd->VertexStreamBuffer.ReserveMemory(needed_vb, sizeof(ImDrawVert)) || !bd->IndexStreamBuffer.ReserveMemory(needed_ib, sizeof(ImDrawIdx))) { @@ -230,7 +230,7 @@ void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data) if (!g_d3d12_context->GetDescriptorAllocator().Allocate(1, &handle)) { // ugh. - g_d3d12_context->ExecuteCommandList(false); + g_d3d12_context->ExecuteCommandList(D3D12::Context::WaitType::None); ctx = g_d3d12_context->GetCommandList(); ImGui_ImplDX12_SetupRenderState(draw_data, ctx); if (!g_d3d12_context->GetDescriptorAllocator().Allocate(1, &handle)) diff --git a/pcsx2/Frontend/imgui_impl_vulkan.cpp b/pcsx2/Frontend/imgui_impl_vulkan.cpp index 8583989a06..17689e4a45 100644 --- a/pcsx2/Frontend/imgui_impl_vulkan.cpp +++ b/pcsx2/Frontend/imgui_impl_vulkan.cpp @@ -428,7 +428,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture() std::memcpy(ai.pMappedData, pixels, upload_size); vmaFlushAllocation(g_vulkan_context->GetAllocator(), allocation, 0, upload_size); bd->FontTexture.TransitionToLayout(g_vulkan_context->GetCurrentInitCommandBuffer(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - bd->FontTexture.UpdateFromBuffer(g_vulkan_context->GetCurrentInitCommandBuffer(), 0, 0, 0, 0, width, height, width, buffer, 0); + bd->FontTexture.UpdateFromBuffer(g_vulkan_context->GetCurrentInitCommandBuffer(), 0, 0, 0, 0, width, height, height, width, buffer, 0); bd->FontTexture.TransitionToLayout(g_vulkan_context->GetCurrentInitCommandBuffer(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); // Immediately queue it for freeing after the command buffer finishes, since it's only needed for the copy. diff --git a/pcsx2/GS.cpp b/pcsx2/GS.cpp index ac980cfb69..5d5ee06ea7 100644 --- a/pcsx2/GS.cpp +++ b/pcsx2/GS.cpp @@ -63,7 +63,7 @@ void gsUpdateFrequency(Pcsx2Config& config) config.GS.LimitScalar = config.Framerate.TurboScalar; break; case LimiterModeType::Unlimited: - config.GS.LimitScalar = 0.0; + config.GS.LimitScalar = 0.0f; break; default: pxAssert("Unknown framelimiter mode!"); @@ -71,7 +71,7 @@ void gsUpdateFrequency(Pcsx2Config& config) } else { - config.GS.LimitScalar = 0.0; + config.GS.LimitScalar = 0.0f; } UpdateVSyncRate(); @@ -96,7 +96,7 @@ static __fi void gsCSRwrite( const tGS_CSR& csr ) // Our emulated GS has no FIFO, but if it did, it would flush it here... //Console.WriteLn("GS_CSR FLUSH GS fifo: %x (CSRr=%x)", value, GSCSRr); } - + if(csr.SIGNAL) { // SIGNAL : What's not known here is whether or not the SIGID register should be updated @@ -114,9 +114,9 @@ static __fi void gsCSRwrite( const tGS_CSR& csr ) gifUnit.gsSIGNAL.queued = false; gifUnit.Execute(false, true); // Resume paused transfers } - + if (csr.FINISH) { - CSRreg.FINISH = false; + CSRreg.FINISH = false; gifUnit.gsFINISH.gsFINISHFired = false; //Clear the previously fired FINISH (YS, Indiecar 2005, MGS3) } if(csr.HSINT) CSRreg.HSINT = false; @@ -140,7 +140,7 @@ __fi void gsWrite8(u32 mem, u8 value) { // CSR 8-bit write handlers. // I'm quite sure these would just write the CSR portion with the other - // bits set to 0 (no action). The previous implementation masked the 8-bit + // bits set to 0 (no action). The previous implementation masked the 8-bit // write value against the previous CSR write value, but that really doesn't // make any sense, given that the real hardware's CSR circuit probably has no // real "memory" where it saves anything. (for example, you can't write to @@ -173,7 +173,7 @@ __fi void gsWrite16(u32 mem, u16 value) { // See note above about CSR 8 bit writes, and handling them as zero'd bits // for all but the written parts. - + case GS_CSR: gsCSRwrite( tGS_CSR((u32)value) ); return; // do not write to MTGS memory @@ -215,30 +215,29 @@ __fi void gsWrite32(u32 mem, u32 value) ////////////////////////////////////////////////////////////////////////// // GS Write 64 bit -void gsWrite64_generic( u32 mem, const mem64_t* value ) +void gsWrite64_generic( u32 mem, u64 value ) { - const u32* const srcval32 = (u32*)value; - GIF_LOG("GS Write64 at %8.8lx with data %8.8x_%8.8x", mem, srcval32[1], srcval32[0]); + GIF_LOG("GS Write64 at %8.8lx with data %8.8x_%8.8x", mem, (u32)(value >> 32), (u32)value); - *(u64*)PS2GS_BASE(mem) = *value; + std::memcpy(PS2GS_BASE(mem), &value, sizeof(value)); } -void gsWrite64_page_00( u32 mem, const mem64_t* value ) +void gsWrite64_page_00( u32 mem, u64 value ) { s_GSRegistersWritten |= (mem == GS_DISPFB1 || mem == GS_DISPFB2 || mem == GS_PMODE); gsWrite64_generic( mem, value ); } -void gsWrite64_page_01( u32 mem, const mem64_t* value ) +void gsWrite64_page_01( u32 mem, u64 value ) { - GIF_LOG("GS Write64 at %8.8lx with data %8.8x_%8.8x", mem, (u32*)value[1], (u32*)value[0]); + GIF_LOG("GS Write64 at %8.8lx with data %8.8x_%8.8x", mem, (u32)(value >> 32), (u32)value); switch( mem ) { case GS_BUSDIR: - gifUnit.stat.DIR = value[0] & 1; + gifUnit.stat.DIR = static_cast(value) & 1; if (gifUnit.stat.DIR) { // Assume will do local->host transfer gifUnit.stat.OPH = true; // Should we set OPH here? gifUnit.FlushToMTGS(); // Send any pending GS Primitives to the GS @@ -252,11 +251,11 @@ void gsWrite64_page_01( u32 mem, const mem64_t* value ) return; case GS_CSR: - gsCSRwrite(tGS_CSR(*value)); + gsCSRwrite(tGS_CSR(value)); return; case GS_IMR: - IMRwrite((u32)value[0]); + IMRwrite(static_cast(value)); return; } @@ -266,35 +265,34 @@ void gsWrite64_page_01( u32 mem, const mem64_t* value ) ////////////////////////////////////////////////////////////////////////// // GS Write 128 bit -void gsWrite128_page_00( u32 mem, const mem128_t* value ) +void TAKES_R128 gsWrite128_page_00( u32 mem, r128 value ) { gsWrite128_generic( mem, value ); } -void gsWrite128_page_01( u32 mem, const mem128_t* value ) +void TAKES_R128 gsWrite128_page_01( u32 mem, r128 value ) { switch( mem ) { case GS_CSR: - gsCSRwrite((u32)value[0]); + gsCSRwrite(r128_to_u32(value)); return; case GS_IMR: - IMRwrite((u32)value[0]); + IMRwrite(r128_to_u32(value)); return; } gsWrite128_generic( mem, value ); } -void gsWrite128_generic( u32 mem, const mem128_t* value ) +void TAKES_R128 gsWrite128_generic( u32 mem, r128 value ) { - const u32* const srcval32 = (u32*)value; - + alignas(16) const u128 uvalue = r128_to_u128(value); GIF_LOG("GS Write128 at %8.8lx with data %8.8x_%8.8x_%8.8x_%8.8x", mem, - srcval32[3], srcval32[2], srcval32[1], srcval32[0]); + uvalue._u32[3], uvalue._u32[2], uvalue._u32[1], uvalue._u32[0]); - CopyQWC(PS2GS_BASE(mem), value); + r128_store(PS2GS_BASE(mem), value); } __fi u8 gsRead8(u32 mem) @@ -364,7 +362,7 @@ void gsIrq() { void gsPostVsyncStart() { //gifUnit.FlushToMTGS(); // Needed for some (broken?) homebrew game loaders - + const bool registers_written = s_GSRegistersWritten; s_GSRegistersWritten = false; GetMTGS().PostVsyncStart(registers_written); diff --git a/pcsx2/GS.h b/pcsx2/GS.h index 58c578a640..4fa4412bc9 100644 --- a/pcsx2/GS.h +++ b/pcsx2/GS.h @@ -18,6 +18,7 @@ #include "Common.h" #include "Gif.h" #include "GS/GS.h" +#include "SingleRegisterTypes.h" #include #include #include @@ -339,10 +340,9 @@ public: std::atomic m_VsyncSignalListener; std::mutex m_mtx_RingBufferBusy2; // Gets released on semaXGkick waiting... - std::mutex m_mtx_WaitGS; Threading::WorkSema m_sem_event; - Threading::KernelSemaphore m_sem_OnRingReset; - Threading::KernelSemaphore m_sem_Vsync; + Threading::UserspaceSemaphore m_sem_OnRingReset; + Threading::UserspaceSemaphore m_sem_Vsync; // used to keep multiple threads from sending packets to the ringbuffer concurrently. // (currently not used or implemented -- is a planned feature for a future threaded VU1) @@ -367,7 +367,8 @@ public: Threading::ThreadHandle m_thread_handle; std::atomic_bool m_open_flag{false}; std::atomic_bool m_shutdown_flag{false}; - Threading::KernelSemaphore m_open_or_close_done; + std::atomic_bool m_run_idle_flag{false}; + Threading::UserspaceSemaphore m_open_or_close_done; public: SysMtgsThread(); @@ -383,7 +384,7 @@ public: void ShutdownThread(); /// Re-presents the current frame. Call when things like window resizes happen to re-display - /// the current frame with the correct proportions. Should only be called on the GS thread. + /// the current frame with the correct proportions. Should only be called from the CPU thread. void PresentCurrentFrame(); // Waits for the GS to empty out the entire ring buffer contents. @@ -411,11 +412,13 @@ public: void ApplySettings(); void ResizeDisplayWindow(int width, int height, float scale); void UpdateDisplayWindow(); - void SetVSync(VsyncMode mode); + void SetVSyncMode(VsyncMode mode); + void UpdateVSyncMode(); void SwitchRenderer(GSRendererType renderer, bool display_message = true); void SetSoftwareRendering(bool software, bool display_message = true); void ToggleSoftwareRendering(); bool SaveMemorySnapshot(u32 width, u32 height, std::vector* pixels); + void SetRunIdle(bool enabled); protected: bool TryOpenGS(); @@ -449,13 +452,13 @@ extern void gsWrite8(u32 mem, u8 value); extern void gsWrite16(u32 mem, u16 value); extern void gsWrite32(u32 mem, u32 value); -extern void gsWrite64_page_00(u32 mem, const mem64_t* value); -extern void gsWrite64_page_01(u32 mem, const mem64_t* value); -extern void gsWrite64_generic(u32 mem, const mem64_t* value); +extern void gsWrite64_page_00(u32 mem, u64 value); +extern void gsWrite64_page_01(u32 mem, u64 value); +extern void gsWrite64_generic(u32 mem, u64 value); -extern void gsWrite128_page_00(u32 mem, const mem128_t* value); -extern void gsWrite128_page_01(u32 mem, const mem128_t* value); -extern void gsWrite128_generic(u32 mem, const mem128_t* value); +extern void TAKES_R128 gsWrite128_page_00(u32 mem, r128 value); +extern void TAKES_R128 gsWrite128_page_01(u32 mem, r128 value); +extern void TAKES_R128 gsWrite128_generic(u32 mem, r128 value); extern u8 gsRead8(u32 mem); extern u16 gsRead16(u32 mem); diff --git a/pcsx2/GS/GS.cpp b/pcsx2/GS/GS.cpp index 7616851e42..769b948b57 100644 --- a/pcsx2/GS/GS.cpp +++ b/pcsx2/GS/GS.cpp @@ -22,12 +22,12 @@ #include "GSGL.h" #include "GSUtil.h" #include "GSExtra.h" -#include "Renderers/SW/GSRendererSW.h" #include "Renderers/Null/GSRendererNull.h" #include "Renderers/Null/GSDeviceNull.h" #include "Renderers/HW/GSRendererHW.h" #include "Renderers/HW/GSTextureReplacements.h" #include "GSLzma.h" +#include "MultiISA.h" #include "common/Console.h" #include "common/FileSystem.h" @@ -40,6 +40,7 @@ #include "pcsx2/GS.h" #ifdef PCSX2_CORE #include "pcsx2/HostSettings.h" +#include "pcsx2/Frontend/FullscreenUI.h" #include "pcsx2/Frontend/InputManager.h" #endif @@ -75,7 +76,7 @@ static HRESULT s_hr = E_FAIL; Pcsx2Config::GSOptions GSConfig; -static HostDisplay::RenderAPI s_render_api; +static RenderAPI s_render_api; int GSinit() { @@ -90,15 +91,10 @@ int GSinit() // const type qualifier from all the affected variables. GSinitConfig(); - + GSVertexSW::InitStatic(); GSUtil::Init(); - if (g_const == nullptr) - return -1; - else - g_const->Init(); - #ifdef _WIN32 s_hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); #endif @@ -131,7 +127,7 @@ void GSshutdown() g_gs_device.reset(); } - Host::ReleaseHostDisplay(); + Host::ReleaseHostDisplay(true); #endif #ifdef _WIN32 @@ -157,51 +153,51 @@ void GSclose() g_gs_device.reset(); } - if (HostDisplay* display = Host::GetHostDisplay(); display) - display->SetGPUTimingEnabled(false); + if (g_host_display) + g_host_display->SetGPUTimingEnabled(false); - Host::ReleaseHostDisplay(); + Host::ReleaseHostDisplay(true); } -static HostDisplay::RenderAPI GetAPIForRenderer(GSRendererType renderer) +static RenderAPI GetAPIForRenderer(GSRendererType renderer) { #if defined(_WIN32) // On Windows, we use DX11 for software, since it's always available. - constexpr HostDisplay::RenderAPI default_api = HostDisplay::RenderAPI::D3D11; + constexpr RenderAPI default_api = RenderAPI::D3D11; #elif defined(__APPLE__) // For Macs, default to Metal. - constexpr HostDisplay::RenderAPI default_api = HostDisplay::RenderAPI::Metal; + constexpr RenderAPI default_api = RenderAPI::Metal; #else // For Linux, default to OpenGL (because of hardware compatibility), if we // have it, otherwise Vulkan (if we have it). #if defined(ENABLE_OPENGL) - constexpr HostDisplay::RenderAPI default_api = HostDisplay::RenderAPI::OpenGL; + constexpr RenderAPI default_api = RenderAPI::OpenGL; #elif defined(ENABLE_VULKAN) - constexpr HostDisplay::RenderAPI default_api = HostDisplay::RenderAPI::Vulkan; + constexpr RenderAPI default_api = RenderAPI::Vulkan; #else - constexpr HostDisplay::RenderAPI default_api = HostDisplay::RenderAPI::None; + constexpr RenderAPI default_api = RenderAPI::None; #endif #endif switch (renderer) { case GSRendererType::OGL: - return HostDisplay::RenderAPI::OpenGL; + return RenderAPI::OpenGL; case GSRendererType::VK: - return HostDisplay::RenderAPI::Vulkan; + return RenderAPI::Vulkan; #ifdef _WIN32 case GSRendererType::DX11: - return HostDisplay::RenderAPI::D3D11; + return RenderAPI::D3D11; case GSRendererType::DX12: - return HostDisplay::RenderAPI::D3D12; + return RenderAPI::D3D12; #endif #ifdef __APPLE__ case GSRendererType::Metal: - return HostDisplay::RenderAPI::Metal; + return RenderAPI::Metal; #endif default: @@ -211,47 +207,44 @@ static HostDisplay::RenderAPI GetAPIForRenderer(GSRendererType renderer) static bool DoGSOpen(GSRendererType renderer, u8* basemem) { - HostDisplay* display = Host::GetHostDisplay(); - pxAssert(display); + s_render_api = g_host_display->GetRenderAPI(); - s_render_api = Host::GetHostDisplay()->GetRenderAPI(); - - switch (display->GetRenderAPI()) + switch (g_host_display->GetRenderAPI()) { #ifdef _WIN32 - case HostDisplay::RenderAPI::D3D11: + case RenderAPI::D3D11: g_gs_device = std::make_unique(); break; - case HostDisplay::RenderAPI::D3D12: + case RenderAPI::D3D12: g_gs_device = std::make_unique(); break; #endif #ifdef __APPLE__ - case HostDisplay::RenderAPI::Metal: + case RenderAPI::Metal: g_gs_device = std::unique_ptr(MakeGSDeviceMTL()); break; #endif #ifdef ENABLE_OPENGL - case HostDisplay::RenderAPI::OpenGL: - case HostDisplay::RenderAPI::OpenGLES: + case RenderAPI::OpenGL: + case RenderAPI::OpenGLES: g_gs_device = std::make_unique(); break; #endif #ifdef ENABLE_VULKAN - case HostDisplay::RenderAPI::Vulkan: + case RenderAPI::Vulkan: g_gs_device = std::make_unique(); break; #endif default: - Console.Error("Unknown render API %u", static_cast(display->GetRenderAPI())); + Console.Error("Unknown render API %u", static_cast(g_host_display->GetRenderAPI())); return false; } try { - if (!g_gs_device->Create(display)) + if (!g_gs_device->Create()) { g_gs_device->Destroy(); g_gs_device.reset(); @@ -269,7 +262,7 @@ static bool DoGSOpen(GSRendererType renderer, u8* basemem) else { const int threads = theApp.GetConfigI("extrathreads"); - g_gs_renderer = std::make_unique(threads); + g_gs_renderer = std::unique_ptr(MULTI_ISA_SELECT(makeGSRendererSW)(threads)); } } catch (std::exception& ex) @@ -281,8 +274,7 @@ static bool DoGSOpen(GSRendererType renderer, u8* basemem) return false; } - display->SetVSync(EmuConfig.GetEffectiveVsyncMode()); - GSConfig.OsdShowGPU = EmuConfig.GS.OsdShowGPU && display->SetGPUTimingEnabled(true); + GSConfig.OsdShowGPU = EmuConfig.GS.OsdShowGPU && g_host_display->SetGPUTimingEnabled(true); g_gs_renderer->SetRegsMem(basemem); g_perfmon.Reset(); @@ -293,7 +285,7 @@ bool GSreopen(bool recreate_display, const Pcsx2Config::GSOptions& old_config) { Console.WriteLn("Reopening GS with %s display", recreate_display ? "new" : "existing"); - g_gs_renderer->Flush(); + g_gs_renderer->Flush(GSState::GSFlushReason::GSREOPEN); freezeData fd = {}; if (g_gs_renderer->Freeze(&fd, true) != 0) @@ -327,13 +319,13 @@ bool GSreopen(bool recreate_display, const Pcsx2Config::GSOptions& old_config) if (recreate_display) { - Host::ReleaseHostDisplay(); - if (!Host::AcquireHostDisplay(GetAPIForRenderer(GSConfig.Renderer))) + Host::ReleaseHostDisplay(false); + if (!Host::AcquireHostDisplay(GetAPIForRenderer(GSConfig.Renderer), false)) { Console.Error("(GSreopen) Failed to reacquire host display"); // try to get the old one back - if (!Host::AcquireHostDisplay(GetAPIForRenderer(old_config.Renderer))) + if (!Host::AcquireHostDisplay(GetAPIForRenderer(old_config.Renderer), false)) { pxFailRel("Failed to recreate old config host display"); return false; @@ -341,7 +333,7 @@ bool GSreopen(bool recreate_display, const Pcsx2Config::GSOptions& old_config) Host::AddKeyedOSDMessage("GSReopenFailed", fmt::format("Failed to open {} display, switching back to {}.", HostDisplay::RenderAPIToString(GetAPIForRenderer(GSConfig.Renderer)), - HostDisplay::RenderAPIToString(GetAPIForRenderer(old_config.Renderer)), 10.0f)); + HostDisplay::RenderAPIToString(GetAPIForRenderer(old_config.Renderer)), Host::OSD_CRITICAL_ERROR_DURATION)); GSConfig = old_config; } } @@ -353,15 +345,15 @@ bool GSreopen(bool recreate_display, const Pcsx2Config::GSOptions& old_config) // try the old config if (recreate_display && GSConfig.Renderer != old_config.Renderer) { - Host::ReleaseHostDisplay(); - if (!Host::AcquireHostDisplay(GetAPIForRenderer(old_config.Renderer))) + Host::ReleaseHostDisplay(false); + if (!Host::AcquireHostDisplay(GetAPIForRenderer(old_config.Renderer), false)) { pxFailRel("Failed to recreate old config host display (part 2)"); return false; } } - Host::AddKeyedOSDMessage("GSReopenFailed","Failed to reopen, restoring old configuration.", 10.0f); + Host::AddKeyedOSDMessage("GSReopenFailed","Failed to reopen, restoring old configuration.", Host::OSD_CRITICAL_ERROR_DURATION); GSConfig = old_config; if (!DoGSOpen(GSConfig.Renderer, basemem)) { @@ -388,7 +380,7 @@ bool GSopen(const Pcsx2Config::GSOptions& config, GSRendererType renderer, u8* b GSConfig = config; GSConfig.Renderer = renderer; - if (!Host::AcquireHostDisplay(GetAPIForRenderer(renderer))) + if (!Host::AcquireHostDisplay(GetAPIForRenderer(renderer), true)) { Console.Error("Failed to acquire host display"); return false; @@ -396,7 +388,7 @@ bool GSopen(const Pcsx2Config::GSOptions& config, GSRendererType renderer, u8* b if (!DoGSOpen(renderer, basemem)) { - Host::ReleaseHostDisplay(); + Host::ReleaseHostDisplay(true); return false; } @@ -758,22 +750,21 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config) if (!g_gs_renderer) return; - HostDisplay* display = Host::GetHostDisplay(); // Handle OSD scale changes by pushing a window resize through. if (new_config.OsdScale != old_config.OsdScale) { g_gs_device->ResetAPIState(); - Host::ResizeHostDisplay(display->GetWindowWidth(), display->GetWindowHeight(), display->GetWindowScale()); + Host::ResizeHostDisplay(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight(), g_host_display->GetWindowScale()); g_gs_device->RestoreAPIState(); } // Options which need a full teardown/recreate. if (!GSConfig.RestartOptionsAreEqual(old_config)) { - HostDisplay::RenderAPI existing_api = Host::GetHostDisplay()->GetRenderAPI(); - if (existing_api == HostDisplay::RenderAPI::OpenGLES) - existing_api = HostDisplay::RenderAPI::OpenGL; + RenderAPI existing_api = g_host_display->GetRenderAPI(); + if (existing_api == RenderAPI::OpenGLES) + existing_api = RenderAPI::OpenGL; const bool do_full_restart = ( existing_api != GetAPIForRenderer(GSConfig.Renderer) || @@ -802,10 +793,7 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config) GSConfig.SWExtraThreadsHeight != old_config.SWExtraThreadsHeight || GSConfig.SaveN != old_config.SaveN || - GSConfig.SaveL != old_config.SaveL || - - GSConfig.ShaderFX_Conf != old_config.ShaderFX_Conf || - GSConfig.ShaderFX_GLSL != old_config.ShaderFX_GLSL) + GSConfig.SaveL != old_config.SaveL) { if (!GSreopen(false, old_config)) pxFailRel("Failed to do quick GS reopen"); @@ -829,9 +817,8 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config) // reload texture cache when trilinear filtering or TC options change if ( (GSConfig.UseHardwareRenderer() && GSConfig.HWMipmap != old_config.HWMipmap) || - GSConfig.ConservativeFramebuffer != old_config.ConservativeFramebuffer || GSConfig.TexturePreloading != old_config.TexturePreloading || - GSConfig.UserHacks_TriFilter != old_config.UserHacks_TriFilter || + GSConfig.TriFilter != old_config.TriFilter || GSConfig.GPUPaletteConversion != old_config.GPUPaletteConversion || GSConfig.PreloadFrameWithGSData != old_config.PreloadFrameWithGSData || GSConfig.WrapGSMem != old_config.WrapGSMem || @@ -839,7 +826,8 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config) GSConfig.UserHacks_DisableDepthSupport != old_config.UserHacks_DisableDepthSupport || GSConfig.UserHacks_DisablePartialInvalidation != old_config.UserHacks_DisablePartialInvalidation || GSConfig.UserHacks_TextureInsideRt != old_config.UserHacks_TextureInsideRt || - GSConfig.UserHacks_CPUSpriteRenderBW != old_config.UserHacks_CPUSpriteRenderBW) + GSConfig.UserHacks_CPUSpriteRenderBW != old_config.UserHacks_CPUSpriteRenderBW || + GSConfig.UserHacks_CPUCLUTRender != old_config.UserHacks_CPUCLUTRender) { g_gs_renderer->PurgeTextureCache(); g_gs_renderer->PurgePool(); @@ -862,11 +850,8 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config) if (GSConfig.OsdShowGPU != old_config.OsdShowGPU) { - if (HostDisplay* display = Host::GetHostDisplay(); display) - { - if (!display->SetGPUTimingEnabled(GSConfig.OsdShowGPU)) - GSConfig.OsdShowGPU = false; - } + if (!g_host_display->SetGPUTimingEnabled(GSConfig.OsdShowGPU)) + GSConfig.OsdShowGPU = false; } } @@ -878,9 +863,9 @@ void GSSwitchRenderer(GSRendererType new_renderer) if (!g_gs_renderer || GSConfig.Renderer == new_renderer) return; - HostDisplay::RenderAPI existing_api = Host::GetHostDisplay()->GetRenderAPI(); - if (existing_api == HostDisplay::RenderAPI::OpenGLES) - existing_api = HostDisplay::RenderAPI::OpenGL; + RenderAPI existing_api = g_host_display->GetRenderAPI(); + if (existing_api == RenderAPI::OpenGLES) + existing_api = RenderAPI::OpenGL; const bool is_software_switch = (new_renderer == GSRendererType::SW || GSConfig.Renderer == GSRendererType::SW); const bool recreate_display = (!is_software_switch && existing_api != GetAPIForRenderer(new_renderer)); @@ -1317,14 +1302,16 @@ void GSApp::Init() // The null renderer goes last, it has use for benchmarking purposes in a release build m_gs_renderers.push_back(GSSetting(static_cast(GSRendererType::Null), "Null", "")); - m_gs_deinterlace.push_back(GSSetting(0, "None", "")); - m_gs_deinterlace.push_back(GSSetting(1, "Weave tff", "saw-tooth")); - m_gs_deinterlace.push_back(GSSetting(2, "Weave bff", "saw-tooth")); - m_gs_deinterlace.push_back(GSSetting(3, "Bob tff", "use blend if shaking")); - m_gs_deinterlace.push_back(GSSetting(4, "Bob bff", "use blend if shaking")); - m_gs_deinterlace.push_back(GSSetting(5, "Blend tff", "slight blur, 1/2 fps")); - m_gs_deinterlace.push_back(GSSetting(6, "Blend bff", "slight blur, 1/2 fps")); - m_gs_deinterlace.push_back(GSSetting(7, "Automatic", "Default")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::Automatic), "Automatic", "Default")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::Off), "None", "")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::WeaveTFF), "Weave tff", "saw-tooth")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::WeaveBFF), "Weave bff", "saw-tooth")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::BobTFF), "Bob tff", "use adaptive or blend if shaking")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::BobBFF), "Bob bff", "use adaptive or blend if shaking")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::BlendTFF), "Blend tff", "slight blur, 1/2 fps")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::BlendBFF), "Blend bff", "slight blur, 1/2 fps")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::AdaptiveTFF), "Adaptive tff", "minor artifacts")); + m_gs_deinterlace.push_back(GSSetting(static_cast(GSInterlaceMode::AdaptiveBFF), "Adaptive bff", "minor artifacts")); m_gs_upscale_multiplier.push_back(GSSetting(1, "Native", "PS2")); m_gs_upscale_multiplier.push_back(GSSetting(2, "2x Native", "~720p")); @@ -1355,10 +1342,14 @@ void GSApp::Init() m_gs_trifilter.push_back(GSSetting(static_cast(TriFiltering::PS2), "Trilinear", "")); m_gs_trifilter.push_back(GSSetting(static_cast(TriFiltering::Forced), "Trilinear", "Ultra/Slow")); - m_gs_texture_preloading.push_back(GSSetting(static_cast(TexturePreloadingLevel::Off), "None", "Default")); + m_gs_texture_preloading.push_back(GSSetting(static_cast(TexturePreloadingLevel::Off), "None", "")); m_gs_texture_preloading.push_back(GSSetting(static_cast(TexturePreloadingLevel::Partial), "Partial", "")); m_gs_texture_preloading.push_back(GSSetting(static_cast(TexturePreloadingLevel::Full), "Full", "Hash Cache")); + m_gs_tex_display_list.push_back(GSSetting(static_cast(GSPostBilinearMode::Off), "None", "")); + m_gs_tex_display_list.push_back(GSSetting(static_cast(GSPostBilinearMode::BilinearSmooth), "Bilinear (Smooth)", "")); + m_gs_tex_display_list.push_back(GSSetting(static_cast(GSPostBilinearMode::BilinearSharp), "Bilinear (Sharp)", "")); + m_gs_generic_list.push_back(GSSetting(-1, "Automatic", "Default")); m_gs_generic_list.push_back(GSSetting(0, "Force-Disabled", "")); m_gs_generic_list.push_back(GSSetting(1, "Force-Enabled", "")); @@ -1404,6 +1395,15 @@ void GSApp::Init() m_gs_tv_shaders.push_back(GSSetting(4, "Wave filter", "")); m_gs_tv_shaders.push_back(GSSetting(5, "Lottes CRT filter", "")); + m_gs_casmode.push_back(GSSetting(static_cast(GSCASMode::Disabled), "Disabled", "")); + m_gs_casmode.push_back(GSSetting(static_cast(GSCASMode::SharpenOnly), "Sharpen Only", "Internal Resolution")); + m_gs_casmode.push_back(GSSetting(static_cast(GSCASMode::SharpenAndResize), "Sharpen And Resize", "Display Resolution")); + + m_gs_hw_download_mode.push_back(GSSetting(static_cast(GSHardwareDownloadMode::Enabled), "Accurate", "Recommended")); + m_gs_hw_download_mode.push_back(GSSetting(static_cast(GSHardwareDownloadMode::NoReadbacks), "Disable Readbacks", "Synchronize GS Thread")); + m_gs_hw_download_mode.push_back(GSSetting(static_cast(GSHardwareDownloadMode::Unsynchronized), "Unsynchronized", "Non-Deterministic")); + m_gs_hw_download_mode.push_back(GSSetting(static_cast(GSHardwareDownloadMode::Disabled), "Disabled", "Ignore Transfers")); + m_gs_dump_compression.push_back(GSSetting(static_cast(GSDumpCompressionMethod::Uncompressed), "Uncompressed", "")); m_gs_dump_compression.push_back(GSSetting(static_cast(GSDumpCompressionMethod::LZMA), "LZMA (xz)", "")); m_gs_dump_compression.push_back(GSSetting(static_cast(GSDumpCompressionMethod::Zstandard), "Zstandard (zst)", "")); @@ -1420,9 +1420,7 @@ void GSApp::Init() #else m_default_configuration["linux_replay"] = "1"; #endif - m_default_configuration["aa1"] = "1"; - m_default_configuration["accurate_date"] = "1"; - m_default_configuration["accurate_blending_unit"] = "1"; + m_default_configuration["accurate_blending_unit"] = std::to_string(static_cast(AccBlendLevel::Basic)); m_default_configuration["AspectRatio"] = "1"; m_default_configuration["autoflush_sw"] = "1"; m_default_configuration["capture_enabled"] = "0"; @@ -1432,7 +1430,6 @@ void GSApp::Init() m_default_configuration["CaptureWidth"] = "640"; m_default_configuration["crc_hack_level"] = std::to_string(static_cast(CRCHackLevel::Automatic)); m_default_configuration["CrcHacksExclusions"] = ""; - m_default_configuration["disable_hw_gl_draw"] = "0"; m_default_configuration["disable_shader_cache"] = "0"; m_default_configuration["DisableDualSourceBlend"] = "0"; m_default_configuration["DisableFramebufferFetch"] = "0"; @@ -1445,20 +1442,20 @@ void GSApp::Init() m_default_configuration["DumpPaletteTextures"] = "1"; m_default_configuration["extrathreads"] = "2"; m_default_configuration["extrathreads_height"] = "4"; - m_default_configuration["filter"] = std::to_string(static_cast(BiFiltering::PS2)); - m_default_configuration["FMVSoftwareRendererSwitch"] = "0"; + m_default_configuration["filter"] = std::to_string(static_cast(BiFiltering::PS2)); m_default_configuration["FullscreenMode"] = ""; m_default_configuration["fxaa"] = "0"; - m_default_configuration["GSDumpCompression"] = "0"; - m_default_configuration["HWDisableReadbacks"] = "0"; + m_default_configuration["HWDownloadMode"] = std::to_string(static_cast(GSHardwareDownloadMode::Enabled)); + m_default_configuration["GSDumpCompression"] = std::to_string(static_cast(GSDumpCompressionMethod::Zstandard)); + m_default_configuration["HWSpinGPUForReadbacks"] = "0"; + m_default_configuration["HWSpinCPUForReadbacks"] = "0"; m_default_configuration["pcrtc_antiblur"] = "1"; m_default_configuration["disable_interlace_offset"] = "0"; m_default_configuration["pcrtc_offsets"] = "0"; m_default_configuration["pcrtc_overscan"] = "0"; m_default_configuration["IntegerScaling"] = "0"; - m_default_configuration["deinterlace"] = "7"; - m_default_configuration["conservative_framebuffer"] = "1"; - m_default_configuration["linear_present"] = "1"; + m_default_configuration["deinterlace_mode"] = std::to_string(static_cast(GSInterlaceMode::Automatic)); + m_default_configuration["linear_present_mode"] = std::to_string(static_cast(GSPostBilinearMode::BilinearSmooth)); m_default_configuration["LoadTextureReplacements"] = "0"; m_default_configuration["LoadTextureReplacementsAsync"] = "1"; m_default_configuration["MaxAnisotropy"] = "0"; @@ -1472,16 +1469,15 @@ void GSApp::Init() m_default_configuration["OsdShowResolution"] = "0"; m_default_configuration["OsdShowGSStats"] = "0"; m_default_configuration["OsdShowIndicators"] = "1"; + m_default_configuration["OsdShowSettings"] = "0"; + m_default_configuration["OsdShowInputs"] = "0"; + m_default_configuration["OsdShowFrameTimes"] = "0"; m_default_configuration["OsdScale"] = "100"; m_default_configuration["override_GL_ARB_copy_image"] = "-1"; - m_default_configuration["override_GL_ARB_clear_texture"] = "-1"; m_default_configuration["override_GL_ARB_clip_control"] = "-1"; m_default_configuration["override_GL_ARB_direct_state_access"] = "-1"; m_default_configuration["override_GL_ARB_draw_buffers_blend"] = "-1"; m_default_configuration["override_GL_ARB_gpu_shader5"] = "-1"; - m_default_configuration["override_GL_ARB_shader_image_load_store"] = "-1"; - m_default_configuration["override_GL_ARB_sparse_texture"] = "-1"; - m_default_configuration["override_GL_ARB_sparse_texture2"] = "-1"; m_default_configuration["override_GL_ARB_texture_barrier"] = "-1"; m_default_configuration["OverrideTextureBarriers"] = "-1"; m_default_configuration["OverrideGeometryShaders"] = "-1"; @@ -1501,13 +1497,13 @@ void GSApp::Init() m_default_configuration["ShadeBoost_Brightness"] = "50"; m_default_configuration["ShadeBoost_Contrast"] = "50"; m_default_configuration["ShadeBoost_Saturation"] = "50"; - m_default_configuration["shaderfx"] = "0"; - m_default_configuration["shaderfx_conf"] = "shaders/GS_FX_Settings.ini"; - m_default_configuration["shaderfx_glsl"] = "shaders/GS.fx"; m_default_configuration["SkipDuplicateFrames"] = "0"; - m_default_configuration["texture_preloading"] = "0"; + m_default_configuration["texture_preloading"] = "2"; m_default_configuration["ThreadedPresentation"] = "0"; + m_default_configuration["TriFilter"] = std::to_string(static_cast(TriFiltering::Automatic)); m_default_configuration["TVShader"] = "0"; + m_default_configuration["CASMode"] = std::to_string(static_cast(GSCASMode::Disabled)); + m_default_configuration["CASSharpness"] = "50"; m_default_configuration["upscale_multiplier"] = "1"; m_default_configuration["UseBlitSwapChain"] = "0"; m_default_configuration["UseDebugDevice"] = "0"; @@ -1518,6 +1514,7 @@ void GSApp::Init() m_default_configuration["UserHacks_Disable_Safe_Features"] = "0"; m_default_configuration["UserHacks_DisablePartialInvalidation"] = "0"; m_default_configuration["UserHacks_CPUSpriteRenderBW"] = "0"; + m_default_configuration["UserHacks_CPUCLUTRender"] = "0"; m_default_configuration["UserHacks_CPU_FB_Conversion"] = "0"; m_default_configuration["UserHacks_Half_Bottom_Override"] = "-1"; m_default_configuration["UserHacks_HalfPixelOffset"] = "0"; @@ -1528,7 +1525,6 @@ void GSApp::Init() m_default_configuration["UserHacks_TCOffsetX"] = "0"; m_default_configuration["UserHacks_TCOffsetY"] = "0"; m_default_configuration["UserHacks_TextureInsideRt"] = "0"; - m_default_configuration["UserHacks_TriFilter"] = std::to_string(static_cast(TriFiltering::Automatic)); m_default_configuration["UserHacks_WildHack"] = "0"; m_default_configuration["wrap_gs_mem"] = "0"; m_default_configuration["vsync"] = "0"; @@ -1683,7 +1679,7 @@ void GSApp::SetConfig(const char* entry, int value) static void HotkeyAdjustUpscaleMultiplier(s32 delta) { const u32 new_multiplier = static_cast(std::clamp(static_cast(EmuConfig.GS.UpscaleMultiplier) + delta, 1, 8)); - Host::AddKeyedFormattedOSDMessage("UpscaleMultiplierChanged", 10.0f, "Upscale multiplier set to %ux.", new_multiplier); + Host::AddKeyedFormattedOSDMessage("UpscaleMultiplierChanged", Host::OSD_QUICK_DURATION, "Upscale multiplier set to %ux.", new_multiplier); EmuConfig.GS.UpscaleMultiplier = new_multiplier; // this is pretty slow. we only really need to flush the TC and recompile shaders. @@ -1694,7 +1690,7 @@ static void HotkeyAdjustUpscaleMultiplier(s32 delta) static void HotkeyAdjustZoom(double delta) { const double new_zoom = std::clamp(EmuConfig.GS.Zoom + delta, 1.0, 200.0); - Host::AddKeyedFormattedOSDMessage("ZoomChanged", 10.0f, "Zoom set to %.1f%%.", new_zoom); + Host::AddKeyedFormattedOSDMessage("ZoomChanged", Host::OSD_QUICK_DURATION, "Zoom set to %.1f%%.", new_zoom); EmuConfig.GS.Zoom = new_zoom; // no need to go through the full settings update for this @@ -1744,7 +1740,7 @@ BEGIN_HOTKEY_LIST(g_gs_hotkeys) // technically this races, but the worst that'll happen is one frame uses the old AR. EmuConfig.CurrentAspectRatio = static_cast((static_cast(EmuConfig.CurrentAspectRatio) + 1) % static_cast(AspectRatioType::MaxCount)); - Host::AddKeyedFormattedOSDMessage("CycleAspectRatio", 10.0f, "Aspect ratio set to '%s'.", Pcsx2Config::GSOptions::AspectRatioNames[static_cast(EmuConfig.CurrentAspectRatio)]); + Host::AddKeyedFormattedOSDMessage("CycleAspectRatio", Host::OSD_QUICK_DURATION, "Aspect ratio set to '%s'.", Pcsx2Config::GSOptions::AspectRatioNames[static_cast(EmuConfig.CurrentAspectRatio)]); }}, {"CycleMipmapMode", "Graphics", "Cycle Hardware Mipmapping", [](s32 pressed) { if (pressed) @@ -1754,7 +1750,7 @@ BEGIN_HOTKEY_LIST(g_gs_hotkeys) static constexpr std::array option_names = {{"Automatic", "Off", "Basic (Generated)", "Full (PS2)"}}; const HWMipmapLevel new_level = static_cast(((static_cast(EmuConfig.GS.HWMipmap) + 2) % CYCLE_COUNT) - 1); - Host::AddKeyedFormattedOSDMessage("CycleMipmapMode", 10.0f, "Hardware mipmapping set to '%s'.", option_names[static_cast(new_level) + 1]); + Host::AddKeyedFormattedOSDMessage("CycleMipmapMode", Host::OSD_QUICK_DURATION, "Hardware mipmapping set to '%s'.", option_names[static_cast(new_level) + 1]); EmuConfig.GS.HWMipmap = new_level; GetMTGS().RunOnGSThread([new_level]() { @@ -1768,6 +1764,7 @@ BEGIN_HOTKEY_LIST(g_gs_hotkeys) return; static constexpr std::array(GSInterlaceMode::Count)> option_names = {{ + "Automatic", "Off", "Weave (Top Field First)", "Weave (Bottom Field First)", @@ -1775,11 +1772,12 @@ BEGIN_HOTKEY_LIST(g_gs_hotkeys) "Bob (Bottom Field First)", "Blend (Top Field First)", "Blend (Bottom Field First)", - "Automatic", + "Adaptive (Top Field First)", + "Adaptive (Bottom Field First)", }}; const GSInterlaceMode new_mode = static_cast((static_cast(EmuConfig.GS.InterlaceMode) + 1) % static_cast(GSInterlaceMode::Count)); - Host::AddKeyedFormattedOSDMessage("CycleInterlaceMode", 10.0f, "Deinterlace mode set to '%s'.", option_names[static_cast(new_mode)]); + Host::AddKeyedFormattedOSDMessage("CycleInterlaceMode", Host::OSD_QUICK_DURATION, "Deinterlace mode set to '%s'.", option_names[static_cast(new_mode)]); EmuConfig.GS.InterlaceMode = new_mode; GetMTGS().RunOnGSThread([new_mode]() { GSConfig.InterlaceMode = new_mode; }); @@ -1796,7 +1794,9 @@ BEGIN_HOTKEY_LIST(g_gs_hotkeys) if (!pressed) { EmuConfig.GS.DumpReplaceableTextures = !EmuConfig.GS.DumpReplaceableTextures; - Host::AddKeyedOSDMessage("ToggleTextureReplacements", EmuConfig.GS.DumpReplaceableTextures ? "Texture dumping is now enabled." : "Texture dumping is now disabled.", 10.0f); + Host::AddKeyedOSDMessage("ToggleTextureReplacements", + EmuConfig.GS.DumpReplaceableTextures ? "Texture dumping is now enabled." : "Texture dumping is now disabled.", + Host::OSD_INFO_DURATION); GetMTGS().ApplySettings(); } }}, @@ -1804,7 +1804,9 @@ BEGIN_HOTKEY_LIST(g_gs_hotkeys) if (!pressed) { EmuConfig.GS.LoadTextureReplacements = !EmuConfig.GS.LoadTextureReplacements; - Host::AddKeyedOSDMessage("ToggleTextureReplacements", EmuConfig.GS.LoadTextureReplacements ? "Texture replacements are now enabled." : "Texture replacements are now disabled.", 10.0f); + Host::AddKeyedOSDMessage("ToggleTextureReplacements", + EmuConfig.GS.LoadTextureReplacements ? "Texture replacements are now enabled." : "Texture replacements are now disabled.", + Host::OSD_INFO_DURATION); GetMTGS().ApplySettings(); } }}, @@ -1813,11 +1815,11 @@ BEGIN_HOTKEY_LIST(g_gs_hotkeys) { if (!EmuConfig.GS.LoadTextureReplacements) { - Host::AddKeyedOSDMessage("ReloadTextureReplacements", "Texture replacements are not enabled.", 10.0f); + Host::AddKeyedOSDMessage("ReloadTextureReplacements", "Texture replacements are not enabled.", Host::OSD_INFO_DURATION); } else { - Host::AddKeyedOSDMessage("ReloadTextureReplacements", "Reloading texture replacements...", 10.0f); + Host::AddKeyedOSDMessage("ReloadTextureReplacements", "Reloading texture replacements...", Host::OSD_INFO_DURATION); GetMTGS().RunOnGSThread([]() { GSTextureReplacements::ReloadReplacementMap(); }); diff --git a/pcsx2/GS/GS.h b/pcsx2/GS/GS.h index 09464b4552..e17e39c1d4 100644 --- a/pcsx2/GS/GS.h +++ b/pcsx2/GS/GS.h @@ -137,11 +137,14 @@ public: std::vector m_gs_texture_preloading; std::vector m_gs_hack; std::vector m_gs_generic_list; + std::vector m_gs_tex_display_list; std::vector m_gs_offset_hack; std::vector m_gs_hw_mipmapping; std::vector m_gs_crc_level; std::vector m_gs_acc_blend_level; std::vector m_gs_tv_shaders; + std::vector m_gs_casmode; + std::vector m_gs_hw_download_mode; std::vector m_gs_dump_compression; }; diff --git a/pcsx2/GS/GS.rc b/pcsx2/GS/GS.rc index accc4c6954..91749b5b73 100644 --- a/pcsx2/GS/GS.rc +++ b/pcsx2/GS/GS.rc @@ -28,12 +28,12 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "resource.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#ifndef APSTUDIO_INVOKED\r\n" "#include ""targetver.h""\r\n" diff --git a/pcsx2/GS/GSAlignedClass.h b/pcsx2/GS/GSAlignedClass.h index 7f2148ccec..b2259fa236 100644 --- a/pcsx2/GS/GSAlignedClass.h +++ b/pcsx2/GS/GSAlignedClass.h @@ -56,3 +56,11 @@ public: _aligned_free(p); } }; + +/// GSAlignedClass with a virtual destructor +template +class GSVirtualAlignedClass : public GSAlignedClass +{ +public: + virtual ~GSVirtualAlignedClass() {} +}; diff --git a/pcsx2/GS/GSBlock.cpp b/pcsx2/GS/GSBlock.cpp index b3bd16aa9a..c4e735a6d6 100644 --- a/pcsx2/GS/GSBlock.cpp +++ b/pcsx2/GS/GSBlock.cpp @@ -16,6 +16,8 @@ #include "PrecompiledHeader.h" #include "GSBlock.h" +MULTI_ISA_UNSHARED_IMPL; + CONSTINIT const GSVector4i GSBlock::m_r16mask(0, 1, 4, 5, 8, 9, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15); CONSTINIT const GSVector4i GSBlock::m_r8mask(0, 4, 2, 6, 8, 12, 10, 14, 1, 5, 3, 7, 9, 13, 11, 15); CONSTINIT const GSVector4i GSBlock::m_r4mask(0, 8, 4, 12, 1, 9, 5, 13, 2, 10, 6, 14, 3, 11, 7, 15); diff --git a/pcsx2/GS/GSBlock.h b/pcsx2/GS/GSBlock.h index eb475184bd..d70d47e2b1 100644 --- a/pcsx2/GS/GSBlock.h +++ b/pcsx2/GS/GSBlock.h @@ -18,6 +18,9 @@ #include "GSRegs.h" #include "GSTables.h" #include "GSVector.h" +#include "MultiISA.h" + +MULTI_ISA_UNSHARED_START class GSBlock { @@ -1940,3 +1943,5 @@ public: // TODO: ReadAndExpandBlock4HH_16 }; + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/GS/GSCapture.cpp b/pcsx2/GS/GSCapture.cpp index 99dd046030..320d53fae4 100644 --- a/pcsx2/GS/GSCapture.cpp +++ b/pcsx2/GS/GSCapture.cpp @@ -395,8 +395,11 @@ static wil::com_ptr_nothrow GetFirstPin(IBaseFilter* pBF, PIN_DIRECTION di // GSCapture::GSCapture() - : m_capturing(false), m_frame(0) + : m_capturing(false) , m_out_dir("/tmp/GS_Capture") // FIXME Later add an option +#if defined(__unix__) + , m_frame(0) +#endif { } @@ -545,6 +548,9 @@ bool GSCapture::BeginCapture(float fps, GSVector2i recommendedResolution, float m_capturing = true; filename = m_out_dir + "/audio_recording.wav"; return true; +#else + // FIXME: MACOS + return false; #endif } diff --git a/pcsx2/GS/GSCapture.h b/pcsx2/GS/GSCapture.h index 273f6e4646..340e11457e 100644 --- a/pcsx2/GS/GSCapture.h +++ b/pcsx2/GS/GSCapture.h @@ -28,7 +28,6 @@ class GSCapture std::recursive_mutex m_lock; bool m_capturing; GSVector2i m_size; - u64 m_frame; std::string m_out_dir; int m_threads; @@ -39,6 +38,7 @@ class GSCapture #elif defined(__unix__) + u64 m_frame; std::vector> m_workers; int m_compression_level; diff --git a/pcsx2/GS/GSClut.cpp b/pcsx2/GS/GSClut.cpp index 68da5194da..988043f675 100644 --- a/pcsx2/GS/GSClut.cpp +++ b/pcsx2/GS/GSClut.cpp @@ -28,7 +28,7 @@ GSClut::GSClut(GSLocalMemory* mem) m_clut = (u16*)&p[0]; // 1k + 1k for mirrored area simulating wrapping memory m_buff32 = (u32*)&p[2048]; // 1k m_buff64 = (u64*)&p[4096]; // 2k - m_write.dirty = true; + m_write.dirty = 1; m_read.dirty = true; for (int i = 0; i < 16; i++) @@ -103,26 +103,48 @@ GSClut::~GSClut() vmfree(m_clut, CLUT_ALLOC_SIZE); } -void GSClut::Invalidate() +u8 GSClut::IsInvalid() { - m_write.dirty = true; + return m_write.dirty; } -void GSClut::InvalidateRange(u32 start_block, u32 end_block) +void GSClut::ClearDrawInvalidity() { - if (m_write.TEX0.CBP >= start_block && m_write.TEX0.CBP <= end_block) + if (m_write.dirty & 2) { - m_write.dirty = true; + m_write.dirty = 1; } } -// Check the whole page, if the CLUT is slightly offset from a page boundary it could miss it. -void GSClut::Invalidate(u32 block) +u32 GSClut::GetCLUTCBP() { - if (!((block ^ m_write.TEX0.CBP) & ~0x1F)) + return m_write.TEX0.CBP; +} + +u32 GSClut::GetCLUTCPSM() +{ + return m_write.TEX0.CPSM; +} + +void GSClut::SetNextCLUTTEX0(u64 TEX0) +{ + m_write.next_tex0 = TEX0; +} + +bool GSClut::InvalidateRange(u32 start_block, u32 end_block, bool is_draw) +{ + if (m_write.dirty & 2) + return m_write.dirty; + + GIFRegTEX0 next_cbp; + next_cbp.U64 = m_write.next_tex0; + + if ((next_cbp.CBP + 3U) >= start_block && end_block >= next_cbp.CBP) { - m_write.dirty = true; + m_write.dirty |= is_draw ? 2 : 1; } + + return m_write.dirty; } bool GSClut::WriteTest(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT) @@ -155,14 +177,14 @@ bool GSClut::WriteTest(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT) m_CBP[1] = TEX0.CBP; break; case 6: - return false; // ffx2 menu + return false; // ffx2 menu. case 7: - return false; // ford mustang racing // Bouken Jidai Katsugeki Goemon + return false; // ford mustang racing // Bouken Jidai Katsugeki Goemon. default: __assume(0); } - // CLUT only reloads if PSM is a valid index type, avoid unnecessary flushes + // CLUT only reloads if PSM is a valid index type, avoid unnecessary flushes. return m_write.IsDirty(TEX0, TEXCLUT); } @@ -171,8 +193,8 @@ void GSClut::Write(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT) m_write.TEX0 = TEX0; m_write.TEXCLUT = TEXCLUT; m_read.dirty = true; - m_write.dirty = false; - + m_write.dirty = 0; + (this->*m_wc[TEX0.CSM][TEX0.CPSM][TEX0.PSM])(TEX0, TEXCLUT); } @@ -767,7 +789,7 @@ bool GSClut::WriteState::IsDirty(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TE bool is_dirty = dirty; - if (((this->TEX0.U64 ^ TEX0.U64) & mask) || (GSLocalMemory::m_psm[this->TEX0.PSM].bpp != GSLocalMemory::m_psm[TEX0.PSM].bpp)) + if (((this->TEX0.U64 ^ TEX0.U64) & mask) || (GSLocalMemory::m_psm[this->TEX0.PSM].pal != GSLocalMemory::m_psm[TEX0.PSM].pal)) is_dirty |= true; else if (TEX0.CSM == 1 && (TEXCLUT.U32[0] ^ this->TEXCLUT.U32[0])) is_dirty |= true; @@ -787,7 +809,7 @@ bool GSClut::ReadState::IsDirty(const GIFRegTEX0& TEX0) bool is_dirty = dirty; - if (((this->TEX0.U64 ^ TEX0.U64) & mask) || (GSLocalMemory::m_psm[this->TEX0.PSM].bpp != GSLocalMemory::m_psm[TEX0.PSM].bpp)) + if (((this->TEX0.U64 ^ TEX0.U64) & mask) || (GSLocalMemory::m_psm[this->TEX0.PSM].pal != GSLocalMemory::m_psm[TEX0.PSM].pal)) is_dirty |= true; if (!is_dirty) @@ -806,7 +828,7 @@ bool GSClut::ReadState::IsDirty(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA) bool is_dirty = dirty; - if (((this->TEX0.U64 ^ TEX0.U64) & tex0_mask) || (GSLocalMemory::m_psm[this->TEX0.PSM].bpp != GSLocalMemory::m_psm[TEX0.PSM].bpp)) + if (((this->TEX0.U64 ^ TEX0.U64) & tex0_mask) || (GSLocalMemory::m_psm[this->TEX0.PSM].pal != GSLocalMemory::m_psm[TEX0.PSM].pal)) is_dirty |= true; else // Just to optimise the checks. { diff --git a/pcsx2/GS/GSClut.h b/pcsx2/GS/GSClut.h index 24fe065728..54bc72e1eb 100644 --- a/pcsx2/GS/GSClut.h +++ b/pcsx2/GS/GSClut.h @@ -39,7 +39,8 @@ class alignas(32) GSClut : public GSAlignedClass<32> { GIFRegTEX0 TEX0; GIFRegTEXCLUT TEXCLUT; - bool dirty; + u8 dirty; + u64 next_tex0; bool IsDirty(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT); } m_write; @@ -100,9 +101,12 @@ public: GSClut(GSLocalMemory* mem); virtual ~GSClut(); - void Invalidate(); - void Invalidate(u32 block); - void InvalidateRange(u32 start_block, u32 end_block); + bool InvalidateRange(u32 start_block, u32 end_block, bool is_draw = false); + u8 IsInvalid(); + void ClearDrawInvalidity(); + u32 GetCLUTCBP(); + u32 GetCLUTCPSM(); + void SetNextCLUTTEX0(u64 CBP); bool WriteTest(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT); void Write(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT); //void Read(const GIFRegTEX0& TEX0); diff --git a/pcsx2/GS/GSCrc.cpp b/pcsx2/GS/GSCrc.cpp index 89a86edf1d..89b2f05d75 100644 --- a/pcsx2/GS/GSCrc.cpp +++ b/pcsx2/GS/GSCrc.cpp @@ -26,6 +26,10 @@ const CRC::Game CRC::m_games[] = {0xF95F37EE, ArTonelico2, US, 0}, {0x68CE6801, ArTonelico2, JP, 0}, {0xCE2C1DBF, ArTonelico2, EU, 0}, + {0x5C891FF1, Black, US, 0}, + {0xCAA04879, Black, EU, 0}, + {0xADDFF505, Black, EU, 0}, + {0xB3A9F9ED, Black, JP, 0}, {0x2113EA2E, MetalSlug6, JP, 0}, {0xA6167B59, Lamune, JP, 0}, {0xA39517AB, FFX, EU, 0}, @@ -162,7 +166,6 @@ const CRC::Game CRC::m_games[] = {0x1F88BECD, Tekken5, EU, 0}, // language selector... {0x652050D2, Tekken5, US, 0}, {0xEA64EF39, Tekken5, KO, 0}, - {0x9E98B8AE, IkkiTousen, JP, 0}, {0x95CC86EF, GiTS, US, 0}, // same CRC also reported as EU {0x2C5BF134, GiTS, US, 0}, // Demo {0xA5768F53, GiTS, JP, 0}, @@ -174,18 +177,6 @@ const CRC::Game CRC::m_games[] = {0xAA5EC3A3, TalesOfAbyss, JP, 0}, {0xFB236A46, SonicUnleashed, US, 0}, {0x8C913264, SonicUnleashed, EU, 0}, - {0xE04EA200, TriAceGames, EU, 0}, // StarOcean3 - {0x23A97857, TriAceGames, US, 0}, // StarOcean3 - {0xBEC32D49, TriAceGames, JP, 0}, // StarOcean3 - {0x8192A241, TriAceGames, JP, 0}, // StarOcean3 directors cut - {0xCC96CE93, TriAceGames, US, 0}, // ValkyrieProfile2 - {0x774DE8E2, TriAceGames, JP, 0}, // ValkyrieProfile2 - {0x04CCB600, TriAceGames, EU, 0}, // ValkyrieProfile2 - {0xB65E141B, TriAceGames, DE, 0}, // ValkyrieProfile2 - {0x8510854E, TriAceGames, FR, 0}, // ValkyrieProfile2 - {0xC70FC973, TriAceGames, IT, 0}, // ValkyrieProfile2 - {0x47B9B2FD, TriAceGames, US, 0}, // RadiataStories - {0xAC73005E, TriAceGames, JP, 0}, // RadiataStories {0xE8FCF8EC, SMTNocturne, US, 0}, {0xF0A31EE3, SMTNocturne, EU, 0}, // SMTNocturne (Lucifers Call in EU) {0xAE0DE7B7, SMTNocturne, EU, 0}, // SMTNocturne (Lucifers Call in EU) @@ -208,11 +199,6 @@ const CRC::Game CRC::m_games[] = {0xA707236E, XenosagaE3, JP, 0}, // Demo {0xA4E88698, XenosagaE3, CH, 0}, {0x2088950A, XenosagaE3, US, 0}, - {0xB1995E29, ShadowofRome, EU, 0}, - {0x958DCA28, ShadowofRome, EU, 0}, - {0x57818AF6, ShadowofRome, US, 0}, - {0x1E210E60, ShadowofRome, US, 0}, // Demo - {0x36393CD3, ShadowofRome, JP, 0}, {0x694A998E, TombRaiderUnderworld, JP, 0}, {0x8E214549, TombRaiderUnderworld, EU, 0}, {0x618769D6, TombRaiderUnderworld, US, 0}, @@ -258,12 +244,6 @@ const CRC::Game CRC::m_games[] = {0x97E9C87E, YakuzaGames, US, 0}, // Yakuza2 {0xB1EBD841, YakuzaGames, US, 0}, // Yakuza2 {0xC6B95C48, YakuzaGames, JP, 0}, // Yakuza2 - {0x9000252A, SkyGunner, JP, 0}, - {0x93092623, SkyGunner, JP, 0}, - {0xA9461CB2, SkyGunner, US, 0}, - {0xC71DE999, SkyGunner, US, 0}, // Regular Demo - {0xAADF3287, SkyGunner, US, 0}, // Trade Demo - {0xB799A60C, SkyGunner, NoRegion, 0}, {0x2905C5C6, ZettaiZetsumeiToshi2, US, 0}, // Raw Danger! {0xC988ECBB, ZettaiZetsumeiToshi2, JP, 0}, {0x90F4B057, ZettaiZetsumeiToshi2, CH, 0}, diff --git a/pcsx2/GS/GSCrc.h b/pcsx2/GS/GSCrc.h index c698aac9e4..20214cee52 100644 --- a/pcsx2/GS/GSCrc.h +++ b/pcsx2/GS/GSCrc.h @@ -26,6 +26,7 @@ public: AceCombat4, ArTonelico2, BigMuthaTruckers, + Black, BurnoutGames, CrashBandicootWoC, DBZBT2, @@ -40,7 +41,6 @@ public: GodHand, HauntingGround, ICO, - IkkiTousen, Jak2, Jak3, JakX, @@ -60,10 +60,8 @@ public: SakuraTaisen, SakuraWarsSoLongMyLove, SFEX3, - ShadowofRome, ShinOnimusha, Simple2000Vol114, - SkyGunner, SMTNocturne, SonicUnleashed, Spartan, @@ -77,7 +75,6 @@ public: TombRaiderAnniversary, TombRaiderLegend, TombRaiderUnderworld, - TriAceGames, UltramanFightingEvolution, UrbanReign, XenosagaE3, diff --git a/pcsx2/GS/GSDrawingContext.cpp b/pcsx2/GS/GSDrawingContext.cpp index 8a446af870..522185836a 100644 --- a/pcsx2/GS/GSDrawingContext.cpp +++ b/pcsx2/GS/GSDrawingContext.cpp @@ -20,10 +20,13 @@ static int findmax(int tl, int br, int limit, int wm, int minuv, int maxuv) { - // return max possible texcoord - + // return max possible texcoord. int uv = br; + // Confirmed on hardware if the size exceeds 1024, it basically gets masked so you end up with a 1x1 pixel (Except Region Clamp). + if (limit > 1024) + limit = 0; + if (wm == CLAMP_CLAMP) { if (uv > limit) @@ -45,10 +48,12 @@ static int findmax(int tl, int br, int limit, int wm, int minuv, int maxuv) } else if (wm == CLAMP_REGION_REPEAT) { + // REGION_REPEAT adhears to the original texture size, even if offset outside the texture (with MAXUV). + minuv &= limit; if (tl < 0) - uv = minuv | maxuv; // wrap around, just use (any & mask) | fix + uv = minuv | maxuv; // wrap around, just use (any & mask) | fix. else - uv = std::min(uv, minuv) | maxuv; // (any & mask) cannot be larger than mask, select br if that is smaller (not br & mask because there might be a larger value between tl and br when &'ed with the mask) + uv = std::min(uv, minuv) | maxuv; // (any & mask) cannot be larger than mask, select br if that is smaller (not br & mask because there might be a larger value between tl and br when &'ed with the mask). } return uv; @@ -74,7 +79,7 @@ static int extend(int uv, int size) return size; } -GIFRegTEX0 GSDrawingContext::GetSizeFixedTEX0(const GSVector4& st, bool linear, bool mipmap) +GIFRegTEX0 GSDrawingContext::GetSizeFixedTEX0(const GSVector4& st, bool linear, bool mipmap) const { if (mipmap) return TEX0; // no mipmaping allowed @@ -120,7 +125,12 @@ GIFRegTEX0 GSDrawingContext::GetSizeFixedTEX0(const GSVector4& st, bool linear, th = extend(uv.y, th); } - if (GSConfig.Renderer == GSRendererType::SW && ((int)TEX0.TW != tw || (int)TEX0.TH != th)) + GIFRegTEX0 res = TEX0; + + res.TW = tw > 10 ? 0 : tw; + res.TH = th > 10 ? 0 : th; + + if (GSConfig.Renderer == GSRendererType::SW && (TEX0.TW != res.TW || TEX0.TH != res.TH)) { GL_DBG("FixedTEX0 %05x %d %d tw %d=>%d th %d=>%d st (%.0f,%.0f,%.0f,%.0f) uvmax %d,%d wm %d,%d (%d,%d,%d,%d)", (int)TEX0.TBP0, (int)TEX0.TBW, (int)TEX0.PSM, @@ -130,11 +140,6 @@ GIFRegTEX0 GSDrawingContext::GetSizeFixedTEX0(const GSVector4& st, bool linear, wms, wmt, minu, maxu, minv, maxv); } - GIFRegTEX0 res = TEX0; - - res.TW = tw; - res.TH = th; - return res; } @@ -142,7 +147,6 @@ void GSDrawingContext::ComputeFixedTEX0(const GSVector4& st) { // It is quite complex to handle rescaling so this function is less stricter than GetSizeFixedTEX0, // therefore we remove the reduce optimization and we don't handle bilinear filtering which might create wrong interpolation at the border. - int tw = TEX0.TW; int th = TEX0.TH; @@ -154,10 +158,16 @@ void GSDrawingContext::ComputeFixedTEX0(const GSVector4& st) int maxu = (int)CLAMP.MAXU; int maxv = (int)CLAMP.MAXV; + if (wms != CLAMP_REGION_CLAMP) + tw = tw > 10 ? 0 : tw; + + if (wmt != CLAMP_REGION_CLAMP) + th = th > 10 ? 0 : th; + GSVector4i uv = GSVector4i(st.floor().xyzw(st.ceil())); - uv.x = findmax(uv.x, uv.z, (1 << TEX0.TW) - 1, wms, minu, maxu); - uv.y = findmax(uv.y, uv.w, (1 << TEX0.TH) - 1, wmt, minv, maxv); + uv.x = findmax(uv.x, uv.z, (1 << tw) - 1, wms, minu, maxu); + uv.y = findmax(uv.y, uv.w, (1 << th) - 1, wmt, minv, maxv); if (wms == CLAMP_REGION_CLAMP || wms == CLAMP_REGION_REPEAT) tw = extend(uv.x, tw); @@ -165,6 +175,9 @@ void GSDrawingContext::ComputeFixedTEX0(const GSVector4& st) if (wmt == CLAMP_REGION_CLAMP || wmt == CLAMP_REGION_REPEAT) th = extend(uv.y, th); + tw = std::clamp(tw, 0, 10); + th = std::clamp(th, 0, 10); + if ((tw != (int)TEX0.TW) || (th != (int)TEX0.TH)) { m_fixed_tex0 = true; diff --git a/pcsx2/GS/GSDrawingContext.h b/pcsx2/GS/GSDrawingContext.h index d2445c96b5..91841abcf6 100644 --- a/pcsx2/GS/GSDrawingContext.h +++ b/pcsx2/GS/GSDrawingContext.h @@ -140,7 +140,7 @@ public: return ZBUF.ZMSK == 0 && TEST.ZTE != 0; // ZTE == 0 is bug on the real hardware, write is blocked then } - GIFRegTEX0 GetSizeFixedTEX0(const GSVector4& st, bool linear, bool mipmap = false); + GIFRegTEX0 GetSizeFixedTEX0(const GSVector4& st, bool linear, bool mipmap = false) const; void ComputeFixedTEX0(const GSVector4& st); bool HasFixedTEX0() const { return m_fixed_tex0; } diff --git a/pcsx2/GS/GSExtra.h b/pcsx2/GS/GSExtra.h index 71750975c2..97374d7b3d 100644 --- a/pcsx2/GS/GSExtra.h +++ b/pcsx2/GS/GSExtra.h @@ -76,12 +76,6 @@ __forceinline bool BitEqual(const T& a, const T& b) return eqb; } -#ifdef ENABLE_ACCURATE_BUFFER_EMULATION -static const GSVector2i default_rt_size(2048, 2048); -#else -static const GSVector2i default_rt_size(0, 0); -#endif - extern Pcsx2Config::GSOptions GSConfig; // Maximum texture size to skip preload/hash path. diff --git a/pcsx2/GS/GSLocalMemory.cpp b/pcsx2/GS/GSLocalMemory.cpp index 3a0ce7929a..ec6270e7aa 100644 --- a/pcsx2/GS/GSLocalMemory.cpp +++ b/pcsx2/GS/GSLocalMemory.cpp @@ -17,7 +17,6 @@ #include "GSLocalMemory.h" #include "GS.h" #include "GSExtra.h" -#include #include template @@ -56,6 +55,7 @@ constexpr GSSwizzleInfo GSLocalMemory::swizzle4; // GSLocalMemory::psm_t GSLocalMemory::m_psm[64]; +GSLocalMemory::readImage GSLocalMemory::m_readImageX; // @@ -81,6 +81,8 @@ GSLocalMemory::GSLocalMemory() memset(m_vm8, 0, m_vmsize); + MULTI_ISA_SELECT(GSLocalMemoryPopulateFunctions)(*this); + for (psm_t& psm : m_psm) { psm.info = GSLocalMemory::swizzle32; @@ -91,12 +93,6 @@ GSLocalMemory::GSLocalMemory() psm.rt = &GSLocalMemory::ReadTexel32; psm.rta = &GSLocalMemory::ReadTexel32; psm.wfa = &GSLocalMemory::WritePixel32; - psm.wi = &GSLocalMemory::WriteImage; - psm.ri = &GSLocalMemory::ReadImageX; // TODO - psm.rtx = &GSLocalMemory::ReadTexture32; - psm.rtxP = &GSLocalMemory::ReadTexture32; - psm.rtxb = &GSLocalMemory::ReadTextureBlock32; - psm.rtxbP = &GSLocalMemory::ReadTextureBlock32; psm.bpp = psm.trbpp = 32; psm.pal = 0; psm.bs = GSVector2i(8, 8); @@ -202,101 +198,6 @@ GSLocalMemory::GSLocalMemory() m_psm[PSM_PSMZ16].wfa = &GSLocalMemory::WriteFrame16; m_psm[PSM_PSMZ16S].wfa = &GSLocalMemory::WriteFrame16; - m_psm[PSM_PSMCT24].wi = &GSLocalMemory::WriteImage24; // TODO - m_psm[PSM_PSMCT16].wi = &GSLocalMemory::WriteImage; - m_psm[PSM_PSMCT16S].wi = &GSLocalMemory::WriteImage; - m_psm[PSM_PSMT8].wi = &GSLocalMemory::WriteImage; - m_psm[PSM_PSMT4].wi = &GSLocalMemory::WriteImage; - m_psm[PSM_PSMT8H].wi = &GSLocalMemory::WriteImage8H; // TODO - m_psm[PSM_PSMT4HL].wi = &GSLocalMemory::WriteImage4HL; // TODO - m_psm[PSM_PSMT4HH].wi = &GSLocalMemory::WriteImage4HH; // TODO - m_psm[PSM_PSMZ32].wi = &GSLocalMemory::WriteImage; - m_psm[PSM_PSMZ24].wi = &GSLocalMemory::WriteImage24Z; // TODO - m_psm[PSM_PSMZ16].wi = &GSLocalMemory::WriteImage; - m_psm[PSM_PSMZ16S].wi = &GSLocalMemory::WriteImage; - - m_psm[PSM_PSMCT24].rtx = &GSLocalMemory::ReadTexture24; - m_psm[PSM_PSGPU24].rtx = &GSLocalMemory::ReadTextureGPU24; - m_psm[PSM_PSMCT16].rtx = &GSLocalMemory::ReadTexture16; - m_psm[PSM_PSMCT16S].rtx = &GSLocalMemory::ReadTexture16; - m_psm[PSM_PSMT8].rtx = &GSLocalMemory::ReadTexture8; - m_psm[PSM_PSMT4].rtx = &GSLocalMemory::ReadTexture4; - m_psm[PSM_PSMT8H].rtx = &GSLocalMemory::ReadTexture8H; - m_psm[PSM_PSMT4HL].rtx = &GSLocalMemory::ReadTexture4HL; - m_psm[PSM_PSMT4HH].rtx = &GSLocalMemory::ReadTexture4HH; - m_psm[PSM_PSMZ32].rtx = &GSLocalMemory::ReadTexture32; - m_psm[PSM_PSMZ24].rtx = &GSLocalMemory::ReadTexture24; - m_psm[PSM_PSMZ16].rtx = &GSLocalMemory::ReadTexture16; - m_psm[PSM_PSMZ16S].rtx = &GSLocalMemory::ReadTexture16; - - m_psm[PSM_PSMCT24].rtxP = &GSLocalMemory::ReadTexture24; - m_psm[PSM_PSMCT16].rtxP = &GSLocalMemory::ReadTexture16; - m_psm[PSM_PSMCT16S].rtxP = &GSLocalMemory::ReadTexture16; - m_psm[PSM_PSMT8].rtxP = &GSLocalMemory::ReadTexture8P; - m_psm[PSM_PSMT4].rtxP = &GSLocalMemory::ReadTexture4P; - m_psm[PSM_PSMT8H].rtxP = &GSLocalMemory::ReadTexture8HP; - m_psm[PSM_PSMT4HL].rtxP = &GSLocalMemory::ReadTexture4HLP; - m_psm[PSM_PSMT4HH].rtxP = &GSLocalMemory::ReadTexture4HHP; - m_psm[PSM_PSMZ32].rtxP = &GSLocalMemory::ReadTexture32; - m_psm[PSM_PSMZ24].rtxP = &GSLocalMemory::ReadTexture24; - m_psm[PSM_PSMZ16].rtxP = &GSLocalMemory::ReadTexture16; - m_psm[PSM_PSMZ16S].rtxP = &GSLocalMemory::ReadTexture16; - - m_psm[PSM_PSMCT24].rtxb = &GSLocalMemory::ReadTextureBlock24; - m_psm[PSM_PSMCT16].rtxb = &GSLocalMemory::ReadTextureBlock16; - m_psm[PSM_PSMCT16S].rtxb = &GSLocalMemory::ReadTextureBlock16; - m_psm[PSM_PSMT8].rtxb = &GSLocalMemory::ReadTextureBlock8; - m_psm[PSM_PSMT4].rtxb = &GSLocalMemory::ReadTextureBlock4; - m_psm[PSM_PSMT8H].rtxb = &GSLocalMemory::ReadTextureBlock8H; - m_psm[PSM_PSMT4HL].rtxb = &GSLocalMemory::ReadTextureBlock4HL; - m_psm[PSM_PSMT4HH].rtxb = &GSLocalMemory::ReadTextureBlock4HH; - m_psm[PSM_PSMZ32].rtxb = &GSLocalMemory::ReadTextureBlock32; - m_psm[PSM_PSMZ24].rtxb = &GSLocalMemory::ReadTextureBlock24; - m_psm[PSM_PSMZ16].rtxb = &GSLocalMemory::ReadTextureBlock16; - m_psm[PSM_PSMZ16S].rtxb = &GSLocalMemory::ReadTextureBlock16; - - m_psm[PSM_PSMCT24].rtxbP = &GSLocalMemory::ReadTextureBlock24; - m_psm[PSM_PSMCT16].rtxbP = &GSLocalMemory::ReadTextureBlock16; - m_psm[PSM_PSMCT16S].rtxbP = &GSLocalMemory::ReadTextureBlock16; - m_psm[PSM_PSMT8].rtxbP = &GSLocalMemory::ReadTextureBlock8P; - m_psm[PSM_PSMT4].rtxbP = &GSLocalMemory::ReadTextureBlock4P; - m_psm[PSM_PSMT8H].rtxbP = &GSLocalMemory::ReadTextureBlock8HP; - m_psm[PSM_PSMT4HL].rtxbP = &GSLocalMemory::ReadTextureBlock4HLP; - m_psm[PSM_PSMT4HH].rtxbP = &GSLocalMemory::ReadTextureBlock4HHP; - m_psm[PSM_PSMZ32].rtxbP = &GSLocalMemory::ReadTextureBlock32; - m_psm[PSM_PSMZ24].rtxbP = &GSLocalMemory::ReadTextureBlock24; - m_psm[PSM_PSMZ16].rtxbP = &GSLocalMemory::ReadTextureBlock16; - m_psm[PSM_PSMZ16S].rtxbP = &GSLocalMemory::ReadTextureBlock16; - -#if _M_SSE == 0x501 - Xbyak::util::Cpu cpu; - bool slowVPGATHERDD; - if (cpu.has(Xbyak::util::Cpu::tINTEL)) - { - // Slow on Haswell - // CPUID data from https://en.wikichip.org/wiki/intel/cpuid - slowVPGATHERDD = cpu.displayModel == 0x46 || cpu.displayModel == 0x45 || cpu.displayModel == 0x3c; - } - else - { - // Currently no Zen CPUs with fast VPGATHERDD - // Check https://uops.info/table.html as new CPUs come out for one that doesn't split it into like 40 µops - // Doing it manually is about 28 µops (8x xmm -> gpr, 6x extr, 8x load, 6x insr) - slowVPGATHERDD = true; - } - if (const char* over = getenv("SLOW_VPGATHERDD_OVERRIDE")) // Easy override for comparing on vs off - { - slowVPGATHERDD = over[0] == 'Y' || over[0] == 'y' || over[0] == '1'; - } - if (slowVPGATHERDD) - { - m_psm[PSM_PSMT8].rtx = &GSLocalMemory::ReadTexture8HSW; - m_psm[PSM_PSMT8H].rtx = &GSLocalMemory::ReadTexture8HHSW; - m_psm[PSM_PSMT8].rtxb = &GSLocalMemory::ReadTextureBlock8HSW; - m_psm[PSM_PSMT8H].rtxb = &GSLocalMemory::ReadTextureBlock8HHSW; - } -#endif - m_psm[PSM_PSGPU24].bpp = 16; m_psm[PSM_PSMCT16].bpp = m_psm[PSM_PSMCT16S].bpp = 16; m_psm[PSM_PSMT8].bpp = 8; @@ -559,1075 +460,6 @@ std::vector* GSLocalMemory::GetPage2TileMap(const GIFRegTEX0& TEX0) return p2t; } -//////////////////// - -template -void GSLocalMemory::WriteImageColumn(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF) -{ - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - const int csy = bsy / 4; - - for (int offset = srcpitch * csy; h >= csy; h -= csy, y += csy, src += offset) - { - for (int x = l; x < r; x += bsx) - { - switch (psm) - { - case PSM_PSMCT32: GSBlock::WriteColumn32(y, BlockPtr32(x, y, bp, bw), &src[x * 4], srcpitch); break; - case PSM_PSMCT16: GSBlock::WriteColumn16(y, BlockPtr16(x, y, bp, bw), &src[x * 2], srcpitch); break; - case PSM_PSMCT16S: GSBlock::WriteColumn16(y, BlockPtr16S(x, y, bp, bw), &src[x * 2], srcpitch); break; - case PSM_PSMT8: GSBlock::WriteColumn8(y, BlockPtr8(x, y, bp, bw), &src[x], srcpitch); break; - case PSM_PSMT4: GSBlock::WriteColumn4(y, BlockPtr4(x, y, bp, bw), &src[x >> 1], srcpitch); break; - case PSM_PSMZ32: GSBlock::WriteColumn32(y, BlockPtr32Z(x, y, bp, bw), &src[x * 4], srcpitch); break; - case PSM_PSMZ16: GSBlock::WriteColumn16(y, BlockPtr16Z(x, y, bp, bw), &src[x * 2], srcpitch); break; - case PSM_PSMZ16S: GSBlock::WriteColumn16(y, BlockPtr16SZ(x, y, bp, bw), &src[x * 2], srcpitch); break; - // TODO - default: __assume(0); - } - } - } -} - -template -void GSLocalMemory::WriteImageBlock(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF) -{ - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - for (int offset = srcpitch * bsy; h >= bsy; h -= bsy, y += bsy, src += offset) - { - for (int x = l; x < r; x += bsx) - { - switch (psm) - { - case PSM_PSMCT32: GSBlock::WriteBlock32(BlockPtr32(x, y, bp, bw), &src[x * 4], srcpitch); break; - case PSM_PSMCT16: GSBlock::WriteBlock16(BlockPtr16(x, y, bp, bw), &src[x * 2], srcpitch); break; - case PSM_PSMCT16S: GSBlock::WriteBlock16(BlockPtr16S(x, y, bp, bw), &src[x * 2], srcpitch); break; - case PSM_PSMT8: GSBlock::WriteBlock8(BlockPtr8(x, y, bp, bw), &src[x], srcpitch); break; - case PSM_PSMT4: GSBlock::WriteBlock4(BlockPtr4(x, y, bp, bw), &src[x >> 1], srcpitch); break; - case PSM_PSMZ32: GSBlock::WriteBlock32(BlockPtr32Z(x, y, bp, bw), &src[x * 4], srcpitch); break; - case PSM_PSMZ16: GSBlock::WriteBlock16(BlockPtr16Z(x, y, bp, bw), &src[x * 2], srcpitch); break; - case PSM_PSMZ16S: GSBlock::WriteBlock16(BlockPtr16SZ(x, y, bp, bw), &src[x * 2], srcpitch); break; - // TODO - default: __assume(0); - } - } - } -} - -template -void GSLocalMemory::WriteImageLeftRight(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF) -{ - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - for (; h > 0; y++, h--, src += srcpitch) - { - for (int x = l; x < r; x++) - { - switch (psm) - { - case PSM_PSMCT32: WritePixel32(x, y, *(u32*)&src[x * 4], bp, bw); break; - case PSM_PSMCT16: WritePixel16(x, y, *(u16*)&src[x * 2], bp, bw); break; - case PSM_PSMCT16S: WritePixel16S(x, y, *(u16*)&src[x * 2], bp, bw); break; - case PSM_PSMT8: WritePixel8(x, y, src[x], bp, bw); break; - case PSM_PSMT4: WritePixel4(x, y, src[x >> 1] >> ((x & 1) << 2), bp, bw); break; - case PSM_PSMZ32: WritePixel32Z(x, y, *(u32*)&src[x * 4], bp, bw); break; - case PSM_PSMZ16: WritePixel16Z(x, y, *(u16*)&src[x * 2], bp, bw); break; - case PSM_PSMZ16S: WritePixel16SZ(x, y, *(u16*)&src[x * 2], bp, bw); break; - // TODO - default: __assume(0); - } - } - } -} - -template -void GSLocalMemory::WriteImageTopBottom(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF) -{ - alignas(32) u8 buff[64]; // merge buffer for one column - - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - const int csy = bsy / 4; - - // merge incomplete column - - int y2 = y & (csy - 1); - - if (y2 > 0) - { - int h2 = std::min(h, csy - y2); - - for (int x = l; x < r; x += bsx) - { - u8* dst = NULL; - - switch (psm) - { - case PSM_PSMCT32: dst = BlockPtr32(x, y, bp, bw); break; - case PSM_PSMCT16: dst = BlockPtr16(x, y, bp, bw); break; - case PSM_PSMCT16S: dst = BlockPtr16S(x, y, bp, bw); break; - case PSM_PSMT8: dst = BlockPtr8(x, y, bp, bw); break; - case PSM_PSMT4: dst = BlockPtr4(x, y, bp, bw); break; - case PSM_PSMZ32: dst = BlockPtr32Z(x, y, bp, bw); break; - case PSM_PSMZ16: dst = BlockPtr16Z(x, y, bp, bw); break; - case PSM_PSMZ16S: dst = BlockPtr16SZ(x, y, bp, bw); break; - // TODO - default: __assume(0); - } - - switch (psm) - { - case PSM_PSMCT32: - case PSM_PSMZ32: - GSBlock::ReadColumn32(y, dst, buff, 32); - memcpy(&buff[32], &src[x * 4], 32); - GSBlock::WriteColumn32<32, 0xffffffff>(y, dst, buff, 32); - break; - case PSM_PSMCT16: - case PSM_PSMCT16S: - case PSM_PSMZ16: - case PSM_PSMZ16S: - GSBlock::ReadColumn16(y, dst, buff, 32); - memcpy(&buff[32], &src[x * 2], 32); - GSBlock::WriteColumn16<32>(y, dst, buff, 32); - break; - case PSM_PSMT8: - GSBlock::ReadColumn8(y, dst, buff, 16); - for (int i = 0, j = y2; i < h2; i++, j++) - memcpy(&buff[j * 16], &src[i * srcpitch + x], 16); - GSBlock::WriteColumn8<32>(y, dst, buff, 16); - break; - case PSM_PSMT4: - GSBlock::ReadColumn4(y, dst, buff, 16); - for (int i = 0, j = y2; i < h2; i++, j++) - memcpy(&buff[j * 16], &src[i * srcpitch + (x >> 1)], 16); - GSBlock::WriteColumn4<32>(y, dst, buff, 16); - break; - // TODO - default: - __assume(0); - } - } - - src += srcpitch * h2; - y += h2; - h -= h2; - } - - // write whole columns - - { - int h2 = h & ~(csy - 1); - - if (h2 > 0) - { -#if FAST_UNALIGNED - WriteImageColumn(l, r, y, h2, src, srcpitch, BITBLTBUF); -#else - size_t addr = (size_t)&src[l * trbpp >> 3]; - - if ((addr & 31) == 0 && (srcpitch & 31) == 0) - { - WriteImageColumn(l, r, y, h2, src, srcpitch, BITBLTBUF); - } - else if ((addr & 15) == 0 && (srcpitch & 15) == 0) - { - WriteImageColumn(l, r, y, h2, src, srcpitch, BITBLTBUF); - } - else - { - WriteImageColumn(l, r, y, h2, src, srcpitch, BITBLTBUF); - } -#endif - - src += srcpitch * h2; - y += h2; - h -= h2; - } - } - - // merge incomplete column - - if (h >= 1) - { - for (int x = l; x < r; x += bsx) - { - u8* dst = NULL; - - switch (psm) - { - case PSM_PSMCT32: dst = BlockPtr32(x, y, bp, bw); break; - case PSM_PSMCT16: dst = BlockPtr16(x, y, bp, bw); break; - case PSM_PSMCT16S: dst = BlockPtr16S(x, y, bp, bw); break; - case PSM_PSMT8: dst = BlockPtr8(x, y, bp, bw); break; - case PSM_PSMT4: dst = BlockPtr4(x, y, bp, bw); break; - case PSM_PSMZ32: dst = BlockPtr32Z(x, y, bp, bw); break; - case PSM_PSMZ16: dst = BlockPtr16Z(x, y, bp, bw); break; - case PSM_PSMZ16S: dst = BlockPtr16SZ(x, y, bp, bw); break; - // TODO - default: __assume(0); - } - - switch (psm) - { - case PSM_PSMCT32: - case PSM_PSMZ32: - GSBlock::ReadColumn32(y, dst, buff, 32); - memcpy(&buff[0], &src[x * 4], 32); - GSBlock::WriteColumn32<32, 0xffffffff>(y, dst, buff, 32); - break; - case PSM_PSMCT16: - case PSM_PSMCT16S: - case PSM_PSMZ16: - case PSM_PSMZ16S: - GSBlock::ReadColumn16(y, dst, buff, 32); - memcpy(&buff[0], &src[x * 2], 32); - GSBlock::WriteColumn16<32>(y, dst, buff, 32); - break; - case PSM_PSMT8: - GSBlock::ReadColumn8(y, dst, buff, 16); - for (int i = 0; i < h; i++) - memcpy(&buff[i * 16], &src[i * srcpitch + x], 16); - GSBlock::WriteColumn8<32>(y, dst, buff, 16); - break; - case PSM_PSMT4: - GSBlock::ReadColumn4(y, dst, buff, 16); - for (int i = 0; i < h; i++) - memcpy(&buff[i * 16], &src[i * srcpitch + (x >> 1)], 16); - GSBlock::WriteColumn4<32>(y, dst, buff, 16); - break; - // TODO - default: - __assume(0); - } - } - } -} - -template -void GSLocalMemory::WriteImage(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) -{ - if (TRXREG.RRW == 0) - return; - - int l = (int)TRXPOS.DSAX; - int r = l + (int)TRXREG.RRW; - - // finish the incomplete row first - - if (tx != l) - { - int n = std::min(len, (r - tx) * trbpp >> 3); - WriteImageX(tx, ty, src, n, BITBLTBUF, TRXPOS, TRXREG); - src += n; - len -= n; - } - - int la = (l + (bsx - 1)) & ~(bsx - 1); - int ra = r & ~(bsx - 1); - // Round up to the nearest byte (NFL 2K5 does r = 1, l = 0 bpp =4, causing divide by zero) - int srcpitch = (((r - l) * trbpp) + 7) >> 3; - int h = len / srcpitch; - - if (ra - la >= bsx && h > 0) // "transfer width" >= "block width" && there is at least one full row - { - const u8* s = &src[-l * trbpp >> 3]; - - src += srcpitch * h; - len -= srcpitch * h; - - // left part - - if (l < la) - { - WriteImageLeftRight(l, la, ty, h, s, srcpitch, BITBLTBUF); - } - - // right part - - if (ra < r) - { - WriteImageLeftRight(ra, r, ty, h, s, srcpitch, BITBLTBUF); - } - - // horizontally aligned part - - if (la < ra) - { - // top part - - { - int h2 = std::min(h, bsy - (ty & (bsy - 1))); - - if (h2 < bsy) - { - WriteImageTopBottom(la, ra, ty, h2, s, srcpitch, BITBLTBUF); - - s += srcpitch * h2; - ty += h2; - h -= h2; - } - } - - // horizontally and vertically aligned part - - { - int h2 = h & ~(bsy - 1); - - if (h2 > 0) - { -#if FAST_UNALIGNED - WriteImageBlock(la, ra, ty, h2, s, srcpitch, BITBLTBUF); -#else - size_t addr = (size_t)&s[la * trbpp >> 3]; - - if ((addr & 31) == 0 && (srcpitch & 31) == 0) - { - WriteImageBlock(la, ra, ty, h2, s, srcpitch, BITBLTBUF); - } - else if ((addr & 15) == 0 && (srcpitch & 15) == 0) - { - WriteImageBlock(la, ra, ty, h2, s, srcpitch, BITBLTBUF); - } - else - { - WriteImageBlock(la, ra, ty, h2, s, srcpitch, BITBLTBUF); - } -#endif - - s += srcpitch * h2; - ty += h2; - h -= h2; - } - } - - // bottom part - - if (h > 0) - { - WriteImageTopBottom(la, ra, ty, h, s, srcpitch, BITBLTBUF); - - // s += srcpitch * h; - ty += h; - // h -= h; - } - } - } - - // the rest - - if (len > 0) - { - WriteImageX(tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); - } -} - - -static bool IsTopLeftAligned(int dsax, int tx, int ty, int bw, int bh) -{ - return ((dsax & (bw - 1)) == 0 && (tx & (bw - 1)) == 0 && dsax == tx && (ty & (bh - 1)) == 0); -} - -void GSLocalMemory::WriteImage24(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) -{ - if (TRXREG.RRW == 0) - return; - - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW * 3; - int th = len / srcpitch; - - bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); - - if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) - { - // TODO - - WriteImageX(tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); - } - else - { - th += ty; - - for (int y = ty; y < th; y += 8, src += srcpitch * 8) - { - for (int x = tx; x < tw; x += 8) - { - GSBlock::UnpackAndWriteBlock24(src + (x - tx) * 3, srcpitch, BlockPtr32(x, y, bp, bw)); - } - } - - ty = th; - } -} - -void GSLocalMemory::WriteImage8H(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) -{ - if (TRXREG.RRW == 0) - return; - - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW; - int th = len / srcpitch; - - bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); - - if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) - { - // TODO - - WriteImageX(tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); - } - else - { - th += ty; - - for (int y = ty; y < th; y += 8, src += srcpitch * 8) - { - for (int x = tx; x < tw; x += 8) - { - GSBlock::UnpackAndWriteBlock8H(src + (x - tx), srcpitch, BlockPtr32(x, y, bp, bw)); - } - } - - ty = th; - } -} - -void GSLocalMemory::WriteImage4HL(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) -{ - if (TRXREG.RRW == 0) - return; - - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW / 2; - int th = len / srcpitch; - - bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); - - if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) - { - // TODO - - WriteImageX(tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); - } - else - { - th += ty; - - for (int y = ty; y < th; y += 8, src += srcpitch * 8) - { - for (int x = tx; x < tw; x += 8) - { - GSBlock::UnpackAndWriteBlock4HL(src + (x - tx) / 2, srcpitch, BlockPtr32(x, y, bp, bw)); - } - } - - ty = th; - } -} - -void GSLocalMemory::WriteImage4HH(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) -{ - if (TRXREG.RRW == 0) - return; - - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW / 2; - int th = len / srcpitch; - - bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); - - if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) - { - // TODO - - WriteImageX(tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); - } - else - { - th += ty; - - for (int y = ty; y < th; y += 8, src += srcpitch * 8) - { - for (int x = tx; x < tw; x += 8) - { - GSBlock::UnpackAndWriteBlock4HH(src + (x - tx) / 2, srcpitch, BlockPtr32(x, y, bp, bw)); - } - } - - ty = th; - } -} - -void GSLocalMemory::WriteImage24Z(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) -{ - if (TRXREG.RRW == 0) - return; - - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW * 3; - int th = len / srcpitch; - - bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); - - if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) - { - // TODO - - WriteImageX(tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); - } - else - { - th += ty; - - for (int y = ty; y < th; y += 8, src += srcpitch * 8) - { - for (int x = tx; x < tw; x += 8) - { - GSBlock::UnpackAndWriteBlock24(src + (x - tx) * 3, srcpitch, BlockPtr32Z(x, y, bp, bw)); - } - } - - ty = th; - } -} - -/// Helper for WriteImageX and ReadImageX -/// `len` is in pixels, unlike WriteImageX/ReadImageX where it's bytes -/// `xinc` is the amount to increment `x` by per iteration -/// Calls `paGetter` on a starting (x, y) to get some sort of pixel address helper for each line, -/// then `fn` on the helper and an x offset once for every `xinc` pixels along that line -template -static void readWriteHelperImpl(int& tx, int& ty, int len, int xinc, int sx, int w, PAGetter&& paGetter, Fn&& fn) -{ - int y = ty; - int ex = sx + w; - int remX = ex - tx; - - ASSERT(remX >= 0); - - auto pa = paGetter(tx, y); - - while (len > 0) - { - int stop = std::min(remX, len); - len -= stop; - remX -= stop; - - for (int x = 0; x < stop; x += xinc) - fn(pa, x); - - if (remX == 0) - { - y++; - remX = w; - pa = paGetter(sx, y); - } - } - - tx = ex - remX; - ty = y; -} - -/// Helper for WriteImageX and ReadImageX -/// `len` is in pixels, unlike WriteImageX/ReadImageX where it's bytes -/// `xinc` is the amount to increment `x` by per iteration -/// Calls `fn` with a `PAHelper` representing the current line and an int representing the x offset in that line -template -static void readWriteHelper(int& tx, int& ty, int len, int xinc, int sx, int w, const GSOffset& off, Fn&& fn) -{ - readWriteHelperImpl(tx, ty, len, xinc, sx, w, [&](int x, int y){ return off.paMulti(x, y); }, std::forward(fn)); -} - -/// Helper for WriteImageX and ReadImageX -/// `len` is in pixels, unlike WriteImageX/ReadImageX where it's bytes -/// `xinc` is the amount to increment `x` by per iteration -/// Calls `fn` with a `PAPtrHelper` representing the current line and an int representing the x offset in that line -template -static void readWriteHelper(VM* vm, int& tx, int& ty, int len, int xinc, int sx, int w, const GSOffset& off, Fn&& fn) -{ - readWriteHelperImpl(tx, ty, len, xinc, sx, w, [&](int x, int y){ return off.paMulti(vm, x, y); }, std::forward(fn)); -} - -void GSLocalMemory::WriteImageX(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) -{ - if (len <= 0) - return; - - const u8* pb = (u8*)src; - const u16* pw = (u16*)src; - const u32* pd = (u32*)src; - - u32 bp = BITBLTBUF.DBP; - u32 bw = BITBLTBUF.DBW; - - int sx = TRXPOS.DSAX; - int w = TRXREG.RRW; - - GSOffset off = GetOffset(bp, bw, BITBLTBUF.DPSM); - - switch (BITBLTBUF.DPSM) - { - case PSM_PSMCT32: - case PSM_PSMZ32: - readWriteHelper(vm32(), tx, ty, len / 4, 1, sx, w, off.assertSizesMatch(swizzle32), [&](auto& pa, int x) - { - *pa.value(x) = *pd; - pd++; - }); - break; - - case PSM_PSMCT24: - case PSM_PSMZ24: - readWriteHelper(vm32(), tx, ty, len / 3, 1, sx, w, off.assertSizesMatch(swizzle32), [&](auto& pa, int x) - { - WritePixel24(pa.value(x), *(u32*)pb); - pb += 3; - }); - break; - - case PSM_PSMCT16: - case PSM_PSMCT16S: - case PSM_PSMZ16: - case PSM_PSMZ16S: - readWriteHelper(vm16(), tx, ty, len / 2, 1, sx, w, off.assertSizesMatch(swizzle16), [&](auto& pa, int x) - { - *pa.value(x) = *pw; - pw++; - }); - break; - - case PSM_PSMT8: - readWriteHelper(m_vm8, tx, ty, len, 1, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8), [&](auto& pa, int x) - { - *pa.value(x) = *pb; - pb++; - }); - break; - - case PSM_PSMT4: - readWriteHelper(tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4), [&](GSOffset::PAHelper& pa, int x) - { - WritePixel4(pa.value(x), *pb & 0xf); - WritePixel4(pa.value(x + 1), *pb >> 4); - pb++; - }); - break; - - case PSM_PSMT8H: - readWriteHelper(vm32(), tx, ty, len, 1, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8H), [&](auto& pa, int x) - { - WritePixel8H(pa.value(x), *pb); - pb++; - }); - break; - - case PSM_PSMT4HL: - readWriteHelper(vm32(), tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HL), [&](auto& pa, int x) - { - WritePixel4HL(pa.value(x), *pb & 0xf); - WritePixel4HL(pa.value(x + 1), *pb >> 4); - pb++; - }); - break; - - case PSM_PSMT4HH: - readWriteHelper(vm32(), tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HH), [&](auto& pa, int x) - { - WritePixel4HH(pa.value(x), *pb & 0xf); - WritePixel4HH(pa.value(x + 1), *pb >> 4); - pb++; - }); - break; - } -} - -// - -void GSLocalMemory::ReadImageX(int& tx, int& ty, u8* dst, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) const -{ - if (len <= 0) - return; - - u8* RESTRICT pb = (u8*)dst; - u16* RESTRICT pw = (u16*)dst; - u32* RESTRICT pd = (u32*)dst; - - u32 bp = BITBLTBUF.SBP; - u32 bw = BITBLTBUF.SBW; - - int sx = TRXPOS.SSAX; - int w = TRXREG.RRW; - - GSOffset off = GetOffset(bp, bw, BITBLTBUF.SPSM); - - // printf("spsm=%d x=%d ex=%d y=%d len=%d\n", BITBLTBUF.SPSM, x, ex, y, len); - - switch (BITBLTBUF.SPSM) - { - case PSM_PSMCT32: - case PSM_PSMZ32: - { - // MGS1 intro, fade effect between two scenes (airplane outside-inside transition) - - int x = tx; - int y = ty; - int ex = sx + w; - - len /= 4; - - GSOffset::PAPtrHelper pa = off.assertSizesMatch(swizzle32).paMulti(vm32(), 0, y); - - while (len > 0) - { - for (; len > 0 && x < ex && (x & 7); len--, x++, pd++) - { - *pd = *pa.value(x); - } - - // aligned to a column - - for (int ex8 = ex - 8; len >= 8 && x <= ex8; len -= 8, x += 8, pd += 8) - { - u32* ps = pa.value(x); - - GSVector4i::store(&pd[0], GSVector4i::load(ps + 0, ps + 4)); - GSVector4i::store(&pd[4], GSVector4i::load(ps + 8, ps + 12)); - - for (int i = 0; i < 8; i++) - ASSERT(pd[i] == *pa.value(x + i)); - } - - for (; len > 0 && x < ex; len--, x++, pd++) - { - *pd = *pa.value(x); - } - - if (x == ex) - { - y++; - x = sx; - pa = off.assertSizesMatch(swizzle32).paMulti(vm32(), 0, y); - } - } - - tx = x; - ty = y; - } - break; - - case PSM_PSMCT24: - case PSM_PSMZ24: - readWriteHelper(vm32(), tx, ty, len / 3, 1, sx, w, off.assertSizesMatch(swizzle32), [&](auto& pa, int x) - { - u32 c = *pa.value(x); - pb[0] = (u8)(c); - pb[1] = (u8)(c >> 8); - pb[2] = (u8)(c >> 16); - pb += 3; - }); - break; - - case PSM_PSMCT16: - case PSM_PSMCT16S: - case PSM_PSMZ16: - case PSM_PSMZ16S: - readWriteHelper(vm16(), tx, ty, len / 2, 1, sx, w, off.assertSizesMatch(swizzle16), [&](auto& pa, int x) - { - *pw = *pa.value(x); - pw++; - }); - break; - - case PSM_PSMT8: - readWriteHelper(m_vm8, tx, ty, len, 1, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8), [&](auto& pa, int x) - { - *pb = *pa.value(x); - pb++; - }); - break; - - case PSM_PSMT4: - readWriteHelper(tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4), [&](GSOffset::PAHelper& pa, int x) - { - u8 low = ReadPixel4(pa.value(x)); - u8 high = ReadPixel4(pa.value(x + 1)); - *pb = low | (high << 4); - }); - break; - - case PSM_PSMT8H: - readWriteHelper(vm32(), tx, ty, len, 1, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8H), [&](auto& pa, int x) - { - *pb = (u8)(*pa.value(x) >> 24); - pb++; - }); - break; - - case PSM_PSMT4HL: - readWriteHelper(vm32(), tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HL), [&](auto& pa, int x) - { - u32 c0 = *pa.value(x) >> 24 & 0x0f; - u32 c1 = *pa.value(x + 1) >> 20 & 0xf0; - *pb = (u8)(c0 | c1); - pb++; - }); - break; - - case PSM_PSMT4HH: - readWriteHelper(vm32(), tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HH), [&](auto& pa, int x) - { - u32 c0 = *pa.value(x) >> 28 & 0x0f; - u32 c1 = *pa.value(x + 1) >> 24 & 0xf0; - *pb = (u8)(c0 | c1); - pb++; - }); - break; - } -} - -/////////////////// - -void GSLocalMemory::ReadTexture32(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadBlock32(src, read_dst, dstpitch); - }); -} - -void GSLocalMemory::ReadTexture24(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - if (TEXA.AEM) - { - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock24(src, read_dst, dstpitch, TEXA); - }); - } - else - { - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock24(src, read_dst, dstpitch, TEXA); - }); - } -} - -void GSLocalMemory::ReadTextureGPU24(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 16, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadBlock16(src, read_dst, dstpitch); - }); - - // Convert packed RGB scanline to 32 bits RGBA - ASSERT(dstpitch >= r.width() * 4); - for (int y = r.top; y < r.bottom; y++) - { - u8* line = dst + y * dstpitch; - - for (int x = r.right; x >= r.left; x--) - { - *(u32*)&line[x * 4] = *(u32*)&line[x * 3] & 0xFFFFFF; - } - } -} - -void GSLocalMemory::ReadTexture16(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - if (TEXA.AEM) - { - foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock16(src, read_dst, dstpitch, TEXA); - }); - } - else - { - foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock16(src, read_dst, dstpitch, TEXA); - }); - } -} - -void GSLocalMemory::ReadTexture8(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - const u32* pal = m_clut; - - foreachBlock(off.assertSizesMatch(swizzle8), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock8_32(src, read_dst, dstpitch, pal); - }); -} - -void GSLocalMemory::ReadTexture4(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - const u32* pal = m_clut; - - foreachBlock(off.assertSizesMatch(swizzle4), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock4_32(src, read_dst, dstpitch, pal); - }); -} - -void GSLocalMemory::ReadTexture8H(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - const u32* pal = m_clut; - - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock8H_32(src, read_dst, dstpitch, pal); - }); -} - -#if _M_SSE == 0x501 -void GSLocalMemory::ReadTexture8HSW(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - const u32* pal = m_clut; - - foreachBlock(off.assertSizesMatch(swizzle8), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock8_32HSW(src, read_dst, dstpitch, pal); - }); -} - -void GSLocalMemory::ReadTexture8HHSW(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - const u32* pal = m_clut; - - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock8H_32HSW(src, read_dst, dstpitch, pal); - }); -} -#endif - -void GSLocalMemory::ReadTexture4HL(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - const u32* pal = m_clut; - - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock4HL_32(src, read_dst, dstpitch, pal); - }); -} - -void GSLocalMemory::ReadTexture4HH(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - const u32* pal = m_clut; - - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadAndExpandBlock4HH_32(src, read_dst, dstpitch, pal); - }); -} - -/////////////////// - -void GSLocalMemory::ReadTextureBlock32(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadBlock32(BlockPtr(bp), dst, dstpitch); -} - -void GSLocalMemory::ReadTextureBlock24(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - if (TEXA.AEM) - { - GSBlock::ReadAndExpandBlock24(BlockPtr(bp), dst, dstpitch, TEXA); - } - else - { - GSBlock::ReadAndExpandBlock24(BlockPtr(bp), dst, dstpitch, TEXA); - } -} - -void GSLocalMemory::ReadTextureBlock16(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - if (TEXA.AEM) - { - GSBlock::ReadAndExpandBlock16(BlockPtr(bp), dst, dstpitch, TEXA); - } - else - { - GSBlock::ReadAndExpandBlock16(BlockPtr(bp), dst, dstpitch, TEXA); - } -} - -void GSLocalMemory::ReadTextureBlock8(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadAndExpandBlock8_32(BlockPtr(bp), dst, dstpitch, m_clut); -} - -void GSLocalMemory::ReadTextureBlock4(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadAndExpandBlock4_32(BlockPtr(bp), dst, dstpitch, m_clut); -} - -void GSLocalMemory::ReadTextureBlock8H(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadAndExpandBlock8H_32(BlockPtr(bp), dst, dstpitch, m_clut); -} - -#if _M_SSE == 0x501 -void GSLocalMemory::ReadTextureBlock8HSW(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadAndExpandBlock8_32HSW(BlockPtr(bp), dst, dstpitch, m_clut); -} - -void GSLocalMemory::ReadTextureBlock8HHSW(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadAndExpandBlock8H_32HSW(BlockPtr(bp), dst, dstpitch, m_clut); -} -#endif - -void GSLocalMemory::ReadTextureBlock4HL(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadAndExpandBlock4HL_32(BlockPtr(bp), dst, dstpitch, m_clut); -} - -void GSLocalMemory::ReadTextureBlock4HH(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadAndExpandBlock4HH_32(BlockPtr(bp), dst, dstpitch, m_clut); -} - /////////////////// void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) @@ -1701,93 +533,16 @@ void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, u8* ds { crdst += dstpitch * (cr.top - r.top); crdst += sizeof(u32) * (cr.left - r.left); - (this->*rtx)(off, cr, crdst, dstpitch, TEXA); + rtx(*this, off, cr, crdst, dstpitch, TEXA); } } } else { - (this->*rtx)(off, r, dst, dstpitch, TEXA); + rtx(*this, off, r, dst, dstpitch, TEXA); } } -// 32/8 - -void GSLocalMemory::ReadTexture8P(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - foreachBlock(off.assertSizesMatch(swizzle8), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadBlock8(src, read_dst, dstpitch); - }); -} - -void GSLocalMemory::ReadTexture4P(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - foreachBlock(off.assertSizesMatch(swizzle4), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadBlock4P(src, read_dst, dstpitch); - }); -} - -void GSLocalMemory::ReadTexture8HP(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadBlock8HP(src, read_dst, dstpitch); - }); -} - -void GSLocalMemory::ReadTexture4HLP(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadBlock4HLP(src, read_dst, dstpitch); - }); -} - -void GSLocalMemory::ReadTexture4HHP(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) -{ - foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) - { - GSBlock::ReadBlock4HHP(src, read_dst, dstpitch); - }); -} - -// - -void GSLocalMemory::ReadTextureBlock8P(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - GSBlock::ReadBlock8(BlockPtr(bp), dst, dstpitch); -} - -void GSLocalMemory::ReadTextureBlock4P(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadBlock4P(BlockPtr(bp), dst, dstpitch); -} - -void GSLocalMemory::ReadTextureBlock8HP(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadBlock8HP(BlockPtr(bp), dst, dstpitch); -} - -void GSLocalMemory::ReadTextureBlock4HLP(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadBlock4HLP(BlockPtr(bp), dst, dstpitch); -} - -void GSLocalMemory::ReadTextureBlock4HHP(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const -{ - ALIGN_STACK(32); - - GSBlock::ReadBlock4HHP(BlockPtr(bp), dst, dstpitch); -} - // #include "Renderers/SW/GSTextureSW.h" diff --git a/pcsx2/GS/GSLocalMemory.h b/pcsx2/GS/GSLocalMemory.h index b7b3bfd322..c8d07dc82c 100644 --- a/pcsx2/GS/GSLocalMemory.h +++ b/pcsx2/GS/GSLocalMemory.h @@ -17,8 +17,8 @@ #include "GSTables.h" #include "GSVector.h" -#include "GSBlock.h" #include "GSClut.h" +#include "MultiISA.h" #include #include @@ -434,8 +434,14 @@ inline u32 GSSwizzleInfo::pa(int x, int y, u32 bp, u32 bw) const return GSOffset(*this, bp, bw, 0).pa(x, y); } +class GSLocalMemory; +MULTI_ISA_DEF(class GSLocalMemoryFunctions;) +MULTI_ISA_DEF(void GSLocalMemoryPopulateFunctions(GSLocalMemory& mem);) + class GSLocalMemory : public GSAlignedClass<32> { + MULTI_ISA_FRIEND(GSLocalMemoryFunctions) + public: typedef u32 (*pixelAddress)(int x, int y, u32 bp, u32 bw); typedef void (GSLocalMemory::*writePixel)(int x, int y, u32 c, u32 bp, u32 bw); @@ -444,12 +450,13 @@ public: typedef u32 (GSLocalMemory::*readTexel)(int x, int y, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA) const; typedef void (GSLocalMemory::*writePixelAddr)(u32 addr, u32 c); typedef void (GSLocalMemory::*writeFrameAddr)(u32 addr, u32 c); + typedef u32(GSLocalMemory::*PixelAddr)(int x, int y, u32 bp, u32 bw) const; typedef u32 (GSLocalMemory::*readPixelAddr)(u32 addr) const; typedef u32 (GSLocalMemory::*readTexelAddr)(u32 addr, const GIFRegTEXA& TEXA) const; - typedef void (GSLocalMemory::*writeImage)(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); - typedef void (GSLocalMemory::*readImage)(int& tx, int& ty, u8* dst, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) const; - typedef void (GSLocalMemory::*readTexture)(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - typedef void (GSLocalMemory::*readTextureBlock)(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; + typedef void (*writeImage)(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + typedef void (*readImage)(const GSLocalMemory& mem, int& tx, int& ty, u8* dst, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + typedef void (*readTexture)(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + typedef void (*readTextureBlock)(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); struct alignas(128) psm_t { @@ -472,6 +479,7 @@ public: }; static psm_t m_psm[64]; + static readImage m_readImageX; static const int m_vmsize = 1024 * 1024 * 4; @@ -1107,81 +1115,11 @@ public: return ReadTexel16(PixelAddress16SZ(x, y, TEX0.TBP0, TEX0.TBW), TEXA); } - // + __forceinline void ReadImageX(int& tx, int& ty, u8* dst, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) const + { + m_readImageX(*this, tx, ty, dst, len, BITBLTBUF, TRXPOS, TRXREG); + } - template - void WriteImageColumn(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF); - - template - void WriteImageBlock(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF); - - template - void WriteImageLeftRight(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF); - - template - void WriteImageTopBottom(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF); - - template - void WriteImage(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); - - void WriteImage24(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); - void WriteImage8H(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); - void WriteImage4HL(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); - void WriteImage4HH(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); - void WriteImage24Z(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); - void WriteImageX(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); - - // TODO: ReadImage32/24/... - - void ReadImageX(int& tx, int& ty, u8* dst, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) const; - - // * => 32 - - void ReadTexture32(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTextureGPU24(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture24(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture16(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture8(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture4(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture8H(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture4HL(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture4HH(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - - void ReadTexture(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - - void ReadTextureBlock32(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock24(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock16(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock8(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock4(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock8H(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock4HL(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock4HH(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - -#if _M_SSE == 0x501 - void ReadTexture8HSW(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture8HHSW(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTextureBlock8HSW(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock8HHSW(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; -#endif - - // pal ? 8 : 32 - - void ReadTexture8P(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture4P(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture8HP(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture4HLP(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - void ReadTexture4HHP(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); - - void ReadTextureBlock8P(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock4P(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock8HP(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock4HLP(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - void ReadTextureBlock4HHP(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; - - // - - template void ReadTexture(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); // diff --git a/pcsx2/GS/GSLocalMemoryMultiISA.cpp b/pcsx2/GS/GSLocalMemoryMultiISA.cpp new file mode 100644 index 0000000000..67a0b3e2d0 --- /dev/null +++ b/pcsx2/GS/GSLocalMemoryMultiISA.cpp @@ -0,0 +1,1377 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2021 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" +#include "GSLocalMemory.h" +#include "GS.h" +#include "GSBlock.h" +#include "GSExtra.h" + +class CURRENT_ISA::GSLocalMemoryFunctions +{ + template + static void WriteImageColumn(GSLocalMemory& mem, int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF); + + template + static void WriteImageBlock(GSLocalMemory& mem, int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF); + + template + static void WriteImageLeftRight(GSLocalMemory& mem, int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF); + + template + static void WriteImageTopBottom(GSLocalMemory& mem, int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF); + + template + static void WriteImage(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + + static void WriteImage24(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + static void WriteImage8H(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + static void WriteImage4HL(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + static void WriteImage4HH(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + static void WriteImage24Z(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + static void WriteImageX(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + + // TODO: ReadImage32/24/... + + static void ReadTexture32(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureGPU24(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture24(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture16(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture8(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture4(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture8H(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture4HL(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture4HH(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + + static void ReadTextureBlock32(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock24(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock16(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock8(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock4(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock8H(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock4HL(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock4HH(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + + static void ReadTexture8P(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture4P(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture8HP(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture4HLP(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture4HHP(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + + static void ReadTextureBlock8P(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock4P(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock8HP(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock4HLP(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock4HHP(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + +#if _M_SSE == 0x501 + static void ReadTexture8HSW(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTexture8HHSW(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock8HSW(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + static void ReadTextureBlock8HHSW(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); +#endif + + template + static void ReadTexture(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA); + +public: + static void ReadImageX(const GSLocalMemory& mem, int& tx, int& ty, u8* dst, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG); + + static void PopulateFunctions(GSLocalMemory& mem); +}; + +MULTI_ISA_UNSHARED_IMPL; + +void CURRENT_ISA::GSLocalMemoryPopulateFunctions(GSLocalMemory& mem) +{ + GSLocalMemoryFunctions::PopulateFunctions(mem); +} + +void GSLocalMemoryFunctions::PopulateFunctions(GSLocalMemory& mem) +{ + mem.m_readImageX = ReadImageX; + + for (GSLocalMemory::psm_t& psm : mem.m_psm) + { + psm.wi = WriteImage; + psm.ri = ReadImageX; // TODO + psm.rtx = ReadTexture32; + psm.rtxP = ReadTexture32; + psm.rtxb = ReadTextureBlock32; + psm.rtxbP = ReadTextureBlock32; + } + + mem.m_psm[PSM_PSMCT24].wi = WriteImage24; // TODO + mem.m_psm[PSM_PSMCT16].wi = WriteImage; + mem.m_psm[PSM_PSMCT16S].wi = WriteImage; + mem.m_psm[PSM_PSMT8].wi = WriteImage; + mem.m_psm[PSM_PSMT4].wi = WriteImage; + mem.m_psm[PSM_PSMT8H].wi = WriteImage8H; // TODO + mem.m_psm[PSM_PSMT4HL].wi = WriteImage4HL; // TODO + mem.m_psm[PSM_PSMT4HH].wi = WriteImage4HH; // TODO + mem.m_psm[PSM_PSMZ32].wi = WriteImage; + mem.m_psm[PSM_PSMZ24].wi = WriteImage24Z; // TODO + mem.m_psm[PSM_PSMZ16].wi = WriteImage; + mem.m_psm[PSM_PSMZ16S].wi = WriteImage; + + mem.m_psm[PSM_PSMCT24].rtx = ReadTexture24; + mem.m_psm[PSM_PSGPU24].rtx = ReadTextureGPU24; + mem.m_psm[PSM_PSMCT16].rtx = ReadTexture16; + mem.m_psm[PSM_PSMCT16S].rtx = ReadTexture16; + mem.m_psm[PSM_PSMT8].rtx = ReadTexture8; + mem.m_psm[PSM_PSMT4].rtx = ReadTexture4; + mem.m_psm[PSM_PSMT8H].rtx = ReadTexture8H; + mem.m_psm[PSM_PSMT4HL].rtx = ReadTexture4HL; + mem.m_psm[PSM_PSMT4HH].rtx = ReadTexture4HH; + mem.m_psm[PSM_PSMZ32].rtx = ReadTexture32; + mem.m_psm[PSM_PSMZ24].rtx = ReadTexture24; + mem.m_psm[PSM_PSMZ16].rtx = ReadTexture16; + mem.m_psm[PSM_PSMZ16S].rtx = ReadTexture16; + + mem.m_psm[PSM_PSMCT24].rtxP = ReadTexture24; + mem.m_psm[PSM_PSMCT16].rtxP = ReadTexture16; + mem.m_psm[PSM_PSMCT16S].rtxP = ReadTexture16; + mem.m_psm[PSM_PSMT8].rtxP = ReadTexture8P; + mem.m_psm[PSM_PSMT4].rtxP = ReadTexture4P; + mem.m_psm[PSM_PSMT8H].rtxP = ReadTexture8HP; + mem.m_psm[PSM_PSMT4HL].rtxP = ReadTexture4HLP; + mem.m_psm[PSM_PSMT4HH].rtxP = ReadTexture4HHP; + mem.m_psm[PSM_PSMZ32].rtxP = ReadTexture32; + mem.m_psm[PSM_PSMZ24].rtxP = ReadTexture24; + mem.m_psm[PSM_PSMZ16].rtxP = ReadTexture16; + mem.m_psm[PSM_PSMZ16S].rtxP = ReadTexture16; + + mem.m_psm[PSM_PSMCT24].rtxb = ReadTextureBlock24; + mem.m_psm[PSM_PSMCT16].rtxb = ReadTextureBlock16; + mem.m_psm[PSM_PSMCT16S].rtxb = ReadTextureBlock16; + mem.m_psm[PSM_PSMT8].rtxb = ReadTextureBlock8; + mem.m_psm[PSM_PSMT4].rtxb = ReadTextureBlock4; + mem.m_psm[PSM_PSMT8H].rtxb = ReadTextureBlock8H; + mem.m_psm[PSM_PSMT4HL].rtxb = ReadTextureBlock4HL; + mem.m_psm[PSM_PSMT4HH].rtxb = ReadTextureBlock4HH; + mem.m_psm[PSM_PSMZ32].rtxb = ReadTextureBlock32; + mem.m_psm[PSM_PSMZ24].rtxb = ReadTextureBlock24; + mem.m_psm[PSM_PSMZ16].rtxb = ReadTextureBlock16; + mem.m_psm[PSM_PSMZ16S].rtxb = ReadTextureBlock16; + + mem.m_psm[PSM_PSMCT24].rtxbP = ReadTextureBlock24; + mem.m_psm[PSM_PSMCT16].rtxbP = ReadTextureBlock16; + mem.m_psm[PSM_PSMCT16S].rtxbP = ReadTextureBlock16; + mem.m_psm[PSM_PSMT8].rtxbP = ReadTextureBlock8P; + mem.m_psm[PSM_PSMT4].rtxbP = ReadTextureBlock4P; + mem.m_psm[PSM_PSMT8H].rtxbP = ReadTextureBlock8HP; + mem.m_psm[PSM_PSMT4HL].rtxbP = ReadTextureBlock4HLP; + mem.m_psm[PSM_PSMT4HH].rtxbP = ReadTextureBlock4HHP; + mem.m_psm[PSM_PSMZ32].rtxbP = ReadTextureBlock32; + mem.m_psm[PSM_PSMZ24].rtxbP = ReadTextureBlock24; + mem.m_psm[PSM_PSMZ16].rtxbP = ReadTextureBlock16; + mem.m_psm[PSM_PSMZ16S].rtxbP = ReadTextureBlock16; + +#if _M_SSE == 0x501 + if (g_cpu.hasSlowGather) + { + mem.m_psm[PSM_PSMT8].rtx = ReadTexture8HSW; + mem.m_psm[PSM_PSMT8H].rtx = ReadTexture8HHSW; + mem.m_psm[PSM_PSMT8].rtxb = ReadTextureBlock8HSW; + mem.m_psm[PSM_PSMT8H].rtxb = ReadTextureBlock8HHSW; + } +#endif +} + +template +static void foreachBlock(const GSOffset& off, GSLocalMemory& mem, const GSVector4i& r, u8* dst, int dstpitch, int bpp, Fn&& fn) +{ + ASSERT(off.isBlockAligned(r)); + GSOffset::BNHelper bn = off.bnMulti(r.left, r.top); + int right = r.right >> off.blockShiftX(); + int bottom = r.bottom >> off.blockShiftY(); + + int offset = dstpitch << off.blockShiftY(); + int xAdd = (1 << off.blockShiftX()) * (bpp / 8); + + for (; bn.blkY() < bottom; bn.nextBlockY(), dst += offset) + { + for (int x = 0; bn.blkX() < right; bn.nextBlockX(), x += xAdd) + { + const u8* src = mem.BlockPtr(bn.value()); + u8* read_dst = dst + x; + fn(read_dst, src); + } + } +} + +template +void GSLocalMemoryFunctions::WriteImageColumn(GSLocalMemory& mem, int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF) +{ + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + const int csy = bsy / 4; + + for (int offset = srcpitch * csy; h >= csy; h -= csy, y += csy, src += offset) + { + for (int x = l; x < r; x += bsx) + { + switch (psm) + { + case PSM_PSMCT32: GSBlock::WriteColumn32(y, mem.BlockPtr32(x, y, bp, bw), &src[x * 4], srcpitch); break; + case PSM_PSMCT16: GSBlock::WriteColumn16(y, mem.BlockPtr16(x, y, bp, bw), &src[x * 2], srcpitch); break; + case PSM_PSMCT16S: GSBlock::WriteColumn16(y, mem.BlockPtr16S(x, y, bp, bw), &src[x * 2], srcpitch); break; + case PSM_PSMT8: GSBlock::WriteColumn8(y, mem.BlockPtr8(x, y, bp, bw), &src[x], srcpitch); break; + case PSM_PSMT4: GSBlock::WriteColumn4(y, mem.BlockPtr4(x, y, bp, bw), &src[x >> 1], srcpitch); break; + case PSM_PSMZ32: GSBlock::WriteColumn32(y, mem.BlockPtr32Z(x, y, bp, bw), &src[x * 4], srcpitch); break; + case PSM_PSMZ16: GSBlock::WriteColumn16(y, mem.BlockPtr16Z(x, y, bp, bw), &src[x * 2], srcpitch); break; + case PSM_PSMZ16S: GSBlock::WriteColumn16(y, mem.BlockPtr16SZ(x, y, bp, bw), &src[x * 2], srcpitch); break; + // TODO + default: __assume(0); + } + } + } +} + +template +void GSLocalMemoryFunctions::WriteImageBlock(GSLocalMemory& mem, int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF) +{ + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + for (int offset = srcpitch * bsy; h >= bsy; h -= bsy, y += bsy, src += offset) + { + for (int x = l; x < r; x += bsx) + { + switch (psm) + { + case PSM_PSMCT32: GSBlock::WriteBlock32(mem.BlockPtr32(x, y, bp, bw), &src[x * 4], srcpitch); break; + case PSM_PSMCT16: GSBlock::WriteBlock16(mem.BlockPtr16(x, y, bp, bw), &src[x * 2], srcpitch); break; + case PSM_PSMCT16S: GSBlock::WriteBlock16(mem.BlockPtr16S(x, y, bp, bw), &src[x * 2], srcpitch); break; + case PSM_PSMT8: GSBlock::WriteBlock8(mem.BlockPtr8(x, y, bp, bw), &src[x], srcpitch); break; + case PSM_PSMT4: GSBlock::WriteBlock4(mem.BlockPtr4(x, y, bp, bw), &src[x >> 1], srcpitch); break; + case PSM_PSMZ32: GSBlock::WriteBlock32(mem.BlockPtr32Z(x, y, bp, bw), &src[x * 4], srcpitch); break; + case PSM_PSMZ16: GSBlock::WriteBlock16(mem.BlockPtr16Z(x, y, bp, bw), &src[x * 2], srcpitch); break; + case PSM_PSMZ16S: GSBlock::WriteBlock16(mem.BlockPtr16SZ(x, y, bp, bw), &src[x * 2], srcpitch); break; + // TODO + default: __assume(0); + } + } + } +} + +template +void GSLocalMemoryFunctions::WriteImageLeftRight(GSLocalMemory& mem, int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF) +{ + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + for (; h > 0; y++, h--, src += srcpitch) + { + for (int x = l; x < r; x++) + { + switch (psm) + { + case PSM_PSMCT32: mem.WritePixel32(x, y, *(u32*)&src[x * 4], bp, bw); break; + case PSM_PSMCT16: mem.WritePixel16(x, y, *(u16*)&src[x * 2], bp, bw); break; + case PSM_PSMCT16S: mem.WritePixel16S(x, y, *(u16*)&src[x * 2], bp, bw); break; + case PSM_PSMT8: mem.WritePixel8(x, y, src[x], bp, bw); break; + case PSM_PSMT4: mem.WritePixel4(x, y, src[x >> 1] >> ((x & 1) << 2), bp, bw); break; + case PSM_PSMZ32: mem.WritePixel32Z(x, y, *(u32*)&src[x * 4], bp, bw); break; + case PSM_PSMZ16: mem.WritePixel16Z(x, y, *(u16*)&src[x * 2], bp, bw); break; + case PSM_PSMZ16S: mem.WritePixel16SZ(x, y, *(u16*)&src[x * 2], bp, bw); break; + // TODO + default: __assume(0); + } + } + } +} + +template +void GSLocalMemoryFunctions::WriteImageTopBottom(GSLocalMemory& mem, int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF) +{ + alignas(32) u8 buff[64]; // merge buffer for one column + + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + const int csy = bsy / 4; + + // merge incomplete column + + int y2 = y & (csy - 1); + + if (y2 > 0) + { + int h2 = std::min(h, csy - y2); + + for (int x = l; x < r; x += bsx) + { + u8* dst = NULL; + + switch (psm) + { + case PSM_PSMCT32: dst = mem.BlockPtr32(x, y, bp, bw); break; + case PSM_PSMCT16: dst = mem.BlockPtr16(x, y, bp, bw); break; + case PSM_PSMCT16S: dst = mem.BlockPtr16S(x, y, bp, bw); break; + case PSM_PSMT8: dst = mem.BlockPtr8(x, y, bp, bw); break; + case PSM_PSMT4: dst = mem.BlockPtr4(x, y, bp, bw); break; + case PSM_PSMZ32: dst = mem.BlockPtr32Z(x, y, bp, bw); break; + case PSM_PSMZ16: dst = mem.BlockPtr16Z(x, y, bp, bw); break; + case PSM_PSMZ16S: dst = mem.BlockPtr16SZ(x, y, bp, bw); break; + // TODO + default: __assume(0); + } + + switch (psm) + { + case PSM_PSMCT32: + case PSM_PSMZ32: + GSBlock::ReadColumn32(y, dst, buff, 32); + memcpy(&buff[32], &src[x * 4], 32); + GSBlock::WriteColumn32<32, 0xffffffff>(y, dst, buff, 32); + break; + case PSM_PSMCT16: + case PSM_PSMCT16S: + case PSM_PSMZ16: + case PSM_PSMZ16S: + GSBlock::ReadColumn16(y, dst, buff, 32); + memcpy(&buff[32], &src[x * 2], 32); + GSBlock::WriteColumn16<32>(y, dst, buff, 32); + break; + case PSM_PSMT8: + GSBlock::ReadColumn8(y, dst, buff, 16); + for (int i = 0, j = y2; i < h2; i++, j++) + memcpy(&buff[j * 16], &src[i * srcpitch + x], 16); + GSBlock::WriteColumn8<32>(y, dst, buff, 16); + break; + case PSM_PSMT4: + GSBlock::ReadColumn4(y, dst, buff, 16); + for (int i = 0, j = y2; i < h2; i++, j++) + memcpy(&buff[j * 16], &src[i * srcpitch + (x >> 1)], 16); + GSBlock::WriteColumn4<32>(y, dst, buff, 16); + break; + // TODO + default: + __assume(0); + } + } + + src += srcpitch * h2; + y += h2; + h -= h2; + } + + // write whole columns + + { + int h2 = h & ~(csy - 1); + + if (h2 > 0) + { +#if FAST_UNALIGNED + WriteImageColumn(mem, l, r, y, h2, src, srcpitch, BITBLTBUF); +#else + size_t addr = (size_t)&src[l * trbpp >> 3]; + + if ((addr & 31) == 0 && (srcpitch & 31) == 0) + { + WriteImageColumn(mem, l, r, y, h2, src, srcpitch, BITBLTBUF); + } + else if ((addr & 15) == 0 && (srcpitch & 15) == 0) + { + WriteImageColumn(mem, l, r, y, h2, src, srcpitch, BITBLTBUF); + } + else + { + WriteImageColumn(mem, l, r, y, h2, src, srcpitch, BITBLTBUF); + } +#endif + + src += srcpitch * h2; + y += h2; + h -= h2; + } + } + + // merge incomplete column + + if (h >= 1) + { + for (int x = l; x < r; x += bsx) + { + u8* dst = NULL; + + switch (psm) + { + case PSM_PSMCT32: dst = mem.BlockPtr32(x, y, bp, bw); break; + case PSM_PSMCT16: dst = mem.BlockPtr16(x, y, bp, bw); break; + case PSM_PSMCT16S: dst = mem.BlockPtr16S(x, y, bp, bw); break; + case PSM_PSMT8: dst = mem.BlockPtr8(x, y, bp, bw); break; + case PSM_PSMT4: dst = mem.BlockPtr4(x, y, bp, bw); break; + case PSM_PSMZ32: dst = mem.BlockPtr32Z(x, y, bp, bw); break; + case PSM_PSMZ16: dst = mem.BlockPtr16Z(x, y, bp, bw); break; + case PSM_PSMZ16S: dst = mem.BlockPtr16SZ(x, y, bp, bw); break; + // TODO + default: __assume(0); + } + + switch (psm) + { + case PSM_PSMCT32: + case PSM_PSMZ32: + GSBlock::ReadColumn32(y, dst, buff, 32); + memcpy(&buff[0], &src[x * 4], 32); + GSBlock::WriteColumn32<32, 0xffffffff>(y, dst, buff, 32); + break; + case PSM_PSMCT16: + case PSM_PSMCT16S: + case PSM_PSMZ16: + case PSM_PSMZ16S: + GSBlock::ReadColumn16(y, dst, buff, 32); + memcpy(&buff[0], &src[x * 2], 32); + GSBlock::WriteColumn16<32>(y, dst, buff, 32); + break; + case PSM_PSMT8: + GSBlock::ReadColumn8(y, dst, buff, 16); + for (int i = 0; i < h; i++) + memcpy(&buff[i * 16], &src[i * srcpitch + x], 16); + GSBlock::WriteColumn8<32>(y, dst, buff, 16); + break; + case PSM_PSMT4: + GSBlock::ReadColumn4(y, dst, buff, 16); + for (int i = 0; i < h; i++) + memcpy(&buff[i * 16], &src[i * srcpitch + (x >> 1)], 16); + GSBlock::WriteColumn4<32>(y, dst, buff, 16); + break; + // TODO + default: + __assume(0); + } + } + } +} + +template +void GSLocalMemoryFunctions::WriteImage(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) +{ + if (TRXREG.RRW == 0) + return; + + const int l = (int)TRXPOS.DSAX; + const int r = l + (int)TRXREG.RRW; + + // finish the incomplete row first + + if (tx != l) + { + int n = std::min(len, (r - tx) * trbpp >> 3); + WriteImageX(mem, tx, ty, src, n, BITBLTBUF, TRXPOS, TRXREG); + src += n; + len -= n; + } + + const int la = (l + (bsx - 1)) & ~(bsx - 1); + const int ra = r & ~(bsx - 1); + // Round up to the nearest byte (NFL 2K5 does r = 1, l = 0 bpp =4, causing divide by zero) + const int srcpitch = (((r - l) * trbpp) + 7) >> 3; + int h = len / srcpitch; + + // Slow path for odd width 4bpp, the fast path expects everything to be perfectly aligned and great, + // but things get hairy with 4bpp pixels and odd widths since the lowest size we can address is 8bits, it goes out of sync. + // Although I call this a slow path, it's probably faster than modifying the data alignment every other line. + // GT3 demo, Jak 2 Japanese subtitles, and the BG Dark Alliance minimap do this. + if (trbpp == 4 && (TRXREG.RRW & 0x1)) + { + int count = 0; + const int t = TRXPOS.DSAY; + const int b = t + (int)TRXREG.RRH; + for (int y = t; y < b; y++) + { + for (int x = l; x < r; x++) + { + mem.WritePixel4(x, y, src[count >> 1] >> ((count & 1) << 2), BITBLTBUF.DBP, BITBLTBUF.DBW); + count++; + } + } + return; + } + + if (ra - la >= bsx && h > 0) // "transfer width" >= "block width" && there is at least one full row + { + const u8* s = &src[-l * trbpp >> 3]; + + src += srcpitch * h; + len -= srcpitch * h; + + // left part + + if (l < la) + { + WriteImageLeftRight(mem, l, la, ty, h, s, srcpitch, BITBLTBUF); + } + + // right part + + if (ra < r) + { + WriteImageLeftRight(mem, ra, r, ty, h, s, srcpitch, BITBLTBUF); + } + + // horizontally aligned part + + if (la < ra) + { + // top part + + { + int h2 = std::min(h, bsy - (ty & (bsy - 1))); + + if (h2 < bsy) + { + WriteImageTopBottom(mem, la, ra, ty, h2, s, srcpitch, BITBLTBUF); + + s += srcpitch * h2; + ty += h2; + h -= h2; + } + } + + // horizontally and vertically aligned part + + { + int h2 = h & ~(bsy - 1); + + if (h2 > 0) + { +#if FAST_UNALIGNED + WriteImageBlock(mem, la, ra, ty, h2, s, srcpitch, BITBLTBUF); +#else + size_t addr = (size_t)&s[la * trbpp >> 3]; + + if ((addr & 31) == 0 && (srcpitch & 31) == 0) + { + WriteImageBlock(mem, la, ra, ty, h2, s, srcpitch, BITBLTBUF); + } + else if ((addr & 15) == 0 && (srcpitch & 15) == 0) + { + WriteImageBlock(mem, la, ra, ty, h2, s, srcpitch, BITBLTBUF); + } + else + { + WriteImageBlock(mem, la, ra, ty, h2, s, srcpitch, BITBLTBUF); + } +#endif + + s += srcpitch * h2; + ty += h2; + h -= h2; + } + } + + // bottom part + + if (h > 0) + { + WriteImageTopBottom(mem, la, ra, ty, h, s, srcpitch, BITBLTBUF); + + // s += srcpitch * h; + ty += h; + // h -= h; + } + } + } + + // the rest + + if (len > 0) + { + WriteImageX(mem, tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); + } +} + + +static bool IsTopLeftAligned(int dsax, int tx, int ty, int bw, int bh) +{ + return ((dsax & (bw - 1)) == 0 && (tx & (bw - 1)) == 0 && dsax == tx && (ty & (bh - 1)) == 0); +} + +void GSLocalMemoryFunctions::WriteImage24(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) +{ + if (TRXREG.RRW == 0) + return; + + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW * 3; + int th = len / srcpitch; + + bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); + + if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) + { + // TODO + + WriteImageX(mem, tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); + } + else + { + th += ty; + + for (int y = ty; y < th; y += 8, src += srcpitch * 8) + { + for (int x = tx; x < tw; x += 8) + { + GSBlock::UnpackAndWriteBlock24(src + (x - tx) * 3, srcpitch, mem.BlockPtr32(x, y, bp, bw)); + } + } + + ty = th; + } +} + +void GSLocalMemoryFunctions::WriteImage8H(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) +{ + if (TRXREG.RRW == 0) + return; + + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW; + int th = len / srcpitch; + + bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); + + if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) + { + // TODO + + WriteImageX(mem, tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); + } + else + { + th += ty; + + for (int y = ty; y < th; y += 8, src += srcpitch * 8) + { + for (int x = tx; x < tw; x += 8) + { + GSBlock::UnpackAndWriteBlock8H(src + (x - tx), srcpitch, mem.BlockPtr32(x, y, bp, bw)); + } + } + + ty = th; + } +} + +void GSLocalMemoryFunctions::WriteImage4HL(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) +{ + if (TRXREG.RRW == 0) + return; + + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW / 2; + int th = len / srcpitch; + + bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); + + if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) + { + // TODO + + WriteImageX(mem, tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); + } + else + { + th += ty; + + for (int y = ty; y < th; y += 8, src += srcpitch * 8) + { + for (int x = tx; x < tw; x += 8) + { + GSBlock::UnpackAndWriteBlock4HL(src + (x - tx) / 2, srcpitch, mem.BlockPtr32(x, y, bp, bw)); + } + } + + ty = th; + } +} + +void GSLocalMemoryFunctions::WriteImage4HH(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) +{ + if (TRXREG.RRW == 0) + return; + + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW / 2; + int th = len / srcpitch; + + bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); + + if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) + { + // TODO + + WriteImageX(mem, tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); + } + else + { + th += ty; + + for (int y = ty; y < th; y += 8, src += srcpitch * 8) + { + for (int x = tx; x < tw; x += 8) + { + GSBlock::UnpackAndWriteBlock4HH(src + (x - tx) / 2, srcpitch, mem.BlockPtr32(x, y, bp, bw)); + } + } + + ty = th; + } +} + +void GSLocalMemoryFunctions::WriteImage24Z(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) +{ + if (TRXREG.RRW == 0) + return; + + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW * 3; + int th = len / srcpitch; + + bool aligned = IsTopLeftAligned(TRXPOS.DSAX, tx, ty, 8, 8); + + if (!aligned || (tw & 7) || (th & 7) || (len % srcpitch)) + { + // TODO + + WriteImageX(mem, tx, ty, src, len, BITBLTBUF, TRXPOS, TRXREG); + } + else + { + th += ty; + + for (int y = ty; y < th; y += 8, src += srcpitch * 8) + { + for (int x = tx; x < tw; x += 8) + { + GSBlock::UnpackAndWriteBlock24(src + (x - tx) * 3, srcpitch, mem.BlockPtr32Z(x, y, bp, bw)); + } + } + + ty = th; + } +} + +/// Helper for WriteImageX and ReadImageX +/// `len` is in pixels, unlike WriteImageX/ReadImageX where it's bytes +/// `xinc` is the amount to increment `x` by per iteration +/// Calls `paGetter` on a starting (x, y) to get some sort of pixel address helper for each line, +/// then `fn` on the helper and an x offset once for every `xinc` pixels along that line +template +static void readWriteHelperImpl(int& tx, int& ty, int len, int xinc, int sx, int w, PAGetter&& paGetter, Fn&& fn) +{ + int y = ty; + int ex = sx + w; + int remX = ex - tx; + + ASSERT(remX >= 0); + + auto pa = paGetter(tx, y); + + while (len > 0) + { + int stop = std::min(remX, len); + len -= stop; + remX -= stop; + + for (int x = 0; x < stop; x += xinc) + fn(pa, x); + + if (remX == 0) + { + y++; + remX = w; + pa = paGetter(sx, y); + } + } + + tx = ex - remX; + ty = y; +} + +/// Helper for WriteImageX and ReadImageX +/// `len` is in pixels, unlike WriteImageX/ReadImageX where it's bytes +/// `xinc` is the amount to increment `x` by per iteration +/// Calls `fn` with a `PAHelper` representing the current line and an int representing the x offset in that line +template +static void readWriteHelper(int& tx, int& ty, int len, int xinc, int sx, int w, const GSOffset& off, Fn&& fn) +{ + readWriteHelperImpl(tx, ty, len, xinc, sx, w, [&](int x, int y){ return off.paMulti(x, y); }, std::forward(fn)); +} + +/// Helper for WriteImageX and ReadImageX +/// `len` is in pixels, unlike WriteImageX/ReadImageX where it's bytes +/// `xinc` is the amount to increment `x` by per iteration +/// Calls `fn` with a `PAPtrHelper` representing the current line and an int representing the x offset in that line +template +static void readWriteHelper(VM* vm, int& tx, int& ty, int len, int xinc, int sx, int w, const GSOffset& off, Fn&& fn) +{ + readWriteHelperImpl(tx, ty, len, xinc, sx, w, [&](int x, int y){ return off.paMulti(vm, x, y); }, std::forward(fn)); +} + +void GSLocalMemoryFunctions::WriteImageX(GSLocalMemory& mem, int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) +{ + if (len <= 0) + return; + + const u8* pb = (u8*)src; + const u16* pw = (u16*)src; + const u32* pd = (u32*)src; + + u32 bp = BITBLTBUF.DBP; + u32 bw = BITBLTBUF.DBW; + + int sx = TRXPOS.DSAX; + int w = TRXREG.RRW; + + GSOffset off = mem.GetOffset(bp, bw, BITBLTBUF.DPSM); + + switch (BITBLTBUF.DPSM) + { + case PSM_PSMCT32: + case PSM_PSMZ32: + readWriteHelper(mem.vm32(), tx, ty, len / 4, 1, sx, w, off.assertSizesMatch(GSLocalMemory::swizzle32), [&](auto& pa, int x) + { + *pa.value(x) = *pd; + pd++; + }); + break; + + case PSM_PSMCT24: + case PSM_PSMZ24: + readWriteHelper(mem.vm32(), tx, ty, len / 3, 1, sx, w, off.assertSizesMatch(GSLocalMemory::swizzle32), [&](auto& pa, int x) + { + mem.WritePixel24(pa.value(x), *(u32*)pb); + pb += 3; + }); + break; + + case PSM_PSMCT16: + case PSM_PSMCT16S: + case PSM_PSMZ16: + case PSM_PSMZ16S: + readWriteHelper(mem.vm16(), tx, ty, len / 2, 1, sx, w, off.assertSizesMatch(GSLocalMemory::swizzle16), [&](auto& pa, int x) + { + *pa.value(x) = *pw; + pw++; + }); + break; + + case PSM_PSMT8: + readWriteHelper(mem.m_vm8, tx, ty, len, 1, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8), [&](auto& pa, int x) + { + *pa.value(x) = *pb; + pb++; + }); + break; + + case PSM_PSMT4: + readWriteHelper(tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4), [&](GSOffset::PAHelper& pa, int x) + { + mem.WritePixel4(pa.value(x), *pb & 0xf); + mem.WritePixel4(pa.value(x + 1), *pb >> 4); + pb++; + }); + break; + + case PSM_PSMT8H: + readWriteHelper(mem.vm32(), tx, ty, len, 1, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8H), [&](auto& pa, int x) + { + mem.WritePixel8H(pa.value(x), *pb); + pb++; + }); + break; + + case PSM_PSMT4HL: + readWriteHelper(mem.vm32(), tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HL), [&](auto& pa, int x) + { + mem.WritePixel4HL(pa.value(x), *pb & 0xf); + mem.WritePixel4HL(pa.value(x + 1), *pb >> 4); + pb++; + }); + break; + + case PSM_PSMT4HH: + readWriteHelper(mem.vm32(), tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HH), [&](auto& pa, int x) + { + mem.WritePixel4HH(pa.value(x), *pb & 0xf); + mem.WritePixel4HH(pa.value(x + 1), *pb >> 4); + pb++; + }); + break; + } +} + +// + +void GSLocalMemoryFunctions::ReadImageX(const GSLocalMemory& mem, int& tx, int& ty, u8* dst, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) +{ + if (len <= 0) + return; + + u8* RESTRICT pb = (u8*)dst; + u16* RESTRICT pw = (u16*)dst; + u32* RESTRICT pd = (u32*)dst; + + u32 bp = BITBLTBUF.SBP; + u32 bw = BITBLTBUF.SBW; + + int sx = TRXPOS.SSAX; + int w = TRXREG.RRW; + + GSOffset off = mem.GetOffset(bp, bw, BITBLTBUF.SPSM); + + // printf("spsm=%d x=%d ex=%d y=%d len=%d\n", BITBLTBUF.SPSM, x, ex, y, len); + + switch (BITBLTBUF.SPSM) + { + case PSM_PSMCT32: + case PSM_PSMZ32: + { + // MGS1 intro, fade effect between two scenes (airplane outside-inside transition) + + int x = tx; + int y = ty; + int ex = sx + w; + + len /= 4; + + GSOffset::PAPtrHelper pa = off.assertSizesMatch(GSLocalMemory::swizzle32).paMulti(mem.vm32(), 0, y); + + while (len > 0) + { + for (; len > 0 && x < ex && (x & 7); len--, x++, pd++) + { + *pd = *pa.value(x); + } + + // aligned to a column + + for (int ex8 = ex - 8; len >= 8 && x <= ex8; len -= 8, x += 8, pd += 8) + { + u32* ps = pa.value(x); + + GSVector4i::store(&pd[0], GSVector4i::load(ps + 0, ps + 4)); + GSVector4i::store(&pd[4], GSVector4i::load(ps + 8, ps + 12)); + + for (int i = 0; i < 8; i++) + ASSERT(pd[i] == *pa.value(x + i)); + } + + for (; len > 0 && x < ex; len--, x++, pd++) + { + *pd = *pa.value(x); + } + + if (x == ex) + { + y++; + x = sx; + pa = off.assertSizesMatch(GSLocalMemory::swizzle32).paMulti(mem.vm32(), 0, y); + } + } + + tx = x; + ty = y; + } + break; + + case PSM_PSMCT24: + case PSM_PSMZ24: + readWriteHelper(mem.vm32(), tx, ty, len / 3, 1, sx, w, off.assertSizesMatch(GSLocalMemory::swizzle32), [&](auto& pa, int x) + { + u32 c = *pa.value(x); + pb[0] = (u8)(c); + pb[1] = (u8)(c >> 8); + pb[2] = (u8)(c >> 16); + pb += 3; + }); + break; + + case PSM_PSMCT16: + case PSM_PSMCT16S: + case PSM_PSMZ16: + case PSM_PSMZ16S: + readWriteHelper(mem.vm16(), tx, ty, len / 2, 1, sx, w, off.assertSizesMatch(GSLocalMemory::swizzle16), [&](auto& pa, int x) + { + *pw = *pa.value(x); + pw++; + }); + break; + + case PSM_PSMT8: + readWriteHelper(mem.m_vm8, tx, ty, len, 1, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8), [&](auto& pa, int x) + { + *pb = *pa.value(x); + pb++; + }); + break; + + case PSM_PSMT4: + readWriteHelper(tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4), [&](GSOffset::PAHelper& pa, int x) + { + u8 low = mem.ReadPixel4(pa.value(x)); + u8 high = mem.ReadPixel4(pa.value(x + 1)); + *pb = low | (high << 4); + }); + break; + + case PSM_PSMT8H: + readWriteHelper(mem.vm32(), tx, ty, len, 1, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8H), [&](auto& pa, int x) + { + *pb = (u8)(*pa.value(x) >> 24); + pb++; + }); + break; + + case PSM_PSMT4HL: + readWriteHelper(mem.vm32(), tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HL), [&](auto& pa, int x) + { + u32 c0 = *pa.value(x) >> 24 & 0x0f; + u32 c1 = *pa.value(x + 1) >> 20 & 0xf0; + *pb = (u8)(c0 | c1); + pb++; + }); + break; + + case PSM_PSMT4HH: + readWriteHelper(mem.vm32(), tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HH), [&](auto& pa, int x) + { + u32 c0 = *pa.value(x) >> 28 & 0x0f; + u32 c1 = *pa.value(x + 1) >> 24 & 0xf0; + *pb = (u8)(c0 | c1); + pb++; + }); + break; + } +} + +/////////////////// + +void GSLocalMemoryFunctions::ReadTexture32(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadBlock32(src, read_dst, dstpitch); + }); +} + +void GSLocalMemoryFunctions::ReadTexture24(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + if (TEXA.AEM) + { + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock24(src, read_dst, dstpitch, TEXA); + }); + } + else + { + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock24(src, read_dst, dstpitch, TEXA); + }); + } +} + +void GSLocalMemoryFunctions::ReadTextureGPU24(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle16), mem, r, dst, dstpitch, 16, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadBlock16(src, read_dst, dstpitch); + }); + + // Convert packed RGB scanline to 32 bits RGBA + ASSERT(dstpitch >= r.width() * 4); + for (int y = r.top; y < r.bottom; y++) + { + u8* line = dst + y * dstpitch; + + for (int x = r.right; x >= r.left; x--) + { + *(u32*)&line[x * 4] = *(u32*)&line[x * 3] & 0xFFFFFF; + } + } +} + +void GSLocalMemoryFunctions::ReadTexture16(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + if (TEXA.AEM) + { + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle16), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock16(src, read_dst, dstpitch, TEXA); + }); + } + else + { + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle16), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock16(src, read_dst, dstpitch, TEXA); + }); + } +} + +void GSLocalMemoryFunctions::ReadTexture8(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + const u32* pal = mem.m_clut; + + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle8), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock8_32(src, read_dst, dstpitch, pal); + }); +} + +void GSLocalMemoryFunctions::ReadTexture4(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + const u32* pal = mem.m_clut; + + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle4), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock4_32(src, read_dst, dstpitch, pal); + }); +} + +void GSLocalMemoryFunctions::ReadTexture8H(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + const u32* pal = mem.m_clut; + + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock8H_32(src, read_dst, dstpitch, pal); + }); +} + +#if _M_SSE == 0x501 +void GSLocalMemoryFunctions::ReadTexture8HSW(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + const u32* pal = mem.m_clut; + + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle8), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock8_32HSW(src, read_dst, dstpitch, pal); + }); +} + +void GSLocalMemoryFunctions::ReadTexture8HHSW(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + const u32* pal = mem.m_clut; + + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock8H_32HSW(src, read_dst, dstpitch, pal); + }); +} +#endif + +void GSLocalMemoryFunctions::ReadTexture4HL(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + const u32* pal = mem.m_clut; + + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock4HL_32(src, read_dst, dstpitch, pal); + }); +} + +void GSLocalMemoryFunctions::ReadTexture4HH(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + const u32* pal = mem.m_clut; + + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadAndExpandBlock4HH_32(src, read_dst, dstpitch, pal); + }); +} + +/////////////////// + +void GSLocalMemoryFunctions::ReadTextureBlock32(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadBlock32(mem.BlockPtr(bp), dst, dstpitch); +} + +void GSLocalMemoryFunctions::ReadTextureBlock24(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + if (TEXA.AEM) + { + GSBlock::ReadAndExpandBlock24(mem.BlockPtr(bp), dst, dstpitch, TEXA); + } + else + { + GSBlock::ReadAndExpandBlock24(mem.BlockPtr(bp), dst, dstpitch, TEXA); + } +} + +void GSLocalMemoryFunctions::ReadTextureBlock16(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + if (TEXA.AEM) + { + GSBlock::ReadAndExpandBlock16(mem.BlockPtr(bp), dst, dstpitch, TEXA); + } + else + { + GSBlock::ReadAndExpandBlock16(mem.BlockPtr(bp), dst, dstpitch, TEXA); + } +} + +void GSLocalMemoryFunctions::ReadTextureBlock8(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadAndExpandBlock8_32(mem.BlockPtr(bp), dst, dstpitch, mem.m_clut); +} + +void GSLocalMemoryFunctions::ReadTextureBlock4(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadAndExpandBlock4_32(mem.BlockPtr(bp), dst, dstpitch, mem.m_clut); +} + +void GSLocalMemoryFunctions::ReadTextureBlock8H(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadAndExpandBlock8H_32(mem.BlockPtr(bp), dst, dstpitch, mem.m_clut); +} + +#if _M_SSE == 0x501 +void GSLocalMemoryFunctions::ReadTextureBlock8HSW(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadAndExpandBlock8_32HSW(mem.BlockPtr(bp), dst, dstpitch, mem.m_clut); +} + +void GSLocalMemoryFunctions::ReadTextureBlock8HHSW(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadAndExpandBlock8H_32HSW(mem.BlockPtr(bp), dst, dstpitch, mem.m_clut); +} +#endif + +void GSLocalMemoryFunctions::ReadTextureBlock4HL(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadAndExpandBlock4HL_32(mem.BlockPtr(bp), dst, dstpitch, mem.m_clut); +} + +void GSLocalMemoryFunctions::ReadTextureBlock4HH(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadAndExpandBlock4HH_32(mem.BlockPtr(bp), dst, dstpitch, mem.m_clut); +} + +// 32/8 + +void GSLocalMemoryFunctions::ReadTexture8P(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle8), mem, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadBlock8(src, read_dst, dstpitch); + }); +} + +void GSLocalMemoryFunctions::ReadTexture4P(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle4), mem, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadBlock4P(src, read_dst, dstpitch); + }); +} + +void GSLocalMemoryFunctions::ReadTexture8HP(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadBlock8HP(src, read_dst, dstpitch); + }); +} + +void GSLocalMemoryFunctions::ReadTexture4HLP(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadBlock4HLP(src, read_dst, dstpitch); + }); +} + +void GSLocalMemoryFunctions::ReadTexture4HHP(GSLocalMemory& mem, const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + foreachBlock(off.assertSizesMatch(GSLocalMemory::swizzle32), mem, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src) + { + GSBlock::ReadBlock4HHP(src, read_dst, dstpitch); + }); +} + +// + +void GSLocalMemoryFunctions::ReadTextureBlock8P(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + GSBlock::ReadBlock8(mem.BlockPtr(bp), dst, dstpitch); +} + +void GSLocalMemoryFunctions::ReadTextureBlock4P(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadBlock4P(mem.BlockPtr(bp), dst, dstpitch); +} + +void GSLocalMemoryFunctions::ReadTextureBlock8HP(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadBlock8HP(mem.BlockPtr(bp), dst, dstpitch); +} + +void GSLocalMemoryFunctions::ReadTextureBlock4HLP(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadBlock4HLP(mem.BlockPtr(bp), dst, dstpitch); +} + +void GSLocalMemoryFunctions::ReadTextureBlock4HHP(const GSLocalMemory& mem, u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) +{ + ALIGN_STACK(32); + + GSBlock::ReadBlock4HHP(mem.BlockPtr(bp), dst, dstpitch); +} diff --git a/pcsx2/GS/GSState.cpp b/pcsx2/GS/GSState.cpp index e330295ed6..88d15ca396 100644 --- a/pcsx2/GS/GSState.cpp +++ b/pcsx2/GS/GSState.cpp @@ -51,7 +51,7 @@ GSState::GSState() { // m_nativeres seems to be a hack. Unfortunately it impacts draw call number which make debug painful in the replayer. // Let's keep it disabled to ease debug. - m_nativeres = GSConfig.UpscaleMultiplier == 1; + m_nativeres = GSConfig.UpscaleMultiplier == 1.0f; m_mipmap = GSConfig.Mipmap; s_n = 0; @@ -149,6 +149,8 @@ GSState::~GSState() void GSState::Reset(bool hardware_reset) { + Flush(GSFlushReason::RESET); + // FIXME: bios logo not shown cut in half after reset, missing graphics in GoW after first FMV if (hardware_reset) memset(m_mem.m_vm8, 0, m_mem.m_vmsize); @@ -436,7 +438,7 @@ GSVector4i GSState::GetDisplayRect(int i) const int width = DW / magnification.x; const int height = DH / magnification.y; - GSVector2i offsets = GetResolutionOffset(i); + const GSVector2i offsets = GetResolutionOffset(i); // Set up the display rectangle based on the values obtained from DISPLAY registers rectangle.left = offsets.x; @@ -480,7 +482,7 @@ GSVector2i GSState::GetResolution() // The resolution of the framebuffer is double when in FRAME mode and interlaced. // Also we need a special check because no-interlace patches like to render in the original height, but in non-interlaced mode // which means it would normally go off the bottom of the screen. Advantages of emulation, i guess... Limited to Ignore Offsets + Deinterlacing = Off. - if ((isinterlaced() && !m_regs->SMODE2.FFMD) || (GSConfig.InterlaceMode == GSInterlaceMode::Off && !GSConfig.PCRTCOffsets)) + if ((isinterlaced() && !m_regs->SMODE2.FFMD) || (GSConfig.InterlaceMode == GSInterlaceMode::Off && !GSConfig.PCRTCOffsets && !isinterlaced())) resolution.y *= 2; if (ignore_offset) @@ -507,11 +509,11 @@ GSVector2i GSState::GetResolution() return resolution; } -GSVector4i GSState::GetFrameRect(int i) +GSVector4i GSState::GetFrameRect(int i, bool ignore_off) { // If no specific context is requested then pass the merged rectangle as return value if (i == -1) - return GetFrameRect(0).runion(GetFrameRect(1)); + return GetFrameRect(0, ignore_off).runion(GetFrameRect(1, ignore_off)); GSVector4i rectangle = { 0, 0, 0, 0 }; @@ -519,19 +521,25 @@ GSVector4i GSState::GetFrameRect(int i) return rectangle; const auto& DISP = m_regs->DISP[i].DISPLAY; - + const u32 DW = DISP.DW + 1; const u32 DH = DISP.DH + 1; const GSVector2i magnification(DISP.MAGH+1, DISP.MAGV + 1); const u32 DBX = m_regs->DISP[i].DISPFB.DBX; - const u32 DBY = m_regs->DISP[i].DISPFB.DBY; + int DBY = m_regs->DISP[i].DISPFB.DBY; - int w = DW / magnification.x; - int h = DH / magnification.y; - rectangle.left = DBX; - rectangle.top = DBY; + const int w = DW / magnification.x; + const int h = DH / magnification.y; + + // If the combined height overflows 2048, it's likely adding a bit of extra data before the picture for offsetting the interlace + // only game known to do this is NASCAR '08 + if (!ignore_off && (DBY + h) >= 2048) + DBY = DBY - 2048; + + rectangle.left = (ignore_off) ? 0 : DBX; + rectangle.top = (ignore_off) ? 0 : DBY; rectangle.right = rectangle.left + w; rectangle.bottom = rectangle.top + h; @@ -550,9 +558,8 @@ int GSState::GetFramebufferHeight() // Framebuffer height is 11 bits max constexpr int height_limit = (1 << 11); - const GSVector4i disp1_rect = GetFrameRect(0); - const GSVector4i disp2_rect = GetFrameRect(1); - + const GSVector4i disp1_rect = GetFrameRect(0, true); + const GSVector4i disp2_rect = GetFrameRect(1, true); const GSVector4i combined = disp1_rect.runion(disp2_rect); // DBY isn't an offset to the frame memory but rather an offset to read output circuit inside @@ -568,6 +575,16 @@ int GSState::GetFramebufferHeight() return frame_memory_height; } +int GSState::GetFramebufferWidth() +{ + const GSVector4i disp1_rect = GetFrameRect(0, true); + const GSVector4i disp2_rect = GetFrameRect(1, true); + + const int max_width = std::max(disp1_rect.width(), disp2_rect.width()); + + return max_width; +} + bool GSState::IsEnabled(int i) { ASSERT(i >= 0 && i < 2); @@ -614,7 +631,61 @@ void GSState::DumpVertices(const std::string& filename) if (!file.is_open()) return; - size_t count = m_index.tail; + file << "FLUSH REASON: "; + + switch (m_state_flush_reason) + { + case GSFlushReason::RESET: + file << "RESET"; + break; + case GSFlushReason::CONTEXTCHANGE: + file << "CONTEXT CHANGE"; + break; + case GSFlushReason::CLUTCHANGE: + file << "CLUT CHANGE (RELOAD REQ)"; + break; + case GSFlushReason::TEXFLUSH: + file << "TEXFLUSH CALL"; + break; + case GSFlushReason::GSTRANSFER: + file << "GS TRANSFER"; + break; + case GSFlushReason::UPLOADDIRTYTEX: + file << "GS UPLOAD OVERWRITES CURRENT TEXTURE OR CLUT"; + break; + case GSFlushReason::LOCALTOLOCALMOVE: + file << "GS LOCAL TO LOCAL OVERWRITES CURRENT TEXTURE OR CLUT"; + break; + case GSFlushReason::DOWNLOADFIFO: + file << "DOWNLOAD FIFO"; + break; + case GSFlushReason::SAVESTATE: + file << "SAVESTATE"; + break; + case GSFlushReason::LOADSTATE: + file << "LOAD SAVESTATE"; + break; + case GSFlushReason::AUTOFLUSH: + file << "AUTOFLUSH OVERLAP DETECTED"; + break; + case GSFlushReason::VSYNC: + file << "VSYNC"; + break; + case GSFlushReason::GSREOPEN: + file << "GS REOPEN"; + break; + case GSFlushReason::UNKNOWN: + default: + file << "UNKNOWN"; + break; + } + + if (m_state_flush_reason != GSFlushReason::CONTEXTCHANGE && m_dirty_gs_regs) + file << " AND POSSIBLE CONTEXT CHANGE"; + + file << std::endl << std::endl; + + const size_t count = m_index.tail; GSVertex* buffer = &m_vertex.buff[0]; const char* DEL = ", "; @@ -626,8 +697,8 @@ void GSState::DumpVertices(const std::string& filename) file << "\t" << "v" << i << ": "; GSVertex v = buffer[m_index.buff[i]]; - float x = (v.XYZ.X - (int)m_context->XYOFFSET.OFX) / 16.0f; - float y = (v.XYZ.Y - (int)m_context->XYOFFSET.OFY) / 16.0f; + const float x = (v.XYZ.X - (int)m_context->XYOFFSET.OFX) / 16.0f; + const float y = (v.XYZ.Y - (int)m_context->XYOFFSET.OFY) / 16.0f; file << x << DEL; file << y << DEL; @@ -653,14 +724,14 @@ void GSState::DumpVertices(const std::string& filename) file << std::endl; - bool use_uv = PRIM->FST; - std::string qualifier = use_uv ? "UV" : "STQ"; + const bool use_uv = PRIM->FST; + const std::string qualifier = use_uv ? "UV" : "STQ"; file << "TEXTURE COORDS (" << qualifier << ")" << std::endl;; for (size_t i = 0; i < count; ++i) { file << "\t" << "v" << i << ": "; - GSVertex v = buffer[m_index.buff[i]]; + const GSVertex v = buffer[m_index.buff[i]]; // note // Yes, technically as far as the GS is concerned Q belongs @@ -669,8 +740,8 @@ void GSState::DumpVertices(const std::string& filename) // is associated with STQ. if (use_uv) { - float uv_U = v.U / 16.0f; - float uv_V = v.V / 16.0f; + const float uv_U = v.U / 16.0f; + const float uv_V = v.V / 16.0f; file << uv_U << DEL << uv_V; } @@ -706,16 +777,8 @@ __inline void GSState::CheckFlushes() if (m_dirty_gs_regs && m_index.tail > 0) { if (TestDrawChanged()) - { - Flush(); - } + Flush(GSFlushReason::CONTEXTCHANGE); } - if ((m_context->FRAME.FBMSK & GSLocalMemory::m_psm[m_context->FRAME.PSM].fmsk) != GSLocalMemory::m_psm[m_context->FRAME.PSM].fmsk) - m_mem.m_clut.Invalidate(m_context->FRAME.Block()); - - // Hey, why not check? I mean devs have done crazier things.. - if(!m_context->ZBUF.ZMSK) - m_mem.m_clut.Invalidate(m_context->ZBUF.Block()); } void GSState::GIFPackedRegHandlerNull(const GIFPackedReg* RESTRICT r) @@ -785,7 +848,7 @@ void GSState::GIFPackedRegHandlerXYZF2(const GIFPackedReg* RESTRICT r) m_v.m[1] = xy.upl32(zf); - VertexKick(adc ? 1 : r->XYZ2.Skip()); + VertexKick(adc ? 1 : r->XYZF2.Skip()); } template @@ -827,9 +890,9 @@ void GSState::GIFPackedRegHandlerSTQRGBAXYZF2(const GIFPackedReg* RESTRICT r, u3 while (r < r_end) { - GSVector4i st = GSVector4i::loadl(&r[0].U64[0]); + const GSVector4i st = GSVector4i::loadl(&r[0].U64[0]); GSVector4i q = GSVector4i::loadl(&r[0].U64[1]); - GSVector4i rgba = (GSVector4i::load(&r[1]) & GSVector4i::x000000ff()).ps32().pu16(); + const GSVector4i rgba = (GSVector4i::load(&r[1]) & GSVector4i::x000000ff()).ps32().pu16(); q = q.blend8(GSVector4i::cast(GSVector4::m_one), q == GSVector4i::zero()); // see GIFPackedRegHandlerSTQ @@ -861,17 +924,17 @@ void GSState::GIFPackedRegHandlerSTQRGBAXYZ2(const GIFPackedReg* RESTRICT r, u32 while (r < r_end) { - GSVector4i st = GSVector4i::loadl(&r[0].U64[0]); + const GSVector4i st = GSVector4i::loadl(&r[0].U64[0]); GSVector4i q = GSVector4i::loadl(&r[0].U64[1]); - GSVector4i rgba = (GSVector4i::load(&r[1]) & GSVector4i::x000000ff()).ps32().pu16(); + const GSVector4i rgba = (GSVector4i::load(&r[1]) & GSVector4i::x000000ff()).ps32().pu16(); q = q.blend8(GSVector4i::cast(GSVector4::m_one), q == GSVector4i::zero()); // see GIFPackedRegHandlerSTQ m_v.m[0] = st.upl64(rgba.upl32(q)); // TODO: only store the last one - GSVector4i xy = GSVector4i::loadl(&r[2].U64[0]); - GSVector4i z = GSVector4i::loadl(&r[2].U64[1]); - GSVector4i xyz = xy.upl16(xy.srl<4>()).upl32(z); + const GSVector4i xy = GSVector4i::loadl(&r[2].U64[0]); + const GSVector4i z = GSVector4i::loadl(&r[2].U64[1]); + const GSVector4i xyz = xy.upl16(xy.srl<4>()).upl32(z); m_v.m[1] = xyz.upl64(GSVector4i::loadl(&m_v.UV)); // TODO: only store the last one @@ -926,7 +989,7 @@ void GSState::GIFRegHandlerPRIM(const GIFReg* RESTRICT r) void GSState::GIFRegHandlerRGBAQ(const GIFReg* RESTRICT r) { - GSVector4i rgbaq = (GSVector4i)r->RGBAQ; + const GSVector4i rgbaq = (GSVector4i)r->RGBAQ; GSVector4i q = rgbaq.blend8(GSVector4i::cast(GSVector4::m_one), rgbaq == GSVector4i::zero()).yyyy(); // see GIFPackedRegHandlerSTQ @@ -965,9 +1028,9 @@ void GSState::GIFRegHandlerXYZF2(const GIFReg* RESTRICT r) { CheckFlushes(); - GSVector4i xyzf = GSVector4i::loadl(&r->XYZF); - GSVector4i xyz = xyzf & (GSVector4i::xffffffff().upl32(GSVector4i::x00ffffff())); - GSVector4i uvf = GSVector4i::load((int)m_v.UV).upl32(xyzf.srl32(24).srl<4>()); + const GSVector4i xyzf = GSVector4i::loadl(&r->XYZF); + const GSVector4i xyz = xyzf & (GSVector4i::xffffffff().upl32(GSVector4i::x00ffffff())); + const GSVector4i uvf = GSVector4i::load((int)m_v.UV).upl32(xyzf.srl32(24).srl<4>()); m_v.m[1] = xyz.upl64(uvf); @@ -1002,13 +1065,19 @@ void GSState::ApplyTEX0(GIFRegTEX0& TEX0) GL_REG("Apply TEX0_%d = 0x%x_%x", i, TEX0.U32[1], TEX0.U32[0]); - // even if TEX0 did not change, a new palette may have been uploaded and will overwrite the currently queued for drawing + // Even if TEX0 did not change, a new palette may have been uploaded and will overwrite the currently queued for drawing. const bool wt = m_mem.m_clut.WriteTest(TEX0, m_env.TEXCLUT); - // clut loading already covered with WriteTest, for drawing only have to check CPSM and CSA (MGS3 intro skybox would be drawn piece by piece without this) - if (wt) - Flush(); + { + m_mem.m_clut.SetNextCLUTTEX0(TEX0.U64); + if (TEX0.CBP != m_mem.m_clut.GetCLUTCBP()) + { + m_mem.m_clut.ClearDrawInvalidity(); + CLUTAutoFlush(); + } + Flush(GSFlushReason::CLUTCHANGE); + } TEX0.CPSM &= 0xa; // 1010b @@ -1026,7 +1095,7 @@ void GSState::ApplyTEX0(GIFRegTEX0& TEX0) { BITBLTBUF.SBP = TEX0.CBP; BITBLTBUF.SBW = 1; - BITBLTBUF.SPSM = TEX0.CSM; + BITBLTBUF.SPSM = TEX0.CPSM; r.left = 0; r.top = 0; @@ -1035,12 +1104,13 @@ void GSState::ApplyTEX0(GIFRegTEX0& TEX0) int blocks = 4; - if (GSLocalMemory::m_psm[TEX0.CPSM].bpp == 16) + if (GSLocalMemory::m_psm[TEX0.CPSM].trbpp == 16) blocks >>= 1; - if (GSLocalMemory::m_psm[TEX0.PSM].bpp == 4) + if (GSLocalMemory::m_psm[TEX0.PSM].trbpp == 4) blocks >>= 1; + // Invalidating videomem is slow, so *only* do it when it's definitely a CLUT draw in HW mode. for (int j = 0; j < blocks; j++, BITBLTBUF.SBP++) InvalidateLocalMem(BITBLTBUF, r, true); } @@ -1048,7 +1118,7 @@ void GSState::ApplyTEX0(GIFRegTEX0& TEX0) { BITBLTBUF.SBP = TEX0.CBP; BITBLTBUF.SBW = m_env.TEXCLUT.CBW; - BITBLTBUF.SPSM = TEX0.CSM; + BITBLTBUF.SPSM = TEX0.CPSM; r.left = m_env.TEXCLUT.COU; r.top = m_env.TEXCLUT.COV; @@ -1077,12 +1147,12 @@ void GSState::GIFRegHandlerTEX0(const GIFReg* RESTRICT r) GL_REG("TEX0_%d = 0x%x_%x", i, r->U32[1], r->U32[0]); GIFRegTEX0 TEX0 = r->TEX0; - GIFRegMIPTBP1 temp_MIPTBP1; - bool MTBAReloaded = false; // Max allowed MTBA size for 32bit swizzled textures (including 8H 4HL etc) is 512, 16bit and normal 8/4bit formats can be 1024 const u32 maxTex = (GSLocalMemory::m_psm[TEX0.PSM].bpp < 32) ? 10 : 9; - // Spec max is 10 + // Spec max is 10, but bitfield allows for up to 15 + // However STQ calculations expect the written size to be used for denormalization (Simple 2000 Series Vol 105 The Maid) + // This is clamped to 10 in the FixedTEX0 functions so texture sizes don't exceed 1024x1024, but STQ can calculate properly (with invalid_tex0) // // Yakuza (minimap) // Sets TW/TH to 0 @@ -1093,14 +1163,15 @@ void GSState::GIFRegHandlerTEX0(const GIFReg* RESTRICT r) // Sets TW/TH to 0 // there used to be a case to force this to 10 // but GetSizeFixedTEX0 sorts this now - TEX0.TW = std::clamp(TEX0.TW, 0, 10); - TEX0.TH = std::clamp(TEX0.TH, 0, 10); + TEX0.TW = std::clamp(TEX0.TW, 0, 15); + TEX0.TH = std::clamp(TEX0.TH, 0, 15); // MTBA loads are triggered by writes to TEX0 (but not TEX2!) // Textures MUST be a minimum width of 32 pixels // Format must be a color, Z formats do not trigger MTBA (but are valid for Mipmapping) if (m_env.CTXT[i].TEX1.MTBA && TEX0.TW >= 5 && TEX0.TW <= maxTex && (TEX0.PSM & 0x30) != 0x30) { + GIFRegMIPTBP1& mip_tbp1 = m_env.CTXT[i].MIPTBP1; // NOTE 1: TEX1.MXL must not be automatically set to 3 here and it has no effect on MTBA. // NOTE 2: Mipmap levels are packed with a minimum distance between them of 1 block, even down at 4bit textures under 16x16. // NOTE 3: Everything is derrived from the width of the texture, TBW and TH are completely ignored (useful for handling non-rectangular ones) @@ -1117,39 +1188,32 @@ void GSState::GIFRegHandlerTEX0(const GIFReg* RESTRICT r) bw = std::max(bw >> 1, 1); tex_size = std::max(tex_size >> 2, 1); - temp_MIPTBP1.TBP1 = bp; - temp_MIPTBP1.TBW1 = bw; + mip_tbp1.TBP1 = bp; + mip_tbp1.TBW1 = bw; bp += tex_size; bw = std::max(bw >> 1, 1); tex_size = std::max(tex_size >> 2, 1); - temp_MIPTBP1.TBP2 = bp; - temp_MIPTBP1.TBW2 = bw; + mip_tbp1.TBP2 = bp; + mip_tbp1.TBW2 = bw; bp += tex_size; bw = std::max(bw >> 1, 1); - temp_MIPTBP1.TBP3 = bp; - temp_MIPTBP1.TBW3 = bw; - - MTBAReloaded = true; - } - - ApplyTEX0(TEX0); - - if (MTBAReloaded) - { - m_env.CTXT[i].MIPTBP1 = temp_MIPTBP1; + mip_tbp1.TBP3 = bp; + mip_tbp1.TBW3 = bw; if (i == m_prev_env.PRIM.CTXT) { - if (m_prev_env.CTXT[i].MIPTBP1.U64 ^ m_env.CTXT[i].MIPTBP1.U64) + if (m_prev_env.CTXT[i].MIPTBP1.U64 ^ mip_tbp1.U64) m_dirty_gs_regs |= (1 << DIRTY_REG_MIPTBP1); else m_dirty_gs_regs &= ~(1 << DIRTY_REG_MIPTBP1); } } + + ApplyTEX0(TEX0); } template @@ -1206,7 +1270,7 @@ void GSState::GIFRegHandlerTEX2(const GIFReg* RESTRICT r) constexpr u64 mask = 0xFFFFFFE003F00000ull; // TEX2 bits - GIFRegTEX0 TEX0; + GIFRegTEX0 TEX0{}; TEX0.U64 = (m_env.CTXT[i].TEX0.U64 & ~mask) | (r->U64 & mask); @@ -1345,8 +1409,8 @@ void GSState::GIFRegHandlerTEXFLUSH(const GIFReg* RESTRICT r) // Some games do a single sprite draw to itself, then flush the texture cache, then use that texture again. // This won't get picked up by the new autoflush logic (which checks for page crossings for the PS2 Texture Cache flush) // so we need to do it here. - if (IsAutoFlushEnabled()) - Flush(); + if (IsAutoFlushEnabled() && IsAutoFlushDraw()) + Flush(GSFlushReason::TEXFLUSH); } template @@ -1473,9 +1537,8 @@ void GSState::GIFRegHandlerFRAME(const GIFReg* RESTRICT r) GL_REG("FRAME_%d = 0x%x_%x", i, r->U32[1], r->U32[0]); GIFRegFRAME NewFrame = r->FRAME; - // FBW is clamped between 1 and 32, however this is wrong, FBW of 0 *should* work and does on Dobiestation - // However there is some issues so even software mode is incorrect on PCSX2, but this works better.. - NewFrame.FBW = std::clamp(NewFrame.FBW, 1U, 32U); + // FBW is clamped to 32 + NewFrame.FBW = std::min(NewFrame.FBW, 32U); if ((NewFrame.PSM & 0x30) == 0x30) m_env.CTXT[i].ZBUF.PSM &= ~0x30; @@ -1602,7 +1665,7 @@ void GSState::GIFRegHandlerTRXDIR(const GIFReg* RESTRICT r) { GL_REG("TRXDIR = 0x%x_%x", r->U32[1], r->U32[0]); - Flush(); + Flush(GSFlushReason::GSTRANSFER); m_env.TRXDIR = (GSVector4i)r->TRXDIR; @@ -1641,12 +1704,14 @@ inline void GSState::CopyEnv(GSDrawingEnvironment* dest, GSDrawingEnvironment* s dest->CTXT[ctx].m_fixed_tex0 = src->CTXT[ctx].m_fixed_tex0; } -void GSState::Flush() +void GSState::Flush(GSFlushReason reason) { FlushWrite(); if (m_index.tail > 0) { + m_state_flush_reason = reason; + if (m_dirty_gs_regs) { const int ctx = m_prev_env.PRIM.CTXT; @@ -1682,6 +1747,8 @@ void GSState::Flush() m_dirty_gs_regs = 0; } + + m_state_flush_reason = GSFlushReason::UNKNOWN; } void GSState::FlushWrite() @@ -1697,12 +1764,12 @@ void GSState::FlushWrite() r.top = m_env.TRXPOS.DSAY; r.right = r.left + m_env.TRXREG.RRW; r.bottom = r.top + m_env.TRXREG.RRH; - - InvalidateVideoMem(m_env.BITBLTBUF, r); + ExpandTarget(m_env.BITBLTBUF, r); + InvalidateVideoMem(m_env.BITBLTBUF, r, true); const GSLocalMemory::writeImage wi = GSLocalMemory::m_psm[m_env.BITBLTBUF.DPSM].wi; - (m_mem.*wi)(m_tr.x, m_tr.y, &m_tr.buff[m_tr.start], len, m_env.BITBLTBUF, m_env.TRXPOS, m_env.TRXREG); + wi(m_mem, m_tr.x, m_tr.y, &m_tr.buff[m_tr.start], len, m_env.BITBLTBUF, m_env.TRXPOS, m_env.TRXREG); m_tr.start += len; @@ -1722,9 +1789,6 @@ inline bool GSState::TestDrawChanged() else return true; - if (GSConfig.UseHardwareRenderer() && GSUtil::GetPrimClass(m_env.PRIM.PRIM) == GS_TRIANGLE_CLASS) - prim_mask &= ~0x80; // Mask out AA1. - if ((m_env.PRIM.U32[0] ^ m_prev_env.PRIM.U32[0]) & prim_mask) return true; @@ -1792,9 +1856,9 @@ void GSState::FlushPrim() GSVertex buff[2]; s_n++; - size_t head = m_vertex.head; - size_t tail = m_vertex.tail; - size_t next = m_vertex.next; + const size_t head = m_vertex.head; + const size_t tail = m_vertex.tail; + const size_t next = m_vertex.next; size_t unused = 0; if (tail > head) @@ -1875,6 +1939,20 @@ void GSState::FlushPrim() m_vertex.tail = unused; m_vertex.next = next > head ? next - head : 0; + + // If it's a Triangle fan the XY buffer needs to be updated to point to the correct head vert + // Jak 3 shadows get spikey (with autoflush) if you don't. + if (PRIM->PRIM == GS_TRIANGLEFAN) + { + for (size_t i = 0; i < unused; i++) + { + GSVector4i* RESTRICT vert_ptr = (GSVector4i*)&m_vertex.buff[i]; + GSVector4i v = vert_ptr[1]; + v = v.xxxx().u16to32().sub32(m_ofxy); + GSVector4i::storel(&m_vertex.xy[i & 3], v.blend16<0xf0>(v.sra32(4)).ps32()); + m_vertex.xy_tail = unused; + } + } } else { @@ -1886,7 +1964,7 @@ void GSState::FlushPrim() void GSState::Write(const u8* mem, int len) { - int w = m_env.TRXREG.RRW; + const int w = m_env.TRXREG.RRW; int h = m_env.TRXREG.RRH; GIFRegBITBLTBUF& blit = m_tr.m_blit; @@ -1918,17 +1996,27 @@ void GSState::Write(const u8* mem, int len) if (!m_tr.Update(w, h, psm.trbpp, len)) return; + + + GIFRegTEX0& prev_tex0 = m_prev_env.CTXT[m_prev_env.PRIM.CTXT].TEX0; + + const u32 write_start_bp = m_mem.m_psm[blit.DPSM].info.bn(m_env.TRXPOS.DSAX, m_env.TRXPOS.DSAY, blit.DBP, blit.DBW); // (m_mem.*psm.pa)(static_cast(m_env.TRXPOS.DSAX), static_cast(m_env.TRXPOS.DSAY), blit.DBP, blit.DBW) >> 6; + const u32 write_end_bp = m_mem.m_psm[blit.DPSM].info.bn(m_env.TRXPOS.DSAX + w - 1, m_env.TRXPOS.DSAY + h - 1, blit.DBP, blit.DBW); // (m_mem.*psm.pa)(w + static_cast(m_env.TRXPOS.DSAX) - 1, h + static_cast(m_env.TRXPOS.DSAY) - 1, blit.DBP, blit.DBW) >> 6; + const u32 tex_end_bp = m_mem.m_psm[prev_tex0.PSM].info.bn((1 << prev_tex0.TW) - 1, (1 << prev_tex0.TH) - 1, prev_tex0.TBP0, prev_tex0.TBW); // (m_mem.*psm.pa)((1 << prev_tex0.TW) - 1, (1 << prev_tex0.TH) - 1, prev_tex0.TBP0, prev_tex0.TBW) >> 6; + // Only flush on a NEW transfer if a pending one is using the same address or overlap. + // Check Fast & Furious (Hardare mode) and Assault Suits Valken (either renderer) and Tomb Raider - Angel of Darkness menu (TBP != DBP but overlaps). + if (m_tr.end == 0 && m_index.tail > 0 && m_prev_env.PRIM.TME && write_end_bp > prev_tex0.TBP0 && write_start_bp <= tex_end_bp) + { + Flush(GSFlushReason::UPLOADDIRTYTEX); + } + // Invalid the CLUT if it crosses paths. + m_mem.m_clut.InvalidateRange(write_start_bp, write_end_bp); + GL_CACHE("Write! ... => 0x%x W:%d F:%s (DIR %d%d), dPos(%d %d) size(%d %d)", blit.DBP, blit.DBW, psm_str(blit.DPSM), m_env.TRXPOS.DIRX, m_env.TRXPOS.DIRY, m_env.TRXPOS.DSAX, m_env.TRXPOS.DSAY, w, h); - // TODO: Not really sufficient if a partial texture update is done outside the block. - // No need to check CLUT here, we can invalidate it below, no need to flush it since TEX0 needs to update, then we can flush. - if ((PRIM->TME && (blit.DBP == m_context->TEX0.TBP0)) || - (m_prev_env.PRIM.TME && (blit.DBP == m_prev_env.CTXT[m_prev_env.PRIM.CTXT].TEX0.TBP0))) - Flush(); - if (m_tr.end == 0 && len >= m_tr.total) { // received all data in one piece, no need to buffer it @@ -1938,10 +2026,10 @@ void GSState::Write(const u8* mem, int len) r.top = m_env.TRXPOS.DSAY; r.right = r.left + m_env.TRXREG.RRW; r.bottom = r.top + m_env.TRXREG.RRH; + ExpandTarget(m_env.BITBLTBUF, r); + InvalidateVideoMem(blit, r, true); - InvalidateVideoMem(blit, r); - - (m_mem.*psm.wi)(m_tr.x, m_tr.y, mem, m_tr.total, blit, m_env.TRXPOS, m_env.TRXREG); + psm.wi(m_mem, m_tr.x, m_tr.y, mem, m_tr.total, blit, m_env.TRXPOS, m_env.TRXREG); m_tr.start = m_tr.end = m_tr.total; @@ -1956,13 +2044,6 @@ void GSState::Write(const u8* mem, int len) if (m_tr.end >= m_tr.total) FlushWrite(); } - - int page_width = std::max(1, (w / psm.pgs.x)); - int page_height = std::max(1, (h / psm.pgs.y)); - int pitch = (std::max(1U, blit.DBW) * 64) / psm.pgs.x; - - // Try to avoid flushing draws if it doesn't cross paths - m_mem.m_clut.InvalidateRange(blit.DBP, blit.DBP + ((page_width << 5) + ((page_height * pitch) << 5))); } void GSState::InitReadFIFO(u8* mem, int len) @@ -2035,7 +2116,7 @@ void GSState::Move() sx, sy, dx, dy, w, h); InvalidateLocalMem(m_env.BITBLTBUF, GSVector4i(sx, sy, sx + w, sy + h)); - InvalidateVideoMem(m_env.BITBLTBUF, GSVector4i(dx, dy, dx + w, dy + h)); + InvalidateVideoMem(m_env.BITBLTBUF, GSVector4i(dx, dy, dx + w, dy + h), true); int xinc = 1; int yinc = 1; @@ -2058,12 +2139,27 @@ void GSState::Move() // TODO: unroll inner loops (width has special size requirement, must be multiples of 1 << n, depending on the format) - int sbp = m_env.BITBLTBUF.SBP; - int sbw = m_env.BITBLTBUF.SBW; - int dbp = m_env.BITBLTBUF.DBP; - int dbw = m_env.BITBLTBUF.DBW; - GSOffset spo = m_mem.GetOffset(sbp, sbw, m_env.BITBLTBUF.SPSM); - GSOffset dpo = m_mem.GetOffset(dbp, dbw, m_env.BITBLTBUF.DPSM); + const int sbp = m_env.BITBLTBUF.SBP; + const int sbw = m_env.BITBLTBUF.SBW; + const int dbp = m_env.BITBLTBUF.DBP; + const int dbw = m_env.BITBLTBUF.DBW; + const GSOffset spo = m_mem.GetOffset(sbp, sbw, m_env.BITBLTBUF.SPSM); + const GSOffset dpo = m_mem.GetOffset(dbp, dbw, m_env.BITBLTBUF.DPSM); + + GIFRegTEX0& prev_tex0 = m_prev_env.CTXT[m_prev_env.PRIM.CTXT].TEX0; + + const u32 write_start_bp = m_mem.m_psm[m_env.BITBLTBUF.DPSM].info.bn(m_env.TRXPOS.DSAX, m_env.TRXPOS.DSAY, dbp, dbw); // (m_mem.*dpsm.pa)(static_cast(m_env.TRXPOS.DSAX), static_cast(m_env.TRXPOS.DSAY), dbp, dbw) >> 6; + const u32 write_end_bp = m_mem.m_psm[m_env.BITBLTBUF.DPSM].info.bn(m_env.TRXPOS.DSAX + w - 1, m_env.TRXPOS.DSAY + h - 1, dbp, dbw); // (m_mem.*dpsm.pa)(w + static_cast(m_env.TRXPOS.DSAX) - 1, h + static_cast(m_env.TRXPOS.DSAY) - 1, dbp, dbw) >> 6; + const u32 tex_end_bp = m_mem.m_psm[prev_tex0.PSM].info.bn((1 << prev_tex0.TW) - 1, (1 << prev_tex0.TH) - 1, prev_tex0.TBP0, prev_tex0.TBW); // (m_mem.*dpsm.pa)((1 << prev_tex0.TW) - 1, (1 << prev_tex0.TH) - 1, prev_tex0.TBP0, prev_tex0.TBW) >> 6; + // Only flush on a NEW transfer if a pending one is using the same address or overlap. + // Unknown if games use this one, but best to be safe. + + if (m_index.tail > 0 && m_prev_env.PRIM.TME && write_end_bp >= prev_tex0.TBP0 && write_start_bp <= tex_end_bp) + { + Flush(GSFlushReason::LOCALTOLOCALMOVE); + } + // Invalid the CLUT if it crosses paths. + m_mem.m_clut.InvalidateRange(write_start_bp, write_end_bp); auto genericCopy = [=](const GSOffset& dpo, const GSOffset& spo, auto&& getPAHelper, auto&& pxCopyFn) { @@ -2076,7 +2172,10 @@ void GSState::Move() const int ypage = _sy & ~(page_height - 1); // Copying from itself to itself (rotating textures) used in Gitaroo Man stage 8 // What probably happens is because the copy is buffered, the source stays just ahead of the destination. - if (sbp == dbp && (((_sy < _dy) && ((ypage + page_height) > _dy)) || ((sx < dx) && ((xpage + page_width) > dx)))) + // No need to do all this if the copy source/destination don't intersect, however. + const bool intersect = !(GSVector4i(sx, sy, sx + w, sy + h).rintersect(GSVector4i(dx, dy, dx + w, dy + h)).rempty()); + + if (intersect && sbp == dbp && (((_sy < _dy) && ((ypage + page_height) > _dy)) || ((sx < dx) && ((xpage + page_width) > dx)))) { int starty = (yinc > 0) ? 0 : h-1; int endy = (yinc > 0) ? h : -1; @@ -2084,30 +2183,30 @@ void GSState::Move() if (((_sy < _dy) && ((ypage + page_height) > _dy)) && yinc > 0) { - _sy += h; - _dy += h; + _sy += h-1; + _dy += h-1; starty = h-1; endy = -1; y_inc = -y_inc; } - + for (int y = starty; y != endy; y+= y_inc, _sy += y_inc, _dy += y_inc) { - auto s = getPAHelper(spo, sx, _sy); - auto d = getPAHelper(dpo, dx, _dy); + auto s = getPAHelper(spo, 0, _sy); + auto d = getPAHelper(dpo, 0, _dy); if (((sx < dx) && ((xpage + page_width) > dx))) { for (int x = w - 1; x >= 0; x--) { - pxCopyFn(d, s, x); + pxCopyFn(d, s, (dx + x) & 2047, (sx + x) & 2047); } } else { for (int x = 0; x < w; x++) { - pxCopyFn(d, s, x); + pxCopyFn(d, s, (dx + x) & 2047, (sx + x) & 2047); } } } @@ -2116,12 +2215,12 @@ void GSState::Move() { for (int y = 0; y < h; y++, _sy += yinc, _dy += yinc) { - auto s = getPAHelper(spo, sx, _sy); - auto d = getPAHelper(dpo, dx, _dy); + auto s = getPAHelper(spo, 0, _sy); + auto d = getPAHelper(dpo, 0, _dy); for (int x = 0; x < w; x++) { - pxCopyFn(d, s, x); + pxCopyFn(d, s, (dx + x) & 2047, (sx + x) & 2047); } } } @@ -2130,12 +2229,12 @@ void GSState::Move() { for (int y = 0; y < h; y++, _sy += yinc, _dy += yinc) { - auto s = getPAHelper(spo, sx, _sy); - auto d = getPAHelper(dpo, dx, _dy); + auto s = getPAHelper(spo, 0, _sy); + auto d = getPAHelper(dpo, 0, _dy); for (int x = 0; x < w; x++) { - pxCopyFn(d, s, -x); + pxCopyFn(d, s, (dx - x) & 2047, (sx - x) & 2047); } } } @@ -2145,9 +2244,9 @@ void GSState::Move() { genericCopy(dpo, spo, [](const GSOffset& o, int x, int y) { return o.paMulti(x, y); }, - [=](const GSOffset::PAHelper& d, const GSOffset::PAHelper& s, int x) + [=](const GSOffset::PAHelper& d, const GSOffset::PAHelper& s, int dx, int sx) { - return pxCopyFn(d.value(x), s.value(x)); + return pxCopyFn(d.value(dx), s.value(sx)); }); }; @@ -2155,9 +2254,9 @@ void GSState::Move() { genericCopy(dpo, spo, [=](const GSOffset& o, int x, int y) { return o.paMulti(vm, x, y); }, - [=](const auto& d, const auto& s, int x) + [=](const auto& d, const auto& s, int dx, int sx) { - return pxCopyFn(d.value(x), s.value(x)); + return pxCopyFn(d.value(dx), s.value(sx)); }); }; @@ -2206,13 +2305,6 @@ void GSState::Move() (m_mem.*dpsm.wpa)(doff, (m_mem.*spsm.rpa)(soff)); }); } - - int page_width = std::max(1, (w / dpsm.pgs.x)); - int page_height = std::max(1, (h / dpsm.pgs.y)); - int pitch = (std::max(1, dbw) * 64) / dpsm.pgs.x; - - // Try to avoid flushing draws if it doesn't cross paths - m_mem.m_clut.InvalidateRange(dbp, dbp + ((page_width << 5) + ((page_height * pitch) << 5))); } void GSState::SoftReset(u32 mask) @@ -2236,14 +2328,14 @@ void GSState::SoftReset(u32 mask) void GSState::ReadFIFO(u8* mem, int size) { - Flush(); + Flush(GSFlushReason::DOWNLOADFIFO); size *= 16; Read(mem, size); if (m_dump) - m_dump->ReadFIFO(size); + m_dump->ReadFIFO(size / 16); } void GSState::ReadLocalMemoryUnsync(u8* mem, int qwc, GIFRegBITBLTBUF BITBLTBUF, GIFRegTRXPOS TRXPOS, GIFRegTRXREG TRXREG) @@ -2403,7 +2495,7 @@ void GSState::Transfer(const u8* mem, u32 size) // and according to Pseudonym we shouldn't even land in this code. So hmm indeed. (rama) case GIF_FLG_IMAGE: { - int len = (int)std::min(size, path.nloop); + const int len = (int)std::min(size, path.nloop); switch (m_env.TRXDIR.XDIR) { @@ -2480,7 +2572,7 @@ int GSState::Freeze(freezeData* fd, bool sizeonly) if (!fd->data || fd->size < m_sssize) return -1; - Flush(); + Flush(GSFlushReason::SAVESTATE); u8* data = fd->data; @@ -2567,7 +2659,7 @@ int GSState::Defrost(const freezeData* fd) return -1; } - Flush(); + Flush(GSFlushReason::LOADSTATE); Reset(false); @@ -2722,7 +2814,8 @@ void GSState::GrowVertexBuffer() const size_t maxcount = std::max(m_vertex.maxcount * 3 / 2, 10000); GSVertex* vertex = (GSVertex*)_aligned_malloc(sizeof(GSVertex) * maxcount, 32); - u32* index = (u32*)_aligned_malloc(sizeof(u32) * maxcount * 3, 32); // worst case is slightly less than vertex number * 3 + // Worst case index list is a list of points with vs expansion, 6 indices per point + u32* index = (u32*)_aligned_malloc(sizeof(u32) * maxcount * 6, 32); if (vertex == NULL || index == NULL) { @@ -2858,46 +2951,115 @@ GSState::PRIM_OVERLAP GSState::PrimitiveOverlap() return overlap; } -__forceinline void GSState::HandleAutoFlush() +__forceinline bool GSState::IsAutoFlushDraw() { + if (!PRIM->TME) + return false; + const u32 frame_mask = GSLocalMemory::m_psm[m_context->TEX0.PSM].fmsk; - const bool frame_hit = (m_context->FRAME.Block() == m_context->TEX0.TBP0) && !(m_context->TEST.ATE && m_context->TEST.ATST == 0 && m_context->TEST.AFAIL == 2) && ((m_context->FRAME.FBMSK & frame_mask) != frame_mask); + const bool frame_hit = m_context->FRAME.Block() == m_context->TEX0.TBP0 && !(m_context->TEST.ATE && m_context->TEST.ATST == 0 && m_context->TEST.AFAIL == 2) && ((m_context->FRAME.FBMSK & frame_mask) != frame_mask); // There's a strange behaviour we need to test on a PS2 here, if the FRAME is a Z format, like Powerdrome something swaps over, and it seems Alpha Fail of "FB Only" writes to the Z.. it's odd. const bool zbuf_hit = (m_context->ZBUF.Block() == m_context->TEX0.TBP0) && !(m_context->TEST.ATE && m_context->TEST.ATST == 0 && m_context->TEST.AFAIL != 2) && !m_context->ZBUF.ZMSK; const u32 frame_z_psm = frame_hit ? m_context->FRAME.PSM : m_context->ZBUF.PSM; const u32 frame_z_bp = frame_hit ? m_context->FRAME.Block() : m_context->ZBUF.Block(); + if ((frame_hit || zbuf_hit) && GSUtil::HasSharedBits(frame_z_bp, frame_z_psm, m_context->TEX0.TBP0, m_context->TEX0.PSM)) + return true; + + return false; +} + +__forceinline void GSState::CLUTAutoFlush() +{ + if (m_mem.m_clut.IsInvalid() & 2) + return; + + size_t n = 1; + + switch (PRIM->PRIM) + { + case GS_POINTLIST: + n = 1; + break; + case GS_LINELIST: + case GS_LINESTRIP: + case GS_SPRITE: + n = 2; + break; + case GS_TRIANGLELIST: + case GS_TRIANGLESTRIP: + n = 3; + break; + case GS_TRIANGLEFAN: + n = 3; + break; + case GS_INVALID: + default: + break; + } + + if ((m_index.tail > 0 || (m_vertex.tail == n - 1)) && (GSLocalMemory::m_psm[m_context->TEX0.PSM].pal == 0 || !PRIM->TME)) + { + const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[m_context->FRAME.PSM]; + + if ((m_context->FRAME.FBMSK & psm.fmsk) != psm.fmsk && GSLocalMemory::m_psm[m_mem.m_clut.GetCLUTCPSM()].bpp == psm.bpp) + { + const u32 startbp = psm.info.bn(temp_draw_rect.x, temp_draw_rect.y, m_context->FRAME.Block(), m_context->FRAME.FBW); + + // If it's a point, then we only have one coord, so the address for start and end will be the same, which is bad for the following check. + u32 endbp = startbp; + // otherwise calculate the end. + if (PRIM->PRIM != GS_POINTLIST || (m_index.tail > 1)) + endbp = psm.info.bn(temp_draw_rect.z - 1, temp_draw_rect.w - 1, m_context->FRAME.Block(), m_context->FRAME.FBW); + + m_mem.m_clut.InvalidateRange(startbp, endbp, true); + } + } +} + +__forceinline void GSState::HandleAutoFlush() +{ + // Kind of a cheat, making the assumption that 2 consecutive fan/strip triangles won't overlap each other (*should* be safe) + if ((m_index.tail & 1) && (PRIM->PRIM == GS_TRIANGLESTRIP || PRIM->PRIM == GS_TRIANGLEFAN)) + return; + // To briefly explain what's going on here, what we are checking for is draws over a texture when the source and destination are themselves. // Because one page of the texture gets buffered in the Texture Cache (the PS2's one) if any of those pixels are overwritten, you still read the old data. // So we need to calculate if a page boundary is being crossed for the format it is in and if the same part of the texture being written and read inside the draw. - if (PRIM->TME && (frame_hit || zbuf_hit) && GSUtil::HasSharedBits(frame_z_bp, frame_z_psm, m_context->TEX0.TBP0, m_context->TEX0.PSM)) + if (IsAutoFlushDraw()) { - size_t n = 1; + int n = 1; + size_t buff[3]; + const size_t head = m_vertex.head; + const size_t tail = m_vertex.tail; - switch (GSUtil::GetPrimClass(PRIM->PRIM)) + switch (PRIM->PRIM) { - case GS_POINT_CLASS: - case GS_INVALID_CLASS: + case GS_POINTLIST: n = 1; break; - case GS_LINE_CLASS: - case GS_SPRITE_CLASS: + case GS_LINELIST: + case GS_LINESTRIP: + case GS_SPRITE: + buff[0] = tail - 1; n = 2; break; - case GS_TRIANGLE_CLASS: + case GS_TRIANGLELIST: + case GS_TRIANGLESTRIP: + buff[0] = tail - 2; + buff[1] = tail - 1; n = 3; break; + case GS_TRIANGLEFAN: + buff[0] = head; + buff[1] = tail - 1; + n = 3; + break; + case GS_INVALID: + default: + break; } - const int current_tex_end = (int)(m_vertex.tail - (m_vertex.tail % n)) - 1; - - // Make sure including the new vert we have the whole rect to be drawn - // Example being a sprite which is 2 verts - // Tail = 3 (aka we have one sprite and 1 vert already saved, plus the incoming one) - // current_tex_end will be 1 ((3 - (3 % 2 == 1) == 2) - 1), meaning 3-1 = 2, so we have enough data for the full rect. - if (((m_vertex.tail - current_tex_end) < n) && PRIM->PRIM != GS_POINTLIST) - return; - const int page_mask_x = ~(GSLocalMemory::m_psm[m_context->TEX0.PSM].pgs.x - 1); const int page_mask_y = ~(GSLocalMemory::m_psm[m_context->TEX0.PSM].pgs.y - 1); const GSVector4i page_mask = { page_mask_x, page_mask_y, page_mask_x, page_mask_y }; @@ -2911,16 +3073,19 @@ __forceinline void GSState::HandleAutoFlush() } else { - tex_coord.x = (int)((1 << m_context->TEX0.TW) * (m_v.ST.S / m_v.RGBAQ.Q)); - tex_coord.y = (int)((1 << m_context->TEX0.TH) * (m_v.ST.T / m_v.RGBAQ.Q)); + const float s = std::min((m_v.ST.S / m_v.RGBAQ.Q), 1.0f); + const float t = std::min((m_v.ST.T / m_v.RGBAQ.Q), 1.0f); + + tex_coord.x = (int)((1 << m_context->TEX0.TW) * s); + tex_coord.y = (int)((1 << m_context->TEX0.TH) * t); } GSVector4i tex_rect = tex_coord.xyxy(); // Get the rest of the rect. - for (int i = m_vertex.tail - 1; i > current_tex_end; i--) + for (int i = 0; i < (n - 1); i++) { - const GSVertex* v = &m_vertex.buff[i]; + const GSVertex* v = &m_vertex.buff[buff[i]]; if (PRIM->FST) { @@ -2929,8 +3094,11 @@ __forceinline void GSState::HandleAutoFlush() } else { - tex_coord.x = (int)((1 << m_context->TEX0.TW) * (v->ST.S / v->RGBAQ.Q)); - tex_coord.y = (int)((1 << m_context->TEX0.TH) * (v->ST.T / v->RGBAQ.Q)); + const float s = std::min((v->ST.S / v->RGBAQ.Q), 1.0f); + const float t = std::min((v->ST.T / v->RGBAQ.Q), 1.0f); + + tex_coord.x = (int)((1 << m_context->TEX0.TW) * s); + tex_coord.y = (int)((1 << m_context->TEX0.TH) * t); } tex_rect.x = std::min(tex_rect.x, tex_coord.x); @@ -2949,34 +3117,72 @@ __forceinline void GSState::HandleAutoFlush() } else { - tex_coord.x = (int)((1 << m_context->TEX0.TW) * (v->ST.S / v->RGBAQ.Q)); - tex_coord.y = (int)((1 << m_context->TEX0.TH) * (v->ST.T / v->RGBAQ.Q)); + const float s = std::min((v->ST.S / v->RGBAQ.Q), 1.0f); + const float t = std::min((v->ST.T / v->RGBAQ.Q), 1.0f); + + tex_coord.x = (int)((1 << m_context->TEX0.TW) * s); + tex_coord.y = (int)((1 << m_context->TEX0.TH) * t); } - const GSVector4i pages = tex_rect & page_mask; + const GSVector4i last_tex_page = tex_coord.xyxy() & page_mask; + const GSVector4i tex_page = tex_rect.xyxy() & page_mask; - tex_coord = tex_coord & page_mask; - - bool page_crossed = false; - - if (!pages.xyzw().eq(tex_coord.xyxy())) - page_crossed = true; - - if(page_crossed) + // Crossed page since last draw end + if(!tex_page.eq(last_tex_page)) { + const u32 frame_mask = GSLocalMemory::m_psm[m_context->TEX0.PSM].fmsk; + const bool frame_hit = (m_context->FRAME.Block() == m_context->TEX0.TBP0) && !(m_context->TEST.ATE && m_context->TEST.ATST == 0 && m_context->TEST.AFAIL == 2) && ((m_context->FRAME.FBMSK & frame_mask) != frame_mask); + const u32 frame_z_psm = frame_hit ? m_context->FRAME.PSM : m_context->ZBUF.PSM; // Make sure the format matches, otherwise the coordinates aren't gonna match, so the draws won't intersect. if (GSUtil::HasCompatibleBits(m_context->TEX0.PSM, frame_z_psm) && (m_context->FRAME.FBW == m_context->TEX0.TBW)) { - // Update the vertex trace, scissor it (important for Jak 3!) and intersect with the current texture. - m_vt.Update(m_vertex.buff, m_index.buff, m_vertex.tail - m_vertex.head, m_index.tail, GSUtil::GetPrimClass(PRIM->PRIM)); + // If the draw was 1 line thick, make it larger as rects are exclusive of ends. + if (tex_rect.x == tex_rect.z) + tex_rect += GSVector4i(0, 0, 1, 0); + if (tex_rect.y == tex_rect.w) + tex_rect += GSVector4i(0, 0, 0, 1); - // Intersect goes on space inside the rect - GSVector4i area_out = GSVector4i(m_vt.m_min.p.xyxy(m_vt.m_max.p)); - // Scissor output - area_out = area_out.rintersect(GSVector4i(m_context->scissor.in)); - // Intersect with texture - if (!area_out.rintersect(tex_rect).rempty()) - Flush(); + const GSVector2i offset = GSVector2i(m_context->XYOFFSET.OFX, m_context->XYOFFSET.OFY); + const GSVector4i scissor = GSVector4i(m_context->scissor.in); + GSVector4i old_tex_rect = GSVector4i(0, 0, 0, 0); + int current_draw_end = m_index.tail; + + while (current_draw_end >= n) + { + for (int i = current_draw_end - 1; i >= current_draw_end - n; i--) + { + const GSVertex* v = &m_vertex.buff[m_index.buff[i]]; + + tex_coord.x = (static_cast(v->XYZ.X) - offset.x) >> 4; + tex_coord.y = (static_cast(v->XYZ.Y) - offset.y) >> 4; + + if (i == (current_draw_end - 1)) + { + old_tex_rect = tex_coord.xyxy(); + } + else + { + old_tex_rect.x = std::min(old_tex_rect.x, tex_coord.x); + old_tex_rect.z = std::max(old_tex_rect.z, tex_coord.x); + old_tex_rect.y = std::min(old_tex_rect.y, tex_coord.y); + old_tex_rect.w = std::max(old_tex_rect.w, tex_coord.y); + } + } + + if (old_tex_rect.x == old_tex_rect.z) + old_tex_rect += GSVector4i(0, 0, 1, 0); + if (old_tex_rect.y == old_tex_rect.w) + old_tex_rect += GSVector4i(0, 0, 0, 1); + + old_tex_rect = tex_rect.rintersect(old_tex_rect); + if (!old_tex_rect.rintersect(scissor).rempty()) + { + Flush(GSFlushReason::AUTOFLUSH); + return; + } + + current_draw_end -= n; + } } else // Storage of the TEX and FRAME/Z is different, so uhh, just fall back to flushing each page. It's slower, sorry. { @@ -2997,10 +3203,10 @@ __forceinline void GSState::HandleAutoFlush() area_out.w += GSLocalMemory::m_psm[m_context->TEX0.PSM].pgs.y; if (!area_out.rintersect(tex_rect).rempty()) - Flush(); + Flush(GSFlushReason::AUTOFLUSH); } else // Page width is different, so it's much more difficult to calculate where it's modifying. - Flush(); + Flush(GSFlushReason::AUTOFLUSH); } } } @@ -3031,7 +3237,7 @@ __forceinline void GSState::VertexKick(u32 skip) ASSERT(m_vertex.tail < m_vertex.maxcount + 3); - if (auto_flush && m_index.tail >= n && !skip) + if (auto_flush && skip == 0 && m_index.tail > 0 && ((m_vertex.tail + 1) - m_vertex.head) >= n) { HandleAutoFlush(); } @@ -3043,34 +3249,34 @@ __forceinline void GSState::VertexKick(u32 skip) // callers should write XYZUVF to m_v.m[1] in one piece to have this load store-forwarded, either by the cpu or the compiler when this function is inlined - GSVector4i v0(m_v.m[0]); - GSVector4i v1(m_v.m[1]); + const GSVector4i new_v0(m_v.m[0]); + const GSVector4i new_v1(m_v.m[1]); GSVector4i* RESTRICT tailptr = (GSVector4i*)&m_vertex.buff[tail]; - tailptr[0] = v0; - tailptr[1] = v1; + tailptr[0] = new_v0; + tailptr[1] = new_v1; - const GSVector4i xy = v1.xxxx().u16to32().sub32(m_ofxy); + const GSVector4i xy = new_v1.xxxx().u16to32().sub32(m_ofxy); GSVector4i::storel(&m_vertex.xy[xy_tail & 3], xy.blend16<0xf0>(xy.sra32(4)).ps32()); m_vertex.tail = ++tail; m_vertex.xy_tail = ++xy_tail; - size_t m = tail - head; + const size_t m = tail - head; if (m < n) return; if (skip == 0 && (prim != GS_TRIANGLEFAN || m <= 4)) // m_vertex.xy only knows about the last 4 vertices, head could be far behind for fan { - GSVector4i v0, v1, v2, v3, pmin, pmax; + GSVector4i pmin, pmax; - v0 = GSVector4i::loadl(&m_vertex.xy[(xy_tail + 1) & 3]); // T-3 - v1 = GSVector4i::loadl(&m_vertex.xy[(xy_tail + 2) & 3]); // T-2 - v2 = GSVector4i::loadl(&m_vertex.xy[(xy_tail + 3) & 3]); // T-1 - v3 = GSVector4i::loadl(&m_vertex.xy[(xy_tail - m) & 3]); // H + const GSVector4i v0 = GSVector4i::loadl(&m_vertex.xy[(xy_tail + 1) & 3]); // T-3 + const GSVector4i v1 = GSVector4i::loadl(&m_vertex.xy[(xy_tail + 2) & 3]); // T-2 + const GSVector4i v2 = GSVector4i::loadl(&m_vertex.xy[(xy_tail + 3) & 3]); // T-1 + const GSVector4i v3 = GSVector4i::loadl(&m_vertex.xy[(xy_tail - m) & 3]); // H switch (prim) { @@ -3244,6 +3450,37 @@ __forceinline void GSState::VertexKick(u32 skip) default: __assume(0); } + + + + GSVector4i draw_coord; + const GSVector2i offset = GSVector2i(m_context->XYOFFSET.OFX, m_context->XYOFFSET.OFY); + + for (size_t i = 0; i < n; i++) + { + const GSVertex* v = &m_vertex.buff[m_index.buff[(m_index.tail - n) + i]]; + draw_coord.x = (static_cast(v->XYZ.X) - offset.x) >> 4; + draw_coord.y = (static_cast(v->XYZ.Y) - offset.y) >> 4; + + if (m_vertex.tail == n && i == 0) + { + temp_draw_rect.x = draw_coord.x; + temp_draw_rect.y = draw_coord.y; + temp_draw_rect = temp_draw_rect.xyxy(); + } + else + { + temp_draw_rect.x = std::min(draw_coord.x, temp_draw_rect.x); + temp_draw_rect.y = std::min(draw_coord.y, temp_draw_rect.y); + temp_draw_rect.z = std::max(draw_coord.x, temp_draw_rect.z); + temp_draw_rect.w = std::max(draw_coord.y, temp_draw_rect.w); + } + } + + const GSVector4i scissor = GSVector4i(m_context->scissor.in); + temp_draw_rect.rintersect(scissor); + + CLUTAutoFlush(); } /// Checks if region repeat is used (applying it does something to at least one of the values in min...max) @@ -3304,7 +3541,7 @@ GSState::TextureMinMaxResult GSState::GetTextureMinMax(const GIFRegTEX0& TEX0, c const int tw_mask = w - 1; const int th_mask = h - 1; - GSVector4i tr(0, 0, w, h); + const GSVector4i tr(0, 0, w, h); const int wms = CLAMP.WMS; const int wmt = CLAMP.WMT; @@ -3377,7 +3614,7 @@ GSState::TextureMinMaxResult GSState::GetTextureMinMax(const GIFRegTEX0& TEX0, c if (m_vt.m_primclass == GS_SPRITE_CLASS && PRIM->FST == 1 && m_index.tail < 3) { // When coordinates are fractional, GS appears to draw to the right/bottom (effectively - // taking the ceiling), not to the top/left (taking the floor). + // taking the ceiling), not to the top/left (taking the floor). const GSVector4i int_rc(m_vt.m_min.p.ceil().xyxy(m_vt.m_max.p.floor())); const GSVector4i scissored_rc(int_rc.rintersect(GSVector4i(m_context->scissor.in))); if (!int_rc.eq(scissored_rc)) @@ -3438,7 +3675,7 @@ GSState::TextureMinMaxResult GSState::GetTextureMinMax(const GIFRegTEX0& TEX0, c } } - GSVector4i uv = GSVector4i(st.floor()); + const GSVector4i uv = GSVector4i(st.floor()); uses_border = GSVector4::cast((uv < vr).blend32<0xc>(uv >= vr)).mask(); // Roughly cut out the min/max of the read (Clamp) @@ -3512,67 +3749,78 @@ void GSState::CalcAlphaMinMax() if (m_vt.m_alpha.valid) return; - const GSDrawingEnvironment& env = m_env; - const GSDrawingContext* context = m_context; + int min = 0, max = 0; - GSVector4i a = m_vt.m_min.c.uph32(m_vt.m_max.c).zzww(); - - if (PRIM->TME && context->TEX0.TCC) + if (IsCoverageAlpha()) { - switch (GSLocalMemory::m_psm[context->TEX0.PSM].fmt) + min = 128; + max = 128; + } + else + { + const GSDrawingContext* context = m_context; + GSVector4i a = m_vt.m_min.c.uph32(m_vt.m_max.c).zzww(); + if (PRIM->TME && context->TEX0.TCC) { - case 0: - a.y = 0; - a.w = 0xff; - break; - case 1: - a.y = env.TEXA.AEM ? 0 : env.TEXA.TA0; - a.w = env.TEXA.TA0; - break; - case 2: - a.y = env.TEXA.AEM ? 0 : std::min(env.TEXA.TA0, env.TEXA.TA1); - a.w = std::max(env.TEXA.TA0, env.TEXA.TA1); - break; - case 3: - m_mem.m_clut.GetAlphaMinMax32(a.y, a.w); - break; - default: - __assume(0); - } + const GSDrawingEnvironment& env = m_env; - switch (context->TEX0.TFX) - { - case TFX_MODULATE: - a.x = (a.x * a.y) >> 7; - a.z = (a.z * a.w) >> 7; - if (a.x > 0xff) - a.x = 0xff; - if (a.z > 0xff) - a.z = 0xff; - break; - case TFX_DECAL: - a.x = a.y; - a.z = a.w; - break; - case TFX_HIGHLIGHT: - a.x = a.x + a.y; - a.z = a.z + a.w; - if (a.x > 0xff) - a.x = 0xff; - if (a.z > 0xff) - a.z = 0xff; - break; - case TFX_HIGHLIGHT2: - a.x = a.y; - a.z = a.w; - break; - default: - __assume(0); + switch (GSLocalMemory::m_psm[context->TEX0.PSM].fmt) + { + case 0: + a.y = 0; + a.w = 0xff; + break; + case 1: + a.y = env.TEXA.AEM ? 0 : env.TEXA.TA0; + a.w = env.TEXA.TA0; + break; + case 2: + a.y = env.TEXA.AEM ? 0 : std::min(env.TEXA.TA0, env.TEXA.TA1); + a.w = std::max(env.TEXA.TA0, env.TEXA.TA1); + break; + case 3: + m_mem.m_clut.GetAlphaMinMax32(a.y, a.w); + break; + default: + __assume(0); + } + + switch (context->TEX0.TFX) + { + case TFX_MODULATE: + a.x = (a.x * a.y) >> 7; + a.z = (a.z * a.w) >> 7; + if (a.x > 0xff) + a.x = 0xff; + if (a.z > 0xff) + a.z = 0xff; + break; + case TFX_DECAL: + a.x = a.y; + a.z = a.w; + break; + case TFX_HIGHLIGHT: + a.x = a.x + a.y; + a.z = a.z + a.w; + if (a.x > 0xff) + a.x = 0xff; + if (a.z > 0xff) + a.z = 0xff; + break; + case TFX_HIGHLIGHT2: + a.x = a.y; + a.z = a.w; + break; + default: + __assume(0); + } } + min = a.x; + max = a.z; } - m_vt.m_alpha.min = a.x; - m_vt.m_alpha.max = a.z; + m_vt.m_alpha.min = min; + m_vt.m_alpha.max = max; m_vt.m_alpha.valid = true; } @@ -3750,6 +3998,11 @@ bool GSState::IsMipMapActive() return m_mipmap && IsMipMapDraw(); } +bool GSState::IsCoverageAlpha() +{ + return !PRIM->ABE && PRIM->AA1 && (m_vt.m_primclass == GS_LINE_CLASS || m_vt.m_primclass == GS_TRIANGLE_CLASS); +} + GIFRegTEX0 GSState::GetTex0Layer(u32 lod) { // Shortcut diff --git a/pcsx2/GS/GSState.h b/pcsx2/GS/GSState.h index 3b79171248..7fee8ac119 100644 --- a/pcsx2/GS/GSState.h +++ b/pcsx2/GS/GSState.h @@ -148,7 +148,7 @@ private: protected: bool IsBadFrame(); - void SetupCrcHack(); + void SetupCrcHack() noexcept; bool m_isPackedUV_HackFlag; CRCHackLevel m_crc_hack_level; @@ -184,8 +184,10 @@ protected: void UpdateVertexKick(); void GrowVertexBuffer(); + bool IsAutoFlushDraw(); void HandleAutoFlush(); - + void CLUTAutoFlush(); + template void VertexKick(u32 skip); @@ -217,6 +219,7 @@ protected: bool IsOpaque(); bool IsMipMapDraw(); bool IsMipMapActive(); + bool IsCoverageAlpha(); public: GIFPath m_path[4]; @@ -226,6 +229,7 @@ public: GSDrawingEnvironment m_env; GSDrawingEnvironment m_backup_env; GSDrawingEnvironment m_prev_env; + GSVector4i temp_draw_rect; GSDrawingContext* m_context; u32 m_crc; CRC::Game m_game; @@ -272,6 +276,26 @@ public: DIRTY_REG_ZBUF }; + enum GSFlushReason + { + UNKNOWN = 1 << 0, + RESET = 1 << 1, + CONTEXTCHANGE = 1 << 2, + CLUTCHANGE = 1 << 3, + TEXFLUSH = 1 << 4, + GSTRANSFER = 1 << 5, + UPLOADDIRTYTEX = 1 << 6, + LOCALTOLOCALMOVE = 1 << 7, + DOWNLOADFIFO = 1 << 8, + SAVESTATE = 1 << 9, + LOADSTATE = 1 << 10, + AUTOFLUSH = 1 << 11, + VSYNC = 1 << 12, + GSREOPEN = 1 << 13, + }; + + GSFlushReason m_state_flush_reason; + enum PRIM_OVERLAP { PRIM_OVERLAP_UNKNOW, @@ -321,12 +345,13 @@ public: void ResetHandlers(); int GetFramebufferHeight(); + int GetFramebufferWidth(); int GetDisplayHMagnification(); GSVector4i GetDisplayRect(int i = -1); GSVector4i GetFrameMagnifiedRect(int i = -1); GSVector2i GetResolutionOffset(int i = -1); GSVector2i GetResolution(); - GSVector4i GetFrameRect(int i = -1); + GSVector4i GetFrameRect(int i = -1, bool ignore_off = false); GSVideoMode GetVideoMode(); bool IsEnabled(int i); @@ -340,14 +365,15 @@ public: virtual void UpdateSettings(const Pcsx2Config::GSOptions& old_config); void CopyEnv(GSDrawingEnvironment* dest, GSDrawingEnvironment* src, int ctx); - void Flush(); + void Flush(GSFlushReason reason); void FlushPrim(); bool TestDrawChanged(); void FlushWrite(); virtual void Draw() = 0; virtual void PurgePool() = 0; - virtual void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) {} + virtual void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite = false) {} virtual void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut = false) {} + virtual void ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) {} virtual void Move(); diff --git a/pcsx2/GS/GSUtil.cpp b/pcsx2/GS/GSUtil.cpp index 03f4ab7f77..95574d6305 100644 --- a/pcsx2/GS/GSUtil.cpp +++ b/pcsx2/GS/GSUtil.cpp @@ -17,6 +17,7 @@ #include "GS.h" #include "GSExtra.h" #include "GSUtil.h" +#include "MultiISA.h" #include "common/StringUtil.h" #ifdef _WIN32 @@ -29,8 +30,6 @@ #define SVN_MODS 0 #endif -Xbyak::util::Cpu g_cpu; - static class GSUtilMaps { public: @@ -149,37 +148,30 @@ bool GSUtil::HasCompatibleBits(u32 spsm, u32 dpsm) bool GSUtil::CheckSSE() { - bool status = true; - struct ISA { - Xbyak::util::Cpu::Type type; + ProcessorFeatures::VectorISA isa; const char* name; }; ISA checks[] = { - {Xbyak::util::Cpu::tSSE41, "SSE41"}, + {ProcessorFeatures::VectorISA::SSE4, "SSE 4.1"}, #if _M_SSE >= 0x500 - {Xbyak::util::Cpu::tAVX, "AVX1"}, + {ProcessorFeatures::VectorISA::AVX, "AVX"}, #endif #if _M_SSE >= 0x501 - {Xbyak::util::Cpu::tAVX2, "AVX2"}, - {Xbyak::util::Cpu::tBMI1, "BMI1"}, - {Xbyak::util::Cpu::tBMI2, "BMI2"}, + {ProcessorFeatures::VectorISA::AVX2, "AVX2"}, #endif }; - for (const ISA& check : checks) { - if (!g_cpu.has(check.type)) + if (g_cpu.vectorISA < check.isa) { - fprintf(stderr, "This CPU does not support %s\n", check.name); - - status = false; + Console.Error("This CPU does not support %s", check.name); + return false; } } - - return status; + return true; } CRCHackLevel GSUtil::GetRecommendedCRCHackLevel(GSRendererType type) diff --git a/pcsx2/GS/GSUtil.h b/pcsx2/GS/GSUtil.h index df893a3146..2986ed116e 100644 --- a/pcsx2/GS/GSUtil.h +++ b/pcsx2/GS/GSUtil.h @@ -22,8 +22,6 @@ #include #endif -#include - class GSUtil { public: @@ -52,5 +50,3 @@ void GSmkdir(const char* dir); std::string GStempdir(); const char* psm_str(int psm); - -extern Xbyak::util::Cpu g_cpu; diff --git a/pcsx2/GS/GSVector.cpp b/pcsx2/GS/GSVector.cpp index deb00ac09d..dab402d2b1 100644 --- a/pcsx2/GS/GSVector.cpp +++ b/pcsx2/GS/GSVector.cpp @@ -71,8 +71,6 @@ CONSTINIT const GSVector4 GSVector4::m_xc1e00000000fffff = cxpr64(0xc1e00000000f CONSTINIT const GSVector4 GSVector4::m_max = cxpr(FLT_MAX); CONSTINIT const GSVector4 GSVector4::m_min = cxpr(FLT_MIN); -#if _M_SSE >= 0x500 - CONSTINIT const GSVector8 GSVector8::m_half = cxpr(0.5f); CONSTINIT const GSVector8 GSVector8::m_one = cxpr(1.0f); CONSTINIT const GSVector8 GSVector8::m_x7fffffff = cxpr(0x7fffffff); @@ -83,9 +81,6 @@ CONSTINIT const GSVector8 GSVector8::m_xc1e00000000fffff = cxpr64(0xc1e00000000f CONSTINIT const GSVector8 GSVector8::m_max = cxpr(FLT_MAX); CONSTINIT const GSVector8 GSVector8::m_min = cxpr(FLT_MAX); -#endif - -#if _M_SSE >= 0x501 CONSTINIT const GSVector8i GSVector8i::m_xff[33] = { cxpr(0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000), @@ -159,7 +154,6 @@ CONSTINIT const GSVector8i GSVector8i::m_x0f[33] = cxpr(0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x000f0f0f), cxpr(0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f, 0x0f0f0f0f), }; -#endif GSVector4i GSVector4i::fit(int arx, int ary) const { diff --git a/pcsx2/GS/GSVector.h b/pcsx2/GS/GSVector.h index 098e1f0601..5e119bc038 100644 --- a/pcsx2/GS/GSVector.h +++ b/pcsx2/GS/GSVector.h @@ -15,6 +15,7 @@ #include "PrecompiledHeader.h" #include "GSIntrin.h" +#include #pragma once @@ -65,12 +66,12 @@ public: constexpr bool operator==(const GSVector2T& v) const { - return x == v.x && y == v.y; + return (std::memcmp(this, &v, sizeof(*this)) == 0); } constexpr bool operator!=(const GSVector2T& v) const { - return x != v.x || y != v.y; + return (std::memcmp(this, &v, sizeof(*this)) != 0); } constexpr GSVector2T operator*(const GSVector2T& v) const diff --git a/pcsx2/GS/GSVector8.h b/pcsx2/GS/GSVector8.h index fa3f5d2c77..c0b87b3c1d 100644 --- a/pcsx2/GS/GSVector8.h +++ b/pcsx2/GS/GSVector8.h @@ -15,8 +15,6 @@ #include -#if _M_SSE >= 0x500 - class alignas(32) GSVector8 { struct cxpr_init_tag {}; @@ -53,7 +51,9 @@ public: u16 U16[16]; u32 U32[8]; u64 U64[4]; +#if _M_SSE >= 0x500 __m256 m; +#endif __m128 m0, m1; }; @@ -104,6 +104,8 @@ public: return GSVector8(cxpr_init, x, x, x, x); } +#if _M_SSE >= 0x500 + __forceinline GSVector8(float x0, float y0, float z0, float w0, float x1, float y1, float z1, float w1) { m = _mm256_set_ps(w1, z1, y1, x1, w0, z0, y0, x0); @@ -116,8 +118,8 @@ public: __forceinline GSVector8(__m128 m0, __m128 m1) { -#if 0 // _MSC_VER >= 1700 - +#if 0 // _MSC_VER >= 1700 + this->m = _mm256_permute2f128_ps(_mm256_castps128_ps256(m0), _mm256_castps128_ps256(m1), 0x20); #else @@ -948,6 +950,5 @@ public: // TODO: v.(x0|y0|z0|w0|x1|y1|z1|w1) // broadcast element #endif -}; - #endif +}; diff --git a/pcsx2/GS/GSVector8i.h b/pcsx2/GS/GSVector8i.h index 9db5f23734..8bff2eef42 100644 --- a/pcsx2/GS/GSVector8i.h +++ b/pcsx2/GS/GSVector8i.h @@ -15,8 +15,6 @@ #include -#if _M_SSE >= 0x501 - class alignas(32) GSVector8i { static const GSVector8i m_xff[33]; @@ -45,7 +43,9 @@ public: u16 U16[16]; u32 U32[8]; u64 U64[4]; +#if _M_SSE >= 0x501 __m256i m; +#endif __m128i m0, m1; }; @@ -61,6 +61,8 @@ public: return GSVector8i(cxpr_init, x, x, x, x, x, x, x, x); } +#if _M_SSE >= 0x501 + __forceinline explicit GSVector8i(const GSVector8& v, bool truncate = true); __forceinline static GSVector8i cast(const GSVector8& v); @@ -91,8 +93,8 @@ public: __forceinline GSVector8i(__m128i m0, __m128i m1) { -#if 0 // _MSC_VER >= 1700 - +#if 0 // _MSC_VER >= 1700 + this->m = _mm256_permute2x128_si256(_mm256_castsi128_si256(m0), _mm256_castsi128_si256(m1), 0); #else @@ -1887,6 +1889,6 @@ public: __forceinline static GSVector8i xff(int n) { return m_xff[n]; } __forceinline static GSVector8i x0f(int n) { return m_x0f[n]; } +#endif }; -#endif diff --git a/pcsx2/GS/GSXXH.cpp b/pcsx2/GS/GSXXH.cpp new file mode 100644 index 0000000000..1cc1f64d84 --- /dev/null +++ b/pcsx2/GS/GSXXH.cpp @@ -0,0 +1,45 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2021 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" +#include "MultiISA.h" + +#define XXH_STATIC_LINKING_ONLY 1 +#define XXH_INLINE_ALL 1 +namespace CURRENT_ISA // XXH doesn't seem to use symbols that allow the compiler to deduplicate, but just in case... +{ +#include +} + +MULTI_ISA_UNSHARED_IMPL; + +// Include this after xxhash so we can add namespaces (GSXXH is set up to not include xxhash header if it's already been included) +#include "GSXXH.h" + +u64 __noinline CURRENT_ISA::GSXXH3_64_Long(const void* data, size_t len) +{ + // XXH marks its function that calls this noinline, and it would be silly to stack noinline functions, so call the internal function directly + return XXH3_hashLong_64b_internal(data, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate_512, XXH3_scrambleAcc); +} + +u32 CURRENT_ISA::GSXXH3_64_Update(void* state, const void* data, size_t len) +{ + return XXH3_64bits_update(static_cast(state), static_cast(data), len); +} + +u64 CURRENT_ISA::GSXXH3_64_Digest(void* state) +{ + return XXH3_64bits_digest(static_cast(state)); +} diff --git a/pcsx2/GS/GSXXH.h b/pcsx2/GS/GSXXH.h new file mode 100644 index 0000000000..b6dcf19e93 --- /dev/null +++ b/pcsx2/GS/GSXXH.h @@ -0,0 +1,47 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2021 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +#include "MultiISA.h" + +#ifndef XXH_versionNumber + #define XXH_STATIC_LINKING_ONLY 1 + #define XXH_INLINE_ALL 1 + #include +#endif + +MULTI_ISA_DEF(u64 GSXXH3_64_Long(const void* data, size_t len);) +MULTI_ISA_DEF(u32 GSXXH3_64_Update(void* state, const void* data, size_t len);) +MULTI_ISA_DEF(u64 GSXXH3_64_Digest(void* state);) + +static inline u64 __forceinline GSXXH3_64bits(const void* data, size_t len) +{ + // XXH3 has optimized functions for small inputs and they aren't vectorized + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_64bits(data, len); + return MultiISAFunctions::GSXXH3_64_Long(data, len); +} + +static inline XXH_errorcode __forceinline GSXXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len) +{ + // XXH3 update has no optimized functions for small inputs + return static_cast(MultiISAFunctions::GSXXH3_64_Update(static_cast(state), input, len)); +} + +static inline u64 __forceinline GSXXH3_64bits_digest(XXH3_state_t* state) +{ + return MultiISAFunctions::GSXXH3_64_Digest(static_cast(state)); +} diff --git a/pcsx2/GS/MultiISA.cpp b/pcsx2/GS/MultiISA.cpp new file mode 100644 index 0000000000..e5e572e487 --- /dev/null +++ b/pcsx2/GS/MultiISA.cpp @@ -0,0 +1,100 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2021 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" +#include "MultiISA.h" +#include + +#ifdef _WIN32 +#define strcasecmp _stricmp +#endif + +static Xbyak::util::Cpu s_cpu; + +static ProcessorFeatures::VectorISA getCurrentISA() +{ + // For debugging + if (const char* over = getenv("OVERRIDE_VECTOR_ISA")) + { + if (strcasecmp(over, "avx2") == 0) + { + fprintf(stderr, "Vector ISA Override: AVX2\n"); + return ProcessorFeatures::VectorISA::AVX2; + } + if (strcasecmp(over, "avx") == 0) + { + fprintf(stderr, "Vector ISA Override: AVX\n"); + return ProcessorFeatures::VectorISA::AVX; + } + if (strcasecmp(over, "sse4") == 0) + { + fprintf(stderr, "Vector ISA Override: SSE4\n"); + return ProcessorFeatures::VectorISA::SSE4; + } + } + if (s_cpu.has(Xbyak::util::Cpu::tAVX2) && s_cpu.has(Xbyak::util::Cpu::tBMI1) && s_cpu.has(Xbyak::util::Cpu::tBMI2)) + return ProcessorFeatures::VectorISA::AVX2; + else if (s_cpu.has(Xbyak::util::Cpu::tAVX)) + return ProcessorFeatures::VectorISA::AVX; + else if (s_cpu.has(Xbyak::util::Cpu::tSSE41)) + return ProcessorFeatures::VectorISA::SSE4; + else + return ProcessorFeatures::VectorISA::None; +} + +static ProcessorFeatures getProcessorFeatures() +{ + ProcessorFeatures features = {}; + features.vectorISA = getCurrentISA(); + features.hasFMA = s_cpu.has(Xbyak::util::Cpu::tFMA); + if (const char* over = getenv("OVERRIDE_FMA")) + { + features.hasFMA = over[0] == 'Y' || over[0] == 'y' || over[0] == '1'; + fprintf(stderr, "Processor FMA override: %s\n", features.hasFMA ? "Supported" : "Unsupported"); + } + features.hasSlowGather = false; + if (const char* over = getenv("OVERRIDE_SLOW_GATHER")) // Easy override for comparing on vs off + { + features.hasSlowGather = over[0] == 'Y' || over[0] == 'y' || over[0] == '1'; + fprintf(stderr, "Processor gather override: %s\n", features.hasSlowGather ? "Slow" : "Fast"); + } + else if (features.vectorISA == ProcessorFeatures::VectorISA::AVX2) + { + if (s_cpu.has(Xbyak::util::Cpu::tINTEL)) + { + // Slow on Haswell + // CPUID data from https://en.wikichip.org/wiki/intel/cpuid + features.hasSlowGather = s_cpu.displayModel == 0x46 || s_cpu.displayModel == 0x45 || s_cpu.displayModel == 0x3c; + } + else + { + // Currently no Zen CPUs with fast VPGATHERDD + // Check https://uops.info/table.html as new CPUs come out for one that doesn't split it into like 40 µops + // Doing it manually is about 28 µops (8x xmm -> gpr, 6x extr, 8x load, 6x insr) + features.hasSlowGather = true; + } + } + return features; +} + +const ProcessorFeatures g_cpu = getProcessorFeatures(); + +// Keep init order by defining these here + +#include "GSXXH.h" + +u64 (&MultiISAFunctions::GSXXH3_64_Long)(const void* data, size_t len) = MULTI_ISA_SELECT(GSXXH3_64_Long); +u32 (&MultiISAFunctions::GSXXH3_64_Update)(void* state, const void* data, size_t len) = MULTI_ISA_SELECT(GSXXH3_64_Update); +u64 (&MultiISAFunctions::GSXXH3_64_Digest)(void* state) = MULTI_ISA_SELECT(GSXXH3_64_Digest); diff --git a/pcsx2/GS/MultiISA.h b/pcsx2/GS/MultiISA.h new file mode 100644 index 0000000000..87bb926f74 --- /dev/null +++ b/pcsx2/GS/MultiISA.h @@ -0,0 +1,95 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2021 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +#include "PCSX2Base.h" + +// For multiple-isa compilation +#ifdef MULTI_ISA_UNSHARED_COMPILATION + // Preprocessor should have MULTI_ISA_UNSHARED_COMPILATION defined to `isa_sse4`, `isa_avx`, or `isa_avx2` + #define CURRENT_ISA MULTI_ISA_UNSHARED_COMPILATION +#else + // Define to isa_native in shared section in addition to multi-isa-off so if someone tries to use it they'll hopefully get a linker error and notice + #define CURRENT_ISA isa_native +#endif + +#if defined(MULTI_ISA_UNSHARED_COMPILATION) + // Preprocessor should have MULTI_ISA_IS_FIRST defined to 0 or 1 + /// Use with `#if MULTI_ISA_COMPILE_ONCE` to make a single definition of something in an otherwise multi-isa-compiled file. + #define MULTI_ISA_COMPILE_ONCE MULTI_ISA_IS_FIRST +#elif !defined(MULTI_ISA_SHARED_COMPILATION) + #define MULTI_ISA_COMPILE_ONCE 1 +#else + #define MULTI_ISA_COMPILE_ONCE static_assert(0, "You don't need MULTI_ISA_COMPILE_ONCE in a non-multi-isa file!"); +#endif + +#ifndef MULTI_ISA_SHARED_COMPILATION + /// Mark the start of a header defining code that will be compiled multiple times in multi-isa mode + /// Anything between this and a `MULTI_ISA_UNSHARED_END` will be placed in a different namespace for each of the multilple compilations + #define MULTI_ISA_UNSHARED_START namespace CURRENT_ISA { + /// Mark the end of a header defining code that will be compiled multiple times in multi-isa mode + #define MULTI_ISA_UNSHARED_END } + /// Mark the beginning of a file implementing things that will be compiled multiple times in multi-isa mode + /// Takes advantage of the fact that a `using namespace` declaration will also affect any implementations of things as long as they're not valid without it + /// Fully global variables are valid as-is, however, and will need to have `CURRENT_ISA::` manually prepended to them. + /// If you forget to do this, it will show up as a linker error (either multiple definitions of the function/variable, or a "failed to find isa_native::function") + #define MULTI_ISA_UNSHARED_IMPL using namespace CURRENT_ISA +#else + #define MULTI_ISA_UNSHARED_START static_assert(0, "This file should not be included by multi-isa shared compilation!"); + #define MULTI_ISA_UNSHARED_IMPL static_assert(0, "This file should be compiled unshared in multi-isa mode!"); + #define MULTI_ISA_UNSHARED_END +#endif + +struct ProcessorFeatures +{ + enum class VectorISA { None, SSE4, AVX, AVX2 }; + VectorISA vectorISA; + bool hasFMA; + bool hasSlowGather; +}; + +extern const ProcessorFeatures g_cpu; + +#if defined(MULTI_ISA_UNSHARED_COMPILATION) || defined(MULTI_ISA_SHARED_COMPILATION) + #define MULTI_ISA_DEF(...) \ + namespace isa_sse4 { __VA_ARGS__ } \ + namespace isa_avx { __VA_ARGS__ } \ + namespace isa_avx2 { __VA_ARGS__ } + + #define MULTI_ISA_FRIEND(klass) \ + friend class isa_sse4::klass; \ + friend class isa_avx ::klass; \ + friend class isa_avx2::klass; + + #define MULTI_ISA_SELECT(fn) (\ + ::g_cpu.vectorISA == ProcessorFeatures::VectorISA::AVX2 ? isa_avx2::fn : \ + ::g_cpu.vectorISA == ProcessorFeatures::VectorISA::AVX ? isa_avx ::fn : \ + isa_sse4::fn) +#else + #define MULTI_ISA_DEF(...) namespace isa_native { __VA_ARGS__ } + #define MULTI_ISA_FRIEND(klass) friend class isa_native::klass; + #define MULTI_ISA_SELECT(fn) (isa_native::fn) +#endif + +class GSRenderer; +MULTI_ISA_DEF(GSRenderer* makeGSRendererSW(int threads);) + +namespace MultiISAFunctions +{ + extern u64 (&GSXXH3_64_Long)(const void* data, size_t len); + extern u32 (&GSXXH3_64_Update)(void* state, const void* data, size_t len); + extern u64 (&GSXXH3_64_Digest)(void* state); +} diff --git a/pcsx2/GS/Renderers/Common/GSDevice.cpp b/pcsx2/GS/Renderers/Common/GSDevice.cpp index 732a0a37e4..bf93117798 100644 --- a/pcsx2/GS/Renderers/Common/GSDevice.cpp +++ b/pcsx2/GS/Renderers/Common/GSDevice.cpp @@ -17,29 +17,36 @@ #include "GSDevice.h" #include "GS/GSGL.h" #include "GS/GS.h" +#include "Host.h" +#include "common/StringUtil.h" const char* shaderName(ShaderConvert value) { switch (value) { // clang-format off - case ShaderConvert::COPY: return "ps_copy"; - case ShaderConvert::RGBA8_TO_16_BITS: return "ps_convert_rgba8_16bits"; - case ShaderConvert::DATM_1: return "ps_datm1"; - case ShaderConvert::DATM_0: return "ps_datm0"; - case ShaderConvert::MOD_256: return "ps_mod256"; - case ShaderConvert::TRANSPARENCY_FILTER: return "ps_filter_transparency"; - case ShaderConvert::FLOAT32_TO_16_BITS: return "ps_convert_float32_32bits"; - case ShaderConvert::FLOAT32_TO_32_BITS: return "ps_convert_float32_32bits"; - case ShaderConvert::FLOAT32_TO_RGBA8: return "ps_convert_float32_rgba8"; - case ShaderConvert::FLOAT16_TO_RGB5A1: return "ps_convert_float16_rgb5a1"; - case ShaderConvert::RGBA8_TO_FLOAT32: return "ps_convert_rgba8_float32"; - case ShaderConvert::RGBA8_TO_FLOAT24: return "ps_convert_rgba8_float24"; - case ShaderConvert::RGBA8_TO_FLOAT16: return "ps_convert_rgba8_float16"; - case ShaderConvert::RGB5A1_TO_FLOAT16: return "ps_convert_rgb5a1_float16"; - case ShaderConvert::DEPTH_COPY: return "ps_depth_copy"; - case ShaderConvert::RGBA_TO_8I: return "ps_convert_rgba_8i"; - case ShaderConvert::YUV: return "ps_yuv"; + case ShaderConvert::COPY: return "ps_copy"; + case ShaderConvert::RGBA8_TO_16_BITS: return "ps_convert_rgba8_16bits"; + case ShaderConvert::DATM_1: return "ps_datm1"; + case ShaderConvert::DATM_0: return "ps_datm0"; + case ShaderConvert::HDR_INIT: return "ps_hdr_init"; + case ShaderConvert::HDR_RESOLVE: return "ps_hdr_resolve"; + case ShaderConvert::TRANSPARENCY_FILTER: return "ps_filter_transparency"; + case ShaderConvert::FLOAT32_TO_16_BITS: return "ps_convert_float32_32bits"; + case ShaderConvert::FLOAT32_TO_32_BITS: return "ps_convert_float32_32bits"; + case ShaderConvert::FLOAT32_TO_RGBA8: return "ps_convert_float32_rgba8"; + case ShaderConvert::FLOAT16_TO_RGB5A1: return "ps_convert_float16_rgb5a1"; + case ShaderConvert::RGBA8_TO_FLOAT32: return "ps_convert_rgba8_float32"; + case ShaderConvert::RGBA8_TO_FLOAT24: return "ps_convert_rgba8_float24"; + case ShaderConvert::RGBA8_TO_FLOAT16: return "ps_convert_rgba8_float16"; + case ShaderConvert::RGB5A1_TO_FLOAT16: return "ps_convert_rgb5a1_float16"; + case ShaderConvert::RGBA8_TO_FLOAT32_BILN: return "ps_convert_rgba8_float32_biln"; + case ShaderConvert::RGBA8_TO_FLOAT24_BILN: return "ps_convert_rgba8_float24_biln"; + case ShaderConvert::RGBA8_TO_FLOAT16_BILN: return "ps_convert_rgba8_float16_biln"; + case ShaderConvert::RGB5A1_TO_FLOAT16_BILN: return "ps_convert_rgb5a1_float16_biln"; + case ShaderConvert::DEPTH_COPY: return "ps_depth_copy"; + case ShaderConvert::RGBA_TO_8I: return "ps_convert_rgba_8i"; + case ShaderConvert::YUV: return "ps_yuv"; // clang-format on default: ASSERT(0); @@ -76,35 +83,19 @@ GSDevice::GSDevice() = default; GSDevice::~GSDevice() { - PurgePool(); - - delete m_merge; - delete m_weavebob; - delete m_blend; - delete m_target_tmp; + // should've been cleaned up in Destroy() + pxAssert(m_pool.empty() && !m_merge && !m_weavebob && !m_blend && !m_mad && !m_target_tmp && !m_cas); } -bool GSDevice::Create(HostDisplay* display) +bool GSDevice::Create() { - m_display = display; return true; } void GSDevice::Destroy() { + ClearCurrent(); PurgePool(); - - delete m_merge; - delete m_weavebob; - delete m_blend; - delete m_target_tmp; - - m_merge = nullptr; - m_weavebob = nullptr; - m_blend = nullptr; - m_target_tmp = nullptr; - - m_current = nullptr; // current is special, points to other textures, no need to delete } void GSDevice::ResetAPIState() @@ -161,12 +152,10 @@ GSTexture* GSDevice::FetchSurface(GSTexture::Type type, int width, int height, i } t->SetScale(GSVector2(1, 1)); // Things seem to assume that all textures come out of here with scale 1... - t->Commit(); // Clear won't be done if the texture isn't committed. switch (type) { case GSTexture::Type::RenderTarget: - case GSTexture::Type::SparseRenderTarget: { if (clear) ClearRenderTarget(t, 0); @@ -175,7 +164,6 @@ GSTexture* GSDevice::FetchSurface(GSTexture::Type type, int width, int height, i } break; case GSTexture::Type::DepthStencil: - case GSTexture::Type::SparseDepthStencil: { if (clear) ClearDepth(t); @@ -215,12 +203,6 @@ void GSDevice::Recycle(GSTexture* t) { if (t) { -#ifdef _DEBUG - // Uncommit saves memory but it means a futur allocation when we want to reuse the texture. - // Which is slow and defeat the purpose of the m_pool cache. - // However, it can help to spot part of texture that we forgot to commit - t->Uncommit(); -#endif t->last_frame_used = m_frame; m_pool.push_front(t); @@ -259,16 +241,6 @@ void GSDevice::ClearSamplerCache() { } -GSTexture* GSDevice::CreateSparseRenderTarget(int w, int h, GSTexture::Format format, bool clear) -{ - return FetchSurface(HasColorSparse() ? GSTexture::Type::SparseRenderTarget : GSTexture::Type::RenderTarget, w, h, 1, format, clear, true); -} - -GSTexture* GSDevice::CreateSparseDepthStencil(int w, int h, GSTexture::Format format, bool clear) -{ - return FetchSurface(HasDepthSparse() ? GSTexture::Type::SparseDepthStencil : GSTexture::Type::DepthStencil, w, h, 1, format, clear, true); -} - GSTexture* GSDevice::CreateRenderTarget(int w, int h, GSTexture::Format format, bool clear) { return FetchSurface(GSTexture::Type::RenderTarget, w, h, 1, format, clear, true); @@ -279,9 +251,9 @@ GSTexture* GSDevice::CreateDepthStencil(int w, int h, GSTexture::Format format, return FetchSurface(GSTexture::Type::DepthStencil, w, h, 1, format, clear, true); } -GSTexture* GSDevice::CreateTexture(int w, int h, bool mipmap, GSTexture::Format format, bool prefer_reuse /* = false */) +GSTexture* GSDevice::CreateTexture(int w, int h, int mipmap_levels, GSTexture::Format format, bool prefer_reuse /* = false */) { - const int levels = mipmap ? MipmapLevelsForSize(w, h) : 1; + const int levels = mipmap_levels < 0 ? MipmapLevelsForSize(w, h) : mipmap_levels; return FetchSurface(GSTexture::Type::Texture, w, h, levels, format, false, prefer_reuse); } @@ -292,7 +264,7 @@ GSTexture* GSDevice::CreateOffscreen(int w, int h, GSTexture::Format format) GSTexture::Format GSDevice::GetDefaultTextureFormat(GSTexture::Type type) { - if (type == GSTexture::Type::DepthStencil || type == GSTexture::Type::SparseDepthStencil) + if (type == GSTexture::Type::DepthStencil) return GSTexture::Format::DepthStencil; else return GSTexture::Format::Color; @@ -327,12 +299,22 @@ void GSDevice::ClearCurrent() delete m_merge; delete m_weavebob; delete m_blend; + delete m_mad; delete m_target_tmp; + delete m_cas; m_merge = nullptr; m_weavebob = nullptr; m_blend = nullptr; + m_mad = nullptr; m_target_tmp = nullptr; + m_cas = nullptr; + m_temp_snapshot = nullptr; +} + +void GSDevice::SetSnapshot() +{ + m_temp_snapshot = m_current; } void GSDevice::Merge(GSTexture* sTex[3], GSVector4* sRect, GSVector4* dRect, const GSVector2i& fs, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) @@ -373,54 +355,43 @@ void GSDevice::Merge(GSTexture* sTex[3], GSVector4* sRect, GSVector4* dRect, con void GSDevice::Interlace(const GSVector2i& ds, int field, int mode, float yoffset) { - ResizeTarget(&m_weavebob, ds.x, ds.y); + static int bufIdx = 0; + float offset = yoffset * static_cast(field); + offset = GSConfig.DisableInterlaceOffset ? 0.0f : offset; - if (mode == 0 || mode == 2) // weave or blend + switch (mode) { - // weave first - const float offset = yoffset * static_cast(field); - - DoInterlace(m_merge, m_weavebob, field, false, GSConfig.DisableInterlaceOffset ? 0.0f : offset); - - if (mode == 2) - { - // blend - - ResizeTarget(&m_blend, ds.x, ds.y); - - DoInterlace(m_weavebob, m_blend, 2, false, 0); - - m_current = m_blend; - } - else - { + case 0: // Weave + ResizeTarget(&m_weavebob, ds.x, ds.y); + DoInterlace(m_merge, m_weavebob, 0, false, offset, field); m_current = m_weavebob; - } - } - else if (mode == 1) // bob - { - // Field is reversed here as we are countering the bounce. - DoInterlace(m_merge, m_weavebob, 3, true, yoffset * (1-field)); - - m_current = m_weavebob; - } - else - { - m_current = m_merge; - } -} - -void GSDevice::ExternalFX() -{ - const GSVector2i s = m_current->GetSize(); - - if (ResizeTarget(&m_target_tmp)) - { - const GSVector4 sRect(0, 0, 1, 1); - const GSVector4 dRect(0, 0, s.x, s.y); - - StretchRect(m_current, sRect, m_target_tmp, dRect, ShaderConvert::TRANSPARENCY_FILTER, false); - DoExternalFX(m_target_tmp, m_current); + break; + case 1: // Bob + // Field is reversed here as we are countering the bounce. + ResizeTarget(&m_weavebob, ds.x, ds.y); + DoInterlace(m_merge, m_weavebob, 1, true, yoffset * (1 - field), 0); + m_current = m_weavebob; + break; + case 2: // Blend + ResizeTarget(&m_weavebob, ds.x, ds.y); + DoInterlace(m_merge, m_weavebob, 0, false, offset, field); + ResizeTarget(&m_blend, ds.x, ds.y); + DoInterlace(m_weavebob, m_blend, 2, false, 0, 0); + m_current = m_blend; + break; + case 3: // FastMAD Motion Adaptive Deinterlacing + bufIdx++; + bufIdx &= ~1; + bufIdx |= field; + bufIdx &= 3; + ResizeTarget(&m_mad, ds.x, ds.y * 2.0f); + DoInterlace(m_merge, m_mad, 3, false, offset, bufIdx); + ResizeTarget(&m_weavebob, ds.x, ds.y); + DoInterlace(m_mad, m_weavebob, 4, false, 0, bufIdx); + m_current = m_weavebob; + break; + default: + m_current = m_merge; } } @@ -459,6 +430,25 @@ void GSDevice::ShadeBoost() } } +void GSDevice::Resize(int width, int height) +{ + GSVector2i s = m_current->GetSize(); + int multiplier = 1; + + while (width > s.x || height > s.y) + { + s = m_current->GetSize() * GSVector2i(++multiplier); + } + + if (ResizeTexture(&m_target_tmp, GSTexture::Type::RenderTarget, s.x, s.y)) + { + const GSVector4 sRect(0, 0, 1, 1); + const GSVector4 dRect(0, 0, s.x, s.y); + StretchRect(m_current, sRect, m_target_tmp, dRect, ShaderConvert::COPY, false); + m_current = m_target_tmp; + } +} + bool GSDevice::ResizeTexture(GSTexture** t, GSTexture::Type type, int w, int h, bool clear, bool prefer_reuse) { if (t == NULL) @@ -526,6 +516,62 @@ void GSDevice::SetHWDrawConfigForAlphaPass(GSHWDrawConfig::PSSelector* ps, } } +// Kinda grotty, but better than copy/pasting the relevant bits in.. +#define A_CPU 1 +#include "bin/resources/shaders/common/ffx_a.h" +#include "bin/resources/shaders/common/ffx_cas.h" + +bool GSDevice::GetCASShaderSource(std::string* source) +{ + std::optional ffx_a_source(Host::ReadResourceFileToString("shaders/common/ffx_a.h")); + std::optional ffx_cas_source(Host::ReadResourceFileToString("shaders/common/ffx_cas.h")); + if (!ffx_a_source.has_value() || !ffx_cas_source.has_value()) + return false; + + // Since our shader compilers don't support includes, and OpenGL doesn't at all... we'll do a really cheeky string replace. + StringUtil::ReplaceAll(source, "#include \"ffx_a.h\"", ffx_a_source.value()); + StringUtil::ReplaceAll(source, "#include \"ffx_cas.h\"", ffx_cas_source.value()); + return true; +} + +void GSDevice::CAS(GSTexture*& tex, GSVector4i& src_rect, GSVector4& src_uv, const GSVector4& draw_rect, bool sharpen_only) +{ + const int dst_width = sharpen_only ? src_rect.width() : static_cast(std::ceil(draw_rect.z - draw_rect.x)); + const int dst_height = sharpen_only ? src_rect.height() : static_cast(std::ceil(draw_rect.w - draw_rect.y)); + const int src_offset_x = static_cast(src_rect.x); + const int src_offset_y = static_cast(src_rect.y); + + GSTexture* src_tex = tex; + if (!m_cas || m_cas->GetWidth() != dst_width || m_cas->GetHeight() != dst_height) + { + delete m_cas; + m_cas = CreateSurface(GSTexture::Type::RWTexture, dst_width, dst_height, 1, GSTexture::Format::Color); + if (!m_cas) + { + Console.Error("Failed to allocate CAS RW texture."); + return; + } + } + + std::array consts; + CasSetup(&consts[0], &consts[4], static_cast(GSConfig.CAS_Sharpness) * 0.01f, + static_cast(src_rect.width()), static_cast(src_rect.height()), + static_cast(dst_width), static_cast(dst_height)); + consts[8] = static_cast(src_offset_x); + consts[9] = static_cast(src_offset_y); + + if (!DoCAS(src_tex, m_cas, sharpen_only, consts)) + { + // leave textures intact if we failed + Console.Warning("Applying CAS failed."); + return; + } + + tex = m_cas; + src_rect = GSVector4i(0, 0, dst_width, dst_height); + src_uv = GSVector4(0.0f, 0.0f, 1.0f, 1.0f); +} + GSAdapter::operator std::string() const { char buf[sizeof "12345678:12345678:12345678:12345678"]; diff --git a/pcsx2/GS/Renderers/Common/GSDevice.h b/pcsx2/GS/Renderers/Common/GSDevice.h index 8cb97ffe2e..01d297a7a4 100644 --- a/pcsx2/GS/Renderers/Common/GSDevice.h +++ b/pcsx2/GS/Renderers/Common/GSDevice.h @@ -35,7 +35,8 @@ enum class ShaderConvert RGBA8_TO_16_BITS, DATM_1, DATM_0, - MOD_256, + HDR_INIT, + HDR_RESOLVE, TRANSPARENCY_FILTER, FLOAT32_TO_16_BITS, FLOAT32_TO_32_BITS, @@ -45,12 +46,75 @@ enum class ShaderConvert RGBA8_TO_FLOAT24, RGBA8_TO_FLOAT16, RGB5A1_TO_FLOAT16, + RGBA8_TO_FLOAT32_BILN, + RGBA8_TO_FLOAT24_BILN, + RGBA8_TO_FLOAT16_BILN, + RGB5A1_TO_FLOAT16_BILN, DEPTH_COPY, RGBA_TO_8I, YUV, Count }; +static inline bool HasDepthOutput(ShaderConvert shader) +{ + switch (shader) + { + case ShaderConvert::RGBA8_TO_FLOAT32: + case ShaderConvert::RGBA8_TO_FLOAT24: + case ShaderConvert::RGBA8_TO_FLOAT16: + case ShaderConvert::RGB5A1_TO_FLOAT16: + case ShaderConvert::RGBA8_TO_FLOAT32_BILN: + case ShaderConvert::RGBA8_TO_FLOAT24_BILN: + case ShaderConvert::RGBA8_TO_FLOAT16_BILN: + case ShaderConvert::RGB5A1_TO_FLOAT16_BILN: + case ShaderConvert::DEPTH_COPY: + return true; + default: + return false; + } +} + +static inline bool HasStencilOutput(ShaderConvert shader) +{ + switch (shader) + { + case ShaderConvert::DATM_0: + case ShaderConvert::DATM_1: + return true; + default: + return false; + } +} + +static inline bool SupportsNearest(ShaderConvert shader) +{ + switch (shader) + { + case ShaderConvert::RGBA8_TO_FLOAT32_BILN: + case ShaderConvert::RGBA8_TO_FLOAT24_BILN: + case ShaderConvert::RGBA8_TO_FLOAT16_BILN: + case ShaderConvert::RGB5A1_TO_FLOAT16_BILN: + return false; + default: + return true; + } +} + +static inline bool SupportsBilinear(ShaderConvert shader) +{ + switch (shader) + { + case ShaderConvert::RGBA8_TO_FLOAT32: + case ShaderConvert::RGBA8_TO_FLOAT24: + case ShaderConvert::RGBA8_TO_FLOAT16: + case ShaderConvert::RGB5A1_TO_FLOAT16: + return false; + default: + return true; + } +} + enum class PresentShader { COPY = 0, @@ -127,22 +191,10 @@ public: class InterlaceConstantBuffer { public: - GSVector2 ZrH; - float _pad[2]; - + GSVector4 ZrH; // data passed to the shader InterlaceConstantBuffer() { memset(this, 0, sizeof(*this)); } }; -class ExternalFXConstantBuffer -{ -public: - GSVector2 xyFrame; - GSVector4 rcpFrame; - GSVector4 rcpFrameOpt; - - ExternalFXConstantBuffer() { memset(this, 0, sizeof(*this)); } -}; - #pragma pack(pop) enum HWBlendFlags @@ -183,6 +235,13 @@ struct alignas(16) GSHWDrawConfig Triangle, Sprite, }; + enum class VSExpand: u8 + { + None, + Point, + Line, + Sprite, + }; #pragma pack(push, 1) struct GSSelector { @@ -193,6 +252,7 @@ struct alignas(16) GSHWDrawConfig GSTopology topology : 2; bool expand : 1; bool iip : 1; + bool forward_primid : 1; }; u8 key; }; @@ -209,7 +269,8 @@ struct alignas(16) GSHWDrawConfig u8 tme : 1; u8 iip : 1; u8 point_size : 1; ///< Set when points need to be expanded without geometry shader. - u8 _free : 1; + VSExpand expand : 2; + u8 _free : 2; }; u8 key; }; @@ -241,7 +302,7 @@ struct alignas(16) GSHWDrawConfig // Flat/goround shading u32 iip : 1; // Pixel test - u32 date : 4; + u32 date : 3; u32 atst : 3; // Color sampling u32 fst : 1; // Investigate to do it on the VS @@ -264,10 +325,11 @@ struct alignas(16) GSHWDrawConfig u32 blend_b : 2; u32 blend_c : 2; u32 blend_d : 2; + u32 fixed_one_a : 1; u32 clr_hw : 3; u32 hdr : 1; u32 colclip : 1; - u32 blend_mix : 1; + u32 blend_mix : 2; u32 pabe : 1; u32 no_color : 1; // disables color output entirely (depth only) u32 no_color1 : 1; // disables second color output (when unnecessary) @@ -574,8 +636,8 @@ struct alignas(16) GSHWDrawConfig GSTexture* ds; ///< Depth stencil GSTexture* tex; ///< Source texture GSTexture* pal; ///< Palette texture - GSVertex* verts; ///< Vertices to draw - u32* indices; ///< Indices to draw + const GSVertex* verts;///< Vertices to draw + const u32* indices; ///< Indices to draw u32 nverts; ///< Number of vertices u32 nindices; ///< Number of indices u32 indices_per_prim; ///< Number of indices that make up one primitive @@ -626,7 +688,8 @@ public: { bool broken_point_sampler : 1; ///< Issue with AMD cards, see tfx shader for details bool geometry_shader : 1; ///< Supports geometry shader - bool image_load_store : 1; ///< Supports atomic min and max on images (for use with prim tracking destination alpha algorithm) + bool vs_expand : 1; ///< Supports expanding points/lines/sprites in the vertex shader + bool primitive_id : 1; ///< Supports primitive ID for use with prim tracking destination alpha algorithm bool texture_barrier : 1; ///< Supports sampling rt and hopefully texture barrier bool provoking_vertex_last: 1; ///< Supports using the last vertex in a primitive as the value for flat shading. bool point_expand : 1; ///< Supports point expansion in hardware without using geometry shaders. @@ -637,6 +700,7 @@ public: bool framebuffer_fetch : 1; ///< Can sample from the framebuffer without texture barriers. bool dual_source_blend : 1; ///< Can use alpha output as a blend factor. bool stencil_buffer : 1; ///< Supports stencil buffer, and can use for DATE. + bool cas_sharpening : 1; ///< Supports sufficient functionality for contrast adaptive sharpening. FeatureSupport() { memset(this, 0, sizeof(*this)); @@ -664,15 +728,20 @@ private: static const std::array m_replaceDualSrcBlendMap; protected: - static constexpr u32 MAX_POOLED_TEXTURES = 300; - - HostDisplay* m_display = nullptr; + static constexpr int NUM_INTERLACE_SHADERS = 5; + static constexpr float MAD_SENSITIVITY = 0.08f; + static constexpr u32 MAX_POOLED_TEXTURES = 300; + static constexpr u32 NUM_CAS_CONSTANTS = 12; // 8 plus src offset x/y, 16 byte alignment GSTexture* m_merge = nullptr; GSTexture* m_weavebob = nullptr; GSTexture* m_blend = nullptr; + GSTexture* m_mad = nullptr; GSTexture* m_target_tmp = nullptr; GSTexture* m_current = nullptr; + GSTexture* m_cas = nullptr; + GSTexture* m_temp_snapshot = nullptr; // No need to delete this, only ever points to m_current. + struct { size_t stride, start, count, limit; @@ -689,16 +758,20 @@ protected: GSTexture* FetchSurface(GSTexture::Type type, int width, int height, int levels, GSTexture::Format format, bool clear, bool prefer_reuse); virtual void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) = 0; - virtual void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset) = 0; + virtual void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset, int bufIdx) = 0; virtual void DoFXAA(GSTexture* sTex, GSTexture* dTex) {} virtual void DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float params[4]) {} - virtual void DoExternalFX(GSTexture* sTex, GSTexture* dTex) {} + + /// Resolves CAS shader includes for the specified source. + static bool GetCASShaderSource(std::string* source); + + /// Applies CAS and writes to the destination texture, which should be a RWTexture. + virtual bool DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) = 0; public: GSDevice(); virtual ~GSDevice(); - __fi HostDisplay* GetDisplay() const { return m_display; } __fi unsigned int GetFrameNumber() const { return m_frame; } void Recycle(GSTexture* t); @@ -719,7 +792,7 @@ public: Performance }; - virtual bool Create(HostDisplay* display); + virtual bool Create(); virtual void Destroy(); virtual void ResetAPIState(); @@ -728,9 +801,6 @@ public: virtual void BeginScene() {} virtual void EndScene(); - virtual bool HasDepthSparse() { return false; } - virtual bool HasColorSparse() { return false; } - virtual void ClearRenderTarget(GSTexture* t, const GSVector4& c) {} virtual void ClearRenderTarget(GSTexture* t, u32 c) {} virtual void InvalidateRenderTarget(GSTexture* t) {} @@ -741,11 +811,9 @@ public: virtual void PopDebugGroup() {} virtual void InsertDebugMessage(DebugMessageCategory category, const char* fmt, ...) {} - GSTexture* CreateSparseRenderTarget(int w, int h, GSTexture::Format format, bool clear = true); - GSTexture* CreateSparseDepthStencil(int w, int h, GSTexture::Format format, bool clear = true); GSTexture* CreateRenderTarget(int w, int h, GSTexture::Format format, bool clear = true); GSTexture* CreateDepthStencil(int w, int h, GSTexture::Format format, bool clear = true); - GSTexture* CreateTexture(int w, int h, bool mipmap, GSTexture::Format format, bool prefer_reuse = false); + GSTexture* CreateTexture(int w, int h, int mipmap_levels, GSTexture::Format format, bool prefer_reuse = false); GSTexture* CreateOffscreen(int w, int h, GSTexture::Format format); GSTexture::Format GetDefaultTextureFormat(GSTexture::Type type); @@ -773,13 +841,17 @@ public: __fi FeatureSupport Features() const { return m_features; } __fi GSTexture* GetCurrent() const { return m_current; } + __fi GSTexture* GetSnapshot() const { return m_temp_snapshot; } void ClearCurrent(); + void SetSnapshot(); void Merge(GSTexture* sTex[3], GSVector4* sRect, GSVector4* dRect, const GSVector2i& fs, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c); void Interlace(const GSVector2i& ds, int field, int mode, float yoffset); void FXAA(); void ShadeBoost(); - void ExternalFX(); + void Resize(int width, int height); + + void CAS(GSTexture*& tex, GSVector4i& src_rect, GSVector4& src_uv, const GSVector4& draw_rect, bool sharpen_only); bool ResizeTexture(GSTexture** t, GSTexture::Type type, int w, int h, bool clear = true, bool prefer_reuse = false); bool ResizeTexture(GSTexture** t, int w, int h, bool prefer_reuse = false); diff --git a/pcsx2/GS/Renderers/Common/GSDirtyRect.cpp b/pcsx2/GS/Renderers/Common/GSDirtyRect.cpp index 9374e7160a..fba385016d 100644 --- a/pcsx2/GS/Renderers/Common/GSDirtyRect.cpp +++ b/pcsx2/GS/Renderers/Common/GSDirtyRect.cpp @@ -23,14 +23,14 @@ GSDirtyRect::GSDirtyRect() : { } -GSDirtyRect::GSDirtyRect(const GSVector4i& r, const u32 psm, const u32 bw) : +GSDirtyRect::GSDirtyRect(GSVector4i& r, u32 psm, u32 bw) : r(r), psm(psm), bw(bw) { } -const GSVector4i GSDirtyRect::GetDirtyRect(const GIFRegTEX0& TEX0) const +GSVector4i GSDirtyRect::GetDirtyRect(GIFRegTEX0& TEX0) { GSVector4i _r; @@ -55,13 +55,13 @@ const GSVector4i GSDirtyRect::GetDirtyRect(const GIFRegTEX0& TEX0) const // -const GSVector4i GSDirtyRectList::GetDirtyRect(const GIFRegTEX0& TEX0, const GSVector2i& size) const +GSVector4i GSDirtyRectList::GetDirtyRect(GIFRegTEX0& TEX0, const GSVector2i& size) { if (!empty()) { GSVector4i r(INT_MAX, INT_MAX, 0, 0); - for (const auto& dirty_rect : *this) + for (auto& dirty_rect : *this) { r = r.runion(dirty_rect.GetDirtyRect(TEX0)); } @@ -74,9 +74,9 @@ const GSVector4i GSDirtyRectList::GetDirtyRect(const GIFRegTEX0& TEX0, const GSV return GSVector4i::zero(); } -const GSVector4i GSDirtyRectList::GetDirtyRectAndClear(const GIFRegTEX0& TEX0, const GSVector2i& size) +GSVector4i GSDirtyRectList::GetDirtyRectAndClear(GIFRegTEX0& TEX0, const GSVector2i& size) { - const GSVector4i r = GetDirtyRect(TEX0, size); + GSVector4i r = GetDirtyRect(TEX0, size); clear(); return r; } diff --git a/pcsx2/GS/Renderers/Common/GSDirtyRect.h b/pcsx2/GS/Renderers/Common/GSDirtyRect.h index 4255501c3f..4505fef267 100644 --- a/pcsx2/GS/Renderers/Common/GSDirtyRect.h +++ b/pcsx2/GS/Renderers/Common/GSDirtyRect.h @@ -20,19 +20,19 @@ class GSDirtyRect { public: - const GSVector4i r; - const u32 psm; - const u32 bw; + GSVector4i r; + u32 psm; + u32 bw; GSDirtyRect(); - GSDirtyRect(const GSVector4i& r, const u32 psm, const u32 bw); - const GSVector4i GetDirtyRect(const GIFRegTEX0& TEX0) const; + GSDirtyRect(GSVector4i& r, u32 psm, u32 bw); + GSVector4i GetDirtyRect(GIFRegTEX0& TEX0); }; class GSDirtyRectList : public std::vector { public: GSDirtyRectList() {} - const GSVector4i GetDirtyRect(const GIFRegTEX0& TEX0, const GSVector2i& size) const; - const GSVector4i GetDirtyRectAndClear(const GIFRegTEX0& TEX0, const GSVector2i& size); + GSVector4i GetDirtyRect(GIFRegTEX0& TEX0, const GSVector2i& size); + GSVector4i GetDirtyRectAndClear(GIFRegTEX0& TEX0, const GSVector2i& size); }; diff --git a/pcsx2/GS/Renderers/Common/GSFunctionMap.h b/pcsx2/GS/Renderers/Common/GSFunctionMap.h index 34c317ddf0..0c6a7615b3 100644 --- a/pcsx2/GS/Renderers/Common/GSFunctionMap.h +++ b/pcsx2/GS/Renderers/Common/GSFunctionMap.h @@ -20,8 +20,6 @@ #include "GS/Renderers/SW/GSScanlineEnvironment.h" #include "common/emitter/tools.h" -#include - template class GSFunctionMap { @@ -144,18 +142,6 @@ public: } }; -class GSCodeGenerator : public Xbyak::CodeGenerator -{ -protected: - Xbyak::util::Cpu m_cpu; - -public: - GSCodeGenerator(void* code, size_t maxsize) - : Xbyak::CodeGenerator(maxsize, code) - { - } -}; - template class GSCodeGeneratorFunctionMap : public GSFunctionMap { @@ -219,7 +205,7 @@ public: // if(iJIT_IsProfilingActive()) // always > 0 { - std::string name = format("%s<%016llx>()", m_name.c_str(), (u64)key); + std::string name = fmt::format("%s<%016llx>()", m_name.c_str(), (u64)key); iJIT_Method_Load ml; diff --git a/pcsx2/GS/Renderers/Common/GSRenderer.cpp b/pcsx2/GS/Renderers/Common/GSRenderer.cpp index 51160f8b25..105d4cccdf 100644 --- a/pcsx2/GS/Renderers/Common/GSRenderer.cpp +++ b/pcsx2/GS/Renderers/Common/GSRenderer.cpp @@ -112,8 +112,8 @@ bool GSRenderer::Merge(int field) display_baseline.x = std::min(display_offsets[i].x, display_baseline.x); display_baseline.y = std::min(display_offsets[i].y, display_baseline.y); - frame_baseline.x = std::min(fr[i].left, frame_baseline.x); - frame_baseline.y = std::min(fr[i].top, frame_baseline.y); + frame_baseline.x = std::min(std::max(fr[i].left, 0), frame_baseline.x); + frame_baseline.y = std::min(std::max(fr[i].top, 0), frame_baseline.y); display_offset |= std::abs(display_baseline.y - display_offsets[i].y) == 1; /*DevCon.Warning("Read offset was X %d(left %d) Y %d(top %d)", display_baseline.x, dr[i].left, display_baseline.y, dr[i].top); @@ -147,7 +147,8 @@ bool GSRenderer::Merge(int field) s_n++; - if (samesrc && fr[0].bottom == fr[1].bottom && !feedback_merge) + // Only need to check the right/bottom on software renderer, hardware always gets the full texture then cuts a bit out later. + if (samesrc && !feedback_merge && (GSConfig.UseHardwareRenderer() || (fr[0].right == fr[1].right && fr[0].bottom == fr[1].bottom))) { tex[0] = GetOutput(0, y_offset[0]); tex[1] = tex[0]; // saves one texture fetch @@ -178,13 +179,13 @@ bool GSRenderer::Merge(int field) float offset = is_bob ? (tex[1] ? tex[1]->GetScale().y : tex[0]->GetScale().y) : 0.0f; int field2 = 0; - int mode = 2; + int mode = 3; // FFMD (half frames) requires blend deinterlacing, so automatically use that. Same when SCANMSK is used but not blended in the merge circuit (Alpine Racer 3) if (GSConfig.InterlaceMode != GSInterlaceMode::Automatic || (!m_regs->SMODE2.FFMD && !scanmask_frame)) { - field2 = ((static_cast(GSConfig.InterlaceMode) - 1) & 1); - mode = ((static_cast(GSConfig.InterlaceMode) - 1) >> 1); + field2 = ((static_cast(GSConfig.InterlaceMode) - 2) & 1); + mode = ((static_cast(GSConfig.InterlaceMode) - 2) >> 1); } for (int i = 0; i < 2; i++) @@ -200,10 +201,19 @@ bool GSRenderer::Merge(int field) GSVector2i display_diff(display_offsets[i].x - display_baseline.x, display_offsets[i].y - display_baseline.y); GSVector2i frame_diff(fr[i].left - frame_baseline.x, fr[i].top - frame_baseline.y); + if (!GSConfig.UseHardwareRenderer()) + { + // Clear any frame offsets, we don't need them now. + fr[i].right -= fr[i].left; + fr[i].left = 0; + fr[i].bottom -= fr[i].top; + fr[i].top = 0; + } + // If using scanmsk we have to keep the single line offset, regardless of upscale // so we handle this separately after the rect calculations. float interlace_offset = 0.0f; - + if ((!GSConfig.PCRTCAntiBlur || m_scanmask_used) && display_offset) { interlace_offset = static_cast(display_diff.y & 1); @@ -233,11 +243,15 @@ bool GSRenderer::Merge(int field) if (display_diff.y < 4) off.y -= display_diff.y; - // Offset by DISPFB setting - if (frame_diff.x == 1) - off.x += 1; - if (frame_diff.y == 1) - off.y += 1; + // Only functional in HW mode, software clips/positions the framebuffer on read. + if (GSConfig.UseHardwareRenderer()) + { + // Offset by DISPFB setting + if (abs(frame_diff.x) < 4) + off.x += frame_diff.x; + if (abs(frame_diff.y) < 4) + off.y += frame_diff.y; + } } } } @@ -252,8 +266,8 @@ bool GSRenderer::Merge(int field) if (display_diff.y >= 4 || !GSConfig.PCRTCAntiBlur) off.y = display_diff.y; - - if (samesrc) + // Need to check if only circuit 2 is enabled. Stuntman toggles circuit 1 on and off every other frame. + if (samesrc || m_regs->PMODE.EN == 2) { // Adjusting the screen offset when using a negative offset. const int videomode = static_cast(GetVideoMode()) - 1; @@ -283,14 +297,14 @@ bool GSRenderer::Merge(int field) off.y += display_baseline.y; // Anti-Blur stuff - if (GSConfig.PCRTCAntiBlur) + // Only functional in HW mode, software clips/positions the framebuffer on read. + if (GSConfig.PCRTCAntiBlur && GSConfig.UseHardwareRenderer()) { // Offset by DISPFB setting - if (frame_diff.x == 1) - off.x += 1; - - if (frame_diff.y == 1) - off.y += 1; + if (abs(frame_diff.x) < 4) + off.x += frame_diff.x; + if (abs(frame_diff.y) < 4) + off.y += frame_diff.y; } } } @@ -312,7 +326,7 @@ bool GSRenderer::Merge(int field) if (m_regs->SMODE2.FFMD && !is_bob && !GSConfig.DisableInterlaceOffset && GSConfig.InterlaceMode != GSInterlaceMode::Off) { // We do half because FFMD is a half sized framebuffer, then we offset by 1 in the shader for the actual interlace - if(GetUpscaleMultiplier() > 1) + if(GetUpscaleMultiplier() > 1.0f) interlace_offset += ((((tex[1] ? tex[1]->GetScale().y : tex[0]->GetScale().y) + 0.5f) * 0.5f) - 1.0f) * static_cast(field ^ field2); offset = 1.0f; } @@ -339,7 +353,7 @@ bool GSRenderer::Merge(int field) GSVector2i max_resolution = GetResolution(); resolution.x = display_combined.x - display_baseline.x; resolution.y = display_combined.y - display_baseline.y; - + if (isinterlaced() && m_regs->SMODE2.FFMD) { resolution.y >>= 1; @@ -349,45 +363,47 @@ bool GSRenderer::Merge(int field) resolution.y = std::min(max_resolution.y, resolution.y); } - fs = resolution * GSVector2i(GetUpscaleMultiplier()); + fs = GSVector2i(static_cast(static_cast(resolution.x) * GetUpscaleMultiplier()), + static_cast(static_cast(resolution.y) * GetUpscaleMultiplier())); ds = fs; // When interlace(FRAME) mode, the rect is half height, so it needs to be stretched. - if (m_regs->SMODE2.INT && m_regs->SMODE2.FFMD) + const bool is_interlaced_resolution = m_regs->SMODE2.INT || (isReallyInterlaced() && IsAnalogue() && GSConfig.InterlaceMode != GSInterlaceMode::Off); + + if (is_interlaced_resolution && m_regs->SMODE2.FFMD) ds.y *= 2; - m_real_size = ds; + m_real_size = GSVector2i(fs.x, is_interlaced_resolution ? ds.y : fs.y); - if (tex[0] || tex[1]) + if (!tex[0] && !tex[1]) + return false; + + if ((tex[0] == tex[1]) && (src_out_rect[0] == src_out_rect[1]).alltrue() && (dst[0] == dst[1]).alltrue() && !feedback_merge && !slbg) { - if ((tex[0] == tex[1]) && (src_out_rect[0] == src_out_rect[1]).alltrue() && (dst[0] == dst[1]).alltrue() && !feedback_merge && !slbg) - { - // the two outputs are identical, skip drawing one of them (the one that is alpha blended) + // the two outputs are identical, skip drawing one of them (the one that is alpha blended) - tex[0] = NULL; - } + tex[0] = NULL; + } - GSVector4 c = GSVector4((int)m_regs->BGCOLOR.R, (int)m_regs->BGCOLOR.G, (int)m_regs->BGCOLOR.B, (int)m_regs->PMODE.ALP) / 255; + GSVector4 c = GSVector4((int)m_regs->BGCOLOR.R, (int)m_regs->BGCOLOR.G, (int)m_regs->BGCOLOR.B, (int)m_regs->PMODE.ALP) / 255; - g_gs_device->Merge(tex, src_gs_read, dst, fs, m_regs->PMODE, m_regs->EXTBUF, c); + g_gs_device->Merge(tex, src_gs_read, dst, fs, m_regs->PMODE, m_regs->EXTBUF, c); - if (isReallyInterlaced() && GSConfig.InterlaceMode != GSInterlaceMode::Off) - g_gs_device->Interlace(ds, field ^ field2, mode, offset); + if (isReallyInterlaced() && GSConfig.InterlaceMode != GSInterlaceMode::Off) + g_gs_device->Interlace(ds, field ^ field2, mode, offset); - if (GSConfig.ShadeBoost) - { - g_gs_device->ShadeBoost(); - } + if (GSConfig.ShadeBoost) + g_gs_device->ShadeBoost(); - if (GSConfig.ShaderFX) - { - g_gs_device->ExternalFX(); - } + if (GSConfig.FXAA) + g_gs_device->FXAA(); - if (GSConfig.FXAA) - { - g_gs_device->FXAA(); - } + g_gs_device->SetSnapshot(); + + // Sharpens biinear at lower resolutions, almost nearest but with more uniform pixels. + if (GSConfig.LinearPresent == GSPostBilinearMode::BilinearSharp && (g_host_display->GetWindowWidth() > fs.x || g_host_display->GetWindowHeight() > fs.y)) + { + g_gs_device->Resize(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight()); } if (m_scanmask_used) @@ -407,7 +423,7 @@ static float GetCurrentAspectRatioFloat(bool is_progressive) return ars[static_cast(GSConfig.AspectRatio) + (3u * (is_progressive && GSConfig.AspectRatio == AspectRatioType::RAuto4_3_3_2))]; } -static GSVector4 CalculateDrawRect(s32 window_width, s32 window_height, s32 texture_width, s32 texture_height, HostDisplay::Alignment alignment, bool flip_y, bool is_progressive) +static GSVector4 CalculateDrawDstRect(s32 window_width, s32 window_height, const GSVector4i& src_rect, const GSVector2i& src_size, HostDisplay::Alignment alignment, bool flip_y, bool is_progressive) { const float f_width = static_cast(window_width); const float f_height = static_cast(window_height); @@ -428,7 +444,10 @@ static GSVector4 CalculateDrawRect(s32 window_width, s32 window_height, s32 text else if (EmuConfig.CurrentAspectRatio == AspectRatioType::R16_9) targetAr = 16.0f / 9.0f; - const double arr = targetAr / clientAr; + const float crop_adjust = (static_cast(src_rect.width()) / static_cast(src_size.x)) / + (static_cast(src_rect.height()) / static_cast(src_size.y)); + + const double arr = (targetAr * crop_adjust) / clientAr; float target_width = f_width; float target_height = f_height; if (arr < 1) @@ -446,8 +465,8 @@ static GSVector4 CalculateDrawRect(s32 window_width, s32 window_height, s32 text if (GSConfig.IntegerScaling) { // make target width/height an integer multiple of the texture width/height - const float t_width = static_cast(texture_width); - const float t_height = static_cast(texture_height); + const float t_width = static_cast(src_rect.width()); + const float t_height = static_cast(src_rect.height()); float scale; if ((t_width / t_height) >= 1.0) @@ -505,9 +524,11 @@ static GSVector4 CalculateDrawRect(s32 window_width, s32 window_height, s32 text } } +#ifndef PCSX2_CORE const float unit = .01f * std::min(target_x, target_y); target_x += unit * GSConfig.OffsetX; target_y += unit * GSConfig.OffsetY; +#endif GSVector4 ret(target_x, target_y, target_x + target_width, target_y + target_height); @@ -521,9 +542,24 @@ static GSVector4 CalculateDrawRect(s32 window_width, s32 window_height, s32 text return ret; } +static GSVector4i CalculateDrawSrcRect(const GSTexture* src) +{ +#ifndef PCSX2_CORE + return GSVector4i(0, 0, src->GetWidth(), src->GetHeight()); +#else + const float upscale = GSConfig.UpscaleMultiplier; + const GSVector2i size(src->GetSize()); + const int left = static_cast(static_cast(GSConfig.Crop[0]) * upscale); + const int top = static_cast(static_cast(GSConfig.Crop[1]) * upscale); + const int right = size.x - static_cast(static_cast(GSConfig.Crop[2]) * upscale); + const int bottom = size.y - static_cast(static_cast(GSConfig.Crop[3]) * upscale); + return GSVector4i(left, top, right, bottom); +#endif +} + void GSRenderer::VSync(u32 field, bool registers_written) { - Flush(); + Flush(GSFlushReason::VSYNC); if (s_dump && s_n >= s_saven) { @@ -569,7 +605,7 @@ void GSRenderer::VSync(u32 field, bool registers_written) if (Host::BeginPresentFrame(true)) Host::EndPresentFrame(); g_gs_device->RestoreAPIState(); - PerformanceMetrics::Update(registers_written, fb_sprite_frame); + PerformanceMetrics::Update(registers_written, fb_sprite_frame, true); return; } @@ -579,30 +615,47 @@ void GSRenderer::VSync(u32 field, bool registers_written) if ((g_perfmon.GetFrame() & 0x1f) == 0) g_perfmon.Update(); + // Little bit ugly, but we can't do CAS inside the render pass. + GSVector4i src_rect; + GSVector4 src_uv, draw_rect; + GSTexture* current = g_gs_device->GetCurrent(); + if (current && !blank_frame) + { + src_rect = CalculateDrawSrcRect(current); + src_uv = GSVector4(src_rect) / GSVector4(current->GetSize()).xyxy(); + draw_rect = CalculateDrawDstRect(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight(), + src_rect, current->GetSize(), g_host_display->GetDisplayAlignment(), g_host_display->UsesLowerLeftOrigin(), + GetVideoMode() == GSVideoMode::SDTV_480P || (GSConfig.PCRTCOverscan && GSConfig.PCRTCOffsets)); + + if (GSConfig.CASMode != GSCASMode::Disabled && g_gs_device->Features().cas_sharpening) + { + // sharpen only if the IR is higher than the display resolution + const bool sharpen_only = (GSConfig.CASMode == GSCASMode::SharpenOnly || + (current->GetWidth() > g_host_display->GetWindowWidth() && + current->GetHeight() > g_host_display->GetWindowHeight())); + g_gs_device->CAS(current, src_rect, src_uv, draw_rect, sharpen_only); + } + } + g_gs_device->ResetAPIState(); if (Host::BeginPresentFrame(false)) { - GSTexture* current = g_gs_device->GetCurrent(); if (current && !blank_frame) { - HostDisplay* const display = g_gs_device->GetDisplay(); - const GSVector4 draw_rect(CalculateDrawRect(display->GetWindowWidth(), display->GetWindowHeight(), - current->GetWidth(), current->GetHeight(), display->GetDisplayAlignment(), display->UsesLowerLeftOrigin(), GetVideoMode() == GSVideoMode::SDTV_480P || (GSConfig.PCRTCOverscan && GSConfig.PCRTCOffsets))); - const u64 current_time = Common::Timer::GetCurrentValue(); const float shader_time = static_cast(Common::Timer::ConvertValueToSeconds(current_time - m_shader_time_start)); - g_gs_device->PresentRect(current, GSVector4(0, 0, 1, 1), nullptr, draw_rect, - s_tv_shader_indices[GSConfig.TVShader], shader_time, GSConfig.LinearPresent); + g_gs_device->PresentRect(current, src_uv, nullptr, draw_rect, + s_tv_shader_indices[GSConfig.TVShader], shader_time, GSConfig.LinearPresent != GSPostBilinearMode::Off); } Host::EndPresentFrame(); if (GSConfig.OsdShowGPU) - PerformanceMetrics::OnGPUPresent(Host::GetHostDisplay()->GetAndResetAccumulatedGPUTime()); + PerformanceMetrics::OnGPUPresent(g_host_display->GetAndResetAccumulatedGPUTime()); } g_gs_device->RestoreAPIState(); - PerformanceMetrics::Update(registers_written, fb_sprite_frame); + PerformanceMetrics::Update(registers_written, fb_sprite_frame, false); // snapshot // wx is dumb and call this from the UI thread... @@ -655,20 +708,20 @@ void GSRenderer::VSync(u32 field, bool registers_written) Host::AddKeyedOSDMessage("GSDump", fmt::format("Saving {0} GS dump {1} to '{2}'", (m_dump_frames == 1) ? "single frame" : "multi-frame", compression_str, - Path::GetFileName(m_dump->GetPath())), 10.0f); + Path::GetFileName(m_dump->GetPath())), Host::OSD_INFO_DURATION); } - if (GSTexture* t = g_gs_device->GetCurrent()) + if (GSTexture* t = g_gs_device->GetSnapshot()) { const std::string path(m_snapshot + ".png"); if (t->Save(path)) { Host::AddKeyedOSDMessage("GSScreenshot", - fmt::format("Screenshot saved to '{}'.", Path::GetFileName(path)), 10.0f); + fmt::format("Screenshot saved to '{}'.", Path::GetFileName(path)), Host::OSD_INFO_DURATION); } else { - Host::AddFormattedOSDMessage(10.0f, "Failed to save screenshot to '%s'.", path.c_str()); + Host::AddFormattedOSDMessage(Host::OSD_ERROR_DURATION, "Failed to save screenshot to '%s'.", path.c_str()); } } @@ -679,7 +732,7 @@ void GSRenderer::VSync(u32 field, bool registers_written) const bool last = (m_dump_frames == 0); if (m_dump->VSync(field, last, m_regs)) { - Host::AddKeyedOSDMessage("GSDump", fmt::format("Saved GS dump to '{}'.", Path::GetFileName(m_dump->GetPath())), 10.0f); + Host::AddKeyedOSDMessage("GSDump", fmt::format("Saved GS dump to '{}'.", Path::GetFileName(m_dump->GetPath())), Host::OSD_INFO_DURATION); m_dump.reset(); } else if (!last) @@ -725,6 +778,23 @@ void GSRenderer::QueueSnapshot(const std::string& path, u32 gsdump_frames) } else { + m_snapshot = ""; + + // append the game serial and title + if (std::string name(GetDumpName()); !name.empty()) + { + Path::SanitizeFileName(&name); + if (name.length() > 219) + name.resize(219); + m_snapshot += name; + } + if (std::string serial(GetDumpSerial()); !serial.empty()) + { + Path::SanitizeFileName(&serial); + m_snapshot += '_'; + m_snapshot += serial; + } + time_t cur_time = time(nullptr); char local_time[16]; @@ -737,30 +807,18 @@ void GSRenderer::QueueSnapshot(const std::string& path, u32 gsdump_frames) // the captured image is the 2nd image captured at this specific time. static int n = 2; + m_snapshot += '_'; + if (cur_time == prev_snap) - m_snapshot = fmt::format("gs_{0}_({1})", local_time, n++); + m_snapshot += fmt::format("{0}_({1})", local_time, n++); else { n = 2; - m_snapshot = fmt::format("gs_{}", local_time); + m_snapshot += fmt::format("{}", local_time); } prev_snap = cur_time; } - // append the game serial and title - if (std::string name(GetDumpName()); !name.empty()) - { - Path::SanitizeFileName(name); - m_snapshot += '_'; - m_snapshot += name; - } - if (std::string serial(GetDumpSerial()); !serial.empty()) - { - Path::SanitizeFileName(serial); - m_snapshot += '_'; - m_snapshot += serial; - } - // prepend snapshots directory m_snapshot = Path::Combine(EmuFolders::Snapshots, m_snapshot); } @@ -785,15 +843,17 @@ void GSRenderer::PresentCurrentFrame() GSTexture* current = g_gs_device->GetCurrent(); if (current) { - HostDisplay* const display = g_gs_device->GetDisplay(); - const GSVector4 draw_rect(CalculateDrawRect(display->GetWindowWidth(), display->GetWindowHeight(), - current->GetWidth(), current->GetHeight(), display->GetDisplayAlignment(), display->UsesLowerLeftOrigin(), GetVideoMode() == GSVideoMode::SDTV_480P || (GSConfig.PCRTCOverscan && GSConfig.PCRTCOffsets))); + const GSVector4i src_rect(CalculateDrawSrcRect(current)); + const GSVector4 src_uv(GSVector4(src_rect) / GSVector4(current->GetSize()).xyxy()); + const GSVector4 draw_rect(CalculateDrawDstRect(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight(), + src_rect, current->GetSize(), g_host_display->GetDisplayAlignment(), g_host_display->UsesLowerLeftOrigin(), + GetVideoMode() == GSVideoMode::SDTV_480P || (GSConfig.PCRTCOverscan && GSConfig.PCRTCOffsets))); const u64 current_time = Common::Timer::GetCurrentValue(); const float shader_time = static_cast(Common::Timer::ConvertValueToSeconds(current_time - m_shader_time_start)); - g_gs_device->PresentRect(current, GSVector4(0, 0, 1, 1), nullptr, draw_rect, - s_tv_shader_indices[GSConfig.TVShader], shader_time, GSConfig.LinearPresent); + g_gs_device->PresentRect(current, src_uv, nullptr, draw_rect, + s_tv_shader_indices[GSConfig.TVShader], shader_time, GSConfig.LinearPresent != GSPostBilinearMode::Off); } Host::EndPresentFrame(); @@ -873,14 +933,9 @@ void GSRenderer::KeyEvent(const HostKeyEvent& e) { case VK_F5: GSConfig.InterlaceMode = static_cast((static_cast(GSConfig.InterlaceMode) + static_cast(GSInterlaceMode::Count) + step) % static_cast(GSInterlaceMode::Count)); - theApp.SetConfig("deinterlace", static_cast(GSConfig.InterlaceMode)); + theApp.SetConfig("deinterlace_mode", static_cast(GSConfig.InterlaceMode)); printf("GS: Set deinterlace mode to %d (%s).\n", static_cast(GSConfig.InterlaceMode), theApp.m_gs_deinterlace.at(static_cast(GSConfig.InterlaceMode)).name.c_str()); return; - case VK_DELETE: - GSConfig.AA1 = !GSConfig.AA1; - theApp.SetConfig("aa1", GSConfig.AA1); - printf("GS: (Software) Edge anti-aliasing is now %s.\n", GSConfig.AA1 ? "enabled" : "disabled"); - return; case VK_NEXT: // As requested by Prafull, to be removed later char dither_msg[3][16] = {"disabled", "auto", "auto unscaled"}; GSConfig.Dithering = (GSConfig.Dithering + 1) % 3; @@ -907,7 +962,9 @@ bool GSRenderer::SaveSnapshotToMemory(u32 width, u32 height, std::vector* p if (!current) return false; - GSVector4 draw_rect(CalculateDrawRect(width, height, current->GetWidth(), current->GetHeight(), + const GSVector4i src_rect(CalculateDrawSrcRect(current)); + const GSVector4 src_uv(GSVector4(src_rect) / GSVector4(current->GetSize()).xyxy()); + GSVector4 draw_rect(CalculateDrawDstRect(width, height, src_rect, current->GetSize(), HostDisplay::Alignment::LeftOrTop, false, GetVideoMode() == GSVideoMode::SDTV_480P || (GSConfig.PCRTCOverscan && GSConfig.PCRTCOffsets))); u32 draw_width = static_cast(draw_rect.z - draw_rect.x); u32 draw_height = static_cast(draw_rect.w - draw_rect.y); @@ -926,7 +983,7 @@ bool GSRenderer::SaveSnapshotToMemory(u32 width, u32 height, std::vector* p GSTexture::GSMap map; const bool result = g_gs_device->DownloadTextureConvert( - current, GSVector4(0.0f, 0.0f, 1.0f, 1.0f), + current, src_uv, GSVector2i(draw_width, draw_height), GSTexture::Format::Color, ShaderConvert::COPY, map, true); if (result) diff --git a/pcsx2/GS/Renderers/Common/GSRenderer.h b/pcsx2/GS/Renderers/Common/GSRenderer.h index faa601891f..a76f23ec06 100644 --- a/pcsx2/GS/Renderers/Common/GSRenderer.h +++ b/pcsx2/GS/Renderers/Common/GSRenderer.h @@ -59,7 +59,7 @@ public: virtual void VSync(u32 field, bool registers_written); virtual bool CanUpscale() { return false; } - virtual int GetUpscaleMultiplier() { return 1; } + virtual float GetUpscaleMultiplier() { return 1.0f; } virtual GSVector2 GetTextureScaleFactor() { return { 1.0f, 1.0f }; } GSVector2i GetInternalResolution(); @@ -79,4 +79,4 @@ public: #endif }; -extern std::unique_ptr g_gs_renderer; \ No newline at end of file +extern std::unique_ptr g_gs_renderer; diff --git a/pcsx2/GS/Renderers/Common/GSTexture.cpp b/pcsx2/GS/Renderers/Common/GSTexture.cpp index a477d659eb..41e0075c54 100644 --- a/pcsx2/GS/Renderers/Common/GSTexture.cpp +++ b/pcsx2/GS/Renderers/Common/GSTexture.cpp @@ -22,13 +22,10 @@ GSTexture::GSTexture() : m_scale(1, 1) , m_size(0, 0) - , m_committed_size(0, 0) - , m_gpu_page_size(0, 0) , m_mipmap_levels(0) , m_type(Type::Invalid) , m_format(Format::Invalid) , m_state(State::Dirty) - , m_sparse(false) , m_needs_mipmaps_generated(true) , last_frame_used(0) , OffsetHack_modxy(0.0f) @@ -73,12 +70,10 @@ void GSTexture::Swap(GSTexture* tex) { std::swap(m_scale, tex->m_scale); std::swap(m_size, tex->m_size); - std::swap(m_committed_size, tex->m_committed_size); std::swap(m_mipmap_levels, tex->m_mipmap_levels); std::swap(m_type, tex->m_type); std::swap(m_format, tex->m_format); std::swap(m_state, tex->m_state); - std::swap(m_sparse, tex->m_sparse); std::swap(m_needs_mipmaps_generated, tex->m_needs_mipmaps_generated); std::swap(last_frame_used, tex->last_frame_used); std::swap(OffsetHack_modxy, tex->OffsetHack_modxy); @@ -89,7 +84,7 @@ u32 GSTexture::GetCompressedBytesPerBlock() const static constexpr u32 bytes_per_block[] = { 1, // Invalid 4, // Color/RGBA8 - 16, // FloatColor/RGBA32F + 8, // HDRColor/RGBA16 32, // DepthStencil 1, // UNorm8/R8 2, // UInt16/R16UI @@ -133,55 +128,3 @@ void GSTexture::GenerateMipmapsIfNeeded() m_needs_mipmaps_generated = false; GenerateMipmap(); } - -void GSTexture::CommitRegion(const GSVector2i& region) -{ - if (!m_sparse) - return; - - GSVector2i aligned_region = RoundUpPage(region); - aligned_region.x = std::max(m_committed_size.x, aligned_region.x); - aligned_region.y = std::max(m_committed_size.y, aligned_region.y); - if (aligned_region != m_committed_size) - CommitPages(aligned_region, true); -} - -void GSTexture::Commit() -{ - if (!m_sparse) - return; - - if (m_committed_size != m_size) - CommitPages(m_size, true); -} - -void GSTexture::Uncommit() -{ - if (!m_sparse) - return; - - GSVector2i zero = GSVector2i(0, 0); - - if (m_committed_size != zero) - CommitPages(m_committed_size, false); -} - -void GSTexture::SetGpuPageSize(const GSVector2i& page_size) -{ - pxAssert(std::bitset<32>(page_size.x + 1).count() == 1); - pxAssert(std::bitset<32>(page_size.y + 1).count() == 1); - - m_gpu_page_size = page_size; -} - -GSVector2i GSTexture::RoundUpPage(GSVector2i v) -{ - v.x = std::min(m_size.x, v.x); - v.y = std::min(m_size.y, v.y); - v.x += m_gpu_page_size.x; - v.y += m_gpu_page_size.y; - v.x &= ~m_gpu_page_size.x; - v.y &= ~m_gpu_page_size.y; - - return v; -} diff --git a/pcsx2/GS/Renderers/Common/GSTexture.h b/pcsx2/GS/Renderers/Common/GSTexture.h index 66fdf8e735..30aa682b70 100644 --- a/pcsx2/GS/Renderers/Common/GSTexture.h +++ b/pcsx2/GS/Renderers/Common/GSTexture.h @@ -33,15 +33,14 @@ public: DepthStencil, Texture, Offscreen, - SparseRenderTarget, - SparseDepthStencil, + RWTexture, }; enum class Format : u8 { Invalid = 0, ///< Used for initialization Color, ///< Standard (RGBA8) color texture - FloatColor, ///< Float-based color texture for colclip emulation (RGBA32F) + HDRColor, ///< Color texture with more bits for colclip emulation (RGBA16Unorm) DepthStencil, ///< Depth stencil texture UNorm8, ///< A8UNorm texture for paletted textures and the OSD font UInt16, ///< UInt16 texture for reading back 16-bit depth @@ -63,25 +62,16 @@ public: protected: GSVector2 m_scale; GSVector2i m_size; - GSVector2i m_committed_size; - GSVector2i m_gpu_page_size; int m_mipmap_levels; Type m_type; Format m_format; State m_state; - bool m_sparse; bool m_needs_mipmaps_generated; public: GSTexture(); virtual ~GSTexture() {} - virtual operator bool() - { - pxAssert(0); - return false; - } - // Returns the native handle of a texture. virtual void* GetNativeHandle() const = 0; @@ -113,16 +103,15 @@ public: bool IsRenderTargetOrDepthStencil() const { - return (m_type >= Type::RenderTarget && m_type <= Type::DepthStencil) || - (m_type >= Type::SparseRenderTarget && m_type <= Type::SparseDepthStencil); + return (m_type >= Type::RenderTarget && m_type <= Type::DepthStencil); } bool IsRenderTarget() const { - return (m_type == Type::RenderTarget || m_type == Type::SparseRenderTarget); + return (m_type == Type::RenderTarget); } bool IsDepthStencil() const { - return (m_type == Type::DepthStencil || m_type == Type::SparseDepthStencil); + return (m_type == Type::DepthStencil); } State GetState() const { return m_state; } @@ -131,14 +120,6 @@ public: void GenerateMipmapsIfNeeded(); void ClearMipmapGenerationFlag() { m_needs_mipmaps_generated = false; } - virtual void CommitPages(const GSVector2i& region, bool commit) {} - void CommitRegion(const GSVector2i& region); - void Commit(); - void Uncommit(); - GSVector2i GetCommittedSize() const { return m_committed_size; } - void SetGpuPageSize(const GSVector2i& page_size); - GSVector2i RoundUpPage(GSVector2i v); - // frame number (arbitrary base) the texture was recycled on // different purpose than texture cache ages, do not attempt to merge unsigned last_frame_used; @@ -146,7 +127,7 @@ public: float OffsetHack_modxy; // Typical size of a RGBA texture - virtual u32 GetMemUsage() { return m_size.x * m_size.y * (m_format == Format::UNorm8 ? 1 : 4); } + u32 GetMemUsage() const { return m_size.x * m_size.y * (m_format == Format::UNorm8 ? 1 : 4); } // Helper routines for formats/types static bool IsCompressedFormat(Format format) { return (format >= Format::BC1 && format <= Format::BC7); } diff --git a/pcsx2/GS/Renderers/Common/GSVertexTrace.cpp b/pcsx2/GS/Renderers/Common/GSVertexTrace.cpp index 110a705e10..8062dd0a3a 100644 --- a/pcsx2/GS/Renderers/Common/GSVertexTrace.cpp +++ b/pcsx2/GS/Renderers/Common/GSVertexTrace.cpp @@ -17,36 +17,13 @@ #include "GSVertexTrace.h" #include "GS/GSUtil.h" #include "GS/GSState.h" -#include - -CONSTINIT const GSVector4 GSVertexTrace::s_minmax = GSVector4::cxpr(FLT_MAX, -FLT_MAX, 0.f, 0.f); GSVertexTrace::GSVertexTrace(const GSState* state, bool provoking_vertex_first) : m_accurate_stq(false), m_state(state), m_primclass(GS_INVALID_CLASS) { memset(&m_alpha, 0, sizeof(m_alpha)); - #define InitUpdate3(P, IIP, TME, FST, COLOR) \ - m_fmm[COLOR][FST][TME][IIP][P] = \ - provoking_vertex_first ? &GSVertexTrace::FindMinMax : \ - &GSVertexTrace::FindMinMax; - - #define InitUpdate2(P, IIP, TME) \ - InitUpdate3(P, IIP, TME, 0, 0) \ - InitUpdate3(P, IIP, TME, 0, 1) \ - InitUpdate3(P, IIP, TME, 1, 0) \ - InitUpdate3(P, IIP, TME, 1, 1) \ - - #define InitUpdate(P) \ - InitUpdate2(P, 0, 0) \ - InitUpdate2(P, 0, 1) \ - InitUpdate2(P, 1, 0) \ - InitUpdate2(P, 1, 1) \ - - InitUpdate(GS_POINT_CLASS); - InitUpdate(GS_LINE_CLASS); - InitUpdate(GS_TRIANGLE_CLASS); - InitUpdate(GS_SPRITE_CLASS); + MULTI_ISA_SELECT(GSVertexTracePopulateFunctions)(*this, provoking_vertex_first); } void GSVertexTrace::Update(const void* vertex, const u32* index, int v_count, int i_count, GS_PRIM_CLASS primclass) @@ -61,7 +38,7 @@ void GSVertexTrace::Update(const void* vertex, const u32* index, int v_count, in u32 fst = m_state->PRIM->FST; u32 color = !(m_state->PRIM->TME && m_state->m_context->TEX0.TFX == TFX_DECAL && m_state->m_context->TEX0.TCC); - (this->*m_fmm[color][fst][tme][iip][primclass])(vertex, index, i_count); + m_fmm[color][fst][tme][iip][primclass](*this, vertex, index, i_count); // Potential float overflow detected. Better uses the slower division instead // Note: If Q is too big, 1/Q will end up as 0. 1e30 is a random number @@ -153,197 +130,6 @@ void GSVertexTrace::Update(const void* vertex, const u32* index, int v_count, in } } -template -void GSVertexTrace::FindMinMax(const void* vertex, const u32* index, int count) -{ - const GSDrawingContext* context = m_state->m_context; - - int n = 1; - - switch (primclass) - { - case GS_POINT_CLASS: - n = 1; - break; - case GS_LINE_CLASS: - case GS_SPRITE_CLASS: - n = 2; - break; - case GS_TRIANGLE_CLASS: - n = 3; - break; - } - - GSVector4 tmin = s_minmax.xxxx(); - GSVector4 tmax = s_minmax.yyyy(); - GSVector4i cmin = GSVector4i::xffffffff(); - GSVector4i cmax = GSVector4i::zero(); - - GSVector4i pmin = GSVector4i::xffffffff(); - GSVector4i pmax = GSVector4i::zero(); - - const GSVertex* RESTRICT v = (GSVertex*)vertex; - - // Process 2 vertices at a time for increased efficiency - auto processVertices = [&](const GSVertex& v0, const GSVertex& v1, bool finalVertex) - { - if (color) - { - GSVector4i c0 = GSVector4i::load(v0.RGBAQ.U32[0]); - GSVector4i c1 = GSVector4i::load(v1.RGBAQ.U32[0]); - if (iip || finalVertex) - { - cmin = cmin.min_u8(c0.min_u8(c1)); - cmax = cmax.max_u8(c0.max_u8(c1)); - } - else if (n == 2) - { - // For even n, we process v1 and v2 of the same prim - // (For odd n, we process one vertex from each of two prims) - cmin = cmin.min_u8(c1); - cmax = cmax.max_u8(c1); - } - } - - if (tme) - { - if (!fst) - { - GSVector4 stq0 = GSVector4::cast(GSVector4i(v0.m[0])); - GSVector4 stq1 = GSVector4::cast(GSVector4i(v1.m[0])); - - GSVector4 q; - // Sprites always have indices == vertices, so we don't have to look at the index table here - if (primclass == GS_SPRITE_CLASS) - q = stq1.wwww(); - else - q = stq0.wwww(stq1); - - // Note: If in the future this is changed in a way that causes parts of calculations to go unused, - // make sure to remove the z (rgba) field as it's often denormal. - // Then, use GSVector4::noopt() to prevent clang from optimizing out your "useless" shuffle - // e.g. stq = (stq.xyww() / stq.wwww()).noopt().xyww(stq); - GSVector4 st = stq0.xyxy(stq1) / q; - - stq0 = st.xyww(primclass == GS_SPRITE_CLASS ? stq1 : stq0); - stq1 = st.zwww(stq1); - - tmin = tmin.min(stq0.min(stq1)); - tmax = tmax.max(stq0.max(stq1)); - } - else - { - GSVector4i uv0(v0.m[1]); - GSVector4i uv1(v1.m[1]); - - GSVector4 st0 = GSVector4(uv0.uph16()).xyxy(); - GSVector4 st1 = GSVector4(uv1.uph16()).xyxy(); - - tmin = tmin.min(st0.min(st1)); - tmax = tmax.max(st0.max(st1)); - } - } - - GSVector4i xyzf0(v0.m[1]); - GSVector4i xyzf1(v1.m[1]); - - GSVector4i xy0 = xyzf0.upl16(); - GSVector4i z0 = xyzf0.yyyy(); - GSVector4i xy1 = xyzf1.upl16(); - GSVector4i z1 = xyzf1.yyyy(); - - GSVector4i p0 = xy0.blend16<0xf0>(z0.uph32(primclass == GS_SPRITE_CLASS ? xyzf1 : xyzf0)); - GSVector4i p1 = xy1.blend16<0xf0>(z1.uph32(xyzf1)); - - pmin = pmin.min_u32(p0.min_u32(p1)); - pmax = pmax.max_u32(p0.max_u32(p1)); - }; - - if (n == 2) - { - for (int i = 0; i < count; i += 2) - { - processVertices(v[index[i + 0]], v[index[i + 1]], false); - } - } - else if (iip || n == 1) // iip means final and non-final vertexes are treated the same - { - int i = 0; - for (; i < (count - 1); i += 2) // 2x loop unroll - { - processVertices(v[index[i + 0]], v[index[i + 1]], true); - } - if (count & 1) - { - // Compiler optimizations go! - // (And if they don't, it's only one vertex out of many) - processVertices(v[index[i]], v[index[i]], true); - } - } - else if (n == 3) - { - int i = 0; - for (; i < (count - 3); i += 6) - { - processVertices(v[index[i + 0]], v[index[i + 3]], flat_swapped); - processVertices(v[index[i + 1]], v[index[i + 4]], false); - processVertices(v[index[i + 2]], v[index[i + 5]], !flat_swapped); - } - if (count & 1) - { - processVertices(v[index[i + 0]], v[index[i + 1]], flat_swapped); - // Compiler optimizations go! - // (And if they don't, it's only one vertex out of many) - processVertices(v[index[i + 2]], v[index[i + 2]], !flat_swapped); - } - } - else - { - pxAssertRel(0, "Bad n value"); - } - - GSVector4 o(context->XYOFFSET); - GSVector4 s(1.0f / 16, 1.0f / 16, 2.0f, 1.0f); - - m_min.p = (GSVector4(pmin) - o) * s; - m_max.p = (GSVector4(pmax) - o) * s; - - // Fix signed int conversion - m_min.p = m_min.p.insert32<0, 2>(GSVector4::load((float)(u32)pmin.extract32<2>())); - m_max.p = m_max.p.insert32<0, 2>(GSVector4::load((float)(u32)pmax.extract32<2>())); - - if (tme) - { - if (fst) - { - s = GSVector4(1.0f / 16, 1.0f).xxyy(); - } - else - { - s = GSVector4(1 << context->TEX0.TW, 1 << context->TEX0.TH, 1, 1); - } - - m_min.t = tmin * s; - m_max.t = tmax * s; - } - else - { - m_min.t = GSVector4::zero(); - m_max.t = GSVector4::zero(); - } - - if (color) - { - m_min.c = cmin.u8to32(); - m_max.c = cmax.u8to32(); - } - else - { - m_min.c = GSVector4i::zero(); - m_max.c = GSVector4i::zero(); - } -} - void GSVertexTrace::CorrectDepthTrace(const void* vertex, int count) { if (m_eq.z == 0) diff --git a/pcsx2/GS/Renderers/Common/GSVertexTrace.h b/pcsx2/GS/Renderers/Common/GSVertexTrace.h index 688b02710d..a9c62c773c 100644 --- a/pcsx2/GS/Renderers/Common/GSVertexTrace.h +++ b/pcsx2/GS/Renderers/Common/GSVertexTrace.h @@ -17,15 +17,22 @@ #include "GS/GS.h" #include "GS/GSDrawingContext.h" +#include "GS/MultiISA.h" #include "GSVertex.h" #include "GS/Renderers/SW/GSVertexSW.h" #include "GS/Renderers/HW/GSVertexHW.h" #include "GSFunctionMap.h" class GSState; +class GSVertexTrace; + +MULTI_ISA_DEF(class GSVertexTraceFMM;) +MULTI_ISA_DEF(void GSVertexTracePopulateFunctions(GSVertexTrace& vt, bool provoking_vertex_first);) class alignas(32) GSVertexTrace : public GSAlignedClass<32> { + MULTI_ISA_FRIEND(GSVertexTraceFMM) + public: struct Vertex { @@ -42,15 +49,10 @@ public: protected: const GSState* m_state; - static const GSVector4 s_minmax; - - typedef void (GSVertexTrace::*FindMinMaxPtr)(const void* vertex, const u32* index, int count); + typedef void (*FindMinMaxPtr)(GSVertexTrace& vt, const void* vertex, const u32* index, int count); FindMinMaxPtr m_fmm[2][2][2][2][4]; - template - void FindMinMax(const void* vertex, const u32* index, int count); - public: GS_PRIM_CLASS m_primclass; diff --git a/pcsx2/GS/Renderers/Common/GSVertexTraceFMM.cpp b/pcsx2/GS/Renderers/Common/GSVertexTraceFMM.cpp new file mode 100644 index 0000000000..a719e52b0c --- /dev/null +++ b/pcsx2/GS/Renderers/Common/GSVertexTraceFMM.cpp @@ -0,0 +1,278 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2021 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "GSVertexTrace.h" +#include "GS/GSState.h" +#include + +class CURRENT_ISA::GSVertexTraceFMM +{ + static constexpr GSVector4 s_minmax = GSVector4::cxpr(FLT_MAX, -FLT_MAX, 0.f, 0.f); + + template + static void FindMinMax(GSVertexTrace& vt, const void* vertex, const u32* index, int count); + + template + static constexpr GSVertexTrace::FindMinMaxPtr GetFMM(bool provoking_vertex_first); + +public: + static void Populate(GSVertexTrace& vt, bool provoking_vertex_first); +}; + +MULTI_ISA_UNSHARED_IMPL; + +void CURRENT_ISA::GSVertexTracePopulateFunctions(GSVertexTrace& vt, bool provoking_vertex_first) +{ + GSVertexTraceFMM::Populate(vt, provoking_vertex_first); +} + +template +constexpr GSVertexTrace::FindMinMaxPtr GSVertexTraceFMM::GetFMM(bool provoking_vertex_first) +{ + constexpr bool real_iip = primclass == GS_SPRITE_CLASS ? false : iip; + constexpr bool real_fst = tme ? fst : false; + constexpr bool provoking_vertex_first_class = primclass == GS_LINE_CLASS || primclass == GS_TRIANGLE_CLASS; + const bool swap = provoking_vertex_first_class && !iip && provoking_vertex_first; + + if (swap) + return FindMinMax; + else + return FindMinMax; +} + +void GSVertexTraceFMM::Populate(GSVertexTrace& vt, bool provoking_vertex_first) +{ + #define InitUpdate3(P, IIP, TME, FST, COLOR) \ + vt.m_fmm[COLOR][FST][TME][IIP][P] = GetFMM(provoking_vertex_first); + + #define InitUpdate2(P, IIP, TME) \ + InitUpdate3(P, IIP, TME, 0, 0) \ + InitUpdate3(P, IIP, TME, 0, 1) \ + InitUpdate3(P, IIP, TME, 1, 0) \ + InitUpdate3(P, IIP, TME, 1, 1) \ + + #define InitUpdate(P) \ + InitUpdate2(P, 0, 0) \ + InitUpdate2(P, 0, 1) \ + InitUpdate2(P, 1, 0) \ + InitUpdate2(P, 1, 1) \ + + InitUpdate(GS_POINT_CLASS); + InitUpdate(GS_LINE_CLASS); + InitUpdate(GS_TRIANGLE_CLASS); + InitUpdate(GS_SPRITE_CLASS); +} + +template +void GSVertexTraceFMM::FindMinMax(GSVertexTrace& vt, const void* vertex, const u32* index, int count) +{ + const GSDrawingContext* context = vt.m_state->m_context; + + int n = 1; + + switch (primclass) + { + case GS_POINT_CLASS: + n = 1; + break; + case GS_LINE_CLASS: + case GS_SPRITE_CLASS: + n = 2; + break; + case GS_TRIANGLE_CLASS: + n = 3; + break; + } + + GSVector4 tmin = s_minmax.xxxx(); + GSVector4 tmax = s_minmax.yyyy(); + GSVector4i cmin = GSVector4i::xffffffff(); + GSVector4i cmax = GSVector4i::zero(); + + GSVector4i pmin = GSVector4i::xffffffff(); + GSVector4i pmax = GSVector4i::zero(); + + const GSVertex* RESTRICT v = (GSVertex*)vertex; + + // Process 2 vertices at a time for increased efficiency + auto processVertices = [&](const GSVertex& v0, const GSVertex& v1, bool finalVertex) + { + if (color) + { + GSVector4i c0 = GSVector4i::load(v0.RGBAQ.U32[0]); + GSVector4i c1 = GSVector4i::load(v1.RGBAQ.U32[0]); + if (iip || finalVertex) + { + cmin = cmin.min_u8(c0.min_u8(c1)); + cmax = cmax.max_u8(c0.max_u8(c1)); + } + else if (n == 2) + { + // For even n, we process v1 and v2 of the same prim + // (For odd n, we process one vertex from each of two prims) + GSVector4i c = flat_swapped ? c0 : c1; + cmin = cmin.min_u8(c); + cmax = cmax.max_u8(c); + } + } + + if (tme) + { + if (!fst) + { + GSVector4 stq0 = GSVector4::cast(GSVector4i(v0.m[0])); + GSVector4 stq1 = GSVector4::cast(GSVector4i(v1.m[0])); + + GSVector4 q; + // Sprites always have indices == vertices, so we don't have to look at the index table here + if (primclass == GS_SPRITE_CLASS) + q = stq1.wwww(); + else + q = stq0.wwww(stq1); + + // Note: If in the future this is changed in a way that causes parts of calculations to go unused, + // make sure to remove the z (rgba) field as it's often denormal. + // Then, use GSVector4::noopt() to prevent clang from optimizing out your "useless" shuffle + // e.g. stq = (stq.xyww() / stq.wwww()).noopt().xyww(stq); + GSVector4 st = stq0.xyxy(stq1) / q; + + stq0 = st.xyww(primclass == GS_SPRITE_CLASS ? stq1 : stq0); + stq1 = st.zwww(stq1); + + tmin = tmin.min(stq0.min(stq1)); + tmax = tmax.max(stq0.max(stq1)); + } + else + { + GSVector4i uv0(v0.m[1]); + GSVector4i uv1(v1.m[1]); + + GSVector4 st0 = GSVector4(uv0.uph16()).xyxy(); + GSVector4 st1 = GSVector4(uv1.uph16()).xyxy(); + + tmin = tmin.min(st0.min(st1)); + tmax = tmax.max(st0.max(st1)); + } + } + + GSVector4i xyzf0(v0.m[1]); + GSVector4i xyzf1(v1.m[1]); + + GSVector4i xy0 = xyzf0.upl16(); + GSVector4i zf0 = xyzf0.ywyw(); + GSVector4i xy1 = xyzf1.upl16(); + GSVector4i zf1 = xyzf1.ywyw(); + + GSVector4i p0 = xy0.blend32<0xc>(primclass == GS_SPRITE_CLASS ? zf1 : zf0); + GSVector4i p1 = xy1.blend32<0xc>(zf1); + + pmin = pmin.min_u32(p0.min_u32(p1)); + pmax = pmax.max_u32(p0.max_u32(p1)); + }; + + if (n == 2) + { + for (int i = 0; i < count; i += 2) + { + processVertices(v[index[i + 0]], v[index[i + 1]], false); + } + } + else if (iip || n == 1) // iip means final and non-final vertexes are treated the same + { + int i = 0; + for (; i < (count - 1); i += 2) // 2x loop unroll + { + processVertices(v[index[i + 0]], v[index[i + 1]], true); + } + if (count & 1) + { + // Compiler optimizations go! + // (And if they don't, it's only one vertex out of many) + processVertices(v[index[i]], v[index[i]], true); + } + } + else if (n == 3) + { + int i = 0; + for (; i < (count - 3); i += 6) + { + processVertices(v[index[i + 0]], v[index[i + 3]], flat_swapped); + processVertices(v[index[i + 1]], v[index[i + 4]], false); + processVertices(v[index[i + 2]], v[index[i + 5]], !flat_swapped); + } + if (count & 1) + { + if (flat_swapped) + { + processVertices(v[index[i + 1]], v[index[i + 2]], false); + // Compiler optimizations go! + // (And if they don't, it's only one vertex out of many) + processVertices(v[index[i + 0]], v[index[i + 0]], true); + } + else + { + processVertices(v[index[i + 0]], v[index[i + 1]], false); + // Compiler optimizations go! + // (And if they don't, it's only one vertex out of many) + processVertices(v[index[i + 2]], v[index[i + 2]], true); + } + } + } + else + { + pxAssertRel(0, "Bad n value"); + } + + GSVector4 o(context->XYOFFSET); + GSVector4 s(1.0f / 16, 1.0f / 16, 2.0f, 1.0f); + + vt.m_min.p = (GSVector4(pmin) - o) * s; + vt.m_max.p = (GSVector4(pmax) - o) * s; + + // Fix signed int conversion + vt.m_min.p = vt.m_min.p.insert32<0, 2>(GSVector4::load((float)(u32)pmin.extract32<2>())); + vt.m_max.p = vt.m_max.p.insert32<0, 2>(GSVector4::load((float)(u32)pmax.extract32<2>())); + + if (tme) + { + if (fst) + { + s = GSVector4(1.0f / 16, 1.0f).xxyy(); + } + else + { + s = GSVector4(1 << context->TEX0.TW, 1 << context->TEX0.TH, 1, 1); + } + + vt.m_min.t = tmin * s; + vt.m_max.t = tmax * s; + } + else + { + vt.m_min.t = GSVector4::zero(); + vt.m_max.t = GSVector4::zero(); + } + + if (color) + { + vt.m_min.c = cmin.u8to32(); + vt.m_max.c = cmax.u8to32(); + } + else + { + vt.m_min.c = GSVector4i::zero(); + vt.m_max.c = GSVector4i::zero(); + } +} diff --git a/pcsx2/GS/Renderers/DX11/D3D.cpp b/pcsx2/GS/Renderers/DX11/D3D.cpp index 8a89f727a8..9af1b7c227 100644 --- a/pcsx2/GS/Renderers/DX11/D3D.cpp +++ b/pcsx2/GS/Renderers/DX11/D3D.cpp @@ -109,8 +109,7 @@ namespace D3D D3D_FEATURE_LEVEL feature_level; static const D3D_FEATURE_LEVEL check[] = { - D3D_FEATURE_LEVEL_12_1, - D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_12_0, D3D_FEATURE_LEVEL_11_0, }; @@ -122,15 +121,25 @@ namespace D3D if (FAILED(hr)) return Renderer::Default; - if (Vendor() == VendorID::Nvidia) + switch (Vendor()) { - if (feature_level == D3D_FEATURE_LEVEL_12_1) - return Renderer::Vulkan; - else if (feature_level == D3D_FEATURE_LEVEL_11_0) - return Renderer::OpenGL; + case VendorID::Nvidia: + if (feature_level == D3D_FEATURE_LEVEL_12_0) + return Renderer::Vulkan; + else if (feature_level == D3D_FEATURE_LEVEL_11_0) + return Renderer::OpenGL; + [[fallthrough]]; + case VendorID::AMD: + if (feature_level == D3D_FEATURE_LEVEL_12_0) + return Renderer::Vulkan; + [[fallthrough]]; + case VendorID::Intel: + if (feature_level == D3D_FEATURE_LEVEL_12_0) + return Renderer::OpenGL; + [[fallthrough]]; + default: + // Default is D3D11 + return Renderer::Default; } - - // Default is D3D11 - return Renderer::Default; } } diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp index e1f1ecdda2..1bd583310f 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp @@ -22,6 +22,8 @@ #include "GS/GSUtil.h" #include "Host.h" #include "HostDisplay.h" +#include "ShaderCacheVersion.h" +#include "common/Path.h" #include "common/StringUtil.h" #include #include @@ -45,7 +47,7 @@ GSDevice11::GSDevice11() m_state.bf = -1; m_features.geometry_shader = true; - m_features.image_load_store = false; + m_features.primitive_id = true; m_features.texture_barrier = false; m_features.provoking_vertex_last = false; m_features.point_expand = false; @@ -66,9 +68,9 @@ GSDevice11::~GSDevice11() m_state.dsv->Release(); } -bool GSDevice11::Create(HostDisplay* display) +bool GSDevice11::Create() { - if (!__super::Create(display)) + if (!GSDevice::Create()) return false; D3D11_BUFFER_DESC bd; @@ -79,26 +81,26 @@ bool GSDevice11::Create(HostDisplay* display) D3D_FEATURE_LEVEL level; - if (display->GetRenderAPI() != HostDisplay::RenderAPI::D3D11) + if (g_host_display->GetRenderAPI() != RenderAPI::D3D11) { - fprintf(stderr, "Render API is incompatible with D3D11\n"); + Console.Error("Render API is incompatible with D3D11"); return false; } - m_dev = static_cast(display->GetRenderDevice()); - m_ctx = static_cast(display->GetRenderContext()); + m_dev = static_cast(g_host_display->GetDevice()); + m_ctx = static_cast(g_host_display->GetContext()); level = m_dev->GetFeatureLevel(); if (!GSConfig.DisableShaderCache) { - if (!m_shader_cache.Open(EmuFolders::Cache, m_dev->GetFeatureLevel(), SHADER_VERSION, GSConfig.UseDebugDevice)) + if (!m_shader_cache.Open(EmuFolders::Cache, m_dev->GetFeatureLevel(), SHADER_CACHE_VERSION, GSConfig.UseDebugDevice)) { Console.Warning("Shader cache failed to open."); } } else { - m_shader_cache.Open({}, m_dev->GetFeatureLevel(), SHADER_VERSION, GSConfig.UseDebugDevice); + m_shader_cache.Open({}, m_dev->GetFeatureLevel(), SHADER_CACHE_VERSION, GSConfig.UseDebugDevice); Console.WriteLn("Not using shader cache."); } @@ -132,23 +134,23 @@ bool GSDevice11::Create(HostDisplay* display) ShaderMacro sm_model(m_shader_cache.GetFeatureLevel()); - shader = Host::ReadResourceFileToString("shaders/dx11/convert.fx"); - if (!shader.has_value()) + std::optional convert_hlsl = Host::ReadResourceFileToString("shaders/dx11/convert.fx"); + if (!convert_hlsl.has_value()) return false; if (!m_shader_cache.GetVertexShaderAndInputLayout(m_dev.get(), m_convert.vs.put(), m_convert.il.put(), - il_convert, std::size(il_convert), *shader, sm_model.GetPtr(), "vs_main")) + il_convert, std::size(il_convert), *convert_hlsl, sm_model.GetPtr(), "vs_main")) { return false; } ShaderMacro sm_convert(m_shader_cache.GetFeatureLevel()); - sm_convert.AddMacro("PS_SCALE_FACTOR", GSConfig.UpscaleMultiplier); + sm_convert.AddMacro("PS_SCALE_FACTOR", StringUtil::ToChars(GSConfig.UpscaleMultiplier)); D3D_SHADER_MACRO* sm_convert_ptr = sm_convert.GetPtr(); for (size_t i = 0; i < std::size(m_convert.ps); i++) { - m_convert.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *shader, sm_convert_ptr, shaderName(static_cast(i))); + m_convert.ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *convert_hlsl, sm_convert_ptr, shaderName(static_cast(i))); if (!m_convert.ps[i]) return false; } @@ -265,16 +267,6 @@ bool GSDevice11::Create(HostDisplay* display) if (!m_shadeboost.ps) return false; - // External fx shader - - memset(&bd, 0, sizeof(bd)); - - bd.ByteWidth = sizeof(ExternalFXConstantBuffer); - bd.Usage = D3D11_USAGE_DEFAULT; - bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - - m_dev->CreateBuffer(&bd, nullptr, m_shaderfx.cb.put()); - // memset(&rd, 0, sizeof(rd)); @@ -341,6 +333,15 @@ bool GSDevice11::Create(HostDisplay* display) m_dev->CreateBlendState(&blend, m_date.bs.put()); + for (size_t i = 0; i < std::size(m_date.primid_init_ps); i++) + { + const std::string entry_point(StringUtil::StdStringFromFormat("ps_stencil_image_init_%d", i)); + m_date.primid_init_ps[i] = m_shader_cache.GetPixelShader(m_dev.get(), *convert_hlsl, sm_model.GetPtr(), entry_point.c_str()); + if (!m_date.primid_init_ps[i]) + return false; + } + + CreateCASShaders(); return true; } @@ -457,12 +458,12 @@ GSTexture* GSDevice11::CreateSurface(GSTexture::Type type, int width, int height switch (format) { case GSTexture::Format::Color: dxformat = DXGI_FORMAT_R8G8B8A8_UNORM; break; - case GSTexture::Format::FloatColor: dxformat = DXGI_FORMAT_R32G32B32A32_FLOAT; break; + case GSTexture::Format::HDRColor: dxformat = DXGI_FORMAT_R16G16B16A16_UNORM; break; case GSTexture::Format::DepthStencil: dxformat = DXGI_FORMAT_R32G8X24_TYPELESS; break; case GSTexture::Format::UNorm8: dxformat = DXGI_FORMAT_A8_UNORM; break; case GSTexture::Format::UInt16: dxformat = DXGI_FORMAT_R16_UINT; break; case GSTexture::Format::UInt32: dxformat = DXGI_FORMAT_R32_UINT; break; - case GSTexture::Format::PrimID: dxformat = DXGI_FORMAT_R32_SINT; break; + case GSTexture::Format::PrimID: dxformat = DXGI_FORMAT_R32_FLOAT; break; case GSTexture::Format::BC1: dxformat = DXGI_FORMAT_BC1_UNORM; break; case GSTexture::Format::BC2: dxformat = DXGI_FORMAT_BC2_UNORM; break; case GSTexture::Format::BC3: dxformat = DXGI_FORMAT_BC3_UNORM; break; @@ -498,6 +499,9 @@ GSTexture* GSDevice11::CreateSurface(GSTexture::Type type, int width, int height desc.Usage = D3D11_USAGE_STAGING; desc.CPUAccessFlags |= D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; break; + case GSTexture::Type::RWTexture: + desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE; + break; } GSTexture11* t = nullptr; @@ -577,6 +581,8 @@ void GSDevice11::CloneTexture(GSTexture* src, GSTexture** dest, const GSVector4i void GSDevice11::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* dTex, const GSVector4& dRect, ShaderConvert shader, bool linear) { + pxAssert(dTex->IsDepthStencil() == HasDepthOutput(shader)); + pxAssert(linear ? SupportsBilinear(shader) : SupportsNearest(shader)); StretchRect(sTex, sRect, dTex, dRect, m_convert.ps[static_cast(shader)].get(), nullptr, linear); } @@ -608,11 +614,7 @@ void GSDevice11::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* { ASSERT(sTex); - const bool draw_in_depth = ps == m_convert.ps[static_cast(ShaderConvert::DEPTH_COPY)] - || ps == m_convert.ps[static_cast(ShaderConvert::RGBA8_TO_FLOAT32)] - || ps == m_convert.ps[static_cast(ShaderConvert::RGBA8_TO_FLOAT24)] - || ps == m_convert.ps[static_cast(ShaderConvert::RGBA8_TO_FLOAT16)] - || ps == m_convert.ps[static_cast(ShaderConvert::RGB5A1_TO_FLOAT16)]; + const bool draw_in_depth = dTex && dTex->IsDepthStencil(); BeginScene(); @@ -627,7 +629,7 @@ void GSDevice11::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* } else { - ds = GSVector2i(m_display->GetWindowWidth(), m_display->GetWindowHeight()); + ds = GSVector2i(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight()); } @@ -703,7 +705,7 @@ void GSDevice11::PresentRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* } else { - ds = GSVector2i(m_display->GetWindowWidth(), m_display->GetWindowHeight()); + ds = GSVector2i(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight()); } DisplayConstantBuffer cb; @@ -816,68 +818,22 @@ void GSDevice11::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, } } -void GSDevice11::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset) +void GSDevice11::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset, int bufIdx) { - const GSVector4 s = GSVector4(dTex->GetSize()); + const GSVector4 ds = GSVector4(dTex->GetSize()); const GSVector4 sRect(0, 0, 1, 1); - const GSVector4 dRect(0.0f, yoffset, s.x, s.y + yoffset); + const GSVector4 dRect(0.0f, yoffset, ds.x, ds.y + yoffset); InterlaceConstantBuffer cb; - cb.ZrH = GSVector2(0, 1.0f / s.y); + cb.ZrH = GSVector4(static_cast(bufIdx), 1.0f / ds.y, ds.y, MAD_SENSITIVITY); m_ctx->UpdateSubresource(m_interlace.cb.get(), 0, nullptr, &cb, 0, 0); StretchRect(sTex, sRect, dTex, dRect, m_interlace.ps[shader].get(), m_interlace.cb.get(), linear); } -void GSDevice11::DoExternalFX(GSTexture* sTex, GSTexture* dTex) -{ - const GSVector2i s = dTex->GetSize(); - - const GSVector4 sRect(0, 0, 1, 1); - const GSVector4 dRect(0, 0, s.x, s.y); - - ExternalFXConstantBuffer cb; - - if (!m_shaderfx.ps) - { - std::string config_name(theApp.GetConfigS("shaderfx_conf")); - std::ifstream fconfig(config_name); - std::stringstream shader; - if (fconfig.good()) - shader << fconfig.rdbuf() << "\n"; - else - fprintf(stderr, "GS: External shader config '%s' not loaded.\n", config_name.c_str()); - - std::string shader_name(theApp.GetConfigS("shaderfx_glsl")); - std::ifstream fshader(shader_name); - if (!fshader.good()) - { - fprintf(stderr, "GS: External shader '%s' not loaded and will be disabled!\n", shader_name.c_str()); - return; - } - - shader << fshader.rdbuf(); - ShaderMacro sm(m_shader_cache.GetFeatureLevel()); - m_shaderfx.ps = m_shader_cache.GetPixelShader(m_dev.get(), shader.str(), sm.GetPtr(), "ps_main"); - if (!m_shaderfx.ps) - { - printf("GS: Failed to compile external post-processing shader.\n"); - return; - } - } - - cb.xyFrame = GSVector2((float)s.x, (float)s.y); - cb.rcpFrame = GSVector4(1.0f / (float)s.x, 1.0f / (float)s.y, 0.0f, 0.0f); - cb.rcpFrameOpt = GSVector4::zero(); - - m_ctx->UpdateSubresource(m_shaderfx.cb.get(), 0, nullptr, &cb, 0, 0); - - StretchRect(sTex, sRect, dTex, dRect, m_shaderfx.ps.get(), m_shaderfx.cb.get(), true); -} - void GSDevice11::DoFXAA(GSTexture* sTex, GSTexture* dTex) { const GSVector2i s = dTex->GetSize(); @@ -893,7 +849,7 @@ void GSDevice11::DoFXAA(GSTexture* sTex, GSTexture* dTex) Console.Error("FXAA shader is missing"); return; } - + ShaderMacro sm(m_shader_cache.GetFeatureLevel()); m_fxaa_ps = m_shader_cache.GetPixelShader(m_dev.get(), *shader, sm.GetPtr(), "ps_main"); if (!m_fxaa_ps) @@ -918,6 +874,55 @@ void GSDevice11::DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float para StretchRect(sTex, sRect, dTex, dRect, m_shadeboost.ps.get(), m_shadeboost.cb.get(), true); } +bool GSDevice11::CreateCASShaders() +{ + CD3D11_BUFFER_DESC desc(NUM_CAS_CONSTANTS * sizeof(u32), D3D11_BIND_CONSTANT_BUFFER, D3D11_USAGE_DEFAULT); + HRESULT hr = m_dev->CreateBuffer(&desc, nullptr, m_cas.cb.put()); + if (FAILED(hr)) + return false; + + std::optional cas_source(Host::ReadResourceFileToString("shaders/dx11/cas.hlsl")); + if (!cas_source.has_value() || !GetCASShaderSource(&cas_source.value())) + return false; + + static constexpr D3D_SHADER_MACRO sharpen_only_macros[] = { + {"CAS_SHARPEN_ONLY", "1"}, + {nullptr, nullptr}}; + + m_cas.cs_sharpen = m_shader_cache.GetComputeShader(m_dev.get(), cas_source.value(), sharpen_only_macros, "main"); + m_cas.cs_upscale = m_shader_cache.GetComputeShader(m_dev.get(), cas_source.value(), nullptr, "main"); + if (!m_cas.cs_sharpen || !m_cas.cs_upscale) + return false; + + m_features.cas_sharpening = true; + return true; +} + +bool GSDevice11::DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) +{ + static const int threadGroupWorkRegionDim = 16; + const int dispatchX = (dTex->GetWidth() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + const int dispatchY = (dTex->GetHeight() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + + ID3D11ShaderResourceView* srvs[1] = {*static_cast(sTex)}; + ID3D11UnorderedAccessView* uavs[1] = {*static_cast(dTex)}; + m_ctx->OMSetRenderTargets(0, nullptr, nullptr); + m_ctx->UpdateSubresource(m_cas.cb.get(), 0, nullptr, constants.data(), 0, 0); + m_ctx->CSSetConstantBuffers(0, 1, m_cas.cb.addressof()); + m_ctx->CSSetShader(sharpen_only ? m_cas.cs_sharpen.get() : m_cas.cs_upscale.get(), nullptr, 0); + m_ctx->CSSetShaderResources(0, std::size(srvs), srvs); + m_ctx->CSSetUnorderedAccessViews(0, std::size(uavs), uavs, nullptr); + m_ctx->Dispatch(dispatchX, dispatchY, 1); + + // clear bindings out to prevent hazards + uavs[0] = nullptr; + srvs[0] = nullptr; + m_ctx->CSSetShaderResources(0, std::size(srvs), srvs); + m_ctx->CSSetUnorderedAccessViews(0, std::size(uavs), uavs, nullptr); + + return true; +} + void GSDevice11::SetupDATE(GSTexture* rt, GSTexture* ds, const GSVertexPT1* vertices, bool datm) { // sfex3 (after the capcom logo), vf4 (first menu fading in), ffxii shadows, rumble roses shadows, persona4 shadows @@ -1305,7 +1310,12 @@ GSDevice11::ShaderMacro::ShaderMacro(D3D_FEATURE_LEVEL fl) void GSDevice11::ShaderMacro::AddMacro(const char* n, int d) { - mlist.emplace_back(n, std::to_string(d)); + AddMacro(n, std::to_string(d)); +} + +void GSDevice11::ShaderMacro::AddMacro(const char* n, std::string d) +{ + mlist.emplace_back(n, std::move(d)); } D3D_SHADER_MACRO* GSDevice11::ShaderMacro::GetPtr(void) @@ -1338,7 +1348,6 @@ static GSDevice11::OMBlendSelector convertSel(GSHWDrawConfig::ColorMaskSelector /// Clears things we don't support that can be quietly disabled static void preprocessSel(GSDevice11::PSSelector& sel) { - ASSERT(sel.date == 0); // In-shader destination alpha not supported and shouldn't be sent ASSERT(sel.write_rg == 0); // Not supported, shouldn't be sent } @@ -1347,7 +1356,16 @@ void GSDevice11::RenderHW(GSHWDrawConfig& config) ASSERT(!config.require_full_barrier); // We always specify no support so it shouldn't request this preprocessSel(config.ps); - if (config.destination_alpha != GSHWDrawConfig::DestinationAlphaMode::Off) + GSVector2i rtsize = (config.rt ? config.rt : config.ds)->GetSize(); + + GSTexture* primid_tex = nullptr; + if (config.destination_alpha == GSHWDrawConfig::DestinationAlphaMode::PrimIDTracking) + { + primid_tex = CreateRenderTarget(rtsize.x, rtsize.y, GSTexture::Format::PrimID, false); + StretchRect(config.rt, GSVector4(config.drawarea) / GSVector4(rtsize).xyxy(), + primid_tex, GSVector4(config.drawarea), m_date.primid_init_ps[config.datm].get(), nullptr, false); + } + else if (config.destination_alpha != GSHWDrawConfig::DestinationAlphaMode::Off) { const GSVector4 src = GSVector4(config.drawarea) / GSVector4(config.ds->GetSize()).xyxy(); const GSVector4 dst = src * 2.0f - 1.0f; @@ -1366,14 +1384,12 @@ void GSDevice11::RenderHW(GSHWDrawConfig& config) GSTexture* hdr_rt = nullptr; if (config.ps.hdr) { - const GSVector2i size = config.rt->GetSize(); const GSVector4 dRect(config.drawarea); - const GSVector4 sRect = dRect / GSVector4(size.x, size.y).xyxy(); - hdr_rt = CreateRenderTarget(size.x, size.y, GSTexture::Format::FloatColor); - hdr_rt->CommitRegion(GSVector2i(config.drawarea.z, config.drawarea.w)); + const GSVector4 sRect = dRect / GSVector4(rtsize.x, rtsize.y).xyxy(); + hdr_rt = CreateRenderTarget(rtsize.x, rtsize.y, GSTexture::Format::HDRColor); // Warning: StretchRect must be called before BeginScene otherwise // vertices will be overwritten. Trust me you don't want to do that. - StretchRect(config.rt, sRect, hdr_rt, dRect, ShaderConvert::COPY, false); + StretchRect(config.rt, sRect, hdr_rt, dRect, ShaderConvert::HDR_INIT, false); } BeginScene(); @@ -1394,8 +1410,6 @@ void GSDevice11::RenderHW(GSHWDrawConfig& config) } IASetPrimitiveTopology(topology); - OMSetRenderTargets(hdr_rt ? hdr_rt : config.rt, config.ds, &config.scissor); - PSSetShaderResources(config.tex, config.pal); GSTexture* rt_copy = nullptr; @@ -1425,11 +1439,35 @@ void GSDevice11::RenderHW(GSHWDrawConfig& config) PSSetShaderResource(0, ds_copy); } - SetupOM(config.depth, convertSel(config.colormask, config.blend), config.blend.constant); SetupVS(config.vs, &config.cb_vs); SetupGS(config.gs); SetupPS(config.ps, &config.cb_ps, config.sampler); + if (config.destination_alpha == GSHWDrawConfig::DestinationAlphaMode::PrimIDTracking) + { + OMDepthStencilSelector dss = config.depth; + dss.zwe = 0; + OMBlendSelector blend; + blend.wrgba = 0; + blend.wr = 1; + blend.blend_enable = 1; + blend.blend_src_factor = CONST_ONE; + blend.blend_dst_factor = CONST_ONE; + blend.blend_op = 3; // MIN + SetupOM(dss, blend, 0); + OMSetRenderTargets(primid_tex, config.ds, &config.scissor); + + DrawIndexedPrimitive(); + + config.ps.date = 3; + config.alpha_second_pass.ps.date = 3; + SetupPS(config.ps, nullptr, config.sampler); + PSSetShaderResource(3, primid_tex); + } + + SetupOM(config.depth, convertSel(config.colormask, config.blend), config.blend.constant); + OMSetRenderTargets(hdr_rt ? hdr_rt : config.rt, config.ds, &config.scissor); + DrawIndexedPrimitive(); if (config.separate_alpha_pass) @@ -1477,13 +1515,15 @@ void GSDevice11::RenderHW(GSHWDrawConfig& config) Recycle(rt_copy); if (ds_copy) Recycle(ds_copy); + if (primid_tex) + Recycle(primid_tex); if (hdr_rt) { const GSVector2i size = config.rt->GetSize(); const GSVector4 dRect(config.drawarea); const GSVector4 sRect = dRect / GSVector4(size.x, size.y).xyxy(); - StretchRect(hdr_rt, sRect, config.rt, dRect, ShaderConvert::MOD_256, false); + StretchRect(hdr_rt, sRect, config.rt, dRect, ShaderConvert::HDR_RESOLVE, false); Recycle(hdr_rt); } } diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.h b/pcsx2/GS/Renderers/DX11/GSDevice11.h index e27966ed46..e155c681bf 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.h +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.h @@ -104,14 +104,12 @@ public: public: ShaderMacro(D3D_FEATURE_LEVEL fl); void AddMacro(const char* n, int d); + void AddMacro(const char* n, std::string d); D3D_SHADER_MACRO* GetPtr(void); }; private: - // Increment this constant whenever shaders change, to invalidate user's shader cache. - static constexpr u32 SHADER_VERSION = 1; - - static constexpr u32 MAX_TEXTURES = 3; + static constexpr u32 MAX_TEXTURES = 4; static constexpr u32 MAX_SAMPLERS = 2; int m_d3d_texsize; @@ -121,10 +119,12 @@ private: GSTexture* CreateSurface(GSTexture::Type type, int width, int height, int levels, GSTexture::Format format) final; void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) final; - void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0) final; + void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0, int bufIdx = 0) final; void DoFXAA(GSTexture* sTex, GSTexture* dTex) final; void DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float params[4]) final; - void DoExternalFX(GSTexture* sTex, GSTexture* dTex) final; + + bool CreateCASShaders(); + bool DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) final; wil::com_ptr_nothrow m_dev; wil::com_ptr_nothrow m_ctx; @@ -187,16 +187,10 @@ private: struct { - wil::com_ptr_nothrow ps[4]; + wil::com_ptr_nothrow ps[NUM_INTERLACE_SHADERS]; wil::com_ptr_nothrow cb; } m_interlace; - struct - { - wil::com_ptr_nothrow ps; - wil::com_ptr_nothrow cb; - } m_shaderfx; - wil::com_ptr_nothrow m_fxaa_ps; struct @@ -209,8 +203,16 @@ private: { wil::com_ptr_nothrow dss; wil::com_ptr_nothrow bs; + wil::com_ptr_nothrow primid_init_ps[2]; } m_date; + struct + { + wil::com_ptr_nothrow cb; + wil::com_ptr_nothrow cs_upscale; + wil::com_ptr_nothrow cs_sharpen; + } m_cas; + // Shaders... std::unordered_map m_vs; @@ -240,7 +242,7 @@ public: __fi ID3D11Device* GetD3DDevice() const { return m_dev.get(); } __fi ID3D11DeviceContext* GetD3DContext() const { return m_ctx.get(); } - bool Create(HostDisplay* display); + bool Create() override; void ResetAPIState() override; void RestoreAPIState() override; diff --git a/pcsx2/GS/Renderers/DX11/GSTexture11.cpp b/pcsx2/GS/Renderers/DX11/GSTexture11.cpp index 811c44792a..99ba516f38 100644 --- a/pcsx2/GS/Renderers/DX11/GSTexture11.cpp +++ b/pcsx2/GS/Renderers/DX11/GSTexture11.cpp @@ -18,6 +18,7 @@ #include "GSTexture11.h" #include "GS/GSPng.h" #include "GS/GSPerfMon.h" +#include "common/Align.h" GSTexture11::GSTexture11(wil::com_ptr_nothrow texture, const D3D11_TEXTURE2D_DESC& desc, GSTexture::Type type, GSTexture::Format format) @@ -44,7 +45,10 @@ bool GSTexture11::Update(const GSVector4i& r, const void* data, int pitch, int l g_perfmon.Put(GSPerfMon::TextureUploads, 1); - const D3D11_BOX box = {(UINT)r.left, (UINT)r.top, 0U, (UINT)r.right, (UINT)r.bottom, 1U}; + const u32 bs = GetCompressedBlockSize(); + + const D3D11_BOX box = {Common::AlignDownPow2((u32)r.left, bs), Common::AlignDownPow2((u32)r.top, bs), 0U, + Common::AlignUpPow2((u32)r.right, bs), Common::AlignUpPow2((u32)r.bottom, bs), 1U}; const UINT subresource = layer; // MipSlice + (ArraySlice * MipLevels). GSDevice11::GetInstance()->GetD3DContext()->UpdateSubresource(m_texture.get(), subresource, &box, data, pitch, 0); @@ -258,6 +262,14 @@ GSTexture11::operator ID3D11DepthStencilView*() return m_dsv.get(); } +GSTexture11::operator ID3D11UnorderedAccessView*() +{ + if (!m_uav) + GSDevice11::GetInstance()->GetD3DDevice()->CreateUnorderedAccessView(m_texture.get(), nullptr, m_uav.put()); + + return m_uav.get(); +} + bool GSTexture11::Equal(GSTexture11* tex) { return tex && m_texture == tex->m_texture; diff --git a/pcsx2/GS/Renderers/DX11/GSTexture11.h b/pcsx2/GS/Renderers/DX11/GSTexture11.h index 3bb2211ca6..7f4edf3404 100644 --- a/pcsx2/GS/Renderers/DX11/GSTexture11.h +++ b/pcsx2/GS/Renderers/DX11/GSTexture11.h @@ -26,6 +26,7 @@ class GSTexture11 final : public GSTexture wil::com_ptr_nothrow m_srv; wil::com_ptr_nothrow m_rtv; wil::com_ptr_nothrow m_dsv; + wil::com_ptr_nothrow m_uav; D3D11_TEXTURE2D_DESC m_desc; int m_mapped_subresource; @@ -47,4 +48,5 @@ public: operator ID3D11ShaderResourceView*(); operator ID3D11RenderTargetView*(); operator ID3D11DepthStencilView*(); + operator ID3D11UnorderedAccessView*(); }; diff --git a/pcsx2/GS/Renderers/DX11/GSTextureFX11.cpp b/pcsx2/GS/Renderers/DX11/GSTextureFX11.cpp index f8f963835a..55227f20eb 100644 --- a/pcsx2/GS/Renderers/DX11/GSTextureFX11.cpp +++ b/pcsx2/GS/Renderers/DX11/GSTextureFX11.cpp @@ -137,6 +137,7 @@ void GSDevice11::SetupGS(GSSelector sel) sm.AddMacro("GS_IIP", sel.iip); sm.AddMacro("GS_PRIM", static_cast(sel.topology)); sm.AddMacro("GS_EXPAND", sel.expand); + sm.AddMacro("GS_FORWARD_PRIMID", sel.forward_primid); gs = m_shader_cache.GetGeometryShader(m_dev.get(), m_tfx_source, sm.GetPtr(), "gs_main"); @@ -155,7 +156,7 @@ void GSDevice11::SetupPS(const PSSelector& sel, const GSHWDrawConfig::PSConstant { ShaderMacro sm(m_shader_cache.GetFeatureLevel()); - sm.AddMacro("PS_SCALE_FACTOR", GSConfig.UpscaleMultiplier); + sm.AddMacro("PS_SCALE_FACTOR", StringUtil::ToChars(GSConfig.UpscaleMultiplier)); sm.AddMacro("PS_FST", sel.fst); sm.AddMacro("PS_WMS", sel.wms); sm.AddMacro("PS_WMT", sel.wmt); @@ -163,6 +164,7 @@ void GSDevice11::SetupPS(const PSSelector& sel, const GSHWDrawConfig::PSConstant sm.AddMacro("PS_AEM", sel.aem); sm.AddMacro("PS_TFX", sel.tfx); sm.AddMacro("PS_TCC", sel.tcc); + sm.AddMacro("PS_DATE", sel.date); sm.AddMacro("PS_ATST", sel.atst); sm.AddMacro("PS_FOG", sel.fog); sm.AddMacro("PS_IIP", sel.iip); @@ -188,6 +190,7 @@ void GSDevice11::SetupPS(const PSSelector& sel, const GSHWDrawConfig::PSConstant sm.AddMacro("PS_BLEND_C", sel.blend_c); sm.AddMacro("PS_BLEND_D", sel.blend_d); sm.AddMacro("PS_BLEND_MIX", sel.blend_mix); + sm.AddMacro("PS_FIXED_ONE_A", sel.fixed_one_a); sm.AddMacro("PS_PABE", sel.pabe); sm.AddMacro("PS_DITHER", sel.dither); sm.AddMacro("PS_ZCLAMP", sel.zclamp); @@ -229,7 +232,7 @@ void GSDevice11::SetupPS(const PSSelector& sel, const GSHWDrawConfig::PSConstant D3D11_SAMPLER_DESC sd = {}; const int anisotropy = GSConfig.MaxAnisotropy; - if (anisotropy && ssel.aniso) + if (anisotropy > 1 && ssel.aniso) { sd.Filter = D3D11_FILTER_ANISOTROPIC; } @@ -256,7 +259,7 @@ void GSDevice11::SetupPS(const PSSelector& sel, const GSHWDrawConfig::PSConstant sd.AddressV = ssel.tav ? D3D11_TEXTURE_ADDRESS_WRAP : D3D11_TEXTURE_ADDRESS_CLAMP; sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; sd.MinLOD = 0.0f; - sd.MaxLOD = ssel.lodclamp ? 0.0f : FLT_MAX; + sd.MaxLOD = (ssel.lodclamp || !ssel.UseMipmapFiltering()) ? 0.25f : FLT_MAX; sd.MaxAnisotropy = std::clamp(anisotropy, 1, 16); sd.ComparisonFunc = D3D11_COMPARISON_NEVER; @@ -288,8 +291,8 @@ static constexpr std::array s_d3d11_blend_factors = { { D3D11_BLEND_DEST_ALPHA, D3D11_BLEND_INV_DEST_ALPHA, D3D11_BLEND_SRC1_ALPHA, D3D11_BLEND_INV_SRC1_ALPHA, D3D11_BLEND_BLEND_FACTOR, D3D11_BLEND_INV_BLEND_FACTOR, D3D11_BLEND_ONE, D3D11_BLEND_ZERO } }; -static constexpr std::array s_d3d11_blend_ops = { { - D3D11_BLEND_OP_ADD, D3D11_BLEND_OP_SUBTRACT, D3D11_BLEND_OP_REV_SUBTRACT +static constexpr std::array s_d3d11_blend_ops = { { + D3D11_BLEND_OP_ADD, D3D11_BLEND_OP_SUBTRACT, D3D11_BLEND_OP_REV_SUBTRACT, D3D11_BLEND_OP_MIN } }; // clang-format on @@ -349,7 +352,7 @@ void GSDevice11::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, u8 memset(&bd, 0, sizeof(bd)); - if (bsel.blend_enable) + if (bsel.blend_enable && (bsel.wrgba & 0x7)) { bd.RenderTarget[0].BlendEnable = TRUE; bd.RenderTarget[0].BlendOp = s_d3d11_blend_ops[bsel.blend_op]; diff --git a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp index 44f162bac3..8c040fd6c5 100644 --- a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp +++ b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp @@ -29,24 +29,15 @@ #include "GS/GSUtil.h" #include "Host.h" #include "HostDisplay.h" +#include "ShaderCacheVersion.h" #include #include -static bool IsDepthConvertShader(ShaderConvert i) -{ - return (i == ShaderConvert::DEPTH_COPY || i == ShaderConvert::RGBA8_TO_FLOAT32 || - i == ShaderConvert::RGBA8_TO_FLOAT24 || i == ShaderConvert::RGBA8_TO_FLOAT16 || - i == ShaderConvert::RGB5A1_TO_FLOAT16 || i == ShaderConvert::DATM_0 || - i == ShaderConvert::DATM_1); -} - -static bool IsIntConvertShader(ShaderConvert i) -{ - return (i == ShaderConvert::RGBA8_TO_16_BITS || i == ShaderConvert::FLOAT32_TO_16_BITS || - i == ShaderConvert::FLOAT32_TO_32_BITS); -} - static bool IsDATMConvertShader(ShaderConvert i) { return (i == ShaderConvert::DATM_0 || i == ShaderConvert::DATM_1); } +static bool IsDATEModePrimIDInit(u32 flag) { return flag == 1 || flag == 2; } + +static constexpr std::array s_primitive_topology_mapping = + {{D3D_PRIMITIVE_TOPOLOGY_POINTLIST, D3D_PRIMITIVE_TOPOLOGY_LINELIST, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST}}; static D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE GetLoadOpForTexture(GSTexture12* tex) { @@ -84,7 +75,12 @@ GSDevice12::ShaderMacro::ShaderMacro(D3D_FEATURE_LEVEL fl) void GSDevice12::ShaderMacro::AddMacro(const char* n, int d) { - mlist.emplace_back(n, std::to_string(d)); + AddMacro(n, std::to_string(d)); +} + +void GSDevice12::ShaderMacro::AddMacro(const char* n, std::string d) +{ + mlist.emplace_back(n, std::move(d)); } D3D_SHADER_MACRO* GSDevice12::ShaderMacro::GetPtr(void) @@ -105,9 +101,9 @@ GSDevice12::GSDevice12() GSDevice12::~GSDevice12() {} -bool GSDevice12::Create(HostDisplay* display) +bool GSDevice12::Create() { - if (!GSDevice::Create(display) || !CheckFeatures()) + if (!GSDevice::Create() || !CheckFeatures()) return false; { @@ -123,14 +119,14 @@ bool GSDevice12::Create(HostDisplay* display) if (!GSConfig.DisableShaderCache) { - if (!m_shader_cache.Open(EmuFolders::Cache, g_d3d12_context->GetFeatureLevel(), SHADER_VERSION, GSConfig.UseDebugDevice)) + if (!m_shader_cache.Open(EmuFolders::Cache, g_d3d12_context->GetFeatureLevel(), SHADER_CACHE_VERSION, GSConfig.UseDebugDevice)) { Console.Warning("Shader cache failed to open."); } } else { - m_shader_cache.Open({}, g_d3d12_context->GetFeatureLevel(), SHADER_VERSION, GSConfig.UseDebugDevice); + m_shader_cache.Open({}, g_d3d12_context->GetFeatureLevel(), SHADER_CACHE_VERSION, GSConfig.UseDebugDevice); Console.WriteLn("Not using shader cache."); } @@ -160,6 +156,7 @@ bool GSDevice12::Create(HostDisplay* display) return false; } + CompileCASPipelines(); InitializeState(); InitializeSamplers(); return true; @@ -206,7 +203,7 @@ bool GSDevice12::CheckFeatures() m_features.texture_barrier = false; m_features.broken_point_sampler = isAMD; m_features.geometry_shader = true; - m_features.image_load_store = true; + m_features.primitive_id = true; m_features.prefer_new_textures = true; m_features.provoking_vertex_last = false; m_features.point_expand = false; @@ -294,7 +291,7 @@ void GSDevice12::LookupNativeFormat(GSTexture::Format format, DXGI_FORMAT* d3d_f static constexpr std::array, static_cast(GSTexture::Format::BC7) + 1> s_format_mapping = {{ {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN}, // Invalid {DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN}, // Color - {DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN}, // FloatColor + {DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_UNKNOWN}, // HDRColor {DXGI_FORMAT_D32_FLOAT_S8X24_UINT, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D32_FLOAT_S8X24_UINT}, // DepthStencil {DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_UNKNOWN}, // UNorm8 {DXGI_FORMAT_R16_UINT, DXGI_FORMAT_R16_UINT, DXGI_FORMAT_R16_UINT, DXGI_FORMAT_UNKNOWN}, // UInt16 @@ -319,8 +316,7 @@ void GSDevice12::LookupNativeFormat(GSTexture::Format format, DXGI_FORMAT* d3d_f GSTexture* GSDevice12::CreateSurface(GSTexture::Type type, int width, int height, int levels, GSTexture::Format format) { - pxAssert(type != GSTexture::Type::Offscreen && type != GSTexture::Type::SparseRenderTarget && - type != GSTexture::Type::SparseDepthStencil); + pxAssert(type != GSTexture::Type::Offscreen); const u32 clamped_width = static_cast(std::clamp(1, width, D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION)); const u32 clamped_height = static_cast(std::clamp(1, height, D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION)); @@ -328,7 +324,16 @@ GSTexture* GSDevice12::CreateSurface(GSTexture::Type type, int width, int height DXGI_FORMAT d3d_format, srv_format, rtv_format, dsv_format; LookupNativeFormat(format, &d3d_format, &srv_format, &rtv_format, &dsv_format); - return GSTexture12::Create(type, clamped_width, clamped_height, levels, format, d3d_format, srv_format, rtv_format, dsv_format).release(); + std::unique_ptr tex(GSTexture12::Create(type, clamped_width, clamped_height, levels, format, d3d_format, srv_format, rtv_format, dsv_format)); + if (!tex) + { + // We're probably out of vram, try flushing the command buffer to release pending textures. + PurgePool(); + ExecuteCommandListAndRestartRenderPass(true, "Couldn't allocate texture."); + tex = GSTexture12::Create(type, clamped_width, clamped_height, levels, format, d3d_format, srv_format, rtv_format, dsv_format); + } + + return tex.release(); } bool GSDevice12::DownloadTexture(GSTexture* src, const GSVector4i& rect, GSTexture::GSMap& out_map) @@ -451,9 +456,14 @@ void GSDevice12::CopyRect(GSTexture* sTex, GSTexture* dTex, const GSVector4i& r, dTexVK->CommitClear(); EndRenderPass(); + sTexVK->TransitionToState(D3D12_RESOURCE_STATE_COPY_SOURCE); - dTexVK->SetState(GSTexture::State::Dirty); + sTexVK->SetUsedThisCommandBuffer(); + if (m_tfx_textures[0] && sTexVK->GetSRVDescriptor() == m_tfx_textures[0]) + PSSetShaderResource(0, nullptr, false); + dTexVK->TransitionToState(D3D12_RESOURCE_STATE_COPY_DEST); + dTexVK->SetUsedThisCommandBuffer(); D3D12_TEXTURE_COPY_LOCATION srcloc; srcloc.pResource = sTexVK->GetResource(); @@ -477,7 +487,7 @@ void GSDevice12::CopyRect(GSTexture* sTex, GSTexture* dTex, const GSVector4i& r, void GSDevice12::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* dTex, const GSVector4& dRect, ShaderConvert shader /* = ShaderConvert::COPY */, bool linear /* = true */) { - pxAssert(IsDepthConvertShader(shader) == (dTex && dTex->GetType() == GSTexture::Type::DepthStencil)); + pxAssert(HasDepthOutput(shader) == (dTex && dTex->GetType() == GSTexture::Type::DepthStencil)); GL_INS("StretchRect(%d) {%d,%d} %dx%d -> {%d,%d) %dx%d", shader, int(sRect.left), int(sRect.top), int(sRect.right - sRect.left), int(sRect.bottom - sRect.top), int(dRect.left), int(dRect.top), @@ -502,7 +512,7 @@ void GSDevice12::PresentRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* { DisplayConstantBuffer cb; cb.SetSource(sRect, sTex->GetSize()); - cb.SetTarget(dRect, dTex ? dTex->GetSize() : GSVector2i(m_display->GetWindowWidth(), m_display->GetWindowHeight())); + cb.SetTarget(dRect, dTex ? dTex->GetSize() : GSVector2i(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight())); cb.SetTime(shaderTime); SetUtilityRootSignature(); SetUtilityPushConstants(&cb, sizeof(cb)); @@ -551,7 +561,7 @@ void GSDevice12::DoStretchRect(GSTexture12* sTex, const GSVector4& sRect, GSText const bool is_present = (!dTex); const bool depth = (dTex && dTex->GetType() == GSTexture::Type::DepthStencil); const GSVector2i size( - is_present ? GSVector2i(m_display->GetWindowWidth(), m_display->GetWindowHeight()) : dTex->GetSize()); + is_present ? GSVector2i(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight()) : dTex->GetSize()); const GSVector4i dtex_rc(0, 0, size.x, size.y); const GSVector4i dst_rc(GSVector4i(dRect).rintersect(dtex_rc)); @@ -720,22 +730,24 @@ void GSDevice12::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, static_cast(dTex)->TransitionToState(D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); } -void GSDevice12::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset) +void GSDevice12::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset, int bufIdx) { - const GSVector2i size(dTex->GetSize()); - const GSVector4 s = GSVector4(size); + const GSVector2i ds_i = dTex->GetSize(); + const GSVector4 ds = GSVector4(ds_i); + const GSVector4 sRect(0, 0, 1, 1); - const GSVector4 dRect(0.0f, yoffset, s.x, s.y + yoffset); + const GSVector4 dRect(0.0f, yoffset, ds.x, ds.y + yoffset); InterlaceConstantBuffer cb; - cb.ZrH = GSVector2(0, 1.0f / s.y); - GL_PUSH("DoInterlace %dx%d Shader:%d Linear:%d", size.x, size.y, shader, linear); + cb.ZrH = GSVector4(static_cast(bufIdx), 1.0f / ds.y, ds.y, MAD_SENSITIVITY); + + GL_PUSH("DoInterlace %dx%d Shader:%d Linear:%d", ds_i.x, ds_i.y, shader, linear); static_cast(dTex)->TransitionToState(D3D12_RESOURCE_STATE_RENDER_TARGET); - const GSVector4i rc(0, 0, size.x, size.y); + const GSVector4i rc(0, 0, ds_i.x, ds_i.y); EndRenderPass(); OMSetRenderTargets(dTex, nullptr, rc); SetUtilityRootSignature(); @@ -785,12 +797,88 @@ void GSDevice12::DoFXAA(GSTexture* sTex, GSTexture* dTex) static_cast(dTex)->TransitionToState(D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); } +bool GSDevice12::CompileCASPipelines() +{ + D3D12::RootSignatureBuilder rsb; + rsb.Add32BitConstants(0, NUM_CAS_CONSTANTS, D3D12_SHADER_VISIBILITY_ALL); + rsb.AddDescriptorTable(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 1, D3D12_SHADER_VISIBILITY_ALL); + rsb.AddDescriptorTable(D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 0, 1, D3D12_SHADER_VISIBILITY_ALL); + m_cas_root_signature = rsb.Create(false); + if (!m_cas_root_signature) + return false; + + std::optional cas_source(Host::ReadResourceFileToString("shaders/dx11/cas.hlsl")); + if (!cas_source.has_value() || !GetCASShaderSource(&cas_source.value())) + return false; + + static constexpr D3D_SHADER_MACRO sharpen_only_macros[] = { + {"CAS_SHARPEN_ONLY", "1"}, + {nullptr, nullptr}}; + + const ComPtr cs_upscale(m_shader_cache.GetComputeShader(cas_source.value(), nullptr, "main")); + const ComPtr cs_sharpen(m_shader_cache.GetComputeShader(cas_source.value(), sharpen_only_macros, "main")); + if (!cs_upscale || !cs_sharpen) + return false; + + D3D12::ComputePipelineBuilder cpb; + cpb.SetRootSignature(m_cas_root_signature.get()); + cpb.SetShader(cs_upscale->GetBufferPointer(), cs_upscale->GetBufferSize()); + m_cas_upscale_pipeline = cpb.Create(g_d3d12_context->GetDevice(), m_shader_cache, false); + cpb.SetShader(cs_sharpen->GetBufferPointer(), cs_sharpen->GetBufferSize()); + m_cas_sharpen_pipeline = cpb.Create(g_d3d12_context->GetDevice(), m_shader_cache, false); + if (!m_cas_upscale_pipeline || !m_cas_sharpen_pipeline) + return false; + + m_features.cas_sharpening = true; + return true; +} + +bool GSDevice12::DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) +{ + EndRenderPass(); + + GSTexture12* const sTex12 = static_cast(sTex); + GSTexture12* const dTex12 = static_cast(dTex); + D3D12::DescriptorHandle sTexDH, dTexDH; + if (!GetTextureGroupDescriptors(&sTexDH, &sTex12->GetTexture().GetSRVDescriptor(), 1) || + !GetTextureGroupDescriptors(&dTexDH, &dTex12->GetTexture().GetWriteDescriptor(), 1)) + { + ExecuteCommandList(false, "Ran out of descriptors for CAS"); + if (!GetTextureGroupDescriptors(&sTexDH, &sTex12->GetTexture().GetSRVDescriptor(), 1) || + !GetTextureGroupDescriptors(&dTexDH, &dTex12->GetTexture().GetWriteDescriptor(), 1)) + { + Console.Error("Failed to allocate CAS descriptors."); + return false; + } + } + + ID3D12GraphicsCommandList* const cmdlist = g_d3d12_context->GetCommandList(); + const D3D12_RESOURCE_STATES old_state = sTex12->GetTexture().GetState(); + sTex12->GetTexture().TransitionToState(cmdlist, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE); + dTex12->GetTexture().TransitionToState(cmdlist, D3D12_RESOURCE_STATE_UNORDERED_ACCESS); + + cmdlist->SetComputeRootSignature(m_cas_root_signature.get()); + cmdlist->SetComputeRoot32BitConstants(CAS_ROOT_SIGNATURE_PARAM_PUSH_CONSTANTS, NUM_CAS_CONSTANTS, constants.data(), 0); + cmdlist->SetComputeRootDescriptorTable(CAS_ROOT_SIGNATURE_PARAM_SRC_TEXTURE, sTexDH); + cmdlist->SetComputeRootDescriptorTable(CAS_ROOT_SIGNATURE_PARAM_DST_TEXTURE, dTexDH); + cmdlist->SetPipelineState(sharpen_only ? m_cas_sharpen_pipeline.get() : m_cas_upscale_pipeline.get()); + m_dirty_flags |= DIRTY_FLAG_PIPELINE; + + static const int threadGroupWorkRegionDim = 16; + const int dispatchX = (dTex->GetWidth() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + const int dispatchY = (dTex->GetHeight() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + cmdlist->Dispatch(dispatchX, dispatchY, 1); + + sTex12->GetTexture().TransitionToState(cmdlist, old_state); + return true; +} + void GSDevice12::IASetVertexBuffer(const void* vertex, size_t stride, size_t count) { const u32 size = static_cast(stride) * static_cast(count); if (!m_vertex_stream_buffer.ReserveMemory(size, static_cast(stride))) { - ExecuteCommandListAndRestartRenderPass("Uploading to vertex buffer"); + ExecuteCommandListAndRestartRenderPass(false, "Uploading to vertex buffer"); if (!m_vertex_stream_buffer.ReserveMemory(size, static_cast(stride))) pxFailRel("Failed to reserve space for vertices"); } @@ -810,7 +898,7 @@ bool GSDevice12::IAMapVertexBuffer(void** vertex, size_t stride, size_t count) const u32 size = static_cast(stride) * static_cast(count); if (!m_vertex_stream_buffer.ReserveMemory(size, static_cast(stride))) { - ExecuteCommandListAndRestartRenderPass("Mapping bytes to vertex buffer"); + ExecuteCommandListAndRestartRenderPass(false, "Mapping bytes to vertex buffer"); if (!m_vertex_stream_buffer.ReserveMemory(size, static_cast(stride))) pxFailRel("Failed to reserve space for vertices"); } @@ -836,7 +924,7 @@ void GSDevice12::IASetIndexBuffer(const void* index, size_t count) const u32 size = sizeof(u32) * static_cast(count); if (!m_index_stream_buffer.ReserveMemory(size, sizeof(u32))) { - ExecuteCommandListAndRestartRenderPass("Uploading bytes to index buffer"); + ExecuteCommandListAndRestartRenderPass(false, "Uploading bytes to index buffer"); if (!m_index_stream_buffer.ReserveMemory(size, sizeof(u32))) pxFailRel("Failed to reserve space for vertices"); } @@ -892,7 +980,7 @@ bool GSDevice12::GetSampler(D3D12::DescriptorHandle* cpu_handle, GSHWDrawConfig: D3D12_SAMPLER_DESC sd = {}; const int anisotropy = GSConfig.MaxAnisotropy; - if (GSConfig.MaxAnisotropy > 1 && ss.aniso) + if (anisotropy > 1 && ss.aniso) { sd.Filter = D3D12_FILTER_ANISOTROPIC; } @@ -919,7 +1007,7 @@ bool GSDevice12::GetSampler(D3D12::DescriptorHandle* cpu_handle, GSHWDrawConfig: sd.AddressV = ss.tav ? D3D12_TEXTURE_ADDRESS_MODE_WRAP : D3D12_TEXTURE_ADDRESS_MODE_CLAMP; sd.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; sd.MinLOD = 0.0f; - sd.MaxLOD = ss.lodclamp ? 0.0f : FLT_MAX; + sd.MaxLOD = (ss.lodclamp || !ss.UseMipmapFiltering()) ? 0.25f : FLT_MAX; sd.MaxAnisotropy = std::clamp(GSConfig.MaxAnisotropy, 1, 16); sd.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER; @@ -985,7 +1073,7 @@ GSDevice12::ComPtr GSDevice12::GetUtilityVertexShader(const std::strin GSDevice12::ComPtr GSDevice12::GetUtilityPixelShader(const std::string& source, const char* entry_point) { ShaderMacro sm_model(m_shader_cache.GetFeatureLevel()); - sm_model.AddMacro("PS_SCALE_FACTOR", GSConfig.UpscaleMultiplier); + sm_model.AddMacro("PS_SCALE_FACTOR", StringUtil::ToChars(GSConfig.UpscaleMultiplier)); return m_shader_cache.GetPixelShader(source, sm_model.GetPtr(), entry_point); } @@ -1084,7 +1172,7 @@ bool GSDevice12::CompileConvertPipelines() for (ShaderConvert i = ShaderConvert::COPY; static_cast(i) < static_cast(ShaderConvert::Count); i = static_cast(static_cast(i) + 1)) { - const bool depth = IsDepthConvertShader(i); + const bool depth = HasDepthOutput(i); const int index = static_cast(i); switch (i) @@ -1144,18 +1232,6 @@ bool GSDevice12::CompileConvertPipelines() if (i == ShaderConvert::COPY) { - // compile the variant for setting up hdr rendering - for (u32 ds = 0; ds < 2; ds++) - { - gpb.SetRenderTarget(0, DXGI_FORMAT_R32G32B32A32_FLOAT); - gpb.SetDepthStencilFormat(ds ? DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS : DXGI_FORMAT_UNKNOWN); - m_hdr_setup_pipelines[ds] = gpb.Create(g_d3d12_context->GetDevice(), m_shader_cache, false); - if (!m_hdr_setup_pipelines[ds]) - return false; - - D3D12::SetObjectNameFormatted(m_hdr_setup_pipelines[ds].get(), "HDR setup/copy pipeline (ds=%u)", i, ds); - } - // compile color copy pipelines gpb.SetRenderTarget(0, DXGI_FORMAT_R8G8B8A8_UNORM); gpb.SetDepthStencilFormat(DXGI_FORMAT_UNKNOWN); @@ -1173,18 +1249,21 @@ bool GSDevice12::CompileConvertPipelines() (i >> 3) & 1u); } } - else if (i == ShaderConvert::MOD_256) + else if (i == ShaderConvert::HDR_INIT || i == ShaderConvert::HDR_RESOLVE) { + const bool is_setup = i == ShaderConvert::HDR_INIT; + std::array, 2>& arr = is_setup ? m_hdr_setup_pipelines : m_hdr_finish_pipelines; for (u32 ds = 0; ds < 2; ds++) { - pxAssert(!m_hdr_finish_pipelines[ds]); + pxAssert(!arr[ds]); + gpb.SetRenderTarget(0, is_setup ? DXGI_FORMAT_R16G16B16A16_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM); gpb.SetDepthStencilFormat(ds ? DXGI_FORMAT_D32_FLOAT_S8X24_UINT : DXGI_FORMAT_UNKNOWN); - m_hdr_finish_pipelines[ds] = gpb.Create(g_d3d12_context->GetDevice(), m_shader_cache, false); - if (!m_hdr_finish_pipelines[ds]) + arr[ds] = gpb.Create(g_d3d12_context->GetDevice(), m_shader_cache, false); + if (!arr[ds]) return false; - D3D12::SetObjectNameFormatted(m_hdr_setup_pipelines[ds].get(), "HDR finish/copy pipeline (ds=%u)", ds); + D3D12::SetObjectNameFormatted(arr[ds].get(), "HDR %s/copy pipeline (ds=%u)", is_setup ? "setup" : "finish", ds); } } } @@ -1200,7 +1279,7 @@ bool GSDevice12::CompileConvertPipelines() gpb.SetPixelShader(ps.get()); gpb.SetNoDepthTestState(); gpb.SetNoStencilState(); - gpb.SetBlendState(0, true, D3D12_BLEND_ONE, D3D12_BLEND_ONE, D3D12_BLEND_OP_MIN, + gpb.SetBlendState(0, false, D3D12_BLEND_ONE, D3D12_BLEND_ONE, D3D12_BLEND_OP_ADD, D3D12_BLEND_ZERO, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD, D3D12_COLOR_WRITE_ENABLE_RED); for (u32 ds = 0; ds < 2; ds++) @@ -1412,6 +1491,7 @@ bool GSDevice12::CheckStagingBufferSize(u32 required_size) return false; } + m_readback_staging_buffer_size = required_size; return true; } @@ -1453,7 +1533,7 @@ void GSDevice12::DestroyStagingBuffer() void GSDevice12::DestroyResources() { - g_d3d12_context->ExecuteCommandList(true); + g_d3d12_context->ExecuteCommandList(D3D12::Context::WaitType::Sleep); for (auto& it : m_tfx_pipelines) g_d3d12_context->DeferObjectDestruction(it.second.get()); @@ -1520,6 +1600,7 @@ const ID3DBlob* GSDevice12::GetTFXGeometryShader(GSHWDrawConfig::GSSelector sel) sm.AddMacro("GS_IIP", sel.iip); sm.AddMacro("GS_PRIM", static_cast(sel.topology)); sm.AddMacro("GS_EXPAND", sel.expand); + sm.AddMacro("GS_FORWARD_PRIMID", sel.forward_primid); ComPtr gs(m_shader_cache.GetGeometryShader(m_tfx_source, sm.GetPtr(), "gs_main")); it = m_tfx_geometry_shaders.emplace(sel.key, std::move(gs)).first; @@ -1533,7 +1614,7 @@ const ID3DBlob* GSDevice12::GetTFXPixelShader(const GSHWDrawConfig::PSSelector& return it->second.get(); ShaderMacro sm(m_shader_cache.GetFeatureLevel()); - sm.AddMacro("PS_SCALE_FACTOR", GSConfig.UpscaleMultiplier); + sm.AddMacro("PS_SCALE_FACTOR", StringUtil::ToChars(GSConfig.UpscaleMultiplier)); sm.AddMacro("PS_FST", sel.fst); sm.AddMacro("PS_WMS", sel.wms); sm.AddMacro("PS_WMT", sel.wmt); @@ -1567,6 +1648,7 @@ const ID3DBlob* GSDevice12::GetTFXPixelShader(const GSHWDrawConfig::PSSelector& sm.AddMacro("PS_BLEND_C", sel.blend_c); sm.AddMacro("PS_BLEND_D", sel.blend_d); sm.AddMacro("PS_BLEND_MIX", sel.blend_mix); + sm.AddMacro("PS_FIXED_ONE_A", sel.fixed_one_a); sm.AddMacro("PS_PABE", sel.pabe); sm.AddMacro("PS_DITHER", sel.dither); sm.AddMacro("PS_ZCLAMP", sel.zclamp); @@ -1615,8 +1697,9 @@ GSDevice12::ComPtr GSDevice12::CreateTFXPipeline(const Pipe if (p.rt) { gpb.SetRenderTarget(0, - (p.ps.date >= 10) ? DXGI_FORMAT_R32_FLOAT : - (p.ps.hdr ? DXGI_FORMAT_R32G32B32A32_FLOAT : DXGI_FORMAT_R8G8B8A8_UNORM)); + IsDATEModePrimIDInit(p.ps.date) ? DXGI_FORMAT_R32_FLOAT : + p.ps.hdr ? DXGI_FORMAT_R32G32B32A32_FLOAT : + DXGI_FORMAT_R8G8B8A8_UNORM); } if (p.ds) gpb.SetDepthStencilFormat(DXGI_FORMAT_D32_FLOAT_S8X24_UINT); @@ -1656,7 +1739,7 @@ GSDevice12::ComPtr GSDevice12::CreateTFXPipeline(const Pipe } // Blending - if (p.ps.date >= 10) + if (IsDATEModePrimIDInit(p.ps.date)) { // image DATE prepass gpb.SetBlendState(0, true, D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_MIN, D3D12_BLEND_ONE, @@ -1739,10 +1822,20 @@ void GSDevice12::InitializeSamplers() pxFailRel("Failed to initialize samplers"); } +static D3D12::Context::WaitType GetWaitType(bool wait, bool spin) +{ + if (!wait) + return D3D12::Context::WaitType::None; + if (spin) + return D3D12::Context::WaitType::Spin; + else + return D3D12::Context::WaitType::Sleep; +} + void GSDevice12::ExecuteCommandList(bool wait_for_completion) { EndRenderPass(); - g_d3d12_context->ExecuteCommandList(wait_for_completion); + g_d3d12_context->ExecuteCommandList(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks)); InvalidateCachedState(); } @@ -1757,13 +1850,13 @@ void GSDevice12::ExecuteCommandList(bool wait_for_completion, const char* reason ExecuteCommandList(wait_for_completion); } -void GSDevice12::ExecuteCommandListAndRestartRenderPass(const char* reason) +void GSDevice12::ExecuteCommandListAndRestartRenderPass(bool wait_for_completion, const char* reason) { Console.Warning("Vulkan: Executing command buffer due to '%s'", reason); const bool was_in_render_pass = m_in_render_pass; EndRenderPass(); - g_d3d12_context->ExecuteCommandList(false); + g_d3d12_context->ExecuteCommandList(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks)); InvalidateCachedState(); if (was_in_render_pass) @@ -1918,7 +2011,7 @@ void GSDevice12::SetUtilityTexture(GSTexture* dtex, const D3D12::DescriptorHandl if (!GetTextureGroupDescriptors(&m_utility_texture_gpu, &handle, 1)) { - ExecuteCommandListAndRestartRenderPass("Ran out of utility texture descriptors"); + ExecuteCommandListAndRestartRenderPass(false, "Ran out of utility texture descriptors"); SetUtilityTexture(dtex, sampler); return; } @@ -1931,7 +2024,7 @@ void GSDevice12::SetUtilityTexture(GSTexture* dtex, const D3D12::DescriptorHandl if (!g_d3d12_context->GetSamplerAllocator().LookupSingle(&m_utility_sampler_gpu, sampler)) { - ExecuteCommandListAndRestartRenderPass("Ran out of utility sampler descriptors"); + ExecuteCommandListAndRestartRenderPass(false, "Ran out of utility sampler descriptors"); SetUtilityTexture(dtex, sampler); return; } @@ -2188,7 +2281,7 @@ bool GSDevice12::ApplyTFXState(bool already_execed) return true; u32 flags = m_dirty_flags; - m_dirty_flags &= ~DIRTY_TFX_STATE | DIRTY_CONSTANT_BUFFER_STATE; + m_dirty_flags &= ~(DIRTY_TFX_STATE | DIRTY_CONSTANT_BUFFER_STATE); // do cbuffer first, because it's the most likely to cause an exec if (flags & DIRTY_FLAG_VS_CONSTANT_BUFFER) @@ -2202,7 +2295,7 @@ bool GSDevice12::ApplyTFXState(bool already_execed) return false; } - ExecuteCommandListAndRestartRenderPass("Ran out of vertex uniform space"); + ExecuteCommandListAndRestartRenderPass(false, "Ran out of vertex uniform space"); return ApplyTFXState(true); } @@ -2223,7 +2316,7 @@ bool GSDevice12::ApplyTFXState(bool already_execed) return false; } - ExecuteCommandListAndRestartRenderPass("Ran out of pixel uniform space"); + ExecuteCommandListAndRestartRenderPass(false, "Ran out of pixel uniform space"); return ApplyTFXState(true); } @@ -2237,7 +2330,7 @@ bool GSDevice12::ApplyTFXState(bool already_execed) { if (!g_d3d12_context->GetSamplerAllocator().LookupGroup(&m_tfx_samplers_handle_gpu, m_tfx_samplers.data())) { - ExecuteCommandListAndRestartRenderPass("Ran out of sampler groups"); + ExecuteCommandListAndRestartRenderPass(false, "Ran out of sampler groups"); return ApplyTFXState(true); } @@ -2248,7 +2341,7 @@ bool GSDevice12::ApplyTFXState(bool already_execed) { if (!GetTextureGroupDescriptors(&m_tfx_textures_handle_gpu, m_tfx_textures.data(), 2)) { - ExecuteCommandListAndRestartRenderPass("Ran out of TFX texture descriptor groups"); + ExecuteCommandListAndRestartRenderPass(false, "Ran out of TFX texture descriptor groups"); return ApplyTFXState(true); } @@ -2259,7 +2352,7 @@ bool GSDevice12::ApplyTFXState(bool already_execed) { if (!GetTextureGroupDescriptors(&m_tfx_rt_textures_handle_gpu, m_tfx_textures.data() + 2, 2)) { - ExecuteCommandListAndRestartRenderPass("Ran out of TFX RT descriptor descriptor groups"); + ExecuteCommandListAndRestartRenderPass(false, "Ran out of TFX RT descriptor descriptor groups"); return ApplyTFXState(true); } @@ -2386,11 +2479,11 @@ GSTexture12* GSDevice12::SetupPrimitiveTrackingDATE(GSHWDrawConfig& config, Pipe // if the depth target has been cleared, we need to preserve that clear BeginRenderPass( - D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE, + D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_DISCARD, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE, GetLoadOpForTexture(static_cast(config.ds)), config.ds ? D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE : D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, - GSVector4(static_cast(std::numeric_limits::max()), 0.0f, 0.0f, 0.0f), + GSVector4::zero(), static_cast(config.ds)->GetClearDepth()); // draw the quad to prefill the image @@ -2410,6 +2503,7 @@ GSTexture12* GSDevice12::SetupPrimitiveTrackingDATE(GSHWDrawConfig& config, Pipe DrawPrimitive(); // image is now filled with either -1 or INT_MAX, so now we can do the prepass + SetPrimitiveTopology(s_primitive_topology_mapping[static_cast(config.topology)]); IASetVertexBuffer(config.verts, sizeof(GSVertex), config.nverts); IASetIndexBuffer(config.indices, config.nindices); @@ -2420,7 +2514,6 @@ GSTexture12* GSDevice12::SetupPrimitiveTrackingDATE(GSHWDrawConfig& config, Pipe init_pipe.bs = {}; init_pipe.rt = true; init_pipe.ps.blend_a = init_pipe.ps.blend_b = init_pipe.ps.blend_c = init_pipe.ps.blend_d = false; - init_pipe.ps.date += 10; init_pipe.ps.no_color = false; init_pipe.ps.no_color1 = true; if (BindDrawPipeline(init_pipe)) @@ -2441,9 +2534,6 @@ GSTexture12* GSDevice12::SetupPrimitiveTrackingDATE(GSHWDrawConfig& config, Pipe void GSDevice12::RenderHW(GSHWDrawConfig& config) { - static constexpr std::array primitive_topologies = - {{D3D_PRIMITIVE_TOPOLOGY_POINTLIST, D3D_PRIMITIVE_TOPOLOGY_LINELIST, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST}}; - // Destination Alpha Setup const bool stencil_DATE = (config.destination_alpha == GSHWDrawConfig::DestinationAlphaMode::Stencil || @@ -2467,6 +2557,7 @@ void GSDevice12::RenderHW(GSHWDrawConfig& config) } if (config.pal) PSSetShaderResource(1, config.pal, true); + if (config.blend.constant_enable) SetBlendConstants(config.blend.constant); @@ -2504,7 +2595,7 @@ void GSDevice12::RenderHW(GSHWDrawConfig& config) EndRenderPass(); GL_PUSH_("HDR Render Target Setup"); - hdr_rt = static_cast(CreateRenderTarget(rtsize.x, rtsize.y, GSTexture::Format::FloatColor, false)); + hdr_rt = static_cast(CreateRenderTarget(rtsize.x, rtsize.y, GSTexture::Format::HDRColor, false)); if (!hdr_rt) { Console.WriteLn("Failed to allocate HDR render target, aborting draw."); @@ -2533,7 +2624,7 @@ void GSDevice12::RenderHW(GSHWDrawConfig& config) else if (config.require_one_barrier) { // requires a copy of the RT - draw_rt_clone = static_cast(CreateTexture(rtsize.x, rtsize.y, false, GSTexture::Format::Color, false)); + draw_rt_clone = static_cast(CreateTexture(rtsize.x, rtsize.y, 1, GSTexture::Format::Color, false)); if (draw_rt_clone) { EndRenderPass(); @@ -2548,23 +2639,33 @@ void GSDevice12::RenderHW(GSHWDrawConfig& config) } } - if (config.tex && config.tex == config.ds) + if (config.tex) { - // requires a copy of the depth buffer. this is mainly for ico. - copy_ds = static_cast(CreateDepthStencil(rtsize.x, rtsize.y, GSTexture::Format::DepthStencil, false)); - if (copy_ds) + if (config.tex == config.ds) { - EndRenderPass(); + // requires a copy of the depth buffer. this is mainly for ico. + copy_ds = static_cast(CreateDepthStencil(rtsize.x, rtsize.y, GSTexture::Format::DepthStencil, false)); + if (copy_ds) + { + EndRenderPass(); - GL_PUSH("Copy depth to temp texture for shuffle {%d,%d %dx%d}", - config.drawarea.left, config.drawarea.top, - config.drawarea.width(), config.drawarea.height()); + GL_PUSH("Copy depth to temp texture for shuffle {%d,%d %dx%d}", + config.drawarea.left, config.drawarea.top, + config.drawarea.width(), config.drawarea.height()); - copy_ds->SetState(GSTexture::State::Invalidated); - CopyRect(config.ds, copy_ds, config.drawarea, config.drawarea.left, config.drawarea.top); - PSSetShaderResource(0, copy_ds, true); + pxAssert(copy_ds->GetState() == GSTexture::State::Invalidated); + CopyRect(config.ds, copy_ds, GSVector4i(config.ds->GetSize()).zwxy(), 0, 0); + PSSetShaderResource(0, copy_ds, true); + } } } + // clear texture binding when it's bound to RT or DS + else if (m_tfx_textures[0] && + ((config.rt && static_cast(config.rt)->GetSRVDescriptor() == m_tfx_textures[0]) || + (config.ds && static_cast(config.ds)->GetSRVDescriptor() == m_tfx_textures[0]))) + { + PSSetShaderResource(0, nullptr, false); + } // avoid restarting the render pass just to switch from rt+depth to rt and vice versa if (m_in_render_pass && !hdr_rt && !draw_ds && m_current_depth_target && m_current_render_target == draw_rt && config.tex != m_current_depth_target) @@ -2604,7 +2705,7 @@ void GSDevice12::RenderHW(GSHWDrawConfig& config) } // VB/IB upload, if we did DATE setup and it's not HDR this has already been done - SetPrimitiveTopology(primitive_topologies[static_cast(config.topology)]); + SetPrimitiveTopology(s_primitive_topology_mapping[static_cast(config.topology)]); if (!date_image || hdr_rt) { IASetVertexBuffer(config.verts, sizeof(GSVertex), config.nverts); diff --git a/pcsx2/GS/Renderers/DX12/GSDevice12.h b/pcsx2/GS/Renderers/DX12/GSDevice12.h index 837f0edde2..01e957c070 100644 --- a/pcsx2/GS/Renderers/DX12/GSDevice12.h +++ b/pcsx2/GS/Renderers/DX12/GSDevice12.h @@ -102,6 +102,7 @@ public: public: ShaderMacro(D3D_FEATURE_LEVEL fl); void AddMacro(const char* n, int d); + void AddMacro(const char* n, std::string d); D3D_SHADER_MACRO* GetPtr(void); }; @@ -130,11 +131,13 @@ public: UTILITY_ROOT_SIGNATURE_PARAM_PUSH_CONSTANTS = 0, UTILITY_ROOT_SIGNATURE_PARAM_PS_TEXTURES = 1, UTILITY_ROOT_SIGNATURE_PARAM_PS_SAMPLERS = 2, + + CAS_ROOT_SIGNATURE_PARAM_PUSH_CONSTANTS = 0, + CAS_ROOT_SIGNATURE_PARAM_SRC_TEXTURE = 1, + CAS_ROOT_SIGNATURE_PARAM_DST_TEXTURE = 2 }; private: - static constexpr u32 SHADER_VERSION = 1; - ComPtr m_tfx_root_signature; ComPtr m_utility_root_signature; @@ -157,7 +160,7 @@ private: std::array, static_cast(PresentShader::Count)> m_present{}; std::array, 16> m_color_copy{}; std::array, 2> m_merge{}; - std::array, 4> m_interlace{}; + std::array, NUM_INTERLACE_SHADERS> m_interlace{}; std::array, 2> m_hdr_setup_pipelines{}; // [depth] std::array, 2> m_hdr_finish_pipelines{}; // [depth] std::array, 2>, 2> m_date_image_setup_pipelines{}; // [depth][datm] @@ -169,6 +172,10 @@ private: std::unordered_map, GSHWDrawConfig::PSSelectorHash> m_tfx_pixel_shaders; std::unordered_map, PipelineSelectorHash> m_tfx_pipelines; + ComPtr m_cas_root_signature; + ComPtr m_cas_upscale_pipeline; + ComPtr m_cas_sharpen_pipeline; + GSHWDrawConfig::VSConstantBuffer m_vs_cb_cache; GSHWDrawConfig::PSConstantBuffer m_ps_cb_cache; @@ -182,10 +189,12 @@ private: void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) final; - void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0) final; + void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0, int bufIdx = 0) final; void DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float params[4]) final; void DoFXAA(GSTexture* sTex, GSTexture* dTex) final; + bool DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) final; + bool GetSampler(D3D12::DescriptorHandle* cpu_handle, GSHWDrawConfig::SamplerSelector ss); void ClearSamplerCache() final; bool GetTextureGroupDescriptors(D3D12::DescriptorHandle* gpu_handle, const D3D12::DescriptorHandle* cpu_handles, u32 count); @@ -209,6 +218,7 @@ private: bool CompileInterlacePipelines(); bool CompileMergePipelines(); bool CompilePostProcessingPipelines(); + bool CompileCASPipelines(); bool CheckStagingBufferSize(u32 required_size); bool MapStagingBuffer(u32 size_to_read); @@ -223,7 +233,7 @@ public: __fi static GSDevice12* GetInstance() { return static_cast(g_gs_device.get()); } - bool Create(HostDisplay* display) override; + bool Create() override; void Destroy() override; void ResetAPIState() override; @@ -287,7 +297,7 @@ public: /// Ends any render pass, executes the command buffer, and invalidates cached state. void ExecuteCommandList(bool wait_for_completion); void ExecuteCommandList(bool wait_for_completion, const char* reason, ...); - void ExecuteCommandListAndRestartRenderPass(const char* reason); + void ExecuteCommandListAndRestartRenderPass(bool wait_for_completion, const char* reason); /// Set dirty flags on everything to force re-bind at next draw time. void InvalidateCachedState(); diff --git a/pcsx2/GS/Renderers/DX12/GSTexture12.cpp b/pcsx2/GS/Renderers/DX12/GSTexture12.cpp index 7346d9a38f..850589734a 100644 --- a/pcsx2/GS/Renderers/DX12/GSTexture12.cpp +++ b/pcsx2/GS/Renderers/DX12/GSTexture12.cpp @@ -48,13 +48,11 @@ std::unique_ptr GSTexture12::Create(Type type, u32 width, u32 heigh { case Type::Texture: { - // this is a little annoying. basically, to do mipmap generation, we need to be a render target. - const D3D12_RESOURCE_FLAGS flags = (levels > 1) ? D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET : D3D12_RESOURCE_FLAG_NONE; - if (levels > 1 && d3d_format != DXGI_FORMAT_R8G8B8A8_UNORM) - { - Console.Warning("DX12: Refusing to create a %ux%u format %u mipmapped texture", width, height, format); - return nullptr; - } + // This is a little annoying. basically, to do mipmap generation, we need to be a render target. + // If it's a compressed texture, we won't be generating mips anyway, so this should be fine. + const D3D12_RESOURCE_FLAGS flags = (levels > 1 && !IsCompressedFormat(format)) ? + D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET : + D3D12_RESOURCE_FLAG_NONE; D3D12::Texture texture; if (!texture.Create(width, height, levels, d3d_format, srv_format, @@ -99,6 +97,21 @@ std::unique_ptr GSTexture12::Create(Type type, u32 width, u32 heigh return std::make_unique(type, format, std::move(texture)); } + case Type::RWTexture: + { + pxAssert(levels == 1); + + D3D12::Texture texture; + if (!texture.Create(width, height, levels, d3d_format, srv_format, DXGI_FORMAT_UNKNOWN, + DXGI_FORMAT_UNKNOWN, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS, D3D12MA::ALLOCATION_FLAG_COMMITTED)) + { + return {}; + } + + D3D12::SetObjectNameFormatted(texture.GetResource(), "%ux%u RW texture", width, height); + return std::make_unique(type, format, std::move(texture)); + } + default: return {}; } @@ -169,10 +182,12 @@ bool GSTexture12::Update(const GSVector4i& r, const void* data, int pitch, int l g_perfmon.Put(GSPerfMon::TextureUploads, 1); - const u32 width = r.width(); - const u32 height = r.height(); + // Footprint and box must be block aligned for compressed textures. + const u32 block_size = GetCompressedBlockSize(); + const u32 width = Common::AlignUpPow2(r.width(), block_size); + const u32 height = Common::AlignUpPow2(r.height(), block_size); const u32 upload_pitch = Common::AlignUpPow2(pitch, D3D12_TEXTURE_DATA_PITCH_ALIGNMENT); - const u32 required_size = CalcUploadSize(height, upload_pitch); + const u32 required_size = CalcUploadSize(r.height(), upload_pitch); D3D12_TEXTURE_COPY_LOCATION srcloc; srcloc.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; @@ -235,8 +250,9 @@ bool GSTexture12::Update(const GSVector4i& r, const void* data, int pitch, int l dstloc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; dstloc.SubresourceIndex = layer; - const D3D12_BOX srcbox{0u, 0u, 0u, static_cast(r.width()), static_cast(r.height()), 1u}; - cmdlist->CopyTextureRegion(&dstloc, r.x, r.y, 0, &srcloc, &srcbox); + const D3D12_BOX srcbox{0u, 0u, 0u, width, height, 1u}; + cmdlist->CopyTextureRegion(&dstloc, Common::AlignDownPow2((u32)r.x, block_size), + Common::AlignDownPow2((u32)r.y, block_size), 0, &srcloc, &srcbox); if (m_texture.GetState() != D3D12_RESOURCE_STATE_COPY_DEST) m_texture.TransitionSubresourceToState(cmdlist, layer, D3D12_RESOURCE_STATE_COPY_DEST, m_texture.GetState()); @@ -278,7 +294,8 @@ bool GSTexture12::Map(GSMap& m, const GSVector4i* r, int layer) void GSTexture12::Unmap() { - pxAssert(m_map_level < m_texture.GetLevels()); + // this can't handle blocks/compressed formats at the moment. + pxAssert(m_map_level < m_texture.GetLevels() && !IsCompressedFormat()); g_perfmon.Put(GSPerfMon::TextureUploads, 1); // TODO: non-tightly-packed formats @@ -336,6 +353,8 @@ void GSTexture12::Unmap() void GSTexture12::GenerateMipmap() { + pxAssert(!IsCompressedFormat(m_format)); + for (int dst_level = 1; dst_level < m_mipmap_levels; dst_level++) { const int src_level = dst_level - 1; @@ -381,12 +400,12 @@ void GSTexture12::CommitClear(ID3D12GraphicsCommandList* cmdlist) if (IsDepthStencil()) { m_texture.TransitionToState(cmdlist, D3D12_RESOURCE_STATE_DEPTH_WRITE); - cmdlist->ClearDepthStencilView(m_texture.GetRTVOrDSVDescriptor(), D3D12_CLEAR_FLAG_DEPTH, m_clear_value.depth, 0, 0, nullptr); + cmdlist->ClearDepthStencilView(m_texture.GetWriteDescriptor(), D3D12_CLEAR_FLAG_DEPTH, m_clear_value.depth, 0, 0, nullptr); } else { m_texture.TransitionToState(cmdlist, D3D12_RESOURCE_STATE_RENDER_TARGET); - cmdlist->ClearRenderTargetView(m_texture.GetRTVOrDSVDescriptor(), m_clear_value.color, 0, nullptr); + cmdlist->ClearRenderTargetView(m_texture.GetWriteDescriptor(), m_clear_value.color, 0, nullptr); } SetState(GSTexture::State::Dirty); diff --git a/pcsx2/GS/Renderers/DX12/GSTexture12.h b/pcsx2/GS/Renderers/DX12/GSTexture12.h index 09e16d2f6c..544ccb5ca8 100644 --- a/pcsx2/GS/Renderers/DX12/GSTexture12.h +++ b/pcsx2/GS/Renderers/DX12/GSTexture12.h @@ -38,7 +38,7 @@ public: __fi D3D12::Texture& GetTexture() { return m_texture; } __fi const D3D12::DescriptorHandle& GetSRVDescriptor() const { return m_texture.GetSRVDescriptor(); } - __fi const D3D12::DescriptorHandle& GetRTVOrDSVHandle() const { return m_texture.GetRTVOrDSVDescriptor(); } + __fi const D3D12::DescriptorHandle& GetRTVOrDSVHandle() const { return m_texture.GetWriteDescriptor(); } __fi D3D12_RESOURCE_STATES GetResourceState() const { return m_texture.GetState(); } __fi DXGI_FORMAT GetNativeFormat() const { return m_texture.GetFormat(); } __fi ID3D12Resource* GetResource() const { return m_texture.GetResource(); } diff --git a/pcsx2/GS/Renderers/HW/GSHwHack.cpp b/pcsx2/GS/Renderers/HW/GSHwHack.cpp index c76811fc3e..a84f175782 100644 --- a/pcsx2/GS/Renderers/HW/GSHwHack.cpp +++ b/pcsx2/GS/Renderers/HW/GSHwHack.cpp @@ -29,7 +29,7 @@ CRC::Region g_crc_region = CRC::NoRegion; // Partial level, broken on all renderers. //////////////////////////////////////////////////////////////////////////////// -bool GSC_BigMuthaTruckers(const GSFrameInfo& fi, int& skip) +bool GSC_BigMuthaTruckers(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -47,29 +47,13 @@ bool GSC_BigMuthaTruckers(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_DBZBT3(const GSFrameInfo& fi, int& skip) -{ - if (skip == 0) - { - if ((CRC_Aggressive || !s_nativeres) && fi.TME && (fi.FBP == 0x03400 || fi.FBP == 0x02e00) && fi.FPSM == fi.TPSM && fi.TBP0 == 0x03f00 && fi.TPSM == PSM_PSMCT32) - { - // Ghosting/Blur effect. Upscaling issue. - // Can be fixed with TC X,Y offsets. - // Don't enable hack on native res if crc is below aggressive. - skip = 3; - } - } - - return true; -} - -bool GSC_DeathByDegreesTekkenNinaWilliams(const GSFrameInfo& fi, int& skip) +bool GSC_DeathByDegreesTekkenNinaWilliams(const GSFrameInfo& fi, int& skip) noexcept { // Note: Game also has issues with texture shuffle not supported on strange clamp mode. // See https://forums.pcsx2.net/Thread-GSDX-Texture-Cache-Bug-Report-Death-By-Degrees-SLUS-20934-NTSC if (skip == 0) { - if ((CRC_Aggressive || !s_nativeres) && fi.TME && fi.FBP == 0 && fi.TBP0 == 0x34a0 && fi.TPSM == PSM_PSMCT32) + if (!s_nativeres && fi.TME && fi.FBP == 0 && fi.TBP0 == 0x34a0 && fi.TPSM == PSM_PSMCT32) { // Don't enable hack on native res if crc is below aggressive. // Upscaling issue similar to Tekken 5. @@ -83,7 +67,7 @@ bool GSC_DeathByDegreesTekkenNinaWilliams(const GSFrameInfo& fi, int& skip) } else { - if ((CRC_Aggressive || !s_nativeres) && fi.TME && (fi.FBP | fi.TBP0 | fi.FPSM | fi.TPSM) && fi.FBMSK == 0x00FFFFFF) + if (!s_nativeres && fi.TME && (fi.FBP | fi.TBP0 | fi.FPSM | fi.TPSM) && fi.FBMSK == 0x00FFFFFF) { // Needs to be further tested so assume it's related with the upscaling hack. skip = 1; // Animation speed @@ -93,7 +77,7 @@ bool GSC_DeathByDegreesTekkenNinaWilliams(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_GiTS(const GSFrameInfo& fi, int& skip) +bool GSC_GiTS(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -108,7 +92,7 @@ bool GSC_GiTS(const GSFrameInfo& fi, int& skip) } // Channel effect not properly supported yet -bool GSC_Manhunt2(const GSFrameInfo& fi, int& skip) +bool GSC_Manhunt2(const GSFrameInfo& fi, int& skip) noexcept { /* * The game readback RT as 8 bits index texture to apply a non-linear brightness/gamma correction on all channel @@ -139,10 +123,10 @@ bool GSC_Manhunt2(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_CrashBandicootWoC(const GSFrameInfo& fi, int& skip) +bool GSC_CrashBandicootWoC(const GSFrameInfo& fi, int& skip) noexcept { // Channel effect not properly supported - Removes fog to fix the fog wall issue on Direct3D at any resolution, and while upscaling on every Hardware renderer. - if (skip == 0) + if (skip == 0) { if (fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x008c0 || fi.FBP == 0x00a00) && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x008c0 || fi.TBP0 == 0x00a00) && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.FPSM == fi.TPSM) { @@ -169,7 +153,7 @@ bool GSC_CrashBandicootWoC(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_SacredBlaze(const GSFrameInfo& fi, int& skip) +bool GSC_SacredBlaze(const GSFrameInfo& fi, int& skip) noexcept { //Fix Sacred Blaze rendering glitches if (skip == 0) @@ -183,7 +167,7 @@ bool GSC_SacredBlaze(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_Spartan(const GSFrameInfo& fi, int& skip) +bool GSC_Spartan(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -202,26 +186,11 @@ bool GSC_Spartan(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_IkkiTousen(const GSFrameInfo& fi, int& skip) +bool GSC_Oneechanbara2Special(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { - if ((CRC_Aggressive || !s_nativeres) && fi.TME && fi.FBP == 0x00700 && fi.FPSM == PSM_PSMZ24 && fi.TBP0 == 0x01180 && fi.TPSM == PSM_PSMZ24) - { - // Might not be needed if any of the upscaling hacks fix the issues, needs to be further tested. - // Don't enable hack on native res if crc is below aggressive. - skip = 11; // Upscaling blur/ghosting - } - } - - return true; -} - -bool GSC_Oneechanbara2Special(const GSFrameInfo& fi, int& skip) -{ - if (skip == 0) - { - if ((CRC_Aggressive || !s_nativeres) && fi.TPSM == PSM_PSMCT24 && fi.TME && fi.FBP == 0x01180) + if (!s_nativeres && fi.TPSM == PSM_PSMCT24 && fi.TME && fi.FBP == 0x01180) { // Don't enable hack on native res if crc is below aggressive. // Ghosting upscaling issue, bottom and right red lines also by upscaling. @@ -232,7 +201,7 @@ bool GSC_Oneechanbara2Special(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_SakuraTaisen(const GSFrameInfo& fi, int& skip) +bool GSC_SakuraTaisen(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -264,31 +233,7 @@ bool GSC_SakuraTaisen(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_ShadowofRome(const GSFrameInfo& fi, int& skip) -{ - if (skip == 0) - { - if (fi.FBP && fi.TPSM == PSM_PSMT8H && (fi.FBMSK == 0x00FFFFFF)) - { - // Depth issues on all renders, white wall and white duplicate characters. - skip = 1; - } - else if (fi.TME == 0x0001 && (fi.TBP0 == 0x1300 || fi.TBP0 == 0x0f00) && fi.FBMSK >= 0xFFFFFF) - { - // Cause a grey transparent wall (D3D) and a transparent vertical grey line (all renders) on the left side of the screen. - // Blur effect maybe ? - skip = 1; - } - else if (fi.TME && fi.FPSM == PSM_PSMCT32 && (fi.TBP0 == 0x0160 || fi.TBP0 == 0x01e0 || fi.TBP0 <= 0x0800) && fi.TPSM == PSM_PSMT8) - { - skip = 1; // Speedhack ? - } - } - - return true; -} - -bool GSC_SFEX3(const GSFrameInfo& fi, int& skip) +bool GSC_SFEX3(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -303,11 +248,11 @@ bool GSC_SFEX3(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_Tekken5(const GSFrameInfo& fi, int& skip) +bool GSC_Tekken5(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { - if ((CRC_Aggressive || !s_nativeres) && fi.TME && (fi.FBP == 0x02d60 || fi.FBP == 0x02d80 || fi.FBP == 0x02ea0 || fi.FBP == 0x03620 || fi.FBP == 0x03640) && fi.FPSM == fi.TPSM && fi.TBP0 == 0x00000 && fi.TPSM == PSM_PSMCT32) + if (!s_nativeres && fi.TME && (fi.FBP == 0x02d60 || fi.FBP == 0x02d80 || fi.FBP == 0x02ea0 || fi.FBP == 0x03620 || fi.FBP == 0x03640) && fi.FPSM == fi.TPSM && fi.TBP0 == 0x00000 && fi.TPSM == PSM_PSMCT32) { // Don't enable hack on native res if crc is below aggressive. // Fixes/removes ghosting/blur effect and white lines appearing in stages: Moonfit Wilderness, Acid Rain - caused by upscaling. @@ -326,7 +271,7 @@ bool GSC_Tekken5(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_TombRaiderAnniversary(const GSFrameInfo& fi, int& skip) +bool GSC_TombRaiderAnniversary(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -339,7 +284,7 @@ bool GSC_TombRaiderAnniversary(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_TombRaiderLegend(const GSFrameInfo& fi, int& skip) +bool GSC_TombRaiderLegend(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -357,7 +302,7 @@ bool GSC_TombRaiderLegend(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_TombRaiderUnderWorld(const GSFrameInfo& fi, int& skip) +bool GSC_TombRaiderUnderWorld(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -374,7 +319,7 @@ bool GSC_TombRaiderUnderWorld(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_BurnoutGames(const GSFrameInfo& fi, int& skip) +bool GSC_BurnoutGames(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -390,7 +335,7 @@ bool GSC_BurnoutGames(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_MidnightClub3(const GSFrameInfo& fi, int& skip) +bool GSC_MidnightClub3(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -406,7 +351,7 @@ bool GSC_MidnightClub3(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_TalesOfLegendia(const GSFrameInfo& fi, int& skip) +bool GSC_TalesOfLegendia(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -435,7 +380,7 @@ bool GSC_TalesOfLegendia(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_Kunoichi(const GSFrameInfo& fi, int& skip) +bool GSC_Kunoichi(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -460,7 +405,7 @@ bool GSC_Kunoichi(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_ZettaiZetsumeiToshi2(const GSFrameInfo& fi, int& skip) +bool GSC_ZettaiZetsumeiToshi2(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -509,7 +454,7 @@ bool GSC_ZettaiZetsumeiToshi2(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_SakuraWarsSoLongMyLove(const GSFrameInfo& fi, int& skip) +bool GSC_SakuraWarsSoLongMyLove(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -530,11 +475,11 @@ bool GSC_SakuraWarsSoLongMyLove(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_FightingBeautyWulong(const GSFrameInfo& fi, int& skip) +bool GSC_FightingBeautyWulong(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { - if ((CRC_Aggressive || !s_nativeres) && fi.TME && (fi.TBP0 == 0x0700 || fi.TBP0 == 0x0a80) && (fi.TPSM == PSM_PSMCT32 || fi.TPSM == PSM_PSMCT24)) + if (!s_nativeres && fi.TME && (fi.TBP0 == 0x0700 || fi.TBP0 == 0x0a80) && (fi.TPSM == PSM_PSMCT32 || fi.TPSM == PSM_PSMCT24)) { // Don't enable hack on native res if crc is below aggressive. // removes glow/blur which cause ghosting and other sprite issues similar to Tekken 5 @@ -545,7 +490,7 @@ bool GSC_FightingBeautyWulong(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_GodHand(const GSFrameInfo& fi, int& skip) +bool GSC_GodHand(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -558,7 +503,7 @@ bool GSC_GodHand(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_KnightsOfTheTemple2(const GSFrameInfo& fi, int& skip) +bool GSC_KnightsOfTheTemple2(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -575,11 +520,11 @@ bool GSC_KnightsOfTheTemple2(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_UltramanFightingEvolution(const GSFrameInfo& fi, int& skip) +bool GSC_UltramanFightingEvolution(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { - if ((CRC_Aggressive || !s_nativeres) && fi.TME && fi.FBP == 0x2a00 && fi.FPSM == PSM_PSMZ24 && fi.TBP0 == 0x1c00 && fi.TPSM == PSM_PSMZ24) + if (!s_nativeres && fi.TME && fi.FBP == 0x2a00 && fi.FPSM == PSM_PSMZ24 && fi.TBP0 == 0x1c00 && fi.TPSM == PSM_PSMZ24) { // Don't enable hack on native res if crc is below aggressive. skip = 5; // blur @@ -589,7 +534,7 @@ bool GSC_UltramanFightingEvolution(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_TalesofSymphonia(const GSFrameInfo& fi, int& skip) +bool GSC_TalesofSymphonia(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -606,11 +551,11 @@ bool GSC_TalesofSymphonia(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_Simple2000Vol114(const GSFrameInfo& fi, int& skip) +bool GSC_Simple2000Vol114(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { - if ((CRC_Aggressive || !s_nativeres) && fi.TME == 0 && (fi.FBP == 0x1500) && (fi.TBP0 == 0x2c97 || fi.TBP0 == 0x2ace || fi.TBP0 == 0x03d0 || fi.TBP0 == 0x2448) && (fi.FBMSK == 0x0000)) + if (!s_nativeres && fi.TME == 0 && (fi.FBP == 0x1500) && (fi.TBP0 == 0x2c97 || fi.TBP0 == 0x2ace || fi.TBP0 == 0x03d0 || fi.TBP0 == 0x2448) && (fi.FBMSK == 0x0000)) { // Don't enable hack on native res if crc is below aggressive. // Upscaling issues, removes glow/blur effect which fixes ghosting. @@ -626,7 +571,7 @@ bool GSC_Simple2000Vol114(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_UrbanReign(const GSFrameInfo& fi, int& skip) +bool GSC_UrbanReign(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -639,20 +584,7 @@ bool GSC_UrbanReign(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_SkyGunner(const GSFrameInfo& fi, int& skip) -{ - if (skip == 0) - { - if (!fi.TME && !(fi.FBP == 0x0 || fi.FBP == 0x00800 || fi.FBP == 0x008c0 || fi.FBP == 0x03e00) && fi.FPSM == PSM_PSMCT32 && (fi.TBP0 == 0x0 || fi.TBP0 == 0x01800) && fi.TPSM == PSM_PSMCT32) - { - skip = 1; // Huge Vram usage - } - } - - return true; -} - -bool GSC_SteambotChronicles(const GSFrameInfo& fi, int& skip) +bool GSC_SteambotChronicles(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -677,11 +609,11 @@ bool GSC_SteambotChronicles(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_YakuzaGames(const GSFrameInfo& fi, int& skip) +bool GSC_YakuzaGames(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { - if ((CRC_Aggressive || !s_nativeres) && !fi.TME && (fi.FBP == 0x1c20 || fi.FBP == 0x1e20 || fi.FBP == 0x1620) && (fi.TBP0 == 0xe00 || fi.TBP0 == 0x1000 || fi.TBP0 == 0x800) && fi.TPSM == PSM_PSMZ24 && fi.FPSM == PSM_PSMCT32 + if (!s_nativeres && !fi.TME && (fi.FBP == 0x1c20 || fi.FBP == 0x1e20 || fi.FBP == 0x1620) && (fi.TBP0 == 0xe00 || fi.TBP0 == 0x1000 || fi.TBP0 == 0x800) && fi.TPSM == PSM_PSMZ24 && fi.FPSM == PSM_PSMCT32 /*&& fi.FBMSK == 0xffffff && fi.TZTST && !GSUtil::HasSharedBits(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)*/) { // Don't enable hack on native res if crc is below aggressive. @@ -697,7 +629,7 @@ bool GSC_YakuzaGames(const GSFrameInfo& fi, int& skip) // Full level, correctly emulated on OpenGL/Vulkan but can be used as potential speed hack //////////////////////////////////////////////////////////////////////////////// -bool GSC_GetawayGames(const GSFrameInfo& fi, int& skip) +bool GSC_GetawayGames(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -710,46 +642,11 @@ bool GSC_GetawayGames(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_TriAceGames(const GSFrameInfo& fi, int& skip) -{ - // Tri Ace Games: ValkyrieProfile2, RadiataStories, StarOcean3 - // - // The games emulate a stencil buffer with the alpha channel of the RT - // The operation of the stencil is selected with the palette - // For example -1 wrap will be [240, 16, 32, 48 ....] - // i.e. p[A>>4] = (A - 16) % 256 - // - // The fastest and accurate solution will be to replace this pseudo stencil - // by a dedicated GPU draw call - // 1/ Use future GPU capabilities to do a "kind" of SW blending - // 2/ Use a real stencil/atomic image, and then compute the RT alpha value - // - // Both of those solutions will increase code complexity (and only avoid upscaling - // glitches) - - if (skip == 0) - { - if (fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH) - { - skip = 1000; - } - } - else - { - if (!(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH)) - { - skip = 0; - } - } - - return true; -} - //////////////////////////////////////////////////////////////////////////////// // Aggressive only hack //////////////////////////////////////////////////////////////////////////////// -bool GSC_AceCombat4(const GSFrameInfo& fi, int& skip) +bool GSC_AceCombat4(const GSFrameInfo& fi, int& skip) noexcept { // Removes clouds for a good speed boost, removes both 3D clouds(invisible with Hardware renderers, but cause slowdown) and 2D background clouds. // Removes blur from player airplane. @@ -767,7 +664,7 @@ bool GSC_AceCombat4(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_FFXGames(const GSFrameInfo& fi, int& skip) +bool GSC_FFXGames(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -786,7 +683,7 @@ bool GSC_FFXGames(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_Okami(const GSFrameInfo& fi, int& skip) +bool GSC_Okami(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -806,7 +703,7 @@ bool GSC_Okami(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_RedDeadRevolver(const GSFrameInfo& fi, int& skip) +bool GSC_RedDeadRevolver(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -819,7 +716,7 @@ bool GSC_RedDeadRevolver(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_ShinOnimusha(const GSFrameInfo& fi, int& skip) +bool GSC_ShinOnimusha(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -848,7 +745,7 @@ bool GSC_ShinOnimusha(const GSFrameInfo& fi, int& skip) return true; } -bool GSC_XenosagaE3(const GSFrameInfo& fi, int& skip) +bool GSC_XenosagaE3(const GSFrameInfo& fi, int& skip) noexcept { if (skip == 0) { @@ -880,7 +777,7 @@ bool GSC_XenosagaE3(const GSFrameInfo& fi, int& skip) //////////////////////////////////////////////////////////////////////////////// -void GSState::SetupCrcHack() +void GSState::SetupCrcHack() noexcept { GetSkipCount lut[CRC::TitleCount]; @@ -899,7 +796,6 @@ void GSState::SetupCrcHack() lut[CRC::SacredBlaze] = GSC_SacredBlaze; lut[CRC::SakuraTaisen] = GSC_SakuraTaisen; lut[CRC::SakuraWarsSoLongMyLove] = GSC_SakuraWarsSoLongMyLove; - lut[CRC::ShadowofRome] = GSC_ShadowofRome; lut[CRC::Simple2000Vol114] = GSC_Simple2000Vol114; lut[CRC::SFEX3] = GSC_SFEX3; lut[CRC::TalesOfLegendia] = GSC_TalesOfLegendia; @@ -913,7 +809,6 @@ void GSState::SetupCrcHack() // Channel Effect lut[CRC::CrashBandicootWoC] = GSC_CrashBandicootWoC; lut[CRC::GiTS] = GSC_GiTS; - lut[CRC::SkyGunner] = GSC_SkyGunner; // Maybe not a channel effect lut[CRC::Spartan] = GSC_Spartan; lut[CRC::SteambotChronicles] = GSC_SteambotChronicles; @@ -928,9 +823,7 @@ void GSState::SetupCrcHack() lut[CRC::DeathByDegreesTekkenNinaWilliams] = GSC_DeathByDegreesTekkenNinaWilliams; // + Upscaling issues // Upscaling hacks - lut[CRC::DBZBT3] = GSC_DBZBT3; lut[CRC::FightingBeautyWulong] = GSC_FightingBeautyWulong; - lut[CRC::IkkiTousen] = GSC_IkkiTousen; lut[CRC::Oneechanbara2Special] = GSC_Oneechanbara2Special; lut[CRC::UltramanFightingEvolution] = GSC_UltramanFightingEvolution; lut[CRC::YakuzaGames] = GSC_YakuzaGames; @@ -941,11 +834,6 @@ void GSState::SetupCrcHack() { // Accurate Blending lut[CRC::GetawayGames] = GSC_GetawayGames; // Blending High - - // These games emulate a stencil buffer with the alpha channel of the RT (too slow to move to CRC_Aggressive) - // Needs at least Basic Blending, - // see https://github.com/PCSX2/pcsx2/pull/2921 - lut[CRC::TriAceGames] = GSC_TriAceGames; } if (CRC_Aggressive) @@ -972,7 +860,7 @@ void GSState::SetupCrcHack() bool GSState::IsBadFrame() { - GSFrameInfo fi; + GSFrameInfo fi = {0}; fi.FBP = m_context->FRAME.Block(); fi.FPSM = m_context->FRAME.PSM; diff --git a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp index 80a2dfcda8..dff7bc435a 100644 --- a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp +++ b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp @@ -17,24 +17,23 @@ #include "GSRendererHW.h" #include "GSTextureReplacements.h" #include "GS/GSGL.h" -#include "GS/Renderers/SW/GSTextureCacheSW.h" -#include "GS/Renderers/SW/GSDrawScanline.h" #include "Host.h" +#include "common/Align.h" #include "common/StringUtil.h" GSRendererHW::GSRendererHW() : GSRenderer() - , m_width(default_rt_size.x) - , m_height(default_rt_size.y) , m_tc(new GSTextureCache()) , m_src(nullptr) , m_reset(false) + , m_tex_is_fb(false) , m_channel_shuffle(false) , m_userhacks_tcoffset(false) , m_userhacks_tcoffset_x(0) , m_userhacks_tcoffset_y(0) , m_lod(GSVector2i(0, 0)) { + MULTI_ISA_SELECT(GSRendererHWPopulateFunctions)(*this); m_mipmap = (GSConfig.HWMipmap >= HWMipmapLevel::Basic); SetTCOffset(); @@ -50,7 +49,7 @@ GSRendererHW::GSRendererHW() ResetStates(); } -void GSRendererHW::SetScaling() +GSVector2i GSRendererHW::GetOutputSize(int real_h) { GSVector2i crtc_size(GetResolution()); @@ -73,9 +72,9 @@ void GSRendererHW::SetScaling() { if (IsEnabled(i)) { - GSVector4i dr = GetDisplayRect(i); + const GSVector4i dr = GetDisplayRect(i); - GSVector2i display_diff(dr.left - display_baseline.x, dr.top - display_baseline.y); + const GSVector2i display_diff(dr.left - display_baseline.x, dr.top - display_baseline.y); if (display_diff.x != 0 && abs(display_diff.x) < 4 && crtc_size.x < display_width) crtc_size.x -= display_diff.x; @@ -90,63 +89,11 @@ void GSRendererHW::SetScaling() } } - // Details of (potential) perf impact of a big framebuffer - // 1/ extra memory - // 2/ texture cache framebuffer rescaling/copy - // 3/ upload of framebuffer (preload hack) - // 4/ framebuffer clear (color/depth/stencil) - // 5/ read back of the frambuffer - // - // With the solution - // 1/ Nothing to do.Except the texture cache bug (channel shuffle effect) - // most of the market is 1GB of VRAM (and soon 2GB) - // 2/ limit rescaling/copy to the valid data of the framebuffer - // 3/ ??? no solution so far - // 4a/ stencil can be limited to valid data. - // 4b/ is it useful to clear color? depth? (in any case, it ought to be few operation) - // 5/ limit the read to the valid data + // Include negative display offsets in the height here. + crtc_size.y = std::max(crtc_size.y, real_h); - // Framebuffer width is always a multiple of 64 so at certain cases it can't cover some weird width values. - // 480P , 576P use width as 720 which is not referencable by FBW * 64. so it produces 704 ( the closest value multiple by 64). - // In such cases, let's just use the CRTC width. - const int fb_width = std::max({(int)m_context->FRAME.FBW * 64, crtc_size.x, 512}); - // GS doesn't have a specific register for the FrameBuffer height. so we get the height - // from physical units of the display rectangle in case the game uses a heigher value of height. - // - // Gregory: the framebuffer must have enough room to draw - // * at least 2 frames such as FMV (see OI_BlitFMV) - // * high resolution game such as snowblind engine game - // - // Autodetection isn't a good idea because it will create flickering - // If memory consumption is an issue, there are 2 possibilities - // * 1/ Avoid to create hundreds of RT - // * 2/ Use sparse texture (requires recent HW) - // - // Avoid to alternate between 640x1280 and 1280x1024 on snow blind engine game - // int fb_height = (fb_width < 1024) ? 1280 : 1024; - // - // Until performance issue is properly fixed, let's keep an option to reduce the framebuffer size. - // - // m_large_framebuffer has been inverted to m_conservative_framebuffer, it isn't an option that benefits being enabled all the time for everyone. - int fb_height = MAX_FRAMEBUFFER_HEIGHT; - if (GSConfig.ConservativeFramebuffer) - { - fb_height = fb_width < 1024 ? std::max(512, crtc_size.y) : 1024; - } - - const int upscaled_fb_w = fb_width * GSConfig.UpscaleMultiplier; - const int upscaled_fb_h = fb_height * GSConfig.UpscaleMultiplier; - const bool good_rt_size = m_width >= upscaled_fb_w && m_height >= upscaled_fb_h; - - // No need to resize for native/custom resolutions as default size will be enough for native and we manually get RT Buffer size for custom. - // don't resize until the display rectangle and register states are stabilized. - if (good_rt_size) - return; - - m_tc->RemovePartial(); - m_width = upscaled_fb_w; - m_height = upscaled_fb_h; - printf("Frame buffer size set to %dx%d (%dx%d)\n", fb_width, fb_height, m_width, m_height); + return GSVector2i(static_cast(crtc_size.x), + static_cast(crtc_size.y)); } void GSRendererHW::SetTCOffset() @@ -174,10 +121,42 @@ void GSRendererHW::PurgeTextureCache() m_tc->RemoveAll(); } -bool GSRendererHW::IsPossibleTextureShuffle(GSTextureCache::Source* src) const +bool GSRendererHW::UpdateTexIsFB(GSTextureCache::Target* dst, const GIFRegTEX0& TEX0) +{ + if (GSConfig.AccurateBlendingUnit == AccBlendLevel::Minimum || !g_gs_device->Features().texture_barrier) + return false; + + // Texture is actually the frame buffer. Stencil emulation to compute shadow (Jak series/tri-ace game) + // Will hit the "m_ps_sel.tex_is_fb = 1" path in the draw + if (m_vt.m_primclass == GS_TRIANGLE_CLASS) + { + if (m_context->FRAME.FBMSK == 0x00FFFFFF && TEX0.TBP0 == m_context->FRAME.Block()) + m_tex_is_fb = true; + } + else if (m_vt.m_primclass == GS_SPRITE_CLASS) + { + if (TEX0.TBP0 == m_context->FRAME.Block()) + { + m_tex_is_fb = IsPossibleTextureShuffle(dst, TEX0); + + if (!m_tex_is_fb && !m_vt.IsLinear()) + { + // Make sure that we're not sampling away from the area we're rendering. + // We need to take the absolute here, because Beyond Good and Evil undithers itself using a -1,-1 offset. + const GSVector4 diff(m_vt.m_min.p.xyxy(m_vt.m_max.p) - m_vt.m_min.t.xyxy(m_vt.m_max.t)); + if ((diff.abs() < GSVector4(1.0f)).alltrue()) + m_tex_is_fb = true; + } + } + } + + return m_tex_is_fb; +} + +bool GSRendererHW::IsPossibleTextureShuffle(GSTextureCache::Target* dst, const GIFRegTEX0& TEX0) const { return (PRIM->TME && m_vt.m_primclass == GS_SPRITE_CLASS && - src->m_32_bits_fmt && GSLocalMemory::m_psm[src->m_TEX0.PSM].bpp == 16 && + dst->m_32_bits_fmt && GSLocalMemory::m_psm[TEX0.PSM].bpp == 16 && GSLocalMemory::m_psm[m_context->FRAME.PSM].bpp == 16); } @@ -192,15 +171,10 @@ void GSRendererHW::SetGameCRC(u32 crc, int options) bool GSRendererHW::CanUpscale() { - if (m_hacks.m_cu && !(this->*m_hacks.m_cu)()) - { - return false; - } - - return GSConfig.UpscaleMultiplier != 1; + return GSConfig.UpscaleMultiplier != 1.0f; } -int GSRendererHW::GetUpscaleMultiplier() +float GSRendererHW::GetUpscaleMultiplier() { return GSConfig.UpscaleMultiplier; } @@ -227,27 +201,19 @@ void GSRendererHW::VSync(u32 field, bool registers_written) if (m_reset) { m_tc->RemoveAll(); - - // Reset RT size. - m_width = default_rt_size.x; - m_height = default_rt_size.y; - m_reset = false; } if (GSConfig.LoadTextureReplacements) GSTextureReplacements::ProcessAsyncLoadedTextures(); - //Check if the frame buffer width or display width has changed - SetScaling(); - GSRenderer::VSync(field, registers_written); m_tc->IncAge(); if (m_tc->GetHashCacheMemoryUsage() > 1024 * 1024 * 1024) { - Host::AddKeyedFormattedOSDMessage("HashCacheOverflow", 15.0f, "Hash cache has used %.2f MB of VRAM, disabling.", + Host::AddKeyedFormattedOSDMessage("HashCacheOverflow", Host::OSD_ERROR_DURATION, "Hash cache has used %.2f MB of VRAM, disabling.", static_cast(m_tc->GetHashCacheMemoryUsage()) / 1048576.0f); m_tc->RemoveAll(); g_gs_device->PurgePool(); @@ -265,18 +231,19 @@ GSTexture* GSRendererHW::GetOutput(int i, int& y_offset) { const GSRegDISPFB& DISPFB = m_regs->DISP[i].DISPFB; - GIFRegTEX0 TEX0; + GIFRegTEX0 TEX0 = {}; TEX0.TBP0 = DISPFB.Block(); TEX0.TBW = DISPFB.FBW; TEX0.PSM = DISPFB.PSM; const int videomode = static_cast(GetVideoMode()) - 1; - const GSVector4i offsets = !GSConfig.PCRTCOverscan ? VideoModeOffsets[videomode] : VideoModeOffsetsOverscan[videomode]; + const GSVector4i offsets = VideoModeOffsets[videomode]; + + const int fb_width = std::min(std::min(GetFramebufferWidth(), DISPFB.FBW * 64) + (int)DISPFB.DBX, 2048); const int display_height = offsets.y * ((isinterlaced() && !m_regs->SMODE2.FFMD) ? 2 : 1); const int display_offset = GetResolutionOffset(i).y; - int fb_height = std::min(GetFramebufferHeight(), display_height) + DISPFB.DBY; - + int fb_height = (std::min(GetFramebufferHeight(), display_height) + (int)DISPFB.DBY) % 2048; // If there is a negative vertical offset on the picture, we need to read more. if (display_offset < 0) { @@ -284,9 +251,9 @@ GSTexture* GSRendererHW::GetOutput(int i, int& y_offset) } // TRACE(_T("[%d] GetOutput %d %05x (%d)\n"), (int)m_perfmon.GetFrame(), i, (int)TEX0.TBP0, (int)TEX0.PSM); - GSTexture* t = NULL; + GSTexture* t = nullptr; - if (GSTextureCache::Target* rt = m_tc->LookupTarget(TEX0, GetTargetSize(), fb_height)) + if (GSTextureCache::Target* rt = m_tc->LookupDisplayTarget(TEX0, GetOutputSize(fb_height) * GSConfig.UpscaleMultiplier, fb_width, fb_height)) { t = rt->m_texture; @@ -315,13 +282,19 @@ GSTexture* GSRendererHW::GetOutput(int i, int& y_offset) GSTexture* GSRendererHW::GetFeedbackOutput() { - GIFRegTEX0 TEX0; + GIFRegTEX0 TEX0 = {}; TEX0.TBP0 = m_regs->EXTBUF.EXBP; TEX0.TBW = m_regs->EXTBUF.EXBW; TEX0.PSM = m_regs->DISP[m_regs->EXTBUF.FBIN & 1].DISPFB.PSM; - GSTextureCache::Target* rt = m_tc->LookupTarget(TEX0, GetTargetSize(), /*GetFrameRect(i).bottom*/ m_regs->DISP[m_regs->EXTBUF.FBIN & 1].DISPLAY.DH); + const int fb_height = /*GetFrameRect(i).bottom*/ m_regs->DISP[m_regs->EXTBUF.FBIN & 1].DISPLAY.DH; + GSVector2i size = GetOutputSize(fb_height); + + if (m_regs->DISP[m_regs->EXTBUF.FBIN & 1].DISPFB.DBX) + size.x += m_regs->DISP[m_regs->EXTBUF.FBIN & 1].DISPFB.DBX; + + GSTextureCache::Target* rt = m_tc->LookupDisplayTarget(TEX0, GetOutputSize(fb_height) * GSConfig.UpscaleMultiplier, size.x, fb_height); GSTexture* t = rt->m_texture; @@ -415,6 +388,68 @@ void GSRendererHW::Lines2Sprites() } } +template +void GSRendererHW::ExpandIndices() +{ + size_t process_count = (m_index.tail + 3) / 4 * 4; + if (Expand == GSHWDrawConfig::VSExpand::Point) + { + // Make sure we have space for writing off the end slightly + while (process_count > m_vertex.maxcount) + GrowVertexBuffer(); + } + + u32 expansion_factor = Expand == GSHWDrawConfig::VSExpand::Point ? 6 : 3; + m_index.tail *= expansion_factor; + GSVector4i* end = reinterpret_cast(m_index.buff); + GSVector4i* read = reinterpret_cast(m_index.buff + process_count); + GSVector4i* write = reinterpret_cast(m_index.buff + process_count * expansion_factor); + while (read > end) + { + read -= 1; + write -= expansion_factor; + switch (Expand) + { + case GSHWDrawConfig::VSExpand::None: + break; + case GSHWDrawConfig::VSExpand::Point: + { + constexpr GSVector4i low0 = GSVector4i::cxpr(0, 1, 2, 1); + constexpr GSVector4i low1 = GSVector4i::cxpr(2, 3, 0, 1); + constexpr GSVector4i low2 = GSVector4i::cxpr(2, 1, 2, 3); + GSVector4i in = read->sll32(2); + write[0] = in.xxxx() | low0; + write[1] = in.xxyy() | low1; + write[2] = in.yyyy() | low2; + write[3] = in.zzzz() | low0; + write[4] = in.zzww() | low1; + write[5] = in.wwww() | low2; + break; + } + case GSHWDrawConfig::VSExpand::Line: + { + constexpr GSVector4i low0 = GSVector4i::cxpr(0, 1, 2, 1); + constexpr GSVector4i low1 = GSVector4i::cxpr(2, 3, 0, 1); + constexpr GSVector4i low2 = GSVector4i::cxpr(2, 1, 2, 3); + GSVector4i in = read->sll32(2); + write[0] = in.xxyx() | low0; + write[1] = in.yyzz() | low1; + write[2] = in.wzww() | low2; + break; + } + case GSHWDrawConfig::VSExpand::Sprite: + { + constexpr GSVector4i low = GSVector4i::cxpr(0, 1, 0, 1); + GSVector4i in = read->sll32(1); + write[0] = in.xxyx() | low; + write[1] = in.yyzz() | low; + write[2] = in.wzww() | low; + break; + } + } + } +} + void GSRendererHW::EmulateAtst(GSVector4& FogColor_AREF, u8& ps_atst, const bool pass_2) { static const u32 inverted_atst[] = {ATST_ALWAYS, ATST_NEVER, ATST_GEQUAL, ATST_GREATER, ATST_NOTEQUAL, ATST_LESS, ATST_LEQUAL, ATST_EQUAL}; @@ -626,7 +661,7 @@ void GSRendererHW::ConvertSpriteTextureShuffle(bool& write_ba, bool& read_ba) GSVector4 GSRendererHW::RealignTargetTextureCoordinate(const GSTextureCache::Source* tex) { - if (GSConfig.UserHacks_HalfPixelOffset <= 1 || GetUpscaleMultiplier() == 1) + if (GSConfig.UserHacks_HalfPixelOffset <= 1 || GetUpscaleMultiplier() == 1.0f) return GSVector4(0.0f); const GSVertex* v = &m_vertex.buff[0]; @@ -640,7 +675,6 @@ GSVector4 GSRendererHW::RealignTargetTextureCoordinate(const GSTextureCache::Sou if (PRIM->FST) { - if (GSConfig.UserHacks_HalfPixelOffset == 3) { if (!linear && t_position == 8) @@ -713,7 +747,6 @@ void GSRendererHW::MergeSprite(GSTextureCache::Source* tex) { if (PRIM->FST && GSLocalMemory::m_psm[tex->m_TEX0.PSM].fmt < 2 && ((m_vt.m_eq.value & 0xCFFFF) == 0xCFFFF)) { - // Ideally the hack ought to be enabled in a true paving mode only. I don't know how to do it accurately // neither in a fast way. So instead let's just take the hypothesis that all sprites must have the same // size. @@ -763,42 +796,72 @@ void GSRendererHW::MergeSprite(GSTextureCache::Source* tex) } } -GSVector2 GSRendererHW::GetTextureScaleFactor(const bool force_upscaling) -{ - GSVector2 scale_factor{ 1.0f, 1.0f }; - if (force_upscaling || CanUpscale()) - { - const int multiplier = GetUpscaleMultiplier(); - scale_factor.x = multiplier; - scale_factor.y = multiplier; - } - - return scale_factor; -} - GSVector2 GSRendererHW::GetTextureScaleFactor() { - return GetTextureScaleFactor(false); + const float f_upscale = GetUpscaleMultiplier(); + return GSVector2(f_upscale, f_upscale); } -GSVector2i GSRendererHW::GetTargetSize() +GSVector2i GSRendererHW::GetTargetSize(GSVector2i* unscaled_size) { - const GSVector2i t_size = { m_width, m_height }; - if (GetUpscaleMultiplier() == 1 || CanUpscale()) - return t_size; - // Undo the upscaling for native resolution draws. - const GSVector2 up_s = GetTextureScaleFactor(true); - return { - static_cast(std::ceil(static_cast(t_size.x) / up_s.x)), - static_cast(std::ceil(static_cast(t_size.y) / up_s.y)), - }; + // Don't blindly expand out to the scissor size if we're not drawing to it. + // e.g. Burnout 3, God of War II, etc. + u32 min_height = std::min(m_context->scissor.in.w, m_r.w); + + // Another thing these games like to do, is draw a 512x896 shuffle, which would result in us + // expanding the target out to 896 height, but the extra area would all be black, with the + // draw effectively changing nothing for the new area. So, instead, lets try to detect these + // draws by double-checking we're not stretching the texture (gradient of <1). + if (PRIM->TME && m_vt.m_primclass == GS_SPRITE_CLASS && m_src && (m_src->m_target || m_src->m_from_target)) + { + const float diff = std::abs((m_vt.m_max.p.y - m_vt.m_min.p.y) - (m_vt.m_max.t.y - m_vt.m_min.t.y)); + if (diff <= 1.0f) + { + // Clamp to the texture size. We're working in unscaled coordinates here, so undo the upscaling. + min_height = std::min(min_height, static_cast(static_cast(m_src->m_texture->GetHeight()) / m_src->m_texture->GetScale().y)); + } + } + + u32 width = m_context->FRAME.FBW * 64u; + + // If it's a channel shuffle, it'll likely be just a single page, so assume full screen. + if (m_channel_shuffle) + { + const int page_x = GSLocalMemory::m_psm[m_context->FRAME.PSM].pgs.x - 1; + const int page_y = GSLocalMemory::m_psm[m_context->FRAME.PSM].pgs.y - 1; + + // Round up the page as channel shuffles are generally done in pages at a time + width = (std::max(static_cast(GetResolution().x), width) + page_x) & ~page_x; + min_height = (std::max(static_cast(GetResolution().y), min_height) + page_y) & ~page_y; + } + + // Align to even lines, reduces the chance of tiny resizes. + min_height = Common::AlignUpPow2(min_height, 2); + + u32 height = m_tc->GetTargetHeight(m_context->FRAME.FBP, m_context->FRAME.FBW, m_context->FRAME.PSM, min_height); + + if (unscaled_size) + { + unscaled_size->x = static_cast(width); + unscaled_size->y = static_cast(height); + } + + GL_INS("Target size for %x %u %u: %ux%u", m_context->FRAME.FBP, m_context->FRAME.FBW, m_context->FRAME.PSM, width, height); + + return GSVector2i(static_cast(static_cast(width) * GSConfig.UpscaleMultiplier), + static_cast(static_cast(height) * GSConfig.UpscaleMultiplier)); } -void GSRendererHW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) +void GSRendererHW::ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) +{ + m_tc->ExpandTarget(BITBLTBUF, r); +} + +void GSRendererHW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite) { // printf("[%d] InvalidateVideoMem %d,%d - %d,%d %05x (%d)\n", (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.DBP, (int)BITBLTBUF.DPSM); - m_tc->InvalidateVideoMem(m_mem.GetOffset(BITBLTBUF.DBP, BITBLTBUF.DBW, BITBLTBUF.DPSM), r); + m_tc->InvalidateVideoMem(m_mem.GetOffset(BITBLTBUF.DBP, BITBLTBUF.DBW, BITBLTBUF.DPSM), r, eewrite); } void GSRendererHW::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut) @@ -922,7 +985,7 @@ void GSRendererHW::SwSpriteRender() const bool alpha_blending_enabled = PRIM->ABE; - const GSVertex& v = m_vertex.buff[m_index.buff[m_index.tail - 1]]; // Last vertex. + const GSVertex& v = m_index.tail > 0 ? m_vertex.buff[m_index.buff[m_index.tail - 1]] : GSVertex(); // Last vertex if any. const GSVector4i vc = GSVector4i(v.RGBAQ.R, v.RGBAQ.G, v.RGBAQ.B, v.RGBAQ.A) // 0x000000AA000000BB000000GG000000RR .ps32(); // 0x00AA00BB00GG00RR00AA00BB00GG00RR @@ -957,7 +1020,7 @@ void GSRendererHW::SwSpriteRender() u32* di = dpa.value(x); ASSERT(di + 1 == dpa.value(x + 1)); // Destination pixel pair is adjacent in memory - GSVector4i sc; + GSVector4i sc = {}; if (texture_mapping_enabled) { const u32* si = spa.value(x); @@ -978,8 +1041,8 @@ void GSRendererHW::SwSpriteRender() // No FOG - GSVector4i dc0; - GSVector4i dc; + GSVector4i dc0 = {}; + GSVector4i dc = {}; if (alpha_blending_enabled || fb_mask_enabled) { @@ -1229,6 +1292,7 @@ void GSRendererHW::Draw() s = StringUtil::StdStringFromFormat("%05d_vertex.txt", s_n); DumpVertices(m_dump_root + s); } + if (IsBadFrame()) { GL_INS("Warning skipping a draw call (%d)", s_n); @@ -1240,12 +1304,6 @@ void GSRendererHW::Draw() GSDrawingContext* context = m_context; const GSLocalMemory::psm_t& tex_psm = GSLocalMemory::m_psm[m_context->TEX0.PSM]; - if (!context->FRAME.FBW) - { - GL_CACHE("Skipping draw with FRAME.FBW = 0."); - return; - } - // When the format is 24bit (Z or C), DATE ceases to function. // It was believed that in 24bit mode all pixels pass because alpha doesn't exist // however after testing this on a PS2 it turns out nothing passes, it ignores the draw. @@ -1277,6 +1335,45 @@ void GSRendererHW::Draw() // Test if we can optimize Alpha Test as a NOP context->TEST.ATE = context->TEST.ATE && !GSRenderer::TryAlphaTest(fm, fm_mask, zm); + // Need to fix the alpha test, since the alpha will be fixed to 1.0 if ABE is disabled and AA1 is enabled + // So if it doesn't meet the condition, always fail, if it does, always pass (turn off the test). + if (IsCoverageAlpha() && context->TEST.ATE && context->TEST.ATST > 1) + { + const float aref = (float)context->TEST.AREF; + const int old_ATST = context->TEST.ATST; + context->TEST.ATST = 0; + + switch (old_ATST) + { + case ATST_LESS: + if (128.0f < aref) + context->TEST.ATE = false; + break; + case ATST_LEQUAL: + if (128.0f <= aref) + context->TEST.ATE = false; + break; + case ATST_EQUAL: + if (128.0f == aref) + context->TEST.ATE = false; + break; + case ATST_GEQUAL: + if (128.0f >= aref) + context->TEST.ATE = false; + break; + case ATST_GREATER: + if (128.0f > aref) + context->TEST.ATE = false; + break; + case ATST_NOTEQUAL: + if (128.0f != aref) + context->TEST.ATE = false; + break; + default: + break; + } + } + context->FRAME.FBMSK = fm; context->ZBUF.ZMSK = zm != 0; @@ -1305,12 +1402,27 @@ void GSRendererHW::Draw() const bool single_page = (delta_p.x <= 64.0f) && (delta_p.y <= 64.0f); // We trigger the sw prim render here super early, to avoid creating superfluous render targets. - if (CanUseSwPrimRender(no_rt, no_ds, draw_sprite_tex) && SwPrimRender()) + if (CanUseSwPrimRender(no_rt, no_ds, draw_sprite_tex) && SwPrimRender(*this)) { GL_CACHE("Possible texture decompression, drawn with SwPrimRender()"); return; } + // SW CLUT Render enable. + if (GSConfig.UserHacks_CPUCLUTRender > 0) + { + bool result = (GSConfig.UserHacks_CPUCLUTRender == 1) ? PossibleCLUTDraw() : PossibleCLUTDrawAggressive(); + m_mem.m_clut.ClearDrawInvalidity(); + if (result) + { + if (SwPrimRender(*this)) + { + GL_CACHE("Possible clut draw, drawn with SwPrimRender()"); + return; + } + } + } + if (m_channel_shuffle) { m_channel_shuffle = draw_sprite_tex && (m_context->TEX0.PSM == PSM_PSMT8) && single_page; @@ -1339,10 +1451,11 @@ void GSRendererHW::Draw() m_channel_shuffle = false; } - GIFRegTEX0 TEX0; + GIFRegTEX0 TEX0 = {}; m_src = nullptr; m_texture_shuffle = false; + m_tex_is_fb = false; if (PRIM->TME) { @@ -1438,10 +1551,15 @@ void GSRendererHW::Draw() m_src = tex_psm.depth ? m_tc->LookupDepthSource(TEX0, env.TEXA, tmm.coverage) : m_tc->LookupSource(TEX0, env.TEXA, tmm.coverage, (GSConfig.HWMipmap >= HWMipmapLevel::Basic || - GSConfig.UserHacks_TriFilter == TriFiltering::Forced) ? &hash_lod_range : nullptr); + GSConfig.TriFilter == TriFiltering::Forced) ? &hash_lod_range : nullptr); const int tw = 1 << TEX0.TW; const int th = 1 << TEX0.TH; +#if 0 + // FIXME: We currently crop off the rightmost and bottommost pixel when upscaling clamps, + // until the issue is properly solved we should keep this disabled as it breaks many games when upscaling. + // See #5387, #5853, #5851 on GH for more details. + // // Texture clamp optimizations (try to move everything to sampler hardware) if (m_context->CLAMP.WMS == CLAMP_REGION_CLAMP && MIP_CLAMP.MINU == 0 && MIP_CLAMP.MAXU == tw - 1) m_context->CLAMP.WMS = CLAMP_CLAMP; @@ -1455,6 +1573,7 @@ void GSRendererHW::Draw() m_context->CLAMP.WMT = CLAMP_REPEAT; else if ((m_context->CLAMP.WMT & 2) && !(tmm.uses_boundary & TextureMinMaxResult::USES_BOUNDARY_V)) m_context->CLAMP.WMT = CLAMP_CLAMP; +#endif // If m_src is from a target that isn't the same size as the texture, texture sample edge modes won't work quite the same way // If the game actually tries to access stuff outside of the rendered target, it was going to get garbage anyways so whatever @@ -1568,31 +1687,62 @@ void GSRendererHW::Draw() } } - const GSVector2i t_size = GetTargetSize(); + // The rectangle of the draw + m_r = GSVector4i(m_vt.m_min.p.xyxy(m_vt.m_max.p)).rintersect(GSVector4i(context->scissor.in)); + + if (!GSConfig.UserHacks_DisableSafeFeatures) + { + // Constant Direct Write without texture/test/blending (aka a GS mem clear) + if ((m_vt.m_primclass == GS_SPRITE_CLASS) && !PRIM->TME // Direct write + && (!PRIM->ABE || m_context->ALPHA.IsOpaque()) // No transparency + && (m_context->FRAME.FBMSK == 0) // no color mask + && !m_context->TEST.ATE // no alpha test + && (!m_context->TEST.ZTE || m_context->TEST.ZTST == ZTST_ALWAYS) // no depth test + && (m_vt.m_eq.rgba == 0xFFFF) // constant color write + && m_r.x == 0 && m_r.y == 0) // Likely full buffer write + { + + if (OI_GsMemClear() && m_r.w > 1024) + { + if ((fm & fm_mask) != fm_mask) + { + m_tc->InvalidateVideoMem(context->offset.fb, m_r, false, true); + + m_tc->InvalidateVideoMemType(GSTextureCache::RenderTarget, context->FRAME.Block()); + } + + if (zm != 0xffffffff) + { + m_tc->InvalidateVideoMem(context->offset.zb, m_r, false, false); + + m_tc->InvalidateVideoMemType(GSTextureCache::DepthStencil, context->ZBUF.Block()); + } + return; + } + } + } + + GSVector2i unscaled_size; + const GSVector2i t_size = GetTargetSize(&unscaled_size); + + // Ensure draw rect is clamped to framebuffer size. Necessary for updating valid area. + m_r = m_r.rintersect(GSVector4i(0, 0, unscaled_size.x, unscaled_size.y)); TEX0.TBP0 = context->FRAME.Block(); TEX0.TBW = context->FRAME.FBW; TEX0.PSM = context->FRAME.PSM; GSTextureCache::Target* rt = nullptr; - GSTexture* rt_tex = nullptr; if (!no_rt) - { rt = m_tc->LookupTarget(TEX0, t_size, GSTextureCache::RenderTarget, true, fm); - rt_tex = rt->m_texture; - } TEX0.TBP0 = context->ZBUF.Block(); TEX0.TBW = context->FRAME.FBW; TEX0.PSM = context->ZBUF.PSM; GSTextureCache::Target* ds = nullptr; - GSTexture* ds_tex = nullptr; if (!no_ds) - { ds = m_tc->LookupTarget(TEX0, t_size, GSTextureCache::DepthStencil, context->DepthWrite()); - ds_tex = ds->m_texture; - } if (rt) { @@ -1602,38 +1752,23 @@ void GSRendererHW::Draw() rt->m_32_bits_fmt = m_texture_shuffle || (GSLocalMemory::m_psm[context->FRAME.PSM].bpp != 16); } - // The rectangle of the draw - m_r = GSVector4i(m_vt.m_min.p.xyxy(m_vt.m_max.p)).rintersect(GSVector4i(context->scissor.in)); - { - const GSVector2 up_s = GetTextureScaleFactor(); - const int up_w = static_cast(std::ceil(static_cast(m_r.z) * up_s.x)); - const int up_h = static_cast(std::ceil(static_cast(m_r.w) * up_s.y)); - const int new_w = std::max(up_w, std::max(rt_tex ? rt_tex->GetWidth() : 0, ds_tex ? ds_tex->GetWidth() : 0)); - const int new_h = std::max(up_h, std::max(rt_tex ? rt_tex->GetHeight() : 0, ds_tex ? ds_tex->GetHeight() : 0)); - std::array ts{ rt, ds }; - for (GSTextureCache::Target* t : ts) + // We still need to make sure the dimensions of the targets match. + const GSVector2 up_s(GetTextureScaleFactor()); + int new_w = std::max(t_size.x, std::max(rt ? rt->m_texture->GetWidth() : 0, ds ? ds->m_texture->GetWidth() : 0)); + int new_h = std::max(t_size.y, std::max(rt ? rt->m_texture->GetHeight() : 0, ds ? ds->m_texture->GetHeight() : 0)); + + if (rt) { - if (t) - { - // Adjust texture size to fit current draw if necessary. - GSTexture* tex = t->m_texture; - assert(up_s == tex->GetScale()); - const int w = tex->GetWidth(); - const int h = tex->GetHeight(); - if (w != new_w || h != new_h) - { - const bool is_rt = t == rt; - t->m_texture = is_rt ? - g_gs_device->CreateSparseRenderTarget(new_w, new_h, tex->GetFormat()) : - g_gs_device->CreateSparseDepthStencil(new_w, new_h, tex->GetFormat()); - const GSVector4i r{ 0, 0, w, h }; - g_gs_device->CopyRect(tex, t->m_texture, r, 0, 0); - g_gs_device->Recycle(tex); - t->m_texture->SetScale(up_s); - (is_rt ? rt_tex : ds_tex) = t->m_texture; - } - } + pxAssert(rt->m_texture->GetScale() == up_s); + rt->ResizeTexture(new_w, new_h, up_s); + rt->UpdateValidity(m_r); + } + if (ds) + { + pxAssert(ds->m_texture->GetScale() == up_s); + ds->ResizeTexture(new_w, new_h, up_s); + ds->UpdateValidity(m_r); } } @@ -1667,24 +1802,24 @@ void GSRendererHW::Draw() } } - if (s_save && s_n >= s_saven) + if (rt && s_save && s_n >= s_saven) { s = StringUtil::StdStringFromFormat("%05d_f%lld_rt0_%05x_%s.bmp", s_n, frame, context->FRAME.Block(), psm_str(context->FRAME.PSM)); - if (rt_tex) - rt_tex->Save(m_dump_root + s); + if (rt->m_texture) + rt->m_texture->Save(m_dump_root + s); } - if (s_savez && s_n >= s_saven) + if (ds && s_savez && s_n >= s_saven) { s = StringUtil::StdStringFromFormat("%05d_f%lld_rz0_%05x_%s.bmp", s_n, frame, context->ZBUF.Block(), psm_str(context->ZBUF.PSM)); - if (ds_tex) - ds_tex->Save(m_dump_root + s); + if (ds->m_texture) + ds->m_texture->Save(m_dump_root + s); } } - if (m_hacks.m_oi && !(this->*m_hacks.m_oi)(rt_tex, ds_tex, m_src)) + if (m_hacks.m_oi && !(this->*m_hacks.m_oi)(rt ? rt->m_texture : nullptr, ds ? ds->m_texture : nullptr, m_src)) { GL_INS("Warning skipping a draw call (%d)", s_n); return; @@ -1705,11 +1840,9 @@ void GSRendererHW::Draw() && !m_context->TEST.ATE // no alpha test && (!m_context->TEST.ZTE || m_context->TEST.ZTST == ZTST_ALWAYS) // no depth test && (m_vt.m_eq.rgba == 0xFFFF) // constant color write - && m_r.x == 0 && m_r.y == 0) { // Likely full buffer write - - OI_GsMemClear(); - - OI_DoubleHalfClear(rt_tex, ds_tex); + && m_r.x == 0 && m_r.y == 0) // Likely full buffer write + { + OI_DoubleHalfClear(rt, ds); } } @@ -1764,7 +1897,7 @@ void GSRendererHW::Draw() // - DrawPrims(rt_tex, ds_tex, m_src); + DrawPrims(rt ? rt->m_texture : nullptr, ds ? ds->m_texture : nullptr, m_src); // @@ -1784,7 +1917,7 @@ void GSRendererHW::Draw() //rt->m_valid = rt->m_valid.runion(r); rt->UpdateValidity(m_r); - m_tc->InvalidateVideoMem(context->offset.fb, m_r, false); + m_tc->InvalidateVideoMem(context->offset.fb, m_r, false, false); m_tc->InvalidateVideoMemType(GSTextureCache::DepthStencil, context->FRAME.Block()); } @@ -1794,7 +1927,7 @@ void GSRendererHW::Draw() //ds->m_valid = ds->m_valid.runion(r); ds->UpdateValidity(m_r); - m_tc->InvalidateVideoMem(context->offset.zb, m_r, false); + m_tc->InvalidateVideoMem(context->offset.zb, m_r, false, false); m_tc->InvalidateVideoMemType(GSTextureCache::RenderTarget, context->ZBUF.Block()); } @@ -1816,16 +1949,16 @@ void GSRendererHW::Draw() { s = StringUtil::StdStringFromFormat("%05d_f%lld_rt1_%05x_%s.bmp", s_n, frame, context->FRAME.Block(), psm_str(context->FRAME.PSM)); - if (rt_tex) - rt_tex->Save(m_dump_root + s); + if (rt) + rt->m_texture->Save(m_dump_root + s); } if (s_savez && s_n >= s_saven) { s = StringUtil::StdStringFromFormat("%05d_f%lld_rz1_%05x_%s.bmp", s_n, frame, context->ZBUF.Block(), psm_str(context->ZBUF.PSM)); - if (ds_tex) - ds_tex->Save(m_dump_root + s); + if (ds) + rt->m_texture->Save(m_dump_root + s); } if (s_savel > 0 && (s_n - s_saven) > s_savel) @@ -1840,6 +1973,55 @@ void GSRendererHW::Draw() #endif } +/// Verifies assumptions we expect to hold about indices +bool GSRendererHW::VerifyIndices() +{ + switch (m_vt.m_primclass) + { + case GS_SPRITE_CLASS: + if (m_index.tail % 2 != 0) + return false; + [[fallthrough]]; + case GS_POINT_CLASS: + // Expect indices to be flat increasing + for (size_t i = 0; i < m_index.tail; i++) + { + if (m_index.buff[i] != i) + return false; + } + break; + case GS_LINE_CLASS: + if (m_index.tail % 2 != 0) + return false; + // Expect each line to be a pair next to each other + // VS expand relies on this! + if (g_gs_device->Features().provoking_vertex_last) + { + for (size_t i = 0; i < m_index.tail; i += 2) + { + if (m_index.buff[i] + 1 != m_index.buff[i + 1]) + return false; + } + } + else + { + for (size_t i = 0; i < m_index.tail; i += 2) + { + if (m_index.buff[i] != m_index.buff[i + 1] + 1) + return false; + } + } + break; + case GS_TRIANGLE_CLASS: + if (m_index.tail % 3 != 0) + return false; + break; + case GS_INVALID_CLASS: + break; + } + return true; +} + void GSRendererHW::SetupIA(const float& sx, const float& sy) { GL_PUSH("IA"); @@ -1849,12 +2031,17 @@ void GSRendererHW::SetupIA(const float& sx, const float& sy) for (unsigned int i = 0; i < m_vertex.next; i++) m_vertex.buff[i].UV &= 0x3FEF3FEF; } - const bool unscale_pt_ln = !GSConfig.UserHacks_DisableSafeFeatures && (GetUpscaleMultiplier() != 1); + const bool unscale_pt_ln = !GSConfig.UserHacks_DisableSafeFeatures && (GetUpscaleMultiplier() != 1.0f); const GSDevice::FeatureSupport features = g_gs_device->Features(); + ASSERT(VerifyIndices()); + switch (m_vt.m_primclass) { case GS_POINT_CLASS: + m_conf.gs.topology = GSHWDrawConfig::GSTopology::Point; + m_conf.topology = GSHWDrawConfig::Topology::Point; + m_conf.indices_per_prim = 1; if (unscale_pt_ln) { if (features.point_expand) @@ -1866,14 +2053,21 @@ void GSRendererHW::SetupIA(const float& sx, const float& sy) m_conf.gs.expand = true; m_conf.cb_vs.point_size = GSVector2(16.0f * sx, 16.0f * sy); } + else if (features.vs_expand) + { + m_conf.vs.expand = GSHWDrawConfig::VSExpand::Point; + m_conf.cb_vs.point_size = GSVector2(16.0f * sx, 16.0f * sy); + m_conf.topology = GSHWDrawConfig::Topology::Triangle; + m_conf.indices_per_prim = 6; + ExpandIndices(); + } } - - m_conf.gs.topology = GSHWDrawConfig::GSTopology::Point; - m_conf.topology = GSHWDrawConfig::Topology::Point; - m_conf.indices_per_prim = 1; break; case GS_LINE_CLASS: + m_conf.gs.topology = GSHWDrawConfig::GSTopology::Line; + m_conf.topology = GSHWDrawConfig::Topology::Line; + m_conf.indices_per_prim = 2; if (unscale_pt_ln) { if (features.line_expand) @@ -1885,11 +2079,15 @@ void GSRendererHW::SetupIA(const float& sx, const float& sy) m_conf.gs.expand = true; m_conf.cb_vs.point_size = GSVector2(16.0f * sx, 16.0f * sy); } + else if (features.vs_expand) + { + m_conf.vs.expand = GSHWDrawConfig::VSExpand::Line; + m_conf.cb_vs.point_size = GSVector2(16.0f * sx, 16.0f * sy); + m_conf.topology = GSHWDrawConfig::Topology::Triangle; + m_conf.indices_per_prim = 6; + ExpandIndices(); + } } - - m_conf.gs.topology = GSHWDrawConfig::GSTopology::Line; - m_conf.topology = GSHWDrawConfig::Topology::Line; - m_conf.indices_per_prim = 2; break; case GS_SPRITE_CLASS: @@ -1918,6 +2116,13 @@ void GSRendererHW::SetupIA(const float& sx, const float& sy) m_conf.topology = GSHWDrawConfig::Topology::Line; m_conf.indices_per_prim = 2; } + else if (features.vs_expand && !m_vt.m_accurate_stq) + { + m_conf.topology = GSHWDrawConfig::Topology::Triangle; + m_conf.vs.expand = GSHWDrawConfig::VSExpand::Sprite; + m_conf.indices_per_prim = 6; + ExpandIndices(); + } else { Lines2Sprites(); @@ -2043,14 +2248,16 @@ void GSRendererHW::EmulateTextureShuffleAndFbmask() // Please bang my head against the wall! // 1/ Reduce the frame mask to a 16 bit format const u32 m = m_context->FRAME.FBMSK & GSLocalMemory::m_psm[m_context->FRAME.PSM].fmsk; + + // fbmask is converted to a 16bit version to represent the 2 32bit channels it's writing to. + // The lower 8 bits represents the Red/Blue channels, the top 8 bits is Green/Alpha, depending on write_ba. const u32 fbmask = ((m >> 3) & 0x1F) | ((m >> 6) & 0x3E0) | ((m >> 9) & 0x7C00) | ((m >> 16) & 0x8000); - // FIXME GSVector will be nice here - const u8 rg_mask = fbmask & 0xFF; - const u8 ba_mask = (fbmask >> 8) & 0xFF; + // r = rb mask, g = ga mask + const GSVector2i rb_ga_mask = GSVector2i(fbmask & 0xFF, (fbmask >> 8) & 0xFF); m_conf.colormask.wrgba = 0; - // 2 Select the new mask (Please someone put SSE here) - if (rg_mask != 0xFF) + // 2 Select the new mask + if (rb_ga_mask.r != 0xFF) { if (write_ba) { @@ -2062,11 +2269,11 @@ void GSRendererHW::EmulateTextureShuffleAndFbmask() GL_INS("Color shuffle %s => R", read_ba ? "B" : "R"); m_conf.colormask.wr = 1; } - if (rg_mask) + if (rb_ga_mask.r) m_conf.ps.fbmask = 1; } - if (ba_mask != 0xFF) + if (rb_ga_mask.g != 0xFF) { if (write_ba) { @@ -2078,16 +2285,16 @@ void GSRendererHW::EmulateTextureShuffleAndFbmask() GL_INS("Color shuffle %s => G", read_ba ? "A" : "G"); m_conf.colormask.wg = 1; } - if (ba_mask) + if (rb_ga_mask.g) m_conf.ps.fbmask = 1; } if (m_conf.ps.fbmask && enable_fbmask_emulation) { - m_conf.cb_ps.FbMask.r = rg_mask; - m_conf.cb_ps.FbMask.g = rg_mask; - m_conf.cb_ps.FbMask.b = ba_mask; - m_conf.cb_ps.FbMask.a = ba_mask; + m_conf.cb_ps.FbMask.r = rb_ga_mask.r; + m_conf.cb_ps.FbMask.g = rb_ga_mask.g; + m_conf.cb_ps.FbMask.b = rb_ga_mask.r; + m_conf.cb_ps.FbMask.a = rb_ga_mask.g; // No blending so hit unsafe path. if (!PRIM->ABE || !features.texture_barrier) @@ -2299,21 +2506,8 @@ void GSRendererHW::EmulateChannelShuffle(const GSTextureCache::Source* tex) m_conf.tex = *tex->m_from_target; if (m_conf.tex) { - if (m_conf.tex == m_conf.rt) - { - // sample from fb instead - m_conf.tex = nullptr; - m_conf.ps.tex_is_fb = true; - m_conf.require_one_barrier = true; - } - else if (m_conf.tex == m_conf.ds) - { - // if depth testing is disabled, we don't need to copy, and can just unbind the depth buffer - // no need for a barrier for GL either, since it's not bound to depth and texture concurrently - // otherwise, the backend should recognise the hazard, and copy the buffer (D3D/Vulkan). - if (m_conf.depth.ztst == ZTST_ALWAYS) - m_conf.ds = nullptr; - } + // Identify when we're sampling the current buffer, defer fixup for later. + m_tex_is_fb |= (m_conf.tex == m_conf.rt || m_conf.tex == m_conf.ds); } // Replace current draw with a fullscreen sprite @@ -2336,7 +2530,7 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& { // AA1: Don't enable blending on AA1, not yet implemented on hardware mode, // it requires coverage sample so it's safer to turn it off instead. - const bool AA1 = PRIM->AA1 && (m_vt.m_primclass == GS_LINE_CLASS); + const bool AA1 = PRIM->AA1 && (m_vt.m_primclass == GS_LINE_CLASS || m_vt.m_primclass == GS_TRIANGLE_CLASS); // PABE: Check condition early as an optimization. const bool PABE = PRIM->ABE && m_env.PABE.PABE && (GetAlphaMinMax().max < 128); // FBMASK: Color is not written, no need to do blending. @@ -2354,6 +2548,8 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& // Compute the blending equation to detect special case const GSDevice::FeatureSupport features(g_gs_device->Features()); const GIFRegALPHA& ALPHA = m_context->ALPHA; + // AFIX: Afix factor. + u8 AFIX = ALPHA.FIX; // Set blending to shader bits m_conf.ps.blend_a = ALPHA.A; @@ -2361,16 +2557,32 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& m_conf.ps.blend_c = ALPHA.C; m_conf.ps.blend_d = ALPHA.D; + // When AA1 is enabled and Alpha Blending is disabled, alpha blending done with coverage instead of alpha. + // We use a COV value of 128 (full coverage) in triangles (except the edge geometry, which we can't do easily). + if (IsCoverageAlpha()) + { + m_conf.ps.fixed_one_a = 1; + m_conf.ps.blend_c = 0; + } + // 24 bits doesn't have an alpha channel so use 128 (1.0f) fix factor as equivalent. + else if (m_conf.ps.dfmt == 1 && m_conf.ps.blend_c == 1) + { + AFIX = 128; + m_conf.ps.blend_c = 2; + } + // Get alpha value const bool alpha_c0_zero = (m_conf.ps.blend_c == 0 && GetAlphaMinMax().max == 0); const bool alpha_c0_one = (m_conf.ps.blend_c == 0 && (GetAlphaMinMax().min == 128) && (GetAlphaMinMax().max == 128)); + const bool alpha_c0_high_min_one = (m_conf.ps.blend_c == 0 && GetAlphaMinMax().min > 128); const bool alpha_c0_high_max_one = (m_conf.ps.blend_c == 0 && GetAlphaMinMax().max > 128); - const bool alpha_c2_zero = (m_conf.ps.blend_c == 2 && ALPHA.FIX == 0u); - const bool alpha_c2_one = (m_conf.ps.blend_c == 2 && ALPHA.FIX == 128u); - const bool alpha_c2_high_one = (m_conf.ps.blend_c == 2 && ALPHA.FIX > 128u); + const bool alpha_c2_zero = (m_conf.ps.blend_c == 2 && AFIX == 0u); + const bool alpha_c2_one = (m_conf.ps.blend_c == 2 && AFIX == 128u); + const bool alpha_c2_high_one = (m_conf.ps.blend_c == 2 && AFIX > 128u); + const bool alpha_one = alpha_c0_one || alpha_c2_one; // Optimize blending equations, must be done before index calculation - if ((m_conf.ps.blend_a == m_conf.ps.blend_b) || ((m_conf.ps.blend_b == m_conf.ps.blend_d) && (alpha_c0_one || alpha_c2_one))) + if ((m_conf.ps.blend_a == m_conf.ps.blend_b) || ((m_conf.ps.blend_b == m_conf.ps.blend_d) && alpha_one)) { // Condition 1: // A == B @@ -2393,6 +2605,21 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& m_conf.ps.blend_a = 0; m_conf.ps.blend_b = 0; } + else if (m_env.COLCLAMP.CLAMP && m_conf.ps.blend_a == 2 + && (m_conf.ps.blend_d == 2 || (m_conf.ps.blend_b == m_conf.ps.blend_d && (alpha_c0_high_min_one || alpha_c2_high_one)))) + { + // CLAMP 1, negative result will be clamped to 0. + // Condition 1: + // (0 - Cs)*Alpha + 0, (0 - Cd)*Alpha + 0 + // Condition 2: + // Alpha is either As or F higher than 1.0f + // (0 - Cd)*Alpha + Cd, (0 - Cs)*F + Cs + // Results will be 0.0f, make sure D is set to 2. + m_conf.ps.blend_a = 0; + m_conf.ps.blend_b = 0; + m_conf.ps.blend_c = 0; + m_conf.ps.blend_d = 2; + } // Ad cases, alpha write is masked, one barrier is enough, for d3d11 read the fb // Replace Ad with As, blend flags will be used from As since we are chaging the blend_index value. @@ -2410,7 +2637,8 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& blend_ad_alpha_masked = false; u8 blend_index = u8(((m_conf.ps.blend_a * 3 + m_conf.ps.blend_b) * 3 + m_conf.ps.blend_c) * 3 + m_conf.ps.blend_d); - const int blend_flag = GSDevice::GetBlendFlags(blend_index); + const HWBlend blend_preliminary = GSDevice::GetBlend(blend_index, false); + const int blend_flag = blend_preliminary.flags; // Re set alpha, it was modified, must be done after index calculation if (blend_ad_alpha_masked) @@ -2421,15 +2649,21 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& // Do the multiplication in shader for blending accumulation: Cs*As + Cd or Cs*Af + Cd bool accumulation_blend = !!(blend_flag & BLEND_ACCU); + // If alpha == 1.0, almost everything is an accumulation blend! + // Ones that use (1 + Alpha) can't guarante the mixed sw+hw blending this enables will give an identical result to sw due to clamping + // But enable for everything else that involves dst color + if (alpha_one && (m_conf.ps.blend_a != m_conf.ps.blend_d) && blend_preliminary.dst != GSDevice::CONST_ZERO) + accumulation_blend = true; // Blending doesn't require barrier, or sampling of the rt const bool blend_non_recursive = !!(blend_flag & BLEND_NO_REC); // BLEND MIX selection, use a mix of hw/sw blending - const bool blend_mix1 = !!(blend_flag & BLEND_MIX1); + const bool blend_mix1 = !!(blend_flag & BLEND_MIX1) && + (features.dual_source_blend || !(m_conf.ps.blend_b == m_conf.ps.blend_d && (alpha_c0_high_min_one || alpha_c2_high_one))); const bool blend_mix2 = !!(blend_flag & BLEND_MIX2); const bool blend_mix3 = !!(blend_flag & BLEND_MIX3); - bool blend_mix = (blend_mix1 || blend_mix2 || blend_mix3); + bool blend_mix = (blend_mix1 || blend_mix2 || blend_mix3) && m_env.COLCLAMP.CLAMP; const bool one_barrier = m_conf.require_one_barrier || blend_ad_alpha_masked; @@ -2611,12 +2845,12 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& accumulation_blend = false; blend_mix = false; } - else if (accumulation_blend || blend_mix) + else if (accumulation_blend) { // A fast algo that requires 2 passes GL_INS("COLCLIP Fast HDR mode ENABLED"); m_conf.ps.hdr = 1; - sw_blending = true; // Enable sw blending for the HDR algo + sw_blending = true; // Enable sw blending for the HDR algo } else if (sw_blending) { @@ -2688,23 +2922,50 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& { // Require the fix alpha vlaue if (m_conf.ps.blend_c == 2) - m_conf.cb_ps.TA_MaxDepth_Af.a = static_cast(ALPHA.FIX) / 128.0f; + m_conf.cb_ps.TA_MaxDepth_Af.a = static_cast(AFIX) / 128.0f; const HWBlend blend = GSDevice::GetBlend(blend_index, replace_dual_src); if (accumulation_blend) { // Keep HW blending to do the addition/subtraction m_conf.blend = {true, GSDevice::CONST_ONE, GSDevice::CONST_ONE, blend.op, false, 0}; + blending_alpha_pass = false; + + // Remove Cd from sw blend, it's handled in hw + if (m_conf.ps.blend_a == 1) + m_conf.ps.blend_a = 2; + if (m_conf.ps.blend_b == 1) + m_conf.ps.blend_b = 2; + if (m_conf.ps.blend_d == 1) + m_conf.ps.blend_d = 2; + if (m_conf.ps.blend_a == 2) { - // The blend unit does a reverse subtraction so it means - // the shader must output a positive value. - // Replace 0 - Cs by Cs - 0 - m_conf.ps.blend_a = m_conf.ps.blend_b; - m_conf.ps.blend_b = 2; + // Accumulation blend is only available in (Cs - 0)*Something + Cd, or with alpha == 1 + ASSERT(m_conf.ps.blend_d == 2 || alpha_one); + // A bit of normalization + m_conf.ps.blend_a = m_conf.ps.blend_d; + m_conf.ps.blend_d = 2; + } + + if (blend.op == GSDevice::OP_REV_SUBTRACT) + { + ASSERT(m_conf.ps.blend_a == 2); + if (m_conf.ps.hdr) + { + // HDR uses unorm, which is always positive + // Have the shader do the inversion, then clip to remove the negative + m_conf.blend.op = GSDevice::OP_ADD; + } + else + { + // The blend unit does a reverse subtraction so it means + // the shader must output a positive value. + // Replace 0 - Cs by Cs - 0 + m_conf.ps.blend_a = m_conf.ps.blend_b; + m_conf.ps.blend_b = 2; + } } - // Remove the addition/substraction from the SW blending - m_conf.ps.blend_d = 2; // Dual source output not needed (accumulation blend replaces it with ONE). m_conf.ps.no_color1 = true; @@ -2715,14 +2976,34 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& else if (blend_mix) { // For mixed blend, the source blend is done in the shader (so we use CONST_ONE as a factor). - m_conf.blend = {true, GSDevice::CONST_ONE, blend.dst, blend.op, m_conf.ps.blend_c == 2, ALPHA.FIX}; - m_conf.ps.blend_mix = 1; + m_conf.blend = {true, GSDevice::CONST_ONE, blend.dst, blend.op, m_conf.ps.blend_c == 2, AFIX}; + m_conf.ps.blend_mix = (blend.op == GSDevice::OP_REV_SUBTRACT) ? 2 : 1; // Elide DSB colour output if not used by dest. m_conf.ps.no_color1 |= !GSDevice::IsDualSourceBlendFactor(blend.dst); if (blend_mix1) { + if (m_conf.ps.blend_b == m_conf.ps.blend_d && (alpha_c0_high_min_one || alpha_c2_high_one)) + { + // Replace Cs*As + Cd*(1 - As) with Cs*As - Cd*(As - 1). + // Replace Cs*F + Cd*(1 - F) with Cs*F - Cd*(F - 1). + // As - 1 or F - 1 subtraction is only done for the dual source output (hw blending part) since we are changing the equation. + // Af will be replaced with As in shader and send it to dual source output. + m_conf.blend = {true, GSDevice::CONST_ONE, GSDevice::SRC1_ALPHA, GSDevice::OP_SUBTRACT, false, 0}; + // clr_hw 1 will disable alpha clamp, we can reuse the old bits. + m_conf.ps.clr_hw = 1; + //m_conf.ps.blend_mix = 0; + // DSB output will always be used. + m_conf.ps.no_color1 = false; + } + else if (m_conf.ps.blend_a == m_conf.ps.blend_d) + { + // Compensate slightly for Cd*(As + 1) - Cs*As. + // Try to compensate a bit with subtracting 1 (0.00392) * (Alpha + 1) from Cs. + m_conf.ps.clr_hw = 2; + } + m_conf.ps.blend_a = 0; m_conf.ps.blend_b = 2; m_conf.ps.blend_d = 2; @@ -2797,7 +3078,7 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& else if (m_conf.ps.blend_c == 2) { m_conf.ps.blend_c = 2; - m_conf.cb_ps.TA_MaxDepth_Af.a = static_cast(ALPHA.FIX) / 128.0f; + m_conf.cb_ps.TA_MaxDepth_Af.a = static_cast(AFIX) / 128.0f; m_conf.ps.clr_hw = 2; } else // m_conf.ps.blend_c == 0 @@ -2816,18 +3097,8 @@ void GSRendererHW::EmulateBlending(bool& DATE_PRIMID, bool& DATE_BARRIER, bool& m_conf.ps.clr_hw = 6; m_conf.require_one_barrier |= true; } - - if (m_conf.ps.dfmt == 1 && m_conf.ps.blend_c == 1) - { - // 24 bits doesn't have an alpha channel so use 1.0f fix factor as equivalent - const HWBlend blend(GSDevice::GetBlend(blend_index + 3, replace_dual_src)); // +3 <=> +1 on C - m_conf.blend = {true, blend.src, blend.dst, blend.op, true, 128}; - } - else - { - const HWBlend blend(GSDevice::GetBlend(blend_index, replace_dual_src)); - m_conf.blend = {true, blend.src, blend.dst, blend.op, m_conf.ps.blend_c == 2, ALPHA.FIX}; - } + const HWBlend blend(GSDevice::GetBlend(blend_index, replace_dual_src)); + m_conf.blend = {true, blend.src, blend.dst, blend.op, m_conf.ps.blend_c == 2, AFIX}; // Remove second color output when unused. Works around bugs in some drivers (e.g. Intel). m_conf.ps.no_color1 |= !GSDevice::IsDualSourceBlendFactor(m_conf.blend.src_factor) && @@ -2866,25 +3137,29 @@ void GSRendererHW::EmulateTextureSampler(const GSTextureCache::Source* tex) bool bilinear = m_vt.IsLinear(); int trilinear = 0; - bool trilinear_auto = false; - switch (GSConfig.UserHacks_TriFilter) + bool trilinear_auto = false; // Generate mipmaps if needed (basic). + switch (GSConfig.TriFilter) { case TriFiltering::Forced: - { - // force bilinear otherwise we can end up with min/mag nearest and mip linear. - bilinear = true; - trilinear = static_cast(GS_MIN_FILTER::Linear_Mipmap_Linear); - trilinear_auto = !need_mipmap || GSConfig.HWMipmap != HWMipmapLevel::Full; - } - break; + { + // Force bilinear otherwise we can end up with min/mag nearest and mip linear. + // We don't need to check for HWMipmapLevel::Off here, because forced trilinear implies forced mipmaps. + bilinear = true; + trilinear = static_cast(GS_MIN_FILTER::Linear_Mipmap_Linear); + trilinear_auto = !need_mipmap || GSConfig.HWMipmap != HWMipmapLevel::Full; + } + break; case TriFiltering::PS2: - if (need_mipmap && GSConfig.HWMipmap != HWMipmapLevel::Full) + { + // Can only use PS2 trilinear when mipmapping is enabled. + if (need_mipmap && GSConfig.HWMipmap != HWMipmapLevel::Off) { trilinear = m_context->TEX1.MMIN; - trilinear_auto = true; + trilinear_auto = GSConfig.HWMipmap != HWMipmapLevel::Full; } - break; + } + break; case TriFiltering::Automatic: case TriFiltering::Off: @@ -3105,6 +3380,41 @@ void GSRendererHW::EmulateTextureSampler(const GSTextureCache::Source* tex) if (!m_channel_shuffle) m_conf.tex = tex->m_texture; m_conf.pal = tex->m_palette; + + // Detect framebuffer read that will need special handling + if (m_tex_is_fb) + { + if (m_conf.tex == m_conf.rt) + { + // This pattern is used by several games to emulate a stencil (shadow) + // Ratchet & Clank, Jak do alpha integer multiplication (tfx) which is mostly equivalent to +1/-1 + // Tri-Ace (Star Ocean 3/RadiataStories/VP2) uses a palette to handle the +1/-1 + GL_DBG("Source and Target are the same! Let's sample the framebuffer"); + m_conf.tex = nullptr; + m_conf.ps.tex_is_fb = true; + if (m_prim_overlap == PRIM_OVERLAP_NO || !g_gs_device->Features().texture_barrier) + m_conf.require_one_barrier = true; + else + m_conf.require_full_barrier = true; + } + else if (m_conf.tex == m_conf.ds) + { + // if depth testing is disabled, we don't need to copy, and can just unbind the depth buffer + // no need for a barrier for GL either, since it's not bound to depth and texture concurrently + // otherwise, the backend should recognise the hazard, and copy the buffer (D3D/Vulkan). + if (m_conf.depth.ztst == ZTST_ALWAYS) + { + m_conf.ds = nullptr; + m_tex_is_fb = false; + } + } + else + { + // weird... we detected a fb read, but didn't end up using it? + DevCon.WriteLn("Tex-is-FB set but not used?"); + m_tex_is_fb = false; + } + } } void GSRendererHW::EmulateATST(float& AREF, GSHWDrawConfig::PSSelector& ps, bool pass_2) @@ -3172,10 +3482,6 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc area_out.x, area_out.y, area_out.z, area_out.w); #endif - const GSVector2i& rtsize = ds ? ds->GetSize() : rt->GetSize(); - const GSVector2& rtscale = ds ? ds->GetScale() : rt->GetScale(); - const GSDevice::FeatureSupport features(g_gs_device->Features()); - const bool DATE = m_context->TEST.DATE && m_context->FRAME.PSM != PSM_PSMCT24; bool DATE_PRIMID = false; bool DATE_BARRIER = false; @@ -3190,7 +3496,7 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc m_conf.rt = rt; m_conf.ds = ds; - ASSERT(g_gs_device != NULL); + ASSERT(g_gs_device != nullptr); // Z setup has to come before channel shuffle EmulateZbuffer(); @@ -3205,32 +3511,12 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc // Upscaling hack to avoid various line/grid issues MergeSprite(tex); + const GSDevice::FeatureSupport features(g_gs_device->Features()); if (!features.framebuffer_fetch) m_prim_overlap = PrimitiveOverlap(); else m_prim_overlap = PRIM_OVERLAP_UNKNOW; - // Detect framebuffer read that will need special handling - if (features.texture_barrier && (m_context->FRAME.Block() == m_context->TEX0.TBP0) && PRIM->TME && GSConfig.AccurateBlendingUnit != AccBlendLevel::Minimum) - { - const u32 fb_mask = GSLocalMemory::m_psm[m_context->FRAME.PSM].fmsk; - if (((m_context->FRAME.FBMSK & fb_mask) == (fb_mask & 0x00FFFFFF)) && (m_vt.m_primclass == GS_TRIANGLE_CLASS)) - { - // This pattern is used by several games to emulate a stencil (shadow) - // Ratchet & Clank, Jak do alpha integer multiplication (tfx) which is mostly equivalent to +1/-1 - // Tri-Ace (Star Ocean 3/RadiataStories/VP2) uses a palette to handle the +1/-1 - GL_DBG("Source and Target are the same! Let's sample the framebuffer"); - m_conf.ps.tex_is_fb = 1; - m_conf.require_full_barrier = !features.framebuffer_fetch; - } - else if (m_prim_overlap != PRIM_OVERLAP_NO) - { - // Note: It is fine if the texture fits in a single GS page. First access will cache - // the page in the GS texture buffer. - GL_INS("ERROR: Source and Target are the same!"); - } - } - EmulateTextureShuffleAndFbmask(); // DATE: selection of the algorithm. Must be done before blending because GL42 is not compatible with blending @@ -3253,7 +3539,9 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc DATE_BARRIER = true; } } - else if (m_context->FBA.FBA) + // When Blending is disabled and Edge Anti Aliasing is enabled, + // the output alpha is Coverage (which we force to 128) so DATE will fail/pass guaranteed on second pass. + else if (m_conf.colormask.wa && (m_context->FBA.FBA || IsCoverageAlpha()) && features.stencil_buffer) { GL_PERF("DATE: Fast with FBA, all pixels will be >= 128"); DATE_one = !m_context->TEST.DATM; @@ -3275,34 +3563,30 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc GL_PERF("DATE: Fast with alpha %d-%d", GetAlphaMinMax().min, GetAlphaMinMax().max); DATE_one = true; } - else if ((m_vt.m_primclass == GS_SPRITE_CLASS && m_drawlist.size() < 50) || (m_index.tail < 100)) + else if (features.texture_barrier && ((m_vt.m_primclass == GS_SPRITE_CLASS && m_drawlist.size() < 50) || (m_index.tail < 100))) { // texture barrier will split the draw call into n draw call. It is very efficient for // few primitive draws. Otherwise it sucks. GL_PERF("DATE: Accurate with alpha %d-%d", GetAlphaMinMax().min, GetAlphaMinMax().max); - if (features.texture_barrier) - { - m_conf.require_full_barrier = true; - DATE_BARRIER = true; - } + m_conf.require_full_barrier = true; + DATE_BARRIER = true; } - else if (GSConfig.AccurateDATE) + else if (features.primitive_id) { - // Note: Fast level (DATE_one) was removed as it's less accurate. GL_PERF("DATE: Accurate with alpha %d-%d", GetAlphaMinMax().min, GetAlphaMinMax().max); - if (features.image_load_store) - { - DATE_PRIMID = true; - } - else if (features.texture_barrier) - { - m_conf.require_full_barrier = true; - DATE_BARRIER = true; - } - else if (features.stencil_buffer) - { - DATE_one = true; - } + DATE_PRIMID = true; + } + else if (features.texture_barrier) + { + GL_PERF("DATE: Accurate with alpha %d-%d", GetAlphaMinMax().min, GetAlphaMinMax().max); + m_conf.require_full_barrier = true; + DATE_BARRIER = true; + } + else if (features.stencil_buffer) + { + // Might be inaccurate in some cases but we shouldn't hit this path. + GL_PERF("DATE: Fast with alpha %d-%d", GetAlphaMinMax().min, GetAlphaMinMax().max); + DATE_one = true; } } else if (!m_conf.colormask.wa && !m_context->TEST.ATE) @@ -3372,6 +3656,8 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc m_conf.vs.fst = PRIM->FST; // FIXME D3D11 and GL support half pixel center. Code could be easier!!! + const GSVector2i rtsize(m_conf.ds ? m_conf.ds->GetSize() : m_conf.rt->GetSize()); + const GSVector2 rtscale(m_conf.ds ? m_conf.ds->GetScale() : m_conf.rt->GetScale()); const float sx = 2.0f * rtscale.x / (rtsize.x << 4); const float sy = 2.0f * rtscale.y / (rtsize.y << 4); const float ox = (float)(int)m_context->XYOFFSET.OFX; @@ -3413,19 +3699,21 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc m_conf.depth.date = 1; m_conf.depth.date_one = 1; } + else if (DATE_PRIMID) + { + m_conf.ps.date = 1 + m_context->TEST.DATM; + m_conf.gs.forward_primid = 1; + } else if (DATE) { - if (DATE_PRIMID) - m_conf.ps.date = 1 + m_context->TEST.DATM; - else - m_conf.depth.date = 1; + m_conf.depth.date = 1; } m_conf.ps.fba = m_context->FBA.FBA; if (m_conf.ps.dither) { - GL_DBG("DITHERING mode ENABLED (%d)", m_dithering); + GL_DBG("DITHERING mode ENABLED (%d)", GSConfig.Dithering); m_conf.ps.dither = GSConfig.Dithering; m_conf.cb_ps.DitherMatrix[0] = GSVector4(m_env.DIMX.DM00, m_env.DIMX.DM01, m_env.DIMX.DM02, m_env.DIMX.DM03); @@ -3449,7 +3737,7 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc // pass to handle the depth based on the alpha test. bool ate_RGBA_then_Z = false; bool ate_RGB_then_ZA = false; - if (ate_first_pass & ate_second_pass) + if (ate_first_pass && ate_second_pass) { GL_DBG("Complex Alpha Test"); const bool commutative_depth = (m_conf.depth.ztst == ZTST_GEQUAL && m_vt.m_eq.z) || (m_conf.depth.ztst == ZTST_ALWAYS); @@ -3538,6 +3826,8 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc m_conf.require_one_barrier = false; m_conf.require_full_barrier = false; } + // Multi-pass algorithms shouldn't be needed with full barrier and backends may not handle this correctly + ASSERT(!m_conf.require_full_barrier || !m_conf.ps.hdr); // Swap full barrier for one barrier when there's no overlap. if (m_conf.require_full_barrier && m_prim_overlap == PRIM_OVERLAP_NO) @@ -3555,12 +3845,6 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc SetupIA(sx, sy); - if (rt) - rt->CommitRegion(GSVector2i(m_conf.drawarea.z, m_conf.drawarea.w)); - - if (ds) - ds->CommitRegion(GSVector2i(m_conf.drawarea.z, m_conf.drawarea.w)); - m_conf.alpha_second_pass.enable = ate_second_pass; if (ate_second_pass) @@ -3570,7 +3854,7 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc memcpy(&m_conf.alpha_second_pass.colormask, &m_conf.colormask, sizeof(m_conf.colormask)); memcpy(&m_conf.alpha_second_pass.depth, &m_conf.depth, sizeof(m_conf.depth)); - if (ate_RGBA_then_Z | ate_RGB_then_ZA) + if (ate_RGBA_then_Z || ate_RGB_then_ZA) { // Enable ATE as first pass to update the depth // of pixels that passed the alpha test @@ -3676,11 +3960,131 @@ void GSRendererHW::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc g_gs_device->RenderHW(m_conf); } -bool GSRendererHW::IsDummyTexture() const +bool GSRendererHW::PossibleCLUTDraw() { - // Texture is actually the frame buffer. Stencil emulation to compute shadow (Jak series/tri-ace game) - // Will hit the "m_ps_sel.tex_is_fb = 1" path in the draw - return g_gs_device->Features().texture_barrier && (m_context->FRAME.Block() == m_context->TEX0.TBP0) && PRIM->TME && GSConfig.AccurateBlendingUnit != AccBlendLevel::Minimum && m_vt.m_primclass == GS_TRIANGLE_CLASS && (m_context->FRAME.FBMSK == 0x00FFFFFF); + // No shuffles. + if (m_channel_shuffle || m_texture_shuffle) + return false; + + // Keep the draws simple, no alpha testing, blending, mipmapping, Z writes, and make sure it's flat. + const bool fb_only = m_context->TEST.ATE && m_context->TEST.AFAIL == 1 && m_context->TEST.ATST == ATST_NEVER; + + // No Z writes, unless it's points, then it's quite likely to be a palette and they left it on. + if (!m_context->ZBUF.ZMSK && !fb_only && !(m_vt.m_primclass == GS_POINT_CLASS)) + return false; + + // Make sure it's flat. + if (m_vt.m_eq.z != 0x1) + return false; + + // No mipmapping, please never be any mipmapping... + if (m_context->TEX1.MXL) + return false; + + // Writing to the framebuffer for output. We're not interested. - Note: This stops NFS HP2 Busted screens working, but they're glitchy anyway + // what NFS HP2 really needs is a kind of shuffle with mask, 32bit target is interpreted as 16bit and masked. + if ((m_regs->DISP[0].DISPFB.Block() == m_context->FRAME.Block()) || (m_regs->DISP[1].DISPFB.Block() == m_context->FRAME.Block()) || + (PRIM->TME && ((m_regs->DISP[0].DISPFB.Block() == m_context->TEX0.TBP0) || (m_regs->DISP[1].DISPFB.Block() == m_context->TEX0.TBP0)) && !(m_mem.m_clut.IsInvalid() & 2))) + return false; + + // Ignore recursive/shuffle effects, but possible it will recursively draw, but make sure it's staying in page width + if (PRIM->TME && m_context->TEX0.TBP0 == m_context->FRAME.Block() && (m_context->FRAME.FBW != 1 && m_context->TEX0.TBW == m_context->FRAME.FBW)) + return false; + + // Hopefully no games draw a CLUT with a CLUT, that would be evil, most likely a channel shuffle. + if (PRIM->TME && GSLocalMemory::m_psm[m_context->TEX0.PSM].pal > 0) + return false; + + const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[m_context->FRAME.PSM]; + + // Make sure the CLUT formats are matching. + if (GSLocalMemory::m_psm[m_mem.m_clut.GetCLUTCPSM()].bpp != psm.bpp) + return false; + + // Max size for a CLUT/Current page size. + constexpr float min_clut_width = 7.0f; + constexpr float min_clut_height = 1.0f; + const float page_width = static_cast(psm.pgs.x); + const float page_height = static_cast(psm.pgs.y); + + // If the coordinates aren't starting within the page, it's likely not a CLUT draw. + if (floor(m_vt.m_min.p.x) < 0 || floor(m_vt.m_min.p.y) < 0 || floor(m_vt.m_min.p.x) > page_width || floor(m_vt.m_min.p.y) > page_height) + return false; + + // Make sure it's a division of 8 in width to avoid bad draws. Points will go from 0-7 inclusive, but sprites etc will do 0-16 exclusive. + int draw_divder_match = false; + const int valid_sizes[] = { 8, 16, 32, 64 }; + + for (int i = 0; i < 4; i++) { + draw_divder_match = ((m_vt.m_primclass == GS_POINT_CLASS) ? ((static_cast(m_vt.m_max.p.x + 1) & ~1) == valid_sizes[i]) : (static_cast(m_vt.m_max.p.x) == valid_sizes[i])); + + if (draw_divder_match) + break; + } + // Make sure it's kinda CLUT sized, at least. Be wary, it can draw a line at a time (Guitar Hero - Metallica) + // Driver Parallel Lines draws a bunch of CLUT's at once, ending up as a 64x256 draw, very annoying. + const float draw_width = (m_vt.m_max.p.x - m_vt.m_min.p.x); + const float draw_height = (m_vt.m_max.p.y - m_vt.m_min.p.y); + const bool valid_size = ((draw_width >= min_clut_width || draw_height >= min_clut_height)) + && (((draw_width < page_width && draw_height <= page_height) || (draw_width == page_width)) && draw_divder_match); // Make sure draw is multiples of 8 wide (AC5 midetection). + + // Make sure the draw hits the next CLUT and it's marked as invalid (kind of a sanity check). + // We can also allow draws which are of a sensible size within the page, as they could also be CLUT draws (or gradients for the CLUT). + if (!valid_size) + return false; + + if (PRIM->TME) + { + // If we're using a texture to draw our CLUT/whatever, we need the GPU to write back dirty data we need. + const GSVector4i r = GetTextureMinMax(m_context->TEX0, m_context->CLAMP, m_vt.IsLinear()).coverage; + + GIFRegBITBLTBUF BITBLTBUF; + BITBLTBUF.SBP = m_context->TEX0.TBP0; + BITBLTBUF.SBW = m_context->TEX0.TBW; + BITBLTBUF.SPSM = m_context->TEX0.PSM; + + InvalidateLocalMem(BITBLTBUF, r); + } + // Debugging stuff.. + //const u32 startbp = psm.info.bn(m_vt.m_min.p.x, m_vt.m_min.p.y, m_context->FRAME.Block(), m_context->FRAME.FBW); + //const u32 endbp = psm.info.bn(m_vt.m_max.p.x, m_vt.m_max.p.y, m_context->FRAME.Block(), m_context->FRAME.FBW); + //DevCon.Warning("Draw width %f height %f page width %f height %f TPSM %x TBP0 %x FPSM %x FBP %x CBP %x valid size %d Invalid %d DISPFB0 %x DISPFB1 %x start %x end %x draw %d", draw_width, draw_height, page_width, page_height, m_context->TEX0.PSM, m_context->TEX0.TBP0, m_context->FRAME.PSM, m_context->FRAME.Block(), m_mem.m_clut.GetCLUTCBP(), valid_size, m_mem.m_clut.IsInvalid(), m_regs->DISP[0].DISPFB.Block(), m_regs->DISP[1].DISPFB.Block(), startbp, endbp, s_n); + + return true; +} + +// Slight more aggressive version that kinda YOLO's it if the draw is anywhere near the CLUT or is point/line (providing it's not too wide of a draw and a few other parameters. +// This is pretty much tuned for the Sega Model 2 games, which draw a huge gradient, then pick lines out of it to make up CLUT's for about 4000 draws... +bool GSRendererHW::PossibleCLUTDrawAggressive() +{ + // Avoid any shuffles. + if (m_channel_shuffle || m_texture_shuffle) + return false; + + // Keep the draws simple, no alpha testing, blending, mipmapping, Z writes, and make sure it's flat. + if (m_context->TEST.ATE) + return false; + + if (PRIM->ABE) + return false; + + if (m_context->TEX1.MXL) + return false; + + if (m_context->FRAME.FBW != 1) + return false; + + if (!m_context->ZBUF.ZMSK) + return false; + + if (m_vt.m_eq.z != 0x1) + return false; + + if (!((m_vt.m_primclass == GS_POINT_CLASS || m_vt.m_primclass == GS_LINE_CLASS) || ((m_mem.m_clut.GetCLUTCBP() >> 5) >= m_context->FRAME.FBP && (m_context->FRAME.FBP + 1U) >= (m_mem.m_clut.GetCLUTCBP() >> 5) && m_vt.m_primclass == GS_SPRITE_CLASS))) + return false; + + // Avoid invalidating anything here, we just want to avoid the thing being drawn on the GPU. + return true; } bool GSRendererHW::CanUseSwPrimRender(bool no_rt, bool no_ds, bool draw_sprite_tex) @@ -3713,428 +4117,13 @@ bool GSRendererHW::CanUseSwPrimRender(bool no_rt, bool no_ds, bool draw_sprite_t return true; } -bool GSRendererHW::SwPrimRender() -{ - const GSDrawingContext* context = m_context; - const GSDrawingEnvironment& env = m_env; - const GS_PRIM_CLASS primclass = m_vt.m_primclass; - - GSDrawScanline::SharedData data; - GSScanlineGlobalData& gd = data.global; - - u32 clut_storage[256]; - GSVector4i dimx_storage[8]; - - m_sw_vertex_buffer.resize(((m_vertex.next + 1) & ~1)); - - data.primclass = m_vt.m_primclass; - data.buff = nullptr; - data.vertex = m_sw_vertex_buffer.data(); - data.vertex_count = m_vertex.next; - data.index = m_index.buff; - data.index_count = m_index.tail; - data.scanmsk_value = m_env.SCANMSK.MSK; - - // Skip per pixel division if q is constant. - // Optimize the division by 1 with a nop. It also means that GS_SPRITE_CLASS must be processed when !m_vt.m_eq.q. - // If you have both GS_SPRITE_CLASS && m_vt.m_eq.q, it will depends on the first part of the 'OR'. - const u32 q_div = ((m_vt.m_eq.q && m_vt.m_min.t.z != 1.0f) || (!m_vt.m_eq.q && m_vt.m_primclass == GS_SPRITE_CLASS)); - GSVertexSW::s_cvb[m_vt.m_primclass][PRIM->TME][PRIM->FST][q_div](m_context, data.vertex, m_vertex.buff, m_vertex.next); - - GSVector4i scissor = GSVector4i(m_context->scissor.in); - GSVector4i bbox = GSVector4i(m_vt.m_min.p.floor().xyxy(m_vt.m_max.p.ceil())); - - // Points and lines may have zero area bbox (single line: 0, 0 - 256, 0) - - if (m_vt.m_primclass == GS_POINT_CLASS || m_vt.m_primclass == GS_LINE_CLASS) - { - if (bbox.x == bbox.z) - bbox.z++; - if (bbox.y == bbox.w) - bbox.w++; - } - - scissor.z = std::min(scissor.z, (int)context->FRAME.FBW * 64); // TODO: find a game that overflows and check which one is the right behaviour - - data.scissor = scissor; - data.bbox = bbox; - data.frame = g_perfmon.GetFrame(); - - gd.vm = m_mem.m_vm8; - - gd.fbo = context->offset.fb; - gd.zbo = context->offset.zb; - gd.fzbr = context->offset.fzb4->row; - gd.fzbc = context->offset.fzb4->col; - - gd.sel.key = 0; - - gd.sel.fpsm = 3; - gd.sel.zpsm = 3; - gd.sel.atst = ATST_ALWAYS; - gd.sel.tfx = TFX_NONE; - gd.sel.ababcd = 0xff; - gd.sel.prim = primclass; - - u32 fm = context->FRAME.FBMSK; - u32 zm = context->ZBUF.ZMSK || context->TEST.ZTE == 0 ? 0xffffffff : 0; - const u32 fm_mask = GSLocalMemory::m_psm[m_context->FRAME.PSM].fmsk; - - // When the format is 24bit (Z or C), DATE ceases to function. - // It was believed that in 24bit mode all pixels pass because alpha doesn't exist - // however after testing this on a PS2 it turns out nothing passes, it ignores the draw. - if ((m_context->FRAME.PSM & 0xF) == PSM_PSMCT24 && m_context->TEST.DATE) - { - //DevCon.Warning("DATE on a 24bit format, Frame PSM %x", m_context->FRAME.PSM); - return false; - } - - if (context->TEST.ZTE && context->TEST.ZTST == ZTST_NEVER) - { - fm = 0xffffffff; - zm = 0xffffffff; - } - - if (PRIM->TME) - { - if (GSLocalMemory::m_psm[context->TEX0.PSM].pal > 0) - { - m_mem.m_clut.Read32(context->TEX0, env.TEXA); - } - } - - if (context->TEST.ATE) - { - if (!TryAlphaTest(fm, fm_mask, zm)) - { - gd.sel.atst = context->TEST.ATST; - gd.sel.afail = context->TEST.AFAIL; - - gd.aref = GSVector4i((int)context->TEST.AREF); - - switch (gd.sel.atst) - { - case ATST_LESS: - gd.sel.atst = ATST_LEQUAL; - gd.aref -= GSVector4i::x00000001(); - break; - case ATST_GREATER: - gd.sel.atst = ATST_GEQUAL; - gd.aref += GSVector4i::x00000001(); - break; - } - } - } - - bool fwrite = (fm & fm_mask) != fm_mask; - bool ftest = gd.sel.atst != ATST_ALWAYS || context->TEST.DATE && context->FRAME.PSM != PSM_PSMCT24; - - bool zwrite = zm != 0xffffffff; - bool ztest = context->TEST.ZTE && context->TEST.ZTST > ZTST_ALWAYS; - if (!fwrite && !zwrite) - return false; - - gd.sel.fwrite = fwrite; - gd.sel.ftest = ftest; - - if (fwrite || ftest) - { - gd.sel.fpsm = GSLocalMemory::m_psm[context->FRAME.PSM].fmt; - - if ((primclass == GS_LINE_CLASS || primclass == GS_TRIANGLE_CLASS) && m_vt.m_eq.rgba != 0xffff) - { - gd.sel.iip = PRIM->IIP; - } - - if (PRIM->TME) - { - gd.sel.tfx = context->TEX0.TFX; - gd.sel.tcc = context->TEX0.TCC; - gd.sel.fst = PRIM->FST; - gd.sel.ltf = m_vt.IsLinear(); - - if (GSLocalMemory::m_psm[context->TEX0.PSM].pal > 0) - { - gd.sel.tlu = 1; - - gd.clut = clut_storage; // FIXME: might address uninitialized data of the texture (0xCD) that is not in 0-15 range for 4-bpp formats - - memcpy(gd.clut, (const u32*)m_mem.m_clut, sizeof(u32) * GSLocalMemory::m_psm[context->TEX0.PSM].pal); - } - - gd.sel.wms = context->CLAMP.WMS; - gd.sel.wmt = context->CLAMP.WMT; - - if (gd.sel.tfx == TFX_MODULATE && gd.sel.tcc && m_vt.m_eq.rgba == 0xffff && m_vt.m_min.c.eq(GSVector4i(128))) - { - // modulate does not do anything when vertex color is 0x80 - - gd.sel.tfx = TFX_DECAL; - } - - GIFRegTEX0 TEX0 = m_context->GetSizeFixedTEX0(m_vt.m_min.t.xyxy(m_vt.m_max.t), m_vt.IsLinear(), false); - - GSVector4i r = GetTextureMinMax(TEX0, context->CLAMP, gd.sel.ltf).coverage; - - if (!m_sw_texture) - m_sw_texture = std::make_unique(0, TEX0, env.TEXA); - else - m_sw_texture->Reset(0, TEX0, env.TEXA); - - m_sw_texture->Update(r); - gd.tex[0] = m_sw_texture->m_buff; - - gd.sel.tw = m_sw_texture->m_tw - 3; - - { - // skip per pixel division if q is constant. Sprite uses flat - // q, so it's always constant by primitive. - // Note: the 'q' division was done in GSRendererSW::ConvertVertexBuffer - gd.sel.fst |= (m_vt.m_eq.q || primclass == GS_SPRITE_CLASS); - - if (gd.sel.ltf && gd.sel.fst) - { - // if q is constant we can do the half pel shift for bilinear sampling on the vertices - - // TODO: but not when mipmapping is used!!! - - GSVector4 half(0x8000, 0x8000); - - GSVertexSW* RESTRICT v = data.vertex; - - for (int i = 0, j = data.vertex_count; i < j; i++) - { - GSVector4 t = v[i].t; - - v[i].t = (t - half).xyzw(t); - } - } - } - - u16 tw = 1u << TEX0.TW; - u16 th = 1u << TEX0.TH; - - switch (context->CLAMP.WMS) - { - case CLAMP_REPEAT: - gd.t.min.U16[0] = gd.t.minmax.U16[0] = tw - 1; - gd.t.max.U16[0] = gd.t.minmax.U16[2] = 0; - gd.t.mask.U32[0] = 0xffffffff; - break; - case CLAMP_CLAMP: - gd.t.min.U16[0] = gd.t.minmax.U16[0] = 0; - gd.t.max.U16[0] = gd.t.minmax.U16[2] = tw - 1; - gd.t.mask.U32[0] = 0; - break; - case CLAMP_REGION_CLAMP: - gd.t.min.U16[0] = gd.t.minmax.U16[0] = std::min(context->CLAMP.MINU, tw - 1); - gd.t.max.U16[0] = gd.t.minmax.U16[2] = std::min(context->CLAMP.MAXU, tw - 1); - gd.t.mask.U32[0] = 0; - break; - case CLAMP_REGION_REPEAT: - gd.t.min.U16[0] = gd.t.minmax.U16[0] = context->CLAMP.MINU & (tw - 1); - gd.t.max.U16[0] = gd.t.minmax.U16[2] = context->CLAMP.MAXU & (tw - 1); - gd.t.mask.U32[0] = 0xffffffff; - break; - default: - __assume(0); - } - - switch (context->CLAMP.WMT) - { - case CLAMP_REPEAT: - gd.t.min.U16[4] = gd.t.minmax.U16[1] = th - 1; - gd.t.max.U16[4] = gd.t.minmax.U16[3] = 0; - gd.t.mask.U32[2] = 0xffffffff; - break; - case CLAMP_CLAMP: - gd.t.min.U16[4] = gd.t.minmax.U16[1] = 0; - gd.t.max.U16[4] = gd.t.minmax.U16[3] = th - 1; - gd.t.mask.U32[2] = 0; - break; - case CLAMP_REGION_CLAMP: - gd.t.min.U16[4] = gd.t.minmax.U16[1] = std::min(context->CLAMP.MINV, th - 1); - gd.t.max.U16[4] = gd.t.minmax.U16[3] = std::min(context->CLAMP.MAXV, th - 1); // ffx anima summon scene, when the anchor appears (th = 256, maxv > 256) - gd.t.mask.U32[2] = 0; - break; - case CLAMP_REGION_REPEAT: - gd.t.min.U16[4] = gd.t.minmax.U16[1] = context->CLAMP.MINV & (th - 1); // skygunner main menu water texture 64x64, MINV = 127 - gd.t.max.U16[4] = gd.t.minmax.U16[3] = context->CLAMP.MAXV & (th - 1); - gd.t.mask.U32[2] = 0xffffffff; - break; - default: - __assume(0); - } - - gd.t.min = gd.t.min.xxxxlh(); - gd.t.max = gd.t.max.xxxxlh(); - gd.t.mask = gd.t.mask.xxzz(); - gd.t.invmask = ~gd.t.mask; - } - - if (PRIM->FGE) - { - gd.sel.fge = 1; - - gd.frb = env.FOGCOL.U32[0] & 0x00ff00ff; - gd.fga = (env.FOGCOL.U32[0] >> 8) & 0x00ff00ff; - } - - if (context->FRAME.PSM != PSM_PSMCT24) - { - gd.sel.date = context->TEST.DATE; - gd.sel.datm = context->TEST.DATM; - } - - if (!IsOpaque()) - { - gd.sel.abe = PRIM->ABE; - gd.sel.ababcd = context->ALPHA.U32[0]; - - if (env.PABE.PABE) - { - gd.sel.pabe = 1; - } - - if (GSConfig.AA1 && PRIM->AA1 && (primclass == GS_LINE_CLASS || primclass == GS_TRIANGLE_CLASS)) - { - gd.sel.aa1 = 1; - } - - gd.afix = GSVector4i((int)context->ALPHA.FIX << 7).xxzzlh(); - } - - const u32 masked_fm = fm & fm_mask; - if (gd.sel.date - || gd.sel.aba == 1 || gd.sel.abb == 1 || gd.sel.abc == 1 || gd.sel.abd == 1 - || gd.sel.atst != ATST_ALWAYS && gd.sel.afail == AFAIL_RGB_ONLY - || gd.sel.fpsm == 0 && masked_fm != 0 && masked_fm != fm_mask - || gd.sel.fpsm == 1 && masked_fm != 0 && masked_fm != fm_mask - || gd.sel.fpsm == 2 && masked_fm != 0 && masked_fm != fm_mask) - { - gd.sel.rfb = 1; - } - - gd.sel.colclamp = env.COLCLAMP.CLAMP; - gd.sel.fba = context->FBA.FBA; - - if (env.DTHE.DTHE) - { - gd.sel.dthe = 1; - - gd.dimx = dimx_storage; - - memcpy(gd.dimx, env.dimx, sizeof(env.dimx)); - } - } - - gd.sel.zwrite = zwrite; - gd.sel.ztest = ztest; - - if (zwrite || ztest) - { - u32 z_max = 0xffffffff >> (GSLocalMemory::m_psm[context->ZBUF.PSM].fmt * 8); - - gd.sel.zpsm = GSLocalMemory::m_psm[context->ZBUF.PSM].fmt; - gd.sel.ztst = ztest ? context->TEST.ZTST : (int)ZTST_ALWAYS; - gd.sel.zequal = !!m_vt.m_eq.z; - gd.sel.zoverflow = (u32)GSVector4i(m_vt.m_max.p).z == 0x80000000U; - gd.sel.zclamp = (u32)GSVector4i(m_vt.m_max.p).z > z_max; - } - -#if _M_SSE >= 0x501 - - gd.fm = fm; - gd.zm = zm; - - if (gd.sel.fpsm == 1) - { - gd.fm |= 0xff000000; - } - else if (gd.sel.fpsm == 2) - { - u32 rb = gd.fm & 0x00f800f8; - u32 ga = gd.fm & 0x8000f800; - - gd.fm = (ga >> 16) | (rb >> 9) | (ga >> 6) | (rb >> 3) | 0xffff0000; - } - - if (gd.sel.zpsm == 1) - { - gd.zm |= 0xff000000; - } - else if (gd.sel.zpsm == 2) - { - gd.zm |= 0xffff0000; - } - -#else - - gd.fm = GSVector4i(fm); - gd.zm = GSVector4i(zm); - - if (gd.sel.fpsm == 1) - { - gd.fm |= GSVector4i::xff000000(); - } - else if (gd.sel.fpsm == 2) - { - GSVector4i rb = gd.fm & 0x00f800f8; - GSVector4i ga = gd.fm & 0x8000f800; - - gd.fm = (ga >> 16) | (rb >> 9) | (ga >> 6) | (rb >> 3) | GSVector4i::xffff0000(); - } - - if (gd.sel.zpsm == 1) - { - gd.zm |= GSVector4i::xff000000(); - } - else if (gd.sel.zpsm == 2) - { - gd.zm |= GSVector4i::xffff0000(); - } - -#endif - - if (gd.sel.prim == GS_SPRITE_CLASS && !gd.sel.ftest && !gd.sel.ztest && data.bbox.eq(data.bbox.rintersect(data.scissor))) // TODO: check scissor horizontally only - { - gd.sel.notest = 1; - - u32 ofx = context->XYOFFSET.OFX; - - for (int i = 0, j = m_vertex.tail; i < j; i++) - { -#if _M_SSE >= 0x501 - if ((((m_vertex.buff[i].XYZ.X - ofx) + 15) >> 4) & 7) // aligned to 8 -#else - if ((((m_vertex.buff[i].XYZ.X - ofx) + 15) >> 4) & 3) // aligned to 4 -#endif - { - gd.sel.notest = 0; - - break; - } - } - } - - if (!m_sw_rasterizer) - m_sw_rasterizer = std::make_unique(new GSDrawScanline(), 0, 1); - - m_sw_rasterizer->Draw(&data); - - m_tc->InvalidateVideoMem(context->offset.fb, bbox); - return true; -} - // hacks GSRendererHW::Hacks::Hacks() : m_oi_map(m_oi_list) , m_oo_map(m_oo_list) - , m_cu_map(m_cu_list) - , m_oi(NULL) - , m_oo(NULL) - , m_cu(NULL) + , m_oi(nullptr) + , m_oo(nullptr) { m_oi_list.push_back(HackEntry(CRC::BigMuthaTruckers, CRC::RegionCount, &GSRendererHW::OI_BigMuthaTruckers)); m_oi_list.push_back(HackEntry(CRC::DBZBT2, CRC::RegionCount, &GSRendererHW::OI_DBZBTGames)); @@ -4150,8 +4139,10 @@ GSRendererHW::Hacks::Hacks() m_oi_list.push_back(HackEntry(CRC::Jak3, CRC::RegionCount, &GSRendererHW::OI_JakGames)); m_oi_list.push_back(HackEntry(CRC::JakX, CRC::RegionCount, &GSRendererHW::OI_JakGames)); m_oi_list.push_back(HackEntry(CRC::BurnoutGames, CRC::RegionCount, &GSRendererHW::OI_BurnoutGames)); + m_oi_list.push_back(HackEntry(CRC::Black, CRC::RegionCount, &GSRendererHW::OI_BurnoutGames)); m_oo_list.push_back(HackEntry(CRC::BurnoutGames, CRC::RegionCount, &GSRendererHW::OO_BurnoutGames)); + m_oo_list.push_back(HackEntry(CRC::Black, CRC::RegionCount, &GSRendererHW::OO_BurnoutGames)); } void GSRendererHW::Hacks::SetGameCRC(const CRC::Game& game) @@ -4160,7 +4151,6 @@ void GSRendererHW::Hacks::SetGameCRC(const CRC::Game& game) m_oi = m_oi_map[hash]; m_oo = m_oo_map[hash]; - m_cu = m_cu_map[hash]; if (GSConfig.PointListPalette) { @@ -4174,7 +4164,7 @@ void GSRendererHW::Hacks::SetGameCRC(const CRC::Game& game) // Trick to do a fast clear on the GS // Set frame buffer pointer on the start of the buffer. Set depth buffer pointer on the half buffer // FB + depth write will fill the full buffer. -void GSRendererHW::OI_DoubleHalfClear(GSTexture* rt, GSTexture* ds) +void GSRendererHW::OI_DoubleHalfClear(GSTextureCache::Target*& rt, GSTextureCache::Target*& ds) { // Note gs mem clear must be tested before calling this function @@ -4220,20 +4210,35 @@ void GSRendererHW::OI_DoubleHalfClear(GSTexture* rt, GSTexture* ds) GL_INS("OI_DoubleHalfClear:%s: base %x half %x. w_pages %d h_pages %d fbw %d. Color %x", clear_depth ? "depth" : "target", base << 5, half << 5, w_pages, h_pages, m_context->FRAME.FBW, color); - // Commit texture with a factor 2 on the height - GSTexture* t = clear_depth ? ds : rt; - const GSVector4i commitRect = ComputeBoundingBox(t->GetScale(), t->GetSize()); - t->CommitRegion(GSVector2i(commitRect.z, 2 * commitRect.w)); + // Handle the case where the game stacks FBP and ZBP immediately after one another. + // We incorrectly compute the height here, because both the scissor and draw rectangle will only be half + // the height of what's effectively being cleared. Spider-Man 2's shadows are a good test case here: it + // draws the shadow map to a 128x128 texture, but relies on a 1 pixel border around the edge to "cut off" + // the shadows. We cap it to a 256 height, because having a >=512 height framebuffer is very rare, and it + // stops us doubling actual framebuffers unintentionally (very common). + GSTextureCache::Target* t = clear_depth ? ds : rt; + const u32 unscaled_height = static_cast(static_cast(t->m_texture->GetHeight()) / t->m_texture->GetScale().y); + if (unscaled_height == m_context->scissor.in.w && unscaled_height <= 256) + { + t->ResizeTexture(t->m_texture->GetWidth(), t->m_texture->GetHeight() * 2, t->m_texture->GetScale()); + if (clear_depth) + rt = nullptr; + else + ds = nullptr; + + // Feed it back into the height cache. + m_tc->GetTargetHeight(t->m_TEX0.TBP0, t->m_TEX0.TBW, t->m_TEX0.PSM, unscaled_height * 2); + } if (clear_depth) { // Only pure clear are supported for depth ASSERT(color == 0); - g_gs_device->ClearDepth(t); + g_gs_device->ClearDepth(ds->m_texture); } else { - g_gs_device->ClearRenderTarget(t, color); + g_gs_device->ClearRenderTarget(rt->m_texture, color); } } } @@ -4242,22 +4247,19 @@ void GSRendererHW::OI_DoubleHalfClear(GSTexture* rt, GSTexture* ds) && (m_context->FRAME.PSM & 0xF) == (m_context->ZBUF.PSM & 0xF) && (u32)(GSVector4i(m_vt.m_max.p).z) == 0) { const GSVertex* v = &m_vertex.buff[0]; - + // Z and color must be constant and the same if (m_vt.m_eq.rgba != 0xFFFF || !m_vt.m_eq.z || v[1].XYZ.Z != v[1].RGBAQ.U32[0]) return; // If both buffers are side by side we can expect a fast clear in on-going const u32 color = v[1].RGBAQ.U32[0]; - const GSVector4i commitRect = ComputeBoundingBox(rt->GetScale(), rt->GetSize()); - rt->CommitRegion(GSVector2i(commitRect.z, commitRect.w)); - - g_gs_device->ClearRenderTarget(rt, color); + g_gs_device->ClearRenderTarget(rt->m_texture, color); } } // Note: hack is safe, but it could impact the perf a little (normally games do only a couple of clear by frame) -void GSRendererHW::OI_GsMemClear() +bool GSRendererHW::OI_GsMemClear() { // Note gs mem clear must be tested before calling this function @@ -4273,7 +4275,7 @@ void GSRendererHW::OI_GsMemClear() // Limit the hack to a single fullscreen clear. Some games might use severals column to clear a screen // but hopefully it will be enough. if (r.width() <= 128 || r.height() <= 128) - return; + return false; GL_INS("OI_GsMemClear (%d,%d => %d,%d)", r.x, r.y, r.z, r.w); const int format = GSLocalMemory::m_psm[m_context->FRAME.PSM].fmt; @@ -4323,7 +4325,9 @@ void GSRendererHW::OI_GsMemClear() } #endif } + return true; } + return false; } bool GSRendererHW::OI_BlitFMV(GSTextureCache::Target* _rt, GSTextureCache::Source* tex, const GSVector4i& r_draw) @@ -4346,14 +4350,8 @@ bool GSRendererHW::OI_BlitFMV(GSTextureCache::Target* _rt, GSTextureCache::Sourc // Bottom of Texture (half height frame, will be the copy of Top texture after the draw) // ----------------------------------------------------------------- - // sRect is the top of texture const int tw = (int)(1 << m_context->TEX0.TW); const int th = (int)(1 << m_context->TEX0.TH); - GSVector4 sRect; - sRect.x = m_vt.m_min.t.x / tw; - sRect.y = m_vt.m_min.t.y / th; - sRect.z = m_vt.m_max.t.x / tw; - sRect.w = m_vt.m_max.t.y / th; // Compute the Bottom of texture rectangle ASSERT(m_context->TEX0.TBP0 > m_context->FRAME.Block()); @@ -4362,13 +4360,13 @@ bool GSRendererHW::OI_BlitFMV(GSTextureCache::Target* _rt, GSTextureCache::Sourc r_texture.y -= offset; r_texture.w -= offset; - const GSVector4 dRect(r_texture); - - // Do the blit. With a Copy mess to avoid issue with limited API (dx) - // m_dev->StretchRect(tex->m_texture, sRect, tex->m_texture, dRect); - const GSVector4i r_full(0, 0, tw, th); if (GSTexture* rt = g_gs_device->CreateRenderTarget(tw, th, GSTexture::Format::Color)) { + // sRect is the top of texture + const GSVector4 sRect(m_vt.m_min.t.x / tw, m_vt.m_min.t.y / th, m_vt.m_max.t.x / tw, m_vt.m_max.t.y / th); + const GSVector4 dRect(r_texture); + const GSVector4i r_full(0, 0, tw, th); + g_gs_device->CopyRect(tex->m_texture, rt, r_full, 0, 0); g_gs_device->StretchRect(tex->m_texture, sRect, rt, dRect); @@ -4402,11 +4400,10 @@ bool GSRendererHW::OI_BigMuthaTruckers(GSTexture* rt, GSTexture* ds, GSTextureCa // vertical resolution is half so only half is processed at once // We, however, don't have this limitation so we'll replace the draw with a full-screen TS. - const GIFRegTEX0 Texture = m_context->TEX0; + const GIFRegTEX0& Texture = m_context->TEX0; - GIFRegTEX0 Frame; + GIFRegTEX0 Frame = {}; Frame.TBW = m_context->FRAME.FBW; - Frame.TBP0 = m_context->FRAME.FBP; Frame.TBP0 = m_context->FRAME.Block(); if (PRIM->TME && Frame.TBW == 10 && Texture.TBW == 10 && Frame.TBP0 == 0x00a00 && Texture.PSM == PSM_PSMT8H && (m_r.y == 256 || m_r.y == 224)) @@ -4444,7 +4441,7 @@ bool GSRendererHW::OI_DBZBTGames(GSTexture* rt, GSTexture* ds, GSTextureCache::S bool GSRendererHW::OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t) { - static u32* video = NULL; + static u32* video = nullptr; static size_t lines = 0; if (lines == 0) @@ -4465,15 +4462,14 @@ bool GSRendererHW::OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source if (!video) video = new u32[512 * 512]; + const GSVertex* RESTRICT v = m_vertex.buff; const int ox = m_context->XYOFFSET.OFX - 8; const int oy = m_context->XYOFFSET.OFY - 8; - const GSVertex* RESTRICT v = m_vertex.buff; - for (int i = (int)m_vertex.next; i > 0; i--, v++) { - int x = (v->XYZ.X - ox) >> 4; - int y = (v->XYZ.Y - oy) >> 4; + const int x = (v->XYZ.X - ox) >> 4; + const int y = (v->XYZ.Y - oy) >> 4; if (x < 0 || x >= 448 || y < 0 || y >= (int)lines) return false; // le sigh @@ -4497,7 +4493,7 @@ bool GSRendererHW::OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source g_gs_device->Recycle(t->m_texture); - t->m_texture = g_gs_device->CreateTexture(512, 512, false, GSTexture::Format::Color); + t->m_texture = g_gs_device->CreateTexture(512, 512, 1, GSTexture::Format::Color); t->m_texture->Update(GSVector4i(0, 0, 448, lines), video, 448 * 4); @@ -4536,8 +4532,6 @@ bool GSRendererHW::OI_FFX(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* { // random battle transition (z buffer written directly, clear it now) GL_INS("OI_FFX ZB clear"); - if (ds) - ds->Commit(); // Don't bother to save few MB for a single game g_gs_device->ClearDepth(ds); } @@ -4550,7 +4544,7 @@ bool GSRendererHW::OI_MetalSlug6(GSTexture* rt, GSTexture* ds, GSTextureCache::S GSVertex* RESTRICT v = m_vertex.buff; - for (int i = (int)m_vertex.next; i > 0; i--, v++) + for (size_t i = m_vertex.next; i > 0; i--, v++) { const u32 c = v->RGBAQ.U32[0]; @@ -4580,7 +4574,7 @@ bool GSRendererHW::OI_RozenMaidenGebetGarden(GSTexture* rt, GSTexture* ds, GSTex { // frame buffer clear, atst = fail, afail = write z only, z buffer points to frame buffer - GIFRegTEX0 TEX0; + GIFRegTEX0 TEX0 = {}; TEX0.TBP0 = ZBP; TEX0.TBW = m_context->FRAME.FBW; @@ -4589,7 +4583,6 @@ bool GSRendererHW::OI_RozenMaidenGebetGarden(GSTexture* rt, GSTexture* ds, GSTex if (GSTextureCache::Target* tmp_rt = m_tc->LookupTarget(TEX0, GetTargetSize(), GSTextureCache::RenderTarget, true)) { GL_INS("OI_RozenMaidenGebetGarden FB clear"); - tmp_rt->m_texture->Commit(); // Don't bother to save few MB for a single game g_gs_device->ClearRenderTarget(tmp_rt->m_texture, 0); } @@ -4599,7 +4592,7 @@ bool GSRendererHW::OI_RozenMaidenGebetGarden(GSTexture* rt, GSTexture* ds, GSTex { // z buffer clear, frame buffer now points to the z buffer (how can they be so clever?) - GIFRegTEX0 TEX0; + GIFRegTEX0 TEX0 = {}; TEX0.TBP0 = FBP; TEX0.TBW = m_context->FRAME.FBW; @@ -4608,7 +4601,6 @@ bool GSRendererHW::OI_RozenMaidenGebetGarden(GSTexture* rt, GSTexture* ds, GSTex if (GSTextureCache::Target* tmp_ds = m_tc->LookupTarget(TEX0, GetTargetSize(), GSTextureCache::DepthStencil, true)) { GL_INS("OI_RozenMaidenGebetGarden ZB clear"); - tmp_ds->m_texture->Commit(); // Don't bother to save few MB for a single game g_gs_device->ClearDepth(tmp_ds->m_texture); } @@ -4627,28 +4619,30 @@ bool GSRendererHW::OI_SonicUnleashed(GSTexture* rt, GSTexture* ds, GSTextureCach // save result in alpha with a TS, // Restore RG channel that we previously copied to render shadows. - const GIFRegTEX0 Texture = m_context->TEX0; + const GIFRegTEX0& Texture = m_context->TEX0; - GIFRegTEX0 Frame; + GIFRegTEX0 Frame = {}; Frame.TBW = m_context->FRAME.FBW; - Frame.TBP0 = m_context->FRAME.FBP; Frame.TBP0 = m_context->FRAME.Block(); Frame.PSM = m_context->FRAME.PSM; - if ((!PRIM->TME) || (GSLocalMemory::m_psm[Texture.PSM].bpp != 16) || (GSLocalMemory::m_psm[Frame.PSM].bpp != 16)) - return true; - - if ((Texture.TBP0 == Frame.TBP0) || (Frame.TBW != 16 && Texture.TBW != 16)) + if ((!PRIM->TME) + || (GSLocalMemory::m_psm[Texture.PSM].bpp != 16) + || (GSLocalMemory::m_psm[Frame.PSM].bpp != 16) + || (Texture.TBP0 == Frame.TBP0) + || (Frame.TBW != 16 && Texture.TBW != 16)) return true; GL_INS("OI_SonicUnleashed replace draw by a copy"); - GSTextureCache::Target* src = m_tc->LookupTarget(Texture, GetTargetSize(), GSTextureCache::RenderTarget, true); + GSTextureCache::Target* src = m_tc->LookupTarget(Texture, GSVector2i(1, 1), GSTextureCache::RenderTarget, true); - const GSVector2i size = rt->GetSize(); + const GSVector2i rt_size(rt->GetSize()); + const GSVector2i src_size(src->m_texture->GetSize()); + const GSVector2i copy_size(std::min(rt_size.x, src_size.x), std::min(rt_size.y, src_size.y)); - const GSVector4 sRect(0, 0, 1, 1); - const GSVector4 dRect(0, 0, size.x, size.y); + const GSVector4 sRect(0.0f, 0.0f, static_cast(copy_size.x) / static_cast(src_size.x), static_cast(copy_size.y) / static_cast(src_size.y)); + const GSVector4 dRect(0, 0, copy_size.x, copy_size.y); g_gs_device->StretchRect(src->m_texture, sRect, rt, dRect, true, true, true, false); @@ -4726,8 +4720,6 @@ bool GSRendererHW::OI_SuperManReturns(GSTexture* rt, GSTexture* ds, GSTextureCac ASSERT((v->RGBAQ.A << 24 | v->RGBAQ.B << 16 | v->RGBAQ.G << 8 | v->RGBAQ.R) == (int)v->XYZ.Z); // Do a direct write - if (rt) - rt->Commit(); // Don't bother to save few MB for a single game g_gs_device->ClearRenderTarget(rt, GSVector4(m_vt.m_min.c)); m_tc->InvalidateVideoMemType(GSTextureCache::DepthStencil, ctx->FRAME.Block()); @@ -4764,8 +4756,6 @@ bool GSRendererHW::OI_ArTonelico2(GSTexture* rt, GSTexture* ds, GSTextureCache:: if (m_vertex.next == 2 && !PRIM->TME && m_context->FRAME.FBW == 10 && v->XYZ.Z == 0 && m_context->TEST.ZTST == ZTST_ALWAYS) { GL_INS("OI_ArTonelico2"); - if (ds) - ds->Commit(); // Don't bother to save few MB for a single game g_gs_device->ClearDepth(ds); } diff --git a/pcsx2/GS/Renderers/HW/GSRendererHW.h b/pcsx2/GS/Renderers/HW/GSRendererHW.h index 77644777cf..941d43a3bb 100644 --- a/pcsx2/GS/Renderers/HW/GSRendererHW.h +++ b/pcsx2/GS/Renderers/HW/GSRendererHW.h @@ -20,18 +20,19 @@ #include "GS/Renderers/Common/GSRenderer.h" #include "GS/Renderers/SW/GSTextureCacheSW.h" #include "GS/GSState.h" +#include "GS/MultiISA.h" -class GSRasterizer; +class GSRendererHW; +MULTI_ISA_DEF(class GSRendererHWFunctions;) +MULTI_ISA_DEF(void GSRendererHWPopulateFunctions(GSRendererHW& renderer);) class GSRendererHW : public GSRenderer { + MULTI_ISA_FRIEND(GSRendererHWFunctions); public: static constexpr int MAX_FRAMEBUFFER_HEIGHT = 1280; private: - int m_width; - int m_height; - static constexpr float SSR_UV_TOLERANCE = 1.0f; #pragma region hacks @@ -42,8 +43,8 @@ private: // Require special argument bool OI_BlitFMV(GSTextureCache::Target* _rt, GSTextureCache::Source* t, const GSVector4i& r_draw); - void OI_GsMemClear(); // always on - void OI_DoubleHalfClear(GSTexture* rt, GSTexture* ds); // always on + bool OI_GsMemClear(); // always on + void OI_DoubleHalfClear(GSTextureCache::Target*& rt, GSTextureCache::Target*& ds); // always on bool OI_BigMuthaTruckers(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); bool OI_DBZBTGames(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); @@ -108,16 +109,13 @@ private: std::list> m_oi_list; std::list> m_oo_list; - std::list> m_cu_list; FunctionMap m_oi_map; FunctionMap m_oo_map; - FunctionMap m_cu_map; public: OI_Ptr m_oi; OO_Ptr m_oo; - CU_Ptr m_cu; Hacks(); @@ -133,8 +131,10 @@ private: void SwSpriteRender(); bool CanUseSwSpriteRender(); + bool PossibleCLUTDraw(); + bool PossibleCLUTDrawAggressive(); bool CanUseSwPrimRender(bool no_rt, bool no_ds, bool draw_sprite_tex); - bool SwPrimRender(); + bool (*SwPrimRender)(GSRendererHW&); template void RoundSpriteOffset(); @@ -157,6 +157,7 @@ private: GSTextureCache::Source* m_src; bool m_reset; + bool m_tex_is_fb; bool m_channel_shuffle; bool m_userhacks_tcoffset; float m_userhacks_tcoffset_x; @@ -169,7 +170,7 @@ private: // software sprite renderer state std::vector m_sw_vertex_buffer; std::unique_ptr m_sw_texture; - std::unique_ptr m_sw_rasterizer; + std::unique_ptr> m_sw_rasterizer; public: GSRendererHW(); @@ -182,17 +183,18 @@ public: void SetGameCRC(u32 crc, int options) override; bool CanUpscale() override; - int GetUpscaleMultiplier() override; - void SetScaling(); + float GetUpscaleMultiplier() override; void Lines2Sprites(); + bool VerifyIndices(); + template void ExpandIndices(); void EmulateAtst(GSVector4& FogColor_AREF, u8& atst, const bool pass_2); void ConvertSpriteTextureShuffle(bool& write_ba, bool& read_ba); GSVector4 RealignTargetTextureCoordinate(const GSTextureCache::Source* tex); GSVector4i ComputeBoundingBox(const GSVector2& rtscale, const GSVector2i& rtsize); void MergeSprite(GSTextureCache::Source* tex); - GSVector2 GetTextureScaleFactor(const bool force_upscaling); GSVector2 GetTextureScaleFactor() override; - GSVector2i GetTargetSize(); + GSVector2i GetOutputSize(int real_h); + GSVector2i GetTargetSize(GSVector2i* unscaled_size = nullptr); void Reset(bool hardware_reset) override; void UpdateSettings(const Pcsx2Config::GSOptions& old_config) override; @@ -200,7 +202,8 @@ public: GSTexture* GetOutput(int i, int& y_offset) override; GSTexture* GetFeedbackOutput() override; - void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) override; + void ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) override; + void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite = false) override; void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut = false) override; void Move() override; void Draw() override; @@ -208,8 +211,8 @@ public: void PurgeTextureCache() override; // Called by the texture cache to know if current texture is useful - bool IsDummyTexture() const; + bool UpdateTexIsFB(GSTextureCache::Target* src, const GIFRegTEX0& TEX0); // Called by the texture cache when optimizing the copy range for sources - bool IsPossibleTextureShuffle(GSTextureCache::Source* src) const; + bool IsPossibleTextureShuffle(GSTextureCache::Target* dst, const GIFRegTEX0& TEX0) const; }; diff --git a/pcsx2/GS/Renderers/HW/GSRendererHWMultiISA.cpp b/pcsx2/GS/Renderers/HW/GSRendererHWMultiISA.cpp new file mode 100644 index 0000000000..c65a51c8cd --- /dev/null +++ b/pcsx2/GS/Renderers/HW/GSRendererHWMultiISA.cpp @@ -0,0 +1,461 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "GSRendererHW.h" + +#include "GS/Renderers/SW/GSTextureCacheSW.h" +#include "GS/Renderers/SW/GSDrawScanline.h" + +class CURRENT_ISA::GSRendererHWFunctions +{ +public: + static bool SwPrimRender(GSRendererHW& hw); + + static void Populate(GSRendererHW& renderer) + { + renderer.SwPrimRender = SwPrimRender; + } +}; + +MULTI_ISA_UNSHARED_IMPL; + +void CURRENT_ISA::GSRendererHWPopulateFunctions(GSRendererHW& renderer) +{ + GSRendererHWFunctions::Populate(renderer); +} + +bool GSRendererHWFunctions::SwPrimRender(GSRendererHW& hw) +{ + GSVertexTrace& vt = hw.m_vt; + const GIFRegPRIM* PRIM = hw.PRIM; + const GSDrawingContext* context = hw.m_context; + const GSDrawingEnvironment& env = hw.m_env; + const GS_PRIM_CLASS primclass = vt.m_primclass; + + GSDrawScanline::SharedData data; + GSScanlineGlobalData& gd = data.global; + + u32 clut_storage[256]; + GSVector4i dimx_storage[8]; + + hw.m_sw_vertex_buffer.resize(((hw.m_vertex.next + 1) & ~1)); + + data.primclass = vt.m_primclass; + data.buff = nullptr; + data.vertex = hw.m_sw_vertex_buffer.data(); + data.vertex_count = hw.m_vertex.next; + data.index = hw.m_index.buff; + data.index_count = hw.m_index.tail; + data.scanmsk_value = hw.m_env.SCANMSK.MSK; + + // Skip per pixel division if q is constant. + // Optimize the division by 1 with a nop. It also means that GS_SPRITE_CLASS must be processed when !vt.m_eq.q. + // If you have both GS_SPRITE_CLASS && vt.m_eq.q, it will depends on the first part of the 'OR'. + const u32 q_div = ((vt.m_eq.q && vt.m_min.t.z != 1.0f) || (!vt.m_eq.q && vt.m_primclass == GS_SPRITE_CLASS)); + GSVertexSW::s_cvb[vt.m_primclass][PRIM->TME][PRIM->FST][q_div](context, data.vertex, hw.m_vertex.buff, hw.m_vertex.next); + + GSVector4i scissor = GSVector4i(context->scissor.in); + GSVector4i bbox = GSVector4i(vt.m_min.p.floor().xyxy(vt.m_max.p.ceil())); + + // Points and lines may have zero area bbox (single line: 0, 0 - 256, 0) + + if (vt.m_primclass == GS_POINT_CLASS || vt.m_primclass == GS_LINE_CLASS) + { + if (bbox.x == bbox.z) + bbox.z++; + if (bbox.y == bbox.w) + bbox.w++; + } + + data.scissor = scissor; + data.bbox = bbox; + data.frame = g_perfmon.GetFrame(); + + gd.vm = hw.m_mem.m_vm8; + + gd.fbo = context->offset.fb; + gd.zbo = context->offset.zb; + gd.fzbr = context->offset.fzb4->row; + gd.fzbc = context->offset.fzb4->col; + + gd.sel.key = 0; + + gd.sel.fpsm = 3; + gd.sel.zpsm = 3; + gd.sel.atst = ATST_ALWAYS; + gd.sel.tfx = TFX_NONE; + gd.sel.ababcd = 0xff; + gd.sel.prim = primclass; + + u32 fm = context->FRAME.FBMSK; + u32 zm = context->ZBUF.ZMSK || context->TEST.ZTE == 0 ? 0xffffffff : 0; + const u32 fm_mask = GSLocalMemory::m_psm[context->FRAME.PSM].fmsk; + + // When the format is 24bit (Z or C), DATE ceases to function. + // It was believed that in 24bit mode all pixels pass because alpha doesn't exist + // however after testing this on a PS2 it turns out nothing passes, it ignores the draw. + if ((context->FRAME.PSM & 0xF) == PSM_PSMCT24 && context->TEST.DATE) + { + //DevCon.Warning("DATE on a 24bit format, Frame PSM %x", context->FRAME.PSM); + return false; + } + + if (context->TEST.ZTE && context->TEST.ZTST == ZTST_NEVER) + { + fm = 0xffffffff; + zm = 0xffffffff; + } + + if (PRIM->TME) + { + if (GSLocalMemory::m_psm[context->TEX0.PSM].pal > 0) + { + hw.m_mem.m_clut.Read32(context->TEX0, env.TEXA); + } + } + + if (context->TEST.ATE) + { + if (!hw.TryAlphaTest(fm, fm_mask, zm)) + { + gd.sel.atst = context->TEST.ATST; + gd.sel.afail = context->TEST.AFAIL; + + gd.aref = GSVector4i((int)context->TEST.AREF); + + switch (gd.sel.atst) + { + case ATST_LESS: + gd.sel.atst = ATST_LEQUAL; + gd.aref -= GSVector4i::x00000001(); + break; + case ATST_GREATER: + gd.sel.atst = ATST_GEQUAL; + gd.aref += GSVector4i::x00000001(); + break; + } + } + } + + const bool fwrite = (fm & fm_mask) != fm_mask; + const bool ftest = gd.sel.atst != ATST_ALWAYS || context->TEST.DATE && context->FRAME.PSM != PSM_PSMCT24; + + const bool zwrite = zm != 0xffffffff; + const bool ztest = context->TEST.ZTE && context->TEST.ZTST > ZTST_ALWAYS; + if (!fwrite && !zwrite) + return false; + + gd.sel.fwrite = fwrite; + gd.sel.ftest = ftest; + + if (fwrite || ftest) + { + gd.sel.fpsm = GSLocalMemory::m_psm[context->FRAME.PSM].fmt; + + if ((primclass == GS_LINE_CLASS || primclass == GS_TRIANGLE_CLASS) && vt.m_eq.rgba != 0xffff) + { + gd.sel.iip = PRIM->IIP; + } + + if (PRIM->TME) + { + gd.sel.tfx = context->TEX0.TFX; + gd.sel.tcc = context->TEX0.TCC; + gd.sel.fst = PRIM->FST; + gd.sel.ltf = vt.IsLinear(); + + if (GSLocalMemory::m_psm[context->TEX0.PSM].pal > 0) + { + gd.sel.tlu = 1; + + gd.clut = clut_storage; // FIXME: might address uninitialized data of the texture (0xCD) that is not in 0-15 range for 4-bpp formats + + memcpy(gd.clut, (const u32*)hw.m_mem.m_clut, sizeof(u32) * GSLocalMemory::m_psm[context->TEX0.PSM].pal); + } + + gd.sel.wms = context->CLAMP.WMS; + gd.sel.wmt = context->CLAMP.WMT; + + if (gd.sel.tfx == TFX_MODULATE && gd.sel.tcc && vt.m_eq.rgba == 0xffff && vt.m_min.c.eq(GSVector4i(128))) + { + // modulate does not do anything when vertex color is 0x80 + + gd.sel.tfx = TFX_DECAL; + } + + GIFRegTEX0 TEX0 = context->GetSizeFixedTEX0(vt.m_min.t.xyxy(vt.m_max.t), vt.IsLinear(), false); + + const GSVector4i r = hw.GetTextureMinMax(TEX0, context->CLAMP, gd.sel.ltf).coverage; + + if (!hw.m_sw_texture) + hw.m_sw_texture = std::make_unique(0, TEX0, env.TEXA); + else + hw.m_sw_texture->Reset(0, TEX0, env.TEXA); + + hw.m_sw_texture->Update(r); + gd.tex[0] = hw.m_sw_texture->m_buff; + + gd.sel.tw = hw.m_sw_texture->m_tw - 3; + + { + // skip per pixel division if q is constant. Sprite uses flat + // q, so it's always constant by primitive. + // Note: the 'q' division was done in GSRendererSW::ConvertVertexBuffer + gd.sel.fst |= (vt.m_eq.q || primclass == GS_SPRITE_CLASS); + + if (gd.sel.ltf && gd.sel.fst) + { + // if q is constant we can do the half pel shift for bilinear sampling on the vertices + + // TODO: but not when mipmapping is used!!! + + const GSVector4 half(0x8000, 0x8000); + + GSVertexSW* RESTRICT v = data.vertex; + + for (int i = 0, j = data.vertex_count; i < j; i++) + { + const GSVector4 t = v[i].t; + + v[i].t = (t - half).xyzw(t); + } + } + } + + u16 tw = 1u << TEX0.TW; + u16 th = 1u << TEX0.TH; + + if (tw > 1024) + tw = 1; + + if (th > 1024) + th = 1; + + switch (context->CLAMP.WMS) + { + case CLAMP_REPEAT: + gd.t.min.U16[0] = gd.t.minmax.U16[0] = tw - 1; + gd.t.max.U16[0] = gd.t.minmax.U16[2] = 0; + gd.t.mask.U32[0] = 0xffffffff; + break; + case CLAMP_CLAMP: + gd.t.min.U16[0] = gd.t.minmax.U16[0] = 0; + gd.t.max.U16[0] = gd.t.minmax.U16[2] = tw - 1; + gd.t.mask.U32[0] = 0; + break; + case CLAMP_REGION_CLAMP: + // REGION_CLAMP ignores the actual texture size + gd.t.min.U16[0] = gd.t.minmax.U16[0] = context->CLAMP.MINU; + gd.t.max.U16[0] = gd.t.minmax.U16[2] = context->CLAMP.MAXU; + gd.t.mask.U32[0] = 0; + break; + case CLAMP_REGION_REPEAT: + // MINU is restricted to MINU or texture size, whichever is smaller, MAXU is an offset in the texture. + gd.t.min.U16[0] = gd.t.minmax.U16[0] = context->CLAMP.MINU & (tw - 1); + gd.t.max.U16[0] = gd.t.minmax.U16[2] = context->CLAMP.MAXU; + gd.t.mask.U32[0] = 0xffffffff; + break; + default: + __assume(0); + } + + switch (context->CLAMP.WMT) + { + case CLAMP_REPEAT: + gd.t.min.U16[4] = gd.t.minmax.U16[1] = th - 1; + gd.t.max.U16[4] = gd.t.minmax.U16[3] = 0; + gd.t.mask.U32[2] = 0xffffffff; + break; + case CLAMP_CLAMP: + gd.t.min.U16[4] = gd.t.minmax.U16[1] = 0; + gd.t.max.U16[4] = gd.t.minmax.U16[3] = th - 1; + gd.t.mask.U32[2] = 0; + break; + case CLAMP_REGION_CLAMP: + // REGION_CLAMP ignores the actual texture size + gd.t.min.U16[4] = gd.t.minmax.U16[1] = context->CLAMP.MINV; + gd.t.max.U16[4] = gd.t.minmax.U16[3] = context->CLAMP.MAXV; // ffx anima summon scene, when the anchor appears (th = 256, maxv > 256) + gd.t.mask.U32[2] = 0; + break; + case CLAMP_REGION_REPEAT: + // MINV is restricted to MINV or texture size, whichever is smaller, MAXV is an offset in the texture. + gd.t.min.U16[4] = gd.t.minmax.U16[1] = context->CLAMP.MINV & (th - 1); // skygunner main menu water texture 64x64, MINV = 127 + gd.t.max.U16[4] = gd.t.minmax.U16[3] = context->CLAMP.MAXV; + gd.t.mask.U32[2] = 0xffffffff; + break; + default: + __assume(0); + } + + gd.t.min = gd.t.min.xxxxlh(); + gd.t.max = gd.t.max.xxxxlh(); + gd.t.mask = gd.t.mask.xxzz(); + gd.t.invmask = ~gd.t.mask; + } + + if (PRIM->FGE) + { + gd.sel.fge = 1; + + gd.frb = env.FOGCOL.U32[0] & 0x00ff00ff; + gd.fga = (env.FOGCOL.U32[0] >> 8) & 0x00ff00ff; + } + + if (context->FRAME.PSM != PSM_PSMCT24) + { + gd.sel.date = context->TEST.DATE; + gd.sel.datm = context->TEST.DATM; + } + + if (!hw.IsOpaque()) + { + gd.sel.abe = PRIM->ABE; + gd.sel.ababcd = context->ALPHA.U32[0]; + + if (env.PABE.PABE) + { + gd.sel.pabe = 1; + } + + if (PRIM->AA1 && (primclass == GS_LINE_CLASS || primclass == GS_TRIANGLE_CLASS)) + { + gd.sel.aa1 = 1; + } + + gd.afix = GSVector4i((int)context->ALPHA.FIX << 7).xxzzlh(); + } + + const u32 masked_fm = fm & fm_mask; + if (gd.sel.date + || gd.sel.aba == 1 || gd.sel.abb == 1 || gd.sel.abc == 1 || gd.sel.abd == 1 + || gd.sel.atst != ATST_ALWAYS && gd.sel.afail == AFAIL_RGB_ONLY + || gd.sel.fpsm == 0 && masked_fm != 0 && masked_fm != fm_mask + || gd.sel.fpsm == 1 && masked_fm != 0 && masked_fm != fm_mask + || gd.sel.fpsm == 2 && masked_fm != 0 && masked_fm != fm_mask) + { + gd.sel.rfb = 1; + } + + gd.sel.colclamp = env.COLCLAMP.CLAMP; + gd.sel.fba = context->FBA.FBA; + + if (env.DTHE.DTHE) + { + gd.sel.dthe = 1; + + gd.dimx = dimx_storage; + + memcpy(gd.dimx, env.dimx, sizeof(env.dimx)); + } + } + + gd.sel.zwrite = zwrite; + gd.sel.ztest = ztest; + + if (zwrite || ztest) + { + const u32 z_max = 0xffffffff >> (GSLocalMemory::m_psm[context->ZBUF.PSM].fmt * 8); + + gd.sel.zpsm = GSLocalMemory::m_psm[context->ZBUF.PSM].fmt; + gd.sel.ztst = ztest ? context->TEST.ZTST : (int)ZTST_ALWAYS; + gd.sel.zequal = !!vt.m_eq.z; + gd.sel.zoverflow = (u32)GSVector4i(vt.m_max.p).z == 0x80000000U; + gd.sel.zclamp = (u32)GSVector4i(vt.m_max.p).z > z_max; + } + +#if _M_SSE >= 0x501 + + gd.fm = fm; + gd.zm = zm; + + if (gd.sel.fpsm == 1) + { + gd.fm |= 0xff000000; + } + else if (gd.sel.fpsm == 2) + { + u32 rb = gd.fm & 0x00f800f8; + u32 ga = gd.fm & 0x8000f800; + + gd.fm = (ga >> 16) | (rb >> 9) | (ga >> 6) | (rb >> 3) | 0xffff0000; + } + + if (gd.sel.zpsm == 1) + { + gd.zm |= 0xff000000; + } + else if (gd.sel.zpsm == 2) + { + gd.zm |= 0xffff0000; + } + +#else + + gd.fm = GSVector4i(fm); + gd.zm = GSVector4i(zm); + + if (gd.sel.fpsm == 1) + { + gd.fm |= GSVector4i::xff000000(); + } + else if (gd.sel.fpsm == 2) + { + GSVector4i rb = gd.fm & 0x00f800f8; + GSVector4i ga = gd.fm & 0x8000f800; + + gd.fm = (ga >> 16) | (rb >> 9) | (ga >> 6) | (rb >> 3) | GSVector4i::xffff0000(); + } + + if (gd.sel.zpsm == 1) + { + gd.zm |= GSVector4i::xff000000(); + } + else if (gd.sel.zpsm == 2) + { + gd.zm |= GSVector4i::xffff0000(); + } + +#endif + + if (gd.sel.prim == GS_SPRITE_CLASS && !gd.sel.ftest && !gd.sel.ztest && data.bbox.eq(data.bbox.rintersect(data.scissor))) // TODO: check scissor horizontally only + { + gd.sel.notest = 1; + + const u32 ofx = context->XYOFFSET.OFX; + + for (int i = 0, j = hw.m_vertex.tail; i < j; i++) + { +#if _M_SSE >= 0x501 + if ((((hw.m_vertex.buff[i].XYZ.X - ofx) + 15) >> 4) & 7) // aligned to 8 +#else + if ((((hw.m_vertex.buff[i].XYZ.X - ofx) + 15) >> 4) & 3) // aligned to 4 +#endif + { + gd.sel.notest = 0; + + break; + } + } + } + + + if (!hw.m_sw_rasterizer) + hw.m_sw_rasterizer = std::make_unique(new GSDrawScanline(), 0, 1); + + static_cast(hw.m_sw_rasterizer.get())->Draw(&data); + + hw.m_tc->InvalidateVideoMem(context->offset.fb, bbox); + return true; +} diff --git a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp index 0bc57599f4..15fb072042 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp +++ b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp @@ -20,15 +20,10 @@ #include "GS/GSGL.h" #include "GS/GSIntrin.h" #include "GS/GSUtil.h" +#include "GS/GSXXH.h" #include "common/Align.h" #include "common/HashCombine.h" -//#define DISABLE_HW_TEXTURE_CACHE 1 - -#define XXH_STATIC_LINKING_ONLY 1 -#define XXH_INLINE_ALL 1 -#include "xxhash.h" - u8* GSTextureCache::m_temp; GSTextureCache::GSTextureCache() @@ -83,6 +78,39 @@ void GSTextureCache::RemoveAll() m_hash_cache_memory_usage = 0; m_palette_map.Clear(); + m_target_heights.clear(); +} + +void GSTextureCache::AddDirtyRectTarget(Target* target, GSVector4i rect, u32 psm, u32 bw) +{ + bool skipdirty = false; + bool canskip = true; + std::vector::iterator it = target->m_dirty.begin(); + while (it != target->m_dirty.end()) + { + if (it[0].bw == bw && it[0].psm == psm) + { + if (it[0].r.rintersect(rect).eq(rect) && canskip) + { + skipdirty = true; + break; + } + + // Edges lined up so just expand the dirty rect + if (it[0].r.xzxz().eq(rect.xzxz()) || + it[0].r.ywyw().eq(rect.ywyw())) + { + rect = rect.runion(it[0].r); + it = target->m_dirty.erase(it); + canskip = false; + continue; + } + } + ++it; + } + + if (!skipdirty) + target->m_dirty.push_back(GSDirtyRect(rect, psm, bw)); } GSTextureCache::Source* GSTextureCache::LookupDepthSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r, bool palette) @@ -200,16 +228,13 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con const GSLocalMemory::psm_t& psm_s = GSLocalMemory::m_psm[TEX0.PSM]; //const GSLocalMemory::psm_t& cpsm = psm.pal > 0 ? GSLocalMemory::m_psm[TEX0.CPSM] : psm; - // Until DX is fixed - if (psm_s.pal > 0) - g_gs_renderer->m_mem.m_clut.Read32(TEX0, TEXA); - const u32* clut = g_gs_renderer->m_mem.m_clut; Source* src = NULL; auto& m = m_src.m_map[TEX0.TBP0 >> 5]; + const GSVector2i compare_lod(lod ? *lod : GSVector2i(0, 0)); for (auto i = m.begin(); i != m.end(); ++i) { Source* s = *i; @@ -230,6 +255,11 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con // the CPU. We need to check that TEXA is identical if (psm_s.pal == 0 && psm_s.fmt > 0 && s->m_TEXA.U64 != TEXA.U64) continue; + + // Same base mip texture, but we need to check that MXL was the same as well. + // When mipmapping is off, this will be 0,0 vs 0,0. + if (s->m_lod != compare_lod) + continue; } m.MoveFront(i.Index()); @@ -417,10 +447,10 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con return src; } -GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, const GSVector2i& size, int type, bool used, u32 fbmask, const bool is_frame, const int real_h) +GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, const GSVector2i& size, int type, bool used, u32 fbmask, const bool is_frame, const int real_w, const int real_h) { const GSLocalMemory::psm_t& psm_s = GSLocalMemory::m_psm[TEX0.PSM]; - const GSVector2& new_s = g_gs_renderer->GetTextureScaleFactor(); + const GSVector2& new_s = static_cast(g_gs_renderer.get())->GetTextureScaleFactor(); const u32 bp = TEX0.TBP0; GSVector2 res_size{ 0, 0 }; GSVector2i new_size{ 0, 0 }; @@ -443,6 +473,8 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, con Target* dst = nullptr; auto& list = m_dst[type]; + Target* old_found = nullptr; + if (!is_frame) { for (auto i = list.begin(); i != list.end(); ++i) @@ -461,38 +493,63 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, con break; } } - } + } else { assert(type == RenderTarget); // Let's try to find a perfect frame that contains valid data for (auto t : list) { + // Only checks that the texure starts at the requested bp, size isn't considered. if (bp == t->m_TEX0.TBP0 && t->m_end_block >= bp) { + // If the frame is older than 30 frames (0.5 seconds) then it hasn't been updated for ages, so it's probably not a valid output frame. + // The rest of the checks will get better equality, so suffer less from misdetection. + // Kind of arbitrary but it's low enough to not break Grandia Xtreme and high enough not to break Mission Impossible Operation Surma. + if (t->m_age > 30 && !old_found) + { + old_found = t; + continue; + } + dst = t; GL_CACHE("TC: Lookup Frame %dx%d, perfect hit: %d (0x%x -> 0x%x %s)", size.x, size.y, dst->m_texture->GetID(), bp, t->m_end_block, psm_str(TEX0.PSM)); + if (real_h > 0 || real_w > 0) + ScaleTargetForDisplay(dst, TEX0, real_w, real_h); + break; } } - // 2nd try ! Try to find a frame that include the bp + // 2nd try ! Try to find a frame at the requested bp -> bp + size is inside of (or equal to) if (!dst) { + const u32 needed_end = GSLocalMemory::m_psm[TEX0.PSM].info.bn(real_w - 1, real_h - 1, bp, TEX0.TBW); for (auto t : list) { - if (t->m_TEX0.TBP0 < bp && bp <= t->m_end_block) + // Make sure the target is inside the texture + if (t->m_TEX0.TBP0 <= bp && bp <= t->m_end_block && t->Inside(bp, TEX0.TBW, TEX0.PSM, GSVector4i(0, 0, real_w, real_h))) { + // If we already have an old one, make sure the "new" one matches at least on one end (double buffer?). + if (old_found && (t->m_age > 4 || (t->m_TEX0.TBP0 != bp && needed_end != t->m_end_block))) + continue; + dst = t; GL_CACHE("TC: Lookup Frame %dx%d, inclusive hit: %d (0x%x, took 0x%x -> 0x%x %s)", size.x, size.y, t->m_texture->GetID(), bp, t->m_TEX0.TBP0, t->m_end_block, psm_str(TEX0.PSM)); - if (real_h > 0) - ScaleTargetForDisplay(dst, TEX0, real_h); + + if (real_h > 0 || real_w > 0) + ScaleTargetForDisplay(dst, TEX0, real_w, real_h); break; } } } + if (!dst && old_found) + { + dst = old_found; + } + // 3rd try ! Try to find a frame that doesn't contain valid data (honestly I'm not sure we need to do it) if (!dst) { @@ -515,14 +572,14 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, con { GL_CACHE("TC: Lookup %s(%s) %dx%d, hit: %d (0x%x, %s)", is_frame ? "Frame" : "Target", to_string(type), size.x, size.y, dst->m_texture->GetID(), bp, psm_str(TEX0.PSM)); - dst->Update(); + dst->Update(!is_frame || old_found == dst); const GSVector2& old_s = dst->m_texture->GetScale(); if (new_s != old_s) { calcRescale(dst->m_texture); - GSTexture* tex = type == RenderTarget ? g_gs_device->CreateSparseRenderTarget(new_size.x, new_size.y, GSTexture::Format::Color, clear) : - g_gs_device->CreateSparseDepthStencil(new_size.x, new_size.y, GSTexture::Format::DepthStencil, clear); + GSTexture* tex = type == RenderTarget ? g_gs_device->CreateRenderTarget(new_size.x, new_size.y, GSTexture::Format::Color, clear) : + g_gs_device->CreateDepthStencil(new_size.x, new_size.y, GSTexture::Format::DepthStencil, clear); g_gs_device->StretchRect(dst->m_texture, sRect, tex, dRect, (type == RenderTarget) ? ShaderConvert::COPY : ShaderConvert::DEPTH_COPY, false); g_gs_device->Recycle(dst->m_texture); tex->SetScale(new_s); @@ -558,7 +615,7 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, con if (dst_match) { - dst_match->Update(); + dst_match->Update(true); calcRescale(dst_match->m_texture); dst = CreateTarget(TEX0, new_size.x, new_size.y, type, clear); dst->m_32_bits_fmt = dst_match->m_32_bits_fmt; @@ -608,8 +665,9 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, con // h is likely smaller than w (true most of the time). Reduce the upload size (speed) max_h = std::min(max_h, TEX0.TBW * 64); - dst->m_dirty.push_back(GSDirtyRect(GSVector4i(0, 0, TEX0.TBW * 64, is_frame ? real_h : max_h), TEX0.PSM, TEX0.TBW)); - dst->Update(); + const GSVector4i newrect = GSVector4i(0, 0, TEX0.TBW * 64, is_frame ? real_h : max_h); + AddDirtyRectTarget(dst, newrect, TEX0.PSM, TEX0.TBW); + dst->Update(true); } } if (used) @@ -623,12 +681,12 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, con return dst; } -GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, const GSVector2i& size, const int real_h) +GSTextureCache::Target* GSTextureCache::LookupDisplayTarget(const GIFRegTEX0& TEX0, const GSVector2i& size, const int real_w, const int real_h) { - return LookupTarget(TEX0, size, RenderTarget, true, 0, true, real_h); + return LookupTarget(TEX0, size, RenderTarget, true, 0, true, real_w, real_h); } -void GSTextureCache::ScaleTargetForDisplay(Target* t, const GIFRegTEX0& dispfb, int real_h) +void GSTextureCache::ScaleTargetForDisplay(Target* t, const GIFRegTEX0& dispfb, int real_w, int real_h) { // This handles a case where you have two images stacked on top of one another (usually FMVs), and // the size of the top framebuffer is larger than the height of the image. Usually happens when @@ -641,7 +699,7 @@ void GSTextureCache::ScaleTargetForDisplay(Target* t, const GIFRegTEX0& dispfb, // So, for these cases, we simply expand the target to include both images, based on the read height. // It won't affect normal rendering, since that doesn't go through this path. - + // Compute offset into the target that we'll start reading from. const int delta = dispfb.TBP0 - t->m_TEX0.TBP0; int y_offset = 0; @@ -655,12 +713,13 @@ void GSTextureCache::ScaleTargetForDisplay(Target* t, const GIFRegTEX0& dispfb, // Take that into consideration to find the extent of the target which will be sampled. GSTexture* old_texture = t->m_texture; const int needed_height = std::min(real_h + y_offset, GSRendererHW::MAX_FRAMEBUFFER_HEIGHT); - const int scaled_needed_height = static_cast(static_cast(needed_height) * old_texture->GetScale().y); - if (scaled_needed_height <= old_texture->GetHeight()) + const int scaled_needed_height = std::max(static_cast(static_cast(needed_height) * old_texture->GetScale().y), old_texture->GetHeight()); + const int needed_width = std::min(real_w, static_cast(dispfb.TBW * 64)); + const int scaled_needed_width = std::max(static_cast(static_cast(needed_width) * old_texture->GetScale().x), old_texture->GetWidth()); + if (scaled_needed_height <= old_texture->GetHeight() && scaled_needed_width <= old_texture->GetWidth()) return; - // We're expanding, so create a new texture. - GSTexture* new_texture = g_gs_device->CreateRenderTarget(old_texture->GetWidth(), scaled_needed_height, GSTexture::Format::Color, false); + GSTexture* new_texture = g_gs_device->CreateRenderTarget(scaled_needed_width, scaled_needed_height, GSTexture::Format::Color, false); if (!new_texture) { // Memory allocation failure, do our best to hobble along. @@ -677,10 +736,53 @@ void GSTextureCache::ScaleTargetForDisplay(Target* t, const GIFRegTEX0& dispfb, g_gs_device->Recycle(old_texture); t->m_texture = new_texture; + const GSVector4i newrect = GSVector4i(0, 0, t->m_TEX0.TBW * 64, needed_height); // We unconditionally preload the frame here, because otherwise we'll end up with blackness for one frame (when the expand happens). - t->m_dirty.push_back(GSDirtyRect(GSVector4i(0, 0, t->m_TEX0.TBW * 64, needed_height), t->m_TEX0.PSM, t->m_TEX0.TBW)); + AddDirtyRectTarget(t, newrect, t->m_TEX0.PSM, t->m_TEX0.TBW); + + // Inject the new height back into the cache. + GetTargetHeight(t->m_TEX0.TBP0, t->m_TEX0.TBW, t->m_TEX0.PSM, static_cast(needed_height)); } +// Expands targets where the write from the EE overlaps the edge of a render target and uses the same base pointer. +void GSTextureCache::ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) +{ + GIFRegTEX0 TEX0; + TEX0.TBP0 = BITBLTBUF.DBP; + TEX0.TBW = BITBLTBUF.DBW; + TEX0.PSM = BITBLTBUF.DPSM; + Target* dst = nullptr; + auto& list = m_dst[RenderTarget]; + + for (auto i = list.begin(); i != list.end(); ++i) + { + Target* t = *i; + + if (TEX0.TBP0 == t->m_TEX0.TBP0 && t->Overlaps(TEX0.TBP0, TEX0.TBW, TEX0.PSM, r)) + { + list.MoveFront(i.Index()); + + dst = t; + break; + } + } + + if (dst) + { + const GSVector2i rect_scaled = GSVector2i(r.z * g_gs_renderer->GetUpscaleMultiplier(), r.w * g_gs_renderer->GetUpscaleMultiplier()); + const int upsc_width = std::max(rect_scaled.x, dst->m_texture->GetWidth()); + const int upsc_height = std::max(rect_scaled.y, dst->m_texture->GetHeight()); + if (dst->m_texture->GetWidth() < upsc_width || dst->m_texture->GetHeight() < upsc_height) + { + if (dst->ResizeTexture(upsc_width, upsc_height)) + { + AddDirtyRectTarget(dst, r, TEX0.PSM, TEX0.TBW); + GetTargetHeight(TEX0.TBP0, TEX0.TBW, TEX0.PSM, r.w); + dst->UpdateValidity(r); + } + } + } +} // Goal: Depth And Target at the same address is not possible. On GS it is // the same memory but not on the Dx/GL. Therefore a write to the Depth/Target // must invalidate the Target/Depth respectively @@ -689,6 +791,10 @@ void GSTextureCache::InvalidateVideoMemType(int type, u32 bp) if (GSConfig.UserHacks_DisableDepthSupport) return; + // The Getaway games need this function disabled for player shadows to work correctly. + if (g_gs_renderer->m_game.title == CRC::GetawayGames) + return; + auto& list = m_dst[type]; for (auto i = list.begin(); i != list.end(); ++i) { @@ -710,7 +816,7 @@ void GSTextureCache::InvalidateVideoMemType(int type, u32 bp) // Goal: invalidate data sent to the GPU when the source (GS memory) is modified // Called each time you want to write to the GS memory -void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& rect, bool target) +void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& rect, bool eewrite, bool target) { u32 bp = off.bp(); u32 bw = off.bw(); @@ -776,6 +882,7 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r t->m_texture ? t->m_texture->GetID() : 0, t->m_TEX0.TBP0); g_gs_device->ClearRenderTarget(t->m_texture, 0); + t->m_dirty.clear(); } } } @@ -856,7 +963,7 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r auto& list = m_dst[type]; for (auto i = list.begin(); i != list.end();) { - auto j = i++; + auto j = i; Target* t = *j; // GH: (I think) this code is completely broken. Typical issue: @@ -874,16 +981,26 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r t->m_texture ? t->m_texture->GetID() : 0, t->m_TEX0.TBP0, r.x, r.y, r.z, r.w); t->m_TEX0.TBW = bw; - t->m_dirty.push_back(GSDirtyRect(r, psm, bw)); + + if(eewrite) + t->m_age = 0; + + AddDirtyRectTarget(t, r, psm, bw); } else { // YOLO skipping t->m_TEX0.TBW = bw; It would change the surface offset results... - const SurfaceOffset so = ComputeSurfaceOffset(off, r, t); + // This code exists because Destruction Derby Arenas uploads a 16x16 CLUT to the same BP as the depth buffer and invalidating the depth is bad (because it's not invalid). + // Possibly because the block layout is opposite for the 32bit colour and depth, it never actually overwrites the depth, so this is kind of a miss detection. + // The new code rightfully calculates that the depth does not become dirty, but in other cases, like bigger draws of the same format + // it might become invalid, so we check below and erase as before if so. + SurfaceOffset so = ComputeSurfaceOffset(off, r, t); if (so.is_valid) { - // Offset from Target to Write in Target coords. - t->m_dirty.push_back(GSDirtyRect(so.b2a_offset, psm, bw)); + if (eewrite) + t->m_age = 0; + + AddDirtyRectTarget(t, so.b2a_offset, psm, bw); GL_CACHE("TC: Dirty in the middle [aggressive] of Target(%s) %d [PSM:%s BP:0x%x->0x%x BW:%u rect(%d,%d=>%d,%d)] write[PSM:%s BP:0x%x BW:%u rect(%d,%d=>%d,%d)]", to_string(type), t->m_texture ? t->m_texture->GetID() : 0, @@ -904,14 +1021,16 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r r.w ); } - else + if (!ComputeSurfaceOffset(off, r, t).is_valid) { - list.erase(j); + i = list.erase(j); GL_CACHE("TC: Remove Target(%s) %d (0x%x)", to_string(type), t->m_texture ? t->m_texture->GetID() : 0, t->m_TEX0.TBP0); delete t; } + else + ++i; continue; } } @@ -924,6 +1043,8 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r t->m_dirty_alpha = false; } + ++i; + // GH: Try to detect texture write that will overlap with a target buffer // TODO Use ComputeSurfaceOffset below. if (GSUtil::HasSharedBits(psm, t->m_TEX0.PSM)) @@ -950,7 +1071,12 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r t->m_TEX0.TBP0); // TODO: do not add this rect above too t->m_TEX0.TBW = bw; - t->m_dirty.push_back(GSDirtyRect(GSVector4i(r.left, r.top - y, r.right, r.bottom - y), psm, bw)); + + if (eewrite) + t->m_age = 0; + + const GSVector4i dirty_r = GSVector4i(r.left, r.top - y, r.right, r.bottom - y); + AddDirtyRectTarget(t, dirty_r, psm, bw); continue; } } @@ -977,11 +1103,27 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r t->m_TEX0.TBP0, t->m_end_block, r.left, r.top + y, r.right, r.bottom + y, bw); + if (eewrite) + t->m_age = 0; + t->m_TEX0.TBW = bw; - t->m_dirty.push_back(GSDirtyRect(GSVector4i(r.left, r.top + y, r.right, r.bottom + y), psm, bw)); + + const GSVector4i dirty_r = GSVector4i(r.left, r.top + y, r.right, r.bottom + y); + AddDirtyRectTarget(t, dirty_r, psm, bw); continue; } } + else if (GSConfig.UserHacks_TextureInsideRt && t->Overlaps(bp, bw, psm, rect) && GSUtil::HasCompatibleBits(psm, t->m_TEX0.PSM)) + { + SurfaceOffset so = ComputeSurfaceOffset(off, r, t); + if (so.is_valid) + { + if (eewrite) + t->m_age = 0; + + AddDirtyRectTarget(t, so.b2a_offset, psm, bw); + } + } #endif } } @@ -1005,16 +1147,16 @@ void GSTextureCache::InvalidateLocalMem(const GSOffset& off, const GSVector4i& r r.z, r.w); - if (GSConfig.HWDisableReadbacks) - { - Console.Error("Skipping readback of %ux%u @ %u,%u", r.width(), r.height(), r.left, r.top); - return; - } - // No depth handling please. if (psm == PSM_PSMZ32 || psm == PSM_PSMZ24 || psm == PSM_PSMZ16 || psm == PSM_PSMZ16S) { GL_INS("ERROR: InvalidateLocalMem depth format isn't supported (%d,%d to %d,%d)", r.x, r.y, r.z, r.w); + if (GSConfig.HWDownloadMode != GSHardwareDownloadMode::Enabled) + { + DevCon.Error("Skipping depth readback of %ux%u @ %u,%u", r.width(), r.height(), r.left, r.top); + return; + } + if (!GSConfig.UserHacks_DisableDepthSupport) { auto& dss = m_dst[DepthStencil]; @@ -1041,8 +1183,17 @@ void GSTextureCache::InvalidateLocalMem(const GSOffset& off, const GSVector4i& r Target* t = *it; if (t->m_TEX0.PSM != PSM_PSMZ32 && t->m_TEX0.PSM != PSM_PSMZ24 && t->m_TEX0.PSM != PSM_PSMZ16 && t->m_TEX0.PSM != PSM_PSMZ16S) { - if (GSUtil::HasSharedBits(bp, psm, t->m_TEX0.TBP0, t->m_TEX0.PSM)) + // Some games like to offset their GS download memory addresses by + // using overly big source Y position values. + // Checking for targets that overlap with the requested memory region + // instead of just comparing TBPs should fix that. + // For example, this fixes Judgement ring rendering in Shadow Hearts 2. + // Be wary of old targets being misdetected, set a sensible range of 30 frames (like Display source lookups). + if (t->Overlaps(bp, bw, psm, r) && t->m_TEX0.TBP0 >= bp && GSUtil::HasSharedBits(psm, t->m_TEX0.PSM) && t->m_age <= 30) { + // Enforce full invalidation if BP's don't match. + const GSVector4i targetr = (bp == t->m_TEX0.TBP0) ? r : t->m_valid; + // GH Note: Read will do a StretchRect and then will sizzle data to the GS memory // t->m_valid will do the full target texture whereas r.intersect(t->m_valid) will be limited // to the useful part for the transfer. @@ -1064,16 +1215,21 @@ void GSTextureCache::InvalidateLocalMem(const GSOffset& off, const GSVector4i& r if (t->m_32_bits_fmt && t->m_TEX0.PSM > PSM_PSMCT24) t->m_TEX0.PSM = PSM_PSMCT32; - if (GSConfig.UserHacks_DisablePartialInvalidation) + if (GSConfig.HWDownloadMode != GSHardwareDownloadMode::Enabled) { - Read(t, r.rintersect(t->m_valid)); + const GSVector4i rb_rc((!GSConfig.UserHacks_DisablePartialInvalidation && targetr.x == 0 && targetr.y == 0) ? t->m_valid : targetr.rintersect(t->m_valid)); + DevCon.Error("Skipping depth readback of %ux%u @ %u,%u", rb_rc.width(), rb_rc.height(), rb_rc.left, rb_rc.top); + } + else if (GSConfig.UserHacks_DisablePartialInvalidation) + { + Read(t, targetr.rintersect(t->m_valid)); } else { - if (r.x == 0 && r.y == 0) // Full screen read? + if (targetr.x == 0 && targetr.y == 0) // Full screen read? Read(t, t->m_valid); else // Block level read? - Read(t, r.rintersect(t->m_valid)); + Read(t, targetr.rintersect(t->m_valid)); } } } @@ -1155,9 +1311,14 @@ void GSTextureCache::InvalidateLocalMem(const GSOffset& off, const GSVector4i& r bool GSTextureCache::Move(u32 SBP, u32 SBW, u32 SPSM, int sx, int sy, u32 DBP, u32 DBW, u32 DPSM, int dx, int dy, int w, int h) { + if (SBP == DBP && SPSM == DPSM && !GSLocalMemory::m_psm[SPSM].depth && ShuffleMove(SBP, SBW, SPSM, sx, sy, dx, dy, w, h)) + { + return true; + } + // TODO: In theory we could do channel swapping on the GPU, but we haven't found anything which needs it so far. // Same with SBP == DBP, but this behavior could change based on direction? - if (SPSM != DPSM || SBP == DBP) + if (SPSM != DPSM || ((SBP == DBP) && !(GSVector4i(sx, sy, sx + w, sy + h).rintersect(GSVector4i(dx, dy, dx + w, dy + h))).rempty())) { GL_CACHE("Skipping HW move from 0x%X to 0x%X with SPSM=%u DPSM=%u", SBP, DBP, SPSM, DPSM); return false; @@ -1177,11 +1338,6 @@ bool GSTextureCache::Move(u32 SBP, u32 SBW, u32 SPSM, int sx, int sy, u32 DBP, u if (!src || !dst || src->m_texture->GetScale() != dst->m_texture->GetScale()) return false; - // We don't want to copy "old" data that the game has overwritten with writes, - // so flush any overlapping dirty area. - src->UpdateIfDirtyIntersects(GSVector4i(sx, sy, sx + w, sy + h));; - dst->UpdateIfDirtyIntersects(GSVector4i(dx, dy, dx + w, dy + h)); - // Scale coordinates. const GSVector2 scale(src->m_texture->GetScale()); const int scaled_sx = static_cast(sx * scale.x); @@ -1191,19 +1347,175 @@ bool GSTextureCache::Move(u32 SBP, u32 SBW, u32 SPSM, int sx, int sy, u32 DBP, u const int scaled_w = static_cast(w * scale.x); const int scaled_h = static_cast(h * scale.y); - // Make sure the copy doesn't go out of bounds (it shouldn't). - if ((scaled_sx + scaled_w) > src->m_texture->GetWidth() || (scaled_sy + scaled_h) > src->m_texture->GetHeight() || - (scaled_dx + scaled_w) > dst->m_texture->GetWidth() || (scaled_dy + scaled_h) > dst->m_texture->GetHeight()) - { + // The source isn't in our texture, otherwise it could falsely expand the texture causing a misdetection later, which then renders black. + if ((scaled_sx + scaled_w) > src->m_texture->GetWidth() || (scaled_sy + scaled_h) > src->m_texture->GetHeight()) return false; + + // We don't want to copy "old" data that the game has overwritten with writes, + // so flush any overlapping dirty area. + src->UpdateIfDirtyIntersects(GSVector4i(sx, sy, sx + w, sy + h)); + dst->UpdateIfDirtyIntersects(GSVector4i(dx, dy, dx + w, dy + h)); + + // Expand the target when we used a more conservative size. + const int required_dh = scaled_dy + scaled_h; + if ((scaled_dx + scaled_w) <= dst->m_texture->GetWidth() && required_dh > dst->m_texture->GetHeight()) + { + int new_height = dy + h; + if (new_height > GSRendererHW::MAX_FRAMEBUFFER_HEIGHT) + return false; + + // Align height to page size, that way we don't do too many small resizes (Dark Cloud). + new_height = Common::AlignUpPow2(new_height, static_cast(GSLocalMemory::m_psm[DPSM].bs.y)); + + // We don't recycle the old texture here, because the height cache will track the new size, + // so the old size won't get created again. + const int scaled_new_height = static_cast(static_cast(new_height) * scale.y); + GL_INS("Resize %dx%d target to %dx%d for move", dst->m_texture->GetWidth(), dst->m_texture->GetHeight(), dst->m_texture->GetHeight(), scaled_new_height); + GetTargetHeight(DBP, DBW, DPSM, new_height); + + if (!dst->ResizeTexture(dst->m_texture->GetWidth(), scaled_new_height, false)) + { + // Resize failed, probably ran out of VRAM, better luck next time. Fall back to CPU. + // We injected the new height into the cache, so hopefully won't happen again. + return false; + } } + // Make sure the copy doesn't go out of bounds (it shouldn't). + if ((scaled_dx + scaled_w) > dst->m_texture->GetWidth() || (scaled_dy + scaled_h) > dst->m_texture->GetHeight()) + return false; + g_gs_device->CopyRect(src->m_texture, dst->m_texture, GSVector4i(scaled_sx, scaled_sy, scaled_sx + scaled_w, scaled_sy + scaled_h), scaled_dx, scaled_dy); // Invalidate any sources that overlap with the target (since they're now stale). - InvalidateVideoMem(g_gs_renderer->m_mem.GetOffset(DBP, DBW, DPSM), GSVector4i(dx, dy, dx + w, dy + h), false); + InvalidateVideoMem(g_gs_renderer->m_mem.GetOffset(DBP, DBW, DPSM), GSVector4i(dx, dy, dx + w, dy + h),false, false); + return true; +} + +bool GSTextureCache::ShuffleMove(u32 BP, u32 BW, u32 PSM, int sx, int sy, int dx, int dy, int w, int h) +{ + // What are we doing here? Final Fantasy XII uses moves to copy the contents of the RG channels to the BA channels, + // by rendering in PSMCT32, and doing a PSMCT16 move with an 8x0 offset on the destination. This effectively reads + // from the original red/green channels, and writes to the blue/alpha channels. Who knows why they did it this way, + // when they could've used sprites, but it means that they had to offset the block pointer for each move. So, we + // need to use tex-in-rt here to figure out what the offset into the original PSMCT32 texture was, and HLE the move. + if (PSM != PSM_PSMCT16) + return false; + + GL_CACHE("Trying ShuffleMove: BP=%04X BW=%u PSM=%u SX=%d SY=%d DX=%d DY=%d W=%d H=%d", BP, BW, PSM, sx, sy, dx, dy, w, h); + + GSTextureCache::Target* tgt = nullptr; + for (auto t : m_dst[RenderTarget]) + { + if (t->m_TEX0.PSM == PSM_PSMCT32 && BP >= t->m_TEX0.TBP0 && BP <= t->m_end_block) + { + SurfaceOffset so(ComputeSurfaceOffset(BP, BW, PSM, GSVector4i(sx, sy, sx + w, sy + h), t)); + if (so.is_valid) + { + tgt = t; + GL_CACHE("ShuffleMove: Surface offset %d,%d from BP %04X - %04X", so.b2a_offset.x, so.b2a_offset.y, BP, t->m_TEX0.TBP0); + sx += so.b2a_offset.x; + sy += so.b2a_offset.y; + dx += so.b2a_offset.x; + dy += so.b2a_offset.y; + break; + } + } + } + if (!tgt) + { + GL_CACHE("ShuffleMove: No target found"); + return false; + } + + // Since we're only concerned with 32->16 shuffles, the difference should be 8x8 for this to work. + const s32 diff_x = (dx - sx); + if (std::abs(diff_x) != 8 || sy != dy) + { + GL_CACHE("ShuffleMove: Difference is not 8 pixels"); + return false; + } + + const bool read_ba = (diff_x < 0); + const bool write_rg = (diff_x < 0); + + const GSVector4i bbox(write_rg ? GSVector4i(dx, dy, dx + w, dy + h) : GSVector4i(sx, sy, sx + w, sy + h)); + + GSVertex vertices[4] = {}; +#define V(i, x, y, u, v) \ + do \ + { \ + vertices[i].XYZ.X = x; \ + vertices[i].XYZ.Y = y; \ + vertices[i].U = u; \ + vertices[i].V = v; \ + } while (0) + + const GSVector4i bbox_fp(bbox.sll32(4)); + V(0, bbox_fp.x, bbox_fp.y, bbox_fp.x, bbox_fp.y); // top-left + V(1, bbox_fp.z, bbox_fp.y, bbox_fp.z, bbox_fp.y); // top-right + V(2, bbox_fp.x, bbox_fp.w, bbox_fp.x, bbox_fp.w); // bottom-left + V(3, bbox_fp.z, bbox_fp.w, bbox_fp.z, bbox_fp.w); // bottom-right + +#undef V + + static constexpr u32 indices[6] = { 0, 1, 2, 2, 1, 3 }; + + // If we ever do this sort of thing somewhere else, extract this to a helper function. + GSHWDrawConfig config; + config.rt = tgt->m_texture; + config.ds = nullptr; + config.tex = tgt->m_texture; + config.pal = nullptr; + config.indices = indices; + config.verts = vertices; + config.nverts = static_cast(std::size(vertices)); + config.nindices = static_cast(std::size(indices)); + config.indices_per_prim = 3; + config.drawlist = nullptr; + config.scissor = GSVector4i(0, 0, tgt->m_texture->GetWidth(), tgt->m_texture->GetHeight()); + config.drawarea = GSVector4i(GSVector4(bbox) * GSVector4(tgt->m_texture->GetScale()).xxyy()); + config.topology = GSHWDrawConfig::Topology::Triangle; + config.blend = GSHWDrawConfig::BlendState(); + config.depth = GSHWDrawConfig::DepthStencilSelector::NoDepth(); + config.colormask = GSHWDrawConfig::ColorMaskSelector(); + config.colormask.wrgba = (write_rg ? (1 | 2) : (4 | 8)); + config.require_one_barrier = !g_gs_device->Features().framebuffer_fetch; + config.require_full_barrier = false; + config.destination_alpha = GSHWDrawConfig::DestinationAlphaMode::Off; + config.datm = false; + config.line_expand = false; + config.separate_alpha_pass = false; + config.second_separate_alpha_pass = false; + config.alpha_second_pass.enable = false; + config.vs.key = 0; + config.vs.tme = true; + config.vs.iip = true; + config.vs.fst = true; + config.gs.key = 0; + config.ps.key_lo = 0; + config.ps.key_hi = 0; + config.ps.read_ba = read_ba; + config.ps.write_rg = write_rg; + config.ps.shuffle = true; + config.ps.iip = true; + config.ps.fst = true; + config.ps.tex_is_fb = true; + config.ps.tfx = TFX_DECAL; + + const GSVector2i rtsize(tgt->m_texture->GetSize()); + const GSVector2 rtscale(tgt->m_texture->GetScale()); + config.cb_ps.WH = GSVector4(static_cast(rtsize.x) / rtscale.x, static_cast(rtsize.y) / rtscale.y, + static_cast(rtsize.x), static_cast(rtsize.y)); + config.cb_ps.STScale = rtscale; + + config.cb_vs.vertex_scale = GSVector2(2.0f * rtscale.x / (rtsize.x << 4), 2.0f * rtscale.y / (rtsize.y << 4)); + config.cb_vs.vertex_offset = GSVector2(-1.0f / rtsize.x + 1.0f, -1.0f / rtsize.y + 1.0f); + config.cb_vs.texture_scale = GSVector2((1.0f / 16.0f) / config.cb_ps.WH.x, (1.0f / 16.0f) / config.cb_ps.WH.y); + + g_gs_device->RenderHW(config); return true; } @@ -1234,6 +1546,36 @@ GSTextureCache::Target* GSTextureCache::GetTargetWithSharedBits(u32 BP, u32 PSM) return nullptr; } +u32 GSTextureCache::GetTargetHeight(u32 fbp, u32 fbw, u32 psm, u32 min_height) +{ + TargetHeightElem search = {}; + search.fbp = fbp; + search.fbw = fbw; + search.psm = psm; + search.height = min_height; + + for (auto it = m_target_heights.begin(); it != m_target_heights.end(); ++it) + { + TargetHeightElem& elem = const_cast(*it); + if (elem.bits == search.bits) + { + if (elem.height < min_height) + { + DbgCon.WriteLn("Expand height at %x %u %u from %u to %u", fbp, fbw, psm, elem.height, min_height); + elem.height = min_height; + } + + m_target_heights.MoveFront(it.Index()); + elem.age = 0; + return elem.height; + } + } + + DbgCon.WriteLn("New height at %x %u %u: %u", fbp, fbw, psm, min_height); + m_target_heights.push_front(search); + return min_height; +} + // Hack: remove Target that are strictly included in current rt. Typically uses for FMV // For example, game is rendered at 0x800->0x1000, fmv will be uploaded to 0x0->0x2800 // FIXME In theory, we ought to report the data from the sub rt to the main rt. But let's @@ -1297,9 +1639,7 @@ void GSTextureCache::IncAge() HashCacheEntry& e = it->second; if (e.refcount == 0 && ++e.age > max_hash_cache_age) { - if (!e.is_replacement) - m_hash_cache_memory_usage -= e.texture->GetMemUsage(); - + m_hash_cache_memory_usage -= e.texture->GetMemUsage(); g_gs_device->Recycle(e.texture); m_hash_cache.erase(it++); } @@ -1349,6 +1689,20 @@ void GSTextureCache::IncAge() } } } + + for (auto it = m_target_heights.begin(); it != m_target_heights.end();) + { + TargetHeightElem& elem = const_cast(*it); + if (elem.age >= max_rt_age) + { + it = m_target_heights.erase(it); + } + else + { + elem.age++; + ++it; + } + } } //Fixme: Several issues in here. Not handling depth stencil, pitch conversion doesnt work. @@ -1360,6 +1714,14 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con int tw = 1 << TEX0.TW; int th = 1 << TEX0.TH; //int tp = TEX0.TBW << 6; + int tlevels = 1; + if (lod) + { + // lod won't contain the full range when using basic mipmapping, only that + // which is hashed, so we just allocate the full thing. + tlevels = (GSConfig.HWMipmap != HWMipmapLevel::Full) ? -1 : (lod->y - lod->x + 1); + src->m_lod = *lod; + } bool hack = false; @@ -1376,7 +1738,7 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con GSTexture* sTex = dst->m_texture; GSTexture* dTex = outside_target ? g_gs_device->CreateRenderTarget(w, h, GSTexture::Format::Color, true) : - g_gs_device->CreateTexture(w, h, false, GSTexture::Format::Color, true); + g_gs_device->CreateTexture(w, h, tlevels, GSTexture::Format::Color, true); // copy the rt in const GSVector4i area(GSVector4i(x, y, x + w, y + h).rintersect(GSVector4i(sTex->GetSize()).zwxy())); @@ -1397,7 +1759,7 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con AttachPaletteToSource(src, psm.pal, true); } } - else if (dst && GSRendererHW::GetInstance()->IsDummyTexture()) + else if (dst && GSRendererHW::GetInstance()->UpdateTexIsFB(dst, TEX0)) { // This shortcut is a temporary solution. It isn't a good solution // as it won't work with Channel Shuffle/Texture Shuffle pattern @@ -1409,21 +1771,23 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con // Be aware that you can't use StrechRect between BeginScene/EndScene. // So it could be tricky to put in the middle of the DrawPrims - // Texture is created to keep code compatibility - GSTexture* dTex = g_gs_device->CreateTexture(tw, th, false, GSTexture::Format::Color, true); - // Keep a trace of origin of the texture - src->m_texture = dTex; + src->m_texture = dst->m_texture; src->m_target = true; + src->m_shared_texture = true; src->m_from_target = &dst->m_texture; src->m_from_target_TEX0 = dst->m_TEX0; src->m_end_block = dst->m_end_block; src->m_texture->SetScale(dst->m_texture->GetScale()); + src->m_32_bits_fmt = dst->m_32_bits_fmt; // Even if we sample the framebuffer directly we might need the palette // to handle the format conversion on GPU if (psm.pal > 0) AttachPaletteToSource(src, psm.pal, true); + + // This will get immediately invalidated. + m_temporary_source = src; } else if (dst) { @@ -1457,7 +1821,7 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con src->m_valid_rect = dst->m_valid; src->m_end_block = dst->m_end_block; - dst->Update(); + dst->Update(true); // do not round here!!! if edge becomes a black pixel and addressing mode is clamp => everything outside the clamped area turns into black (kh2 shadows) @@ -1565,7 +1929,7 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con { // if it looks like a texture shuffle, we might read up to +/- 8 pixels on either side. GSVector4 adjusted_src_range(*src_range); - if (GSRendererHW::GetInstance()->IsPossibleTextureShuffle(src)) + if (GSRendererHW::GetInstance()->IsPossibleTextureShuffle(dst, TEX0)) adjusted_src_range += GSVector4(-8.0f, 0.0f, 8.0f, 0.0f); // don't forget to scale the copy range @@ -1579,13 +1943,55 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con } } - // Don't be fooled by the name. 'dst' is the old target (hence the input) - // 'src' is the new texture cache entry (hence the output) - GSTexture* sTex = dst->m_texture; - GSTexture* dTex = use_texture ? - g_gs_device->CreateTexture(w, h, false, GSTexture::Format::Color, true) : - g_gs_device->CreateRenderTarget(w, h, GSTexture::Format::Color, false); - src->m_texture = dTex; + // Assuming everything matches up, instead of copying the target, we can just sample it directly. + // It's the same as doing the copy first, except we save GPU time. + if (!half_right && // not the size change from above + use_texture && // not reinterpreting the RT + w == dst->m_texture->GetWidth() && h == dst->m_texture->GetHeight() && // same dimensions + !m_temporary_source // not the shuffle case above + ) + { + // sample the target directly + src->m_texture = dst->m_texture; + src->m_shared_texture = true; + src->m_target = true; // So renderer can check if a conversion is required + src->m_from_target = &dst->m_texture; // avoid complex condition on the renderer + src->m_from_target_TEX0 = dst->m_TEX0; + src->m_32_bits_fmt = dst->m_32_bits_fmt; + src->m_valid_rect = dst->m_valid; + src->m_end_block = dst->m_end_block; + + // kill the source afterwards, since we don't want to have to track changes to the target + m_temporary_source = src; + } + else + { + // Don't be fooled by the name. 'dst' is the old target (hence the input) + // 'src' is the new texture cache entry (hence the output) + GSTexture* sTex = dst->m_texture; + GSTexture* dTex = use_texture ? + g_gs_device->CreateTexture(w, h, 1, GSTexture::Format::Color, true) : + g_gs_device->CreateRenderTarget(w, h, GSTexture::Format::Color, false); + src->m_texture = dTex; + + if (use_texture) + { + g_gs_device->CopyRect(sTex, dTex, sRect, destX, destY); + } + else + { + GSVector4 sRectF(sRect); + sRectF.z /= sTex->GetWidth(); + sRectF.w /= sTex->GetHeight(); + + g_gs_device->StretchRect(sTex, sRectF, dTex, GSVector4(destX, destY, w, h), shader, false); + } + + if (src->m_texture) + src->m_texture->SetScale(scale); + else + ASSERT(0); + } // GH: by default (m_paltex == 0) GS converts texture to the 32 bit format // However it is different here. We want to reuse a Render Target as a texture. @@ -1595,32 +2001,14 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con AttachPaletteToSource(src, psm.pal, true); } - if (use_texture) - { - g_gs_device->CopyRect(sTex, dTex, sRect, destX, destY); - } - else - { - GSVector4 sRectF(sRect); - sRectF.z /= sTex->GetWidth(); - sRectF.w /= sTex->GetHeight(); - - g_gs_device->StretchRect(sTex, sRectF, dTex, GSVector4(destX, destY, w, h), shader, false); - } - - if (src->m_texture) - src->m_texture->SetScale(scale); - else - ASSERT(0); - // Offset hack. Can be enabled via GS options. // The offset will be used in Draw(). float modxy = 0.0f; if (GSConfig.UserHacks_HalfPixelOffset == 1 && hack) { - modxy = static_cast(g_gs_renderer->GetUpscaleMultiplier()); - switch (g_gs_renderer->GetUpscaleMultiplier()) + modxy = g_gs_renderer->GetUpscaleMultiplier(); + switch (static_cast(std::round(g_gs_renderer->GetUpscaleMultiplier()))) { case 2: case 4: case 6: case 8: modxy += 0.2f; break; case 3: case 7: modxy += 0.1f; break; @@ -1646,12 +2034,12 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con } else if (paltex) { - src->m_texture = g_gs_device->CreateTexture(tw, th, false, GSTexture::Format::UNorm8); + src->m_texture = g_gs_device->CreateTexture(tw, th, tlevels, GSTexture::Format::UNorm8); AttachPaletteToSource(src, psm.pal, true); } else { - src->m_texture = g_gs_device->CreateTexture(tw, th, (lod != nullptr), GSTexture::Format::Color); + src->m_texture = g_gs_device->CreateTexture(tw, th, tlevels, GSTexture::Format::Color); if (psm.pal > 0) { AttachPaletteToSource(src, psm.pal, false); @@ -1734,6 +2122,7 @@ GSTextureCache::HashCacheEntry* GSTextureCache::LookupHashCache(const GIFRegTEX0 // found a replacement texture! insert it into the hash cache, and clear paltex (since it's not indexed) paltex = false; const HashCacheEntry entry{replacement_tex, 1u, 0u, true}; + m_hash_cache_memory_usage += entry.texture->GetMemUsage(); return &m_hash_cache.emplace(key, entry).first->second; } else if ( @@ -1775,7 +2164,8 @@ GSTextureCache::HashCacheEntry* GSTextureCache::LookupHashCache(const GIFRegTEX0 // expand/upload texture const int tw = 1 << TEX0.TW; const int th = 1 << TEX0.TH; - GSTexture* tex = g_gs_device->CreateTexture(tw, th, paltex ? false : (lod != nullptr), paltex ? GSTexture::Format::UNorm8 : GSTexture::Format::Color); + const int tlevels = lod ? ((GSConfig.HWMipmap != HWMipmapLevel::Full) ? -1 : (lod->y - lod->x + 1)) : 1; + GSTexture* tex = g_gs_device->CreateTexture(tw, th, tlevels, paltex ? GSTexture::Format::UNorm8 : GSTexture::Format::Color); if (!tex) { // out of video memory if we hit here @@ -1817,16 +2207,16 @@ GSTextureCache::Target* GSTextureCache::CreateTarget(const GIFRegTEX0& TEX0, int if (type == RenderTarget) { - t->m_texture = g_gs_device->CreateSparseRenderTarget(w, h, GSTexture::Format::Color, clear); + t->m_texture = g_gs_device->CreateRenderTarget(w, h, GSTexture::Format::Color, clear); t->m_used = true; // FIXME } else if (type == DepthStencil) { - t->m_texture = g_gs_device->CreateSparseDepthStencil(w, h, GSTexture::Format::DepthStencil, clear); + t->m_texture = g_gs_device->CreateDepthStencil(w, h, GSTexture::Format::DepthStencil, clear); } - t->m_texture->SetScale(g_gs_renderer->GetTextureScaleFactor()); + t->m_texture->SetScale(static_cast(g_gs_renderer.get())->GetTextureScaleFactor()); m_dst[type].push_front(t); @@ -1999,16 +2389,74 @@ bool GSTextureCache::Surface::Overlaps(u32 bp, u32 bw, u32 psm, const GSVector4i { // Valid only for color formats. const u32 end_block = GSLocalMemory::m_psm[psm].info.bn(rect.z - 1, rect.w - 1, bp, bw); - const bool overlap = GSTextureCache::CheckOverlap(m_TEX0.TBP0, m_end_block, bp, end_block); + const u32 start_block = GSLocalMemory::m_psm[psm].info.bn(rect.x, rect.y, bp, bw); + const bool overlap = GSTextureCache::CheckOverlap(m_TEX0.TBP0, m_end_block, start_block, end_block); return overlap; } +bool GSTextureCache::Surface::ResizeTexture(int new_width, int new_height, bool recycle_old) +{ + return ResizeTexture(new_width, new_height, m_texture->GetScale(), recycle_old); +} + +bool GSTextureCache::Surface::ResizeTexture(int new_width, int new_height, GSVector2 new_scale, bool recycle_old) +{ + const int width = m_texture->GetWidth(); + const int height = m_texture->GetHeight(); + if (width == new_width && height == new_height) + return true; + + // These exceptions *really* need to get lost. This gets called outside of draws, which just crashes + // when it tries to propogate the exception back. + const bool clear = (new_width > width || new_height > height); + GSTexture* tex = nullptr; + try + { + tex = m_texture->IsDepthStencil() ? + g_gs_device->CreateDepthStencil(new_width, new_height, m_texture->GetFormat(), clear) : + g_gs_device->CreateRenderTarget(new_width, new_height, m_texture->GetFormat(), clear); + } + catch (const std::bad_alloc&) + { + } + + if (!tex) + { + Console.Error("(ResizeTexture) Failed to allocate %dx%d texture from %dx%d texture", new_width, new_height, width, height); + return false; + } + + tex->SetScale(new_scale); + + const GSVector4i rc(0, 0, std::min(width, new_width), std::min(height, new_height)); + if (tex->IsDepthStencil()) + { + // Can't do partial copies in DirectX for depth textures, and it's probably not ideal in other + // APIs either. So use a fullscreen quad setting depth instead. + g_gs_device->StretchRect(m_texture, tex, GSVector4(rc), ShaderConvert::DEPTH_COPY, false); + } + else + { + // Fast memcpy()-like path for color targets. + g_gs_device->CopyRect(m_texture, tex, rc, 0, 0); + } + + if (recycle_old) + g_gs_device->Recycle(m_texture); + else + delete m_texture; + + m_texture = tex; + return true; +} + // GSTextureCache::Source GSTextureCache::Source::Source(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, bool dummy_container) : m_palette_obj(nullptr) , m_palette(nullptr) , m_valid_rect(0, 0) + , m_lod(0, 0) , m_target(false) , m_p2t(NULL) , m_from_target(NULL) @@ -2232,7 +2680,7 @@ void GSTextureCache::Source::Flush(u32 count, int layer) if ((r > tr).mask() & 0xff00) { - (mem.*rtx)(off, r, buff, pitch, m_TEXA); + rtx(mem, off, r, buff, pitch, m_TEXA); m_texture->Update(r.rintersect(tr), buff, pitch, layer); } @@ -2242,13 +2690,13 @@ void GSTextureCache::Source::Flush(u32 count, int layer) if (m_texture->Map(m, &r, layer)) { - (mem.*rtx)(off, r, m.bits, m.pitch, m_TEXA); + rtx(mem, off, r, m.bits, m.pitch, m_TEXA); m_texture->Unmap(); } else { - (mem.*rtx)(off, r, buff, pitch, m_TEXA); + rtx(mem, off, r, buff, pitch, m_TEXA); m_texture->Update(r, buff, pitch, layer); } @@ -2294,18 +2742,18 @@ bool GSTextureCache::Source::ClutMatch(const PaletteKey& palette_key) GSTextureCache::Target::Target(const GIFRegTEX0& TEX0, const bool depth_supported, const int type) : m_type(type) , m_used(false) + , m_valid(GSVector4i::zero()) , m_depth_supported(depth_supported) { m_TEX0 = TEX0; m_32_bits_fmt |= (GSLocalMemory::m_psm[TEX0.PSM].trbpp != 16); m_dirty_alpha = GSLocalMemory::m_psm[TEX0.PSM].trbpp != 24; - - m_valid = GSVector4i::zero(); } -void GSTextureCache::Target::Update() +void GSTextureCache::Target::Update(bool reset_age) { - Surface::UpdateAge(); + if(reset_age) + Surface::UpdateAge(); // FIXME: the union of the rects may also update wrong parts of the render target (but a lot faster :) // GH: it must be doable @@ -2352,7 +2800,7 @@ void GSTextureCache::Target::Update() TEXA.TA0 = 0; TEXA.TA1 = 0x80; - GSTexture* t = g_gs_device->CreateTexture(w, h, false, GSTexture::Format::Color); + GSTexture* t = g_gs_device->CreateTexture(w, h, 1, GSTexture::Format::Color); GSOffset off = g_gs_renderer->m_mem.GetOffset(m_TEX0.TBP0, m_TEX0.TBW, m_TEX0.PSM); @@ -2387,7 +2835,7 @@ void GSTextureCache::Target::Update() GL_INS("ERROR: Update DepthStencil 0x%x", m_TEX0.TBP0); // FIXME linear or not? - g_gs_device->StretchRect(t, m_texture, GSVector4(r) * GSVector4(m_texture->GetScale()).xyxy(), ShaderConvert::RGBA8_TO_FLOAT32); + g_gs_device->StretchRect(t, m_texture, GSVector4(r) * GSVector4(m_texture->GetScale()).xyxy(), ShaderConvert::RGBA8_TO_FLOAT32_BILN); } g_gs_device->Recycle(t); @@ -2397,7 +2845,7 @@ void GSTextureCache::Target::Update() void GSTextureCache::Target::UpdateIfDirtyIntersects(const GSVector4i& rc) { - for (const auto& dirty : m_dirty) + for (auto& dirty : m_dirty) { const GSVector4i dirty_rc(dirty.GetDirtyRect(m_TEX0)); if (dirty_rc.rintersect(rc).rempty()) @@ -2407,16 +2855,22 @@ void GSTextureCache::Target::UpdateIfDirtyIntersects(const GSVector4i& rc) // but, to keep things simple, just update the whole thing GL_CACHE("TC: Update dirty rectangle [%d,%d,%d,%d] due to intersection with [%d,%d,%d,%d]", dirty_rc.x, dirty_rc.y, dirty_rc.z, dirty_rc.w, rc.x, rc.y, rc.z, rc.w); - Update(); + Update(true); break; } } void GSTextureCache::Target::UpdateValidity(const GSVector4i& rect) { - m_valid = m_valid.runion(rect); + if (m_valid.eq(GSVector4i::zero())) + m_valid = rect; + else + m_valid = m_valid.runion(rect); // Block of the bottom right texel of the validity rectangle, last valid block of the texture + // TODO: This is not correct when the PSM changes. e.g. a 512x448 target being shuffled will become 512x896 temporarily, and + // at the moment, we blow the valid rect out to twice the size. The only thing stopping everything breaking is the fact + // that we clamp the draw rect to the target size in GSRendererHW::Draw(). m_end_block = GSLocalMemory::m_psm[m_TEX0.PSM].info.bn(m_valid.z - 1, m_valid.w - 1, m_TEX0.TBP0, m_TEX0.TBW); // Valid only for color formats // GL_CACHE("UpdateValidity (0x%x->0x%x) from R:%d,%d Valid: %d,%d", m_TEX0.TBP0, m_end_block, rect.z, rect.w, m_valid.z, m_valid.w); @@ -2575,7 +3029,7 @@ GSTextureCache::SurfaceOffset GSTextureCache::ComputeSurfaceOffset(const Surface const auto it = m_surface_offset_cache.find(sok); if (it != m_surface_offset_cache.end()) return it->second; // Cache HIT. - + // Cache MISS. // Search for a valid offset from B to A in B coordinates. SurfaceOffset so; @@ -2668,7 +3122,7 @@ GSTextureCache::SurfaceOffset GSTextureCache::ComputeSurfaceOffset(const Surface const GSVector4i& r2 = b_rect; [[maybe_unused]] const GSVector4i ri = r1.rintersect(r2); assert(!so.is_valid || (r1.eq(ri) && r1.x >= 0 && r1.y >= 0 && r1.z > 0 && r1.w > 0)); - + // Clear cache if size too big. if (m_surface_offset_cache.size() + 1 > S_SURFACE_OFFSET_CACHE_MAX_SIZE) { @@ -2703,6 +3157,9 @@ void GSTextureCache::InvalidateTemporarySource() void GSTextureCache::InjectHashCacheTexture(const HashCacheKey& key, GSTexture* tex) { + // When we insert we update memory usage. Old texture gets removed below. + m_hash_cache_memory_usage += tex->GetMemUsage(); + auto it = m_hash_cache.find(key); if (it == m_hash_cache.end()) { @@ -2766,7 +3223,7 @@ void GSTextureCache::Palette::InitializeTexture() // sampling such texture are always normalized by 255. // This is because indexes are stored as normalized values of an RGBA texture (e.g. index 15 will be read as (15/255), // and therefore will read texel 15/255 * texture size). - m_tex_palette = g_gs_device->CreateTexture(256, 1, false, GSTexture::Format::Color); + m_tex_palette = g_gs_device->CreateTexture(256, 1, 1, GSTexture::Format::Color); m_tex_palette->Update(GSVector4i(0, 0, m_pal, 1), m_clut, m_pal * sizeof(m_clut[0])); } } @@ -2777,8 +3234,8 @@ u64 GSTextureCache::PaletteKeyHash::operator()(const PaletteKey& key) const { ASSERT(key.pal == 16 || key.pal == 256); return key.pal == 16 ? - XXH3_64bits(key.clut, sizeof(key.clut[0]) * 16) : - XXH3_64bits(key.clut, sizeof(key.clut[0]) * 256); + GSXXH3_64bits(key.clut, sizeof(key.clut[0]) * 16) : + GSXXH3_64bits(key.clut, sizeof(key.clut[0]) * 256); }; // GSTextureCache::PaletteKeyEqual @@ -2929,17 +3386,17 @@ __fi static void BlockHashReset(BlockHashState& st) __fi static void BlockHashAccumulate(BlockHashState& st, const u8* bp) { - XXH3_64bits_update(&st, bp, BLOCK_SIZE); + GSXXH3_64bits_update(&st, bp, BLOCK_SIZE); } __fi static void BlockHashAccumulate(BlockHashState& st, const u8* bp, u32 size) { - XXH3_64bits_update(&st, bp, size); + GSXXH3_64bits_update(&st, bp, size); } __fi static GSTextureCache::HashType FinishBlockHash(BlockHashState& st) { - return XXH3_64bits_digest(&st); + return GSXXH3_64bits_digest(&st); } static void HashTextureLevel(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, BlockHashState& hash_st, u8* temp) @@ -2971,7 +3428,7 @@ static void HashTextureLevel(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, Blo const GSLocalMemory::readTexture rtx = psm.rtxP; // Use temp buffer for expanding, since we may not need to update. - (mem.*rtx)(off, block_rect, temp, pitch, TEXA); + rtx(mem, off, block_rect, temp, pitch, TEXA); // Hash the expanded texture. u8* ptr = temp; @@ -3037,7 +3494,7 @@ void GSTextureCache::PreloadTexture(const GIFRegTEX0& TEX0, const GIFRegTEXA& TE GSTexture::GSMap map; if (rect.eq(block_rect) && tex->Map(map, &rect, level)) { - (mem.*rtx)(off, block_rect, map.bits, map.pitch, TEXA); + rtx(mem, off, block_rect, map.bits, map.pitch, TEXA); tex->Unmap(); } else @@ -3046,7 +3503,7 @@ void GSTextureCache::PreloadTexture(const GIFRegTEX0& TEX0, const GIFRegTEXA& TE pitch = Common::AlignUpPow2(pitch, 32); u8* buff = m_temp; - (mem.*rtx)(off, block_rect, buff, pitch, TEXA); + rtx(mem, off, block_rect, buff, pitch, TEXA); tex->Update(rect, buff, pitch, level); } } diff --git a/pcsx2/GS/Renderers/HW/GSTextureCache.h b/pcsx2/GS/Renderers/HW/GSTextureCache.h index 63fe66cee9..fb8f4c1ab0 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureCache.h +++ b/pcsx2/GS/Renderers/HW/GSTextureCache.h @@ -92,6 +92,9 @@ public: void UpdateAge(); bool Inside(u32 bp, u32 bw, u32 psm, const GSVector4i& rect); bool Overlaps(u32 bp, u32 bw, u32 psm, const GSVector4i& rect); + + bool ResizeTexture(int new_width, int new_height, bool recycle_old = true); + bool ResizeTexture(int new_width, int new_height, GSVector2 new_scale, bool recycle_old = true); }; struct PaletteKey @@ -156,6 +159,7 @@ public: std::unique_ptr m_valid;// each u32 bits map to the 32 blocks of that page GSTexture* m_palette; GSVector4i m_valid_rect; + GSVector2i m_lod; u8 m_valid_hashes = 0; u8 m_complete_layers = 0; bool m_target; @@ -199,7 +203,7 @@ public: void UpdateValidity(const GSVector4i& rect); - void Update(); + void Update(bool reset_age); /// Updates the target, if the dirty area intersects with the specified rectangle. void UpdateIfDirtyIntersects(const GSVector4i& rc); @@ -243,6 +247,25 @@ public: void RemoveAt(Source* s); }; + struct TargetHeightElem + { + union + { + u32 bits; + + struct + { + u32 fbp : 9; + u32 fbw : 6; + u32 psm : 6; + u32 pad : 11; + }; + }; + + u32 height; + u32 age; + }; + struct SurfaceOffsetKeyElem { u32 psm; @@ -278,6 +301,7 @@ protected: std::unordered_map m_hash_cache; u64 m_hash_cache_memory_usage = 0; FastList m_dst[2]; + FastList m_target_heights; static u8* m_temp; constexpr static size_t S_SURFACE_OFFSET_CACHE_MAX_SIZE = std::numeric_limits::max(); std::unordered_map m_surface_offset_cache; @@ -286,6 +310,10 @@ protected: Source* CreateSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, Target* t = NULL, bool half_right = false, int x_offset = 0, int y_offset = 0, const GSVector2i* lod = nullptr, const GSVector4i* src_range = nullptr); Target* CreateTarget(const GIFRegTEX0& TEX0, int w, int h, int type, const bool clear); + /// Expands a target when the block pointer for a display framebuffer is within another target, but the read offset + /// plus the height is larger than the current size of the target. + void ScaleTargetForDisplay(Target* t, const GIFRegTEX0& dispfb, int real_w, int real_h); + HashCacheEntry* LookupHashCache(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, bool& paltex, const u32* clut, const GSVector2i* lod); static void PreloadTexture(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, GSLocalMemory& mem, bool paltex, GSTexture* tex, u32 level); @@ -304,22 +332,27 @@ public: void Read(Source* t, const GSVector4i& r); void RemoveAll(); void RemovePartial(); + void AddDirtyRectTarget(Target* target, GSVector4i rect, u32 psm, u32 bw); Source* LookupSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r, const GSVector2i* lod); Source* LookupDepthSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r, bool palette = false); - Target* LookupTarget(const GIFRegTEX0& TEX0, const GSVector2i& size, int type, bool used, u32 fbmask = 0, const bool is_frame = false, const int real_h = 0); - Target* LookupTarget(const GIFRegTEX0& TEX0, const GSVector2i& size, const int real_h); + Target* LookupTarget(const GIFRegTEX0& TEX0, const GSVector2i& size, int type, bool used, u32 fbmask = 0, const bool is_frame = false, const int real_w = 0, const int real_h = 0); + Target* LookupDisplayTarget(const GIFRegTEX0& TEX0, const GSVector2i& size, const int real_w, const int real_h); /// Looks up a target in the cache, and only returns it if the BP/BW/PSM match exactly. Target* GetExactTarget(u32 BP, u32 BW, u32 PSM) const; Target* GetTargetWithSharedBits(u32 BP, u32 PSM) const; + u32 GetTargetHeight(u32 fbp, u32 fbw, u32 psm, u32 min_height); + + void ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r); void InvalidateVideoMemType(int type, u32 bp); void InvalidateVideoMemSubTarget(GSTextureCache::Target* rt); - void InvalidateVideoMem(const GSOffset& off, const GSVector4i& r, bool target = true); + void InvalidateVideoMem(const GSOffset& off, const GSVector4i& r, bool eewrite = false, bool target = true); void InvalidateLocalMem(const GSOffset& off, const GSVector4i& r); bool Move(u32 SBP, u32 SBW, u32 SPSM, int sx, int sy, u32 DBP, u32 DBW, u32 DPSM, int dx, int dy, int w, int h); + bool ShuffleMove(u32 BP, u32 BW, u32 PSM, int sx, int sy, int dx, int dy, int w, int h); void IncAge(); @@ -335,10 +368,6 @@ public: SurfaceOffset ComputeSurfaceOffset(const uint32_t bp, const uint32_t bw, const uint32_t psm, const GSVector4i& r, const Target* t); SurfaceOffset ComputeSurfaceOffset(const SurfaceOffsetKey& sok); - /// Expands a target when the block pointer for a display framebuffer is within another target, but the read offset - /// plus the height is larger than the current size of the target. - static void ScaleTargetForDisplay(Target* t, const GIFRegTEX0& dispfb, int real_h); - /// Invalidates a temporary source, a partial copy only created from the current RT/DS for the current draw. void InvalidateTemporarySource(); diff --git a/pcsx2/GS/Renderers/HW/GSTextureReplacementLoaders.cpp b/pcsx2/GS/Renderers/HW/GSTextureReplacementLoaders.cpp index f5dd7b29b1..e321f7798b 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureReplacementLoaders.cpp +++ b/pcsx2/GS/Renderers/HW/GSTextureReplacementLoaders.cpp @@ -68,7 +68,7 @@ static u32 GetBlockCount(u32 extent, u32 block_size) static void CalcBlockMipmapSize(u32 block_size, u32 bytes_per_block, u32 base_width, u32 base_height, u32 mip, u32& width, u32& height, u32& pitch, u32& size) { width = std::max(base_width >> mip, 1u); - height = std::max(base_width >> mip, 1u); + height = std::max(base_height >> mip, 1u); const u32 blocks_wide = GetBlockCount(width, block_size); const u32 blocks_high = GetBlockCount(height, block_size); @@ -635,9 +635,9 @@ bool DDSLoader(const std::string& filename, GSTextureReplacements::ReplacementTe for (u32 level = 1; level <= info.mip_count; level++) { GSTextureReplacements::ReplacementTexture::MipData md; - u32 mip_width, mip_height, mip_size; - CalcBlockMipmapSize(info.block_size, info.bytes_per_block, info.width, info.height, level, mip_width, mip_height, md.pitch, mip_size); - if (!ReadDDSMipLevel(fp.get(), filename, level, info, mip_width, mip_height, md.data, md.pitch, mip_size)) + u32 mip_size; + CalcBlockMipmapSize(info.block_size, info.bytes_per_block, info.width, info.height, level, md.width, md.height, md.pitch, mip_size); + if (!ReadDDSMipLevel(fp.get(), filename, level, info, md.width, md.height, md.data, md.pitch, mip_size)) break; tex->mips.push_back(std::move(md)); diff --git a/pcsx2/GS/Renderers/HW/GSTextureReplacements.cpp b/pcsx2/GS/Renderers/HW/GSTextureReplacements.cpp index cd4a019eab..693f8baeea 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureReplacements.cpp +++ b/pcsx2/GS/Renderers/HW/GSTextureReplacements.cpp @@ -23,6 +23,8 @@ #include "common/ScopedGuard.h" #include "Config.h" +#include "Host.h" +#include "IconsFontAwesome5.h" #include "GS/GSLocalMemory.h" #include "GS/Renderers/HW/GSTextureReplacements.h" @@ -325,7 +327,7 @@ void GSTextureReplacements::ReloadReplacementMap() if (!name.has_value()) continue; - DevCon.WriteLn("Found %ux%u replacement '%.*s'", name->Width(), name->Height(), static_cast(filename.size()), filename.data()); + DbgCon.WriteLn("Found %ux%u replacement '%.*s'", name->Width(), name->Height(), static_cast(filename.size()), filename.data()); s_replacement_texture_filenames.emplace(name.value(), std::move(fd.FileName)); // zero out the CLUT hash, because we need this for checking if there's any replacements with this hash when using paltex @@ -496,7 +498,7 @@ void GSTextureReplacements::PrecacheReplacementTextures() // predict whether the requests will come with mipmaps // TODO: This will be wrong for hw mipmap games like Jak. const bool mipmap = GSConfig.HWMipmap >= HWMipmapLevel::Basic || - GSConfig.UserHacks_TriFilter == TriFiltering::Forced; + GSConfig.TriFilter == TriFiltering::Forced; // pretty simple, just go through the filenames and if any aren't cached, cache them for (const auto& it : s_replacement_texture_filenames) @@ -529,14 +531,17 @@ GSTexture* GSTextureReplacements::CreateReplacementTexture(const ReplacementText static bool log_once = false; if (!log_once) { - Console.Warning("Disabling mipmaps on one or more compressed replacement textures."); + static const char* message = + "Disabling autogenerated mipmaps on one or more compressed replacement textures. Please generate mipmaps when compressing your textures."; + Console.Warning(message); + Host::AddIconOSDMessage("DisablingReplacementAutoGeneratedMipmap", ICON_FA_EXCLAMATION_CIRCLE, message, Host::OSD_WARNING_DURATION); log_once = true; } mipmap = false; } - GSTexture* tex = g_gs_device->CreateTexture(rtex.width, rtex.height, mipmap, rtex.format); + GSTexture* tex = g_gs_device->CreateTexture(rtex.width, rtex.height, static_cast(rtex.mips.size()) + 1, rtex.format); if (!tex) return nullptr; @@ -548,10 +553,8 @@ GSTexture* GSTextureReplacements::CreateReplacementTexture(const ReplacementText { for (u32 i = 0; i < static_cast(rtex.mips.size()); i++) { - const u32 mip = i + 1; - const u32 mipw = std::max(rtex.width >> mip, 1u); - const u32 miph = std::max(rtex.height >> mip, 1u); - tex->Update(GSVector4i(0, 0, mipw, miph), rtex.mips[i].data.data(), rtex.mips[i].pitch, mip); + const ReplacementTexture::MipData& mip = rtex.mips[i]; + tex->Update(GSVector4i(0, 0, static_cast(mip.width), static_cast(mip.height)), mip.data.data(), mip.pitch, i + 1); } } @@ -612,7 +615,7 @@ void GSTextureReplacements::DumpTexture(const GSTextureCache::HashCacheKey& hash // use per-texture buffer so we can compress the texture asynchronously and not block the GS thread // must be 32 byte aligned for ReadTexture(). AlignedBuffer buffer(pitch * static_cast(read_height)); - (mem.*psm.rtx)(mem.GetOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM), block_rect, buffer.GetPtr(), pitch, TEXA); + psm.rtx(mem, mem.GetOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM), block_rect, buffer.GetPtr(), pitch, TEXA); // okay, now we can actually dump it QueueWorkerThreadItem([filename = std::move(filename), tw, th, pitch, buffer = std::move(buffer)]() { diff --git a/pcsx2/GS/Renderers/HW/GSTextureReplacements.h b/pcsx2/GS/Renderers/HW/GSTextureReplacements.h index 110fcb5e94..cc61be7702 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureReplacements.h +++ b/pcsx2/GS/Renderers/HW/GSTextureReplacements.h @@ -30,6 +30,8 @@ namespace GSTextureReplacements struct MipData { + u32 width; + u32 height; u32 pitch; std::vector data; }; diff --git a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.h b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.h index efe095846b..e04521373c 100644 --- a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.h +++ b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.h @@ -25,6 +25,7 @@ #include "common/HashCombine.h" #include "common/MRCHelpers.h" +#include "common/ReadbackSpinManager.h" #include "GS/GS.h" #include "GSMTLDeviceInfo.h" #include "GSMTLSharedHeader.h" @@ -201,6 +202,7 @@ public: bool iip : 1; bool fst : 1; bool point_size : 1; + GSMTLExpandType expand : 2; }; u8 key; }; @@ -226,13 +228,22 @@ public: u64 m_current_draw = 1; std::atomic m_last_finished_draw{0}; + // Spinning + ReadbackSpinManager m_spin_manager; + u32 m_encoders_in_current_cmdbuf; + u32 m_spin_timer = 0; + MRCOwned> m_spin_pipeline; + MRCOwned> m_spin_buffer; + MRCOwned> m_spin_fence; + // Functions and Pipeline States + MRCOwned> m_cas_pipeline[2]; MRCOwned> m_convert_pipeline[static_cast(ShaderConvert::Count)]; MRCOwned> m_present_pipeline[static_cast(PresentShader::Count)]; MRCOwned> m_convert_pipeline_copy[2]; MRCOwned> m_convert_pipeline_copy_mask[1 << 4]; MRCOwned> m_merge_pipeline[4]; - MRCOwned> m_interlace_pipeline[4]; + MRCOwned> m_interlace_pipeline[NUM_INTERLACE_SHADERS]; MRCOwned> m_datm_pipeline[2]; MRCOwned> m_stencil_clear_pipeline; MRCOwned> m_primid_init_pipeline[2][2]; @@ -243,7 +254,7 @@ public: MRCOwned> m_imgui_pipeline; MRCOwned> m_imgui_pipeline_a8; - MRCOwned> m_hw_vs[1 << 3]; + MRCOwned> m_hw_vs[1 << 5]; std::unordered_map>> m_hw_ps; std::unordered_map>> m_hw_pipeline; @@ -323,24 +334,30 @@ public: id GetVertexUploadEncoder(); /// Get the render command buffer, creating a new one if it doesn't exist id GetRenderCmdBuf(); + /// Called by command buffers when they finish + void DrawCommandBufferFinished(u64 draw, id buffer); /// Flush pending operations from all encoders to the GPU void FlushEncoders(); /// End current render pass without flushing void EndRenderPass(); /// Begin a new render pass (may reuse existing) void BeginRenderPass(NSString* name, GSTexture* color, MTLLoadAction color_load, GSTexture* depth, MTLLoadAction depth_load, GSTexture* stencil = nullptr, MTLLoadAction stencil_load = MTLLoadActionDontCare); + /// Call at the end of each frame + void FrameCompleted(); GSTexture* CreateSurface(GSTexture::Type type, int width, int height, int levels, GSTexture::Format format) override; void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) override; - void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset) override; + void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset, int bufIdx) override; void DoFXAA(GSTexture* sTex, GSTexture* dTex) override; void DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float params[4]) override; - void DoExternalFX(GSTexture* sTex, GSTexture* dTex) override; + + bool DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) override; MRCOwned> LoadShader(NSString* name); MRCOwned> MakePipeline(MTLRenderPipelineDescriptor* desc, id vertex, id fragment, NSString* name); - bool Create(HostDisplay* display) override; + MRCOwned> MakeComputePipeline(id compute, NSString* name); + bool Create() override; void ClearRenderTarget(GSTexture* t, const GSVector4& c) override; void ClearRenderTarget(GSTexture* t, u32 c) override; diff --git a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm index f685ff4d1d..71ba2e7dde 100644 --- a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm +++ b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm @@ -16,6 +16,8 @@ #include "PrecompiledHeader.h" #include "GSMetalCPPAccessible.h" #include "GSDeviceMTL.h" + +#include "Frontend/MetalHostDisplay.h" #include "GSTextureMTL.h" #include "GS/GSPerfMon.h" #include "HostDisplay.h" @@ -24,6 +26,21 @@ #ifdef __APPLE__ #include "GSMTLSharedHeader.h" +static constexpr bool IsCommandBufferCompleted(MTLCommandBufferStatus status) +{ + switch (status) + { + case MTLCommandBufferStatusNotEnqueued: + case MTLCommandBufferStatusEnqueued: + case MTLCommandBufferStatusCommitted: + case MTLCommandBufferStatusScheduled: + return false; + case MTLCommandBufferStatusCompleted: + case MTLCommandBufferStatusError: + return true; + } +} + GSDevice* MakeGSDeviceMTL() { return new GSDeviceMTL(); @@ -212,6 +229,7 @@ id GSDeviceMTL::GetRenderCmdBuf() { if (!m_current_render_cmdbuf) { + m_encoders_in_current_cmdbuf = 0; m_current_render_cmdbuf = MRCRetain([m_queue commandBuffer]); pxAssertRel(m_current_render_cmdbuf, "Failed to create draw command buffer!"); [m_current_render_cmdbuf setLabel:@"Draw"]; @@ -219,6 +237,14 @@ id GSDeviceMTL::GetRenderCmdBuf() return m_current_render_cmdbuf; } +void GSDeviceMTL::DrawCommandBufferFinished(u64 draw, id buffer) +{ + // We can do the update non-atomically because we only ever update under the lock + u64 newval = std::max(draw, m_last_finished_draw.load(std::memory_order_relaxed)); + m_last_finished_draw.store(newval, std::memory_order_release); + static_cast(g_host_display.get())->AccumulateCommandBufferTime(buffer); +} + void GSDeviceMTL::FlushEncoders() { if (!m_current_render_cmdbuf) @@ -248,19 +274,78 @@ void GSDeviceMTL::FlushEncoders() [m_late_texture_upload_encoder endEncoding]; m_late_texture_upload_encoder = nil; } - [m_current_render_cmdbuf addCompletedHandler:[backref = m_backref, draw = m_current_draw](id buf) + u32 spin_cycles = 0; + constexpr double s_to_ns = 1000000000; + if (m_spin_timer) { - std::lock_guard guard(backref->first); - if (GSDeviceMTL* dev = backref->second) + u32 spin_id; { - // We can do the update non-atomically because we only ever update under the lock - u64 newval = std::max(draw, dev->m_last_finished_draw.load(std::memory_order_relaxed)); - dev->m_last_finished_draw.store(newval, std::memory_order_release); + std::lock_guard guard(m_backref->first); + auto draw = m_spin_manager.DrawSubmitted(m_encoders_in_current_cmdbuf); + u32 constant_offset = 200000 * m_spin_manager.SpinsPerUnitTime(); // 200µs + u32 minimum_spin = 2 * constant_offset; // 400µs (200µs after subtracting constant_offset) + u32 maximum_spin = std::max(1024, 16000000 * m_spin_manager.SpinsPerUnitTime()); // 16ms + if (draw.recommended_spin > minimum_spin) + spin_cycles = std::min(draw.recommended_spin - constant_offset, maximum_spin); + spin_id = draw.id; } - }]; + [m_current_render_cmdbuf addCompletedHandler:[backref = m_backref, draw = m_current_draw, spin_id](id buf) + { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + // Starting from kernelStartTime includes time the command buffer spent waiting to execute + // This is useful for avoiding issues on GPUs without async compute (Intel) where spinning + // delays the next command buffer start, which then makes the spin manager think it should spin more + // (If a command buffer contains multiple encoders, the GPU will start before the kernel finishes, + // so we choose kernelStartTime over kernelEndTime) + u64 begin = [buf kernelStartTime] * s_to_ns; + u64 end = [buf GPUEndTime] * s_to_ns; +#pragma clang diagnostic pop + std::lock_guard guard(backref->first); + if (GSDeviceMTL* dev = backref->second) + { + dev->DrawCommandBufferFinished(draw, buf); + dev->m_spin_manager.DrawCompleted(spin_id, static_cast(begin), static_cast(end)); + } + }]; + } + else + { + [m_current_render_cmdbuf addCompletedHandler:[backref = m_backref, draw = m_current_draw](id buf) + { + std::lock_guard guard(backref->first); + if (GSDeviceMTL* dev = backref->second) + dev->DrawCommandBufferFinished(draw, buf); + }]; + } [m_current_render_cmdbuf commit]; m_current_render_cmdbuf = nil; m_current_draw++; + if (spin_cycles) + { + id spinCmdBuf = [m_queue commandBuffer]; + [spinCmdBuf setLabel:@"Spin"]; + id spinCmdEncoder = [spinCmdBuf computeCommandEncoder]; + [spinCmdEncoder setLabel:@"Spin"]; + [spinCmdEncoder waitForFence:m_spin_fence]; + [spinCmdEncoder setComputePipelineState:m_spin_pipeline]; + [spinCmdEncoder setBytes:&spin_cycles length:sizeof(spin_cycles) atIndex:0]; + [spinCmdEncoder setBuffer:m_spin_buffer offset:0 atIndex:1]; + [spinCmdEncoder dispatchThreadgroups:MTLSizeMake(1, 1, 1) threadsPerThreadgroup:MTLSizeMake(1, 1, 1)]; + [spinCmdEncoder endEncoding]; + [spinCmdBuf addCompletedHandler:[backref = m_backref, spin_cycles](id buf) + { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + u64 begin = [buf GPUStartTime] * s_to_ns; + u64 end = [buf GPUEndTime] * s_to_ns; +#pragma clang diagnostic pop + std::lock_guard guard(backref->first); + if (GSDeviceMTL* dev = backref->second) + dev->m_spin_manager.SpinCompleted(spin_cycles, static_cast(begin), static_cast(end)); + }]; + [spinCmdBuf commit]; + } } void GSDeviceMTL::EndRenderPass() @@ -268,6 +353,8 @@ void GSDeviceMTL::EndRenderPass() if (m_current_render.encoder) { EndDebugGroup(m_current_render.encoder); + if (m_spin_timer) + [m_current_render.encoder updateFence:m_spin_fence afterStages:MTLRenderStageFragment]; [m_current_render.encoder endEncoding]; m_current_render.encoder = nil; memset(&m_current_render, 0, offsetof(MainRenderEncoder, depth_sel)); @@ -309,6 +396,8 @@ void GSDeviceMTL::BeginRenderPass(NSString* name, GSTexture* color, MTLLoadActio return; } + m_encoders_in_current_cmdbuf++; + if (m_late_texture_upload_encoder) { [m_late_texture_upload_encoder endEncoding]; @@ -359,6 +448,13 @@ void GSDeviceMTL::BeginRenderPass(NSString* name, GSTexture* color, MTLLoadActio pxAssertRel(m_current_render.encoder, "Failed to create render encoder!"); } +void GSDeviceMTL::FrameCompleted() +{ + if (m_spin_timer) + m_spin_timer--; + m_spin_manager.NextFrame(); +} + static constexpr MTLPixelFormat ConvertPixelFormat(GSTexture::Format format) { switch (format) @@ -368,7 +464,7 @@ static constexpr MTLPixelFormat ConvertPixelFormat(GSTexture::Format format) case GSTexture::Format::UInt16: return MTLPixelFormatR16Uint; case GSTexture::Format::UNorm8: return MTLPixelFormatA8Unorm; case GSTexture::Format::Color: return MTLPixelFormatRGBA8Unorm; - case GSTexture::Format::FloatColor: return MTLPixelFormatRGBA32Float; + case GSTexture::Format::HDRColor: return MTLPixelFormatRGBA16Unorm; case GSTexture::Format::DepthStencil: return MTLPixelFormatDepth32Float_Stencil8; case GSTexture::Format::Invalid: return MTLPixelFormatInvalid; case GSTexture::Format::BC1: return MTLPixelFormatBC1_RGBA; @@ -402,12 +498,14 @@ GSTexture* GSDeviceMTL::CreateSurface(GSTexture::Type type, int width, int heigh [desc setUsage:MTLTextureUsageRenderTarget]; break; case GSTexture::Type::RenderTarget: - case GSTexture::Type::SparseRenderTarget: if (m_dev.features.slow_color_compression) [desc setUsage:MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget | MTLTextureUsagePixelFormatView]; // Force color compression off by including PixelFormatView else [desc setUsage:MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget]; break; + case GSTexture::Type::RWTexture: + [desc setUsage:MTLTextureUsageShaderRead | MTLTextureUsageShaderWrite]; + break; default: [desc setUsage:MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget]; } @@ -488,20 +586,21 @@ void GSDeviceMTL::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, StretchRect(dTex, full_r, sTex[2], dRect[0], ShaderConvert::YUV); }} -void GSDeviceMTL::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset) +void GSDeviceMTL::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset, int bufIdx) { @autoreleasepool { id cmdbuf = GetRenderCmdBuf(); GSScopedDebugGroupMTL dbg(cmdbuf, @"DoInterlace"); - GSVector4 s = GSVector4(dTex->GetSize()); + GSVector4 ds = GSVector4(dTex->GetSize()); GSVector4 sRect(0, 0, 1, 1); - GSVector4 dRect(0.f, yoffset, s.x, s.y + yoffset); + GSVector4 dRect(0.f, yoffset, ds.x, ds.y + yoffset); GSMTLInterlacePSUniform cb = {}; - cb.ZrH = {0, 1.f / s.y}; + cb.ZrH = {static_cast(bufIdx), 1.0f / ds.y, ds.y, MAD_SENSITIVITY}; - DoStretchRect(sTex, sRect, dTex, dRect, m_interlace_pipeline[shader], linear, shader > 1 ? LoadAction::DontCareIfFull : LoadAction::Load, &cb, sizeof(cb)); + const bool can_discard = shader == 0 || shader == 3; + DoStretchRect(sTex, sRect, dTex, dRect, m_interlace_pipeline[shader], linear, !can_discard ? LoadAction::DontCareIfFull : LoadAction::Load, &cb, sizeof(cb)); }} void GSDeviceMTL::DoFXAA(GSTexture* sTex, GSTexture* dTex) @@ -519,10 +618,25 @@ void GSDeviceMTL::DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float par RenderCopy(sTex, m_shadeboost_pipeline, GSVector4i(0, 0, dTex->GetSize().x, dTex->GetSize().y)); } -void GSDeviceMTL::DoExternalFX(GSTexture* sTex, GSTexture* dTex) -{ - // TODO: Implement -} +bool GSDeviceMTL::DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) +{ @autoreleasepool { + static constexpr int threadGroupWorkRegionDim = 16; + const int dispatchX = (dTex->GetWidth() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + const int dispatchY = (dTex->GetHeight() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + static_assert(sizeof(constants) == sizeof(GSMTLCASPSUniform)); + + EndRenderPass(); + id enc = [GetRenderCmdBuf() computeCommandEncoder]; + [enc setLabel:@"CAS"]; + [enc setComputePipelineState:m_cas_pipeline[sharpen_only]]; + [enc setTexture:static_cast(sTex)->GetTexture() atIndex:0]; + [enc setTexture:static_cast(dTex)->GetTexture() atIndex:1]; + [enc setBytes:&constants length:sizeof(constants) atIndex:GSMTLBufferIndexUniforms]; + [enc dispatchThreadgroups:MTLSizeMake(dispatchX, dispatchY, 1) + threadsPerThreadgroup:MTLSizeMake(64, 1, 1)]; + [enc endEncoding]; + return true; +}} MRCOwned> GSDeviceMTL::LoadShader(NSString* name) { @@ -553,6 +667,26 @@ MRCOwned> GSDeviceMTL::MakePipeline(MTLRenderPipeline return res; } +MRCOwned> GSDeviceMTL::MakeComputePipeline(id compute, NSString* name) +{ + MRCOwned desc = MRCTransfer([MTLComputePipelineDescriptor new]); + [desc setLabel:name]; + [desc setComputeFunction:compute]; + NSError* err; + MRCOwned> res = MRCTransfer([m_dev.dev + newComputePipelineStateWithDescriptor:desc + options:0 + reflection:nil + error:&err]); + if (unlikely(err)) + { + NSString* msg = [NSString stringWithFormat:@"Failed to create pipeline %@: %@", name, [err localizedDescription]]; + Console.Error("%s", [msg UTF8String]); + throw GSRecoverableError(); + } + return res; +} + static void applyAttribute(MTLVertexDescriptor* desc, NSUInteger idx, MTLVertexFormat fmt, NSUInteger offset, NSUInteger buffer_index) { MTLVertexAttributeDescriptor* attrs = desc.attributes[idx]; @@ -571,23 +705,24 @@ static void setFnConstantI(MTLFunctionConstantValues* fc, unsigned int value, GS [fc setConstantValue:&value type:MTLDataTypeUInt atIndex:constant]; } -bool GSDeviceMTL::Create(HostDisplay* display) +bool GSDeviceMTL::Create() { @autoreleasepool { - if (!GSDevice::Create(display)) + if (!GSDevice::Create()) return false; - if (display->GetRenderAPI() != HostDisplay::RenderAPI::Metal) + if (g_host_display->GetRenderAPI() != RenderAPI::Metal) return false; - if (!m_display->HasRenderDevice() || !m_display->HasRenderSurface()) + if (!g_host_display->HasDevice() || !g_host_display->HasSurface()) return false; - m_dev = *static_cast(m_display->GetRenderDevice()); - m_queue = MRCRetain((__bridge id)m_display->GetRenderContext()); - MTLPixelFormat layer_px_fmt = [(__bridge CAMetalLayer*)m_display->GetRenderSurface() pixelFormat]; + m_dev = *static_cast(g_host_display->GetDevice()); + m_queue = MRCRetain((__bridge id)g_host_display->GetContext()); + MTLPixelFormat layer_px_fmt = [(__bridge CAMetalLayer*)g_host_display->GetSurface() pixelFormat]; m_features.broken_point_sampler = [[m_dev.dev name] containsString:@"AMD"]; m_features.geometry_shader = false; - m_features.image_load_store = m_dev.features.primid; + m_features.vs_expand = true; + m_features.primitive_id = m_dev.features.primid; m_features.texture_barrier = true; m_features.provoking_vertex_last = false; m_features.point_expand = true; @@ -598,18 +733,37 @@ bool GSDeviceMTL::Create(HostDisplay* display) m_features.framebuffer_fetch = m_dev.features.framebuffer_fetch; m_features.dual_source_blend = true; m_features.stencil_buffer = true; + m_features.cas_sharpening = true; try { // Init metal stuff - m_draw_sync_fence = MRCTransfer([m_dev.dev newFence]); - m_fn_constants = MRCTransfer([MTLFunctionConstantValues new]); - u8 upscale = std::max(1, theApp.GetConfigI("upscale_multiplier")); - vector_uchar2 upscale2 = vector2(upscale, upscale); - [m_fn_constants setConstantValue:&upscale2 type:MTLDataTypeUChar2 atIndex:GSMTLConstantIndex_SCALING_FACTOR]; + vector_float2 upscale2 = vector2(GSConfig.UpscaleMultiplier, GSConfig.UpscaleMultiplier); + [m_fn_constants setConstantValue:&upscale2 type:MTLDataTypeFloat2 atIndex:GSMTLConstantIndex_SCALING_FACTOR]; setFnConstantB(m_fn_constants, m_dev.features.framebuffer_fetch, GSMTLConstantIndex_FRAMEBUFFER_FETCH); + m_draw_sync_fence = MRCTransfer([m_dev.dev newFence]); + [m_draw_sync_fence setLabel:@"Draw Sync Fence"]; + m_spin_fence = MRCTransfer([m_dev.dev newFence]); + [m_spin_fence setLabel:@"Spin Fence"]; + constexpr MTLResourceOptions spin_opts = MTLResourceStorageModePrivate | MTLResourceHazardTrackingModeUntracked; + m_spin_buffer = MRCTransfer([m_dev.dev newBufferWithLength:4 options:spin_opts]); + [m_spin_buffer setLabel:@"Spin Buffer"]; + id initCommands = [m_queue commandBuffer]; + id clearSpinBuffer = [initCommands blitCommandEncoder]; + [clearSpinBuffer fillBuffer:m_spin_buffer range:NSMakeRange(0, 4) value:0]; + [clearSpinBuffer updateFence:m_spin_fence]; + [clearSpinBuffer endEncoding]; + m_spin_pipeline = MakeComputePipeline(LoadShader(@"waste_time"), @"waste_time"); + + for (int sharpen_only = 0; sharpen_only < 2; sharpen_only++) + { + setFnConstantB(m_fn_constants, sharpen_only, GSMTLConstantIndex_CAS_SHARPEN_ONLY); + NSString* shader = m_dev.features.has_fast_half ? @"CASHalf" : @"CASFloat"; + m_cas_pipeline[sharpen_only] = MakeComputePipeline(LoadShader(shader), sharpen_only ? @"CAS Sharpen" : @"CAS Upscale"); + } + m_hw_vertex = MRCTransfer([MTLVertexDescriptor new]); [[[m_hw_vertex layouts] objectAtIndexedSubscript:GSMTLBufferIndexHWVertices] setStride:sizeof(GSVertex)]; applyAttribute(m_hw_vertex, GSMTLAttributeIndexST, MTLVertexFormatFloat2, offsetof(GSVertex, ST), GSMTLBufferIndexHWVertices); @@ -742,10 +896,18 @@ bool GSDeviceMTL::Create(HostDisplay* display) { VSSelector sel; sel.key = i; + if (sel.point_size && sel.expand != GSMTLExpandType::None) + continue; setFnConstantB(m_fn_constants, sel.fst, GSMTLConstantIndex_FST); setFnConstantB(m_fn_constants, sel.iip, GSMTLConstantIndex_IIP); setFnConstantB(m_fn_constants, sel.point_size, GSMTLConstantIndex_VS_POINT_SIZE); - m_hw_vs[i] = LoadShader(@"vs_main"); + NSString* shader = @"vs_main"; + if (sel.expand != GSMTLExpandType::None) + { + setFnConstantI(m_fn_constants, static_cast(sel.expand), GSMTLConstantIndex_VS_EXPAND_TYPE); + shader = @"vs_main_expand"; + } + m_hw_vs[i] = LoadShader(shader); } // Init pipelines @@ -755,11 +917,11 @@ bool GSDeviceMTL::Create(HostDisplay* display) auto pdesc = [[MTLRenderPipelineDescriptor new] autorelease]; // FS Triangle Pipelines pdesc.colorAttachments[0].pixelFormat = ConvertPixelFormat(GSTexture::Format::Color); - m_hdr_resolve_pipeline = MakePipeline(pdesc, fs_triangle, LoadShader(@"ps_mod256"), @"HDR Resolve"); + m_hdr_resolve_pipeline = MakePipeline(pdesc, fs_triangle, LoadShader(@"ps_hdr_resolve"), @"HDR Resolve"); m_fxaa_pipeline = MakePipeline(pdesc, fs_triangle, LoadShader(@"ps_fxaa"), @"fxaa"); m_shadeboost_pipeline = MakePipeline(pdesc, fs_triangle, LoadShader(@"ps_shadeboost"), @"shadeboost"); - pdesc.colorAttachments[0].pixelFormat = ConvertPixelFormat(GSTexture::Format::FloatColor); - m_hdr_init_pipeline = MakePipeline(pdesc, fs_triangle, LoadShader(@"ps_copy_fs"), @"HDR Init"); + pdesc.colorAttachments[0].pixelFormat = ConvertPixelFormat(GSTexture::Format::HDRColor); + m_hdr_init_pipeline = MakePipeline(pdesc, fs_triangle, LoadShader(@"ps_hdr_init"), @"HDR Init"); pdesc.colorAttachments[0].pixelFormat = MTLPixelFormatInvalid; pdesc.stencilAttachmentPixelFormat = MTLPixelFormatDepth32Float_Stencil8; m_datm_pipeline[0] = MakePipeline(pdesc, fs_triangle, LoadShader(@"ps_datm0"), @"datm0"); @@ -794,7 +956,8 @@ bool GSDeviceMTL::Create(HostDisplay* display) case ShaderConvert::Count: case ShaderConvert::DATM_0: case ShaderConvert::DATM_1: - case ShaderConvert::MOD_256: + case ShaderConvert::HDR_INIT: + case ShaderConvert::HDR_RESOLVE: continue; case ShaderConvert::FLOAT32_TO_32_BITS: pdesc.colorAttachments[0].pixelFormat = ConvertPixelFormat(GSTexture::Format::UInt32); @@ -810,6 +973,10 @@ bool GSDeviceMTL::Create(HostDisplay* display) case ShaderConvert::RGBA8_TO_FLOAT24: case ShaderConvert::RGBA8_TO_FLOAT16: case ShaderConvert::RGB5A1_TO_FLOAT16: + case ShaderConvert::RGBA8_TO_FLOAT32_BILN: + case ShaderConvert::RGBA8_TO_FLOAT24_BILN: + case ShaderConvert::RGBA8_TO_FLOAT16_BILN: + case ShaderConvert::RGB5A1_TO_FLOAT16_BILN: pdesc.colorAttachments[0].pixelFormat = MTLPixelFormatInvalid; pdesc.depthAttachmentPixelFormat = ConvertPixelFormat(GSTexture::Format::DepthStencil); break; @@ -834,7 +1001,7 @@ bool GSDeviceMTL::Create(HostDisplay* display) } pdesc.colorAttachments[0].pixelFormat = ConvertPixelFormat(GSTexture::Format::Color); m_convert_pipeline_copy[0] = MakePipeline(pdesc, vs_convert, ps_copy, @"copy_color"); - pdesc.colorAttachments[0].pixelFormat = ConvertPixelFormat(GSTexture::Format::FloatColor); + pdesc.colorAttachments[0].pixelFormat = ConvertPixelFormat(GSTexture::Format::HDRColor); m_convert_pipeline_copy[1] = MakePipeline(pdesc, vs_convert, ps_copy, @"copy_hdr"); pdesc.colorAttachments[0].pixelFormat = MTLPixelFormatRGBA8Unorm; @@ -873,6 +1040,8 @@ bool GSDeviceMTL::Create(HostDisplay* display) m_imgui_pipeline = MakePipeline(pdesc, LoadShader(@"vs_imgui"), LoadShader(@"ps_imgui"), @"imgui"); if (!m_dev.features.texture_swizzle) m_imgui_pipeline_a8 = MakePipeline(pdesc, LoadShader(@"vs_imgui"), LoadShader(@"ps_imgui_a8"), @"imgui_a8"); + + [initCommands commit]; } catch (GSRecoverableError&) { @@ -928,11 +1097,29 @@ bool GSDeviceMTL::DownloadTexture(GSTexture* src, const GSVector4i& rect, GSText destinationOffset:0 destinationBytesPerRow:out_map.pitch destinationBytesPerImage:size]; + if (m_spin_timer) + [encoder updateFence:m_spin_fence]; [encoder endEncoding]; [cmdbuf popDebugGroup]; FlushEncoders(); - [cmdbuf waitUntilCompleted]; + if (@available(macOS 10.15, iOS 10.3, *)) + { + if (GSConfig.HWSpinGPUForReadbacks) + { + m_spin_manager.ReadbackRequested(); + m_spin_timer = 30; + } + } + if (GSConfig.HWSpinCPUForReadbacks) + { + while (!IsCommandBufferCompleted([cmdbuf status])) + ShortSpin(); + } + else + { + [cmdbuf waitUntilCompleted]; + } out_map.bits = static_cast([m_texture_download_buf contents]); g_perfmon.Put(GSPerfMon::Readbacks, 1); @@ -1052,6 +1239,9 @@ void GSDeviceMTL::RenderCopy(GSTexture* sTex, id pipelin void GSDeviceMTL::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* dTex, const GSVector4& dRect, ShaderConvert shader, bool linear) { @autoreleasepool { id pipeline; + + pxAssert(linear ? SupportsBilinear(shader) : SupportsNearest(shader)); + if (shader == ShaderConvert::COPY) pipeline = m_convert_pipeline_copy[dTex->GetFormat() == GSTexture::Format::Color ? 0 : 1]; else @@ -1088,7 +1278,7 @@ static_assert(offsetof(DisplayConstantBuffer, TimeAndPad.x) == offsetof(G void GSDeviceMTL::PresentRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* dTex, const GSVector4& dRect, PresentShader shader, float shaderTime, bool linear) { @autoreleasepool { - GSVector2i ds = dTex ? dTex->GetSize() : GSVector2i(m_display->GetWindowWidth(), m_display->GetWindowHeight()); + GSVector2i ds = dTex ? dTex->GetSize() : GSVector2i(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight()); DisplayConstantBuffer cb; cb.SetSource(sRect, sTex->GetSize()); cb.SetTarget(dRect, ds); @@ -1153,6 +1343,17 @@ static MTLBlendOperation ConvertBlendOp(GSDevice::BlendOp generic) static constexpr MTLColorWriteMask MTLColorWriteMaskRGB = MTLColorWriteMaskRed | MTLColorWriteMaskGreen | MTLColorWriteMaskBlue; +static GSMTLExpandType ConvertVSExpand(GSHWDrawConfig::VSExpand generic) +{ + switch (generic) + { + case GSHWDrawConfig::VSExpand::None: return GSMTLExpandType::None; + case GSHWDrawConfig::VSExpand::Point: return GSMTLExpandType::Point; + case GSHWDrawConfig::VSExpand::Line: return GSMTLExpandType::Line; + case GSHWDrawConfig::VSExpand::Sprite: return GSMTLExpandType::Sprite; + } +} + void GSDeviceMTL::MRESetHWPipelineState(GSHWDrawConfig::VSSelector vssel, GSHWDrawConfig::PSSelector pssel, GSHWDrawConfig::BlendState blend, GSHWDrawConfig::ColorMaskSelector cms) { PipelineSelectorExtrasMTL extras(blend, m_current_render.color_target, cms, m_current_render.depth_target, m_current_render.stencil_target); @@ -1174,6 +1375,7 @@ void GSDeviceMTL::MRESetHWPipelineState(GSHWDrawConfig::VSSelector vssel, GSHWDr vssel_mtl.fst = vssel.fst; vssel_mtl.iip = vssel.iip; vssel_mtl.point_size = vssel.point_size; + vssel_mtl.expand = ConvertVSExpand(vssel.expand); id vs = m_hw_vs[vssel_mtl.key]; id ps; @@ -1211,7 +1413,8 @@ void GSDeviceMTL::MRESetHWPipelineState(GSHWDrawConfig::VSSelector vssel, GSHWDr setFnConstantI(m_fn_constants, pssel.clr_hw, GSMTLConstantIndex_PS_CLR_HW); setFnConstantB(m_fn_constants, pssel.hdr, GSMTLConstantIndex_PS_HDR); setFnConstantB(m_fn_constants, pssel.colclip, GSMTLConstantIndex_PS_COLCLIP); - setFnConstantB(m_fn_constants, pssel.blend_mix, GSMTLConstantIndex_PS_BLEND_MIX); + setFnConstantI(m_fn_constants, pssel.blend_mix, GSMTLConstantIndex_PS_BLEND_MIX); + setFnConstantB(m_fn_constants, pssel.fixed_one_a, GSMTLConstantIndex_PS_FIXED_ONE_A); setFnConstantB(m_fn_constants, pssel.pabe, GSMTLConstantIndex_PS_PABE); setFnConstantB(m_fn_constants, pssel.no_color, GSMTLConstantIndex_PS_NO_COLOR); setFnConstantB(m_fn_constants, pssel.no_color1, GSMTLConstantIndex_PS_NO_COLOR1); @@ -1235,7 +1438,12 @@ void GSDeviceMTL::MRESetHWPipelineState(GSHWDrawConfig::VSSelector vssel, GSHWDr } MRCOwned pdesc = MRCTransfer([MTLRenderPipelineDescriptor new]); - [pdesc setVertexDescriptor:m_hw_vertex]; + if (vssel_mtl.point_size) + [pdesc setInputPrimitiveTopology:MTLPrimitiveTopologyClassPoint]; + if (vssel_mtl.expand == GSMTLExpandType::None) + [pdesc setVertexDescriptor:m_hw_vertex]; + else + [pdesc setInputPrimitiveTopology:MTLPrimitiveTopologyClassTriangle]; MTLRenderPipelineColorAttachmentDescriptor* color = [[pdesc colorAttachments] objectAtIndexedSubscript:0]; color.pixelFormat = ConvertPixelFormat(extras.rt); [pdesc setDepthAttachmentPixelFormat:extras.has_depth ? MTLPixelFormatDepth32Float_Stencil8 : MTLPixelFormatInvalid]; @@ -1247,6 +1455,7 @@ void GSDeviceMTL::MRESetHWPipelineState(GSHWDrawConfig::VSSelector vssel, GSHWDr color.rgbBlendOperation = MTLBlendOperationMin; color.sourceRGBBlendFactor = MTLBlendFactorOne; color.destinationRGBBlendFactor = MTLBlendFactorOne; + color.writeMask = MTLColorWriteMaskRed; } else if (extras.blend_enable && (extras.writemask & MTLColorWriteMaskRGB)) { @@ -1389,6 +1598,15 @@ void GSDeviceMTL::MRESetPipeline(id pipe) // MARK: - HW Render // Metal can't import GSDevice.h, but we should make sure the structs are at least compatible +static_assert(sizeof(GSVertex) == sizeof(GSMTLMainVertex)); +static_assert(offsetof(GSVertex, ST) == offsetof(GSMTLMainVertex, st)); +static_assert(offsetof(GSVertex, RGBAQ.R) == offsetof(GSMTLMainVertex, rgba)); +static_assert(offsetof(GSVertex, RGBAQ.Q) == offsetof(GSMTLMainVertex, q)); +static_assert(offsetof(GSVertex, XYZ.X) == offsetof(GSMTLMainVertex, xy)); +static_assert(offsetof(GSVertex, XYZ.Z) == offsetof(GSMTLMainVertex, z)); +static_assert(offsetof(GSVertex, UV) == offsetof(GSMTLMainVertex, uv)); +static_assert(offsetof(GSVertex, FOG) == offsetof(GSMTLMainVertex, fog)); + static_assert(sizeof(GSHWDrawConfig::VSConstantBuffer) == sizeof(GSMTLMainVSUniform)); static_assert(sizeof(GSHWDrawConfig::PSConstantBuffer) == sizeof(GSMTLMainPSUniform)); static_assert(offsetof(GSHWDrawConfig::VSConstantBuffer, vertex_scale) == offsetof(GSMTLMainVSUniform, vertex_scale)); @@ -1506,7 +1724,7 @@ void GSDeviceMTL::RenderHW(GSHWDrawConfig& config) if (config.ps.hdr) { GSVector2i size = config.rt->GetSize(); - hdr_rt = CreateRenderTarget(size.x, size.y, GSTexture::Format::FloatColor); + hdr_rt = CreateRenderTarget(size.x, size.y, GSTexture::Format::HDRColor); BeginRenderPass(@"HDR Init", hdr_rt, MTLLoadActionDontCare, nullptr, MTLLoadActionDontCare); RenderCopy(config.rt, m_hdr_init_pipeline, config.drawarea); rt = hdr_rt; @@ -1586,6 +1804,9 @@ void GSDeviceMTL::SendHWDraw(GSHWDrawConfig& config, id config.nindices / config.indices_per_prim, config.drawlist->size(), message.c_str()]]; #endif + + g_perfmon.Put(GSPerfMon::DrawCalls, config.drawlist->size()); + g_perfmon.Put(GSPerfMon::Barriers, config.drawlist->size()); for (size_t count = 0, p = 0, n = 0; n < config.drawlist->size(); p += count, ++n) { count = (*config.drawlist)[n] * config.indices_per_prim; @@ -1595,13 +1816,15 @@ void GSDeviceMTL::SendHWDraw(GSHWDrawConfig& config, id indexType:MTLIndexTypeUInt32 indexBuffer:buffer indexBufferOffset:off + p * sizeof(*config.indices)]; - g_perfmon.Put(GSPerfMon::DrawCalls, 1); } [enc popDebugGroup]; } else if (config.require_full_barrier) { - [enc pushDebugGroup:[NSString stringWithFormat:@"Full barrier split draw (%d prims)", config.nindices / config.indices_per_prim]]; + const u32 ndraws = config.nindices / config.indices_per_prim; + g_perfmon.Put(GSPerfMon::DrawCalls, ndraws); + g_perfmon.Put(GSPerfMon::Barriers, ndraws); + [enc pushDebugGroup:[NSString stringWithFormat:@"Full barrier split draw (%d prims)", ndraws]]; for (size_t p = 0; p < config.nindices; p += config.indices_per_prim) { textureBarrier(enc); @@ -1610,7 +1833,6 @@ void GSDeviceMTL::SendHWDraw(GSHWDrawConfig& config, id indexType:MTLIndexTypeUInt32 indexBuffer:buffer indexBufferOffset:off + p * sizeof(*config.indices)]; - g_perfmon.Put(GSPerfMon::DrawCalls, 1); } [enc popDebugGroup]; } @@ -1624,6 +1846,7 @@ void GSDeviceMTL::SendHWDraw(GSHWDrawConfig& config, id indexBuffer:buffer indexBufferOffset:off]; g_perfmon.Put(GSPerfMon::DrawCalls, 1); + g_perfmon.Put(GSPerfMon::Barriers, 1); } else { @@ -1752,7 +1975,7 @@ void GSDeviceMTL::RenderImGui(ImDrawData* data) [enc setVertexBuffer:map.gpu_buffer offset:map.gpu_offset atIndex:GSMTLBufferIndexVertices]; [enc setVertexBytes:&transform length:sizeof(transform) atIndex:GSMTLBufferIndexUniforms]; - simd::uint4 last_scissor = simd::make_uint4(0, 0, m_display->GetWindowWidth(), m_display->GetWindowHeight()); + simd::uint4 last_scissor = simd::make_uint4(0, 0, g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight()); simd::float2 fb_size = simd_float(last_scissor.zw); simd::float2 clip_off = ToSimd(data->DisplayPos); // (0,0) unless using multi-viewports simd::float2 clip_scale = ToSimd(data->FramebufferScale); // (1,1) unless using retina display which are often (2,2) diff --git a/pcsx2/GS/Renderers/Metal/GSMTLDeviceInfo.h b/pcsx2/GS/Renderers/Metal/GSMTLDeviceInfo.h index c0f8c1740a..87ca48a6f1 100644 --- a/pcsx2/GS/Renderers/Metal/GSMTLDeviceInfo.h +++ b/pcsx2/GS/Renderers/Metal/GSMTLDeviceInfo.h @@ -42,6 +42,7 @@ struct GSMTLDevice bool framebuffer_fetch; bool primid; bool slow_color_compression; ///< Color compression seems to slow down rt read on AMD + bool has_fast_half; MetalVersion shader_version; int max_texsize; }; diff --git a/pcsx2/GS/Renderers/Metal/GSMTLDeviceInfo.mm b/pcsx2/GS/Renderers/Metal/GSMTLDeviceInfo.mm index 9a8eafef7c..22cb6456be 100644 --- a/pcsx2/GS/Renderers/Metal/GSMTLDeviceInfo.mm +++ b/pcsx2/GS/Renderers/Metal/GSMTLDeviceInfo.mm @@ -152,6 +152,10 @@ GSMTLDevice::GSMTLDevice(MRCOwned> dev) if ([dev supportsFamily:MTLGPUFamilyApple1]) features.framebuffer_fetch = true; + if (@available(macOS 10.15, iOS 13.0, *)) + if ([dev supportsFamily:MTLGPUFamilyMac2] || [dev supportsFamily:MTLGPUFamilyApple1]) + features.has_fast_half = true; // Approximate guess + features.shader_version = detectLibraryVersion(shaders); if (features.framebuffer_fetch && features.shader_version < MetalVersion::Metal23) { diff --git a/pcsx2/GS/Renderers/Metal/GSMTLShaderCommon.h b/pcsx2/GS/Renderers/Metal/GSMTLShaderCommon.h index 96877b70f5..f4d89490dd 100644 --- a/pcsx2/GS/Renderers/Metal/GSMTLShaderCommon.h +++ b/pcsx2/GS/Renderers/Metal/GSMTLShaderCommon.h @@ -19,7 +19,7 @@ using namespace metal; -constant uchar2 SCALING_FACTOR [[function_constant(GSMTLConstantIndex_SCALING_FACTOR)]]; +constant float2 SCALING_FACTOR [[function_constant(GSMTLConstantIndex_SCALING_FACTOR)]]; struct ConvertShaderData { @@ -58,3 +58,7 @@ static inline float4 convert_depth16_rgba8(float value) uint val = uint(value * 0x1p32); return float4(uint4(val << 3, val >> 2, val >> 7, val >> 8) & uint4(0xf8, 0xf8, 0xf8, 0x80)); } + +#ifndef __HAVE_MUL24__ +template T mul24(T a, T b) { return a * b; } +#endif diff --git a/pcsx2/GS/Renderers/Metal/GSMTLSharedHeader.h b/pcsx2/GS/Renderers/Metal/GSMTLSharedHeader.h index fb26615b11..05634115fb 100644 --- a/pcsx2/GS/Renderers/Metal/GSMTLSharedHeader.h +++ b/pcsx2/GS/Renderers/Metal/GSMTLSharedHeader.h @@ -54,7 +54,25 @@ struct GSMTLPresentPSUniform struct GSMTLInterlacePSUniform { - vector_float2 ZrH; + vector_float4 ZrH; +}; + +struct GSMTLCASPSUniform +{ + vector_uint4 const0; + vector_uint4 const1; + vector_int2 srcOffset; +}; + +struct GSMTLMainVertex +{ + vector_float2 st; + vector_uchar4 rgba; + float q; + vector_ushort2 xy; + uint z; + vector_ushort2 uv; + unsigned char fog; }; struct GSMTLMainVSUniform @@ -111,13 +129,23 @@ enum GSMTLAttributes GSMTLAttributeIndexF, }; +enum class GSMTLExpandType : unsigned char +{ + None = 0, + Point = 1, + Line = 2, + Sprite = 3, +}; + enum GSMTLFnConstants { + GSMTLConstantIndex_CAS_SHARPEN_ONLY, GSMTLConstantIndex_SCALING_FACTOR, GSMTLConstantIndex_FRAMEBUFFER_FETCH, GSMTLConstantIndex_FST, GSMTLConstantIndex_IIP, GSMTLConstantIndex_VS_POINT_SIZE, + GSMTLConstantIndex_VS_EXPAND_TYPE, GSMTLConstantIndex_PS_AEM_FMT, GSMTLConstantIndex_PS_PAL_FMT, GSMTLConstantIndex_PS_DFMT, @@ -144,6 +172,7 @@ enum GSMTLFnConstants GSMTLConstantIndex_PS_HDR, GSMTLConstantIndex_PS_COLCLIP, GSMTLConstantIndex_PS_BLEND_MIX, + GSMTLConstantIndex_PS_FIXED_ONE_A, GSMTLConstantIndex_PS_PABE, GSMTLConstantIndex_PS_NO_COLOR, GSMTLConstantIndex_PS_NO_COLOR1, diff --git a/pcsx2/GS/Renderers/Metal/GSTextureMTL.h b/pcsx2/GS/Renderers/Metal/GSTextureMTL.h index 11007f99eb..e471457aff 100644 --- a/pcsx2/GS/Renderers/Metal/GSTextureMTL.h +++ b/pcsx2/GS/Renderers/Metal/GSTextureMTL.h @@ -74,7 +74,6 @@ public: void* MapWithPitch(const GSVector4i& r, int pitch, int layer); void Unmap() override; void GenerateMipmap() override; - bool Save(const std::string& fn) override; void Swap(GSTexture* tex) override; id GetTexture() { return m_texture; } }; diff --git a/pcsx2/GS/Renderers/Metal/GSTextureMTL.mm b/pcsx2/GS/Renderers/Metal/GSTextureMTL.mm index a016b6da98..9092bb91d8 100644 --- a/pcsx2/GS/Renderers/Metal/GSTextureMTL.mm +++ b/pcsx2/GS/Renderers/Metal/GSTextureMTL.mm @@ -189,12 +189,6 @@ void GSTextureMTL::GenerateMipmap() } }} -bool GSTextureMTL::Save(const std::string& fn) -{ - // TODO: Implement - return false; -} - void GSTextureMTL::Swap(GSTexture* other) { GSTexture::Swap(other); diff --git a/pcsx2/GS/Renderers/Metal/cas.metal b/pcsx2/GS/Renderers/Metal/cas.metal new file mode 100644 index 0000000000..b45c1f6c2a --- /dev/null +++ b/pcsx2/GS/Renderers/Metal/cas.metal @@ -0,0 +1,112 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#define A_GPU 1 +#define A_MSL 1 +#define A_HALF 1 + +#include "../../../../bin/resources/shaders/common/ffx_a.h" + +struct CASTextureF +{ + const thread texture2d& tex; + uint2 offset; +}; + +struct CASTextureH +{ + const thread texture2d& tex; + ushort2 offset; +}; + +#define CAS_TEXTURE CASTextureF +#define CAS_TEXTUREH CASTextureH + +A_STATIC AF3 CasLoad(CASTextureF tex, ASU2 coord) +{ + return tex.tex.read(AU2(coord) + tex.offset).rgb; +} +#define CasInput(r,g,b) + +A_STATIC AH3 CasLoadH(CASTextureH tex, ASW2 coord) +{ + return tex.tex.read(AW2(coord) + tex.offset).rgb; +} + +A_STATIC void CasInputH(inoutAH2 r, inoutAH2 g, inoutAH2 b){} + +#include "../../../../bin/resources/shaders/common/ffx_cas.h" + +#include "GSMTLShaderCommon.h" + +constant bool CAS_SHARPEN_ONLY [[function_constant(GSMTLConstantIndex_CAS_SHARPEN_ONLY)]]; + +kernel void CASFloat( + uint2 localID [[thread_position_in_threadgroup]], + uint2 workgroupID [[threadgroup_position_in_grid]], + texture2d input [[texture(0)]], + texture2d output [[texture(1)]], + constant GSMTLCASPSUniform& cb [[buffer(GSMTLBufferIndexUniforms)]]) +{ + // Do remapping of local xy in workgroup for a more PS-like swizzle pattern. + AU2 gxy = ARmp8x8(localID.x) + (workgroupID << 4); + const AU4 const0 = cb.const0; + const AU4 const1 = cb.const1; + const CASTextureF tex{input, AU2(cb.srcOffset)}; + + // Filter. + float r, g, b; + + CasFilter(tex, r, g, b, gxy, const0, const1, CAS_SHARPEN_ONLY); + output.write(float4(r, g, b, 1), gxy); + gxy.x += 8; + + CasFilter(tex, r, g, b, gxy, const0, const1, CAS_SHARPEN_ONLY); + output.write(float4(r, g, b, 1), gxy); + gxy.y += 8; + + CasFilter(tex, r, g, b, gxy, const0, const1, CAS_SHARPEN_ONLY); + output.write(float4(r, g, b, 1), gxy); + gxy.x -= 8; + + CasFilter(tex, r, g, b, gxy, const0, const1, CAS_SHARPEN_ONLY); + output.write(float4(r, g, b, 1), gxy); +} + +kernel void CASHalf( + uint2 localID [[thread_position_in_threadgroup]], + uint2 workgroupID [[threadgroup_position_in_grid]], + texture2d input [[texture(0)]], + texture2d output [[texture(1)]], + constant GSMTLCASPSUniform& cb [[buffer(GSMTLBufferIndexUniforms)]]) +{ + // Do remapping of local xy in workgroup for a more PS-like swizzle pattern. + AU2 gxy = ARmp8x8(localID.x) + (workgroupID << 4); + const AU4 const0 = cb.const0; + const AU4 const1 = cb.const1; + const CASTextureH tex{input, AW2(cb.srcOffset)}; + + // Filter. + half2 r, g, b; + + #pragma unroll + for (int i = 0; i < 2; i++) + { + CasFilterH(tex, r, g, b, gxy, const0, const1, CAS_SHARPEN_ONLY); + output.write(half4(r.x, g.x, b.x, 1), gxy); + output.write(half4(r.y, g.y, b.y, 1), gxy + AU2(8, 0)); + gxy.y += 8; + } +} diff --git a/pcsx2/GS/Renderers/Metal/convert.metal b/pcsx2/GS/Renderers/Metal/convert.metal index a8653371fe..a750f8f228 100644 --- a/pcsx2/GS/Renderers/Metal/convert.metal +++ b/pcsx2/GS/Renderers/Metal/convert.metal @@ -111,10 +111,16 @@ fragment float4 ps_primid_init_datm1(float4 p [[position]], DirectReadTextureIn< return tex.read(p).a < (127.5f / 255.f) ? -1 : FLT_MAX; } -fragment float4 ps_mod256(float4 p [[position]], DirectReadTextureIn tex) +fragment float4 ps_hdr_init(float4 p [[position]], DirectReadTextureIn tex) { - float4 c = round(tex.read(p) * 255.f); - return (c - 256.f * floor(c / 256.f)) / 255.f; + float4 in = tex.read(p); + return float4(round(in.rgb * 255.f) / 65535.f, in.a); +} + +fragment float4 ps_hdr_resolve(float4 p [[position]], DirectReadTextureIn tex) +{ + float4 in = tex.read(p); + return float4(float3(uint3(in.rgb * 65535.5f) & 255) / 255.f, in.a); } fragment float4 ps_filter_transparency(ConvertShaderData data [[stage_in]], ConvertPSRes res) @@ -150,35 +156,98 @@ fragment DepthOut ps_depth_copy(ConvertShaderData data [[stage_in]], ConvertPSDe return res.sample(data.t); } -static float pack_rgba8_depth(float4 unorm) +static float rgba8_to_depth32(half4 unorm) { - return float(as_type(uchar4(unorm * 255.f + 0.5f))) * 0x1p-32f; + return float(as_type(uchar4(unorm * 255.5h))) * 0x1p-32f; } -fragment DepthOut ps_convert_rgba8_float32(ConvertShaderData data [[stage_in]], ConvertPSRes res) +static float rgba8_to_depth24(half4 unorm) { - return pack_rgba8_depth(res.sample(data.t)); + return rgba8_to_depth32(half4(unorm.rgb, 0)); } -fragment DepthOut ps_convert_rgba8_float24(ConvertShaderData data [[stage_in]], ConvertPSRes res) +static float rgba8_to_depth16(half4 unorm) { - // Same as above but without the alpha channel (24 bits Z) - return pack_rgba8_depth(float4(res.sample(data.t).rgb, 0)); + return float(as_type(uchar2(unorm.rg * 255.5h))) * 0x1p-32f; } -fragment DepthOut ps_convert_rgba8_float16(ConvertShaderData data [[stage_in]], ConvertPSRes res) +static float rgb5a1_to_depth16(half4 unorm) { - return float(as_type(uchar2(res.sample(data.t).rg * 255.f + 0.5f))) * 0x1p-32; -} - -fragment DepthOut ps_convert_rgb5a1_float16(ConvertShaderData data [[stage_in]], ConvertPSRes res) -{ - uint4 cu = uint4(res.sample(data.t) * 255.f + 0.5f); + uint4 cu = uint4(unorm * 255.5h); uint out = (cu.x >> 3) | ((cu.y << 2) & 0x03e0) | ((cu.z << 7) & 0x7c00) | ((cu.w << 8) & 0x8000); - return float(out) * 0x1p-32; + return float(out) * 0x1p-32f; } -fragment float4 ps_convert_rgba_8i(ConvertShaderData data [[stage_in]], ConvertPSRes res, +struct ConvertToDepthRes +{ + texture2d texture [[texture(GSMTLTextureIndexNonHW)]]; + half4 sample(float2 coord) + { + // RGBA bilinear on a depth texture is a bad idea, and should never be used + // Might as well let the compiler optimize a bit by telling it exactly what sampler we'll be using here + constexpr sampler s(coord::normalized, filter::nearest, address::clamp_to_edge); + return texture.sample(s, coord); + } + + /// Manual bilinear sampling where we do the bilinear *after* rgba → depth conversion + template + float sample_biln(float2 coord) + { + uint2 dimensions = uint2(texture.get_width(), texture.get_height()); + float2 top_left_f = coord * float2(dimensions) - 0.5f; + int2 top_left = int2(floor(top_left_f)); + uint4 coords = uint4(clamp(int4(top_left, top_left + 1), 0, int2(dimensions - 1).xyxy)); + float2 mix_vals = fract(top_left_f); + + float depthTL = convert(texture.read(coords.xy)); + float depthTR = convert(texture.read(coords.zy)); + float depthBL = convert(texture.read(coords.xw)); + float depthBR = convert(texture.read(coords.zw)); + return mix(mix(depthTL, depthTR, mix_vals.x), mix(depthBL, depthBR, mix_vals.x), mix_vals.y); + } +}; + +fragment DepthOut ps_convert_rgba8_float32(ConvertShaderData data [[stage_in]], ConvertToDepthRes res) +{ + return rgba8_to_depth32(res.sample(data.t)); +} + +fragment DepthOut ps_convert_rgba8_float24(ConvertShaderData data [[stage_in]], ConvertToDepthRes res) +{ + return rgba8_to_depth24(res.sample(data.t)); +} + +fragment DepthOut ps_convert_rgba8_float16(ConvertShaderData data [[stage_in]], ConvertToDepthRes res) +{ + return rgba8_to_depth16(res.sample(data.t)); +} + +fragment DepthOut ps_convert_rgb5a1_float16(ConvertShaderData data [[stage_in]], ConvertToDepthRes res) +{ + return rgb5a1_to_depth16(res.sample(data.t)); +} + +fragment DepthOut ps_convert_rgba8_float32_biln(ConvertShaderData data [[stage_in]], ConvertToDepthRes res) +{ + return res.sample_biln(data.t); +} + +fragment DepthOut ps_convert_rgba8_float24_biln(ConvertShaderData data [[stage_in]], ConvertToDepthRes res) +{ + return res.sample_biln(data.t); +} + +fragment DepthOut ps_convert_rgba8_float16_biln(ConvertShaderData data [[stage_in]], ConvertToDepthRes res) +{ + return res.sample_biln(data.t); +} + +fragment DepthOut ps_convert_rgb5a1_float16_biln(ConvertShaderData data [[stage_in]], ConvertToDepthRes res) +{ + return res.sample_biln(data.t); +} + +fragment float4 ps_convert_rgba_8i(ConvertShaderData data [[stage_in]], DirectReadTextureIn res, constant GSMTLConvertPSUniform& uniform [[buffer(GSMTLBufferIndexUniforms)]]) { // Convert a RGBA texture into a 8 bits packed texture @@ -190,60 +259,28 @@ fragment float4 ps_convert_rgba_8i(ConvertShaderData data [[stage_in]], ConvertP // 1: 8 R | 8 B // 2: 8 G | 8 A // 3: 8 G | 8 A - float c; + uint2 pos = uint2(data.p.xy); - uint2 sel = uint2(data.p.xy) % uint2(16, 16); - uint2 tb = (uint2(data.p.xy) & ~uint2(15, 3)) >> 1; + // Collapse separate R G B A areas into their base pixel + uint2 block = (pos & ~uint2(15, 3)) >> 1; + uint2 subblock = pos & uint2(7, 1); + uint2 coord = block | subblock; - uint ty = tb.y | (uint(data.p.y) & 1); - uint txN = tb.x | (uint(data.p.x) & 7); - uint txH = tb.x | ((uint(data.p.x) + 4) & 7); + // Apply offset to cols 1 and 2 + uint is_col23 = pos.y & 4; + uint is_col13 = pos.y & 2; + uint is_col12 = is_col23 ^ (is_col13 << 1); + coord.x ^= is_col12; // If cols 1 or 2, flip bit 3 of x - txN *= SCALING_FACTOR.x; - txH *= SCALING_FACTOR.x; - ty *= SCALING_FACTOR.y; - - // TODO investigate texture gather - float4 cN = res.texture.read(uint2(txN, ty)); - float4 cH = res.texture.read(uint2(txH, ty)); - - if ((sel.y & 4) == 0) - { - // Column 0 and 2 - if ((sel.y & 2) == 0) - { - if ((sel.x & 8) == 0) - c = cN.r; - else - c = cN.b; - } - else - { - if ((sel.x & 8) == 0) - c = cH.g; - else - c = cH.a; - } - } + if (any(floor(SCALING_FACTOR) != SCALING_FACTOR)) + coord = uint2(float2(coord) * SCALING_FACTOR); else - { - // Column 1 and 3 - if ((sel.y & 2) == 0) - { - if ((sel.x & 8) == 0) - c = cH.r; - else - c = cH.b; - } - else - { - if ((sel.x & 8) == 0) - c = cN.g; - else - c = cN.a; - } - } - return float4(c); + coord = mul24(coord, uint2(SCALING_FACTOR)); + + float4 pixel = res.tex.read(coord); + float2 sel0 = (pos.y & 2) == 0 ? pixel.rb : pixel.ga; + float sel1 = (pos.x & 8) == 0 ? sel0.x : sel0.y; + return float4(sel1); } fragment float4 ps_yuv(ConvertShaderData data [[stage_in]], ConvertPSRes res, diff --git a/pcsx2/GS/Renderers/Metal/interlace.metal b/pcsx2/GS/Renderers/Metal/interlace.metal index 8ab2afe89d..7013e71c4b 100644 --- a/pcsx2/GS/Renderers/Metal/interlace.metal +++ b/pcsx2/GS/Renderers/Metal/interlace.metal @@ -17,33 +17,174 @@ using namespace metal; + +// Weave shader fragment float4 ps_interlace0(ConvertShaderData data [[stage_in]], ConvertPSRes res, constant GSMTLInterlacePSUniform& uniform [[buffer(GSMTLBufferIndexUniforms)]]) { - if ((int(data.p.y) & 1) == 0) + const int idx = int(uniform.ZrH.x); // buffer index passed from CPU + const int field = idx & 1; // current field + const int vpos = int(data.p.y); // vertical position of destination texture + + if ((vpos & 1) == field) + return res.sample(data.t); + else discard_fragment(); - return res.sample(data.t); + + return float4(0.0f, 0.0f, 0.0f, 0.0f); } -fragment float4 ps_interlace1(ConvertShaderData data [[stage_in]], ConvertPSRes res, - constant GSMTLInterlacePSUniform& uniform [[buffer(GSMTLBufferIndexUniforms)]]) + +// Bob shader +fragment float4 ps_interlace1(ConvertShaderData data [[stage_in]], ConvertPSRes res) { - if ((int(data.p.y) & 1) != 0) - discard_fragment(); return res.sample(data.t); } + +// Blend shader fragment float4 ps_interlace2(ConvertShaderData data [[stage_in]], ConvertPSRes res, constant GSMTLInterlacePSUniform& uniform [[buffer(GSMTLBufferIndexUniforms)]]) { - float4 c0 = res.sample(data.t - uniform.ZrH); + float2 vstep = float2(0.0f, uniform.ZrH.y); + float4 c0 = res.sample(data.t - vstep); float4 c1 = res.sample(data.t); - float4 c2 = res.sample(data.t + uniform.ZrH); + float4 c2 = res.sample(data.t + vstep); return (c0 + c1 * 2.f + c2) / 4.f; } -fragment float4 ps_interlace3(ConvertShaderData data [[stage_in]], ConvertPSRes res) + +// MAD shader - buffering +fragment float4 ps_interlace3(ConvertShaderData data [[stage_in]], ConvertPSRes res, + constant GSMTLInterlacePSUniform& uniform [[buffer(GSMTLBufferIndexUniforms)]]) { - return res.sample(data.t); + // We take half the lines from the current frame and stores them in the MAD frame buffer. + // the MAD frame buffer is split in 2 consecutive banks of 2 fields each, the fields in each bank + // are interleaved (top field at even lines and bottom field at odd lines). + // When the source texture has an odd vres, the first line of bank 1 would be an odd index + // causing the wrong lines to be discarded, so a vertical offset (lofs) is added to the vertical + // position of the destination texture to force the proper field alignment + + const int idx = int(uniform.ZrH.x); // buffer index passed from CPU + const int bank = idx >> 1; // current bank + const int field = idx & 1; // current field + const int vres = int(uniform.ZrH.z) >> 1; // vertical resolution of source texture + const int lofs = ((((vres + 1) >> 1) << 1) - vres) & bank; // line alignment offset for bank 1 + const int vpos = int(data.p.y) + lofs; // vertical position of destination texture + const float2 bofs = float2(0.0f, 0.5f * bank); // vertical offset of the current bank relative to source texture size + const float2 vscale = float2(1.0f, 2.0f); // scaling factor from source to destination texture + const float2 optr = data.t - bofs; // used to check if the current destination line is within the current bank + const float2 iptr = optr * vscale; // pointer to the current pixel in the source texture + + // if the index of current destination line belongs to the current fiels we update it, otherwise + // we leave the old line in the destination buffer + if ((optr.y >= 0.0f) && (optr.y < 0.5f) && ((vpos & 1) == field)) + return res.sample(iptr); + else + discard_fragment(); + + return float4(0.0f, 0.0f, 0.0f, 0.0f); } + +// MAD shader - reconstruction +fragment float4 ps_interlace4(ConvertShaderData data [[stage_in]], ConvertPSRes res, + constant GSMTLInterlacePSUniform& uniform [[buffer(GSMTLBufferIndexUniforms)]]) +{ + const int idx = int(uniform.ZrH.x); // buffer index passed from CPU + const int field = idx & 1; // current field + const int vpos = int(data.p.y); // vertical position of destination texture + const float sensitivity = uniform.ZrH.w; // passed from CPU, higher values mean more likely to use weave + const float3 motion_thr = float3(1.0, 1.0, 1.0) * sensitivity; // + const float2 bofs = float2(0.0f, 0.5f); // position of the bank 1 relative to source texture size + const float2 vscale = float2(1.0f, 0.5f); // scaling factor from source to destination texture + const float2 lofs = float2(0.0f, uniform.ZrH.y) * vscale; // distance between two adjacent lines relative to source texture size + const float2 iptr = data.t * vscale; // pointer to the current pixel in the source texture + + + float2 p_t0; // pointer to current pixel (missing or not) from most recent frame + float2 p_t1; // pointer to current pixel (missing or not) from one frame back + float2 p_t2; // pointer to current pixel (missing or not) from two frames back + float2 p_t3; // pointer to current pixel (missing or not) from three frames back + + switch (idx) + { + case 1: + p_t0 = iptr; + p_t1 = iptr; + p_t2 = iptr + bofs; + p_t3 = iptr + bofs; + break; + case 2: + p_t0 = iptr + bofs; + p_t1 = iptr; + p_t2 = iptr; + p_t3 = iptr + bofs; + break; + case 3: + p_t0 = iptr + bofs; + p_t1 = iptr + bofs; + p_t2 = iptr; + p_t3 = iptr; + break; + default: + p_t0 = iptr; + p_t1 = iptr + bofs; + p_t2 = iptr + bofs; + p_t3 = iptr; + break; + } + + // calculating motion, only relevant for missing lines where the "center line" is pointed by p_t1 + + float4 hn = res.sample(p_t0 - lofs); // new high pixel + float4 cn = res.sample(p_t1); // new center pixel + float4 ln = res.sample(p_t0 + lofs); // new low pixel + + float4 ho = res.sample(p_t2 - lofs); // old high pixel + float4 co = res.sample(p_t3); // old center pixel + float4 lo = res.sample(p_t2 + lofs); // old low pixel + + float3 mh = hn.rgb - ho.rgb; + float3 mc = cn.rgb - co.rgb; + float3 ml = ln.rgb - lo.rgb; + + mh = max(mh, -mh) - motion_thr; + mc = max(mc, -mc) - motion_thr; + ml = max(ml, -ml) - motion_thr; + + #if 1 // use this code to evaluate each color motion separately + float mh_max = max(max(mh.x, mh.y), mh.z); + float mc_max = max(max(mc.x, mc.y), mc.z); + float ml_max = max(max(ml.x, ml.y), ml.z); + #else // use this code to evaluate average color motion + float mh_max = mh.x + mh.y + mh.z; + float mc_max = mc.x + mc.y + mc.z; + float ml_max = ml.x + ml.y + ml.z; + #endif + + // selecting deinterlacing output + + if ((vpos & 1) == field) + { + // output coordinate present on current field + return res.sample(p_t0); + } + else if ((iptr.y > 0.5f - lofs.y) || (iptr.y < 0.0 + lofs.y)) + { + // top and bottom lines are always weaved + return cn; + } + else + { + // missing line needs to be reconstructed + if (((mh_max > 0.0f) || (ml_max > 0.0f)) || (mc_max > 0.0f)) + // high motion -> interpolate pixels above and below + return (hn + ln) / 2.0f; + else + // low motion -> weave + return cn; + } + + return float4(0.0f, 0.0f, 0.0f, 0.0f); +} diff --git a/pcsx2/GS/Renderers/Metal/misc.metal b/pcsx2/GS/Renderers/Metal/misc.metal new file mode 100644 index 0000000000..0a83a8ac89 --- /dev/null +++ b/pcsx2/GS/Renderers/Metal/misc.metal @@ -0,0 +1,24 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2021 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +kernel void waste_time(constant uint& cycles [[buffer(0)]], device uint* spin [[buffer(1)]]) +{ + uint value = spin[0]; + // The compiler doesn't know, but spin[0] == 0, so this loop won't actually go anywhere + for (uint i = 0; i < cycles; i++) + value = spin[value]; + // Store the result back to the buffer so the compiler can't optimize it away + spin[0] = value; +} diff --git a/pcsx2/GS/Renderers/Metal/present.metal b/pcsx2/GS/Renderers/Metal/present.metal index 899a046508..96b5084770 100644 --- a/pcsx2/GS/Renderers/Metal/present.metal +++ b/pcsx2/GS/Renderers/Metal/present.metal @@ -68,7 +68,7 @@ fragment float4 ps_filter_complex(ConvertShaderData data [[stage_in]], ConvertPS float2 texdim = float2(res.texture.get_width(), res.texture.get_height()); float factor = (0.9f - 0.4f * cos(2.f * M_PI_F * data.t.y * texdim.y)); float ycoord = (floor(data.t.y * texdim.y) + 0.5f) / texdim.y; - + return factor * res.sample(float2(data.t.x, ycoord)); } diff --git a/pcsx2/GS/Renderers/Metal/tfx.metal b/pcsx2/GS/Renderers/Metal/tfx.metal index 8c61f7b649..378ec0918a 100644 --- a/pcsx2/GS/Renderers/Metal/tfx.metal +++ b/pcsx2/GS/Renderers/Metal/tfx.metal @@ -23,6 +23,7 @@ constant bool HAS_FBFETCH [[function_constant(GSMTLConstantIndex_FRAME constant bool FST [[function_constant(GSMTLConstantIndex_FST)]]; constant bool IIP [[function_constant(GSMTLConstantIndex_IIP)]]; constant bool VS_POINT_SIZE [[function_constant(GSMTLConstantIndex_VS_POINT_SIZE)]]; +constant uint VS_EXPAND_TYPE_RAW [[function_constant(GSMTLConstantIndex_VS_EXPAND_TYPE)]]; constant uint PS_AEM_FMT [[function_constant(GSMTLConstantIndex_PS_AEM_FMT)]]; constant uint PS_PAL_FMT [[function_constant(GSMTLConstantIndex_PS_PAL_FMT)]]; constant uint PS_DFMT [[function_constant(GSMTLConstantIndex_PS_DFMT)]]; @@ -48,7 +49,8 @@ constant uint PS_BLEND_D [[function_constant(GSMTLConstantIndex_PS_BL constant uint PS_CLR_HW [[function_constant(GSMTLConstantIndex_PS_CLR_HW)]]; constant bool PS_HDR [[function_constant(GSMTLConstantIndex_PS_HDR)]]; constant bool PS_COLCLIP [[function_constant(GSMTLConstantIndex_PS_COLCLIP)]]; -constant bool PS_BLEND_MIX [[function_constant(GSMTLConstantIndex_PS_BLEND_MIX)]]; +constant uint PS_BLEND_MIX [[function_constant(GSMTLConstantIndex_PS_BLEND_MIX)]]; +constant bool PS_FIXED_ONE_A [[function_constant(GSMTLConstantIndex_PS_FIXED_ONE_A)]]; constant bool PS_PABE [[function_constant(GSMTLConstantIndex_PS_PABE)]]; constant bool PS_NO_COLOR [[function_constant(GSMTLConstantIndex_PS_NO_COLOR)]]; constant bool PS_NO_COLOR1 [[function_constant(GSMTLConstantIndex_PS_NO_COLOR1)]]; @@ -66,6 +68,8 @@ constant bool PS_POINT_SAMPLER [[function_constant(GSMTLConstantIndex_PS_PO constant bool PS_INVALID_TEX0 [[function_constant(GSMTLConstantIndex_PS_INVALID_TEX0)]]; constant uint PS_SCANMSK [[function_constant(GSMTLConstantIndex_PS_SCANMSK)]]; +constant GSMTLExpandType VS_EXPAND_TYPE = static_cast(VS_EXPAND_TYPE_RAW); + #if defined(__METAL_MACOS__) && __METAL_VERSION__ >= 220 #define PRIMID_SUPPORT 1 #else @@ -190,6 +194,93 @@ vertex MainVSOut vs_main(MainVSIn v [[stage_in]], constant GSMTLMainVSUniform& c return vs_main_run(v, cb); } +static MainVSIn load_vertex(GSMTLMainVertex base) +{ + MainVSIn out; + out.st = base.st; + out.c = float4(base.rgba); + out.q = base.q; + out.p = uint2(base.xy); + out.z = base.z; + out.uv = uint2(base.uv); + out.f = float4(static_cast(base.fog) / 255.f); + return out; +} + +vertex MainVSOut vs_main_expand( + uint vid [[vertex_id]], + device const GSMTLMainVertex* vertices [[buffer(GSMTLBufferIndexHWVertices)]], + constant GSMTLMainVSUniform& cb [[buffer(GSMTLBufferIndexHWUniforms)]]) +{ + switch (VS_EXPAND_TYPE) + { + case GSMTLExpandType::None: + return vs_main_run(load_vertex(vertices[vid]), cb); + case GSMTLExpandType::Point: + { + MainVSOut point = vs_main_run(load_vertex(vertices[vid >> 2]), cb); + if (vid & 1) + point.p.x += cb.point_size.x; + if (vid & 2) + point.p.y += cb.point_size.y; + return point; + } + case GSMTLExpandType::Line: + { + uint vid_base = vid >> 2; + bool is_bottom = vid & 2; + bool is_right = vid & 1; + // All lines will be a pair of vertices next to each other + // Since Metal uses provoking vertex first, the bottom point will be the lower of the two + uint vid_other = is_bottom ? vid_base + 1 : vid_base - 1; + MainVSOut point = vs_main_run(load_vertex(vertices[vid_base]), cb); + MainVSOut other = vs_main_run(load_vertex(vertices[vid_other]), cb); + + float2 line_vector = normalize(point.p.xy - other.p.xy); + float2 line_normal = float2(line_vector.y, -line_vector.x); + float2 line_width = (line_normal * cb.point_size) / 2; + // line_normal is inverted for bottom point + float2 offset = (is_bottom ^ is_right) ? line_width : -line_width; + point.p.xy += offset; + + // Lines will be run as (0 1 2) (1 2 3) + // This means that both triangles will have a point based off the top line point as their first point + // So we don't have to do anything for !IIP + + return point; + } + case GSMTLExpandType::Sprite: + { + uint vid_base = vid >> 1; + bool is_bottom = vid & 2; + bool is_right = vid & 1; + // Sprite points are always in pairs + uint vid_lt = vid_base & ~1; + uint vid_rb = vid_base | 1; + + MainVSOut lt = vs_main_run(load_vertex(vertices[vid_lt]), cb); + MainVSOut rb = vs_main_run(load_vertex(vertices[vid_rb]), cb); + MainVSOut out = rb; + + if (!is_right) + { + out.p.x = lt.p.x; + out.t.x = lt.t.x; + out.ti.xz = lt.ti.xz; + } + + if (!is_bottom) + { + out.p.y = lt.p.y; + out.t.y = lt.t.y; + out.ti.yw = lt.ti.yw; + } + + return out; + } + } +} + // MARK: - Fragment functions constexpr sampler palette_sampler(filter::nearest, address::clamp_to_edge); @@ -411,7 +502,7 @@ struct PSMain float4 sample_depth(float2 st) { - float2 uv_f = float2(clamp_wrap_uv_depth(ushort2(st))) * (float2(SCALING_FACTOR) * float2(1.f / 16.f)); + float2 uv_f = float2(clamp_wrap_uv_depth(ushort2(st))) * (SCALING_FACTOR * float2(1.f / 16.f)); ushort2 uv = ushort2(uv_f); float4 t = float4(0); @@ -634,6 +725,7 @@ struct PSMain if (!FST && PS_INVALID_TEX0) { st = (in.t.xy * cb.wh.xy) / (in.t.w * cb.wh.zw); + st_int = (in.ti.zw * cb.wh.xy) / (in.t.w * cb.wh.zw); } else if (!FST) { @@ -676,7 +768,7 @@ struct PSMain void ps_fbmask(thread float4& C) { if (PS_FBMASK) - C = float4((uint4(C) & ~cb.fbmask) | (uint4(current_color * 255.5) & cb.fbmask)); + C = float4((uint4(int4(C)) & (cb.fbmask ^ 0xff)) | (uint4(current_color * 255.5) & cb.fbmask)); } void ps_dither(thread float4& C) @@ -687,14 +779,14 @@ struct PSMain if (PS_DITHER == 2) fpos = ushort2(in.p.xy); else - fpos = ushort2(in.p.xy / float2(SCALING_FACTOR)); + fpos = ushort2(in.p.xy / SCALING_FACTOR); C.rgb += cb.dither_matrix[fpos.y & 3][fpos.x & 3]; } void ps_color_clamp_wrap(thread float4& C) { // When dithering the bottom 3 bits become meaningless and cause lines in the picture so we need to limit the color depth on dithered items - if (!SW_BLEND && !PS_DITHER) + if (!SW_BLEND && !PS_DITHER && !PS_FBMASK) return; // Correct the Color value based on the output format @@ -707,10 +799,10 @@ struct PSMain // Warning: normally blending equation is mult(A, B) = A * B >> 7. GPU have the full accuracy // GS: Color = 1, Alpha = 255 => output 1 // GPU: Color = 1/255, Alpha = 255/255 * 255/128 => output 1.9921875 - if (PS_DFMT == FMT_16 && (PS_HDR || !PS_BLEND_MIX)) + if (PS_DFMT == FMT_16 && PS_BLEND_MIX == 0) // In 16 bits format, only 5 bits of colors are used. It impacts shadows computation of Castlevania C.rgb = float3(short3(C.rgb) & 0xF8); - else if (PS_COLCLIP && !PS_HDR) + else if (PS_COLCLIP || PS_HDR) C.rgb = float3(short3(C.rgb) & 0xFF); } @@ -720,12 +812,19 @@ struct PSMain return selector == 0 ? zero : selector == 1 ? one : two; } - void ps_blend(thread float4& Color, float As) + void ps_blend(thread float4& Color, thread float& As) { if (SW_BLEND) { + // PABE + if (PS_PABE) + { + // No blending so early exit + if (As < 1.f) + return; + } - float Ad = PS_DFMT == FMT_24 ? 1.f : trunc(current_color.a * 255.5f) / 128.f; + float Ad = trunc(current_color.a * 255.5f) / 128.f; float3 Cd = trunc(current_color.rgb * 255.5f); float3 Cs = Color.rgb; @@ -735,16 +834,52 @@ struct PSMain float C = pick(PS_BLEND_C, As, Ad, cb.alpha_fix); float3 D = pick(PS_BLEND_D, Cs, Cd, float3(0.f)); - if (PS_BLEND_MIX) - C = min(C, 1.f); + // As/Af clamp alpha for Blend mix + // We shouldn't clamp blend mix with clr1 as we want alpha higher + float C_clamped = C; + if (PS_BLEND_MIX > 0 && PS_CLR_HW != 1) + C_clamped = min(C_clamped, 1.f); if (PS_BLEND_A == PS_BLEND_B) Color.rgb = D; + // In blend_mix, HW adds on some alpha factor * dst. + // Truncating here wouldn't quite get the right result because it prevents the <1 bit here from combining with a <1 bit in dst to form a ≥1 amount that pushes over the truncation. + // Instead, apply an offset to convert HW's round to a floor. + // Since alpha is in 1/128 increments, subtracting (0.5 - 0.5/128 == 127/256) would get us what we want if GPUs blended in full precision. + // But they don't. Details here: https://github.com/PCSX2/pcsx2/pull/6809#issuecomment-1211473399 + // Based on the scripts at the above link, the ideal choice for Intel GPUs is 126/256, AMD 120/256. Nvidia is a lost cause. + // 124/256 seems like a reasonable compromise, providing the correct answer 99.3% of the time on Intel (vs 99.6% for 126/256), and 97% of the time on AMD (vs 97.4% for 120/256). + else if (PS_BLEND_MIX == 2) + Color.rgb = ((A - B) * C_clamped + D) + (124.f/256.f); + else if (PS_BLEND_MIX == 1) + Color.rgb = ((A - B) * C_clamped + D) - (124.f/256.f); else Color.rgb = trunc((A - B) * C + D); - if (PS_PABE) - Color.rgb = (As >= 1.f) ? Color.rgb : Cs; + if (PS_CLR_HW == 1) + { + // Replace Af with As so we can do proper compensation for Alpha. + if (PS_BLEND_C == 2) + As = cb.alpha_fix; + // Subtract 1 for alpha to compensate for the changed equation, + // if c.rgb > 255.0f then we further need to adjust alpha accordingly, + // we pick the lowest overflow from all colors because it's the safest, + // we divide by 255 the color because we don't know Cd value, + // changed alpha should only be done for hw blend. + float min_color = min(min(Color.r, Color.g), Color.b); + float alpha_compensate = max(1.f, min_color / 255.f); + As -= alpha_compensate; + } + else if (PS_CLR_HW == 2) + { + // Compensate slightly for Cd*(As + 1) - Cs*As. + // The initial factor we chose is 1 (0.00392) + // as that is the minimum color Cd can be, + // then we multiply by alpha to get the minimum + // blended value it can be. + float color_compensate = 1.f * (C + 1.f); + Color.rgb -= float3(color_compensate); + } } else { @@ -811,7 +946,14 @@ struct PSMain } // Must be done before alpha correction - float alpha_blend = SW_AD_TO_HW ? (PS_DFMT == FMT_24 ? 1.f : trunc(current_color.a * 255.5f) / 128.f) : (C.a / 128.f); + + // AA (Fixed one) will output a coverage of 1.0 as alpha + if (PS_FIXED_ONE_A) + { + C.a = 128.0f; + } + + float alpha_blend = SW_AD_TO_HW ? (trunc(current_color.a * 255.5f) / 128.f) : (C.a / 128.f); if (PS_DFMT == FMT_16) { @@ -848,7 +990,7 @@ struct PSMain ps_fbmask(C); if (PS_COLOR0) - out.c0 = C / 255.f; + out.c0 = PS_HDR ? float4(C.rgb / 65535.f, C.a / 255.f) : C / 255.f; if (PS_COLOR0 && PS_ONLY_ALPHA) out.c0.rgb = 0; if (PS_COLOR1) diff --git a/pcsx2/GS/Renderers/Null/GSDeviceNull.h b/pcsx2/GS/Renderers/Null/GSDeviceNull.h index d1ff6f8aa6..b6fe656f85 100644 --- a/pcsx2/GS/Renderers/Null/GSDeviceNull.h +++ b/pcsx2/GS/Renderers/Null/GSDeviceNull.h @@ -24,7 +24,7 @@ private: GSTexture* CreateSurface(GSTexture::Type type, int w, int h, GSTexture::Format format); void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) {} - void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0) {} + void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0, int bufIdx = 0) {} u16 ConvertBlendEnum(u16 generic) { return 0xFFFF; } public: diff --git a/pcsx2/GS/Renderers/OpenGL/GLLoader.cpp b/pcsx2/GS/Renderers/OpenGL/GLLoader.cpp index 96e800e6f2..86bfc1acf2 100644 --- a/pcsx2/GS/Renderers/OpenGL/GLLoader.cpp +++ b/pcsx2/GS/Renderers/OpenGL/GLLoader.cpp @@ -122,7 +122,7 @@ namespace Emulate_DSA // Replace function pointer to emulate DSA behavior void Init() { - fprintf(stderr, "DSA is not supported. Expect slower performance\n"); + Console.Warning("DSA is not supported. Expect slower performance"); glBindTextureUnit = BindTextureUnit; glCreateTextures = CreateTexture; glTextureStorage2D = TextureStorage; @@ -139,15 +139,6 @@ namespace Emulate_DSA namespace GLLoader { - -#define fprintf_once(out, ...) \ - do \ - if (s_first_load) \ - fprintf(out, __VA_ARGS__); \ - while (0); - - bool s_first_load = true; - bool vendor_id_amd = false; bool vendor_id_nvidia = false; bool vendor_id_intel = false; @@ -157,14 +148,9 @@ namespace GLLoader bool has_dual_source_blend = false; bool found_framebuffer_fetch = false; bool found_geometry_shader = true; // we require GL3.3 so geometry must be supported by default - bool found_GL_ARB_clear_texture = false; // DX11 GPU bool found_GL_ARB_gpu_shader5 = false; // Require IvyBridge - bool found_GL_ARB_shader_image_load_store = false; // Intel IB. Nvidia/AMD miss Mesa implementation. - - // In case sparse2 isn't supported - bool found_compatible_GL_ARB_sparse_texture2 = false; - bool found_compatible_sparse_depth = false; + bool found_GL_ARB_texture_barrier = false; static bool mandatory(const std::string& ext) { @@ -183,11 +169,11 @@ namespace GLLoader if (!found) { - fprintf_once(stdout, "INFO: %s is NOT SUPPORTED\n", name.c_str()); + DevCon.Warning("INFO: %s is NOT SUPPORTED", name.c_str()); } else { - fprintf_once(stdout, "INFO: %s is available\n", name.c_str()); + DevCon.WriteLn("INFO: %s is available", name.c_str()); } std::string opt("override_"); @@ -276,20 +262,13 @@ namespace GLLoader // Extra { - // Bonus - optional("GL_ARB_sparse_texture"); - optional("GL_ARB_sparse_texture2"); // GL4.0 found_GL_ARB_gpu_shader5 = optional("GL_ARB_gpu_shader5"); - // GL4.2 - found_GL_ARB_shader_image_load_store = optional("GL_ARB_shader_image_load_store"); - // GL4.4 - found_GL_ARB_clear_texture = optional("GL_ARB_clear_texture"); // GL4.5 optional("GL_ARB_direct_state_access"); // Mandatory for the advance HW renderer effect. Unfortunately Mesa LLVMPIPE/SWR renderers doesn't support this extension. // Rendering might be corrupted but it could be good enough for test/virtual machine. - optional("GL_ARB_texture_barrier"); + found_GL_ARB_texture_barrier = optional("GL_ARB_texture_barrier"); has_dual_source_blend = GLAD_GL_VERSION_3_2 || GLAD_GL_ARB_blend_func_extended; found_framebuffer_fetch = GLAD_GL_EXT_shader_framebuffer_fetch || GLAD_GL_ARM_shader_framebuffer_fetch; @@ -300,32 +279,17 @@ namespace GLLoader } } - if (vendor_id_amd) - { - fprintf_once(stderr, "The OpenGL hardware renderer is slow on AMD GPUs due to an inefficient driver.\n" - "Check out the link below for further information.\n" - "https://github.com/PCSX2/pcsx2/wiki/OpenGL-and-AMD-GPUs---All-you-need-to-know\n"); - } - - if (vendor_id_intel && (!GLExtension::Has("GL_ARB_texture_barrier") || !GLExtension::Has("GL_ARB_direct_state_access"))) - { - // Assume that driver support is good when texture barrier and DSA is supported, disable the log then. - fprintf_once(stderr, "The OpenGL renderer is inefficient on Intel GPUs due to an inefficient driver.\n" - "Check out the link below for further information.\n" - "https://github.com/PCSX2/pcsx2/wiki/OpenGL-and-Intel-GPUs-All-you-need-to-know\n"); - } - if (!GLExtension::Has("GL_ARB_viewport_array")) { glScissorIndexed = ReplaceGL::ScissorIndexed; glViewportIndexedf = ReplaceGL::ViewportIndexedf; - fprintf_once(stderr, "GL_ARB_viewport_array is not supported! Function pointer will be replaced\n"); + Console.Warning("GL_ARB_viewport_array is not supported! Function pointer will be replaced"); } if (!GLExtension::Has("GL_ARB_texture_barrier")) { glTextureBarrier = ReplaceGL::TextureBarrier; - fprintf_once(stderr, "GL_ARB_texture_barrier is not supported! Blending emulation will not be supported\n"); + Console.Warning("GL_ARB_texture_barrier is not supported! Blending emulation will not be supported"); } #ifdef _WIN32 @@ -339,70 +303,6 @@ namespace GLLoader return true; } - bool is_sparse2_compatible(const char* name, GLenum internal_fmt, int x_max, int y_max) - { - GLint index_count = 0; - glGetInternalformativ(GL_TEXTURE_2D, internal_fmt, GL_NUM_VIRTUAL_PAGE_SIZES_ARB, 1, &index_count); - if (!index_count) - { - fprintf_once(stdout, "%s isn't sparse compatible. No index found\n", name); - return false; - } - - GLint x, y; - glGetInternalformativ(GL_TEXTURE_2D, internal_fmt, GL_VIRTUAL_PAGE_SIZE_X_ARB, 1, &x); - glGetInternalformativ(GL_TEXTURE_2D, internal_fmt, GL_VIRTUAL_PAGE_SIZE_Y_ARB, 1, &y); - if (x > x_max && y > y_max) - { - fprintf_once(stdout, "%s isn't sparse compatible. Page size (%d,%d) is too big (%d, %d)\n", - name, x, y, x_max, y_max); - return false; - } - - return true; - } - - static void check_sparse_compatibility() - { - if (!GLExtension::Has("GL_ARB_sparse_texture") || - !GLExtension::Has("GL_EXT_direct_state_access") || - theApp.GetConfigI("override_GL_ARB_sparse_texture") != 1) - { - found_compatible_GL_ARB_sparse_texture2 = false; - found_compatible_sparse_depth = false; - - return; - } - - found_compatible_GL_ARB_sparse_texture2 = true; - if (!GLExtension::Has("GL_ARB_sparse_texture2")) - { - // Only check format from GSTextureOGL - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_R8", GL_R8, 256, 256); - - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_R16UI", GL_R16UI, 256, 128); - - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_R32UI", GL_R32UI, 128, 128); - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_R32I", GL_R32I, 128, 128); - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_RGBA8", GL_RGBA8, 128, 128); - - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_RGBA16", GL_RGBA16, 128, 64); - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_RGBA16I", GL_RGBA16I, 128, 64); - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_RGBA16UI", GL_RGBA16UI, 128, 64); - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_RGBA16F", GL_RGBA16F, 128, 64); - - found_compatible_GL_ARB_sparse_texture2 &= is_sparse2_compatible("GL_RGBA32F", GL_RGBA32F, 64, 64); - } - - // Can fit in 128x64 but 128x128 is enough - // Disable sparse depth for AMD. Bad driver strikes again. - // driver reports a compatible sparse format for depth texture but it isn't attachable to a frame buffer. - found_compatible_sparse_depth = !vendor_id_amd && is_sparse2_compatible("GL_DEPTH32F_STENCIL8", GL_DEPTH32F_STENCIL8, 128, 128); - - fprintf_once(stdout, "INFO: sparse color texture is %s\n", found_compatible_GL_ARB_sparse_texture2 ? "available" : "NOT SUPPORTED"); - fprintf_once(stdout, "INFO: sparse depth texture is %s\n", found_compatible_sparse_depth ? "available" : "NOT SUPPORTED"); - } - bool check_gl_requirements() { if (!check_gl_version(3, 3)) @@ -411,12 +311,6 @@ namespace GLLoader if (!check_gl_supported_extension()) return false; - // Bonus for sparse texture - check_sparse_compatibility(); - - fprintf_once(stdout, "\n"); - - s_first_load = false; return true; } } // namespace GLLoader diff --git a/pcsx2/GS/Renderers/OpenGL/GLLoader.h b/pcsx2/GS/Renderers/OpenGL/GLLoader.h index 827c870f9a..ecdb6c00df 100644 --- a/pcsx2/GS/Renderers/OpenGL/GLLoader.h +++ b/pcsx2/GS/Renderers/OpenGL/GLLoader.h @@ -43,9 +43,5 @@ namespace GLLoader extern bool found_framebuffer_fetch; extern bool found_geometry_shader; extern bool found_GL_ARB_gpu_shader5; - extern bool found_GL_ARB_shader_image_load_store; - extern bool found_GL_ARB_clear_texture; - - extern bool found_compatible_GL_ARB_sparse_texture2; - extern bool found_compatible_sparse_depth; + extern bool found_GL_ARB_texture_barrier; } // namespace GLLoader diff --git a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp index 43e259399e..c7bc65a984 100644 --- a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp +++ b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp @@ -22,6 +22,8 @@ #include "GS/GSUtil.h" #include "Host.h" #include "HostDisplay.h" +#include "ShaderCacheVersion.h" +#include "IconsFontAwesome5.h" #include #include #include @@ -56,8 +58,6 @@ GSDeviceOGL::GSDeviceOGL() #ifdef ENABLE_OGL_DEBUG m_debug_gl_file = fopen("GS_opengl_debug.txt", "w"); #endif - - m_disable_hw_gl_draw = theApp.GetConfigB("disable_hw_gl_draw"); } GSDeviceOGL::~GSDeviceOGL() @@ -191,12 +191,12 @@ GSTexture* GSDeviceOGL::CreateSurface(GSTexture::Type type, int width, int heigh return new GSTextureOGL(type, width, height, levels, format, m_fbo_read); } -bool GSDeviceOGL::Create(HostDisplay* display) +bool GSDeviceOGL::Create() { - if (!GSDevice::Create(display)) + if (!GSDevice::Create()) return false; - if (display->GetRenderAPI() != HostDisplay::RenderAPI::OpenGL) + if (g_host_display->GetRenderAPI() != RenderAPI::OpenGL) return false; // Check openGL requirement as soon as possible so we can switch to another @@ -206,7 +206,7 @@ bool GSDeviceOGL::Create(HostDisplay* display) if (!theApp.GetConfigB("disable_shader_cache")) { - if (!m_shader_cache.Open(false, EmuFolders::Cache, SHADER_VERSION)) + if (!m_shader_cache.Open(false, EmuFolders::Cache, SHADER_CACHE_VERSION)) Console.Warning("Shader cache failed to open."); } else @@ -217,11 +217,16 @@ bool GSDeviceOGL::Create(HostDisplay* display) // optional features based on context m_features.broken_point_sampler = GLLoader::vendor_id_amd; m_features.geometry_shader = GLLoader::found_geometry_shader; - m_features.image_load_store = GLLoader::found_GL_ARB_shader_image_load_store && GLLoader::found_GL_ARB_clear_texture; - m_features.texture_barrier = GSConfig.OverrideTextureBarriers != 0 || GLLoader::found_framebuffer_fetch; + m_features.primitive_id = true; + if (GSConfig.OverrideTextureBarriers == 0) + m_features.texture_barrier = GLLoader::found_framebuffer_fetch; // Force Disabled + else if (GSConfig.OverrideTextureBarriers == 1) + m_features.texture_barrier = true; // Force Enabled + else + m_features.texture_barrier = GLLoader::found_framebuffer_fetch || GLLoader::found_GL_ARB_texture_barrier; m_features.provoking_vertex_last = true; - m_features.dxt_textures = GL_EXT_texture_compression_s3tc; - m_features.bptc_textures = GL_VERSION_4_2 || GL_ARB_texture_compression_bptc || GL_EXT_texture_compression_bptc; + m_features.dxt_textures = GLAD_GL_EXT_texture_compression_s3tc; + m_features.bptc_textures = GLAD_GL_VERSION_4_2 || GLAD_GL_ARB_texture_compression_bptc || GLAD_GL_EXT_texture_compression_bptc; m_features.prefer_new_textures = false; m_features.framebuffer_fetch = GLLoader::found_framebuffer_fetch; m_features.dual_source_blend = GLLoader::has_dual_source_blend && !GSConfig.DisableDualSourceBlend; @@ -231,7 +236,7 @@ bool GSDeviceOGL::Create(HostDisplay* display) GLint point_range[2] = {}; glGetIntegerv(GL_ALIASED_POINT_SIZE_RANGE, point_range); - m_features.point_expand = (point_range[0] <= static_cast(GSConfig.UpscaleMultiplier) && point_range[1] >= static_cast(GSConfig.UpscaleMultiplier)); + m_features.point_expand = (point_range[0] <= GSConfig.UpscaleMultiplier && point_range[1] >= GSConfig.UpscaleMultiplier); Console.WriteLn("Using %s for point expansion.", m_features.point_expand ? "hardware" : "geometry shaders"); @@ -314,6 +319,10 @@ bool GSDeviceOGL::Create(HostDisplay* display) return false; } + // Force UBOs to be uploaded on first use. + std::memset(&m_vs_cb_cache, 0xFF, sizeof(m_vs_cb_cache)); + std::memset(&m_ps_cb_cache, 0xFF, sizeof(m_ps_cb_cache)); + // rebind because of VAO state m_vertex_stream_buffer->Bind(); m_index_stream_buffer->Bind(); @@ -348,29 +357,31 @@ bool GSDeviceOGL::Create(HostDisplay* display) } } + // these all share the same vertex shader + const auto convert_glsl = Host::ReadResourceFileToString("shaders/opengl/convert.glsl"); + if (!convert_glsl.has_value()) + { + Host::ReportErrorAsync("GS", "Failed to read shaders/opengl/convert.glsl."); + return false; + } + // **************************************************************** // convert // **************************************************************** { GL_PUSH("GSDeviceOGL::Convert"); - // these all share the same vertex shader - const auto shader = Host::ReadResourceFileToString("shaders/opengl/convert.glsl"); - if (!shader.has_value()) - { - Host::ReportErrorAsync("GS", "Failed to read shaders/opengl/convert.glsl."); - return false; - } - m_convert.vs = GetShaderSource("vs_main", GL_VERTEX_SHADER, m_shader_common_header, *shader, {}); + + m_convert.vs = GetShaderSource("vs_main", GL_VERTEX_SHADER, m_shader_common_header, *convert_glsl, {}); for (size_t i = 0; i < std::size(m_convert.ps); i++) { const char* name = shaderName(static_cast(i)); const std::string macro_sel = (static_cast(i) == ShaderConvert::RGBA_TO_8I) ? - StringUtil::StdStringFromFormat("#define PS_SCALE_FACTOR %d\n", GSConfig.UpscaleMultiplier) : + fmt::format("#define PS_SCALE_FACTOR {}\n", GSConfig.UpscaleMultiplier) : std::string(); - const std::string ps(GetShaderSource(name, GL_FRAGMENT_SHADER, m_shader_common_header, *shader, macro_sel)); + const std::string ps(GetShaderSource(name, GL_FRAGMENT_SHADER, m_shader_common_header, *convert_glsl, macro_sel)); if (!m_shader_cache.GetProgram(&m_convert.ps[i], m_convert.vs, {}, ps)) return false; m_convert.ps[i].SetFormattedName("Convert pipe %s", name); @@ -444,7 +455,7 @@ bool GSDeviceOGL::Create(HostDisplay* display) for (size_t i = 0; i < std::size(m_merge_obj.ps); i++) { - const std::string ps(GetShaderSource(StringUtil::StdStringFromFormat("ps_main%d", i), GL_FRAGMENT_SHADER, m_shader_common_header, *shader, {})); + const std::string ps(GetShaderSource(fmt::format("ps_main{}", i), GL_FRAGMENT_SHADER, m_shader_common_header, *shader, {})); if (!m_shader_cache.GetProgram(&m_merge_obj.ps[i], m_convert.vs, {}, ps)) return false; m_merge_obj.ps[i].SetFormattedName("Merge pipe %zu", i); @@ -467,7 +478,7 @@ bool GSDeviceOGL::Create(HostDisplay* display) for (size_t i = 0; i < std::size(m_interlace.ps); i++) { - const std::string ps(GetShaderSource(StringUtil::StdStringFromFormat("ps_main%d", i), GL_FRAGMENT_SHADER, m_shader_common_header, *shader, {})); + const std::string ps(GetShaderSource(fmt::format("ps_main{}", i), GL_FRAGMENT_SHADER, m_shader_common_header, *shader, {})); if (!m_shader_cache.GetProgram(&m_interlace.ps[i], m_convert.vs, {}, ps)) return false; m_interlace.ps[i].SetFormattedName("Merge pipe %zu", i); @@ -495,6 +506,12 @@ bool GSDeviceOGL::Create(HostDisplay* display) m_shadeboost.ps.SetName("Shadeboost pipe"); } + if (!CreateCASPrograms() && GSConfig.CASMode != GSCASMode::Disabled) + { + Host::AddIconOSDMessage("CASUnsupported", ICON_FA_EXCLAMATION_TRIANGLE, + "CAS is not available, your graphics driver does not supported the required functionality.", 10.0f); + } + // **************************************************************** // rasterization configuration // **************************************************************** @@ -522,6 +539,15 @@ bool GSDeviceOGL::Create(HostDisplay* display) m_date.dss = new GSDepthStencilOGL(); m_date.dss->EnableStencil(); m_date.dss->SetStencil(GL_ALWAYS, GL_REPLACE); + + for (size_t i = 0; i < std::size(m_date.primid_ps); i++) + { + const std::string ps(GetShaderSource( + fmt::format("ps_stencil_image_init_{}", i), + GL_FRAGMENT_SHADER, m_shader_common_header, *convert_glsl, {})); + m_shader_cache.GetProgram(&m_date.primid_ps[i], m_convert.vs, {}, ps); + m_date.primid_ps[i].SetFormattedName("PrimID Destination Alpha Init %d", i); + } } // **************************************************************** @@ -649,7 +675,7 @@ void GSDeviceOGL::RestoreAPIState() glBlendEquationSeparate(GLState::eq_RGB, GL_FUNC_ADD); glBlendFuncSeparate(GLState::f_sRGB, GLState::f_dRGB, GL_ONE, GL_ZERO); - + const float bf = static_cast(GLState::bf) / 128.0f; glBlendColor(bf, bf, bf, bf); @@ -682,12 +708,16 @@ void GSDeviceOGL::RestoreAPIState() glStencilOp(GL_KEEP, GL_KEEP, GLState::stencil_pass); glBindSampler(0, GLState::ps_ss); - + for (GLuint i = 0; i < sizeof(GLState::tex_unit) / sizeof(GLState::tex_unit[0]); i++) glBindTextureUnit(i, GLState::tex_unit[i]); if (GLState::point_size) glEnable(GL_PROGRAM_POINT_SIZE); + + // Force UBOs to be reuploaded, we don't know what else was bound there. + std::memset(&m_vs_cb_cache, 0xFF, sizeof(m_vs_cb_cache)); + std::memset(&m_ps_cb_cache, 0xFF, sizeof(m_ps_cb_cache)); } void GSDeviceOGL::DrawPrimitive() @@ -698,25 +728,19 @@ void GSDeviceOGL::DrawPrimitive() void GSDeviceOGL::DrawIndexedPrimitive() { - if (!m_disable_hw_gl_draw) - { - g_perfmon.Put(GSPerfMon::DrawCalls, 1); - glDrawElementsBaseVertex(m_draw_topology, static_cast(m_index.count), GL_UNSIGNED_INT, - reinterpret_cast(static_cast(m_index.start) * sizeof(u32)), static_cast(m_vertex.start)); - } + g_perfmon.Put(GSPerfMon::DrawCalls, 1); + glDrawElementsBaseVertex(m_draw_topology, static_cast(m_index.count), GL_UNSIGNED_INT, + reinterpret_cast(static_cast(m_index.start) * sizeof(u32)), static_cast(m_vertex.start)); } void GSDeviceOGL::DrawIndexedPrimitive(int offset, int count) { //ASSERT(offset + count <= (int)m_index.count); - if (!m_disable_hw_gl_draw) - { - g_perfmon.Put(GSPerfMon::DrawCalls, 1); - glDrawElementsBaseVertex(m_draw_topology, count, GL_UNSIGNED_INT, - reinterpret_cast((static_cast(m_index.start) + static_cast(offset)) * sizeof(u32)), - static_cast(m_vertex.start)); - } + g_perfmon.Put(GSPerfMon::DrawCalls, 1); + glDrawElementsBaseVertex(m_draw_topology, count, GL_UNSIGNED_INT, + reinterpret_cast((static_cast(m_index.start) + static_cast(offset)) * sizeof(u32)), + static_cast(m_vertex.start)); } void GSDeviceOGL::ClearRenderTarget(GSTexture* t, const GSVector4& c) @@ -774,7 +798,7 @@ void GSDeviceOGL::InvalidateRenderTarget(GSTexture* t) { OMSetFBO(m_fbo); - if (T->GetType() == GSTexture::Type::DepthStencil || T->GetType() == GSTexture::Type::SparseDepthStencil) + if (T->GetType() == GSTexture::Type::DepthStencil) { OMAttachDs(T); const GLenum attachments[] = {GL_DEPTH_STENCIL_ATTACHMENT}; @@ -798,41 +822,26 @@ void GSDeviceOGL::ClearDepth(GSTexture* t) GL_PUSH("Clear Depth %d", T->GetID()); - if (0 && GLLoader::found_GL_ARB_clear_texture) - { - // I don't know what the driver does but it creates - // some slowdowns on Harry Potter PS - // Maybe it triggers some texture relocations, or maybe - // it clears also the stencil value (2 times slower) - // - // Let's disable this code for the moment. + OMSetFBO(m_fbo); + // RT must be detached, if RT is too small, depth won't be fully cleared + // AT tolenico 2 map clip bug + OMAttachRt(NULL); + OMAttachDs(T); - // Don't bother with Depth_Stencil insanity - T->Clear(NULL); + // TODO: check size of scissor before toggling it + glDisable(GL_SCISSOR_TEST); + const float c = 0.0f; + if (GLState::depth_mask) + { + glClearBufferfv(GL_DEPTH, 0, &c); } else { - OMSetFBO(m_fbo); - // RT must be detached, if RT is too small, depth won't be fully cleared - // AT tolenico 2 map clip bug - OMAttachRt(NULL); - OMAttachDs(T); - - // TODO: check size of scissor before toggling it - glDisable(GL_SCISSOR_TEST); - const float c = 0.0f; - if (GLState::depth_mask) - { - glClearBufferfv(GL_DEPTH, 0, &c); - } - else - { - glDepthMask(true); - glClearBufferfv(GL_DEPTH, 0, &c); - glDepthMask(false); - } - glEnable(GL_SCISSOR_TEST); + glDepthMask(true); + glClearBufferfv(GL_DEPTH, 0, &c); + glDepthMask(false); } + glEnable(GL_SCISSOR_TEST); } void GSDeviceOGL::ClearStencil(GSTexture* t, u8 c) @@ -874,7 +883,7 @@ GLuint GSDeviceOGL::CreateSampler(PSSamplerSelector sel) } glSamplerParameterf(sampler, GL_TEXTURE_MIN_LOD, -1000.0f); - glSamplerParameterf(sampler, GL_TEXTURE_MAX_LOD, sel.lodclamp ? 0.0f : 1000.0f); + glSamplerParameterf(sampler, GL_TEXTURE_MAX_LOD, sel.lodclamp ? 0.25f : 1000.0f); if (sel.tau) glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_REPEAT); @@ -888,7 +897,7 @@ GLuint GSDeviceOGL::CreateSampler(PSSamplerSelector sel) glSamplerParameteri(sampler, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); const int anisotropy = GSConfig.MaxAnisotropy; - if (anisotropy && sel.aniso) + if (anisotropy > 1 && sel.aniso) { if (GLExtension::Has("GL_ARB_texture_filter_anisotropic")) glSamplerParameterf(sampler, GL_TEXTURE_MAX_ANISOTROPY, (float)anisotropy); @@ -933,39 +942,15 @@ GSDepthStencilOGL* GSDeviceOGL::CreateDepthStencil(OMDepthStencilSelector dssel) return dss; } -void GSDeviceOGL::InitPrimDateTexture(GSTexture* rt, const GSVector4i& area) +GSTexture* GSDeviceOGL::InitPrimDateTexture(GSTexture* rt, const GSVector4i& area, bool datm) { const GSVector2i& rtsize = rt->GetSize(); - // Create a texture to avoid the useless clean@0 - if (m_date.t == NULL) - m_date.t = CreateTexture(rtsize.x, rtsize.y, false, GSTexture::Format::PrimID); + GSTexture* tex = CreateRenderTarget(rtsize.x, rtsize.y, GSTexture::Format::PrimID, false); - // Clean with the max signed value - const int max_int = 0x7FFFFFFF; - static_cast(m_date.t)->Clear(&max_int, area); - - glBindImageTexture(3, static_cast(m_date.t)->GetID(), 0, false, 0, GL_READ_WRITE, GL_R32I); -#ifdef ENABLE_OGL_DEBUG - // Help to see the texture in apitrace - PSSetShaderResource(3, m_date.t); -#endif -} - -void GSDeviceOGL::RecycleDateTexture() -{ - if (m_date.t) - { - //static_cast(m_date.t)->Save(format("/tmp/date_adv_%04ld.csv", GSState::s_n)); - - Recycle(m_date.t); - m_date.t = NULL; - } -} - -void GSDeviceOGL::Barrier(GLbitfield b) -{ - glMemoryBarrier(b); + GL_PUSH("PrimID Destination Alpha Clear"); + StretchRect(rt, GSVector4(area) / GSVector4(rtsize).xyxy(), tex, GSVector4(area), m_date.primid_ps[datm], false); + return tex; } std::string GSDeviceOGL::GetShaderSource(const std::string_view& entry, GLenum type, const std::string_view& common_header, const std::string_view& glsl_h_code, const std::string_view& macro_sel) @@ -995,16 +980,6 @@ std::string GSDeviceOGL::GenGlslHeader(const std::string_view& entry, GLenum typ if (GLLoader::found_GL_ARB_gpu_shader5) header += "#extension GL_ARB_gpu_shader5 : enable\n"; - if (GLLoader::found_GL_ARB_shader_image_load_store) - { - // Need GL version 420 - header += "#extension GL_ARB_shader_image_load_store: require\n"; - } - else - { - header += "#define DISABLE_GL42_image\n"; - } - if (m_features.framebuffer_fetch) header += "#define HAS_FRAMEBUFFER_FETCH 1\n"; else @@ -1051,11 +1026,11 @@ std::string GSDeviceOGL::GetVSSource(VSSelector sel) Console.WriteLn("Compiling new vertex shader with selector 0x%" PRIX64, sel.key); #endif - std::string macro = StringUtil::StdStringFromFormat("#define VS_INT_FST %d\n", sel.int_fst) - + StringUtil::StdStringFromFormat("#define VS_IIP %d\n", sel.iip) - + StringUtil::StdStringFromFormat("#define VS_POINT_SIZE %d\n", sel.point_size); + std::string macro = fmt::format("#define VS_INT_FST {}\n", static_cast(sel.int_fst)) + + fmt::format("#define VS_IIP {}\n", static_cast(sel.iip)) + + fmt::format("#define VS_POINT_SIZE {}\n", static_cast(sel.point_size)); if (sel.point_size) - macro += StringUtil::StdStringFromFormat("#define VS_POINT_SIZE_VALUE %d\n", GSConfig.UpscaleMultiplier); + macro += fmt::format("#define VS_POINT_SIZE_VALUE {}\n", GSConfig.UpscaleMultiplier); std::string src = GenGlslHeader("vs_main", GL_VERTEX_SHADER, macro); src += m_shader_common_header; @@ -1069,9 +1044,9 @@ std::string GSDeviceOGL::GetGSSource(GSSelector sel) Console.WriteLn("Compiling new geometry shader with selector 0x%" PRIX64, sel.key); #endif - std::string macro = StringUtil::StdStringFromFormat("#define GS_POINT %d\n", sel.point) - + StringUtil::StdStringFromFormat("#define GS_LINE %d\n", sel.line) - + StringUtil::StdStringFromFormat("#define GS_IIP %d\n", sel.iip); + std::string macro = fmt::format("#define GS_POINT {}\n", static_cast(sel.point)) + + fmt::format("#define GS_LINE {}\n", static_cast(sel.line)) + + fmt::format("#define GS_IIP {}\n", static_cast(sel.iip)); std::string src = GenGlslHeader("gs_main", GL_GEOMETRY_SHADER, macro); src += m_shader_common_header; @@ -1085,52 +1060,53 @@ std::string GSDeviceOGL::GetPSSource(const PSSelector& sel) Console.WriteLn("Compiling new pixel shader with selector 0x%" PRIX64 "%08X", sel.key_hi, sel.key_lo); #endif - std::string macro = StringUtil::StdStringFromFormat("#define PS_FST %d\n", sel.fst) - + StringUtil::StdStringFromFormat("#define PS_WMS %d\n", sel.wms) - + StringUtil::StdStringFromFormat("#define PS_WMT %d\n", sel.wmt) - + StringUtil::StdStringFromFormat("#define PS_AEM_FMT %d\n", sel.aem_fmt) - + StringUtil::StdStringFromFormat("#define PS_PAL_FMT %d\n", sel.pal_fmt) - + StringUtil::StdStringFromFormat("#define PS_DFMT %d\n", sel.dfmt) - + StringUtil::StdStringFromFormat("#define PS_DEPTH_FMT %d\n", sel.depth_fmt) - + StringUtil::StdStringFromFormat("#define PS_CHANNEL_FETCH %d\n", sel.channel) - + StringUtil::StdStringFromFormat("#define PS_URBAN_CHAOS_HLE %d\n", sel.urban_chaos_hle) - + StringUtil::StdStringFromFormat("#define PS_TALES_OF_ABYSS_HLE %d\n", sel.tales_of_abyss_hle) - + StringUtil::StdStringFromFormat("#define PS_TEX_IS_FB %d\n", sel.tex_is_fb) - + StringUtil::StdStringFromFormat("#define PS_INVALID_TEX0 %d\n", sel.invalid_tex0) - + StringUtil::StdStringFromFormat("#define PS_AEM %d\n", sel.aem) - + StringUtil::StdStringFromFormat("#define PS_TFX %d\n", sel.tfx) - + StringUtil::StdStringFromFormat("#define PS_TCC %d\n", sel.tcc) - + StringUtil::StdStringFromFormat("#define PS_ATST %d\n", sel.atst) - + StringUtil::StdStringFromFormat("#define PS_FOG %d\n", sel.fog) - + StringUtil::StdStringFromFormat("#define PS_CLR_HW %d\n", sel.clr_hw) - + StringUtil::StdStringFromFormat("#define PS_FBA %d\n", sel.fba) - + StringUtil::StdStringFromFormat("#define PS_LTF %d\n", sel.ltf) - + StringUtil::StdStringFromFormat("#define PS_AUTOMATIC_LOD %d\n", sel.automatic_lod) - + StringUtil::StdStringFromFormat("#define PS_MANUAL_LOD %d\n", sel.manual_lod) - + StringUtil::StdStringFromFormat("#define PS_COLCLIP %d\n", sel.colclip) - + StringUtil::StdStringFromFormat("#define PS_DATE %d\n", sel.date) - + StringUtil::StdStringFromFormat("#define PS_TCOFFSETHACK %d\n", sel.tcoffsethack) - + StringUtil::StdStringFromFormat("#define PS_POINT_SAMPLER %d\n", sel.point_sampler) - + StringUtil::StdStringFromFormat("#define PS_BLEND_A %d\n", sel.blend_a) - + StringUtil::StdStringFromFormat("#define PS_BLEND_B %d\n", sel.blend_b) - + StringUtil::StdStringFromFormat("#define PS_BLEND_C %d\n", sel.blend_c) - + StringUtil::StdStringFromFormat("#define PS_BLEND_D %d\n", sel.blend_d) - + StringUtil::StdStringFromFormat("#define PS_IIP %d\n", sel.iip) - + StringUtil::StdStringFromFormat("#define PS_SHUFFLE %d\n", sel.shuffle) - + StringUtil::StdStringFromFormat("#define PS_READ_BA %d\n", sel.read_ba) - + StringUtil::StdStringFromFormat("#define PS_WRITE_RG %d\n", sel.write_rg) - + StringUtil::StdStringFromFormat("#define PS_FBMASK %d\n", sel.fbmask) - + StringUtil::StdStringFromFormat("#define PS_HDR %d\n", sel.hdr) - + StringUtil::StdStringFromFormat("#define PS_DITHER %d\n", sel.dither) - + StringUtil::StdStringFromFormat("#define PS_ZCLAMP %d\n", sel.zclamp) - + StringUtil::StdStringFromFormat("#define PS_BLEND_MIX %d\n", sel.blend_mix) - + StringUtil::StdStringFromFormat("#define PS_PABE %d\n", sel.pabe) - + StringUtil::StdStringFromFormat("#define PS_SCANMSK %d\n", sel.scanmsk) - + StringUtil::StdStringFromFormat("#define PS_SCALE_FACTOR %d\n", GSConfig.UpscaleMultiplier) - + StringUtil::StdStringFromFormat("#define PS_NO_COLOR %d\n", sel.no_color) - + StringUtil::StdStringFromFormat("#define PS_NO_COLOR1 %d\n", sel.no_color1) - + StringUtil::StdStringFromFormat("#define PS_NO_ABLEND %d\n", sel.no_ablend) - + StringUtil::StdStringFromFormat("#define PS_ONLY_ALPHA %d\n", sel.only_alpha) + std::string macro = fmt::format("#define PS_FST {}\n", sel.fst) + + fmt::format("#define PS_WMS {}\n", sel.wms) + + fmt::format("#define PS_WMT {}\n", sel.wmt) + + fmt::format("#define PS_AEM_FMT {}\n", sel.aem_fmt) + + fmt::format("#define PS_PAL_FMT {}\n", sel.pal_fmt) + + fmt::format("#define PS_DFMT {}\n", sel.dfmt) + + fmt::format("#define PS_DEPTH_FMT {}\n", sel.depth_fmt) + + fmt::format("#define PS_CHANNEL_FETCH {}\n", sel.channel) + + fmt::format("#define PS_URBAN_CHAOS_HLE {}\n", sel.urban_chaos_hle) + + fmt::format("#define PS_TALES_OF_ABYSS_HLE {}\n", sel.tales_of_abyss_hle) + + fmt::format("#define PS_TEX_IS_FB {}\n", sel.tex_is_fb) + + fmt::format("#define PS_INVALID_TEX0 {}\n", sel.invalid_tex0) + + fmt::format("#define PS_AEM {}\n", sel.aem) + + fmt::format("#define PS_TFX {}\n", sel.tfx) + + fmt::format("#define PS_TCC {}\n", sel.tcc) + + fmt::format("#define PS_ATST {}\n", sel.atst) + + fmt::format("#define PS_FOG {}\n", sel.fog) + + fmt::format("#define PS_CLR_HW {}\n", sel.clr_hw) + + fmt::format("#define PS_FBA {}\n", sel.fba) + + fmt::format("#define PS_LTF {}\n", sel.ltf) + + fmt::format("#define PS_AUTOMATIC_LOD {}\n", sel.automatic_lod) + + fmt::format("#define PS_MANUAL_LOD {}\n", sel.manual_lod) + + fmt::format("#define PS_COLCLIP {}\n", sel.colclip) + + fmt::format("#define PS_DATE {}\n", sel.date) + + fmt::format("#define PS_TCOFFSETHACK {}\n", sel.tcoffsethack) + + fmt::format("#define PS_POINT_SAMPLER {}\n", sel.point_sampler) + + fmt::format("#define PS_BLEND_A {}\n", sel.blend_a) + + fmt::format("#define PS_BLEND_B {}\n", sel.blend_b) + + fmt::format("#define PS_BLEND_C {}\n", sel.blend_c) + + fmt::format("#define PS_BLEND_D {}\n", sel.blend_d) + + fmt::format("#define PS_IIP {}\n", sel.iip) + + fmt::format("#define PS_SHUFFLE {}\n", sel.shuffle) + + fmt::format("#define PS_READ_BA {}\n", sel.read_ba) + + fmt::format("#define PS_WRITE_RG {}\n", sel.write_rg) + + fmt::format("#define PS_FBMASK {}\n", sel.fbmask) + + fmt::format("#define PS_HDR {}\n", sel.hdr) + + fmt::format("#define PS_DITHER {}\n", sel.dither) + + fmt::format("#define PS_ZCLAMP {}\n", sel.zclamp) + + fmt::format("#define PS_BLEND_MIX {}\n", sel.blend_mix) + + fmt::format("#define PS_FIXED_ONE_A {}\n", sel.fixed_one_a) + + fmt::format("#define PS_PABE {}\n", sel.pabe) + + fmt::format("#define PS_SCANMSK {}\n", sel.scanmsk) + + fmt::format("#define PS_SCALE_FACTOR {}\n", GSConfig.UpscaleMultiplier) + + fmt::format("#define PS_NO_COLOR {}\n", sel.no_color) + + fmt::format("#define PS_NO_COLOR1 {}\n", sel.no_color1) + + fmt::format("#define PS_NO_ABLEND {}\n", sel.no_ablend) + + fmt::format("#define PS_ONLY_ALPHA {}\n", sel.only_alpha) ; std::string src = GenGlslHeader("ps_main", GL_FRAGMENT_SHADER, macro); @@ -1153,7 +1129,7 @@ bool GSDeviceOGL::DownloadTexture(GSTexture* src, const GSVector4i& rect, GSText // Copy a sub part of texture (same as below but force a conversion) void GSDeviceOGL::BlitRect(GSTexture* sTex, const GSVector4i& r, const GSVector2i& dsize, bool at_origin, bool linear) { - GL_PUSH(StringUtil::StdStringFromFormat("CopyRectConv from %d", static_cast(sTex)->GetID()).c_str()); + GL_PUSH(fmt::format("CopyRectConv from {}", static_cast(sTex)->GetID()).c_str()); g_perfmon.Put(GSPerfMon::TextureCopies, 1); // NOTE: This previously used glCopyTextureSubImage2D(), but this appears to leak memory in @@ -1191,7 +1167,6 @@ void GSDeviceOGL::CopyRect(GSTexture* sTex, GSTexture* dTex, const GSVector4i& r PSSetShaderResource(6, sTex); #endif - dTex->CommitRegion(GSVector2i(r.z, r.w)); g_perfmon.Put(GSPerfMon::TextureCopies, 1); ASSERT(GLExtension::Has("GL_ARB_copy_image") && glCopyImageSubData); @@ -1204,6 +1179,8 @@ void GSDeviceOGL::CopyRect(GSTexture* sTex, GSTexture* dTex, const GSVector4i& r void GSDeviceOGL::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* dTex, const GSVector4& dRect, ShaderConvert shader, bool linear) { + pxAssert(dTex->IsDepthStencil() == HasDepthOutput(shader)); + pxAssert(linear ? SupportsBilinear(shader) : SupportsNearest(shader)); StretchRect(sTex, sRect, dTex, dRect, m_convert.ps[(int)shader], linear); } @@ -1228,11 +1205,7 @@ void GSDeviceOGL::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture { ASSERT(sTex); - const bool draw_in_depth = ps == m_convert.ps[static_cast(ShaderConvert::DEPTH_COPY)] - || ps == m_convert.ps[static_cast(ShaderConvert::RGBA8_TO_FLOAT32)] - || ps == m_convert.ps[static_cast(ShaderConvert::RGBA8_TO_FLOAT24)] - || ps == m_convert.ps[static_cast(ShaderConvert::RGBA8_TO_FLOAT16)] - || ps == m_convert.ps[static_cast(ShaderConvert::RGB5A1_TO_FLOAT16)]; + const bool draw_in_depth = dTex->IsDepthStencil(); // ************************************ // Init @@ -1241,7 +1214,6 @@ void GSDeviceOGL::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture BeginScene(); GL_PUSH("StretchRect from %d to %d", sTex->GetID(), dTex->GetID()); - dTex->CommitRegion(GSVector2i((int)dRect.z + 1, (int)dRect.w + 1)); if (draw_in_depth) OMSetRenderTargets(NULL, dTex); else @@ -1286,12 +1258,12 @@ void GSDeviceOGL::PresentRect(GSTexture* sTex, const GSVector4& sRect, GSTexture BeginScene(); - const GSVector2i ds(dTex ? dTex->GetSize() : GSVector2i(m_display->GetWindowWidth(), m_display->GetWindowHeight())); + const GSVector2i ds(dTex ? dTex->GetSize() : GSVector2i(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight())); DisplayConstantBuffer cb; cb.SetSource(sRect, sTex->GetSize()); cb.SetTarget(dRect, ds); cb.SetTime(shaderTime); - + GL::Program& prog = m_present[static_cast(shader)]; prog.Bind(); prog.Uniform4fv(0, cb.SourceRect.F32); @@ -1412,19 +1384,19 @@ void GSDeviceOGL::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, StretchRect(dTex, full_r, sTex[2], dRect[2], ShaderConvert::YUV); } -void GSDeviceOGL::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset) +void GSDeviceOGL::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset, int bufIdx) { GL_PUSH("DoInterlace"); OMSetColorMaskState(); - const GSVector4 s = GSVector4(dTex->GetSize()); + const GSVector4 ds = GSVector4(dTex->GetSize()); const GSVector4 sRect(0, 0, 1, 1); - const GSVector4 dRect(0.0f, yoffset, s.x, s.y + yoffset); + const GSVector4 dRect(0.0f, yoffset, ds.x, ds.y + yoffset); m_interlace.ps[shader].Bind(); - m_interlace.ps[shader].Uniform2f(0, 0, 1.0f / s.y); + m_interlace.ps[shader].Uniform4f(0, bufIdx, 1.0f / ds.y, ds.y, MAD_SENSITIVITY); StretchRect(sTex, sRect, dTex, dRect, m_interlace.ps[shader], linear); } @@ -1460,64 +1432,6 @@ void GSDeviceOGL::DoFXAA(GSTexture* sTex, GSTexture* dTex) StretchRect(sTex, sRect, dTex, dRect, m_fxaa.ps, true); } -void GSDeviceOGL::DoExternalFX(GSTexture* sTex, GSTexture* dTex) -{ -#ifndef PCSX2_CORE - // Lazy compile - if (!m_shaderfx.ps.IsValid()) - { - if (!GLLoader::found_GL_ARB_gpu_shader5) // GL4.0 extension - { - return; - } - - std::string config_name(theApp.GetConfigS("shaderfx_conf")); - std::ifstream fconfig(config_name); - std::stringstream config; - config << "#extension GL_ARB_gpu_shader5 : require\n"; - if (fconfig.good()) - config << fconfig.rdbuf(); - else - fprintf(stderr, "GS: External shader config '%s' not loaded.\n", config_name.c_str()); - - std::string shader_name(theApp.GetConfigS("shaderfx_glsl")); - std::ifstream fshader(shader_name); - std::stringstream shader; - if (!fshader.good()) - { - fprintf(stderr, "GS: External shader '%s' not loaded and will be disabled!\n", shader_name.c_str()); - return; - } - shader << fshader.rdbuf(); - - - const std::string ps(GetShaderSource("ps_main", GL_FRAGMENT_SHADER, m_shader_common_header, shader.str(), config.str())); - if (!m_shaderfx.ps.Compile(m_convert.vs, {}, ps) || !m_shaderfx.ps.Link()) - return; - - m_shaderfx.ps.RegisterUniform("_xyFrame"); - m_shaderfx.ps.RegisterUniform("_rcpFrame"); - m_shaderfx.ps.RegisterUniform("_rcpFrameOpt"); - } - - GL_PUSH("DoExternalFX"); - - OMSetColorMaskState(); - - const GSVector2i s = dTex->GetSize(); - - const GSVector4 sRect(0, 0, 1, 1); - const GSVector4 dRect(0, 0, s.x, s.y); - - m_shaderfx.ps.Bind(); - m_shaderfx.ps.Uniform2f(0, (float)s.x, (float)s.y); - m_shaderfx.ps.Uniform4f(1, 1.0f / s.x, 1.0f / s.y, 0.0f, 0.0f); - m_shaderfx.ps.Uniform4f(2, 0.0f, 0.0f, 0.0f, 0.0f); - - StretchRect(sTex, sRect, dTex, dRect, m_shaderfx.ps, true); -#endif -} - void GSDeviceOGL::DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float params[4]) { GL_PUSH("DoShadeBoost"); @@ -1642,6 +1556,67 @@ void GSDeviceOGL::ClearSamplerCache() } } +bool GSDeviceOGL::CreateCASPrograms() +{ + // Image load store and GLSL 420pack is core in GL4.2, no need to check. + m_features.cas_sharpening = GLAD_GL_VERSION_4_2 && GLAD_GL_ARB_compute_shader; + if (!m_features.cas_sharpening) + { + Console.Warning("Compute shaders not supported, CAS is unavailable."); + return false; + } + + std::optional cas_source(Host::ReadResourceFileToString("shaders/opengl/cas.glsl")); + if (!cas_source.has_value() || !GetCASShaderSource(&cas_source.value())) + { + m_features.cas_sharpening = false; + return false; + } + + const char* header = + "#version 420\n" + "#extension GL_ARB_compute_shader : require\n"; + const char* sharpen_params[2] = { + "#define CAS_SHARPEN_ONLY false\n", + "#define CAS_SHARPEN_ONLY true\n"}; + + if (!m_shader_cache.GetComputeProgram(&m_cas.upscale_ps, fmt::format("{}{}{}", header, sharpen_params[0], cas_source.value())) || + !m_shader_cache.GetComputeProgram(&m_cas.sharpen_ps, fmt::format("{}{}{}", header, sharpen_params[1], cas_source.value()))) + { + m_features.cas_sharpening = false; + return false; + } + + const auto link_uniforms = [](GL::Program& prog) { + prog.RegisterUniform("const0"); + prog.RegisterUniform("const1"); + prog.RegisterUniform("srcOffset"); + }; + link_uniforms(m_cas.upscale_ps); + link_uniforms(m_cas.sharpen_ps); + + return true; +} + +bool GSDeviceOGL::DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) +{ + const GL::Program& prog = sharpen_only ? m_cas.sharpen_ps : m_cas.upscale_ps; + prog.Bind(); + prog.Uniform4uiv(0, &constants[0]); + prog.Uniform4uiv(1, &constants[4]); + prog.Uniform2iv(2, reinterpret_cast(&constants[8])); + + PSSetShaderResource(0, sTex); + glBindImageTexture(0, static_cast(dTex)->GetID(), 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8); + + static const int threadGroupWorkRegionDim = 16; + const int dispatchX = (dTex->GetWidth() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + const int dispatchY = (dTex->GetHeight() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + glDispatchCompute(dispatchX, dispatchY, 1); + + return true; +} + void GSDeviceOGL::OMAttachRt(GSTextureOGL* rt) { GLuint id = 0; @@ -1852,6 +1827,10 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config) GLState::scissor = config.scissor; } + GSVector2i rtsize = (config.rt ? config.rt : config.ds)->GetSize(); + + GSTexture* primid_texture = nullptr; + // Destination Alpha Setup switch (config.destination_alpha) { @@ -1859,11 +1838,15 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config) case GSHWDrawConfig::DestinationAlphaMode::Full: break; // No setup case GSHWDrawConfig::DestinationAlphaMode::PrimIDTracking: - InitPrimDateTexture(config.rt, config.drawarea); + primid_texture = InitPrimDateTexture(config.rt, config.drawarea, config.datm); break; case GSHWDrawConfig::DestinationAlphaMode::StencilOne: - ClearStencil(config.ds, 1); - break; + if (m_features.texture_barrier) + { + ClearStencil(config.ds, 1); + break; + } + [[fallthrough]]; case GSHWDrawConfig::DestinationAlphaMode::Stencil: { const GSVector4 src = GSVector4(config.drawarea) / GSVector4(config.ds->GetSize()).xyxy(); @@ -1880,21 +1863,24 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config) } GSTexture* hdr_rt = nullptr; + GSTexture* draw_rt_clone = nullptr; if (config.ps.hdr) { - GSVector2i size = config.rt->GetSize(); - hdr_rt = CreateRenderTarget(size.x, size.y, GSTexture::Format::FloatColor, false); - hdr_rt->CommitRegion(GSVector2i(config.drawarea.z, config.drawarea.w)); + hdr_rt = CreateRenderTarget(rtsize.x, rtsize.y, GSTexture::Format::HDRColor, false); OMSetRenderTargets(hdr_rt, config.ds, &config.scissor); - // save blend state, since BlitRect destroys it - const bool old_blend = GLState::blend; - BlitRect(config.rt, config.drawarea, config.rt->GetSize(), false, false); - if (old_blend) - { - GLState::blend = old_blend; - glEnable(GL_BLEND); - } + GSVector4 dRect(config.drawarea); + const GSVector4 sRect = dRect / GSVector4(rtsize.x, rtsize.y).xyxy(); + StretchRect(config.rt, sRect, hdr_rt, dRect, ShaderConvert::HDR_INIT, false); + } + else if (config.require_one_barrier && !m_features.texture_barrier) + { + // Requires a copy of the RT + draw_rt_clone = CreateTexture(rtsize.x, rtsize.y, 1, GSTexture::Format::Color, false); + GL_PUSH("Copy RT to temp texture for fbmask {%d,%d %dx%d}", + config.drawarea.left, config.drawarea.top, + config.drawarea.width(), config.drawarea.height()); + CopyRect(config.rt, draw_rt_clone, config.drawarea, config.drawarea.left, config.drawarea.top); } BeginScene(); @@ -1911,15 +1897,12 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config) IASetPrimitiveTopology(topology); PSSetShaderResources(config.tex, config.pal); - // Always bind the RT. This way special effect can use it. - PSSetShaderResource(2, config.rt); + if (draw_rt_clone) + PSSetShaderResource(2, draw_rt_clone); + else if (config.require_one_barrier || config.require_full_barrier) + PSSetShaderResource(2, config.rt); SetupSampler(config.sampler); - OMSetBlendState(config.blend.enable, s_gl_blend_factors[config.blend.src_factor], - s_gl_blend_factors[config.blend.dst_factor], s_gl_blend_ops[config.blend.op], - config.blend.constant_enable, config.blend.constant); - OMSetColorMaskState(config.colormask); - SetupOM(config.depth); if (m_vs_cb_cache.Update(config.cb_vs)) { @@ -1965,35 +1948,32 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config) if (config.destination_alpha == GSHWDrawConfig::DestinationAlphaMode::PrimIDTracking) { - GL_PUSH("Date GL42"); - // It could be good idea to use stencil in the same time. - // Early stencil test will reduce the number of atomic-load operation + GL_PUSH("Destination Alpha PrimID Init"); - // Create an r32i image that will contain primitive ID - // Note: do it at the beginning because the clean will dirty the FBO state - //dev->InitPrimDateTexture(rtsize.x, rtsize.y); + OMSetRenderTargets(primid_texture, config.ds, &config.scissor); + OMColorMaskSelector mask; + mask.wrgba = 0; + mask.wr = true; + OMSetColorMaskState(mask); + OMSetBlendState(true, GL_ONE, GL_ONE, GL_MIN); + OMDepthStencilSelector dss = config.depth; + dss.zwe = 0; // Don't write depth + SetupOM(dss); - // I don't know how much is it legal to mount rt as Texture/RT. No write is done. - // In doubt let's detach RT. - OMSetRenderTargets(NULL, config.ds, &config.scissor); - - // Don't write anything on the color buffer - // Neither in the depth buffer - glDepthMask(false); // Compute primitiveID max that pass the date test (Draw without barrier) DrawIndexedPrimitive(); - // Ask PS to discard shader above the primitiveID max - glDepthMask(GLState::depth_mask); - psel.ps.date = 3; config.alpha_second_pass.ps.date = 3; SetupPipeline(psel); - - // Be sure that first pass is finished ! - Barrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); + PSSetShaderResource(3, primid_texture); } + OMSetBlendState(config.blend.enable, s_gl_blend_factors[config.blend.src_factor], + s_gl_blend_factors[config.blend.dst_factor], s_gl_blend_ops[config.blend.op], + config.blend.constant_enable, config.blend.constant); + OMSetColorMaskState(config.colormask); + SetupOM(config.depth); OMSetRenderTargets(hdr_rt ? hdr_rt : config.rt, config.ds, &config.scissor); SendHWDraw(config, psel.ps.IsFeedbackLoop()); @@ -2045,8 +2025,10 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config) } } - if (config.destination_alpha == GSHWDrawConfig::DestinationAlphaMode::PrimIDTracking) - RecycleDateTexture(); + if (primid_texture) + Recycle(primid_texture); + if (draw_rt_clone) + Recycle(draw_rt_clone); EndScene(); @@ -2057,7 +2039,7 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config) GSVector2i size = config.rt->GetSize(); GSVector4 dRect(config.drawarea); const GSVector4 sRect = dRect / GSVector4(size.x, size.y).xyxy(); - StretchRect(hdr_rt, sRect, config.rt, dRect, ShaderConvert::MOD_256, false); + StretchRect(hdr_rt, sRect, config.rt, dRect, ShaderConvert::HDR_RESOLVE, false); Recycle(hdr_rt); } @@ -2095,7 +2077,7 @@ void GSDeviceOGL::SendHWDraw(const GSHWDrawConfig& config, bool needs_barrier) } const bool tex_is_ds = config.tex && config.tex == config.ds; - if (needs_barrier || tex_is_ds) + if ((needs_barrier && m_features.texture_barrier) || tex_is_ds) { if (config.require_full_barrier) { @@ -2230,7 +2212,7 @@ void GSDeviceOGL::PopDebugGroup() #ifdef ENABLE_OGL_DEBUG if (!glPopDebugGroup) return; - + glPopDebugGroup(); #endif } @@ -2264,7 +2246,7 @@ void GSDeviceOGL::InsertDebugMessage(DebugMessageCategory category, const char* id = 0xDEAD; severity = GL_DEBUG_SEVERITY_MEDIUM; break; - case GSDevice::DebugMessageCategory::Performance: + case GSDevice::DebugMessageCategory::Performance: default: type = GL_DEBUG_TYPE_PERFORMANCE; id = 0xFEE1; diff --git a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.h b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.h index 0afdb61770..6c608ae79f 100644 --- a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.h +++ b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.h @@ -211,13 +211,8 @@ public: static int m_shader_reg; private: - // Increment this constant whenever shaders change, to invalidate user's program binary cache. - static constexpr u32 SHADER_VERSION = 3; - static FILE* m_debug_gl_file; - bool m_disable_hw_gl_draw; - // Place holder for the GLSL shader code (to avoid useless reload) std::string m_shader_common_header; std::string m_shader_tfx_vgs; @@ -242,7 +237,7 @@ private: struct { - GL::Program ps[4]; // program object + GL::Program ps[NUM_INTERLACE_SHADERS]; // program object } m_interlace; struct @@ -262,17 +257,10 @@ private: GL::Program ps; } m_fxaa; -#ifndef PCSX2_CORE - struct - { - GL::Program ps; - } m_shaderfx; -#endif - struct { GSDepthStencilOGL* dss = nullptr; - GSTexture* t = nullptr; + GL::Program primid_ps[2]; } m_date; struct @@ -280,6 +268,12 @@ private: GL::Program ps; } m_shadeboost; + struct + { + GL::Program upscale_ps; + GL::Program sharpen_ps; + } m_cas; + struct { u16 last_query = 0; @@ -303,10 +297,12 @@ private: GSTexture* CreateSurface(GSTexture::Type type, int width, int height, int levels, GSTexture::Format format) final; void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) final; - void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0) final; + void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0, int bufIdx = 0) final; void DoFXAA(GSTexture* sTex, GSTexture* dTex) final; void DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float params[4]) final; - void DoExternalFX(GSTexture* sTex, GSTexture* dTex) final; + + bool CreateCASPrograms(); + bool DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) final; void OMAttachRt(GSTextureOGL* rt = NULL); void OMAttachDs(GSTextureOGL* ds = NULL); @@ -323,7 +319,7 @@ public: // Used by OpenGL, so the same calling convention is required. static void APIENTRY DebugOutputToFile(GLenum gl_source, GLenum gl_type, GLuint id, GLenum gl_severity, GLsizei gl_length, const GLchar* gl_message, const void* userParam); - bool Create(HostDisplay* display) override; + bool Create() override; void ResetAPIState() override; void RestoreAPIState() override; @@ -338,8 +334,7 @@ public: void ClearDepth(GSTexture* t) final; void ClearStencil(GSTexture* t, u8 c) final; - void InitPrimDateTexture(GSTexture* rt, const GSVector4i& area); - void RecycleDateTexture(); + GSTexture* InitPrimDateTexture(GSTexture* rt, const GSVector4i& area, bool datm); bool DownloadTexture(GSTexture* src, const GSVector4i& rect, GSTexture::GSMap& out_map) final; @@ -377,9 +372,6 @@ public: void OMSetRenderTargets(GSTexture* rt, GSTexture* ds, const GSVector4i* scissor = NULL); void OMSetColorMaskState(OMColorMaskSelector sel = OMColorMaskSelector()); - bool HasColorSparse() final { return GLLoader::found_compatible_GL_ARB_sparse_texture2; } - bool HasDepthSparse() final { return GLLoader::found_compatible_sparse_depth; } - bool CreateTextureFX(); std::string GetShaderSource(const std::string_view& entry, GLenum type, const std::string_view& common_header, const std::string_view& glsl_h_code, const std::string_view& macro_sel); std::string GenGlslHeader(const std::string_view& entry, GLenum type, const std::string_view& macro); @@ -394,6 +386,4 @@ public: void SetupOM(OMDepthStencilSelector dssel); GLuint GetSamplerID(PSSamplerSelector ssel); GLuint GetPaletteSamplerID(); - - void Barrier(GLbitfield b); }; diff --git a/pcsx2/GS/Renderers/OpenGL/GSTextureOGL.cpp b/pcsx2/GS/Renderers/OpenGL/GSTextureOGL.cpp index fba5b77e69..616a00c353 100644 --- a/pcsx2/GS/Renderers/OpenGL/GSTextureOGL.cpp +++ b/pcsx2/GS/Renderers/OpenGL/GSTextureOGL.cpp @@ -181,7 +181,6 @@ GSTextureOGL::GSTextureOGL(Type type, int width, int height, int levels, Format m_type = type; m_fbo_read = fbo_read; m_texture_id = 0; - m_sparse = false; m_mipmap_levels = 1; int gl_fmt = 0; @@ -190,8 +189,8 @@ GSTextureOGL::GSTextureOGL(Type type, int width, int height, int levels, Format { // 1 Channel integer case Format::PrimID: - gl_fmt = GL_R32I; - m_int_format = GL_RED_INTEGER; + gl_fmt = GL_R32F; + m_int_format = GL_RED; m_int_type = GL_INT; m_int_shift = 2; break; @@ -225,11 +224,11 @@ GSTextureOGL::GSTextureOGL(Type type, int width, int height, int levels, Format break; // 4 channel float - case Format::FloatColor: - gl_fmt = GL_RGBA32F; + case Format::HDRColor: + gl_fmt = GL_RGBA16; m_int_format = GL_RGBA; - m_int_type = GL_FLOAT; - m_int_shift = 4; + m_int_type = GL_UNSIGNED_SHORT; + m_int_shift = 3; break; // Depth buffer @@ -287,56 +286,9 @@ GSTextureOGL::GSTextureOGL(Type type, int width, int height, int levels, Format ASSERT(0); } - switch (m_type) - { - case Type::Texture: - // Only 32 bits input texture will be supported for mipmap - m_mipmap_levels = levels; - break; - case Type::SparseRenderTarget: - case Type::SparseDepthStencil: - m_sparse = true; - break; - default: - break; - } - - switch (m_format) - { - case Format::UInt16: - case Format::UNorm8: - m_sparse &= GLLoader::found_compatible_GL_ARB_sparse_texture2; - SetGpuPageSize(GSVector2i(255, 255)); - break; - - case Format::Color: - case Format::UInt32: - case Format::PrimID: - m_sparse &= GLLoader::found_compatible_GL_ARB_sparse_texture2; - SetGpuPageSize(GSVector2i(127, 127)); - break; - - case Format::FloatColor: - m_sparse &= GLLoader::found_compatible_GL_ARB_sparse_texture2; - SetGpuPageSize(GSVector2i(63, 63)); - break; - - case Format::DepthStencil: - m_sparse &= GLLoader::found_compatible_sparse_depth; - SetGpuPageSize(GSVector2i(127, 127)); - break; - - case GSTexture::Format::BC1: - case GSTexture::Format::BC2: - case GSTexture::Format::BC3: - case GSTexture::Format::BC7: - m_sparse = false; - SetGpuPageSize(GSVector2i(127, 127)); - break; - - case Format::Invalid: - ASSERT(0); - } + // Only 32 bits input texture will be supported for mipmap + if (m_type == Type::Texture) + m_mipmap_levels = levels; // Create a gl object (texture isn't allocated here) glCreateTextures(GL_TEXTURE_2D, 1, &m_texture_id); @@ -347,26 +299,8 @@ GSTextureOGL::GSTextureOGL(Type type, int width, int height, int levels, Format glTextureParameteri(m_texture_id, GL_TEXTURE_SWIZZLE_A, GL_RED); } - if (m_sparse) - { - GSVector2i old_size = m_size; - m_size = RoundUpPage(m_size); - if (m_size != old_size) - { - fprintf(stderr, "Sparse texture size (%dx%d) isn't a multiple of gpu page size (%dx%d)\n", - old_size.x, old_size.y, m_gpu_page_size.x, m_gpu_page_size.y); - } - glTextureParameteri(m_texture_id, GL_TEXTURE_SPARSE_ARB, true); - } - else - { - m_committed_size = m_size; - } - - m_mem_usage = (m_committed_size.x * m_committed_size.y) << m_int_shift; - static int every_512 = 0; - GLState::available_vram -= m_mem_usage; + GLState::available_vram -= GetMemUsage(); if ((GLState::available_vram < 0) && (every_512 % 512 == 0)) { fprintf(stderr, "Available VRAM is very low (%lld), a crash is expected! Enable conservative buffer allocation or reduce upscaling!\n", GLState::available_vram); @@ -394,7 +328,7 @@ GSTextureOGL::~GSTextureOGL() glDeleteTextures(1, &m_texture_id); - GLState::available_vram += m_mem_usage; + GLState::available_vram += GetMemUsage(); } void* GSTextureOGL::GetNativeHandle() const @@ -560,44 +494,6 @@ void GSTextureOGL::GenerateMipmap() glGenerateTextureMipmap(m_texture_id); } -void GSTextureOGL::CommitPages(const GSVector2i& region, bool commit) -{ - GLState::available_vram += m_mem_usage; - - if (commit) - { - if (m_committed_size.x == 0) - { - // Nothing allocated so far - GL_INS("CommitPages initial %dx%d of %u", region.x, region.y, m_texture_id); - glTexturePageCommitmentEXT(m_texture_id, GL_TEX_LEVEL_0, 0, 0, 0, region.x, region.y, 1, commit); - } - else - { - GL_INS("CommitPages extend %dx%d to %dx%d of %u", m_committed_size.x, m_committed_size.y, region.x, region.y, m_texture_id); - int w = region.x - m_committed_size.x; - int h = region.y - m_committed_size.y; - // Extend width - glTexturePageCommitmentEXT(m_texture_id, GL_TEX_LEVEL_0, m_committed_size.x, 0, 0, w, m_committed_size.y, 1, commit); - // Extend height - glTexturePageCommitmentEXT(m_texture_id, GL_TEX_LEVEL_0, 0, m_committed_size.y, 0, region.x, h, 1, commit); - } - m_committed_size = region; - } - else - { - // Release everything - GL_INS("CommitPages release of %u", m_texture_id); - - glTexturePageCommitmentEXT(m_texture_id, GL_TEX_LEVEL_0, 0, 0, 0, m_committed_size.x, m_committed_size.y, 1, commit); - - m_committed_size = GSVector2i(0, 0); - } - - m_mem_usage = (m_committed_size.x * m_committed_size.y) << m_int_shift; - GLState::available_vram -= m_mem_usage; -} - GSTexture::GSMap GSTextureOGL::Read(const GSVector4i& r, AlignedBuffer& buffer) { GSMap m; @@ -625,8 +521,8 @@ GSTexture::GSMap GSTextureOGL::Read(const GSVector4i& r, AlignedBuffer& bool GSTextureOGL::Save(const std::string& fn) { // Collect the texture data - u32 pitch = 4 * m_committed_size.x; - u32 buf_size = pitch * m_committed_size.y * 2; // Note *2 for security (depth/stencil) + u32 pitch = 4 * m_size.x; + u32 buf_size = pitch * m_size.y * 2; // Note *2 for security (depth/stencil) std::unique_ptr image(new u8[buf_size]); #ifdef PCSX2_DEVBUILD GSPng::Format fmt = GSPng::RGB_A_PNG; @@ -634,12 +530,12 @@ bool GSTextureOGL::Save(const std::string& fn) GSPng::Format fmt = GSPng::RGB_PNG; #endif - if (IsDepth()) + if (IsDepthStencil()) { glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo_read); glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_texture_id, 0); - glReadPixels(0, 0, m_committed_size.x, m_committed_size.y, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, image.get()); + glReadPixels(0, 0, m_size.x, m_size.y, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, image.get()); glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); @@ -648,7 +544,6 @@ bool GSTextureOGL::Save(const std::string& fn) else if (m_format == Format::PrimID) { // Note: 4.5 function used for accurate DATE - // barely used outside of dev and not sparse anyway glGetTextureImage(m_texture_id, 0, GL_RED_INTEGER, GL_INT, buf_size, image.get()); fmt = GSPng::R32I_PNG; @@ -661,24 +556,24 @@ bool GSTextureOGL::Save(const std::string& fn) if (m_format == Format::Color) { - glReadPixels(0, 0, m_committed_size.x, m_committed_size.y, GL_RGBA, GL_UNSIGNED_BYTE, image.get()); + glReadPixels(0, 0, m_size.x, m_size.y, GL_RGBA, GL_UNSIGNED_BYTE, image.get()); } else if (m_format == Format::UInt16) { - glReadPixels(0, 0, m_committed_size.x, m_committed_size.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, image.get()); + glReadPixels(0, 0, m_size.x, m_size.y, GL_RED_INTEGER, GL_UNSIGNED_SHORT, image.get()); fmt = GSPng::R16I_PNG; } else if (m_format == Format::UNorm8) { fmt = GSPng::R8I_PNG; - glReadPixels(0, 0, m_committed_size.x, m_committed_size.y, GL_RED, GL_UNSIGNED_BYTE, image.get()); + glReadPixels(0, 0, m_size.x, m_size.y, GL_RED, GL_UNSIGNED_BYTE, image.get()); } glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); } int compression = theApp.GetConfigI("png_compression_level"); - return GSPng::Save(fmt, fn, image.get(), m_committed_size.x, m_committed_size.y, pitch, compression); + return GSPng::Save(fmt, fn, image.get(), m_size.x, m_size.y, pitch, compression); } void GSTextureOGL::Swap(GSTexture* tex) @@ -696,10 +591,4 @@ void GSTextureOGL::Swap(GSTexture* tex) std::swap(m_int_format, static_cast(tex)->m_int_format); std::swap(m_int_type, static_cast(tex)->m_int_type); std::swap(m_int_shift, static_cast(tex)->m_int_shift); - std::swap(m_mem_usage, static_cast(tex)->m_mem_usage); -} - -u32 GSTextureOGL::GetMemUsage() -{ - return m_mem_usage; } diff --git a/pcsx2/GS/Renderers/OpenGL/GSTextureOGL.h b/pcsx2/GS/Renderers/OpenGL/GSTextureOGL.h index 81e10d6ac7..b777a4a5dc 100644 --- a/pcsx2/GS/Renderers/OpenGL/GSTextureOGL.h +++ b/pcsx2/GS/Renderers/OpenGL/GSTextureOGL.h @@ -54,9 +54,6 @@ private: GLenum m_int_type; u32 m_int_shift; - // Allow to track size of allocated memory - u32 m_mem_usage; - public: explicit GSTextureOGL(Type type, int width, int height, int levels, Format format, GLuint fbo_read); virtual ~GSTextureOGL(); @@ -71,7 +68,6 @@ public: void Swap(GSTexture* tex) final; GSMap Read(const GSVector4i& r, AlignedBuffer& buffer); - bool IsDepth() { return (m_type == Type::DepthStencil || m_type == Type::SparseDepthStencil); } bool IsIntegerFormat() const { return (m_int_format == GL_RED_INTEGER || m_int_format == GL_RGBA_INTEGER); @@ -88,8 +84,4 @@ public: void Clear(const void* data); void Clear(const void* data, const GSVector4i& area); - - void CommitPages(const GSVector2i& region, bool commit) final; - - u32 GetMemUsage() final; }; diff --git a/pcsx2/GS/Renderers/SW/GSDrawScanline.cpp b/pcsx2/GS/Renderers/SW/GSDrawScanline.cpp index 02fd0203ce..c656b8cca1 100644 --- a/pcsx2/GS/Renderers/SW/GSDrawScanline.cpp +++ b/pcsx2/GS/Renderers/SW/GSDrawScanline.cpp @@ -17,8 +17,12 @@ #include "GSDrawScanline.h" #include "GSTextureCacheSW.h" +#if MULTI_ISA_COMPILE_ONCE // Lack of a better home -std::unique_ptr g_const(new GSScanlineConstantData()); +constexpr GSScanlineConstantData g_const; +#endif + +MULTI_ISA_UNSHARED_IMPL; GSDrawScanline::GSDrawScanline() : m_sp_map("GSSetupPrim", &m_local) @@ -131,10 +135,10 @@ void GSDrawScanline::CSetupPrim(const GSVertexSW* vertex, const u32* index, cons constexpr int vlen = sizeof(VectorF) / sizeof(float); #if _M_SSE >= 0x501 - const GSVector8* shift = (GSVector8*)g_const->m_shift_256b; + const GSVector8* shift = (GSVector8*)g_const.m_shift_256b; const GSVector4 step_shift = GSVector4::broadcast32(&shift[0]); #else - const GSVector4* shift = (GSVector4*)g_const->m_shift_128b; + const GSVector4* shift = (GSVector4*)g_const.m_shift_128b; const GSVector4 step_shift = shift[0]; #endif @@ -308,7 +312,7 @@ void GSDrawScanline::CDrawScanline(int pixels, int left, int top, const GSVertex constexpr int vlen = sizeof(VectorF) / sizeof(float); #if _M_SSE < 0x501 - const GSVector4i* const_test = (GSVector4i*)g_const->m_test_128b; + const GSVector4i* const_test = (GSVector4i*)g_const.m_test_128b; #endif VectorI test; VectorF z0, z1; @@ -328,7 +332,7 @@ void GSDrawScanline::CDrawScanline(int pixels, int left, int top, const GSVertex steps = pixels + skip - vlen; left -= skip; #if _M_SSE >= 0x501 - test = GSVector8i::i8to32(g_const->m_test_256b[skip]) | GSVector8i::i8to32(g_const->m_test_256b[15 + (steps & (steps >> 31))]); + test = GSVector8i::i8to32(g_const.m_test_256b[skip]) | GSVector8i::i8to32(g_const.m_test_256b[15 + (steps & (steps >> 31))]); #else test = const_test[skip] | const_test[7 + (steps & (steps >> 31))]; #endif @@ -357,18 +361,14 @@ void GSDrawScanline::CDrawScanline(int pixels, int left, int top, const GSVertex if (sel.zb) { - VectorF zbase = VectorF::broadcast64(&scan.p.z); if (sel.zequal) { -#if _M_SSE >= 0x501 - z0 = GSVector8::cast(GSVector8i::broadcast32(zbase.extract<0>().f64toi32())); -#else - z0 = GSVector4::cast(zbase.f64toi32()); - z0 = z0.upld(z0); -#endif + u32 z = static_cast(scan.p.F64[1]); + z0 = VectorF::cast(VectorI(z)); } else { + VectorF zbase = VectorF::broadcast64(&scan.p.z); z0 = zbase.add64(VectorF::f32to64(&local.d[skip].z.F32[0])); z1 = zbase.add64(VectorF::f32to64(&local.d[skip].z.F32[vlen/2])); } @@ -1573,7 +1573,7 @@ void GSDrawScanline::CDrawScanline(int pixels, int left, int top, const GSVertex if (!sel.notest) { #if _M_SSE >= 0x501 - test = GSVector8i::i8to32(g_const->m_test_256b[15 + (steps & (steps >> 31))]); + test = GSVector8i::i8to32(g_const.m_test_256b[15 + (steps & (steps >> 31))]); #else test = const_test[7 + (steps & (steps >> 31))]; #endif diff --git a/pcsx2/GS/Renderers/SW/GSDrawScanline.h b/pcsx2/GS/Renderers/SW/GSDrawScanline.h index 2ecff373c3..819e1f8dcd 100644 --- a/pcsx2/GS/Renderers/SW/GSDrawScanline.h +++ b/pcsx2/GS/Renderers/SW/GSDrawScanline.h @@ -21,6 +21,8 @@ #include "GSSetupPrimCodeGenerator.h" #include "GSDrawScanlineCodeGenerator.h" +MULTI_ISA_UNSHARED_START + class GSDrawScanline : public IDrawScanline { public: @@ -85,3 +87,5 @@ public: m_ds_map.PrintStats(); } }; + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.cpp b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.cpp index 848ba98c47..3f33d3e56e 100644 --- a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.cpp +++ b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.cpp @@ -18,6 +18,7 @@ #include "GS/Renderers/Common/GSFunctionMap.h" #include "GSVertexSW.h" +MULTI_ISA_UNSHARED_IMPL; using namespace Xbyak; // Ease the reading of the code @@ -80,7 +81,7 @@ using namespace Xbyak; #define _rip_local_d_p(x) _rip_local_d(x) #endif -GSDrawScanlineCodeGenerator2::GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, u64 key) +GSDrawScanlineCodeGenerator2::GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, const ProcessorFeatures& cpu, void* param, u64 key) : _parent(base, cpu) , m_local(*(GSScanlineLocalData*)param) , m_rip(false) @@ -95,7 +96,7 @@ GSDrawScanlineCodeGenerator2::GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* , t0(r8) , t1(r9) , t2(rcx), t3(rsi) #endif - , _g_const(chooseLocal(&*g_const, _64_g_const)) + , _g_const(chooseLocal(&g_const, _64_g_const)) , _m_local(chooseLocal(&m_local, _64_m_local)) , _m_local__gd(chooseLocal(m_local.gd, _64_m_local__gd)) , _m_local__gd__vm(chooseLocal(m_local.gd->vm, _64_m_local__gd__vm)) @@ -242,7 +243,7 @@ void GSDrawScanlineCodeGenerator2::alltrue(const XYm& test) u32 mask = test.isYMM() ? 0xffffffff : 0xffff; pmovmskb(eax, test); cmp(eax, mask); - je("step", GSCodeGenerator::T_NEAR); + je("step", Xbyak::CodeGenerator::T_NEAR); } void GSDrawScanlineCodeGenerator2::blend(const XYm& a, const XYm& b, const XYm& mask) @@ -366,7 +367,7 @@ void GSDrawScanlineCodeGenerator2::Generate() mov(ptr[rsp + _64_rz_r14], r14); mov(ptr[rsp + _64_rz_r15], r15); #endif - mov(_64_g_const, (size_t)&*g_const); + mov(_64_g_const, (size_t)&g_const); if (!m_rip) { mov(_64_m_local, (size_t)&m_local); diff --git a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.h b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.h index 8054a31b70..0f2d363321 100644 --- a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.h +++ b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.h @@ -17,6 +17,7 @@ #include "GSScanlineEnvironment.h" #include "GSNewCodeGenerator.h" +#include "GS/MultiISA.h" #undef _t // Conflict with wx, hopefully no one needs this @@ -30,6 +31,8 @@ #define DRAW_SCANLINE_USING_YMM 0 #endif +MULTI_ISA_UNSHARED_START + class GSDrawScanlineCodeGenerator2 : public GSNewCodeGenerator { using _parent = GSNewCodeGenerator; @@ -91,7 +94,7 @@ class GSDrawScanlineCodeGenerator2 : public GSNewCodeGenerator } public: - GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, u64 key); + GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, const ProcessorFeatures& cpu, void* param, u64 key); void Generate(); private: @@ -187,3 +190,5 @@ private: int pixels, int mip_offset); void ReadTexelImpl(const Xmm& dst, const Xmm& addr, u8 i, bool texInA3, bool preserveDst); }; + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp index 268f30f61d..5ff37c8278 100644 --- a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp +++ b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp @@ -21,11 +21,13 @@ #include #include -static std::map s_use_c_draw_scanline; -static std::mutex s_use_c_draw_scanline_mutex; +MULTI_ISA_UNSHARED_IMPL; static bool shouldUseCDrawScanline(u64 key) { + static std::map s_use_c_draw_scanline; + static std::mutex s_use_c_draw_scanline_mutex; + static const char* const fname = getenv("USE_C_DRAW_SCANLINE"); if (!fname) return false; @@ -80,7 +82,7 @@ static bool shouldUseCDrawScanline(u64 key) } GSDrawScanlineCodeGenerator::GSDrawScanlineCodeGenerator(void* param, u64 key, void* code, size_t maxsize) - : GSCodeGenerator(code, maxsize) + : Xbyak::CodeGenerator(maxsize, code) , m_local(*(GSScanlineLocalData*)param) , m_rip(false) { @@ -106,5 +108,5 @@ GSDrawScanlineCodeGenerator::GSDrawScanlineCodeGenerator(void* param, u64 key, v return; } - GSDrawScanlineCodeGenerator2(this, CPUInfo(m_cpu), (void*)&m_local, m_sel.key).Generate(); + GSDrawScanlineCodeGenerator2(this, g_cpu, (void*)&m_local, m_sel.key).Generate(); } diff --git a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.h b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.h index 60d7fe99ed..46b70d258a 100644 --- a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.h +++ b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.h @@ -18,6 +18,8 @@ #include "GSScanlineEnvironment.h" #include "GS/Renderers/Common/GSFunctionMap.h" #include "GS/GSUtil.h" +#include "GS/MultiISA.h" +#include #if defined(_M_AMD64) || defined(_WIN64) #define RegLong Xbyak::Reg64 @@ -25,7 +27,9 @@ #define RegLong Xbyak::Reg32 #endif -class GSDrawScanlineCodeGenerator : public GSCodeGenerator +MULTI_ISA_UNSHARED_START + +class GSDrawScanlineCodeGenerator : public Xbyak::CodeGenerator { void operator=(const GSDrawScanlineCodeGenerator&); @@ -36,3 +40,5 @@ class GSDrawScanlineCodeGenerator : public GSCodeGenerator public: GSDrawScanlineCodeGenerator(void* param, u64 key, void* code, size_t maxsize); }; + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/GS/Renderers/SW/GSNewCodeGenerator.h b/pcsx2/GS/Renderers/SW/GSNewCodeGenerator.h index 86246a3f2d..055aeb1c35 100644 --- a/pcsx2/GS/Renderers/SW/GSNewCodeGenerator.h +++ b/pcsx2/GS/Renderers/SW/GSNewCodeGenerator.h @@ -17,36 +17,7 @@ #include "xbyak/xbyak.h" #include "xbyak/xbyak_util.h" - -namespace SSEVersion -{ - enum SSEVersion - { - AVX2 = 0x501, - AVX = 0x500, - SSE41 = 0x401, - }; -} - -/// Similar to Xbyak::util::cpu but more open to us putting in extra flags (e.g. "vpgatherdd is fast"), as well as making it easier to test other configurations by artifically limiting features -struct CPUInfo -{ - bool hasFMA = false; - SSEVersion::SSEVersion sseVersion = SSEVersion::SSE41; - - CPUInfo() = default; - CPUInfo(const Xbyak::util::Cpu& cpu) - { - auto version = SSEVersion::SSE41; - if (cpu.has(cpu.tAVX)) - version = SSEVersion::AVX; - if (cpu.has(cpu.tAVX2)) - version = SSEVersion::AVX2; - - hasFMA = cpu.has(cpu.tFMA); - sseVersion = version; - } -}; +#include "GS/MultiISA.h" /// Code generator that automatically selects between SSE and AVX, x86 and x64 so you don't have to /// Should make combined SSE and AVX codegen much easier @@ -130,10 +101,10 @@ public: const RipType rip{}; const Xbyak::AddressFrame ptr{0}, byte{8}, word{16}, dword{32}, qword{64}, xword{128}, yword{256}, zword{512}; - GSNewCodeGenerator(Xbyak::CodeGenerator* actual, CPUInfo cpu) + GSNewCodeGenerator(Xbyak::CodeGenerator* actual, const ProcessorFeatures& cpu) : actual(*actual) - , hasAVX(cpu.sseVersion >= SSEVersion::AVX) - , hasAVX2(cpu.sseVersion >= SSEVersion::AVX2) + , hasAVX(cpu.vectorISA >= ProcessorFeatures::VectorISA::AVX) + , hasAVX2(cpu.vectorISA >= ProcessorFeatures::VectorISA::AVX2) , hasFMA(cpu.hasFMA) { } diff --git a/pcsx2/GS/Renderers/SW/GSRasterizer.cpp b/pcsx2/GS/Renderers/SW/GSRasterizer.cpp index bd8eed1bb4..2418be8370 100644 --- a/pcsx2/GS/Renderers/SW/GSRasterizer.cpp +++ b/pcsx2/GS/Renderers/SW/GSRasterizer.cpp @@ -27,6 +27,8 @@ #define ENABLE_DRAW_STATS 0 +MULTI_ISA_UNSHARED_IMPL; + int GSRasterizerData::s_counter = 0; static int compute_best_thread_height(int threads) diff --git a/pcsx2/GS/Renderers/SW/GSRasterizer.h b/pcsx2/GS/Renderers/SW/GSRasterizer.h index 02f7905029..a6e047c588 100644 --- a/pcsx2/GS/Renderers/SW/GSRasterizer.h +++ b/pcsx2/GS/Renderers/SW/GSRasterizer.h @@ -21,6 +21,9 @@ #include "GS/GSPerfMon.h" #include "GS/GSThread_CXX11.h" #include "GS/GSRingHeap.h" +#include "GS/MultiISA.h" + +MULTI_ISA_UNSHARED_START class alignas(32) GSRasterizerData : public GSAlignedClass<32> { @@ -113,7 +116,7 @@ public: __forceinline bool IsSolidRect() const { return m_dr != NULL; } }; -class IRasterizer : public GSAlignedClass<32> +class IRasterizer : public GSVirtualAlignedClass<32> { public: virtual ~IRasterizer() {} @@ -234,3 +237,5 @@ public: int GetPixels(bool reset); void PrintStats() {} }; + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/GS/Renderers/SW/GSRendererSW.cpp b/pcsx2/GS/Renderers/SW/GSRendererSW.cpp index e794e2c8a4..6577ce9637 100644 --- a/pcsx2/GS/Renderers/SW/GSRendererSW.cpp +++ b/pcsx2/GS/Renderers/SW/GSRendererSW.cpp @@ -18,14 +18,18 @@ #include "GS/GSGL.h" #include "common/StringUtil.h" +MULTI_ISA_UNSHARED_IMPL; + +GSRenderer* CURRENT_ISA::makeGSRendererSW(int threads) +{ + return new GSRendererSW(threads); +} + #define LOG 0 static FILE* s_fp = LOG ? fopen("c:\\temp1\\_.txt", "w") : NULL; -CONSTINIT const GSVector4 GSVertexSW::m_pos_scale = GSVector4::cxpr(1.0f / 16, 1.0f / 16, 1.0f, 128.0f); -#if _M_SSE >= 0x501 -CONSTINIT const GSVector8 GSVertexSW::m_pos_scale2 = GSVector8::cxpr(1.0f / 16, 1.0f / 16, 1.0f, 128.0f, 1.0f / 16, 1.0f / 16, 1.0f, 128.0f); -#endif +static constexpr GSVector4 s_pos_scale = GSVector4::cxpr(1.0f / 16, 1.0f / 16, 1.0f, 128.0f); GSRendererSW::GSRendererSW(int threads) : GSRenderer(), m_fzb(NULL) @@ -132,7 +136,7 @@ GSTexture* GSRendererSW::GetOutput(int i, int& y_offset) const int display_offset = GetResolutionOffset(i).y; const GSVector4i offsets = !GSConfig.PCRTCOverscan ? VideoModeOffsets[videomode] : VideoModeOffsetsOverscan[videomode]; const int display_height = offsets.y * ((isinterlaced() && !m_regs->SMODE2.FFMD) ? 2 : 1); - int h = std::min(GetFramebufferHeight(), display_height) + DISPFB.DBY; + int h = std::min(GetFramebufferHeight(), display_height); // If there is a negative vertical offset on the picture, we need to read more. if (display_offset < 0) @@ -142,15 +146,60 @@ GSTexture* GSRendererSW::GetOutput(int i, int& y_offset) if (g_gs_device->ResizeTarget(&m_texture[i], w, h)) { - static int pitch = 1024 * 4; + constexpr int pitch = 1024 * 4; + const int off_x = DISPFB.DBX & 0x7ff; + const int off_y = DISPFB.DBY & 0x7ff; + const GSVector4i out_r(0, 0, w, h); + GSVector4i r(off_x, off_y, w + off_x, h + off_y); + GSVector4i rh(off_x, off_y, w + off_x, (h + off_y) & 0x7FF); + GSVector4i rw(off_x, off_y, (w + off_x) & 0x7FF, h + off_y); + bool h_wrap = false; + bool w_wrap = false; - GSVector4i r(0, 0, w, h); + // Need to read it in 2 parts, since you can't do a split rect. + if (r.bottom >= 2048) + { + r.bottom = 2048; + rw.bottom = 2048; + rh.top = 0; + h_wrap = true; + } + + if (r.right >= 2048) + { + r.right = 2048; + rh.right = 2048; + rw.left = 0; + w_wrap = true; + } const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[DISPFB.PSM]; - (m_mem.*psm.rtx)(m_mem.GetOffset(DISPFB.Block(), DISPFB.FBW, DISPFB.PSM), r.ralign(psm.bs), m_output, pitch, m_env.TEXA); + // Top left rect + psm.rtx(m_mem, m_mem.GetOffset(DISPFB.Block(), DISPFB.FBW, DISPFB.PSM), r.ralign(psm.bs), m_output, pitch, m_env.TEXA); - m_texture[i]->Update(r, m_output, pitch); + int top = (h_wrap) ? ((r.bottom - r.top) * pitch) : 0; + int left = (w_wrap) ? (r.right - r.left) * (GSLocalMemory::m_psm[DISPFB.PSM].bpp / 8) : 0; + + // The following only happen if the DBX/DBY wrap around at 2048. + + // Top right rect + if (w_wrap) + psm.rtx(m_mem, m_mem.GetOffset(DISPFB.Block(), DISPFB.FBW, DISPFB.PSM), rw.ralign(psm.bs), &m_output[left], pitch, m_env.TEXA); + + // Bottom left rect + if (h_wrap) + psm.rtx(m_mem, m_mem.GetOffset(DISPFB.Block(), DISPFB.FBW, DISPFB.PSM), rh.ralign(psm.bs), &m_output[top], pitch, m_env.TEXA); + + // Bottom right rect + if (h_wrap && w_wrap) + { + // Needs also rw with the start/end height of rh, fills in the bottom right rect which will be missing if both overflow. + const GSVector4i rwh(rw.left, rh.top, rw.right, rh.bottom); + psm.rtx(m_mem, m_mem.GetOffset(DISPFB.Block(), DISPFB.FBW, DISPFB.PSM), rwh.ralign(psm.bs), &m_output[top + left], pitch, m_env.TEXA); + } + + m_texture[i]->Update(out_r, m_output, pitch); if (s_dump) { @@ -178,9 +227,20 @@ GSTexture* GSRendererSW::GetFeedbackOutput() return nullptr; } +MULTI_ISA_DEF(void GSVertexSWInitStatic();) + +#if MULTI_ISA_COMPILE_ONCE +GSVertexSW::ConvertVertexBufferPtr GSVertexSW::s_cvb[4][2][2][2]; +void GSVertexSW::InitStatic() +{ + MULTI_ISA_SELECT(GSVertexSWInitStatic)(); +} +#endif + +MULTI_ISA_UNSHARED_START template -void GSVertexSW::ConvertVertexBuffer(GSDrawingContext* RESTRICT ctx, GSVertexSW* RESTRICT dst, const GSVertex* RESTRICT src, size_t count) +void ConvertVertexBuffer(const GSDrawingContext* RESTRICT ctx, GSVertexSW* RESTRICT dst, const GSVertex* RESTRICT src, size_t count) { // FIXME q_div wasn't added to AVX2 code path. @@ -229,7 +289,7 @@ void GSVertexSW::ConvertVertexBuffer(GSDrawingContext* RESTRICT ctx, GSVertexSW* if (primclass == GS_SPRITE_CLASS) { - dst->p = GSVector4(xy).xyyw(GSVector4(xyzuvf)) * m_pos_scale; + dst->p = GSVector4(xy).xyyw(GSVector4(xyzuvf)) * s_pos_scale; xyzuvf = xyzuvf.min_u32(z_max); t = t.insert32<1, 3>(GSVector4::cast(xyzuvf)); @@ -237,7 +297,7 @@ void GSVertexSW::ConvertVertexBuffer(GSDrawingContext* RESTRICT ctx, GSVertexSW* else { double z = static_cast(static_cast(xyzuvf.extract32<1>())); - dst->p = (GSVector4(xy) * m_pos_scale).upld(GSVector4::f64(z, 0.0)); + dst->p = (GSVector4(xy) * s_pos_scale).upld(GSVector4::f64(z, 0.0)); t = t.blend32<8>(GSVector4(xyzuvf << 7)); } @@ -251,22 +311,23 @@ void GSVertexSW::ConvertVertexBuffer(GSDrawingContext* RESTRICT ctx, GSVertexSW* } } -// clang-format off -GSVertexSW::ConvertVertexBufferPtr GSVertexSW::s_cvb[4][2][2][2] = { -#define InitCVB3(P, T, F) { &GSVertexSW::ConvertVertexBuffer, &GSVertexSW::ConvertVertexBuffer } -#define InitCVB2(P, T) { InitCVB3(P, T, 0), InitCVB3(P, T, 1) } -#define InitCVB(P) { InitCVB2(static_cast(P), 0), InitCVB2(static_cast(P), 1) } - - InitCVB(GS_POINT_CLASS), - InitCVB(GS_LINE_CLASS), - InitCVB(GS_TRIANGLE_CLASS), - InitCVB(GS_SPRITE_CLASS) - -#undef InitCVB +void GSVertexSWInitStatic() +{ +#define InitCVB4(P, T, F, Q) GSVertexSW::s_cvb[P][T][F][Q] = ConvertVertexBuffer; +#define InitCVB3(P, T, F) InitCVB4(P, T, F, 0) InitCVB4(P, T, F, 1) +#define InitCVB2(P, T) InitCVB3(P, T, 0) InitCVB3(P, T, 1) +#define InitCVB1(P) InitCVB2(P, 0) InitCVB2(P, 1) + InitCVB1(GS_POINT_CLASS) + InitCVB1(GS_LINE_CLASS) + InitCVB1(GS_TRIANGLE_CLASS) + InitCVB1(GS_SPRITE_CLASS) +#undef InitCVB1 #undef InitCVB2 #undef InitCVB3 -}; -// clang-format on +#undef InitCVB4 +} + +MULTI_ISA_UNSHARED_END void GSRendererSW::Draw() { @@ -323,8 +384,6 @@ void GSRendererSW::Draw() GSVector4i r = bbox.rintersect(scissor); - scissor.z = std::min(scissor.z, (int)context->FRAME.FBW * 64); // TODO: find a game that overflows and check which one is the right behaviour - sd->scissor = scissor; sd->bbox = bbox; sd->frame = g_perfmon.GetFrame(); @@ -573,7 +632,9 @@ void GSRendererSW::Sync(int reason) g_perfmon.Put(GSPerfMon::Fillrate, pixels); } -void GSRendererSW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) +void GSRendererSW::ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) {} + +void GSRendererSW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite) { if (LOG) { @@ -971,7 +1032,7 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data) bool zwrite = zm != 0xffffffff; bool ztest = context->TEST.ZTE && context->TEST.ZTST > ZTST_ALWAYS; /* - printf("%05x %d %05x %d %05x %d %dx%d\n", + printf("%05x %d %05x %d %05x %d %dx%d\n", fwrite || ftest ? m_context->FRAME.Block() : 0xfffff, m_context->FRAME.PSM, zwrite || ztest ? m_context->ZBUF.Block() : 0xfffff, m_context->ZBUF.PSM, PRIM->TME ? m_context->TEX0.TBP0 : 0xfffff, m_context->TEX0.PSM, (int)m_context->TEX0.TW, (int)m_context->TEX0.TH); @@ -1168,6 +1229,11 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data) u16 tw = 1u << TEX0.TW; u16 th = 1u << TEX0.TH; + if (tw > 1024) + tw = 1; + if (th > 1024) + th = 1; + switch (context->CLAMP.WMS) { case CLAMP_REPEAT: @@ -1181,13 +1247,16 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data) gd.t.mask.U32[0] = 0; break; case CLAMP_REGION_CLAMP: + // REGION_CLAMP ignores the actual texture size, but tw is already optimised in GetFixedTEX0Size. + // It's important we don't go off MAXU (if bigger) here as the sw renderer can attempt to draw pixels outside the triangle which can cause out of bounds issues. gd.t.min.U16[0] = gd.t.minmax.U16[0] = std::min(context->CLAMP.MINU, tw - 1); gd.t.max.U16[0] = gd.t.minmax.U16[2] = std::min(context->CLAMP.MAXU, tw - 1); gd.t.mask.U32[0] = 0; break; case CLAMP_REGION_REPEAT: + // MINU is restricted to MINU or texture size, whichever is smaller, MAXU is an offset in the texture (Can be bigger than the texture). gd.t.min.U16[0] = gd.t.minmax.U16[0] = context->CLAMP.MINU & (tw - 1); - gd.t.max.U16[0] = gd.t.minmax.U16[2] = context->CLAMP.MAXU & (tw - 1); + gd.t.max.U16[0] = gd.t.minmax.U16[2] = context->CLAMP.MAXU; gd.t.mask.U32[0] = 0xffffffff; break; default: @@ -1207,13 +1276,16 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data) gd.t.mask.U32[2] = 0; break; case CLAMP_REGION_CLAMP: + // REGION_CLAMP ignores the actual texture size, but th is already optimised in GetFixedTEX0Size + // It's important we don't go off MAXV (if bigger) here as the sw renderer can attempt to draw pixels outside the triangle which can cause out of bounds issues. gd.t.min.U16[4] = gd.t.minmax.U16[1] = std::min(context->CLAMP.MINV, th - 1); gd.t.max.U16[4] = gd.t.minmax.U16[3] = std::min(context->CLAMP.MAXV, th - 1); // ffx anima summon scene, when the anchor appears (th = 256, maxv > 256) gd.t.mask.U32[2] = 0; break; case CLAMP_REGION_REPEAT: + // MINV is restricted to MINV or texture size, whichever is smaller, MAXV is an offset in the texture (Can be bigger than the texture). gd.t.min.U16[4] = gd.t.minmax.U16[1] = context->CLAMP.MINV & (th - 1); // skygunner main menu water texture 64x64, MINV = 127 - gd.t.max.U16[4] = gd.t.minmax.U16[3] = context->CLAMP.MAXV & (th - 1); + gd.t.max.U16[4] = gd.t.minmax.U16[3] = context->CLAMP.MAXV; gd.t.mask.U32[2] = 0xffffffff; break; default: @@ -1250,7 +1322,7 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data) gd.sel.pabe = 1; } - if (GSConfig.AA1 && PRIM->AA1 && (primclass == GS_LINE_CLASS || primclass == GS_TRIANGLE_CLASS)) + if (PRIM->AA1 && (primclass == GS_LINE_CLASS || primclass == GS_TRIANGLE_CLASS)) { gd.sel.aa1 = 1; } diff --git a/pcsx2/GS/Renderers/SW/GSRendererSW.h b/pcsx2/GS/Renderers/SW/GSRendererSW.h index 85c63b99c3..321bfa7c14 100644 --- a/pcsx2/GS/Renderers/SW/GSRendererSW.h +++ b/pcsx2/GS/Renderers/SW/GSRendererSW.h @@ -18,6 +18,9 @@ #include "GSTextureCacheSW.h" #include "GSDrawScanline.h" #include "GS/GSRingHeap.h" +#include "GS/MultiISA.h" + +MULTI_ISA_UNSHARED_START class GSRendererSW final : public GSRenderer { @@ -75,7 +78,8 @@ protected: void Draw() override; void Queue(GSRingHeap::SharedPtr& item); void Sync(int reason); - void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) override; + void ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) override; + void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite = false) override; void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut = false) override; void UsePages(const GSOffset::PageLooper& pages, const int type); @@ -94,3 +98,5 @@ public: void Destroy() override; }; + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/GS/Renderers/SW/GSScanlineEnvironment.h b/pcsx2/GS/Renderers/SW/GSScanlineEnvironment.h index a6696a6473..1c4ffe4cf9 100644 --- a/pcsx2/GS/Renderers/SW/GSScanlineEnvironment.h +++ b/pcsx2/GS/Renderers/SW/GSScanlineEnvironment.h @@ -109,12 +109,12 @@ union GSScanlineSelector "tfx:%d tcc:%d fst:%d ltf:%d tlu:%d wms:%d wmt:%d mmin:%d lcm:%d tw:%d " "fba:%d cclamp:%d date:%d datm:%d " "prim:%d abe:%d %d%d%d%d fge:%d dthe:%d notest:%d pabe:%d aa1:%d " - "fwrite:%d ftest:%d zoverflow:%d zclamp:%d edge:%d", + "fwrite:%d ftest:%d zoverflow:%d zequal:%d zclamp:%d edge:%d", fpsm, zpsm, ztst, ztest, atst, afail, iip, rfb, fb, zb, zwrite, tfx, tcc, fst, ltf, tlu, wms, wmt, mmin, lcm, tw, fba, colclamp, date, datm, prim, abe, aba, abb, abc, abd, fge, dthe, notest, pabe, aa1, - fwrite, ftest, zoverflow, zclamp, edge); + fwrite, ftest, zoverflow, zequal, zclamp, edge); return str; } @@ -233,84 +233,61 @@ struct alignas(32) GSScanlineLocalData // per prim variables, each thread has it }; // Constant shared by all threads (to reduce cache miss) -// -// Note: Avoid GSVector* to support all ISA at once -// -// WARNING: Don't use static storage. Static variables are relocated to random -// location (above 2GB). Small allocation on the heap could be below 2GB, this way we can use -// absolute addressing. Otherwise we need to store a base address in a register. struct GSScanlineConstantData : public GSAlignedClass<32> { - alignas(32) u8 m_test_256b[16][8]; - alignas(32) float m_shift_256b[9][8]; - alignas(32) float m_log2_coef_256b[4][8]; + alignas(32) u8 m_test_256b[16][8] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + }; + alignas(32) float m_shift_256b[9][8] = { + { 8.0f , 8.0f , 8.0f , 8.0f , 8.0f , 8.0f , 8.0f , 8.0f}, + { 0.0f , 1.0f , 2.0f , 3.0f , 4.0f , 5.0f , 6.0f , 7.0f}, + { -1.0f , 0.0f , 1.0f , 2.0f , 3.0f , 4.0f , 5.0f , 6.0f}, + { -2.0f , -1.0f , 0.0f , 1.0f , 2.0f , 3.0f , 4.0f , 5.0f}, + { -3.0f , -2.0f , -1.0f , 0.0f , 1.0f , 2.0f , 3.0f , 4.0f}, + { -4.0f , -3.0f , -2.0f , -1.0f , 0.0f , 1.0f , 2.0f , 3.0f}, + { -5.0f , -4.0f , -3.0f , -2.0f , -1.0f , 0.0f , 1.0f , 2.0f}, + { -6.0f , -5.0f , -4.0f , -3.0f , -2.0f , -1.0f , 0.0f , 1.0f}, + { -7.0f , -6.0f , -5.0f , -4.0f , -3.0f , -2.0f , -1.0f , 0.0f}, + }; + alignas(32) float m_log2_coef_256b[4][8] = {}; - alignas(16) u32 m_test_128b[8][4]; - alignas(16) float m_shift_128b[5][4]; - alignas(16) float m_log2_coef_128b[4][4]; + alignas(16) u32 m_test_128b[8][4] = { + {0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0xffffffff, 0x00000000, 0x00000000, 0x00000000}, + {0xffffffff, 0xffffffff, 0x00000000, 0x00000000}, + {0xffffffff, 0xffffffff, 0xffffffff, 0x00000000}, + {0x00000000, 0xffffffff, 0xffffffff, 0xffffffff}, + {0x00000000, 0x00000000, 0xffffffff, 0xffffffff}, + {0x00000000, 0x00000000, 0x00000000, 0xffffffff}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }; + alignas(16) float m_shift_128b[5][4] = { + { 4.0f , 4.0f , 4.0f , 4.0f}, + { 0.0f , 1.0f , 2.0f , 3.0f}, + { -1.0f , 0.0f , 1.0f , 2.0f}, + { -2.0f , -1.0f , 0.0f , 1.0f}, + { -3.0f , -2.0f , -1.0f , 0.0f}, + }; + alignas(16) float m_log2_coef_128b[4][4] = {}; - GSScanlineConstantData() {} - - // GCC will be clever enough to stick some AVX instruction here - // So it must be defered to post global constructor - void Init() + constexpr GSScanlineConstantData() { - u8 I_hate_vs2013_m_test_256b[16][8] = { - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, - {0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - {0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - {0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff}, - {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} - }; - - u32 I_hate_vs2013_m_test_128b[8][4] = { - {0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0xffffffff, 0x00000000, 0x00000000, 0x00000000}, - {0xffffffff, 0xffffffff, 0x00000000, 0x00000000}, - {0xffffffff, 0xffffffff, 0xffffffff, 0x00000000}, - {0x00000000, 0xffffffff, 0xffffffff, 0xffffffff}, - {0x00000000, 0x00000000, 0xffffffff, 0xffffffff}, - {0x00000000, 0x00000000, 0x00000000, 0xffffffff}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000} - }; - - float I_hate_vs2013_m_shift_256b[9][8] = { - { 8.0f , 8.0f , 8.0f , 8.0f , 8.0f , 8.0f , 8.0f , 8.0f}, - { 0.0f , 1.0f , 2.0f , 3.0f , 4.0f , 5.0f , 6.0f , 7.0f}, - { -1.0f , 0.0f , 1.0f , 2.0f , 3.0f , 4.0f , 5.0f , 6.0f}, - { -2.0f , -1.0f , 0.0f , 1.0f , 2.0f , 3.0f , 4.0f , 5.0f}, - { -3.0f , -2.0f , -1.0f , 0.0f , 1.0f , 2.0f , 3.0f , 4.0f}, - { -4.0f , -3.0f , -2.0f , -1.0f , 0.0f , 1.0f , 2.0f , 3.0f}, - { -5.0f , -4.0f , -3.0f , -2.0f , -1.0f , 0.0f , 1.0f , 2.0f}, - { -6.0f , -5.0f , -4.0f , -3.0f , -2.0f , -1.0f , 0.0f , 1.0f}, - { -7.0f , -6.0f , -5.0f , -4.0f , -3.0f , -2.0f , -1.0f , 0.0f} - }; - - float I_hate_vs2013_m_shift_128b[5][4] = { - { 4.0f , 4.0f , 4.0f , 4.0f}, - { 0.0f , 1.0f , 2.0f , 3.0f}, - { -1.0f , 0.0f , 1.0f , 2.0f}, - { -2.0f , -1.0f , 0.0f , 1.0f}, - { -3.0f , -2.0f , -1.0f , 0.0f} - }; - - memcpy(m_test_256b, I_hate_vs2013_m_test_256b, sizeof(I_hate_vs2013_m_test_256b)); - memcpy(m_test_128b, I_hate_vs2013_m_test_128b, sizeof(I_hate_vs2013_m_test_128b)); - memcpy(m_shift_256b, I_hate_vs2013_m_shift_256b, sizeof(I_hate_vs2013_m_shift_256b)); - memcpy(m_shift_128b, I_hate_vs2013_m_shift_128b, sizeof(I_hate_vs2013_m_shift_128b)); - - float log2_coef[] = { + constexpr float log2_coef[] = { 0.204446009836232697516f, -1.04913055217340124191f, 2.28330284476918490682f, @@ -329,4 +306,4 @@ struct GSScanlineConstantData : public GSAlignedClass<32> } }; -extern std::unique_ptr g_const; +extern const GSScanlineConstantData g_const; diff --git a/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.all.cpp b/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.all.cpp index a1992dc1b1..58c25414a1 100644 --- a/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.all.cpp +++ b/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.all.cpp @@ -17,6 +17,7 @@ #include "GSSetupPrimCodeGenerator.all.h" #include "GSVertexSW.h" +MULTI_ISA_UNSHARED_IMPL; using namespace Xbyak; #define _rip_local(field) ((m_rip) ? ptr[rip + (char*)&m_local.field] : ptr[_m_local + OFFSETOF(GSScanlineLocalData, field)]) @@ -47,7 +48,7 @@ using namespace Xbyak; #define _rip_local_d_p(x) _rip_local_d(x) #endif -GSSetupPrimCodeGenerator2::GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, u64 key) +GSSetupPrimCodeGenerator2::GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, const ProcessorFeatures& cpu, void* param, u64 key) : _parent(base, cpu) , m_local(*(GSScanlineLocalData*)param) , m_rip(false), many_regs(false) @@ -122,9 +123,9 @@ void GSSetupPrimCodeGenerator2::Generate() { if (isXmm) - mov(rax, (size_t)g_const->m_shift_128b); + mov(rax, (size_t)g_const.m_shift_128b); else - mov(rax, (size_t)g_const->m_shift_256b); + mov(rax, (size_t)g_const.m_shift_256b); for (int i = 0; i < (m_sel.notest ? 2 : many_regs ? 9 : 5); i++) { @@ -269,7 +270,7 @@ void GSSetupPrimCodeGenerator2::Depth_YMM() if (i < 4 || many_regs) vmulps(ymm0, Ymm(4 + i), ymm1); else - vmulps(ymm0, ymm1, ptr[g_const->m_shift_256b[i + 1]]); + vmulps(ymm0, ymm1, ptr[g_const.m_shift_256b[i + 1]]); cvttps2dq(ymm0, ymm0); pshuflw(ymm0, ymm0, _MM_SHUFFLE(2, 2, 0, 0)); pshufhw(ymm0, ymm0, _MM_SHUFFLE(2, 2, 0, 0)); @@ -297,7 +298,7 @@ void GSSetupPrimCodeGenerator2::Depth_YMM() if (i < 4 || many_regs) vmulps(ymm1, Ymm(4 + i), ymm0); else - vmulps(ymm1, ymm0, ptr[g_const->m_shift_256b[i + 1]]); + vmulps(ymm1, ymm0, ptr[g_const.m_shift_256b[i + 1]]); movaps(_rip_local(d[i].z), ymm1); } } @@ -372,7 +373,7 @@ void GSSetupPrimCodeGenerator2::Texture() if (i < 4 || many_regs) THREEARG(mulps, xym2, XYm(4 + i), xym1); else - vmulps(ymm2, ymm1, ptr[g_const->m_shift_256b[i + 1]]); + vmulps(ymm2, ymm1, ptr[g_const.m_shift_256b[i + 1]]); if (m_sel.fst) { @@ -440,7 +441,7 @@ void GSSetupPrimCodeGenerator2::Color() if (i < 4 || many_regs) THREEARG(mulps, xym0, XYm(4 + i), xym2); else - vmulps(ymm0, ymm2, ptr[g_const->m_shift_256b[i + 1]]); + vmulps(ymm0, ymm2, ptr[g_const.m_shift_256b[i + 1]]); cvttps2dq(xym0, xym0); packssdw(xym0, xym0); @@ -449,7 +450,7 @@ void GSSetupPrimCodeGenerator2::Color() if (i < 4 || many_regs) THREEARG(mulps, xym1, XYm(4 + i), xym3); else - vmulps(ymm1, ymm3, ptr[g_const->m_shift_256b[i + 1]]); + vmulps(ymm1, ymm3, ptr[g_const.m_shift_256b[i + 1]]); cvttps2dq(xym1, xym1); packssdw(xym1, xym1); @@ -476,7 +477,7 @@ void GSSetupPrimCodeGenerator2::Color() if (i < 4 || many_regs) THREEARG(mulps, xym0, XYm(4 + i), xym2); else - vmulps(ymm0, ymm2, ptr[g_const->m_shift_256b[i + 1]]); + vmulps(ymm0, ymm2, ptr[g_const.m_shift_256b[i + 1]]); cvttps2dq(xym0, xym0); packssdw(xym0, xym0); @@ -485,7 +486,7 @@ void GSSetupPrimCodeGenerator2::Color() if (i < 4 || many_regs) THREEARG(mulps, xym1, XYm(4 + i), xym3); else - vmulps(ymm1, ymm3, ptr[g_const->m_shift_256b[i + 1]]); + vmulps(ymm1, ymm3, ptr[g_const.m_shift_256b[i + 1]]); cvttps2dq(xym1, xym1); packssdw(xym1, xym1); diff --git a/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.all.h b/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.all.h index 6b1463f919..97bd68634f 100644 --- a/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.all.h +++ b/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.all.h @@ -17,6 +17,7 @@ #include "GSScanlineEnvironment.h" #include "GSNewCodeGenerator.h" +#include "GS/MultiISA.h" #if _M_SSE >= 0x501 #define SETUP_PRIM_VECTOR_REGISTER Xbyak::Ymm @@ -28,6 +29,8 @@ #define SETUP_PRIM_USING_YMM 0 #endif +MULTI_ISA_UNSHARED_START + class GSSetupPrimCodeGenerator2 : public GSNewCodeGenerator { using _parent = GSNewCodeGenerator; @@ -63,7 +66,7 @@ class GSSetupPrimCodeGenerator2 : public GSNewCodeGenerator } public: - GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, u64 key); + GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, const ProcessorFeatures& cpu, void* param, u64 key); void Generate(); private: @@ -77,3 +80,5 @@ private: void Texture(); void Color(); }; + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.cpp b/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.cpp index d28d7ba162..a30740d439 100644 --- a/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.cpp +++ b/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.cpp @@ -17,10 +17,10 @@ #include "GSSetupPrimCodeGenerator.h" #include "GSSetupPrimCodeGenerator.all.h" -using namespace Xbyak; +MULTI_ISA_UNSHARED_IMPL; GSSetupPrimCodeGenerator::GSSetupPrimCodeGenerator(void* param, u64 key, void* code, size_t maxsize) - : GSCodeGenerator(code, maxsize) + : Xbyak::CodeGenerator(maxsize, code) , m_local(*(GSScanlineLocalData*)param) , m_rip(false) { @@ -31,5 +31,5 @@ GSSetupPrimCodeGenerator::GSSetupPrimCodeGenerator(void* param, u64 key, void* c m_en.t = m_sel.fb && m_sel.tfx != TFX_NONE ? 1 : 0; m_en.c = m_sel.fb && !(m_sel.tfx == TFX_DECAL && m_sel.tcc) ? 1 : 0; - GSSetupPrimCodeGenerator2(this, CPUInfo(m_cpu), param, key).Generate(); + GSSetupPrimCodeGenerator2(this, g_cpu, param, key).Generate(); } diff --git a/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.h b/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.h index 17b50e6b60..29b03bbc18 100644 --- a/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.h +++ b/pcsx2/GS/Renderers/SW/GSSetupPrimCodeGenerator.h @@ -16,10 +16,13 @@ #pragma once #include "GSScanlineEnvironment.h" -#include "GS/Renderers/Common/GSFunctionMap.h" #include "GS/GSUtil.h" +#include "GS/MultiISA.h" +#include -class GSSetupPrimCodeGenerator : public GSCodeGenerator +MULTI_ISA_UNSHARED_START + +class GSSetupPrimCodeGenerator : public Xbyak::CodeGenerator { void operator=(const GSSetupPrimCodeGenerator&); @@ -35,3 +38,5 @@ class GSSetupPrimCodeGenerator : public GSCodeGenerator public: GSSetupPrimCodeGenerator(void* param, u64 key, void* code, size_t maxsize); }; + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/GS/Renderers/SW/GSTextureCacheSW.cpp b/pcsx2/GS/Renderers/SW/GSTextureCacheSW.cpp index 46c2cd16df..131254ad20 100644 --- a/pcsx2/GS/Renderers/SW/GSTextureCacheSW.cpp +++ b/pcsx2/GS/Renderers/SW/GSTextureCacheSW.cpp @@ -135,15 +135,14 @@ void GSTextureCacheSW::IncAge() // GSTextureCacheSW::Texture::Texture(u32 tw0, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA) - : m_buff(NULL) + : m_TEX0(TEX0) + , m_TEXA(TEXA) + , m_buff(NULL) , m_tw(tw0) , m_age(0) , m_complete(false) , m_p2t(NULL) { - m_TEX0 = TEX0; - m_TEXA = TEXA; - if (m_tw == 0) { m_tw = std::max(m_TEX0.TW, GSLocalMemory::m_psm[m_TEX0.PSM].pal == 0 ? 3 : 5); // makes one row 32 bytes at least, matches the smallest block size that is allocated for m_buff @@ -280,7 +279,7 @@ bool GSTextureCacheSW::Texture::Update(const GSVector4i& rect) { m_valid[row] |= col; - (mem.*rtxbP)(block, &dst[bn.blkX() << shift], pitch, m_TEXA); + rtxbP(mem, block, &dst[bn.blkX() << shift], pitch, m_TEXA); blocks++; } @@ -302,7 +301,7 @@ bool GSTextureCacheSW::Texture::Update(const GSVector4i& rect) { m_valid[row] |= col; - (mem.*rtxbP)(block, &dst[bn.blkX() << shift], pitch, m_TEXA); + rtxbP(mem, block, &dst[bn.blkX() << shift], pitch, m_TEXA); blocks++; } diff --git a/pcsx2/GS/Renderers/SW/GSVertexSW.h b/pcsx2/GS/Renderers/SW/GSVertexSW.h index 028ecbc381..316f6cde61 100644 --- a/pcsx2/GS/Renderers/SW/GSVertexSW.h +++ b/pcsx2/GS/Renderers/SW/GSVertexSW.h @@ -246,17 +246,11 @@ struct alignas(32) GSVertexSW #endif } - typedef void (*ConvertVertexBufferPtr)(GSDrawingContext* RESTRICT ctx, GSVertexSW* RESTRICT dst, const GSVertex* RESTRICT src, size_t count); + typedef void (*ConvertVertexBufferPtr)(const GSDrawingContext* RESTRICT ctx, GSVertexSW* RESTRICT dst, const GSVertex* RESTRICT src, size_t count); static ConvertVertexBufferPtr s_cvb[4][2][2][2]; - template - static void ConvertVertexBuffer(GSDrawingContext* RESTRICT ctx, GSVertexSW* RESTRICT dst, const GSVertex* RESTRICT src, size_t count); - - static const GSVector4 m_pos_scale; -#if _M_SSE >= 0x501 - static const GSVector8 m_pos_scale2; -#endif + static void InitStatic(); }; #if _M_SSE >= 0x501 diff --git a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp index 5802922d41..e6b2d8df02 100644 --- a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp +++ b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp @@ -20,6 +20,7 @@ #include "common/Vulkan/SwapChain.h" #include "common/Vulkan/Util.h" #include "common/Align.h" +#include "common/Path.h" #include "common/ScopedGuard.h" #include "GS.h" #include "GSDeviceVK.h" @@ -35,21 +36,8 @@ static u32 s_debug_scope_depth = 0; #endif -static bool IsDepthConvertShader(ShaderConvert i) -{ - return (i == ShaderConvert::DEPTH_COPY || i == ShaderConvert::RGBA8_TO_FLOAT32 || - i == ShaderConvert::RGBA8_TO_FLOAT24 || i == ShaderConvert::RGBA8_TO_FLOAT16 || - i == ShaderConvert::RGB5A1_TO_FLOAT16 || i == ShaderConvert::DATM_0 || - i == ShaderConvert::DATM_1); -} - -static bool IsIntConvertShader(ShaderConvert i) -{ - return (i == ShaderConvert::RGBA8_TO_16_BITS || i == ShaderConvert::FLOAT32_TO_16_BITS || - i == ShaderConvert::FLOAT32_TO_32_BITS); -} - static bool IsDATMConvertShader(ShaderConvert i) { return (i == ShaderConvert::DATM_0 || i == ShaderConvert::DATM_1); } +static bool IsDATEModePrimIDInit(u32 flag) { return flag == 1 || flag == 2; } static VkAttachmentLoadOp GetLoadOpForTexture(GSTextureVK* tex) { @@ -78,9 +66,9 @@ GSDeviceVK::GSDeviceVK() GSDeviceVK::~GSDeviceVK() {} -bool GSDeviceVK::Create(HostDisplay* display) +bool GSDeviceVK::Create() { - if (!GSDevice::Create(display) || !CheckFeatures()) + if (!GSDevice::Create() || !CheckFeatures()) return false; { @@ -129,6 +117,8 @@ bool GSDeviceVK::Create(HostDisplay* display) return false; } + CompileCASPipelines(); + InitializeState(); return true; } @@ -244,7 +234,12 @@ bool GSDeviceVK::CheckFeatures() m_features.texture_barrier = GSConfig.OverrideTextureBarriers != 0; m_features.broken_point_sampler = isAMD; m_features.geometry_shader = features.geometryShader && GSConfig.OverrideGeometryShaders != 0; - m_features.image_load_store = features.fragmentStoresAndAtomics; + // Usually, geometry shader indicates primid support + // However on Metal (MoltenVK), geometry shader is never available, but primid sometimes is + // Officially, it's available on GPUs that support barycentric coordinates (Newer AMD and Apple) + // Unofficially, it seems to work on older Intel GPUs (but breaks other things on newer Intel GPUs, see GSMTLDeviceInfo.mm for details) + // We'll only enable for the officially supported GPUs here. We'll leave in the option of force-enabling it with OverrideGeometryShaders though. + m_features.primitive_id = features.geometryShader || GSConfig.OverrideGeometryShaders == 1 || g_vulkan_context->GetOptionalExtensions().vk_khr_fragment_shader_barycentric; m_features.prefer_new_textures = true; m_features.provoking_vertex_last = g_vulkan_context->GetOptionalExtensions().vk_ext_provoking_vertex; m_features.dual_source_blend = features.dualSrcBlend && !GSConfig.DisableDualSourceBlend; @@ -303,7 +298,8 @@ bool GSDeviceVK::CheckFeatures() if (!m_features.texture_barrier && !m_features.stencil_buffer) { Host::AddKeyedOSDMessage("GSDeviceVK_NoTextureBarrierOrStencilBuffer", - "Stencil buffers and texture barriers are both unavailable, this will break some graphical effects.", 10.0f); + "Stencil buffers and texture barriers are both unavailable, this will break some graphical effects.", + Host::OSD_WARNING_DURATION); } return true; @@ -386,7 +382,7 @@ VkFormat GSDeviceVK::LookupNativeFormat(GSTexture::Format format) const static constexpr std::array(GSTexture::Format::BC7) + 1> s_format_mapping = {{ VK_FORMAT_UNDEFINED, // Invalid VK_FORMAT_R8G8B8A8_UNORM, // Color - VK_FORMAT_R32G32B32A32_SFLOAT, // FloatColor + VK_FORMAT_R16G16B16A16_UNORM, // HDRColor VK_FORMAT_D32_SFLOAT_S8_UINT, // DepthStencil VK_FORMAT_R8_UNORM, // UNorm8 VK_FORMAT_R16_UINT, // UInt16 @@ -405,13 +401,21 @@ VkFormat GSDeviceVK::LookupNativeFormat(GSTexture::Format format) const GSTexture* GSDeviceVK::CreateSurface(GSTexture::Type type, int width, int height, int levels, GSTexture::Format format) { - pxAssert(type != GSTexture::Type::Offscreen && type != GSTexture::Type::SparseRenderTarget && - type != GSTexture::Type::SparseDepthStencil); + pxAssert(type != GSTexture::Type::Offscreen); const u32 clamped_width = static_cast(std::clamp(1, width, g_vulkan_context->GetMaxImageDimension2D())); const u32 clamped_height = static_cast(std::clamp(1, height, g_vulkan_context->GetMaxImageDimension2D())); - return GSTextureVK::Create(type, clamped_width, clamped_height, levels, format, LookupNativeFormat(format)).release(); + std::unique_ptr tex(GSTextureVK::Create(type, clamped_width, clamped_height, levels, format, LookupNativeFormat(format))); + if (!tex) + { + // We're probably out of vram, try flushing the command buffer to release pending textures. + PurgePool(); + ExecuteCommandBufferAndRestartRenderPass(true, "Couldn't allocate texture."); + tex = GSTextureVK::Create(type, clamped_width, clamped_height, levels, format, LookupNativeFormat(format)); + } + + return tex.release(); } bool GSDeviceVK::DownloadTexture(GSTexture* src, const GSVector4i& rect, GSTexture::GSMap& out_map) @@ -471,6 +475,17 @@ bool GSDeviceVK::DownloadTexture(GSTexture* src, const GSVector4i& rect, GSTextu } ExecuteCommandBuffer(true); + if (GSConfig.HWSpinGPUForReadbacks) + { + g_vulkan_context->NotifyOfReadback(); + if (!g_vulkan_context->GetOptionalExtensions().vk_ext_calibrated_timestamps && !m_warned_slow_spin) + { + m_warned_slow_spin = true; + Host::AddKeyedOSDMessage("GSDeviceVK_NoCalibratedTimestamps", + "Spin GPU During Readbacks is enabled, but calibrated timestamps are unavailable. This might be really slow.", + Host::OSD_WARNING_DURATION); + } + } // invalidate cpu cache before reading VkResult res = vmaInvalidateAllocation(g_vulkan_context->GetAllocator(), m_readback_staging_allocation, 0, size); @@ -508,25 +523,38 @@ void GSDeviceVK::CopyRect(GSTexture* sTex, GSTexture* dTex, const GSVector4i& r, return; } - else + + if (dTexVK->GetState() == GSTexture::State::Cleared) { - // otherwise we need to do an attachment clear - const bool depth = (dTexVK->GetType() == GSTexture::Type::DepthStencil); - OMSetRenderTargets(depth ? nullptr : dTexVK, depth ? dTexVK : nullptr, dtex_rc, false); - BeginRenderPassForStretchRect(dTexVK, dtex_rc, GSVector4i(destX, destY, destX + r.width(), destY + r.height())); - - // so use an attachment clear - VkClearAttachment ca; - ca.aspectMask = depth ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT; - GSVector4::store(ca.clearValue.color.float32, sTexVK->GetClearColor()); - ca.clearValue.depthStencil.depth = sTexVK->GetClearDepth(); - ca.clearValue.depthStencil.stencil = 0; - ca.colorAttachment = 0; - - const VkClearRect cr = { {{0, 0}, {static_cast(r.width()), static_cast(r.height())}}, 0u, 1u }; - vkCmdClearAttachments(g_vulkan_context->GetCurrentCommandBuffer(), 1, &ca, 1, &cr); - return; + // destination is cleared, if it's the same colour and rect, we can just avoid this entirely + if (dTexVK->IsDepthStencil()) + { + if (dTexVK->GetClearDepth() == sTexVK->GetClearDepth()) + return; + } + else + { + if ((dTexVK->GetClearColor() == (sTexVK->GetClearColor())).alltrue()) + return; + } } + + // otherwise we need to do an attachment clear + const bool depth = (dTexVK->GetType() == GSTexture::Type::DepthStencil); + OMSetRenderTargets(depth ? nullptr : dTexVK, depth ? dTexVK : nullptr, dtex_rc, false); + BeginRenderPassForStretchRect(dTexVK, dtex_rc, GSVector4i(destX, destY, destX + r.width(), destY + r.height())); + + // so use an attachment clear + VkClearAttachment ca; + ca.aspectMask = depth ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT; + GSVector4::store(ca.clearValue.color.float32, sTexVK->GetClearColor()); + ca.clearValue.depthStencil.depth = sTexVK->GetClearDepth(); + ca.clearValue.depthStencil.stencil = 0; + ca.colorAttachment = 0; + + const VkClearRect cr = { {{0, 0}, {static_cast(r.width()), static_cast(r.height())}}, 0u, 1u }; + vkCmdClearAttachments(g_vulkan_context->GetCurrentCommandBuffer(), 1, &ca, 1, &cr); + return; } // commit the clear to the source first, then do normal copy @@ -548,9 +576,15 @@ void GSDeviceVK::CopyRect(GSTexture* sTex, GSTexture* dTex, const GSVector4i& r, EndRenderPass(); dTexVK->TransitionToLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + dTexVK->SetUsedThisCommandBuffer(); + sTexVK->TransitionToLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); sTexVK->SetUsedThisCommandBuffer(); + // ensure we don't leave this bound later on + if (m_tfx_textures[0] == sTexVK->GetView()) + PSSetShaderResource(0, nullptr, false); + vkCmdCopyImage(g_vulkan_context->GetCurrentCommandBuffer(), sTexVK->GetImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dTexVK->GetImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &ic); @@ -560,7 +594,8 @@ void GSDeviceVK::CopyRect(GSTexture* sTex, GSTexture* dTex, const GSVector4i& r, void GSDeviceVK::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* dTex, const GSVector4& dRect, ShaderConvert shader /* = ShaderConvert::COPY */, bool linear /* = true */) { - pxAssert(IsDepthConvertShader(shader) == (dTex && dTex->GetType() == GSTexture::Type::DepthStencil)); + pxAssert(HasDepthOutput(shader) == (dTex && dTex->GetType() == GSTexture::Type::DepthStencil)); + pxAssert(linear ? SupportsBilinear(shader) : SupportsNearest(shader)); GL_INS("StretchRect(%d) {%d,%d} %dx%d -> {%d,%d) %dx%d", shader, int(sRect.left), int(sRect.top), int(sRect.right - sRect.left), int(sRect.bottom - sRect.top), int(dRect.left), int(dRect.top), @@ -585,7 +620,7 @@ void GSDeviceVK::PresentRect(GSTexture* sTex, const GSVector4& sRect, GSTexture* { DisplayConstantBuffer cb; cb.SetSource(sRect, sTex->GetSize()); - cb.SetTarget(dRect, dTex ? dTex->GetSize() : GSVector2i(m_display->GetWindowWidth(), m_display->GetWindowHeight())); + cb.SetTarget(dRect, dTex ? dTex->GetSize() : GSVector2i(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight())); cb.SetTime(shaderTime); SetUtilityPushConstants(&cb, sizeof(cb)); @@ -650,7 +685,7 @@ void GSDeviceVK::DoStretchRect(GSTextureVK* sTex, const GSVector4& sRect, GSText const bool is_present = (!dTex); const bool depth = (dTex && dTex->GetType() == GSTexture::Type::DepthStencil); const GSVector2i size( - is_present ? GSVector2i(m_display->GetWindowWidth(), m_display->GetWindowHeight()) : dTex->GetSize()); + is_present ? GSVector2i(g_host_display->GetWindowWidth(), g_host_display->GetWindowHeight()) : dTex->GetSize()); const GSVector4i dtex_rc(0, 0, size.x, size.y); const GSVector4i dst_rc(GSVector4i(dRect).rintersect(dtex_rc)); @@ -706,14 +741,15 @@ void GSDeviceVK::BlitRect(GSTexture* sTex, const GSVector4i& sRect, u32 sLevel, GSTextureVK* sTexVK = static_cast(sTex); GSTextureVK* dTexVK = static_cast(dTex); - //const VkImageLayout old_src_layout = sTexVK->GetTexture().GetLayout(); - //const VkImageLayout old_dst_layout = dTexVK->GetTexture().GetLayout(); - EndRenderPass(); sTexVK->TransitionToLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); dTexVK->TransitionToLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + // ensure we don't leave this bound later on + if (m_tfx_textures[0] == sTexVK->GetView()) + PSSetShaderResource(0, nullptr, false); + pxAssert( (sTexVK->GetType() == GSTexture::Type::DepthStencil) == (dTexVK->GetType() == GSTexture::Type::DepthStencil)); const VkImageAspectFlags aspect = @@ -833,22 +869,24 @@ void GSDeviceVK::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, static_cast(dTex)->TransitionToLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); } -void GSDeviceVK::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset) +void GSDeviceVK::DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset, int bufIdx) { - const GSVector2i size(dTex->GetSize()); - const GSVector4 s = GSVector4(size); + const GSVector2i ds_i = dTex->GetSize(); + const GSVector4 ds = GSVector4(ds_i); + const GSVector4 sRect(0, 0, 1, 1); - const GSVector4 dRect(0.0f, yoffset, s.x, s.y + yoffset); + const GSVector4 dRect(0.0f, yoffset, ds.x, ds.y + yoffset); InterlaceConstantBuffer cb; - cb.ZrH = GSVector2(0, 1.0f / s.y); - GL_PUSH("DoInterlace %dx%d Shader:%d Linear:%d", size.x, size.y, shader, linear); + cb.ZrH = GSVector4(static_cast(bufIdx), 1.0f / ds.y, ds.y, MAD_SENSITIVITY); + + GL_PUSH("DoInterlace %dx%d Shader:%d Linear:%d", ds_i.x, ds_i.y, shader, linear); static_cast(dTex)->TransitionToLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - const GSVector4i rc(0, 0, size.x, size.y); + const GSVector4i rc(0, 0, ds_i.x, ds_i.y); EndRenderPass(); OMSetRenderTargets(dTex, nullptr, rc, false); SetUtilityTexture(sTex, linear ? m_linear_sampler : m_point_sampler); @@ -899,7 +937,7 @@ void GSDeviceVK::IASetVertexBuffer(const void* vertex, size_t stride, size_t cou const u32 size = static_cast(stride) * static_cast(count); if (!m_vertex_stream_buffer.ReserveMemory(size, static_cast(stride))) { - ExecuteCommandBufferAndRestartRenderPass("Uploading bytes to vertex buffer"); + ExecuteCommandBufferAndRestartRenderPass(false, "Uploading bytes to vertex buffer"); if (!m_vertex_stream_buffer.ReserveMemory(size, static_cast(stride))) pxFailRel("Failed to reserve space for vertices"); } @@ -919,7 +957,7 @@ bool GSDeviceVK::IAMapVertexBuffer(void** vertex, size_t stride, size_t count) const u32 size = static_cast(stride) * static_cast(count); if (!m_vertex_stream_buffer.ReserveMemory(size, static_cast(stride))) { - ExecuteCommandBufferAndRestartRenderPass("Mapping bytes to vertex buffer"); + ExecuteCommandBufferAndRestartRenderPass(false, "Mapping bytes to vertex buffer"); if (!m_vertex_stream_buffer.ReserveMemory(size, static_cast(stride))) pxFailRel("Failed to reserve space for vertices"); } @@ -945,7 +983,7 @@ void GSDeviceVK::IASetIndexBuffer(const void* index, size_t count) const u32 size = sizeof(u32) * static_cast(count); if (!m_index_stream_buffer.ReserveMemory(size, sizeof(u32))) { - ExecuteCommandBufferAndRestartRenderPass("Uploading bytes to index buffer"); + ExecuteCommandBufferAndRestartRenderPass(false, "Uploading bytes to index buffer"); if (!m_index_stream_buffer.ReserveMemory(size, sizeof(u32))) pxFailRel("Failed to reserve space for vertices"); } @@ -1004,7 +1042,7 @@ VkSampler GSDeviceVK::GetSampler(GSHWDrawConfig::SamplerSelector ss) if (it != m_samplers.end()) return it->second; - const bool aniso = (ss.aniso && GSConfig.MaxAnisotropy > 1); + const bool aniso = (ss.aniso && GSConfig.MaxAnisotropy > 1 && g_vulkan_context->GetDeviceFeatures().samplerAnisotropy); // See https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkSamplerCreateInfo.html#_description // for the reasoning behind 0.25f here. @@ -1024,7 +1062,7 @@ VkSampler GSDeviceVK::GetSampler(GSHWDrawConfig::SamplerSelector ss) VK_FALSE, // compare enable VK_COMPARE_OP_ALWAYS, // compare op 0.0f, // min lod - ss.lodclamp ? 0.25f : VK_LOD_CLAMP_NONE, // max lod + (ss.lodclamp || !ss.UseMipmapFiltering()) ? 0.25f : VK_LOD_CLAMP_NONE, // max lod VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, // border VK_FALSE // unnormalized coordinates }; @@ -1096,7 +1134,7 @@ VkShaderModule GSDeviceVK::GetUtilityVertexShader(const std::string& source, con std::stringstream ss; AddShaderHeader(ss); AddShaderStageMacro(ss, true, false, false); - AddMacro(ss, "PS_SCALE_FACTOR", GSConfig.UpscaleMultiplier); + AddMacro(ss, "PS_SCALE_FACTOR", StringUtil::ToChars(GSConfig.UpscaleMultiplier).c_str()); if (replace_main) ss << "#define " << replace_main << " main\n"; ss << source; @@ -1109,7 +1147,7 @@ VkShaderModule GSDeviceVK::GetUtilityFragmentShader(const std::string& source, c std::stringstream ss; AddShaderHeader(ss); AddShaderStageMacro(ss, false, false, true); - AddMacro(ss, "PS_SCALE_FACTOR", GSConfig.UpscaleMultiplier); + AddMacro(ss, "PS_SCALE_FACTOR", StringUtil::ToChars(GSConfig.UpscaleMultiplier).c_str()); if (replace_main) ss << "#define " << replace_main << " main\n"; ss << source; @@ -1238,7 +1276,7 @@ bool GSDeviceVK::CreateRenderPasses() } while (0) const VkFormat rt_format = LookupNativeFormat(GSTexture::Format::Color); - const VkFormat hdr_rt_format = LookupNativeFormat(GSTexture::Format::FloatColor); + const VkFormat hdr_rt_format = LookupNativeFormat(GSTexture::Format::HDRColor); const VkFormat depth_format = LookupNativeFormat(GSTexture::Format::DepthStencil); for (u32 rt = 0; rt < 2; rt++) @@ -1302,7 +1340,7 @@ bool GSDeviceVK::CreateRenderPasses() bool GSDeviceVK::CompileConvertPipelines() { // we may not have a swap chain if running in headless mode. - Vulkan::SwapChain* swapchain = static_cast(m_display->GetRenderSurface()); + Vulkan::SwapChain* swapchain = static_cast(g_host_display->GetSurface()); if (swapchain) { m_swap_chain_render_pass = @@ -1339,7 +1377,7 @@ bool GSDeviceVK::CompileConvertPipelines() for (ShaderConvert i = ShaderConvert::COPY; static_cast(i) < static_cast(ShaderConvert::Count); i = static_cast(static_cast(i) + 1)) { - const bool depth = IsDepthConvertShader(i); + const bool depth = HasDepthOutput(i); const int index = static_cast(i); VkRenderPass rp; @@ -1408,26 +1446,6 @@ bool GSDeviceVK::CompileConvertPipelines() if (i == ShaderConvert::COPY) { - // compile the variant for setting up hdr rendering - for (u32 ds = 0; ds < 2; ds++) - { - for (u32 fbl = 0; fbl < 2; fbl++) - { - pxAssert(!m_hdr_setup_pipelines[ds][fbl]); - - gpb.SetRenderPass(GetTFXRenderPass(true, ds != 0, true, DATE_RENDER_PASS_NONE, fbl != 0, - VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_LOAD_OP_DONT_CARE), - 0); - m_hdr_setup_pipelines[ds][fbl] = - gpb.Create(g_vulkan_context->GetDevice(), g_vulkan_shader_cache->GetPipelineCache(true), false); - if (!m_hdr_setup_pipelines[ds][fbl]) - return false; - - Vulkan::Util::SetObjectName(g_vulkan_context->GetDevice(), m_hdr_setup_pipelines[ds][fbl], - "HDR setup/copy pipeline (ds=%u, fbl=%u)", i, ds, fbl); - } - } - // compile color copy pipelines gpb.SetRenderPass(m_utility_color_render_pass_discard, 0); for (u32 i = 0; i < 16; i++) @@ -1446,24 +1464,26 @@ bool GSDeviceVK::CompileConvertPipelines() (i >> 3) & 1u); } } - else if (i == ShaderConvert::MOD_256) + else if (i == ShaderConvert::HDR_INIT || i == ShaderConvert::HDR_RESOLVE) { + const bool is_setup = i == ShaderConvert::HDR_INIT; + VkPipeline (&arr)[2][2] = *(is_setup ? &m_hdr_setup_pipelines : &m_hdr_finish_pipelines); for (u32 ds = 0; ds < 2; ds++) { for (u32 fbl = 0; fbl < 2; fbl++) { - pxAssert(!m_hdr_finish_pipelines[ds][fbl]); + pxAssert(!arr[ds][fbl]); - gpb.SetRenderPass(GetTFXRenderPass(true, ds != 0, false, DATE_RENDER_PASS_NONE, fbl != 0, - VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_LOAD_OP_DONT_CARE), + gpb.SetRenderPass( + GetTFXRenderPass(true, ds != 0, is_setup, DATE_RENDER_PASS_NONE, fbl != 0, + VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_LOAD_OP_DONT_CARE), 0); - m_hdr_finish_pipelines[ds][fbl] = - gpb.Create(g_vulkan_context->GetDevice(), g_vulkan_shader_cache->GetPipelineCache(true), false); - if (!m_hdr_finish_pipelines[ds][fbl]) + arr[ds][fbl] = gpb.Create(g_vulkan_context->GetDevice(), g_vulkan_shader_cache->GetPipelineCache(true), false); + if (!arr[ds][fbl]) return false; - Vulkan::Util::SetObjectName(g_vulkan_context->GetDevice(), m_hdr_setup_pipelines[ds][fbl], - "HDR finish/copy pipeline (ds=%u, fbl=%u)", i, ds, fbl); + Vulkan::Util::SetObjectName(g_vulkan_context->GetDevice(), arr[ds][fbl], + "HDR %s/copy pipeline (ds=%u, fbl=%u)", is_setup ? "setup" : "finish", i, ds, fbl); } } } @@ -1477,7 +1497,7 @@ bool GSDeviceVK::CompileConvertPipelines() m_date_image_setup_render_passes[ds][clear] = g_vulkan_context->GetRenderPass(LookupNativeFormat(GSTexture::Format::PrimID), ds ? LookupNativeFormat(GSTexture::Format::DepthStencil) : VK_FORMAT_UNDEFINED, - VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE, + VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE, ds ? (clear ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD) : VK_ATTACHMENT_LOAD_OP_DONT_CARE, ds ? VK_ATTACHMENT_STORE_OP_STORE : VK_ATTACHMENT_STORE_OP_DONT_CARE); } @@ -1496,7 +1516,7 @@ bool GSDeviceVK::CompileConvertPipelines() gpb.SetNoDepthTestState(); gpb.SetNoStencilState(); gpb.ClearBlendAttachments(); - gpb.SetBlendAttachment(0, true, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_MIN, + gpb.SetBlendAttachment(0, false, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_ADD, VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_ADD, VK_COLOR_COMPONENT_R_BIT); for (u32 ds = 0; ds < 2; ds++) @@ -1518,14 +1538,12 @@ bool GSDeviceVK::CompileConvertPipelines() bool GSDeviceVK::CompilePresentPipelines() { // we may not have a swap chain if running in headless mode. - Vulkan::SwapChain* swapchain = static_cast(m_display->GetRenderSurface()); - if (swapchain) - { - m_swap_chain_render_pass = - g_vulkan_context->GetRenderPass(swapchain->GetSurfaceFormat().format, VK_FORMAT_UNDEFINED); - if (!m_swap_chain_render_pass) - return false; - } + Vulkan::SwapChain* swapchain = static_cast(g_host_display->GetSurface()); + m_swap_chain_render_pass = swapchain ? + swapchain->GetClearRenderPass() : + g_vulkan_context->GetRenderPass(VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_UNDEFINED); + if (!m_swap_chain_render_pass) + return false; std::optional shader = Host::ReadResourceFileToString("shaders/vulkan/present.glsl"); if (!shader) @@ -1774,6 +1792,117 @@ bool GSDeviceVK::CompilePostProcessingPipelines() return true; } +bool GSDeviceVK::CompileCASPipelines() +{ + VkDevice dev = g_vulkan_context->GetDevice(); + Vulkan::DescriptorSetLayoutBuilder dslb; + Vulkan::PipelineLayoutBuilder plb; + + dslb.AddBinding(0, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT); + dslb.AddBinding(1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT); + if ((m_cas_ds_layout = dslb.Create(dev)) == VK_NULL_HANDLE) + return false; + Vulkan::Util::SetObjectName(dev, m_cas_pipeline_layout, "CAS descriptor layout"); + + plb.AddPushConstants(VK_SHADER_STAGE_COMPUTE_BIT, 0, NUM_CAS_CONSTANTS * sizeof(u32)); + plb.AddDescriptorSet(m_cas_ds_layout); + if ((m_cas_pipeline_layout = plb.Create(dev)) == VK_NULL_HANDLE) + return false; + Vulkan::Util::SetObjectName(dev, m_cas_pipeline_layout, "CAS pipeline layout"); + + // we use specialization constants to avoid compiling it twice + std::optional cas_source(Host::ReadResourceFileToString("shaders/vulkan/cas.glsl")); + if (!cas_source.has_value() || !GetCASShaderSource(&cas_source.value())) + return false; + + VkShaderModule mod = g_vulkan_shader_cache->GetComputeShader(cas_source->c_str()); + ScopedGuard mod_guard = [&mod]() { Vulkan::Util::SafeDestroyShaderModule(mod); }; + if (mod == VK_NULL_HANDLE) + return false; + + for (u8 sharpen_only = 0; sharpen_only < 2; sharpen_only++) + { + Vulkan::ComputePipelineBuilder cpb; + cpb.SetPipelineLayout(m_cas_pipeline_layout); + cpb.SetShader(mod, "main"); + cpb.SetSpecializationBool(0, sharpen_only != 0); + m_cas_pipelines[sharpen_only] = cpb.Create(dev, g_vulkan_shader_cache->GetPipelineCache(true), false); + if (!m_cas_pipelines[sharpen_only]) + return false; + } + + m_features.cas_sharpening = true; + return true; +} + +bool GSDeviceVK::DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) +{ + EndRenderPass(); + + VkDescriptorSet ds = g_vulkan_context->AllocateDescriptorSet(m_cas_ds_layout); + if (ds == VK_NULL_HANDLE) + return false; + + GSTextureVK* const sTexVK = static_cast(sTex); + GSTextureVK* const dTexVK = static_cast(dTex); + VkCommandBuffer cmdbuf = g_vulkan_context->GetCurrentCommandBuffer(); + + sTexVK->GetTexture().TransitionToLayout(cmdbuf, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + // we have to make the barrier explicit here, because there's no free enums for us to use (general already hijacked) + const VkImageMemoryBarrier barrier_to_cs = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + nullptr, + VK_ACCESS_SHADER_READ_BIT, + VK_ACCESS_SHADER_WRITE_BIT, + dTexVK->GetLayout(), + VK_IMAGE_LAYOUT_GENERAL, + VK_QUEUE_FAMILY_IGNORED, + VK_QUEUE_FAMILY_IGNORED, + dTexVK->GetImage(), + {VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u}, + }; + vkCmdPipelineBarrier(cmdbuf, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + 0, 0, nullptr, 0, nullptr, 1, &barrier_to_cs); + dTexVK->GetTexture().OverrideImageLayout(VK_IMAGE_LAYOUT_GENERAL); + + // only happening once a frame, so the update isn't a huge deal. + Vulkan::DescriptorSetUpdateBuilder dsub; + dsub.AddImageDescriptorWrite(ds, 0, sTexVK->GetView(), sTexVK->GetLayout()); + dsub.AddStorageImageDescriptorWrite(ds, 1, dTexVK->GetView(), dTexVK->GetLayout()); + dsub.Update(g_vulkan_context->GetDevice(), false); + + // the actual meat and potatoes! only four commands. + static const int threadGroupWorkRegionDim = 16; + const int dispatchX = (dTex->GetWidth() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + const int dispatchY = (dTex->GetHeight() + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + + vkCmdBindDescriptorSets(cmdbuf, VK_PIPELINE_BIND_POINT_COMPUTE, m_cas_pipeline_layout, 0, 1, &ds, 0, nullptr); + vkCmdPushConstants(cmdbuf, m_cas_pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, NUM_CAS_CONSTANTS * sizeof(u32), constants.data()); + vkCmdBindPipeline(cmdbuf, VK_PIPELINE_BIND_POINT_COMPUTE, m_cas_pipelines[static_cast(sharpen_only)]); + vkCmdDispatch(cmdbuf, dispatchX, dispatchY, 1); + + // and same deal here :( + const VkImageMemoryBarrier barrier_to_fs = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + nullptr, + VK_ACCESS_SHADER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_GENERAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_QUEUE_FAMILY_IGNORED, + VK_QUEUE_FAMILY_IGNORED, + dTexVK->GetImage(), + {VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u}, + }; + vkCmdPipelineBarrier(cmdbuf, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + 0, 0, nullptr, 0, nullptr, 1, &barrier_to_fs); + dTexVK->GetTexture().OverrideImageLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + // all done! + return true; +} + bool GSDeviceVK::CheckStagingBufferSize(u32 required_size) { if (m_readback_staging_buffer_size >= required_size) @@ -1799,6 +1928,7 @@ bool GSDeviceVK::CheckStagingBufferSize(u32 required_size) } m_readback_staging_buffer_map = ai.pMappedData; + m_readback_staging_buffer_size = required_size; return true; } @@ -1819,7 +1949,7 @@ void GSDeviceVK::DestroyStagingBuffer() void GSDeviceVK::DestroyResources() { - g_vulkan_context->ExecuteCommandBuffer(true); + g_vulkan_context->ExecuteCommandBuffer(Vulkan::Context::WaitType::Sleep); if (m_tfx_descriptor_sets[0] != VK_NULL_HANDLE) g_vulkan_context->FreeGlobalDescriptorSet(m_tfx_descriptor_sets[0]); @@ -1859,6 +1989,11 @@ void GSDeviceVK::DestroyResources() Vulkan::Util::SafeDestroyPipeline(m_fxaa_pipeline); Vulkan::Util::SafeDestroyPipeline(m_shadeboost_pipeline); + for (VkPipeline& it : m_cas_pipelines) + Vulkan::Util::SafeDestroyPipeline(it); + Vulkan::Util::SafeDestroyPipelineLayout(m_cas_pipeline_layout); + Vulkan::Util::SafeDestroyDescriptorSetLayout(m_cas_ds_layout); + for (auto& it : m_samplers) Vulkan::Util::SafeDestroySampler(it.second); @@ -1905,7 +2040,7 @@ VkShaderModule GSDeviceVK::GetTFXVertexShader(GSHWDrawConfig::VSSelector sel) AddMacro(ss, "VS_IIP", sel.iip); AddMacro(ss, "VS_POINT_SIZE", sel.point_size); if (sel.point_size) - AddMacro(ss, "VS_POINT_SIZE_VALUE", GSConfig.UpscaleMultiplier); + AddMacro(ss, "VS_POINT_SIZE_VALUE", StringUtil::ToChars(GSConfig.UpscaleMultiplier).c_str()); ss << m_tfx_source; VkShaderModule mod = g_vulkan_shader_cache->GetVertexShader(ss.str()); @@ -1928,6 +2063,7 @@ VkShaderModule GSDeviceVK::GetTFXGeometryShader(GSHWDrawConfig::GSSelector sel) AddMacro(ss, "GS_IIP", sel.iip); AddMacro(ss, "GS_PRIM", static_cast(sel.topology)); AddMacro(ss, "GS_EXPAND", sel.expand); + AddMacro(ss, "GS_FORWARD_PRIMID", sel.forward_primid); ss << m_tfx_source; VkShaderModule mod = g_vulkan_shader_cache->GetGeometryShader(ss.str()); @@ -1957,7 +2093,6 @@ VkShaderModule GSDeviceVK::GetTFXFragmentShader(const GSHWDrawConfig::PSSelector AddMacro(ss, "PS_CHANNEL_FETCH", sel.channel); AddMacro(ss, "PS_URBAN_CHAOS_HLE", sel.urban_chaos_hle); AddMacro(ss, "PS_TALES_OF_ABYSS_HLE", sel.tales_of_abyss_hle); - AddMacro(ss, "PS_TEX_IS_FB", sel.tex_is_fb); AddMacro(ss, "PS_INVALID_TEX0", sel.invalid_tex0); AddMacro(ss, "PS_AEM", sel.aem); AddMacro(ss, "PS_TFX", sel.tfx); @@ -1978,6 +2113,7 @@ VkShaderModule GSDeviceVK::GetTFXFragmentShader(const GSHWDrawConfig::PSSelector AddMacro(ss, "PS_BLEND_C", sel.blend_c); AddMacro(ss, "PS_BLEND_D", sel.blend_d); AddMacro(ss, "PS_BLEND_MIX", sel.blend_mix); + AddMacro(ss, "PS_FIXED_ONE_A", sel.fixed_one_a); AddMacro(ss, "PS_IIP", sel.iip); AddMacro(ss, "PS_SHUFFLE", sel.shuffle); AddMacro(ss, "PS_READ_BA", sel.read_ba); @@ -1988,7 +2124,7 @@ VkShaderModule GSDeviceVK::GetTFXFragmentShader(const GSHWDrawConfig::PSSelector AddMacro(ss, "PS_ZCLAMP", sel.zclamp); AddMacro(ss, "PS_PABE", sel.pabe); AddMacro(ss, "PS_SCANMSK", sel.scanmsk); - AddMacro(ss, "PS_SCALE_FACTOR", GSConfig.UpscaleMultiplier); + AddMacro(ss, "PS_SCALE_FACTOR", StringUtil::ToChars(GSConfig.UpscaleMultiplier).c_str()); AddMacro(ss, "PS_TEX_IS_FB", sel.tex_is_fb); AddMacro(ss, "PS_NO_COLOR", sel.no_color); AddMacro(ss, "PS_NO_COLOR1", sel.no_color1); @@ -2031,7 +2167,7 @@ VkPipeline GSDeviceVK::CreateTFXPipeline(const PipelineSelector& p) // Common state gpb.SetPipelineLayout(m_tfx_pipeline_layout); - if (p.ps.date >= 10) + if (IsDATEModePrimIDInit(p.ps.date)) { // DATE image prepass gpb.SetRenderPass(m_date_image_setup_render_passes[p.ds][0], 0); @@ -2079,7 +2215,7 @@ VkPipeline GSDeviceVK::CreateTFXPipeline(const PipelineSelector& p) } // Blending - if (p.ps.date >= 10) + if (IsDATEModePrimIDInit(p.ps.date)) { // image DATE prepass gpb.SetBlendAttachment(0, true, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_ZERO, VK_BLEND_OP_MIN, VK_BLEND_FACTOR_ONE, @@ -2198,10 +2334,20 @@ bool GSDeviceVK::CreatePersistentDescriptorSets() return true; } +static Vulkan::Context::WaitType GetWaitType(bool wait, bool spin) +{ + if (!wait) + return Vulkan::Context::WaitType::None; + if (spin) + return Vulkan::Context::WaitType::Spin; + else + return Vulkan::Context::WaitType::Sleep; +} + void GSDeviceVK::ExecuteCommandBuffer(bool wait_for_completion) { EndRenderPass(); - g_vulkan_context->ExecuteCommandBuffer(wait_for_completion); + g_vulkan_context->ExecuteCommandBuffer(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks)); InvalidateCachedState(); } @@ -2216,14 +2362,14 @@ void GSDeviceVK::ExecuteCommandBuffer(bool wait_for_completion, const char* reas ExecuteCommandBuffer(wait_for_completion); } -void GSDeviceVK::ExecuteCommandBufferAndRestartRenderPass(const char* reason) +void GSDeviceVK::ExecuteCommandBufferAndRestartRenderPass(bool wait_for_completion, const char* reason) { Console.Warning("Vulkan: Executing command buffer due to '%s'", reason); const VkRenderPass render_pass = m_current_render_pass; const GSVector4i render_pass_area(m_current_render_pass_area); EndRenderPass(); - g_vulkan_context->ExecuteCommandBuffer(false); + g_vulkan_context->ExecuteCommandBuffer(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks)); InvalidateCachedState(); if (render_pass != VK_NULL_HANDLE) @@ -2395,6 +2541,7 @@ void GSDeviceVK::BeginRenderPass(VkRenderPass rp, const GSVector4i& rect) m_current_framebuffer, {{rect.x, rect.y}, {static_cast(rect.width()), static_cast(rect.height())}}, 0, nullptr}; + g_vulkan_context->CountRenderPass(); vkCmdBeginRenderPass(g_vulkan_context->GetCurrentCommandBuffer(), &begin_info, VK_SUBPASS_CONTENTS_INLINE); } @@ -2521,7 +2668,7 @@ bool GSDeviceVK::ApplyTFXState(bool already_execed) const VkDevice dev = g_vulkan_context->GetDevice(); const VkCommandBuffer cmdbuf = g_vulkan_context->GetCurrentCommandBuffer(); u32 flags = m_dirty_flags; - m_dirty_flags &= ~DIRTY_TFX_STATE | DIRTY_CONSTANT_BUFFER_STATE; + m_dirty_flags &= ~(DIRTY_TFX_STATE | DIRTY_CONSTANT_BUFFER_STATE | DIRTY_FLAG_TFX_DYNAMIC_OFFSETS); // do cbuffer first, because it's the most likely to cause an exec if (flags & DIRTY_FLAG_VS_CONSTANT_BUFFER) @@ -2535,13 +2682,14 @@ bool GSDeviceVK::ApplyTFXState(bool already_execed) return false; } - ExecuteCommandBufferAndRestartRenderPass("Ran out of vertex uniform space"); + ExecuteCommandBufferAndRestartRenderPass(false, "Ran out of vertex uniform space"); return ApplyTFXState(true); } std::memcpy(m_vertex_uniform_stream_buffer.GetCurrentHostPointer(), &m_vs_cb_cache, sizeof(m_vs_cb_cache)); m_tfx_dynamic_offsets[0] = m_vertex_uniform_stream_buffer.GetCurrentOffset(); m_vertex_uniform_stream_buffer.CommitMemory(sizeof(m_vs_cb_cache)); + flags |= DIRTY_FLAG_TFX_DYNAMIC_OFFSETS; } if (flags & DIRTY_FLAG_PS_CONSTANT_BUFFER) @@ -2555,13 +2703,14 @@ bool GSDeviceVK::ApplyTFXState(bool already_execed) return false; } - ExecuteCommandBufferAndRestartRenderPass("Ran out of pixel uniform space"); + ExecuteCommandBufferAndRestartRenderPass(false, "Ran out of pixel uniform space"); return ApplyTFXState(true); } std::memcpy(m_fragment_uniform_stream_buffer.GetCurrentHostPointer(), &m_ps_cb_cache, sizeof(m_ps_cb_cache)); m_tfx_dynamic_offsets[1] = m_fragment_uniform_stream_buffer.GetCurrentOffset(); m_fragment_uniform_stream_buffer.CommitMemory(sizeof(m_ps_cb_cache)); + flags |= DIRTY_FLAG_TFX_DYNAMIC_OFFSETS; } Vulkan::DescriptorSetUpdateBuilder dsub; @@ -2585,7 +2734,7 @@ bool GSDeviceVK::ApplyTFXState(bool already_execed) return false; } - ExecuteCommandBufferAndRestartRenderPass("Ran out of TFX texture descriptors"); + ExecuteCommandBufferAndRestartRenderPass(false, "Ran out of TFX texture descriptors"); return ApplyTFXState(true); } @@ -2609,7 +2758,7 @@ bool GSDeviceVK::ApplyTFXState(bool already_execed) return false; } - ExecuteCommandBufferAndRestartRenderPass("Ran out of TFX sampler descriptors"); + ExecuteCommandBufferAndRestartRenderPass(false, "Ran out of TFX sampler descriptors"); return ApplyTFXState(true); } @@ -2683,7 +2832,7 @@ bool GSDeviceVK::ApplyUtilityState(bool already_execed) return false; } - ExecuteCommandBufferAndRestartRenderPass("Ran out of utility descriptors"); + ExecuteCommandBufferAndRestartRenderPass(false, "Ran out of utility descriptors"); return ApplyTFXState(true); } @@ -2792,17 +2941,16 @@ GSTextureVK* GSDeviceVK::SetupPrimitiveTrackingDATE(GSHWDrawConfig& config) const VkAttachmentLoadOp ds_load_op = GetLoadOpForTexture(static_cast(config.ds)); const u32 ds = (config.ds ? 1 : 0); - VkClearValue cv[2] = {}; - cv[0].color.float32[0] = static_cast(std::numeric_limits::max()); if (ds_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { + VkClearValue cv[2] = {}; cv[1].depthStencil.depth = static_cast(config.ds)->GetClearDepth(); cv[1].depthStencil.stencil = 1; BeginClearRenderPass(m_date_image_setup_render_passes[ds][1], GSVector4i(0, 0, rtsize.x, rtsize.y), cv, 2); } else { - BeginClearRenderPass(m_date_image_setup_render_passes[ds][0], config.drawarea, cv, 1); + BeginRenderPass(m_date_image_setup_render_passes[ds][0], config.drawarea); } // draw the quad to prefill the image @@ -2833,7 +2981,6 @@ GSTextureVK* GSDeviceVK::SetupPrimitiveTrackingDATE(GSHWDrawConfig& config) pipe.feedback_loop = false; pipe.rt = true; pipe.ps.blend_a = pipe.ps.blend_b = pipe.ps.blend_c = pipe.ps.blend_d = false; - pipe.ps.date += 10; pipe.ps.no_color = false; pipe.ps.no_color1 = true; if (BindDrawPipeline(pipe)) @@ -2879,6 +3026,7 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config) case GSHWDrawConfig::DestinationAlphaMode::Stencil: SetupDATE(config.rt, config.ds, config.datm, config.drawarea); + DATE_rp = DATE_RENDER_PASS_STENCIL; break; } @@ -2894,6 +3042,7 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config) } if (config.pal) PSSetShaderResource(1, config.pal, true); + if (config.blend.constant_enable) SetBlendConstants(config.blend.constant); @@ -2935,7 +3084,7 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config) EndRenderPass(); GL_PUSH_("HDR Render Target Setup"); - hdr_rt = static_cast(CreateRenderTarget(rtsize.x, rtsize.y, GSTexture::Format::FloatColor, false)); + hdr_rt = static_cast(CreateRenderTarget(rtsize.x, rtsize.y, GSTexture::Format::HDRColor, false)); if (!hdr_rt) { Console.WriteLn("Failed to allocate HDR render target, aborting draw."); @@ -2964,7 +3113,7 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config) else if (config.require_one_barrier && !m_features.texture_barrier) { // requires a copy of the RT - draw_rt_clone = static_cast(CreateTexture(rtsize.x, rtsize.y, false, GSTexture::Format::Color, false)); + draw_rt_clone = static_cast(CreateTexture(rtsize.x, rtsize.y, 1, GSTexture::Format::Color, false)); if (draw_rt_clone) { EndRenderPass(); @@ -2978,22 +3127,33 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config) } } - if (config.tex && config.tex == config.ds) + if (config.tex) { - // requires a copy of the depth buffer. this is mainly for ico. - copy_ds = static_cast(CreateDepthStencil(rtsize.x, rtsize.y, GSTexture::Format::DepthStencil, false)); - if (copy_ds) + if (config.tex == config.ds) { - EndRenderPass(); + // requires a copy of the depth buffer. this is mainly for ico. + copy_ds = static_cast(CreateDepthStencil(rtsize.x, rtsize.y, GSTexture::Format::DepthStencil, false)); + if (copy_ds) + { + EndRenderPass(); - GL_PUSH("Copy depth to temp texture for shuffle {%d,%d %dx%d}", - config.drawarea.left, config.drawarea.top, - config.drawarea.width(), config.drawarea.height()); + GL_PUSH("Copy depth to temp texture for shuffle {%d,%d %dx%d}", + config.drawarea.left, config.drawarea.top, + config.drawarea.width(), config.drawarea.height()); - CopyRect(config.ds, copy_ds, config.drawarea, config.drawarea.left, config.drawarea.top); - PSSetShaderResource(0, copy_ds, true); + pxAssert(copy_ds->GetState() == GSTexture::State::Invalidated); + CopyRect(config.ds, copy_ds, GSVector4i(config.ds->GetSize()).zwxy(), 0, 0); + PSSetShaderResource(0, copy_ds, true); + } } } + // clear texture binding when it's bound to RT or DS + if (!config.tex && m_tfx_textures[0] && + ((!pipe.feedback_loop && config.rt && static_cast(config.rt)->GetView() == m_tfx_textures[0]) || + (config.ds && static_cast(config.ds)->GetView() == m_tfx_textures[0]))) + { + PSSetShaderResource(0, nullptr, false); + } const bool render_area_okay = (!hdr_rt && DATE_rp != DATE_RENDER_PASS_STENCIL_ONE && CheckRenderPassArea(render_area)); @@ -3016,6 +3176,10 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config) CurrentFramebufferHasFeedbackLoop(); } + // We don't need the very first barrier if this is the first draw after switching to feedback loop, + // because the layout change in itself enforces the execution dependency. + const bool skip_first_barrier = (draw_rt && draw_rt->GetLayout() != VK_IMAGE_LAYOUT_GENERAL); + OMSetRenderTargets(draw_rt, draw_ds, config.scissor, pipe.feedback_loop); if (pipe.feedback_loop) { @@ -3076,12 +3240,12 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config) // now we can do the actual draw if (BindDrawPipeline(pipe)) { - SendHWDraw(config, draw_rt); + SendHWDraw(config, draw_rt, skip_first_barrier); if (config.separate_alpha_pass) { SetHWDrawConfigForAlphaPass(&pipe.ps, &pipe.cms, &pipe.bs, &pipe.dss); if (BindDrawPipeline(pipe)) - SendHWDraw(config, draw_rt); + SendHWDraw(config, draw_rt, false); } } @@ -3101,12 +3265,12 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config) pipe.bs = config.blend; if (BindDrawPipeline(pipe)) { - SendHWDraw(config, draw_rt); + SendHWDraw(config, draw_rt, false); if (config.second_separate_alpha_pass) { SetHWDrawConfigForAlphaPass(&pipe.ps, &pipe.cms, &pipe.bs, &pipe.dss); if (BindDrawPipeline(pipe)) - SendHWDraw(config, draw_rt); + SendHWDraw(config, draw_rt, false); } } } @@ -3188,14 +3352,26 @@ void GSDeviceVK::UpdateHWPipelineSelector(GSHWDrawConfig& config, PipelineSelect pipe.vs.point_size |= (config.topology == GSHWDrawConfig::Topology::Point); } -void GSDeviceVK::SendHWDraw(const GSHWDrawConfig& config, GSTextureVK* draw_rt) +void GSDeviceVK::SendHWDraw(const GSHWDrawConfig& config, GSTextureVK* draw_rt, bool skip_first_barrier) { if (config.drawlist) { GL_PUSH("Split the draw (SPRITE)"); - g_perfmon.Put(GSPerfMon::Barriers, static_cast(config.drawlist->size())); + g_perfmon.Put(GSPerfMon::Barriers, static_cast(config.drawlist->size()) - static_cast(skip_first_barrier)); - for (u32 count = 0, p = 0, n = 0; n < static_cast(config.drawlist->size()); p += count, ++n) + u32 count = 0; + u32 p = 0; + u32 n = 0; + + if (skip_first_barrier) + { + count = (*config.drawlist)[n] * config.indices_per_prim; + DrawIndexedPrimitive(p, count); + p += count; + ++n; + } + + for (; n < static_cast(config.drawlist->size()); p += count, ++n) { count = (*config.drawlist)[n] * config.indices_per_prim; ColorBufferBarrier(draw_rt); @@ -3210,18 +3386,26 @@ void GSDeviceVK::SendHWDraw(const GSHWDrawConfig& config, GSTextureVK* draw_rt) if (config.require_full_barrier) { GL_PUSH("Split single draw in %d draw", config.nindices / config.indices_per_prim); - g_perfmon.Put(GSPerfMon::Barriers, config.nindices / config.indices_per_prim); + g_perfmon.Put(GSPerfMon::Barriers, (config.nindices / config.indices_per_prim) - static_cast(skip_first_barrier)); - for (u32 p = 0; p < config.nindices; p += config.indices_per_prim) + const u32 ipp = config.indices_per_prim; + u32 p = 0; + if (skip_first_barrier) + { + DrawIndexedPrimitive(p, ipp); + p += ipp; + } + + for (; p < config.nindices; p += ipp) { ColorBufferBarrier(draw_rt); - DrawIndexedPrimitive(p, config.indices_per_prim); + DrawIndexedPrimitive(p, ipp); } return; } - if (config.require_one_barrier) + if (config.require_one_barrier && !skip_first_barrier) { g_perfmon.Put(GSPerfMon::Barriers, 1); ColorBufferBarrier(draw_rt); diff --git a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.h b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.h index ae96937f88..4dc414c3e8 100644 --- a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.h +++ b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.h @@ -83,6 +83,8 @@ public: INDEX_BUFFER_SIZE = 16 * 1024 * 1024, VERTEX_UNIFORM_BUFFER_SIZE = 8 * 1024 * 1024, FRAGMENT_UNIFORM_BUFFER_SIZE = 8 * 1024 * 1024, + + NUM_CAS_PIPELINES = 2, }; enum DATE_RENDER_PASS : u32 { @@ -109,6 +111,7 @@ private: VkBuffer m_readback_staging_buffer = VK_NULL_HANDLE; void* m_readback_staging_buffer_map = nullptr; u32 m_readback_staging_buffer_size = 0; + bool m_warned_slow_spin = false; VkSampler m_point_sampler = VK_NULL_HANDLE; VkSampler m_linear_sampler = VK_NULL_HANDLE; @@ -119,7 +122,7 @@ private: std::array(PresentShader::Count)> m_present{}; std::array m_color_copy{}; std::array m_merge{}; - std::array m_interlace{}; + std::array m_interlace{}; VkPipeline m_hdr_setup_pipelines[2][2] = {}; // [depth][feedback_loop] VkPipeline m_hdr_finish_pipelines[2][2] = {}; // [depth][feedback_loop] VkRenderPass m_date_image_setup_render_passes[2][2] = {}; // [depth][clear] @@ -143,6 +146,10 @@ private: VkRenderPass m_tfx_render_pass[2][2][2][3][2][3][3] = {}; // [rt][ds][hdr][date][fbl][rt_op][ds_op] + VkDescriptorSetLayout m_cas_ds_layout = VK_NULL_HANDLE; + VkPipelineLayout m_cas_pipeline_layout = VK_NULL_HANDLE; + std::array m_cas_pipelines = {}; + GSHWDrawConfig::VSConstantBuffer m_vs_cb_cache; GSHWDrawConfig::PSConstantBuffer m_ps_cb_cache; @@ -154,10 +161,12 @@ private: void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) final; - void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0) final; + void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0, int bufIdx = 0) final; void DoShadeBoost(GSTexture* sTex, GSTexture* dTex, const float params[4]) final; void DoFXAA(GSTexture* sTex, GSTexture* dTex) final; + bool DoCAS(GSTexture* sTex, GSTexture* dTex, bool sharpen_only, const std::array& constants) final; + VkSampler GetSampler(GSHWDrawConfig::SamplerSelector ss); void ClearSamplerCache() final; @@ -181,6 +190,7 @@ private: bool CompileInterlacePipelines(); bool CompileMergePipelines(); bool CompilePostProcessingPipelines(); + bool CompileCASPipelines(); bool CheckStagingBufferSize(u32 required_size); void DestroyStagingBuffer(); @@ -201,7 +211,7 @@ public: __fi VkSampler GetPointSampler() const { return m_point_sampler; } __fi VkSampler GetLinearSampler() const { return m_linear_sampler; } - bool Create(HostDisplay* display) override; + bool Create() override; void Destroy() override; void ResetAPIState() override; @@ -260,7 +270,7 @@ public: void RenderHW(GSHWDrawConfig& config) override; void UpdateHWPipelineSelector(GSHWDrawConfig& config, PipelineSelector& pipe); - void SendHWDraw(const GSHWDrawConfig& config, GSTextureVK* draw_rt); + void SendHWDraw(const GSHWDrawConfig& config, GSTextureVK* draw_rt, bool skip_first_barrier); ////////////////////////////////////////////////////////////////////////// // Vulkan State @@ -273,7 +283,7 @@ public: /// Ends any render pass, executes the command buffer, and invalidates cached state. void ExecuteCommandBuffer(bool wait_for_completion); void ExecuteCommandBuffer(bool wait_for_completion, const char* reason, ...); - void ExecuteCommandBufferAndRestartRenderPass(const char* reason); + void ExecuteCommandBufferAndRestartRenderPass(bool wait_for_completion, const char* reason); /// Set dirty flags on everything to force re-bind at next draw time. void InvalidateCachedState(); diff --git a/pcsx2/GS/Renderers/Vulkan/GSTextureVK.cpp b/pcsx2/GS/Renderers/Vulkan/GSTextureVK.cpp index 658490eeea..d73076561e 100644 --- a/pcsx2/GS/Renderers/Vulkan/GSTextureVK.cpp +++ b/pcsx2/GS/Renderers/Vulkan/GSTextureVK.cpp @@ -126,6 +126,24 @@ std::unique_ptr GSTextureVK::Create(Type type, u32 width, u32 heigh return std::make_unique(type, format, std::move(texture)); } + case Type::RWTexture: + { + pxAssert(levels == 1); + + Vulkan::Texture texture; + if (!texture.Create(width, height, levels, 1, vk_format, VK_SAMPLE_COUNT_1_BIT, + VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | + VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT)) + { + return {}; + } + + Vulkan::Util::SetObjectName( + g_vulkan_context->GetDevice(), texture.GetImage(), "%ux%u RW texture", width, height); + return std::make_unique(type, format, std::move(texture)); + } + default: return {}; } @@ -244,6 +262,7 @@ bool GSTextureVK::Update(const GSVector4i& r, const void* data, int pitch, int l } m_texture.UpdateFromBuffer(cmdbuf, layer, 0, r.x, r.y, width, height, + Common::AlignUpPow2(height, GetCompressedBlockSize()), CalcUploadRowLengthFromPitch(upload_pitch), buffer, buffer_offset); m_texture.TransitionToLayout(cmdbuf, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); @@ -285,7 +304,8 @@ bool GSTextureVK::Map(GSMap& m, const GSVector4i* r, int layer) void GSTextureVK::Unmap() { - pxAssert(m_map_level < m_texture.GetLevels()); + // this can't handle blocks/compressed formats at the moment. + pxAssert(m_map_level < m_texture.GetLevels() && !IsCompressedFormat()); g_perfmon.Put(GSPerfMon::TextureUploads, 1); // TODO: non-tightly-packed formats @@ -316,6 +336,7 @@ void GSTextureVK::Unmap() } m_texture.UpdateFromBuffer(cmdbuf, m_map_level, 0, m_map_area.x, m_map_area.y, width, height, + Common::AlignUpPow2(height, GetCompressedBlockSize()), CalcUploadRowLengthFromPitch(pitch), buffer.GetBuffer(), buffer_offset); m_texture.TransitionToLayout(cmdbuf, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); @@ -401,7 +422,7 @@ void GSTextureVK::CommitClear(VkCommandBuffer cmdbuf) vkCmdClearColorImage(cmdbuf, m_texture.GetImage(), m_texture.GetLayout(), &cv, 1, &srr); } - SetState(GSTexture::State::Dirty); + SetState(GSTexture::State::Dirty); } VkFramebuffer GSTextureVK::GetFramebuffer(bool feedback_loop) { return GetLinkedFramebuffer(nullptr, feedback_loop); } diff --git a/pcsx2/GS/Window/GSCaptureDlg.cpp b/pcsx2/GS/Window/GSCaptureDlg.cpp index e5411201c8..88013437e8 100644 --- a/pcsx2/GS/Window/GSCaptureDlg.cpp +++ b/pcsx2/GS/Window/GSCaptureDlg.cpp @@ -142,7 +142,7 @@ void GSCaptureDlg::OnInit() else if (wcsstr(str.get(), L"@device:sw:")) prefix = L"(DS) "; else if (wcsstr(str.get(), L"@device:cm:")) prefix = L"(VfW) "; - + c.DisplayName = str.get(); wil::com_ptr_nothrow pPB; diff --git a/pcsx2/GS/Window/GSSetting.cpp b/pcsx2/GS/Window/GSSetting.cpp index 0bd2999611..e1b09a12e4 100644 --- a/pcsx2/GS/Window/GSSetting.cpp +++ b/pcsx2/GS/Window/GSSetting.cpp @@ -44,7 +44,7 @@ const char* dialog_message(int ID, bool* updateText) case IDC_TRI_FILTER: return cvtString("Control the texture tri-filtering of the emulation.\n\n" "None:\nNo extra trilinear filtering.\n\n" - "Trilinear:\nUse OpenGL/Vulkan trilinear interpolation when PS2 uses mipmaps.\n\n" + "Trilinear:\nUse trilinear interpolation when PS2 uses mipmaps.\n\n" "Trilinear Forced:\nAlways enable full trilinear interpolation. Warning Slow!\n\n"); case IDC_CRC_LEVEL: return cvtString("Control the number of Auto-CRC fixes and hacks applied to games.\n\n" @@ -54,7 +54,7 @@ const char* dialog_message(int ID, bool* updateText) "Minimum:\nEnables CRC lookup for special post processing effects.\n\n" "Aggressive:\nUse more aggressive CRC hacks.\n" "Removes effects in some games which make the image appear sharper/clearer.\n" - "Affected games: AC4, BleachBB, Bully, DBZBT 2 & 3, DeathByDegrees, Evangelion, FF games, FightingBeautyWulong, GOW 1 & 2, Kunoichi, IkkiTousen, Okami, Oneechanbara2, OnimushaDoD, RDRevolver, Simple2000Vol114, SoTC, SteambotChronicles, Tekken5, Ultraman, XenosagaE3, Yakuza 1 & 2.\n"); + "Affected games: AC4, DBZBT 2 & 3, DeathByDegrees, Evangelion, FF games, FightingBeautyWulong, Kunoichi, Okami, Oneechanbara2, OnimushaDoD, RDRevolver, Simple2000Vol114, SteambotChronicles, Tekken5, Ultraman, XenosagaE3, Yakuza 1 & 2.\n"); case IDC_SKIPDRAWEND: case IDC_SKIPDRAWHACKEDIT: case IDC_SKIPDRAWSTART: @@ -104,10 +104,6 @@ const char* dialog_message(int ID, bool* updateText) return cvtString("Enable: Removes the offset for interlacing when upscaling.\n" "Can reduce blurring in some games, where the opposite is true most of the time.\n" "Used for ICO to reduce blur."); - case IDC_ACCURATE_DATE: - return cvtString("Implement a more accurate algorithm to compute GS destination alpha testing.\n" - "It improves shadow and transparency rendering.\n\n" - "Note: Direct3D 11 is less accurate."); case IDC_ACCURATE_BLEND_UNIT: return cvtString("Control the accuracy level of the GS blending unit emulation.\n\n" "Minimum:\nFast but introduces various rendering issues.\n" @@ -119,7 +115,7 @@ const char* dialog_message(int ID, bool* updateText) "A good CPU is required.\n\n" "Full:\nExcept few cases, the blending unit will be fully emulated by the shader. It is slow!\n\n" "Maximum:\nThe blending unit will be completely emulated by the shader. It is very slow!\n\n" - "Note: Direct3D11's blending is capped at High and is reduced in capability compared to OpenGL/Vulkan"); + "Note: Direct3D's blending is capped at High and is reduced in capability compared to OpenGL/Vulkan"); case IDC_TC_DEPTH: return cvtString("Disable the support of Depth buffer in the texture cache.\n" "It can help to increase speed but it will likely create various glitches."); @@ -130,8 +126,6 @@ const char* dialog_message(int ID, bool* updateText) "Note: This hack has an impact on performance.\n"); case IDC_AFCOMBO: return cvtString("Reduces texture aliasing at extreme viewing angles."); - case IDC_AA1: - return cvtString("Internal GS feature. Reduces edge aliasing of lines and triangles when the game requests it."); case IDC_SWTHREADS: case IDC_SWTHREADS_EDIT: return cvtString("Number of rendering threads: 0 for single thread, 2 or more for multithread (1 is for debugging)\n" @@ -170,13 +164,12 @@ const char* dialog_message(int ID, bool* updateText) case IDC_GEOMETRY_SHADER_OVERRIDE: return cvtString("Allows the GPU instead of just the CPU to transform lines into sprites. This reduces CPU load and bandwidth requirement, but it is heavier on the GPU.\n" "Automatic detection is recommended."); - case IDC_IMAGE_LOAD_STORE: - return cvtString("Allows advanced atomic operations to speed up Accurate DATE.\n" - "Only disable this if using Accurate DATE causes (GPU driver) issues.\n\n" - "Note: This option is only supported by GPUs which support at least Direct3D 11."); - case IDC_SPARSE_TEXTURE: - return cvtString("Allows to reduce VRAM usage on the GPU.\n\n" - "Note: Feature is currently experimental and works only on Nvidia GPUs."); + case IDC_SPIN_GPU: + return cvtString("Submits useless work to the GPU during readbacks to prevent it from going into powersave modes.\n" + "May improve performance but with a significant increase in power usage."); + case IDC_SPIN_CPU: + return cvtString("Does useless work on the CPU during readbacks to prevent it from going to into powersave modes.\n" + "May improve performance but with a significant increase in power usage."); case IDC_LINEAR_PRESENT: return cvtString("Use bilinear filtering when Upscaling/Downscaling the image to the screen. Disable it if you want a sharper/pixelated output."); // Exclusive for Hardware Renderer @@ -193,12 +186,6 @@ const char* dialog_message(int ID, bool* updateText) case IDC_DISABLE_PARTIAL_TC_INV: return cvtString("By default, the texture cache handles partial invalidations. Unfortunately it is very costly to compute CPU wise." "\n\nThis hack replaces the partial invalidation with a complete deletion of the texture to reduce the CPU load.\n\nIt helps snowblind engine games."); - case IDC_CONSERVATIVE_FB: - return cvtString("Disabled: Reserves a larger framebuffer to prevent FMV flickers.\n" - "Increases GPU/memory requirements.\n" - "Disabling this can amplify stuttering due to low RAM/VRAM.\n\n" - "Note: It should be enabled for Armored Core, Destroy All Humans, Gran Turismo and possibly others.\n" - "This option does not improve the graphics or the FPS."); case IDC_DITHERING: return cvtString("In the PS2's case, it reduces banding between colors and improves the perceived color depth.\n" "In the PS1's case, it was used more aggressively due to 16-bit colour.\n" diff --git a/pcsx2/GS/Window/GSSetting.h b/pcsx2/GS/Window/GSSetting.h index 048a60c4ee..30524c2ad8 100644 --- a/pcsx2/GS/Window/GSSetting.h +++ b/pcsx2/GS/Window/GSSetting.h @@ -48,12 +48,11 @@ enum IDC_DISABLE_INTERLACE_OFFSETS, // Hardware Renderer IDC_PRELOAD_TEXTURES, - IDC_ACCURATE_DATE, IDC_PALTEX, - IDC_CONSERVATIVE_FB, IDC_AFCOMBO, IDC_DITHERING, IDC_MIPMAP_HW, + IDC_TRI_FILTER, IDC_CRC_LEVEL, IDC_ACCURATE_BLEND_UNIT, // Rendering Hacks @@ -65,7 +64,6 @@ enum IDC_MEMORY_WRAPPING, IDC_PRELOAD_GS, IDC_HALF_SCREEN_TS, - IDC_TRI_FILTER, IDC_SKIPDRAWEND, IDC_SKIPDRAWHACKEDIT, IDC_SKIPDRAWSTART, @@ -89,8 +87,8 @@ enum IDC_SWTHREADS_EDIT, // OpenGL Advanced Settings IDC_GEOMETRY_SHADER_OVERRIDE, - IDC_IMAGE_LOAD_STORE, - IDC_SPARSE_TEXTURE, + IDC_SPIN_GPU, + IDC_SPIN_CPU, // On-screen Display IDC_OSD_LOG, IDC_OSD_MONITOR, diff --git a/pcsx2/GS/Window/GSwxDialog.cpp b/pcsx2/GS/Window/GSwxDialog.cpp index 87a6ae2a99..865e047baa 100644 --- a/pcsx2/GS/Window/GSwxDialog.cpp +++ b/pcsx2/GS/Window/GSwxDialog.cpp @@ -275,7 +275,6 @@ RendererTab::RendererTab(wxWindow* parent) const int space = wxSizerFlags().Border().GetBorderInPixels(); auto hw_prereq = [this]{ return m_is_hardware; }; auto sw_prereq = [this]{ return !m_is_hardware; }; - auto upscale_prereq = [this]{ return !m_is_native_res; }; PaddedBoxSizer tab_box(wxVERTICAL); PaddedBoxSizer general_box(wxVERTICAL, this, "General GS Settings"); @@ -284,10 +283,9 @@ RendererTab::RendererTab(wxWindow* parent) auto* hw_checks_box = new wxWrapSizer(wxHORIZONTAL); - m_ui.addCheckBox(hw_checks_box, "Accurate Destination Alpha Test", "accurate_date", IDC_ACCURATE_DATE, hw_prereq); - m_ui.addCheckBox(hw_checks_box, "Conservative Buffer Allocation", "conservative_framebuffer", IDC_CONSERVATIVE_FB, upscale_prereq); - auto* paltex_prereq = m_ui.addCheckBox(hw_checks_box, "GPU Palette Conversion", "paltex", IDC_PALTEX, hw_prereq); + m_ui.addCheckBox(hw_checks_box, "Spin GPU During Readbacks", "HWSpinGPUForReadbacks", IDC_SPIN_GPU); + m_ui.addCheckBox(hw_checks_box, "Spin CPU During Readbacks", "HWSpinCPUForReadbacks", IDC_SPIN_CPU); auto aniso_prereq = [this, paltex_prereq]{ return m_is_hardware && paltex_prereq->GetValue() == false; }; auto* hw_choice_grid = new wxFlexGridSizer(2, space, space); @@ -297,6 +295,7 @@ RendererTab::RendererTab(wxWindow* parent) m_ui.addComboBoxAndLabel(hw_choice_grid, "Anisotropic Filtering:", "MaxAnisotropy", &theApp.m_gs_max_anisotropy, IDC_AFCOMBO, aniso_prereq); m_ui.addComboBoxAndLabel(hw_choice_grid, "Dithering (PgDn):", "dithering_ps2", &theApp.m_gs_dithering, IDC_DITHERING, hw_prereq); m_ui.addComboBoxAndLabel(hw_choice_grid, "Mipmapping:", "mipmap_hw", &theApp.m_gs_hw_mipmapping, IDC_MIPMAP_HW, hw_prereq); + m_ui.addComboBoxAndLabel(hw_choice_grid, "Trilinear Filtering:", "TriFilter", &theApp.m_gs_trifilter, IDC_TRI_FILTER, hw_prereq); m_ui.addComboBoxAndLabel(hw_choice_grid, "CRC Hack Level:", "crc_hack_level", &theApp.m_gs_crc_level, IDC_CRC_LEVEL, hw_prereq); m_ui.addComboBoxAndLabel(hw_choice_grid, "Blending Accuracy:", "accurate_blending_unit", &theApp.m_gs_acc_blend_level, IDC_ACCURATE_BLEND_UNIT, hw_prereq); m_ui.addComboBoxAndLabel(hw_choice_grid, "Texture Preloading:", "texture_preloading", &theApp.m_gs_texture_preloading, IDC_PRELOAD_TEXTURES, hw_prereq); @@ -307,7 +306,6 @@ RendererTab::RendererTab(wxWindow* parent) auto* sw_checks_box = new wxWrapSizer(wxHORIZONTAL); m_ui.addCheckBox(sw_checks_box, "Auto Flush", "autoflush_sw", IDC_AUTO_FLUSH_SW, sw_prereq); - m_ui.addCheckBox(sw_checks_box, "Edge Antialiasing (Del)", "aa1", IDC_AA1, sw_prereq); m_ui.addCheckBox(sw_checks_box, "Mipmapping", "mipmap", IDC_MIPMAP_SW, sw_prereq); software_box->Add(sw_checks_box, wxSizerFlags().Centre()); @@ -376,7 +374,6 @@ HacksTab::HacksTab(wxWindow* parent) // Renderer Hacks: m_ui.addComboBoxAndLabel(rend_hack_choice_grid, "Half Screen Fix:", "UserHacks_Half_Bottom_Override", &theApp.m_gs_generic_list, IDC_HALF_SCREEN_TS, hacks_prereq); - m_ui.addComboBoxAndLabel(rend_hack_choice_grid, "Trilinear Filtering:", "UserHacks_TriFilter", &theApp.m_gs_trifilter, IDC_TRI_FILTER, hacks_prereq); // Skipdraw Range add_label(this, rend_hack_choice_grid, "Skipdraw Range:", IDC_SKIPDRAWEND); @@ -465,47 +462,63 @@ PostTab::PostTab(wxWindow* parent) { const int space = wxSizerFlags().Border().GetBorderInPixels(); PaddedBoxSizer tab_box(wxVERTICAL); - PaddedBoxSizer shader_box(wxVERTICAL, this, "Custom Shader"); + PaddedBoxSizer shader_box(wxVERTICAL, this, "Shader Options"); + + // Bilinear filtering + auto* bil_filter_grid_box = new wxFlexGridSizer(2, space, space); + bil_filter_grid_box->AddGrowableCol(1); - auto not_vk_prereq = [this] { return !m_is_vk_hw; }; + m_ui.addComboBoxAndLabel(bil_filter_grid_box, "Bilinear Filtering:", "linear_present_mode", &theApp.m_gs_tex_display_list, IDC_LINEAR_PRESENT); - m_ui.addCheckBox(shader_box.inner, "Texture Filtering of Display", "linear_present", IDC_LINEAR_PRESENT); - m_ui.addCheckBox(shader_box.inner, "FXAA Shader (PgUp)", "fxaa", IDC_FXAA); + shader_box->Add(bil_filter_grid_box, wxSizerFlags().Expand()); + // Sharpening, fxaa + PaddedBoxSizer sharpening_box(wxVERTICAL, this, "Sharpening/Anti-aliasing"); + auto* casmode_grid = new wxFlexGridSizer(2, space, space); + casmode_grid->AddGrowableCol(1); + + m_ui.addComboBoxAndLabel(casmode_grid, "Contrast Adaptive Sharpening:", "CASMode", &theApp.m_gs_casmode); + + sharpening_box->Add(casmode_grid, wxSizerFlags().Expand()); + + auto* sharpness_grid = new wxFlexGridSizer(2, space, space); + sharpness_grid->AddGrowableCol(1); + + m_ui.addSliderAndLabel(sharpness_grid, "Sharpness:", "CASSharpness", 0, 100, 50, -1); + + sharpening_box->Add(sharpness_grid, wxSizerFlags().Expand()); + + auto* fxaa_grid = new wxFlexGridSizer(2, space, space); + fxaa_grid->AddGrowableCol(1); + + m_ui.addCheckBox(fxaa_grid, "FXAA (PgUp)", "fxaa", IDC_FXAA); + + sharpening_box->Add(fxaa_grid, wxSizerFlags().Expand()); + + shader_box->Add(sharpening_box.outer, wxSizerFlags().Expand()); + + // Shade boost CheckboxPrereq shade_boost_check(m_ui.addCheckBox(shader_box.inner, "Enable Shade Boost", "ShadeBoost", IDC_SHADEBOOST)); - PaddedBoxSizer shade_boost_box(wxVERTICAL, this, "Shade Boost"); auto* shader_boost_grid = new wxFlexGridSizer(2, space, space); shader_boost_grid->AddGrowableCol(1); - auto shader_boost_prereq = [shade_boost_check, this] { return shade_boost_check.box->GetValue(); }; - m_ui.addSliderAndLabel(shader_boost_grid, "Brightness:", "ShadeBoost_Brightness", 0, 100, 50, -1, shader_boost_prereq); - m_ui.addSliderAndLabel(shader_boost_grid, "Contrast:", "ShadeBoost_Contrast", 0, 100, 50, -1, shader_boost_prereq); - m_ui.addSliderAndLabel(shader_boost_grid, "Saturation:", "ShadeBoost_Saturation", 0, 100, 50, -1, shader_boost_prereq); + m_ui.addSliderAndLabel(shader_boost_grid, "Brightness:", "ShadeBoost_Brightness", 0, 100, 50, -1, shade_boost_check); + m_ui.addSliderAndLabel(shader_boost_grid, "Contrast:", "ShadeBoost_Contrast", 0, 100, 50, -1, shade_boost_check); + m_ui.addSliderAndLabel(shader_boost_grid, "Saturation:", "ShadeBoost_Saturation", 0, 100, 50, -1, shade_boost_check); shade_boost_box->Add(shader_boost_grid, wxSizerFlags().Expand()); shader_box->Add(shade_boost_box.outer, wxSizerFlags().Expand()); - CheckboxPrereq ext_shader_check(m_ui.addCheckBox(shader_box.inner, "Enable External Shader", "shaderfx", IDC_SHADER_FX, not_vk_prereq)); - - PaddedBoxSizer ext_shader_box(wxVERTICAL, this, "External Shader (Home)"); - auto* ext_shader_grid = new wxFlexGridSizer(2, space, space); - ext_shader_grid->AddGrowableCol(1); - - auto shaderext_prereq = [ext_shader_check, this] { return !m_is_vk_hw && ext_shader_check.box->GetValue(); }; - m_ui.addFilePickerAndLabel(ext_shader_grid, "GLSL fx File:", "shaderfx_glsl", -1, shaderext_prereq); - m_ui.addFilePickerAndLabel(ext_shader_grid, "Config File:", "shaderfx_conf", -1, shaderext_prereq); - - ext_shader_box->Add(ext_shader_grid, wxSizerFlags().Expand()); - shader_box->Add(ext_shader_box.outer, wxSizerFlags().Expand()); - // TV Shader auto* tv_box = new wxFlexGridSizer(2, space, space); tv_box->AddGrowableCol(1); - m_ui.addComboBoxAndLabel(tv_box, "TV Shader:", "TVShader", &theApp.m_gs_tv_shaders); - shader_box->Add(tv_box, wxSizerFlags().Expand()); + m_ui.addComboBoxAndLabel(tv_box, "TV Shader:", "TVShader", &theApp.m_gs_tv_shaders); + + shader_box->Add(tv_box, wxSizerFlags().Expand()); tab_box->Add(shader_box.outer, wxSizerFlags().Expand()); + SetSizerAndFit(tab_box.outer); } @@ -520,7 +533,7 @@ OSDTab::OSDTab(wxWindow* parent) auto* font_grid = new wxFlexGridSizer(2, space, space); font_grid->AddGrowableCol(1); - m_ui.addSliderAndLabel(font_grid, "Scale:", "OsdScale", 50, 300, 100, -1); + m_ui.addSliderAndLabel(font_grid, "OSD Scale:", "OsdScale", 50, 300, 100, -1); font_box->Add(font_grid, wxSizerFlags().Expand()); tab_box->Add(font_box.outer, wxSizerFlags().Expand()); @@ -529,14 +542,16 @@ OSDTab::OSDTab(wxWindow* parent) auto* log_grid = new wxFlexGridSizer(2, space, space); log_grid->AddGrowableCol(1); - m_ui.addCheckBox(log_grid, "Show Messages", "OsdShowMessages", -1); - m_ui.addCheckBox(log_grid, "Show Speed", "OsdShowSpeed", -1); - m_ui.addCheckBox(log_grid, "Show FPS", "OsdShowFPS", -1); - m_ui.addCheckBox(log_grid, "Show CPU Usage", "OsdShowCPU", -1); - m_ui.addCheckBox(log_grid, "Show GPU Usage", "OsdShowGPU", -1); - m_ui.addCheckBox(log_grid, "Show Resolution", "OsdShowResolution", -1); - m_ui.addCheckBox(log_grid, "Show Statistics", "OsdShowGSStats", -1); - m_ui.addCheckBox(log_grid, "Show Indicators", "OsdShowIndicators", -1); + m_ui.addCheckBox(log_grid, "Show Notifications", "OsdShowMessages", -1); + m_ui.addCheckBox(log_grid, "Show Speed", "OsdShowSpeed", -1); + m_ui.addCheckBox(log_grid, "Show FPS", "OsdShowFPS", -1); + m_ui.addCheckBox(log_grid, "Show CPU Usage", "OsdShowCPU", -1); + m_ui.addCheckBox(log_grid, "Show GPU Usage", "OsdShowGPU", -1); + m_ui.addCheckBox(log_grid, "Show Resolution", "OsdShowResolution", -1); + m_ui.addCheckBox(log_grid, "Show Statistics", "OsdShowGSStats", -1); + m_ui.addCheckBox(log_grid, "Show Indicators", "OsdShowIndicators", -1); + m_ui.addCheckBox(log_grid, "Show Settings", "OsdShowSettings", -1); + m_ui.addCheckBox(log_grid, "Show Inputs", "OsdShowInputs", -1); log_box->Add(log_grid, wxSizerFlags().Expand()); tab_box->Add(log_box.outer, wxSizerFlags().Expand()); @@ -551,19 +566,18 @@ DebugTab::DebugTab(wxWindow* parent) const int space = wxSizerFlags().Border().GetBorderInPixels(); PaddedBoxSizer tab_box(wxVERTICAL); - auto ogl_hw_prereq = [this]{ return m_is_ogl_hw; }; auto vk_ogl_hw_prereq = [this] { return m_is_ogl_hw || m_is_vk_hw; }; if (g_Conf->DevMode || IsDevBuild) { PaddedBoxSizer debug_box(wxVERTICAL, this, "Debug"); - auto* debug_check_box = new wxWrapSizer(wxHORIZONTAL); - m_ui.addCheckBox(debug_check_box, "Use Blit Swap Chain", "UseBlitSwapChain"); - m_ui.addCheckBox(debug_check_box, "Disable Shader Cache", "disable_shader_cache"); - m_ui.addCheckBox(debug_check_box, "Disable Framebuffer Fetch", "DisableFramebufferFetch"); + auto* debug_check_box = new wxFlexGridSizer(2, space, space); m_ui.addCheckBox(debug_check_box, "Disable Dual-Source Blending", "DisableDualSourceBlend"); - m_ui.addCheckBox(debug_check_box, "Use Debug Device", "UseDebugDevice"); + m_ui.addCheckBox(debug_check_box, "Disable Framebuffer Fetch", "DisableFramebufferFetch"); + m_ui.addCheckBox(debug_check_box, "Disable Shader Cache", "disable_shader_cache"); + m_ui.addCheckBox(debug_check_box, "Use Blit Swap Chain", "UseBlitSwapChain"); m_ui.addCheckBox(debug_check_box, "Dump GS data", "dump"); + m_ui.addCheckBox(debug_check_box, "Use Debug Device", "UseDebugDevice"); auto* debug_save_check_box = new wxWrapSizer(wxHORIZONTAL); m_ui.addCheckBox(debug_save_check_box, "Save RT", "save"); @@ -572,6 +586,7 @@ DebugTab::DebugTab(wxWindow* parent) m_ui.addCheckBox(debug_save_check_box, "Save Depth", "savez"); debug_box->Add(debug_check_box); + debug_box->AddSpacer(space); debug_box->Add(debug_save_check_box); auto* dump_grid = new wxFlexGridSizer(2, space, space); @@ -587,11 +602,10 @@ DebugTab::DebugTab(wxWindow* parent) PaddedBoxSizer ogl_box(wxVERTICAL, this, "Overrides"); auto* ogl_grid = new wxFlexGridSizer(2, space, space); - m_ui.addComboBoxAndLabel(ogl_grid, "Texture Barriers:", "OverrideTextureBarriers", &theApp.m_gs_generic_list, -1, vk_ogl_hw_prereq); - m_ui.addComboBoxAndLabel(ogl_grid, "Geometry Shader:", "OverrideGeometryShaders", &theApp.m_gs_generic_list, IDC_GEOMETRY_SHADER_OVERRIDE, vk_ogl_hw_prereq); - m_ui.addComboBoxAndLabel(ogl_grid, "Image Load Store:", "override_GL_ARB_shader_image_load_store", &theApp.m_gs_generic_list, IDC_IMAGE_LOAD_STORE, ogl_hw_prereq); - m_ui.addComboBoxAndLabel(ogl_grid, "Sparse Texture:", "override_GL_ARB_sparse_texture", &theApp.m_gs_generic_list, IDC_SPARSE_TEXTURE, ogl_hw_prereq); - m_ui.addComboBoxAndLabel(ogl_grid, "Dump Compression:", "GSDumpCompression", &theApp.m_gs_dump_compression, -1); + m_ui.addComboBoxAndLabel(ogl_grid, "Texture Barriers:", "OverrideTextureBarriers", &theApp.m_gs_generic_list, -1, vk_ogl_hw_prereq); + m_ui.addComboBoxAndLabel(ogl_grid, "Geometry Shader:", "OverrideGeometryShaders", &theApp.m_gs_generic_list, IDC_GEOMETRY_SHADER_OVERRIDE, vk_ogl_hw_prereq); + m_ui.addComboBoxAndLabel(ogl_grid, "Hardware Download Mode:", "HWDownloadMode", &theApp.m_gs_hw_download_mode, -1); + m_ui.addComboBoxAndLabel(ogl_grid, "Dump Compression:", "GSDumpCompression", &theApp.m_gs_dump_compression, -1); ogl_box->Add(ogl_grid); tab_box->Add(ogl_box.outer, wxSizerFlags().Expand()); @@ -634,7 +648,7 @@ Dialog::Dialog() m_adapter_select = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, {}); top_grid->Add(m_adapter_select, wxSizerFlags().Expand()); - m_ui.addComboBoxAndLabel(top_grid, "Deinterlacing (F5):", "deinterlace", &theApp.m_gs_deinterlace); + m_ui.addComboBoxAndLabel(top_grid, "Deinterlacing (F5):", "deinterlace_mode", &theApp.m_gs_deinterlace); m_bifilter_select = m_ui.addComboBoxAndLabel(top_grid, "Texture Filtering:", "filter", &theApp.m_gs_bifilter, IDC_FILTER).first; @@ -805,8 +819,6 @@ void Dialog::Update() m_hacks_panel->m_is_native_res = !is_hw || !is_upscale; m_hacks_panel->m_is_hardware = is_hw; m_renderer_panel->m_is_hardware = is_hw; - m_renderer_panel->m_is_native_res = !is_hw || !is_upscale; - m_post_panel->m_is_vk_hw = renderer == GSRendererType::VK; m_debug_panel->m_is_ogl_hw = renderer == GSRendererType::OGL; m_debug_panel->m_is_vk_hw = renderer == GSRendererType::VK; diff --git a/pcsx2/GS/Window/GSwxDialog.h b/pcsx2/GS/Window/GSwxDialog.h index 051bab2d06..7800f9f2cf 100644 --- a/pcsx2/GS/Window/GSwxDialog.h +++ b/pcsx2/GS/Window/GSwxDialog.h @@ -106,7 +106,6 @@ namespace GSSettingsDialog GSUIElementHolder m_ui; wxChoice* m_internal_resolution; bool m_is_hardware = false; - bool m_is_native_res = false; RendererTab(wxWindow* parent); void Load() { m_ui.Load(); } @@ -156,7 +155,6 @@ namespace GSSettingsDialog { public: GSUIElementHolder m_ui; - bool m_is_vk_hw = false; PostTab(wxWindow* parent); void Load() { m_ui.Load(); } diff --git a/pcsx2/GS/resource.h b/pcsx2/GS/resource.h index 2b228f2496..34901f7980 100644 --- a/pcsx2/GS/resource.h +++ b/pcsx2/GS/resource.h @@ -20,7 +20,7 @@ #define IDC_STATIC -1 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 10019 diff --git a/pcsx2/GSDumpReplayer.cpp b/pcsx2/GSDumpReplayer.cpp index 852f7df306..60a2491a5c 100644 --- a/pcsx2/GSDumpReplayer.cpp +++ b/pcsx2/GSDumpReplayer.cpp @@ -50,12 +50,11 @@ static void GSDumpReplayerCpuCheckExecutionState(); static void GSDumpReplayerCpuThrowException(const BaseException& ex); static void GSDumpReplayerCpuThrowCpuException(const BaseR5900Exception& ex); static void GSDumpReplayerCpuClear(u32 addr, u32 size); -static uint GSDumpReplayerCpuGetCacheReserve(); -static void GSDumpReplayerCpuSetCacheReserve(uint reserveInMegs); static std::unique_ptr s_dump_file; static u32 s_current_packet = 0; static u32 s_dump_frame_number = 0; +static s32 s_dump_loop_count = 0; static bool s_dump_running = false; static bool s_needs_state_loaded = false; static u64 s_frame_ticks = 0; @@ -70,9 +69,7 @@ R5900cpu GSDumpReplayerCpu = { GSDumpReplayerCpuCheckExecutionState, GSDumpReplayerCpuThrowException, GSDumpReplayerCpuThrowCpuException, - GSDumpReplayerCpuClear, - GSDumpReplayerCpuGetCacheReserve, - GSDumpReplayerCpuSetCacheReserve}; + GSDumpReplayerCpuClear}; static InterpVU0 gsDumpVU0; static InterpVU1 gsDumpVU1; @@ -82,6 +79,11 @@ bool GSDumpReplayer::IsReplayingDump() return static_cast(s_dump_file); } +void GSDumpReplayer::SetLoopCount(s32 loop_count) +{ + s_dump_loop_count = loop_count - 1; +} + bool GSDumpReplayer::Initialize(const char* filename) { Common::Timer timer; @@ -103,6 +105,9 @@ bool GSDumpReplayer::Initialize(const char* filename) CpuVU0 = &gsDumpVU0; CpuVU1 = &gsDumpVU1; + // loop infinitely by default + s_dump_loop_count = -1; + return true; } @@ -148,6 +153,11 @@ u32 GSDumpReplayer::GetDumpCRC() return s_dump_file->GetCRC(); } +u32 GSDumpReplayer::GetFrameNumber() +{ + return s_dump_frame_number; +} + void GSDumpReplayerCpuReserve() { } @@ -230,7 +240,16 @@ void GSDumpReplayerCpuStep() const GSDumpFile::GSData& packet = s_dump_file->GetPackets()[s_current_packet]; s_current_packet = (s_current_packet + 1) % static_cast(s_dump_file->GetPackets().size()); if (s_current_packet == 0) + { s_dump_frame_number = 0; + if (s_dump_loop_count > 0) + s_dump_loop_count--; + else if (s_dump_loop_count == 0) + { + Host::RequestVMShutdown(false, false, false); + s_dump_running = false; + } + } switch (packet.id) { @@ -320,15 +339,6 @@ void GSDumpReplayerCpuClear(u32 addr, u32 size) { } -uint GSDumpReplayerCpuGetCacheReserve() -{ - return 0; -} - -void GSDumpReplayerCpuSetCacheReserve(uint reserveInMegs) -{ -} - void GSDumpReplayer::RenderUI() { const float scale = ImGuiManager::GetGlobalScale(); diff --git a/pcsx2/GSDumpReplayer.h b/pcsx2/GSDumpReplayer.h index f77ea56705..cd95d64ae7 100644 --- a/pcsx2/GSDumpReplayer.h +++ b/pcsx2/GSDumpReplayer.h @@ -23,6 +23,9 @@ namespace GSDumpReplayer { bool IsReplayingDump(); +/// If set, playback will repeat once it reaches the last frame. +void SetLoopCount(s32 loop_count = 0); + bool Initialize(const char* filename); void Reset(); void Shutdown(); @@ -30,5 +33,7 @@ void Shutdown(); std::string GetDumpSerial(); u32 GetDumpCRC(); +u32 GetFrameNumber(); + void RenderUI(); } \ No newline at end of file diff --git a/pcsx2/GameDatabase.cpp b/pcsx2/GameDatabase.cpp index d812363b18..7df2acb068 100644 --- a/pcsx2/GameDatabase.cpp +++ b/pcsx2/GameDatabase.cpp @@ -159,7 +159,7 @@ void GameDatabase::parseAndInsert(const std::string_view& serial, const c4::yml: if (StringUtil::EndsWith(fix, "Hack")) { fix.erase(fix.size() - 4); - for (GamefixId id = GamefixId_FIRST; id < pxEnumEnd; id++) + for (GamefixId id = GamefixId_FIRST; id < pxEnumEnd; ++id) { if (fix.compare(EnumToString(id)) == 0 && std::find(gameEntry.gameFixes.begin(), gameEntry.gameFixes.end(), id) == gameEntry.gameFixes.end()) @@ -190,7 +190,7 @@ void GameDatabase::parseAndInsert(const std::string_view& serial, const c4::yml: if (StringUtil::EndsWith(speedHack, "SpeedHack")) { speedHack.erase(speedHack.size() - 9); - for (SpeedhackId id = SpeedhackId_FIRST; id < pxEnumEnd; id++) + for (SpeedhackId id = SpeedhackId_FIRST; id < pxEnumEnd; ++id) { if (speedHack.compare(EnumToString(id)) == 0 && std::none_of(gameEntry.speedHacks.begin(), gameEntry.speedHacks.end(), [id](const auto& it) { return it.first == id; })) @@ -270,7 +270,6 @@ void GameDatabase::parseAndInsert(const std::string_view& serial, const c4::yml: static const char* s_gs_hw_fix_names[] = { "autoFlush", - "conservativeFramebuffer", "cpuFramebufferConversion", "disableDepthSupport", "wrapGSMem", @@ -291,6 +290,8 @@ static const char* s_gs_hw_fix_names[] = { "texturePreloading", "deinterlace", "cpuSpriteRenderBW", + "cpuCLUTRender", + "gpuPaletteConversion", }; static_assert(std::size(s_gs_hw_fix_names) == static_cast(GameDatabaseSchema::GSHWFixId::Count), "HW fix name lookup is correct size"); @@ -317,16 +318,9 @@ bool GameDatabaseSchema::isUserHackHWFix(GSHWFixId id) case GSHWFixId::Deinterlace: case GSHWFixId::Mipmap: case GSHWFixId::TexturePreloading: - case GSHWFixId::ConservativeFramebuffer: case GSHWFixId::PointListPalette: - return false; - -#ifdef PCSX2_CORE - // Trifiltering isn't a hack in Qt. case GSHWFixId::TrilinearFiltering: return false; -#endif - default: return true; } @@ -439,16 +433,13 @@ u32 GameDatabaseSchema::GameEntry::applyGameFixes(Pcsx2Config& config, bool appl return num_applied_fixes; } -bool GameDatabaseSchema::GameEntry::configMatchesHWFix(const Pcsx2Config::GSOptions& config, GSHWFixId id, int value) const +bool GameDatabaseSchema::GameEntry::configMatchesHWFix(const Pcsx2Config::GSOptions& config, GSHWFixId id, int value) { switch (id) { case GSHWFixId::AutoFlush: return (static_cast(config.UserHacks_AutoFlush) == value); - case GSHWFixId::ConservativeFramebuffer: - return (static_cast(config.ConservativeFramebuffer) == value); - case GSHWFixId::CPUFramebufferConversion: return (static_cast(config.UserHacks_CPUFBConversion) == value); @@ -468,13 +459,13 @@ bool GameDatabaseSchema::GameEntry::configMatchesHWFix(const Pcsx2Config::GSOpti return (static_cast(config.UserHacks_TextureInsideRt) == value); case GSHWFixId::AlignSprite: - return (config.UpscaleMultiplier == 1 || static_cast(config.UserHacks_AlignSpriteX) == value); + return (config.UpscaleMultiplier <= 1.0f || static_cast(config.UserHacks_AlignSpriteX) == value); case GSHWFixId::MergeSprite: - return (config.UpscaleMultiplier == 1 || static_cast(config.UserHacks_MergePPSprite) == value); + return (config.UpscaleMultiplier <= 1.0f || static_cast(config.UserHacks_MergePPSprite) == value); case GSHWFixId::WildArmsHack: - return (config.UpscaleMultiplier == 1 || static_cast(config.UserHacks_WildHack) == value); + return (config.UpscaleMultiplier <= 1.0f || static_cast(config.UserHacks_WildHack) == value); case GSHWFixId::PointListPalette: return (static_cast(config.PointListPalette) == value); @@ -483,7 +474,7 @@ bool GameDatabaseSchema::GameEntry::configMatchesHWFix(const Pcsx2Config::GSOpti return (config.HWMipmap == HWMipmapLevel::Automatic || static_cast(config.HWMipmap) == value); case GSHWFixId::TrilinearFiltering: - return (config.UserHacks_TriFilter == TriFiltering::Automatic || static_cast(config.UserHacks_TriFilter) == value); + return (config.TriFilter == TriFiltering::Automatic || static_cast(config.TriFilter) == value); case GSHWFixId::SkipDrawStart: return (config.SkipDrawStart == value); @@ -495,10 +486,10 @@ bool GameDatabaseSchema::GameEntry::configMatchesHWFix(const Pcsx2Config::GSOpti return (config.UserHacks_HalfBottomOverride == value); case GSHWFixId::HalfPixelOffset: - return (config.UpscaleMultiplier == 1 || config.UserHacks_HalfPixelOffset == value); + return (config.UpscaleMultiplier <= 1.0f || config.UserHacks_HalfPixelOffset == value); case GSHWFixId::RoundSprite: - return (config.UpscaleMultiplier == 1 || config.UserHacks_RoundSprite == value); + return (config.UpscaleMultiplier <= 1.0f || config.UserHacks_RoundSprite == value); case GSHWFixId::TexturePreloading: return (static_cast(config.TexturePreloading) <= value); @@ -509,6 +500,12 @@ bool GameDatabaseSchema::GameEntry::configMatchesHWFix(const Pcsx2Config::GSOpti case GSHWFixId::CPUSpriteRenderBW: return (config.UserHacks_CPUSpriteRenderBW == value); + case GSHWFixId::CPUCLUTRender: + return (config.UserHacks_CPUCLUTRender == value); + + case GSHWFixId::GPUPaletteConversion: + return (config.GPUPaletteConversion == ((value > 1) ? (config.TexturePreloading == TexturePreloadingLevel::Full) : (value != 0))); + default: return false; } @@ -542,10 +539,6 @@ u32 GameDatabaseSchema::GameEntry::applyGSHardwareFixes(Pcsx2Config::GSOptions& config.UserHacks_AutoFlush = (value > 0); break; - case GSHWFixId::ConservativeFramebuffer: - config.ConservativeFramebuffer = (value > 0); - break; - case GSHWFixId::CPUFramebufferConversion: config.UserHacks_CPUFBConversion = (value > 0); break; @@ -602,9 +595,9 @@ u32 GameDatabaseSchema::GameEntry::applyGSHardwareFixes(Pcsx2Config::GSOptions& { if (value >= 0 && value <= static_cast(TriFiltering::Forced)) { - if (config.UserHacks_TriFilter == TriFiltering::Automatic) - config.UserHacks_TriFilter = static_cast(value); - else if (config.UserHacks_TriFilter == TriFiltering::Off) + if (config.TriFilter == TriFiltering::Automatic) + config.TriFilter = static_cast(value); + else if (config.TriFilter == TriFiltering::Off) Console.Warning("[GameDB] Game requires trilinear filtering but it has been force disabled."); } } @@ -639,7 +632,7 @@ u32 GameDatabaseSchema::GameEntry::applyGSHardwareFixes(Pcsx2Config::GSOptions& case GSHWFixId::Deinterlace: { - if (value >= 0 && value <= static_cast(GSInterlaceMode::Automatic)) + if (value >= static_cast(GSInterlaceMode::Automatic) && value < static_cast(GSInterlaceMode::Count)) { if (config.InterlaceMode == GSInterlaceMode::Automatic) config.InterlaceMode = static_cast(value); @@ -653,6 +646,20 @@ u32 GameDatabaseSchema::GameEntry::applyGSHardwareFixes(Pcsx2Config::GSOptions& config.UserHacks_CPUSpriteRenderBW = value; break; + case GSHWFixId::CPUCLUTRender: + config.UserHacks_CPUCLUTRender = value; + break; + + case GSHWFixId::GPUPaletteConversion: + { + // if 2, enable paltex when preloading is full, otherwise leave as-is + if (value > 1) + config.GPUPaletteConversion = (config.TexturePreloading == TexturePreloadingLevel::Full) ? true : config.GPUPaletteConversion; + else + config.GPUPaletteConversion = (value != 0); + } + break; + default: break; } @@ -670,7 +677,7 @@ u32 GameDatabaseSchema::GameEntry::applyGSHardwareFixes(Pcsx2Config::GSOptions& Host::AddKeyedOSDMessage("HWFixesWarning", fmt::format("Manual GS hardware renderer fixes are enabled, automatic fixes were not applied:\n{}", disabled_fixes), - 10.0f); + Host::OSD_ERROR_DURATION); } else { diff --git a/pcsx2/GameDatabase.h b/pcsx2/GameDatabase.h index 04f4fed868..8e9e0cd0b6 100644 --- a/pcsx2/GameDatabase.h +++ b/pcsx2/GameDatabase.h @@ -60,7 +60,6 @@ namespace GameDatabaseSchema { // boolean settings AutoFlush, - ConservativeFramebuffer, CPUFramebufferConversion, DisableDepthSupport, WrapGSMem, @@ -83,6 +82,8 @@ namespace GameDatabaseSchema TexturePreloading, Deinterlace, CPUSpriteRenderBW, + CPUCLUTRender, + GPUPaletteConversion, Count }; @@ -114,7 +115,7 @@ namespace GameDatabaseSchema u32 applyGSHardwareFixes(Pcsx2Config::GSOptions& config) const; /// Returns true if the current config value for the specified hw fix id matches the value. - bool configMatchesHWFix(const Pcsx2Config::GSOptions& config, GSHWFixId id, int value) const; + static bool configMatchesHWFix(const Pcsx2Config::GSOptions& config, GSHWFixId id, int value); }; }; diff --git a/pcsx2/Gif.cpp b/pcsx2/Gif.cpp index 447a93a860..f354e3ce10 100644 --- a/pcsx2/Gif.cpp +++ b/pcsx2/Gif.cpp @@ -250,6 +250,7 @@ __fi void gifInterrupt() { GifDMAInt(16); } + CPU_SET_DMASTALL(DMAC_GIF, gifUnit.Path3Masked() || !gifUnit.CanDoPath3()); return; } } @@ -265,6 +266,7 @@ __fi void gifInterrupt() { GIF_LOG("Path 3 Paused"); GifDMAInt(128); + CPU_SET_DMASTALL(DMAC_GIF, true); if (gif_fifo.fifoSize == 16) return; } @@ -282,7 +284,10 @@ __fi void gifInterrupt() // If we just read from the fifo, we want to loop and not read more DMA // If there is no DMA data waiting and the DMA is active, let the DMA progress until there is if ((!CheckPaths() && gif_fifo.fifoSize == 16) || readSize) + { + CPU_SET_DMASTALL(DMAC_GIF, gifUnit.Path3Masked() || !gifUnit.CanDoPath3()); return; + } } if (!(gifch.chcr.STR)) @@ -295,6 +300,7 @@ __fi void gifInterrupt() Console.Warning("gs dma masked, re-scheduling..."); // Re-raise the int shortly in the future GifDMAInt(64); + CPU_SET_DMASTALL(DMAC_GIF, true); return; } GIFdma(); @@ -417,8 +423,9 @@ void GIFdma() if (gifRegs.ctrl.PSE) { // Temporarily stop - Console.WriteLn("Gif dma temp paused? (non MFIFO GIF)"); + DevCon.WriteLn("Gif dma paused by PSE bit."); GifDMAInt(16); + CPU_SET_DMASTALL(DMAC_GIF, true); return; } @@ -428,6 +435,7 @@ void GIFdma() if ((gifch.madr + (gifch.qwc * 16)) > dmacRegs.stadr.ADDR) { GifDMAInt(4); + CPU_SET_DMASTALL(DMAC_GIF, true); gif.gscycles = 0; return; } @@ -459,6 +467,7 @@ void GIFdma() hwDmacIrq(DMAC_STALL_SIS); GifDMAInt(128); gif.gscycles = 0; + CPU_SET_DMASTALL(DMAC_GIF, true); return; } } @@ -474,6 +483,7 @@ void GIFdma() if (gifch.qwc > 0) // Normal Mode { GIFchain(); // Transfers the data set by the switch + CPU_SET_DMASTALL(DMAC_GIF, gifUnit.Path3Masked() || !gifUnit.CanDoPath3()); return; } } @@ -487,7 +497,7 @@ void dmaGIF() // DevCon.Warning("dmaGIFstart chcr = %lx, madr = %lx, qwc = %lx\n tadr = %lx, asr0 = %lx, asr1 = %lx", gifch.chcr._u32, gifch.madr, gifch.qwc, gifch.tadr, gifch.asr0, gifch.asr1); gif.gspath3done = false; // For some reason this doesn't clear? So when the system starts the thread, we will clear it :) - + CPU_SET_DMASTALL(DMAC_GIF, false); if (gifch.chcr.MOD == NORMAL_MODE) { // Else it really is a normal transfer and we want to quit, else it gets confused with chains gif.gspath3done = true; @@ -660,8 +670,9 @@ void mfifoGIFtransfer() if (gifRegs.ctrl.PSE) { // Temporarily stop - Console.WriteLn("Gif dma temp paused?"); + DevCon.WriteLn("Gif MFIFO dma paused by PSE bit."); CPU_INT(DMAC_MFIFO_GIF, 16); + CPU_SET_DMASTALL(DMAC_MFIFO_GIF, true); return; } @@ -674,6 +685,7 @@ void mfifoGIFtransfer() SPR_LOG("GIF FIFO EMPTY before tag read"); gif.gifstate = GIF_STATE_EMPTY; GifDMAInt(4); + CPU_SET_DMASTALL(DMAC_MFIFO_GIF, true); return; } @@ -722,6 +734,7 @@ void gifMFIFOInterrupt() { // GIF not in MFIFO anymore, come out. DevCon.WriteLn("GIF Leaving MFIFO - Report if any errors"); gifInterrupt(); + CPU_SET_DMASTALL(DMAC_MFIFO_GIF, true); return; } @@ -742,6 +755,7 @@ void gifMFIFOInterrupt() { GifDMAInt(16); } + CPU_SET_DMASTALL(DMAC_MFIFO_GIF, gifUnit.Path3Masked() || !gifUnit.CanDoPath3()); return; } } @@ -749,6 +763,7 @@ void gifMFIFOInterrupt() if (gifUnit.gsSIGNAL.queued) { GifDMAInt(128); + CPU_SET_DMASTALL(DMAC_MFIFO_GIF, true); return; } @@ -765,7 +780,10 @@ void gifMFIFOInterrupt() // If we just read from the fifo, we want to loop and not read more DMA // If there is no DMA data waiting and the DMA is active, let the DMA progress until there is if ((!CheckPaths() && gif_fifo.fifoSize == 16) || readSize) + { + CPU_SET_DMASTALL(DMAC_MFIFO_GIF, gifUnit.Path3Masked() || !gifUnit.CanDoPath3()); return; + } } if (!gifch.chcr.STR) @@ -777,12 +795,16 @@ void gifMFIFOInterrupt() FireMFIFOEmpty(); if (gifch.qwc > 0 || !gif.gspath3done) + { + CPU_SET_DMASTALL(DMAC_MFIFO_GIF, true); return; + } } if (gifch.qwc > 0 || !gif.gspath3done) { mfifoGIFtransfer(); + CPU_SET_DMASTALL(DMAC_MFIFO_GIF, gifUnit.Path3Masked() || !gifUnit.CanDoPath3()); return; } @@ -793,7 +815,7 @@ void gifMFIFOInterrupt() gifRegs.stat.FQC = gif_fifo.fifoSize; CalculateFIFOCSR(); hwDmacIrq(DMAC_GIF); - + CPU_SET_DMASTALL(DMAC_MFIFO_GIF, false); if (gif_fifo.fifoSize) GifDMAInt(8 * BIAS); DMA_LOG("GIF MFIFO DMA End"); diff --git a/pcsx2/Gif_Logger.cpp b/pcsx2/Gif_Logger.cpp index 5a004d3b12..f5a5f36b9d 100644 --- a/pcsx2/Gif_Logger.cpp +++ b/pcsx2/Gif_Logger.cpp @@ -41,7 +41,7 @@ void Gif_ParsePacket(u8* data, u32 size, GIF_PATH path) { if (offset + 16 > size) return; gifTag.setTag(&buffer[offset], 1); - + GIF_PARSE("--Gif Tag [mode=%s][pre=%d][prim=%d][nregs=%d][nloop=%d][qwc=%d][EOP=%d]", GifTag_ModeStr[gifTag.tag.FLG], gifTag.tag.PRE, gifTag.tag.PRIM, gifTag.nRegs, gifTag.nLoop, gifTag.len/16, gifTag.tag.EOP); diff --git a/pcsx2/Gif_Unit.h b/pcsx2/Gif_Unit.h index 60afb82bf0..3a37f2cd50 100644 --- a/pcsx2/Gif_Unit.h +++ b/pcsx2/Gif_Unit.h @@ -239,7 +239,10 @@ struct Gif_Path if (!isMTVU()) // MTVU Freaks out if you try to reset it, so let's just let it transfer { GUNIT_WARN("Gif Path %d - Soft Reset", idx + 1); + gifTag.Reset(); + gsPack.Reset(); curSize = curOffset; + gsPack.offset = curOffset; } return; } diff --git a/pcsx2/Host.cpp b/pcsx2/Host.cpp index dadf64576c..6e7759c9a0 100644 --- a/pcsx2/Host.cpp +++ b/pcsx2/Host.cpp @@ -25,4 +25,14 @@ void Host::ReportFormattedErrorAsync(const std::string_view& title, const char* std::string message(StringUtil::StdStringFromFormatV(format, ap)); va_end(ap); ReportErrorAsync(title, message); -} \ No newline at end of file +} + +bool Host::ConfirmFormattedMessage(const std::string_view& title, const char* format, ...) +{ + std::va_list ap; + va_start(ap, format); + std::string message = StringUtil::StdStringFromFormatV(format, ap); + va_end(ap); + + return ConfirmMessage(title, message); +} diff --git a/pcsx2/Host.h b/pcsx2/Host.h index fea1cf7e54..0bd9df14bb 100644 --- a/pcsx2/Host.h +++ b/pcsx2/Host.h @@ -17,6 +17,8 @@ #include "common/Pcsx2Defs.h" +#include +#include #include #include #include @@ -44,6 +46,13 @@ struct HostKeyEvent namespace Host { + /// Typical durations for OSD messages. + static constexpr float OSD_CRITICAL_ERROR_DURATION = 20.0f; + static constexpr float OSD_ERROR_DURATION = 15.0f; + static constexpr float OSD_WARNING_DURATION = 10.0f; + static constexpr float OSD_INFO_DURATION = 5.0f; + static constexpr float OSD_QUICK_DURATION = 2.5f; + /// Reads a file from the resources directory of the application. /// This may be outside of the "normal" filesystem on platforms such as Mac. std::optional> ReadResourceFile(const char* filename); @@ -51,9 +60,13 @@ namespace Host /// Reads a resource file file from the resources directory as a string. std::optional ReadResourceFileToString(const char* filename); + /// Returns the modified time of a resource. + std::optional GetResourceFileTimestamp(const char* filename); + /// Adds OSD messages, duration is in seconds. void AddOSDMessage(std::string message, float duration = 2.0f); void AddKeyedOSDMessage(std::string key, std::string message, float duration = 2.0f); + void AddIconOSDMessage(std::string key, const char* icon, const std::string_view& message, float duration = 2.0f); void AddFormattedOSDMessage(float duration, const char* format, ...); void AddKeyedFormattedOSDMessage(std::string key, float duration, const char* format, ...); void RemoveKeyedOSDMessage(std::string key); @@ -62,4 +75,42 @@ namespace Host /// Displays an asynchronous error on the UI thread, i.e. doesn't block the caller. void ReportErrorAsync(const std::string_view& title, const std::string_view& message); void ReportFormattedErrorAsync(const std::string_view& title, const char* format, ...); + + /// Displays a synchronous confirmation on the UI thread, i.e. blocks the caller. + bool ConfirmMessage(const std::string_view& title, const std::string_view& message); + bool ConfirmFormattedMessage(const std::string_view& title, const char* format, ...); + + /// Opens a URL, using the default application. + void OpenURL(const std::string_view& url); + + /// Copies the provided text to the host's clipboard, if present. + bool CopyTextToClipboard(const std::string_view& text); + + /// Requests settings reset. Can be called from any thread, will call back and apply on the CPU thread. + bool RequestResetSettings(bool folders, bool core, bool controllers, bool hotkeys, bool ui); + + /// Requests a specific display window size. + void RequestResizeHostDisplay(s32 width, s32 height); + + /// Safely executes a function on the VM thread. + void RunOnCPUThread(std::function function, bool block = false); + + /// Asynchronously starts refreshing the game list. + void RefreshGameListAsync(bool invalidate_cache); + + /// Cancels game list refresh, if there is one in progress. + void CancelGameListRefresh(); + + /// Requests shut down and exit of the hosting application. This may not actually exit, + /// if the user cancels the shutdown confirmation. + void RequestExit(bool save_state_if_running); + + /// Requests shut down of the current virtual machine. + void RequestVMShutdown(bool allow_confirm, bool allow_save_state, bool default_save_state); + + /// Returns true if the hosting application is currently fullscreen. + bool IsFullscreen(); + + /// Alters fullscreen state of hosting application. + void SetFullscreen(bool enabled); } // namespace Host diff --git a/pcsx2/HostDisplay.cpp b/pcsx2/HostDisplay.cpp index 10dcf21e52..cdcb38e817 100644 --- a/pcsx2/HostDisplay.cpp +++ b/pcsx2/HostDisplay.cpp @@ -26,6 +26,8 @@ #include #include +std::unique_ptr g_host_display; + HostDisplayTexture::~HostDisplayTexture() = default; HostDisplay::~HostDisplay() = default; @@ -140,7 +142,7 @@ std::string HostDisplay::GetFullscreenModeString(u32 width, u32 height, float re #endif #include "GS/Renderers/Metal/GSMetalCPPAccessible.h" -std::unique_ptr HostDisplay::CreateDisplayForAPI(RenderAPI api) +std::unique_ptr HostDisplay::CreateForAPI(RenderAPI api) { switch (api) { @@ -151,7 +153,7 @@ std::unique_ptr HostDisplay::CreateDisplayForAPI(RenderAPI api) return std::make_unique(); #endif #ifdef __APPLE__ - case HostDisplay::RenderAPI::Metal: + case RenderAPI::Metal: return std::unique_ptr(MakeMetalHostDisplay()); #endif diff --git a/pcsx2/HostDisplay.h b/pcsx2/HostDisplay.h index b79ec42bd4..eb10a24cd4 100644 --- a/pcsx2/HostDisplay.h +++ b/pcsx2/HostDisplay.h @@ -27,6 +27,17 @@ #include "Host.h" #include "Config.h" +enum class RenderAPI +{ + None, + D3D11, + Metal, + D3D12, + Vulkan, + OpenGL, + OpenGLES +}; + /// An abstracted RGBA8 texture. class HostDisplayTexture { @@ -42,17 +53,6 @@ public: class HostDisplay { public: - enum class RenderAPI - { - None, - D3D11, - Metal, - D3D12, - Vulkan, - OpenGL, - OpenGLES - }; - enum class Alignment { LeftOrTop, @@ -72,7 +72,7 @@ public: static const char* RenderAPIToString(RenderAPI api); /// Creates a display for the specified API. - static std::unique_ptr CreateDisplayForAPI(RenderAPI api); + static std::unique_ptr CreateForAPI(RenderAPI api); /// Parses a fullscreen mode into its components (width * height @ refresh hz) static bool ParseFullscreenMode(const std::string_view& mode, u32* width, u32* height, float* refresh_rate); @@ -90,27 +90,45 @@ public: __fi void SetDisplayAlignment(Alignment alignment) { m_display_alignment = alignment; } virtual RenderAPI GetRenderAPI() const = 0; - virtual void* GetRenderDevice() const = 0; - virtual void* GetRenderContext() const = 0; - virtual void* GetRenderSurface() const = 0; + virtual void* GetDevice() const = 0; + virtual void* GetContext() const = 0; + virtual void* GetSurface() const = 0; - virtual bool HasRenderDevice() const = 0; - virtual bool HasRenderSurface() const = 0; + virtual bool HasDevice() const = 0; + virtual bool HasSurface() const = 0; - virtual bool CreateRenderDevice(const WindowInfo& wi, std::string_view adapter_name, VsyncMode vsync, bool threaded_presentation, bool debug_device) = 0; - virtual bool InitializeRenderDevice(std::string_view shader_cache_directory, bool debug_device) = 0; - virtual bool MakeRenderContextCurrent() = 0; - virtual bool DoneRenderContextCurrent() = 0; - virtual void DestroyRenderSurface() = 0; - virtual bool ChangeRenderWindow(const WindowInfo& wi) = 0; - virtual bool SupportsFullscreen() const = 0; - virtual bool IsFullscreen() = 0; - virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) = 0; - virtual AdapterAndModeList GetAdapterAndModeList() = 0; - virtual std::string GetDriverInfo() const = 0; + /// Creates the rendering/GPU device. This should be called on the thread which owns the window. + virtual bool CreateDevice(const WindowInfo& wi) = 0; + + /// Fully initializes the rendering device. This should be called on the GS thread. + virtual bool SetupDevice() = 0; + + /// Sets the device for the current thread. Only needed for OpenGL. + virtual bool MakeCurrent() = 0; + + /// Clears the device for the current thread. Only needed for OpenGL. + virtual bool DoneCurrent() = 0; + + /// Destroys the surface we're currently drawing to. + virtual void DestroySurface() = 0; + + /// Switches to a new window/surface. + virtual bool ChangeWindow(const WindowInfo& wi) = 0; /// Call when the window size changes externally to recreate any resources. - virtual void ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) = 0; + virtual void ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) = 0; + + /// Returns true if exclusive fullscreen is supported. + virtual bool SupportsFullscreen() const = 0; + + /// Returns true if exclusive fullscreen is active. + virtual bool IsFullscreen() = 0; + + /// Attempts to switch to the specified mode in exclusive fullscreen. + virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) = 0; + + virtual AdapterAndModeList GetAdapterAndModeList() = 0; + virtual std::string GetDriverInfo() const = 0; /// Creates an abstracted RGBA8 texture. If dynamic, the texture can be updated with UpdateTexture() below. virtual std::unique_ptr CreateTexture(u32 width, u32 height, const void* data, u32 data_stride, bool dynamic = false) = 0; @@ -149,16 +167,19 @@ protected: VsyncMode m_vsync_mode = VsyncMode::Off; }; +/// Returns a pointer to the current host display abstraction. Assumes AcquireHostDisplay() has been caled. +extern std::unique_ptr g_host_display; + namespace Host { /// Creates the host display. This may create a new window. The API used depends on the current configuration. - HostDisplay* AcquireHostDisplay(HostDisplay::RenderAPI api); + bool AcquireHostDisplay(RenderAPI api, bool clear_state_on_fail); /// Destroys the host display. This may close the display window. - void ReleaseHostDisplay(); + void ReleaseHostDisplay(bool clear_state); - /// Returns a pointer to the current host display abstraction. Assumes AcquireHostDisplay() has been caled. - HostDisplay* GetHostDisplay(); + /// Returns the desired vsync mode, depending on the runtime environment. + VsyncMode GetEffectiveVSyncMode(); /// Returns false if the window was completely occluded. If frame_skip is set, the frame won't be /// displayed, but the GPU command queue will still be flushed. diff --git a/pcsx2/HostSettings.h b/pcsx2/HostSettings.h index e23f6b938f..d8d57813db 100644 --- a/pcsx2/HostSettings.h +++ b/pcsx2/HostSettings.h @@ -40,7 +40,9 @@ namespace Host void SetBaseFloatSettingValue(const char* section, const char* key, float value); void SetBaseStringSettingValue(const char* section, const char* key, const char* value); void SetBaseStringListSettingValue(const char* section, const char* key, const std::vector& values); - void DeleteBaseSettingValue(const char* section, const char* key); + bool AddBaseValueToStringList(const char* section, const char* key, const char* value); + bool RemoveBaseValueFromStringList(const char* section, const char* key, const char* value); + void RemoveBaseSettingValue(const char* section, const char* key); void CommitBaseSettingChanges(); // Settings access, thread-safe. diff --git a/pcsx2/Hw.cpp b/pcsx2/Hw.cpp index 614aa9843d..783ed00220 100644 --- a/pcsx2/Hw.cpp +++ b/pcsx2/Hw.cpp @@ -87,7 +87,7 @@ __fi uint intcInterrupt() //DevCon.Warning("*PCSX2*: intcInterrupt already cleared"); return 0; } - if ((psHu32(INTC_STAT) & psHu32(INTC_MASK)) == 0) + if ((psHu32(INTC_STAT) & psHu32(INTC_MASK)) == 0) { //DevCon.Warning("*PCSX2*: No valid interrupt INTC_MASK: %x INTC_STAT: %x", psHu32(INTC_MASK), psHu32(INTC_STAT)); return 0; @@ -106,13 +106,13 @@ __fi uint intcInterrupt() __fi uint dmacInterrupt() { if( ((psHu16(DMAC_STAT + 2) & psHu16(DMAC_STAT)) == 0 ) && - ( psHu16(DMAC_STAT) & 0x8000) == 0 ) + ( psHu16(DMAC_STAT) & 0x8000) == 0 ) { //DevCon.Warning("No valid DMAC interrupt MASK %x STAT %x", psHu16(DMAC_STAT+2), psHu16(DMAC_STAT)); return 0; } - if (!dmacRegs.ctrl.DMAE || psHu8(DMAC_ENABLER+2) == 1) + if (!dmacRegs.ctrl.DMAE || psHu8(DMAC_ENABLER+2) == 1) { //DevCon.Warning("DMAC Suspended or Disabled on interrupt"); return 0; @@ -174,12 +174,12 @@ __ri bool hwMFIFOWrite(u32 addr, const u128* data, uint qwc) pxFailDev( fmt::format( "Scratchpad/MFIFO: Invalid base physical address: 0x{:08x}", u32(dmacRegs.rbor.ADDR)).c_str() ); return false; } - + return true; } __ri void hwMFIFOResume(u32 transferred) { - + if (transferred == 0) { return; //Nothing got put in the MFIFO, we don't care @@ -203,7 +203,7 @@ __ri void hwMFIFOResume(u32 transferred) { //Apparently this is bad, i guess so, the data is going to memory rather than the FIFO //vif1Regs.stat.FQC = 0x10; // FQC=16 - } + } break; } case MFD_GIF: @@ -332,11 +332,11 @@ liked this. From what i've deduced, REFE does in fact increment, but END doesn't, after much testing, i've concluded this is how we can standardize DMA chains, so i've modified the code to work like this. The below function controls the increment -of the TADR along with the MADR on VIF, GIF and SPR1 when using the CNT tag, the others don't use it yet, but they +of the TADR along with the MADR on VIF, GIF and SPR1 when using the CNT tag, the others don't use it yet, but they can probably be modified to do so now. -Reason for this:- Many games (such as clock tower 3 and FFX Videos) watched the TADR to see when a transfer has finished, -so we need to simulate this wherever we can! Even the FFX video gets corruption and tries to fire multiple DMA Kicks +Reason for this:- Many games (such as clock tower 3 and FFX Videos) watched the TADR to see when a transfer has finished, +so we need to simulate this wherever we can! Even the FFX video gets corruption and tries to fire multiple DMA Kicks if this doesnt happen, which was the reasoning for the hacked up SPR timing we had, that is no longer required. -Refraction @@ -347,7 +347,7 @@ void hwDmacSrcTadrInc(DMACh& dma) //Don't touch it if in normal/interleave mode. if (dma.chcr.STR == 0) return; if (dma.chcr.MOD != 1) return; - + u16 tagid = (dma.chcr.TAG >> 12) & 0x7; if (tagid == TAG_CNT) diff --git a/pcsx2/HwRead.cpp b/pcsx2/HwRead.cpp index 461ee4421e..9c33e6a452 100644 --- a/pcsx2/HwRead.cpp +++ b/pcsx2/HwRead.cpp @@ -29,8 +29,8 @@ static __fi void IntCHackCheck() { // Sanity check: To protect from accidentally "rewinding" the cyclecount // on the few times nextBranchCycle can be behind our current cycle. - s32 diff = g_nextEventCycle - cpuRegs.cycle; - if (diff > 0 && (cpuRegs.cycle - g_lastEventCycle) > 8) cpuRegs.cycle = g_nextEventCycle; + s32 diff = cpuRegs.nextEventCycle - cpuRegs.cycle; + if (diff > 0 && (cpuRegs.cycle - cpuRegs.lastEventCycle) > 8) cpuRegs.cycle = cpuRegs.nextEventCycle; } template< uint page > RETURNS_R128 _hwRead128(u32 mem); @@ -44,7 +44,7 @@ mem32_t _hwRead32(u32 mem) { case 0x00: return rcntRead32<0x00>( mem ); case 0x01: return rcntRead32<0x01>( mem ); - + case 0x02: return ipuRead32( mem ); case 0x03: @@ -56,7 +56,7 @@ mem32_t _hwRead32(u32 mem) return vifRead32<0>(mem); } return dmacRead32<0x03>( mem ); - + case 0x04: case 0x05: case 0x06: @@ -104,7 +104,7 @@ mem32_t _hwRead32(u32 mem) case 0x00: ret = psxHu32(0x1f801814); break; - case 0x80: + case 0x80: #if PSX_EXTRALOGS DevCon.Warning("FIFO Size %x", sif2fifosize); #endif @@ -130,7 +130,7 @@ mem32_t _hwRead32(u32 mem) #endif return ret; - + } /*if ((mem & 0x1000ff00) == 0x1000f200) { @@ -189,7 +189,7 @@ mem32_t _hwRead32(u32 mem) //Hack for Transformers and Test Drive Unlimited to simulate filling the VIF FIFO //It actually stalls VIF a few QW before the end of the transfer, so we need to pretend its all gone //else itll take aaaaaaaaages to boot. - if(mem == (D1_CHCR + 0x10) && CHECK_VIFFIFOHACK) + if(mem == (D1_CHCR + 0x10) && CHECK_VIFFIFOHACK) return psHu32(mem) + (vif1ch.qwc * 16); /*if((mem == GIF_CHCR) && !vif1ch.chcr.STR && gifRegs.stat.M3P && gifRegs.stat.APATH != 3) @@ -266,7 +266,7 @@ mem16_t hwRead16_page_0F_INTC_HACK(u32 mem) } template< uint page > -static RETURNS_R64 _hwRead64(u32 mem) +static u64 _hwRead64(u32 mem) { pxAssume( (mem & 0x07) == 0 ); @@ -284,12 +284,12 @@ static RETURNS_R64 _hwRead64(u32 mem) // No game is known to attempt such a thing (yay!), so probably nothing for us to // worry about. Chances are, though, doing so is "legal" and yields some sort // of reproducible behavior. Candidate for real hardware testing. - + // Current assumption: Reads 128 bits and discards the unused portion. uint wordpart = (mem >> 3) & 0x1; r128 full = _hwRead128(mem & ~0x0f); - return r64_load(reinterpret_cast(&full) + wordpart); + return *(reinterpret_cast(&full) + wordpart); } case 0x0F: if ((mem & 0xffffff00) == 0x1000f300) @@ -302,20 +302,20 @@ static RETURNS_R64 _hwRead64(u32 mem) u32 lo = psHu32(0x1000f3E0); ReadFifoSingleWord(); u32 hi = psHu32(0x1000f3E0); - return r64_from_u32x2(lo, hi); + return static_cast(lo) | (static_cast(hi) << 32); } } default: break; } - return r64_from_u32(_hwRead32(mem)); + return static_cast(_hwRead32(mem)); } template< uint page > -RETURNS_R64 hwRead64(u32 mem) +mem64_t hwRead64(u32 mem) { - r64 res = _hwRead64(mem); - eeHwTraceLog(mem, *(u64*)&res, true); + u64 res = _hwRead64(mem); + eeHwTraceLog(mem, res, true); return res; } @@ -364,7 +364,7 @@ RETURNS_R128 _hwRead128(u32 mem) DevCon.Warning("128bit read from %x wibble", mem); if (mem == 0x1000f3E0) { - + ReadFifoSingleWord(); u32 part0 = psHu32(0x1000f3E0); ReadFifoSingleWord(); @@ -379,7 +379,7 @@ RETURNS_R128 _hwRead128(u32 mem) break; default: - return r128_from_r64_clean(_hwRead64(mem)); + return r128_from_u64_dup(_hwRead64(mem)); } return r128_load(&result); } @@ -388,7 +388,7 @@ template< uint page > RETURNS_R128 hwRead128(u32 mem) { r128 res = _hwRead128(mem); - eeHwTraceLog(mem, *(mem128_t*)&res, true); + eeHwTraceLog(mem, res, true); return res; } @@ -396,7 +396,7 @@ RETURNS_R128 hwRead128(u32 mem) template mem8_t hwRead8(u32 mem); \ template mem16_t hwRead16(u32 mem); \ template mem32_t hwRead32(u32 mem); \ - template RETURNS_R64 hwRead64(u32 mem); \ + template mem64_t hwRead64(u32 mem); \ template RETURNS_R128 hwRead128(u32 mem); \ template mem32_t _hwRead32(u32 mem); diff --git a/pcsx2/HwWrite.cpp b/pcsx2/HwWrite.cpp index 71ab9f7589..761370c7e7 100644 --- a/pcsx2/HwWrite.cpp +++ b/pcsx2/HwWrite.cpp @@ -40,7 +40,7 @@ using namespace R5900; template< uint page > void _hwWrite8(u32 mem, u8 value); template< uint page > void _hwWrite16(u32 mem, u8 value); -template< uint page > void _hwWrite128(u32 mem, u8 value); +template< uint page > void TAKES_R128 _hwWrite128(u32 mem, r128 value); template @@ -80,7 +80,7 @@ void _hwWrite32( u32 mem, u32 value ) u128 zerofill = u128::From32(0); zerofill._u32[(mem >> 2) & 0x03] = value; - _hwWrite128(mem & ~0x0f, &zerofill); + _hwWrite128(mem & ~0x0f, r128_from_u128(zerofill)); } return; @@ -120,7 +120,7 @@ void _hwWrite32( u32 mem, u32 value ) DevCon.Warning("GIF Mode cancelling P3 Disable"); CPU_INT(DMAC_GIF, 8); } - + gifRegs.stat.M3R = gifRegs.mode.M3R; gifRegs.stat.IMT = gifRegs.mode.IMT; @@ -373,7 +373,7 @@ void hwWrite16(u32 mem, u16 value) } template -void _hwWrite64( u32 mem, const mem64_t* srcval ) +void _hwWrite64( u32 mem, u64 value ) { pxAssume( (mem & 0x07) == 0 ); @@ -387,7 +387,7 @@ void _hwWrite64( u32 mem, const mem64_t* srcval ) switch (page) { case 0x02: - if (!ipuWrite64(mem, *srcval)) return; + if (!ipuWrite64(mem, value)) return; break; case 0x04: @@ -396,30 +396,30 @@ void _hwWrite64( u32 mem, const mem64_t* srcval ) case 0x07: { u128 zerofill = u128::From32(0); - zerofill._u64[(mem >> 3) & 0x01] = *srcval; - hwWrite128(mem & ~0x0f, &zerofill); + zerofill._u64[(mem >> 3) & 0x01] = value; + hwWrite128(mem & ~0x0f, r128_from_u128(zerofill)); } return; - + default: // disregard everything except the lower 32 bits. // ... and skip the 64 bit writeback since the 32-bit one will suffice. - hwWrite32( mem, ((u32*)srcval)[0] ); + hwWrite32( mem, value ); return; } - psHu64(mem) = *srcval; + std::memcpy(&eeHw[(mem) & 0xffff], &value, sizeof(value)); } template -void hwWrite64( u32 mem, const mem64_t* srcval ) +void hwWrite64( u32 mem, mem64_t value ) { - eeHwTraceLog( mem, *srcval, false ); - _hwWrite64(mem, srcval); + eeHwTraceLog( mem, value, false ); + _hwWrite64(mem, value); } template< uint page > -void _hwWrite128(u32 mem, const mem128_t* srcval) +void TAKES_R128 _hwWrite128(u32 mem, r128 srcval) { pxAssume( (mem & 0x0f) == 0 ); @@ -429,24 +429,35 @@ void _hwWrite128(u32 mem, const mem128_t* srcval) #if PSX_EXTRALOGS if ((mem & 0x1000ff00) == 0x1000f300) DevCon.Warning("128bit Write to SIF Register %x wibble", mem); #endif + switch (page) { case 0x04: - WriteFIFO_VIF0(srcval); + { + alignas(16) const u128 usrcval = r128_to_u128(srcval); + WriteFIFO_VIF0(&usrcval); + } return; case 0x05: - WriteFIFO_VIF1(srcval); + { + alignas(16) const u128 usrcval = r128_to_u128(srcval); + WriteFIFO_VIF1(&usrcval); + } return; case 0x06: - WriteFIFO_GIF(srcval); + { + alignas(16) const u128 usrcval = r128_to_u128(srcval); + WriteFIFO_GIF(&usrcval); + } return; case 0x07: if (mem & 0x10) { - WriteFIFO_IPUin(srcval); + alignas(16) const u128 usrcval = r128_to_u128(srcval); + WriteFIFO_IPUin(&usrcval); } else { @@ -462,7 +473,8 @@ void _hwWrite128(u32 mem, const mem128_t* srcval) case 0x0F: // todo: psx mode: this is new if (((mem & 0x1FFFFFFF) >= EEMemoryMap::SBUS_PS1_Start) && ((mem & 0x1FFFFFFF) < EEMemoryMap::SBUS_PS1_End)) { - PGIFwQword((mem & 0x1FFFFFFF), (void*)srcval); + alignas(16) const u128 usrcval = r128_to_u128(srcval); + PGIFwQword((mem & 0x1FFFFFFF), (void*)&usrcval); return; } @@ -470,15 +482,15 @@ void _hwWrite128(u32 mem, const mem128_t* srcval) } // All upper bits of all non-FIFO 128-bit HW writes are almost certainly disregarded. --air - hwWrite64(mem, (mem64_t*)srcval); + hwWrite64(mem, r128_to_u64(srcval)); //CopyQWC(&psHu128(mem), srcval); } template< uint page > -void hwWrite128(u32 mem, const mem128_t* srcval) +void TAKES_R128 hwWrite128(u32 mem, r128 srcval) { - eeHwTraceLog( mem, *srcval, false ); + eeHwTraceLog( mem, srcval, false ); _hwWrite128(mem, srcval); } @@ -486,8 +498,8 @@ void hwWrite128(u32 mem, const mem128_t* srcval) template void hwWrite8(u32 mem, mem8_t value); \ template void hwWrite16(u32 mem, mem16_t value); \ template void hwWrite32(u32 mem, mem32_t value); \ - template void hwWrite64(u32 mem, const mem64_t* srcval); \ - template void hwWrite128(u32 mem, const mem128_t* srcval); + template void hwWrite64(u32 mem, mem64_t value); \ + template void TAKES_R128 hwWrite128(u32 mem, r128 srcval); InstantizeHwWrite(0x00); InstantizeHwWrite(0x08); InstantizeHwWrite(0x01); InstantizeHwWrite(0x09); diff --git a/pcsx2/Frontend/INISettingsInterface.cpp b/pcsx2/INISettingsInterface.cpp similarity index 76% rename from pcsx2/Frontend/INISettingsInterface.cpp rename to pcsx2/INISettingsInterface.cpp index 36b9cc5da7..95ca741638 100644 --- a/pcsx2/Frontend/INISettingsInterface.cpp +++ b/pcsx2/INISettingsInterface.cpp @@ -21,6 +21,38 @@ #include "common/StringUtil.h" #include #include +#include + +#ifdef _WIN32 +#include // _mktemp_s +#else +#include // mktemp +#endif + +// To prevent races between saving and loading settings, particularly with game settings, +// we only allow one ini to be parsed at any point in time. +static std::mutex s_ini_load_save_mutex; + +static std::string GetTemporaryFileName(const std::string& original_filename) +{ + std::string temporary_filename; + temporary_filename.reserve(original_filename.length() + 8); + temporary_filename.append(original_filename); + +#ifdef _WIN32 + temporary_filename.append(".XXXXXXX"); + _mktemp_s(temporary_filename.data(), temporary_filename.length() + 1); +#else + temporary_filename.append(".XXXXXX"); +#if defined(__linux__) || defined(__ANDROID__) || defined(__APPLE__) + mkstemp(temporary_filename.data()); +#else + mktemp(temporary_filename.data()); +#endif +#endif + + return temporary_filename; +} INISettingsInterface::INISettingsInterface(std::string filename) : m_filename(std::move(filename)) @@ -36,6 +68,10 @@ INISettingsInterface::~INISettingsInterface() bool INISettingsInterface::Load() { + if (m_filename.empty()) + return false; + + std::unique_lock lock(s_ini_load_save_mutex); SI_Error err = SI_FAIL; auto fp = FileSystem::OpenManagedCFile(m_filename.c_str(), "rb"); if (fp) @@ -46,12 +82,29 @@ bool INISettingsInterface::Load() bool INISettingsInterface::Save() { + if (m_filename.empty()) + return false; + + std::unique_lock lock(s_ini_load_save_mutex); + std::string temp_filename(GetTemporaryFileName(m_filename)); SI_Error err = SI_FAIL; - std::FILE* fp = FileSystem::OpenCFile(m_filename.c_str(), "wb"); + std::FILE* fp = FileSystem::OpenCFile(temp_filename.c_str(), "wb"); if (fp) { err = m_ini.SaveFile(fp, false); std::fclose(fp); + + if (err != SI_OK) + { + // remove temporary file + FileSystem::DeleteFilePath(temp_filename.c_str()); + } + else if (!FileSystem::RenamePath(temp_filename.c_str(), m_filename.c_str())) + { + Console.Error("Failed to rename '%s' to '%s'", temp_filename.c_str(), m_filename.c_str()); + FileSystem::DeleteFilePath(temp_filename.c_str()); + return false; + } } if (err != SI_OK) @@ -152,25 +205,25 @@ bool INISettingsInterface::GetStringValue(const char* section, const char* key, void INISettingsInterface::SetIntValue(const char* section, const char* key, int value) { m_dirty = true; - m_ini.SetLongValue(section, key, static_cast(value), nullptr, false, true); + m_ini.SetValue(section, key, StringUtil::ToChars(value).c_str(), nullptr, true); } void INISettingsInterface::SetUIntValue(const char* section, const char* key, uint value) { m_dirty = true; - m_ini.SetLongValue(section, key, static_cast(value), nullptr, false, true); + m_ini.SetValue(section, key, StringUtil::ToChars(value).c_str(), nullptr, true); } void INISettingsInterface::SetFloatValue(const char* section, const char* key, float value) { m_dirty = true; - m_ini.SetDoubleValue(section, key, static_cast(value), nullptr, true); + m_ini.SetValue(section, key, StringUtil::ToChars(value).c_str(), nullptr, true); } void INISettingsInterface::SetDoubleValue(const char* section, const char* key, double value) { m_dirty = true; - m_ini.SetDoubleValue(section, key, value, nullptr, true); + m_ini.SetValue(section, key, StringUtil::ToChars(value).c_str(), nullptr, true); } void INISettingsInterface::SetBoolValue(const char* section, const char* key, bool value) diff --git a/pcsx2/Frontend/INISettingsInterface.h b/pcsx2/INISettingsInterface.h similarity index 98% rename from pcsx2/Frontend/INISettingsInterface.h rename to pcsx2/INISettingsInterface.h index 76d0a81788..2a3c0ca33c 100644 --- a/pcsx2/Frontend/INISettingsInterface.h +++ b/pcsx2/INISettingsInterface.h @@ -29,6 +29,7 @@ public: ~INISettingsInterface() override; const std::string& GetFileName() const { return m_filename; } + bool IsDirty() const { return m_dirty; } bool Load(); bool Save() override; diff --git a/pcsx2/IPU/IPU.cpp b/pcsx2/IPU/IPU.cpp index 7781edbbee..3aa070fcd7 100644 --- a/pcsx2/IPU/IPU.cpp +++ b/pcsx2/IPU/IPU.cpp @@ -17,8 +17,8 @@ #include "Common.h" #include "IPU.h" +#include "IPU_MultiISA.h" #include "IPUdma.h" -#include "yuv2rgb.h" #include "mpeg2lib/Mpeg.h" #include @@ -31,7 +31,7 @@ alignas(16) tIPU_cmd ipu_cmd; alignas(16) tIPU_BP g_BP; alignas(16) decoder_t decoder; -void IPUWorker(); +static void (*IPUWorker)(); // Color conversion stuff, the memory layout is a total hack // convert_data_buffer is a pointer to the internal rgb struct (the first param in convert_init_t) @@ -40,11 +40,11 @@ void IPUWorker(); //u8 PCT[] = {'r', 'I', 'P', 'B', 'D', '-', '-', '-'}; // unused? // Quantization matrix -static rgb16_t vqclut[16]; //clut conversion table -static u16 s_thresh[2]; //thresholds for color conversions +rgb16_t g_ipu_vqclut[16]; //clut conversion table +u16 g_ipu_thresh[2]; //thresholds for color conversions int coded_block_pattern = 0; -alignas(16) static u8 indx4[16*16/2]; +alignas(16) u8 g_ipu_indx4[16*16/2]; uint eecount_on_last_vdec = 0; bool FMVstarted = false; @@ -67,6 +67,7 @@ __fi void IPUProcessInterrupt() void ipuReset() { + IPUWorker = MULTI_ISA_SELECT(IPUWorker); memzero(ipuRegs); memzero(g_BP); memzero(decoder); @@ -84,8 +85,8 @@ void ReportIPU() Console.WriteLn(ipu_fifo.in.desc()); Console.WriteLn(ipu_fifo.out.desc()); Console.WriteLn(g_BP.desc()); - Console.WriteLn("vqclut = 0x%x.", vqclut); - Console.WriteLn("s_thresh = 0x%x.", s_thresh); + Console.WriteLn("vqclut = 0x%x.", g_ipu_vqclut); + Console.WriteLn("thresh = 0x%x.", g_ipu_thresh); Console.WriteLn("coded_block_pattern = 0x%x.", coded_block_pattern); Console.WriteLn("g_decoder = 0x%x.", &decoder); Console.WriteLn("mpeg2_scan = 0x%x.", &mpeg2_scan); @@ -101,8 +102,8 @@ void SaveStateBase::ipuFreeze() Freeze(ipu_fifo); Freeze(g_BP); - Freeze(vqclut); - Freeze(s_thresh); + Freeze(g_ipu_vqclut); + Freeze(g_ipu_thresh); Freeze(coded_block_pattern); Freeze(decoder); Freeze(ipu_cmd); @@ -217,7 +218,7 @@ __fi u32 ipuRead32(u32 mem) ipucase(IPU_BP): // IPU_BP { pxAssume(g_BP.FP <= 2); - + ipuRegs.ipubp = g_BP.BP & 0x7f; ipuRegs.ipubp |= g_BP.IFC << 8; ipuRegs.ipubp |= g_BP.FP << 16; @@ -233,7 +234,7 @@ __fi u32 ipuRead32(u32 mem) return psHu32(IPU_CMD + mem); } -__fi RETURNS_R64 ipuRead64(u32 mem) +__fi u64 ipuRead64(u32 mem) { // Note: It's assumed that mem's input value is always in the 0x10002000 page // of memory (if not, it's probably bad code). @@ -250,18 +251,18 @@ __fi RETURNS_R64 ipuRead64(u32 mem) if (getBits32((u8*)&ipuRegs.cmd.DATA, 0)) ipuRegs.cmd.DATA = BigEndian(ipuRegs.cmd.DATA); } - + if (ipuRegs.cmd.DATA & 0xffffff) IPU_LOG("read64: IPU_CMD=BUSY=%x, DATA=%08X", ipuRegs.cmd.BUSY ? 1 : 0, ipuRegs.cmd.DATA); - return r64_load(&ipuRegs.cmd._u64); + return ipuRegs.cmd._u64; } ipucase(IPU_CTRL): - DevCon.Warning("reading 64bit IPU ctrl"); + IPU_LOG("reading 64bit IPU ctrl"); break; ipucase(IPU_BP): - DevCon.Warning("reading 64bit IPU top"); + IPU_LOG("reading 64bit IPU top"); break; ipucase(IPU_TOP): // IPU_TOP @@ -272,7 +273,7 @@ __fi RETURNS_R64 ipuRead64(u32 mem) IPU_LOG("read64: Unknown=%x", mem); break; } - return r64_load(&psHu64(IPU_CMD + mem)); + return psHu64(IPU_CMD + mem); } void ipuSoftReset() @@ -287,7 +288,7 @@ void ipuSoftReset() ipu_cmd.clear(); ipuRegs.cmd.BUSY = 0; ipuRegs.cmd.DATA = 0; // required for Enthusia - Professional Racing after fix, or will freeze at start of next video. - + hwIntcIrq(INTC_IPU); // required for FightBox } @@ -408,305 +409,13 @@ static __ri void ipuBDEC(tIPU_CMD_BDEC bdec) memzero_sse_a(decoder.mb16); } -static __fi bool ipuVDEC(u32 val) -{ - static int count = 0; - if (count++ > 5) { - if (!FMVstarted) { - EnableFMV = true; - FMVstarted = true; - } - count = 0; - } - eecount_on_last_vdec = cpuRegs.cycle; - - switch (ipu_cmd.pos[0]) - { - case 0: - if (!bitstream_init()) return false; - - switch ((val >> 26) & 3) - { - case 0://Macroblock Address Increment - decoder.mpeg1 = ipuRegs.ctrl.MP1; - ipuRegs.cmd.DATA = get_macroblock_address_increment(); - break; - - case 1://Macroblock Type - decoder.frame_pred_frame_dct = 1; - decoder.coding_type = ipuRegs.ctrl.PCT > 0 ? ipuRegs.ctrl.PCT : 1; // Kaiketsu Zorro Mezase doesn't set a Picture type, seems happy with I - ipuRegs.cmd.DATA = get_macroblock_modes(); - break; - - case 2://Motion Code - ipuRegs.cmd.DATA = get_motion_delta(0); - break; - - case 3://DMVector - ipuRegs.cmd.DATA = get_dmv(); - break; - - jNO_DEFAULT - } - - // HACK ATTACK! This code OR's the MPEG decoder's bitstream position into the upper - // 16 bits of DATA; which really doesn't make sense since (a) we already rewound the bits - // back into the IPU internal buffer above, and (b) the IPU doesn't have an MPEG internal - // 32-bit decoder buffer of its own anyway. Furthermore, setting the upper 16 bits to - // any value other than zero appears to work fine. When set to zero, however, FMVs run - // very choppy (basically only decoding/updating every 30th frame or so). So yeah, - // someone with knowledge on the subject please feel free to explain this one. :) --air - - // The upper bits are the "length" of the decoded command, where the lower is the address. - // This is due to differences with IPU and the MPEG standard. See get_macroblock_address_increment(). - - ipuRegs.ctrl.ECD = (ipuRegs.cmd.DATA == 0); - [[fallthrough]]; - - case 1: - if (!getBits32((u8*)&ipuRegs.top, 0)) - { - ipu_cmd.pos[0] = 1; - return false; - } - - ipuRegs.top = BigEndian(ipuRegs.top); - - IPU_LOG("VDEC command data 0x%x(0x%x). Skip 0x%X bits/Table=%d (%s), pct %d", - ipuRegs.cmd.DATA, ipuRegs.cmd.DATA >> 16, val & 0x3f, (val >> 26) & 3, (val >> 26) & 1 ? - ((val >> 26) & 2 ? "DMV" : "MBT") : (((val >> 26) & 2 ? "MC" : "MBAI")), ipuRegs.ctrl.PCT); - - return true; - - jNO_DEFAULT - } - - return false; -} - -static __ri bool ipuFDEC(u32 val) -{ - if (!getBits32((u8*)&ipuRegs.cmd.DATA, 0)) return false; - - ipuRegs.cmd.DATA = BigEndian(ipuRegs.cmd.DATA); - ipuRegs.top = ipuRegs.cmd.DATA; - - IPU_LOG("FDEC read: 0x%08x", ipuRegs.top); - - return true; -} - -static bool ipuSETIQ(u32 val) -{ - if ((val >> 27) & 1) - { - u8 (&niq)[64] = decoder.niq; - - for(;ipu_cmd.pos[0] < 8; ipu_cmd.pos[0]++) - { - if (!getBits64((u8*)niq + 8 * ipu_cmd.pos[0], 1)) return false; - } - - IPU_LOG("Read non-intra quantization matrix from FIFO."); - for (uint i = 0; i < 8; i++) - { - IPU_LOG("%02X %02X %02X %02X %02X %02X %02X %02X", - niq[i * 8 + 0], niq[i * 8 + 1], niq[i * 8 + 2], niq[i * 8 + 3], - niq[i * 8 + 4], niq[i * 8 + 5], niq[i * 8 + 6], niq[i * 8 + 7]); - } - } - else - { - u8 (&iq)[64] = decoder.iq; - - for(;ipu_cmd.pos[0] < 8; ipu_cmd.pos[0]++) - { - if (!getBits64((u8*)iq + 8 * ipu_cmd.pos[0], 1)) return false; - } - - IPU_LOG("Read intra quantization matrix from FIFO."); - for (uint i = 0; i < 8; i++) - { - IPU_LOG("%02X %02X %02X %02X %02X %02X %02X %02X", - iq[i * 8 + 0], iq[i * 8 + 1], iq[i * 8 + 2], iq[i *8 + 3], - iq[i * 8 + 4], iq[i * 8 + 5], iq[i * 8 + 6], iq[i *8 + 7]); - } - } - - return true; -} - -static bool ipuSETVQ(u32 val) -{ - for(;ipu_cmd.pos[0] < 4; ipu_cmd.pos[0]++) - { - if (!getBits64(((u8*)vqclut) + 8 * ipu_cmd.pos[0], 1)) return false; - } - - IPU_LOG("SETVQ command. Read VQCLUT table from FIFO.\n" - "%02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d\n" - "%02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d\n" - "%02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d\n" - "%02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d", - vqclut[0].r, vqclut[0].g, vqclut[0].b, - vqclut[1].r, vqclut[1].g, vqclut[1].b, - vqclut[2].r, vqclut[2].g, vqclut[2].b, - vqclut[3].r, vqclut[3].g, vqclut[3].b, - vqclut[4].r, vqclut[4].g, vqclut[4].b, - vqclut[5].r, vqclut[5].g, vqclut[5].b, - vqclut[6].r, vqclut[6].g, vqclut[6].b, - vqclut[7].r, vqclut[7].g, vqclut[7].b, - vqclut[8].r, vqclut[8].g, vqclut[8].b, - vqclut[9].r, vqclut[9].g, vqclut[9].b, - vqclut[10].r, vqclut[10].g, vqclut[10].b, - vqclut[11].r, vqclut[11].g, vqclut[11].b, - vqclut[12].r, vqclut[12].g, vqclut[12].b, - vqclut[13].r, vqclut[13].g, vqclut[13].b, - vqclut[14].r, vqclut[14].g, vqclut[14].b, - vqclut[15].r, vqclut[15].g, vqclut[15].b); - - return true; -} - -// IPU Transfers are split into 8Qwords so we need to send ALL the data -static __ri bool ipuCSC(tIPU_CMD_CSC csc) -{ - csc.log_from_YCbCr(); - - for (;ipu_cmd.index < (int)csc.MBC; ipu_cmd.index++) - { - for(;ipu_cmd.pos[0] < 48; ipu_cmd.pos[0]++) - { - if (!getBits64((u8*)&decoder.mb8 + 8 * ipu_cmd.pos[0], 1)) return false; - } - - ipu_csc(decoder.mb8, decoder.rgb32, 0); - if (csc.OFM) ipu_dither(decoder.rgb32, decoder.rgb16, csc.DTE); - - if (csc.OFM) - { - ipu_cmd.pos[1] += ipu_fifo.out.write(((u32*) & decoder.rgb16) + 4 * ipu_cmd.pos[1], 32 - ipu_cmd.pos[1]); - if (ipu_cmd.pos[1] < 32) return false; - } - else - { - ipu_cmd.pos[1] += ipu_fifo.out.write(((u32*) & decoder.rgb32) + 4 * ipu_cmd.pos[1], 64 - ipu_cmd.pos[1]); - if (ipu_cmd.pos[1] < 64) return false; - } - - ipu_cmd.pos[0] = 0; - ipu_cmd.pos[1] = 0; - } - - return true; -} - -static __ri bool ipuPACK(tIPU_CMD_CSC csc) -{ - csc.log_from_RGB32(); - - for (;ipu_cmd.index < (int)csc.MBC; ipu_cmd.index++) - { - for(;ipu_cmd.pos[0] < (int)sizeof(macroblock_rgb32) / 8; ipu_cmd.pos[0]++) - { - if (!getBits64((u8*)&decoder.rgb32 + 8 * ipu_cmd.pos[0], 1)) return false; - } - - ipu_dither(decoder.rgb32, decoder.rgb16, csc.DTE); - - if (!csc.OFM) ipu_vq(decoder.rgb16, indx4); - - if (csc.OFM) - { - ipu_cmd.pos[1] += ipu_fifo.out.write(((u32*) & decoder.rgb16) + 4 * ipu_cmd.pos[1], 32 - ipu_cmd.pos[1]); - if (ipu_cmd.pos[1] < 32) return false; - } - else - { - ipu_cmd.pos[1] += ipu_fifo.out.write(((u32*)indx4) + 4 * ipu_cmd.pos[1], 8 - ipu_cmd.pos[1]); - if (ipu_cmd.pos[1] < 8) return false; - } - - ipu_cmd.pos[0] = 0; - ipu_cmd.pos[1] = 0; - } - - return true; -} - static void ipuSETTH(u32 val) { - s_thresh[0] = (val & 0x1ff); - s_thresh[1] = ((val >> 16) & 0x1ff); + g_ipu_thresh[0] = (val & 0x1ff); + g_ipu_thresh[1] = ((val >> 16) & 0x1ff); IPU_LOG("SETTH (Set threshold value)command %x.", val&0x1ff01ff); } -// -------------------------------------------------------------------------------------- -// CORE Functions (referenced from MPEG library) -// -------------------------------------------------------------------------------------- -__fi void ipu_csc(macroblock_8& mb8, macroblock_rgb32& rgb32, int sgn) -{ - int i; - u8* p = (u8*)&rgb32; - - yuv2rgb(); - - if (s_thresh[0] > 0) - { - for (i = 0; i < 16*16; i++, p += 4) - { - if ((p[0] < s_thresh[0]) && (p[1] < s_thresh[0]) && (p[2] < s_thresh[0])) - *(u32*)p = 0; - else if ((p[0] < s_thresh[1]) && (p[1] < s_thresh[1]) && (p[2] < s_thresh[1])) - p[3] = 0x40; - } - } - else if (s_thresh[1] > 0) - { - for (i = 0; i < 16*16; i++, p += 4) - { - if ((p[0] < s_thresh[1]) && (p[1] < s_thresh[1]) && (p[2] < s_thresh[1])) - p[3] = 0x40; - } - } - if (sgn) - { - for (i = 0; i < 16*16; i++, p += 4) - { - *(u32*)p ^= 0x808080; - } - } -} - -__fi void ipu_vq(macroblock_rgb16& rgb16, u8* indx4) -{ - const auto closest_index = [&](int i, int j) { - u8 index = 0; - int min_distance = std::numeric_limits::max(); - for (u8 k = 0; k < 16; ++k) - { - const int dr = rgb16.c[i][j].r - vqclut[k].r; - const int dg = rgb16.c[i][j].g - vqclut[k].g; - const int db = rgb16.c[i][j].b - vqclut[k].b; - const int distance = dr * dr + dg * dg + db * db; - - // XXX: If two distances are the same which index is used? - if (min_distance > distance) - { - index = k; - min_distance = distance; - } - } - - return index; - }; - - for (int i = 0; i < 16; ++i) - for (int j = 0; j < 8; ++j) - indx4[i * 8 + j] = closest_index(i, 2 * j + 1) << 4 | closest_index(i, 2 * j); -} - - // -------------------------------------------------------------------------------------- // Buffer reader // -------------------------------------------------------------------------------------- @@ -769,7 +478,7 @@ __fi u8 getBits32(u8 *address, bool advance) if (!g_BP.FillBuffer(32)) return 0; const u8* readpos = &g_BP.internal_qwc->_u8[g_BP.BP/8]; - + if(uint shift = (g_BP.BP & 7)) { u32 mask = (0xff >> shift); @@ -902,7 +611,7 @@ __fi void IPUCMD_WRITE(u32 val) break; jNO_DEFAULT; - } + } ipuRegs.ctrl.BUSY = 1; @@ -916,71 +625,3 @@ __fi void IPUCMD_WRITE(u32 val) else IPUWorker(); } - -__noinline void IPUWorker() -{ - pxAssert(ipuRegs.ctrl.BUSY); - - switch (ipu_cmd.CMD) - { - // These are unreachable (BUSY will always be 0 for them) - //case SCE_IPU_BCLR: - //case SCE_IPU_SETTH: - //break; - - case SCE_IPU_IDEC: - if (!mpeg2sliceIDEC()) return; - - //ipuRegs.ctrl.OFC = 0; - ipuRegs.topbusy = 0; - ipuRegs.cmd.BUSY = 0; - break; - - case SCE_IPU_BDEC: - if (!mpeg2_slice()) return; - - ipuRegs.topbusy = 0; - ipuRegs.cmd.BUSY = 0; - - //if (ipuRegs.ctrl.SCD || ipuRegs.ctrl.ECD) hwIntcIrq(INTC_IPU); - break; - - case SCE_IPU_VDEC: - if (!ipuVDEC(ipu_cmd.current)) return; - - ipuRegs.topbusy = 0; - ipuRegs.cmd.BUSY = 0; - break; - - case SCE_IPU_FDEC: - if (!ipuFDEC(ipu_cmd.current)) return; - - ipuRegs.topbusy = 0; - ipuRegs.cmd.BUSY = 0; - break; - - case SCE_IPU_SETIQ: - if (!ipuSETIQ(ipu_cmd.current)) return; - break; - - case SCE_IPU_SETVQ: - if (!ipuSETVQ(ipu_cmd.current)) return; - break; - - case SCE_IPU_CSC: - if (!ipuCSC(ipu_cmd.current)) return; - break; - - case SCE_IPU_PACK: - if (!ipuPACK(ipu_cmd.current)) return; - break; - - jNO_DEFAULT - } - - // success - IPU_LOG("IPU Command finished"); - ipuRegs.ctrl.BUSY = 0; - //ipu_cmd.current = 0xffffffff; - hwIntcIrq(INTC_IPU); -} diff --git a/pcsx2/IPU/IPU.h b/pcsx2/IPU/IPU.h index a3cf95d96d..fcfd2ebe78 100644 --- a/pcsx2/IPU/IPU.h +++ b/pcsx2/IPU/IPU.h @@ -275,7 +275,7 @@ union tIPU_cmd u32 current; }; }; - + u128 _u128[2]; void clear(); @@ -288,14 +288,18 @@ union tIPU_cmd static IPUregisters& ipuRegs = (IPUregisters&)eeHw[0x2000]; +extern bool FMVstarted; +extern bool EnableFMV; + alignas(16) extern tIPU_cmd ipu_cmd; +extern uint eecount_on_last_vdec; extern int coded_block_pattern; extern bool CommandExecuteQueued; extern void ipuReset(); extern u32 ipuRead32(u32 mem); -extern RETURNS_R64 ipuRead64(u32 mem); +extern u64 ipuRead64(u32 mem); extern bool ipuWrite32(u32 mem,u32 value); extern bool ipuWrite64(u32 mem,u64 value); diff --git a/pcsx2/IPU/IPU_Fifo.cpp b/pcsx2/IPU/IPU_Fifo.cpp index 8ef6ce762d..9765b97b96 100644 --- a/pcsx2/IPU/IPU_Fifo.cpp +++ b/pcsx2/IPU/IPU_Fifo.cpp @@ -124,7 +124,7 @@ int IPU_Fifo_Output::write(const u32 *value, uint size) uint origsize = size; /*do {*/ //IPU0dma(); - + uint transsize = std::min(size, 8 - (uint)ipuRegs.ctrl.OFC); if(!transsize) return 0; @@ -147,7 +147,7 @@ void IPU_Fifo_Output::read(void *value, uint size) { pxAssert(ipuRegs.ctrl.OFC >= size); ipuRegs.ctrl.OFC -= size; - + // Zeroing the read data is not needed, since the ringbuffer design will never read back // the zero'd data anyway. --air diff --git a/pcsx2/IPU/IPU_MultiISA.cpp b/pcsx2/IPU/IPU_MultiISA.cpp new file mode 100644 index 0000000000..7c94d975e2 --- /dev/null +++ b/pcsx2/IPU/IPU_MultiISA.cpp @@ -0,0 +1,387 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "IPU_MultiISA.h" + +#include "IPU.h" +#include "IPUdma.h" +#include "yuv2rgb.h" + +MULTI_ISA_UNSHARED_START + +////////////////////////////////////////////////////// +// IPU Commands (exec on worker thread only) + +static __fi bool ipuVDEC(u32 val) +{ + static int count = 0; + if (count++ > 5) { + if (!FMVstarted) { + EnableFMV = true; + FMVstarted = true; + } + count = 0; + } + eecount_on_last_vdec = cpuRegs.cycle; + + switch (ipu_cmd.pos[0]) + { + case 0: + if (!bitstream_init()) return false; + + switch ((val >> 26) & 3) + { + case 0://Macroblock Address Increment + decoder.mpeg1 = ipuRegs.ctrl.MP1; + ipuRegs.cmd.DATA = get_macroblock_address_increment(); + break; + + case 1://Macroblock Type + decoder.frame_pred_frame_dct = 1; + decoder.coding_type = ipuRegs.ctrl.PCT > 0 ? ipuRegs.ctrl.PCT : 1; // Kaiketsu Zorro Mezase doesn't set a Picture type, seems happy with I + ipuRegs.cmd.DATA = get_macroblock_modes(); + break; + + case 2://Motion Code + ipuRegs.cmd.DATA = get_motion_delta(0); + break; + + case 3://DMVector + ipuRegs.cmd.DATA = get_dmv(); + break; + + jNO_DEFAULT + } + + // HACK ATTACK! This code OR's the MPEG decoder's bitstream position into the upper + // 16 bits of DATA; which really doesn't make sense since (a) we already rewound the bits + // back into the IPU internal buffer above, and (b) the IPU doesn't have an MPEG internal + // 32-bit decoder buffer of its own anyway. Furthermore, setting the upper 16 bits to + // any value other than zero appears to work fine. When set to zero, however, FMVs run + // very choppy (basically only decoding/updating every 30th frame or so). So yeah, + // someone with knowledge on the subject please feel free to explain this one. :) --air + + // The upper bits are the "length" of the decoded command, where the lower is the address. + // This is due to differences with IPU and the MPEG standard. See get_macroblock_address_increment(). + + ipuRegs.ctrl.ECD = (ipuRegs.cmd.DATA == 0); + [[fallthrough]]; + + case 1: + if (!getBits32((u8*)&ipuRegs.top, 0)) + { + ipu_cmd.pos[0] = 1; + return false; + } + + ipuRegs.top = BigEndian(ipuRegs.top); + + IPU_LOG("VDEC command data 0x%x(0x%x). Skip 0x%X bits/Table=%d (%s), pct %d", + ipuRegs.cmd.DATA, ipuRegs.cmd.DATA >> 16, val & 0x3f, (val >> 26) & 3, (val >> 26) & 1 ? + ((val >> 26) & 2 ? "DMV" : "MBT") : (((val >> 26) & 2 ? "MC" : "MBAI")), ipuRegs.ctrl.PCT); + + return true; + + jNO_DEFAULT + } + + return false; +} + +static __ri bool ipuFDEC(u32 val) +{ + if (!getBits32((u8*)&ipuRegs.cmd.DATA, 0)) return false; + + ipuRegs.cmd.DATA = BigEndian(ipuRegs.cmd.DATA); + ipuRegs.top = ipuRegs.cmd.DATA; + + IPU_LOG("FDEC read: 0x%08x", ipuRegs.top); + + return true; +} + +static bool ipuSETIQ(u32 val) +{ + if ((val >> 27) & 1) + { + u8 (&niq)[64] = decoder.niq; + + for(;ipu_cmd.pos[0] < 8; ipu_cmd.pos[0]++) + { + if (!getBits64((u8*)niq + 8 * ipu_cmd.pos[0], 1)) return false; + } + + IPU_LOG("Read non-intra quantization matrix from FIFO."); + for (uint i = 0; i < 8; i++) + { + IPU_LOG("%02X %02X %02X %02X %02X %02X %02X %02X", + niq[i * 8 + 0], niq[i * 8 + 1], niq[i * 8 + 2], niq[i * 8 + 3], + niq[i * 8 + 4], niq[i * 8 + 5], niq[i * 8 + 6], niq[i * 8 + 7]); + } + } + else + { + u8 (&iq)[64] = decoder.iq; + + for(;ipu_cmd.pos[0] < 8; ipu_cmd.pos[0]++) + { + if (!getBits64((u8*)iq + 8 * ipu_cmd.pos[0], 1)) return false; + } + + IPU_LOG("Read intra quantization matrix from FIFO."); + for (uint i = 0; i < 8; i++) + { + IPU_LOG("%02X %02X %02X %02X %02X %02X %02X %02X", + iq[i * 8 + 0], iq[i * 8 + 1], iq[i * 8 + 2], iq[i *8 + 3], + iq[i * 8 + 4], iq[i * 8 + 5], iq[i * 8 + 6], iq[i *8 + 7]); + } + } + + return true; +} + +static bool ipuSETVQ(u32 val) +{ + for(;ipu_cmd.pos[0] < 4; ipu_cmd.pos[0]++) + { + if (!getBits64(((u8*)g_ipu_vqclut) + 8 * ipu_cmd.pos[0], 1)) return false; + } + + IPU_LOG("SETVQ command. Read VQCLUT table from FIFO.\n" + "%02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d\n" + "%02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d\n" + "%02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d\n" + "%02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d %02d:%02d:%02d", + g_ipu_vqclut[ 0].r, g_ipu_vqclut[ 0].g, g_ipu_vqclut[ 0].b, + g_ipu_vqclut[ 1].r, g_ipu_vqclut[ 1].g, g_ipu_vqclut[ 1].b, + g_ipu_vqclut[ 2].r, g_ipu_vqclut[ 2].g, g_ipu_vqclut[ 2].b, + g_ipu_vqclut[ 3].r, g_ipu_vqclut[ 3].g, g_ipu_vqclut[ 3].b, + g_ipu_vqclut[ 4].r, g_ipu_vqclut[ 4].g, g_ipu_vqclut[ 4].b, + g_ipu_vqclut[ 5].r, g_ipu_vqclut[ 5].g, g_ipu_vqclut[ 5].b, + g_ipu_vqclut[ 6].r, g_ipu_vqclut[ 6].g, g_ipu_vqclut[ 6].b, + g_ipu_vqclut[ 7].r, g_ipu_vqclut[ 7].g, g_ipu_vqclut[ 7].b, + g_ipu_vqclut[ 8].r, g_ipu_vqclut[ 8].g, g_ipu_vqclut[ 8].b, + g_ipu_vqclut[ 9].r, g_ipu_vqclut[ 9].g, g_ipu_vqclut[ 9].b, + g_ipu_vqclut[10].r, g_ipu_vqclut[10].g, g_ipu_vqclut[10].b, + g_ipu_vqclut[11].r, g_ipu_vqclut[11].g, g_ipu_vqclut[11].b, + g_ipu_vqclut[12].r, g_ipu_vqclut[12].g, g_ipu_vqclut[12].b, + g_ipu_vqclut[13].r, g_ipu_vqclut[13].g, g_ipu_vqclut[13].b, + g_ipu_vqclut[14].r, g_ipu_vqclut[14].g, g_ipu_vqclut[14].b, + g_ipu_vqclut[15].r, g_ipu_vqclut[15].g, g_ipu_vqclut[15].b); + + return true; +} + +// IPU Transfers are split into 8Qwords so we need to send ALL the data +static __ri bool ipuCSC(tIPU_CMD_CSC csc) +{ + csc.log_from_YCbCr(); + + for (;ipu_cmd.index < (int)csc.MBC; ipu_cmd.index++) + { + for(;ipu_cmd.pos[0] < 48; ipu_cmd.pos[0]++) + { + if (!getBits64((u8*)&decoder.mb8 + 8 * ipu_cmd.pos[0], 1)) return false; + } + + ipu_csc(decoder.mb8, decoder.rgb32, 0); + if (csc.OFM) ipu_dither(decoder.rgb32, decoder.rgb16, csc.DTE); + + if (csc.OFM) + { + ipu_cmd.pos[1] += ipu_fifo.out.write(((u32*) & decoder.rgb16) + 4 * ipu_cmd.pos[1], 32 - ipu_cmd.pos[1]); + if (ipu_cmd.pos[1] < 32) return false; + } + else + { + ipu_cmd.pos[1] += ipu_fifo.out.write(((u32*) & decoder.rgb32) + 4 * ipu_cmd.pos[1], 64 - ipu_cmd.pos[1]); + if (ipu_cmd.pos[1] < 64) return false; + } + + ipu_cmd.pos[0] = 0; + ipu_cmd.pos[1] = 0; + } + + return true; +} + +static __ri bool ipuPACK(tIPU_CMD_CSC csc) +{ + csc.log_from_RGB32(); + + for (;ipu_cmd.index < (int)csc.MBC; ipu_cmd.index++) + { + for(;ipu_cmd.pos[0] < (int)sizeof(macroblock_rgb32) / 8; ipu_cmd.pos[0]++) + { + if (!getBits64((u8*)&decoder.rgb32 + 8 * ipu_cmd.pos[0], 1)) return false; + } + + ipu_dither(decoder.rgb32, decoder.rgb16, csc.DTE); + + if (!csc.OFM) ipu_vq(decoder.rgb16, g_ipu_indx4); + + if (csc.OFM) + { + ipu_cmd.pos[1] += ipu_fifo.out.write(((u32*) & decoder.rgb16) + 4 * ipu_cmd.pos[1], 32 - ipu_cmd.pos[1]); + if (ipu_cmd.pos[1] < 32) return false; + } + else + { + ipu_cmd.pos[1] += ipu_fifo.out.write(((u32*)g_ipu_indx4) + 4 * ipu_cmd.pos[1], 8 - ipu_cmd.pos[1]); + if (ipu_cmd.pos[1] < 8) return false; + } + + ipu_cmd.pos[0] = 0; + ipu_cmd.pos[1] = 0; + } + + return true; +} + +// -------------------------------------------------------------------------------------- +// CORE Functions (referenced from MPEG library) +// -------------------------------------------------------------------------------------- + +__fi void ipu_csc(macroblock_8& mb8, macroblock_rgb32& rgb32, int sgn) +{ + int i; + u8* p = (u8*)&rgb32; + + yuv2rgb(); + + if (g_ipu_thresh[0] > 0) + { + for (i = 0; i < 16*16; i++, p += 4) + { + if ((p[0] < g_ipu_thresh[0]) && (p[1] < g_ipu_thresh[0]) && (p[2] < g_ipu_thresh[0])) + *(u32*)p = 0; + else if ((p[0] < g_ipu_thresh[1]) && (p[1] < g_ipu_thresh[1]) && (p[2] < g_ipu_thresh[1])) + p[3] = 0x40; + } + } + else if (g_ipu_thresh[1] > 0) + { + for (i = 0; i < 16*16; i++, p += 4) + { + if ((p[0] < g_ipu_thresh[1]) && (p[1] < g_ipu_thresh[1]) && (p[2] < g_ipu_thresh[1])) + p[3] = 0x40; + } + } + if (sgn) + { + for (i = 0; i < 16*16; i++, p += 4) + { + *(u32*)p ^= 0x808080; + } + } +} + +__fi void ipu_vq(macroblock_rgb16& rgb16, u8* indx4) +{ + const auto closest_index = [&](int i, int j) { + u8 index = 0; + int min_distance = std::numeric_limits::max(); + for (u8 k = 0; k < 16; ++k) + { + const int dr = rgb16.c[i][j].r - g_ipu_vqclut[k].r; + const int dg = rgb16.c[i][j].g - g_ipu_vqclut[k].g; + const int db = rgb16.c[i][j].b - g_ipu_vqclut[k].b; + const int distance = dr * dr + dg * dg + db * db; + + // XXX: If two distances are the same which index is used? + if (min_distance > distance) + { + index = k; + min_distance = distance; + } + } + + return index; + }; + + for (int i = 0; i < 16; ++i) + for (int j = 0; j < 8; ++j) + indx4[i * 8 + j] = closest_index(i, 2 * j + 1) << 4 | closest_index(i, 2 * j); +} + +__noinline void IPUWorker() +{ + pxAssert(ipuRegs.ctrl.BUSY); + + switch (ipu_cmd.CMD) + { + // These are unreachable (BUSY will always be 0 for them) + //case SCE_IPU_BCLR: + //case SCE_IPU_SETTH: + //break; + + case SCE_IPU_IDEC: + if (!mpeg2sliceIDEC()) return; + + //ipuRegs.ctrl.OFC = 0; + ipuRegs.topbusy = 0; + ipuRegs.cmd.BUSY = 0; + break; + + case SCE_IPU_BDEC: + if (!mpeg2_slice()) return; + + ipuRegs.topbusy = 0; + ipuRegs.cmd.BUSY = 0; + + //if (ipuRegs.ctrl.SCD || ipuRegs.ctrl.ECD) hwIntcIrq(INTC_IPU); + break; + + case SCE_IPU_VDEC: + if (!ipuVDEC(ipu_cmd.current)) return; + + ipuRegs.topbusy = 0; + ipuRegs.cmd.BUSY = 0; + break; + + case SCE_IPU_FDEC: + if (!ipuFDEC(ipu_cmd.current)) return; + + ipuRegs.topbusy = 0; + ipuRegs.cmd.BUSY = 0; + break; + + case SCE_IPU_SETIQ: + if (!ipuSETIQ(ipu_cmd.current)) return; + break; + + case SCE_IPU_SETVQ: + if (!ipuSETVQ(ipu_cmd.current)) return; + break; + + case SCE_IPU_CSC: + if (!ipuCSC(ipu_cmd.current)) return; + break; + + case SCE_IPU_PACK: + if (!ipuPACK(ipu_cmd.current)) return; + break; + + jNO_DEFAULT + } + + // success + IPU_LOG("IPU Command finished"); + ipuRegs.ctrl.BUSY = 0; + //ipu_cmd.current = 0xffffffff; + hwIntcIrq(INTC_IPU); +} + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/IPU/IPU_MultiISA.h b/pcsx2/IPU/IPU_MultiISA.h new file mode 100644 index 0000000000..d671e9a6f0 --- /dev/null +++ b/pcsx2/IPU/IPU_MultiISA.h @@ -0,0 +1,27 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +#include "GS/MultiISA.h" +#include "mpeg2lib/Mpeg.h" + +MULTI_ISA_DEF(void IPUWorker();) + +// Quantization matrix +extern rgb16_t g_ipu_vqclut[16]; //clut conversion table +extern u16 g_ipu_thresh[2]; //thresholds for color conversions + +alignas(16) extern u8 g_ipu_indx4[16*16/2]; diff --git a/pcsx2/IPU/IPUdither.cpp b/pcsx2/IPU/IPUdither.cpp index 0649ac354a..a2d1f07877 100644 --- a/pcsx2/IPU/IPUdither.cpp +++ b/pcsx2/IPU/IPUdither.cpp @@ -21,6 +21,10 @@ #include "yuv2rgb.h" #include "mpeg2lib/Mpeg.h" +#include "GS/MultiISA.h" + +MULTI_ISA_UNSHARED_START + void ipu_dither_reference(const macroblock_rgb32 &rgb32, macroblock_rgb16 &rgb16, int dte); void ipu_dither_sse2(const macroblock_rgb32 &rgb32, macroblock_rgb16 &rgb16, int dte); @@ -120,3 +124,5 @@ __ri void ipu_dither_sse2(const macroblock_rgb32 &rgb32, macroblock_rgb16 &rgb16 } } } + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/IPU/IPUdma.cpp b/pcsx2/IPU/IPUdma.cpp index 1c5d2ec8c3..e7e9f83d48 100644 --- a/pcsx2/IPU/IPUdma.cpp +++ b/pcsx2/IPU/IPUdma.cpp @@ -74,6 +74,7 @@ void IPU1dma() //if we don't, we risk causing the data to go out of sync with the fifo and we end up losing some! //This is true for Dragons Quest 8 and probably others which suspend the DMA. DevCon.Warning("IPU1 running when IPU1 DMA disabled! CHCR %x QWC %x", ipu1ch.chcr._u32, ipu1ch.qwc); + CPU_SET_DMASTALL(DMAC_TO_IPU, true); return; } @@ -81,6 +82,7 @@ void IPU1dma() { // IPU isn't expecting any data, so put it in to wait mode. cpuRegs.eCycle[4] = 0x9999; + CPU_SET_DMASTALL(DMAC_TO_IPU, true); return; } @@ -133,6 +135,7 @@ void IPU1dma() if (!(IPU1Status.DMAFinished && !IPU1Status.InProgress)) { cpuRegs.eCycle[4] = 0x9999;//IPU_INT_TO(2048); + CPU_SET_DMASTALL(DMAC_TO_IPU, true); } else { @@ -156,6 +159,7 @@ void IPU0dma() { if(!CommandExecuteQueued) IPUProcessInterrupt(); + CPU_SET_DMASTALL(DMAC_FROM_IPU, true); return; } @@ -182,7 +186,7 @@ void IPU0dma() ipu0ch.madr += readsize << 4; ipu0ch.qwc -= readsize; - + if (dmacRegs.ctrl.STS == STS_fromIPU) // STS == fromIPU { //DevCon.Warning("fromIPU Stall Control"); @@ -194,6 +198,7 @@ void IPU0dma() if (ipuRegs.ctrl.BUSY && !CommandExecuteQueued) { CommandExecuteQueued = true; + CPU_SET_DMASTALL(DMAC_FROM_IPU, true); CPU_INT(IPU_PROCESS, 4); } } @@ -205,6 +210,7 @@ __fi void dmaIPU0() // fromIPU if (dmacRegs.ctrl.STS == STS_fromIPU) // STS == fromIPU - Initial settings dmacRegs.stadr.ADDR = ipu0ch.madr; + CPU_SET_DMASTALL(DMAC_FROM_IPU, false); // Note: This should probably be a very small value, however anything lower than this will break Mana Khemia // This is because the game sends bad DMA information, starts an IDEC, then sets it to the correct values // but because our IPU is too quick, it messes up the sync between the DMA and IPU. @@ -230,6 +236,7 @@ __fi void dmaIPU0() // fromIPU __fi void dmaIPU1() // toIPU { IPU_LOG("IPU1DMAStart QWC %x, MADR %x, CHCR %x, TADR %x", ipu1ch.qwc, ipu1ch.madr, ipu1ch.chcr._u32, ipu1ch.tadr); + CPU_SET_DMASTALL(DMAC_TO_IPU, false); if (ipu1ch.chcr.MOD == CHAIN_MODE) //Chain Mode { @@ -289,6 +296,7 @@ void ipu0Interrupt() ipu0ch.chcr.STR = false; hwDmacIrq(DMAC_FROM_IPU); + CPU_SET_DMASTALL(DMAC_FROM_IPU, false); DMA_LOG("IPU0 DMA End"); } @@ -305,4 +313,5 @@ __fi void ipu1Interrupt() DMA_LOG("IPU1 DMA End"); ipu1ch.chcr.STR = false; hwDmacIrq(DMAC_TO_IPU); + CPU_SET_DMASTALL(DMAC_TO_IPU, false); } diff --git a/pcsx2/IPU/mpeg2lib/Idct.cpp b/pcsx2/IPU/mpeg2lib/Idct.cpp index 18ddb5c2a1..dd1684b989 100644 --- a/pcsx2/IPU/mpeg2lib/Idct.cpp +++ b/pcsx2/IPU/mpeg2lib/Idct.cpp @@ -32,6 +32,8 @@ #include "IPU/IPU.h" #include "Mpeg.h" +#include + #define W1 2841 /* 2048*sqrt (2)*cos (1*pi/16) */ #define W2 2676 /* 2048*sqrt (2)*cos (2*pi/16) */ #define W3 2408 /* 2048*sqrt (2)*cos (3*pi/16) */ @@ -45,9 +47,11 @@ * to +-3826 - this is the worst case for a column IDCT where the * column inputs are 16-bit values. */ -alignas(16) static u8 clip_lut[1024]; +alignas(16) extern const std::array g_idct_clip_lut; -#define CLIP(i) ((clip_lut+384)[(i)]) +#define CLIP(i) ((g_idct_clip_lut.data()+384)[(i)]) + +MULTI_ISA_UNSHARED_START static __fi void BUTTERFLY(int& t0, int& t1, int w0, int w1, int d0, int d1) { @@ -219,9 +223,21 @@ __ri void mpeg2_idct_add (const int last, s16 * block, s16 * dest, const int str } } -mpeg2_scan_pack::mpeg2_scan_pack() +MULTI_ISA_UNSHARED_END + +#if MULTI_ISA_COMPILE_ONCE + +static constexpr std::array make_clip_lut() { - static const u8 mpeg2_scan_norm[64] = { + std::array lut = {}; + for (int i = -384; i < 640; i++) + lut[i+384] = (i < 0) ? 0 : ((i > 255) ? 255 : i); + return lut; +} + +static constexpr mpeg2_scan_pack make_scan_pack() +{ + constexpr u8 mpeg2_scan_norm[64] = { /* Zig-Zag scan pattern */ 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, @@ -229,7 +245,7 @@ mpeg2_scan_pack::mpeg2_scan_pack() 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 }; - static const u8 mpeg2_scan_alt[64] = { + constexpr u8 mpeg2_scan_alt[64] = { /* Alternate scan pattern */ 0, 8, 16, 24, 1, 9, 2, 10, 17, 25, 32, 40, 48, 56, 57, 49, 41, 33, 26, 18, 3, 11, 4, 12, 19, 27, 34, 42, 50, 58, 35, 43, @@ -237,15 +253,19 @@ mpeg2_scan_pack::mpeg2_scan_pack() 53, 61, 22, 30, 7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63 }; - for (int i = -384; i < 640; i++) - clip_lut[i+384] = (i < 0) ? 0 : ((i > 255) ? 255 : i); + mpeg2_scan_pack pack = {}; for (int i = 0; i < 64; i++) { int j = mpeg2_scan_norm[i]; - norm[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); + pack.norm[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); j = mpeg2_scan_alt[i]; - alt[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); + pack.alt[i] = ((j & 0x36) >> 1) | ((j & 0x09) << 2); } + + return pack; } -alignas(16) const mpeg2_scan_pack mpeg2_scan; +alignas(16) constexpr std::array g_idct_clip_lut = make_clip_lut(); +alignas(16) constexpr mpeg2_scan_pack mpeg2_scan = make_scan_pack(); + +#endif diff --git a/pcsx2/IPU/mpeg2lib/Mpeg.cpp b/pcsx2/IPU/mpeg2lib/Mpeg.cpp index aeff5dc45f..664f69c7a0 100644 --- a/pcsx2/IPU/mpeg2lib/Mpeg.cpp +++ b/pcsx2/IPU/mpeg2lib/Mpeg.cpp @@ -33,8 +33,12 @@ #include "Mpeg.h" #include "Vlc.h" +#include "GS/MultiISA.h" + #include "common/MemsetFast.inl" +#if MULTI_ISA_COMPILE_ONCE + const int non_linear_quantizer_scale [] = { 0, 1, 2, 3, 4, 5, 6, 7, @@ -43,6 +47,10 @@ const int non_linear_quantizer_scale [] = 56, 64, 72, 80, 88, 96, 104, 112 }; +#endif + +MULTI_ISA_UNSHARED_START + /* Bitstream and buffer needs to be reallocated in order for successful reading of the old data. Here the old data stored in the 2nd slot of the internal buffer is copied to 1st slot, and the new data read @@ -236,7 +244,7 @@ int __fi get_dmv() int get_macroblock_address_increment() { const MBAtab *mba; - + u16 code = UBITS(16); if (code >= 4096) @@ -287,7 +295,7 @@ static __fi int get_luma_dc_dct_diff() // 9 bits max } - + if (size==0) dc_diff = 0; else @@ -347,7 +355,7 @@ static bool get_intra_block() const u8 (&quant_matrix)[64] = decoder.iq; int quantizer_scale = decoder.quantizer_scale; s16 * dest = decoder.DCTblock; - u16 code; + u16 code; /* decode AC coefficients */ for (int i=1 + ipu_cmd.pos[4]; ; i++) @@ -428,7 +436,7 @@ static bool get_intra_block() ipu_cmd.pos[4] = 0; return true; } - + i += (tab->run == 65) ? GETBITS(6) : tab->run; if (i >= 64) { @@ -528,7 +536,7 @@ static bool get_non_intra_block(int * last) tab = &DCT.first[(code >> 12) - 4]; } else - { + { tab = &DCT.next[(code >> 12)- 4]; } } @@ -537,7 +545,7 @@ static bool get_non_intra_block(int * last) tab = &DCT.tab0[(code >> 8) - 4]; } else if (code >= 512) - { + { tab = &DCT.tab1[(code >> 6) - 8]; } @@ -547,23 +555,23 @@ static bool get_non_intra_block(int * last) // have lots of room to spare. else if (code >= 256) - { + { tab = &DCT.tab2[(code >> 4) - 16]; } else if (code >= 128) - { + { tab = &DCT.tab3[(code >> 3) - 16]; } else if (code >= 64) - { + { tab = &DCT.tab4[(code >> 2) - 16]; } else if (code >= 32) - { + { tab = &DCT.tab5[(code >> 1) - 16]; } else if (code >= 16) - { + { tab = &DCT.tab6[code - 16]; } else @@ -884,7 +892,7 @@ __fi bool mpeg2sliceIDEC() default: /* end of slice/frame, or error? */ { - goto finish_idec; + goto finish_idec; } } } @@ -990,7 +998,7 @@ __fi bool mpeg2_slice() decoder.dc_dct_pred[1] = decoder.dc_dct_pred[2] = 128 << decoder.intra_dc_precision; } - + ipuRegs.ctrl.ECD = 0; ipuRegs.top = 0; memzero_sse_a(mb8); @@ -1236,7 +1244,7 @@ __fi bool mpeg2_slice() g_BP.Align(); do { - if (!g_BP.FillBuffer(24)) + if (!g_BP.FillBuffer(24)) { ipu_cmd.pos[0] = 4; return false; @@ -1272,4 +1280,6 @@ __fi bool mpeg2_slice() } return true; -} \ No newline at end of file +} + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/IPU/mpeg2lib/Mpeg.h b/pcsx2/IPU/mpeg2lib/Mpeg.h index 10feeaf7a9..d5ea1132bd 100644 --- a/pcsx2/IPU/mpeg2lib/Mpeg.h +++ b/pcsx2/IPU/mpeg2lib/Mpeg.h @@ -24,6 +24,12 @@ #pragma once +#include "IPU/IPU.h" + +#include "GS/MultiISA.h" + +#include "common/Assertions.h" + // the IPU is fixed to 16 byte strides (128-bit / QWC resolution): static const uint decoder_stride = 16; @@ -171,7 +177,7 @@ struct decoder_t { { return ((u128*)&mb8) + ipu0_idx; } - + void AdvanceIpuDataBy(uint amt) { pxAssertMsg(ipu0_data>=amt, "IPU FIFO Overflow on advance!" ); @@ -184,30 +190,31 @@ struct mpeg2_scan_pack { u8 norm[64]; u8 alt[64]; - - mpeg2_scan_pack(); }; -extern int bitstream_init (); extern u32 UBITS(uint bits); extern s32 SBITS(uint bits); -extern void mpeg2_idct_copy(s16 * block, u8* dest, int stride); -extern void mpeg2_idct_add(int last, s16 * block, s16* dest, int stride); +MULTI_ISA_DEF( + extern int bitstream_init(); -extern bool mpeg2sliceIDEC(); -extern bool mpeg2_slice(); -extern int get_macroblock_address_increment(); -extern int get_macroblock_modes(); + extern void mpeg2_idct_copy(s16 * block, u8* dest, int stride); + extern void mpeg2_idct_add(int last, s16 * block, s16* dest, int stride); -extern int get_motion_delta(const int f_code); -extern int get_dmv(); + extern bool mpeg2sliceIDEC(); + extern bool mpeg2_slice(); + extern int get_macroblock_address_increment(); + extern int get_macroblock_modes(); -extern void ipu_csc(macroblock_8& mb8, macroblock_rgb32& rgb32, int sgn); -extern void ipu_dither(const macroblock_rgb32& rgb32, macroblock_rgb16& rgb16, int dte); -extern void ipu_vq(macroblock_rgb16& rgb16, u8* indx4); + extern int get_motion_delta(const int f_code); + extern int get_dmv(); -extern int slice (u8 * buffer); + extern void ipu_csc(macroblock_8& mb8, macroblock_rgb32& rgb32, int sgn); + extern void ipu_dither(const macroblock_rgb32& rgb32, macroblock_rgb16& rgb16, int dte); + extern void ipu_vq(macroblock_rgb16& rgb16, u8* indx4); + + extern int slice (u8 * buffer); +) #ifdef _MSC_VER #define BigEndian(in) _byteswap_ulong(in) diff --git a/pcsx2/IPU/mpeg2lib/Vlc.h b/pcsx2/IPU/mpeg2lib/Vlc.h index c2a3c61b1e..61bcd791b5 100644 --- a/pcsx2/IPU/mpeg2lib/Vlc.h +++ b/pcsx2/IPU/mpeg2lib/Vlc.h @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ - + // WARNING! This file should only be included into Mpeg.cpp AND NOWHERE ELSE. // All contents of this file are used only by Mpeg.cpp, and including it elsewhere will // just result in the linker having to remove a whole lot of redundant/unused decoder diff --git a/pcsx2/IPU/yuv2rgb.cpp b/pcsx2/IPU/yuv2rgb.cpp index 7cab056784..51db3182e5 100644 --- a/pcsx2/IPU/yuv2rgb.cpp +++ b/pcsx2/IPU/yuv2rgb.cpp @@ -36,6 +36,8 @@ #define IPU_RCR_COEFF 0xcc // 1.59375 #define IPU_BCB_COEFF 0x102 // 2.015625 +MULTI_ISA_UNSHARED_START + // conforming implementation for reference, do not optimise void yuv2rgb_reference(void) { @@ -149,3 +151,5 @@ __ri void yuv2rgb_sse2() } } } + +MULTI_ISA_UNSHARED_END diff --git a/pcsx2/IPU/yuv2rgb.h b/pcsx2/IPU/yuv2rgb.h index 98382014dd..f95a30690f 100644 --- a/pcsx2/IPU/yuv2rgb.h +++ b/pcsx2/IPU/yuv2rgb.h @@ -15,7 +15,9 @@ #pragma once -extern void yuv2rgb_reference(); +#include "GS/MultiISA.h" + +MULTI_ISA_DEF(extern void yuv2rgb_reference();) #define yuv2rgb yuv2rgb_sse2 -extern void yuv2rgb_sse2(); +MULTI_ISA_DEF(extern void yuv2rgb_sse2();) diff --git a/pcsx2/Interpreter.cpp b/pcsx2/Interpreter.cpp index 629f58f082..c448fd6526 100644 --- a/pcsx2/Interpreter.cpp +++ b/pcsx2/Interpreter.cpp @@ -75,7 +75,7 @@ void intMemcheck(u32 op, u32 bits, bool store) start = standardizeBreakpointAddress(start); u32 end = start + bits/8; - + auto checks = CBreakPoints::GetMemChecks(); for (size_t i = 0; i < checks.size(); i++) { @@ -499,7 +499,7 @@ static void intEventTest() { // Perform counters, ints, and IOP updates: _cpuEventTest_Shared(); - + if (intExitExecution) { intExitExecution = false; @@ -615,15 +615,6 @@ static void intThrowException( const BaseException& ex ) ex.Rethrow(); } -static void intSetCacheReserve( uint reserveInMegs ) -{ -} - -static uint intGetCacheReserve() -{ - return 0; -} - R5900cpu intCpu = { intReserve, @@ -636,8 +627,5 @@ R5900cpu intCpu = intSafeExitExecution, intThrowException, intThrowException, - intClear, - - intGetCacheReserve, - intSetCacheReserve, + intClear }; diff --git a/pcsx2/IopBios.cpp b/pcsx2/IopBios.cpp index fa64deb6a3..df398d5262 100644 --- a/pcsx2/IopBios.cpp +++ b/pcsx2/IopBios.cpp @@ -1,5 +1,5 @@ /* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2021 PCSX2 Dev Team + * Copyright (C) 2002-2022 PCSX2 Dev Team * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- @@ -56,6 +56,18 @@ typedef struct unsigned char mtime[8]; unsigned int hisize; } fio_stat_t; +typedef struct +{ + fio_stat_t _fioStat; + /** Number of subs (main) / subpart number (sub) */ + unsigned int private_0; + unsigned int private_1; + unsigned int private_2; + unsigned int private_3; + unsigned int private_4; + /** Sector start. */ + unsigned int private_5; +} fxio_stat_t; typedef struct { @@ -64,12 +76,19 @@ typedef struct unsigned int unknown; } fio_dirent_t; +typedef struct +{ + fxio_stat_t stat; + char name[256]; + unsigned int unknown; +} fxio_dirent_t; + static std::string hostRoot; void Hle_SetElfPath(const char* elfFileName) { DevCon.WriteLn("HLE Host: Will load ELF: %s\n", elfFileName); - hostRoot = Path::ToNativePath(Path::GetDirectory(elfFileName)) + FS_OSPATH_SEPARATOR_STR; + hostRoot = Path::ToNativePath(Path::GetDirectory(elfFileName)); Console.WriteLn("HLE Host: Set 'host:' root path to: %s\n", hostRoot.c_str()); } @@ -90,34 +109,75 @@ namespace R3000A #define Ra2 (iopMemReadString(a2)) #define Ra3 (iopMemReadString(a3)) -#define FIO_SO_IXOTH 0x0001 -#define FIO_SO_IWOTH 0x0002 -#define FIO_SO_IROTH 0x0004 + // Stat values differ between iomanX and ioman + // These values have been taken from the PS2SDK + // Specifically iox_stat.h + struct fio_stat_flags + { + // Access flags + // Execute + int IXOTH; + // Write + int IWOTH; + // Read + int IROTH; -#define FIO_SO_IFLNK 0x0008 -#define FIO_SO_IFREG 0x0010 -#define FIO_SO_IFDIR 0x0020 + // File mode flags + // Symlink + int IFLNK; + // Regular file + int IFREG; + // Directory + int IFDIR; + }; - static std::string host_path(const std::string& path) + fio_stat_flags ioman_stat{ + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + }; + + fio_stat_flags iomanx_stat{ + 0x01, + 0x02, + 0x04, + 0x4000, + 0x2000, + 0x1000, + }; + + static std::string host_path(const std::string& path, bool allow_open_host_root) { // We are NOT allowing to use the root of the host unit. // For now it just supports relative folders from the location of the elf std::string native_path(Path::Canonicalize(path)); std::string new_path; - if (StringUtil::StartsWith(native_path, hostRoot)) + if (!hostRoot.empty() && StringUtil::StartsWith(native_path, hostRoot)) new_path = std::move(native_path); - else // relative paths + else if (!hostRoot.empty()) // relative paths new_path = Path::Combine(hostRoot, native_path); // Double-check that it falls within the directory of the elf. // Not a real sandbox, but emulators shouldn't be treated as such. Don't run untrusted code! std::string canonicalized_path(Path::Canonicalize(new_path)); - if (!StringUtil::StartsWith(canonicalized_path, hostRoot)) + + // Are we opening the root of host? (i.e. `host:.` or `host:`) + // We want to allow this as a directory open, but not as a file open. + if (!allow_open_host_root || canonicalized_path != hostRoot) { - Console.Error(fmt::format( - "IopHLE: Denying access to path outside of ELF directory. Requested path: '{}', Resolved path: '{}', ELF directory: '{}'", - path, new_path, hostRoot)); - new_path.clear(); + // Only allow descendants of the hostfs directory. + if (canonicalized_path.length() <= hostRoot.length() || // Length has to be equal or longer, + !StringUtil::StartsWith(canonicalized_path, hostRoot) || // and start with the host root, + canonicalized_path[hostRoot.length()] != FS_OSPATH_SEPARATOR_CHARACTER) // and we can't access a sibling. + { + Console.Error(fmt::format( + "IopHLE: Denying access to path outside of ELF directory. Requested path: '{}', Resolved path: '{}', ELF directory: '{}'", + path, new_path, hostRoot)); + new_path.clear(); + } } return new_path; @@ -129,14 +189,14 @@ namespace R3000A static __fi std::string clean_path(const std::string path) { std::string ret = path; - std::replace(ret.begin(),ret.end(),'\\','/'); + std::replace(ret.begin(), ret.end(), '\\', '/'); return ret; } - static int host_stat(const std::string path, fio_stat_t* host_stats) + static int host_stat(const std::string path, fio_stat_t* host_stats, fio_stat_flags& stat = ioman_stat) { struct stat file_stats; - const std::string file_path(host_path(path)); + const std::string file_path(host_path(path, true)); if (!FileSystem::StatFile(file_path.c_str(), &file_stats)) return -IOP_ENOENT; @@ -145,20 +205,20 @@ namespace R3000A host_stats->hisize = 0; // Convert the mode. - host_stats->mode = (file_stats.st_mode & (FIO_SO_IROTH | FIO_SO_IWOTH | FIO_SO_IXOTH)); + host_stats->mode = (file_stats.st_mode & (stat.IROTH | stat.IWOTH | stat.IXOTH)); #ifndef _WIN32 if (S_ISLNK(file_stats.st_mode)) { - host_stats->mode |= FIO_SO_IFLNK; + host_stats->mode |= stat.IFLNK; } #endif if (S_ISREG(file_stats.st_mode)) { - host_stats->mode |= FIO_SO_IFREG; + host_stats->mode |= stat.IFREG; } if (S_ISDIR(file_stats.st_mode)) { - host_stats->mode |= FIO_SO_IFDIR; + host_stats->mode |= stat.IFDIR; } // Convert the creation time. @@ -192,6 +252,11 @@ namespace R3000A return 0; } + static int host_stat(const std::string path, fxio_stat_t* host_stats) + { + return host_stat(path, &host_stats->_fioStat, iomanx_stat); + } + // TODO: sandbox option, other permissions class HostFile : public IOManFile { @@ -227,7 +292,7 @@ namespace R3000A static int open(IOManFile** file, const std::string& full_path, s32 flags, u16 mode) { const std::string path(full_path.substr(full_path.find(':') + 1)); - const std::string file_path(host_path(path)); + const std::string file_path(host_path(path, false)); int native_flags = O_BINARY; // necessary in Windows. switch (flags & IOP_O_RDWR) @@ -325,7 +390,7 @@ namespace R3000A static int open(IOManDir** dir, const std::string& full_path) { std::string relativePath = full_path.substr(full_path.find(':') + 1); - std::string path = host_path(relativePath); + std::string path = host_path(relativePath, true); FileSystem::FindResultsArray results; if (!FileSystem::FindFiles(path.c_str(), "*", FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_FOLDERS | FILESYSTEM_FIND_RELATIVE_PATHS | FILESYSTEM_FIND_HIDDEN_FILES, &results)) @@ -338,16 +403,25 @@ namespace R3000A return 0; } - virtual int read(void* buf) /* Flawfinder: ignore */ + virtual int read(void* buf, bool iomanX) /* Flawfinder: ignore */ { - fio_dirent_t* hostcontent = (fio_dirent_t*)buf; if (dir == results.end()) return 0; - StringUtil::Strlcpy(hostcontent->name, dir->FileName, sizeof(hostcontent->name)); - host_stat(host_path(Path::Combine(basedir, dir->FileName)), &hostcontent->stat); + if (iomanX) + { + fxio_dirent_t* hostcontent = (fxio_dirent_t*)buf; + StringUtil::Strlcpy(hostcontent->name, dir->FileName, sizeof(hostcontent->name)); + host_stat(host_path(Path::Combine(basedir, dir->FileName), true), &hostcontent->stat); + } + else + { + fio_dirent_t* hostcontent = (fio_dirent_t*)buf; + StringUtil::Strlcpy(hostcontent->name, dir->FileName, sizeof(hostcontent->name)); + host_stat(host_path(Path::Combine(basedir, dir->FileName), true), &hostcontent->stat); + } - static_cast(std::next(dir)); /* This is for avoid warning of non used return value */ + dir = std::next(dir); return 1; } @@ -582,19 +656,75 @@ namespace R3000A return 0; } - int dread_HLE() + int _dread_HLE(bool iomanX) { s32 fh = a0; u32 data = a1; - - if (IOManDir* dir = getfd(fh)) + if (iomanX) { - char buf[sizeof(fio_dirent_t)]; - v0 = dir->read(&buf); /* Flawfinder: ignore */ + if (IOManDir* dir = getfd(fh)) + { + char buf[sizeof(fxio_dirent_t)]; + v0 = dir->read(&buf, iomanX); /* Flawfinder: ignore */ - for (s32 i = 0; i < (s32)sizeof(fio_dirent_t); i++) - iopMemWrite8(data + i, buf[i]); + for (s32 i = 0; i < (s32)sizeof(fxio_dirent_t); i++) + iopMemWrite8(data + i, buf[i]); + pc = ra; + return 1; + } + } + else + { + if (IOManDir* dir = getfd(fh)) + { + char buf[sizeof(fio_dirent_t)]; + v0 = dir->read(&buf); /* Flawfinder: ignore */ + + for (s32 i = 0; i < (s32)sizeof(fio_dirent_t); i++) + iopMemWrite8(data + i, buf[i]); + + pc = ra; + return 1; + } + } + return 0; + } + + int dread_HLE() + { + return _dread_HLE(false); + } + + int dreadx_HLE() + { + return _dread_HLE(true); + } + + int _getStat_HLE(bool iomanx) + { + const std::string path = clean_path(Ra0); + u32 data = a1; + + if (is_host(path)) + { + const std::string full_path = host_path(path.substr(path.find(':') + 1), true); + if (iomanx) + { + char buf[sizeof(fxio_stat_t)]; + v0 = host_stat(full_path, (fxio_stat_t*)&buf); + + for (size_t i = 0; i < sizeof(fxio_stat_t); i++) + iopMemWrite8(data + i, buf[i]); + } + else + { + char buf[sizeof(fio_stat_t)]; + v0 = host_stat(full_path, (fio_stat_t*)&buf); + + for (size_t i = 0; i < sizeof(fio_stat_t); i++) + iopMemWrite8(data + i, buf[i]); + } pc = ra; return 1; } @@ -604,23 +734,12 @@ namespace R3000A int getStat_HLE() { - const std::string path = clean_path(Ra0); - u32 data = a1; + return _getStat_HLE(false); + } - if (is_host(path)) - { - const std::string full_path = host_path(path.substr(path.find(':') + 1)); - char buf[sizeof(fio_stat_t)]; - v0 = host_stat(full_path, (fio_stat_t*)&buf); - - for (s32 i = 0; i < (s32)sizeof(fio_stat_t); i++) - iopMemWrite8(data + i, buf[i]); - - pc = ra; - return 1; - } - - return 0; + int getStatx_HLE() + { + return _getStat_HLE(true); } int lseek_HLE() @@ -646,7 +765,7 @@ namespace R3000A if (is_host(full_path)) { const std::string path = full_path.substr(full_path.find(':') + 1); - const std::string file_path(host_path(path)); + const std::string file_path(host_path(path, false)); const bool succeeded = FileSystem::DeleteFilePath(file_path.c_str()); if (!succeeded) Console.Warning("IOPHLE remove_HLE failed for '%s'", file_path.c_str()); @@ -663,7 +782,7 @@ namespace R3000A if (is_host(full_path)) { const std::string path = full_path.substr(full_path.find(':') + 1); - const std::string folder_path(host_path(path)); + const std::string folder_path(host_path(path, false)); // NOTE: Don't allow creating the ELF directory. const bool succeeded = FileSystem::CreateDirectoryPath(folder_path.c_str(), false); if (!succeeded) Console.Warning("IOPHLE mkdir_HLE failed for '%s'", folder_path.c_str()); @@ -704,7 +823,7 @@ namespace R3000A if (is_host(full_path)) { const std::string path = full_path.substr(full_path.find(':') + 1); - const std::string folder_path(host_path(path)); + const std::string folder_path(host_path(path, false)); // NOTE: Don't allow removing the elf directory itself. const bool succeeded = FileSystem::DeleteDirectory(folder_path.c_str()); if (!succeeded) Console.Warning("IOPHLE rmdir_HLE failed for '%s'", folder_path.c_str()); @@ -897,13 +1016,13 @@ namespace R3000A void RegisterIntrHandler_DEBUG() { - if(a0 < std::size(intrname) - 1) + if (a0 < std::size(intrname) - 1) { DevCon.WriteLn(Color_Gray, "RegisterIntrHandler: intr %s, handler %x", intrname[a0], a2); } else { - DevCon.WriteLn(Color_Gray, "RegisterIntrHandler: intr UNKNOWN (%d), handler %x",a0,a2); + DevCon.WriteLn(Color_Gray, "RegisterIntrHandler: intr UNKNOWN (%d), handler %x", a0, a2); } } } // namespace intrman @@ -973,23 +1092,38 @@ namespace R3000A MODULE(sysmem) EXPORT_H( 14, Kprintf) END_MODULE - - MODULE(ioman) - EXPORT_H( 4, open) - EXPORT_H( 5, close) - EXPORT_H( 6, read) - EXPORT_H( 7, write) - EXPORT_H( 8, lseek) - EXPORT_H( 10, remove) - EXPORT_H( 11, mkdir) - EXPORT_H( 12, rmdir) - EXPORT_H( 13, dopen) - EXPORT_H( 14, dclose) - EXPORT_H( 15, dread) - EXPORT_H( 16, getStat) - END_MODULE - // clang-format on + // Special case with ioman and iomanX + // They are mostly compatible excluding stat structures + if(libname == "ioman" || libname == "iomanx") + { + const bool use_ioman = libname == "ioman"; + using namespace ioman; + switch(index) + { + EXPORT_H( 4, open) + EXPORT_H( 5, close) + EXPORT_H( 6, read) + EXPORT_H( 7, write) + EXPORT_H( 8, lseek) + EXPORT_H( 10, remove) + EXPORT_H( 11, mkdir) + EXPORT_H( 12, rmdir) + EXPORT_H( 13, dopen) + EXPORT_H( 14, dclose) + case 15: // dread + if(use_ioman) + return dread_HLE; + else + return dreadx_HLE; + case 16: // getStat + if(use_ioman) + return getStat_HLE; + else + return getStatx_HLE; + } + } + // clang-format on return 0; } diff --git a/pcsx2/IopBios.h b/pcsx2/IopBios.h index 730f013bfb..3e5d47f62e 100644 --- a/pcsx2/IopBios.h +++ b/pcsx2/IopBios.h @@ -63,7 +63,7 @@ public: virtual void close() = 0; - virtual int read(void* buf) { return -IOP_EIO; } /* Flawfinder: ignore */ + virtual int read(void* buf, bool iomanX = false) { return -IOP_EIO; } /* Flawfinder: ignore */ }; typedef int (*irxHLE)(); // return 1 if handled, otherwise 0 diff --git a/pcsx2/IopCounters.cpp b/pcsx2/IopCounters.cpp index 1fa0e4dba4..4aba2606ed 100644 --- a/pcsx2/IopCounters.cpp +++ b/pcsx2/IopCounters.cpp @@ -433,7 +433,7 @@ void psxRcntUpdate() { int i; - g_iopNextEventCycle = psxRegs.cycle + 32; + psxRegs.iopNextEventCycle = psxRegs.cycle + 32; psxNextCounter = 0x7fffffff; psxNextsCounter = psxRegs.cycle; @@ -577,9 +577,9 @@ void psxRcntWcount32(int index, u32 value) } psxCounters[index].count = value; - + if (psxCounters[index].count > psxCounters[index].target) - { + { // Count already higher than Target //DevCon.Warning("32bit Count already higher than target"); psxCounters[index].target |= IOPCNT_FUTURE_TARGET; diff --git a/pcsx2/IopDma.cpp b/pcsx2/IopDma.cpp index 1e7912f7c8..7701138d96 100644 --- a/pcsx2/IopDma.cpp +++ b/pcsx2/IopDma.cpp @@ -20,6 +20,7 @@ #include "IopCounters.h" #include "IopHw.h" #include "IopDma.h" +#include "Sio.h" #include "Sif.h" #include "DEV9/DEV9.h" @@ -54,10 +55,10 @@ static void psxDmaGeneric(u32 madr, u32 bcr, u32 chcr, u32 spuCore) if (psxCounters[6].CycleT < psxNextCounter) psxNextCounter = psxCounters[6].CycleT; - if ((g_iopNextEventCycle - psxNextsCounter) > (u32)psxNextCounter) + if ((psxRegs.iopNextEventCycle - psxNextsCounter) > (u32)psxNextCounter) { //DevCon.Warning("SPU2async Setting new counter branch, old %x new %x ((%x - %x = %x) > %x delta)", g_iopNextEventCycle, psxNextsCounter + psxNextCounter, g_iopNextEventCycle, psxNextsCounter, (g_iopNextEventCycle - psxNextsCounter), psxNextCounter); - g_iopNextEventCycle = psxNextsCounter + psxNextCounter; + psxRegs.iopNextEventCycle = psxNextsCounter + psxNextCounter; } switch (chcr) @@ -224,4 +225,72 @@ void psxDma10(u32 madr, u32 bcr, u32 chcr) SIF1Dma(); } -/* psxDma11 & psxDma 12 are in IopSio2.cpp, along with the appropriate interrupt functions. */ +void psxDma11(u32 madr, u32 bcr, u32 chcr) +{ + unsigned int i, j; + int size = (bcr >> 16) * (bcr & 0xffff); + PSXDMA_LOG("*** DMA 11 - SIO2 in *** %lx addr = %lx size = %lx", chcr, madr, bcr); + // Set dmaBlockSize, so SIO2 knows to count based on the DMA block rather than SEND3 length. + // When SEND3 is written, SIO2 will automatically reset this to zero. + sio2.dmaBlockSize = (bcr & 0xffff) * 4; + + if (chcr != 0x01000201) + { + return; + } + + for (i = 0; i < (bcr >> 16); i++) + { + for (j = 0; j < ((bcr & 0xFFFF) * 4); j++) + { + const u8 data = iopMemRead8(madr); + sio2.Write(data); + madr++; + } + } + + HW_DMA11_MADR = madr; + PSX_INT(IopEvt_Dma11, (size >> 2)); +} + +void psxDMA11Interrupt() +{ + if (HW_DMA11_CHCR & 0x01000000) + { + HW_DMA11_CHCR &= ~0x01000000; + psxDmaInterrupt2(4); + } +} + +void psxDma12(u32 madr, u32 bcr, u32 chcr) +{ + int size = ((bcr >> 16) * (bcr & 0xFFFF)) * 4; + PSXDMA_LOG("*** DMA 12 - SIO2 out *** %lx addr = %lx size = %lx", chcr, madr, size); + + if (chcr != 0x41000200) + { + return; + } + + bcr = size; + + while (bcr > 0) + { + const u8 data = sio2.Read(); + iopMemWrite8(madr, data); + bcr--; + madr++; + } + + HW_DMA12_MADR = madr; + PSX_INT(IopEvt_Dma12, (size >> 2)); +} + +void psxDMA12Interrupt() +{ + if (HW_DMA12_CHCR & 0x01000000) + { + HW_DMA12_CHCR &= ~0x01000000; + psxDmaInterrupt2(5); + } +} diff --git a/pcsx2/IopDma.h b/pcsx2/IopDma.h index 49e3b4e885..6427ab4220 100644 --- a/pcsx2/IopDma.h +++ b/pcsx2/IopDma.h @@ -13,7 +13,7 @@ * If not, see . */ -#pragma once +#pragma once extern void psxDma2(u32 madr, u32 bcr, u32 chcr); extern void psxDma3(u32 madr, u32 bcr, u32 chcr); @@ -23,9 +23,13 @@ extern void psxDma7(u32 madr, u32 bcr, u32 chcr); extern void psxDma8(u32 madr, u32 bcr, u32 chcr); extern void psxDma9(u32 madr, u32 bcr, u32 chcr); extern void psxDma10(u32 madr, u32 bcr, u32 chcr); +extern void psxDma11(u32 madr, u32 bcr, u32 chcr); +extern void psxDma12(u32 madr, u32 bcr, u32 chcr); extern int psxDma4Interrupt(); extern int psxDma7Interrupt(); +extern void psxDMA11Interrupt(); +extern void psxDMA12Interrupt(); extern void dev9Interrupt(); extern void dev9Irq(int cycles); extern void usbInterrupt(); diff --git a/pcsx2/IopGte.cpp b/pcsx2/IopGte.cpp index 3415c40dca..791a4b02e0 100644 --- a/pcsx2/IopGte.cpp +++ b/pcsx2/IopGte.cpp @@ -163,11 +163,11 @@ __inline unsigned long MFC2(int reg) { gteORGB = (((gteIR1 >> 7) & 0x1f)) | (((gteIR2 >> 7) & 0x1f) << 5) | (((gteIR3 >> 7) & 0x1f) << 10); - // gteORGB = (gteIR1 ) | - // (gteIR2 << 5) | + // gteORGB = (gteIR1 ) | + // (gteIR2 << 5) | // (gteIR3 << 10); - // gteORGB = ((gteIR1 & 0xf80)>>7) | - // ((gteIR2 & 0xf80)>>2) | + // gteORGB = ((gteIR1 & 0xf80)>>7) | + // ((gteIR2 & 0xf80)>>2) | // ((gteIR3 & 0xf80)<<3); return gteORGB; @@ -453,7 +453,7 @@ __inline double limG1(double x) { if (x > 1023.0) { x = 1023.0; gteFLAG |= (1 << 14); } else if (x < -1024.0) { x = -1024.0; gteFLAG |= (1 << 14); } - + return (x); } @@ -494,10 +494,10 @@ __inline s32 FlimE(s32 x) { _LIMX(0, 65535, 12); } __inline s32 FlimG1(s64 x) { if (x > 2147483647) { gteFLAG |= (1 << 16); } else if (x < (s64)0xffffffff80000000) { gteFLAG |= (1 << 15); } - + if (x > 1023) { x = 1023; gteFLAG |= (1 << 14); } - else if (x < -1024) { x = -1024; gteFLAG |= (1 << 14); } - + else if (x < -1024) { x = -1024; gteFLAG |= (1 << 14); } + return (x); } @@ -508,8 +508,8 @@ __inline s32 FlimG2(s64 x) { if (x > 1023) { x = 1023; gteFLAG |= (1 << 13); } else - if (x < -1024) { x = -1024; gteFLAG |= (1 << 13); } - + if (x < -1024) { x = -1024; gteFLAG |= (1 << 13); } + return (x); } @@ -2475,7 +2475,7 @@ void gteDPCS() { } void gteDPCT() { - // unsigned long C,R,G,B; + // unsigned long C,R,G,B; // double RR0,GG0,BB0; #ifdef GTE_DUMP static int sample = 0; sample++; diff --git a/pcsx2/IopHw.cpp b/pcsx2/IopHw.cpp index 17d564ebc1..88e9ecd063 100644 --- a/pcsx2/IopHw.cpp +++ b/pcsx2/IopHw.cpp @@ -21,7 +21,6 @@ #include "iR5900.h" #include "Sio.h" #include "Mdec.h" -#include "IopSio2.h" #include "IopCounters.h" #include "IopHw.h" #include "IopDma.h" @@ -42,8 +41,8 @@ void psxHwReset() { cdrReset(); cdvdReset(); psxRcntInit(); - sioInit(); - //sio2Reset(); + sio0.FullReset(); + sio2.FullReset(); } __fi u8 psxHw4Read8(u32 add) diff --git a/pcsx2/IopMem.cpp b/pcsx2/IopMem.cpp index 4da002a371..1332a9eb7f 100644 --- a/pcsx2/IopMem.cpp +++ b/pcsx2/IopMem.cpp @@ -34,20 +34,34 @@ alignas(__pagesize) u8 iopHw[Ps2MemSize::IopHardware]; // iopMemoryReserve // -------------------------------------------------------------------------------------- iopMemoryReserve::iopMemoryReserve() - : _parent( "IOP Main Memory (2mb)", sizeof(*iopMem) ) + : _parent("IOP Main Memory (2mb)") { } -void iopMemoryReserve::Reserve(VirtualMemoryManagerPtr allocator) +iopMemoryReserve::~iopMemoryReserve() { - _parent::Reserve(std::move(allocator), HostMemoryMap::IOPmemOffset); - //_parent::Reserve(EmuConfig.HostMap.IOP); + Release(); } -void iopMemoryReserve::Commit() +void iopMemoryReserve::Assign(VirtualMemoryManagerPtr allocator) { - _parent::Commit(); - iopMem = (IopVM_MemoryAllocMess*)m_reserve.GetPtr(); + psxMemWLUT = (uptr*)_aligned_malloc(0x2000 * sizeof(uptr) * 2, 16); + if (!psxMemWLUT) + pxFailRel("Failed to allocate IOP memory lookup table"); + + psxMemRLUT = psxMemWLUT + 0x2000; //(uptr*)_aligned_malloc(0x10000 * sizeof(uptr),16); + + VtlbMemoryReserve::Assign(std::move(allocator), HostMemoryMap::IOPmemOffset, sizeof(*iopMem)); + iopMem = reinterpret_cast(GetPtr()); +} + +void iopMemoryReserve::Release() +{ + _parent::Release(); + + safe_aligned_free(psxMemWLUT); + psxMemRLUT = nullptr; + iopMem = nullptr; } // Note! Resetting the IOP's memory state is dependent on having *all* psx memory allocated, @@ -58,12 +72,6 @@ void iopMemoryReserve::Reset() pxAssert( iopMem ); - if (!psxMemWLUT) - { - psxMemWLUT = (uptr*)_aligned_malloc(0x2000 * sizeof(uptr) * 2, 16); - psxMemRLUT = psxMemWLUT + 0x2000; //(uptr*)_aligned_malloc(0x10000 * sizeof(uptr),16); - } - DbgCon.WriteLn("IOP resetting main memory..."); memset(psxMemWLUT, 0, 0x2000 * sizeof(uptr) * 2); // clears both allocations, RLUT and WLUT @@ -91,17 +99,17 @@ void iopMemoryReserve::Reset() //psxMemWLUT[0xbf80] = (uptr)iopHw; // Read-only memory areas, so don't map WLUT for these... - for (int i=0; i<0x0040; i++) + for (int i = 0; i < 0x0040; i++) { psxMemWLUT[i + 0x2000 + 0x1fc0] = (uptr)&eeMem->ROM[i << 16]; } - for (int i=0; i<0x0004; i++) + for (int i = 0; i < 0x0040; i++) { psxMemWLUT[i + 0x2000 + 0x1e00] = (uptr)&eeMem->ROM1[i << 16]; } - for (int i = 0; i < 0x0008; i++) + for (int i = 0; i < 0x0008; i++) { psxMemWLUT[i + 0x2000 + 0x1e40] = (uptr)&eeMem->ROM2[i << 16]; } @@ -115,16 +123,6 @@ void iopMemoryReserve::Reset() //for (i=0; i<0x0008; i++) psxMemWLUT[i + 0xbfc0] = (uptr)&psR[i << 16]; } -void iopMemoryReserve::Decommit() -{ - _parent::Decommit(); - - safe_aligned_free(psxMemWLUT); - psxMemRLUT = NULL; - iopMem = NULL; -} - - u8 iopMemRead8(u32 mem) { mem &= 0x1fffffff; diff --git a/pcsx2/IopSio2.cpp b/pcsx2/IopSio2.cpp deleted file mode 100644 index ec61547507..0000000000 --- a/pcsx2/IopSio2.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2010 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - - -#include "PrecompiledHeader.h" -#include "Common.h" - -#include "Sio.h" -#include "sio_internal.h" -#include "IopSio2.h" -#include "IopHw.h" -#include "IopDma.h" - -sio2Struct sio2; - -/* -w [8268]=0x3bc sio2_start/sio2man -r [8270] padman_start/padman - padman->7480[00]=bit4; - padman->7480[13]=bit5; - packetExchange(&703F8); -w [8268]|=0x0C; -........ -w [8268]|=0x01; - -only recv2 & dataout influences padman -*/ - -// 0xBF808200,0xBF808204,0xBF808208,0xBF80820C, -// 0xBF808210,0xBF808214,0xBF808218,0xBF80821C, packet->sendArray3 -// 0xBF808220,0xBF808224,0xBF808228,0xBF80822C, call12/13_s/getparams -// 0xBF808230,0xBF808234,0xBF808238,0xBF80823C, - -// 0xBF808240,0xBF808248,0xBF808250,0xBF808258, packet->sendArray1/call_7/8 -// 0xBF808244,0xBF80824C,0xBF808254,0xBF80825C, packet->sendArray2/call_9/10 - -// 0xBF808260, serial data/fifo in/out s/get8260_datain/out packet->sendbuf(nomem!) -// 0xBF808268, ctrl s/get8268_ctrl - -// 0xBF80826C, packet->recv1/2/3 get826C_recv1, get8270_recv2, get8274_recv3 -// 0xBF808270,0xBF808274, - -// 0xBF808278,0xBF80827C, s/get8278, s/get827C -// 0xBF808280 interrupt related s/get8280_intr - - -void sio2Reset() { - DevCon.WriteLn( "Sio2 Reset" ); - memzero(sio2); - sio2.packet.recvVal1 = 0x1D100; // Nothing is connected at start -} - -u32 sio2_getRecv1() { - PAD_LOG("Reading Recv1 = %x",sio2.packet.recvVal1); - - return sio2.packet.recvVal1; -} - -u32 sio2_getRecv2() { - PAD_LOG("Reading Recv2 = %x",0xF); - - return 0xf; -}//0, 0x10, 0x20, 0x10 | 0x20; bits 4 & 5 - -u32 sio2_getRecv3() { - if(sio2.packet.recvVal3 == 0x8C || sio2.packet.recvVal3 == 0x8b || - sio2.packet.recvVal3 == 0x83) - { - PAD_LOG("Reading Recv3 = %x",sio2.packet.recvVal3); - - sio.packetsize = sio2.packet.recvVal3; - sio2.packet.recvVal3 = 0; // Reset - return sio.packetsize; - } - else - { - PAD_LOG("Reading Recv3 = %x",sio.packetsize << 16); - - return sio.packetsize << 16; - } -} - -void sio2_setSend1(u32 index, u32 value){sio2.packet.sendArray1[index]=value;} //0->3 -u32 sio2_getSend1(u32 index){return sio2.packet.sendArray1[index];} //0->3 -void sio2_setSend2(u32 index, u32 value){sio2.packet.sendArray2[index]=value;} //0->3 -u32 sio2_getSend2(u32 index){return sio2.packet.sendArray2[index];} //0->3 - -void sio2_setSend3(u32 index, u32 value) -{ -// int i; - sio2.packet.sendArray3[index]=value; -// if (index==15){ -// for (i=0; i<4; i++){PAD_LOG("0x%08X ", sio2.packet.sendArray1[i]);}PAD_LOG("\n"); -// for (i=0; i<4; i++){PAD_LOG("0x%08X ", sio2.packet.sendArray2[i]);}PAD_LOG("\n"); -// for (i=0; i<8; i++){PAD_LOG("0x%08X ", sio2.packet.sendArray3[i]);}PAD_LOG("\n"); -// for ( ; i<16; i++){PAD_LOG("0x%08X ", sio2.packet.sendArray3[i]);}PAD_LOG("\n"); - PAD_LOG("[%d] : 0x%08X", index,sio2.packet.sendArray3[index]); -// } -} //0->15 - -u32 sio2_getSend3(u32 index) {return sio2.packet.sendArray3[index];} //0->15 - -void sio2_setCtrl(u32 value){ - sio2.ctrl=value; - if (sio2.ctrl & 1){ //recv packet - //handle data that had been sent - - iopIntcIrq( 17 ); - //SBUS - sio2.recvIndex=0; - sio2.ctrl &= ~1; - } else { // send packet - //clean up - sio2.packet.sendSize=0; //reset size - sio2.cmdport=0; - sio2.cmdlength=0; - sioWriteCtrl16(SIO_RESET); - } -} -u32 sio2_getCtrl(){return sio2.ctrl;} - -void sio2_setIntr(u32 value){sio2.intr=value;} -u32 sio2_getIntr(){ - return sio2.intr; -} - -void sio2_set8278(u32 value){sio2._8278=value;} -u32 sio2_get8278(){return sio2._8278;} -void sio2_set827C(u32 value){sio2._827C=value;} -u32 sio2_get827C(){return sio2._827C;} - -void sio2_serialIn(u8 value){ - u16 ctrl=0x0002; - if (sio2.packet.sendArray3[sio2.cmdport] && (sio2.cmdlength==0)) - { - - sio2.cmdlength=(sio2.packet.sendArray3[sio2.cmdport] >> 8) & 0x1FF; - ctrl &= ~0x2000; - ctrl |= (sio2.packet.sendArray3[sio2.cmdport] & 1) << 13; - //sioWriteCtrl16(SIO_RESET); - sioWriteCtrl16(ctrl); - PSXDMA_LOG("sio2_fifoIn: ctrl = %x, cmdlength = %x, cmdport = %d (%x)", ctrl, sio2.cmdlength, sio2.cmdport, sio2.packet.sendArray3[sio2.cmdport]); - - sio2.cmdport++; - } - - if (sio2.cmdlength) sio2.cmdlength--; - sioWrite8(value); - - if (sio2.packet.sendSize >= BUFSIZE) {//asadr - Console.Warning("*PCSX2*: sendSize >= %d", BUFSIZE); - } else { - sio2.buf[sio2.packet.sendSize] = sioRead8(); - sio2.packet.sendSize++; - } -} -extern void SIODMAWrite(u8 value); - -void sio2_fifoIn(u8 value){ - u16 ctrl=0x0002; - if (sio2.packet.sendArray3[sio2.cmdport] && (sio2.cmdlength==0)) - { - - sio2.cmdlength=(sio2.packet.sendArray3[sio2.cmdport] >> 8) & 0x1FF; - ctrl &= ~0x2000; - ctrl |= (sio2.packet.sendArray3[sio2.cmdport] & 1) << 13; - //sioWriteCtrl16(SIO_RESET); - sioWriteCtrl16(ctrl); - PSXDMA_LOG("sio2_fifoIn: ctrl = %x, cmdlength = %x, cmdport = %d (%x)", ctrl, sio2.cmdlength, sio2.cmdport, sio2.packet.sendArray3[sio2.cmdport]); - - sio2.cmdport++; - } - - if (sio2.cmdlength) sio2.cmdlength--; - SIODMAWrite(value); - - if (sio2.packet.sendSize >= BUFSIZE) {//asadr - Console.WriteLn("*PCSX2*: sendSize >= %d", BUFSIZE); - } else { - sio2.buf[sio2.packet.sendSize] = sioRead8(); - sio2.packet.sendSize++; - } -} - -u8 sio2_fifoOut(){ - if (sio2.recvIndex <= sio2.packet.sendSize){ - //PAD_LOG("READING %x\n",sio2.buf[sio2.recvIndex]); - return sio2.buf[sio2.recvIndex++]; - } else { - Console.Error( "*PCSX2*: buffer overrun" ); - } - return 0; // No Data -} - -void SaveStateBase::sio2Freeze() -{ - FreezeTag( "sio2" ); - Freeze(sio2); -} - -///////////////////////////////////////////////// -//////////////////////////////////////////// DMA -///////////////////////////////////////////////// - -void psxDma11(u32 madr, u32 bcr, u32 chcr) { - unsigned int i, j; - int size = (bcr >> 16) * (bcr & 0xffff); - PSXDMA_LOG("*** DMA 11 - SIO2 in *** %lx addr = %lx size = %lx", chcr, madr, bcr); - - if (chcr != 0x01000201) return; - - for(i = 0; i < (bcr >> 16); i++) - { - sio.count = 1; - for(j = 0; j < ((bcr & 0xFFFF) * 4); j++) - { - sio2_fifoIn(iopMemRead8(madr)); - madr++; - if(sio2.packet.sendSize == BUFSIZE) - goto finished; - } - } - -finished: - HW_DMA11_MADR = madr; - PSX_INT(IopEvt_Dma11,(size>>2)); // Interrupts should always occur at the end -} - -void psxDMA11Interrupt() -{ - HW_DMA11_CHCR &= ~0x01000000; - psxDmaInterrupt2(4); -} - -void psxDma12(u32 madr, u32 bcr, u32 chcr) { - int size = ((bcr >> 16) * (bcr & 0xFFFF)) * 4; - PSXDMA_LOG("*** DMA 12 - SIO2 out *** %lx addr = %lx size = %lx", chcr, madr, size); - - if (chcr != 0x41000200) return; - - sio2.recvIndex = 0; // Set To start; saqib - - bcr = size; - while (bcr > 0) { - iopMemWrite8( madr, sio2_fifoOut() ); - bcr--; madr++; - if(sio2.recvIndex == sio2.packet.sendSize) break; - } - HW_DMA12_MADR = madr; - PSX_INT(IopEvt_Dma12,(size>>2)); // Interrupts should always occur at the end -} - -void psxDMA12Interrupt() -{ - HW_DMA12_CHCR &= ~0x01000000; - psxDmaInterrupt2(5); -} - -//#endif diff --git a/pcsx2/IopSio2.h b/pcsx2/IopSio2.h deleted file mode 100644 index adbc3ddc56..0000000000 --- a/pcsx2/IopSio2.h +++ /dev/null @@ -1,91 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2010 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#pragma once - -#define BUFSIZE 8448 - -//from sio2man.c - -struct SIO2_packet { - unsigned int recvVal1; // 0x00 - unsigned int sendArray1[4]; // 0x04-0x10 - unsigned int sendArray2[4]; // 0x14-0x20 - - unsigned int recvVal2; // 0x24 - - unsigned int sendArray3[16]; // 0x28-0x64 - - unsigned int recvVal3; // 0x68 - - int sendSize; // 0x6C - int recvSize; // 0x70 - - unsigned char *sendBuf; // 0x74 - unsigned char *recvBuf; // 0x78 - - unsigned int dmacAddress1; - unsigned int dmacSize1; - unsigned int dmacCount1; - unsigned int dmacAddress2; - unsigned int dmacSize2; - unsigned int dmacCount2; -}; - -struct sio2Struct { - struct SIO2_packet packet; - u32 ctrl; - u32 intr; - u32 _8278, _827C; - int recvIndex; - u32 hackedRecv; - int cmdport; - int cmdlength; //length of a command sent to a port - //is less_equal than the dma send size - u8 buf[BUFSIZE]; -}; - -extern sio2Struct sio2; - -void sio2Reset(); - -u32 sio2_getRecv1(); -u32 sio2_getRecv2(); -u32 sio2_getRecv3(); -void sio2_setSend1(u32 index, u32 value); //0->3 -u32 sio2_getSend1(u32 index); //0->3 -void sio2_setSend2(u32 index, u32 value); //0->3 -u32 sio2_getSend2(u32 index); //0->3 -void sio2_setSend3(u32 index, u32 value); //0->15 -u32 sio2_getSend3(u32 index); //0->15 - -void sio2_setCtrl(u32 value); -u32 sio2_getCtrl(); -void sio2_setIntr(u32 value); -u32 sio2_getIntr(); -void sio2_set8278(u32 value); -u32 sio2_get8278(); -void sio2_set827C(u32 value); -u32 sio2_get827C(); - -void sio2_serialIn(u8 value); -void sio2_fifoIn(u8 value); -u8 sio2_fifoOut(); - -void psxDma11(u32 madr, u32 bcr, u32 chcr); -void psxDma12(u32 madr, u32 bcr, u32 chcr); - -void psxDMA11Interrupt(); -void psxDMA12Interrupt(); diff --git a/pcsx2/MMI.cpp b/pcsx2/MMI.cpp index 482cb053a8..50575736b4 100644 --- a/pcsx2/MMI.cpp +++ b/pcsx2/MMI.cpp @@ -183,7 +183,7 @@ void PMFHL() { case 0x02: // SLW { s64 TempS64 = ((u64)cpuRegs.HI.UL[0] << 32) | (u64)cpuRegs.LO.UL[0]; - + if (TempS64 >= 0x000000007fffffffLL) { cpuRegs.GPR.r[_Rd_].UD[0] = 0x000000007fffffffLL; } else if (TempS64 <= -0x80000000LL) { diff --git a/pcsx2/MTGS.cpp b/pcsx2/MTGS.cpp index 0e36b7b2fa..2587773aa9 100644 --- a/pcsx2/MTGS.cpp +++ b/pcsx2/MTGS.cpp @@ -28,9 +28,12 @@ #include "Host.h" #include "HostDisplay.h" +#include "IconsFontAwesome5.h" #ifndef PCSX2_CORE #include "gui/Dialogs/ModalPopups.h" +#else +#include "VMManager.h" #endif // Uncomment this to enable profiling of the GS RingBufferCopy function. @@ -135,7 +138,7 @@ void SysMtgsThread::ThreadEntryPoint() m_sem_event.WaitForWork(); } - + // try initializing.. this could fail const bool opened = TryOpenGS(); m_open_flag.store(opened, std::memory_order_release); @@ -242,9 +245,13 @@ void SysMtgsThread::PostVsyncStart(bool registers_written) void SysMtgsThread::InitAndReadFIFO(u8* mem, u32 qwc) { - if (EmuConfig.GS.HWDisableReadbacks && GSConfig.UseHardwareRenderer()) + if (EmuConfig.GS.HWDownloadMode >= GSHardwareDownloadMode::Unsynchronized && GSConfig.UseHardwareRenderer()) { - GSReadLocalMemoryUnsync(mem, qwc, vif1.BITBLTBUF._u64, vif1.TRXPOS._u64, vif1.TRXREG._u64); + if (EmuConfig.GS.HWDownloadMode == GSHardwareDownloadMode::Unsynchronized) + GSReadLocalMemoryUnsync(mem, qwc, vif1.BITBLTBUF._u64, vif1.TRXPOS._u64, vif1.TRXREG._u64); + else + std::memset(mem, 0, qwc * 16); + return; } @@ -296,9 +303,23 @@ void SysMtgsThread::MainLoop() // is very optimized (only 1 instruction test in most cases), so no point in trying // to avoid it. +#ifdef PCSX2_CORE + if (m_run_idle_flag.load(std::memory_order_acquire) && VMManager::GetState() != VMState::Running) + { + if (!m_sem_event.CheckForWork()) + GSPresentCurrentFrame(); + } + else + { + mtvu_lock.unlock(); + m_sem_event.WaitForWork(); + mtvu_lock.lock(); + } +#else mtvu_lock.unlock(); m_sem_event.WaitForWork(); mtvu_lock.lock(); +#endif if (!m_open_flag.load(std::memory_order_acquire)) break; @@ -596,7 +617,7 @@ void SysMtgsThread::WaitGS(bool syncRegs, bool weakWait, bool isMTVU) // we don't want to access the content of the queue SetEvent(); - if (weakWait) + if (weakWait && isMTVU) { // On weakWait we will stop waiting on the MTGS thread if the // MTGS thread has processed a vu1 xgkick packet, or is pending on @@ -623,9 +644,10 @@ void SysMtgsThread::WaitGS(bool syncRegs, bool weakWait, bool isMTVU) pxFailRel("MTGS Thread Died"); } + assert(!(weakWait && syncRegs) && "No synchronization for this!"); + if (syncRegs) { - std::unique_lock lock(m_mtx_WaitGS); // Completely synchronize GS and MTGS register states. memcpy(RingBuffer.Regs, PS2MEM_GS, sizeof(RingBuffer.Regs)); } @@ -915,14 +937,14 @@ void SysMtgsThread::ApplySettings() RunOnGSThread([opts = EmuConfig.GS]() { GSUpdateConfig(opts); + g_host_display->SetVSync(Host::GetEffectiveVSyncMode()); }); // We need to synchronize the thread when changing any settings when the download mode // is unsynchronized, because otherwise we might potentially read in the middle of // the GS renderer being reopened. - if (EmuConfig.GS.HWDisableReadbacks) + if (EmuConfig.GS.HWDownloadMode == GSHardwareDownloadMode::Unsynchronized) WaitGS(false, false, false); - } void SysMtgsThread::ResizeDisplayWindow(int width, int height, float scale) @@ -932,6 +954,12 @@ void SysMtgsThread::ResizeDisplayWindow(int width, int height, float scale) GSResetAPIState(); Host::ResizeHostDisplay(width, height, scale); GSRestoreAPIState(); + +#ifdef PCSX2_CORE + // If we're paused, re-present the current frame at the new window size. + if (VMManager::GetState() == VMState::Paused) + GSPresentCurrentFrame(); +#endif }); } @@ -942,26 +970,38 @@ void SysMtgsThread::UpdateDisplayWindow() GSResetAPIState(); Host::UpdateHostDisplay(); GSRestoreAPIState(); + +#ifdef PCSX2_CORE + // If we're paused, re-present the current frame at the new window size. + if (VMManager::GetState() == VMState::Paused) + GSPresentCurrentFrame(); +#endif }); } -void SysMtgsThread::SetVSync(VsyncMode mode) +void SysMtgsThread::SetVSyncMode(VsyncMode mode) { pxAssertRel(IsOpen(), "MTGS is running"); RunOnGSThread([mode]() { - Host::GetHostDisplay()->SetVSync(mode); + Console.WriteLn("Vsync is %s", mode == VsyncMode::Off ? "OFF" : (mode == VsyncMode::Adaptive ? "ADAPTIVE" : "ON")); + g_host_display->SetVSync(mode); }); } +void SysMtgsThread::UpdateVSyncMode() +{ + SetVSyncMode(Host::GetEffectiveVSyncMode()); +} + void SysMtgsThread::SwitchRenderer(GSRendererType renderer, bool display_message /* = true */) { pxAssertRel(IsOpen(), "MTGS is running"); if (display_message) { - Host::AddKeyedFormattedOSDMessage("SwitchRenderer", 10.0f, "Switching to %s renderer...", - Pcsx2Config::GSOptions::GetRendererName(renderer)); + Host::AddIconOSDMessage("SwitchRenderer", ICON_FA_MAGIC, fmt::format("Switching to {} renderer...", + Pcsx2Config::GSOptions::GetRendererName(renderer)), Host::OSD_INFO_DURATION); } RunOnGSThread([renderer]() { @@ -969,7 +1009,7 @@ void SysMtgsThread::SwitchRenderer(GSRendererType renderer, bool display_message }); // See note in ApplySettings() for reasoning here. - if (EmuConfig.GS.HWDisableReadbacks) + if (EmuConfig.GS.HWDownloadMode == GSHardwareDownloadMode::Unsynchronized) WaitGS(false, false, false); } @@ -981,7 +1021,7 @@ void SysMtgsThread::SetSoftwareRendering(bool software, bool display_message /* new_renderer = EmuConfig.GS.UseHardwareRenderer() ? EmuConfig.GS.Renderer : GSRendererType::Auto; else new_renderer = GSRendererType::SW; - + SwitchRenderer(new_renderer, display_message); } @@ -1003,5 +1043,19 @@ bool SysMtgsThread::SaveMemorySnapshot(u32 width, u32 height, std::vector* void SysMtgsThread::PresentCurrentFrame() { - GSPresentCurrentFrame(); + if (m_run_idle_flag.load(std::memory_order_relaxed)) + { + // If we're running idle, we're going to re-present anyway. + return; + } + + RunOnGSThread([]() { + GSPresentCurrentFrame(); + }); +} + +void SysMtgsThread::SetRunIdle(bool enabled) +{ + // NOTE: Should only be called on the GS thread. + m_run_idle_flag.store(enabled, std::memory_order_release); } diff --git a/pcsx2/MTVU.cpp b/pcsx2/MTVU.cpp index f1c9c323fc..287c954068 100644 --- a/pcsx2/MTVU.cpp +++ b/pcsx2/MTVU.cpp @@ -327,7 +327,7 @@ __fi void VU_Thread::Write(u32 val) m_write_pos += 1; } -__fi void VU_Thread::Write(void* src, u32 size) +__fi void VU_Thread::Write(const void* src, u32 size) { memcpy(GetWritePtr(), src, size); m_write_pos += size_u32(size); @@ -362,7 +362,7 @@ void VU_Thread::Get_MTVUChanges() u32 interrupts = mtvuInterrupts.load(std::memory_order_relaxed); if (!interrupts) return; - + if (interrupts & InterruptFlagSignal) { std::atomic_thread_fence(std::memory_order_acquire); @@ -415,8 +415,9 @@ void VU_Thread::Get_MTVUChanges() if (interrupts & InterruptFlagVUEBit) { mtvuInterrupts.fetch_and(~InterruptFlagVUEBit, std::memory_order_relaxed); - - VU0.VI[REG_VPU_STAT].UL &= ~0xFF00; + + if(INSTANT_VU1) + VU0.VI[REG_VPU_STAT].UL &= ~0xFF00; //DevCon.Warning("E-Bit registered %x", VU0.VI[REG_VPU_STAT].UL); } if (interrupts & InterruptFlagVUTBit) @@ -458,13 +459,20 @@ void VU_Thread::ExecuteVU(u32 vu_addr, u32 vif_top, u32 vif_itop, u32 fbrst) CommitWritePos(); gifUnit.TransferGSPacketData(GIF_TRANS_MTVU, NULL, 0); KickStart(); - u32 cycles = std::min(Get_vuCycles(), 3000u); - cpuRegs.cycle += cycles * EmuConfig.Speedhacks.EECycleSkip; - VU0.cycle += cycles * EmuConfig.Speedhacks.EECycleSkip; + u32 cycles = std::max(Get_vuCycles(), 4u); + u32 skip_cycles = std::min(cycles, 3000u); + cpuRegs.cycle += skip_cycles * EmuConfig.Speedhacks.EECycleSkip; + VU0.cycle += skip_cycles * EmuConfig.Speedhacks.EECycleSkip; Get_MTVUChanges(); + + if (!INSTANT_VU1) + { + VU0.VI[REG_VPU_STAT].UL |= 0x100; + CPU_INT(VU_MTVU_BUSY, cycles); + } } -void VU_Thread::VifUnpack(vifStruct& _vif, VIFregisters& _vifRegs, u8* data, u32 size) +void VU_Thread::VifUnpack(vifStruct& _vif, VIFregisters& _vifRegs, const u8* data, u32 size) { MTVU_LOG("MTVU - VifUnpack!"); u32 vif_copy_size = (uptr)&_vif.StructEnd - (uptr)&_vif.tag; @@ -478,7 +486,7 @@ void VU_Thread::VifUnpack(vifStruct& _vif, VIFregisters& _vifRegs, u8* data, u32 KickStart(); } -void VU_Thread::WriteMicroMem(u32 vu_micro_addr, void* data, u32 size) +void VU_Thread::WriteMicroMem(u32 vu_micro_addr, const void* data, u32 size) { MTVU_LOG("MTVU - WriteMicroMem!"); ReserveSpace(3 + size_u32(size)); @@ -490,7 +498,7 @@ void VU_Thread::WriteMicroMem(u32 vu_micro_addr, void* data, u32 size) KickStart(); } -void VU_Thread::WriteDataMem(u32 vu_data_addr, void* data, u32 size) +void VU_Thread::WriteDataMem(u32 vu_data_addr, const void* data, u32 size) { MTVU_LOG("MTVU - WriteDataMem!"); ReserveSpace(3 + size_u32(size)); diff --git a/pcsx2/MTVU.h b/pcsx2/MTVU.h index 410e8f5509..b77d9af709 100644 --- a/pcsx2/MTVU.h +++ b/pcsx2/MTVU.h @@ -45,7 +45,7 @@ class VU_Thread final { public: alignas(16) vifStruct vif; alignas(16) VIFregisters vifRegs; - Threading::KernelSemaphore semaXGkick; + Threading::UserspaceSemaphore semaXGkick; std::atomic vuCycles[4]; // Used for VU cycle stealing hack u32 vuCycleIdx; // Used for VU cycle stealing hack u32 vuFBRST; @@ -66,6 +66,7 @@ public: ~VU_Thread(); __fi const Threading::ThreadHandle& GetThreadHandle() const { return m_thread; } + __fi bool IsOpen() const { return m_thread.Joinable(); } /// Ensures the VU thread is started. void Open(); @@ -88,18 +89,18 @@ public: void ExecuteVU(u32 vu_addr, u32 vif_top, u32 vif_itop, u32 fbrst); - void VifUnpack(vifStruct& _vif, VIFregisters& _vifRegs, u8* data, u32 size); + void VifUnpack(vifStruct& _vif, VIFregisters& _vifRegs, const u8* data, u32 size); // Writes to VU's Micro Memory (size in bytes) - void WriteMicroMem(u32 vu_micro_addr, void* data, u32 size); + void WriteMicroMem(u32 vu_micro_addr, const void* data, u32 size); // Writes to VU's Data Memory (size in bytes) - void WriteDataMem(u32 vu_data_addr, void* data, u32 size); + void WriteDataMem(u32 vu_data_addr, const void* data, u32 size); void WriteVIRegs(REG_VI* viRegs); void WriteVFRegs(VECTOR* vfRegs); - + void WriteCol(vifStruct& _vif); void WriteRow(vifStruct& _vif); @@ -123,7 +124,7 @@ private: void ReadRegs(VIFregisters* dest); void Write(u32 val); - void Write(void* src, u32 size); + void Write(const void* src, u32 size); void WriteRegs(VIFregisters* src); u32 Get_vuCycles(); diff --git a/pcsx2/Memory.cpp b/pcsx2/Memory.cpp index 670f411151..5afdceb849 100644 --- a/pcsx2/Memory.cpp +++ b/pcsx2/Memory.cpp @@ -154,10 +154,9 @@ void memMapPhy() vtlb_MapHandler(null_handler, Ps2MemSize::MainRam, 0x10000000 - Ps2MemSize::MainRam); // Various ROMs (all read-only) - vtlb_MapBlock(eeMem->ROM, 0x1fc00000,Ps2MemSize::Rom); - vtlb_MapBlock(eeMem->ROM1, 0x1e000000,Ps2MemSize::Rom1); - vtlb_MapBlock(eeMem->ROM2, 0x1e400000,Ps2MemSize::Rom2); - vtlb_MapBlock(eeMem->EROM, 0x1e040000,Ps2MemSize::ERom); + vtlb_MapBlock(eeMem->ROM, 0x1fc00000, Ps2MemSize::Rom); + vtlb_MapBlock(eeMem->ROM1, 0x1e000000, Ps2MemSize::Rom1); + vtlb_MapBlock(eeMem->ROM2, 0x1e400000, Ps2MemSize::Rom2); // IOP memory // (used by the EE Bios Kernel during initial hardware initialization, Apps/Games @@ -224,9 +223,9 @@ static mem32_t nullRead32(u32 mem) { MEM_LOG("Read uninstalled memory at address %08x", mem); return 0; } -static RETURNS_R64 nullRead64(u32 mem) { +static mem64_t nullRead64(u32 mem) { MEM_LOG("Read uninstalled memory at address %08x", mem); - return r64_zero(); + return 0; } static RETURNS_R128 nullRead128(u32 mem) { MEM_LOG("Read uninstalled memory at address %08x", mem); @@ -244,11 +243,11 @@ static void nullWrite32(u32 mem, mem32_t value) { MEM_LOG("Write uninstalled memory at address %08x", mem); } -static void nullWrite64(u32 mem, const mem64_t *value) +static void nullWrite64(u32 mem, mem64_t value) { MEM_LOG("Write uninstalled memory at address %08x", mem); } -static void nullWrite128(u32 mem, const mem128_t *value) +static void TAKES_R128 nullWrite128(u32 mem, r128 value) { MEM_LOG("Write uninstalled memory at address %08x", mem); } @@ -328,18 +327,18 @@ static mem32_t _ext_memRead32(u32 mem) } template -static RETURNS_R64 _ext_memRead64(u32 mem) +static u64 _ext_memRead64(u32 mem) { switch (p) { case 6: // gsm - return r64_from_u64(gsRead64(mem)); + return gsRead64(mem); default: break; } MEM_LOG("Unknown Memory read64 from address %8.8x", mem); cpuTlbMissR(mem, cpuRegs.branch); - return r64_zero(); + return 0; } template @@ -416,7 +415,7 @@ static void _ext_memWrite32(u32 mem, mem32_t value) } template -static void _ext_memWrite64(u32 mem, const mem64_t* value) +static void _ext_memWrite64(u32 mem, mem64_t value) { /*switch (p) { @@ -427,12 +426,12 @@ static void _ext_memWrite64(u32 mem, const mem64_t* value) // gsWrite64(mem & ~0xa0000000, *value); return; }*/ - MEM_LOG("Unknown Memory write64 to address %x with data %8.8x_%8.8x", mem, (u32)(*value>>32), (u32)*value); + MEM_LOG("Unknown Memory write64 to address %x with data %8.8x_%8.8x", mem, (u32)(value>>32), (u32)value); cpuTlbMissW(mem, cpuRegs.branch); } template -static void _ext_memWrite128(u32 mem, const mem128_t *value) +static void TAKES_R128 _ext_memWrite128(u32 mem, r128 value) { /*switch (p) { //case 1: // hwm @@ -444,7 +443,8 @@ static void _ext_memWrite128(u32 mem, const mem128_t *value) // gsWrite64(mem+8, value[1]); return; }*/ - MEM_LOG("Unknown Memory write128 to address %x with data %8.8x_%8.8x_%8.8x_%8.8x", mem, ((u32*)value)[3], ((u32*)value)[2], ((u32*)value)[1], ((u32*)value)[0]); + alignas(16) const u128 uvalue = r128_to_u128(value); + MEM_LOG("Unknown Memory write128 to address %x with data %8.8x_%8.8x_%8.8x_%8.8x", mem, uvalue._u32[3], uvalue._u32[2], uvalue._u32[1], uvalue._u32[0]); cpuTlbMissW(mem, cpuRegs.branch); } @@ -462,36 +462,36 @@ template static __fi void ClearVuFunc(u32 addr, u32 size) { template static mem8_t vuMicroRead8(u32 addr) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; - + if (vunum && THREAD_VU1) vu1Thread.WaitVU(); return vu->Micro[addr]; } template static mem16_t vuMicroRead16(u32 addr) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; - + if (vunum && THREAD_VU1) vu1Thread.WaitVU(); return *(u16*)&vu->Micro[addr]; } template static mem32_t vuMicroRead32(u32 addr) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; - + if (vunum && THREAD_VU1) vu1Thread.WaitVU(); return *(u32*)&vu->Micro[addr]; } -template static RETURNS_R64 vuMicroRead64(u32 addr) { +template static mem64_t vuMicroRead64(u32 addr) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; - + if (vunum && THREAD_VU1) vu1Thread.WaitVU(); - return r64_load(&vu->Micro[addr]); + return *(u64*)&vu->Micro[addr]; } template static RETURNS_R128 vuMicroRead128(u32 addr) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; if (vunum && THREAD_VU1) vu1Thread.WaitVU(); - + return r128_load(&vu->Micro[addr]); } @@ -500,7 +500,7 @@ template static RETURNS_R128 vuMicroRead128(u32 addr) { template static void vuMicroWrite8(u32 addr,mem8_t data) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; - + if (vunum && THREAD_VU1) { vu1Thread.WriteMicroMem(addr, &data, sizeof(u8)); return; @@ -513,7 +513,7 @@ template static void vuMicroWrite8(u32 addr,mem8_t data) { template static void vuMicroWrite16(u32 addr, mem16_t data) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; - + if (vunum && THREAD_VU1) { vu1Thread.WriteMicroMem(addr, &data, sizeof(u16)); return; @@ -526,7 +526,7 @@ template static void vuMicroWrite16(u32 addr, mem16_t data) { template static void vuMicroWrite32(u32 addr, mem32_t data) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; - + if (vunum && THREAD_VU1) { vu1Thread.WriteMicroMem(addr, &data, sizeof(u32)); return; @@ -536,31 +536,33 @@ template static void vuMicroWrite32(u32 addr, mem32_t data) { *(u32*)&vu->Micro[addr] =data; } } -template static void vuMicroWrite64(u32 addr, const mem64_t* data) { +template static void vuMicroWrite64(u32 addr, mem64_t data) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; if (vunum && THREAD_VU1) { - vu1Thread.WriteMicroMem(addr, (void*)data, sizeof(u64)); + vu1Thread.WriteMicroMem(addr, &data, sizeof(u64)); return; } - - if (*(u64*)&vu->Micro[addr]!=data[0]) { + + if (*(u64*)&vu->Micro[addr]!=data) { ClearVuFunc(addr, 8); - *(u64*)&vu->Micro[addr] =data[0]; + *(u64*)&vu->Micro[addr] =data; } } -template static void vuMicroWrite128(u32 addr, const mem128_t* data) { +template static void TAKES_R128 vuMicroWrite128(u32 addr, r128 data) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; + const u128 udata = r128_to_u128(data); + if (vunum && THREAD_VU1) { - vu1Thread.WriteMicroMem(addr, (void*)data, sizeof(u128)); + vu1Thread.WriteMicroMem(addr, &udata, sizeof(u128)); return; } - if ((u128&)vu->Micro[addr]!=*data) { + if ((u128&)vu->Micro[addr]!=udata) { ClearVuFunc(addr, 16); - CopyQWC(&vu->Micro[addr],data); + r128_store_unaligned(&vu->Micro[addr],data); } } @@ -583,11 +585,11 @@ template static mem32_t vuDataRead32(u32 addr) { if (vunum && THREAD_VU1) vu1Thread.WaitVU(); return *(u32*)&vu->Mem[addr]; } -template static RETURNS_R64 vuDataRead64(u32 addr) { +template static mem64_t vuDataRead64(u32 addr) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; if (vunum && THREAD_VU1) vu1Thread.WaitVU(); - return r64_load(&vu->Mem[addr]); + return *(u64*)&vu->Mem[addr]; } template static RETURNS_R128 vuDataRead128(u32 addr) { VURegs* vu = vunum ? &VU1 : &VU0; @@ -624,23 +626,24 @@ template static void vuDataWrite32(u32 addr, mem32_t data) { } *(u32*)&vu->Mem[addr] = data; } -template static void vuDataWrite64(u32 addr, const mem64_t* data) { +template static void vuDataWrite64(u32 addr, mem64_t data) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; if (vunum && THREAD_VU1) { - vu1Thread.WriteDataMem(addr, (void*)data, sizeof(u64)); + vu1Thread.WriteDataMem(addr, &data, sizeof(u64)); return; } - *(u64*)&vu->Mem[addr] = data[0]; + *(u64*)&vu->Mem[addr] = data; } -template static void vuDataWrite128(u32 addr, const mem128_t* data) { +template static void TAKES_R128 vuDataWrite128(u32 addr, r128 data) { VURegs* vu = vunum ? &VU1 : &VU0; addr &= vunum ? 0x3fff: 0xfff; if (vunum && THREAD_VU1) { - vu1Thread.WriteDataMem(addr, (void*)data, sizeof(u128)); + alignas(16) const u128 udata = r128_to_u128(data); + vu1Thread.WriteDataMem(addr, &udata, sizeof(u128)); return; } - CopyQWC(&vu->Mem[addr], data); + r128_store_unaligned(&vu->Mem[addr], data); } @@ -712,30 +715,31 @@ void memBindConditionalHandlers() // eeMemoryReserve (implementations) // -------------------------------------------------------------------------------------- eeMemoryReserve::eeMemoryReserve() - : _parent( "EE Main Memory", sizeof(*eeMem) ) + : _parent("EE Main Memory") { } -void eeMemoryReserve::Reserve(VirtualMemoryManagerPtr allocator) +eeMemoryReserve::~eeMemoryReserve() { - _parent::Reserve(std::move(allocator), HostMemoryMap::EEmemOffset); - //_parent::Reserve(EmuConfig.HostMap.IOP); + Release(); } -void eeMemoryReserve::Commit() +void eeMemoryReserve::Assign(VirtualMemoryManagerPtr allocator) { - _parent::Commit(); - eeMem = (EEVM_MemoryAllocMess*)m_reserve.GetPtr(); + _parent::Assign(std::move(allocator), HostMemoryMap::EEmemOffset, sizeof(*eeMem)); + eeMem = reinterpret_cast(GetPtr()); + + if (!mmap_faultHandler) + { + pxAssert(Source_PageFault); + mmap_faultHandler = new mmap_PageFaultHandler(); + } } + // Resets memory mappings, unmaps TLBs, reloads bios roms, etc. void eeMemoryReserve::Reset() { - if(!mmap_faultHandler) { - pxAssert(Source_PageFault); - mmap_faultHandler = new mmap_PageFaultHandler(); - } - _parent::Reset(); // Note!! Ideally the vtlb should only be initialized once, and then subsequent @@ -765,7 +769,7 @@ void eeMemoryReserve::Reset() vu0_micro_mem = vtlb_RegisterHandlerTempl1(vuMicro,0); vu1_micro_mem = vtlb_RegisterHandlerTempl1(vuMicro,1); vu1_data_mem = (1||THREAD_VU1) ? vtlb_RegisterHandlerTempl1(vuData,1) : 0; - + ////////////////////////////////////////////////////////////////////////////////////////// // IOP's "secret" Hardware Register mapping, accessible from the EE (and meant for use // by debugging or BIOS only). The IOP's hw regs are divided into three main pages in @@ -797,7 +801,7 @@ void eeMemoryReserve::Reset() // psHw Optimized Mappings // The HW Registers have been split into pages to improve optimization. - + #define hwHandlerTmpl(page) \ hwRead8, hwRead16, hwRead32, hwRead64, hwRead128, \ hwWrite8, hwWrite16,hwWrite32,hwWrite64,hwWrite128 @@ -860,25 +864,20 @@ void eeMemoryReserve::Reset() constexpr bool needs_bios = true; #endif + // TODO(Stenzek): Move BIOS loading out and far away... if (needs_bios && !LoadBIOS()) pxFailRel("Failed to load BIOS"); } -void eeMemoryReserve::Decommit() -{ - _parent::Decommit(); - eeMem = NULL; -} - -eeMemoryReserve::~eeMemoryReserve() +void eeMemoryReserve::Release() { safe_delete(mmap_faultHandler); - vtlb_Term(); + eeMem = nullptr; + _parent::Release(); } - // =========================================================================================== -// Memory Protection and Block Checking, vtlb Style! +// Memory Protection and Block Checking, vtlb Style! // =========================================================================================== // For the first time code is recompiled (executed), the PS2 ram page for that code is // protected using Virtual Memory (mprotect). If the game modifies its own code then this @@ -915,7 +914,7 @@ struct vtlb_PageProtectionInfo vtlb_ProtectionMode Mode; }; -alignas(16) static vtlb_PageProtectionInfo m_PageProtectInfo[Ps2MemSize::MainRam >> 12]; +alignas(16) static vtlb_PageProtectionInfo m_PageProtectInfo[Ps2MemSize::MainRam >> __pageshift]; // returns: @@ -931,10 +930,10 @@ vtlb_ProtectionMode mmap_GetRamPageInfo( u32 paddr ) uptr ptr = (uptr)PSM( paddr ); uptr rampage = ptr - (uptr)eeMem->Main; - if (rampage >= Ps2MemSize::MainRam) + if (!ptr || rampage >= Ps2MemSize::MainRam) return ProtMode_NotRequired; //not in ram, no tracking done ... - rampage >>= 12; + rampage >>= __pageshift; return m_PageProtectInfo[rampage].Mode; } @@ -943,11 +942,11 @@ vtlb_ProtectionMode mmap_GetRamPageInfo( u32 paddr ) void mmap_MarkCountedRamPage( u32 paddr ) { pxAssert( eeMem ); - - paddr &= ~0xfff; + + paddr &= ~__pagemask; uptr ptr = (uptr)PSM( paddr ); - int rampage = (ptr - (uptr)eeMem->Main) >> 12; + int rampage = (ptr - (uptr)eeMem->Main) >> __pageshift; // Important: Update the ReverseRamMap here because TLB changes could alter the paddr // mapping into eeMem->Main. @@ -959,11 +958,12 @@ void mmap_MarkCountedRamPage( u32 paddr ) eeRecPerfLog.Write( (m_PageProtectInfo[rampage].Mode == ProtMode_Manual) ? "Re-protecting page @ 0x%05x" : "Protected page @ 0x%05x", - paddr>>12 + paddr>>__pageshift ); m_PageProtectInfo[rampage].Mode = ProtMode_Write; - HostSys::MemProtect( &eeMem->Main[rampage<<12], __pagesize, PageAccess_ReadOnly() ); + HostSys::MemProtect( &eeMem->Main[rampage<<__pageshift], __pagesize, PageAccess_ReadOnly() ); + vtlb_UpdateFastmemProtection(rampage << __pageshift, __pagesize, PageAccess_ReadOnly()); } // offset - offset of address relative to psM. @@ -973,28 +973,54 @@ static __fi void mmap_ClearCpuBlock( uint offset ) { pxAssert( eeMem ); - int rampage = offset >> 12; + int rampage = offset >> __pageshift; // Assertion: This function should never be run on a block that's already under // manual protection. Indicates a logic error in the recompiler or protection code. pxAssertMsg( m_PageProtectInfo[rampage].Mode != ProtMode_Manual, "Attempted to clear a block that is already under manual protection." ); - HostSys::MemProtect( &eeMem->Main[rampage<<12], __pagesize, PageAccess_ReadWrite() ); + HostSys::MemProtect( &eeMem->Main[rampage<<__pageshift], __pagesize, PageAccess_ReadWrite() ); + vtlb_UpdateFastmemProtection(rampage << __pageshift, __pagesize, PageAccess_ReadWrite()); m_PageProtectInfo[rampage].Mode = ProtMode_Manual; - Cpu->Clear( m_PageProtectInfo[rampage].ReverseRamMap, 0x400 ); + Cpu->Clear( m_PageProtectInfo[rampage].ReverseRamMap, __pagesize ); } void mmap_PageFaultHandler::OnPageFaultEvent( const PageFaultInfo& info, bool& handled ) { pxAssert( eeMem ); - // get bad virtual address - uptr offset = info.addr - (uptr)eeMem->Main; - if( offset >= Ps2MemSize::MainRam ) return; + u32 vaddr; + if (CHECK_FASTMEM && vtlb_GetGuestAddress(info.addr, &vaddr)) + { + // this was inside the fastmem area. check if it's a code page + // fprintf(stderr, "Fault on fastmem %p vaddr %08X\n", info.addr, vaddr); - mmap_ClearCpuBlock( offset ); - handled = true; + uptr ptr = (uptr)PSM(vaddr); + uptr offset = (ptr - (uptr)eeMem->Main); + if (ptr && m_PageProtectInfo[offset >> __pageshift].Mode == ProtMode_Write) + { + // fprintf(stderr, "Not backpatching code write at %08X\n", vaddr); + mmap_ClearCpuBlock(offset); + handled = true; + } + else + { + // fprintf(stderr, "Trying backpatching vaddr %08X\n", vaddr); + if (vtlb_BackpatchLoadStore(info.pc, info.addr)) + handled = true; + } + } + else + { + // get bad virtual address + uptr offset = info.addr - (uptr)eeMem->Main; + if (offset >= Ps2MemSize::MainRam) + return; + + mmap_ClearCpuBlock(offset); + handled = true; + } } // Clears all block tracking statuses, manual protection flags, and write protection. @@ -1006,4 +1032,5 @@ void mmap_ResetBlockTracking() //DbgCon.WriteLn( "vtlb/mmap: Block Tracking reset..." ); memzero( m_PageProtectInfo ); if (eeMem) HostSys::MemProtect( eeMem->Main, Ps2MemSize::MainRam, PageAccess_ReadWrite() ); + vtlb_UpdateFastmemProtection(0, Ps2MemSize::MainRam, PageAccess_ReadWrite()); } diff --git a/pcsx2/Memory.h b/pcsx2/Memory.h index e5ffb2bbfe..a4c8dd3da6 100644 --- a/pcsx2/Memory.h +++ b/pcsx2/Memory.h @@ -72,14 +72,14 @@ static __fi void ZeroQWC( u128& dest ) #define psRu32(mem) (*(u32*)&eeMem->ROM[(mem) & 0x3fffff]) #define psRu64(mem) (*(u64*)&eeMem->ROM[(mem) & 0x3fffff]) -#define psR1s8(mem) (*(s8 *)&eeMem->ROM1[(mem) & 0x3ffff]) -#define psR1s16(mem) (*(s16*)&eeMem->ROM1[(mem) & 0x3ffff]) -#define psR1s32(mem) (*(s32*)&eeMem->ROM1[(mem) & 0x3ffff]) -#define psR1s64(mem) (*(s64*)&eeMem->ROM1[(mem) & 0x3ffff]) -#define psR1u8(mem) (*(u8 *)&eeMem->ROM1[(mem) & 0x3ffff]) -#define psR1u16(mem) (*(u16*)&eeMem->ROM1[(mem) & 0x3ffff]) -#define psR1u32(mem) (*(u32*)&eeMem->ROM1[(mem) & 0x3ffff]) -#define psR1u64(mem) (*(u64*)&eeMem->ROM1[(mem) & 0x3ffff]) +#define psR1s8(mem) (*(s8 *)&eeMem->ROM1[(mem) & 0x3fffff]) +#define psR1s16(mem) (*(s16*)&eeMem->ROM1[(mem) & 0x3fffff]) +#define psR1s32(mem) (*(s32*)&eeMem->ROM1[(mem) & 0x3fffff]) +#define psR1s64(mem) (*(s64*)&eeMem->ROM1[(mem) & 0x3fffff]) +#define psR1u8(mem) (*(u8 *)&eeMem->ROM1[(mem) & 0x3fffff]) +#define psR1u16(mem) (*(u16*)&eeMem->ROM1[(mem) & 0x3fffff]) +#define psR1u32(mem) (*(u32*)&eeMem->ROM1[(mem) & 0x3fffff]) +#define psR1u64(mem) (*(u64*)&eeMem->ROM1[(mem) & 0x3fffff]) #define psR2s8(mem) (*(s8 *)&eeMem->ROM2[(mem) & 0x7ffff]) #define psR2s16(mem) (*(s16*)&eeMem->ROM2[(mem) & 0x7ffff]) @@ -90,15 +90,6 @@ static __fi void ZeroQWC( u128& dest ) #define psR2u32(mem) (*(u32*)&eeMem->ROM2[(mem) & 0x7ffff]) #define psR2u64(mem) (*(u64*)&eeMem->ROM2[(mem) & 0x7ffff]) -#define psERs8(mem) (*(s8 *)&eeMem->EROM[(mem) & 0x3ffff]) -#define psERs16(mem) (*(s16*)&eeMem->EROM[(mem) & 0x3ffff]) -#define psERs32(mem) (*(s32*)&eeMem->EROM[(mem) & 0x3ffff]) -#define psERs64(mem) (*(s64*)&eeMem->EROM[(mem) & 0x3ffff]) -#define psERu8(mem) (*(u8 *)&eeMem->EROM[(mem) & 0x3ffff]) -#define psERu16(mem) (*(u16*)&eeMem->EROM[(mem) & 0x3ffff]) -#define psERu32(mem) (*(u32*)&eeMem->EROM[(mem) & 0x3ffff]) -#define psERu64(mem) (*(u64*)&eeMem->EROM[(mem) & 0x3ffff]) - #define psSs32(mem) (*(s32 *)&eeMem->Scratch[(mem) & 0x3fff]) #define psSs64(mem) (*(s64 *)&eeMem->Scratch[(mem) & 0x3fff]) #define psSs128(mem) (*(s128*)&eeMem->Scratch[(mem) & 0x3fff]) @@ -131,21 +122,18 @@ extern void mmap_ResetBlockTracking(); #define memRead8 vtlb_memRead #define memRead16 vtlb_memRead #define memRead32 vtlb_memRead +#define memRead64 vtlb_memRead #define memWrite8 vtlb_memWrite #define memWrite16 vtlb_memWrite #define memWrite32 vtlb_memWrite - -static __fi void memRead64(u32 mem, mem64_t* out) { _mm_storel_epi64((__m128i*)out, vtlb_memRead64(mem)); } -static __fi void memRead64(u32 mem, mem64_t& out) { memRead64(mem, &out); } +#define memWrite64 vtlb_memWrite static __fi void memRead128(u32 mem, mem128_t* out) { _mm_store_si128((__m128i*)out, vtlb_memRead128(mem)); } static __fi void memRead128(u32 mem, mem128_t& out) { memRead128(mem, &out); } -static __fi void memWrite64(u32 mem, const mem64_t* val) { vtlb_memWrite64(mem, val); } -static __fi void memWrite64(u32 mem, const mem64_t& val) { vtlb_memWrite64(mem, &val); } -static __fi void memWrite128(u32 mem, const mem128_t* val) { vtlb_memWrite128(mem, val); } -static __fi void memWrite128(u32 mem, const mem128_t& val) { vtlb_memWrite128(mem, &val); } +static __fi void memWrite128(u32 mem, const mem128_t* val) { vtlb_memWrite128(mem, r128_load(val)); } +static __fi void memWrite128(u32 mem, const mem128_t& val) { vtlb_memWrite128(mem, r128_load(&val)); } extern u16 ba0R16(u32 mem); diff --git a/pcsx2/MemoryCardFile.cpp b/pcsx2/MemoryCardFile.cpp index 90b5c637dd..d557fc28a8 100644 --- a/pcsx2/MemoryCardFile.cpp +++ b/pcsx2/MemoryCardFile.cpp @@ -28,6 +28,7 @@ #include "System.h" #include "Config.h" #include "Host.h" +#include "IconsFontAwesome5.h" #include "svnrev.h" @@ -265,9 +266,9 @@ std::string FileMcd_GetDefaultName(uint slot) } FileMemoryCard::FileMemoryCard() + : m_chkaddr(0) { memset8<0xff>(m_effeffs); - m_chkaddr = 0; } void FileMemoryCard::Open() @@ -354,8 +355,14 @@ void FileMemoryCard::Open() // Translation note: detailed description should mention that the memory card will be disabled // for the duration of this session. Host::ReportFormattedErrorAsync("Memory Card", "Access denied to memory card: \n\n%s\n\n" - "The PS2-slot %d has been automatically disabled. You can correct the problem\nand re-enable it at any time using Config:Memory cards from the main menu.", - fname.c_str(), slot); + "Another instance of PCSX2 may be using this memory card. Close any other instances of PCSX2, or restart your computer.%s", + fname.c_str(), +#ifdef WIN32 + "\n\nIf your memory card is in a write-protected folder such as \"Program Files\" or \"Program Files (x86)\", move it to another folder, such as \"Documents\" or \"Desktop\"." +#else + "" +#endif + ); } else // Load checksum { @@ -364,7 +371,11 @@ void FileMemoryCard::Open() m_chkaddr = 0x210; if (!m_ispsx[slot] && FileSystem::FSeek64(m_file[slot], m_chkaddr, SEEK_SET) == 0) - std::fread(&m_chksum[slot], sizeof(m_chksum[slot]), 1, m_file[slot]); + { + const size_t read_result = std::fread(&m_chksum[slot], sizeof(m_chksum[slot]), 1, m_file[slot]); + if (read_result == 0) + Host::ReportFormattedErrorAsync("Memory Card", "Error reading memcard.\n"); + } } } } @@ -496,8 +507,10 @@ s32 FileMemoryCard::Save(uint slot, const u8* src, u32 adr, int size) if (!Seek(mcfp, adr)) return 0; m_currentdata.MakeRoomFor(size); - std::fread(m_currentdata.GetPtr(), size, 1, mcfp); + const size_t read_result = std::fread(m_currentdata.GetPtr(), size, 1, mcfp); + if (read_result == 0) + Host::ReportFormattedErrorAsync("Memory Card", "Error reading memcard.\n"); for (int i = 0; i < size; i++) { @@ -529,9 +542,9 @@ s32 FileMemoryCard::Save(uint slot, const u8* src, u32 adr, int size) std::chrono::duration elapsed = std::chrono::system_clock::now() - last; if (elapsed > std::chrono::seconds(5)) { - const std::string_view filename(Path::GetFileName(m_filenames[slot])); - Host::AddKeyedFormattedOSDMessage(StringUtil::StdStringFromFormat("MemoryCardSave%u", slot), 10.0f, - "Memory Card %.*s written.", static_cast(filename.size()), static_cast(filename.data())); + Host::AddIconOSDMessage(fmt::format("MemoryCardSave{}", slot), ICON_FA_SD_CARD, + fmt::format("Memory card '{}' was saved to storage.", Path::GetFileName(m_filenames[slot])), + Host::OSD_INFO_DURATION); last = std::chrono::system_clock::now(); } return 1; diff --git a/pcsx2/MemoryCardFolder.cpp b/pcsx2/MemoryCardFolder.cpp index 6220ad8350..63bd274c38 100644 --- a/pcsx2/MemoryCardFolder.cpp +++ b/pcsx2/MemoryCardFolder.cpp @@ -15,12 +15,15 @@ #include "PrecompiledHeader.h" #include "common/SafeArray.inl" +#include "common/Path.h" #include "MemoryCardFile.h" #include "MemoryCardFolder.h" #include "System.h" #include "Config.h" +#include "Host.h" +#include "IconsFontAwesome5.h" #include "common/FileSystem.h" #include "common/Path.h" @@ -123,13 +126,13 @@ time_t MemoryCardFileEntryDateTime::ToTime() const } FolderMemoryCard::FolderMemoryCard() + : m_framesUntilFlush(0) + , m_timeLastWritten(0) + , m_slot(0) + , m_isEnabled(false) + , m_performFileWrites(false) + , m_filteringEnabled(false) { - m_slot = 0; - m_isEnabled = false; - m_performFileWrites = false; - m_framesUntilFlush = 0; - m_timeLastWritten = 0; - m_filteringEnabled = false; } void FolderMemoryCard::InitializeInternalData() @@ -287,6 +290,7 @@ void FolderMemoryCard::LoadMemoryCardData(const u32 sizeInClusters, const bool e MemoryCardFileEntry* const rootDirEntry = &m_fileEntryDict[m_superBlock.data.rootdir_cluster].entries[0]; AddFolder(rootDirEntry, m_folderName, nullptr, enableFiltering, filter); + #ifdef DEBUG_WRITE_FOLDER_CARD_IN_MEMORY_TO_FILE_ON_CHANGE WriteToFile(m_folderName.GetFullPath().RemoveLast() + L"-debug_" + wxDateTime::Now().Format(L"%Y-%m-%d-%H-%M-%S") + L"_load.ps2"); #endif @@ -488,7 +492,7 @@ bool FolderMemoryCard::AddFolder(MemoryCardFileEntry* const dirEntry, const std: if (file.m_isFile) { // don't load files in the root dir if we're filtering; no official software stores files there - if (enableFiltering && parent == nullptr) + if (parent == nullptr) { continue; } @@ -1004,7 +1008,9 @@ s32 FolderMemoryCard::Read(u8* dest, u32 adr, int size) FolderMemoryCard::CalculateECC(ecc + (i * 3), &data[i * 0x80]); } - memcpy(dest + eccOffset, ecc, eccLength); + pxAssert(static_cast(size) >= eccOffset); + const u32 copySize = std::min((u32)size - eccOffset, eccLength); + memcpy(dest + eccOffset, ecc, copySize); } SetTimeLastReadToNow(); @@ -1578,6 +1584,11 @@ bool FolderMemoryCard::WriteToFile(const u8* src, u32 adr, u32 dataLength) return false; } +std::string FolderMemoryCard::GetFolderName() +{ + return m_folderName; +} + void FolderMemoryCard::CopyEntryDictIntoTree(std::vector* fileEntryTree, const u32 cluster, const u32 fileCount) { const MemoryCardFileEntryCluster* entryCluster = &m_fileEntryDict[cluster]; @@ -1717,7 +1728,7 @@ void FolderMemoryCard::SetTimeLastReadToNow() void FolderMemoryCard::SetTimeLastWrittenToNow() { // CHANGE: this was local time milliseconds, which might be problematic... - m_timeLastWritten = std::time(nullptr);// wxGetLocalTimeMillis().GetValue(); + m_timeLastWritten = std::time(nullptr); // wxGetLocalTimeMillis().GetValue(); m_framesUntilFlush = FramesAfterWriteUntilFlush; } @@ -2063,7 +2074,15 @@ void FileAccessHelper::WriteIndex(const std::string& baseFolderName, MemoryCardF pxAssert(entry->IsFile()); std::string folderName(baseFolderName); - parent->GetPath(&folderName); + if (parent != nullptr) + { + parent->GetPath(&folderName); + } + else + { + Console.Warning(fmt::format("(FileAccesHelper::WriteIndex()) '{}' has null parent", Path::Combine(baseFolderName, (const char*)entry->entry.data.name))); + } + char cleanName[sizeof(entry->entry.data.name)]; memcpy(cleanName, (const char*)entry->entry.data.name, sizeof(cleanName)); FileAccessHelper::CleanMemcardFilename(cleanName); @@ -2273,6 +2292,12 @@ void MemoryCardFileMetadataReference::GetInternalPath(std::string* fileName) con FolderMemoryCardAggregator::FolderMemoryCardAggregator() { +#ifdef _WIN32 + // Override Windows' default allowance for open files. Folder memory cards with more than 32 MB of content are likely to contain more than 512 individual files. + // Unix platforms seem to use 1024 by default. + _setmaxstdio(1024); +#endif + for (uint i = 0; i < TotalCardSlots; ++i) { m_cards[i].SetSlot(i); @@ -2322,7 +2347,15 @@ s32 FolderMemoryCardAggregator::Read(uint slot, u8* dest, u32 adr, int size) s32 FolderMemoryCardAggregator::Save(uint slot, const u8* src, u32 adr, int size) { - return m_cards[slot].Save(src, adr, size); + const s32 saveResult = m_cards[slot].Save(src, adr, size); + if (saveResult) + { + const std::string_view filename = Path::GetFileName(m_cards[slot].GetFolderName()); + Host::AddIconOSDMessage(fmt::format("MemoryCardSave{}", slot), ICON_FA_SD_CARD, + fmt::format("Memory card '{}' was saved to storage.", filename), Host::OSD_INFO_DURATION); + } + + return saveResult; } s32 FolderMemoryCardAggregator::EraseBlock(uint slot, u32 adr) diff --git a/pcsx2/MemoryCardFolder.h b/pcsx2/MemoryCardFolder.h index 8d3d91b67f..2df9743cc1 100644 --- a/pcsx2/MemoryCardFolder.h +++ b/pcsx2/MemoryCardFolder.h @@ -363,6 +363,8 @@ public: void WriteToFile(const std::string& filename); + std::string GetFolderName(); + protected: struct EnumeratedFileEntry { diff --git a/pcsx2/MemoryCardProtocol.cpp b/pcsx2/MemoryCardProtocol.cpp new file mode 100644 index 0000000000..9992310a5b --- /dev/null +++ b/pcsx2/MemoryCardProtocol.cpp @@ -0,0 +1,503 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#include "MemoryCardProtocol.h" +#include "Sio.h" + +#define MC_LOG_ENABLE 0 +#define MC_LOG if (MC_LOG_ENABLE) DevCon + +#define PS1_FAIL() if (this->PS1Fail()) return; + +MemoryCardProtocol g_MemoryCardProtocol; + +// Check if the memcard is for PS1, and if we are working on a command sent over SIO2. +// If so, return dead air. +bool MemoryCardProtocol::PS1Fail() +{ + if (mcd->IsPSX() && sio2.commandLength > 0) + { + while (fifoOut.size() < sio2.commandLength) + { + fifoOut.push_back(0x00); + } + + return true; + } + + return false; +} + +// A repeated pattern in memcard commands is to pad with zero bytes, +// then end with 0x2b and terminator bytes. This function is a shortcut for that. +void MemoryCardProtocol::The2bTerminator(size_t length) +{ + while (fifoOut.size() < length - 2) + { + fifoOut.push_back(0x00); + } + + fifoOut.push_back(0x2b); + fifoOut.push_back(mcd->term); +} + +// After one read or write, the memcard is almost certainly going to be issued a new read or write +// for the next segment of the same sector. Bump the transferAddr to where that segment begins. +// If it is the end and a new sector is being accessed, the SetSector function will deal with +// both sectorAddr and transferAddr. +void MemoryCardProtocol::ReadWriteIncrement(size_t length) +{ + mcd->transferAddr += length; +} + +void MemoryCardProtocol::RecalculatePS1Addr() +{ + mcd->sectorAddr = ((ps1McState.sectorAddrMSB << 8) | ps1McState.sectorAddrLSB); + mcd->goodSector = (mcd->sectorAddr <= 0x03ff); + mcd->transferAddr = 128 * mcd->sectorAddr; +} + +void MemoryCardProtocol::ResetPS1State() +{ + ps1McState.currentByte = 2; + ps1McState.sectorAddrMSB = 0; + ps1McState.sectorAddrLSB = 0; + ps1McState.checksum = 0; + ps1McState.expectedChecksum = 0; + memset(ps1McState.buf.data(), 0, ps1McState.buf.size()); +} + +void MemoryCardProtocol::Probe() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + The2bTerminator(4); +} + +void MemoryCardProtocol::UnknownWriteDeleteEnd() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + The2bTerminator(4); +} + +void MemoryCardProtocol::SetSector() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + const u8 sectorLSB = fifoIn.front(); + fifoIn.pop_front(); + const u8 sector2nd = fifoIn.front(); + fifoIn.pop_front(); + const u8 sector3rd = fifoIn.front(); + fifoIn.pop_front(); + const u8 sectorMSB = fifoIn.front(); + fifoIn.pop_front(); + const u8 expectedChecksum = fifoIn.front(); + fifoIn.pop_front(); + + u8 computedChecksum = sectorLSB ^ sector2nd ^ sector3rd ^ sectorMSB; + mcd->goodSector = (computedChecksum == expectedChecksum); + + if (!mcd->goodSector) + { + Console.Warning("%s() Warning! Memcard sector checksum failed! (Expected %02X != Actual %02X) Please report to the PCSX2 team!", __FUNCTION__, expectedChecksum, computedChecksum); + } + + u32 newSector = sectorLSB | (sector2nd << 8) | (sector3rd << 16) | (sectorMSB << 24); + mcd->sectorAddr = newSector; + + McdSizeInfo info; + mcd->GetSizeInfo(info); + mcd->transferAddr = (info.SectorSize + 16) * mcd->sectorAddr; + + The2bTerminator(9); +} + +void MemoryCardProtocol::GetSpecs() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + u8 checksum = 0x00; + McdSizeInfo info; + mcd->GetSizeInfo(info); + fifoOut.push_back(0x2b); + + const u8 sectorSizeLSB = (info.SectorSize & 0xff); + checksum ^= sectorSizeLSB; + fifoOut.push_back(sectorSizeLSB); + + const u8 sectorSizeMSB = (info.SectorSize >> 8); + checksum ^= sectorSizeMSB; + fifoOut.push_back(sectorSizeMSB); + + const u8 eraseBlockSizeLSB = (info.EraseBlockSizeInSectors & 0xff); + checksum ^= eraseBlockSizeLSB; + fifoOut.push_back(eraseBlockSizeLSB); + + const u8 eraseBlockSizeMSB = (info.EraseBlockSizeInSectors >> 8); + checksum ^= eraseBlockSizeMSB; + fifoOut.push_back(eraseBlockSizeMSB); + + const u8 sectorCountLSB = (info.McdSizeInSectors & 0xff); + checksum ^= sectorCountLSB; + fifoOut.push_back(sectorCountLSB); + + const u8 sectorCount2nd = (info.McdSizeInSectors >> 8); + checksum ^= sectorCount2nd; + fifoOut.push_back(sectorCount2nd); + + const u8 sectorCount3rd = (info.McdSizeInSectors >> 16); + checksum ^= sectorCount3rd; + fifoOut.push_back(sectorCount3rd); + + const u8 sectorCountMSB = (info.McdSizeInSectors >> 24); + checksum ^= sectorCountMSB; + fifoOut.push_back(sectorCountMSB); + + fifoOut.push_back(info.Xor); + fifoOut.push_back(mcd->term); +} + +void MemoryCardProtocol::SetTerminator() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + const u8 newTerminator = fifoIn.front(); + fifoIn.pop_front(); + const u8 oldTerminator = mcd->term; + mcd->term = newTerminator; + fifoOut.push_back(0x00); + fifoOut.push_back(0x2b); + fifoOut.push_back(oldTerminator); +} + +void MemoryCardProtocol::GetTerminator() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + fifoOut.push_back(0x2b); + fifoOut.push_back(mcd->term); + fifoOut.push_back(static_cast(Terminator::DEFAULT)); +} + +void MemoryCardProtocol::WriteData() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + fifoOut.push_back(0x00); + fifoOut.push_back(0x2b); + const u8 writeLength = fifoIn.front(); + fifoIn.pop_front(); + u8 checksum = 0x00; + std::vector buf; + + for (size_t writeCounter = 0; writeCounter < writeLength; writeCounter++) + { + const u8 writeByte = fifoIn.front(); + fifoIn.pop_front(); + checksum ^= writeByte; + buf.push_back(writeByte); + fifoOut.push_back(0x00); + } + + mcd->Write(buf.data(), buf.size()); + fifoOut.push_back(checksum); + fifoOut.push_back(mcd->term); + + ReadWriteIncrement(writeLength); +} + +void MemoryCardProtocol::ReadData() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + const u8 readLength = fifoIn.front(); + fifoIn.pop_front(); + fifoOut.push_back(0x00); + fifoOut.push_back(0x2b); + std::vector buf; + buf.resize(readLength); + mcd->Read(buf.data(), buf.size()); + u8 checksum = 0x00; + + for (const u8 readByte : buf) + { + checksum ^= readByte; + fifoOut.push_back(readByte); + } + + fifoOut.push_back(checksum); + fifoOut.push_back(mcd->term); + + ReadWriteIncrement(readLength); +} + +u8 MemoryCardProtocol::PS1Read(u8 data) +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + bool sendAck = true; + u8 ret = 0; + + switch (ps1McState.currentByte) + { + case 2: + ret = 0x5a; + break; + case 3: + ret = 0x5d; + break; + case 4: + ps1McState.sectorAddrMSB = data; + ret = 0x00; + break; + case 5: + ps1McState.sectorAddrLSB = data; + ret = 0x00; + RecalculatePS1Addr(); + break; + case 6: + ret = 0x5c; + break; + case 7: + ret = 0x5d; + break; + case 8: + ret = ps1McState.sectorAddrMSB; + break; + case 9: + ret = ps1McState.sectorAddrLSB; + break; + case 138: + ret = ps1McState.checksum; + break; + case 139: + ret = 0x47; + sendAck = false; + break; + case 10: + ps1McState.checksum = ps1McState.sectorAddrMSB ^ ps1McState.sectorAddrLSB; + mcd->Read(ps1McState.buf.data(), ps1McState.buf.size()); + [[fallthrough]]; + default: + ret = ps1McState.buf.at(ps1McState.currentByte - 10); + ps1McState.checksum ^= ret; + break; + } + + if (sendAck) + { + sio0.Acknowledge(); + } + + ps1McState.currentByte++; + return ret; +} + +u8 MemoryCardProtocol::PS1State(u8 data) +{ + DevCon.Error("%s(%02X) I do not exist, please change that ASAP.", __FUNCTION__, data); + assert(false); + return 0x00; +} + +u8 MemoryCardProtocol::PS1Write(u8 data) +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + bool sendAck = true; + u8 ret = 0; + + switch (ps1McState.currentByte) + { + case 2: + ret = 0x5a; + break; + case 3: + ret = 0x5d; + break; + case 4: + ps1McState.sectorAddrMSB = data; + ret = 0x00; + break; + case 5: + ps1McState.sectorAddrLSB = data; + ret = 0x00; + RecalculatePS1Addr(); + break; + case 134: + ps1McState.expectedChecksum = data; + ret = 0; + break; + case 135: + ret = 0x5c; + break; + case 136: + ret = 0x5d; + break; + case 137: + if (!mcd->goodSector) + { + ret = 0xff; + } + else if (ps1McState.expectedChecksum != ps1McState.checksum) + { + ret = 0x4e; + } + else + { + mcd->Write(ps1McState.buf.data(), ps1McState.buf.size()); + ret = 0x47; + // Clear the "directory unread" bit of the flag byte. Per no$psx, this is cleared + // on writes, not reads. + mcd->FLAG &= 0x07; + } + + sendAck = false; + break; + case 6: + ps1McState.checksum = ps1McState.sectorAddrMSB ^ ps1McState.sectorAddrLSB; + [[fallthrough]]; + default: + ps1McState.buf.at(ps1McState.currentByte - 6) = data; + ps1McState.checksum ^= data; + ret = 0x00; + break; + } + + if (sendAck) + { + sio0.Acknowledge(); + } + + ps1McState.currentByte++; + return ret; +} + +u8 MemoryCardProtocol::PS1Pocketstation(u8 data) +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + sio2.SetRecv1(Recv1::DISCONNECTED); + return 0x00; +} + +void MemoryCardProtocol::ReadWriteEnd() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + The2bTerminator(4); +} + +void MemoryCardProtocol::EraseBlock() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + mcd->EraseBlock(); + The2bTerminator(4); +} + +void MemoryCardProtocol::UnknownBoot() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + The2bTerminator(5); +} + +void MemoryCardProtocol::AuthXor() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + const u8 modeByte = fifoIn.front(); + fifoIn.pop_front(); + + switch (modeByte) + { + // When encountered, the command length in RECV3 is guaranteed to be 14, + // and the PS2 is expecting us to XOR the data it is about to send. + case 0x01: + case 0x02: + case 0x04: + case 0x0f: + case 0x11: + case 0x13: + { + // Long + XOR + fifoOut.push_back(0x00); + fifoOut.push_back(0x2b); + u8 xorResult = 0x00; + + for (size_t xorCounter = 0; xorCounter < 8; xorCounter++) + { + const u8 toXOR = fifoIn.front(); + fifoIn.pop_front(); + xorResult ^= toXOR; + fifoOut.push_back(0x00); + } + + fifoOut.push_back(xorResult); + fifoOut.push_back(mcd->term); + break; + } + // When encountered, the command length in RECV3 is guaranteed to be 5, + // and there is no attempt to XOR anything. + case 0x00: + case 0x03: + case 0x05: + case 0x08: + case 0x09: + case 0x0a: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x10: + case 0x12: + case 0x14: + { + // Short + No XOR + The2bTerminator(5); + break; + } + // When encountered, the command length in RECV3 is guaranteed to be 14, + // and the PS2 is about to send us data, BUT the PS2 does NOT want us + // to send the XOR, it wants us to send the 0x2b and terminator as the + // last two bytes. + case 0x06: + case 0x07: + case 0x0b: + { + // Long + No XOR + The2bTerminator(14); + break; + } + default: + Console.Warning("%s(queue) Unexpected modeByte (%02X), please report to the PCSX2 team", __FUNCTION__, modeByte); + break; + } +} + +void MemoryCardProtocol::AuthF3() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + The2bTerminator(5); +} + +void MemoryCardProtocol::AuthF7() +{ + MC_LOG.WriteLn("%s", __FUNCTION__); + PS1_FAIL(); + The2bTerminator(5); +} diff --git a/pcsx2/MemoryCardProtocol.h b/pcsx2/MemoryCardProtocol.h new file mode 100644 index 0000000000..6e8ed85094 --- /dev/null +++ b/pcsx2/MemoryCardProtocol.h @@ -0,0 +1,64 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +#include + +struct PS1MemoryCardState +{ + size_t currentByte = 2; + u8 sectorAddrMSB = 0; + u8 sectorAddrLSB = 0; + u8 checksum = 0; + u8 expectedChecksum = 0; + std::array buf; +}; + +// A global class which contains the behavior of each memory card command. +class MemoryCardProtocol +{ +private: + PS1MemoryCardState ps1McState; + + bool PS1Fail(); + void The2bTerminator(size_t length); + void ReadWriteIncrement(size_t length); + void RecalculatePS1Addr(); + +public: + void ResetPS1State(); + + void Probe(); + void UnknownWriteDeleteEnd(); + void SetSector(); + void GetSpecs(); + void SetTerminator(); + void GetTerminator(); + void WriteData(); + void ReadData(); + u8 PS1Read(u8 data); + u8 PS1State(u8 data); + u8 PS1Write(u8 data); + u8 PS1Pocketstation(u8 data); + void ReadWriteEnd(); + void EraseBlock(); + void UnknownBoot(); + void AuthXor(); + void AuthF3(); + void AuthF7(); +}; + +extern MemoryCardProtocol g_MemoryCardProtocol; diff --git a/pcsx2/MemoryTypes.h b/pcsx2/MemoryTypes.h index 33722994f9..401c3b9686 100644 --- a/pcsx2/MemoryTypes.h +++ b/pcsx2/MemoryTypes.h @@ -20,9 +20,8 @@ namespace Ps2MemSize { static const uint MainRam = _32mb; // 32 MB main memory! static const uint Rom = _1mb * 4; // 4 MB main rom - static const uint Rom1 = 0x00040000; // DVD player - static const uint Rom2 = 0x00080000; // Chinese rom extension (?) - static const uint ERom = 0x001C0000; // DVD player extensions (?) + static const uint Rom1 = _1mb * 4; // DVD player + static const uint Rom2 = 0x00080000; // Chinese rom extension static const uint Hardware = _64kb; static const uint Scratch = _16kb; @@ -38,58 +37,13 @@ typedef u32 mem32_t; typedef u64 mem64_t; typedef u128 mem128_t; - -// -------------------------------------------------------------------------------------- -// Future-Planned VTLB pagefault scheme! -// -------------------------------------------------------------------------------------- -// When enabled, the VTLB will use a large-area reserved memory range of 512megs for EE -// physical ram/rom access. The base ram will be committed at 0x00000000, and ROMs will be -// at 0x1fc00000, etc. All memory ranges in between will be uncommitted memory -- which -// means that the memory will *not* count against the operating system's physical memory -// pool. -// -// When the VTLB generates memory operations (loads/stores), it will assume that the op -// is addressing either RAM or ROM, and by assuming that it can generate a completely efficient -// direct memory access (one AND and one MOV instruction). If the access is to another area of -// memory, such as hardware registers or scratchpad, the access will generate a page fault, the -// compiled block will be cleared and re-compiled using "full" VTLB translation logic. -// -// Note that support for this feature may not be doable under x86/32 platforms, due to the -// 2gb/3gb limit of Windows XP (the 3gb feature will make it slightly more feasible at least). -// -#define VTLB_UsePageFaulting 0 - -#if VTLB_UsePageFaulting - -// The order of the components in this struct *matter* -- it has been laid out so that the -// full breadth of PS2 RAM and ROM mappings are directly supported. -struct EEVM_MemoryAllocMess -{ - u8 (&Main)[Ps2MemSize::MainRam]; // Main memory (hard-wired to 32MB) - - u8 _padding1[0x1e000000-Ps2MemSize::MainRam] - u8 (&ROM1)[Ps2MemSize::Rom1]; // DVD player - - u8 _padding2[0x1e040000-(0x1e000000+Ps2MemSize::Rom1)] - u8 (&EROM)[Ps2MemSize::ERom]; // DVD player extensions - - u8 _padding3[0x1e400000-(0x1e040000+Ps2MemSize::EROM)] - u8 (&ROM2)[Ps2MemSize::Rom2]; // Chinese extensions - - u8 _padding4[0x1fc00000-(0x1e040000+Ps2MemSize::Rom2)]; - u8 (&ROM)[Ps2MemSize::Rom]; // Boot rom (4MB) -}; - -#else - struct EEVM_MemoryAllocMess { u8 Main[Ps2MemSize::MainRam]; // Main memory (hard-wired to 32MB) u8 Scratch[Ps2MemSize::Scratch]; // Scratchpad! u8 ROM[Ps2MemSize::Rom]; // Boot rom (4MB) - u8 ROM1[Ps2MemSize::Rom1]; // DVD player + u8 ROM1[Ps2MemSize::Rom1]; // DVD player (4MB) u8 ROM2[Ps2MemSize::Rom2]; // Chinese extensions - u8 EROM[Ps2MemSize::ERom]; // DVD player extensions // Two 1 megabyte (max DMA) buffers for reading and writing to high memory (>32MB). // Such accesses are not documented as causing bus errors but as the memory does @@ -100,8 +54,6 @@ struct EEVM_MemoryAllocMess u8 ZeroWrite[_1mb]; }; -#endif - struct IopVM_MemoryAllocMess { u8 Main[Ps2MemSize::IopRam]; // Main memory (hard-wired to 2MB) diff --git a/pcsx2/MultitapProtocol.cpp b/pcsx2/MultitapProtocol.cpp new file mode 100644 index 0000000000..0223887b0c --- /dev/null +++ b/pcsx2/MultitapProtocol.cpp @@ -0,0 +1,89 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "PrecompiledHeader.h" + +#include "MultitapProtocol.h" +#include "Sio.h" + +#define MT_LOG_ENABLE 0 +#define MT_LOG if (MT_LOG_ENABLE) DevCon + +MultitapProtocol g_MultitapProtocol; + +void MultitapProtocol::SupportCheck() +{ + MT_LOG.WriteLn("%s", __FUNCTION__); + fifoOut.push_back(0x5a); + fifoOut.push_back(0x04); + fifoOut.push_back(0x00); + fifoOut.push_back(0x5a); +} + +void MultitapProtocol::Select() +{ + MT_LOG.WriteLn("%s", __FUNCTION__); + const u8 newSlot = fifoIn.front(); + fifoIn.pop_front(); + const bool isInBounds = (newSlot < SIO::SLOTS); + + if (isInBounds) + { + sio2.slot = newSlot; + MT_LOG.WriteLn("Slot changed to %d", sio2.slot); + } + + fifoOut.push_back(0x5a); + fifoOut.push_back(0x00); + fifoOut.push_back(0x00); + fifoOut.push_back(isInBounds ? newSlot : 0xff); + fifoOut.push_back(isInBounds ? 0x5a : 0x66); +} + +MultitapProtocol::MultitapProtocol() = default; +MultitapProtocol::~MultitapProtocol() = default; + +void MultitapProtocol::SoftReset() +{ +} + +void MultitapProtocol::FullReset() +{ + SoftReset(); + + sio2.slot = 0; +} + +void MultitapProtocol::SendToMultitap() +{ + const u8 commandByte = fifoIn.front(); + fifoIn.pop_front(); + fifoOut.push_back(0x80); + + switch (static_cast(commandByte)) + { + case MultitapMode::PAD_SUPPORT_CHECK: + case MultitapMode::MEMCARD_SUPPORT_CHECK: + SupportCheck(); + break; + case MultitapMode::SELECT_PAD: + case MultitapMode::SELECT_MEMCARD: + Select(); + break; + default: + DevCon.Warning("%s() Unhandled MultitapMode (%02X)", __FUNCTION__, commandByte); + break; + } +} diff --git a/pcsx2/MultitapProtocol.h b/pcsx2/MultitapProtocol.h new file mode 100644 index 0000000000..79fd113b99 --- /dev/null +++ b/pcsx2/MultitapProtocol.h @@ -0,0 +1,43 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +enum class MultitapMode +{ + NOT_SET = 0xff, + PAD_SUPPORT_CHECK = 0x12, + MEMCARD_SUPPORT_CHECK = 0x13, + SELECT_PAD = 0x21, + SELECT_MEMCARD = 0x22, +}; + +class MultitapProtocol +{ +private: + void SupportCheck(); + void Select(); + +public: + MultitapProtocol(); + ~MultitapProtocol(); + + void SoftReset(); + void FullReset(); + + void SendToMultitap(); +}; + +extern MultitapProtocol g_MultitapProtocol; diff --git a/pcsx2/PAD/Gamepad.h b/pcsx2/PAD/Gamepad.h index 6e878e445a..9842794081 100644 --- a/pcsx2/PAD/Gamepad.h +++ b/pcsx2/PAD/Gamepad.h @@ -24,8 +24,9 @@ void PADshutdown(); s32 PADopen(const WindowInfo& wi); void PADupdate(int pad); void PADclose(); -u8 PADstartPoll(int pad); +u8 PADstartPoll(int port, int slot); u8 PADpoll(u8 value); +bool PADcomplete(); HostKeyEvent* PADkeyEvent(); void PADconfigure(); s32 PADfreeze(FreezeAction mode, freezeData* data); diff --git a/pcsx2/PAD/Host/KeyStatus.cpp b/pcsx2/PAD/Host/KeyStatus.cpp index e85b1413cd..6cc2e0a6d9 100644 --- a/pcsx2/PAD/Host/KeyStatus.cpp +++ b/pcsx2/PAD/Host/KeyStatus.cpp @@ -19,12 +19,13 @@ #include "PAD/Host/Global.h" #include +#include using namespace PAD; KeyStatus::KeyStatus() { - Init(); + std::memset(&m_analog, 0, sizeof(m_analog)); for (u32 pad = 0; pad < NUM_CONTROLLER_PORTS; pad++) { @@ -32,6 +33,8 @@ KeyStatus::KeyStatus() m_axis_scale[pad][1] = 1.0f; m_pressure_modifier[pad] = 0.5f; } + + Init(); } void KeyStatus::Init() @@ -54,7 +57,7 @@ void KeyStatus::Set(u32 pad, u32 index, float value) { if (IsAnalogKey(index)) { - m_button_pressure[pad][index] = static_cast(std::clamp(((value < m_axis_scale[pad][0]) ? 0.0f : value) * m_axis_scale[pad][1] * 255.0f, 0.0f, 255.0f)); + m_button_pressure[pad][index] = static_cast(std::clamp(value * m_axis_scale[pad][1] * 255.0f, 0.0f, 255.0f)); // Left -> -- -> Right // Value range : FFFF8002 -> 0 -> 7FFE @@ -65,40 +68,69 @@ void KeyStatus::Set(u32 pad, u32 index, float value) // merge left/right or up/down into rx or ry #define MERGE(pad, pos, neg) ((m_button_pressure[pad][pos] != 0) ? (127u + ((m_button_pressure[pad][pos] + 1u) / 2u)) : (127u - (m_button_pressure[pad][neg] / 2u))) - - switch (index) + if (index <= PAD_L_LEFT) { - case PAD_R_LEFT: - case PAD_R_RIGHT: - m_analog[pad].rx = MERGE(pad, PAD_R_RIGHT, PAD_R_LEFT); - break; + // Left Stick + m_analog[pad].lx = m_analog[pad].invert_lx ? MERGE(pad, PAD_L_LEFT, PAD_L_RIGHT) : MERGE(pad, PAD_L_RIGHT, PAD_L_LEFT); + m_analog[pad].ly = m_analog[pad].invert_ly ? MERGE(pad, PAD_L_UP, PAD_L_DOWN) : MERGE(pad, PAD_L_DOWN, PAD_L_UP); + } + else + { + // Right Stick + m_analog[pad].rx = m_analog[pad].invert_rx ? MERGE(pad, PAD_R_LEFT, PAD_R_RIGHT) : MERGE(pad, PAD_R_RIGHT, PAD_R_LEFT); + m_analog[pad].ry = m_analog[pad].invert_ry ? MERGE(pad, PAD_R_UP, PAD_R_DOWN) : MERGE(pad, PAD_R_DOWN, PAD_R_UP); + } +#undef MERGE - case PAD_R_DOWN: - case PAD_R_UP: - m_analog[pad].ry = MERGE(pad, PAD_R_DOWN, PAD_R_UP); - break; + // Deadzone computation. + const float dz = m_axis_scale[pad][0]; + if (dz > 0.0f) + { +#define MERGE_F(pad, pos, neg) ((m_button_pressure[pad][pos] != 0) ? (static_cast(m_button_pressure[pad][pos]) / 255.0f) : (static_cast(m_button_pressure[pad][neg]) / -255.0f)) + float pos_x, pos_y; + if (index <= PAD_L_LEFT) + { + pos_x = m_analog[pad].invert_lx ? MERGE_F(pad, PAD_L_LEFT, PAD_L_RIGHT) : MERGE_F(pad, PAD_L_RIGHT, PAD_L_LEFT); + pos_y = m_analog[pad].invert_ly ? MERGE_F(pad, PAD_L_UP, PAD_L_DOWN) : MERGE_F(pad, PAD_L_DOWN, PAD_L_UP); + } + else + { + pos_x = m_analog[pad].invert_lx ? MERGE_F(pad, PAD_R_LEFT, PAD_R_RIGHT) : MERGE_F(pad, PAD_R_RIGHT, PAD_R_LEFT); + pos_y = m_analog[pad].invert_ly ? MERGE_F(pad, PAD_R_UP, PAD_R_DOWN) : MERGE_F(pad, PAD_R_DOWN, PAD_R_UP); + } - case PAD_L_LEFT: - case PAD_L_RIGHT: - m_analog[pad].lx = MERGE(pad, PAD_L_RIGHT, PAD_L_LEFT); - break; + // No point checking if we're at dead center (usually keyboard with no buttons pressed). + if (pos_x != 0.0f || pos_y != 0.0f) + { + // Compute the angle at the given position in the stick's square bounding box. + const float theta = std::atan2(pos_y, pos_x); - case PAD_L_DOWN: - case PAD_L_UP: - m_analog[pad].ly = MERGE(pad, PAD_L_DOWN, PAD_L_UP); - break; + // Compute the position that the edge of the circle would be at, given the angle. + const float dz_x = std::cos(theta) * dz; + const float dz_y = std::sin(theta) * dz; - default: - break; + // We're in the deadzone if our position is less than the circle edge. + const bool in_x = (pos_x < 0.0f) ? (pos_x > dz_x) : (pos_x <= dz_x); + const bool in_y = (pos_y < 0.0f) ? (pos_y > dz_y) : (pos_y <= dz_y); + if (in_x && in_y) + { + // In deadzone. Set to 127 (center). + if (index <= PAD_L_LEFT) + m_analog[pad].lx = m_analog[pad].ly = 127; + else + m_analog[pad].rx = m_analog[pad].ry = 127; + } + } +#undef MERGE_F } -#undef MERGE } else { // Don't affect L2/R2, since they are analog on most pads. const float pmod = ((m_button[pad] & (1u << PAD_PRESSURE)) == 0 && !IsTriggerKey(index)) ? m_pressure_modifier[pad] : 1.0f; - m_button_pressure[pad][index] = static_cast(std::clamp(value * pmod * 255.0f, 0.0f, 255.0f)); + const float dz_value = (value < m_button_deadzone[pad]) ? 0.0f : value; + m_button_pressure[pad][index] = static_cast(std::clamp(dz_value * pmod * 255.0f, 0.0f, 255.0f)); // Since we reordered the buttons for better UI, we need to remap them here. static constexpr std::array bitmask_mapping = {{ @@ -123,8 +155,7 @@ void KeyStatus::Set(u32 pad, u32 index, float value) // remainder are analogs and not used here }}; - // TODO: Deadzone here? - if (value > 0.0f) + if (dz_value > 0.0f) m_button[pad] &= ~(1u << bitmask_mapping[index]); else m_button[pad] |= (1u << bitmask_mapping[index]); @@ -133,7 +164,7 @@ void KeyStatus::Set(u32 pad, u32 index, float value) if (index == PAD_PRESSURE) { const float adjust_pmod = ((m_button[pad] & (1u << PAD_PRESSURE)) == 0) ? m_pressure_modifier[pad] : (1.0f / m_pressure_modifier[pad]); - for (int i = 0; i < MAX_KEYS; i++) + for (u32 i = 0; i < MAX_KEYS; i++) { if (i == index || IsAnalogKey(i) || IsTriggerKey(i)) continue; diff --git a/pcsx2/PAD/Host/KeyStatus.h b/pcsx2/PAD/Host/KeyStatus.h index 3be985dffe..36547967ab 100644 --- a/pcsx2/PAD/Host/KeyStatus.h +++ b/pcsx2/PAD/Host/KeyStatus.h @@ -16,6 +16,7 @@ #pragma once #include "PAD/Host/PAD.h" +#include namespace PAD { @@ -30,6 +31,8 @@ namespace PAD { u8 lx, ly; u8 rx, ry; + u8 invert_lx, invert_ly; + u8 invert_rx, invert_ry; }; PAD::ControllerType m_type[NUM_CONTROLLER_PORTS] = {}; @@ -39,6 +42,7 @@ namespace PAD float m_axis_scale[NUM_CONTROLLER_PORTS][2]; float m_vibration_scale[NUM_CONTROLLER_PORTS][2]; float m_pressure_modifier[NUM_CONTROLLER_PORTS]; + float m_button_deadzone[NUM_CONTROLLER_PORTS]; public: KeyStatus(); @@ -46,6 +50,14 @@ namespace PAD void Set(u32 pad, u32 index, float value); + __fi void SetRawAnalogs(const u32 pad, const std::tuple left, const std::tuple right) + { + m_analog[pad].lx = std::get<0>(left); + m_analog[pad].ly = std::get<1>(left); + m_analog[pad].rx = std::get<0>(right); + m_analog[pad].ry = std::get<1>(right); + } + __fi PAD::ControllerType GetType(u32 pad) { return m_type[pad]; } __fi void SetType(u32 pad, PAD::ControllerType type) { m_type[pad] = type; } @@ -58,6 +70,22 @@ namespace PAD __fi void SetVibrationScale(u32 pad, u32 motor, float scale) { m_vibration_scale[pad][motor] = scale; } __fi float GetPressureModifier(u32 pad) const { return m_pressure_modifier[pad]; } __fi void SetPressureModifier(u32 pad, float mod) { m_pressure_modifier[pad] = mod; } + __fi void SetButtonDeadzone(u32 pad, float deadzone) { m_button_deadzone[pad] = deadzone; } + __fi void SetAnalogInvertL(u32 pad, bool x, bool y) + { + m_analog[pad].invert_lx = x; + m_analog[pad].invert_ly = y; + } + __fi void SetAnalogInvertR(u32 pad, bool x, bool y) + { + m_analog[pad].invert_rx = x; + m_analog[pad].invert_ry = y; + } + + __fi u8 GetRawPressure(u32 pad, u32 index) const { return m_button_pressure[pad][index]; } + + __fi std::tuple GetRawLeftAnalog(u32 pad) const { return {m_analog[pad].lx, m_analog[pad].ly}; } + __fi std::tuple GetRawRightAnalog(u32 pad) const { return {m_analog[pad].rx, m_analog[pad].ry}; } u32 GetButtons(u32 pad); u8 GetPressure(u32 pad, u32 index); diff --git a/pcsx2/PAD/Host/PAD.cpp b/pcsx2/PAD/Host/PAD.cpp index 19d748bc03..71a74855c3 100644 --- a/pcsx2/PAD/Host/PAD.cpp +++ b/pcsx2/PAD/Host/PAD.cpp @@ -173,9 +173,9 @@ s32 PADfreeze(FreezeAction mode, freezeData* data) return 0; } -u8 PADstartPoll(int pad) +u8 PADstartPoll(int _port, int _slot) { - return pad_start_poll(pad); + return pad_start_poll(_port, _slot); } u8 PADpoll(u8 value) @@ -183,11 +183,72 @@ u8 PADpoll(u8 value) return pad_poll(value); } +const char* PAD::ControllerSettingInfo::StringDefaultValue() const +{ + return default_value ? default_value : ""; +} + +bool PAD::ControllerSettingInfo::BooleanDefaultValue() const +{ + return default_value ? StringUtil::FromChars(default_value).value_or(false) : false; +} + +s32 PAD::ControllerSettingInfo::IntegerDefaultValue() const +{ + return default_value ? StringUtil::FromChars(default_value).value_or(0) : 0; +} + +s32 PAD::ControllerSettingInfo::IntegerMinValue() const +{ + static constexpr s32 fallback_value = std::numeric_limits::min(); + return min_value ? StringUtil::FromChars(min_value).value_or(fallback_value) : fallback_value; +} + +s32 PAD::ControllerSettingInfo::IntegerMaxValue() const +{ + static constexpr s32 fallback_value = std::numeric_limits::max(); + return max_value ? StringUtil::FromChars(max_value).value_or(fallback_value) : fallback_value; +} + +s32 PAD::ControllerSettingInfo::IntegerStepValue() const +{ + static constexpr s32 fallback_value = 1; + return step_value ? StringUtil::FromChars(step_value).value_or(fallback_value) : fallback_value; +} + +float PAD::ControllerSettingInfo::FloatDefaultValue() const +{ + return default_value ? StringUtil::FromChars(default_value).value_or(0.0f) : 0.0f; +} + +float PAD::ControllerSettingInfo::FloatMinValue() const +{ + static constexpr float fallback_value = std::numeric_limits::min(); + return min_value ? StringUtil::FromChars(min_value).value_or(fallback_value) : fallback_value; +} + +float PAD::ControllerSettingInfo::FloatMaxValue() const +{ + static constexpr float fallback_value = std::numeric_limits::max(); + return max_value ? StringUtil::FromChars(max_value).value_or(fallback_value) : fallback_value; +} + +float PAD::ControllerSettingInfo::FloatStepValue() const +{ + static constexpr float fallback_value = 0.1f; + return step_value ? StringUtil::FromChars(step_value).value_or(fallback_value) : fallback_value; +} + std::string PAD::GetConfigSection(u32 pad_index) { return fmt::format("Pad{}", pad_index + 1); } +bool PADcomplete() +{ + return pad_complete(); +} + void PAD::LoadConfig(const SettingsInterface& si) { PAD::s_macro_buttons = {}; @@ -212,7 +273,9 @@ void PAD::LoadConfig(const SettingsInterface& si) const float axis_deadzone = si.GetFloatValue(section.c_str(), "Deadzone", DEFAULT_STICK_DEADZONE); const float axis_scale = si.GetFloatValue(section.c_str(), "AxisScale", DEFAULT_STICK_SCALE); + const float button_deadzone = si.GetFloatValue(section.c_str(), "ButtonDeadzone", DEFAULT_BUTTON_DEADZONE); g_key_status.SetAxisScale(i, axis_deadzone, axis_scale); + g_key_status.SetButtonDeadzone(i, button_deadzone); if (ci->vibration_caps != VibrationCapabilities::NoVibration) { @@ -225,6 +288,11 @@ void PAD::LoadConfig(const SettingsInterface& si) const float pressure_modifier = si.GetFloatValue(section.c_str(), "PressureModifier", 1.0f); g_key_status.SetPressureModifier(i, pressure_modifier); + const int invert_l = si.GetIntValue(section.c_str(), "InvertL", 0); + const int invert_r = si.GetIntValue(section.c_str(), "InvertR", 0); + g_key_status.SetAnalogInvertL(i, (invert_l & 1) != 0, (invert_l & 2) != 0); + g_key_status.SetAnalogInvertR(i, (invert_r & 1) != 0, (invert_r & 2) != 0); + LoadMacroButtonConfig(si, i, type, section); } } @@ -234,41 +302,71 @@ const char* PAD::GetDefaultPadType(u32 pad) return (pad == 0) ? "DualShock2" : "None"; } -void PAD::SetDefaultConfig(SettingsInterface& si) +void PAD::SetDefaultControllerConfig(SettingsInterface& si) { si.ClearSection("InputSources"); si.ClearSection("Hotkeys"); si.ClearSection("Pad"); // PCSX2 Controller Settings - Global Settings - si.SetBoolValue("InputSources", "SDL", true); + for (u32 i = 0; i < static_cast(InputSourceType::Count); i++) + { + si.SetBoolValue("InputSources", + InputManager::InputSourceToString(static_cast(i)), + InputManager::GetInputSourceDefaultEnabled(static_cast(i))); + } +#ifdef SDL_BUILD si.SetBoolValue("InputSources", "SDLControllerEnhancedMode", false); - si.SetBoolValue("InputSources", "XInput", false); - si.SetBoolValue("InputSources", "RawInput", false); +#endif si.SetBoolValue("Pad", "MultitapPort1", false); si.SetBoolValue("Pad", "MultitapPort2", false); si.SetFloatValue("Pad", "PointerXScale", 8.0f); si.SetFloatValue("Pad", "PointerYScale", 8.0f); - si.SetBoolValue("Pad", "PointerXInvert", false); - si.SetBoolValue("Pad", "PointerYInvert", false); // PCSX2 Controller Settings - Default pad types and parameters. for (u32 i = 0; i < NUM_CONTROLLER_PORTS; i++) { + const char* type = GetDefaultPadType(i); const std::string section(GetConfigSection(i)); si.ClearSection(section.c_str()); - si.SetStringValue(section.c_str(), "Type", GetDefaultPadType(i)); - si.SetFloatValue(section.c_str(), "Deadzone", DEFAULT_STICK_DEADZONE); - si.SetFloatValue(section.c_str(), "AxisScale", DEFAULT_STICK_SCALE); - si.SetFloatValue(section.c_str(), "LargeMotorScale", DEFAULT_MOTOR_SCALE); - si.SetFloatValue(section.c_str(), "SmallMotorScale", DEFAULT_MOTOR_SCALE); - si.SetFloatValue(section.c_str(), "PressureModifier", DEFAULT_PRESSURE_MODIFIER); + si.SetStringValue(section.c_str(), "Type", type); + + const ControllerInfo* ci = GetControllerInfo(type); + if (ci) + { + for (u32 i = 0; i < ci->num_settings; i++) + { + const ControllerSettingInfo& csi = ci->settings[i]; + switch (csi.type) + { + case ControllerSettingInfo::Type::Boolean: + si.SetBoolValue(section.c_str(), csi.name, csi.BooleanDefaultValue()); + break; + case ControllerSettingInfo::Type::Integer: + case ControllerSettingInfo::Type::IntegerList: + si.SetIntValue(section.c_str(), csi.name, csi.IntegerDefaultValue()); + break; + case ControllerSettingInfo::Type::Float: + si.SetFloatValue(section.c_str(), csi.name, csi.FloatDefaultValue()); + break; + case ControllerSettingInfo::Type::String: + case ControllerSettingInfo::Type::Path: + si.SetStringValue(section.c_str(), csi.name, csi.StringDefaultValue()); + break; + default: + break; + } + } + } } // PCSX2 Controller Settings - Controller 1 / Controller 2 / ... // Use the automapper to set this up. MapController(si, 0, InputManager::GetGenericBindingMapping("Keyboard")); +} +void PAD::SetDefaultHotkeyConfig(SettingsInterface& si) +{ // PCSX2 Controller Settings - Hotkeys // PCSX2 Controller Settings - Hotkeys - General @@ -305,7 +403,8 @@ void PAD::SetDefaultConfig(SettingsInterface& si) // si.SetStringValue("Hotkeys", "FrameAdvance", "Keyboard"); TBD // si.SetStringValue("Hotkeys", "IncreaseSpeed", "Keyboard"); TBD // si.SetStringValue("Hotkeys", "ResetVM", "Keyboard"); TBD - si.SetStringValue("Hotkeys", "ShutdownVM", "Keyboard/Escape"); + // si.SetStringValue("Hotkeys", "ShutdownVM", "Keyboard"); TBD + si.SetStringValue("Hotkeys", "OpenPauseMenu", "Keyboard/Escape"); si.SetStringValue("Hotkeys", "ToggleFrameLimit", "Keyboard/F4"); si.SetStringValue("Hotkeys", "TogglePause", "Keyboard/Space"); si.SetStringValue("Hotkeys", "ToggleSlowMotion", "Keyboard/Shift & Keyboard/Backtab"); @@ -350,9 +449,53 @@ static const PAD::ControllerBindingInfo s_dualshock2_binds[] = { {"SmallMotor", "Small (High Frequency) Motor", PAD::ControllerBindingType::Motor, GenericInputBinding::SmallMotor}, }; +static const char* s_dualshock2_invert_entries[] = { + "Not Inverted", + "Invert Left/Right", + "Invert Up/Down", + "Invert Left/Right + Up/Down", + nullptr}; + +static const PAD::ControllerSettingInfo s_dualshock2_settings[] = { + {PAD::ControllerSettingInfo::Type::IntegerList, "InvertL", "Invert Left Stick", + "Inverts the direction of the left analog stick.", + "0", "0", "3", nullptr, nullptr, s_dualshock2_invert_entries, 0.0f}, + {PAD::ControllerSettingInfo::Type::IntegerList, "InvertR", "Invert Right Stick", + "Inverts the direction of the right analog stick.", + "0", "0", "3", nullptr, nullptr, s_dualshock2_invert_entries, 0.0f}, + {PAD::ControllerSettingInfo::Type::Float, "Deadzone", "Analog Deadzone", + "Sets the analog stick deadzone, i.e. the fraction of the stick movement which will be ignored.", + "0.00", "0.00", "1.00", "0.01", "%.0f%%", nullptr, 100.0f}, + {PAD::ControllerSettingInfo::Type::Float, "AxisScale", "Analog Sensitivity", + "Sets the analog stick axis scaling factor. A value between 1.30 and 1.40 is recommended when using recent " + "controllers, e.g. DualShock 4, Xbox One Controller.", + "1.33", "0.01", "2.00", "0.01", "%.0f%%", nullptr, 100.0f}, + {PAD::ControllerSettingInfo::Type::Float, "LargeMotorScale", "Large Motor Vibration Scale", + "Increases or decreases the intensity of low frequency vibration sent by the game.", + "1.00", "0.00", "2.00", "0.01", "%.0f%%", nullptr, 100.0f}, + {PAD::ControllerSettingInfo::Type::Float, "SmallMotorScale", "Small Motor Vibration Scale", + "Increases or decreases the intensity of high frequency vibration sent by the game.", + "1.00", "0.00", "2.00", "0.01", "%.0f%%", nullptr, 100.0f}, + {PAD::ControllerSettingInfo::Type::Float, "ButtonDeadzone", "Button/Trigger Deadzone", + "Sets the deadzone for activating buttons/triggers, i.e. the fraction of the trigger which will be ignored.", + "0.00", "0.00", "1.00", "0.01", "%.0f%%", nullptr, 100.0f}, + /*{PAD::ControllerSettingInfo::Type::Float, "InitialPressure", "Initial Pressure", + "Sets the pressure when the modifier button isn't held.", + "1.00", "0.01", "1.00", "0.01", "%.0f%%", nullptr, 100.0f},*/ + {PAD::ControllerSettingInfo::Type::Float, "PressureModifier", "Modifier Pressure", + "Sets the pressure when the modifier button is held.", + "0.50", "0.01", "1.00", "0.01", "%.0f%%", nullptr, 100.0f}, +}; + static const PAD::ControllerInfo s_controller_info[] = { - {"None", "Not Connected", nullptr, 0, PAD::ControllerType::NotConnected, PAD::VibrationCapabilities::NoVibration}, - {"DualShock2", "DualShock 2", s_dualshock2_binds, std::size(s_dualshock2_binds), PAD::ControllerType::DualShock2, PAD::VibrationCapabilities::LargeSmallMotors}, + {PAD::ControllerType::NotConnected, "None", "Not Connected", + nullptr, 0, + nullptr, 0, + PAD::VibrationCapabilities::NoVibration}, + {PAD::ControllerType::DualShock2, "DualShock2", "DualShock 2", + s_dualshock2_binds, std::size(s_dualshock2_binds), + s_dualshock2_settings, std::size(s_dualshock2_settings), + PAD::VibrationCapabilities::LargeSmallMotors}, }; const PAD::ControllerInfo* PAD::GetControllerInfo(ControllerType type) @@ -426,6 +569,18 @@ void PAD::CopyConfiguration(SettingsInterface* dest_si, const SettingsInterface& { dest_si->CopyBoolValue(src_si, "Pad", "MultitapPort1"); dest_si->CopyBoolValue(src_si, "Pad", "MultitapPort2"); + dest_si->CopyBoolValue(src_si, "Pad", "MultitapPort1"); + dest_si->CopyBoolValue(src_si, "Pad", "MultitapPort2"); + dest_si->CopyFloatValue(src_si, "Pad", "PointerXScale"); + dest_si->CopyFloatValue(src_si, "Pad", "PointerYScale"); + for (u32 i = 0; i < static_cast(InputSourceType::Count); i++) + { + dest_si->CopyBoolValue(src_si, "InputSources", + InputManager::InputSourceToString(static_cast(i))); + } +#ifdef SDL_BUILD + dest_si->CopyBoolValue(src_si, "InputSources", "SDLControllerEnhancedMode"); +#endif } for (u32 port = 0; port < NUM_CONTROLLER_PORTS; port++) @@ -464,6 +619,30 @@ void PAD::CopyConfiguration(SettingsInterface* dest_si, const SettingsInterface& dest_si->CopyFloatValue(src_si, section.c_str(), "LargeMotorScale"); dest_si->CopyFloatValue(src_si, section.c_str(), "SmallMotorScale"); } + + for (u32 i = 0; i < info->num_settings; i++) + { + const ControllerSettingInfo& csi = info->settings[i]; + switch (csi.type) + { + case ControllerSettingInfo::Type::Boolean: + dest_si->CopyBoolValue(src_si, section.c_str(), csi.name); + break; + case ControllerSettingInfo::Type::Integer: + case ControllerSettingInfo::Type::IntegerList: + dest_si->CopyIntValue(src_si, section.c_str(), csi.name); + break; + case ControllerSettingInfo::Type::Float: + dest_si->CopyFloatValue(src_si, section.c_str(), csi.name); + break; + case ControllerSettingInfo::Type::String: + case ControllerSettingInfo::Type::Path: + dest_si->CopyStringValue(src_si, section.c_str(), csi.name); + break; + default: + break; + } + } } } diff --git a/pcsx2/PAD/Host/PAD.h b/pcsx2/PAD/Host/PAD.h index 88b22e0d09..9fec948b73 100644 --- a/pcsx2/PAD/Host/PAD.h +++ b/pcsx2/PAD/Host/PAD.h @@ -33,8 +33,9 @@ s32 PADopen(const WindowInfo& wi); void PADclose(); s32 PADsetSlot(u8 port, u8 slot); s32 PADfreeze(FreezeAction mode, freezeData* data); -u8 PADstartPoll(int pad); +u8 PADstartPoll(int _port, int _slot); u8 PADpoll(u8 value); +bool PADcomplete(); namespace PAD { @@ -71,13 +72,52 @@ namespace PAD GenericInputBinding generic_mapping; }; + struct ControllerSettingInfo + { + enum class Type + { + Boolean, + Integer, + IntegerList, + Float, + String, + Path, + }; + + Type type; + const char* name; + const char* display_name; + const char* description; + const char* default_value; + const char* min_value; + const char* max_value; + const char* step_value; + const char* format; + const char** options; + float multiplier; + + const char* StringDefaultValue() const; + bool BooleanDefaultValue() const; + s32 IntegerDefaultValue() const; + s32 IntegerMinValue() const; + s32 IntegerMaxValue() const; + s32 IntegerStepValue() const; + float FloatDefaultValue() const; + float FloatMinValue() const; + float FloatMaxValue() const; + float FloatStepValue() const; + }; + + struct ControllerInfo { + ControllerType type; const char* name; const char* display_name; const ControllerBindingInfo* bindings; u32 num_bindings; - ControllerType type; + const ControllerSettingInfo* settings; + u32 num_settings; PAD::VibrationCapabilities vibration_caps; }; @@ -85,13 +125,14 @@ namespace PAD static constexpr u32 NUM_CONTROLLER_PORTS = 8; /// Number of macro buttons per controller. - static constexpr u32 NUM_MACRO_BUTTONS_PER_CONTROLLER = 4; + static constexpr u32 NUM_MACRO_BUTTONS_PER_CONTROLLER = 16; /// Default stick deadzone/sensitivity. static constexpr float DEFAULT_STICK_DEADZONE = 0.0f; static constexpr float DEFAULT_STICK_SCALE = 1.33f; static constexpr float DEFAULT_MOTOR_SCALE = 1.0f; static constexpr float DEFAULT_PRESSURE_MODIFIER = 0.5f; + static constexpr float DEFAULT_BUTTON_DEADZONE = 0.0f; /// Returns the default type for the specified port. const char* GetDefaultPadType(u32 pad); @@ -100,7 +141,8 @@ namespace PAD void LoadConfig(const SettingsInterface& si); /// Restores default configuration. - void SetDefaultConfig(SettingsInterface& si); + void SetDefaultControllerConfig(SettingsInterface& si); + void SetDefaultHotkeyConfig(SettingsInterface& si); /// Clears all bindings for a given port. void ClearPortBindings(SettingsInterface& si, u32 port); diff --git a/pcsx2/PAD/Host/StateManagement.cpp b/pcsx2/PAD/Host/StateManagement.cpp index 71ae8342c7..71e30eba29 100644 --- a/pcsx2/PAD/Host/StateManagement.cpp +++ b/pcsx2/PAD/Host/StateManagement.cpp @@ -62,7 +62,7 @@ void QueryInfo::reset() memset(response, 0xF3, sizeof(response)); } -u8 QueryInfo::start_poll(int _port) +u8 QueryInfo::start_poll(int _port, int _slot) { if (_port >= 2) { @@ -71,7 +71,7 @@ u8 QueryInfo::start_poll(int _port) } port = _port; - slot = slots[port]; + slot = _slot; const u32 ext_port = sioConvertPortAndSlotToPad(port, slot); @@ -184,9 +184,9 @@ inline bool IsDualshock2() #endif } -u8 pad_start_poll(u8 pad) +u8 pad_start_poll(u8 _port, u8 _slot) { - return query.start_poll(pad - 1); + return query.start_poll(_port, _slot); } u8 pad_poll(u8 value) @@ -516,3 +516,8 @@ u8 pad_poll(u8 value) return query.response[query.lastByte]; } } + +bool pad_complete() +{ + return query.queryDone; +} \ No newline at end of file diff --git a/pcsx2/PAD/Host/StateManagement.h b/pcsx2/PAD/Host/StateManagement.h index 997786779d..acca386607 100644 --- a/pcsx2/PAD/Host/StateManagement.h +++ b/pcsx2/PAD/Host/StateManagement.h @@ -49,7 +49,7 @@ struct QueryInfo u8 response[42]; void reset(); - u8 start_poll(int port); + u8 start_poll(int _port, int _slot); template void set_result(const u8 (&rsp)[S]) @@ -127,5 +127,6 @@ extern QueryInfo query; extern Pad pads[2][4]; extern int slots[2]; -extern u8 pad_start_poll(u8 pad); +extern u8 pad_start_poll(u8 _port, u8 _slot); extern u8 pad_poll(u8 value); +extern bool pad_complete(); \ No newline at end of file diff --git a/pcsx2/PAD/Linux/PAD.cpp b/pcsx2/PAD/Linux/PAD.cpp index 8abfad95cd..496766c455 100644 --- a/pcsx2/PAD/Linux/PAD.cpp +++ b/pcsx2/PAD/Linux/PAD.cpp @@ -199,9 +199,9 @@ s32 PADfreeze(FreezeAction mode, freezeData* data) return 0; } -u8 PADstartPoll(int pad) +u8 PADstartPoll(int port, int slot) { - return pad_start_poll(pad); + return pad_start_poll(port, slot); } u8 PADpoll(u8 value) @@ -209,6 +209,11 @@ u8 PADpoll(u8 value) return pad_poll(value); } +bool PADcomplete() +{ + return pad_complete(); +} + // PADkeyEvent is called every vsync (return NULL if no event) HostKeyEvent* PADkeyEvent() { diff --git a/pcsx2/PAD/Linux/state_management.cpp b/pcsx2/PAD/Linux/state_management.cpp index 37a0867a68..8cfc47c7a4 100644 --- a/pcsx2/PAD/Linux/state_management.cpp +++ b/pcsx2/PAD/Linux/state_management.cpp @@ -51,7 +51,7 @@ void QueryInfo::reset() memset(response, 0xF3, sizeof(response)); } -u8 QueryInfo::start_poll(int _port) +u8 QueryInfo::start_poll(int _port, int _slot) { if (port > 1) { @@ -61,7 +61,7 @@ u8 QueryInfo::start_poll(int _port) queryDone = 0; port = _port; - slot = slots[port]; + slot = _slot; numBytes = 2; lastByte = 0; @@ -160,9 +160,14 @@ inline bool IsDualshock2() #endif } -u8 pad_start_poll(u8 pad) +u8 pad_start_poll(u8 port, u8 slot) { - return query.start_poll(pad - 1); + return query.start_poll(port, slot); +} + +bool pad_complete() +{ + return query.queryDone; } u8 pad_poll(u8 value) diff --git a/pcsx2/PAD/Linux/state_management.h b/pcsx2/PAD/Linux/state_management.h index b3d959362d..005c554d37 100644 --- a/pcsx2/PAD/Linux/state_management.h +++ b/pcsx2/PAD/Linux/state_management.h @@ -48,7 +48,7 @@ struct QueryInfo u8 response[42]; void reset(); - u8 start_poll(int port); + u8 start_poll(int port, int slot); template void set_result(const u8 (&rsp)[S]) @@ -129,5 +129,6 @@ extern QueryInfo query; extern Pad pads[2][4]; extern int slots[2]; -extern u8 pad_start_poll(u8 pad); +extern u8 pad_start_poll(u8 port, u8 slot); extern u8 pad_poll(u8 value); +extern bool pad_complete(); diff --git a/pcsx2/PAD/Linux/wx_dialog/GamepadConfiguration.cpp b/pcsx2/PAD/Linux/wx_dialog/GamepadConfiguration.cpp index 0fc99682c6..d32d0a6b1c 100644 --- a/pcsx2/PAD/Linux/wx_dialog/GamepadConfiguration.cpp +++ b/pcsx2/PAD/Linux/wx_dialog/GamepadConfiguration.cpp @@ -18,9 +18,9 @@ GamepadConfiguration::GamepadConfiguration(int pad, wxWindow* parent) : wxDialog(parent, wxID_ANY, _T("Gamepad"), wxDefaultPosition, wxDefaultSize, wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN) -{ - m_pad_id = pad; + , m_pad_id(pad) +{ wxBoxSizer* gamepad_box = new wxBoxSizer(wxVERTICAL); wxArrayString choices; diff --git a/pcsx2/PAD/Linux/wx_dialog/JoystickConfiguration.cpp b/pcsx2/PAD/Linux/wx_dialog/JoystickConfiguration.cpp index 7bd5e66b0f..d6404f2726 100644 --- a/pcsx2/PAD/Linux/wx_dialog/JoystickConfiguration.cpp +++ b/pcsx2/PAD/Linux/wx_dialog/JoystickConfiguration.cpp @@ -23,8 +23,8 @@ static const s32 joy_check_id = wxID_HIGHEST + 100 + 3; JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow* parent) : wxDialog(parent, wxID_ANY, _T("Joystick configuration"), wxDefaultPosition, wxDefaultSize, wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN) + , m_pad_id(pad) { - m_pad_id = pad; m_isForLeftJoystick = left; wxBoxSizer* joy_conf_box = new wxBoxSizer(wxVERTICAL); diff --git a/pcsx2/PAD/Windows/DirectInput.cpp b/pcsx2/PAD/Windows/DirectInput.cpp index a41857487e..b42100c956 100644 --- a/pcsx2/PAD/Windows/DirectInput.cpp +++ b/pcsx2/PAD/Windows/DirectInput.cpp @@ -137,9 +137,9 @@ public: GUID guidInstance; DirectInputDevice(DeviceType type, IDirectInputDevice8* did, wchar_t* displayName, wchar_t* instanceID, wchar_t* productID, GUID guid) : Device(DI, type, displayName, instanceID, productID) + , guidInstance(guid) { diEffects = 0; - guidInstance = guid; this->did = 0; did->EnumEffects(EnumEffectsCallback, this, DIEFT_ALL); did->EnumObjects(EnumDeviceObjectsCallback, this, DIDFT_ALL); diff --git a/pcsx2/PAD/Windows/DualShock3.cpp b/pcsx2/PAD/Windows/DualShock3.cpp index 37709b079e..e90c0fa342 100644 --- a/pcsx2/PAD/Windows/DualShock3.cpp +++ b/pcsx2/PAD/Windows/DualShock3.cpp @@ -18,181 +18,39 @@ #include "InputManager.h" #include "PADConfig.h" -#include "usb.h" #include "HidDevice.h" - #define VID 0x054c #define PID 0x0268 -// Unresponsive period required before calling DS3Check(). -#define DEVICE_CHECK_DELAY 2000 -// Unresponsive period required before calling DS3Enum(). Note that enum is always called on first check. -#define DEVICE_ENUM_DELAY 10000 +//Sixaxis driver commands. +//All commands must be sent via WriteFile with 49-byte buffer containing output report. +//Byte 0 indicates reportId and must always be 0. +//Byte 1 indicates some command, supported values are specified below. -// Delay between when DS3Check() and DS3Enum() actually do stuff. -#define DOUBLE_CHECK_DELAY 1000 -#define DOUBLE_ENUM_DELAY 20000 - -// Send at least one message every 3 seconds - basically just makes sure the right light(s) are on. -// Not really necessary. -#define UPDATE_INTERVAL 3000 - -unsigned int lastDS3Check = 0; -unsigned int lastDS3Enum = 0; - -typedef void(__cdecl* _usb_init)(void); -typedef int(__cdecl* _usb_close)(usb_dev_handle* dev); -typedef int(__cdecl* _usb_get_string_simple)(usb_dev_handle* dev, int index, char* buf, size_t buflen); -typedef usb_dev_handle*(__cdecl* _usb_open)(struct usb_device* dev); -typedef int(__cdecl* _usb_find_busses)(void); -typedef int(__cdecl* _usb_find_devices)(void); -typedef struct usb_bus*(__cdecl* _usb_get_busses)(void); -typedef usb_dev_handle*(__cdecl* _usb_open)(struct usb_device* dev); -typedef int(__cdecl* _usb_control_msg)(usb_dev_handle* dev, int requesttype, int request, int value, int index, char* bytes, int size, int timeout); - -_usb_init pusb_init; -_usb_close pusb_close; -_usb_get_string_simple pusb_get_string_simple; -_usb_open pusb_open; -_usb_find_busses pusb_find_busses; -_usb_find_devices pusb_find_devices; -_usb_get_busses pusb_get_busses; -_usb_control_msg pusb_control_msg; - -HMODULE hModLibusb = 0; - -void UninitLibUsb() -{ - if (hModLibusb) - { - FreeLibrary(hModLibusb); - hModLibusb = 0; - } -} - -void TryInitDS3(usb_device* dev) -{ - while (dev) - { - if (dev->descriptor.idVendor == VID && dev->descriptor.idProduct == PID) - { - usb_dev_handle* handle = pusb_open(dev); - if (handle) - { - char junk[20]; - // This looks like HidD_GetFeature with a feature report id of 0xF2 to me and a length of 17. - // That doesn't work, however, and 17 is shorter than the report length. - pusb_control_msg(handle, 0xa1, 1, 0x03f2, dev->config->interface->altsetting->bInterfaceNumber, junk, 17, 1000); - pusb_close(handle); - } - } - if (dev->num_children) - { - for (int i = 0; i < dev->num_children; i++) - { - TryInitDS3(dev->children[i]); - } - } - dev = dev->next; - } -} - -void DS3Enum(unsigned int time) -{ - if (time - lastDS3Enum < DOUBLE_ENUM_DELAY) - { - return; - } - lastDS3Enum = time; - pusb_find_busses(); - pusb_find_devices(); -} - -void DS3Check(unsigned int time) -{ - if (time - lastDS3Check < DOUBLE_CHECK_DELAY) - { - return; - } - if (!lastDS3Check) - { - DS3Enum(time); - } - lastDS3Check = time; - - usb_bus* bus = pusb_get_busses(); - while (bus) - { - TryInitDS3(bus->devices); - bus = bus->next; - } -} - -int InitLibUsb() -{ - if (hModLibusb) - { - return 1; - } - hModLibusb = LoadLibraryA("C:\\windows\\system32\\libusb0.dll"); - if (hModLibusb) - { - if ((pusb_init = (_usb_init)GetProcAddress(hModLibusb, "usb_init")) && - (pusb_close = (_usb_close)GetProcAddress(hModLibusb, "usb_close")) && - (pusb_get_string_simple = (_usb_get_string_simple)GetProcAddress(hModLibusb, "usb_get_string_simple")) && - (pusb_open = (_usb_open)GetProcAddress(hModLibusb, "usb_open")) && - (pusb_find_busses = (_usb_find_busses)GetProcAddress(hModLibusb, "usb_find_busses")) && - (pusb_find_devices = (_usb_find_devices)GetProcAddress(hModLibusb, "usb_find_devices")) && - (pusb_get_busses = (_usb_get_busses)GetProcAddress(hModLibusb, "usb_get_busses")) && - (pusb_control_msg = (_usb_control_msg)GetProcAddress(hModLibusb, "usb_control_msg"))) - { - pusb_init(); - return 1; - } - UninitLibUsb(); - } - return 0; -} +//This command allows to set user LEDs. +//Bytes 5,6.7.8 contain mode for corresponding LED: 0 value means LED is OFF, 1 means LEDs in ON and 2 means LEDs is flashing. +//Bytes 9-16 specify 64-bit LED flash period in 100 ns units if some LED is flashing, otherwise not used. +#define SIXAXIS_COMMAND_SET_LEDS 1 +//This command allows to set left and right motors. +//Byte 5 is right motor duration (0-255) and byte 6, if not zero, activates right motor. Zero value disables right motor. +//Byte 7 is left motor duration (0-255) and byte 8 is left motor amplitude (0-255). +#define SIXAXIS_COMMAND_SET_MOTORS 2 +//This command allows to block/unblock setting device LEDs by applications. +//Byte 5 is used as parameter - any non-zero value blocks LEDs, zero value will unblock LEDs. +#define SIXAXIS_COMMAND_BLOCK_LEDS 3 +//This command refreshes driver settings. No parameters used. +//When sixaxis driver loads it reads 'CurrentDriverSetting' binary value from 'HKLM\System\CurrentControlSet\Services\sixaxis\Parameters' registry key. +//If the key is not present then default values are used. Sending this command forces sixaxis driver to re-read the registry and update driver settings. +#define SIXAXIS_COMMAND_REFRESH_DRIVER_SETTING 9 +//This command clears current bluetooth pairing. No parameters used. +#define SIXAXIS_COMMAND_CLEAR_PAIRING 10 int DualShock3Possible() { - return InitLibUsb(); + return 1; } -#include - -struct MotorState -{ - unsigned char duration; - unsigned char force; -}; - -struct LightState -{ - // 0xFF makes it stay on. - unsigned char duration; - // Have to make one or the other non-zero to turn on light. - unsigned char dunno[2]; - // Have to make non-zero to turn on light. - unsigned char on; -}; - -// Data sent to DS3 to set state. -struct DS3Command -{ - unsigned char id; - // Small is first, then big. - MotorState motors[2]; - // 2 is pad 1 light, 4 is pad 2, 8 is pad 3, 16 is pad 4. No clue about the others. - unsigned char lightFlags; - // Lights are in reverse order. pad 1 is last. - LightState lights[4]; - unsigned char dunno[18]; -}; - -#include - int CharToAxis(unsigned char c) { return ((c - 128) * FULLY_DOWN) >> 7; @@ -214,78 +72,11 @@ class DualShock3Device : public Device public: int index; HANDLE hFile; - DS3Command sendState; unsigned char getState[49]; - OVERLAPPED readop; - OVERLAPPED writeop; - int writeCount; - int lastWrite; - - unsigned int dataLastReceived; - - int writeQueued; - int writing; - - int StartRead() - { - int res = ReadFile(hFile, &getState, sizeof(getState), 0, &readop); - return (res || GetLastError() == ERROR_IO_PENDING); - } - - void QueueWrite() - { - // max of 2 queued writes allowed, one for either motor. - if (writeQueued < 2) - { - writeQueued++; - StartWrite(); - } - } - - int StartWrite() - { - if (!writing && writeQueued) - { - lastWrite = GetTickCount(); - writing++; - writeQueued--; - sendState.motors[0].duration = 0x50; - sendState.motors[1].duration = 0x50; - - int bigForce = vibration[0] * 256 / FULLY_DOWN; - if (bigForce > 255) - bigForce = 255; - sendState.motors[1].force = (unsigned char)bigForce; - sendState.motors[0].force = (unsigned char)(vibration[1] >= FULLY_DOWN / 2); - // Can't seem to have them both non-zero at once. - if (sendState.motors[writeCount & 1].force) - { - sendState.motors[(writeCount & 1) ^ 1].force = 0; - sendState.motors[(writeCount & 1) ^ 1].duration = 0; - } - - writeCount++; - int res = WriteFile(hFile, &sendState, sizeof(sendState), 0, &writeop); - return (res || GetLastError() == ERROR_IO_PENDING); - } - return 1; - } DualShock3Device(int index, wchar_t* name, wchar_t* path) : Device(DS3, OTHER, name, path, L"DualShock 3") { - writeCount = 0; - writing = 0; - writeQueued = 0; - memset(&readop, 0, sizeof(readop)); - memset(&writeop, 0, sizeof(writeop)); - memset(&sendState, 0, sizeof(sendState)); - sendState.id = 1; - int temp = (index & 4); - sendState.lightFlags = (1 << (temp + 1)); - sendState.lights[3 - temp].duration = 0xFF; - sendState.lights[3 - temp].dunno[0] = 1; - sendState.lights[3 - temp].on = 1; memset(ps2Vibration, 0, sizeof(ps2Vibration)); vibration[0] = vibration[1] = 0; this->index = index; @@ -350,13 +141,8 @@ public: { if (active) Deactivate(); - // Give grace period before get mad. - lastWrite = dataLastReceived = GetTickCount(); - readop.hEvent = CreateEvent(0, 0, 0, 0); - writeop.hEvent = CreateEvent(0, 0, 0, 0); - hFile = CreateFileW(instanceID, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); - if (!readop.hEvent || !writeop.hEvent || hFile == INVALID_HANDLE_VALUE || - !StartRead()) + hFile = CreateFileW(instanceID, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) { Deactivate(); return 0; @@ -370,78 +156,46 @@ public: { if (!active) return 0; - HANDLE h[2] = { - readop.hEvent, - writeop.hEvent}; - unsigned int time = GetTickCount(); - if (time - lastWrite > UPDATE_INTERVAL) - { - QueueWrite(); - } - while (1) - { - DWORD res = WaitForMultipleObjects(2, h, 0, 0); - if (res == WAIT_OBJECT_0) - { - dataLastReceived = time; - if (!StartRead()) - { - Deactivate(); - return 0; - } - physicalControlState[0] = CharToButton(getState[25]); - physicalControlState[1] = CharToButton(getState[24]); - physicalControlState[2] = CharToButton(getState[23]); - physicalControlState[3] = CharToButton(getState[22]); - physicalControlState[4] = CharToButton(getState[21]); - physicalControlState[5] = CharToButton(getState[20]); - physicalControlState[6] = CharToButton(getState[19]); - physicalControlState[7] = CharToButton(getState[18]); - physicalControlState[10] = CharToButton(getState[17]); - physicalControlState[11] = CharToButton(getState[16]); - physicalControlState[12] = CharToButton(getState[15]); - physicalControlState[13] = CharToButton(getState[14]); - physicalControlState[8] = ((getState[2] & 4) / 4) * FULLY_DOWN; - physicalControlState[9] = ((getState[2] & 2) / 2) * FULLY_DOWN; - physicalControlState[15] = ((getState[2] & 1) / 1) * FULLY_DOWN; - physicalControlState[14] = ((getState[2] & 8) / 8) * FULLY_DOWN; - physicalControlState[16] = CharToAxis(getState[6]); - physicalControlState[17] = CharToAxis(getState[7]); - physicalControlState[18] = CharToAxis(getState[8]); - physicalControlState[19] = CharToAxis(getState[9]); - physicalControlState[20] = CharToAxis(getState[42] + 128); - physicalControlState[21] = CharToAxis(getState[44] + 128); - physicalControlState[22] = CharToAxis(getState[46] + 128); - continue; - } - else if (res == WAIT_OBJECT_0 + 1) - { - writing = 0; - if (!writeQueued && (vibration[0] | vibration[1])) - { - QueueWrite(); - } - if (!StartWrite()) - { - Deactivate(); - return 0; - } - } - else - { - if (time - dataLastReceived >= DEVICE_CHECK_DELAY) - { - if (time - dataLastReceived >= DEVICE_ENUM_DELAY) - { - DS3Enum(time); - } - DS3Check(time); - QueueWrite(); - } - } - break; + unsigned char Buffer[50]; + + Buffer[0] = 0; //reportId + + if (!HidD_GetFeature(hFile, + Buffer, + sizeof(Buffer))) + { + Deactivate(); + return 0; } + + unsigned char* getState = &Buffer[1]; + + physicalControlState[0] = CharToButton(getState[25]); //Square + physicalControlState[1] = CharToButton(getState[24]); //Cross + physicalControlState[2] = CharToButton(getState[23]); //Circle + physicalControlState[3] = CharToButton(getState[22]); //Triangle + physicalControlState[4] = CharToButton(getState[21]); //R1 + physicalControlState[5] = CharToButton(getState[20]); //L1 + physicalControlState[6] = CharToButton(getState[19]); //R2 + physicalControlState[7] = CharToButton(getState[18]); //L2 + physicalControlState[10] = CharToButton(getState[17]); //Dpad Left + physicalControlState[11] = CharToButton(getState[16]); //Dpad Down + physicalControlState[12] = CharToButton(getState[15]); //Dpad Right + physicalControlState[13] = CharToButton(getState[14]); //Dpad Up + physicalControlState[8] = ((getState[2] & 4) / 4) * FULLY_DOWN; //R3 + physicalControlState[9] = ((getState[2] & 2) / 2) * FULLY_DOWN; //L3 + physicalControlState[15] = ((getState[2] & 1) / 1) * FULLY_DOWN; //SELECT + physicalControlState[14] = ((getState[2] & 8) / 8) * FULLY_DOWN; //START + physicalControlState[16] = CharToAxis(getState[6]); //Left Stick X + physicalControlState[17] = CharToAxis(getState[7]); //Left Stick Y + physicalControlState[18] = CharToAxis(getState[8]); //Right Stick X + physicalControlState[19] = CharToAxis(getState[9]); //Right Stick Y + //Compared to libusb all sensor values on sixaxis driver are little-endian and X axis is inversed + physicalControlState[20] = CharToAxis(128 - getState[41]); //Accel X (Left/Right Tilt) + physicalControlState[21] = CharToAxis(getState[43] + 128); //Accel Y (Forward/Back Tilt) + physicalControlState[22] = CharToAxis(getState[45] + 128); //Accel Z + return 1; } @@ -463,9 +217,30 @@ public: } } } - // Make sure at least 2 writes are queued, to update both motors. - QueueWrite(); - QueueWrite(); + + unsigned char outputReport[49]; + + //Clear all data and set reportId to 0 + memset(outputReport, 0, sizeof(outputReport)); + + //This is command for sixaxis driver to set motors + outputReport[1] = SIXAXIS_COMMAND_SET_MOTORS; + + outputReport[5] = 0x50; //right_duration + + outputReport[6] = (unsigned char)(vibration[1] >= FULLY_DOWN / 2); //right_motor_on + + outputReport[7] = 0x50; //left_duration + + int bigForce = vibration[0] * 256 / FULLY_DOWN; + if (bigForce > 255) + bigForce = 255; + + outputReport[8] = (unsigned char)bigForce; //left_motor_force + + DWORD lpNumberOfBytesWritten = 0; + + WriteFile(hFile, outputReport, sizeof(outputReport), &lpNumberOfBytesWritten, NULL); } void SetEffect(ForceFeedbackBinding* binding, unsigned char force) @@ -485,16 +260,7 @@ public: CloseHandle(hFile); hFile = INVALID_HANDLE_VALUE; } - if (readop.hEvent) - { - CloseHandle(readop.hEvent); - } - if (writeop.hEvent) - { - CloseHandle(writeop.hEvent); - } - writing = 0; - writeQueued = 0; + memset(ps2Vibration, 0, sizeof(ps2Vibration)); vibration[0] = vibration[1] = 0; @@ -509,9 +275,6 @@ public: void EnumDualShock3s() { - if (!InitLibUsb()) - return; - HidDeviceInfo* foundDevs = 0; int numDevs = FindHids(&foundDevs, VID, PID); @@ -520,14 +283,33 @@ void EnumDualShock3s() int index = 0; for (int i = 0; i < numDevs; i++) { - if (foundDevs[i].caps.FeatureReportByteLength == 49 && - foundDevs[i].caps.InputReportByteLength == 49 && + if (foundDevs[i].caps.FeatureReportByteLength == 50 && foundDevs[i].caps.OutputReportByteLength == 49) { - wchar_t temp[100]; - wsprintfW(temp, L"DualShock 3 #%i", index + 1); - dm->AddDevice(new DualShock3Device(index, temp, foundDevs[i].path)); - index++; + HANDLE hDevice = CreateFileW(foundDevs[i].path, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + 0, NULL); + if (hDevice != INVALID_HANDLE_VALUE) + { + unsigned char Buffer[50]; + + Buffer[0] = 0; //reportId + + if (HidD_GetFeature(hDevice, + Buffer, + sizeof(Buffer))) + { + wchar_t temp[100]; + wsprintfW(temp, L"DualShock 3 #%i", index + 1); + dm->AddDevice(new DualShock3Device(index, temp, foundDevs[i].path)); + index++; + } + + CloseHandle(hDevice); + } } free(foundDevs[i].path); } diff --git a/pcsx2/PAD/Windows/PAD.cpp b/pcsx2/PAD/Windows/PAD.cpp index fe73929764..612551f123 100644 --- a/pcsx2/PAD/Windows/PAD.cpp +++ b/pcsx2/PAD/Windows/PAD.cpp @@ -836,17 +836,15 @@ struct QueryInfo s32 PADinit() { - const u32 flags = 3; // Note: Won't load settings if already loaded. if (LoadSettings() < 0) { return -1; } - int port = (flags & 3); for (int i = 2; i > 0; i--) { - port = i; + int port = i; port--; for (int slot = 0; slot < 4; slot++) @@ -1057,21 +1055,26 @@ void PADclose() } } -u8 PADstartPoll(int port) +bool PADcomplete() +{ + return query.queryDone; +} + +u8 PADstartPoll(int port, int slot) { DEBUG_NEW_SET(); - port--; - if ((unsigned int)port <= 1 && pads[port][slots[port]].enabled) + + if ((unsigned int)port <= 1 && pads[port][slot].enabled) { query.queryDone = 0; query.port = port; - query.slot = slots[port]; + query.slot = slot; query.numBytes = 2; query.lastByte = 0; DEBUG_IN(port); DEBUG_OUT(0xFF); - DEBUG_IN(slots[port]); - DEBUG_OUT(pads[port][slots[port]].enabled); + DEBUG_IN(slot); + DEBUG_OUT(pads[port][slot].enabled); return 0xFF; } else diff --git a/pcsx2/PAD/Windows/PAD.rc b/pcsx2/PAD/Windows/PAD.rc index d4e157d048..26c0d58e43 100644 --- a/pcsx2/PAD/Windows/PAD.rc +++ b/pcsx2/PAD/Windows/PAD.rc @@ -25,18 +25,18 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "resource.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#include \r\n" "\0" END -3 TEXTINCLUDE +3 TEXTINCLUDE BEGIN "\r\n" "\0" @@ -55,7 +55,7 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "",IDC_BINDINGS_LIST,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,7,183,237,WS_EX_CLIENTEDGE - // Input Bindings: + // Input Bindings: PUSHBUTTON "Select",ID_SELECT,328,34,34,15 PUSHBUTTON "Start",ID_START,366,34,34,15 PUSHBUTTON "Analog",ID_ANALOG,328,51,34,15 @@ -451,7 +451,7 @@ BEGIN GROUPBOX "Game Device APIs",IDC_STATIC,16,59,191,62 CONTROL "DirectInput (Legacy)",IDC_G_DI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,71,100,10 CONTROL "XInput (Modern)",IDC_G_XI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,82,100,10 - CONTROL "DualShock 3 native mode (Requires libusb)",IDC_G_DS3, + CONTROL "DualShock 3 native mode (Requires sixaxis)",IDC_G_DS3, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,94,155,10 CONTROL "Monitor when in background",IDC_BACKGROUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,105,107,10 GROUPBOX "Mouse API",IDC_STATIC,216,16,192,61 @@ -574,4 +574,4 @@ IDR_INI1 RCDATA "Default.ini" ///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED \ No newline at end of file +#endif // not APSTUDIO_INVOKED diff --git a/pcsx2/PAD/Windows/RCa08644 b/pcsx2/PAD/Windows/RCa08644 deleted file mode 100644 index 666cd0f0b4..0000000000 Binary files a/pcsx2/PAD/Windows/RCa08644 and /dev/null differ diff --git a/pcsx2/PAD/Windows/WndProcEater.cpp b/pcsx2/PAD/Windows/WndProcEater.cpp index 7185c0b50d..ea4b8ba948 100644 --- a/pcsx2/PAD/Windows/WndProcEater.cpp +++ b/pcsx2/PAD/Windows/WndProcEater.cpp @@ -18,14 +18,12 @@ #include "WndProcEater.h" WndProcEater::WndProcEater() + : hWndEaten(0) + , eatenWndProc(0) + , extraProcs(0) + , numExtraProcs(0) + , hMutex(CreateMutex(0, 0, L"PAD")) { - hWndEaten = 0; - eatenWndProc = 0; - - extraProcs = 0; - numExtraProcs = 0; - - hMutex = CreateMutex(0, 0, L"PAD"); } WndProcEater::~WndProcEater() throw() diff --git a/pcsx2/PCSX2.rc b/pcsx2/PCSX2.rc index e5686f29c6..63b781f8ba 100644 --- a/pcsx2/PCSX2.rc +++ b/pcsx2/PCSX2.rc @@ -29,14 +29,14 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "resource.h\r\n" "SysForwardDefs.h\r\n" "svnrev.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" @@ -54,7 +54,7 @@ END VS_VERSION_INFO VERSIONINFO #if PCSX2_isReleaseVersion == false && GIT_TAGGED_COMMIT && defined(GIT_TAG_HI) - FILEVERSION GIT_TAG_HI, GIT_TAG_MID, GIT_TAG_LO, 0 + FILEVERSION GIT_TAG_HI, GIT_TAG_MID, GIT_TAG_LO, 0 PRODUCTVERSION GIT_TAG_HI, GIT_TAG_MID, GIT_TAG_LO, 0 #else FILEVERSION VER_FILE_VERSION @@ -114,7 +114,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK // TEXTINCLUDE // -3 TEXTINCLUDE +3 TEXTINCLUDE BEGIN "\r\n" "\0" diff --git a/pcsx2/PCSX2Base.h b/pcsx2/PCSX2Base.h index 96aa82ef9b..41d2036a1e 100644 --- a/pcsx2/PCSX2Base.h +++ b/pcsx2/PCSX2Base.h @@ -21,21 +21,24 @@ #include "common/Pcsx2Defs.h" #include "GS/config.h" -#if defined(__GNUC__) - // Convert gcc see define into GS (windows) define - #if defined(__AVX2__) - #define _M_SSE 0x501 - #elif defined(__AVX__) - #define _M_SSE 0x500 - #elif defined(__SSE4_1__) - #define _M_SSE 0x401 - #else - #error PCSX2 requires compiling for at least SSE 4.1 - #endif -#elif _M_SSE < 0x401 +#if defined(__AVX2__) + #define _M_SSE 0x501 +#elif defined(__AVX__) + #define _M_SSE 0x500 +#elif defined(__SSE4_1__) + #define _M_SSE 0x401 +#else #error PCSX2 requires compiling for at least SSE 4.1 #endif +// Require 32 bit alignment for vectors for AVX2. +#if _M_SSE >= 0x501 + #define SSE_ALIGN_N 32 +#else + #define SSE_ALIGN_N 16 +#endif +#define SSE_ALIGN alignas(SSE_ALIGN_N) + // Starting with AVX, processors have fast unaligned loads // Reduce code duplication by not compiling multiple versions #if _M_SSE >= 0x500 diff --git a/pcsx2/PINE.cpp b/pcsx2/PINE.cpp index 0b9be9804b..56fe912849 100644 --- a/pcsx2/PINE.cpp +++ b/pcsx2/PINE.cpp @@ -329,8 +329,7 @@ PINEServer::IPCBuffer PINEServer::ParseCommand(char* buf, char* ret_buffer, u32 if (!SafetyChecks(buf_cnt, 4, ret_cnt, 8, buf_size)) goto error; const u32 a = FromArray(&buf[buf_cnt], 0); - u64 res = 0; - memRead64(a, &res); + const u64 res = memRead64(a); ToArray(ret_buffer, res, ret_cnt); ret_cnt += 8; buf_cnt += 4; diff --git a/pcsx2/PINE.h b/pcsx2/PINE.h index 2cf61dc401..b8179b3a3e 100644 --- a/pcsx2/PINE.h +++ b/pcsx2/PINE.h @@ -13,7 +13,7 @@ * If not, see . */ -/* A reference client implementation for interfacing with PINE is available +/* A reference client implementation for interfacing with PINE is available * here: https://code.govanify.com/govanify/pine/ */ #pragma once @@ -37,6 +37,8 @@ using namespace Threading; +class SysCoreThread; + class PINEServer : public pxThread { // parent thread @@ -84,10 +86,10 @@ protected: char* m_ipc_buffer; /** - * IPC Command messages opcodes. - * A list of possible operations possible by the IPC. + * IPC Command messages opcodes. + * A list of possible operations possible by the IPC. * Each one of them is what we call an "opcode" and is the first - * byte sent by the IPC to differentiate between commands. + * byte sent by the IPC to differentiate between commands. */ enum IPCCommand : unsigned char { @@ -122,7 +124,7 @@ protected: }; /** - * IPC message buffer. + * IPC message buffer. * A list of all needed fields to store an IPC message. */ struct IPCBuffer @@ -154,14 +156,14 @@ protected: * buf: buffer containing the IPC command. * buf_size: size of the buffer announced. * ret_buffer: buffer that will be used to send the reply. - * return value: IPCBuffer containing a buffer with the result - * of the command and its size. + * return value: IPCBuffer containing a buffer with the result + * of the command and its size. */ IPCBuffer ParseCommand(char* buf, char* ret_buffer, u32 buf_size); /** * Formats an IPC buffer - * ret_buffer: return buffer to use. + * ret_buffer: return buffer to use. * size: size of the IPC buffer. * return value: buffer containing the status code allocated of size */ @@ -170,17 +172,17 @@ protected: /** * Initializes an open socket for IPC communication. - * return value: -1 if a fatal failure happened, 0 otherwise. + * return value: -1 if a fatal failure happened, 0 otherwise. */ int StartSocket(); /** - * Converts an uint to an char* in little endian - * res_array: the array to modify + * Converts an uint to an char* in little endian + * res_array: the array to modify * res: the value to convert - * i: when to insert it into the array - * return value: res_array - * NB: implicitely inlined + * i: when to insert it into the array + * return value: res_array + * NB: implicitely inlined */ template static char* ToArray(char* res_array, T res, int i) @@ -190,11 +192,11 @@ protected: } /** - * Converts a char* to an uint in little endian + * Converts a char* to an uint in little endian * arr: the array to convert - * i: when to load it from the array - * return value: the converted value - * NB: implicitely inlined + * i: when to load it from the array + * return value: the converted value + * NB: implicitely inlined */ template static T FromArray(char* arr, int i) diff --git a/pcsx2/Patch.h b/pcsx2/Patch.h index 5707097687..f4d21701ff 100644 --- a/pcsx2/Patch.h +++ b/pcsx2/Patch.h @@ -67,7 +67,7 @@ enum patch_data_type { // PCSX2 currently supports the following values: // 0 - apply the patch line once on game boot/startup // 1 - apply the patch line continuously (technically - on every vsync) -// 2 - effect of 0 and 1 combined, see below +// 2 - effect of 0 and 1 combined, see below // Note: // - while it may seem that a value of 1 does the same as 0, but also later // continues to apply the patch on every vsync - it's not. @@ -76,7 +76,7 @@ enum patch_data_type { // will get applied before the first vsync and therefore earlier than 1 patches. // - There's no "place" value which indicates to apply both once on startup // and then also continuously, however such behavior can be achieved by -// duplicating the line where one has a 0 place and the other has a 1 place. +// duplicating the line where one has a 0 place and the other has a 1 place. enum patch_place_type { PPT_ONCE_ON_LOAD = 0, PPT_CONTINUOUSLY = 1, diff --git a/pcsx2/Patch_Memory.cpp b/pcsx2/Patch_Memory.cpp index 92b3d77ccc..9e4e7cb4d4 100644 --- a/pcsx2/Patch_Memory.cpp +++ b/pcsx2/Patch_Memory.cpp @@ -1,5 +1,5 @@ /* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2010 PCSX2 Dev Team + * Copyright (C) 2002-2022 PCSX2 Dev Team * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- @@ -196,7 +196,7 @@ void handle_extended_t(IniPatch *p) } else if ((p->addr & 0xF0000000) == 0x40000000) // 4aaaaaaa nnnnssss + Another line { - IterationCount = ((u32)p->data & 0xFFFF0000) / 0x10000; + IterationCount = ((u32)p->data & 0xFFFF0000) >> 16; IterationIncrement = ((u32)p->data & 0x0000FFFF) * 4; PrevCheatAddr = (u32)p->addr & 0x0FFFFFFF; PrevCheatType = 0x4000; @@ -247,135 +247,256 @@ void handle_extended_t(IniPatch *p) memWrite16((u32)p->addr & 0x0FFFFFFF, (u16)(mem ^ (p->data & 0x0000FFFF))); } } - else if (p->addr < 0xE0000000) + else if ((p->addr & 0xF0000000) == 0xD0000000 || (p->addr & 0xF0000000) == 0xE0000000) { - if (((u32)p->data & 0xFFFF0000) == 0x00000000) // Daaaaaaa 0000dddd - { - u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); - if (mem != (0x0000FFFF & (u32)p->data)) - { - SkipCount = 1; - } - PrevCheatType = 0; - } - else if (((u32)p->data & 0xFFFF0000) == 0x00100000) // Daaaaaaa 0010dddd - { - u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); - if (mem == (0x0000FFFF & (u32)p->data)) - { - SkipCount = 1; - } - PrevCheatType = 0; - } - else if (((u32)p->data & 0xFFFF0000) == 0x00200000) // Daaaaaaa 0020dddd - { - u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); - if (mem >= (0x0000FFFF & (u32)p->data)) - { - SkipCount = 1; - } - PrevCheatType = 0; - } - else if (((u32)p->data & 0xFFFF0000) == 0x00300000) // Daaaaaaa 0030dddd - { - u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); - if (mem <= (0x0000FFFF & (u32)p->data)) - { - SkipCount = 1; - } - PrevCheatType = 0; - } - } - else if (p->addr < 0xF0000000) - { - if (((u32)p->data & 0xF0000000) == 0x00000000) // Ezyyvvvv 0aaaaaaa - { - u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000; + u32 addr = (u32)p->addr; + u32 data = (u32)p->data; - if (z == 0) // E0yyvvvv 0aaaaaaa + // Since D-codes now have the additional functionality present in PS2rd which + // incorporates E-code-like functionality by making use of the unused bits in + // D-codes, the E-codes are now just converted to D-codes to reduce bloat. + + if ((addr & 0xF0000000) == 0xE0000000) + { + // Ezyyvvvv taaaaaaa -> Daaaaaaa yytzvvvv + addr = 0xD0000000 | ((u32)p->data & 0x0FFFFFFF); + data = 0x00000000 | ((u32)p->addr & 0x0000FFFF); + data = data | ((u32)p->addr & 0x00FF0000) << 8; + data = data | ((u32)p->addr & 0x0F000000) >> 8; + data = data | ((u32)p->data & 0xF0000000) >> 8; + } + + const u8 type = (data & 0x000F0000) >> 16; + const u8 cond = (data & 0x00F00000) >> 20; + + if (cond == 0) // Daaaaaaa yy0zvvvv + { + if (type == 0) // Daaaaaaa yy00vvvv { - u16 mem = memRead16((u32)p->data & 0x0FFFFFFF); - if (mem != (0x0000FFFF & (u32)p->addr)) + u16 mem = memRead16(addr & 0x0FFFFFFF); + if (mem != (data & 0x0000FFFF)) { - SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } } PrevCheatType = 0; } - else if (z == 1) // E1yy00vv 0aaaaaaa + else if (type == 1) // Daaaaaaa yy0100vv { - u8 mem = memRead8((u32)p->data & 0x0FFFFFFF); - if (mem != (0x000000FF & (u32)p->addr)) + u8 mem = memRead8(addr & 0x0FFFFFFF); + if (mem != (data & 0x000000FF)) { - SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } } PrevCheatType = 0; } } - else if (((u32)p->data & 0xF0000000) == 0x10000000) // Ezyyvvvv 1aaaaaaa + else if (cond == 1) // Daaaaaaa yy1zvvvv { - u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000; - - if (z == 0) // E0yyvvvv 1aaaaaaa + if (type == 0) // Daaaaaaa yy10vvvv { - u16 mem = memRead16((u32)p->data & 0x0FFFFFFF); - if (mem == (0x0000FFFF & (u32)p->addr)) + u16 mem = memRead16(addr & 0x0FFFFFFF); + if (mem == (data & 0x0000FFFF)) { - SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } } PrevCheatType = 0; } - else if (z == 1) // E1yy00vv 1aaaaaaa + else if (type == 1) // Daaaaaaa yy1100vv { - u8 mem = memRead8((u32)p->data & 0x0FFFFFFF); - if (mem == (0x000000FF & (u32)p->addr)) + u8 mem = memRead8(addr & 0x0FFFFFFF); + if (mem == (data & 0x000000FF)) { - SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } } PrevCheatType = 0; } } - else if (((u32)p->data & 0xF0000000) == 0x20000000) // Ezyyvvvv 2aaaaaaa + else if (cond == 2) // Daaaaaaa yy2zvvvv { - u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000; - - if (z == 0) // E0yyvvvv 2aaaaaaa + if (type == 0) // Daaaaaaa yy20vvvv { - u16 mem = memRead16((u32)p->data & 0x0FFFFFFF); - if (mem >= (0x0000FFFF & (u32)p->addr)) + u16 mem = memRead16(addr & 0x0FFFFFFF); + if (mem >= (data & 0x0000FFFF)) { - SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } } PrevCheatType = 0; } - else if (z == 1) // E1yy00vv 2aaaaaaa + else if (type == 1) // Daaaaaaa yy2100vv { - u8 mem = memRead8((u32)p->data & 0x0FFFFFFF); - if (mem >= (0x000000FF & (u32)p->addr)) + u8 mem = memRead8(addr & 0x0FFFFFFF); + if (mem >= (data & 0x000000FF)) { - SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } } PrevCheatType = 0; } } - else if (((u32)p->data & 0xF0000000) == 0x30000000) // Ezyyvvvv 3aaaaaaa + else if (cond == 3) // Daaaaaaa yy3zvvvv { - u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000; - - if (z == 0) // E0yyvvvv 3aaaaaaa + if (type == 0) // Daaaaaaa yy30vvvv { - u16 mem = memRead16((u32)p->data & 0x0FFFFFFF); - if (mem <= (0x0000FFFF & (u32)p->addr)) + u16 mem = memRead16(addr & 0x0FFFFFFF); + if (mem <= (data & 0x0000FFFF)) { - SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } } PrevCheatType = 0; } - else if (z == 1) // E1yy00vv 3aaaaaaa + else if (type == 1) // Daaaaaaa yy3100vv { - u8 mem = memRead8((u32)p->data & 0x0FFFFFFF); - if (mem <= (0x000000FF & (u32)p->addr)) + u8 mem = memRead8(addr & 0x0FFFFFFF); + if (mem <= (data & 0x000000FF)) { - SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } + } + PrevCheatType = 0; + } + } + else if (cond == 4) // Daaaaaaa yy4zvvvv + { + if (type == 0) // Daaaaaaa yy40vvvv + { + u16 mem = memRead16(addr & 0x0FFFFFFF); + if (mem & (data & 0x0000FFFF)) + { + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } + } + PrevCheatType = 0; + } + else if (type == 1) // Daaaaaaa yy4100vv + { + u8 mem = memRead8(addr & 0x0FFFFFFF); + if (mem & (data & 0x000000FF)) + { + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } + } + PrevCheatType = 0; + } + } + else if (cond == 5) // Daaaaaaa yy5zvvvv + { + if (type == 0) // Daaaaaaa yy50vvvv + { + u16 mem = memRead16(addr & 0x0FFFFFFF); + if (!(mem & (data & 0x0000FFFF))) + { + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } + } + PrevCheatType = 0; + } + else if (type == 1) // Daaaaaaa yy5100vv + { + u8 mem = memRead8(addr & 0x0FFFFFFF); + if (!(mem & (data & 0x000000FF))) + { + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } + } + PrevCheatType = 0; + } + } + else if (cond == 6) // Daaaaaaa yy6zvvvv + { + if (type == 0) // Daaaaaaa yy60vvvv + { + u16 mem = memRead16(addr & 0x0FFFFFFF); + if (mem | (data & 0x0000FFFF)) + { + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } + } + PrevCheatType = 0; + } + else if (type == 1) // Daaaaaaa yy6100vv + { + u8 mem = memRead8(addr & 0x0FFFFFFF); + if (mem | (data & 0x000000FF)) + { + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } + } + PrevCheatType = 0; + } + } + else if (cond == 7) // Daaaaaaa yy7zvvvv + { + if (type == 0) // Daaaaaaa yy70vvvv + { + u16 mem = memRead16(addr & 0x0FFFFFFF); + if (!(mem | (data & 0x0000FFFF))) + { + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } + } + PrevCheatType = 0; + } + else if (type == 1) // Daaaaaaa yy7100vv + { + u8 mem = memRead8(addr & 0x0FFFFFFF); + if (!(mem | (data & 0x000000FF))) + { + SkipCount = (data & 0xFF000000) >> 24; + if (!SkipCount) + { + SkipCount = 1; + } } PrevCheatType = 0; } @@ -388,7 +509,6 @@ void handle_extended_t(IniPatch *p) // Patch.cpp itself declares this prototype, so make sure to keep in sync. void _ApplyPatch(IniPatch *p) { - u64 mem = 0; u64 ledata = 0; if (p->enabled == 0) return; @@ -414,9 +534,8 @@ void _ApplyPatch(IniPatch *p) break; case DOUBLE_T: - memRead64(p->addr, &mem); - if (mem != p->data) - memWrite64(p->addr, &p->data); + if (memRead64(p->addr) != (u64)p->data) + memWrite64(p->addr, (u64)p->data); break; case EXTENDED_T: @@ -437,9 +556,8 @@ void _ApplyPatch(IniPatch *p) case DOUBLE_LE_T: ledata = SwapEndian(p->data, 64); - memRead64(p->addr, &mem); - if (mem != ledata) - memWrite64(p->addr, ledata); + if (memRead64(p->addr) != (u64)ledata) + memWrite64(p->addr, (u64)ledata); break; default: diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp index c3641b1479..b445012166 100644 --- a/pcsx2/Pcsx2Config.cpp +++ b/pcsx2/Pcsx2Config.cpp @@ -23,7 +23,7 @@ #include "Config.h" #include "GS.h" #include "HostDisplay.h" -#include "CDVD/CDVDaccess.h" +#include "CDVD/CDVDcommon.h" #include "MemoryCardFile.h" #ifndef PCSX2_CORE @@ -155,6 +155,7 @@ Pcsx2Config::RecompilerOptions::RecompilerOptions() EnableIOP = true; EnableVU0 = true; EnableVU1 = true; + EnableFastmem = true; // vu and fpu clamping default to standard overflow. vuOverflow = true; @@ -211,6 +212,7 @@ void Pcsx2Config::RecompilerOptions::LoadSave(SettingsWrapper& wrap) SettingsWrapBitBool(EnableEECache); SettingsWrapBitBool(EnableVU0); SettingsWrapBitBool(EnableVU1); + SettingsWrapBitBool(EnableFastmem); SettingsWrapBitBool(vuOverflow); SettingsWrapBitBool(vuExtraOverflow); @@ -220,10 +222,6 @@ void Pcsx2Config::RecompilerOptions::LoadSave(SettingsWrapper& wrap) SettingsWrapBitBool(fpuOverflow); SettingsWrapBitBool(fpuExtraOverflow); SettingsWrapBitBool(fpuFullMode); - - SettingsWrapBitBool(StackFrameChecks); - SettingsWrapBitBool(PreBlockCheckEE); - SettingsWrapBitBool(PreBlockCheckIOP); } bool Pcsx2Config::CpuOptions::CpusChanged(const CpuOptions& right) const @@ -305,7 +303,7 @@ Pcsx2Config::GSOptions::GSOptions() PCRTCOffsets = false; PCRTCOverscan = false; IntegerScaling = false; - LinearPresent = true; + LinearPresent = GSPostBilinearMode::BilinearSmooth; SyncToHostRefreshRate = false; UseDebugDevice = false; UseBlitSwapChain = false; @@ -321,16 +319,18 @@ Pcsx2Config::GSOptions::GSOptions() OsdShowResolution = false; OsdShowGSStats = false; OsdShowIndicators = true; + OsdShowSettings = false; + OsdShowInputs = false; + OsdShowFrameTimes = false; - HWDisableReadbacks = false; - AccurateDATE = true; + HWDownloadMode = GSHardwareDownloadMode::Enabled; + HWSpinGPUForReadbacks = false; + HWSpinCPUForReadbacks = false; GPUPaletteConversion = false; - ConservativeFramebuffer = true; AutoFlushSW = true; PreloadFrameWithGSData = false; WrapGSMem = false; Mipmap = true; - AA1 = true; PointListPalette = false; ManualUserHacks = false; @@ -351,9 +351,6 @@ Pcsx2Config::GSOptions::GSOptions() LoadTextureReplacements = false; LoadTextureReplacementsAsync = true; PrecacheTextureReplacements = false; - - ShaderFX_Conf = "shaders/GS_FX_Settings.ini"; - ShaderFX_GLSL = "shaders/GS.fx"; } bool Pcsx2Config::GSOptions::operator==(const GSOptions& right) const @@ -382,11 +379,20 @@ bool Pcsx2Config::GSOptions::OptionsAreEqual(const GSOptions& right) const OpEqu(VsyncEnable) && OpEqu(InterlaceMode) && + OpEqu(LinearPresent) && OpEqu(Zoom) && OpEqu(StretchY) && +#ifndef PCSX2_CORE OpEqu(OffsetX) && OpEqu(OffsetY) && +#else + OpEqu(Crop[0]) && + OpEqu(Crop[1]) && + OpEqu(Crop[2]) && + OpEqu(Crop[3]) && +#endif + OpEqu(OsdScale) && OpEqu(Renderer) && @@ -398,10 +404,13 @@ bool Pcsx2Config::GSOptions::OptionsAreEqual(const GSOptions& right) const OpEqu(TextureFiltering) && OpEqu(TexturePreloading) && OpEqu(GSDumpCompression) && + OpEqu(HWDownloadMode) && + OpEqu(CASMode) && OpEqu(Dithering) && OpEqu(MaxAnisotropy) && OpEqu(SWExtraThreads) && OpEqu(SWExtraThreadsHeight) && + OpEqu(TriFilter) && OpEqu(TVShader) && OpEqu(SkipDrawEnd) && OpEqu(SkipDrawStart) && @@ -412,18 +421,17 @@ bool Pcsx2Config::GSOptions::OptionsAreEqual(const GSOptions& right) const OpEqu(UserHacks_TCOffsetX) && OpEqu(UserHacks_TCOffsetY) && OpEqu(UserHacks_CPUSpriteRenderBW) && - OpEqu(UserHacks_TriFilter) && + OpEqu(UserHacks_CPUCLUTRender) && OpEqu(OverrideTextureBarriers) && OpEqu(OverrideGeometryShaders) && + OpEqu(CAS_Sharpness) && OpEqu(ShadeBoost_Brightness) && OpEqu(ShadeBoost_Contrast) && OpEqu(ShadeBoost_Saturation) && OpEqu(SaveN) && OpEqu(SaveL) && - OpEqu(Adapter) && - OpEqu(ShaderFX_Conf) && - OpEqu(ShaderFX_GLSL)); + OpEqu(Adapter)); } bool Pcsx2Config::GSOptions::operator!=(const GSOptions& right) const @@ -466,11 +474,12 @@ void Pcsx2Config::GSOptions::LoadSave(SettingsWrapper& wrap) SettingsWrapBitBool(SyncToHostRefreshRate); SettingsWrapEnumEx(AspectRatio, "AspectRatio", AspectRatioNames); SettingsWrapEnumEx(FMVAspectRatioSwitch, "FMVAspectRatioSwitch", FMVAspectRatioSwitchNames); - SettingsWrapEntry(Zoom); SettingsWrapEntry(StretchY); - SettingsWrapEntry(OffsetX); - SettingsWrapEntry(OffsetY); + SettingsWrapEntryEx(Crop[0], "CropLeft"); + SettingsWrapEntryEx(Crop[1], "CropTop"); + SettingsWrapEntryEx(Crop[2], "CropRight"); + SettingsWrapEntryEx(Crop[3], "CropBottom"); #endif #ifndef PCSX2_CORE @@ -490,7 +499,8 @@ void Pcsx2Config::GSOptions::LoadSaveIniSettings(SettingsWrapper& wrap) #define GSSettingIntEx(var, name) SettingsWrapBitfieldEx(var, name) #define GSSettingBool(var) SettingsWrapBitBool(var) #define GSSettingBoolEx(var, name) SettingsWrapBitBoolEx(var, name) -#define GSSettingFloat(var) SettingsWrapBitfield(var) +#define GSSettingFloat(var) SettingsWrapEntry(var) +#define GSSettingFloatEx(var, name) SettingsWrapEntryEx(var, name) #define GSSettingIntEnumEx(var, name) SettingsWrapIntEnumEx(var, name) #define GSSettingString(var) SettingsWrapEntry(var) #define GSSettingStringEx(var, name) SettingsWrapEntryEx(var, name) @@ -504,7 +514,8 @@ void Pcsx2Config::GSOptions::ReloadIniSettings() #define GSSettingIntEx(var, name) var = theApp.GetConfigI(name) #define GSSettingBool(var) var = theApp.GetConfigB(#var) #define GSSettingBoolEx(var, name) var = theApp.GetConfigB(name) -#define GSSettingFloat(var) var = static_cast(theApp.GetConfigI(#var)) +#define GSSettingFloat(var) var = static_cast(theApp.GetConfigI(#var)) +#define GSSettingFloatEx(var, name) var = static_cast(theApp.GetConfigI(name)) #define GSSettingIntEnumEx(var, name) var = static_cast(theApp.GetConfigI(name)) #define GSSettingString(var) var = theApp.GetConfigS(#var) #define GSSettingStringEx(var, name) var = theApp.GetConfigS(name) @@ -517,7 +528,6 @@ void Pcsx2Config::GSOptions::ReloadIniSettings() GSSettingBoolEx(PCRTCOffsets, "pcrtc_offsets"); GSSettingBoolEx(PCRTCOverscan, "pcrtc_overscan"); GSSettingBool(IntegerScaling); - GSSettingBoolEx(LinearPresent, "linear_present"); GSSettingBool(UseDebugDevice); GSSettingBool(UseBlitSwapChain); GSSettingBoolEx(DisableShaderCache, "disable_shader_cache"); @@ -533,16 +543,17 @@ void Pcsx2Config::GSOptions::ReloadIniSettings() GSSettingBool(OsdShowResolution); GSSettingBool(OsdShowGSStats); GSSettingBool(OsdShowIndicators); + GSSettingBool(OsdShowSettings); + GSSettingBool(OsdShowInputs); + GSSettingBool(OsdShowFrameTimes); - GSSettingBool(HWDisableReadbacks); - GSSettingBoolEx(AccurateDATE, "accurate_date"); + GSSettingBool(HWSpinGPUForReadbacks); + GSSettingBool(HWSpinCPUForReadbacks); GSSettingBoolEx(GPUPaletteConversion, "paltex"); - GSSettingBoolEx(ConservativeFramebuffer, "conservative_framebuffer"); GSSettingBoolEx(AutoFlushSW, "autoflush_sw"); GSSettingBoolEx(PreloadFrameWithGSData, "preload_frame_with_gs_data"); GSSettingBoolEx(WrapGSMem, "wrap_gs_mem"); GSSettingBoolEx(Mipmap, "mipmap"); - GSSettingBoolEx(AA1, "aa1"); GSSettingBoolEx(ManualUserHacks, "UserHacks"); GSSettingBoolEx(UserHacks_AlignSpriteX, "UserHacks_align_sprite_X"); GSSettingBoolEx(UserHacks_AutoFlush, "UserHacks_AutoFlush"); @@ -555,7 +566,6 @@ void Pcsx2Config::GSOptions::ReloadIniSettings() GSSettingBoolEx(UserHacks_TextureInsideRt, "UserHacks_TextureInsideRt"); GSSettingBoolEx(FXAA, "fxaa"); GSSettingBool(ShadeBoost); - GSSettingBoolEx(ShaderFX, "shaderfx"); GSSettingBoolEx(DumpGSData, "dump"); GSSettingBoolEx(SaveRT, "save"); GSSettingBoolEx(SaveFrame, "savef"); @@ -570,13 +580,16 @@ void Pcsx2Config::GSOptions::ReloadIniSettings() GSSettingBool(LoadTextureReplacementsAsync); GSSettingBool(PrecacheTextureReplacements); - GSSettingIntEnumEx(InterlaceMode, "deinterlace"); + GSSettingIntEnumEx(LinearPresent, "linear_present_mode"); + GSSettingIntEnumEx(InterlaceMode, "deinterlace_mode"); GSSettingFloat(OsdScale); GSSettingIntEnumEx(Renderer, "Renderer"); - GSSettingIntEx(UpscaleMultiplier, "upscale_multiplier"); - UpscaleMultiplier = std::clamp(UpscaleMultiplier, 1u, 8u); + GSSettingFloatEx(UpscaleMultiplier, "upscale_multiplier"); + + // ~51x would the upper bound here for 32768x32768 textures, but you'll run out VRAM long before then. + UpscaleMultiplier = std::clamp(UpscaleMultiplier, 0.5f, 50.0f); GSSettingIntEnumEx(HWMipmap, "mipmap_hw"); GSSettingIntEnumEx(AccurateBlendingUnit, "accurate_blending_unit"); @@ -584,6 +597,9 @@ void Pcsx2Config::GSOptions::ReloadIniSettings() GSSettingIntEnumEx(TextureFiltering, "filter"); GSSettingIntEnumEx(TexturePreloading, "texture_preloading"); GSSettingIntEnumEx(GSDumpCompression, "GSDumpCompression"); + GSSettingIntEnumEx(HWDownloadMode, "HWDownloadMode"); + GSSettingIntEnumEx(CASMode, "CASMode"); + GSSettingIntEx(CAS_Sharpness, "CASSharpness"); GSSettingIntEx(Dithering, "dithering_ps2"); GSSettingIntEx(MaxAnisotropy, "MaxAnisotropy"); GSSettingIntEx(SWExtraThreads, "extrathreads"); @@ -599,7 +615,8 @@ void Pcsx2Config::GSOptions::ReloadIniSettings() GSSettingIntEx(UserHacks_TCOffsetX, "UserHacks_TCOffsetX"); GSSettingIntEx(UserHacks_TCOffsetY, "UserHacks_TCOffsetY"); GSSettingIntEx(UserHacks_CPUSpriteRenderBW, "UserHacks_CPUSpriteRenderBW"); - GSSettingIntEnumEx(UserHacks_TriFilter, "UserHacks_TriFilter"); + GSSettingIntEx(UserHacks_CPUCLUTRender, "UserHacks_CPUCLUTRender"); + GSSettingIntEnumEx(TriFilter, "TriFilter"); GSSettingIntEx(OverrideTextureBarriers, "OverrideTextureBarriers"); GSSettingIntEx(OverrideGeometryShaders, "OverrideGeometryShaders"); @@ -610,8 +627,6 @@ void Pcsx2Config::GSOptions::ReloadIniSettings() GSSettingIntEx(SaveL, "savel"); GSSettingString(Adapter); - GSSettingStringEx(ShaderFX_Conf, "shaderfx_conf"); - GSSettingStringEx(ShaderFX_GLSL, "shaderfx_glsl"); #undef GSSettingInt #undef GSSettingIntEx @@ -646,18 +661,14 @@ void Pcsx2Config::GSOptions::MaskUserHacks() UserHacks_TCOffsetX = 0; UserHacks_TCOffsetY = 0; UserHacks_CPUSpriteRenderBW = 0; + UserHacks_CPUCLUTRender = 0; SkipDrawStart = 0; SkipDrawEnd = 0; - - // in wx, we put trilinear filtering behind user hacks, but not in qt. -#ifndef PCSX2_CORE - UserHacks_TriFilter = TriFiltering::Automatic; -#endif } void Pcsx2Config::GSOptions::MaskUpscalingHacks() { - if (UpscaleMultiplier != 1 && ManualUserHacks) + if (UpscaleMultiplier > 1.0f && ManualUserHacks) return; UserHacks_AlignSpriteX = false; @@ -674,20 +685,9 @@ bool Pcsx2Config::GSOptions::UseHardwareRenderer() const return (Renderer != GSRendererType::Null && Renderer != GSRendererType::SW); } -VsyncMode Pcsx2Config::GetEffectiveVsyncMode() const -{ - if (GS.LimitScalar != 1.0) - { - Console.WriteLn("Vsync is OFF"); - return VsyncMode::Off; - } - - Console.WriteLn("Vsync is %s", GS.VsyncEnable == VsyncMode::Off ? "OFF" : (GS.VsyncEnable == VsyncMode::Adaptive ? "ADAPTIVE" : "ON")); - return GS.VsyncEnable; -} - Pcsx2Config::SPU2Options::SPU2Options() { + bitset = 0; OutputModule = "cubeb"; } @@ -713,9 +713,11 @@ void Pcsx2Config::SPU2Options::LoadSave(SettingsWrapper& wrap) SettingsWrapSection("SPU2/Output"); SettingsWrapEntry(OutputModule); + SettingsWrapEntry(BackendName); SettingsWrapEntry(Latency); SynchMode = static_cast(wrap.EntryBitfield(CURRENT_SETTINGS_SECTION, "SynchMode", static_cast(SynchMode), static_cast(SynchMode))); SettingsWrapEntry(SpeakerConfiguration); + SettingsWrapEntry(DplDecodingLevel); } } @@ -852,6 +854,7 @@ static const char* const tbl_GamefixNames[] = "SkipMPEG", "OPHFlag", "EETiming", + "InstantDMA", "DMABusy", "GIFFIFO", "VIFFIFO", @@ -861,7 +864,8 @@ static const char* const tbl_GamefixNames[] = "VUSync", "VUOverflow", "XGKick", - "BlitInternalFPS" + "BlitInternalFPS", + "FullVU0Sync", }; const char* EnumToString(GamefixId id) @@ -891,6 +895,7 @@ void Pcsx2Config::GamefixOptions::Set(GamefixId id, bool enabled) case Fix_FpuNegDiv: FpuNegDivHack = enabled; break; case Fix_XGKick: XgKickHack = enabled; break; case Fix_EETiming: EETimingHack = enabled; break; + case Fix_InstantDMA: InstantDMAHack = enabled; break; case Fix_SoftwareRendererFMV: SoftwareRendererFMVHack = enabled; break; case Fix_SkipMpeg: SkipMPEGHack = enabled; break; case Fix_OPHFlag: OPHFlagHack = enabled; break; @@ -903,6 +908,7 @@ void Pcsx2Config::GamefixOptions::Set(GamefixId id, bool enabled) case Fix_VUSync: VUSyncHack = enabled; break; case Fix_VUOverflow: VUOverflowHack = enabled; break; case Fix_BlitInternalFPS: BlitInternalFPSHack = enabled; break; + case Fix_FullVU0Sync: FullVU0SyncHack = enabled; break; jNO_DEFAULT; } } @@ -917,6 +923,7 @@ bool Pcsx2Config::GamefixOptions::Get(GamefixId id) const case Fix_FpuNegDiv: return FpuNegDivHack; case Fix_XGKick: return XgKickHack; case Fix_EETiming: return EETimingHack; + case Fix_InstantDMA: return InstantDMAHack; case Fix_SoftwareRendererFMV: return SoftwareRendererFMVHack; case Fix_SkipMpeg: return SkipMPEGHack; case Fix_OPHFlag: return OPHFlagHack; @@ -929,6 +936,7 @@ bool Pcsx2Config::GamefixOptions::Get(GamefixId id) const case Fix_VUSync: return VUSyncHack; case Fix_VUOverflow: return VUOverflowHack; case Fix_BlitInternalFPS: return BlitInternalFPSHack; + case Fix_FullVU0Sync: return FullVU0SyncHack; jNO_DEFAULT; } return false; // unreachable, but we still need to suppress warnings >_< @@ -943,6 +951,7 @@ void Pcsx2Config::GamefixOptions::LoadSave(SettingsWrapper& wrap) SettingsWrapBitBool(FpuNegDivHack); SettingsWrapBitBool(XgKickHack); SettingsWrapBitBool(EETimingHack); + SettingsWrapBitBool(InstantDMAHack); SettingsWrapBitBool(SoftwareRendererFMVHack); SettingsWrapBitBool(SkipMPEGHack); SettingsWrapBitBool(OPHFlagHack); @@ -955,6 +964,7 @@ void Pcsx2Config::GamefixOptions::LoadSave(SettingsWrapper& wrap) SettingsWrapBitBool(VUSyncHack); SettingsWrapBitBool(VUOverflowHack); SettingsWrapBitBool(BlitInternalFPSHack); + SettingsWrapBitBool(FullVU0SyncHack); } @@ -997,9 +1007,9 @@ void Pcsx2Config::FramerateOptions::SanityCheck() { // Ensure Conformation of various options... - NominalScalar = std::clamp(NominalScalar, 0.05, 10.0); - TurboScalar = std::clamp(TurboScalar, 0.05, 10.0); - SlomoScalar = std::clamp(SlomoScalar, 0.05, 10.0); + NominalScalar = std::clamp(NominalScalar, 0.05f, 10.0f); + TurboScalar = std::clamp(TurboScalar, 0.05f, 10.0f); + SlomoScalar = std::clamp(SlomoScalar, 0.05f, 10.0f); } void Pcsx2Config::FramerateOptions::LoadSave(SettingsWrapper& wrap) @@ -1011,6 +1021,36 @@ void Pcsx2Config::FramerateOptions::LoadSave(SettingsWrapper& wrap) SettingsWrapEntry(SlomoScalar); } +#ifdef ENABLE_ACHIEVEMENTS + +Pcsx2Config::AchievementsOptions::AchievementsOptions() +{ + Enabled = false; + TestMode = false; + UnofficialTestMode = false; + RichPresence = true; + ChallengeMode = false; + Leaderboards = true; + SoundEffects = true; + PrimedIndicators = true; +} + +void Pcsx2Config::AchievementsOptions::LoadSave(SettingsWrapper& wrap) +{ + SettingsWrapSection("Achievements"); + + SettingsWrapBitBool(Enabled); + SettingsWrapBitBool(TestMode); + SettingsWrapBitBool(UnofficialTestMode); + SettingsWrapBitBool(RichPresence); + SettingsWrapBitBool(ChallengeMode); + SettingsWrapBitBool(Leaderboards); + SettingsWrapBitBool(SoundEffects); + SettingsWrapBitBool(PrimedIndicators); +} + +#endif + Pcsx2Config::Pcsx2Config() { bitset = 0; @@ -1021,6 +1061,7 @@ Pcsx2Config::Pcsx2Config() EnableRecordingTools = true; #ifdef PCSX2_CORE EnableGameFixes = true; + InhibitScreensaver = true; #endif BackupSavestate = true; SavestateZstdCompression = true; @@ -1029,6 +1070,8 @@ Pcsx2Config::Pcsx2Config() McdCompressNTFS = true; #endif + WarnAboutUnsafeSettings = true; + // To be moved to FileMemoryCard pluign (someday) for (uint slot = 0; slot < 8; ++slot) { @@ -1044,6 +1087,11 @@ Pcsx2Config::Pcsx2Config() void Pcsx2Config::LoadSave(SettingsWrapper& wrap) { + // Switch the rounding mode back to the system default for loading settings. + // That way, we'll get exactly the same values as what we loaded when we first started. + const SSE_MXCSR prev_mxcsr(SSE_MXCSR::GetCurrent()); + SSE_MXCSR::SetCurrent(SSE_MXCSR{SYSTEM_sseMXCSR}); + SettingsWrapSection("EmuCore"); SettingsWrapBitBool(CdvdVerboseReads); @@ -1058,11 +1106,11 @@ void Pcsx2Config::LoadSave(SettingsWrapper& wrap) #ifdef PCSX2_CORE SettingsWrapBitBool(EnableGameFixes); SettingsWrapBitBool(SaveStateOnShutdown); + SettingsWrapBitBool(EnableDiscordPresence); + SettingsWrapBitBool(InhibitScreensaver); #endif SettingsWrapBitBool(ConsoleToStdio); SettingsWrapBitBool(HostFs); - SettingsWrapBitBool(PatchBios); - SettingsWrapEntry(PatchRegion); SettingsWrapBitBool(BackupSavestate); SettingsWrapBitBool(SavestateZstdCompression); @@ -1074,6 +1122,8 @@ void Pcsx2Config::LoadSave(SettingsWrapper& wrap) SettingsWrapBitBool(MultitapPort1_Enabled); #endif + SettingsWrapBitBool(WarnAboutUnsafeSettings); + // Process various sub-components: Speedhacks.LoadSave(wrap); @@ -1090,6 +1140,10 @@ void Pcsx2Config::LoadSave(SettingsWrapper& wrap) Debugger.LoadSave(wrap); Trace.LoadSave(wrap); +#ifdef ENABLE_ACHIEVEMENTS + Achievements.LoadSave(wrap); +#endif + SettingsWrapEntry(GzipIsoIndexTemplate); // For now, this in the derived config for backwards ini compatibility. @@ -1109,6 +1163,8 @@ void Pcsx2Config::LoadSave(SettingsWrapper& wrap) { CurrentAspectRatio = GS.AspectRatio; } + + SSE_MXCSR::SetCurrent(prev_mxcsr); } void Pcsx2Config::LoadSaveMemcards(SettingsWrapper& wrap) @@ -1209,8 +1265,6 @@ void Pcsx2Config::CopyConfig(const Pcsx2Config& cfg) EnableNoInterlacingPatches = cfg.EnableNoInterlacingPatches; EnableRecordingTools = cfg.EnableRecordingTools; UseBOOT2Injection = cfg.UseBOOT2Injection; - PatchBios = cfg.PatchBios; - PatchRegion = cfg.PatchRegion; BackupSavestate = cfg.BackupSavestate; SavestateZstdCompression = cfg.SavestateZstdCompression; McdEnableEjection = cfg.McdEnableEjection; @@ -1226,21 +1280,35 @@ void Pcsx2Config::CopyConfig(const Pcsx2Config& cfg) LimiterMode = cfg.LimiterMode; } -void EmuFolders::SetDefaults() +void Pcsx2Config::CopyRuntimeConfig(Pcsx2Config& cfg) { - Bios = Path::Combine(DataRoot, "bios"); - Snapshots = Path::Combine(DataRoot, "snaps"); - Savestates = Path::Combine(DataRoot, "sstates"); - MemoryCards = Path::Combine(DataRoot, "memcards"); - Logs = Path::Combine(DataRoot, "logs"); - Cheats = Path::Combine(DataRoot, "cheats"); - CheatsWS = Path::Combine(DataRoot, "cheats_ws"); - CheatsNI = Path::Combine(DataRoot, "cheats_ni"); - Covers = Path::Combine(DataRoot, "covers"); - GameSettings = Path::Combine(DataRoot, "gamesettings"); - Cache = Path::Combine(DataRoot, "cache"); - Textures = Path::Combine(DataRoot, "textures"); - InputProfiles = Path::Combine(DataRoot, "inputprofiles"); + GS.LimitScalar = cfg.GS.LimitScalar; + UseBOOT2Injection = cfg.UseBOOT2Injection; + CurrentBlockdump = std::move(cfg.CurrentBlockdump); + CurrentIRX = std::move(cfg.CurrentIRX); + CurrentGameArgs = std::move(cfg.CurrentGameArgs); + CurrentAspectRatio = cfg.CurrentAspectRatio; + LimiterMode = cfg.LimiterMode; + + for (u32 i = 0; i < sizeof(Mcd) / sizeof(Mcd[0]); i++) + { + Mcd[i].Type = cfg.Mcd[i].Type; + } +} + +void EmuFolders::SetDefaults(SettingsInterface& si) +{ + si.SetStringValue("Folders", "Bios", "bios"); + si.SetStringValue("Folders", "Snapshots", "snaps"); + si.SetStringValue("Folders", "Savestates", "sstates"); + si.SetStringValue("Folders", "MemoryCards", "memcards"); + si.SetStringValue("Folders", "Logs", "logs"); + si.SetStringValue("Folders", "Cheats", "cheats"); + si.SetStringValue("Folders", "CheatsWS", "cheats_ws"); + si.SetStringValue("Folders", "CheatsNI", "cheats_ni"); + si.SetStringValue("Folders", "Cache", "cache"); + si.SetStringValue("Folders", "Textures", "textures"); + si.SetStringValue("Folders", "InputProfiles", "inputprofiles"); } static std::string LoadPathFromSettings(SettingsInterface& si, const std::string& root, const char* name, const char* def) @@ -1282,22 +1350,6 @@ void EmuFolders::LoadConfig(SettingsInterface& si) Console.WriteLn("Input Profile Directory: %s", InputProfiles.c_str()); } -void EmuFolders::Save(SettingsInterface& si) -{ - // convert back to relative - si.SetStringValue("Folders", "Bios", Path::MakeRelative(Bios, DataRoot).c_str()); - si.SetStringValue("Folders", "Snapshots", Path::MakeRelative(Snapshots, DataRoot).c_str()); - si.SetStringValue("Folders", "Savestates", Path::MakeRelative(Savestates, DataRoot).c_str()); - si.SetStringValue("Folders", "MemoryCards", Path::MakeRelative(MemoryCards, DataRoot).c_str()); - si.SetStringValue("Folders", "Logs", Path::MakeRelative(Logs, DataRoot).c_str()); - si.SetStringValue("Folders", "Cheats", Path::MakeRelative(Cheats, DataRoot).c_str()); - si.SetStringValue("Folders", "CheatsWS", Path::MakeRelative(CheatsWS, DataRoot).c_str()); - si.SetStringValue("Folders", "CheatsNI", Path::MakeRelative(CheatsNI, DataRoot).c_str()); - si.SetStringValue("Folders", "Cache", Path::MakeRelative(Cache, DataRoot).c_str()); - si.SetStringValue("Folders", "Textures", Path::MakeRelative(Textures, DataRoot).c_str()); - si.SetStringValue("Folders", "InputProfiles", Path::MakeRelative(InputProfiles, DataRoot).c_str()); -} - bool EmuFolders::EnsureFoldersExist() { bool result = FileSystem::CreateDirectoryPath(Bios.c_str(), false); diff --git a/pcsx2/PerformanceMetrics.cpp b/pcsx2/PerformanceMetrics.cpp index 644ca487f8..470dfbe961 100644 --- a/pcsx2/PerformanceMetrics.cpp +++ b/pcsx2/PerformanceMetrics.cpp @@ -41,6 +41,7 @@ static float s_average_frame_time = 0.0f; static float s_average_frame_time_accumulator = 0.0f; static float s_worst_frame_time_accumulator = 0.0f; static u32 s_frames_since_last_update = 0; +static u32 s_unskipped_frames_since_last_update = 0; static Common::Timer s_last_update_time; static Common::Timer s_last_frame_time; @@ -65,6 +66,9 @@ static float s_gs_thread_time = 0.0f; static float s_vu_thread_usage = 0.0f; static float s_vu_thread_time = 0.0f; +static PerformanceMetrics::FrameTimeHistory s_frame_time_history; +static u32 s_frame_time_history_pos = 0; + struct GSSWThreadStats { Threading::ThreadHandle handle; @@ -100,11 +104,15 @@ void PerformanceMetrics::Clear() s_gpu_usage = 0.0f; s_frame_number = 0; + + s_frame_time_history.fill(0.0f); + s_frame_time_history_pos = 0; } void PerformanceMetrics::Reset() { s_frames_since_last_update = 0; + s_unskipped_frames_since_last_update = 0; s_gs_framebuffer_blits_since_last_update = 0; s_gs_privileged_register_writes_since_last_update = 0; s_average_frame_time_accumulator = 0.0f; @@ -125,11 +133,18 @@ void PerformanceMetrics::Reset() stat.last_cpu_time = stat.handle.GetCPUTime(); } -void PerformanceMetrics::Update(bool gs_register_write, bool fb_blit) +void PerformanceMetrics::Update(bool gs_register_write, bool fb_blit, bool is_skipping_present) { - const float frame_time = s_last_frame_time.GetTimeMillisecondsAndReset(); - s_average_frame_time_accumulator += frame_time; - s_worst_frame_time_accumulator = std::max(s_worst_frame_time_accumulator, frame_time); + if (!is_skipping_present) + { + const float frame_time = s_last_frame_time.GetTimeMillisecondsAndReset(); + s_average_frame_time_accumulator += frame_time; + s_worst_frame_time_accumulator = std::max(s_worst_frame_time_accumulator, frame_time); + s_frame_time_history[s_frame_time_history_pos] = frame_time; + s_frame_time_history_pos = (s_frame_time_history_pos + 1) % NUM_FRAME_TIME_SAMPLES; + s_unskipped_frames_since_last_update++; + } + s_frames_since_last_update++; s_gs_privileged_register_writes_since_last_update += static_cast(gs_register_write); s_gs_framebuffer_blits_since_last_update += static_cast(fb_blit); @@ -144,10 +159,10 @@ void PerformanceMetrics::Update(bool gs_register_write, bool fb_blit) s_last_update_time.ResetTo(now_ticks); s_worst_frame_time = s_worst_frame_time_accumulator; s_worst_frame_time_accumulator = 0.0f; - s_average_frame_time = s_average_frame_time_accumulator / static_cast(s_frames_since_last_update); + s_average_frame_time = s_average_frame_time_accumulator / static_cast(s_unskipped_frames_since_last_update); s_average_frame_time_accumulator = 0.0f; s_fps = static_cast(s_frames_since_last_update) / time; - s_average_gpu_time = s_accumulated_gpu_time / static_cast(s_frames_since_last_update); + s_average_gpu_time = s_accumulated_gpu_time / static_cast(s_unskipped_frames_since_last_update); s_gpu_usage = s_accumulated_gpu_time / (time * 10.0f); s_accumulated_gpu_time = 0.0f; @@ -209,6 +224,7 @@ void PerformanceMetrics::Update(bool gs_register_write, bool fb_blit) } s_frames_since_last_update = 0; + s_unskipped_frames_since_last_update = 0; s_presents_since_last_update = 0; #ifdef PCSX2_CORE @@ -339,3 +355,13 @@ float PerformanceMetrics::GetGPUAverageTime() { return s_average_gpu_time; } + +const PerformanceMetrics::FrameTimeHistory& PerformanceMetrics::GetFrameTimeHistory() +{ + return s_frame_time_history; +} + +u32 PerformanceMetrics::GetFrameTimeHistoryPos() +{ + return s_frame_time_history_pos; +} diff --git a/pcsx2/PerformanceMetrics.h b/pcsx2/PerformanceMetrics.h index 4b4d575166..4ed522efd6 100644 --- a/pcsx2/PerformanceMetrics.h +++ b/pcsx2/PerformanceMetrics.h @@ -14,6 +14,8 @@ */ #pragma once + +#include #include "common/Threading.h" namespace PerformanceMetrics @@ -25,9 +27,12 @@ namespace PerformanceMetrics DISPFBBlit }; + static constexpr u32 NUM_FRAME_TIME_SAMPLES = 150; + using FrameTimeHistory = std::array; + void Clear(); void Reset(); - void Update(bool gs_register_write, bool fb_blit); + void Update(bool gs_register_write, bool fb_blit, bool is_skipping_present); void OnGPUPresent(float gpu_time); /// Sets the EE thread for CPU usage calculations. @@ -64,4 +69,7 @@ namespace PerformanceMetrics float GetGPUUsage(); float GetGPUAverageTime(); + + const FrameTimeHistory& GetFrameTimeHistory(); + u32 GetFrameTimeHistoryPos(); } // namespace PerformanceMetrics diff --git a/pcsx2/PrecompiledHeader.h b/pcsx2/PrecompiledHeader.h index bc1921f52c..6ab8a543f9 100644 --- a/pcsx2/PrecompiledHeader.h +++ b/pcsx2/PrecompiledHeader.h @@ -100,7 +100,7 @@ typedef void FnType_Void(); typedef FnType_Void* Fnptr_Void; // -------------------------------------------------------------------------------------- -// Compiler/OS specific macros and defines +// Compiler/OS specific macros and defines // -------------------------------------------------------------------------------------- #if defined(_MSC_VER) diff --git a/pcsx2/R3000A.cpp b/pcsx2/R3000A.cpp index cc0ed1332a..f3fde73e1f 100644 --- a/pcsx2/R3000A.cpp +++ b/pcsx2/R3000A.cpp @@ -22,7 +22,6 @@ #include "Sif.h" #include "DebugTools/Breakpoints.h" #include "R5900OpcodeTables.h" -#include "IopSio2.h" #include "IopCounters.h" #include "IopBios.h" #include "IopHw.h" @@ -38,19 +37,6 @@ R3000Acpu *psxCpu; u32 g_psxConstRegs[32]; u32 g_psxHasConstReg, g_psxFlushedConstReg; -// Controls when branch tests are performed. -u32 g_iopNextEventCycle = 0; - -// This value is used when the IOP execution is broken to return control to the EE. -// (which happens when the IOP throws EE-bound interrupts). It holds the value of -// iopCycleEE (which is set to zero to facilitate the code break), so that the unrun -// cycles can be accounted for later. -s32 iopBreak = 0; - -// tracks the IOP's current sync status with the EE. When it dips below zero, -// control is returned to the EE. -s32 iopCycleEE = -1; - // Used to signal to the EE when important actions that need IOP-attention have // happened (hsyncs, vsyncs, IOP exceptions, etc). IOP runs code whenever this // is true, even if it's already running ahead a bit. @@ -68,9 +54,9 @@ void psxReset() psxRegs.CP0.n.Status = 0x10900000; // COP0 enabled | BEV = 1 | TS = 1 psxRegs.CP0.n.PRid = 0x0000001f; // PRevID = Revision ID, same as the IOP R3000A - iopBreak = 0; - iopCycleEE = -1; - g_iopNextEventCycle = psxRegs.cycle + 4; + psxRegs.iopBreak = 0; + psxRegs.iopCycleEE = -1; + psxRegs.iopNextEventCycle = psxRegs.cycle + 4; psxHwReset(); PSXCLK = 36864000; @@ -124,8 +110,8 @@ __fi void psxSetNextBranch( u32 startCycle, s32 delta ) // typecast the conditional to signed so that things don't blow up // if startCycle is greater than our next branch cycle. - if( (int)(g_iopNextEventCycle - startCycle) > delta ) - g_iopNextEventCycle = startCycle + delta; + if( (int)(psxRegs.iopNextEventCycle - startCycle) > delta ) + psxRegs.iopNextEventCycle = startCycle + delta; } __fi void psxSetNextBranchDelta( s32 delta ) @@ -152,15 +138,15 @@ __fi void PSX_INT( IopEventId n, s32 ecycle ) psxRegs.sCycle[n] = psxRegs.cycle; psxRegs.eCycle[n] = ecycle; - psxSetNextBranchDelta( ecycle ); + psxSetNextBranchDelta(ecycle); - if( iopCycleEE < 0 ) + if (psxRegs.iopCycleEE < 0) { // The EE called this int, so inform it to branch as needed: // fixme - this doesn't take into account EE/IOP sync (the IOP may be running // ahead or behind the EE as per the EEsCycles value) - s32 iopDelta = (g_iopNextEventCycle-psxRegs.cycle)*8; - cpuSetNextEventDelta( iopDelta ); + const s32 iopDelta = (psxRegs.iopNextEventCycle - psxRegs.cycle) * 8; + cpuSetNextEventDelta(iopDelta); } } @@ -177,13 +163,30 @@ static __fi void IopTestEvent( IopEventId n, void (*callback)() ) psxSetNextBranch( psxRegs.sCycle[n], psxRegs.eCycle[n] ); } +static __fi void Sio0TestEvent(IopEventId n) +{ + if (!(psxRegs.interrupt & (1 << n))) + { + return; + } + + if (psxTestCycle(psxRegs.sCycle[n], psxRegs.eCycle[n])) + { + psxRegs.interrupt &= ~(1 << n); + sio0.Interrupt(Sio0Interrupt::TEST_EVENT); + } + else + { + psxSetNextBranch(psxRegs.sCycle[n], psxRegs.eCycle[n]); + } +} + static __fi void _psxTestInterrupts() { IopTestEvent(IopEvt_SIF0, sif0Interrupt); // SIF0 IopTestEvent(IopEvt_SIF1, sif1Interrupt); // SIF1 IopTestEvent(IopEvt_SIF2, sif2Interrupt); // SIF2 - // Originally controlled by a preprocessor define, now PSX dependent. - if (psxHu32(HW_ICFG) & (1 << 3)) IopTestEvent(IopEvt_SIO, sioInterruptR); + Sio0TestEvent(IopEvt_SIO); IopTestEvent(IopEvt_CdvdRead, cdvdReadInterrupt); IopTestEvent(IopEvt_CdvdSectorReady, cdvdSectorReady); @@ -206,16 +209,16 @@ static __fi void _psxTestInterrupts() __ri void iopEventTest() { - if( psxTestCycle( psxNextsCounter, psxNextCounter ) ) + if (psxTestCycle(psxNextsCounter, psxNextCounter)) { psxRcntUpdate(); iopEventAction = true; } else { - // start the next branch at the next counter event by default - // the interrupt code below will assign nearer branches if needed. - g_iopNextEventCycle = psxNextsCounter+psxNextCounter; + // start the next branch at the next counter event by default + // the interrupt code below will assign nearer branches if needed. + psxRegs.iopNextEventCycle = psxNextsCounter + psxNextCounter; } if (psxRegs.interrupt) @@ -225,9 +228,9 @@ __ri void iopEventTest() iopEventTestIsActive = false; } - if( (psxHu32(0x1078) != 0) && ((psxHu32(0x1070) & psxHu32(0x1074)) != 0) ) + if ((psxHu32(0x1078) != 0) && ((psxHu32(0x1070) & psxHu32(0x1074)) != 0)) { - if( (psxRegs.CP0.n.Status & 0xFE01) >= 0x401 ) + if ((psxRegs.CP0.n.Status & 0xFE01) >= 0x401) { PSXCPU_LOG("Interrupt: %x %x", psxHu32(0x1070), psxHu32(0x1074)); psxException(0, 0); diff --git a/pcsx2/R3000A.h b/pcsx2/R3000A.h index 40d664a720..f932bf2f2e 100644 --- a/pcsx2/R3000A.h +++ b/pcsx2/R3000A.h @@ -108,6 +108,21 @@ struct psxRegisters { u32 code; /* The instruction */ u32 cycle; u32 interrupt; + u32 pcWriteback; + + // Controls when branch tests are performed. + u32 iopNextEventCycle; + + // This value is used when the IOP execution is broken to return control to the EE. + // (which happens when the IOP throws EE-bound interrupts). It holds the value of + // iopCycleEE (which is set to zero to facilitate the code break), so that the unrun + // cycles can be accounted for later. + s32 iopBreak; + + // tracks the IOP's current sync status with the EE. When it dips below zero, + // control is returned to the EE. + s32 iopCycleEE; + u32 sCycle[32]; // start cycle for signaled ints s32 eCycle[32]; // cycle delta for signaled ints (sCycle + eCycle == branch cycle) //u32 _msflag[32]; @@ -116,10 +131,6 @@ struct psxRegisters { alignas(16) extern psxRegisters psxRegs; -extern u32 g_iopNextEventCycle; -extern s32 iopBreak; // used when the IOP execution is broken and control returned to the EE -extern s32 iopCycleEE; // tracks IOP's current sych status with the EE - #ifndef _PC_ #define _i32(x) (s32)x //R3000A @@ -187,9 +198,6 @@ struct R3000Acpu { s32 (*ExecuteBlock)( s32 eeCycles ); // executes the given number of EE cycles. void (*Clear)(u32 Addr, u32 Size); void (*Shutdown)(); - - uint (*GetCacheReserve)(); - void (*SetCacheReserve)( uint reserveInMegs ); }; extern R3000Acpu *psxCpu; diff --git a/pcsx2/R3000AInterpreter.cpp b/pcsx2/R3000AInterpreter.cpp index 2a6c96e075..b6a528bf77 100644 --- a/pcsx2/R3000AInterpreter.cpp +++ b/pcsx2/R3000AInterpreter.cpp @@ -187,7 +187,7 @@ void psxCheckMemcheck() int needed = psxIsMemcheckNeeded(pc); if (needed == 0) return; - + u32 op = iopMemRead32(needed == 2 ? pc + 4 : pc); // Yeah, we use the R5900 opcode table for the R3000 const R5900::OPCODE& opcode = R5900::GetInstruction(op); @@ -243,11 +243,11 @@ static __fi void execI() if ((psxHu32(HW_ICFG) & (1 << 3))) { //One of the Iop to EE delta clocks to be set in PS1 mode. - iopCycleEE-=9; + psxRegs.iopCycleEE -= 9; } else { //default ps2 mode value - iopCycleEE-=8; + psxRegs.iopCycleEE -= 8; } psxBSC[psxRegs.code >> 26](); } @@ -278,12 +278,12 @@ static void intReset() { static s32 intExecuteBlock( s32 eeCycles ) { - iopBreak = 0; - iopCycleEE = eeCycles; + psxRegs.iopBreak = 0; + psxRegs.iopCycleEE = eeCycles; try { - while (iopCycleEE > 0) { + while (psxRegs.iopCycleEE > 0) { if ((psxHu32(HW_ICFG) & 8) && ((psxRegs.pc & 0x1fffffffU) == 0xa0 || (psxRegs.pc & 0x1fffffffU) == 0xb0 || (psxRegs.pc & 0x1fffffffU) == 0xc0)) psxBiosCall(); @@ -299,7 +299,7 @@ static s32 intExecuteBlock( s32 eeCycles ) Cpu->ExitExecution(); } - return iopBreak + iopCycleEE; + return psxRegs.iopBreak + psxRegs.iopCycleEE; } static void intClear(u32 Addr, u32 Size) { @@ -308,22 +308,10 @@ static void intClear(u32 Addr, u32 Size) { static void intShutdown() { } -static void intSetCacheReserve( uint reserveInMegs ) -{ -} - -static uint intGetCacheReserve() -{ - return 0; -} - R3000Acpu psxInt = { intReserve, intReset, intExecuteBlock, intClear, - intShutdown, - - intGetCacheReserve, - intSetCacheReserve + intShutdown }; diff --git a/pcsx2/R3000AOpcodeTables.cpp b/pcsx2/R3000AOpcodeTables.cpp index dc9174a88f..bfebcb50c8 100644 --- a/pcsx2/R3000AOpcodeTables.cpp +++ b/pcsx2/R3000AOpcodeTables.cpp @@ -381,7 +381,7 @@ void (*psxCP2[64])() = { gteDPCS , gteINTPL, gteMVMVA, gteNCDS, gteCDP , psxNULL , gteNCDT , psxNULL, // 10 psxNULL , psxNULL , psxNULL , gteNCCS, gteCC , psxNULL , gteNCS , psxNULL, // 18 gteNCT , psxNULL , psxNULL , psxNULL, psxNULL, psxNULL , psxNULL , psxNULL, // 20 - gteSQR , gteDCPL , gteDPCT , psxNULL, psxNULL, gteAVSZ3, gteAVSZ4, psxNULL, // 28 + gteSQR , gteDCPL , gteDPCT , psxNULL, psxNULL, gteAVSZ3, gteAVSZ4, psxNULL, // 28 gteRTPT , psxNULL , psxNULL , psxNULL, psxNULL, psxNULL , psxNULL , psxNULL, // 30 psxNULL , psxNULL , psxNULL , psxNULL, psxNULL, gteGPF , gteGPL , gteNCCT // 38 }; diff --git a/pcsx2/R5900.cpp b/pcsx2/R5900.cpp index 57d2e3133c..1a6af9c3b4 100644 --- a/pcsx2/R5900.cpp +++ b/pcsx2/R5900.cpp @@ -81,10 +81,11 @@ extern SysMainMemory& GetVmMemory(); void cpuReset() { vu1Thread.WaitVU(); + vu1Thread.Reset(); if (GetMTGS().IsOpen()) GetMTGS().WaitGS(); // GS better be done processing before we reset the EE, just in case. - GetVmMemory().ResetAll(); + GetVmMemory().Reset(); memzero(cpuRegs); memzero(fpuRegs); @@ -97,7 +98,7 @@ void cpuReset() fpuRegs.fprc[0] = 0x00002e30; // fpu Revision.. fpuRegs.fprc[31] = 0x01000001; // fpu Status/Control - g_nextEventCycle = cpuRegs.cycle + 4; + cpuRegs.nextEventCycle = cpuRegs.cycle + 4; EEsCycle = 0; EEoCycle = cpuRegs.cycle; @@ -116,6 +117,8 @@ void cpuReset() ElfCRC = 0; DiscSerial.clear(); ElfEntry = -1; + g_GameStarted = false; + g_GameLoading = false; // Probably not the right place, but it has to be done when the ram is actually initialized USBsetRAM(iopMem->Main); @@ -234,9 +237,9 @@ __fi void cpuSetNextEvent( u32 startCycle, s32 delta ) // typecast the conditional to signed so that things don't blow up // if startCycle is greater than our next branch cycle. - if( (int)(g_nextEventCycle - startCycle) > delta ) + if( (int)(cpuRegs.nextEventCycle - startCycle) > delta ) { - g_nextEventCycle = startCycle + delta; + cpuRegs.nextEventCycle = startCycle + delta; } } @@ -246,6 +249,18 @@ __fi void cpuSetNextEventDelta( s32 delta ) cpuSetNextEvent( cpuRegs.cycle, delta ); } +__fi int cpuGetCycles(int interrupt) +{ + if(interrupt == VU_MTVU_BUSY && (!THREAD_VU1 || INSTANT_VU1)) + return 1; + else + { + const int cycles = (cpuRegs.sCycle[interrupt] + cpuRegs.eCycle[interrupt]) - cpuRegs.cycle; + return std::max(1, cycles); + } + +} + // tests the cpu cycle against the given start and delta values. // Returns true if the delta time has passed. __fi int cpuTestCycle( u32 startCycle, s32 delta ) @@ -259,20 +274,21 @@ __fi int cpuTestCycle( u32 startCycle, s32 delta ) // tells the EE to run the branch test the next time it gets a chance. __fi void cpuSetEvent() { - g_nextEventCycle = cpuRegs.cycle; + cpuRegs.nextEventCycle = cpuRegs.cycle; } __fi void cpuClearInt( uint i ) { pxAssume( i < 32 ); cpuRegs.interrupt &= ~(1 << i); + cpuRegs.dmastall &= ~(1 << i); } static __fi void TESTINT( u8 n, void (*callback)() ) { if( !(cpuRegs.interrupt & (1 << n)) ) return; - if(!g_GameStarted || cpuTestCycle( cpuRegs.sCycle[n], cpuRegs.eCycle[n] ) ) + if(!g_GameStarted || CHECK_INSTANTDMAHACK || cpuTestCycle( cpuRegs.sCycle[n], cpuRegs.eCycle[n] ) ) { cpuClearInt( n ); callback(); @@ -283,16 +299,17 @@ static __fi void TESTINT( u8 n, void (*callback)() ) // [TODO] move this function to Dmac.cpp, and remove most of the DMAC-related headers from // being included into R5900.cpp. -static __fi void _cpuTestInterrupts() +static __fi bool _cpuTestInterrupts() { + if (!dmacRegs.ctrl.DMAE || (psHu8(DMAC_ENABLER+2) & 1)) { //Console.Write("DMAC Disabled or suspended"); - return; + return false; } /* These are 'pcsx2 interrupts', they handle asynchronous stuff that depends on the cycle timings */ - + TESTINT(VU_MTVU_BUSY, MTVUInterrupt); TESTINT(DMAC_VIF1, vif1Interrupt); TESTINT(DMAC_GIF, gifInterrupt); TESTINT(DMAC_SIF0, EEsif0Interrupt); @@ -320,12 +337,17 @@ static __fi void _cpuTestInterrupts() TESTINT(VIF_VU0_FINISH, vif0VUFinish); TESTINT(VIF_VU1_FINISH, vif1VUFinish); } + + if ((cpuRegs.interrupt & 0x1FFFF) & ~cpuRegs.dmastall) + return true; + else + return false; } static __fi void _cpuTestTIMR() { - cpuRegs.CP0.n.Count += cpuRegs.cycle-s_iLastCOP0Cycle; - s_iLastCOP0Cycle = cpuRegs.cycle; + cpuRegs.CP0.n.Count += cpuRegs.cycle - cpuRegs.lastCOP0Cycle; + cpuRegs.lastCOP0Cycle = cpuRegs.cycle; // fixme: this looks like a hack to make up for the fact that the TIMR // doesn't yet have a proper mechanism for setting itself up on a nextEventCycle. @@ -363,23 +385,21 @@ static bool cpuIntsEnabled(int Interrupt) !cpuRegs.CP0.n.Status.b.EXL && (cpuRegs.CP0.n.Status.b.ERL == 0); } -// if cpuRegs.cycle is greater than this cycle, should check cpuEventTest for updates -u32 g_nextEventCycle = 0; -u32 g_lastEventCycle = 0; // Shared portion of the branch test, called from both the Interpreter // and the recompiler. (moved here to help alleviate redundant code) __fi void _cpuEventTest_Shared() { eeEventTestIsActive = true; - g_nextEventCycle = cpuRegs.cycle + eeWaitCycles; - g_lastEventCycle = cpuRegs.cycle; + cpuRegs.nextEventCycle = cpuRegs.cycle + eeWaitCycles; + cpuRegs.lastEventCycle = cpuRegs.cycle; // ---- INTC / DMAC (CPU-level Exceptions) ----------------- // Done first because exceptions raised during event tests need to be postponed a few // cycles (fixes Grandia II [PAL], which does a spin loop on a vsync and expects to // be able to read the value before the exception handler clears it). uint mask = intcInterrupt() | dmacInterrupt(); - if (cpuIntsEnabled(mask)) cpuException(mask, cpuRegs.branch); + if (cpuIntsEnabled(mask)) + cpuException(mask, cpuRegs.branch); // ---- Counters ------------- @@ -387,7 +407,7 @@ __fi void _cpuEventTest_Shared() // escape/suspend hooks, and it's really a good idea to suspend/resume emulation before // doing any actual meaningful branchtest logic. - if ( cpuTestCycle( nextsCounter, nextCounter ) ) + if (cpuTestCycle(nextsCounter, nextCounter)) { rcntUpdate(); _cpuTestPERF(); @@ -405,10 +425,10 @@ __fi void _cpuEventTest_Shared() // where a DMA buffer is overwritten without waiting for the transfer to end, which causes the fonts to get all messed up // so to fix it, we run all the DMA's instantly when in the BIOS. // Only use the lower 17 bits of the cpuRegs.interrupt as the upper bits are for VU0/1 sync which can't be done in a tight loop - if (!g_GameStarted && dmacRegs.ctrl.DMAE && !(psHu8(DMAC_ENABLER + 2) & 1) && (cpuRegs.interrupt & 0x1FFFF)) + if ((!g_GameStarted || CHECK_INSTANTDMAHACK) && dmacRegs.ctrl.DMAE && !(psHu8(DMAC_ENABLER + 2) & 1) && (cpuRegs.interrupt & 0x1FFFF)) { - while(cpuRegs.interrupt & 0x1FFFF) - _cpuTestInterrupts(); + while ((cpuRegs.interrupt & 0x1FFFF) && _cpuTestInterrupts()) + ; } else _cpuTestInterrupts(); @@ -425,17 +445,17 @@ __fi void _cpuEventTest_Shared() EEsCycle += cpuRegs.cycle - EEoCycle; EEoCycle = cpuRegs.cycle; - if( EEsCycle > 0 ) + if (EEsCycle > 0) iopEventAction = true; iopEventTest(); - if( iopEventAction ) + if (iopEventAction) { //if( EEsCycle < -450 ) // Console.WriteLn( " IOP ahead by: %d cycles", -EEsCycle ); - EEsCycle = psxCpu->ExecuteBlock( EEsCycle ); + EEsCycle = psxCpu->ExecuteBlock(EEsCycle); iopEventAction = false; } @@ -448,24 +468,24 @@ __fi void _cpuEventTest_Shared() // ---- Schedule Next Event Test -------------- - if( EEsCycle > 192 ) + if (EEsCycle > 192) { // EE's running way ahead of the IOP still, so we should branch quickly to give the // IOP extra timeslices in short order. - cpuSetNextEventDelta( 48 ); + cpuSetNextEventDelta(48); //Console.Warning( "EE ahead of the IOP -- Rapid Event! %d", EEsCycle ); } // The IOP could be running ahead/behind of us, so adjust the iop's next branch by its // relative position to the EE (via EEsCycle) - cpuSetNextEventDelta( ((g_iopNextEventCycle-psxRegs.cycle)*8) - EEsCycle ); + cpuSetNextEventDelta(((psxRegs.iopNextEventCycle - psxRegs.cycle) * 8) - EEsCycle); // Apply the hsync counter's nextCycle - cpuSetNextEvent( hsyncCounter.sCycle, hsyncCounter.CycleT ); + cpuSetNextEvent(hsyncCounter.sCycle, hsyncCounter.CycleT); // Apply vsync and other counter nextCycles - cpuSetNextEvent( nextsCounter, nextCounter ); + cpuSetNextEvent(nextsCounter, nextCounter); eeEventTestIsActive = false; } @@ -474,15 +494,17 @@ __ri void cpuTestINTCInts() { // Check the COP0's Status register for general interrupt disables, and the 0x400 // bit (which is INTC master toggle). - if( !cpuIntsEnabled(0x400) ) return; + if (!cpuIntsEnabled(0x400)) + return; - if( (psHu32(INTC_STAT) & psHu32(INTC_MASK)) == 0 ) return; + if ((psHu32(INTC_STAT) & psHu32(INTC_MASK)) == 0) + return; - cpuSetNextEventDelta( 4 ); - if(eeEventTestIsActive && (iopCycleEE > 0)) + cpuSetNextEventDelta(4); + if (eeEventTestIsActive && (psxRegs.iopCycleEE > 0)) { - iopBreak += iopCycleEE; // record the number of cycles the IOP didn't run. - iopCycleEE = 0; + psxRegs.iopBreak += psxRegs.iopCycleEE; // record the number of cycles the IOP didn't run. + psxRegs.iopCycleEE = 0; } } @@ -490,55 +512,69 @@ __fi void cpuTestDMACInts() { // Check the COP0's Status register for general interrupt disables, and the 0x800 // bit (which is the DMAC master toggle). - if( !cpuIntsEnabled(0x800) ) return; + if (!cpuIntsEnabled(0x800)) + return; - if ( ( (psHu16(0xe012) & psHu16(0xe010)) == 0) && - ( (psHu16(0xe010) & 0x8000) == 0) ) return; + if (((psHu16(0xe012) & psHu16(0xe010)) == 0) && + ((psHu16(0xe010) & 0x8000) == 0)) + return; - cpuSetNextEventDelta( 4 ); - if(eeEventTestIsActive && (iopCycleEE > 0)) + cpuSetNextEventDelta(4); + if (eeEventTestIsActive && (psxRegs.iopCycleEE > 0)) { - iopBreak += iopCycleEE; // record the number of cycles the IOP didn't run. - iopCycleEE = 0; + psxRegs.iopBreak += psxRegs.iopCycleEE; // record the number of cycles the IOP didn't run. + psxRegs.iopCycleEE = 0; } } -__fi void cpuTestTIMRInts() { - if ((cpuRegs.CP0.n.Status.val & 0x10007) == 0x10001) { +__fi void cpuTestTIMRInts() +{ + if ((cpuRegs.CP0.n.Status.val & 0x10007) == 0x10001) + { _cpuTestPERF(); _cpuTestTIMR(); } } -__fi void cpuTestHwInts() { +__fi void cpuTestHwInts() +{ cpuTestINTCInts(); cpuTestDMACInts(); cpuTestTIMRInts(); } +__fi void CPU_SET_DMASTALL(EE_EventType n, bool set) +{ + if (set) + cpuRegs.dmastall |= 1 << n; + else + cpuRegs.dmastall &= ~(1 << n); +} + __fi void CPU_INT( EE_EventType n, s32 ecycle) { // EE events happen 8 cycles in the future instead of whatever was requested. // This can be used on games with PATH3 masking issues for example, or when // some FMV look bad. - if(CHECK_EETIMINGHACK) ecycle = 8; + if (CHECK_EETIMINGHACK && n < VIF_VU0_FINISH) + ecycle = 8; - cpuRegs.interrupt|= 1 << n; + cpuRegs.interrupt |= 1 << n; cpuRegs.sCycle[n] = cpuRegs.cycle; cpuRegs.eCycle[n] = ecycle; // Interrupt is happening soon: make sure both EE and IOP are aware. - if( ecycle <= 28 && iopCycleEE > 0 ) + if (ecycle <= 28 && psxRegs.iopCycleEE > 0) { // If running in the IOP, force it to break immediately into the EE. // the EE's branch test is due to run. - iopBreak += iopCycleEE; // record the number of cycles the IOP didn't run. - iopCycleEE = 0; + psxRegs.iopBreak += psxRegs.iopCycleEE; // record the number of cycles the IOP didn't run. + psxRegs.iopCycleEE = 0; } - cpuSetNextEventDelta( cpuRegs.eCycle[n] ); + cpuSetNextEventDelta(cpuRegs.eCycle[n]); } // Called from recompilers; define is mandatory. @@ -756,7 +792,7 @@ void eeloadHook2() Console.WriteLn("eeloadHook2: arg block is '%s'.", (char *)PSM(g_osdsys_str)); #endif int argc = ParseArgumentString(g_osdsys_str); - + // Back up 4 bytes from start of args block for every arg + 4 bytes for start of argv pointer block, write pointers uptr block_start = g_osdsys_str - (argc * 4); for (int a = 0; a < argc; a++) @@ -779,12 +815,12 @@ inline bool isBranchOrJump(u32 addr) { u32 op = memRead32(addr); const OPCODE& opcode = GetInstruction(op); - + // Return false for eret & syscall as they are branch type in pcsx2 debugging tools, // but shouldn't have delay slot in isBreakpointNeeded/isMemcheckNeeded. if ((opcode.flags == (IS_BRANCH | BRANCHTYPE_SYSCALL)) || (opcode.flags == (IS_BRANCH | BRANCHTYPE_ERET))) return false; - + return (opcode.flags & IS_BRANCH) != 0; } @@ -809,7 +845,7 @@ int isMemcheckNeeded(u32 pc) { if (CBreakPoints::GetNumMemchecks() == 0) return 0; - + u32 addr = pc; if (isBranchOrJump(addr)) addr += 4; diff --git a/pcsx2/R5900.h b/pcsx2/R5900.h index e5d480bca0..3ea516431a 100644 --- a/pcsx2/R5900.h +++ b/pcsx2/R5900.h @@ -46,12 +46,6 @@ namespace Exception public: explicit CancelInstruction() { } }; - - class FailedToAllocateRegister - { - public: - explicit FailedToAllocateRegister() { } - }; } // -------------------------------------------------------------------------------------- @@ -174,6 +168,14 @@ struct cpuRegisters { int branch; int opmode; // operating mode u32 tempcycles; + u32 dmastall; + u32 pcWriteback; + + // if cpuRegs.cycle is greater than this cycle, should check cpuEventTest for updates + u32 nextEventCycle; + u32 lastEventCycle; + u32 lastCOP0Cycle; + u32 lastPERFCycle[2]; }; // used for optimization @@ -259,11 +261,7 @@ alignas(16) extern cpuRegisters cpuRegs; alignas(16) extern fpuRegisters fpuRegs; alignas(16) extern tlbs tlb[48]; -extern u32 g_nextEventCycle; -extern u32 g_lastEventCycle; extern bool eeEventTestIsActive; -extern u32 s_iLastCOP0Cycle; -extern u32 s_iLastPERFCycle[2]; void intSetBranch(); @@ -294,7 +292,7 @@ struct R5900cpu // the virtual cpu provider. Allocating additional heap memory from this method is // NOT recommended. Heap allocations should be performed by Reset only. This // maximizes the likeliness of reservations claiming addresses they prefer. - // + // // Thread Affinity: // Called from the main/UI thread only. Cpu execution status is guaranteed to // be inactive. No locking is necessary. @@ -344,7 +342,7 @@ struct R5900cpu // call to return at the nearest state check (typically handled internally using // either C++ exceptions or setjmp/longjmp). // - // Exception Throws: + // Exception Throws: // Throws BaseR5900Exception and all derivatives. // Throws FileNotFound or other Streaming errors (typically related to BIOS MEC/NVM) // @@ -358,7 +356,7 @@ struct R5900cpu // Safely throws host exceptions from executing code (either recompiled or interpreted). // If this function is called outside the context of the CPU's code execution, then the // given exception will be re-thrown automatically. - // + // // Exception Throws: // (SEH) Rethrows the given exception immediately. // (setjmp) Re-throws immediately if called from outside the context of dynamically @@ -382,9 +380,6 @@ struct R5900cpu // doesn't matter if we're stripping it out soon. ;) // void (*Clear)(u32 Addr, u32 Size); - - uint (*GetCacheReserve)(); - void (*SetCacheReserve)( uint reserveInMegs ); }; extern R5900cpu *Cpu; @@ -411,14 +406,16 @@ enum EE_EventType DMAC_STALL_SIS = 13, // SIS DMAC_MFIFO_EMPTY = 14, // MEIS DMAC_BUS_ERROR = 15, // BEIS - + DMAC_GIF_UNIT, VIF_VU0_FINISH, VIF_VU1_FINISH, - IPU_PROCESS + IPU_PROCESS, + VU_MTVU_BUSY }; extern void CPU_INT( EE_EventType n, s32 ecycle ); +extern void CPU_SET_DMASTALL(EE_EventType n, bool set); extern uint intcInterrupt(); extern uint dmacInterrupt(); @@ -435,6 +432,7 @@ extern void cpuSetNextEvent( u32 startCycle, s32 delta ); extern void cpuSetNextEventDelta( s32 delta ); extern int cpuTestCycle( u32 startCycle, s32 delta ); extern void cpuSetEvent(); +extern int cpuGetCycles(int interrupt); extern void _cpuEventTest_Shared(); // for internal use by the Dynarecs and Ints inside R5900: diff --git a/pcsx2/R5900Exceptions.h b/pcsx2/R5900Exceptions.h index d3b0ed36c6..d5048a2f2d 100644 --- a/pcsx2/R5900Exceptions.h +++ b/pcsx2/R5900Exceptions.h @@ -138,7 +138,7 @@ namespace R5900Exception class DebugBreakpoint : public BaseR5900Exception { DEFINE_EXCEPTION_COPYTORS(DebugBreakpoint, BaseR5900Exception) - + public: explicit DebugBreakpoint() { diff --git a/pcsx2/R5900OpcodeImpl.cpp b/pcsx2/R5900OpcodeImpl.cpp index 2be96f663a..c9908b83cd 100644 --- a/pcsx2/R5900OpcodeImpl.cpp +++ b/pcsx2/R5900OpcodeImpl.cpp @@ -64,7 +64,7 @@ static __fi bool _add32_Overflow( s32 x, s32 y, s64 &ret ) cpuException(0x30, cpuRegs.branch); return true; } - + ret = result.SD[0]; return false; @@ -201,7 +201,7 @@ static int __Deci2Call(int call, u32 *addr) sprintf( reqaddr, "%x %x %x %x", addr[3], addr[2], addr[1], addr[0] ); if (!deci2addr) return 1; - + const u32* d2ptr = (u32*)PSM(deci2addr); BIOS_LOG("deci2reqsend: %s: deci2addr: %x,%x,%x,buf=%x %x,%x,len=%x,%x", @@ -667,7 +667,7 @@ void LD() if( addr & 7 ) throw R5900Exception::AddressError( addr, false ); - memRead64(addr, (u64*)gpr_GetWritePtr(_Rt_)); + cpuRegs.GPR.r[_Rt_].UD[0] = memRead64(addr); } static const u64 LDL_MASK[8] = @@ -688,8 +688,7 @@ void LDL() u32 addr = cpuRegs.GPR.r[_Rs_].UL[0] + _Imm_; u32 shift = addr & 7; - u64 mem; - memRead64(addr & ~7, &mem); + u64 mem = memRead64(addr & ~7); if( !_Rt_ ) return; cpuRegs.GPR.r[_Rt_].UD[0] = (cpuRegs.GPR.r[_Rt_].UD[0] & LDL_MASK[shift]) | @@ -701,8 +700,7 @@ void LDR() u32 addr = cpuRegs.GPR.r[_Rs_].UL[0] + _Imm_; u32 shift = addr & 7; - u64 mem; - memRead64(addr & ~7, &mem); + u64 mem = memRead64(addr & ~7); if (!_Rt_) return; cpuRegs.GPR.r[_Rt_].UD[0] = (cpuRegs.GPR.r[_Rt_].UD[0] & LDR_MASK[shift]) | @@ -798,7 +796,7 @@ void SD() if( addr & 7 ) throw R5900Exception::AddressError( addr, true ); - memWrite64(addr,&cpuRegs.GPR.r[_Rt_].UD[0]); + memWrite64(addr,cpuRegs.GPR.r[_Rt_].UD[0]); } static const u64 SDL_MASK[8] = @@ -817,12 +815,10 @@ void SDL() { u32 addr = cpuRegs.GPR.r[_Rs_].UL[0] + _Imm_; u32 shift = addr & 7; - u64 mem; - - memRead64(addr & ~7, &mem); + u64 mem = memRead64(addr & ~7); mem = (cpuRegs.GPR.r[_Rt_].UD[0] >> SDL_SHIFT[shift]) | (mem & SDL_MASK[shift]); - memWrite64(addr & ~7, &mem); + memWrite64(addr & ~7, mem); } @@ -830,12 +826,10 @@ void SDR() { u32 addr = cpuRegs.GPR.r[_Rs_].UL[0] + _Imm_; u32 shift = addr & 7; - u64 mem; - - memRead64(addr & ~7, &mem); + u64 mem = memRead64(addr & ~7); mem = (cpuRegs.GPR.r[_Rt_].UD[0] << SDR_SHIFT[shift]) | (mem & SDR_MASK[shift]); - memWrite64(addr & ~7, &mem ); + memWrite64(addr & ~7, mem ); } void SQ() @@ -934,8 +928,12 @@ void SYSCALL() case 0x53: mode = "SDTV 768x576 @ ??.???"; gsSetVideoMode(GS_VideoMode::SDTV_576P); break; case 0x54: mode = "HDTV 1920x1080 @ ??.???"; gsSetVideoMode(GS_VideoMode::HDTV_1080P); break; - case 0x72: mode = "DVD NTSC 640x448 @ ??.???"; gsSetVideoMode(GS_VideoMode::DVD_NTSC); break; - case 0x73: mode = "DVD PAL 720x480 @ ??.???"; gsSetVideoMode(GS_VideoMode::DVD_PAL); break; + case 0x72: + case 0x82: + mode = "DVD NTSC 640x448 @ ??.???"; gsSetVideoMode(GS_VideoMode::DVD_NTSC); break; + case 0x73: + case 0x83: + mode = "DVD PAL 720x480 @ ??.???"; gsSetVideoMode(GS_VideoMode::DVD_PAL); break; default: DevCon.Error("Mode %x is not supported. Report me upstream", cpuRegs.GPR.n.a1.UC[0]); @@ -952,7 +950,7 @@ void SYSCALL() { u32 memaddr = cpuRegs.GPR.n.a0.UL[0]; u8 params[16]; - + cdvdReadLanguageParams(params); u32 osdconf = 0; @@ -979,7 +977,7 @@ void SYSCALL() cdvdReadLanguageParams(params); - u32 osdconf2 = (u32)((params[3] & 0x78) << 1); // Daylight Savings, 24hr clock, Date format + u32 osdconf2 = (((u32)params[3] & 0x78) << 9); // Daylight Savings, 24hr clock, Date format memWrite32(memaddr, osdconf2); return; @@ -1082,7 +1080,7 @@ void SYSCALL() // Pretty much what this does is find instances of string arguments and remaps them. // Instead of the addresse(s) being relative to the PS2 address space, make them relative to program memory. - // (This fixes issue #2865) + // (This fixes issue #2865) int curRegArg = 0; for (int i = 0; 1; i++) { @@ -1113,7 +1111,7 @@ void SYSCALL() } break; } - + default: break; diff --git a/pcsx2/R5900OpcodeTables.cpp b/pcsx2/R5900OpcodeTables.cpp index 8a9e78b772..356c5e7b07 100644 --- a/pcsx2/R5900OpcodeTables.cpp +++ b/pcsx2/R5900OpcodeTables.cpp @@ -626,7 +626,7 @@ namespace R5900 const OPCODE& Class_SPECIAL(u32 op) { return tbl_Special[op & 0x3F]; } const OPCODE& Class_REGIMM(u32 op) { return tbl_RegImm[(op >> 16) & 0x1F]; } - + const OPCODE& Class_MMI(u32 op) { return tbl_MMI[op & 0x3F]; } const OPCODE& Class_MMI0(u32 op) { return tbl_MMI0[(op >> 6) & 0x1F]; } const OPCODE& Class_MMI1(u32 op) { return tbl_MMI1[(op >> 6) & 0x1F]; } @@ -634,7 +634,7 @@ namespace R5900 const OPCODE& Class_MMI3(u32 op) { return tbl_MMI3[(op >> 6) & 0x1F]; } const OPCODE& Class_COP0(u32 op) { return tbl_COP0[(op >> 21) & 0x1F]; } - const OPCODE& Class_COP0_BC0(u32 op) { return tbl_COP0_BC0[(cpuRegs.code >> 16) & 0x03]; } + const OPCODE& Class_COP0_BC0(u32 op) { return tbl_COP0_BC0[(op >> 16) & 0x03]; } const OPCODE& Class_COP0_C0(u32 op) { return tbl_COP0_C0[op & 0x3F]; } const OPCODE& Class_COP1(u32 op) { return tbl_COP1[(op >> 21) & 0x1F]; } diff --git a/pcsx2/RDebug/deci2.txt b/pcsx2/RDebug/deci2.txt index cec342f166..ea0a0c1b4e 100644 --- a/pcsx2/RDebug/deci2.txt +++ b/pcsx2/RDebug/deci2.txt @@ -1,18 +1,18 @@ -pcsx2 log->debugger tty mapping -Ŀ -Bios EE 0 IOP Bios -CPU & MMI & COP0 & FPU EE 1 IOP IOP cpu -VU0 & VUMicro EE 2 IOP HW -VIF EE 3 IOP GTE -GIF EE 4 IOP GPU -DMA EE 5 IOP DMA -HW & Unknown Memory EE 6 IOP Unknown Memory -ELF & Scratch pad EE 7 IOP PAD -IPU EE 8 IOP CDR -SIF & RPC services EE 9 IOP - -SysMessage EEKernelIOP SysMessage - +pcsx2 log->debugger tty mapping +�������������������������������������������������������Ŀ +Bios �EE� 0 �IOP� Bios � +CPU & MMI & COP0 & FPU �EE� 1 �IOP� IOP cpu � +VU0 & VUMicro �EE� 2 �IOP� HW � +VIF �EE� 3 �IOP� GTE � +GIF �EE� 4 �IOP� GPU � +DMA �EE� 5 �IOP� DMA � +HW & Unknown Memory �EE� 6 �IOP� Unknown Memory � +ELF & Scratch pad �EE� 7 �IOP� PAD � +IPU �EE� 8 �IOP� CDR � +SIF & RPC services �EE� 9 �IOP� � + � � � � � +SysMessage �EE�Kernel�IOP� SysMessage � +��������������������������������������������������������� PRODG: 230,130, 120,121,122,110-119,11F,210-219,21F,410 CW: 230,130,150,120,121, 210-219,21F,110-119,11F diff --git a/pcsx2/RDebug/iloadp.txt b/pcsx2/RDebug/iloadp.txt index 9bb751f8e6..32ae15b37a 100644 --- a/pcsx2/RDebug/iloadp.txt +++ b/pcsx2/RDebug/iloadp.txt @@ -1,6 +1,6 @@ ILOADP_MODULE_INFO{ - u16 flags Ŀ <Ŀ - u16 version < + u16 flags ���Ŀ <��Ŀ + u16 version <���� ����� u32 addr u32 sz_text u32 sz_data diff --git a/pcsx2/Recording/InputRecording.cpp b/pcsx2/Recording/InputRecording.cpp index 6d08955eaa..6acc726119 100644 --- a/pcsx2/Recording/InputRecording.cpp +++ b/pcsx2/Recording/InputRecording.cpp @@ -15,24 +15,8 @@ #include "PrecompiledHeader.h" -#ifndef PCSX2_CORE -// TODO - Vaser - kill with wxWidgets - -#include "common/StringUtil.h" #include "SaveState.h" #include "Counters.h" -#include "SaveState.h" - -#include "gui/App.h" -#include "gui/AppSaveStates.h" -#include "DebugTools/Debug.h" -#include "GameDatabase.h" - -#include "InputRecording.h" -#include "InputRecordingControls.h" -#include "Utilities/InputRecordingLogger.h" - -#include void SaveStateBase::InputRecordingFreeze() { @@ -40,773 +24,211 @@ void SaveStateBase::InputRecordingFreeze() // CHANGING THIS WILL BREAK BACKWARDS COMPATIBILITY ON SAVESTATES FreezeTag("InputRecording"); Freeze(g_FrameCount); - - if (g_Conf->EmuOptions.EnableRecordingTools) - { - // Loading a save-state is an asynchronous task. If we are playing a recording - // that starts from a savestate (not power-on) and the starting (pcsx2 internal) frame - // marker has not been set (which comes from the save-state), we initialize it. - if (g_InputRecording.IsInitialLoad()) - g_InputRecording.SetupInitialState(g_FrameCount); - else if (g_InputRecording.IsActive() && IsLoading()) - g_InputRecording.SetFrameCounter(g_FrameCount); - } } -InputRecording g_InputRecording; +#ifdef PCSX2_CORE -InputRecording::InputRecordingPad::InputRecordingPad() -{ - padData = new PadData; -} +#include "InputRecording.h" -InputRecording::InputRecordingPad::~InputRecordingPad() -{ - delete padData; -} - -void InputRecording::InitVirtualPadWindows(wxWindow* parent) -{ - for (int port = 0; port < 2; ++port) - if (!pads[port].virtualPad) - pads[port].virtualPad = new VirtualPad(parent, port, g_Conf->inputRecording); -} - -void InputRecording::ShowVirtualPad(const int port) -{ - pads[port].virtualPad->Show(); -} - -void InputRecording::RecordingReset() -{ - // Booting is an asynchronous task. If we are playing a recording - // that starts from power-on and the starting (pcsx2 internal) frame - // marker has not been set, we initialize it. - if (g_InputRecording.IsInitialLoad()) - g_InputRecording.SetupInitialState(0); - else if (g_InputRecording.IsActive()) - { - g_InputRecording.SetFrameCounter(0); - g_InputRecordingControls.Lock(0); - } - else - g_InputRecordingControls.Resume(); -} - -void InputRecording::ControllerInterrupt(u8& data, u8& port, u16& bufCount, u8 buf[]) -{ - // TODO - Multi-Tap Support - - if (bufCount == 1) - fInterruptFrame = data == READ_DATA_AND_VIBRATE_FIRST_BYTE; - else if (bufCount == 2) - { - if (buf[bufCount] != READ_DATA_AND_VIBRATE_SECOND_BYTE) - fInterruptFrame = false; - } - else if (fInterruptFrame) - { - u8& bufVal = buf[bufCount]; - const u16 bufIndex = bufCount - 3; - if (state == InputRecordingMode::Replaying) - { - if (frameCounter >= 0 && frameCounter < INT_MAX) - { - if (!inputRecordingData.ReadKeyBuffer(bufVal, frameCounter, port, bufIndex)) - inputRec::consoleLog(fmt::format("Failed to read input data at frame {}", frameCounter)); - - // Update controller data state for future VirtualPad / logging usage. - pads[port].padData->UpdateControllerData(bufIndex, bufVal); - - if (pads[port].virtualPad->IsShown()) - pads[port].virtualPad->UpdateControllerData(bufIndex, pads[port].padData); - } - } - else - { - // Update controller data state for future VirtualPad / logging usage. - pads[port].padData->UpdateControllerData(bufIndex, bufVal); - - // Commit the byte to the movie file if we are recording - if (state == InputRecordingMode::Recording) - { - if (frameCounter >= 0) - { - // If the VirtualPad updated the PadData, we have to update the buffer - // before committing it to the recording / sending it to the game - if (pads[port].virtualPad->IsShown() && pads[port].virtualPad->UpdateControllerData(bufIndex, pads[port].padData)) - bufVal = pads[port].padData->PollControllerData(bufIndex); - - if (incrementUndo) - { - inputRecordingData.IncrementUndoCount(); - incrementUndo = false; - } - - if (frameCounter < INT_MAX && !inputRecordingData.WriteKeyBuffer(frameCounter, port, bufIndex, bufVal)) - inputRec::consoleLog(fmt::format("Failed to write input data at frame {}", frameCounter)); - } - } - // If the VirtualPad updated the PadData, we have to update the buffer - // before sending it to the game - else if (pads[port].virtualPad && pads[port].virtualPad->IsShown() && pads[port].virtualPad->UpdateControllerData(bufIndex, pads[port].padData)) - bufVal = pads[port].padData->PollControllerData(bufIndex); - } - } -} - -s32 InputRecording::GetFrameCounter() -{ - return frameCounter; -} - -InputRecordingFile& InputRecording::GetInputRecordingData() -{ - return inputRecordingData; -} - -u32 InputRecording::GetStartingFrame() -{ - return startingFrame; -} - -void InputRecording::IncrementFrameCounter() -{ - if (frameCounter < INT_MAX) - { - frameCounter++; - switch (state) - { - case InputRecordingMode::Recording: - inputRecordingData.SetTotalFrames(frameCounter); - [[fallthrough]]; - case InputRecordingMode::Replaying: - if (frameCounter == inputRecordingData.GetTotalFrames()) - incrementUndo = false; - break; - case InputRecordingMode::NotActive: // Does nothing but keep GCC happy. - break; - } - } -} - -void InputRecording::LogAndRedraw() -{ - for (u8 port = 0; port < 2; port++) - { - pads[port].padData->LogPadData(port); - // As well as re-render the virtual pad UI, if applicable - // - Don't render if it's minimized - if (pads[port].virtualPad->IsShown() && !pads[port].virtualPad->IsIconized()) - pads[port].virtualPad->Redraw(); - } -} - -bool InputRecording::IsInterruptFrame() -{ - return fInterruptFrame; -} - -bool InputRecording::IsActive() -{ - return state != InputRecordingMode::NotActive; -} - -bool InputRecording::IsInitialLoad() -{ - return initialLoad; -} - -bool InputRecording::IsReplaying() -{ - return state == InputRecordingMode::Replaying; -} - -bool InputRecording::IsRecording() -{ - return state == InputRecordingMode::Recording; -} - -wxString InputRecording::RecordingModeTitleSegment() -{ - switch (state) - { - case InputRecordingMode::Recording: - return wxString("Recording"); - case InputRecordingMode::Replaying: - return wxString("Replaying"); - default: - return wxString("No Movie"); - } -} - -void InputRecording::SetToRecordMode() -{ - state = InputRecordingMode::Recording; - pads[CONTROLLER_PORT_ONE].virtualPad->SetReadOnlyMode(false); - pads[CONTROLLER_PORT_TWO].virtualPad->SetReadOnlyMode(false); - inputRec::log("Record mode ON"); -} - -void InputRecording::SetToReplayMode() -{ - state = InputRecordingMode::Replaying; - pads[CONTROLLER_PORT_ONE].virtualPad->SetReadOnlyMode(true); - pads[CONTROLLER_PORT_TWO].virtualPad->SetReadOnlyMode(true); - inputRec::log("Replay mode ON"); -} - -void InputRecording::SetFrameCounter(u32 newGFrameCount) -{ - if (newGFrameCount > startingFrame + (u32)inputRecordingData.GetTotalFrames()) - { - inputRec::consoleLog("Warning, you've loaded PCSX2 emulation to a point after the end of the original recording. This should be avoided."); - inputRec::consoleLog("Savestate's framecount has been ignored."); - frameCounter = inputRecordingData.GetTotalFrames(); - if (state == InputRecordingMode::Replaying) - SetToRecordMode(); - incrementUndo = false; - } - else - { - if (newGFrameCount < startingFrame) - { - inputRec::consoleLog("Warning, you've loaded PCSX2 emulation to a point before the start of the original recording. This should be avoided."); - if (state == InputRecordingMode::Recording) - SetToReplayMode(); - } - else if (newGFrameCount == 0 && state == InputRecordingMode::Recording) - SetToReplayMode(); - frameCounter = newGFrameCount - (s32)startingFrame; - incrementUndo = true; - } -} - -void InputRecording::SetupInitialState(u32 newStartingFrame) -{ - startingFrame = newStartingFrame; - if (state != InputRecordingMode::Replaying) - { - inputRec::log("Started new input recording"); - inputRec::consoleLog(fmt::format("Filename {}", inputRecordingData.GetFilename().ToUTF8())); - SetToRecordMode(); - } - else - { - // Check if the current game matches with the one used to make the original recording - if (!g_Conf->CurrentIso.IsEmpty()) - if (resolveGameName() != inputRecordingData.GetHeader().gameName) - inputRec::consoleLog("Input recording was possibly constructed for a different game."); - - incrementUndo = true; - inputRec::log("Replaying input recording"); - inputRec::consoleMultiLog({fmt::format("File: {}", inputRecordingData.GetFilename().ToUTF8()), - fmt::format("PCSX2 Version Used: {}", std::string(inputRecordingData.GetHeader().emu)), - fmt::format("Recording File Version: {}", inputRecordingData.GetHeader().version), - fmt::format("Associated Game Name or ISO Filename: {}", std::string(inputRecordingData.GetHeader().gameName)), - fmt::format("Author: {}", inputRecordingData.GetHeader().author), - fmt::format("Total Frames: {}", inputRecordingData.GetTotalFrames()), - fmt::format("Undo Count: {}", inputRecordingData.GetUndoCount())}); - SetToReplayMode(); - } - - if (inputRecordingData.FromSaveState()) - inputRec::consoleLog(fmt::format("Internal Starting Frame: {}", startingFrame)); - frameCounter = 0; - initialLoad = false; - g_InputRecordingControls.Lock(startingFrame); -} - -void InputRecording::FailedSavestate() -{ - inputRec::consoleLog(fmt::format("{} is not compatible with this version of PCSX2", savestate.ToUTF8())); - inputRec::consoleLog(fmt::format("Original PCSX2 version used: {}", inputRecordingData.GetHeader().emu)); - inputRecordingData.Close(); - initialLoad = false; - state = InputRecordingMode::NotActive; - g_InputRecordingControls.Resume(); -} - -void InputRecording::Stop() -{ - state = InputRecordingMode::NotActive; - pads[CONTROLLER_PORT_ONE].virtualPad->SetReadOnlyMode(false); - pads[CONTROLLER_PORT_TWO].virtualPad->SetReadOnlyMode(false); - incrementUndo = false; - if (inputRecordingData.Close()) - inputRec::log("Input recording stopped"); -} - -bool InputRecording::Create(wxString fileName, const bool fromSaveState, wxString authorName) -{ - if (!inputRecordingData.OpenNew(fileName, fromSaveState)) - return false; - - initialLoad = true; - state = InputRecordingMode::Recording; - if (fromSaveState) - { - savestate = fileName + "_SaveState.p2s"; - if (wxFileExists(savestate)) - wxCopyFile(savestate, savestate + ".bak", true); - StateCopy_SaveToFile(savestate); - } - else - sApp.SysExecute(g_Conf->CdvdSource); - - // Set emulator version - inputRecordingData.GetHeader().SetEmulatorVersion(); - - // Set author name - if (!authorName.IsEmpty()) - inputRecordingData.GetHeader().SetAuthor(authorName); - - // Set Game Name - inputRecordingData.GetHeader().SetGameName(resolveGameName()); - // Write header contents - inputRecordingData.WriteHeader(); - return true; -} - -bool InputRecording::Play(wxWindow* parent, wxString filename) -{ - if (!inputRecordingData.OpenExisting(filename)) - return false; - - // Either load the savestate, or restart the game - if (inputRecordingData.FromSaveState()) - { - if (!GetCoreThread().IsOpen()) - { - inputRec::consoleLog("Game is not open, aborting playing input recording which starts on a save-state."); - inputRecordingData.Close(); - return false; - } - - savestate = inputRecordingData.GetFilename() + "_SaveState.p2s"; - if (!wxFileExists(savestate)) - { - wxFileDialog loadStateDialog(parent, _("Select the savestate that will accompany this recording"), L"", L"", - L"Savestate files (*.p2s)|*.p2s", wxFD_OPEN); - if (loadStateDialog.ShowModal() == wxID_CANCEL) - { - inputRec::consoleLog(fmt::format("Could not locate savestate file at location - {}", savestate.ToUTF8())); - inputRec::log("Savestate load failed"); - inputRecordingData.Close(); - return false; - } - - savestate = loadStateDialog.GetPath(); - inputRec::consoleLog(fmt::format("Base savestate set to {}", savestate.ToUTF8())); - } - state = InputRecordingMode::Replaying; - initialLoad = true; - StateCopy_LoadFromFile(savestate); - } - else - { - state = InputRecordingMode::Replaying; - initialLoad = true; - sApp.SysExecute(g_Conf->CdvdSource); - } - return true; -} - -void InputRecording::GoToFirstFrame(wxWindow* parent) -{ - if (inputRecordingData.FromSaveState()) - { - if (!wxFileExists(savestate)) - { - const bool initiallyPaused = g_InputRecordingControls.IsPaused(); - - if (!initiallyPaused) - g_InputRecordingControls.PauseImmediately(); - - inputRec::consoleLog(fmt::format("Could not locate savestate file at location - {}\n", savestate.ToUTF8())); - wxFileDialog loadStateDialog(parent, _("Select a savestate to accompany the recording with"), L"", L"", - L"Savestate files (*.p2s)|*.p2s", wxFD_OPEN); - int result = loadStateDialog.ShowModal(); - if (!initiallyPaused) - g_InputRecordingControls.Resume(); - - if (result == wxID_CANCEL) - { - inputRec::log("Savestate load cancelled"); - return; - } - savestate = loadStateDialog.GetPath(); - inputRec::consoleLog(fmt::format("Base savestate swapped to {}", savestate.ToUTF8())); - } - StateCopy_LoadFromFile(savestate); - } - else - sApp.SysExecute(g_Conf->CdvdSource); - - if (IsRecording()) - SetToReplayMode(); -} - -wxString InputRecording::resolveGameName() -{ - std::string gameName; - const std::string gameKey(SysGetDiscID()); - if (!gameKey.empty()) - { - auto game = GameDatabase::findGame(gameKey); - if (game) - { - gameName = game->name; - gameName += " (" + game->region + ")"; - } - } - return !gameName.empty() ? StringUtil::UTF8StringToWxString(gameName) : Path::GetFilename(g_Conf->CurrentIso); -} - -#else +#include "InputRecordingControls.h" +#include "Utilities/InputRecordingLogger.h" #include "common/FileSystem.h" #include "common/StringUtil.h" -#include "SaveState.h" #include "Counters.h" #include "SaveState.h" - #include "VMManager.h" - #include "DebugTools/Debug.h" #include "GameDatabase.h" - -#include "InputRecording.h" -#include "InputRecordingControls.h" -#include "Utilities/InputRecordingLogger.h" - -#include - -void SaveStateBase::InputRecordingFreeze() -{ - // NOTE - BE CAREFUL - // CHANGING THIS WILL BREAK BACKWARDS COMPATIBILITY ON SAVESTATES - FreezeTag("InputRecording"); - Freeze(g_FrameCount); - - // Loading a save-state is an asynchronous task. If we are playing a recording - // that starts from a savestate (not power-on) and the starting (pcsx2 internal) frame - // marker has not been set (which comes from the save-state), we initialize it. - if (g_InputRecording.IsInitialLoad()) - g_InputRecording.SetupInitialState(g_FrameCount); - else if (g_InputRecording.IsActive() && IsLoading()) - g_InputRecording.SetFrameCounter(g_FrameCount); -} +#include "fmt/format.h" +#include "GS.h" InputRecording g_InputRecording; -InputRecording::InputRecordingPad::InputRecordingPad() +bool InputRecording::create(const std::string& fileName, const bool fromSaveState, const std::string& authorName) { - padData = new PadData; -} - -InputRecording::InputRecordingPad::~InputRecordingPad() -{ - delete padData; -} - -void InputRecording::RecordingReset() -{ - // Booting is an asynchronous task. If we are playing a recording - // that starts from power-on and the starting (pcsx2 internal) frame - // marker has not been set, we initialize it. - if (g_InputRecording.IsInitialLoad()) - g_InputRecording.SetupInitialState(0); - else if (g_InputRecording.IsActive()) + if (!m_file.openNew(fileName, fromSaveState)) { - g_InputRecording.SetFrameCounter(0); - g_InputRecordingControls.Lock(0); + return false; + } + + m_controls.setRecordMode(); + if (fromSaveState) + { + std::string savestatePath = fmt::format("{}_SaveState.p2s", fileName); + if (FileSystem::FileExists(savestatePath.c_str())) + { + FileSystem::CopyFilePath(savestatePath.c_str(), fmt::format("{}.bak", savestatePath).c_str(), true); + } + m_type = Type::FROM_SAVESTATE; + m_is_active = true; + m_initial_load_complete = true; + m_watching_for_rerecords = true; + setStartingFrame(g_FrameCount); + // TODO - error handling + VMManager::SaveState(savestatePath.c_str()); } else - g_InputRecordingControls.Resume(); + { + m_starting_frame = 0; + m_type = Type::POWER_ON; + m_initial_load_complete = false; + m_is_active = true; + // TODO - should this be an explicit [full] boot instead of a reset? + VMManager::Reset(); + } + + m_file.setEmulatorVersion(); + m_file.setAuthor(authorName); + m_file.setGameName(resolveGameName()); + m_file.writeHeader(); + initializeState(); + InputRec::log("Started new input recording"); + InputRec::consoleLog(fmt::format("Filename {}", m_file.getFilename())); + return true; } -void InputRecording::ControllerInterrupt(u8& data, u8& port, u16& bufCount, u8 buf[]) +bool InputRecording::play(const std::string& filename) { - // TODO - Multi-Tap Support - - if (bufCount == 1) - fInterruptFrame = data == READ_DATA_AND_VIBRATE_FIRST_BYTE; - else if (bufCount == 2) + if (!m_file.openExisting(filename)) { - if (buf[bufCount] != READ_DATA_AND_VIBRATE_SECOND_BYTE) - fInterruptFrame = false; + return false; } - else if (fInterruptFrame) + + // Either load the savestate, or restart the game + if (m_file.fromSaveState()) { - u8& bufVal = buf[bufCount]; - const u16 bufIndex = bufCount - 3; - if (state == InputRecordingMode::Replaying) + std::string savestatePath = fmt::format("{}_SaveState.p2s", m_file.getFilename()); + if (!FileSystem::FileExists(savestatePath.c_str())) { - if (frameCounter >= 0 && frameCounter < INT_MAX) - { - if (!inputRecordingData.ReadKeyBuffer(bufVal, frameCounter, port, bufIndex)) - inputRec::consoleLog(fmt::format("Failed to read input data at frame {}", frameCounter)); - - // Update controller data state for future VirtualPad / logging usage. - pads[port].padData->UpdateControllerData(bufIndex, bufVal); - } + InputRec::consoleLog(fmt::format("Could not locate savestate file at location - {}", savestatePath)); + InputRec::log("Savestate load failed"); + m_file.close(); + return false; } - else + m_type = Type::FROM_SAVESTATE; + m_initial_load_complete = false; + m_is_active = true; + const auto loaded = VMManager::LoadState(savestatePath.c_str()); + if (!loaded) { - // Update controller data state for future VirtualPad / logging usage. - pads[port].padData->UpdateControllerData(bufIndex, bufVal); + InputRec::log("Savestate load failed, unsupported version?"); + m_file.close(); + m_is_active = false; + return false; + } + } + else + { + m_starting_frame = 0; + m_type = Type::POWER_ON; + m_initial_load_complete = false; + m_is_active = true; + // TODO - should this be an explicit [full] boot instead of a reset? + VMManager::Reset(); + } + m_controls.setReplayMode(); + initializeState(); + InputRec::log("Replaying input recording"); + m_file.logRecordingMetadata(); + if (resolveGameName() != m_file.getGameName()) + { + InputRec::consoleLog(fmt::format("Input recording was possibly constructed for a different game. Expected: {}, Actual: {}", m_file.getGameName(), resolveGameName())); + } + return true; +} - // Commit the byte to the movie file if we are recording - if (state == InputRecordingMode::Recording) +void InputRecording::closeActiveFile() +{ + if (!m_is_active) + { + return; + } + if (m_file.close()) + { + m_is_active = false; + InputRec::log("Input recording stopped"); + GetMTGS().PresentCurrentFrame(); + } + else + { + InputRec::log("Unable to stop input recording"); + } +} + +void InputRecording::stop() +{ + if (VMManager::GetState() == VMState::Paused) + { + closeActiveFile(); + } + else + { + // Don't stop immediately, close the file after the current frame completes + m_recordingQueue.push([&]() { + closeActiveFile(); + }); + } +} + +void InputRecording::handleControllerDataUpdate() +{ + // TODO - multi-tap support with new file format, for now just controller 0 and 1 + for (int i = 0; i < 2; i++) + { + // Fetch the current frame's data + PadData frameData(i, 0); + if (m_is_active) + { + if (m_controls.isRecording()) { - if (frameCounter >= 0) + saveControllerData(frameData, i, 0); + } + else if (m_controls.isReplaying()) + { + const auto& modifiedFrameData = updateControllerData(i, 0); + if (modifiedFrameData) { - if (incrementUndo) - { - inputRecordingData.IncrementUndoCount(); - incrementUndo = false; - } - - if (frameCounter < INT_MAX && !inputRecordingData.WriteKeyBuffer(frameCounter, port, bufIndex, bufVal)) - inputRec::consoleLog(fmt::format("Failed to write input data at frame {}", frameCounter)); + frameData = modifiedFrameData.value(); } } } + // Log the data we have gathered, useful for debugging our use-case + frameData.LogPadData(); } } -s32 InputRecording::GetFrameCounter() +void InputRecording::saveControllerData(const PadData& data, const int port, const int slot) { - return frameCounter; -} - -InputRecordingFile& InputRecording::GetInputRecordingData() -{ - return inputRecordingData; -} - -u32 InputRecording::GetStartingFrame() -{ - return startingFrame; -} - -void InputRecording::IncrementFrameCounter() -{ - if (frameCounter < INT_MAX) + // Save the frame's data to the file + if (!m_file.writePadData(m_frame_counter, data)) { - frameCounter++; - switch (state) - { - case InputRecordingMode::Recording: - inputRecordingData.SetTotalFrames(frameCounter); - [[fallthrough]]; - case InputRecordingMode::Replaying: - if (frameCounter == inputRecordingData.GetTotalFrames()) - incrementUndo = false; - default: - break; - } + InputRec::consoleLog(fmt::format("Failed to write input data at [{}:{}:{}]", m_frame_counter, port, slot)); } } - -void InputRecording::LogAndRedraw() +std::optional InputRecording::updateControllerData(const int port, const int slot) { - for (u8 port = 0; port < 2; port++) + // Get the PadData from the file + const auto frameData = m_file.readPadData(m_frame_counter, port, slot); + if (frameData) { - pads[port].padData->LogPadData(port); - } -} - -bool InputRecording::IsInterruptFrame() -{ - return fInterruptFrame; -} - -bool InputRecording::IsActive() -{ - return state != InputRecordingMode::NotActive; -} - -bool InputRecording::IsInitialLoad() -{ - return initialLoad; -} - -bool InputRecording::IsReplaying() -{ - return state == InputRecordingMode::Replaying; -} - -bool InputRecording::IsRecording() -{ - return state == InputRecordingMode::Recording; -} - -void InputRecording::SetToRecordMode() -{ - state = InputRecordingMode::Recording; - inputRec::log("Record mode ON"); -} - -void InputRecording::SetToReplayMode() -{ - state = InputRecordingMode::Replaying; - inputRec::log("Replay mode ON"); -} - -void InputRecording::SetFrameCounter(u32 newGFrameCount) -{ - if (newGFrameCount > startingFrame + (u32)inputRecordingData.GetTotalFrames()) - { - inputRec::consoleLog("Warning, you've loaded PCSX2 emulation to a point after the end of the original recording. This should be avoided."); - inputRec::consoleLog("Savestate's framecount has been ignored."); - frameCounter = inputRecordingData.GetTotalFrames(); - if (state == InputRecordingMode::Replaying) - SetToRecordMode(); - incrementUndo = false; + // Update the g_key_status appropriately + frameData->OverrideActualController(); } else { - if (newGFrameCount < startingFrame) - { - inputRec::consoleLog("Warning, you've loaded PCSX2 emulation to a point before the start of the original recording. This should be avoided."); - if (state == InputRecordingMode::Recording) - SetToReplayMode(); - } - else if (newGFrameCount == 0 && state == InputRecordingMode::Recording) - SetToReplayMode(); - frameCounter = newGFrameCount - (s32)startingFrame; - incrementUndo = true; + InputRec::consoleLog(fmt::format("Failed to read input data at [{}:{}:{}]", m_frame_counter, port, slot)); } + return frameData; } -void InputRecording::SetupInitialState(u32 newStartingFrame) +void InputRecording::processRecordQueue() { - startingFrame = newStartingFrame; - if (state != InputRecordingMode::Replaying) + while (!m_recordingQueue.empty()) { - inputRec::log("Started new input recording"); - inputRec::consoleLog(fmt::format("Filename {}", inputRecordingData.GetFilename())); - SetToRecordMode(); + m_recordingQueue.front()(); + m_recordingQueue.pop(); } - else - { - // Check if the current game matches with the one used to make the original recording - // TODO - Vaser - this should be the CRC in hindsight anyway - if (!VMManager::GetDiscPath().empty()) - if (resolveGameName() != inputRecordingData.GetHeader().gameName) - inputRec::consoleLog("Input recording was possibly constructed for a different game."); - - incrementUndo = true; - inputRec::log("Replaying input recording"); - inputRec::consoleMultiLog({fmt::format("File: {}", inputRecordingData.GetFilename()), - fmt::format("PCSX2 Version Used: {}", std::string(inputRecordingData.GetHeader().emu)), - fmt::format("Recording File Version: {}", inputRecordingData.GetHeader().version), - fmt::format("Associated Game Name or ISO Filename: {}", std::string(inputRecordingData.GetHeader().gameName)), - fmt::format("Author: {}", inputRecordingData.GetHeader().author), - fmt::format("Total Frames: {}", inputRecordingData.GetTotalFrames()), - fmt::format("Undo Count: {}", inputRecordingData.GetUndoCount())}); - SetToReplayMode(); - } - - if (inputRecordingData.FromSaveState()) - inputRec::consoleLog(fmt::format("Internal Starting Frame: {}", startingFrame)); - frameCounter = 0; - initialLoad = false; - g_InputRecordingControls.Lock(startingFrame); -} - -void InputRecording::FailedSavestate() -{ - inputRec::consoleLog(fmt::format("{} is not compatible with this version of PCSX2", savestate)); - inputRec::consoleLog(fmt::format("Original PCSX2 version used: {}", inputRecordingData.GetHeader().emu)); - inputRecordingData.Close(); - initialLoad = false; - state = InputRecordingMode::NotActive; - g_InputRecordingControls.Resume(); -} - -void InputRecording::Stop() -{ - state = InputRecordingMode::NotActive; - incrementUndo = false; - if (inputRecordingData.Close()) - inputRec::log("Input recording stopped"); -} - -bool InputRecording::Create(const std::string_view& fileName, const bool fromSaveState, const std::string_view& authorName) -{ - if (!inputRecordingData.OpenNew(fileName, fromSaveState)) - return false; - - initialLoad = true; - state = InputRecordingMode::Recording; - if (fromSaveState) - { - savestate = fmt::format("{}_SaveState.p2s", fileName); - if (FileSystem::FileExists(savestate.c_str())) - { - FileSystem::CopyFilePath(savestate.c_str(), fmt::format("{}.bak", savestate).c_str(), true); - } - VMManager::SaveState(savestate.c_str()); - } - else - { - // Vaser - CHECK - don't need to specify a source anymore? (cdvd/etc?) - VMManager::Execute(); - } - - // Set emulator version - inputRecordingData.GetHeader().SetEmulatorVersion(); - - // Set author name - if (!authorName.empty()) - inputRecordingData.GetHeader().SetAuthor(authorName); - - // Set Game Name - inputRecordingData.GetHeader().SetGameName(resolveGameName()); - // Write header contents - inputRecordingData.WriteHeader(); - return true; -} - -bool InputRecording::Play(const std::string_view& filename) -{ - if (!inputRecordingData.OpenExisting(filename)) - return false; - - // Either load the savestate, or restart the game - if (inputRecordingData.FromSaveState()) - { - // TODO - Vaser - VM State is atomic, be careful. - if (VMManager::GetState() != VMState::Running && VMManager::GetState() != VMState::Paused) - { - inputRec::consoleLog("Game is not open, aborting playing input recording which starts on a save-state."); - inputRecordingData.Close(); - return false; - } - - savestate = fmt::format("{}_SaveState.p2s", inputRecordingData.GetFilename()); - if (!FileSystem::FileExists(savestate.c_str())) - { - inputRec::consoleLog(fmt::format("Could not locate savestate file at location - {}", savestate)); - inputRec::log("Savestate load failed"); - inputRecordingData.Close(); - return false; - } - state = InputRecordingMode::Replaying; - initialLoad = true; - VMManager::LoadState(savestate.c_str()); - } - else - { - state = InputRecordingMode::Replaying; - initialLoad = true; - // Vaser - CHECK - don't need to specify a source anymore? (cdvd/etc?) - VMManager::Execute(); - } - return true; } std::string InputRecording::resolveGameName() @@ -818,11 +240,159 @@ std::string InputRecording::resolveGameName() auto game = GameDatabase::findGame(gameKey); if (game) { - gameName = game->name; - gameName += " (" + game->region + ")"; + gameName = fmt::format("{} ({})", game->name, game->region); } } return !gameName.empty() ? gameName : VMManager::GetGameName(); } -#endif +void InputRecording::incFrameCounter() +{ + if (!m_is_active) + { + return; + } + + if (m_frame_counter >= std::numeric_limits::max()) + { + // TODO - log the incredible achievment of playing for longer than 4 billion years, and end the recording + stop(); + return; + } + m_frame_counter++; + + if (m_controls.isReplaying()) + { + // If we've reached the end of the recording while replaying, pause + if (m_frame_counter == m_file.getTotalFrames() - 1) + { + VMManager::SetPaused(true); + // Can also stop watching for re-records, they've watched to the end of the recording + m_watching_for_rerecords = false; + } + } + if (m_controls.isRecording()) + { + m_file.setTotalFrames(m_frame_counter); + // If we've been in record mode and moved to the next frame, we've overrote something + // if this was following a save-state loading, this is considered a re-record, a.k.a an undo + if (m_watching_for_rerecords) + { + m_file.incrementUndoCount(); + m_watching_for_rerecords = false; + } + } +} + +u64 InputRecording::getFrameCounter() const +{ + return m_frame_counter; +} + +bool InputRecording::isActive() const +{ + return m_is_active; +} + +void InputRecording::handleExceededFrameCounter() +{ + // if we go past the end, switch to recording mode so nothing is lost + if (m_frame_counter >= m_file.getTotalFrames() && m_controls.isReplaying()) + { + m_controls.setRecordMode(false); + } +} + +void InputRecording::handleReset() +{ + if (m_initial_load_complete) + { + adjustFrameCounterOnReRecord(0); + } + m_initial_load_complete = true; +} + +void InputRecording::handleLoadingSavestate() +{ + // We need to keep track of the starting internal frame of the recording + // - For a power-on recording this should already be done - it starts at 0 + // - For save state recordings, this is stored inside the initial save-state + // + // Why? + // - When you re-record you load another save-state which has it's own frame counter + // stored within, we use this to adjust the frame we are replaying/recording to + if (isTypeSavestate() && !m_initial_load_complete) + { + setStartingFrame(g_FrameCount); + m_initial_load_complete = true; + } + else + { + adjustFrameCounterOnReRecord(g_FrameCount); + m_watching_for_rerecords = true; + } +} + +bool InputRecording::isTypeSavestate() const +{ + return m_type == Type::FROM_SAVESTATE; +} + +void InputRecording::setStartingFrame(u32 startingFrame) +{ + if (m_type == Type::POWER_ON) + { + return; + } + InputRec::consoleLog(fmt::format("Internal Starting Frame: {}", startingFrame)); + m_starting_frame = startingFrame; +} + +void InputRecording::adjustFrameCounterOnReRecord(u32 newFrameCounter) +{ + if (newFrameCounter > m_starting_frame + m_file.getTotalFrames()) + { + InputRec::consoleLog("Warning, you've loaded PCSX2 emulation to a point after the end of the original recording. This should be avoided."); + InputRec::consoleLog("Savestate's framecount has been ignored, using the max length of the recording instead."); + m_frame_counter = m_file.getTotalFrames(); + if (getControls().isReplaying()) + { + getControls().setRecordMode(); + } + return; + } + if (newFrameCounter < m_starting_frame) + { + InputRec::consoleLog("Warning, you've loaded PCSX2 emulation to a point before the start of the original recording. This should be avoided."); + InputRec::consoleLog("Savestate's framecount has been ignored, starting from the beginning in replay mode."); + m_frame_counter = 0; + if (getControls().isRecording()) + { + getControls().setReplayMode(); + } + return; + } + else if (newFrameCounter == 0 && getControls().isRecording()) + { + getControls().setReplayMode(); + } + m_frame_counter = newFrameCounter - m_starting_frame; +} + +InputRecordingControls& InputRecording::getControls() +{ + return m_controls; +} + +const InputRecordingFile& InputRecording::getData() const +{ + return m_file; +} + +void InputRecording::initializeState() +{ + m_frame_counter = 0; + m_watching_for_rerecords = false; +} + +#endif \ No newline at end of file diff --git a/pcsx2/Recording/InputRecording.h b/pcsx2/Recording/InputRecording.h index 80fc6d9879..67fdf87fdd 100644 --- a/pcsx2/Recording/InputRecording.h +++ b/pcsx2/Recording/InputRecording.h @@ -15,140 +15,12 @@ #pragma once -#ifndef PCSX2_CORE -// TODO - Vaser - kill with wxWidgets - -#include "Recording/InputRecordingFile.h" -#include "Recording/VirtualPad/VirtualPad.h" - -class InputRecording -{ -public: - // Initializes all VirtualPad windows with "parent" as their base - void InitVirtualPadWindows(wxWindow* parent); - - // Save or load PCSX2's global frame counter (g_FrameCount) along with each full/fast boot - // - // This is to prevent any inaccuracy issues caused by having a different - // internal emulation frame count than what it was at the beginning of the - // original recording - void RecordingReset(); - - // Main handler for ingesting input data and either saving it to the recording file (recording) - // or mutating it to the contents of the recording file (replaying) - void ControllerInterrupt(u8& data, u8& port, u16& BufCount, u8 buf[]); - - // The running frame counter for the input recording - s32 GetFrameCounter(); - - InputRecordingFile& GetInputRecordingData(); - - // The internal PCSX2 g_FrameCount value on the first frame of the recording - u32 GetStartingFrame(); - - void IncrementFrameCounter(); - - // DEPRECATED: Slated for removal - // If the current frame contains controller / input data - bool IsInterruptFrame(); - - // If there is currently an input recording being played back or actively being recorded - bool IsActive(); - - // Whether or not the recording's initial state has yet to be loaded or saved and - // the rest of the recording can be initialized - // This is not applicable to recordings from a "power-on" state - bool IsInitialLoad(); - - // If there is currently an input recording being played back - bool IsReplaying(); - - // If there are inputs currently being recorded to a file - bool IsRecording(); - - // String representation of the current recording mode to be interpolated into the title - wxString RecordingModeTitleSegment(); - - // Sets input recording to Record Mode - void SetToRecordMode(); - - // Sets input recording to Replay Mode - void SetToReplayMode(); - - // Set the running frame counter for the input recording to an arbitrary value - void SetFrameCounter(u32 newGFrameCount); - - // Sets up all values and prints console logs pertaining to the start of a recording - void SetupInitialState(u32 newStartingFrame); - - /// Functions called from GUI - - // Create a new input recording file - bool Create(wxString filename, const bool fromSaveState, wxString authorName); - // Play an existing input recording from a file - // Calls a file dialog if it fails to locate the default base savestate - bool Play(wxWindow* parent, wxString filename); - // Stop the active input recording - void Stop(); - // Displays the VirtualPad window for the chosen pad - void ShowVirtualPad(const int port); - // Logs the padData and redraws the virtualPad windows of active pads - void LogAndRedraw(); - // Resets emulation to the beginning of a recording - // Calls a file dialog if it fails to locate the base savestate - void GoToFirstFrame(wxWindow* parent); - // Resets a recording if the base savestate could not be loaded at the start - void FailedSavestate(); - -private: - enum class InputRecordingMode - { - NotActive, - Recording, - Replaying, - }; - - static const int CONTROLLER_PORT_ONE = 0; - static const int CONTROLLER_PORT_TWO = 1; - - // 0x42 is the magic number to indicate the default controller read query - // See - PAD.cpp::PADpoll - https://github.com/PCSX2/pcsx2/blob/master/pcsx2/PAD/Windows/PAD.cpp#L1255 - static const u8 READ_DATA_AND_VIBRATE_FIRST_BYTE = 0x42; - // 0x5A is always the second byte in the buffer when the normal READ_DATA_AND_VIBRATE (0x42) query is executed. - // See - PAD.cpp::PADpoll - https://github.com/PCSX2/pcsx2/blob/master/pcsx2/PAD/Windows/PAD.cpp#L1256 - static const u8 READ_DATA_AND_VIBRATE_SECOND_BYTE = 0x5A; - - // DEPRECATED: Slated for removal - bool fInterruptFrame = false; - InputRecordingFile inputRecordingData; - bool initialLoad = false; - u32 startingFrame = 0; - s32 frameCounter = 0; - bool incrementUndo = false; - InputRecordingMode state = InputRecording::InputRecordingMode::NotActive; - wxString savestate; - - // Array of usable pads (currently, only 2) - struct InputRecordingPad - { - // Controller Data - PadData* padData; - // VirtualPad - VirtualPad* virtualPad; - InputRecordingPad(); - ~InputRecordingPad(); - } pads[2]; - - // Resolve the name and region of the game currently loaded using the GameDB - // If the game cannot be found in the DB, the fallback is the ISO filename - wxString resolveGameName(); -}; - -extern InputRecording g_InputRecording; - -#else +#ifdef PCSX2_CORE + +#include #include "Recording/InputRecordingFile.h" +#include "Recording/InputRecordingControls.h" class InputRecording { @@ -159,108 +31,49 @@ public: FROM_SAVESTATE }; - // Save or load PCSX2's global frame counter (g_FrameCount) along with each full/fast boot - // - // This is to prevent any inaccuracy issues caused by having a different - // internal emulation frame count than what it was at the beginning of the - // original recording - void RecordingReset(); + bool create(const std::string& filename, const bool fromSaveState, const std::string& authorName); + bool play(const std::string& path); + void stop(); - // Main handler for ingesting input data and either saving it to the recording file (recording) - // or mutating it to the contents of the recording file (replaying) - void ControllerInterrupt(u8& data, u8& port, u16& BufCount, u8 buf[]); + void handleControllerDataUpdate(); + void saveControllerData(const PadData& data, const int port, const int slot); + std::optional updateControllerData(const int port, const int slot); + void incFrameCounter(); + u64 getFrameCounter() const; + bool isActive() const; + void processRecordQueue(); - // The running frame counter for the input recording - s32 GetFrameCounter(); + void handleExceededFrameCounter(); + void handleReset(); + void handleLoadingSavestate(); + bool isTypeSavestate() const; + void adjustFrameCounterOnReRecord(u32 newFrameCounter); - InputRecordingFile& GetInputRecordingData(); - - // The internal PCSX2 g_FrameCount value on the first frame of the recording - u32 GetStartingFrame(); - - void IncrementFrameCounter(); - - // DEPRECATED: Slated for removal - // If the current frame contains controller / input data - bool IsInterruptFrame(); - - // If there is currently an input recording being played back or actively being recorded - bool IsActive(); - - // Whether or not the recording's initial state has yet to be loaded or saved and - // the rest of the recording can be initialized - // This is not applicable to recordings from a "power-on" state - bool IsInitialLoad(); - - // If there is currently an input recording being played back - bool IsReplaying(); - - // If there are inputs currently being recorded to a file - bool IsRecording(); - - // Sets input recording to Record Mode - void SetToRecordMode(); - - // Sets input recording to Replay Mode - void SetToReplayMode(); - - // Set the running frame counter for the input recording to an arbitrary value - void SetFrameCounter(u32 newGFrameCount); - - // Sets up all values and prints console logs pertaining to the start of a recording - void SetupInitialState(u32 newStartingFrame); - - /// Functions called from GUI - - // Create a new input recording file - bool Create(const std::string_view& filename, const bool fromSaveState, const std::string_view& authorName); - // Play an existing input recording from a file - // TODO - Vaser - Calls a file dialog if it fails to locate the default base savestate - bool Play(const std::string_view& path); - // Stop the active input recording - void Stop(); - // Logs the padData and redraws the virtualPad windows of active pads - void LogAndRedraw(); - // Resets a recording if the base savestate could not be loaded at the start - void FailedSavestate(); + InputRecordingControls& getControls(); + const InputRecordingFile& getData() const; private: - enum class InputRecordingMode - { - NotActive, - Recording, - Replaying, - }; + InputRecordingControls m_controls; + InputRecordingFile m_file; - static const int CONTROLLER_PORT_ONE = 0; - static const int CONTROLLER_PORT_TWO = 1; + Type m_type; - // 0x42 is the magic number to indicate the default controller read query - // See - PAD.cpp::PADpoll - https://github.com/PCSX2/pcsx2/blob/master/pcsx2/PAD/Windows/PAD.cpp#L1255 - static const u8 READ_DATA_AND_VIBRATE_FIRST_BYTE = 0x42; - // 0x5A is always the second byte in the buffer when the normal READ_DATA_AND_VIBRATE (0x42) query is executed. - // See - PAD.cpp::PADpoll - https://github.com/PCSX2/pcsx2/blob/master/pcsx2/PAD/Windows/PAD.cpp#L1256 - static const u8 READ_DATA_AND_VIBRATE_SECOND_BYTE = 0x5A; + bool m_initial_load_complete = false; + bool m_is_active = false; + bool m_watching_for_rerecords = false; - // DEPRECATED: Slated for removal - bool fInterruptFrame = false; - InputRecordingFile inputRecordingData; - bool initialLoad = false; - u32 startingFrame = 0; - s32 frameCounter = 0; - bool incrementUndo = false; - InputRecordingMode state = InputRecording::InputRecordingMode::NotActive; - std::string savestate; + // A consistent way to run actions at the end of the each frame (ie. stop the recording) + std::queue> m_recordingQueue; - // Array of usable pads (currently, only 2) - struct InputRecordingPad - { - // Controller Data - PadData* padData; - InputRecordingPad(); - ~InputRecordingPad(); - } pads[2]; + u32 m_frame_counter = 0; + // Either 0 for a power-on movie, or the g_FrameCount that is stored on the starting frame + u32 m_starting_frame = 0; + void initializeState(); + void setStartingFrame(u32 startingFrame); + void closeActiveFile(); + +private: // Resolve the name and region of the game currently loaded using the GameDB // If the game cannot be found in the DB, the fallback is the ISO filename std::string resolveGameName(); diff --git a/pcsx2/Recording/InputRecordingControls.cpp b/pcsx2/Recording/InputRecordingControls.cpp index 58194de794..3b38dccb29 100644 --- a/pcsx2/Recording/InputRecordingControls.cpp +++ b/pcsx2/Recording/InputRecordingControls.cpp @@ -13,212 +13,10 @@ * If not, see . */ +#ifdef PCSX2_CORE + #include "PrecompiledHeader.h" -#ifndef PCSX2_CORE -// TODO - Vaser - kill with wxWidgets - -#include "Counters.h" -#include "DebugTools/Debug.h" -#include "MemoryTypes.h" -#include "gui/MainFrame.h" - -#include "InputRecording.h" -#include "InputRecordingControls.h" -#include "Utilities/InputRecordingLogger.h" - -InputRecordingControls g_InputRecordingControls; - -void InputRecordingControls::CheckPauseStatus() -{ - frame_advance_frame_counter++; - if (frameAdvancing && frame_advance_frame_counter >= frames_per_frame_advance) - { - frameAdvancing = false; - pauseEmulation = true; - } - - if (g_InputRecording.IsActive()) - { - g_InputRecording.IncrementFrameCounter(); - - if (switchToReplay) - { - g_InputRecording.SetToReplayMode(); - switchToReplay = false; - } - - if (IsFinishedReplaying() || g_InputRecording.GetFrameCounter() == INT_MAX) - { - if (!pauseEmulation) - pauseEmulation = true; - StopCapture(); - } - } - g_InputRecording.LogAndRedraw(); -} - -void InputRecordingControls::HandlePausingAndLocking() -{ - // Explicit frame locking - if (frameLock) - { - if (g_FrameCount == frameLockTracker) - { - frameLock = false; - Resume(); - } - else if (!emulationCurrentlyPaused && GetCoreThread().IsOpen() && GetCoreThread().IsRunning()) - { - emulationCurrentlyPaused = true; - GetCoreThread().PauseSelf(); - } - } - else if (pauseEmulation && GetCoreThread().IsOpen() && GetCoreThread().IsRunning()) - { - emulationCurrentlyPaused = true; - GetCoreThread().PauseSelf(); - } -} - -void InputRecordingControls::ResumeCoreThreadIfStarted() -{ - if (resumeEmulation && GetCoreThread().IsOpen()) - { - GetCoreThread().Resume(); - resumeEmulation = false; - emulationCurrentlyPaused = false; - } -} - -void InputRecordingControls::FrameAdvance() -{ - if (!IsFinishedReplaying()) - { - frameAdvancing = true; - frame_advance_frame_counter = 0; - Resume(); - } - else - g_InputRecording.SetToRecordMode(); -} - -void InputRecordingControls::setFrameAdvanceAmount(int amount) -{ - frames_per_frame_advance = amount; -} - -bool InputRecordingControls::IsFrameAdvancing() -{ - return frameAdvancing; -} - -bool InputRecordingControls::IsPaused() -{ - return emulationCurrentlyPaused && GetCoreThread().IsOpen() && GetCoreThread().IsPaused(); -} - -void InputRecordingControls::Pause() -{ - pauseEmulation = true; - resumeEmulation = false; -} - -void InputRecordingControls::PauseImmediately() -{ - if (!GetCoreThread().IsPaused()) - { - Pause(); - if (GetCoreThread().IsOpen() && GetCoreThread().IsRunning()) - { - emulationCurrentlyPaused = true; - GetCoreThread().PauseSelf(); - } - } -} - -void InputRecordingControls::Resume() -{ - if (!IsFinishedReplaying()) - { - pauseEmulation = false; - resumeEmulation = true; - } - else - g_InputRecording.SetToRecordMode(); -} - -void InputRecordingControls::ResumeImmediately() -{ - if (GetCoreThread().IsPaused()) - { - Resume(); - if (GetCoreThread().IsRunning()) - { - emulationCurrentlyPaused = false; - GetCoreThread().Resume(); - } - } -} - -void InputRecordingControls::TogglePause() -{ - if (!pauseEmulation || !IsFinishedReplaying()) - { - resumeEmulation = pauseEmulation; - pauseEmulation = !pauseEmulation; - inputRec::log(pauseEmulation ? "Paused Emulation" : "Resumed Emulation"); - } - else - g_InputRecording.SetToRecordMode(); -} - -void InputRecordingControls::RecordModeToggle() -{ - if (g_InputRecording.IsReplaying()) - g_InputRecording.SetToRecordMode(); - else if (g_InputRecording.IsRecording()) - { - if (IsPaused() || g_InputRecording.GetFrameCounter() < g_InputRecording.GetInputRecordingData().GetTotalFrames()) - g_InputRecording.SetToReplayMode(); - else - switchToReplay = true; - } -} - -void InputRecordingControls::Lock(u32 frame) -{ - frameLock = true; - frameLockTracker = frame; - frameAdvancing = false; - //Ensures that g_frameCount can be used to resume emulation after a fast/full boot - if (!g_InputRecording.GetInputRecordingData().FromSaveState()) - g_FrameCount = frame + 1; - else - sMainFrame.StartInputRecording(); -} - -bool InputRecordingControls::IsFinishedReplaying() const -{ - return g_InputRecording.IsReplaying() && - g_InputRecording.GetFrameCounter() >= g_InputRecording.GetInputRecordingData().GetTotalFrames(); -} - -void InputRecordingControls::StopCapture() const -{ - if (MainEmuFrame* mainFrame = GetMainFramePtr()) - { - if (mainFrame->IsCapturing()) - { - mainFrame->VideoCaptureToggle(); - inputRec::log("Capture completed"); - } - } -} - -#else - -#include "Counters.h" #include "DebugTools/Debug.h" #include "MemoryTypes.h" @@ -226,198 +24,92 @@ void InputRecordingControls::StopCapture() const #include "InputRecordingControls.h" #include "Utilities/InputRecordingLogger.h" +#include "GS.h" #include "VMManager.h" -InputRecordingControls g_InputRecordingControls; - -void InputRecordingControls::CheckPauseStatus() +void InputRecordingControls::toggleRecordMode() { - frame_advance_frame_counter++; - if (frameAdvancing && frame_advance_frame_counter >= frames_per_frame_advance) + if (isReplaying()) { - frameAdvancing = false; - pauseEmulation = true; - } - - if (g_InputRecording.IsActive()) - { - g_InputRecording.IncrementFrameCounter(); - - if (switchToReplay) - { - g_InputRecording.SetToReplayMode(); - switchToReplay = false; - } - - if (IsFinishedReplaying() || g_InputRecording.GetFrameCounter() == INT_MAX) - { - if (!pauseEmulation) - pauseEmulation = true; - StopCapture(); - } - } - g_InputRecording.LogAndRedraw(); -} - -void InputRecordingControls::HandlePausingAndLocking() -{ - // Explicit frame locking - if (frameLock) - { - if (g_FrameCount == frameLockTracker) - { - frameLock = false; - Resume(); - } - else if (!emulationCurrentlyPaused && (VMManager::GetState() == VMState::Running || VMManager::GetState() != VMState::Paused)) - { - emulationCurrentlyPaused = true; - VMManager::SetPaused(true); - } - } - else if (pauseEmulation && (VMManager::GetState() == VMState::Running || VMManager::GetState() != VMState::Paused)) - { - emulationCurrentlyPaused = true; - VMManager::SetPaused(true); - } -} - -void InputRecordingControls::ResumeCoreThreadIfStarted() -{ - if (resumeEmulation && (VMManager::GetState() == VMState::Running || VMManager::GetState() == VMState::Paused)) - { - VMManager::SetPaused(false); - resumeEmulation = false; - emulationCurrentlyPaused = false; - } -} - -void InputRecordingControls::FrameAdvance() -{ - if (!IsFinishedReplaying()) - { - frameAdvancing = true; - frame_advance_frame_counter = 0; - Resume(); + setRecordMode(); } else { - g_InputRecording.SetToRecordMode(); + setReplayMode(); } } -void InputRecordingControls::setFrameAdvanceAmount(int amount) +void InputRecordingControls::setRecordMode(bool waitForFrameToEnd) { - frames_per_frame_advance = amount; -} - -bool InputRecordingControls::IsFrameAdvancing() -{ - return frameAdvancing; -} - -bool InputRecordingControls::IsPaused() -{ - return emulationCurrentlyPaused && VMManager::GetState() == VMState::Paused; -} - -void InputRecordingControls::Pause() -{ - pauseEmulation = true; - resumeEmulation = false; -} - -void InputRecordingControls::PauseImmediately() -{ - if (VMManager::GetState() != VMState::Paused) + if (!waitForFrameToEnd || VMManager::GetState() == VMState::Paused) { - Pause(); - if ((VMManager::GetState() == VMState::Running || VMManager::GetState() == VMState::Paused)) - { - emulationCurrentlyPaused = true; - VMManager::SetPaused(true); - } - } -} - -void InputRecordingControls::Resume() -{ - if (!IsFinishedReplaying()) - { - pauseEmulation = false; - resumeEmulation = true; + m_state = Mode::Recording; + InputRec::log("Record mode ON"); + GetMTGS().PresentCurrentFrame(); } else - g_InputRecording.SetToRecordMode(); -} - -void InputRecordingControls::ResumeImmediately() -{ - if (VMManager::GetState() == VMState::Paused) { - Resume(); - if ((VMManager::GetState() == VMState::Running || VMManager::GetState() == VMState::Paused)) - { - emulationCurrentlyPaused = false; - VMManager::SetPaused(false); - } + m_controlQueue.push([&]() { + m_state = Mode::Recording; + InputRec::log("Record mode ON"); + }); } } -void InputRecordingControls::TogglePause() +void InputRecordingControls::setReplayMode(bool waitForFrameToEnd) { - if (!pauseEmulation || !IsFinishedReplaying()) + if (!waitForFrameToEnd || VMManager::GetState() == VMState::Paused) { - resumeEmulation = pauseEmulation; - pauseEmulation = !pauseEmulation; - inputRec::log(pauseEmulation ? "Paused Emulation" : "Resumed Emulation"); + m_state = Mode::Replaying; + InputRec::log("Replay mode ON"); + GetMTGS().PresentCurrentFrame(); } else - g_InputRecording.SetToRecordMode(); -} - -void InputRecordingControls::RecordModeToggle() -{ - if (g_InputRecording.IsReplaying()) - g_InputRecording.SetToRecordMode(); - else if (g_InputRecording.IsRecording()) { - if (IsPaused() || g_InputRecording.GetFrameCounter() < g_InputRecording.GetInputRecordingData().GetTotalFrames()) - g_InputRecording.SetToReplayMode(); - else - switchToReplay = true; + m_controlQueue.push([&]() { + m_state = Mode::Replaying; + InputRec::log("Replay mode ON"); + }); } } -void InputRecordingControls::Lock(u32 frame) +bool InputRecordingControls::isReplaying() const { - frameLock = true; - frameLockTracker = frame; - frameAdvancing = false; - // Ensures that g_frameCount can be used to resume emulation after a fast/full boot - if (!g_InputRecording.GetInputRecordingData().FromSaveState()) - { - g_FrameCount = frame + 1; - } + return m_state == Mode::Replaying; } -bool InputRecordingControls::IsFinishedReplaying() const +void InputRecordingControls::processControlQueue() { - return g_InputRecording.IsReplaying() && - g_InputRecording.GetFrameCounter() >= g_InputRecording.GetInputRecordingData().GetTotalFrames(); -} - -void InputRecordingControls::StopCapture() const -{ - // TODO - Vaser - Is capturing supported in Qt yet - Check - /*if (MainEmuFrame* mainFrame = GetMainFramePtr()) + if (!m_controlQueue.empty()) { - if (mainFrame->IsCapturing()) + + while (!m_controlQueue.empty()) { - mainFrame->VideoCaptureToggle(); - inputRec::log("Capture completed"); + m_controlQueue.front()(); + m_controlQueue.pop(); } - }*/ + GetMTGS().PresentCurrentFrame(); + } } +bool InputRecordingControls::isRecording() const +{ + return m_state == Mode::Recording; +} + + +// TODO - Once there is GS Capture support again +//void InputRecordingControls::StopCapture() const +//{ +// // TODO - Vaser - Is capturing supported in Qt yet - Check +// /*if (MainEmuFrame* mainFrame = GetMainFramePtr()) +// { +// if (mainFrame->IsCapturing()) +// { +// mainFrame->VideoCaptureToggle(); +// inputRec::log("Capture completed"); +// } +// }*/ +//} + #endif \ No newline at end of file diff --git a/pcsx2/Recording/InputRecordingControls.h b/pcsx2/Recording/InputRecordingControls.h index c7681b9174..69a0b2103c 100644 --- a/pcsx2/Recording/InputRecordingControls.h +++ b/pcsx2/Recording/InputRecordingControls.h @@ -15,171 +15,34 @@ #pragma once -#ifndef PCSX2_CORE -// TODO - Vaser - kill with wxWidgets +#ifdef PCSX2_CORE + +#include + +// TODO: +// - configure frame advance amount class InputRecordingControls { public: - // Intended to be called at the end of each frame, but will no-op if frame lock is active - // - // Will set the pausing parameters for emulation if: - // - The InputRecordingControls::FrameAdvance was hit on the previous frame - // - Emulation was explicitly paused using InputRecordingControls::TogglePause - // - We are replaying an input recording and have hit the end - void CheckPauseStatus(); + enum class Mode + { + Recording, + Replaying, + }; - // When loading a recording file or booting with a recording active, lock will be enabled. - // Emulation will be forced into and remain in a paused state until the transition in progress - // has completed - signaled when g_framecount and frameCountTracker are equal - // - // This function also handles actually pausing emulation when told to - void HandlePausingAndLocking(); + void toggleRecordMode(); + void setRecordMode(bool waitForFrameToEnd = true); + void setReplayMode(bool waitForFrameToEnd = true); - // Called much more frequently than HandleFrameAdvanceAndPausing, instead of being per frame - // this hooks into pcsx2's main App event handler as it has to be able to resume emulation - // when drawing frames has compltely stopped - // - // Resumes emulation if: - // - CoreThread is currently open and paused - // - We've signaled emulation to be resumed via TogglePause or FrameAdvancing - void ResumeCoreThreadIfStarted(); + bool isRecording() const; + bool isReplaying() const; - // Resume emulation (incase the emulation is currently paused) and pause after a single frame has passed - void FrameAdvance(); - void setFrameAdvanceAmount(int amount); - // Returns true if emulation is currently set up to frame advance. - bool IsFrameAdvancing(); - // Returns true if the input recording has been paused, which can occur: - // - After a single frame has passed after InputRecordingControls::FrameAdvance - // - Explicitly paused via an InputRecordingControls function - bool IsPaused(); - // Pause emulation at the next available Vsync - void Pause(); - // Pause emulation immediately, not waiting for the next Vsync - void PauseImmediately(); - // Resume emulation when the next pcsx2 App event is handled - void Resume(); - /** - * @brief Resumes emulation immediately, don't wait until the next VSync - */ - void ResumeImmediately(); - // Alternates emulation between a paused and unpaused state - void TogglePause(); - // Switches between recording and replaying the active input recording file - void RecordModeToggle(); - // Enables the frame locking mechanism so that when recordings are loaded - // or when processing a reboot with a recording active that no frames are - // lost in prior emulation - void Lock(u32 frame); + void processControlQueue(); private: - // Indicates if the input recording controls have explicitly paused emulation or not - bool emulationCurrentlyPaused = false; - // Indicates on the next VSync if we are frame advancing, this value - // and should be cleared once a single frame has passed - bool frameAdvancing = false; - u32 frame_advance_frame_counter = 0; - u32 frames_per_frame_advance = 1; - // Indicates if we intend to call CoreThread.PauseSelf() on the current or next available vsync - bool pauseEmulation = false; - // Indicates if we intend to call CoreThread.Resume() when the next pcsx2 App event is handled - bool resumeEmulation = false; - // Indicates to switch to replay mode after the next vsync - bool switchToReplay = false; - // Used to stop recording frames from incrementing during a reset - bool frameLock = false; - // The frame value to use as the frame lock reset point - u32 frameLockTracker = 0; - - bool IsFinishedReplaying() const; - // Calls mainEmuFrame's videoCaptureToggle to end a capture if active - void StopCapture() const; + Mode m_state = Mode::Replaying; + std::queue> m_controlQueue; }; -extern InputRecordingControls g_InputRecordingControls; - -#else - -class InputRecordingControls -{ -public: - // Intended to be called at the end of each frame, but will no-op if frame lock is active - // - // Will set the pausing parameters for emulation if: - // - The InputRecordingControls::FrameAdvance was hit on the previous frame - // - Emulation was explicitly paused using InputRecordingControls::TogglePause - // - We are replaying an input recording and have hit the end - void CheckPauseStatus(); - - // When loading a recording file or booting with a recording active, lock will be enabled. - // Emulation will be forced into and remain in a paused state until the transition in progress - // has completed - signaled when g_framecount and frameCountTracker are equal - // - // This function also handles actually pausing emulation when told to - void HandlePausingAndLocking(); - - // Called much more frequently than HandleFrameAdvanceAndPausing, instead of being per frame - // this hooks into pcsx2's main App event handler as it has to be able to resume emulation - // when drawing frames has compltely stopped - // - // Resumes emulation if: - // - CoreThread is currently open and paused - // - We've signaled emulation to be resumed via TogglePause or FrameAdvancing - void ResumeCoreThreadIfStarted(); - - // Resume emulation (incase the emulation is currently paused) and pause after a single frame has passed - void FrameAdvance(); - void setFrameAdvanceAmount(int amount); - // Returns true if emulation is currently set up to frame advance. - bool IsFrameAdvancing(); - // Returns true if the input recording has been paused, which can occur: - // - After a single frame has passed after InputRecordingControls::FrameAdvance - // - Explicitly paused via an InputRecordingControls function - bool IsPaused(); - // Pause emulation at the next available Vsync - void Pause(); - // Pause emulation immediately, not waiting for the next Vsync - void PauseImmediately(); - // Resume emulation when the next pcsx2 App event is handled - void Resume(); - /** - * @brief Resumes emulation immediately, don't wait until the next VSync - */ - void ResumeImmediately(); - // Alternates emulation between a paused and unpaused state - void TogglePause(); - // Switches between recording and replaying the active input recording file - void RecordModeToggle(); - // Enables the frame locking mechanism so that when recordings are loaded - // or when processing a reboot with a recording active that no frames are - // lost in prior emulation - void Lock(u32 frame); - -private: - // Indicates if the input recording controls have explicitly paused emulation or not - bool emulationCurrentlyPaused = false; - // Indicates on the next VSync if we are frame advancing, this value - // and should be cleared once a single frame has passed - bool frameAdvancing = false; - u32 frame_advance_frame_counter = 0; - u32 frames_per_frame_advance = 1; - // Indicates if we intend to call CoreThread.PauseSelf() on the current or next available vsync - bool pauseEmulation = false; - // Indicates if we intend to call CoreThread.Resume() when the next pcsx2 App event is handled - bool resumeEmulation = false; - // Indicates to switch to replay mode after the next vsync - bool switchToReplay = false; - // Used to stop recording frames from incrementing during a reset - bool frameLock = false; - // The frame value to use as the frame lock reset point - u32 frameLockTracker = 0; - - bool IsFinishedReplaying() const; - // Calls mainEmuFrame's videoCaptureToggle to end a capture if active - void StopCapture() const; -}; - -extern InputRecordingControls g_InputRecordingControls; - #endif diff --git a/pcsx2/Recording/InputRecordingFile.cpp b/pcsx2/Recording/InputRecordingFile.cpp index 8cad05ff90..8f1d921092 100644 --- a/pcsx2/Recording/InputRecordingFile.cpp +++ b/pcsx2/Recording/InputRecordingFile.cpp @@ -13,225 +13,10 @@ * If not, see . */ +#ifdef PCSX2_CORE + #include "PrecompiledHeader.h" -#ifndef PCSX2_CORE -// TODO - Vaser - kill with wxWidgets - -#include "DebugTools/Debug.h" -#include "gui/MainFrame.h" -#include "MemoryTypes.h" - -#include "InputRecordingFile.h" -#include "Utilities/InputRecordingLogger.h" - -#include - -void InputRecordingFileHeader::Init() -{ - memset(author, 0, std::size(author)); - memset(gameName, 0, std::size(gameName)); -} - -void InputRecordingFileHeader::SetEmulatorVersion() -{ - wxString emuVersion = wxString::Format("%s-%d.%d.%d", pxGetAppName().c_str(), PCSX2_VersionHi, PCSX2_VersionMid, PCSX2_VersionLo); - int max = std::size(emu) - 1; - strncpy(emu, emuVersion.c_str(), max); - emu[max] = 0; -} - -void InputRecordingFileHeader::SetAuthor(wxString _author) -{ - int max = std::size(author) - 1; - strncpy(author, _author.c_str(), max); - author[max] = 0; -} - -void InputRecordingFileHeader::SetGameName(wxString _gameName) -{ - int max = std::size(gameName) - 1; - strncpy(gameName, _gameName.c_str(), max); - gameName[max] = 0; -} - -bool InputRecordingFile::Close() -{ - if (recordingFile == nullptr) - { - return false; - } - fclose(recordingFile); - recordingFile = nullptr; - filename = ""; - return true; -} - -const wxString& InputRecordingFile::GetFilename() -{ - return filename; -} - -InputRecordingFileHeader& InputRecordingFile::GetHeader() -{ - return header; -} - -long& InputRecordingFile::GetTotalFrames() -{ - return totalFrames; -} - -unsigned long& InputRecordingFile::GetUndoCount() -{ - return undoCount; -} - -bool InputRecordingFile::FromSaveState() -{ - return savestate.fromSavestate; -} - -void InputRecordingFile::IncrementUndoCount() -{ - undoCount++; - if (recordingFile == nullptr) - { - return; - } - fseek(recordingFile, seekpointUndoCount, SEEK_SET); - fwrite(&undoCount, 4, 1, recordingFile); -} - -bool InputRecordingFile::open(const wxString path, bool newRecording) -{ - if (newRecording) - { - if ((recordingFile = wxFopen(path, L"wb+")) != nullptr) - { - filename = path; - totalFrames = 0; - undoCount = 0; - header.Init(); - return true; - } - } - else if ((recordingFile = wxFopen(path, L"rb+")) != nullptr) - { - if (verifyRecordingFileHeader()) - { - filename = path; - return true; - } - Close(); - inputRec::consoleLog("Input recording file header is invalid"); - return false; - } - inputRec::consoleLog(fmt::format("Input recording file opening failed. Error - {}", strerror(errno))); - return false; -} - -bool InputRecordingFile::OpenNew(const wxString& path, bool fromSavestate) -{ - if (!open(path, true)) - return false; - savestate.fromSavestate = fromSavestate; - return true; -} - -bool InputRecordingFile::OpenExisting(const wxString& path) -{ - return open(path, false); -} - -bool InputRecordingFile::ReadKeyBuffer(u8& result, const uint& frame, const uint port, const uint bufIndex) -{ - if (recordingFile == nullptr) - { - return false; - } - - long seek = getRecordingBlockSeekPoint(frame) + controllerInputBytes * port + bufIndex; - if (fseek(recordingFile, seek, SEEK_SET) != 0 || fread(&result, 1, 1, recordingFile) != 1) - { - return false; - } - - return true; -} - -void InputRecordingFile::SetTotalFrames(long frame) -{ - if (recordingFile == nullptr || totalFrames >= frame) - { - return; - } - totalFrames = frame; - fseek(recordingFile, seekpointTotalFrames, SEEK_SET); - fwrite(&totalFrames, 4, 1, recordingFile); -} - -bool InputRecordingFile::WriteHeader() -{ - if (recordingFile == nullptr) - { - return false; - } - rewind(recordingFile); - if (fwrite(&header, sizeof(InputRecordingFileHeader), 1, recordingFile) != 1 || fwrite(&totalFrames, 4, 1, recordingFile) != 1 || fwrite(&undoCount, 4, 1, recordingFile) != 1 || fwrite(&savestate, 1, 1, recordingFile) != 1) - { - return false; - } - return true; -} - -bool InputRecordingFile::WriteKeyBuffer(const uint& frame, const uint port, const uint bufIndex, const u8& buf) -{ - if (recordingFile == nullptr) - { - return false; - } - - long seek = getRecordingBlockSeekPoint(frame) + 18 * port + bufIndex; - - if (fseek(recordingFile, seek, SEEK_SET) != 0 || fwrite(&buf, 1, 1, recordingFile) != 1) - { - return false; - } - - fflush(recordingFile); - return true; -} - -long InputRecordingFile::getRecordingBlockSeekPoint(const long& frame) -{ - return headerSize + sizeof(bool) + frame * inputBytesPerFrame; -} - -bool InputRecordingFile::verifyRecordingFileHeader() -{ - if (recordingFile == nullptr) - { - return false; - } - // Verify header contents - rewind(recordingFile); - if (fread(&header, sizeof(InputRecordingFileHeader), 1, recordingFile) != 1 || fread(&totalFrames, 4, 1, recordingFile) != 1 || fread(&undoCount, 4, 1, recordingFile) != 1 || fread(&savestate.fromSavestate, sizeof(bool), 1, recordingFile) != 1) - { - return false; - } - - // Check for current verison - if (header.version != 1) - { - inputRec::consoleLog(fmt::format("Input recording file is not a supported version - {}", header.version)); - return false; - } - return true; -} - -#else - #include "InputRecordingFile.h" #include "Utilities/InputRecordingLogger.h" @@ -242,204 +27,265 @@ bool InputRecordingFile::verifyRecordingFileHeader() #include -void InputRecordingFileHeader::Init() +#include +#include + +void InputRecordingFile::InputRecordingFileHeader::init() noexcept { - memset(author, 0, std::size(author)); - memset(gameName, 0, std::size(gameName)); + m_fileVersion = 1; } -void InputRecordingFileHeader::SetEmulatorVersion() +void InputRecordingFile::setEmulatorVersion() { - std::string emuVersion = fmt::format("PCSX2-{}.{}.{}", PCSX2_VersionHi, PCSX2_VersionMid, PCSX2_VersionLo); - int max = std::size(emu) - 1; - strncpy(emu, emuVersion.c_str(), max); - emu[max] = 0; + static const std::string emuVersion = fmt::format("PCSX2-{}.{}.{}", PCSX2_VersionHi, PCSX2_VersionMid, PCSX2_VersionLo); + strncpy(m_header.m_emulatorVersion, emuVersion.c_str(), sizeof(m_header.m_emulatorVersion) - 1); } -void InputRecordingFileHeader::SetAuthor(const std::string_view& _author) +void InputRecordingFile::setAuthor(const std::string& _author) { - int max = std::size(author) - 1; - strncpy(author, _author.data(), max); - author[max] = 0; + strncpy(m_header.m_author, _author.data(), sizeof(m_header.m_author) - 1); } -void InputRecordingFileHeader::SetGameName(const std::string_view& _gameName) +void InputRecordingFile::setGameName(const std::string& _gameName) { - int max = std::size(gameName) - 1; - strncpy(gameName, _gameName.data(), max); - gameName[max] = 0; + strncpy(m_header.m_gameName, _gameName.data(), sizeof(m_header.m_gameName) - 1); } -bool InputRecordingFile::Close() +const char* InputRecordingFile::getEmulatorVersion() const noexcept { - if (recordingFile == nullptr) + return m_header.m_emulatorVersion; +} + +const char* InputRecordingFile::getAuthor() const noexcept +{ + return m_header.m_author; +} + +const char* InputRecordingFile::getGameName() const noexcept +{ + return m_header.m_gameName; +} + +bool InputRecordingFile::close() noexcept +{ + if (m_recordingFile == nullptr) { return false; } - fclose(recordingFile); - recordingFile = nullptr; - filename = ""; + fclose(m_recordingFile); + m_recordingFile = nullptr; + m_filename.clear(); return true; } -const std::string& InputRecordingFile::GetFilename() +const std::string& InputRecordingFile::getFilename() const noexcept { - return filename; + return m_filename; } -InputRecordingFileHeader& InputRecordingFile::GetHeader() +unsigned long InputRecordingFile::getTotalFrames() const noexcept { - return header; + return m_totalFrames; } -long& InputRecordingFile::GetTotalFrames() +unsigned long InputRecordingFile::getUndoCount() const noexcept { - return totalFrames; + return m_undoCount; } -unsigned long& InputRecordingFile::GetUndoCount() +bool InputRecordingFile::fromSaveState() const noexcept { - return undoCount; + return m_savestate; } -bool InputRecordingFile::FromSaveState() +void InputRecordingFile::incrementUndoCount() { - return savestate.fromSavestate; -} - -void InputRecordingFile::IncrementUndoCount() -{ - undoCount++; - if (recordingFile == nullptr) + m_undoCount++; + if (m_recordingFile == nullptr) { return; } - fseek(recordingFile, seekpointUndoCount, SEEK_SET); - fwrite(&undoCount, 4, 1, recordingFile); + fseek(m_recordingFile, s_seekpointUndoCount, SEEK_SET); + fwrite(&m_undoCount, 4, 1, m_recordingFile); } -bool InputRecordingFile::open(const std::string_view& path, bool newRecording) +bool InputRecordingFile::openNew(const std::string& path, bool fromSavestate) { - if (newRecording) + if ((m_recordingFile = FileSystem::OpenCFile(path.data(), "wb+")) == nullptr) { - if ((recordingFile = FileSystem::OpenCFile(path.data(), "wb+")) != nullptr) - { - filename = path; - totalFrames = 0; - undoCount = 0; - header.Init(); - return true; - } - } - else if ((recordingFile = FileSystem::OpenCFile(path.data(), "rb+")) != nullptr) - { - if (verifyRecordingFileHeader()) - { - filename = path; - return true; - } - Close(); - inputRec::consoleLog("Input recording file header is invalid"); + InputRec::consoleLog(fmt::format("Input recording file opening failed. Error - {}", strerror(errno))); return false; } - inputRec::consoleLog(fmt::format("Input recording file opening failed. Error - {}", strerror(errno))); - return false; -} -bool InputRecordingFile::OpenNew(const std::string_view& path, bool fromSavestate) -{ - if (!open(path, true)) - return false; - savestate.fromSavestate = fromSavestate; + m_filename = path; + m_totalFrames = 0; + m_undoCount = 0; + m_header.init(); + m_savestate = fromSavestate; return true; } -bool InputRecordingFile::OpenExisting(const std::string_view& path) +bool InputRecordingFile::openExisting(const std::string& path) { - return open(path, false); -} - -bool InputRecordingFile::ReadKeyBuffer(u8& result, const uint& frame, const uint port, const uint bufIndex) -{ - if (recordingFile == nullptr) + if ((m_recordingFile = FileSystem::OpenCFile(path.data(), "rb+")) == nullptr) { + InputRec::consoleLog(fmt::format("Input recording file opening failed. Error - {}", strerror(errno))); return false; } - long seek = getRecordingBlockSeekPoint(frame) + controllerInputBytes * port + bufIndex; - if (fseek(recordingFile, seek, SEEK_SET) != 0 || fread(&result, 1, 1, recordingFile) != 1) + if (!verifyRecordingFileHeader()) { + close(); + InputRec::consoleLog("Input recording file header is invalid"); return false; } + m_filename = path; return true; } -void InputRecordingFile::SetTotalFrames(long frame) +std::optional InputRecordingFile::readPadData(const uint frame, const uint port, const uint slot) { - if (recordingFile == nullptr || totalFrames >= frame) + if (m_recordingFile == nullptr) + { + return std::nullopt; + } + + std::array data{}; + + // TODO - slot unused, use it in the new format + const size_t seek = getRecordingBlockSeekPoint(frame) + s_controllerInputBytes * port; + if (fseek(m_recordingFile, seek, SEEK_SET) != 0 || fread(&data, 1, 18, m_recordingFile) != 1) + { + return PadData(port, slot, data); + } + + return std::nullopt; +} + +void InputRecordingFile::setTotalFrames(u32 frame) +{ + if (m_recordingFile == nullptr || m_totalFrames >= frame) { return; } - totalFrames = frame; - fseek(recordingFile, seekpointTotalFrames, SEEK_SET); - fwrite(&totalFrames, 4, 1, recordingFile); + m_totalFrames = frame; + fseek(m_recordingFile, s_seekpointTotalFrames, SEEK_SET); + fwrite(&m_totalFrames, 4, 1, m_recordingFile); } -bool InputRecordingFile::WriteHeader() +bool InputRecordingFile::writeHeader() const { - if (recordingFile == nullptr) + if (m_recordingFile == nullptr) { return false; } - rewind(recordingFile); - if (fwrite(&header, sizeof(InputRecordingFileHeader), 1, recordingFile) != 1 || fwrite(&totalFrames, 4, 1, recordingFile) != 1 || fwrite(&undoCount, 4, 1, recordingFile) != 1 || fwrite(&savestate, 1, 1, recordingFile) != 1) + rewind(m_recordingFile); + if (fwrite(&m_header, sizeof(InputRecordingFileHeader), 1, m_recordingFile) != 1 || + fwrite(&m_totalFrames, 4, 1, m_recordingFile) != 1 || + fwrite(&m_undoCount, 4, 1, m_recordingFile) != 1 || + fwrite(&m_savestate, 1, 1, m_recordingFile) != 1) { return false; } return true; } -bool InputRecordingFile::WriteKeyBuffer(const uint& frame, const uint port, const uint bufIndex, const u8& buf) +bool InputRecordingFile::writePadData(const uint frame, const PadData data) const { - if (recordingFile == nullptr) + if (m_recordingFile == nullptr) { return false; } - long seek = getRecordingBlockSeekPoint(frame) + 18 * port + bufIndex; + // TODO - use the slot in the future + const size_t seek = getRecordingBlockSeekPoint(frame) + s_controllerInputBytes * data.m_port; - if (fseek(recordingFile, seek, SEEK_SET) != 0 || fwrite(&buf, 1, 1, recordingFile) != 1) + // seek to the correct position and write data to the file + if (fseek(m_recordingFile, seek, SEEK_SET) != 0 || + fwrite(&data.m_compactPressFlagsGroupOne, 1, 1, m_recordingFile) != 1 || + fwrite(&data.m_compactPressFlagsGroupTwo, 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<0>(data.m_rightAnalog), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_rightAnalog), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<0>(data.m_leftAnalog), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_leftAnalog), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_right), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_left), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_up), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_down), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_triangle), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_circle), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_cross), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_square), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_l1), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_r1), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_l2), 1, 1, m_recordingFile) != 1 || + fwrite(&std::get<1>(data.m_r2), 1, 1, m_recordingFile) != 1) { return false; } - fflush(recordingFile); + fflush(m_recordingFile); return true; } -long InputRecordingFile::getRecordingBlockSeekPoint(const long& frame) +void InputRecordingFile::logRecordingMetadata() { - return headerSize + sizeof(bool) + frame * inputBytesPerFrame; + InputRec::consoleMultiLog({fmt::format("File: {}", getFilename()), + fmt::format("PCSX2 Version Used: {}", m_header.m_emulatorVersion), + fmt::format("Recording File Version: {}", m_header.m_fileVersion), + fmt::format("Associated Game Name or ISO Filename: {}", m_header.m_gameName), + fmt::format("Author: {}", m_header.m_author), + fmt::format("Total Frames: {}", getTotalFrames()), + fmt::format("Undo Count: {}", getUndoCount())}); +} + +std::vector InputRecordingFile::bulkReadPadData(u32 frameStart, u32 frameEnd, const uint port) +{ + std::vector data; + + if (m_recordingFile == nullptr || frameEnd < frameStart) + { + return data; + } + + // TODO - no multi-tap support + for (uint64_t currFrame = frameStart; currFrame < frameEnd; currFrame++) + { + const auto padData = readPadData(currFrame, port, 0); + if (padData) + { + data.push_back(padData.value()); + } + } + return data; +} + +size_t InputRecordingFile::getRecordingBlockSeekPoint(const u32 frame) const noexcept +{ + return s_headerSize + sizeof(bool) + frame * s_inputBytesPerFrame; } bool InputRecordingFile::verifyRecordingFileHeader() { - if (recordingFile == nullptr) + if (m_recordingFile == nullptr) { return false; } // Verify header contents - rewind(recordingFile); - if (fread(&header, sizeof(InputRecordingFileHeader), 1, recordingFile) != 1 || fread(&totalFrames, 4, 1, recordingFile) != 1 || fread(&undoCount, 4, 1, recordingFile) != 1 || fread(&savestate.fromSavestate, sizeof(bool), 1, recordingFile) != 1) + rewind(m_recordingFile); + if (fread(&m_header, sizeof(InputRecordingFileHeader), 1, m_recordingFile) != 1 || + fread(&m_totalFrames, 4, 1, m_recordingFile) != 1 || + fread(&m_undoCount, 4, 1, m_recordingFile) != 1 || + fread(&m_savestate, sizeof(bool), 1, m_recordingFile) != 1) { return false; } // Check for current verison - if (header.version != 1) + if (m_header.m_fileVersion != 1) { - inputRec::consoleLog(fmt::format("Input recording file is not a supported version - {}", header.version)); + InputRec::consoleLog(fmt::format("Input recording file is not a supported version - {}", m_header.m_fileVersion)); return false; } return true; diff --git a/pcsx2/Recording/InputRecordingFile.h b/pcsx2/Recording/InputRecordingFile.h index bc96ef2851..ad59d9eac2 100644 --- a/pcsx2/Recording/InputRecordingFile.h +++ b/pcsx2/Recording/InputRecordingFile.h @@ -15,8 +15,7 @@ #pragma once -#ifndef PCSX2_CORE -// TODO - Vaser - kill with wxWidgets +#ifdef PCSX2_CORE #include "System.h" #include "PadData.h" @@ -24,185 +23,89 @@ // NOTE / TODOs for Version 2 // - Move fromSavestate, undoCount, and total frames into the header -struct InputRecordingFileHeader -{ - u8 version = 1; - char emu[50] = ""; - char author[255] = ""; - char gameName[255] = ""; - -public: - void SetEmulatorVersion(); - void Init(); - void SetAuthor(wxString author); - void SetGameName(wxString cdrom); -}; - - -// DEPRECATED / Slated for Removal -struct InputRecordingSavestate -{ - // Whether we start from the savestate or from power-on - bool fromSavestate = false; -}; - // Handles all operations on the input recording file class InputRecordingFile { + struct InputRecordingFileHeader + { + u8 m_fileVersion = 1; + char m_emulatorVersion[50]{}; + char m_author[255]{}; + char m_gameName[255]{}; + + public: + void init() noexcept; + } m_header; + + public: - ~InputRecordingFile() { Close(); } + void setEmulatorVersion(); + void setAuthor(const std::string& author); + void setGameName(const std::string& cdrom); + const char* getEmulatorVersion() const noexcept; + const char* getAuthor() const noexcept; + const char* getGameName() const noexcept; + + ~InputRecordingFile() { close(); } // Closes the underlying input recording file, writing the header and // prepares for a possible new recording to be started - bool Close(); - // Retrieve the input recording's filename (not the path) - const wxString& GetFilename(); - // Retrieve the input recording's header which contains high-level metadata on the recording - InputRecordingFileHeader& GetHeader(); - // The maximum number of frames, or in other words, the length of the recording - long& GetTotalFrames(); + bool close() noexcept; + // The number of times a save-state has been loaded while recording this movie // this is also often referred to as a "re-record" - unsigned long& GetUndoCount(); + // Whether or not this input recording starts by loading a save-state or by booting the game fresh - bool FromSaveState(); + bool fromSaveState() const noexcept; // Increment the number of undo actions and commit it to the recording file - void IncrementUndoCount(); + void incrementUndoCount(); // Open an existing recording file - bool OpenExisting(const wxString& path); + bool openExisting(const std::string& path); // Create and open a brand new input recording, either starting from a save-state or from // booting the game - bool OpenNew(const wxString& path, bool fromSaveState); + bool openNew(const std::string& path, bool fromSaveState); // Reads the current frame's input data from the file in order to intercept and overwrite // the current frame's value from the emulator - bool ReadKeyBuffer(u8& result, const uint& frame, const uint port, const uint bufIndex); + std::optional readPadData(const uint frame, const uint port, const uint slot); // Updates the total frame counter and commit it to the recording file - void SetTotalFrames(long frames); + void setTotalFrames(u32 frames); // Persist the input recording file header's current state to the file - bool WriteHeader(); + bool writeHeader() const; // Writes the current frame's input data to the file so it can be replayed - bool WriteKeyBuffer(const uint& frame, const uint port, const uint bufIndex, const u8& buf); - -private: - static const int controllerPortsSupported = 2; - static const int controllerInputBytes = 18; - static const int inputBytesPerFrame = controllerInputBytes * controllerPortsSupported; - // TODO - version 2, this could be greatly simplified if everything was in the header - // + 4 + 4 is the totalFrame and undoCount values - static const int headerSize = sizeof(InputRecordingFileHeader) + 4 + 4; - // DEPRECATED / Slated for Removal - static const int recordingSavestateHeaderSize = sizeof(bool); - static const int seekpointTotalFrames = sizeof(InputRecordingFileHeader); - static const int seekpointUndoCount = sizeof(InputRecordingFileHeader) + 4; - static const int seekpointSaveStateHeader = seekpointUndoCount + 4; - - InputRecordingFileHeader header; - wxString filename = ""; - FILE* recordingFile = nullptr; - InputRecordingSavestate savestate; - - // An signed 32-bit frame limit is equivalent to 1.13 years of continuous 60fps footage - long totalFrames = 0; - unsigned long undoCount = 0; - - // Calculates the position of the current frame in the input recording - long getRecordingBlockSeekPoint(const long& frame); - bool open(const wxString path, bool newRecording); - bool verifyRecordingFileHeader(); -}; - -#else - -#include "System.h" -#include "PadData.h" - -// NOTE / TODOs for Version 2 -// - Move fromSavestate, undoCount, and total frames into the header - -struct InputRecordingFileHeader -{ - u8 version = 1; - char emu[50] = ""; - char author[255] = ""; - char gameName[255] = ""; - -public: - void SetEmulatorVersion(); - void Init(); - void SetAuthor(const std::string_view& author); - void SetGameName(const std::string_view& cdrom); -}; + bool writePadData(const uint frame, const PadData data) const; -// DEPRECATED / Slated for Removal -struct InputRecordingSavestate -{ - // Whether we start from the savestate or from power-on - bool fromSavestate = false; -}; - -// Handles all operations on the input recording file -class InputRecordingFile -{ -public: - ~InputRecordingFile() { Close(); } - - // Closes the underlying input recording file, writing the header and - // prepares for a possible new recording to be started - bool Close(); // Retrieve the input recording's filename (not the path) - const std::string& GetFilename(); - // Retrieve the input recording's header which contains high-level metadata on the recording - InputRecordingFileHeader& GetHeader(); - // The maximum number of frames, or in other words, the length of the recording - long& GetTotalFrames(); - // The number of times a save-state has been loaded while recording this movie - // this is also often referred to as a "re-record" - unsigned long& GetUndoCount(); - // Whether or not this input recording starts by loading a save-state or by booting the game fresh - bool FromSaveState(); - // Increment the number of undo actions and commit it to the recording file - void IncrementUndoCount(); - // Open an existing recording file - bool OpenExisting(const std::string_view& path); - // Create and open a brand new input recording, either starting from a save-state or from - // booting the game - bool OpenNew(const std::string_view& path, bool fromSaveState); - // Reads the current frame's input data from the file in order to intercept and overwrite - // the current frame's value from the emulator - bool ReadKeyBuffer(u8& result, const uint& frame, const uint port, const uint bufIndex); - // Updates the total frame counter and commit it to the recording file - void SetTotalFrames(long frames); - // Persist the input recording file header's current state to the file - bool WriteHeader(); - // Writes the current frame's input data to the file so it can be replayed - bool WriteKeyBuffer(const uint& frame, const uint port, const uint bufIndex, const u8& buf); + const std::string& getFilename() const noexcept; + unsigned long getTotalFrames() const noexcept; + unsigned long getUndoCount() const noexcept; + + void logRecordingMetadata(); + std::vector bulkReadPadData(u32 frameStart, u32 frameEnd, const uint port); private: - static const int controllerPortsSupported = 2; - static const int controllerInputBytes = 18; - static const int inputBytesPerFrame = controllerInputBytes * controllerPortsSupported; + static constexpr size_t s_controllerPortsSupported = 2; + static constexpr size_t s_controllerInputBytes = 18; + static constexpr size_t s_inputBytesPerFrame = s_controllerInputBytes * s_controllerPortsSupported; // TODO - version 2, this could be greatly simplified if everything was in the header // + 4 + 4 is the totalFrame and undoCount values - static const int headerSize = sizeof(InputRecordingFileHeader) + 4 + 4; + static constexpr size_t s_headerSize = sizeof(InputRecordingFileHeader) + 4 + 4; // DEPRECATED / Slated for Removal - static const int recordingSavestateHeaderSize = sizeof(bool); - static const int seekpointTotalFrames = sizeof(InputRecordingFileHeader); - static const int seekpointUndoCount = sizeof(InputRecordingFileHeader) + 4; - static const int seekpointSaveStateHeader = seekpointUndoCount + 4; + static constexpr size_t s_recordingSavestateHeaderSize = sizeof(bool); + static constexpr size_t s_seekpointTotalFrames = sizeof(InputRecordingFileHeader); + static constexpr size_t s_seekpointUndoCount = sizeof(InputRecordingFileHeader) + 4; + static constexpr size_t s_seekpointSaveStateHeader = s_seekpointUndoCount + 4; - InputRecordingFileHeader header; - std::string filename = ""; - FILE* recordingFile = nullptr; - InputRecordingSavestate savestate; + std::string m_filename = ""; + FILE* m_recordingFile = nullptr; + bool m_savestate = false; // An signed 32-bit frame limit is equivalent to 1.13 years of continuous 60fps footage - long totalFrames = 0; - unsigned long undoCount = 0; + unsigned long m_totalFrames = 0; + unsigned long m_undoCount = 0; // Calculates the position of the current frame in the input recording - long getRecordingBlockSeekPoint(const long& frame); - bool open(const std::string_view& path, bool newRecording); + size_t getRecordingBlockSeekPoint(const u32 frame) const noexcept; bool verifyRecordingFileHeader(); }; diff --git a/pcsx2/Recording/NewRecordingFrame.cpp b/pcsx2/Recording/NewRecordingFrame.cpp deleted file mode 100644 index b224bb6b38..0000000000 --- a/pcsx2/Recording/NewRecordingFrame.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2022 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -// This file dies along with wxWidgets -#ifndef PCSX2_CORE - -#include "PrecompiledHeader.h" - -#include "NewRecordingFrame.h" - -#include - -NewRecordingFrame::NewRecordingFrame(wxWindow* parent) - : wxDialog(parent, wxID_ANY, "New Input Recording", wxDefaultPosition, wxDefaultSize, wxSTAY_ON_TOP | wxCLOSE_BOX | wxCAPTION) -{ - m_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _("panel")); - - wxGridBagSizer* gbs = new wxGridBagSizer(20, 20); - gbs->SetFlexibleDirection(wxBOTH); - gbs->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED); - wxBoxSizer* container = new wxBoxSizer(wxVERTICAL); - - m_fileLabel = new wxStaticText(m_panel, wxID_ANY, _("File Path"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); - m_authorLabel = new wxStaticText(m_panel, wxID_ANY, _("Author"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); - m_fromLabel = new wxStaticText(m_panel, wxID_ANY, _("Record From"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); - - m_filePicker = new wxFilePickerCtrl(m_panel, MenuIds_New_Recording_Frame_File, wxEmptyString, "File", L"p2m2 file(*.p2m2)|*.p2m2", wxDefaultPosition, wxDefaultSize, wxFLP_SAVE | wxFLP_OVERWRITE_PROMPT | wxFLP_USE_TEXTCTRL); - m_authorInput = new wxTextCtrl(m_panel, MenuIds_New_Recording_Frame_Author, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); - m_fromChoice = new wxChoice(m_panel, MenuIds_New_Recording_Frame_From, wxDefaultPosition, wxDefaultSize); - - m_savestate_label = - _("Be Warned! Basing an input recording off a savestate can be a mistake as savestates can break across emulator versions. Be prepared to be stuck to an emulator version or have to re-create your starting savestate in a later version."); - m_warning_label = new wxStaticText(m_panel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER); - m_warning_label->SetForegroundColour(wxColor(*wxRED)); - - m_startRecording = new wxButton(m_panel, wxID_OK, _("Browse Required"), wxDefaultPosition, wxDefaultSize); - m_startRecording->Enable(false); - m_cancelRecording = new wxButton(m_panel, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize); - - gbs->Add(m_fileLabel, wxGBPosition(0, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - gbs->Add(m_filePicker, wxGBPosition(0, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - - gbs->Add(m_authorLabel, wxGBPosition(1, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - gbs->Add(m_authorInput, wxGBPosition(1, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - - gbs->Add(m_fromLabel, wxGBPosition(2, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - gbs->Add(m_fromChoice, wxGBPosition(2, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); - - gbs->Add(m_warning_label, wxGBPosition(3, 0), wxGBSpan(1, 2), wxALIGN_CENTER_VERTICAL); - - gbs->Add(m_startRecording, wxGBPosition(4, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - gbs->Add(m_cancelRecording, wxGBPosition(4, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - - gbs->AddGrowableCol(0); - gbs->AddGrowableCol(1); - gbs->AddGrowableRow(3); - - container->Add(gbs, 1, wxALL | wxEXPAND, 15); - m_panel->SetSizer(container); - m_panel->GetSizer()->Fit(this); - Centre(); - - m_fileBrowsed = false; - m_filePicker->GetPickerCtrl()->Bind(wxEVT_FILEPICKER_CHANGED, &NewRecordingFrame::OnFileDirChange, this); - m_filePicker->Bind(wxEVT_FILEPICKER_CHANGED, &NewRecordingFrame::OnFileChanged, this); - m_fromChoice->Bind(wxEVT_CHOICE, &NewRecordingFrame::OnRecordingTypeChoiceChanged, this); -} - -int NewRecordingFrame::ShowModal(const bool isCoreThreadOpen) -{ - static const char* choices[2] = {"Boot", "Current Frame"}; - m_fromChoice->Set(wxArrayString(1 + isCoreThreadOpen, &choices[0])); - m_fromChoice->SetSelection(isCoreThreadOpen); - if (m_fromChoice->GetSelection() == 1) - { - m_warning_label->SetLabel(m_savestate_label); - } - else - { - m_warning_label->SetLabel(""); - } - m_warning_label->Wrap(GetClientSize().GetWidth()); - m_panel->GetSizer()->Fit(this); - return wxDialog::ShowModal(); -} - -void NewRecordingFrame::OnFileDirChange(wxFileDirPickerEvent& event) -{ - m_filePicker->wxFileDirPickerCtrlBase::OnFileDirChange(event); - m_fileBrowsed = true; - EnableOkBox(); -} - -void NewRecordingFrame::OnFileChanged(wxFileDirPickerEvent& event) -{ - EnableOkBox(); -} - -void NewRecordingFrame::OnRecordingTypeChoiceChanged(wxCommandEvent& event) -{ - if (m_fromChoice->GetSelection() == 1) - { - m_warning_label->SetLabel(m_savestate_label); - } - else - { - m_warning_label->SetLabel(""); - } - m_warning_label->Wrap(GetClientSize().GetWidth()); - m_panel->GetSizer()->Fit(this); -} - -void NewRecordingFrame::EnableOkBox() -{ - if (m_filePicker->GetPath().length() == 0) - { - m_fileBrowsed = false; - m_startRecording->SetLabel(_("Browse Required")); - m_startRecording->Enable(false); - } - else if (m_fileBrowsed) - { - m_startRecording->SetLabel(_("Start")); - m_startRecording->Enable(true); - } -} - -wxString NewRecordingFrame::GetFile() const -{ - wxString path = m_filePicker->GetPath(); - // wxWidget's removes the extension if it contains wildcards - // on wxGTK https://trac.wxwidgets.org/ticket/15285 - if (!path.EndsWith(".p2m2")) - { - return wxString::Format("%s.p2m2", path); - } - return path; -} - -wxString NewRecordingFrame::GetAuthor() const -{ - return m_authorInput->GetValue(); -} - -int NewRecordingFrame::GetFrom() const -{ - return m_fromChoice->GetSelection(); -} -#endif \ No newline at end of file diff --git a/pcsx2/Recording/NewRecordingFrame.h b/pcsx2/Recording/NewRecordingFrame.h deleted file mode 100644 index 75c5175327..0000000000 --- a/pcsx2/Recording/NewRecordingFrame.h +++ /dev/null @@ -1,61 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2022 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#pragma once - -#ifndef PCSX2_CORE - -#include -#include - -enum MenuIds_New_Recording_Frame -{ - MenuIds_New_Recording_Frame_File = 0, - MenuIds_New_Recording_Frame_Author, - MenuIds_New_Recording_Frame_From -}; - -// The Dialog to pop-up when recording a new movie -class NewRecordingFrame : public wxDialog -{ -public: - NewRecordingFrame(wxWindow* parent); - int ShowModal(const bool isCoreThreadOpen); - - wxString GetFile() const; - wxString GetAuthor() const; - int GetFrom() const; - -protected: - void OnFileDirChange(wxFileDirPickerEvent& event); - void OnFileChanged(wxFileDirPickerEvent& event); - void OnRecordingTypeChoiceChanged(wxCommandEvent& event); - void EnableOkBox(); - -private: - wxPanel* m_panel; - wxStaticText* m_fileLabel; - wxFilePickerCtrl* m_filePicker; - bool m_fileBrowsed; - wxStaticText* m_authorLabel; - wxTextCtrl* m_authorInput; - wxStaticText* m_fromLabel; - wxChoice* m_fromChoice; - wxButton* m_startRecording; - wxButton* m_cancelRecording; - wxString m_savestate_label; - wxStaticText* m_warning_label; -}; -#endif \ No newline at end of file diff --git a/pcsx2/Recording/PadData.cpp b/pcsx2/Recording/PadData.cpp index d9fec36c65..79302342f3 100644 --- a/pcsx2/Recording/PadData.cpp +++ b/pcsx2/Recording/PadData.cpp @@ -13,224 +13,170 @@ * If not, see . */ +#ifdef PCSX2_CORE + #include "PrecompiledHeader.h" + #include "DebugTools/Debug.h" #include "Recording/PadData.h" #include -void PadData::UpdateControllerData(u16 bufIndex, u8 const& bufVal) +#include "PAD/Host/KeyStatus.h" +#include "Sio.h" + +PadData::PadData(const int port, const int slot) { - const BufferIndex index = static_cast(bufIndex); - switch (index) + m_port = port; + m_slot = slot; + m_ext_port = sioConvertPortAndSlotToPad(m_port, m_slot); + // Get the state of the buttons + // TODO - for the new recording file format, allow informing max number of buttons per frame per controller as well (ie. the analog button) + const u32 buttons = g_key_status.GetButtons(m_ext_port); + // - pressed group one + // - left + // - down + // - right + // - up + // - start + // - r3 + // - l3 + // - select + m_compactPressFlagsGroupOne = (buttons & 0b1111111100000000) >> 8; + // - pressed group two + // - square + // - cross + // - circle + // - triangle + // - r1 + // - l1 + // - r2 + // - l2 + m_compactPressFlagsGroupTwo = (buttons & 0b11111111); + // Get the analog values + m_rightAnalog = g_key_status.GetRawRightAnalog(m_ext_port); + m_leftAnalog = g_key_status.GetRawLeftAnalog(m_ext_port); + // Get pressure bytes (12 of them) + m_left = {(0b10000000 & m_compactPressFlagsGroupOne) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_LEFT)}; + m_down = {(0b01000000 & m_compactPressFlagsGroupOne) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_DOWN)}; + m_right = {(0b00100000 & m_compactPressFlagsGroupOne) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_RIGHT)}; + m_up = {(0b00010000 & m_compactPressFlagsGroupOne) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_UP)}; + m_start = (0b00001000 & m_compactPressFlagsGroupOne) == 0; + m_r3 = (0b00000100 & m_compactPressFlagsGroupOne) == 0; + m_l3 = (0b00000010 & m_compactPressFlagsGroupOne) == 0; + m_select = (0b00000001 & m_compactPressFlagsGroupOne) == 0; + + m_square = {(0b10000000 & m_compactPressFlagsGroupTwo) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_SQUARE)}; + m_cross = {(0b01000000 & m_compactPressFlagsGroupTwo) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_CROSS)}; + m_circle = {(0b00100000 & m_compactPressFlagsGroupTwo) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_CIRCLE)}; + m_triangle = {(0b00010000 & m_compactPressFlagsGroupTwo) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_TRIANGLE)}; + m_r1 = {(0b00001000 & m_compactPressFlagsGroupTwo) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_R1)}; + m_l1 = {(0b00000100 & m_compactPressFlagsGroupTwo) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_L1)}; + m_r2 = {(0b00000010 & m_compactPressFlagsGroupTwo) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_R2)}; + m_l2 = {(0b00000001 & m_compactPressFlagsGroupTwo) == 0, g_key_status.GetRawPressure(m_ext_port, gamePadValues::PAD_L2)}; +} + +PadData::PadData(const int port, const int slot, const std::array data) +{ + m_port = port; + m_slot = slot; + m_ext_port = sioConvertPortAndSlotToPad(m_port, m_slot); + + m_compactPressFlagsGroupOne = data.at(0); + m_compactPressFlagsGroupTwo = data.at(1); + + m_rightAnalog = {data.at(2), data.at(3)}; + m_leftAnalog = {data.at(4), data.at(5)}; + + m_left = {(0b10000000 & m_compactPressFlagsGroupOne) == 0, data.at(7)}; + m_down = {(0b01000000 & m_compactPressFlagsGroupOne) == 0, data.at(9)}; + m_right = {(0b00100000 & m_compactPressFlagsGroupOne) == 0, data.at(6)}; + m_up = {(0b00010000 & m_compactPressFlagsGroupOne) == 0, data.at(8)}; + m_start = (0b00001000 & m_compactPressFlagsGroupOne) == 0; + m_r3 = (0b00000100 & m_compactPressFlagsGroupOne) == 0; + m_l3 = (0b00000010 & m_compactPressFlagsGroupOne) == 0; + m_select = (0b00000001 & m_compactPressFlagsGroupOne) == 0; + + m_square = {(0b10000000 & m_compactPressFlagsGroupTwo) == 0, data.at(13)}; + m_cross = {(0b01000000 & m_compactPressFlagsGroupTwo) == 0, data.at(12)}; + m_circle = {(0b00100000 & m_compactPressFlagsGroupTwo) == 0, data.at(11)}; + m_triangle = {(0b00010000 & m_compactPressFlagsGroupTwo) == 0, data.at(10)}; + m_r1 = {(0b00001000 & m_compactPressFlagsGroupTwo) == 0, data.at(15)}; + m_l1 = {(0b00000100 & m_compactPressFlagsGroupTwo) == 0, data.at(14)}; + m_r2 = {(0b00000010 & m_compactPressFlagsGroupTwo) == 0, data.at(17)}; + m_l2 = {(0b00000001 & m_compactPressFlagsGroupTwo) == 0, data.at(16)}; +} + +void PadData::OverrideActualController() const +{ + g_key_status.SetRawAnalogs(m_ext_port, m_leftAnalog, m_rightAnalog); + + g_key_status.Set(m_ext_port, PAD_RIGHT, std::get<1>(m_right)); + g_key_status.Set(m_ext_port, PAD_LEFT, std::get<1>(m_left)); + g_key_status.Set(m_ext_port, PAD_UP, std::get<1>(m_up)); + g_key_status.Set(m_ext_port, PAD_DOWN, std::get<1>(m_down)); + g_key_status.Set(m_ext_port, PAD_START, m_start); + g_key_status.Set(m_ext_port, PAD_SELECT, m_select); + g_key_status.Set(m_ext_port, PAD_R3, m_r3); + g_key_status.Set(m_ext_port, PAD_L3, m_l3); + + g_key_status.Set(m_ext_port, PAD_SQUARE, std::get<1>(m_square)); + g_key_status.Set(m_ext_port, PAD_CROSS, std::get<1>(m_cross)); + g_key_status.Set(m_ext_port, PAD_CIRCLE, std::get<1>(m_circle)); + g_key_status.Set(m_ext_port, PAD_TRIANGLE, std::get<1>(m_triangle)); + + g_key_status.Set(m_ext_port, PAD_R1, std::get<1>(m_r1)); + g_key_status.Set(m_ext_port, PAD_L1, std::get<1>(m_l1)); + g_key_status.Set(m_ext_port, PAD_R2, std::get<1>(m_r2)); + g_key_status.Set(m_ext_port, PAD_L2, std::get<1>(m_l2)); +} + +void addButtonInfoToString(std::string label, std::string& str, std::tuple buttonInfo) +{ + const auto& [pressed, pressure] = buttonInfo; + if (pressed) { - case BufferIndex::PressedFlagsGroupOne: - leftPressed = IsButtonPressed(LEFT, bufVal); - downPressed = IsButtonPressed(DOWN, bufVal); - rightPressed = IsButtonPressed(RIGHT, bufVal); - upPressed = IsButtonPressed(UP, bufVal); - start = IsButtonPressed(START, bufVal); - r3 = IsButtonPressed(R3, bufVal); - l3 = IsButtonPressed(L3, bufVal); - select = IsButtonPressed(SELECT, bufVal); - break; - case BufferIndex::PressedFlagsGroupTwo: - squarePressed = IsButtonPressed(SQUARE, bufVal); - crossPressed = IsButtonPressed(CROSS, bufVal); - circlePressed = IsButtonPressed(CIRCLE, bufVal); - trianglePressed = IsButtonPressed(TRIANGLE, bufVal); - r1Pressed = IsButtonPressed(R1, bufVal); - l1Pressed = IsButtonPressed(L1, bufVal); - r2Pressed = IsButtonPressed(R2, bufVal); - l2Pressed = IsButtonPressed(L2, bufVal); - break; - case BufferIndex::RightAnalogXVector: - rightAnalogX = bufVal; - break; - case BufferIndex::RightAnalogYVector: - rightAnalogY = bufVal; - break; - case BufferIndex::LeftAnalogXVector: - leftAnalogX = bufVal; - break; - case BufferIndex::LeftAnalogYVector: - leftAnalogY = bufVal; - break; - case BufferIndex::RightPressure: - rightPressure = bufVal; - break; - case BufferIndex::LeftPressure: - leftPressure = bufVal; - break; - case BufferIndex::UpPressure: - upPressure = bufVal; - break; - case BufferIndex::DownPressure: - downPressure = bufVal; - break; - case BufferIndex::TrianglePressure: - trianglePressure = bufVal; - break; - case BufferIndex::CirclePressure: - circlePressure = bufVal; - break; - case BufferIndex::CrossPressure: - crossPressure = bufVal; - break; - case BufferIndex::SquarePressure: - squarePressure = bufVal; - break; - case BufferIndex::L1Pressure: - l1Pressure = bufVal; - break; - case BufferIndex::R1Pressure: - r1Pressure = bufVal; - break; - case BufferIndex::L2Pressure: - l2Pressure = bufVal; - break; - case BufferIndex::R2Pressure: - r2Pressure = bufVal; - break; + str += fmt::format(" {}:{}", label, pressure); } } -u8 PadData::PollControllerData(u16 bufIndex) +void addButtonInfoToString(std::string label, std::string& str, bool pressed) { - u8 byte = 0; - const BufferIndex index = static_cast(bufIndex); - switch (index) + if (pressed) { - case BufferIndex::PressedFlagsGroupOne: - // Construct byte by combining flags if the buttons are pressed - byte |= BitmaskOrZero(leftPressed, LEFT); - byte |= BitmaskOrZero(downPressed, DOWN); - byte |= BitmaskOrZero(rightPressed, RIGHT); - byte |= BitmaskOrZero(upPressed, UP); - byte |= BitmaskOrZero(start, START); - byte |= BitmaskOrZero(r3, R3); - byte |= BitmaskOrZero(l3, L3); - byte |= BitmaskOrZero(select, SELECT); - // We flip the bits because as mentioned below, 0 = pressed - return ~byte; - case BufferIndex::PressedFlagsGroupTwo: - // Construct byte by combining flags if the buttons are pressed - byte |= BitmaskOrZero(squarePressed, SQUARE); - byte |= BitmaskOrZero(crossPressed, CROSS); - byte |= BitmaskOrZero(circlePressed, CIRCLE); - byte |= BitmaskOrZero(trianglePressed, TRIANGLE); - byte |= BitmaskOrZero(r1Pressed, R1); - byte |= BitmaskOrZero(l1Pressed, L1); - byte |= BitmaskOrZero(r2Pressed, R2); - byte |= BitmaskOrZero(l2Pressed, L2); - // We flip the bits because as mentioned below, 0 = pressed - return ~byte; - case BufferIndex::RightAnalogXVector: - return rightAnalogX; - case BufferIndex::RightAnalogYVector: - return rightAnalogY; - case BufferIndex::LeftAnalogXVector: - return leftAnalogX; - case BufferIndex::LeftAnalogYVector: - return leftAnalogY; - case BufferIndex::RightPressure: - return rightPressure; - case BufferIndex::LeftPressure: - return leftPressure; - case BufferIndex::UpPressure: - return upPressure; - case BufferIndex::DownPressure: - return downPressure; - case BufferIndex::TrianglePressure: - return trianglePressure; - case BufferIndex::CirclePressure: - return circlePressure; - case BufferIndex::CrossPressure: - return crossPressure; - case BufferIndex::SquarePressure: - return squarePressure; - case BufferIndex::L1Pressure: - return l1Pressure; - case BufferIndex::R1Pressure: - return r1Pressure; - case BufferIndex::L2Pressure: - return l2Pressure; - case BufferIndex::R2Pressure: - return r2Pressure; - default: - return 0; + str += fmt::format(" {}", label); } } -bool PadData::IsButtonPressed(ButtonResolver buttonResolver, u8 const& bufVal) +void PadData::LogPadData() const { - // Rather than the flags being SET if the button is pressed, it is the opposite - // For example: 0111 1111 with `left` being the first bit indicates `left` is pressed. - // So, we are forced to flip the pressed bits with a NOT first - return (~bufVal & buttonResolver.buttonBitmask) > 0; -} + std::string pressedButtons = ""; + addButtonInfoToString("Square", pressedButtons, m_square); + addButtonInfoToString("Cross", pressedButtons, m_cross); + addButtonInfoToString("Circle", pressedButtons, m_circle); + addButtonInfoToString("Triangle", pressedButtons, m_triangle); -u8 PadData::BitmaskOrZero(bool pressed, ButtonResolver buttonInfo) -{ - return pressed ? buttonInfo.buttonBitmask : 0; -} + addButtonInfoToString("D-Right", pressedButtons, m_right); + addButtonInfoToString("D-Left", pressedButtons, m_left); + addButtonInfoToString("D-Up", pressedButtons, m_up); + addButtonInfoToString("D-Down", pressedButtons, m_down); -#ifndef PCSX2_CORE -// TODO - Vaser - kill with wxWidgets -// TODO - Vaser - replace with this something better in Qt -wxString PadData::RawPadBytesToString(int start, int end) -{ - wxString str; - for (int i = start; i < end; i++) - { - str += wxString::Format("%d", PollControllerData(i)); - if (i != end - 1) - str += ", "; - } - return str; -} + addButtonInfoToString("R1", pressedButtons, m_r1); + addButtonInfoToString("L1", pressedButtons, m_l1); + addButtonInfoToString("R2", pressedButtons, m_r2); + addButtonInfoToString("L2", pressedButtons, m_l2); -void PadData::LogPadData(u8 const& port) -{ - wxString pressedBytes = RawPadBytesToString(0, 2); - wxString rightAnalogBytes = RawPadBytesToString(2, 4); - wxString leftAnalogBytes = RawPadBytesToString(4, 6); - wxString pressureBytes = RawPadBytesToString(6, 17); - wxString fullLog = - wxString::Format("[PAD %d] Raw Bytes: Pressed = [%s]\n", port + 1, pressedBytes) + - wxString::Format("[PAD %d] Raw Bytes: Right Analog = [%s]\n", port + 1, rightAnalogBytes) + - wxString::Format("[PAD %d] Raw Bytes: Left Analog = [%s]\n", port + 1, leftAnalogBytes) + - wxString::Format("[PAD %d] Raw Bytes: Pressure = [%s]\n", port + 1, pressureBytes); - controlLog(fullLog.ToUTF8()); -} + addButtonInfoToString("Start", pressedButtons, m_start); + addButtonInfoToString("Select", pressedButtons, m_select); + addButtonInfoToString("R3", pressedButtons, m_r3); + addButtonInfoToString("L3", pressedButtons, m_l3); -#else + const auto& [left_x, left_y] = m_leftAnalog; + const auto& [right_x, right_y] = m_rightAnalog; + const std::string analogs = fmt::format("Left: [{}, {}] | Right: [{}, {}]", left_x, left_y, right_x, right_y); -std::string PadData::RawPadBytesToString(int start, int end) -{ - std::string str; - for (int i = start; i < end; i++) - { - str += fmt::format("{}", PollControllerData(i)); - - if (i != end - 1) - str += ", "; - } - return str; -} - -void PadData::LogPadData(u8 const& port) -{ - std::string pressedBytes = RawPadBytesToString(0, 2); - std::string rightAnalogBytes = RawPadBytesToString(2, 4); - std::string leftAnalogBytes = RawPadBytesToString(4, 6); - std::string pressureBytes = RawPadBytesToString(6, 17); - std::string fullLog = - fmt::format("[PAD {}] Raw Bytes: Pressed = [{}]\n", port + 1, pressedBytes) + - fmt::format("[PAD {}] Raw Bytes: Right Analog = [{}]\n", port + 1, rightAnalogBytes) + - fmt::format("[PAD {}] Raw Bytes: Left Analog = [{}]\n", port + 1, leftAnalogBytes) + - fmt::format("[PAD {}] Raw Bytes: Pressure = [{}]\n", port + 1, pressureBytes); - controlLog(fullLog); + const std::string finalLog = fmt::format("[PAD {}:{}:{}]\n\t[Buttons]: {}\n\t[Analogs]: {}\n", m_ext_port, m_port, m_slot, pressedButtons, analogs); + controlLog(finalLog); } #endif \ No newline at end of file diff --git a/pcsx2/Recording/PadData.h b/pcsx2/Recording/PadData.h index a0c30dbd67..6c90562c31 100644 --- a/pcsx2/Recording/PadData.h +++ b/pcsx2/Recording/PadData.h @@ -15,114 +15,57 @@ #pragma once +#ifdef PCSX2_CORE + class PadData { public: + /// Create a struct containing the PAD data from the global PAD state + /// see - `g_key_status` + PadData(const int port, const int slot); + PadData(const int port, const int slot, const std::array data); + /// Constants - static const u8 ANALOG_VECTOR_NEUTRAL = 127; + static constexpr u8 ANALOG_VECTOR_NEUTRAL = 127; - enum class BufferIndex - { - PressedFlagsGroupOne, - PressedFlagsGroupTwo, - RightAnalogXVector, - RightAnalogYVector, - LeftAnalogXVector, - LeftAnalogYVector, - RightPressure, - LeftPressure, - UpPressure, - DownPressure, - TrianglePressure, - CirclePressure, - CrossPressure, - SquarePressure, - L1Pressure, - R1Pressure, - L2Pressure, - R2Pressure - }; + int m_ext_port; + int m_port; + int m_slot; - /// Pressure Buttons - 0-255 - u8 circlePressure = 0; - u8 crossPressure = 0; - u8 squarePressure = 0; - u8 trianglePressure = 0; - u8 downPressure = 0; - u8 leftPressure = 0; - u8 rightPressure = 0; - u8 upPressure = 0; - u8 l1Pressure = 0; - u8 l2Pressure = 0; - u8 r1Pressure = 0; - u8 r2Pressure = 0; + // Analog Sticks - - 0-255 (127 center) + std::tuple m_rightAnalog = {ANALOG_VECTOR_NEUTRAL, ANALOG_VECTOR_NEUTRAL}; + std::tuple m_leftAnalog = {ANALOG_VECTOR_NEUTRAL, ANALOG_VECTOR_NEUTRAL}; - /// Pressure Button Flags - /// NOTE - It shouldn't be possible to depress a button while also having no pressure - /// But for the sake of completeness, it should be tracked. - bool circlePressed = false; - bool crossPressed = false; - bool squarePressed = false; - bool trianglePressed = false; - bool downPressed = false; - bool leftPressed = false; - bool rightPressed = false; - bool upPressed = false; - bool l1Pressed = false; - bool l2Pressed = false; - bool r1Pressed = false; - bool r2Pressed = false; + u8 m_compactPressFlagsGroupOne = 255; + u8 m_compactPressFlagsGroupTwo = 255; - /// Normal (un)pressed buttons - bool select = false; - bool start = false; - bool l3 = false; - bool r3 = false; + // Buttons + std::tuple m_circle = {false, 0}; + std::tuple m_cross = {false, 0}; + std::tuple m_square = {false, 0}; + std::tuple m_triangle = {false, 0}; - /// Analog Sticks - 0-255 (127 center) - u8 leftAnalogX = ANALOG_VECTOR_NEUTRAL; - u8 leftAnalogY = ANALOG_VECTOR_NEUTRAL; - u8 rightAnalogX = ANALOG_VECTOR_NEUTRAL; - u8 rightAnalogY = ANALOG_VECTOR_NEUTRAL; + std::tuple m_down = {false, 0}; + std::tuple m_left = {false, 0}; + std::tuple m_right = {false, 0}; + std::tuple m_up = {false, 0}; - // Given the input buffer and the current index, updates the correct field(s) - void UpdateControllerData(u16 bufIndex, u8 const& bufVal); - u8 PollControllerData(u16 bufIndex); + std::tuple m_l1 = {false, 0}; + std::tuple m_l2 = {false, 0}; + std::tuple m_r1 = {false, 0}; + std::tuple m_r2 = {false, 0}; - // Prints current PadData to the Controller Log filter which disabled by default - void LogPadData(u8 const& port); + // Buttons + bool m_start = false; + bool m_select = false; + bool m_l3 = false; + bool m_r3 = false; -private: - struct ButtonResolver - { - u8 buttonBitmask; - }; + // Overrides the actual controller's state with the the values in this struct + void OverrideActualController() const; - const ButtonResolver LEFT = ButtonResolver{0b10000000}; - const ButtonResolver DOWN = ButtonResolver{0b01000000}; - const ButtonResolver RIGHT = ButtonResolver{0b00100000}; - const ButtonResolver UP = ButtonResolver{0b00010000}; - const ButtonResolver START = ButtonResolver{0b00001000}; - const ButtonResolver R3 = ButtonResolver{0b00000100}; - const ButtonResolver L3 = ButtonResolver{0b00000010}; - const ButtonResolver SELECT = ButtonResolver{0b00000001}; - - const ButtonResolver SQUARE = ButtonResolver{0b10000000}; - const ButtonResolver CROSS = ButtonResolver{0b01000000}; - const ButtonResolver CIRCLE = ButtonResolver{0b00100000}; - const ButtonResolver TRIANGLE = ButtonResolver{0b00010000}; - const ButtonResolver R1 = ButtonResolver{0b00001000}; - const ButtonResolver L1 = ButtonResolver{0b00000100}; - const ButtonResolver R2 = ButtonResolver{0b00000010}; - const ButtonResolver L2 = ButtonResolver{0b00000001}; - - // Checks and returns if button a is pressed or not - bool IsButtonPressed(ButtonResolver buttonResolver, u8 const& bufVal); - u8 BitmaskOrZero(bool pressed, ButtonResolver buttonInfo); - -#ifndef PCSX2_CORE - wxString RawPadBytesToString(int start, int end); -#else - std::string RawPadBytesToString(int start, int end); -#endif + // Prints current PadData to the Controller Log filter which is disabled by default + void LogPadData() const; }; + +#endif diff --git a/pcsx2/Recording/Utilities/InputRecordingLogger.cpp b/pcsx2/Recording/Utilities/InputRecordingLogger.cpp index 02baf3e243..7cb8370e6d 100644 --- a/pcsx2/Recording/Utilities/InputRecordingLogger.cpp +++ b/pcsx2/Recording/Utilities/InputRecordingLogger.cpp @@ -19,38 +19,40 @@ #include "DebugTools/Debug.h" #include "common/Console.h" -#include "GS.h" // GSosdlog +#include "GS.h" #include "Host.h" #include -namespace inputRec +namespace InputRec { void log(const std::string& log) { - if (log.empty()) - return; - - recordingConLog(fmt::format("[REC]: {}\n", log)); - - // NOTE - Color is not currently used for OSD logs - Host::AddOSDMessage(log, 15.0f); + if (!log.empty()) + { + recordingConLog(fmt::format("[REC]: {}\n", log)); + Host::AddOSDMessage(log, 15.0f); + } } void consoleLog(const std::string& log) { - if (log.empty()) - return; - - recordingConLog(fmt::format("[REC]: {}\n", log)); + if (!log.empty()) + { + recordingConLog(fmt::format("[REC]: {}\n", log)); + } } void consoleMultiLog(const std::vector& logs) { - std::string log; - for (std::string l : logs) - log.append(fmt::format("[REC]: {}\n", l)); - - recordingConLog(log); + if (!logs.empty()) + { + std::string log; + for (std::string l : logs) + { + log.append(fmt::format("[REC]: {}\n", l)); + } + recordingConLog(log); + } } -} // namespace inputRec +} // namespace InputRecording diff --git a/pcsx2/Recording/Utilities/InputRecordingLogger.h b/pcsx2/Recording/Utilities/InputRecordingLogger.h index d1d275816d..6d2935c877 100644 --- a/pcsx2/Recording/Utilities/InputRecordingLogger.h +++ b/pcsx2/Recording/Utilities/InputRecordingLogger.h @@ -19,7 +19,7 @@ #include #include -namespace inputRec +namespace InputRec { void log(const std::string& log); void consoleLog(const std::string& log); diff --git a/pcsx2/Recording/VirtualPad/VirtualPad.cpp b/pcsx2/Recording/VirtualPad/VirtualPad.cpp deleted file mode 100644 index fc24642387..0000000000 --- a/pcsx2/Recording/VirtualPad/VirtualPad.cpp +++ /dev/null @@ -1,438 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2020 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" - -#ifndef PCSX2_CORE - -#include - -#include "gui/App.h" -#include "gui/MSWstuff.h" -#include "gui/EmbeddedImage.h" -#include "wx/dcbuffer.h" -#include "wx/display.h" -#include "wx/spinctrl.h" - -#include "Recording/VirtualPad/VirtualPad.h" -#include "Recording/VirtualPad/VirtualPadResources.h" - -#include "Recording/VirtualPad/img/circlePressed.h" -#include "Recording/VirtualPad/img/controllerFull.h" -#include "Recording/VirtualPad/img/controllerThreeQuarters.h" -#include "Recording/VirtualPad/img/controllerHalf.h" -#include "Recording/VirtualPad/img/crossPressed.h" -#include "Recording/VirtualPad/img/downPressed.h" -#include "Recording/VirtualPad/img/l1Pressed.h" -#include "Recording/VirtualPad/img/l2Pressed.h" -#include "Recording/VirtualPad/img/l3Pressed.h" -#include "Recording/VirtualPad/img/leftPressed.h" -#include "Recording/VirtualPad/img/r1Pressed.h" -#include "Recording/VirtualPad/img/r2Pressed.h" -#include "Recording/VirtualPad/img/r3Pressed.h" -#include "Recording/VirtualPad/img/rightPressed.h" -#include "Recording/VirtualPad/img/selectPressed.h" -#include "Recording/VirtualPad/img/squarePressed.h" -#include "Recording/VirtualPad/img/startPressed.h" -#include "Recording/VirtualPad/img/trianglePressed.h" -#include "Recording/VirtualPad/img/upPressed.h" - - -VirtualPad::VirtualPad(wxWindow* parent, int controllerPort, AppConfig::InputRecordingOptions& options) - : wxFrame(parent, wxID_ANY, wxEmptyString) - , options(options) -{ - // Images at 1.00 scale are designed to work well on HiDPI (4k) at 150% scaling (default recommended setting on windows) - // Therefore, on a 1080p monitor we halve the scaling, on 1440p we reduce it by 25%, which from some quick tests looks comparable - // Side-note - Getting the DPI scaling amount is platform specific (with some platforms only supporting - // integer scaling as well) this is likely not reliable. - // Slight multi-monitor support, will use whatever window pcsx2 is opened with, but won't currently re-init if - // windows are dragged between differing monitors! - wxDisplay display(wxDisplay::GetFromWindow(this)); - const wxRect screen = display.GetClientArea(); - float dpiScale = MSW_GetDPIScale(); // linux returns 1.0 - if (screen.height > 1080 && screen.height <= 1440) // 1440p display - scalingFactor = 0.75 * dpiScale; - else if (screen.height <= 1080) // 1080p display - { - scalingFactor = 0.5 * dpiScale; - } - // otherwise use default 1.0 scaling - - virtualPadData = VirtualPadData(); - // Based on the scaling factor, select the appropriate background image - // Don't scale these images as they've already been pre-scaled - if (floatCompare(scalingFactor, 0.5)) - virtualPadData.background = NewBitmap(EmbeddedImage().Get(), wxPoint(0, 0), true); - else if (floatCompare(scalingFactor, 0.75)) - virtualPadData.background = NewBitmap(EmbeddedImage().Get(), wxPoint(0, 0), true); - else - // Otherwise, scale down/up (or don't in the case of 1.0) the largst image - virtualPadData.background = NewBitmap(EmbeddedImage().Get(), wxPoint(0, 0)); - - // Use the background image's size to define the window size - SetClientSize(virtualPadData.background.width, virtualPadData.background.height); - - // These hard-coded pixels correspond to where the background image's components are (ie. the buttons) - // Everything is automatically scaled and adjusted based on the `scalingFactor` variable - InitPressureButtonGuiElements(virtualPadData.square, NewBitmap(EmbeddedImage().Get(), wxPoint(852, 287)), this, wxPoint(1055, 525)); - InitPressureButtonGuiElements(virtualPadData.triangle, NewBitmap(EmbeddedImage().Get(), wxPoint(938, 201)), this, wxPoint(1055, 565)); - InitPressureButtonGuiElements(virtualPadData.circle, NewBitmap(EmbeddedImage().Get(), wxPoint(1024, 286)), this, wxPoint(1055, 605)); - InitPressureButtonGuiElements(virtualPadData.cross, NewBitmap(EmbeddedImage().Get(), wxPoint(938, 369)), this, wxPoint(1055, 645)); - - InitPressureButtonGuiElements(virtualPadData.left, NewBitmap(EmbeddedImage().Get(), wxPoint(110, 303)), this, wxPoint(175, 525), true); - InitPressureButtonGuiElements(virtualPadData.up, NewBitmap(EmbeddedImage().Get(), wxPoint(186, 227)), this, wxPoint(175, 565), true); - InitPressureButtonGuiElements(virtualPadData.right, NewBitmap(EmbeddedImage().Get(), wxPoint(248, 302)), this, wxPoint(175, 605), true); - InitPressureButtonGuiElements(virtualPadData.down, NewBitmap(EmbeddedImage().Get(), wxPoint(186, 359)), this, wxPoint(175, 645), true); - - InitPressureButtonGuiElements(virtualPadData.l1, NewBitmap(EmbeddedImage().Get(), wxPoint(156, 98)), this, wxPoint(170, 135)); - InitPressureButtonGuiElements(virtualPadData.l2, NewBitmap(EmbeddedImage().Get(), wxPoint(156, 57)), this, wxPoint(170, 52), false, true); - InitPressureButtonGuiElements(virtualPadData.r1, NewBitmap(EmbeddedImage().Get(), wxPoint(921, 98)), this, wxPoint(1035, 135), true); - InitPressureButtonGuiElements(virtualPadData.r2, NewBitmap(EmbeddedImage().Get(), wxPoint(921, 57)), this, wxPoint(1035, 52), true, true); - - InitNormalButtonGuiElements(virtualPadData.select, NewBitmap(EmbeddedImage().Get(), wxPoint(458, 313)), this, wxPoint(530, 315)); - InitNormalButtonGuiElements(virtualPadData.start, NewBitmap(EmbeddedImage().Get(), wxPoint(688, 311)), this, wxPoint(646, 315)); - InitNormalButtonGuiElements(virtualPadData.l3, NewBitmap(EmbeddedImage().Get(), wxPoint(336, 453)), this, wxPoint(560, 638)); - InitNormalButtonGuiElements(virtualPadData.r3, NewBitmap(EmbeddedImage().Get(), wxPoint(726, 453)), this, wxPoint(615, 638)); - - InitAnalogStickGuiElements(virtualPadData.leftAnalog, this, wxPoint(404, 522), 100, wxPoint(314, 642), wxPoint(526, 432), false, wxPoint(504, 685), wxPoint(570, 425), true); - InitAnalogStickGuiElements(virtualPadData.rightAnalog, this, wxPoint(794, 522), 100, wxPoint(706, 642), wxPoint(648, 432), true, wxPoint(700, 685), wxPoint(635, 425)); - - ignoreRealControllerBox = new wxCheckBox(this, wxID_ANY, wxEmptyString, ScaledPoint(wxPoint(586, 135)), wxDefaultSize); - resetButton = new wxButton(this, wxID_ANY, _("Reset"), ScaledPoint(wxPoint(1195, 5), wxSize(100, 50), true), ScaledSize(wxSize(100, 50))); - - Bind(wxEVT_CHECKBOX, &VirtualPad::OnIgnoreRealController, this, ignoreRealControllerBox->GetId()); - Bind(wxEVT_BUTTON, &VirtualPad::OnResetButton, this, resetButton->GetId()); - - // Bind Window Events - Bind(wxEVT_MOVE, &VirtualPad::OnMoveAround, this); - Bind(wxEVT_CLOSE_WINDOW, &VirtualPad::OnClose, this); - Bind(wxEVT_ICONIZE, &VirtualPad::OnIconize, this); - Bind(wxEVT_ERASE_BACKGROUND, &VirtualPad::OnEraseBackground, this); - // Temporary Paint event handler so the window displays properly before the controller-interrupt routine takes over with manual drawing. - // The reason for this is in order to minimize the performance impact, we need total control over when render is called - // Windows redraws the window _alot_ otherwise which leads to major performance problems (when GS is using the software renderer) - Bind(wxEVT_PAINT, &VirtualPad::OnPaint, this); - // DevCon.WriteLn("Paint Event Bound"); - - // Finalize layout - SetIcons(wxGetApp().GetIconBundle()); - SetTitle(wxString::Format("Virtual Pad - Port %d", controllerPort + 1)); - SetPosition(options.VirtualPadPosition); - SetBackgroundColour(*wxWHITE); - SetBackgroundStyle(wxBG_STYLE_PAINT); - // This window does not allow for resizing for sake of simplicity: all images are scaled initially and stored, ready to be rendered - SetWindowStyle(wxDEFAULT_FRAME_STYLE & ~wxRESIZE_BORDER & ~wxMAXIMIZE_BOX); - - // Causes flickering, despite it supposed to be preventing it! - // SetDoubleBuffered(true); -} - -void VirtualPad::OnMoveAround(wxMoveEvent& event) -{ - if (IsBeingDeleted() || !IsVisible() || IsIconized()) - return; - - if (!IsMaximized()) - options.VirtualPadPosition = GetPosition(); - event.Skip(); -} - -void VirtualPad::OnClose(wxCloseEvent& event) -{ - // Re-bind the Paint event in case this is due to a game being opened/closed - manualRedrawMode = false; - Bind(wxEVT_PAINT, &VirtualPad::OnPaint, this); - // DevCon.WriteLn("Paint Event Bound"); - Hide(); -} - -void VirtualPad::OnIconize(wxIconizeEvent& event) -{ - if (event.IsIconized()) - { - manualRedrawMode = false; - Bind(wxEVT_PAINT, &VirtualPad::OnPaint, this); - // DevCon.WriteLn("Paint Event Bound"); - } -} - -void VirtualPad::OnEraseBackground(wxEraseEvent& event) -{ - // Intentionally Empty - // See - https://wiki.wxwidgets.org/Flicker-Free_Drawing -} - -void VirtualPad::OnPaint(wxPaintEvent& event) -{ - // DevCon.WriteLn("Paint Event Called"); - wxBufferedPaintDC dc(this, wxBUFFER_VIRTUAL_AREA); - Render(dc); -} - -void VirtualPad::Redraw() -{ - wxClientDC cdc(this); - wxBufferedDC dc(&cdc); - Render(dc); -} - -void VirtualPad::Render(wxDC& bdc) -{ - // Update GUI Elements and figure out what needs to be rendered - for (VirtualPadElement* virtualPadElement : virtualPadElements) - virtualPadElement->UpdateGuiElement(renderQueue, clearScreenRequired); - - // Update Graphic Elements off render stack - // Before we start rendering (if we have to) clear and re-draw the background - if (!manualRedrawMode || clearScreenRequired || !renderQueue.empty()) - { - bdc.SetBrush(*wxWHITE); - bdc.DrawRectangle(wxPoint(0, 0), bdc.GetSize()); - bdc.SetBrush(wxNullBrush); - bdc.DrawBitmap(virtualPadData.background.image, virtualPadData.background.coords, true); - clearScreenRequired = false; - - // Switch to Manual Rendering once the first user action on the VirtualPad is taken - if (!manualRedrawMode && !renderQueue.empty()) - { - // DevCon.WriteLn("Paint Event Unbound"); - Unbind(wxEVT_PAINT, &VirtualPad::OnPaint, this); - manualRedrawMode = true; - } - - // NOTE - there is yet another (and I think final) micro-optimization that can be done: - // It can be assumed that if the element has already been drawn to the screen (and not cleared) that we can skip rendering it - // - // For example - you hold a single button for several frames, it will currently draw that every frame - // despite the screen never being cleared - so this is not strictly necessary. - // - // Though after some tests, the performance impact is well within reason, and on the hardware renderer modes, is almost non-existant. - while (!renderQueue.empty()) - { - VirtualPadElement* element = renderQueue.front(); - if (element) - element->Render(bdc); - renderQueue.pop(); - } - } -} - -bool VirtualPad::UpdateControllerData(u16 const bufIndex, PadData* padData) -{ - return virtualPadData.UpdateVirtualPadData(bufIndex, padData, ignoreRealController && !readOnlyMode, readOnlyMode); -} - -void VirtualPad::enableUiElements(bool enable) -{ - ignoreRealControllerBox->Enable(enable); - resetButton->Enable(enable); - for (VirtualPadElement* virtualPadElement : virtualPadElements) - virtualPadElement->EnableWidgets(enable); -} - -void VirtualPad::SetReadOnlyMode(bool readOnly) -{ - enableUiElements(!readOnly); - readOnlyMode = readOnly; -} - -void VirtualPad::OnIgnoreRealController(wxCommandEvent& event) -{ - const wxCheckBox* ignoreButton = (wxCheckBox*)event.GetEventObject(); - if (ignoreButton) - ignoreRealController = ignoreButton->GetValue(); -} - -void VirtualPad::OnResetButton(wxCommandEvent& event) -{ - if (readOnlyMode) - return; - - for (VirtualPadElement* virtualPadElement : virtualPadElements) - virtualPadElement->Reset(this); -} - -void VirtualPad::OnNormalButtonPress(wxCommandEvent& event) -{ - const wxCheckBox* pressedButton = (wxCheckBox*)event.GetEventObject(); - ControllerNormalButton* eventBtn = buttonElements[pressedButton->GetId()]; - - if (pressedButton) - eventBtn->pressed = pressedButton->GetValue(); - - if (!eventBtn->isControllerPressBypassed) - eventBtn->isControllerPressBypassed = true; -} - -void VirtualPad::OnPressureButtonPressureChange(wxCommandEvent& event) -{ - const wxSpinCtrl* pressureSpinner = (wxSpinCtrl*)event.GetEventObject(); - ControllerPressureButton* eventBtn = pressureElements[pressureSpinner->GetId()]; - - if (pressureSpinner) - eventBtn->pressure = pressureSpinner->GetValue(); - - eventBtn->pressed = eventBtn->pressure > 0; - - if (!eventBtn->isControllerPressureBypassed || !eventBtn->isControllerPressBypassed) - { - eventBtn->isControllerPressureBypassed = true; - eventBtn->isControllerPressBypassed = true; - } -} - -void VirtualPad::OnAnalogSpinnerChange(wxCommandEvent& event) -{ - const wxSpinCtrl* analogSpinner = (wxSpinCtrl*)event.GetEventObject(); - AnalogVector* eventVector = analogElements[analogSpinner->GetId()]; - - if (analogSpinner) - eventVector->val = analogSpinner->GetValue(); - - eventVector->slider->SetValue(eventVector->val); - - if (!eventVector->isControllerBypassed) - eventVector->isControllerBypassed = true; -} - -void VirtualPad::OnAnalogSliderChange(wxCommandEvent& event) -{ - const wxSlider* analogSlider = (wxSlider*)event.GetEventObject(); - AnalogVector* eventVector = analogElements[analogSlider->GetId()]; - - if (analogSlider) - eventVector->val = analogSlider->GetValue(); - - eventVector->spinner->SetValue(eventVector->val); - - if (!eventVector->isControllerBypassed) - eventVector->isControllerBypassed = true; -} - -/// GUI Element Utility Functions - -bool VirtualPad::floatCompare(float a, float b, float epsilon) -{ - return (fabs(a - b) < epsilon); -} - -wxPoint VirtualPad::ScaledPoint(wxPoint point, wxSize widgetWidth, bool rightAlignedCoord, bool bottomAlignedCoord) -{ - return ScaledPoint(point.x, point.y, widgetWidth.x, widgetWidth.y, rightAlignedCoord, bottomAlignedCoord); -} - -wxPoint VirtualPad::ScaledPoint(int x, int y, int widgetWidth, int widgetHeight, bool rightAlignedCoord, bool bottomAlignedCoord) -{ - wxPoint scaledPoint = wxPoint(x * scalingFactor, y * scalingFactor); - if (rightAlignedCoord) - { - scaledPoint.x -= widgetWidth * scalingFactor; - if (scaledPoint.x < 0) - scaledPoint.x = 0; - } - if (bottomAlignedCoord) - { - scaledPoint.y -= widgetHeight * scalingFactor; - if (scaledPoint.y < 0) - scaledPoint.y = 0; - } - return scaledPoint; -} - -wxSize VirtualPad::ScaledSize(wxSize size) -{ - return ScaledSize(size.x, size.y); -} - -wxSize VirtualPad::ScaledSize(int x, int y) -{ - return wxSize(x * scalingFactor, y * scalingFactor); -} - -ImageFile VirtualPad::NewBitmap(wxImage resource, wxPoint imgCoord, bool dontScale) -{ - return NewBitmap(dontScale ? 1 : scalingFactor, resource, imgCoord); -} - -ImageFile VirtualPad::NewBitmap(float scalingFactor, wxImage resource, wxPoint imgCoord) -{ - wxBitmap bitmap = wxBitmap(resource.Rescale(resource.GetWidth() * scalingFactor, resource.GetHeight() * scalingFactor, wxIMAGE_QUALITY_HIGH)); - - ImageFile image = ImageFile(); - image.image = bitmap; - image.width = bitmap.GetWidth(); - image.height = bitmap.GetHeight(); - image.coords = ScaledPoint(imgCoord); - return image; -} - -void VirtualPad::InitNormalButtonGuiElements(ControllerNormalButton& button, ImageFile image, wxWindow* parentWindow, wxPoint checkboxCoord) -{ - button.icon = image; - button.pressedBox = new wxCheckBox(parentWindow, wxID_ANY, wxEmptyString, ScaledPoint(checkboxCoord), wxDefaultSize); - Bind(wxEVT_CHECKBOX, &VirtualPad::OnNormalButtonPress, this, button.pressedBox->GetId()); - buttonElements[button.pressedBox->GetId()] = &button; - virtualPadElements.push_back(&button); -} - -void VirtualPad::InitPressureButtonGuiElements(ControllerPressureButton& button, ImageFile image, wxWindow* parentWindow, wxPoint pressureSpinnerCoord, bool rightAlignedCoord, bool bottomAlignedCoord) -{ - const wxPoint scaledPoint = ScaledPoint(pressureSpinnerCoord, SPINNER_SIZE, rightAlignedCoord, bottomAlignedCoord); - wxSpinCtrl* spinner = new wxSpinCtrl(parentWindow, wxID_ANY, wxEmptyString, scaledPoint, ScaledSize(SPINNER_SIZE), wxSP_ARROW_KEYS, 0, 255, 0); - - button.icon = image; - button.pressureSpinner = spinner; - Bind(wxEVT_SPINCTRL, &VirtualPad::OnPressureButtonPressureChange, this, button.pressureSpinner->GetId()); - pressureElements[button.pressureSpinner->GetId()] = &button; - virtualPadElements.push_back(&button); -} - -void VirtualPad::InitAnalogStickGuiElements(AnalogStick& analog, wxWindow* parentWindow, wxPoint centerPoint, int radius, - wxPoint xSliderPoint, wxPoint ySliderPoint, bool flipYSlider, wxPoint xSpinnerPoint, wxPoint ySpinnerPoint, bool rightAlignedSpinners) -{ - AnalogPosition analogPos = AnalogPosition(); - analogPos.centerCoords = ScaledPoint(centerPoint); - analogPos.endCoords = ScaledPoint(centerPoint); - analogPos.radius = radius * scalingFactor; - analogPos.lineThickness = 6 * scalingFactor; - - const wxPoint xSpinnerScaledPoint = ScaledPoint(xSpinnerPoint, SPINNER_SIZE, rightAlignedSpinners); - const wxPoint ySpinnerScaledPoint = ScaledPoint(ySpinnerPoint, SPINNER_SIZE, rightAlignedSpinners, true); - - wxSlider* xSlider = new wxSlider(parentWindow, wxID_ANY, ANALOG_NEUTRAL, 0, ANALOG_MAX, - ScaledPoint(xSliderPoint), ScaledSize(ANALOG_SLIDER_WIDTH, ANALOG_SLIDER_HEIGHT)); - wxSlider* ySlider = new wxSlider(parentWindow, wxID_ANY, ANALOG_NEUTRAL, 0, ANALOG_MAX, - ScaledPoint(ySliderPoint), ScaledSize(ANALOG_SLIDER_HEIGHT, ANALOG_SLIDER_WIDTH), flipYSlider ? wxSL_LEFT : wxSL_RIGHT); - wxSpinCtrl* xSpinner = new wxSpinCtrl(parentWindow, wxID_ANY, wxEmptyString, xSpinnerScaledPoint, ScaledSize(SPINNER_SIZE), wxSP_ARROW_KEYS, 0, 255, 127); - wxSpinCtrl* ySpinner = new wxSpinCtrl(parentWindow, wxID_ANY, wxEmptyString, ySpinnerScaledPoint, ScaledSize(SPINNER_SIZE), wxSP_ARROW_KEYS, 0, 255, 127); - - analog.xVector.slider = xSlider; - analog.yVector.slider = ySlider; - analog.xVector.spinner = xSpinner; - analog.yVector.spinner = ySpinner; - analog.positionGraphic = analogPos; - Bind(wxEVT_SLIDER, &VirtualPad::OnAnalogSliderChange, this, xSlider->GetId()); - Bind(wxEVT_SLIDER, &VirtualPad::OnAnalogSliderChange, this, ySlider->GetId()); - Bind(wxEVT_SPINCTRL, &VirtualPad::OnAnalogSpinnerChange, this, xSpinner->GetId()); - Bind(wxEVT_SPINCTRL, &VirtualPad::OnAnalogSpinnerChange, this, ySpinner->GetId()); - analogElements[xSlider->GetId()] = &analog.xVector; - analogElements[ySlider->GetId()] = &analog.yVector; - analogElements[xSpinner->GetId()] = &analog.xVector; - analogElements[ySpinner->GetId()] = &analog.yVector; - virtualPadElements.push_back(&analog); -} - -#endif diff --git a/pcsx2/Recording/VirtualPad/VirtualPad.h b/pcsx2/Recording/VirtualPad/VirtualPad.h deleted file mode 100644 index dd2926f217..0000000000 --- a/pcsx2/Recording/VirtualPad/VirtualPad.h +++ /dev/null @@ -1,119 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2020 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#pragma once - -#ifndef PCSX2_CORE - -#include -#include - -#include "gui/AppConfig.h" -#include "common/Pcsx2Types.h" - -#include "wx/button.h" -#include "wx/checkbox.h" -#include "wx/dc.h" -#include "wx/event.h" -#include "wx/frame.h" -#include "wx/gdicmn.h" -#include "wx/string.h" -#include "wx/window.h" -#include "wx/windowid.h" - -#include "Recording/PadData.h" -#include "Recording/VirtualPad/VirtualPadData.h" - -class VirtualPad : public wxFrame -{ -public: - VirtualPad(wxWindow* parent, int controllerPort, AppConfig::InputRecordingOptions& options); - // Updates the VirtualPad's data if necessary, as well as updates the provided PadData if the VirtualPad overrides it - // - PadData will not be updated if ReadOnly mode is set - // - returns a bool to indicate if the PadData has been updated - bool UpdateControllerData(u16 const bufIndex, PadData* padData); - // Enables/Disables read only mode and enables/disables GUI widgets - void SetReadOnlyMode(bool readOnly); - // To be called at maximum, once per frame to update widget's value and re-render the VirtualPad's graphics - void Redraw(); - -private: - /// Constants - const wxSize SPINNER_SIZE = wxSize(100, 40); - static const int ANALOG_SLIDER_WIDTH = 185; - static const int ANALOG_SLIDER_HEIGHT = 30; - - static const int PRESSURE_MAX = 255; - static const int ANALOG_NEUTRAL = 127; - static const int ANALOG_MAX = 255; - - AppConfig::InputRecordingOptions& options; - - bool clearScreenRequired = false; - bool ignoreRealController = false; - // When enabled, forces the VirtualPad to be re-rendered even if no updates are made. - // This helps to make sure the UI is rendered prior to receiving data from the controller - bool manualRedrawMode = false; - bool readOnlyMode = false; - - VirtualPadData virtualPadData; - - std::vector virtualPadElements; - std::queue renderQueue; - - void enableUiElements(bool enable); - - /// GUI Elements - wxCheckBox* ignoreRealControllerBox; - wxButton* resetButton; - - std::map buttonElements; - std::map pressureElements; - std::map analogElements; - - /// Event Listeners - void OnMoveAround(wxMoveEvent& event); - void OnClose(wxCloseEvent& event); - void OnIconize(wxIconizeEvent& event); - void OnEraseBackground(wxEraseEvent& event); - void OnPaint(wxPaintEvent& event); - void Render(wxDC& dc); - - void OnAnalogSliderChange(wxCommandEvent& event); - void OnAnalogSpinnerChange(wxCommandEvent& event); - void OnIgnoreRealController(wxCommandEvent& event); - void OnNormalButtonPress(wxCommandEvent& event); - void OnPressureButtonPressureChange(wxCommandEvent& event); - void OnResetButton(wxCommandEvent& event); - - /// GUI Creation Utility Functions - float scalingFactor = 1.0; - bool floatCompare(float A, float B, float epsilon = 0.005f); - - wxSize ScaledSize(wxSize size); - wxSize ScaledSize(int x, int y); - wxPoint ScaledPoint(wxPoint point, wxSize widgetSize = wxDefaultSize, bool rightAlignedCoord = false, bool bottomAlignedCoord = false); - wxPoint ScaledPoint(int x, int y, int widgetWidth, int widgetHeight, bool rightAlignedCoord = false, bool bottomAlignedCoord = false); - - ImageFile NewBitmap(wxImage resource, wxPoint imgCoord, bool dontScale = false); - ImageFile NewBitmap(float scalingFactor, wxImage resource, wxPoint imgCoord); - - void InitPressureButtonGuiElements(ControllerPressureButton& button, ImageFile image, wxWindow* parentWindow, wxPoint pressureSpinnerCoord, bool rightAlignedCoord = false, bool bottomAlignedCoord = false); - void InitNormalButtonGuiElements(ControllerNormalButton& btn, ImageFile image, wxWindow* parentWindow, wxPoint checkboxCoord); - void InitAnalogStickGuiElements(AnalogStick& analog, wxWindow* parentWindow, wxPoint centerPoint, int radius, wxPoint xSliderPoint, - wxPoint ySliderPoint, bool flipYSlider, wxPoint xSpinnerPoint, wxPoint ySpinnerPoint, bool rightAlignedSpinners = false); -}; - -#endif diff --git a/pcsx2/Recording/VirtualPad/VirtualPadData.cpp b/pcsx2/Recording/VirtualPad/VirtualPadData.cpp deleted file mode 100644 index ca28008905..0000000000 --- a/pcsx2/Recording/VirtualPad/VirtualPadData.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2020 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" - -#ifndef PCSX2_CORE - -#include "Recording/VirtualPad/VirtualPadData.h" - -bool VirtualPadData::UpdateVirtualPadData(u16 bufIndex, PadData* padData, bool ignoreRealController, bool readOnly) -{ - bool changeDetected = false; - PadData::BufferIndex index = static_cast(bufIndex); - switch (index) - { - case PadData::BufferIndex::PressedFlagsGroupOne: - changeDetected |= left.UpdateData(padData->leftPressed, ignoreRealController, readOnly); - changeDetected |= down.UpdateData(padData->downPressed, ignoreRealController, readOnly); - changeDetected |= right.UpdateData(padData->rightPressed, ignoreRealController, readOnly); - changeDetected |= up.UpdateData(padData->upPressed, ignoreRealController, readOnly); - changeDetected |= start.UpdateData(padData->start, ignoreRealController, readOnly); - changeDetected |= r3.UpdateData(padData->r3, ignoreRealController, readOnly); - changeDetected |= l3.UpdateData(padData->l3, ignoreRealController, readOnly); - changeDetected |= select.UpdateData(padData->select, ignoreRealController, readOnly); - return changeDetected; - case PadData::BufferIndex::PressedFlagsGroupTwo: - changeDetected |= square.UpdateData(padData->squarePressed, ignoreRealController, readOnly); - changeDetected |= cross.UpdateData(padData->crossPressed, ignoreRealController, readOnly); - changeDetected |= circle.UpdateData(padData->circlePressed, ignoreRealController, readOnly); - changeDetected |= triangle.UpdateData(padData->trianglePressed, ignoreRealController, readOnly); - changeDetected |= r1.UpdateData(padData->r1Pressed, ignoreRealController, readOnly); - changeDetected |= l1.UpdateData(padData->l1Pressed, ignoreRealController, readOnly); - changeDetected |= r2.UpdateData(padData->r2Pressed, ignoreRealController, readOnly); - changeDetected |= l2.UpdateData(padData->l2Pressed, ignoreRealController, readOnly); - return changeDetected; - case PadData::BufferIndex::RightAnalogXVector: - return rightAnalog.xVector.UpdateData(padData->rightAnalogX, ignoreRealController, readOnly); - case PadData::BufferIndex::RightAnalogYVector: - return rightAnalog.yVector.UpdateData(padData->rightAnalogY, ignoreRealController, readOnly); - case PadData::BufferIndex::LeftAnalogXVector: - return leftAnalog.xVector.UpdateData(padData->leftAnalogX, ignoreRealController, readOnly); - case PadData::BufferIndex::LeftAnalogYVector: - return leftAnalog.yVector.UpdateData(padData->leftAnalogY, ignoreRealController, readOnly); - case PadData::BufferIndex::RightPressure: - return right.UpdateData(padData->rightPressure, ignoreRealController, readOnly); - case PadData::BufferIndex::LeftPressure: - return left.UpdateData(padData->leftPressure, ignoreRealController, readOnly); - case PadData::BufferIndex::UpPressure: - return up.UpdateData(padData->upPressure, ignoreRealController, readOnly); - case PadData::BufferIndex::DownPressure: - return down.UpdateData(padData->downPressure, ignoreRealController, readOnly); - case PadData::BufferIndex::TrianglePressure: - return triangle.UpdateData(padData->trianglePressure, ignoreRealController, readOnly); - case PadData::BufferIndex::CirclePressure: - return circle.UpdateData(padData->circlePressure, ignoreRealController, readOnly); - case PadData::BufferIndex::CrossPressure: - return cross.UpdateData(padData->crossPressure, ignoreRealController, readOnly); - case PadData::BufferIndex::SquarePressure: - return square.UpdateData(padData->squarePressure, ignoreRealController, readOnly); - case PadData::BufferIndex::L1Pressure: - return l1.UpdateData(padData->l1Pressure, ignoreRealController, readOnly); - case PadData::BufferIndex::R1Pressure: - return r1.UpdateData(padData->r1Pressure, ignoreRealController, readOnly); - case PadData::BufferIndex::L2Pressure: - return l2.UpdateData(padData->l2Pressure, ignoreRealController, readOnly); - case PadData::BufferIndex::R2Pressure: - return r2.UpdateData(padData->r2Pressure, ignoreRealController, readOnly); - } - return changeDetected; -} - -#endif diff --git a/pcsx2/Recording/VirtualPad/VirtualPadData.h b/pcsx2/Recording/VirtualPad/VirtualPadData.h deleted file mode 100644 index 6a25b317d7..0000000000 --- a/pcsx2/Recording/VirtualPad/VirtualPadData.h +++ /dev/null @@ -1,63 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs -* Copyright (C) 2002-2020 PCSX2 Dev Team -* -* PCSX2 is free software: you can redistribute it and/or modify it under the terms -* of the GNU Lesser General Public License as published by the Free Software Found- -* ation, either version 3 of the License, or (at your option) any later version. -* -* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -* PURPOSE. See the GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License along with PCSX2. -* If not, see . -*/ - -#pragma once - -#ifndef PCSX2_CORE - -#include "common/Pcsx2Types.h" - -#include "Recording/PadData.h" -#include "Recording/VirtualPad/VirtualPadResources.h" - -class VirtualPadData -{ -public: - /// Controller Background - ImageFile background; - - /// Pressure Buttons - ControllerPressureButton circle; - ControllerPressureButton cross; - ControllerPressureButton down; - ControllerPressureButton l1; - ControllerPressureButton l2; - ControllerPressureButton left; - ControllerPressureButton r1; - ControllerPressureButton r2; - ControllerPressureButton right; - ControllerPressureButton square; - ControllerPressureButton triangle; - ControllerPressureButton up; - - /// Normal (un)pressed buttons - ControllerNormalButton l3; - ControllerNormalButton r3; - ControllerNormalButton select; - ControllerNormalButton start; - - /// Analog Sticks - AnalogStick leftAnalog; - AnalogStick rightAnalog; - - // Given the input buffer and the current index, updates the respective field(s) within this object - // Additionally overwrites the PadData object under the following criteria: - // - If ignoreRealController is true (and readOnly is false) PadData will always be updated - // - else if the VirtualPad has overwritten the value, and the real controller has not changed since that moment in time - // returns a boolean to indicate if it has updated the PadData - bool UpdateVirtualPadData(u16 bufIndex, PadData* padData, bool ignoreRealController = false, bool readOnly = false); -}; - -#endif diff --git a/pcsx2/Recording/VirtualPad/VirtualPadResources.cpp b/pcsx2/Recording/VirtualPad/VirtualPadResources.cpp deleted file mode 100644 index 8dda369b00..0000000000 --- a/pcsx2/Recording/VirtualPad/VirtualPadResources.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs -* Copyright (C) 2002-2020 PCSX2 Dev Team -* -* PCSX2 is free software: you can redistribute it and/or modify it under the terms -* of the GNU Lesser General Public License as published by the Free Software Found- -* ation, either version 3 of the License, or (at your option) any later version. -* -* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -* PURPOSE. See the GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License along with PCSX2. -* If not, see . -*/ - -#include "PrecompiledHeader.h" - -#ifndef PCSX2_CORE - -#include - -#include "Recording/VirtualPad/VirtualPadResources.h" -#include "Recording/PadData.h" - -wxCommandEvent VirtualPadElement::ConstructEvent(wxEventTypeTag eventType, wxWindow* obj) -{ - wxCommandEvent event(eventType, obj->GetId()); - event.SetEventObject(obj); - return event; -} - -wxCommandEvent VirtualPadElement::ConstructEvent(wxEventTypeTag eventType, wxWindow* obj) -{ - wxCommandEvent event(eventType, obj->GetId()); - event.SetEventObject(obj); - return event; -} - -void ControllerNormalButton::UpdateGuiElement(std::queue& renderQueue, bool& clearScreenRequired) -{ - ControllerNormalButton& button = *this; - // This boolean is set when we parse the PadData in VirtualPadData::UpdateVirtualPadData - // Updating wxWidget elements can be expensive, we only want to do this if required - if (button.widgetUpdateRequired) - button.pressedBox->SetValue(button.pressed); - - // We only render the button if it is pressed - if (button.pressed) - renderQueue.push(this); - // However, if the button has been drawn to the screen in the past - // we need to ensure the screen is cleared. - // This is needed in the scenario where only a single button is being pressed/released - // As no other elements will trigger a clear - else if (button.currentlyRendered) - { - button.currentlyRendered = false; - clearScreenRequired = true; - } -} - -void ControllerPressureButton::UpdateGuiElement(std::queue& renderQueue, bool& clearScreenRequired) -{ - ControllerPressureButton& button = *this; - if (button.widgetUpdateRequired) - button.pressureSpinner->SetValue(button.pressure); - - if (button.pressed) - renderQueue.push(this); - else if (button.currentlyRendered) - { - button.currentlyRendered = false; - clearScreenRequired = true; - } -} - -void AnalogStick::UpdateGuiElement(std::queue& renderQueue, bool& clearScreenRequired) -{ - AnalogStick& analogStick = *this; - if (analogStick.xVector.widgetUpdateRequired) - { - analogStick.xVector.slider->SetValue(analogStick.xVector.val); - analogStick.xVector.spinner->SetValue(analogStick.xVector.val); - } - if (analogStick.yVector.widgetUpdateRequired) - { - analogStick.yVector.slider->SetValue(analogStick.yVector.val); - analogStick.yVector.spinner->SetValue(analogStick.yVector.val); - } - - // We render the analog sticks as long as they are not in the neutral position - if (!(analogStick.xVector.val == PadData::ANALOG_VECTOR_NEUTRAL && analogStick.yVector.val == PadData::ANALOG_VECTOR_NEUTRAL)) - renderQueue.push(this); - else if (analogStick.currentlyRendered) - { - analogStick.currentlyRendered = false; - clearScreenRequired = true; - } -} - -void ControllerNormalButton::EnableWidgets(bool enable) -{ - this->pressedBox->Enable(enable); -} - -void ControllerPressureButton::EnableWidgets(bool enable) -{ - this->pressureSpinner->Enable(enable); -} - -void AnalogStick::EnableWidgets(bool enable) -{ - this->xVector.slider->Enable(enable); - this->yVector.slider->Enable(enable); - this->xVector.spinner->Enable(enable); - this->yVector.spinner->Enable(enable); -} - -void ControllerNormalButton::Render(wxDC& dc) -{ - ControllerNormalButton& button = *this; - ImageFile& img = button.icon; - dc.DrawBitmap(img.image, img.coords, true); - button.currentlyRendered = true; -} - -void ControllerPressureButton::Render(wxDC& dc) -{ - ControllerPressureButton& button = *this; - ImageFile& img = button.icon; - dc.DrawBitmap(img.image, img.coords, true); - button.currentlyRendered = true; -} - -void AnalogStick::Render(wxDC& dc) -{ - AnalogStick& analogStick = *this; - // Render graphic - AnalogPosition analogPos = analogStick.positionGraphic; - // Determine new end coordinates - int newXCoord = analogPos.centerCoords.x + ((analogStick.xVector.val - 127) / 127.0) * analogPos.radius; - int newYCoord = analogPos.centerCoords.y + ((analogStick.yVector.val - 127) / 127.0) * analogPos.radius; - // We want to ensure the line segment length is capped at the defined radius - // NOTE - The conventional way to do this is using arctan2, but the analog values that come out - // of Pad in pcsx2 do not permit this, the coordinates returned do not define a circle. - const float lengthOfLine = sqrt(pow(newXCoord - analogPos.centerCoords.x, 2) + pow(newYCoord - analogPos.centerCoords.y, 2)); - if (lengthOfLine > analogPos.radius) - { - newXCoord = ((1 - analogPos.radius / lengthOfLine) * analogPos.centerCoords.x) + analogPos.radius / lengthOfLine * newXCoord; - newYCoord = ((1 - analogPos.radius / lengthOfLine) * analogPos.centerCoords.y) + analogPos.radius / lengthOfLine * newYCoord; - } - // Set the new end coordinate - analogPos.endCoords = wxPoint(newXCoord, newYCoord); - // Draw line and tip - dc.SetPen(wxPen(*wxBLUE, analogPos.lineThickness)); - dc.DrawLine(analogPos.centerCoords, analogPos.endCoords); - dc.DrawCircle(analogPos.endCoords, wxCoord(analogPos.lineThickness)); - dc.SetPen(wxNullPen); - analogStick.currentlyRendered = true; -} - -void ControllerNormalButton::Reset(wxEvtHandler* destWindow) -{ - this->pressedBox->SetValue(false); - wxPostEvent(destWindow, ConstructEvent(wxEVT_CHECKBOX, this->pressedBox)); -} - -void ControllerPressureButton::Reset(wxEvtHandler* destWindow) -{ - this->pressureSpinner->SetValue(0); - wxPostEvent(destWindow, ConstructEvent(wxEVT_SPINCTRL, this->pressureSpinner)); -} - -void AnalogStick::Reset(wxEvtHandler* destWindow) -{ - this->xVector.slider->SetValue(127); - this->yVector.slider->SetValue(127); - wxPostEvent(destWindow, ConstructEvent(wxEVT_SLIDER, this->xVector.slider)); - wxPostEvent(destWindow, ConstructEvent(wxEVT_SLIDER, this->yVector.slider)); - this->xVector.spinner->SetValue(127); - this->xVector.spinner->SetValue(127); - wxPostEvent(destWindow, ConstructEvent(wxEVT_SPINCTRL, this->xVector.spinner)); - wxPostEvent(destWindow, ConstructEvent(wxEVT_SPINCTRL, this->yVector.spinner)); -} - -bool ControllerNormalButton::UpdateData(bool& padDataVal, bool ignoreRealController, bool readOnly) -{ - return this->UpdateButtonData(padDataVal, ignoreRealController, readOnly); -} - -bool ControllerPressureButton::UpdateData(bool& padDataVal, bool ignoreRealController, bool readOnly) -{ - return this->UpdateButtonData(padDataVal, ignoreRealController, readOnly); -} - -bool ControllerButton::UpdateButtonData(bool& padDataVal, bool ignoreRealController, bool readOnly) -{ - ControllerButton& button = *this; - if (!ignoreRealController || readOnly) - { - // If controller is being bypassed and controller's state has changed - const bool bypassedWithChangedState = button.isControllerPressBypassed && padDataVal != button.prevPressedVal; - if (bypassedWithChangedState) - { - button.prevPressedVal = padDataVal; - button.isControllerPressBypassed = false; - } - // If we aren't bypassing the controller OR the previous condition was met - if (bypassedWithChangedState || !button.isControllerPressBypassed || readOnly) - { - button.widgetUpdateRequired = button.pressed != padDataVal; - button.pressed = padDataVal; - return false; - } - } - // Otherwise, we update the real PadData value, which will in turn be used to update the interrupt's buffer - button.prevPressedVal = padDataVal; - padDataVal = button.pressed; - return button.prevPressedVal != button.pressed; -} - -bool ControllerPressureButton::UpdateData(u8& padDataVal, bool ignoreRealController, bool readOnly) -{ - ControllerPressureButton& button = *this; - if (!ignoreRealController || readOnly) - { - const bool bypassedWithChangedState = button.isControllerPressureBypassed && padDataVal != button.prevPressureVal; - if (bypassedWithChangedState) - { - button.prevPressureVal = padDataVal; - button.isControllerPressureBypassed = false; - } - if (bypassedWithChangedState || !button.isControllerPressureBypassed || readOnly) - { - button.widgetUpdateRequired = button.pressure != padDataVal; - button.pressure = padDataVal; - return false; - } - } - button.prevPressureVal = padDataVal; - padDataVal = button.pressure; - return button.prevPressureVal != button.pressure; -} - -bool AnalogVector::UpdateData(u8& padDataVal, bool ignoreRealController, bool readOnly) -{ - AnalogVector& vector = *this; - if (!ignoreRealController || readOnly) - { - const bool bypassedWithChangedState = vector.isControllerBypassed && padDataVal != vector.prevVal; - if (bypassedWithChangedState) - { - vector.prevVal = padDataVal; - vector.isControllerBypassed = false; - } - if (bypassedWithChangedState || !vector.isControllerBypassed || readOnly) - { - vector.widgetUpdateRequired = vector.val != padDataVal; - vector.val = padDataVal; - return false; - } - } - vector.prevVal = padDataVal; - padDataVal = vector.val; - return vector.prevVal != vector.val; -} - -#endif diff --git a/pcsx2/Recording/VirtualPad/VirtualPadResources.h b/pcsx2/Recording/VirtualPad/VirtualPadResources.h deleted file mode 100644 index 6e452af2b6..0000000000 --- a/pcsx2/Recording/VirtualPad/VirtualPadResources.h +++ /dev/null @@ -1,133 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs -* Copyright (C) 2002-2020 PCSX2 Dev Team -* -* PCSX2 is free software: you can redistribute it and/or modify it under the terms -* of the GNU Lesser General Public License as published by the Free Software Found- -* ation, either version 3 of the License, or (at your option) any later version. -* -* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -* PURPOSE. See the GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License along with PCSX2. -* If not, see . -*/ - -#pragma once - -#ifndef PCSX2_CORE - -#include - -#include "common/Pcsx2Types.h" -#include "wx/bitmap.h" -#include "wx/checkbox.h" -#include "wx/gdicmn.h" -#include "wx/slider.h" -#include "wx/spinctrl.h" -#include "wx/dcbuffer.h" - -struct ImageFile -{ - wxBitmap image; - wxPoint coords; - u32 width = 0; - u32 height = 0; -}; - -struct AnalogVector -{ - wxSlider* slider = 0; - wxSpinCtrl* spinner = 0; - - u8 val = 127; - - bool isControllerBypassed = false; - bool widgetUpdateRequired = false; - u8 prevVal = 127; - - bool UpdateData(u8& padDataVal, bool ignoreRealController, bool readOnly); -}; - - -struct AnalogPosition -{ - wxPoint centerCoords; - wxPoint endCoords; - - int lineThickness = 0; - int radius = 0; -}; - -class VirtualPadElement -{ -public: - bool currentlyRendered = false; - - wxCommandEvent ConstructEvent(wxEventTypeTag eventType, wxWindow *obj); - wxCommandEvent ConstructEvent(wxEventTypeTag eventType, wxWindow *obj); - - virtual void EnableWidgets(bool enable) = 0; - virtual void Render(wxDC& dc) = 0; - virtual void Reset(wxEvtHandler* destWindow) = 0; - virtual void UpdateGuiElement(std::queue& renderQueue, bool& clearScreenRequired) = 0; -}; - -class ControllerButton -{ -public: - bool isControllerPressBypassed = false; - bool pressed = false; - bool prevPressedVal = false; - bool widgetUpdateRequired = false; - - bool UpdateButtonData(bool& padDataVal, bool ignoreRealController, bool readOnly); -}; - -class ControllerNormalButton : public ControllerButton, public VirtualPadElement -{ -public: - ImageFile icon; - wxCheckBox* pressedBox = 0; - - bool UpdateData(bool& padDataVal, bool ignoreRealController, bool readOnly); - void EnableWidgets(bool enable) override; - void Render(wxDC& dc) override; - void Reset(wxEvtHandler* destWindow) override; - void UpdateGuiElement(std::queue& renderQueue, bool& clearScreenRequired) override; -}; - -class ControllerPressureButton : public ControllerButton, public VirtualPadElement -{ -public: - ImageFile icon; - wxSpinCtrl* pressureSpinner = 0; - - u8 pressure = 0; - - bool isControllerPressureBypassed = false; - u8 prevPressureVal = 0; - - bool UpdateData(bool& padDataVal, bool ignoreRealController, bool readOnly); - bool UpdateData(u8& padDataVal, bool ignoreRealController, bool readOnly); - void EnableWidgets(bool enable) override; - void Render(wxDC& dc) override; - void Reset(wxEvtHandler* destWindow) override; - void UpdateGuiElement(std::queue& renderQueue, bool& clearScreenRequired) override; -}; - -class AnalogStick : public VirtualPadElement -{ -public: - AnalogVector xVector; - AnalogVector yVector; - - AnalogPosition positionGraphic; - - void EnableWidgets(bool enable) override; - void Render(wxDC& dc) override; - void Reset(wxEvtHandler* destWindow) override; - void UpdateGuiElement(std::queue& renderQueue, bool& clearScreenRequired) override; -}; - -#endif diff --git a/pcsx2/Recording/VirtualPad/img/.gitignore b/pcsx2/Recording/VirtualPad/img/.gitignore deleted file mode 100644 index 424c745c12..0000000000 --- a/pcsx2/Recording/VirtualPad/img/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.h diff --git a/pcsx2/Recording/VirtualPad/img/bin2cpp.cmd b/pcsx2/Recording/VirtualPad/img/bin2cpp.cmd deleted file mode 100644 index 50a8f92c4b..0000000000 --- a/pcsx2/Recording/VirtualPad/img/bin2cpp.cmd +++ /dev/null @@ -1,18 +0,0 @@ - -:: Probably self-explanatory: This batch file compiles a single souce image into a -:: CPP header file for use by pcsx2. -:: -:: bin2cpp.cmd SrcImage -:: -:: Parameters -:: SrcImage - Complete filename with extension. -:: - -@echo off - -SETLOCAL ENABLEEXTENSIONS - -cd "%~0\..\" -"..\..\..\..\tools\bin\bin2cpp.exe" %1 - -ENDLOCAL diff --git a/pcsx2/Recording/VirtualPad/img/circlePressed.png b/pcsx2/Recording/VirtualPad/img/circlePressed.png deleted file mode 100644 index e39d517d38..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/circlePressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/controllerFull.png b/pcsx2/Recording/VirtualPad/img/controllerFull.png deleted file mode 100644 index a584c56ffc..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/controllerFull.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/controllerHalf.png b/pcsx2/Recording/VirtualPad/img/controllerHalf.png deleted file mode 100644 index 35a89a441b..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/controllerHalf.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/controllerThreeQuarters.png b/pcsx2/Recording/VirtualPad/img/controllerThreeQuarters.png deleted file mode 100644 index 50b97ada99..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/controllerThreeQuarters.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/crossPressed.png b/pcsx2/Recording/VirtualPad/img/crossPressed.png deleted file mode 100644 index 520a97f5b4..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/crossPressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/downPressed.png b/pcsx2/Recording/VirtualPad/img/downPressed.png deleted file mode 100644 index 1d5b820328..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/downPressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/l1Pressed.png b/pcsx2/Recording/VirtualPad/img/l1Pressed.png deleted file mode 100644 index c17fe77f68..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/l1Pressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/l2Pressed.png b/pcsx2/Recording/VirtualPad/img/l2Pressed.png deleted file mode 100644 index e4fdb10851..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/l2Pressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/l3Pressed.png b/pcsx2/Recording/VirtualPad/img/l3Pressed.png deleted file mode 100644 index ba29026e4b..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/l3Pressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/leftPressed.png b/pcsx2/Recording/VirtualPad/img/leftPressed.png deleted file mode 100644 index e50e9db908..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/leftPressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/r1Pressed.png b/pcsx2/Recording/VirtualPad/img/r1Pressed.png deleted file mode 100644 index 427b907752..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/r1Pressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/r2Pressed.png b/pcsx2/Recording/VirtualPad/img/r2Pressed.png deleted file mode 100644 index 9824852776..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/r2Pressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/r3Pressed.png b/pcsx2/Recording/VirtualPad/img/r3Pressed.png deleted file mode 100644 index 5a7aba89b9..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/r3Pressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/rightPressed.png b/pcsx2/Recording/VirtualPad/img/rightPressed.png deleted file mode 100644 index 72e521fbdb..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/rightPressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/selectPressed.png b/pcsx2/Recording/VirtualPad/img/selectPressed.png deleted file mode 100644 index bf46627459..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/selectPressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/squarePressed.png b/pcsx2/Recording/VirtualPad/img/squarePressed.png deleted file mode 100644 index 9b1d7fc045..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/squarePressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/startPressed.png b/pcsx2/Recording/VirtualPad/img/startPressed.png deleted file mode 100644 index a84539a072..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/startPressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/trianglePressed.png b/pcsx2/Recording/VirtualPad/img/trianglePressed.png deleted file mode 100644 index 741ee164a3..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/trianglePressed.png and /dev/null differ diff --git a/pcsx2/Recording/VirtualPad/img/upPressed.png b/pcsx2/Recording/VirtualPad/img/upPressed.png deleted file mode 100644 index 85dd87f492..0000000000 Binary files a/pcsx2/Recording/VirtualPad/img/upPressed.png and /dev/null differ diff --git a/pcsx2/Reference/PS2-MemoryCardFileSystem.htm b/pcsx2/Reference/PS2-MemoryCardFileSystem.htm index ab70426b36..290f8ea7bf 100644 --- a/pcsx2/Reference/PS2-MemoryCardFileSystem.htm +++ b/pcsx2/Reference/PS2-MemoryCardFileSystem.htm @@ -9,7 +9,7 @@ PlayStation 2 Memory Card File System PlayStation 2 Memory Card File System
    -

    By +

    By Ross Ridge @@ -27,7 +27,7 @@ missing, misleading or just plain wrong. At lot of assumptions had to be made during my research, and it's hard know to what exactly Sony intended in every case. All most all of the names for structures, fields and flags were made up by me. Nothing in this document should -be considered official. +be considered official.

    For brevity, unused fields and flag bits are omitted from the tables. @@ -56,7 +56,7 @@ memory cards, so I've created short glossary.

    See "erase block".
    cluster
    -
    The unit of allocation used in the file system. A cluster +
    The unit of allocation used in the file system. A cluster is one or more pages in size.
    ECC
    @@ -140,7 +140,7 @@ about the structure of the file system is kept. data area a spare area. The data area is used to store ordinary data, while the much smaller spare area is for software defined error-correcting codes (ECC), wear leveling, bad block remapping, - and other functions meant to deal with defects in the media. + and other functions meant to deal with defects in the media.

    The flash devices used in PS2 memory cards have a 528 byte page @@ -150,7 +150,7 @@ about the structure of the file system is kept. The are 16384 pages, for a total combined raw data area capacity 8,388,608 bytes.

    - +

    File System Organization

    @@ -327,7 +327,7 @@ in the FAT and directory entries are relative to this.
    alloc_end word 8135The cluster after the highest allocatable cluster. Relative to +The cluster after the highest allocatable cluster. Relative to alloc_offset.
    Not used.
    rootdir_cluster word 0First cluster of the root directory. Relative to +First cluster of the root directory. Relative to alloc_offset.
    Must be zero.
    0x00 modehalfhalf See directory mode table.
    0x04 lengthwordword Length in bytes if a file, or entries if a directory.
    0x08 createdbyte[8]byte[8] Creation time.
    0x10 clusterwordword First cluster of the file, or 0xFFFFFFFF for an empty file. In "." entries this the first cluster of this directory's parent directory instead. @@ -647,7 +647,7 @@ Relative to alloc_offset.
    0x14 dir_entrywordword Only in "." entries. Entry of this directory in its parent's directory.
    0x18 modifiedbyte[8]byte[8] Modification time.
    0x20 attrwordword User defined attribute
    0x40 namebyte[32]byte[32] Zero terminated name for this directory entry.
    @@ -754,7 +754,7 @@ in its parent's directory. like the PS2 browser. The DF_PSX flag indicates that file was copied from a PSX memory card. If the DF_POCKETSTN flag is set as well, the file is a PocketStation application file copied - from a PocketStation. + from a PocketStation.

    Each directory entry is a massive 512 bytes long, so only two @@ -772,7 +772,7 @@ in its parent's directory.

    Error Management

    A number of strategies are employed in the file system to handle - errors are likely to occur when using memory cards. + errors are likely to occur when using memory cards.

    @@ -858,7 +858,7 @@ in its parent's directory.

    NAND Flash Memory

    -Micron: NAND Flash 101: An Introduction to NAND Flash and How to Design It In +Micron: NAND Flash 101: An Introduction to NAND Flash and How to Design It In to Your Next Product
    Wikipedia: Flash memory
    @@ -880,4 +880,4 @@ Hanimar: 1.0f) - FinalVolume = 1.0f; + if (FinalVolume > 2.0f) + FinalVolume = 2.0f; AdvancedVolumeControl = Host::GetBoolSettingValue("SPU2/Mixing", "AdvancedVolumeControl", false); VolumeAdjustCdb = Host::GetFloatSettingValue("SPU2/Mixing", "VolumeAdjustC", 0); @@ -102,6 +102,7 @@ void ReadSettings() SndOutLatencyMS = Host::GetIntSettingValue("SPU2/Output", "Latency", 100); SynchMode = Host::GetIntSettingValue("SPU2/Output", "SynchMode", 0); numSpeakers = Host::GetIntSettingValue("SPU2/Output", "SpeakerConfiguration", 0); + dplLevel = Host::GetIntSettingValue("SPU2/Output", "DplDecodingLevel", 0); SoundtouchCfg::ReadSettings(); DebugConfig::ReadSettings(); diff --git a/pcsx2/SPU2/Linux/Config.cpp b/pcsx2/SPU2/Linux/Config.cpp index 545679f752..afd32ec5f2 100644 --- a/pcsx2/SPU2/Linux/Config.cpp +++ b/pcsx2/SPU2/Linux/Config.cpp @@ -81,8 +81,8 @@ void ReadSettings() Interpolation = CfgReadInt(L"MIXING", L"Interpolation", 5); FinalVolume = ((float)CfgReadInt(L"MIXING", L"FinalVolume", 100)) / 100; - if (FinalVolume > 1.0f) - FinalVolume = 1.0f; + if (FinalVolume > 2.0f) + FinalVolume = 2.0f; AdvancedVolumeControl = CfgReadBool(L"MIXING", L"AdvancedVolumeControl", false); VolumeAdjustCdb = CfgReadFloat(L"MIXING", L"VolumeAdjustC(dB)", 0); diff --git a/pcsx2/SPU2/Mixer.cpp b/pcsx2/SPU2/Mixer.cpp index 434e4b2f7e..f2d205cfec 100644 --- a/pcsx2/SPU2/Mixer.cpp +++ b/pcsx2/SPU2/Mixer.cpp @@ -808,21 +808,24 @@ __forceinline Out.Left = MulShr32(Out.Left << SndOutVolumeShift, Cores[1].MasterVol.Left.Value); Out.Right = MulShr32(Out.Right << SndOutVolumeShift, Cores[1].MasterVol.Right.Value); - // Final Clamp! - // Like any good audio system, the PS2 pumps the volume and incurs some distortion in its - // output, giving us a nice thumpy sound at times. So we add 1 above (2x volume pump) and - // then clamp it all here. - - // Edit: I'm sorry Jake, but I know of no good audio system that arbitrary distorts and clips - // output by design. - // Good thing though that this code gets the volume exactly right, as per tests :) - Out = clamp_mix(Out, SndOutVolumeShift); + + } // Configurable output volume Out.Left *= FinalVolume; Out.Right *= FinalVolume; + // Final Clamp! + // Like any good audio system, the PS2 pumps the volume and incurs some distortion in its + // output, giving us a nice thumpy sound at times. So we add 1 above (2x volume pump) and + // then clamp it all here. + + // Edit: I'm sorry Jake, but I know of no good audio system that arbitrary distorts and clips + // output by design. + // Good thing though that this code gets the volume exactly right, as per tests :) + Out = clamp_mix(Out, SndOutVolumeShift); + SndBuffer::Write(Out); if (SampleRate == 96000) // Double up samples for 96khz (Port Audio Non-Exclusive) diff --git a/pcsx2/SPU2/ReadInput.cpp b/pcsx2/SPU2/ReadInput.cpp index 9668cfb024..9275c5f1c9 100644 --- a/pcsx2/SPU2/ReadInput.cpp +++ b/pcsx2/SPU2/ReadInput.cpp @@ -116,12 +116,6 @@ StereoOut32 V_Core::ReadInput() retval = StereoOut32( (s32)(*GetMemPtr(0x2000 + (Index << 10) + ReadIndex)), (s32)(*GetMemPtr(0x2200 + (Index << 10) + ReadIndex))); - - // Not accurate behaviour but shouldn't hurt for now, need to run some tests - // to see why Prince of Persia Warrior Within buzzes when going in to the map - // since it starts an ADMA of music, then kills ADMA, so it loops on a few ms of data. - GetMemPtr(0x2000 + (Index << 10) + ReadIndex)[0] = 0; - GetMemPtr(0x2200 + (Index << 10) + ReadIndex)[0] = 0; } #ifdef PCSX2_DEVBUILD diff --git a/pcsx2/SPU2/SndOut.cpp b/pcsx2/SPU2/SndOut.cpp index f504219068..1349fbb1dd 100644 --- a/pcsx2/SPU2/SndOut.cpp +++ b/pcsx2/SPU2/SndOut.cpp @@ -64,6 +64,11 @@ public: { return "No Sound (Emulate SPU2 only)"; } + + const char* const* GetBackendNames() const override + { + return nullptr; + } }; static NullOutModule s_NullOut; @@ -93,6 +98,19 @@ int FindOutputModuleById(const char* omodid) return modcnt; } +const char* const* GetOutputModuleBackends(const char* omodid) +{ + for (SndOutModule* mod : mods) + { + if (mod && std::strcmp(mod->GetIdent(), omodid) == 0) + { + return mod->GetBackendNames(); + } + } + + return nullptr; +} + StereoOut32* SndBuffer::m_buffer; s32 SndBuffer::m_size; alignas(4) volatile s32 SndBuffer::m_rpos; diff --git a/pcsx2/SPU2/SndOut.h b/pcsx2/SPU2/SndOut.h index b3e0488917..f7f4e4f299 100644 --- a/pcsx2/SPU2/SndOut.h +++ b/pcsx2/SPU2/SndOut.h @@ -34,6 +34,10 @@ extern int SampleRate; extern int FindOutputModuleById(const char* omodid); +// Returns a null-terminated list of backends for the specified module. +// nullptr is returned if the specified module does not have multiple backends. +extern const char* const* GetOutputModuleBackends(const char* omodid); + // Implemented in Config.cpp extern float VolumeAdjustFL; extern float VolumeAdjustC; @@ -641,6 +645,9 @@ public: // (for use in configuration screen) virtual const char* GetLongName() const = 0; + // Returns a null-terminated list of backends, or nullptr. + virtual const char* const* GetBackendNames() const = 0; + virtual bool Init() = 0; virtual void Close() = 0; diff --git a/pcsx2/SPU2/SndOut_Cubeb.cpp b/pcsx2/SPU2/SndOut_Cubeb.cpp index 773e9b32be..81bac69967 100644 --- a/pcsx2/SPU2/SndOut_Cubeb.cpp +++ b/pcsx2/SPU2/SndOut_Cubeb.cpp @@ -15,13 +15,18 @@ #include "PrecompiledHeader.h" +#include "Global.h" +#include "SndOut.h" + #include "common/Console.h" #include "common/StringUtil.h" #include "common/RedtapeWindows.h" + #include "cubeb/cubeb.h" -#include "Global.h" -#include "SndOut.h" +#ifdef _WIN32 +#include +#endif #ifdef PCSX2_CORE @@ -363,6 +368,11 @@ public: return "Cubeb (Cross-platform)"; } + const char* const* GetBackendNames() const override + { + return cubeb_get_backend_names(); + } + void ReadSettings() { #ifndef PCSX2_CORE @@ -371,12 +381,12 @@ public: // TODO: Once the config stuff gets merged, drop the wxString here. wxString backend; - CfgReadStr(L"Cubeb", L"BackendName", backend, L""); + CfgReadStr(L"SPU2/Output", L"BackendName", backend, L""); m_Backend = StringUtil::wxStringToUTF8String(backend); #else m_SuggestedLatencyMinimal = Host::GetBoolSettingValue("Cubeb", "MinimalSuggestedLatency", false); m_SuggestedLatencyMS = std::clamp(Host::GetIntSettingValue("Cubeb", "ManualSuggestedLatencyMS", MINIMUM_LATENCY_MS), MINIMUM_LATENCY_MS, MAXIMUM_LATENCY_MS); - m_Backend = Host::GetStringSettingValue("Cubeb", "BackendName", ""); + m_Backend = Host::GetStringSettingValue("SPU2/Output", "BackendName", ""); #endif } }; diff --git a/pcsx2/SPU2/Timestretcher.cpp b/pcsx2/SPU2/Timestretcher.cpp index 911a442629..08c4c945d6 100644 --- a/pcsx2/SPU2/Timestretcher.cpp +++ b/pcsx2/SPU2/Timestretcher.cpp @@ -23,7 +23,7 @@ //Uncomment the next line to use the old time stretcher //#define SPU2X_USE_OLD_STRETCHER -static soundtouch::SoundTouch* pSoundTouch = nullptr; +static std::unique_ptr pSoundTouch = nullptr; // data prediction amount, used to "commit" data that hasn't // finished timestretch processing. @@ -518,7 +518,7 @@ void SndBuffer::timeStretchWrite() void SndBuffer::soundtouchInit() { - pSoundTouch = new soundtouch::SoundTouch(); + pSoundTouch = std::make_unique(); pSoundTouch->setSampleRate(SampleRate); pSoundTouch->setChannels(2); @@ -558,5 +558,5 @@ void SndBuffer::soundtouchClearContents() void SndBuffer::soundtouchCleanup() { - safe_delete(pSoundTouch); + pSoundTouch.reset(); } diff --git a/pcsx2/SPU2/Wavedump_wav.cpp b/pcsx2/SPU2/Wavedump_wav.cpp index 3a84e22d20..e96d1cf03f 100644 --- a/pcsx2/SPU2/Wavedump_wav.cpp +++ b/pcsx2/SPU2/Wavedump_wav.cpp @@ -26,7 +26,7 @@ static WavOutFile* _new_WavOutFile(const char* destfile) { - return new WavOutFile(destfile, 48000, 16, 2); + return new WavOutFile(destfile, SampleRate, 16, 2); } namespace WaveDump @@ -121,12 +121,12 @@ bool RecordStart(const std::string* filename) safe_delete(m_wavrecord); if (filename) #ifdef _WIN32 - m_wavrecord = new WavOutFile(_wfopen(StringUtil::UTF8StringToWideString(*filename).c_str(), L"wb"), 48000, 16, 2); + m_wavrecord = new WavOutFile(_wfopen(StringUtil::UTF8StringToWideString(*filename).c_str(), L"wb"), SampleRate, 16, 2); #else - m_wavrecord = new WavOutFile(filename->c_str(), 48000, 16, 2); + m_wavrecord = new WavOutFile(filename->c_str(), SampleRate, 16, 2); #endif else - m_wavrecord = new WavOutFile("audio_recording.wav", 48000, 16, 2); + m_wavrecord = new WavOutFile("audio_recording.wav", SampleRate, 16, 2); WavRecordEnabled = true; return true; } diff --git a/pcsx2/SPU2/Windows/Config.cpp b/pcsx2/SPU2/Windows/Config.cpp index c71e13971c..209a9581b9 100644 --- a/pcsx2/SPU2/Windows/Config.cpp +++ b/pcsx2/SPU2/Windows/Config.cpp @@ -81,8 +81,8 @@ void ReadSettings() Interpolation = CfgReadInt(L"MIXING", L"Interpolation", 5); FinalVolume = ((float)CfgReadInt(L"MIXING", L"FinalVolume", 100)) / 100; - if (FinalVolume > 1.0f) - FinalVolume = 1.0f; + if (FinalVolume > 2.0f) + FinalVolume = 2.0f; AdvancedVolumeControl = CfgReadBool(L"MIXING", L"AdvancedVolumeControl", false); VolumeAdjustCdb = CfgReadFloat(L"MIXING", L"VolumeAdjustC(dB)", 0); @@ -118,7 +118,7 @@ void ReadSettings() // Let's use xaudio2 until this is sorted (rama). // CfgReadStr(L"OUTPUT", L"Output_Module", omodid, 127, PortaudioOut->GetIdent()); - CfgReadStr(L"OUTPUT", L"Output_Module", omodid, 127, StringUtil::UTF8StringToWideString(XAudio2Out->GetIdent()).c_str()); + CfgReadStr(L"OUTPUT", L"Output_Module", omodid, 127, StringUtil::UTF8StringToWideString(CubebOut->GetIdent()).c_str()); // Find the driver index of this module: OutputModule = FindOutputModuleById(StringUtil::WideStringToUTF8String(omodid).c_str()); @@ -359,7 +359,7 @@ BOOL CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) SetWindowText(GetDlgItem(hWnd, IDC_LATENCY_LABEL), temp); int configvol = (int)(FinalVolume * 100); - INIT_SLIDER(IDC_VOLUME_SLIDER, 0, 100, 10, 5, 1); + INIT_SLIDER(IDC_VOLUME_SLIDER, 0, 200, 10, 5, 1); SendDialogMsg(hWnd, IDC_VOLUME_SLIDER, TBM_SETPOS, TRUE, configvol); swprintf_s(temp, L"%d%%", configvol); diff --git a/pcsx2/SPU2/Windows/SPU2.rc b/pcsx2/SPU2/Windows/SPU2.rc index 7354bb94c5..829c66854a 100644 --- a/pcsx2/SPU2/Windows/SPU2.rc +++ b/pcsx2/SPU2/Windows/SPU2.rc @@ -228,18 +228,18 @@ LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "resource.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#include ""svnrev.h""\r\n" "#include ""afxresmw.h""\0" END -3 TEXTINCLUDE +3 TEXTINCLUDE BEGIN "\0" END diff --git a/pcsx2/SPU2/Windows/SndOut_XAudio2.cpp b/pcsx2/SPU2/Windows/SndOut_XAudio2.cpp index a83e62f50a..4755c7508c 100644 --- a/pcsx2/SPU2/Windows/SndOut_XAudio2.cpp +++ b/pcsx2/SPU2/Windows/SndOut_XAudio2.cpp @@ -380,6 +380,11 @@ public: return "XAudio 2 (Recommended)"; } + const char* const* GetBackendNames() const override + { + return nullptr; + } + } static XA2; SndOutModule* XAudio2Out = &XA2; diff --git a/pcsx2/SPU2/spu2.cpp b/pcsx2/SPU2/spu2.cpp index 2c003422ed..654824b768 100644 --- a/pcsx2/SPU2/spu2.cpp +++ b/pcsx2/SPU2/spu2.cpp @@ -192,7 +192,7 @@ void SPU2SetDeviceSampleRateMultiplier(double multiplier) SPU2UpdateSampleRate(); } -s32 SPU2init() +s32 SPU2init(bool KeepMode) { assert(regtable[0x400] == nullptr); @@ -244,7 +244,7 @@ s32 SPU2init() } } - SPU2InternalReset(PS2Modes::PS2); + SPU2InternalReset((ConsoleSampleRate == 44100 && KeepMode) ? PS2Modes::PSX : PS2Modes::PS2); DMALogOpen(); InitADSR(); diff --git a/pcsx2/SPU2/spu2.h b/pcsx2/SPU2/spu2.h index 758d1185dc..561efb0320 100644 --- a/pcsx2/SPU2/spu2.h +++ b/pcsx2/SPU2/spu2.h @@ -27,7 +27,7 @@ enum class PS2Modes PSX, }; -s32 SPU2init(); +s32 SPU2init(bool KeepMode); s32 SPU2reset(PS2Modes isRunningPSXMode); s32 SPU2open(); void SPU2close(); diff --git a/pcsx2/SPU2/spu2sys.cpp b/pcsx2/SPU2/spu2sys.cpp index ea1f83a893..9252348cc0 100644 --- a/pcsx2/SPU2/spu2sys.cpp +++ b/pcsx2/SPU2/spu2sys.cpp @@ -1232,7 +1232,7 @@ static void RegWrite_VoiceAddr(u16 value) LoopReg = &thisvoice.LoopStartA; thisvoice.LoopMode = 1; } - + *LoopReg = (*LoopReg & 0x0F0000) | (value & 0xFFF8); } break; @@ -1559,6 +1559,16 @@ static void RegWrite_Core(u16 value) thiscore.InputDataLeft = 0; thiscore.DMAICounter = 0; thiscore.InputDataTransferred = 0; + + // Not accurate behaviour but shouldn't hurt for now, need to run some tests + // to see why Prince of Persia Warrior Within buzzes when going in to the map + // since it starts an ADMA of music, then kills ADMA and input DMA + // without disabling ADMA read mode or clearing the buffer. + for (int i = 0; i < 0x200; i++) + { + GetMemPtr(0x2000 + (thiscore.Index << 10))[i] = 0; + GetMemPtr(0x2200 + (thiscore.Index << 10))[i] = 0; + } } break; diff --git a/pcsx2/SPU2/wx/wxConfig.cpp b/pcsx2/SPU2/wx/wxConfig.cpp index 6b956ba6d4..9465ec7ca6 100644 --- a/pcsx2/SPU2/wx/wxConfig.cpp +++ b/pcsx2/SPU2/wx/wxConfig.cpp @@ -60,7 +60,7 @@ MixerTab::MixerTab(wxWindow* parent) // Volume Slider m_volume_box = new wxStaticBoxSizer(wxVERTICAL, this, "Volume"); - m_volume_slider = new wxSlider(this, wxID_ANY, FinalVolume * 100, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_LABELS); + m_volume_slider = new wxSlider(this, wxID_ANY, FinalVolume * 100, 0, 200, wxDefaultPosition, wxDefaultSize, wxSL_LABELS); m_volume_box->Add(m_volume_slider, wxSizerFlags().Expand()); m_audio_box = new wxBoxSizer(wxVERTICAL); diff --git a/pcsx2/SaveState.cpp b/pcsx2/SaveState.cpp index e7981ac717..a7d3f7319a 100644 --- a/pcsx2/SaveState.cpp +++ b/pcsx2/SaveState.cpp @@ -51,6 +51,10 @@ #include "VMManager.h" #endif +#ifdef ENABLE_ACHIEVEMENTS +#include "Frontend/Achievements.h" +#endif + #include "fmt/core.h" #include @@ -58,12 +62,21 @@ using namespace R5900; +static tlbs s_tlb_backup[std::size(tlb)]; + static void PreLoadPrep() { // ensure everything is in sync before we start overwriting stuff. if (THREAD_VU1) vu1Thread.WaitVU(); GetMTGS().WaitGS(false); + + // backup current TLBs, since we're going to overwrite them all + std::memcpy(s_tlb_backup, tlb, sizeof(s_tlb_backup)); + + // clear protected pages, since we don't want to fault loading EE memory + mmap_ResetBlockTracking(); + SysClearExecutionCache(); #ifndef PCSX2_CORE PatchesVerboseReset(); @@ -74,7 +87,15 @@ static void PostLoadPrep() { resetCache(); // WriteCP0Status(cpuRegs.CP0.n.Status.val); - for(int i=0; i<48; i++) MapTLB(i); + for (int i = 0; i < 48; i++) + { + if (std::memcmp(&s_tlb_backup[i], &tlb[i], sizeof(tlbs)) != 0) + { + UnmapTLB(s_tlb_backup[i], i); + MapTLB(tlb[i], i); + } + } + if (EmuConfig.Gamefixes.GoemonTlbHack) GoemonPreloadTlb(); CBreakPoints::SetSkipFirst(BREAKPOINT_EE, 0); CBreakPoints::SetSkipFirst(BREAKPOINT_IOP, 0); @@ -189,12 +210,12 @@ SaveStateBase& SaveStateBase::FreezeBios() // Check the BIOS, and issue a warning if the bios for this state // doesn't match the bios currently being used (chances are it'll still // work fine, but some games are very picky). - + u32 bioscheck = BiosChecksum; char biosdesc[256]; memzero( biosdesc ); memcpy( biosdesc, BiosDescription.c_str(), std::min( sizeof(biosdesc), BiosDescription.length() ) ); - + Freeze( bioscheck ); Freeze( biosdesc ); @@ -209,15 +230,19 @@ SaveStateBase& SaveStateBase::FreezeBios() biosdesc, bioscheck ); } - + return *this; } SaveStateBase& SaveStateBase::FreezeInternals() { +#ifdef PCSX2_CORE + const u32 previousCRC = ElfCRC; +#endif + // Print this until the MTVU problem in gifPathFreeze is taken care of (rama) if (THREAD_VU1) Console.Warning("MTVU speedhack is enabled, saved states may not be stable"); - + // Second Block - Various CPU Registers and States // ----------------------------------------------- FreezeTag( "cpuRegs" ); @@ -235,19 +260,29 @@ SaveStateBase& SaveStateBase::FreezeInternals() StringUtil::Strlcpy(localDiscSerial, DiscSerial.c_str(), sizeof(localDiscSerial)); Freeze(localDiscSerial); if (IsLoading()) + { DiscSerial = localDiscSerial; +#ifdef PCSX2_CORE + if (ElfCRC != previousCRC) + { + // HACK: LastELF isn't in the save state... Load it before we go too far into restoring state. + // When we next bump save states, we should include it. We need this for achievements, because + // we want to load and activate achievements before restoring any of their tracked state. + if (const std::string& elf_override = VMManager::Internal::GetElfOverride(); !elf_override.empty()) + cdvdReloadElfInfo(fmt::format("host:{}", elf_override)); + else + cdvdReloadElfInfo(); + } +#endif + } + + // Third Block - Cycle Timers and Events // ------------------------------------- FreezeTag( "Cycles" ); Freeze(EEsCycle); Freeze(EEoCycle); - Freeze(iopCycleEE); - Freeze(iopBreak); - Freeze(g_nextEventCycle); - Freeze(g_iopNextEventCycle); - Freeze(s_iLastCOP0Cycle); - Freeze(s_iLastPERFCycle); Freeze(nextCounter); Freeze(nextsCounter); Freeze(psxNextsCounter); @@ -409,6 +444,9 @@ static void SysState_ComponentFreezeOutRoot(void* dest, SysState_Component comp) static void SysState_ComponentFreezeIn(zip_file_t* zf, SysState_Component comp) { + if (!zf) + return; + freezeData fP = { 0, nullptr }; if (comp.freeze(FreezeAction::Size, &fP) != 0) fP.size = 0; @@ -633,7 +671,44 @@ public: bool IsRequired() const { return true; } }; +#ifdef ENABLE_ACHIEVEMENTS +class SaveStateEntry_Achievements : public BaseSavestateEntry +{ + virtual ~SaveStateEntry_Achievements() override = default; + const char* GetFilename() const override { return "Achievements.bin"; } + void FreezeIn(zip_file_t* zf) const override + { + if (!Achievements::IsActive()) + return; + + std::optional> data; + if (zf) + data = ReadBinaryFileInZip(zf); + + if (data.has_value() && !data->empty()) + Achievements::LoadState(data->data(), data->size()); + else + Achievements::LoadState(nullptr, 0); + } + + void FreezeOut(SaveStateBase& writer) const override + { + if (!Achievements::IsActive()) + return; + + std::vector data(Achievements::SaveState()); + if (!data.empty()) + { + writer.PrepBlock(static_cast(data.size())); + std::memcpy(writer.GetBlockPtr(), data.data(), data.size()); + writer.CommitBlock(static_cast(data.size())); + } + } + + bool IsRequired() const override { return false; } +}; +#endif // (cpuRegs, iopRegs, VPU/GIF/DMAC structures should all remain as part of a larger unified // block, since they're all PCSX2-dependent and having separate files in the archie for them @@ -656,6 +731,9 @@ static const std::unique_ptr SavestateEntries[] = { #endif std::unique_ptr(new SavestateEntry_PAD), std::unique_ptr(new SavestateEntry_GS), +#ifdef ENABLE_ACHIEVEMENTS + std::unique_ptr(new SaveStateEntry_Achievements), +#endif }; std::unique_ptr SaveState_DownloadState() @@ -980,7 +1058,7 @@ static void CheckVersion(const std::string& filename, zip_t* zf) .SetUserMsg("Cannot load this savestate. The state is an unsupported version."); } -static zip_int64_t CheckFileExistsInState(zip_t* zf, const char* name) +static zip_int64_t CheckFileExistsInState(zip_t* zf, const char* name, bool required) { zip_int64_t index = zip_name_locate(zf, name, /*ZIP_FL_NOCASE*/ 0); if (index >= 0) @@ -989,7 +1067,11 @@ static zip_int64_t CheckFileExistsInState(zip_t* zf, const char* name) return index; } - Console.WriteLn(Color_Red, " ... not found '%s'!", name); + if (required) + Console.WriteLn(Color_Red, " ... not found '%s'!", name); + else + DevCon.WriteLn(Color_Red, " ... not found '%s'!", name); + return index; } @@ -1028,15 +1110,16 @@ void SaveState_UnzipFromDisk(const std::string& filename) CheckVersion(filename, zf.get()); // check that all parts are included - const s64 internal_index = CheckFileExistsInState(zf.get(), EntryFilename_InternalStructures); + const s64 internal_index = CheckFileExistsInState(zf.get(), EntryFilename_InternalStructures, true); s64 entryIndices[std::size(SavestateEntries)]; // Log any parts and pieces that are missing, and then generate an exception. bool throwIt = (internal_index < 0); for (u32 i = 0; i < std::size(SavestateEntries); i++) { - entryIndices[i] = CheckFileExistsInState(zf.get(), SavestateEntries[i]->GetFilename()); - if (entryIndices[i] < 0 && SavestateEntries[i]->IsRequired()) + const bool required = SavestateEntries[i]->IsRequired(); + entryIndices[i] = CheckFileExistsInState(zf.get(), SavestateEntries[i]->GetFilename(), required); + if (entryIndices[i] < 0 && required) throwIt = true; } @@ -1051,7 +1134,10 @@ void SaveState_UnzipFromDisk(const std::string& filename) for (u32 i = 0; i < std::size(SavestateEntries); ++i) { if (entryIndices[i] < 0) + { + SavestateEntries[i]->FreezeIn(nullptr); continue; + } auto zff = zip_fopen_index_managed(zf.get(), entryIndices[i], 0); if (!zff) diff --git a/pcsx2/SaveState.h b/pcsx2/SaveState.h index 37c0d68f0a..52c38abad6 100644 --- a/pcsx2/SaveState.h +++ b/pcsx2/SaveState.h @@ -15,9 +15,12 @@ #pragma once +#include +#include #include #include "System.h" +#include "common/Assertions.h" #include "common/Exceptions.h" enum class FreezeAction @@ -33,7 +36,7 @@ enum class FreezeAction // [SAVEVERSION+] // This informs the auto updater that the users savestates will be invalidated. -static const u32 g_SaveVersion = (0x9A2E << 16) | 0x0000; +static const u32 g_SaveVersion = (0x9A34 << 16) | 0x0000; // the freezing data between submodules and core @@ -44,8 +47,8 @@ static const u32 g_SaveVersion = (0x9A2E << 16) | 0x0000; // necessarily portable; we might want to investigate this in the future -- govanify struct freezeData { - int size; - u8 *data; + int size; + u8* data; }; struct SaveStateScreenshotData @@ -118,6 +121,36 @@ public: void PrepBlock( int size ); + template + void FreezeDeque(std::deque& q) + { + // overwritten when loading + u32 count = static_cast(q.size()); + Freeze(count); + + // have to use a temp array, because deque doesn't have a contiguous block of memory + std::unique_ptr temp; + if (count > 0) + { + temp = std::make_unique(count); + if (IsSaving()) + { + u32 pos = 0; + for (const T& it : q) + temp[pos++] = it; + } + + FreezeMem(temp.get(), static_cast(sizeof(T) * count)); + } + + if (IsLoading()) + { + q.clear(); + for (u32 i = 0; i < count; i++) + q.push_back(temp[i]); + } + } + uint GetCurrentPos() const { return m_idx; @@ -127,7 +160,7 @@ public: { return m_memory->GetPtr(m_idx); } - + u8* GetPtrEnd() const { return m_memory->GetPtrEnd(); diff --git a/pcsx2/ShaderCacheVersion.h b/pcsx2/ShaderCacheVersion.h new file mode 100644 index 0000000000..602ed0d8bf --- /dev/null +++ b/pcsx2/ShaderCacheVersion.h @@ -0,0 +1,18 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +/// Version number for GS and other shaders. Increment whenever any of the contents of the +/// shaders change, to invalidate the cache. +static constexpr u32 SHADER_CACHE_VERSION = 11; diff --git a/pcsx2/Sif0.cpp b/pcsx2/Sif0.cpp index 51915e5d94..b059c8edd5 100644 --- a/pcsx2/Sif0.cpp +++ b/pcsx2/Sif0.cpp @@ -85,7 +85,7 @@ static __fi bool WriteIOPtoFifo() sif0.iop.cycles += writeSize; //1 word per cycle sif0.iop.counter -= writeSize; - + return true; } @@ -167,7 +167,7 @@ static __fi void EndEE() SIF_LOG("SIF0 EE: cycles = 0"); sif0.ee.cycles = 1; } - + CPU_SET_DMASTALL(DMAC_SIF0, false); CPU_INT(DMAC_SIF0, sif0.ee.cycles*BIAS); } @@ -366,17 +366,18 @@ __fi void dmaSIF0() psHu32(SBUS_F240) |= 0x2000; sif0.ee.busy = true; - // Okay, this here is needed currently (r3644). + // Okay, this here is needed currently (r3644). // FFX battles in the thunder plains map die otherwise, Phantasy Star 4 as well // These 2 games could be made playable again by increasing the time the EE or the IOP run, // showing that this is very timing sensible. // Doing this DMA unfortunately brings back an old warning in Legend of Legaia though, but it still works. - //Updated 23/08/2011: The hangs are caused by the EE suspending SIF1 DMA and restarting it when in the middle + //Updated 23/08/2011: The hangs are caused by the EE suspending SIF1 DMA and restarting it when in the middle //of processing a "REFE" tag, so the hangs can be solved by forcing the ee.end to be false // (as it should always be at the beginning of a DMA). using "if iop is busy" flags breaks Tom Clancy Rainbow Six. // Legend of Legaia doesn't throw a warning either :) sif0.ee.end = false; + CPU_SET_DMASTALL(DMAC_SIF0, false); SIF0Dma(); } diff --git a/pcsx2/Sif1.cpp b/pcsx2/Sif1.cpp index b0cf750489..4f76849646 100644 --- a/pcsx2/Sif1.cpp +++ b/pcsx2/Sif1.cpp @@ -128,7 +128,7 @@ static __fi bool SIFIOPReadTag() // Only use the first 24 bits. hw_dma10.madr = sif1data & 0xffffff; - + if (sif1words > 0xFFFFC) DevCon.Warning("SIF1 Overrun %x", sif1words); //Maximum transfer amount 1mb-16 also masking out top part which is a "Mode" cache stuff, we don't care :) sif1.iop.counter = sif1words & 0xFFFFC; @@ -154,7 +154,7 @@ static __fi void EndEE() sif1.ee.cycles = 1; } - + CPU_SET_DMASTALL(DMAC_SIF1, false); CPU_INT(DMAC_SIF1, /*std::min((int)(*/sif1.ee.cycles*BIAS/*), 384)*/); } @@ -225,6 +225,7 @@ static __fi void HandleEETransfer() { hwDmacIrq(DMAC_STALL_SIS); sif1_dma_stall = true; + CPU_SET_DMASTALL(DMAC_SIF1, true); return; } } @@ -341,14 +342,14 @@ __fi void dmaSIF1() psHu32(SBUS_F240) |= 0x4000; sif1.ee.busy = true; - - // Okay, this here is needed currently (r3644). + CPU_SET_DMASTALL(DMAC_SIF1, false); + // Okay, this here is needed currently (r3644). // FFX battles in the thunder plains map die otherwise, Phantasy Star 4 as well // These 2 games could be made playable again by increasing the time the EE or the IOP run, // showing that this is very timing sensible. // Doing this DMA unfortunately brings back an old warning in Legend of Legaia though, but it still works. - //Updated 23/08/2011: The hangs are caused by the EE suspending SIF1 DMA and restarting it when in the middle + //Updated 23/08/2011: The hangs are caused by the EE suspending SIF1 DMA and restarting it when in the middle //of processing a "REFE" tag, so the hangs can be solved by forcing the ee.end to be false // (as it should always be at the beginning of a DMA). using "if iop is busy" flags breaks Tom Clancy Rainbow Six. // Legend of Legaia doesn't throw a warning either :) @@ -360,7 +361,7 @@ __fi void dmaSIF1() { sif1.ee.end = true; } - } + } SIF1Dma(); diff --git a/pcsx2/SingleRegisterTypes.h b/pcsx2/SingleRegisterTypes.h index 4fb4b70c96..c5e4a912e7 100644 --- a/pcsx2/SingleRegisterTypes.h +++ b/pcsx2/SingleRegisterTypes.h @@ -21,58 +21,46 @@ #pragma once +#include #include +#include + // Can't stick them in structs because it breaks calling convention things, yay -using r64 = __m128i; using r128 = __m128i; // Calling convention setting, yay -#define RETURNS_R64 r64 __vectorcall #define RETURNS_R128 r128 __vectorcall -#define TAKES_R64 __vectorcall #define TAKES_R128 __vectorcall // And since we can't stick them in structs, we get lots of static methods, yay! - -__forceinline static r64 r64_load(const void* ptr) -{ - return _mm_loadl_epi64(reinterpret_cast(ptr)); -} - -__forceinline static r64 r64_zero() -{ - return _mm_setzero_si128(); -} - -__forceinline static r64 r64_from_u32(u32 val) -{ - return _mm_cvtsi32_si128(val); -} - -__forceinline static r64 r64_from_u32x2(u32 lo, u32 hi) -{ - return _mm_unpacklo_epi32(_mm_cvtsi32_si128(lo), _mm_cvtsi32_si128(hi)); -} - -__forceinline static r64 r64_from_u64(u64 val) -{ - return _mm_cvtsi64_si128(val); -} - __forceinline static r128 r128_load(const void* ptr) { return _mm_load_si128(reinterpret_cast(ptr)); } +__forceinline static void r128_store(void* ptr, r128 val) +{ + return _mm_store_si128(reinterpret_cast(ptr), val); +} + +__forceinline static void r128_store_unaligned(void* ptr, r128 val) +{ + return _mm_storeu_si128(reinterpret_cast(ptr), val); +} + __forceinline static r128 r128_zero() { return _mm_setzero_si128(); } /// Expects that r64 came from r64-handling code, and not from a recompiler or something -__forceinline static r128 r128_from_r64_clean(r64 val) +__forceinline static r128 r128_from_u64_dup(u64 val) { - return val; + return _mm_set1_epi64x(val); +} +__forceinline static r128 r128_from_u64_zext(u64 val) +{ + return _mm_set_epi64x(0, val); } __forceinline static r128 r128_from_u32x4(u32 lo0, u32 lo1, u32 hi0, u32 hi1) @@ -80,17 +68,31 @@ __forceinline static r128 r128_from_u32x4(u32 lo0, u32 lo1, u32 hi0, u32 hi1) return _mm_setr_epi32(lo0, lo1, hi0, hi1); } +__forceinline static r128 r128_from_u128(const u128& u) +{ + return _mm_loadu_si128(reinterpret_cast(&u)); +} + +__forceinline static u32 r128_to_u32(r128 val) +{ + return _mm_cvtsi128_si32(val); +} + +__forceinline static u64 r128_to_u64(r128 val) +{ + return _mm_cvtsi128_si64(val); +} + +__forceinline static u128 r128_to_u128(r128 val) +{ + alignas(16) u128 ret; + _mm_store_si128(reinterpret_cast(&ret), val); + return ret; +} + template struct rhelper; -template <> -struct rhelper -{ - using r = r64; - __forceinline static r load(void* ptr) { return r64_load(ptr); } - __forceinline static r zero() { return r64_zero(); } -}; - template <> struct rhelper { diff --git a/pcsx2/Sio.cpp b/pcsx2/Sio.cpp index 6c0c2e686b..2ebe687f11 100644 --- a/pcsx2/Sio.cpp +++ b/pcsx2/Sio.cpp @@ -1,5 +1,5 @@ /* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2010 PCSX2 Dev Team + * Copyright (C) 2002-2022 PCSX2 Dev Team * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- @@ -20,67 +20,30 @@ #include "Common.h" #include "Sio.h" -#include "sio_internal.h" +#include "MemoryCardProtocol.h" +#include "MultitapProtocol.h" +#include "Config.h" #include "PAD/Gamepad.h" #include "common/Timer.h" #include "Recording/InputRecording.h" +#include "IconsFontAwesome5.h" +#define SIO0LOG_ENABLE 0 +#define SIO2LOG_ENABLE 0 + +#define Sio0Log if (SIO0LOG_ENABLE) DevCon +#define Sio2Log if (SIO2LOG_ENABLE) DevCon + +std::deque fifoIn; +std::deque fifoOut; + +Sio0 sio0; +Sio2 sio2; -_sio sio; _mcd mcds[2][4]; _mcd *mcd; -SIO_MODE siomode = SIO_START; -static void sioWrite8inl(u8 data); -#define SIO_WRITE void inline -#define SIO_FORCEINLINE __fi - -// Magic psx values from nocash info -static const u8 memcard_psx[] = {0x5A, 0x5D, 0x5C, 0x5D, 0x04, 0x00, 0x00, 0x80}; - -// Memory Card Specs for standard Sony 8mb carts: -// Flags (magic sio '+' thingie!), Sector size, eraseBlockSize (in pages), card size (in pages), xor checksum (superblock?), terminator (unused?). -// FIXME variable commented out since it's not used atm. -// static const mc_command_0x26_tag mc_sizeinfo_8mb= {'+', 512, 16, 0x4000, 0x52, 0x5A}; - -// Ejection timeout management belongs in MemoryCardFile -// -//Reinsert the card after auto-eject: after max tries or after min tries + XXX milliseconds, whichever comes first. -//E.g. if the game polls the card 100 times/sec and max tries=100, then after 1 second it will see the card as inserted (ms timeout not reached). -//E.g. if the game polls the card 1 time/sec, then it will see the card ejected 4 times, and on the 5th it will see it as inserted (4 secs from the initial access). -//(A 'try' in this context is the game accessing SIO) -static const int FORCED_MCD_EJECTION_MIN_TRIES =2; -static const int FORCED_MCD_EJECTION_MAX_TRIES =128; -static const float FORCED_MCD_EJECTION_MAX_MS_AFTER_MIN_TRIES =2800; - -//allow timeout also for the mcd manager panel -void SetForceMcdEjectTimeoutNow( uint port, uint slot ) -{ - mcds[port][slot].ForceEjection_Timeout = FORCED_MCD_EJECTION_MAX_TRIES; -} -void SetForceMcdEjectTimeoutNow() -{ - for ( uint port = 0; port < 2; ++port ) { - for ( uint slot = 0; slot < 4; ++slot ) { - SetForceMcdEjectTimeoutNow( port, slot ); - } - } -} - -void ClearMcdEjectTimeoutNow( uint port, uint slot ) -{ - mcds[port][slot].ForceEjection_Timeout = 0; -} -void ClearMcdEjectTimeoutNow() -{ - for ( uint port = 0; port < 2; ++port ) { - for ( uint slot = 0; slot < 4; ++slot ) { - ClearMcdEjectTimeoutNow( port, slot ); - } - } -} - // Currently only check if pad wants mtap to be active. // Could lets PCSX2 have its own options, if anyone ever // wants to add support for using the extra memcard slots. @@ -89,910 +52,785 @@ static bool IsMtapPresent( uint port ) return EmuConfig.MultitapEnabled( port ); } -void sioInit() -{ - memzero(sio); +// ============================================================================ +// SIO0 +// ============================================================================ - sio.bufSize = 4; - siomode = SIO_START; - - for(int i = 0; i < 2; i++) +void Sio0::ClearStatAcknowledge() +{ + stat &= ~(SIO0_STAT::ACK); +} + +Sio0::Sio0() +{ + this->FullReset(); +} + +Sio0::~Sio0() = default; + +void Sio0::SoftReset() +{ + padStarted = false; + sioMode = SioMode::NOT_SET; + sioCommand = 0; + sioStage = SioStage::IDLE; +} + +void Sio0::FullReset() +{ + SoftReset(); + + port = 0; + slot = 0; + + for (int i = 0; i < 2; i++) { - for(int j = 0; j < 4; j++) + for (int j = 0; j < 4; j++) { mcds[i][j].term = 0x55; mcds[i][j].port = i; mcds[i][j].slot = j; mcds[i][j].FLAG = 0x08; - mcds[i][j].ForceEjection_Timeout = 0; + mcds[i][j].autoEjectTicks = 0; } - - sio.slot[i] = 0; } - sio.port = 0; mcd = &mcds[0][0]; - - // Transfer(?) Ready and the Buffer is Empty - sio.StatReg = TX_RDY | TX_EMPTY; - sio.packetsize = 0; } -bool isR3000ATest = false; - -// Check the active game's type, and fire the matching interrupt. -// The 3rd bit of the HW_IFCG register lets us know if PSX mode is active. 1 = PSX, 0 = PS2 -// Note that the R3000A's call to interrupts only calls the PS2 based (lack of) delays. -SIO_FORCEINLINE void sioInterrupt() { - if ((psxHu32(HW_ICFG) & (1 << 3)) && !isR3000ATest) { - if (!(psxRegs.interrupt & (1 << IopEvt_SIO))) - PSX_INT(IopEvt_SIO, 64); // PSXCLK/250000); - } else { - PAD_LOG("Sio Interrupt"); - sio.StatReg |= IRQ; - iopIntcIrq(7); //Should this be used instead of the one below? - //psxHu32(0x1070)|=0x80; - } - - isR3000ATest = false; -} - -// An offhand way for the R3000A to access the sioInterrupt function. -// Following the design of the old preprocessor system, the R3000A should -// never call the PSX delays (oddly enough), and only the PS2. So we need -// an extra layer here to help control that. -__fi void sioInterruptR() { - isR3000ATest = true; - sioInterrupt(); -} - -SIO_WRITE sioWriteStart(u8 data) +// Simulates the ACK line on the bus. Peripherals are expected to send an ACK signal +// over this line to tell the PS1 "keep sending me things I'm not done yet". The PS1 +// then uses this after it receives the peripheral's response to decide what to do. +void Sio0::Acknowledge() { - u32 sioreg = sio2.packet.sendArray3[sio2.cmdport ? (sio2.cmdport - 1) : 0]; + stat |= SIO0_STAT::ACK; +} - //u16 size1 = (sioreg >> 8) & 0x1FF; - u16 size2 = (sioreg >> 18) & 0x1FF; - - //if(size1 != size2) - // DevCon.Warning("SIO: Bad command length [%02X] (%02X|%02X)", data, size1, size2); +void Sio0::Interrupt(Sio0Interrupt sio0Interrupt) +{ + switch (sio0Interrupt) + { + case Sio0Interrupt::TEST_EVENT: + iopIntcIrq(7); + break; + case Sio0Interrupt::STAT_READ: + ClearStatAcknowledge(); + break; + case Sio0Interrupt::TX_DATA_WRITE: + break; + default: + Console.Error("%s(%d) Invalid parameter", __FUNCTION__, sio0Interrupt); + assert(false); + break; + } - // On mismatch, sio2.cmdlength (size1) is smaller than what it should (Persona 3) - // while size2 is the proper length. -KrossX - sio.bufSize = size2; //std::max(size1, size2); - - if(sio.bufSize) - sio.bufSize--; - - switch(data) + if (!(psxRegs.interrupt & (1 << IopEvt_SIO))) { - case 0x01: siomode = SIO_CONTROLLER; break; - case 0x21: siomode = SIO_MULTITAP; break; - case 0x61: siomode = SIO_INFRARED; break; - case 0x81: siomode = SIO_MEMCARD; break; - - default: - DevCon.Warning("%s cmd: %02X??", __FUNCTION__, data); - DEVICE_UNPLUGGED(); - siomode = SIO_DUMMY; - break; + PSX_INT(IopEvt_SIO, PSXCLK / 250000); // PSXCLK/250000); } - - sioWrite8inl(data); } -int byteCnt = 0; - -//This is only for digital pad! .... a fast hacky fix for testing -//#define IS_LAST_BYTE_IN_PACKET ((byteCnt >= 3) ? 1 : 0) -//this should be done on the last byte, but it works like this fine for now... How does one know which number is the last byte anyway (or are there any more following it). -//maybe in the end a small LUT will be necessary that has the number of bytes for each command... -//On the real PS1, if the controller doesn't supply an /ACK signal after each byte but the last, the transmission falls through... but it seems it is actually the interrupt -//what 'continues' a transfer. -//On the real PS1, asserting /ACK after the last byte would cause the transfer to fail. -#define IS_LAST_BYTE_IN_PACKET ((sio.bufCount >= 3) ? 1 : 0) - -SIO_WRITE sioWriteController(u8 data) +u8 Sio0::GetTxData() { - //if (data == 0x01) byteCnt = 0; - switch(sio.bufCount) - { - case 0: - byteCnt = 0; //hope this gets only cleared on the first byte... - SIO_STAT_READY(); - DEVICE_PLUGGED(); - sio.buf[0] = PADstartPoll(sio.port + 1); - break; - - default: - sio.buf[sio.bufCount] = PADpoll(data); - if (EmuConfig.EnableRecordingTools) - { - // Only examine controllers 1 / 2 - if (sio.slot[sio.port] == 0 || sio.slot[sio.port] == 1) - { - g_InputRecording.ControllerInterrupt(data, sio.port, sio.bufCount, sio.buf); - } - } - break; - } - //Console.WriteLn( "SIO: sent = %02X From pad data = %02X bufCnt %08X ", data, sio.buf[sio.bufCount], sio.bufCount); - sioInterrupt(); //Don't all commands(transfers) cause an interrupt? + Sio0Log.WriteLn("%s() SIO0 TX_DATA Read (%02X)", __FUNCTION__, txData); + return txData; } -SIO_WRITE sioWriteMultitap(u8 data) +u8 Sio0::GetRxData() { - static u8 siocmd = 0; - //sio.packetsize++; - - switch(sio.bufCount) - { - case 0: - if(IsMtapPresent(sio.port)) - { - SIO_STAT_READY(); - DEVICE_PLUGGED(); - sio.buf[0] = 0xFF; - sio.buf[1] = 0x80; - sio.buf[2] = 0x5A; - } - else - { - DEVICE_UNPLUGGED(); - sio.buf[0] = 0x00; - siomode = SIO_DUMMY; - } - break; - - case 1: - siocmd = data; - switch(data) - { - case 0x12: // Pads supported /// slots supported, port 0,1 - case 0x13: // Memcards supported //// slots supported, port 2,3 - sio.buf[3] = 0x04; - sio.buf[4] = 0x00; - sio.buf[5] = 0x5A; // 0x66 here, disables the thing. - //sio.bufSize = 5; - break; - - case 0x21: // Select pad - case 0x22: // Select memcard - sio.buf[3] = 0x00; - sio.buf[4] = 0x00; - sio.buf[5] = 0x00; - sio.buf[6] = 0x5A; - //sio.bufSize = 6; - break; - - default: - DevCon.Warning("%s cmd: %02X??", __FUNCTION__, data); - sio.buf[3] = 0x00; - sio.buf[4] = 0x00; - sio.buf[5] = 0x00; - sio.buf[6] = 0x00; - break; - - } - break; - - case 2: // Respond to 0x21/0x22 with requested port - switch(siocmd) - { - case 0x21: - { - sio.slot[sio.port] = data; - - u32 ret = PADsetSlot(sio.port+1, data+1); - sio.buf[5] = ret? data : 0xFF; - sio.buf[6] = ret? 0x5A : 0x66; - } - break; - - case 0x22: - { - sio.slot[sio.port] = data; - sio.buf[5] = data; - } - break; - } - break; - - case 3: break; - case 5: break; - case 6: break; - - //default: sio.buf[sio.bufCount] = 0x00; break; - } - - sioInterrupt(); + Sio0Log.WriteLn("%s() SIO0 RX_DATA Read (%02X)", __FUNCTION__, rxData); + stat |= (SIO0_STAT::TX_READY | SIO0_STAT::TX_EMPTY); + stat &= ~(SIO0_STAT::RX_FIFO_NOT_EMPTY); + return rxData; } -SIO_WRITE MemcardResponse() +u32 Sio0::GetStat() { - if(sio.bufSize > 1) - { - sio.buf[sio.bufSize - 1] = 0x2B; - sio.buf[sio.bufSize - 0] = mcd->term; - } -} - -SIO_WRITE memcardAuth(u8 data) -{ - static bool doXorCheck = false; - static u8 xorResult = 0; - - if(sio.bufCount == 2) - { - switch(data) - { - case 0x01: case 0x02: case 0x04: - case 0x0F: case 0x11: case 0x13: - doXorCheck = true; - xorResult = 0; - sio.buf[3] = 0x2B; - sio.buf[sio.bufSize] = mcd->term; - break; - - default: - doXorCheck = false; - MemcardResponse(); - break; - } - } - else if(doXorCheck) - { - switch(sio.bufCount) - { - case 3: break; - case 12: sio.buf[12] = xorResult; break; - default: xorResult ^= data; break; - }; - } -} - -SIO_WRITE memcardErase(u8 data) -{ - switch(sio.bufCount) - { - case 0: - if(data != 0x81) sio.bufCount = -1; - break; - - case 1: - { - u8 header[] = {0xFF, 0xFF, 0xFF, 0x2B, mcd->term}; - - switch(data) - { - case 0x82: // Erase - //siomode = SIO_DUMMY; // Nothing more to do here. - memcpy(sio.buf, &header[1], 4); - sio.bufSize = 3; - mcd->EraseBlock(); - break; - - default: - DevCon.Warning("%s cmd: %02X??", __FUNCTION__, data); - sio.bufCount = -1; - //sio.bufSize = 3; - //sio.bufCount = 4; - break; - } - } - sioInterrupt(); - break; - - default: - if(sio.bufCount > sio.bufSize) - { - if(data == 0x81) - { - SIO_STAT_READY(); - sio.bufCount = 0x00; - } - } - break; - } -} - -SIO_WRITE memcardWrite(u8 data) -{ - static u8 checksum_pos = 0; - static u8 transfer_size = 0; - static bool once = false; - - switch(sio.bufCount) - { - case 0: - if(data != 0x81) sio.bufCount = -1; - break; - - case 1: - { - u8 header[] = {0xFF, 0xFF, 0xFF, 0x2B, mcd->term}; - - switch(data) - { - case 0x42: // Write - memcpy(sio.buf, header, 4); - once = true; - break; - - case 0x81: // Commit - if(once) - { - siomode = SIO_DUMMY; // Nothing more to do here. - memcpy(sio.buf, &header[1], 4); - sio.bufSize = 3; - - sio2.packet.recvVal1 = 0x1600; // Writing - sio2.packet.recvVal3 = 0x8C; - - once = false; - break; - } - [[fallthrough]]; - - default: - DevCon.Warning("%s cmd: %02X??", __FUNCTION__, data); - sio.bufCount = -1; - //sio.bufSize = 3; - //sio.bufCount = 4; - break; - } - - } - sioInterrupt(); - break; - - case 2: - transfer_size = data; - - // Note: coverity wrongly detects a buffer overflow. Because data + 5 could be > 512... - // So let's add a mask-nop to avoid various useless reports. - sio.buf[(data & 0xFF) + 5] = mcd->term; - sio.bufSize = data + 5; - checksum_pos = data + 4; - break; - - default: - - if(sio.bufCount < checksum_pos) - { - sio.buf[sio.bufCount+1] = data; - } - else if(sio.bufCount == checksum_pos) - { - u8 xor_check = mcd->DoXor(&sio.buf[4], checksum_pos - 4); - - if(xor_check != sio.buf[sio.bufCount]) - Console.Warning("MemWrite: Checksum invalid! XOR: %02X, IN: %02X\n", xor_check, sio.buf[sio.bufCount]); - - sio.buf[sio.bufCount] = xor_check; - mcd->Write(&sio.buf[4], transfer_size); - mcd->transferAddr += transfer_size; - } - - if(sio.bufCount > sio.bufSize) - { - if(data == 0x81) - { - SIO_STAT_READY(); - sio.bufCount = 0x00; - } - } - break; - } -} - -SIO_WRITE memcardRead(u8 data) -{ - /*static u8 checksum_pos = 0;*/ - // psxmode: check if memcard reads need checksum_pos as well as writes (function above!) - static u8 transfer_size = 0; - static bool once = false; - - switch(sio.bufCount) - { - case 0: - if(data != 0x81) sio.bufCount = -1; - break; - - case 1: - { - u8 header[] = {0xFF, 0xFF, 0xFF, 0x2B, mcd->term}; - - switch(data) - { - case 0x43: // Read - memcpy(sio.buf, header, 4); - once = true; - break; - - case 0x81: // Commit - if(once) - { - siomode = SIO_DUMMY; // Nothing more to do here. - memcpy(sio.buf, &header[1], 4); - sio.bufSize = 3; - - sio2.packet.recvVal1 = 0x1700; // Reading - sio2.packet.recvVal3 = 0x8C; - - once = false; - break; - } - [[fallthrough]]; - - default: - DevCon.Warning("%s cmd: %02X??", __FUNCTION__, data); - sio.bufCount = -1; - //sio.bufSize = 3; - //sio.bufCount = 4; - break; - } - } - sioInterrupt(); - break; - - case 2: - transfer_size = data; - - mcd->Read(&sio.buf[4], transfer_size); - mcd->transferAddr += transfer_size; - - sio.buf[transfer_size + 4] = mcd->DoXor(&sio.buf[4], transfer_size); - sio.buf[transfer_size + 5] = mcd->term; - sio.bufSize = transfer_size + 5; - break; - - default: - if(sio.bufCount > sio.bufSize) - { - if(data == 0x81) - { - SIO_STAT_READY(); - sio.bufCount = 0x00; - } - } - break; - } -} - - -SIO_WRITE memcardSector(u8 data) -{ - static u8 xor_check = 0; - - switch(sio.bufCount) - { - case 2: mcd->sectorAddr = data << 0; xor_check = data; break; - case 3: mcd->sectorAddr |= data << 8; xor_check ^= data; break; - case 4: mcd->sectorAddr |= data << 16; xor_check ^= data; break; - case 5: mcd->sectorAddr |= data << 24; xor_check ^= data; break; - case 6: mcd->goodSector = data == xor_check; break; - case 8: mcd->transferAddr = (512+16) * mcd->sectorAddr; break; - case 9: - { - switch(sio.cmd) - { - case 0x21: siomode = SIO_MEMCARD_ERASE; break; - case 0x22: siomode = SIO_MEMCARD_WRITE; break; - case 0x23: siomode = SIO_MEMCARD_READ; break; - } - - memset8<0xFF>(sio.buf); - sio.bufCount = -1; - } - } -} - -SIO_WRITE memcardInit() -{ - mcd = &mcds[sio.GetPort()][sio.GetSlot()]; - - // forced ejection logic. Technically belongs in the McdIsPresent handler. - - bool forceEject = false; - - if(mcd->ForceEjection_Timeout) - { - if(mcd->ForceEjection_Timeout == FORCED_MCD_EJECTION_MAX_TRIES && mcd->IsPresent()) - Console.WriteLn( Color_Green, "Auto-ejecting memcard [port:%d, slot:%d]", sio.GetPort(), sio.GetSlot()); - - mcd->ForceEjection_Timeout--; - forceEject = true; - - u32 numTimesAccessed = FORCED_MCD_EJECTION_MAX_TRIES - mcd->ForceEjection_Timeout; - - //minimum tries reached. start counting millisec timeout. - if(numTimesAccessed == FORCED_MCD_EJECTION_MIN_TRIES) - mcd->ForceEjection_Timestamp = Common::Timer::GetCurrentValue(); - - if(numTimesAccessed > FORCED_MCD_EJECTION_MIN_TRIES) - { - if(Common::Timer::ConvertValueToMilliseconds(Common::Timer::GetCurrentValue() - mcd->ForceEjection_Timestamp) >= FORCED_MCD_EJECTION_MAX_MS_AFTER_MIN_TRIES) - { - DevCon.Warning( "Auto-eject: Timeout reached after mcd was accessed %d times [port:%d, slot:%d]", numTimesAccessed, sio.GetPort(), sio.GetSlot()); - mcd->ForceEjection_Timeout = 0; //Done. on next sio access the card will be seen as inserted. - } - } - - if(mcd->ForceEjection_Timeout == 0 && mcd->IsPresent()) - Console.WriteLn( Color_Green, "Re-inserting auto-ejected memcard [port:%d, slot:%d]", sio.GetPort(), sio.GetSlot()); - } - - if(!forceEject && mcd->IsPresent()) - { - DEVICE_PLUGGED(); - siomode = mcd->IsPSX() ? SIO_MEMCARD_PSX : SIO_MEMCARD; - } - else - { - DEVICE_UNPLUGGED(); - siomode = SIO_DUMMY; - } - - -} - -SIO_WRITE sioWriteMemcard(u8 data) -{ - switch(sio.bufCount) - { - case 0: - SIO_STAT_READY(); - memcardInit(); - sioInterrupt(); - break; - - case 1: - sio.cmd = data; - switch(data) - { - case 0x21: // SET_SECTOR_ERASE - case 0x22: // SET_SECTOR_WRITE - case 0x23: // SET_SECTOR_READ - sio2.packet.recvVal3 = 0x8C; - MemcardResponse(); - siomode = SIO_MEMCARD_SECTOR; - break; - - case 0x26: // GET_SPECS ? - { - sio2.packet.recvVal3 = 0x83; - - mc_command_0x26_tag cmd; - McdSizeInfo info; - - mcd->GetSizeInfo(info); - - cmd.field_151 = 0x2B; - cmd.sectorSize = info.SectorSize; - cmd.eraseBlocks = info.EraseBlockSizeInSectors; - cmd.mcdSizeInSectors = info.McdSizeInSectors; - cmd.mc_xor = info.Xor; - cmd.Z = mcd->term; - - memcpy(&sio.buf[2], &cmd, sizeof(mc_command_0x26_tag)); - } - break; - - case 0x27: // SET_TERMINATOR - sio2.packet.recvVal3 = 0x8B; - break; - - case 0x28: // GET_TERMINATOR - sio2.packet.recvVal3 = 0x8B; - sio.buf[2] = 0x2B; - sio.buf[3] = mcd->term; - sio.buf[4] = 0x55; // 0x55 or 0xFF ? - break; - - // If the PS2 commands fail, it falls back into PSX mode - case 0x52: // PSX 'R'ead - case 0x53: // PSX 'S'tate - case 0x57: // PSX 'W'rite - case 0x58: // PSX Pocketstation - siomode = SIO_DUMMY; - break; - - case 0xF0: // Auth stuff - siomode = SIO_MEMCARD_AUTH; - break; - - case 0x11: // On Boot/Probe - case 0x12: // On Write/Delete/Recheck? - sio2.packet.recvVal3 = 0x8C; - [[fallthrough]]; - - case 0x81: // Checked right after copy/delete - case 0xBF: // Wtf?? On game booting? - case 0xF3: // Reset? - case 0xF7: // No idea - MemcardResponse(); - siomode = SIO_DUMMY; - break; - - default: - DevCon.Warning("%s cmd: %02X??", __FUNCTION__, data); - siomode = SIO_DUMMY; - break; - } - sioInterrupt(); - break; - - case 2: - switch(sio.cmd) - { - case 0x27: // SET_TERMINATOR - mcd->term = data; - MemcardResponse(); - break; - } - break; - } -} - -SIO_WRITE sioWriteMemcardPSX(u8 data) -{ - switch(sio.bufCount) - { - case 0: // Same init stuff... - SIO_STAT_READY(); - memcardInit(); - sioInterrupt(); - break; - - case 1: - sio.cmd = data; - switch(data) - { - case 0x53: // PSX 'S'tate // haven't seen it happen yet - sio.buf[1] = mcd->FLAG; - memcpy(&sio.buf[2], memcard_psx, 8); - siomode = SIO_DUMMY; - break; - - case 0x52: // PSX 'R'ead / Probe - case 0x57: // PSX 'W'rite - case 0x58: // POCKETSTATION!! Grrrr // Lots of love to the PS2DEV/ps2sdk - sio.buf[1] = 0x00; //mcd->FLAG; - sio.buf[2] = 0x5A; // probe end, success "0x5A" - sio.buf[3] = 0x5D; - sio.buf[4] = 0x00; - break; - // Old handing for Pocketstation, effectively discarded the calls. - // Keeping it around for reference. - //case 0x58: // POCKETSTATION!! Grrrr // Lots of love to the PS2DEV/ps2sdk - // DEVICE_UNPLUGGED(); // Check is for 0x01000 on stat - // siomode = SIO_DUMMY; - // break; - - default: - //printf("%s cmd: %02X??\n", __FUNCTION__, data); - siomode = SIO_DUMMY; - break; - } - sioInterrupt(); - break; - - case 2: break; - case 3: break; - - case 4: - sio.buf[5] = data; - mcd->sectorAddr = data << 8; - break; - - case 5: - sio.buf[6] = data; - mcd->sectorAddr |= data; - mcd->goodSector = !(mcd->sectorAddr > 0x3FF); - mcd->transferAddr = 128 * mcd->sectorAddr; - break; - - case 6: - if(sio.cmd == 0x52) - { - // READ - - if(!mcd->goodSector) - { - memset8<0xFF>(sio.buf); - siomode = SIO_DUMMY; - } - else - { - sio.buf[8] = sio.buf[5]; - sio.buf[9] = sio.buf[6]; - sio.buf[6] = 0x5C; - sio.buf[7] = 0x5D; - - mcd->Read(&sio.buf[10], 0x80); - - sio.buf[138] = mcd->DoXor(&sio.buf[8], 0x80 + 2); - sio.buf[139] = 0x47; - siomode = SIO_DUMMY; - } - } - else - { - sio.buf[sio.bufCount+1] = data; - } - break; - - default: - // WRITE - - sio.buf[sio.bufCount+1] = data; - - if(sio.bufCount == 134) - { - u8 xorcheck = mcd->DoXor(&sio.buf[5], 0x80+2); - - sio.buf[135] = 0x5C; - sio.buf[136] = 0x5D; - - // (47h=Good, 4Eh=BadChecksum, FFh=BadSector) - sio.buf[137] = data == xorcheck ? 0x47 : 0x4E; - if(!mcd->goodSector) sio.buf[137] = 0xFF; - else mcd->Write(&sio.buf[7], 0x80); - siomode = SIO_DUMMY; - } - break; - } -} - -SIO_WRITE sioWriteInfraRed(u8 data) -{ - SIO_STAT_READY(); - DEVICE_PLUGGED(); - siomode = SIO_DUMMY; - sioInterrupt(); -} - -//This bit-field in the STATUS register contains the (inveted) state of the /ACK linre from the Controller / MC. -//1 = /ACK_line_active_low -//Should go into Sio.h -#define ACK_INP 0x80 - -//This is named RESET_ERR in sio_internal.h. -#define CLR_INTR 0x0010 -//Set the ammount of received bytes that triggers an interrupt. -//0=1, 1=2, 2=4, 3=8 receivedBytesIntTriger = 1<< ((ctrl & RX_BYTES_INT) >>8) -#define RX_BYTES_INT 0x0300 -//Enable interrupt on TX ready and TX empty -#define TX_INT_EN 0x0400 -//Trigger interrupt after receiving several (see above) bytes. -#define RX_INT_EN 0x0800 -//Controll register: Enable the /ACK line trigerring the interrupt. -#define ACK_INT_EN 0x1000 -//Selects slot 1 or 2 -#define SLOT_NR 0x2000 - -void chkTriggerInt() { - //Conditions for triggerring an interrupt. - //this is not correct, but ... it can be fixed later - sioInterrupt(); return; - if ((sio.StatReg & IRQ)) { sioInterrupt(); return; } //The interrupt flag in the main INTR_STAT reg should go active on multiple occasions. Set it here for now (hack), until the correct mechanism is made. - if ((sio.CtrlReg & ACK_INT_EN) && ((sio.StatReg & TX_RDY) || (sio.StatReg & TX_EMPTY))) { sioInterrupt(); return; } - if ((sio.CtrlReg & ACK_INT_EN) && (sio.StatReg & ACK_INP)) { sioInterrupt(); return; } - //The following one may be incorrect. - //if ((sio.CtrlReg & RX_INT_EN) && ((byteCnt >= (1<< ((sio.CtrlReg & RX_BYTES_INT) >>8))) ? 1:0) ) { sioInterrupt(); return; } - return; -} - - -static void sioWrite8inl(u8 data) -{ -// Console.WriteLn( "SIO DATA write %02X mode %08X " , data, siomode); - switch(siomode) - { - case SIO_START: sioWriteStart(data); break; - case SIO_CONTROLLER: sioWriteController(data); break; - case SIO_MULTITAP: sioWriteMultitap(data); break; - case SIO_INFRARED: sioWriteInfraRed(data); break; - case SIO_MEMCARD: sioWriteMemcard(data); break; - case SIO_MEMCARD_AUTH: memcardAuth(data); break; - case SIO_MEMCARD_ERASE: memcardErase(data); break; - case SIO_MEMCARD_WRITE: memcardWrite(data); break; - case SIO_MEMCARD_READ: memcardRead(data); break; - case SIO_MEMCARD_SECTOR: memcardSector(data); break; - case SIO_MEMCARD_PSX: sioWriteMemcardPSX(data); break; - case SIO_DUMMY: break; - }; - sio.StatReg |= RX_RDY; //Why not set the byte-received flag, when for EVERY sent byte, one is received... it's just how SPI is... - sio.StatReg |= TX_EMPTY; //The current byte *has* been sent, so it is empty. - if (IS_LAST_BYTE_IN_PACKET != 1) //The following should be set after each byte transfer but the last one. - sio.StatReg |= ACK_INP; //Signal that Controller (or MC) has brought the /ACK (Acknowledge) line active low. - - sioInterrupt(); - //chkTriggerInt(); - //Console.WriteLn( "SIO0 WR DATA COMMON %02X INT_STAT= %08X IOPpc= %08X " , data, psxHu32(0x1070), psxRegs.pc); - byteCnt++; -} - -int clrAckCnt =0; - -void sioStatRead() { - -if (clrAckCnt > 1) { //This check can probably be removed... - sio.StatReg &= ~ACK_INP; //clear (goes inactive) /ACK line. - // sio.StatReg &= ~TX_RDY; - // sio.StatReg &= ~0x200; //irq - // if (byteCnt == 1) - // sio.StatReg &= ~RX_RDY; - clrAckCnt = 0; -} - //The /ACK line should go active for >2us, in a time window between 12us and 100us after each byte is sent (received by the controller). - //If that doesn't happen, the controller is considered missing. - //The /ACK line must NOT go active after the last byte in the transmission! (Otherwise some err. may happen - tested.) -if ((sio.StatReg & ACK_INP)) clrAckCnt++; - - chkTriggerInt(); - return; -} - -void sioWriteCtrl16(u16 value) -{ - static u8 tcount[2]; - -// Console.WriteLn( "SIO0 WR CTRL %02X IOPpc= %08X " , value, psxRegs.pc); - - tcount[sio.port] = sio.bufCount; - sio.port = (value >> 13) & 1; - - //printf("RegCtrl: %04X, %d\n", value, sio.bufCount); - - sio.CtrlReg = value & ~RESET_ERR; - if (value & RESET_ERR) sio.StatReg &= ~IRQ; - - if ((sio.CtrlReg & SIO_RESET) || (!sio.CtrlReg)) - { - siomode = SIO_START; - - tcount[0] = 0; - tcount[1] = 0; - - sio.StatReg = TX_RDY | TX_EMPTY; - psxRegs.interrupt &= ~(1<autoEjectTicks) + { + SetRxData(0x00); + mcd->autoEjectTicks--; + + if (mcd->autoEjectTicks == 0) + { + Host::AddKeyedFormattedOSDMessage( + StringUtil::StdStringFromFormat("AutoEjectSlotClear%u%u", port, slot), + 10.0f, + "Memory card in port %d / slot %d reinserted", + port + 1, + slot + 1); + } + + return; + } + + // If memcard is missing, not PS1, or auto ejected, do not let SIO0 stage advance, + // reply with dead air and no ACK. + if (!mcd->IsPresent() || !mcd->IsPSX()) + { + SetRxData(0x00); + return; + } + + Acknowledge(); + break; + } + + SetRxData(res); + sioStage = SioStage::WAITING_COMMAND; + break; + case SioStage::WAITING_COMMAND: + stat &= ~(SIO0_STAT::TX_READY); + + if (IsPadCommand(value)) + { + res = PADpoll(value); + SetRxData(res); + + if (!PADcomplete()) + { + Acknowledge(); + } + + sioStage = SioStage::WORKING; + } + else if (IsMemcardCommand(value)) + { + SetRxData(flag); + Acknowledge(); + sioCommand = value; + sioStage = SioStage::WORKING; + } + else if (IsPocketstationCommand(value)) + { + // Set the line low, no acknowledge. + SetRxData(0x00); + sioStage = SioStage::IDLE; + } + else + { + Console.Error("%s(%02X) Bad SIO command", __FUNCTION__, value); + SetRxData(0xff); + SoftReset(); + } + + break; + case SioStage::WORKING: + switch (sioMode) + { + case SioMode::PAD: + res = PADpoll(value); + SetRxData(res); + + if (!PADcomplete()) + { + Acknowledge(); + } + + break; + case SioMode::MEMCARD: + SetRxData(Memcard(value)); + break; + default: + Console.Error("%s(%02X) Unhandled SioMode: %02X", __FUNCTION__, value, sioMode); + SetRxData(0xff); + SoftReset(); + break; + } + + break; + default: + Console.Error("%s(%02X) Unhandled SioStage: %02X", __FUNCTION__, value, static_cast(sioStage)); + SetRxData(0xff); + SoftReset(); + break; + } + + Interrupt(Sio0Interrupt::TX_DATA_WRITE); +} + +void Sio0::SetRxData(u8 value) +{ + Sio0Log.WriteLn("%s(%02X) SIO0 RX_DATA Write", __FUNCTION__, value); + rxData = value; +} + +void Sio0::SetStat(u32 value) +{ + Sio0Log.Error("%s(%08X) SIO0 STAT Write", __FUNCTION__, value); +} + +void Sio0::SetMode(u16 value) +{ + Sio0Log.WriteLn("%s(%04X) SIO0 MODE Write", __FUNCTION__, value); + mode = value; +} + +void Sio0::SetCtrl(u16 value) +{ + Sio0Log.WriteLn("%s(%04X) SIO0 CTRL Write", __FUNCTION__, value); + ctrl = value; + port = (ctrl & SIO0_CTRL::PORT) > 0; + + // CTRL appears to be set to 0 between every "transaction". + // Not documented anywhere, but we'll use this to "reset" + // the SIO0 state, particularly during the annoying probes + // to memcards that occur when a game boots. + if (ctrl == 0) + { + g_MemoryCardProtocol.ResetPS1State(); + SoftReset(); + } + + // If CTRL acknowledge, reset STAT bits 3 and 9 + if (ctrl & SIO0_CTRL::ACK) + { + stat &= ~(SIO0_STAT::IRQ | SIO0_STAT::RX_PARITY_ERROR); + } + + if (ctrl & SIO0_CTRL::RESET) + { + stat = 0; + ctrl = 0; + mode = 0; + SoftReset(); + } +} + +void Sio0::SetBaud(u16 value) +{ + Sio0Log.WriteLn("%s(%04X) SIO0 BAUD Write", __FUNCTION__, value); + baud = value; +} + +bool Sio0::IsPadCommand(u8 command) +{ + return command >= PadCommand::UNK_0 && command <= PadCommand::ANALOG; +} + +bool Sio0::IsMemcardCommand(u8 command) +{ + return command == MemcardCommand::PS1_READ || command == MemcardCommand::PS1_STATE || command == MemcardCommand::PS1_WRITE; +} + +bool Sio0::IsPocketstationCommand(u8 command) +{ + return command == MemcardCommand::PS1_POCKETSTATION; +} + +u8 Sio0::Pad(u8 value) +{ + if (PADcomplete()) + { + padStarted = false; + } + else if (!padStarted) + { + padStarted = true; + PADstartPoll(port, slot); + Acknowledge(); + } + + return PADpoll(value); +} + +u8 Sio0::Memcard(u8 value) +{ + switch (sioCommand) + { + case MemcardCommand::PS1_READ: + return g_MemoryCardProtocol.PS1Read(value); + case MemcardCommand::PS1_STATE: + return g_MemoryCardProtocol.PS1State(value); + case MemcardCommand::PS1_WRITE: + return g_MemoryCardProtocol.PS1Write(value); + case MemcardCommand::PS1_POCKETSTATION: + return g_MemoryCardProtocol.PS1Pocketstation(value); + default: + Console.Error("%s(%02X) Unhandled memcard command (%02X)", __FUNCTION__, value, sioCommand); + SoftReset(); + break; + } + + return 0xff; +} + +// ============================================================================ +// SIO2 +// ============================================================================ + + +Sio2::Sio2() +{ + this->FullReset(); +} + +Sio2::~Sio2() = default; + +void Sio2::SoftReset() +{ + send3Read = false; + send3Position = 0; + commandLength = 0; + processedLength = 0; + // Clear dmaBlockSize, in case the next SIO2 command is not sent over DMA11. + dmaBlockSize = 0; + send3Complete = false; + + // Anything in fifoIn which was not necessary to consume should be cleared out prior to the next SIO2 cycle. + while (!fifoIn.empty()) + { + fifoIn.pop_front(); + } +} + +void Sio2::FullReset() +{ + this->SoftReset(); + + for (size_t i = 0; i < send3.size(); i++) + { + send3.at(i) = 0; + } + + for (size_t i = 0; i < send1.size(); i++) + { + send1.at(i) = 0; + send2.at(i) = 0; + } + + dataIn = 0; + dataOut = 0; + SetCtrl(Sio2Ctrl::SIO2MAN_RESET); + SetRecv1(Recv1::DISCONNECTED); + recv2 = Recv2::DEFAULT; + recv3 = Recv3::DEFAULT; + unknown1 = 0; + unknown2 = 0; + iStat = 0; + + port = 0; + slot = 0; + + while (!fifoOut.empty()) + { + fifoOut.pop_front(); + } + + for (int i = 0; i < 2; i++) + { + for (int j = 0; j < 4; j++) + { + mcds[i][j].term = 0x55; + mcds[i][j].port = i; + mcds[i][j].slot = j; + mcds[i][j].FLAG = 0x08; + mcds[i][j].autoEjectTicks = 0; + } + } + + mcd = &mcds[0][0]; +} + + +void Sio2::Interrupt() +{ + iopIntcIrq(17); +} + +void Sio2::SetCtrl(u32 value) +{ + this->ctrl = value; + + if (this->ctrl & Sio2Ctrl::START_TRANSFER) + { + Interrupt(); + } +} + +void Sio2::SetSend3(size_t position, u32 value) +{ + this->send3.at(position) = value; + + if (position == 0) + { + SoftReset(); + } +} + +void Sio2::SetRecv1(u32 value) +{ + this->recv1 = value; +} + +void Sio2::Pad() +{ + // Send PAD our current port, and get back whatever it says the first response byte should be. + const u8 firstResponseByte = PADstartPoll(port, slot); + fifoOut.push_back(firstResponseByte); + // Some games will refuse to read ALL pads, if RECV1 is not set to the CONNECTED value when ANY pad is polled, + // REGARDLESS of whether that pad is truly connected or not. + SetRecv1(Recv1::CONNECTED); + + // Then for every byte in fifoIn, pass to PAD and see what it kicks back to us. + while (!fifoIn.empty()) + { + const u8 commandByte = fifoIn.front(); + fifoIn.pop_front(); + const u8 responseByte = PADpoll(commandByte); + fifoOut.push_back(responseByte); + } +} + +void Sio2::Multitap() +{ + fifoOut.push_back(0x00); + + const bool multitapEnabled = (port == 0 && EmuConfig.MultitapPort0_Enabled) || (port == 1 && EmuConfig.MultitapPort1_Enabled); + SetRecv1(multitapEnabled ? Recv1::CONNECTED : Recv1::DISCONNECTED); + + if (multitapEnabled) + { + g_MultitapProtocol.SendToMultitap(); + } + else + { + while (fifoOut.size() < commandLength) + { + fifoOut.push_back(0x00); + } + } +} + +void Sio2::Infrared() +{ + SetRecv1(Recv1::DISCONNECTED); + + fifoIn.pop_front(); + const u8 responseByte = 0xff; + + while (fifoOut.size() < commandLength) + { + fifoOut.push_back(responseByte); + } +} + +void Sio2::Memcard() +{ + mcd = &mcds[port][slot]; + + // Check if auto ejection is active. If so, set RECV1 to DISCONNECTED, + // and zero out the fifo to simulate dead air over the wire. + if (mcd->autoEjectTicks) + { + SetRecv1(Recv1::DISCONNECTED); + fifoOut.push_back(0x00); // Because Sio2::Write pops the first fifoIn member + + while (!fifoIn.empty()) + { + fifoIn.pop_front(); + fifoOut.push_back(0x00); + } + + mcd->autoEjectTicks--; + + if (mcd->autoEjectTicks == 0) + { + Host::AddKeyedFormattedOSDMessage( + StringUtil::StdStringFromFormat("AutoEjectSlotClear%u%u", port, slot), + 10.0f, + "Memory card in port %d / slot %d reinserted", + port + 1, + slot + 1); + } + + return; + } + + SetRecv1(mcd->IsPresent() ? Recv1::CONNECTED : Recv1::DISCONNECTED); + + const u8 commandByte = fifoIn.front(); + fifoIn.pop_front(); + const u8 responseByte = mcd->IsPresent() ? 0x00 : 0xff; + fifoOut.push_back(responseByte); + // Technically, the FLAG byte is only for PS1 memcards. However, + // since this response byte is still a dud on PS2 memcards, we can + // basically just cheat and always make this our second response byte for memcards. + fifoOut.push_back(mcd->FLAG); + u8 ps1Input = 0; + u8 ps1Output = 0; + + switch (commandByte) + { + case MemcardCommand::PROBE: + g_MemoryCardProtocol.Probe(); + break; + case MemcardCommand::UNKNOWN_WRITE_DELETE_END: + g_MemoryCardProtocol.UnknownWriteDeleteEnd(); + break; + case MemcardCommand::SET_ERASE_SECTOR: + case MemcardCommand::SET_WRITE_SECTOR: + case MemcardCommand::SET_READ_SECTOR: + g_MemoryCardProtocol.SetSector(); + break; + case MemcardCommand::GET_SPECS: + g_MemoryCardProtocol.GetSpecs(); + break; + case MemcardCommand::SET_TERMINATOR: + g_MemoryCardProtocol.SetTerminator(); + break; + case MemcardCommand::GET_TERMINATOR: + g_MemoryCardProtocol.GetTerminator(); + break; + case MemcardCommand::WRITE_DATA: + g_MemoryCardProtocol.WriteData(); + break; + case MemcardCommand::READ_DATA: + g_MemoryCardProtocol.ReadData(); + break; + case MemcardCommand::PS1_READ: + g_MemoryCardProtocol.ResetPS1State(); + + while (!fifoIn.empty()) + { + ps1Input = fifoIn.front(); + ps1Output = g_MemoryCardProtocol.PS1Read(ps1Input); + fifoIn.pop_front(); + fifoOut.push_back(ps1Output); + } + + break; + case MemcardCommand::PS1_STATE: + g_MemoryCardProtocol.ResetPS1State(); + + while (!fifoIn.empty()) + { + ps1Input = fifoIn.front(); + ps1Output = g_MemoryCardProtocol.PS1State(ps1Input); + fifoIn.pop_front(); + fifoOut.push_back(ps1Output); + } + + break; + case MemcardCommand::PS1_WRITE: + g_MemoryCardProtocol.ResetPS1State(); + + while (!fifoIn.empty()) + { + ps1Input = fifoIn.front(); + ps1Output = g_MemoryCardProtocol.PS1Write(ps1Input); + fifoIn.pop_front(); + fifoOut.push_back(ps1Output); + } + + break; + case MemcardCommand::PS1_POCKETSTATION: + g_MemoryCardProtocol.ResetPS1State(); + + while (!fifoIn.empty()) + { + ps1Input = fifoIn.front(); + ps1Output = g_MemoryCardProtocol.PS1Pocketstation(ps1Input); + fifoIn.pop_front(); + fifoOut.push_back(ps1Output); + } + + break; + case MemcardCommand::READ_WRITE_END: + g_MemoryCardProtocol.ReadWriteEnd(); + break; + case MemcardCommand::ERASE_BLOCK: + g_MemoryCardProtocol.EraseBlock(); + break; + case MemcardCommand::UNKNOWN_BOOT: + g_MemoryCardProtocol.UnknownBoot(); + break; + case MemcardCommand::AUTH_XOR: + g_MemoryCardProtocol.AuthXor(); + break; + case MemcardCommand::AUTH_F3: + g_MemoryCardProtocol.AuthF3(); + break; + case MemcardCommand::AUTH_F7: + g_MemoryCardProtocol.AuthF7(); + break; + default: + Console.Warning("%s() Unhandled memcard command %02X, things are about to break!", __FUNCTION__, commandByte); + break; + } +} + +void Sio2::Write(u8 data) +{ + Sio2Log.WriteLn("%s(%02X) SIO2 DATA Write", __FUNCTION__, data); + + if (!send3Read) + { + // No more SEND3 positions to access, but the game is still sending us SIO2 writes. Lets ignore them. + if (send3Position > send3.size()) + { + Console.Warning("%s(%02X) Received data after exhausting all SEND3 values!", __FUNCTION__, data); + return; + } + + const u32 currentSend3 = send3.at(send3Position); + port = currentSend3 & Send3::PORT; + commandLength = (currentSend3 >> 8) & Send3::COMMAND_LENGTH_MASK; + send3Read = true; + + // The freshly read SEND3 position had a length of 0, so we are done handling SIO2 commands until + // the next SEND3 writes. + if (commandLength == 0) + { + send3Complete = true; + } + + // If the prior command did not need to fully pop fifoIn, do so now, + // so that the next command isn't trying to read the last command's leftovers. + while (!fifoIn.empty()) + { + fifoIn.pop_front(); + } + } + + if (send3Complete) + { + return; + } + + fifoIn.push_back(data); + + // We have received as many command bytes as we expect, and... + // + // ... These were from direct writes into IOP memory (DMA block size is zero when direct writes occur) + // ... These were from SIO2 DMA (DMA block size is non-zero when SIO2 DMA occurs) + if ((fifoIn.size() == sio2.commandLength && sio2.dmaBlockSize == 0) || fifoIn.size() == sio2.dmaBlockSize) + { + // Go ahead and prep so the next write triggers a load of the new SEND3 value. + sio2.send3Read = false; + sio2.send3Position++; + + // Check the SIO mode + const u8 sioMode = fifoIn.front(); + fifoIn.pop_front(); + + switch (sioMode) + { + case SioMode::PAD: + this->Pad(); + break; + case SioMode::MULTITAP: + this->Multitap(); + break; + case SioMode::INFRARED: + this->Infrared(); + break; + case SioMode::MEMCARD: + this->Memcard(); + break; + default: + Console.Error("%s(%02X) Unhandled SIO mode %02X", __FUNCTION__, data, sioMode); + fifoOut.push_back(0x00); + SetRecv1(Recv1::DISCONNECTED); + break; + } + + // If command was sent over SIO2 DMA, align fifoOut to the block size + if (sio2.dmaBlockSize > 0) + { + const size_t dmaDiff = fifoOut.size() % sio2.dmaBlockSize; + + if (dmaDiff > 0) + { + const size_t padding = sio2.dmaBlockSize - dmaDiff; + + for (size_t i = 0; i < padding; i++) + { + fifoOut.push_back(0x00); + } + } + } + } +} + +u8 Sio2::Read() +{ + u8 ret = 0x00; + + if (!fifoOut.empty()) + { + ret = fifoOut.front(); + fifoOut.pop_front(); + } + else + { + Console.Warning("%s() fifoOut underflow! Returning 0x00.", __FUNCTION__); + } + + Sio2Log.WriteLn("%s() SIO2 DATA Read (%02X)", __FUNCTION__, ret); + return ret; } void sioNextFrame() { @@ -1007,7 +845,46 @@ void sioSetGameSerial( const std::string& serial ) { for ( uint port = 0; port < 2; ++port ) { for ( uint slot = 0; slot < 4; ++slot ) { if ( mcds[port][slot].ReIndex( serial ) ) { - SetForceMcdEjectTimeoutNow( port, slot ); + AutoEject::Set( port, slot ); + } + } + } +} + +void SaveStateBase::sio2Freeze() +{ + FreezeTag("sio2"); + + Freeze(sio2); + FreezeDeque(fifoIn); + FreezeDeque(fifoOut); + + // CRCs for memory cards. + // If the memory card hasn't changed when loading state, we can safely skip ejecting it. + u64 mcdCrcs[SIO::PORTS][SIO::SLOTS]; + if (IsSaving()) + { + for (u32 port = 0; port < SIO::PORTS; port++) + { + for (u32 slot = 0; slot < SIO::SLOTS; slot++) + mcdCrcs[port][slot] = mcds[port][slot].GetChecksum(); + } + } + Freeze(mcdCrcs); + + if (IsLoading()) + { + bool ejected = false; + for (u32 port = 0; port < SIO::PORTS && !ejected; port++) + { + for (u32 slot = 0; slot < SIO::SLOTS; slot++) + { + if (mcdCrcs[port][slot] != mcds[port][slot].GetChecksum()) + { + AutoEject::SetAll(); + ejected = true; + break; + } } } } @@ -1015,45 +892,8 @@ void sioSetGameSerial( const std::string& serial ) { void SaveStateBase::sioFreeze() { - // CRCs for memory cards. - u64 m_mcdCRCs[2][8]; - - FreezeTag( "sio" ); - Freeze( sio ); - - if( IsSaving() ) - { - for( uint port=0; port<2; ++port ) - for( uint slot=0; slot<4; ++slot ) - m_mcdCRCs[port][slot] = mcds[port][slot].GetChecksum(); - } - - Freeze( m_mcdCRCs ); - - if( IsLoading() && EmuConfig.McdEnableEjection ) - { - // Notes on the ForceEjectionTimeout: - // * TOTA works with values as low as 20 here. - // It "times out" with values around 1800 (forces user to check the memcard - // twice to find it). Other games could be different. :| - // - // * At 64: Disgaea 1 and 2, and Grandia 2 end up displaying a quick "no memcard!" - // notice before finding the memorycard and re-enumerating it. A very minor - // annoyance, but no breakages. - - // * GuitarHero will break completely with almost any value here, by design, because - // it has a "rule" that the memcard should never be ejected during a song. So by - // ejecting it, the game freezes (which is actually good emulation, but annoying!) - - for( u8 port=0; port<2; ++port ) - for( u8 slot=0; slot<4; ++slot ) - { - u64 checksum = mcds[port][slot].GetChecksum(); - - if( checksum != m_mcdCRCs[port][slot] ) - mcds[port][slot].ForceEjection_Timeout = FORCED_MCD_EJECTION_MAX_TRIES; - } - } + FreezeTag("sio0"); + Freeze(sio0); } std::tuple sioConvertPadToPortAndSlot(u32 index) @@ -1085,3 +925,40 @@ bool sioPortAndSlotIsMultitap(u32 port, u32 slot) { return (slot != 0); } + +void AutoEject::Set(size_t port, size_t slot) +{ + if (EmuConfig.McdEnableEjection) + { + mcds[port][slot].autoEjectTicks = 60; + } +} + +void AutoEject::Clear(size_t port, size_t slot) +{ + mcds[port][slot].autoEjectTicks = 0; +} + +void AutoEject::SetAll() +{ + Host::AddIconOSDMessage("AutoEjectAllSet", ICON_FA_SD_CARD, "Force ejecting all memory cards.", Host::OSD_INFO_DURATION); + + for (size_t port = 0; port < SIO::PORTS; port++) + { + for (size_t slot = 0; slot < SIO::SLOTS; slot++) + { + AutoEject::Set(port, slot); + } + } +} + +void AutoEject::ClearAll() +{ + for (size_t port = 0; port < SIO::PORTS; port++) + { + for (size_t slot = 0; slot < SIO::SLOTS; slot++) + { + AutoEject::Clear(port, slot); + } + } +} \ No newline at end of file diff --git a/pcsx2/Sio.h b/pcsx2/Sio.h index 8de55d7be4..0445db7350 100644 --- a/pcsx2/Sio.h +++ b/pcsx2/Sio.h @@ -1,5 +1,5 @@ /* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2010 PCSX2 Dev Team + * Copyright (C) 2002-2022 PCSX2 Dev Team * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- @@ -13,26 +13,35 @@ * If not, see . */ +// Huge thanks to PSI for his work reversing the PS2, his documentation on SIO2 pretty much saved +// this entire implementation. https://psi-rockin.github.io/ps2tek/#sio2registers + #pragma once +#include "SioTypes.h" #include "MemoryCardFile.h" +#include +#include struct _mcd { + u8 currentCommand; u8 term; // terminator value; bool goodSector; // xor sector check + u8 msb; + u8 lsb; u32 sectorAddr; // read/write sector address u32 transferAddr; // Transfer address + std::vector buf; // Buffer for reading and writing + u8 FLAG; // for PSX; - - u8 port; // port + + u8 port; // port u8 slot; // and slot for this memcard - // Auto Eject - u32 ForceEjection_Timeout; // in SIO checks - u64 ForceEjection_Timestamp; + size_t autoEjectTicks; void GetSizeInfo(McdSizeInfo &info) { @@ -46,18 +55,21 @@ struct _mcd void EraseBlock() { + //DevCon.WriteLn("Memcard Erase (sectorAddr = %08X)", sectorAddr); FileMcd_EraseBlock(port, slot, transferAddr); } // Read from memorycard to dest - void Read(u8 *dest, int size) + void Read(u8 *dest, int size) { + //DevCon.WriteLn("Memcard Read (sectorAddr = %08X)", sectorAddr); FileMcd_Read(port, slot, dest, transferAddr, size); } // Write to memorycard from src - void Write(u8 *src, int size) + void Write(u8 *src, int size) { + //DevCon.WriteLn("Memcard Write (sectorAddr = %08X)", sectorAddr); FileMcd_Save(port, slot, src,transferAddr, size); } @@ -66,11 +78,16 @@ struct _mcd return FileMcd_IsPresent(port, slot); } - u8 DoXor(const u8 *buf, uint length) + u8 DoXor() { - u8 i, x; - for (x=0, i=0; i send3; // 0x1f808200 - 0x1f80823f + // SEND1 and SEND2 are an unusual bunch. It's not entirely clear just from + // documentation but these registers almost seem like they are the same thing; + // when bit 2 is set, SEND2 is being read/written. When bit 2 isn't set, it is + // SEND1. Their use is not really known, either. + std::array send1; // 0x1f808240 - 0x1f80825f + std::array send2; // 0x1f808240 - 0x1f80825f + u32 dataIn; // 0x1f808260 + u32 dataOut; // 0x1f808264 + u32 ctrl; // 0x1f808268 + u32 recv1; // 0x1f80826c + u32 recv2; // 0x1f808270 + u32 recv3; // 0x1f808274 + u32 unknown1; // 0x1f808278 + u32 unknown2; // 0x1f80827c + u32 iStat; // 0x1f808280 + + u8 port = 0; + u8 slot = 0; + + // The current working index of SEND3. The SEND3 register is a 16 position + // array of command descriptors. Each descriptor describes the port the command + // is targeting, as well as the length of the command in bytes. + bool send3Read = false; + size_t send3Position = 0; + size_t commandLength = 0; + size_t processedLength = 0; + // Tracks the size of a single block of DMA11/DMA12 data. psxDma11 will set this prior + // to doing writes, and Sio2::SetSend3 will clear this to ensure a non-DMA write into SIO2 + // does not accidentally use dmaBlockSize. + size_t dmaBlockSize = 0; + bool send3Complete = false; + + Sio2(); + ~Sio2(); + + void SoftReset(); + void FullReset(); + + void Interrupt(); + + void SetCtrl(u32 value); + void SetSend3(size_t position, u32 value); + void SetRecv1(u32 value); + + void Pad(); + void Multitap(); + void Infrared(); + void Memcard(); + + void Write(u8 data); + u8 Read(); +}; + +extern std::deque fifoIn; +extern std::deque fifoOut; + +extern Sio0 sio0; +extern Sio2 sio2; + extern _mcd mcds[2][4]; extern _mcd *mcd; -extern void sioInit(); -extern u8 sioRead8(); -extern void sioWrite8(u8 value); -extern void sioWriteCtrl16(u16 value); -extern void sioInterrupt(); -extern void sioInterruptR(); -extern void SetForceMcdEjectTimeoutNow(uint port, uint slot); -extern void SetForceMcdEjectTimeoutNow(); -extern void ClearMcdEjectTimeoutNow(); -extern void sioStatRead(); -extern void sioSetGameSerial(const std::string& serial); extern void sioNextFrame(); /// Converts a global pad index to a multitap port and slot. @@ -137,3 +239,12 @@ extern u32 sioConvertPortAndSlotToPad(u32 port, u32 slot); /// Returns true if the given pad index is a multitap slot. extern bool sioPadIsMultitapSlot(u32 index); extern bool sioPortAndSlotIsMultitap(u32 port, u32 slot); +extern void sioSetGameSerial(const std::string& serial); + +namespace AutoEject +{ + extern void Set(size_t port, size_t slot); + extern void Clear(size_t port, size_t slot); + extern void SetAll(); + extern void ClearAll(); +} \ No newline at end of file diff --git a/pcsx2/SioTypes.h b/pcsx2/SioTypes.h new file mode 100644 index 0000000000..f6a0a68c9b --- /dev/null +++ b/pcsx2/SioTypes.h @@ -0,0 +1,161 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#pragma once + +enum class SioStage +{ + IDLE, + WAITING_COMMAND, + WORKING +}; + +namespace SioMode +{ + static constexpr u8 NOT_SET = 0x00; + static constexpr u8 PAD = 0x01; + static constexpr u8 MULTITAP = 0x21; + static constexpr u8 INFRARED = 0x61; + static constexpr u8 MEMCARD = 0x81; +} // namespace SioMode + +namespace PadCommand +{ + static constexpr u8 UNK_0 = 0x40; + static constexpr u8 QUERY_BUTTONS = 0x41; + static constexpr u8 POLL = 0x42; + static constexpr u8 CONFIG = 0x43; + static constexpr u8 MODE_SWITCH = 0x44; + static constexpr u8 STATUS = 0x45; + static constexpr u8 CONST_1 = 0x46; + static constexpr u8 CONST_2 = 0x47; + static constexpr u8 UNK_8 = 0x48; + static constexpr u8 UNK_9 = 0x49; + static constexpr u8 UNK_A = 0x4a; + static constexpr u8 UNK_B = 0x4b; + static constexpr u8 CONST_3 = 0x4c; + static constexpr u8 VIBRATION = 0x4d; + static constexpr u8 UNK_E = 0x4e; + static constexpr u8 ANALOG = 0x4f; +} // namespace PadCommand + +namespace MemcardCommand +{ + static constexpr u8 NOT_SET = 0x00; + static constexpr u8 PROBE = 0x11; + static constexpr u8 UNKNOWN_WRITE_DELETE_END = 0x12; + static constexpr u8 SET_ERASE_SECTOR = 0x21; + static constexpr u8 SET_WRITE_SECTOR = 0x22; + static constexpr u8 SET_READ_SECTOR = 0x23; + static constexpr u8 GET_SPECS = 0x26; + static constexpr u8 SET_TERMINATOR = 0x27; + static constexpr u8 GET_TERMINATOR = 0x28; + static constexpr u8 WRITE_DATA = 0x42; + static constexpr u8 READ_DATA = 0x43; + static constexpr u8 PS1_READ = 0x52; + static constexpr u8 PS1_STATE = 0x53; + static constexpr u8 PS1_WRITE = 0x57; + static constexpr u8 PS1_POCKETSTATION = 0x58; + static constexpr u8 READ_WRITE_END = 0x81; + static constexpr u8 ERASE_BLOCK = 0x82; + static constexpr u8 UNKNOWN_BOOT = 0xbf; + static constexpr u8 AUTH_XOR = 0xf0; + static constexpr u8 AUTH_F3 = 0xf3; + static constexpr u8 AUTH_F7 = 0xf7; +} // namespace MemcardCommand + +enum class Sio0Interrupt +{ + TEST_EVENT, + STAT_READ, + TX_DATA_WRITE +}; // namespace Sio0Interrupt + +namespace SIO +{ + static constexpr u8 PORTS = 2; + static constexpr u8 SLOTS = 4; +} // namespace SIO + +namespace SIO0_STAT +{ + static constexpr u32 TX_READY = 0x01; + static constexpr u32 RX_FIFO_NOT_EMPTY = 0x02; + static constexpr u32 TX_EMPTY = 0x04; + static constexpr u32 RX_PARITY_ERROR = 0x08; + static constexpr u32 ACK = 0x80; + static constexpr u32 IRQ = 0x0200; +} // namespace SIO0_STAT + +namespace SIO0_CTRL +{ + static constexpr u16 TX_ENABLE = 0x01; + static constexpr u16 RX_ENABLE = 0x04; + static constexpr u16 ACK = 0x10; + static constexpr u16 RESET = 0x40; + static constexpr u16 RX_INT_MODE_LSB = 0x0100; + static constexpr u16 RX_INT_MODE_MSB = 0x0200; + static constexpr u16 TX_INT_ENABLE = 0x0400; + static constexpr u16 RX_INT_ENABLE = 0x0800; + static constexpr u16 ACK_INT_ENABLE = 0x1000; + static constexpr u16 PORT = 0x2000; +} // namespace SIO0_CTRL + +namespace Send3 +{ + static constexpr u32 PORT = 0x01; + static constexpr u16 COMMAND_LENGTH_MASK = 0x3ff; +} // namespace Send3 + +namespace Sio2Ctrl +{ + static constexpr u32 START_TRANSFER = 0x1; + static constexpr u32 RESET = 0xc; + static constexpr u32 PORT = 0x2000; + // The value which SIO2MAN resets SIO2_CTRL to after a system reset. + static constexpr u32 SIO2MAN_RESET = 0x000003bc; +} // namespace Sio2Ctrl + +namespace Recv1 +{ + static constexpr u32 DISCONNECTED = 0x1d100; + static constexpr u32 CONNECTED = 0x1100; +} // namespace Recv1 + +namespace Recv2 +{ + static constexpr u32 DEFAULT = 0xf; +} // namespace Recv2 + +// Most RECV3 values are mysterious, undocumented, and their purpose +// can only be inferred from how old, mostly incorrect PCSX2 code tried +// to use them. We're going to try and respect these where it seems like +// it may make sense to do so, but these are still largely unknown and +// tests suggest they are not even used at all. +namespace Recv3 +{ + static constexpr u32 DEFAULT = 0x0; + // Set when getting memcard specs + static constexpr u32 SPECS = 0x83; + // Set when getting or setting the terminator byte + static constexpr u32 TERMINATOR = 0x8b; + // Set when setting the read/write sector + static constexpr u32 READ_WRITE_END = 0x8c; +} // namespace Recv3 + +namespace Terminator +{ + static constexpr u32 DEFAULT = 0x55; +} // namespace Terminator diff --git a/pcsx2/SourceLog.cpp b/pcsx2/SourceLog.cpp index 9c25a79866..29bb15ba3d 100644 --- a/pcsx2/SourceLog.cpp +++ b/pcsx2/SourceLog.cpp @@ -121,8 +121,10 @@ SysConsoleLogPack::SysConsoleLogPack() , eeConsole(&TLD_eeConsole) , iopConsole(&TLD_iopConsole) , deci2(&TLD_deci2) +#ifndef DISABLE_RECORDING , recordingConsole(&TLD_recordingConsole) , controlInfo(&TLD_controlInfo) +#endif { } diff --git a/pcsx2/SysForwardDefs.h b/pcsx2/SysForwardDefs.h index 6d595e3af3..0c72ba92e3 100644 --- a/pcsx2/SysForwardDefs.h +++ b/pcsx2/SysForwardDefs.h @@ -36,8 +36,10 @@ #define VER_INTERNAL_NAME_STR VER_ORIGINAL_FILENAME_STR #define VER_COPYRIGHT_STR "Copyright (C) 2022" +#define PCSX2_WEBSITE_URL "https://pcsx2.net/" +#define PCSX2_FORUMS_URL "https://forums.pcsx2.net/" +#define PCSX2_GITHUB_URL "https://github.com/PCSX2/pcsx2" +#define PCSX2_LICENSE_URL "https://github.com/PCSX2/pcsx2/blob/master/pcsx2/Docs/License.txt" +#define PCSX2_DISCORD_URL "https://discord.com/invite/TCz3t9k" + static const bool PCSX2_isReleaseVersion = 0; - -class SysCoreThread; - -class CpuInitializerSet; diff --git a/pcsx2/System.cpp b/pcsx2/System.cpp index b7de4fd681..63dc906bf9 100644 --- a/pcsx2/System.cpp +++ b/pcsx2/System.cpp @@ -24,6 +24,7 @@ #include "System/RecTypes.h" +#include "common/Align.h" #include "common/MemsetFast.inl" #include "common/Perf.h" #include "common/StringUtil.h" @@ -59,82 +60,79 @@ void SetCPUState(SSE_MXCSR sseMXCSR, SSE_MXCSR sseVUMXCSR) // Constructor! // Parameters: // name - a nice long name that accurately describes the contents of this reserve. -RecompiledCodeReserve::RecompiledCodeReserve( std::string name, uint defCommit ) - : VirtualMemoryReserve( std::move(name), defCommit ) +RecompiledCodeReserve::RecompiledCodeReserve(std::string name) + : VirtualMemoryReserve(std::move(name)) { - m_prot_mode = PageAccess_Any(); } RecompiledCodeReserve::~RecompiledCodeReserve() { - _termProfiler(); + Release(); } void RecompiledCodeReserve::_registerProfiler() { - if (m_profiler_name.empty() || !IsOk()) return; + if (m_profiler_name.empty() || !IsOk()) + return; - Perf::any.map((uptr)m_baseptr, GetReserveSizeInBytes(), m_profiler_name.c_str()); + Perf::any.map((uptr)m_baseptr, m_size, m_profiler_name.c_str()); } -void RecompiledCodeReserve::_termProfiler() +void RecompiledCodeReserve::Assign(VirtualMemoryManagerPtr allocator, size_t offset, size_t size) { -} + // Anything passed to the memory allocator must be page aligned. + size = Common::PageAlign(size); -void* RecompiledCodeReserve::Assign( VirtualMemoryManagerPtr allocator, void *baseptr, size_t size ) -{ - if (!_parent::Assign(std::move(allocator), baseptr, size)) return NULL; - - Commit(); + // Since the memory has already been allocated as part of the main memory map, this should never fail. + u8* base = allocator->Alloc(offset, size); + if (!base) + { + Console.WriteLn("(RecompiledCodeReserve) Failed to allocate %zu bytes for %s at offset %zu", size, m_name.c_str(), offset); + pxFailRel("RecompiledCodeReserve allocation failed."); + } + VirtualMemoryReserve::Assign(std::move(allocator), base, size); _registerProfiler(); - - return m_baseptr; } void RecompiledCodeReserve::Reset() { - _parent::Reset(); - - Commit(); -} - -bool RecompiledCodeReserve::Commit() -{ - bool status = _parent::Commit(); - if (IsDevBuild && m_baseptr) { // Clear the recompiled code block to 0xcc (INT3) -- this helps disasm tools show // the assembly dump more cleanly. We don't clear the block on Release builds since // it can add a noticeable amount of overhead to large block recompilations. - memset(m_baseptr, 0xCC, m_pages_commited * __pagesize); + std::memset(m_baseptr, 0xCC, m_size); } +} - return status; +void RecompiledCodeReserve::AllowModification() +{ + // Apple Silicon enforces write protection in hardware. +#if !defined(__APPLE__) || !defined(_M_ARM64) + HostSys::MemProtect(m_baseptr, m_size, PageAccess_Any()); +#endif +} + +void RecompiledCodeReserve::ForbidModification() +{ + // Apple Silicon enforces write protection in hardware. +#if !defined(__APPLE__) || !defined(_M_ARM64) + HostSys::MemProtect(m_baseptr, m_size, PageProtectionMode().Read().Execute()); +#endif } // Sets the abbreviated name used by the profiler. Name should be under 10 characters long. // After a name has been set, a profiler source will be automatically registered and cleared // in accordance with changes in the reserve area. -RecompiledCodeReserve& RecompiledCodeReserve::SetProfilerName( std::string shortname ) +RecompiledCodeReserve& RecompiledCodeReserve::SetProfilerName(std::string name) { - m_profiler_name = std::move(shortname); + m_profiler_name = std::move(name); _registerProfiler(); return *this; } -// This error message is shared by R5900, R3000, and microVU recompilers. -void RecompiledCodeReserve::ThrowIfNotOk() const -{ - if (IsOk()) return; - - throw Exception::OutOfMemory(m_name) - .SetDiagMsg("Recompiled code cache could not be mapped.") - .SetUserMsg("This recompiler was unable to reserve contiguous memory required for internal caches. This error can be caused by low virtual memory resources, such as a small or disabled swapfile, or by another program that is hogging a lot of memory."); -} - #include "svnrev.h" Pcsx2Config EmuConfig; @@ -148,7 +146,7 @@ void SysLogMachineCaps() if (GIT_TAGGED_COMMIT) // Nightly builds { // tagged commit - more modern implementation of dev build versioning - // - there is no need to include the commit - that is associated with the tag, + // - there is no need to include the commit - that is associated with the tag, // - git is implied and the tag is timestamped Console.WriteLn(Color_StrongGreen, "PCSX2 Nightly - %s Compiled on %s", GIT_TAG, __DATE__); } else { @@ -228,81 +226,6 @@ void SysLogMachineCaps() #endif } -template< typename CpuType > -class CpuInitializer -{ -public: - std::unique_ptr MyCpu; - ScopedExcept ExThrown; - - CpuInitializer(); - virtual ~CpuInitializer(); - - bool IsAvailable() const - { - return !!MyCpu; - } - - CpuType* GetPtr() { return MyCpu.get(); } - const CpuType* GetPtr() const { return MyCpu.get(); } - - operator CpuType*() { return GetPtr(); } - operator const CpuType*() const { return GetPtr(); } -}; - -// -------------------------------------------------------------------------------------- -// CpuInitializer Template -// -------------------------------------------------------------------------------------- -// Helper for initializing various PCSX2 CPU providers, and handing errors and cleanup. -// -template< typename CpuType > -CpuInitializer< CpuType >::CpuInitializer() -{ - try { - MyCpu = std::make_unique(); - MyCpu->Reserve(); - } - catch( Exception::RuntimeError& ex ) - { - Console.Error( "CPU provider error:\n\t%s", ex.FormatDiagnosticMessage().c_str() ); - MyCpu = nullptr; - ExThrown = ScopedExcept(ex.Clone()); - } - catch( std::runtime_error& ex ) - { - Console.Error( "CPU provider error (STL Exception)\n\tDetails:%s", ex.what() ); - MyCpu = nullptr; - ExThrown = ScopedExcept(new Exception::RuntimeError(ex)); - } -} - -template< typename CpuType > -CpuInitializer< CpuType >::~CpuInitializer() -{ - try { - if (MyCpu) - MyCpu->Shutdown(); - } - DESTRUCTOR_CATCHALL -} - -// -------------------------------------------------------------------------------------- -// CpuInitializerSet -// -------------------------------------------------------------------------------------- -class CpuInitializerSet -{ -public: - CpuInitializer microVU0; - CpuInitializer microVU1; - - CpuInitializer interpVU0; - CpuInitializer interpVU1; - -public: - CpuInitializerSet() {} - virtual ~CpuInitializerSet() = default; -}; - namespace HostMemoryMap { // For debuggers extern "C" { @@ -315,23 +238,24 @@ namespace HostMemoryMap { } /// Attempts to find a spot near static variables for the main memory -static VirtualMemoryManagerPtr makeMainMemoryManager() { +static VirtualMemoryManagerPtr makeMemoryManager(const char* name, const char* file_mapping_name, size_t size, size_t offset_from_base) +{ // Everything looks nicer when the start of all the sections is a nice round looking number. // Also reduces the variation in the address due to small changes in code. // Breaks ASLR but so does anything else that tries to make addresses constant for our debugging pleasure - uptr codeBase = (uptr)(void*)makeMainMemoryManager / (1 << 28) * (1 << 28); + uptr codeBase = (uptr)(void*)makeMemoryManager / (1 << 28) * (1 << 28); // The allocation is ~640mb in size, slighly under 3*2^28. // We'll hope that the code generated for the PCSX2 executable stays under 512mb (which is likely) // On x86-64, code can reach 8*2^28 from its address [-6*2^28, 4*2^28] is the region that allows for code in the 640mb allocation to reach 512mb of code that either starts at codeBase or 256mb before it. // We start high and count down because on macOS code starts at the beginning of useable address space, so starting as far ahead as possible reduces address variations due to code size. Not sure about other platforms. Obviously this only actually affects what shows up in a debugger and won't affect performance or correctness of anything. for (int offset = 4; offset >= -6; offset--) { - uptr base = codeBase + (offset << 28); - if ((sptr)base < 0 || (sptr)(base + HostMemoryMap::Size - 1) < 0) { + uptr base = codeBase + (offset << 28) + offset_from_base; + if ((sptr)base < 0 || (sptr)(base + size - 1) < 0) { // VTLB will throw a fit if we try to put EE main memory here continue; } - auto mgr = std::make_shared("Main Memory Manager", base, HostMemoryMap::Size, /*upper_bounds=*/0, /*strict=*/true); + auto mgr = std::make_shared(name, file_mapping_name, base, size, /*upper_bounds=*/0, /*strict=*/true); if (mgr->IsOk()) { return mgr; } @@ -340,69 +264,54 @@ static VirtualMemoryManagerPtr makeMainMemoryManager() { // If the above failed and it's x86-64, recompiled code is going to break! // If it's i386 anything can reach anything so it doesn't matter if (sizeof(void*) == 8) { - pxAssertRel(0, "Failed to find a good place for the main memory allocation, recompilers may fail"); + pxAssertRel(0, "Failed to find a good place for the memory allocation, recompilers may fail"); } - return std::make_shared("Main Memory Manager", 0, HostMemoryMap::Size); + return std::make_shared(name, file_mapping_name, 0, size); } // -------------------------------------------------------------------------------------- // SysReserveVM (implementations) // -------------------------------------------------------------------------------------- SysMainMemory::SysMainMemory() - : m_mainMemory(makeMainMemoryManager()) - , m_bumpAllocator(m_mainMemory, HostMemoryMap::bumpAllocatorOffset, HostMemoryMap::Size - HostMemoryMap::bumpAllocatorOffset) + : m_mainMemory(makeMemoryManager("Main Memory Manager", "pcsx2", HostMemoryMap::MainSize, 0)) + , m_codeMemory(makeMemoryManager("Code Memory Manager", nullptr, HostMemoryMap::CodeSize, HostMemoryMap::MainSize)) + , m_bumpAllocator(m_mainMemory, HostMemoryMap::bumpAllocatorOffset, HostMemoryMap::MainSize - HostMemoryMap::bumpAllocatorOffset) { - uptr base = (uptr)MainMemory()->GetBase(); - HostMemoryMap::EEmem = base + HostMemoryMap::EEmemOffset; - HostMemoryMap::IOPmem = base + HostMemoryMap::IOPmemOffset; - HostMemoryMap::VUmem = base + HostMemoryMap::VUmemOffset; - HostMemoryMap::EErec = base + HostMemoryMap::EErecOffset; - HostMemoryMap::IOPrec = base + HostMemoryMap::IOPrecOffset; - HostMemoryMap::VIF0rec = base + HostMemoryMap::VIF0recOffset; - HostMemoryMap::VIF1rec = base + HostMemoryMap::VIF1recOffset; - HostMemoryMap::mVU0rec = base + HostMemoryMap::mVU0recOffset; - HostMemoryMap::mVU1rec = base + HostMemoryMap::mVU1recOffset; - HostMemoryMap::bumpAllocator = base + HostMemoryMap::bumpAllocatorOffset; + uptr main_base = (uptr)MainMemory()->GetBase(); + uptr code_base = (uptr)MainMemory()->GetBase(); + HostMemoryMap::EEmem = main_base + HostMemoryMap::EEmemOffset; + HostMemoryMap::IOPmem = main_base + HostMemoryMap::IOPmemOffset; + HostMemoryMap::VUmem = main_base + HostMemoryMap::VUmemOffset; + HostMemoryMap::EErec = code_base + HostMemoryMap::EErecOffset; + HostMemoryMap::IOPrec = code_base + HostMemoryMap::IOPrecOffset; + HostMemoryMap::VIF0rec = code_base + HostMemoryMap::VIF0recOffset; + HostMemoryMap::VIF1rec = code_base + HostMemoryMap::VIF1recOffset; + HostMemoryMap::mVU0rec = code_base + HostMemoryMap::mVU0recOffset; + HostMemoryMap::mVU1rec = code_base + HostMemoryMap::mVU1recOffset; + HostMemoryMap::bumpAllocator = main_base + HostMemoryMap::bumpAllocatorOffset; } SysMainMemory::~SysMainMemory() { - try { - ReleaseAll(); - } - DESTRUCTOR_CATCHALL + Release(); } -void SysMainMemory::ReserveAll() +bool SysMainMemory::Allocate() { + DevCon.WriteLn(Color_StrongBlue, "Allocating host memory for virtual systems..."); pxInstallSignalHandler(); - DevCon.WriteLn( Color_StrongBlue, "Mapping host memory for virtual systems..." ); ConsoleIndentScope indent(1); - m_ee.Reserve(MainMemory()); - m_iop.Reserve(MainMemory()); - m_vu.Reserve(MainMemory()); -} - -void SysMainMemory::CommitAll() -{ + m_ee.Assign(MainMemory()); + m_iop.Assign(MainMemory()); + m_vu.Assign(MainMemory()); vtlb_Core_Alloc(); - if (m_ee.IsCommitted() && m_iop.IsCommitted() && m_vu.IsCommitted()) return; - - DevCon.WriteLn( Color_StrongBlue, "Allocating host memory for virtual systems..." ); - ConsoleIndentScope indent(1); - - m_ee.Commit(); - m_iop.Commit(); - m_vu.Commit(); + return true; } - -void SysMainMemory::ResetAll() +void SysMainMemory::Reset() { - CommitAll(); - DevCon.WriteLn( Color_StrongBlue, "Resetting host memory for virtual systems..." ); ConsoleIndentScope indent(1); @@ -413,49 +322,21 @@ void SysMainMemory::ResetAll() // Note: newVif is reset as part of other VIF structures. } -void SysMainMemory::DecommitAll() +void SysMainMemory::Release() { - if (!m_ee.IsCommitted() && !m_iop.IsCommitted() && !m_vu.IsCommitted()) return; - - Console.WriteLn( Color_Blue, "Decommitting host memory for virtual systems..." ); + Console.WriteLn( Color_Blue, "Releasing host memory for virtual systems..." ); ConsoleIndentScope indent(1); - // On linux, the MTVU isn't empty and the thread still uses the m_ee/m_vu memory - vu1Thread.WaitVU(); - // The EE thread must be stopped here command mustn't be send - // to the ring. Let's call it an extra safety valve :) - vu1Thread.Reset(); - hwShutdown(); - m_ee.Decommit(); - m_iop.Decommit(); - m_vu.Decommit(); - - closeNewVif(0); - closeNewVif(1); - - g_GameStarted = false; - g_GameLoading = false; - - vtlb_Core_Free(); -} - -void SysMainMemory::ReleaseAll() -{ - DecommitAll(); - - Console.WriteLn( Color_Blue, "Releasing host memory maps for virtual systems..." ); - ConsoleIndentScope indent(1); - vtlb_Core_Free(); // Just to be sure... (calling order could result in it getting missed during Decommit). releaseNewVif(0); releaseNewVif(1); - m_ee.Decommit(); - m_iop.Decommit(); - m_vu.Decommit(); + m_ee.Release(); + m_iop.Release(); + m_vu.Release(); safe_delete(Source_PageFault); } @@ -469,89 +350,50 @@ SysCpuProviderPack::SysCpuProviderPack() Console.WriteLn( Color_StrongBlue, "Reserving memory for recompilers..." ); ConsoleIndentScope indent(1); - CpuProviders = std::make_unique(); + recCpu.Reserve(); + psxRec.Reserve(); - try { - recCpu.Reserve(); - } - catch( Exception::RuntimeError& ex ) - { - m_RecExceptionEE = ScopedExcept(ex.Clone()); - Console.Error( "EE Recompiler Reservation Failed:\n%s", ex.FormatDiagnosticMessage().c_str() ); - recCpu.Shutdown(); - } + CpuMicroVU0.Reserve(); + CpuMicroVU1.Reserve(); - try { - psxRec.Reserve(); - } - catch( Exception::RuntimeError& ex ) - { - m_RecExceptionIOP = ScopedExcept(ex.Clone()); - Console.Error( "IOP Recompiler Reservation Failed:\n%s", ex.FormatDiagnosticMessage().c_str() ); - psxRec.Shutdown(); - } - - // hmm! : VU0 and VU1 pre-allocations should do sVU and mVU separately? Sounds complicated. :( - - if (newVifDynaRec) + if constexpr (newVifDynaRec) { dVifReserve(0); dVifReserve(1); } } -bool SysCpuProviderPack::IsRecAvailable_MicroVU0() const { return CpuProviders->microVU0.IsAvailable(); } -bool SysCpuProviderPack::IsRecAvailable_MicroVU1() const { return CpuProviders->microVU1.IsAvailable(); } -BaseException* SysCpuProviderPack::GetException_MicroVU0() const { return CpuProviders->microVU0.ExThrown.get(); } -BaseException* SysCpuProviderPack::GetException_MicroVU1() const { return CpuProviders->microVU1.ExThrown.get(); } - -void SysCpuProviderPack::CleanupMess() noexcept -{ - try - { - psxRec.Shutdown(); - recCpu.Shutdown(); - - if (newVifDynaRec) - { - dVifRelease(0); - dVifRelease(1); - } - } - DESTRUCTOR_CATCHALL -} - SysCpuProviderPack::~SysCpuProviderPack() { - CleanupMess(); + if (newVifDynaRec) + { + dVifRelease(1); + dVifRelease(0); + } + + CpuMicroVU1.Shutdown(); + CpuMicroVU0.Shutdown(); + + psxRec.Shutdown(); + recCpu.Shutdown(); } -bool SysCpuProviderPack::HadSomeFailures( const Pcsx2Config::RecompilerOptions& recOpts ) const -{ - return (recOpts.EnableEE && !IsRecAvailable_EE()) || - (recOpts.EnableIOP && !IsRecAvailable_IOP()) || - (recOpts.EnableVU0 && !IsRecAvailable_MicroVU0()) || - (recOpts.EnableVU1 && !IsRecAvailable_MicroVU1()) - ; - -} - -BaseVUmicroCPU* CpuVU0 = NULL; -BaseVUmicroCPU* CpuVU1 = NULL; +BaseVUmicroCPU* CpuVU0 = nullptr; +BaseVUmicroCPU* CpuVU1 = nullptr; void SysCpuProviderPack::ApplyConfig() const { Cpu = CHECK_EEREC ? &recCpu : &intCpu; psxCpu = CHECK_IOPREC ? &psxRec : &psxInt; - CpuVU0 = CpuProviders->interpVU0; - CpuVU1 = CpuProviders->interpVU1; + CpuVU0 = &CpuIntVU0; + CpuVU1 = &CpuIntVU1; if( EmuConfig.Cpu.Recompiler.EnableVU0 ) - CpuVU0 = (BaseVUmicroCPU*)CpuProviders->microVU0; + CpuVU0 = &CpuMicroVU0; if( EmuConfig.Cpu.Recompiler.EnableVU1 ) - CpuVU1 = (BaseVUmicroCPU*)CpuProviders->microVU1; + CpuVU1 = &CpuMicroVU1; #ifdef PCSX2_CORE if (GSDumpReplayer::IsReplayingDump()) @@ -575,8 +417,8 @@ void SysClearExecutionCache() psxCpu->Reset(); // mVU's VU0 needs to be properly initialized for macro mode even if it's not used for micro mode! - if (CHECK_EEREC) - ((BaseVUmicroCPU*)GetCpuProviders().CpuProviders->microVU0)->Reset(); + if (CHECK_EEREC && !EmuConfig.Cpu.Recompiler.EnableVU0) + CpuMicroVU0.Reset(); CpuVU0->Reset(); CpuVU1->Reset(); @@ -588,42 +430,16 @@ void SysClearExecutionCache() } } -// Maps a block of memory for use as a recompiled code buffer, and ensures that the -// allocation is below a certain memory address (specified in "bounds" parameter). -// The allocated block has code execution privileges. -// Returns NULL on allocation failure. -u8* SysMmapEx(uptr base, u32 size, uptr bounds, const char *caller) -{ - u8* Mem = (u8*)HostSys::Mmap( base, size ); - - if( (Mem == NULL) || (bounds != 0 && (((uptr)Mem + size) > bounds)) ) - { - if( base ) - { - DbgCon.Warning( "First try failed allocating %s at address 0x%x", caller, base ); - - // Let's try again at an OS-picked memory area, and then hope it meets needed - // boundschecking criteria below. - SafeSysMunmap( Mem, size ); - Mem = (u8*)HostSys::Mmap( 0, size ); - } - - if( (bounds != 0) && (((uptr)Mem + size) > bounds) ) - { - DevCon.Warning( "Second try failed allocating %s, block ptr 0x%x does not meet required criteria.", caller, Mem ); - SafeSysMunmap( Mem, size ); - - // returns NULL, caller should throw an exception. - } - } - return Mem; -} - std::string SysGetBiosDiscID() { // FIXME: we should return a serial based on // the BIOS being run (either a checksum of the BIOS roms, and/or a string based on BIOS // region and revision). + // Good candidate can be first part of EXTINFO data in the BIOS rom: + // Example for romver 0160EC20010704 + // 20010704-160707,ROMconf,PS20160EC20010704.bin,kuma@rom-server/~/f10k/g/app/rom + // 20010704-160707 can be used as unique ID for Bios + // rom0:EXTINFO first 15 bytes return {}; } diff --git a/pcsx2/System.h b/pcsx2/System.h index 286ce1478b..b766099e66 100644 --- a/pcsx2/System.h +++ b/pcsx2/System.h @@ -43,12 +43,12 @@ class RecompiledCodeReserve; namespace HostMemoryMap { - static const u32 Size = 0x28000000; + ////////////////////////////////////////////////////////////////////////// + // Main + ////////////////////////////////////////////////////////////////////////// + static const u32 MainSize = 0x14000000; - // The actual addresses may not be equivalent to Base + Offset in the event that allocation at Base failed - // Each of these offsets has a debugger-accessible equivalent variable without the Offset suffix that will hold the actual address (not here because we don't want code using it) - - // PS2 main memory, SPR, and ROMs + // PS2 main memory, SPR, and ROMs (approximately 40.5MB, but we round up to 64MB for simplicity). static const u32 EEmemOffset = 0x00000000; // IOP main memory and ROMs @@ -57,54 +57,69 @@ namespace HostMemoryMap // VU0 and VU1 memory. static const u32 VUmemOffset = 0x08000000; - // EE recompiler code cache area (64mb) - static const u32 EErecOffset = 0x10000000; - - // IOP recompiler code cache area (16 or 32mb) - static const u32 IOPrecOffset = 0x14000000; - - // newVif0 recompiler code cache area (16mb) - static const u32 VIF0recOffset = 0x16000000; - - // newVif1 recompiler code cache area (32mb) - static const u32 VIF1recOffset = 0x18000000; - - // microVU1 recompiler code cache area (32 or 64mb) - static const u32 mVU0recOffset = 0x1C000000; - - // microVU0 recompiler code cache area (64mb) - static const u32 mVU1recOffset = 0x20000000; - // Bump allocator for any other small allocations // size: Difference between it and HostMemoryMap::Size, so nothing should allocate higher than it! - static const u32 bumpAllocatorOffset = 0x24000000; + static const u32 bumpAllocatorOffset = 0x10000000; + + ////////////////////////////////////////////////////////////////////////// + // Code + ////////////////////////////////////////////////////////////////////////// + static const u32 CodeSize = 0x0F100000; // 241 mb + + // EE recompiler code cache area (64mb) + static const u32 EErecOffset = 0x00000000; + + // IOP recompiler code cache area (32mb) + static const u32 IOPrecOffset = 0x04000000; + + // newVif0 recompiler code cache area (8mb) + static const u32 VIF0recOffset = 0x06000000; + + // newVif1 recompiler code cache area (8mb) + static const u32 VIF1recOffset = 0x06800000; + + // microVU1 recompiler code cache area (64mb) + static const u32 mVU0recOffset = 0x07000000; + + // microVU0 recompiler code cache area (64mb) + static const u32 mVU1recOffset = 0x0B000000; + + // SSE-optimized VIF unpack functions (1mb) + static const u32 VIFUnpackRecOffset = 0x0F000000; } // -------------------------------------------------------------------------------------- // SysMainMemory // -------------------------------------------------------------------------------------- // This class provides the main memory for the virtual machines. -class SysMainMemory +class SysMainMemory final { protected: const VirtualMemoryManagerPtr m_mainMemory; - VirtualMemoryBumpAllocator m_bumpAllocator; - eeMemoryReserve m_ee; - iopMemoryReserve m_iop; - vuMemoryReserve m_vu; + const VirtualMemoryManagerPtr m_codeMemory; + + VirtualMemoryBumpAllocator m_bumpAllocator; + + eeMemoryReserve m_ee; + iopMemoryReserve m_iop; + vuMemoryReserve m_vu; public: SysMainMemory(); - virtual ~SysMainMemory(); + ~SysMainMemory(); - const VirtualMemoryManagerPtr& MainMemory() { return m_mainMemory; } - VirtualMemoryBumpAllocator& BumpAllocator() { return m_bumpAllocator; } + const VirtualMemoryManagerPtr& MainMemory() { return m_mainMemory; } + const VirtualMemoryManagerPtr& CodeMemory() { return m_codeMemory; } - virtual void ReserveAll(); - virtual void CommitAll(); - virtual void ResetAll(); - virtual void DecommitAll(); - virtual void ReleaseAll(); + VirtualMemoryBumpAllocator& BumpAllocator() { return m_bumpAllocator; } + + const eeMemoryReserve& EEMemory() const { return m_ee; } + const iopMemoryReserve& IOPMemory() const { return m_iop; } + const vuMemoryReserve& VUMemory() const { return m_vu; } + + bool Allocate(); + void Reset(); + void Release(); }; // -------------------------------------------------------------------------------------- @@ -125,33 +140,11 @@ protected: // -------------------------------------------------------------------------------------- class SysCpuProviderPack { -protected: - ScopedExcept m_RecExceptionEE; - ScopedExcept m_RecExceptionIOP; - public: - std::unique_ptr CpuProviders; - SysCpuProviderPack(); - virtual ~SysCpuProviderPack(); + ~SysCpuProviderPack(); void ApplyConfig() const; - - bool HadSomeFailures( const Pcsx2Config::RecompilerOptions& recOpts ) const; - - bool IsRecAvailable_EE() const { return !m_RecExceptionEE; } - bool IsRecAvailable_IOP() const { return !m_RecExceptionIOP; } - - BaseException* GetException_EE() const { return m_RecExceptionEE.get(); } - BaseException* GetException_IOP() const { return m_RecExceptionIOP.get(); } - - bool IsRecAvailable_MicroVU0() const; - bool IsRecAvailable_MicroVU1() const; - BaseException* GetException_MicroVU0() const; - BaseException* GetException_MicroVU1() const; - -protected: - void CleanupMess() noexcept; }; // GetCpuProviders - this function is not implemented by PCSX2 core -- it must be @@ -161,8 +154,6 @@ extern SysCpuProviderPack& GetCpuProviders(); extern void SysLogMachineCaps(); // Detects cpu type and fills cpuInfo structs. extern void SysClearExecutionCache(); // clears recompiled execution caches! -extern u8 *SysMmapEx(uptr base, u32 size, uptr bounds, const char *caller="Unnamed"); - extern std::string SysGetBiosDiscID(); extern std::string SysGetDiscID(); diff --git a/pcsx2/System/RecTypes.h b/pcsx2/System/RecTypes.h index d0cb6b6b51..63a04a6711 100644 --- a/pcsx2/System/RecTypes.h +++ b/pcsx2/System/RecTypes.h @@ -28,29 +28,23 @@ class RecompiledCodeReserve : public VirtualMemoryReserve typedef VirtualMemoryReserve _parent; protected: - std::string m_profiler_name; + std::string m_profiler_name; public: - RecompiledCodeReserve( std::string name, uint defCommit = 0 ); - virtual ~RecompiledCodeReserve(); + RecompiledCodeReserve(std::string name); + ~RecompiledCodeReserve(); - virtual void* Assign( VirtualMemoryManagerPtr allocator, void *baseptr, size_t size ) override; - virtual void Reset() override; - virtual bool Commit() override; + void Assign(VirtualMemoryManagerPtr allocator, size_t offset, size_t size); + void Reset(); - virtual RecompiledCodeReserve& SetProfilerName( std::string shortname ); + RecompiledCodeReserve& SetProfilerName(std::string name); - void ThrowIfNotOk() const; + void ForbidModification(); + void AllowModification(); - operator void*() { return m_baseptr; } - operator const void*() const { return m_baseptr; } - - operator u8*() { return (u8*)m_baseptr; } - operator const u8*() const { return (u8*)m_baseptr; } + operator u8*() { return m_baseptr; } + operator const u8*() const { return m_baseptr; } protected: - void ResetProcessReserves() const; - void _registerProfiler(); - void _termProfiler(); }; diff --git a/pcsx2/USB/Win32/USBDialog.rc b/pcsx2/USB/Win32/USBDialog.rc index a3019dd344..46ae18a270 100644 --- a/pcsx2/USB/Win32/USBDialog.rc +++ b/pcsx2/USB/Win32/USBDialog.rc @@ -170,18 +170,18 @@ LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_ARGENTINA // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "resource_usb.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#include ""WinResrc.h""\r\n" "\0" END -3 TEXTINCLUDE +3 TEXTINCLUDE BEGIN "\r\n" "\0" diff --git a/pcsx2/USB/Win32/resource_usb.h b/pcsx2/USB/Win32/resource_usb.h index ead84d2ceb..5368e9d6ae 100644 --- a/pcsx2/USB/Win32/resource_usb.h +++ b/pcsx2/USB/Win32/resource_usb.h @@ -30,7 +30,7 @@ #define IDC_STATIC_USB -1 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 109 diff --git a/pcsx2/USB/configuration.cpp b/pcsx2/USB/configuration.cpp index ec4e6d63fe..c40efe6230 100644 --- a/pcsx2/USB/configuration.cpp +++ b/pcsx2/USB/configuration.cpp @@ -54,7 +54,7 @@ void USBsetLogDir(const char* dir) std::string GetSelectedAPI(const std::pair& pair) { - USBsetSettingsDir(); + USBsetSettingsDir(); auto it = changedAPIs.find(pair); if (it != changedAPIs.end()) return it->second; @@ -71,7 +71,7 @@ int GetSelectedSubtype(const std::pair& pair) bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, TSTDSTRING& value) { - USBsetSettingsDir(); + USBsetSettingsDir(); CIniKey* key; #ifdef _WIN32 auto sect = ciniFile.GetSection(section); @@ -93,7 +93,7 @@ bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TC bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, int32_t& value) { - USBsetSettingsDir(); + USBsetSettingsDir(); CIniKey* key; #ifdef _WIN32 auto sect = ciniFile.GetSection(section); @@ -124,7 +124,7 @@ bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TC bool SaveSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, const TSTDSTRING& value) { - USBsetSettingsDir(); + USBsetSettingsDir(); #ifdef _WIN32 ciniFile.SetKeyValue(section, param, value); #else @@ -135,7 +135,7 @@ bool SaveSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TC bool SaveSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, int32_t value) { - USBsetSettingsDir(); + USBsetSettingsDir(); #ifdef _WIN32 ciniFile.SetKeyValue(section, param, TSTDTOSTRING(value)); #else @@ -146,7 +146,7 @@ bool SaveSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TC void SaveConfig() { - USBsetSettingsDir(); + USBsetSettingsDir(); #ifdef _WIN32 SaveSetting(L"MAIN", L"log", conf.Log); #else @@ -260,7 +260,7 @@ void ClearSection(const TCHAR* section) void RemoveSection(const char* dev_type, int port, const std::string& key) { - USBsetSettingsDir(); + USBsetSettingsDir(); TSTDSTRING tkey; tkey.assign(key.begin(), key.end()); diff --git a/pcsx2/USB/icon_buzz_24.cpp b/pcsx2/USB/icon_buzz_24.cpp index f192ca68df..d173263ae7 100644 --- a/pcsx2/USB/icon_buzz_24.cpp +++ b/pcsx2/USB/icon_buzz_24.cpp @@ -15,7 +15,7 @@ // clang-format off #include "icon_buzz_24.h" -const unsigned char icon_buzz_24[] +const unsigned char icon_buzz_24[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/pcsx2/USB/qemu-usb/glib.cpp b/pcsx2/USB/qemu-usb/glib.cpp index 8829257c11..222fbd94a2 100644 --- a/pcsx2/USB/qemu-usb/glib.cpp +++ b/pcsx2/USB/qemu-usb/glib.cpp @@ -23,10 +23,10 @@ /** * g_malloc: * @n_bytes: the number of bytes to allocate - * + * * Allocates @n_bytes bytes of memory. * If @n_bytes is 0 it returns %NULL. - * + * * Returns: a pointer to the allocated memory */ void* my_g_malloc(size_t n_bytes) @@ -51,10 +51,10 @@ void* my_g_malloc(size_t n_bytes) /** * g_malloc0: * @n_bytes: the number of bytes to allocate - * + * * Allocates @n_bytes bytes of memory, initialized to 0's. * If @n_bytes is 0 it returns %NULL. - * + * * Returns: a pointer to the allocated memory */ void* my_g_malloc0(size_t n_bytes) @@ -80,10 +80,10 @@ void* my_g_malloc0(size_t n_bytes) * g_malloc_n: * @n_blocks: the number of blocks to allocate * @n_block_bytes: the size of each block in bytes - * + * * This function is similar to g_malloc(), allocating (@n_blocks * @n_block_bytes) bytes, * but care is taken to detect possible overflow during multiplication. - * + * * Since: 2.24 * Returns: a pointer to the allocated memory */ @@ -103,13 +103,13 @@ void* my_g_malloc_n(size_t n_blocks, * g_realloc: * @mem: (nullable): the memory to reallocate * @n_bytes: new size of the memory in bytes - * + * * Reallocates the memory pointed to by @mem, so that it now has space for * @n_bytes bytes of memory. It returns the new address of the memory, which may * have been moved. @mem may be %NULL, in which case it's considered to * have zero-length. @n_bytes may be 0, in which case %NULL will be returned * and @mem will be freed unless it is %NULL. - * + * * Returns: the new address of the allocated memory */ void* my_g_realloc(void* mem, @@ -139,10 +139,10 @@ void* my_g_realloc(void* mem, * @mem: (nullable): the memory to reallocate * @n_blocks: the number of blocks to allocate * @n_block_bytes: the size of each block in bytes - * + * * This function is similar to g_realloc(), allocating (@n_blocks * @n_block_bytes) bytes, * but care is taken to detect possible overflow during multiplication. - * + * * Since: 2.24 * Returns: the new address of the allocated memory */ diff --git a/pcsx2/USB/qemu-usb/qusb.h b/pcsx2/USB/qemu-usb/qusb.h index afe8081508..53d57af491 100644 --- a/pcsx2/USB/qemu-usb/qusb.h +++ b/pcsx2/USB/qemu-usb/qusb.h @@ -1,8 +1,8 @@ /* * QEMU USB API - * + * * Copyright (c) 2005 Fabrice Bellard - * + * * 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 diff --git a/pcsx2/USB/qemu-usb/usb-hub.cpp b/pcsx2/USB/qemu-usb/usb-hub.cpp index 8d7c6910db..83d18686ac 100644 --- a/pcsx2/USB/qemu-usb/usb-hub.cpp +++ b/pcsx2/USB/qemu-usb/usb-hub.cpp @@ -2,7 +2,7 @@ * QEMU USB HUB emulation * * Copyright (c) 2005 Fabrice Bellard - * + * * 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 @@ -114,7 +114,7 @@ static const uint8_t qemu_hub_config_descriptor[] = { 0x01, /* u8 bNumInterfaces; (1) */ 0x01, /* u8 bConfigurationValue; */ 0x00, /* u8 iConfiguration; */ - 0xc0, /* u8 bmAttributes; + 0xc0, /* u8 bmAttributes; Bit 7: must be set, 6: Self-powered, 5: Remote wakeup, diff --git a/pcsx2/USB/qemu-usb/vl.h b/pcsx2/USB/qemu-usb/vl.h index 047adb7ecd..1df9cbcd12 100644 --- a/pcsx2/USB/qemu-usb/vl.h +++ b/pcsx2/USB/qemu-usb/vl.h @@ -1,8 +1,8 @@ /* * QEMU System Emulator header - * + * * Copyright (c) 2003 Fabrice Bellard - * + * * 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 diff --git a/pcsx2/USB/readerwriterqueue/LICENSE.md b/pcsx2/USB/readerwriterqueue/LICENSE.md index 6d9383648f..ac5127b5e1 100644 --- a/pcsx2/USB/readerwriterqueue/LICENSE.md +++ b/pcsx2/USB/readerwriterqueue/LICENSE.md @@ -5,7 +5,7 @@ license (embedded in atomicops.h). Simplified BSD License: -Copyright (c) 2013-2015, Cameron Desrochers +Copyright (c) 2013-2015, Cameron Desrochers All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/pcsx2/USB/readerwriterqueue/README.md b/pcsx2/USB/readerwriterqueue/README.md index d104b2d1e0..3e4b187045 100644 --- a/pcsx2/USB/readerwriterqueue/README.md +++ b/pcsx2/USB/readerwriterqueue/README.md @@ -50,7 +50,7 @@ int* front = q.peek(); assert(*front == 18); succeeded = q.try_dequeue(number); assert(succeeded && number == 18); -front = q.peek(); +front = q.peek(); assert(front == nullptr); // Returns nullptr if the queue was empty ``` @@ -82,7 +82,7 @@ reader.join(); assert(q.size_approx() == 0); ``` - + Note that `wait_dequeue` will block indefinitely while the queue is empty; this means care must be taken to only call `wait_dequeue` if you're sure another element will come along eventually, or if the queue has a static lifetime. This is because diff --git a/pcsx2/USB/shared/inifile_usb.cpp b/pcsx2/USB/shared/inifile_usb.cpp index 7d2690763d..c18dab9f9d 100644 --- a/pcsx2/USB/shared/inifile_usb.cpp +++ b/pcsx2/USB/shared/inifile_usb.cpp @@ -465,7 +465,7 @@ const KeyIndexA& CIniSectionA::GetKeys() const return m_keys; } -std::string CIniSectionA::GetKeyValue(std::string sKey) const +std::string CIniSectionA::GetKeyValue(const std::string& sKey) const { std::string sValue; CIniKeyA* pKey = GetKey(sKey); @@ -476,7 +476,7 @@ std::string CIniSectionA::GetKeyValue(std::string sKey) const return sValue; } -void CIniSectionA::SetKeyValue(std::string sKey, const std::string& sValue) +void CIniSectionA::SetKeyValue(const std::string& sKey, const std::string& sValue) { CIniKeyA* pKey = AddKey(sKey); if (pKey) @@ -965,7 +965,7 @@ const KeyIndexW& CIniSectionW::GetKeys() const return m_keys; } -std::wstring CIniSectionW::GetKeyValue(std::wstring sKey) const +std::wstring CIniSectionW::GetKeyValue(const std::wstring& sKey) const { std::wstring sValue; CIniKeyW* pKey = GetKey(sKey); @@ -976,7 +976,7 @@ std::wstring CIniSectionW::GetKeyValue(std::wstring sKey) const return sValue; } -void CIniSectionW::SetKeyValue(std::wstring sKey, const std::wstring& sValue) +void CIniSectionW::SetKeyValue(const std::wstring& sKey, const std::wstring& sValue) { CIniKeyW* pKey = AddKey(sKey); if (pKey) diff --git a/pcsx2/USB/shared/inifile_usb.h b/pcsx2/USB/shared/inifile_usb.h index d6355bb6ca..a21587e5cf 100644 --- a/pcsx2/USB/shared/inifile_usb.h +++ b/pcsx2/USB/shared/inifile_usb.h @@ -203,9 +203,9 @@ public: // Returns all keys in the section by KeyIndex only to be used for enumeration const KeyIndexA& GetKeys() const; // Returns a KeyValue at a certain section - std::string GetKeyValue(std::string sKey) const; + std::string GetKeyValue(const std::string& sKey) const; // Sets a KeyValuePair at a certain section - void SetKeyValue(std::string sKey, const std::string& sValue); + void SetKeyValue(const std::string& sKey, const std::string& sValue); // Sets the section name, returns true on success, fails if the section // name sSectionName already exists bool SetSectionName(std::string sSectionName); @@ -439,9 +439,9 @@ public: // Returns all keys in the section by KeyIndex only to be used for enumeration const KeyIndexW& GetKeys() const; // Returns a KeyValue at a certain section - std::wstring GetKeyValue(std::wstring sKey) const; + std::wstring GetKeyValue(const std::wstring& sKey) const; // Sets a KeyValuePair at a certain section - void SetKeyValue(std::wstring sKey, const std::wstring& sValue); + void SetKeyValue(const std::wstring& sKey, const std::wstring& sValue); // Sets the section name, returns true on success, fails if the section // name sSectionName already exists bool SetSectionName(std::wstring sSectionName); diff --git a/pcsx2/USB/usb-eyetoy/jo_mpeg.cpp b/pcsx2/USB/usb-eyetoy/jo_mpeg.cpp index 7367f1363e..b14d0c73df 100644 --- a/pcsx2/USB/usb-eyetoy/jo_mpeg.cpp +++ b/pcsx2/USB/usb-eyetoy/jo_mpeg.cpp @@ -22,7 +22,7 @@ * Movie players *should* support it as the spec allows it, but ... * * MPEG-1/2 currently has no active patents as far as I am aware. - * + * * http://dvd.sourceforge.net/dvdinfo/mpeghdrs.html * http://www.cs.cornell.edu/dali/api/mpegvideo-c.html * */ diff --git a/pcsx2/USB/usb-hid/usb-buzzer.cpp b/pcsx2/USB/usb-hid/usb-buzzer.cpp index 0adf2139cc..6edfb42146 100644 --- a/pcsx2/USB/usb-hid/usb-buzzer.cpp +++ b/pcsx2/USB/usb-hid/usb-buzzer.cpp @@ -1,8 +1,8 @@ /* * QEMU USB HID devices - * + * * Copyright (c) 2005 Fabrice Bellard - * + * * 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 @@ -262,7 +262,7 @@ static const uint8_t vk_to_key_code[] = { 0x00, //FAIL: Windows 2000/XP: Browser Forward 0x00, //FAIL: Windows 2000/XP: Browser Refresh 0x00, //FAIL: Windows 2000/XP: Browser Stop -0x00, //FAIL: Windows 2000/XP: Browser Search +0x00, //FAIL: Windows 2000/XP: Browser Search 0x00, //FAIL: Windows 2000/XP: Browser Favorites 0x00, //FAIL: Windows 2000/XP: Browser Start and Home 0x00, //FAIL: Windows 2000/XP: Volume Mute @@ -278,13 +278,13 @@ static const uint8_t vk_to_key_code[] = { 0x00, //FAIL: Windows 2000/XP: Start Application 2 0x00, //FAIL: 0x00 0x00, //FAIL: 0x00 -0x33, //FAIL: Windows 2000/XP: For the US standard keyboard, the ';:' key +0x33, //FAIL: Windows 2000/XP: For the US standard keyboard, the ';:' key 0x2E, //FAIL: Windows 2000/XP: For any country/region, the '+' 0x36, //FAIL: Windows 2000/XP: For any country/region, the ',' 0x2D, //FAIL: Windows 2000/XP: For any country/region, the '-' 0x37, //FAIL: Windows 2000/XP: For any country/region, the '.' -0x38, //FAIL: Windows 2000/XP: For the US standard keyboard, the '/?' key -0x35, //FAIL: Windows 2000/XP: For the US standard keyboard, the '`~' key +0x38, //FAIL: Windows 2000/XP: For the US standard keyboard, the '/?' key +0x35, //FAIL: Windows 2000/XP: For the US standard keyboard, the '`~' key 0x00, //FAIL: 0x00 0x00, //FAIL: 0x00 0x00, //FAIL: 0x00 @@ -344,7 +344,7 @@ static const uint8_t vk_to_key_code[] = { 0x00, //FAIL: Erase EOF 0x00, //FAIL: Play 0x00, //FAIL: Zoom -0x00, //FAIL: Reserved +0x00, //FAIL: Reserved 0x00, //FAIL: PA1 0x9C, //OK: Clear 0x00, //FAIL: 0x00 @@ -486,13 +486,13 @@ static const uint8_t qemu_keyboard_config_descriptor[] = { 0x01, /* u8 bNumInterfaces; (1) */ 0x01, /* u8 bConfigurationValue; */ 0x04, /* u8 iConfiguration; */ - 0xa0, /* u8 bmAttributes; + 0xa0, /* u8 bmAttributes; Bit 7: must be set, 6: Self-powered, 5: Remote wakeup, 4..0: resvd */ 50, /* u8 MaxPower; */ - + /* USB 1.1: * USB 2.0, single TT organization (mandatory): * one interface, protocol 0 @@ -514,7 +514,7 @@ static const uint8_t qemu_keyboard_config_descriptor[] = { 0x01, /* u8 if_bInterfaceSubClass; */ 0x01, /* u8 if_bInterfaceProtocol; [usb1.1 or single tt] */ 0x05, /* u8 if_iInterface; */ - + /* HID descriptor */ 0x09, /* u8 bLength; */ 0x21, /* u8 bDescriptorType; */ @@ -541,13 +541,13 @@ static const uint8_t qemu_tablet_config_descriptor[] = { 0x01, /* u8 bNumInterfaces; (1) */ 0x01, /* u8 bConfigurationValue; */ 0x04, /* u8 iConfiguration; */ - 0xa0, /* u8 bmAttributes; + 0xa0, /* u8 bmAttributes; Bit 7: must be set, 6: Self-powered, 5: Remote wakeup, 4..0: resvd */ 50, /* u8 MaxPower; */ - + /* USB 1.1: * USB 2.0, single TT organization (mandatory): * one interface, protocol 0 @@ -701,12 +701,12 @@ static int usb_keyboard_handle_control(USBDevice *dev, int request, int value, case DeviceRequest | USB_REQ_GET_DESCRIPTOR: switch(value >> 8) { case USB_DT_DEVICE: - memcpy(data, qemu_keyboard_dev_descriptor, + memcpy(data, qemu_keyboard_dev_descriptor, sizeof(qemu_keyboard_dev_descriptor)); ret = sizeof(qemu_keyboard_dev_descriptor); break; case USB_DT_CONFIG: - memcpy(data, qemu_keyboard_config_descriptor, + memcpy(data, qemu_keyboard_config_descriptor, sizeof(qemu_keyboard_config_descriptor)); ret = sizeof(qemu_keyboard_config_descriptor); break; @@ -764,7 +764,7 @@ static int usb_keyboard_handle_control(USBDevice *dev, int request, int value, case InterfaceRequest | USB_REQ_GET_DESCRIPTOR: switch(value >> 8) { case 0x22: - memcpy(data, qemu_keyboard_hid_report_descriptor, + memcpy(data, qemu_keyboard_hid_report_descriptor, sizeof(qemu_keyboard_hid_report_descriptor)); ret = sizeof(qemu_keyboard_hid_report_descriptor); break; @@ -796,7 +796,7 @@ static int usb_keyboard_handle_control(USBDevice *dev, int request, int value, return ret; } -static int usb_keyboard_handle_data(USBDevice *dev, int pid, +static int usb_keyboard_handle_data(USBDevice *dev, int pid, uint8_t devep, uint8_t *data, int len) { USBKeyboardState *s = (USBKeyboardState *)dev; @@ -872,10 +872,10 @@ USBDevice *usb_keyboard_init(void) ovl.OffsetHigh=0; HidD_GetHidGuid(&guid); - + devInfo=SetupDiGetClassDevs(&guid, 0, 0, DIGCF_DEVICEINTERFACE); if(!devInfo)return 0; - + diData.cbSize=sizeof(diData); while(SetupDiEnumDeviceInterfaces(devInfo, 0, &guid, i, &diData)){ @@ -903,7 +903,7 @@ USBDevice *usb_keyboard_init(void) if((attr.VendorID==BUZZER_VID) && (attr.ProductID==BUZZER_PID || attr.ProductID==BUZZER_PID2)){ //We've found our buzzers !!! free(didData); - + memset(buf, 0, 8); buf[2]=0xFF; WriteFile(usb_buzzer, buf, 8, 0, &ovl); diff --git a/pcsx2/USB/usb-hid/usb-hid.cpp b/pcsx2/USB/usb-hid/usb-hid.cpp index ca4e7896f0..ed5895dc7c 100644 --- a/pcsx2/USB/usb-hid/usb-hid.cpp +++ b/pcsx2/USB/usb-hid/usb-hid.cpp @@ -153,7 +153,7 @@ namespace usb_hid 0x01, /* u8 bNumInterfaces; (1) */ 0x01, /* u8 bConfigurationValue; */ 0x04, /* u8 iConfiguration; */ - 0xa0, /* u8 bmAttributes; + 0xa0, /* u8 bmAttributes; Bit 7: must be set, 6: Self-powered, 5: Remote wakeup, @@ -229,7 +229,7 @@ namespace usb_hid 0x01, /* u8 bNumInterfaces; (1) */ 0x01, /* u8 bConfigurationValue; */ 0x04, /* u8 iConfiguration; */ - 0xa0, /* u8 bmAttributes; + 0xa0, /* u8 bmAttributes; Bit 7: must be set, 6: Self-powered, 5: Remote wakeup, @@ -284,7 +284,7 @@ namespace usb_hid 0x01, /* u8 bNumInterfaces; (1) */ 0x01, /* u8 bConfigurationValue; */ 0x04, /* u8 iConfiguration; */ - 0xa0, /* u8 bmAttributes; + 0xa0, /* u8 bmAttributes; Bit 7: must be set, 6: Self-powered, 5: Remote wakeup, diff --git a/pcsx2/USB/usb-mic/audiodev.h b/pcsx2/USB/usb-mic/audiodev.h index 701f4afbb9..3f389c88cb 100644 --- a/pcsx2/USB/usb-mic/audiodev.h +++ b/pcsx2/USB/usb-mic/audiodev.h @@ -97,7 +97,7 @@ public: virtual uint32_t GetBuffer(int16_t* buff, uint32_t len) = 0; virtual uint32_t SetBuffer(int16_t* buff, uint32_t len) = 0; /* - Get how many frames has been recorded so that caller knows + Get how many frames has been recorded so that caller knows how much to allocated for 16-bit buffer. */ virtual bool GetFrames(uint32_t* size) = 0; diff --git a/pcsx2/USB/usb-pad/bitjuggling.cpp b/pcsx2/USB/usb-pad/bitjuggling.cpp index 3267e41d3c..6b0a9bcb57 100644 --- a/pcsx2/USB/usb-pad/bitjuggling.cpp +++ b/pcsx2/USB/usb-pad/bitjuggling.cpp @@ -100,7 +100,7 @@ void bitarray_copy(const uint8_t* src_org, int src_offset, int src_len, int src_len_modulo; unsigned char c; /* - * Begin: Line things up on destination. + * Begin: Line things up on destination. */ if (src_offset_modulo > dst_offset_modulo) { @@ -123,7 +123,7 @@ void bitarray_copy(const uint8_t* src_org, int src_offset, int src_len, *dst++ |= c; /* - * Middle: copy with only shifting the source. + * Middle: copy with only shifting the source. */ byte_len = src_len / CHAR_BIT; @@ -135,7 +135,7 @@ void bitarray_copy(const uint8_t* src_org, int src_offset, int src_len, } /* - * End: copy the remaing bits; + * End: copy the remaing bits; */ src_len_modulo = src_len % CHAR_BIT; if (src_len_modulo) diff --git a/pcsx2/USB/usb-pad/dx/dinput-config.cpp b/pcsx2/USB/usb-pad/dx/dinput-config.cpp index 80bf9b09d1..b3f846cb20 100644 --- a/pcsx2/USB/usb-pad/dx/dinput-config.cpp +++ b/pcsx2/USB/usb-pad/dx/dinput-config.cpp @@ -523,10 +523,8 @@ namespace usb_pad GetClientRect(GetDlgItem(hWnd, IDC_PICTURE), &rect); MapWindowPoints(GetDlgItem(hWnd, IDC_PICTURE), hWnd, (POINT*)&rect, 2); - int px = rect.left; - int py = rect.top; - int pwidth = rect.right - rect.left; - int pheight = rect.bottom - rect.top; + const int pwidth = rect.right - rect.left; + const int pheight = rect.bottom - rect.top; DWORD startTime, endTime; @@ -565,7 +563,6 @@ namespace usb_pad // Get source bits int srcWidth = scale * pwidth; - int srcHeight = scale * pheight; int srcPitch = srcWidth * 4; int srcSize = srcWidth * srcPitch; BYTE* lpSrcBits = new BYTE[srcSize]; diff --git a/pcsx2/USB/usb-pad/dx/dinput.cpp b/pcsx2/USB/usb-pad/dx/dinput.cpp index 99d90a7f7a..10c040d9be 100644 --- a/pcsx2/USB/usb-pad/dx/dinput.cpp +++ b/pcsx2/USB/usb-pad/dx/dinput.cpp @@ -357,7 +357,6 @@ namespace usb_pad void CreateFFB(int port, LPDIRECTINPUTDEVICE8 device, DWORD axis) { - HRESULT hres; ReleaseFFB(port); if (!device) @@ -399,26 +398,46 @@ namespace usb_pad eff.cbTypeSpecificParams = sizeof(cfw); eff.lpvTypeSpecificParams = &cfw; - hres = device->CreateEffect(GUID_ConstantForce, &eff, &g_pEffectConstant[port], NULL); + { + HRESULT hres = device->CreateEffect(GUID_ConstantForce, &eff, &g_pEffectConstant[port], NULL); + if (FAILED(hres)) + Console.Warning("USB: CreateEffect GUID_ConstantForce error: %x", hres); + } cSpring.lNegativeCoefficient = 0; cSpring.lPositiveCoefficient = 0; effSpring.cbTypeSpecificParams = sizeof(cSpring); effSpring.lpvTypeSpecificParams = &cSpring; - hres = device->CreateEffect(GUID_Spring, &effSpring, &g_pEffectSpring[port], NULL); + { + HRESULT hres = device->CreateEffect(GUID_Spring, &effSpring, &g_pEffectSpring[port], NULL); + if (FAILED(hres)) + Console.Warning("USB: CreateEffect GUID_Spring error: %x", hres); + } effFriction.cbTypeSpecificParams = sizeof(cFriction); effFriction.lpvTypeSpecificParams = &cFriction; - hres = device->CreateEffect(GUID_Friction, &effFriction, &g_pEffectFriction[port], NULL); + { + HRESULT hres = device->CreateEffect(GUID_Friction, &effFriction, &g_pEffectFriction[port], NULL); + if (FAILED(hres)) + Console.Warning("USB: CreateEffect GUID_Friction error: %x", hres); + } effRamp.cbTypeSpecificParams = sizeof(cRamp); effRamp.lpvTypeSpecificParams = &cRamp; - hres = device->CreateEffect(GUID_RampForce, &effRamp, &g_pEffectRamp[port], NULL); + { + HRESULT hres = device->CreateEffect(GUID_RampForce, &effRamp, &g_pEffectRamp[port], NULL); + if (FAILED(hres)) + Console.Warning("USB: CreateEffect GUID_RampForce error: %x", hres); + } effDamper.cbTypeSpecificParams = sizeof(cDamper); effDamper.lpvTypeSpecificParams = &cDamper; - hres = device->CreateEffect(GUID_Damper, &effDamper, &g_pEffectDamper[port], NULL); + { + HRESULT hres = device->CreateEffect(GUID_Damper, &effDamper, &g_pEffectDamper[port], NULL); + if (FAILED(hres)) + Console.Warning("USB: CreateEffect GUID_Damper error: %x", hres); + } FFB[port] = true; diff --git a/pcsx2/USB/usb-pad/dx/versionproxy.rc b/pcsx2/USB/usb-pad/dx/versionproxy.rc index 74b2c5f52d..2f9cfc4296 100644 --- a/pcsx2/USB/usb-pad/dx/versionproxy.rc +++ b/pcsx2/USB/usb-pad/dx/versionproxy.rc @@ -25,18 +25,18 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "versionproxy.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#include ""WinResrc.h""\r\n" "\0" END -3 TEXTINCLUDE +3 TEXTINCLUDE BEGIN "\r\n" "\0" diff --git a/pcsx2/USB/usb-pad/raw/raw-config.cpp b/pcsx2/USB/usb-pad/raw/raw-config.cpp index 680d4d2bd1..b5c3be7426 100644 --- a/pcsx2/USB/usb-pad/raw/raw-config.cpp +++ b/pcsx2/USB/usb-pad/raw/raw-config.cpp @@ -51,8 +51,7 @@ namespace usb_pad { maps.clear(); - WCHAR sec[1024] = {0}, bind[32] = {0}; - int v = 0; + WCHAR bind[32] = {0}; for (int j = 0; j < 25; j++) { std::wstring hid, tmp; diff --git a/pcsx2/USB/usb-pad/raw/raw-config.rc b/pcsx2/USB/usb-pad/raw/raw-config.rc index 929e30f36b..173f9cc239 100644 --- a/pcsx2/USB/usb-pad/raw/raw-config.rc +++ b/pcsx2/USB/usb-pad/raw/raw-config.rc @@ -110,18 +110,18 @@ LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_ARGENTINA // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "raw-config-res.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#include ""WinResrc.h""\r\n" "\0" END -3 TEXTINCLUDE +3 TEXTINCLUDE BEGIN "\r\n" "\0" diff --git a/pcsx2/USB/usb-pad/raw/usb-pad-raw.cpp b/pcsx2/USB/usb-pad/raw/usb-pad-raw.cpp index 4cfd9d579d..d8cef35aec 100644 --- a/pcsx2/USB/usb-pad/raw/usb-pad-raw.cpp +++ b/pcsx2/USB/usb-pad/raw/usb-pad-raw.cpp @@ -25,7 +25,7 @@ namespace usb_pad void RawInputPad::WriterThread(void* ptr) { - DWORD res = 0, res2 = 0, written = 0; + DWORD written = 0; std::array buf; RawInputPad* pad = static_cast(ptr); @@ -35,7 +35,7 @@ namespace usb_pad { if (pad->mFFData.wait_dequeue_timed(buf, std::chrono::milliseconds(1000))) { - res = WriteFile(pad->mUsbHandle, buf.data(), buf.size(), &written, &pad->mOLWrite); + const DWORD res = WriteFile(pad->mUsbHandle, buf.data(), buf.size(), &written, &pad->mOLWrite); uint8_t* d = buf.data(); WaitForSingleObject(pad->mOLWrite.hEvent, 1000); @@ -48,7 +48,7 @@ namespace usb_pad void RawInputPad::ReaderThread(void* ptr) { RawInputPad* pad = static_cast(ptr); - DWORD res = 0, res2 = 0, read = 0; + DWORD read = 0; std::array report; //32 is random pad->mReaderThreadIsRunning = true; @@ -75,8 +75,7 @@ namespace usb_pad int RawInputPad::TokenIn(uint8_t* buf, int len) { - ULONG value = 0; - int player = 1 - mPort; + const int player = 1 - mPort; //Console.Warning("usb-pad: poll len=%li\n", len); if (mDoPassthrough) diff --git a/pcsx2/USB/usb-pad/raw/usb-pad-raw.h b/pcsx2/USB/usb-pad/raw/usb-pad-raw.h index e931dc113c..c4373a2d45 100644 --- a/pcsx2/USB/usb-pad/raw/usb-pad-raw.h +++ b/pcsx2/USB/usb-pad/raw/usb-pad-raw.h @@ -90,7 +90,7 @@ namespace usb_pad /* Layout: 0x8000 bit means it is a valid mapping, - where value is PS2 button/axis and + where value is PS2 button/axis and array (Mappings::btnMap etc.) index is physical button/axis (reversed for keyboard mappings). [31..16] bits player 2 mapping diff --git a/pcsx2/USB/usb-pad/usb-seamic.cpp b/pcsx2/USB/usb-pad/usb-seamic.cpp index 768180ec1c..bdae3afad5 100644 --- a/pcsx2/USB/usb-pad/usb-seamic.cpp +++ b/pcsx2/USB/usb-pad/usb-seamic.cpp @@ -404,7 +404,7 @@ namespace usb_pad #ifdef _WIN32 if (!LoadSetting(nullptr, port, usb_mic::SingstarDevice::TypeName(), N_DEVICE_API, tmp)) return nullptr; - api = wstr_to_str(tmp); + api = wstr_to_str(tmp); #else if (!LoadSetting(nullptr, port, usb_mic::SingstarDevice::TypeName(), N_DEVICE_API, api)) return nullptr; diff --git a/pcsx2/VMManager.cpp b/pcsx2/VMManager.cpp index b71dcccec1..1200072aa1 100644 --- a/pcsx2/VMManager.cpp +++ b/pcsx2/VMManager.cpp @@ -30,6 +30,7 @@ #include "common/Threading.h" #include "fmt/core.h" +#include "Achievements.h" #include "Counters.h" #include "CDVD/CDVD.h" #include "DEV9/DEV9.h" @@ -39,6 +40,7 @@ #include "GSDumpReplayer.h" #include "HostDisplay.h" #include "HostSettings.h" +#include "INISettingsInterface.h" #include "IopBios.h" #include "MTVU.h" #include "MemoryCardFile.h" @@ -51,13 +53,14 @@ #include "PAD/Host/PAD.h" #include "Sio.h" #include "ps2/BiosTools.h" +#include "Recording/InputRecordingControls.h" #include "DebugTools/MIPSAnalyst.h" #include "DebugTools/SymbolMap.h" -#include "Frontend/INISettingsInterface.h" -#include "Frontend/InputManager.h" -#include "Frontend/GameList.h" +#include "IconsFontAwesome5.h" + +#include "Recording/InputRecording.h" #include "common/emitter/tools.h" #ifdef _M_X86 @@ -66,11 +69,12 @@ #ifdef _WIN32 #include "common/RedtapeWindows.h" +#include +#include #endif namespace VMManager { - static void LoadSettings(); static void ApplyGameFixes(); static bool UpdateGameSettingsLayer(); static void CheckForConfigChanges(const Pcsx2Config& old_config); @@ -81,9 +85,12 @@ namespace VMManager static void CheckForSPU2ConfigChanges(const Pcsx2Config& old_config); static void CheckForDEV9ConfigChanges(const Pcsx2Config& old_config); static void CheckForMemoryCardConfigChanges(const Pcsx2Config& old_config); + static void EnforceAchievementsChallengeModeSettings(); + static void LogUnsafeSettingsToConsole(const std::string& messages); + static void WarnAboutUnsafeSettings(); static bool AutoDetectSource(const std::string& filename); - static bool ApplyBootParameters(const VMBootParameters& params, std::string* state_to_load); + static bool ApplyBootParameters(VMBootParameters params, std::string* state_to_load); static bool CheckBIOSAvailability(); static void LoadPatches(const std::string& serial, u32 crc, bool show_messages, bool show_messages_when_disabled); @@ -91,7 +98,7 @@ namespace VMManager static std::string GetCurrentSaveStateFileName(s32 slot); static bool DoLoadState(const char* filename); - static bool DoSaveState(const char* filename, s32 slot_for_message, bool zip_on_thread); + static bool DoSaveState(const char* filename, s32 slot_for_message, bool zip_on_thread, bool backup_old_state); static void ZipSaveState(std::unique_ptr elist, std::unique_ptr screenshot, std::string osd_key, const char* filename, s32 slot_for_message); @@ -100,6 +107,7 @@ namespace VMManager std::string filename, s32 slot_for_message); static void SetTimerResolutionIncreased(bool enabled); + static void SetHardwareDependentDefaultSettings(SettingsInterface& si); static void EnsureCPUInfoInitialized(); static void SetEmuThreadAffinities(); } // namespace VMManager @@ -116,7 +124,7 @@ static Threading::ThreadHandle s_vm_thread_handle; static std::deque s_save_state_threads; static std::mutex s_save_state_threads_mutex; -static std::mutex s_info_mutex; +static std::recursive_mutex s_info_mutex; static std::string s_disc_path; static u32 s_game_crc; static u32 s_patches_crc; @@ -131,10 +139,9 @@ static std::vector s_no_interlacing_cheats_data; static bool s_no_interlacing_cheats_loaded = false; static s32 s_active_widescreen_patches = 0; static u32 s_active_no_interlacing_patches = 0; -static s32 s_current_save_slot = 1; static u32 s_frame_advance_count = 0; static u32 s_mxcsr_saved; -static std::optional s_limiter_mode_prior_to_hold_interaction; +static bool s_gs_open_on_initialize = false; bool VMManager::PerformEarlyHardwareChecks(const char** error) { @@ -183,12 +190,12 @@ void VMManager::SetState(VMState state) if (state != VMState::Stopping && (state == VMState::Paused || old_state == VMState::Paused)) { - if (state == VMState::Paused) + const bool paused = (state == VMState::Paused); + if (paused) { if (THREAD_VU1) vu1Thread.WaitVU(); GetMTGS().WaitGS(false); - InputManager::PauseVibration(); } else { @@ -254,6 +261,12 @@ bool VMManager::Internal::InitializeGlobals() x86caps.CalculateMHz(); SysLogMachineCaps(); + if (GSinit() != 0) + { + Host::ReportErrorAsync("Error", "Failed to initialize GS (GSinit())."); + return false; + } + return true; } @@ -271,8 +284,7 @@ bool VMManager::Internal::InitializeMemory() s_vm_memory = std::make_unique(); s_cpu_provider_pack = std::make_unique(); - s_vm_memory->ReserveAll(); - return true; + return s_vm_memory->Allocate(); } void VMManager::Internal::ReleaseMemory() @@ -282,8 +294,6 @@ void VMManager::Internal::ReleaseMemory() std::vector().swap(s_no_interlacing_cheats_data); s_no_interlacing_cheats_loaded = false; - s_vm_memory->DecommitAll(); - s_vm_memory->ReleaseAll(); s_vm_memory.reset(); s_cpu_provider_pack.reset(); } @@ -302,12 +312,13 @@ void VMManager::LoadSettings() { std::unique_lock lock = Host::GetSettingsLock(); SettingsInterface* si = Host::GetSettingsInterface(); - SettingsInterface* binding_si = Host::GetSettingsInterfaceForBindings(); SettingsLoadWrapper slw(*si); EmuConfig.LoadSave(slw); - PAD::LoadConfig(*binding_si); - InputManager::ReloadSources(*si, lock); - InputManager::ReloadBindings(*si, *binding_si); + PAD::LoadConfig(*si); + Host::LoadSettings(*si, lock); + + // Achievements hardcore mode disallows setting some configuration options. + EnforceAchievementsChallengeModeSettings(); // Remove any user-specified hacks in the config (we don't want stale/conflicting values when it's globally disabled). EmuConfig.GS.MaskUserHacks(); @@ -332,7 +343,12 @@ void VMManager::LoadSettings() EmuConfig.Speedhacks.vuThread = false; if (HasValidVM()) + { + if (EmuConfig.WarnAboutUnsafeSettings) + WarnAboutUnsafeSettings(); + ApplyGameFixes(); + } } void VMManager::ApplyGameFixes() @@ -349,12 +365,11 @@ void VMManager::ApplyGameFixes() std::string VMManager::GetGameSettingsPath(const std::string_view& game_serial, u32 game_crc) { - std::string sanitized_serial(game_serial); - Path::SanitizeFileName(sanitized_serial); + std::string sanitized_serial(Path::SanitizeFileName(game_serial)); return game_serial.empty() ? Path::Combine(EmuFolders::GameSettings, fmt::format("{:08X}.ini", game_crc)) : - Path::Combine(EmuFolders::GameSettings, fmt::format("{}_{:08X}.ini", sanitized_serial, game_crc)); + Path::Combine(EmuFolders::GameSettings, fmt::format("{}_{:08X}.ini", sanitized_serial, game_crc)); } std::string VMManager::GetInputProfilePath(const std::string_view& name) @@ -397,7 +412,7 @@ void VMManager::RequestDisplaySize(float scale /*= 0.0f*/) if (scale != 0.0f) { // unapply the upscaling, then apply the scale - scale = (1.0f / static_cast(GSConfig.UpscaleMultiplier)) * scale; + scale = (1.0f / GSConfig.UpscaleMultiplier) * scale; width *= scale; height *= scale; } @@ -411,7 +426,7 @@ void VMManager::RequestDisplaySize(float scale /*= 0.0f*/) bool VMManager::UpdateGameSettingsLayer() { std::unique_ptr new_interface; - if (s_game_crc != 0) + if (s_game_crc != 0 && Host::GetBaseBoolSettingValue("EmuCore", "EnablePerGameSettings", true)) { std::string filename(GetGameSettingsPath(s_game_serial.c_str(), s_game_crc)); if (!FileSystem::FileExists(filename.c_str())) @@ -437,8 +452,13 @@ bool VMManager::UpdateGameSettingsLayer() } std::string input_profile_name; + bool use_game_settings_for_controller = false; if (new_interface) - new_interface->GetStringValue("EmuCore", "InputProfileName", &input_profile_name); + { + new_interface->GetBoolValue("Pad", "UseGameSettingsForController", &use_game_settings_for_controller); + if (!use_game_settings_for_controller) + new_interface->GetStringValue("EmuCore", "InputProfileName", &input_profile_name); + } if (!s_game_settings_interface && !new_interface && s_input_profile_name == input_profile_name) return false; @@ -447,32 +467,39 @@ bool VMManager::UpdateGameSettingsLayer() s_game_settings_interface = std::move(new_interface); std::unique_ptr input_interface; - if (!input_profile_name.empty()) + if (!use_game_settings_for_controller) { - const std::string filename(GetInputProfilePath(input_profile_name)); - if (FileSystem::FileExists(filename.c_str())) + if (!input_profile_name.empty()) { - Console.WriteLn("Loading input profile from '%s'...", filename.c_str()); - input_interface = std::make_unique(std::move(filename)); - if (!input_interface->Load()) + const std::string filename(GetInputProfilePath(input_profile_name)); + if (FileSystem::FileExists(filename.c_str())) { - Console.Error("Failed to parse input profile ini '%s'", input_interface->GetFileName().c_str()); - input_interface.reset(); + Console.WriteLn("Loading input profile from '%s'...", filename.c_str()); + input_interface = std::make_unique(std::move(filename)); + if (!input_interface->Load()) + { + Console.Error("Failed to parse input profile ini '%s'", input_interface->GetFileName().c_str()); + input_interface.reset(); + input_profile_name = {}; + } + } + else + { + DevCon.WriteLn("No game settings found (tried '%s')", filename.c_str()); input_profile_name = {}; } } - else - { - DevCon.WriteLn("No game settings found (tried '%s')", filename.c_str()); - input_profile_name = {}; - } + + Host::Internal::SetInputSettingsLayer(input_interface ? input_interface.get() : Host::Internal::GetBaseSettingsLayer()); + } + else + { + // using game settings for bindings too + Host::Internal::SetInputSettingsLayer(s_game_settings_interface.get()); } - Host::Internal::SetInputSettingsLayer(input_interface.get()); s_input_settings_interface = std::move(input_interface); s_input_profile_name = std::move(input_profile_name); - - return true; } @@ -513,7 +540,7 @@ void VMManager::LoadPatches(const std::string& serial, u32 crc, bool show_messag // wide screen patches if (EmuConfig.EnableWideScreenPatches && crc != 0) { - if (s_active_widescreen_patches = LoadPatchesFromDir(crc_string, EmuFolders::CheatsWS, "Widescreen hacks", false)) + if (!Achievements::ChallengeModeActive() && (s_active_widescreen_patches = LoadPatchesFromDir(crc_string, EmuFolders::CheatsWS, "Widescreen hacks", false) > 0)) { Console.WriteLn(Color_Gray, "Found widescreen patches in the cheats_ws folder --> skipping cheats_ws.zip"); } @@ -555,7 +582,7 @@ void VMManager::LoadPatches(const std::string& serial, u32 crc, bool show_messag // no-interlacing patches if (EmuConfig.EnableNoInterlacingPatches && crc != 0) { - if (s_active_no_interlacing_patches = LoadPatchesFromDir(crc_string, EmuFolders::CheatsNI, "No-interlacing patches", false)) + if (!Achievements::ChallengeModeActive() && (s_active_no_interlacing_patches = LoadPatchesFromDir(crc_string, EmuFolders::CheatsNI, "No-interlacing patches", false)) > 0) { Console.WriteLn(Color_Gray, "Found no-interlacing patches in the cheats_ni folder --> skipping cheats_ni.zip"); } @@ -600,11 +627,11 @@ void VMManager::LoadPatches(const std::string& serial, u32 crc, bool show_messag if (cheat_count > 0 || s_active_widescreen_patches > 0 || s_active_no_interlacing_patches > 0) { message += " are active."; - Host::AddKeyedOSDMessage("LoadPatches", std::move(message), 5.0f); + Host::AddIconOSDMessage("LoadPatches", ICON_FA_FILE_CODE, message, Host::OSD_INFO_DURATION); } else if (show_messages_when_disabled) { - Host::AddKeyedOSDMessage("LoadPatches", "No cheats or patches (widescreen, compatibility or others) are found / enabled.", 8.0f); + Host::AddIconOSDMessage("LoadPatches", ICON_FA_FILE_CODE, "No cheats or patches (widescreen, compatibility or others) are found / enabled.", Host::OSD_INFO_DURATION); } } } @@ -656,16 +683,27 @@ void VMManager::UpdateRunningGame(bool resetting, bool game_starting) // If we don't reset the timer here, when using folder memcards the reindex will cause an eject, // which a bunch of games don't like since they access the memory card on boot. if (game_starting || resetting) - ClearMcdEjectTimeoutNow(); + AutoEject::ClearAll(); } UpdateGameSettingsLayer(); ApplySettings(); - // check this here, for two cases: dynarec on, and when enable cheats is set per-game. + // Clear the memory card eject notification again when booting for the first time, or starting. + // Otherwise, games think the card was removed on boot. + if (game_starting || resetting) + AutoEject::ClearAll(); + + // Check this here, for two cases: dynarec on, and when enable cheats is set per-game. if (s_patches_crc != s_game_crc) ReloadPatches(game_starting, false); +#ifdef ENABLE_ACHIEVEMENTS + // Per-game ini enabling of hardcore mode. We need to re-enforce the settings if so. + if (game_starting && Achievements::ResetChallengeMode()) + ApplySettings(); +#endif + GetMTGS().SendGameCRC(new_crc); Host::OnGameChanged(s_disc_path, s_game_serial, s_game_name, s_game_crc); @@ -730,15 +768,15 @@ bool VMManager::AutoDetectSource(const std::string& filename) } } -bool VMManager::ApplyBootParameters(const VMBootParameters& params, std::string* state_to_load) +bool VMManager::ApplyBootParameters(VMBootParameters params, std::string* state_to_load) { const bool default_fast_boot = Host::GetBoolSettingValue("EmuCore", "EnableFastBoot", true); EmuConfig.UseBOOT2Injection = params.fast_boot.value_or(default_fast_boot); - s_elf_override = params.elf_override; + s_elf_override = std::move(params.elf_override); s_disc_path.clear(); if (!params.save_state.empty()) - *state_to_load = params.save_state; + *state_to_load = std::move(params.save_state); // if we're loading an indexed save state, we need to get the serial/crc from the disc. if (params.state_index.has_value()) @@ -757,6 +795,16 @@ bool VMManager::ApplyBootParameters(const VMBootParameters& params, std::string* } } +#ifdef ENABLE_ACHIEVEMENTS + // Check for resuming with hardcore mode. + Achievements::ResetChallengeMode(); + if (!state_to_load->empty() && Achievements::ChallengeModeActive() && + !Achievements::ConfirmChallengeModeDisable("Resuming state")) + { + return false; + } +#endif + // resolve source type if (params.source_type.has_value()) { @@ -767,8 +815,8 @@ bool VMManager::ApplyBootParameters(const VMBootParameters& params, std::string* } // Use specified source type. - s_disc_path = params.filename; - CDVDsys_SetFile(params.source_type.value(), params.filename); + s_disc_path = std::move(params.filename); + CDVDsys_SetFile(params.source_type.value(), s_disc_path); CDVDsys_ChangeSource(params.source_type.value()); } else @@ -801,15 +849,15 @@ bool VMManager::CheckBIOSAvailability() // TODO: When we translate core strings, translate this. const char* message = "PCSX2 requires a PS2 BIOS in order to run.\n\n" - "For legal reasons, you *must* obtain a BIOS from an actual PS2 unit that you own (borrowing doesn't count).\n\n" - "Once dumped, this BIOS image should be placed in the bios folder within the data directory (Tools Menu -> Open Data Directory).\n\n" - "Please consult the FAQs and Guides for further instructions."; + "For legal reasons, you *must* obtain a BIOS from an actual PS2 unit that you own (borrowing doesn't count).\n\n" + "Once dumped, this BIOS image should be placed in the bios folder within the data directory (Tools Menu -> Open Data Directory).\n\n" + "Please consult the FAQs and Guides for further instructions."; Host::ReportErrorAsync("Startup Error", message); return false; } -bool VMManager::Initialize(const VMBootParameters& boot_params) +bool VMManager::Initialize(VMBootParameters boot_params) { const Common::Timer init_timer; pxAssertRel(s_state.load(std::memory_order_acquire) == VMState::Shutdown, "VM is shutdown"); @@ -832,10 +880,8 @@ bool VMManager::Initialize(const VMBootParameters& boot_params) Host::OnVMDestroyed(); }; - LoadSettings(); - std::string state_to_load; - if (!ApplyBootParameters(boot_params, &state_to_load)) + if (!ApplyBootParameters(std::move(boot_params), &state_to_load)) return false; EmuConfig.LimiterMode = GetInitialLimiterMode(); @@ -844,9 +890,6 @@ bool VMManager::Initialize(const VMBootParameters& boot_params) if (!GSDumpReplayer::IsReplayingDump() && !CheckBIOSAvailability()) return false; - Console.WriteLn("Allocating memory map..."); - s_vm_memory->CommitAll(); - Console.WriteLn("Opening CDVD..."); if (!DoCDVDopen()) { @@ -856,17 +899,21 @@ bool VMManager::Initialize(const VMBootParameters& boot_params) ScopedGuard close_cdvd = [] { DoCDVDclose(); }; Console.WriteLn("Opening GS..."); - if (!GetMTGS().WaitForOpen()) + s_gs_open_on_initialize = GetMTGS().IsOpen(); + if (!s_gs_open_on_initialize && !GetMTGS().WaitForOpen()) { // we assume GS is going to report its own error Console.WriteLn("Failed to open GS."); return false; } - ScopedGuard close_gs = []() { GetMTGS().WaitForClose(); }; + ScopedGuard close_gs = []() { + if (!s_gs_open_on_initialize) + GetMTGS().WaitForClose(); + }; Console.WriteLn("Opening SPU2..."); - if (SPU2init() != 0 || SPU2open() != 0) + if (SPU2init(false) != 0 || SPU2open() != 0) { Host::ReportErrorAsync("Startup Error", "Failed to initialize SPU2."); SPU2shutdown(); @@ -878,7 +925,7 @@ bool VMManager::Initialize(const VMBootParameters& boot_params) }; Console.WriteLn("Opening PAD..."); - if (PADinit() != 0 || PADopen(Host::GetHostDisplay()->GetWindowInfo()) != 0) + if (PADinit() != 0 || PADopen(g_host_display->GetWindowInfo()) != 0) { Host::ReportErrorAsync("Startup Error", "Failed to initialize PAD."); return false; @@ -900,7 +947,7 @@ bool VMManager::Initialize(const VMBootParameters& boot_params) }; Console.WriteLn("Opening USB..."); - if (USBinit() != 0 || USBopen(Host::GetHostDisplay()->GetWindowInfo()) != 0) + if (USBinit() != 0 || USBopen(g_host_display->GetWindowInfo()) != 0) { Host::ReportErrorAsync("Startup Error", "Failed to initialize USB."); return false; @@ -986,7 +1033,7 @@ void VMManager::Shutdown(bool save_resume_state) if (!GSDumpReplayer::IsReplayingDump() && save_resume_state) { std::string resume_file_name(GetCurrentSaveStateFileName(-1)); - if (!resume_file_name.empty() && !DoSaveState(resume_file_name.c_str(), -1, true)) + if (!resume_file_name.empty() && !DoSaveState(resume_file_name.c_str(), -1, true, false)) Console.Error("Failed to save resume state"); } else if (GSDumpReplayer::IsReplayingDump()) @@ -995,6 +1042,12 @@ void VMManager::Shutdown(bool save_resume_state) } { + LastELF.clear(); + DiscSerial.clear(); + ElfCRC = 0; + ElfEntry = 0; + ElfTextRange = {}; + std::unique_lock lock(s_info_mutex); s_disc_path.clear(); s_game_crc = 0; @@ -1006,7 +1059,6 @@ void VMManager::Shutdown(bool save_resume_state) s_active_game_fixes = 0; s_active_widescreen_patches = 0; s_active_no_interlacing_patches = 0; - s_limiter_mode_prior_to_hold_interaction.reset(); UpdateGameSettingsLayer(); @@ -1020,6 +1072,7 @@ void VMManager::Shutdown(bool save_resume_state) ForgetLoadedPatches(); R3000A::ioman::reset(); + vtlb_Shutdown(); USBclose(); SPU2close(); PADclose(); @@ -1027,27 +1080,41 @@ void VMManager::Shutdown(bool save_resume_state) DoCDVDclose(); FWclose(); FileMcd_EmuClose(); - GetMTGS().WaitForClose(); + + // If the fullscreen UI is running, do a hardware reset on the GS + // so that the texture cache and targets are all cleared. + if (s_gs_open_on_initialize) + { + GetMTGS().WaitGS(false, false, false); + GetMTGS().ResetGS(true); + } + else + { + GetMTGS().WaitForClose(); + } + USBshutdown(); SPU2shutdown(); PADshutdown(); DEV9shutdown(); GSshutdown(); - s_vm_memory->DecommitAll(); - s_state.store(VMState::Shutdown, std::memory_order_release); Host::OnVMDestroyed(); } void VMManager::Reset() { +#ifdef ENABLE_ACHIEVEMENTS + if (!Achievements::OnReset()) + return; +#endif + const bool game_was_started = g_GameStarted; s_active_game_fixes = 0; s_active_widescreen_patches = 0; s_active_no_interlacing_patches = 0; - s_limiter_mode_prior_to_hold_interaction.reset(); SysClearExecutionCache(); memBindConditionalHandlers(); @@ -1058,6 +1125,12 @@ void VMManager::Reset() // gameid change, so apply settings if (game_was_started) UpdateRunningGame(true, false); + + if (g_InputRecording.isActive()) + { + g_InputRecording.handleReset(); + GetMTGS().PresentCurrentFrame(); + } } std::string VMManager::GetSaveStateFileName(const char* game_serial, u32 game_crc, s32 slot) @@ -1081,22 +1154,10 @@ std::string VMManager::GetSaveStateFileName(const char* filename, s32 slot) pxAssertRel(!HasValidVM(), "Should not have a VM when calling the non-gamelist GetSaveStateFileName()"); std::string ret; - - // try the game list first, but this won't work if we're in batch mode - auto lock = GameList::GetLock(); - if (const GameList::Entry* entry = GameList::GetEntryForPath(filename); entry) - { - ret = GetSaveStateFileName(entry->serial.c_str(), entry->crc, slot); - } - else - { - // just scan it.. hopefully it'll come back okay - GameList::Entry temp_entry; - if (GameList::PopulateEntryFromPath(filename, &temp_entry)) - { - ret = GetSaveStateFileName(temp_entry.serial.c_str(), temp_entry.crc, slot); - } - } + std::string serial; + u32 crc; + if (Host::GetSerialAndCRCForFilename(filename, &serial, &crc)) + ret = GetSaveStateFileName(serial.c_str(), crc, slot); return ret; } @@ -1122,15 +1183,13 @@ bool VMManager::DoLoadState(const char* filename) { Host::OnSaveStateLoading(filename); SaveState_UnzipFromDisk(filename); - - // HACK: LastELF isn't in the save state... - if (!s_elf_override.empty()) - cdvdReloadElfInfo(fmt::format("host:{}", s_elf_override)); - else - cdvdReloadElfInfo(); - UpdateRunningGame(false, false); Host::OnSaveStateLoaded(filename, true); + if (g_InputRecording.isActive()) + { + g_InputRecording.handleLoadingSavestate(); + GetMTGS().PresentCurrentFrame(); + } return true; } catch (Exception::BaseException& e) @@ -1141,7 +1200,7 @@ bool VMManager::DoLoadState(const char* filename) } } -bool VMManager::DoSaveState(const char* filename, s32 slot_for_message, bool zip_on_thread) +bool VMManager::DoSaveState(const char* filename, s32 slot_for_message, bool zip_on_thread, bool backup_old_state) { if (GSDumpReplayer::IsReplayingDump()) return false; @@ -1153,6 +1212,17 @@ bool VMManager::DoSaveState(const char* filename, s32 slot_for_message, bool zip std::unique_ptr elist(SaveState_DownloadState()); std::unique_ptr screenshot(SaveState_SaveScreenshot()); + if (FileSystem::FileExists(filename) && backup_old_state) + { + const std::string backup_filename(fmt::format("{}.backup", filename)); + Console.WriteLn(fmt::format("Creating save state backup {}...", backup_filename)); + if (!FileSystem::RenamePath(filename, backup_filename.c_str())) + { + Host::AddIconOSDMessage(std::move(osd_key), ICON_FA_EXCLAMATION_TRIANGLE, + fmt::format("Failed to back up old save state {}.", Path::GetFileName(filename)), Host::OSD_ERROR_DURATION); + } + } + if (zip_on_thread) { // lock order here is important; the thread could exit before we resume here. @@ -1171,7 +1241,8 @@ bool VMManager::DoSaveState(const char* filename, s32 slot_for_message, bool zip } catch (Exception::BaseException& e) { - Host::AddKeyedOSDMessage(std::move(osd_key), fmt::format("Failed to save save state: {}.", e.DiagMsg()), 15.0f); + Host::AddIconOSDMessage(std::move(osd_key), ICON_FA_EXCLAMATION_TRIANGLE, fmt::format("Failed to save save state: {}.", e.DiagMsg()), + Host::OSD_ERROR_DURATION); return false; } } @@ -1185,11 +1256,13 @@ void VMManager::ZipSaveState(std::unique_ptr elist, if (SaveState_ZipToDisk(std::move(elist), std::move(screenshot), filename)) { if (slot_for_message >= 0 && VMManager::HasValidVM()) - Host::AddKeyedOSDMessage(std::move(osd_key), fmt::format("State saved to slot {}.", slot_for_message), 10.0f); + Host::AddIconOSDMessage(std::move(osd_key), ICON_FA_SAVE, fmt::format("State saved to slot {}.", slot_for_message), + Host::OSD_QUICK_DURATION); } else { - Host::AddKeyedOSDMessage(std::move(osd_key), fmt::format("Failed to save save state to slot {}.", slot_for_message), 15.0f); + Host::AddIconOSDMessage(std::move(osd_key), ICON_FA_EXCLAMATION_TRIANGLE, fmt::format("Failed to save save state to slot {}.", slot_for_message), + Host::OSD_ERROR_DURATION); } DevCon.WriteLn("Zipping save state to '%s' took %.2f ms", filename, timer.GetTimeMilliseconds()); @@ -1231,8 +1304,38 @@ void VMManager::WaitForSaveStateFlush() } } +u32 VMManager::DeleteSaveStates(const char* game_serial, u32 game_crc, bool also_backups /* = true */) +{ + WaitForSaveStateFlush(); + + u32 deleted = 0; + for (s32 i = -1; i <= NUM_SAVE_STATE_SLOTS; i++) + { + std::string filename(GetSaveStateFileName(game_serial, game_crc, i)); + if (FileSystem::FileExists(filename.c_str()) && FileSystem::DeleteFilePath(filename.c_str())) + deleted++; + + if (also_backups) + { + filename += ".backup"; + if (FileSystem::FileExists(filename.c_str()) && FileSystem::DeleteFilePath(filename.c_str())) + deleted++; + } + } + + return deleted; +} + bool VMManager::LoadState(const char* filename) { +#ifdef ENABLE_ACHIEVEMENTS + if (Achievements::ChallengeModeActive() && + !Achievements::ConfirmChallengeModeDisable("Loading state")) + { + return false; + } +#endif + // TODO: Save the current state so we don't need to reset. if (DoLoadState(filename)) return true; @@ -1246,17 +1349,25 @@ bool VMManager::LoadStateFromSlot(s32 slot) const std::string filename(GetCurrentSaveStateFileName(slot)); if (filename.empty()) { - Host::AddKeyedOSDMessage("LoadStateFromSlot", fmt::format("There is no save state in slot {}.", slot), 5.0f); + Host::AddIconOSDMessage("LoadStateFromSlot", ICON_FA_EXCLAMATION_TRIANGLE, fmt::format("There is no save state in slot {}.", slot), 5.0f); return false; } - Host::AddKeyedOSDMessage("LoadStateFromSlot", fmt::format("Loading state from slot {}...", slot), 5.0f); +#ifdef ENABLE_ACHIEVEMENTS + if (Achievements::ChallengeModeActive() && + !Achievements::ConfirmChallengeModeDisable("Loading state")) + { + return false; + } +#endif + + Host::AddIconOSDMessage("LoadStateFromSlot", ICON_FA_FOLDER_OPEN, fmt::format("Loading state from slot {}...", slot), Host::OSD_QUICK_DURATION); return DoLoadState(filename.c_str()); } -bool VMManager::SaveState(const char* filename, bool zip_on_thread) +bool VMManager::SaveState(const char* filename, bool zip_on_thread, bool backup_old_state) { - return DoSaveState(filename, -1, zip_on_thread); + return DoSaveState(filename, -1, zip_on_thread, backup_old_state); } bool VMManager::SaveStateToSlot(s32 slot, bool zip_on_thread) @@ -1266,8 +1377,8 @@ bool VMManager::SaveStateToSlot(s32 slot, bool zip_on_thread) return false; // if it takes more than a minute.. well.. wtf. - Host::AddKeyedOSDMessage(fmt::format("SaveStateSlot{}", slot), fmt::format("Saving state to slot {}...", slot), 60.0f); - return DoSaveState(filename.c_str(), slot, zip_on_thread); + Host::AddIconOSDMessage(fmt::format("SaveStateSlot{}", slot), ICON_FA_SAVE, fmt::format("Saving state to slot {}...", slot), 60.0f); + return DoSaveState(filename.c_str(), slot, zip_on_thread, EmuConfig.BackupSavestate); } LimiterModeType VMManager::GetLimiterMode() @@ -1282,7 +1393,7 @@ void VMManager::SetLimiterMode(LimiterModeType type) EmuConfig.LimiterMode = type; gsUpdateFrequency(EmuConfig); - GetMTGS().SetVSync(EmuConfig.GetEffectiveVsyncMode()); + GetMTGS().UpdateVSyncMode(); } void VMManager::FrameAdvance(u32 num_frames /*= 1*/) @@ -1290,6 +1401,11 @@ void VMManager::FrameAdvance(u32 num_frames /*= 1*/) if (!HasValidVM()) return; +#ifdef ENABLE_ACHIEVEMENTS + if (Achievements::ChallengeModeActive() && !Achievements::ConfirmChallengeModeDisable("Frame advancing")) + return; +#endif + s_frame_advance_count = num_frames; SetState(VMState::Running); } @@ -1308,19 +1424,20 @@ bool VMManager::ChangeDisc(CDVD_SourceType source, std::string path) if (result) { if (source == CDVD_SourceType::NoDisc) - Host::AddKeyedOSDMessage("ChangeDisc", "Disc removed.", 5.0f); + Host::AddIconOSDMessage("ChangeDisc", ICON_FA_COMPACT_DISC, "Disc removed.", Host::OSD_INFO_DURATION); else - Host::AddKeyedOSDMessage("ChangeDisc", fmt::format("Disc changed to '{}'.", display_name), 5.0f); + Host::AddIconOSDMessage("ChangeDisc", ICON_FA_COMPACT_DISC, fmt::format("Disc changed to '{}'.", display_name), Host::OSD_INFO_DURATION); } else { - Host::AddKeyedOSDMessage("ChangeDisc", fmt::format("Failed to open new disc image '{}'. Reverting to old image.", display_name), 20.0f); + Host::AddIconOSDMessage("ChangeDisc", ICON_FA_COMPACT_DISC, fmt::format("Failed to open new disc image '{}'. Reverting to old image.", display_name), + Host::OSD_ERROR_DURATION); CDVDsys_ChangeSource(old_type); if (!old_path.empty()) CDVDsys_SetFile(old_type, std::move(old_path)); if (!DoCDVDopen()) { - Host::AddKeyedOSDMessage("ChangeDisc", "Failed to switch back to old disc image. Removing disc.", 20.0f); + Host::AddIconOSDMessage("ChangeDisc", ICON_FA_COMPACT_DISC, "Failed to switch back to old disc image. Removing disc.", Host::OSD_CRITICAL_ERROR_DURATION); CDVDsys_ChangeSource(CDVD_SourceType::NoDisc); DoCDVDopen(); } @@ -1352,9 +1469,22 @@ bool VMManager::IsSaveStateFileName(const std::string_view& path) return StringUtil::EndsWithNoCase(path, ".p2s"); } +bool VMManager::IsDiscFileName(const std::string_view& path) +{ + static const char* extensions[] = {".iso", ".bin", ".img", ".mdf", ".gz", ".cso", ".chd"}; + + for (const char* test_extension : extensions) + { + if (StringUtil::EndsWithNoCase(path, test_extension)) + return true; + } + + return false; +} + bool VMManager::IsLoadableFileName(const std::string_view& path) { - return IsElfFileName(path) || IsGSDumpFileName(path) || IsBlockDumpFileName(path) || GameList::IsScannableFilename(path); + return IsDiscFileName(path) || IsElfFileName(path) || IsGSDumpFileName(path) || IsBlockDumpFileName(path); } void VMManager::Execute() @@ -1365,6 +1495,7 @@ void VMManager::Execute() // We need to switch the cpus out, and reset the new ones if so. s_cpu_provider_pack->ApplyConfig(); SysClearExecutionCache(); + vtlb_ResetFastmem(); } // Execute until we're asked to stop. @@ -1425,8 +1556,24 @@ void VMManager::Internal::VSyncOnCPUThread() } } - Host::PumpMessagesOnCPUThread(); - InputManager::PollSources(); + Host::CPUThreadVSync(); + + if (EmuConfig.EnableRecordingTools) + { + // This code is called _before_ Counter's vsync end, and _after_ vsync start + if (g_InputRecording.isActive()) + { + // Process any outstanding recording actions (ie. toggle mode, stop the recording, etc) + g_InputRecording.processRecordQueue(); + g_InputRecording.getControls().processControlQueue(); + // Increment our internal frame counter, used to keep track of when we hit the end, etc. + g_InputRecording.incFrameCounter(); + g_InputRecording.handleExceededFrameCounter(); + } + // At this point, the PAD data has been read from the user for the current frame + // so we can either read from it, or overwrite it! + g_InputRecording.handleControllerDataUpdate(); + } } void VMManager::CheckForCPUConfigChanges(const Pcsx2Config& old_config) @@ -1444,6 +1591,9 @@ void VMManager::CheckForCPUConfigChanges(const Pcsx2Config& old_config) SysClearExecutionCache(); memBindConditionalHandlers(); + if (EmuConfig.Cpu.Recompiler.EnableFastmem != old_config.Cpu.Recompiler.EnableFastmem) + vtlb_ResetFastmem(); + // did we toggle recompilers? if (EmuConfig.Cpu.CpusChanged(old_config.Cpu)) { @@ -1474,7 +1624,6 @@ void VMManager::CheckForGSConfigChanges(const Pcsx2Config& old_config) UpdateVSyncRate(); frameLimitReset(); GetMTGS().ApplySettings(); - GetMTGS().SetVSync(EmuConfig.GetEffectiveVsyncMode()); } void VMManager::CheckForFramerateConfigChanges(const Pcsx2Config& old_config) @@ -1486,7 +1635,7 @@ void VMManager::CheckForFramerateConfigChanges(const Pcsx2Config& old_config) gsUpdateFrequency(EmuConfig); UpdateVSyncRate(); frameLimitReset(); - GetMTGS().SetVSync(EmuConfig.GetEffectiveVsyncMode()); + GetMTGS().UpdateVSyncMode(); } void VMManager::CheckForPatchConfigChanges(const Pcsx2Config& old_config) @@ -1528,7 +1677,7 @@ void VMManager::CheckForSPU2ConfigChanges(const Pcsx2Config& old_config) SPU2close(); SPU2shutdown(); - if (SPU2init() != 0 || SPU2open() != 0) + if (SPU2init(true) != 0 || SPU2open() != 0) { Console.Error("(CheckForSPU2ConfigChanges) Failed to reopen SPU2, we'll probably crash :("); return; @@ -1583,8 +1732,8 @@ void VMManager::CheckForMemoryCardConfigChanges(const Pcsx2Config& old_config) if (EmuConfig.Mcd[index].Enabled != old_config.Mcd[index].Enabled || EmuConfig.Mcd[index].Filename != old_config.Mcd[index].Filename) { - Console.WriteLn("Replugging memory card %u (port %u slot %u) due to source change", index, port, slot); - SetForceMcdEjectTimeoutNow(port, slot); + Console.WriteLn("Ejecting memory card %u (port %u slot %u) due to source change", index, port, slot); + AutoEject::Set(port, slot); } } } @@ -1603,20 +1752,29 @@ void VMManager::CheckForMemoryCardConfigChanges(const Pcsx2Config& old_config) void VMManager::CheckForConfigChanges(const Pcsx2Config& old_config) { - CheckForCPUConfigChanges(old_config); - CheckForGSConfigChanges(old_config); - CheckForFramerateConfigChanges(old_config); - CheckForPatchConfigChanges(old_config); - CheckForSPU2ConfigChanges(old_config); - CheckForDEV9ConfigChanges(old_config); - CheckForMemoryCardConfigChanges(old_config); - - if (EmuConfig.EnableCheats != old_config.EnableCheats || - EmuConfig.EnableWideScreenPatches != old_config.EnableWideScreenPatches || - EmuConfig.EnableNoInterlacingPatches != old_config.EnableNoInterlacingPatches) + if (HasValidVM()) { - VMManager::ReloadPatches(true, true); + CheckForCPUConfigChanges(old_config); + CheckForFramerateConfigChanges(old_config); + CheckForPatchConfigChanges(old_config); + CheckForSPU2ConfigChanges(old_config); + CheckForDEV9ConfigChanges(old_config); + CheckForMemoryCardConfigChanges(old_config); + + if (EmuConfig.EnableCheats != old_config.EnableCheats || + EmuConfig.EnableWideScreenPatches != old_config.EnableWideScreenPatches || + EmuConfig.EnableNoInterlacingPatches != old_config.EnableNoInterlacingPatches) + { + VMManager::ReloadPatches(true, true); + } } + + // For the big picture UI, we still need to update GS settings, since it's running, + // and we don't update its config when we start the VM. + if (HasValidVM() || GetMTGS().IsOpen()) + CheckForGSConfigChanges(old_config); + + Host::CheckForSettingsChanges(old_config); } void VMManager::ApplySettings() @@ -1632,11 +1790,13 @@ void VMManager::ApplySettings() GetMTGS().WaitGS(false); } - const Pcsx2Config old_config(EmuConfig); + // Reset to a clean Pcsx2Config. Otherwise things which are optional (e.g. gamefixes) + // do not use the correct default values when loading. + Pcsx2Config old_config(std::move(EmuConfig)); + EmuConfig = Pcsx2Config(); + EmuConfig.CopyRuntimeConfig(old_config); LoadSettings(); - - if (HasValidVM()) - CheckForConfigChanges(old_config); + CheckForConfigChanges(old_config); } bool VMManager::ReloadGameSettings() @@ -1648,184 +1808,167 @@ bool VMManager::ReloadGameSettings() return true; } -static void HotkeyAdjustTargetSpeed(double delta) +void VMManager::SetDefaultSettings(SettingsInterface& si) { - EmuConfig.Framerate.NominalScalar = EmuConfig.GS.LimitScalar + delta; - VMManager::SetLimiterMode(LimiterModeType::Nominal); - gsUpdateFrequency(EmuConfig); - GetMTGS().SetVSync(EmuConfig.GetEffectiveVsyncMode()); - Host::AddKeyedOSDMessage("SpeedChanged", fmt::format("Target speed set to {:.0f}%.", std::round(EmuConfig.Framerate.NominalScalar * 100.0)), 5.0f); + { + Pcsx2Config temp_config; + SettingsSaveWrapper ssw(si); + temp_config.LoadSave(ssw); + } + + // Settings not part of the Pcsx2Config struct. + si.SetBoolValue("EmuCore", "EnableFastBoot", true); + + SetHardwareDependentDefaultSettings(si); } -static constexpr s32 CYCLE_SAVE_STATE_SLOTS = 10; - -static void HotkeyCycleSaveSlot(s32 delta) +void VMManager::EnforceAchievementsChallengeModeSettings() { - // 1..10 - s_current_save_slot = ((s_current_save_slot - 1) + delta); - if (s_current_save_slot < 0) - s_current_save_slot = CYCLE_SAVE_STATE_SLOTS; - else - s_current_save_slot = (s_current_save_slot % CYCLE_SAVE_STATE_SLOTS) + 1; + if (!Achievements::ChallengeModeActive()) + return; - const std::string filename(VMManager::GetSaveStateFileName(s_game_serial.c_str(), s_game_crc, s_current_save_slot)); - FILESYSTEM_STAT_DATA sd; - if (!filename.empty() && FileSystem::StatFile(filename.c_str(), &sd)) + static constexpr auto ClampSpeed = [](float& rate) { + if (rate > 0.0f && rate < 1.0f) + rate = 1.0f; + }; + + // Can't use slow motion. + ClampSpeed(EmuConfig.Framerate.NominalScalar); + ClampSpeed(EmuConfig.Framerate.TurboScalar); + ClampSpeed(EmuConfig.Framerate.SlomoScalar); + + // Can't use cheats. + if (EmuConfig.EnableCheats) { - char date_buf[128] = {}; -#ifdef _WIN32 - ctime_s(date_buf, std::size(date_buf), &sd.ModificationTime); -#else - ctime_r(&sd.ModificationTime, date_buf); -#endif + Host::AddKeyedOSDMessage("ChallengeDisableCheats", "Cheats have been disabled due to achievements hardcore mode.", Host::OSD_WARNING_DURATION); + EmuConfig.EnableCheats = false; + } - // remove terminating \n - size_t len = std::strlen(date_buf); - if (len > 0 && date_buf[len - 1] == '\n') - date_buf[len - 1] = 0; + // Input recording/playback is probably an issue. + EmuConfig.EnableRecordingTools = false; + EmuConfig.EnablePINE = false; - Host::AddKeyedOSDMessage("CycleSaveSlot", fmt::format("Save slot {} selected (last save: {}).", s_current_save_slot, date_buf), 5.0f); + // Framerates should be at default. + EmuConfig.GS.FramerateNTSC = Pcsx2Config::GSOptions::DEFAULT_FRAME_RATE_NTSC; + EmuConfig.GS.FrameratePAL = Pcsx2Config::GSOptions::DEFAULT_FRAME_RATE_PAL; + + // You can overclock, but not underclock (since that might slow down the game and make it easier). + EmuConfig.Speedhacks.EECycleRate = std::max(EmuConfig.Speedhacks.EECycleRate, 0); + EmuConfig.Speedhacks.EECycleSkip = 0; +} + +void VMManager::LogUnsafeSettingsToConsole(const std::string& messages) +{ + // a not-great way of getting rid of the icons for the console message + std::string console_messages(messages); + for (;;) + { + const std::string::size_type pos = console_messages.find("\xef"); + if (pos != std::string::npos) + { + console_messages.erase(pos, pos + 3); + console_messages.insert(pos, "[Unsafe Settings]"); + } + else + { + break; + } + } + Console.Warning(console_messages); +} + +void VMManager::WarnAboutUnsafeSettings() +{ + std::string messages; + + if (EmuConfig.Speedhacks.fastCDVD) + messages += ICON_FA_COMPACT_DISC " Fast CDVD is enabled, this may break games.\n"; + if (EmuConfig.Speedhacks.EECycleRate != 0 || EmuConfig.Speedhacks.EECycleSkip != 0) + messages += ICON_FA_TACHOMETER_ALT " Cycle rate/skip is not at default, this may crash or make games run too slow.\n"; + if (EmuConfig.SPU2.SynchMode != Pcsx2Config::SPU2Options::SynchronizationMode::TimeStretch) + messages += ICON_FA_VOLUME_MUTE " Audio is not using time stretch synchronization, this may break FMVs.\n"; + if (EmuConfig.GS.UpscaleMultiplier < 1.0f) + messages += ICON_FA_TV " Upscale multiplier is below native, this will break rendering.\n"; + if (EmuConfig.GS.HWMipmap != HWMipmapLevel::Automatic) + messages += ICON_FA_IMAGES " Mipmapping is not set to automatic. This may break rendering in some games.\n"; + if (EmuConfig.GS.TextureFiltering != BiFiltering::PS2) + messages += ICON_FA_FILTER " Texture filtering is not set to Bilinear (PS2). This will break rendering in some games.\n"; + if (EmuConfig.GS.TriFilter != TriFiltering::Automatic) + messages += ICON_FA_PAGER " Trilinear filtering is not set to automatic. This may break rendering in some games.\n"; + if (EmuConfig.GS.AccurateBlendingUnit <= AccBlendLevel::Minimum) + messages += ICON_FA_BLENDER " Blending is below basic, this may break effects in some games.\n"; + if (EmuConfig.GS.CRCHack != CRCHackLevel::Automatic) + messages += ICON_FA_FIRST_AID " CRC Fix Level is not set to default, this may break effects in some games.\n"; + if (EmuConfig.GS.HWDownloadMode != GSHardwareDownloadMode::Enabled) + messages += ICON_FA_DOWNLOAD " Hardware Download Mode is not set to Accurate, this may break rendering in some games.\n"; + if (EmuConfig.Cpu.sseMXCSR.GetRoundMode() != SSEround_Chop || EmuConfig.Cpu.sseVUMXCSR.GetRoundMode() != SSEround_Chop) + messages += ICON_FA_MICROCHIP " EE FPU Round Mode is not set to default, this may break some games.\n"; + if (!EmuConfig.Cpu.Recompiler.fpuOverflow || EmuConfig.Cpu.Recompiler.fpuExtraOverflow || EmuConfig.Cpu.Recompiler.fpuFullMode) + messages += ICON_FA_MICROCHIP " EE FPU Clamp Mode is not set to default, this may break some games.\n"; + if (EmuConfig.Cpu.sseVUMXCSR.GetRoundMode() != SSEround_Chop) + messages += ICON_FA_MICROCHIP " VU Round Mode is not set to default, this may break some games.\n"; + if (!EmuConfig.Cpu.Recompiler.vuOverflow || EmuConfig.Cpu.Recompiler.vuExtraOverflow || EmuConfig.Cpu.Recompiler.vuSignOverflow) + messages += ICON_FA_MICROCHIP " VU Clamp Mode is not set to default, this may break some games.\n"; + if (!EmuConfig.EnableGameFixes) + messages += ICON_FA_GAMEPAD " Game Fixes are not enabled. Compatibility with some games may be affected.\n"; + if (!EmuConfig.EnablePatches) + messages += ICON_FA_GAMEPAD " Compatibility Patches are not enabled. Compatibility with some games may be affected.\n"; + if (EmuConfig.GS.FramerateNTSC != Pcsx2Config::GSOptions::DEFAULT_FRAME_RATE_NTSC) + messages += ICON_FA_TV " Frame rate for NTSC is not default. This may break some games.\n"; + if (EmuConfig.GS.FrameratePAL != Pcsx2Config::GSOptions::DEFAULT_FRAME_RATE_PAL) + messages += ICON_FA_TV " Frame rate for PAL is not default. This may break some games.\n"; + + if (!messages.empty()) + { + if (messages.back() == '\n') + messages.pop_back(); + + LogUnsafeSettingsToConsole(messages); + Host::AddKeyedOSDMessage("unsafe_settings_warning", std::move(messages), Host::OSD_WARNING_DURATION); } else { - Host::AddKeyedOSDMessage("CycleSaveSlot", fmt::format("Save slot {} selected (no save yet).", s_current_save_slot), 5.0f); + Host::RemoveKeyedOSDMessage("unsafe_settings_warning"); + } + + messages.clear(); + if (!EmuConfig.Cpu.Recompiler.EnableEE) + messages += ICON_FA_EXCLAMATION_CIRCLE " EE Recompiler is not enabled, this will significantly reduce performance.\n"; + if (!EmuConfig.Cpu.Recompiler.EnableVU0) + messages += ICON_FA_EXCLAMATION_CIRCLE " VU0 Recompiler is not enabled, this will significantly reduce performance.\n"; + if (!EmuConfig.Cpu.Recompiler.EnableVU1) + messages += ICON_FA_EXCLAMATION_CIRCLE " VU1 Recompiler is not enabled, this will significantly reduce performance.\n"; + if (!EmuConfig.Cpu.Recompiler.EnableIOP) + messages += ICON_FA_EXCLAMATION_CIRCLE " IOP Recompiler is not enabled, this will significantly reduce performance.\n"; + if (EmuConfig.Cpu.Recompiler.EnableEECache) + messages += ICON_FA_EXCLAMATION_CIRCLE " EE Cache is enabled, this will significantly reduce performance.\n"; + if (!EmuConfig.Speedhacks.WaitLoop) + messages += ICON_FA_EXCLAMATION_CIRCLE " EE Wait Loop Detection is not enabled, this may reduce performance.\n"; + if (!EmuConfig.Speedhacks.IntcStat) + messages += ICON_FA_EXCLAMATION_CIRCLE " INTC Spin Detection is not enabled, this may reduce performance.\n"; + if (!EmuConfig.Speedhacks.vu1Instant) + messages += ICON_FA_EXCLAMATION_CIRCLE " Instant VU1 is disabled, this may reduce performance.\n"; + if (!EmuConfig.Speedhacks.vuFlagHack) + messages += ICON_FA_EXCLAMATION_CIRCLE " mVU Flag Hack is not enabled, this may reduce performance.\n"; + if (EmuConfig.GS.GPUPaletteConversion) + messages += ICON_FA_EXCLAMATION_CIRCLE " GPU Palette Conversion is enabled, this may reduce performance.\n"; + if (EmuConfig.GS.TexturePreloading != TexturePreloadingLevel::Full) + messages += ICON_FA_EXCLAMATION_CIRCLE " Texture Preloading is not Full, this may reduce performance.\n"; + + if (!messages.empty()) + { + if (messages.back() == '\n') + messages.pop_back(); + + LogUnsafeSettingsToConsole(messages); + Host::AddKeyedOSDMessage("performance_settings_warning", std::move(messages), Host::OSD_WARNING_DURATION); + } + else + { + Host::RemoveKeyedOSDMessage("performance_settings_warning"); } } -static void HotkeyLoadStateSlot(s32 slot) -{ - if (s_game_crc == 0) - { - Host::AddKeyedOSDMessage("LoadStateFromSlot", "Cannot load state from a slot without a game running.", 10.0f); - return; - } - - if (!VMManager::HasSaveStateInSlot(s_game_serial.c_str(), s_game_crc, slot)) - { - Host::AddKeyedOSDMessage("LoadStateFromSlot", fmt::format("No save state found in slot {}.", slot)); - return; - } - - VMManager::LoadStateFromSlot(slot); -} - -static void HotkeySaveStateSlot(s32 slot) -{ - if (s_game_crc == 0) - { - Host::AddKeyedOSDMessage("SaveStateToSlot", "Cannot save state to a slot without a game running.", 10.0f); - return; - } - - VMManager::SaveStateToSlot(slot); -} - -BEGIN_HOTKEY_LIST(g_vm_manager_hotkeys) -DEFINE_HOTKEY("ToggleFrameLimit", "System", "Toggle Frame Limit", [](s32 pressed) { - if (!pressed) - { - VMManager::SetLimiterMode((EmuConfig.LimiterMode != LimiterModeType::Unlimited) ? - LimiterModeType::Unlimited : - LimiterModeType::Nominal); - } -}) -DEFINE_HOTKEY("ToggleTurbo", "System", "Toggle Turbo", [](s32 pressed) { - if (!pressed) - { - VMManager::SetLimiterMode((EmuConfig.LimiterMode != LimiterModeType::Turbo) ? - LimiterModeType::Turbo : - LimiterModeType::Nominal); - } -}) -DEFINE_HOTKEY("HoldTurbo", "System", "Turbo (Hold)", [](s32 pressed) { - if (pressed > 0 && !s_limiter_mode_prior_to_hold_interaction.has_value()) - { - s_limiter_mode_prior_to_hold_interaction = VMManager::GetLimiterMode(); - VMManager::SetLimiterMode((s_limiter_mode_prior_to_hold_interaction.value() != LimiterModeType::Turbo) ? - LimiterModeType::Turbo : - LimiterModeType::Nominal); - } - else if (pressed >= 0 && s_limiter_mode_prior_to_hold_interaction.has_value()) - { - VMManager::SetLimiterMode(s_limiter_mode_prior_to_hold_interaction.value()); - s_limiter_mode_prior_to_hold_interaction.reset(); - } -}) -DEFINE_HOTKEY("ToggleSlowMotion", "System", "Toggle Slow Motion", [](s32 pressed) { - if (!pressed) - { - VMManager::SetLimiterMode((EmuConfig.LimiterMode != LimiterModeType::Slomo) ? - LimiterModeType::Slomo : - LimiterModeType::Nominal); - } -}) -DEFINE_HOTKEY("IncreaseSpeed", "System", "Increase Target Speed", [](s32 pressed) { - if (!pressed) - HotkeyAdjustTargetSpeed(0.1); -}) -DEFINE_HOTKEY("DecreaseSpeed", "System", "Decrease Target Speed", [](s32 pressed) { - if (!pressed) - HotkeyAdjustTargetSpeed(-0.1); -}) -DEFINE_HOTKEY("ResetVM", "System", "Reset Virtual Machine", [](s32 pressed) { - if (!pressed && VMManager::HasValidVM()) - VMManager::Reset(); -}) -DEFINE_HOTKEY("FrameAdvance", "System", "Frame Advance", [](s32 pressed) { - if (!pressed) - VMManager::FrameAdvance(1); -}) - -DEFINE_HOTKEY("PreviousSaveStateSlot", "Save States", "Select Previous Save Slot", [](s32 pressed) { - if (!pressed) - HotkeyCycleSaveSlot(-1); -}) -DEFINE_HOTKEY("NextSaveStateSlot", "Save States", "Select Next Save Slot", [](s32 pressed) { - if (!pressed) - HotkeyCycleSaveSlot(1); -}) -DEFINE_HOTKEY("SaveStateToSlot", "Save States", "Save State To Selected Slot", [](s32 pressed) { - if (!pressed) - VMManager::SaveStateToSlot(s_current_save_slot); -}) -DEFINE_HOTKEY("LoadStateFromSlot", "Save States", "Load State From Selected Slot", [](s32 pressed) { - if (!pressed) - HotkeyLoadStateSlot(s_current_save_slot); -}) - -#define DEFINE_HOTKEY_SAVESTATE_X(slotnum, slotnumstr) DEFINE_HOTKEY("SaveStateToSlot" #slotnum, \ - "Save States", "Save State To Slot " #slotnumstr, [](s32 pressed) { if (!pressed) HotkeySaveStateSlot(slotnum); }) -DEFINE_HOTKEY_SAVESTATE_X(1, 01) -DEFINE_HOTKEY_SAVESTATE_X(2, 02) -DEFINE_HOTKEY_SAVESTATE_X(3, 03) -DEFINE_HOTKEY_SAVESTATE_X(4, 04) -DEFINE_HOTKEY_SAVESTATE_X(5, 05) -DEFINE_HOTKEY_SAVESTATE_X(6, 06) -DEFINE_HOTKEY_SAVESTATE_X(7, 07) -DEFINE_HOTKEY_SAVESTATE_X(8, 08) -DEFINE_HOTKEY_SAVESTATE_X(9, 09) -DEFINE_HOTKEY_SAVESTATE_X(10, 10) -#define DEFINE_HOTKEY_LOADSTATE_X(slotnum, slotnumstr) DEFINE_HOTKEY("LoadStateFromSlot" #slotnum, \ - "Save States", "Load State From Slot " #slotnumstr, [](s32 pressed) { \ - if (!pressed) \ - HotkeyLoadStateSlot(slotnum); \ - }) -DEFINE_HOTKEY_LOADSTATE_X(1, 01) -DEFINE_HOTKEY_LOADSTATE_X(2, 02) -DEFINE_HOTKEY_LOADSTATE_X(3, 03) -DEFINE_HOTKEY_LOADSTATE_X(4, 04) -DEFINE_HOTKEY_LOADSTATE_X(5, 05) -DEFINE_HOTKEY_LOADSTATE_X(6, 06) -DEFINE_HOTKEY_LOADSTATE_X(7, 07) -DEFINE_HOTKEY_LOADSTATE_X(8, 08) -DEFINE_HOTKEY_LOADSTATE_X(9, 09) -DEFINE_HOTKEY_LOADSTATE_X(10, 10) - -#undef DEFINE_HOTKEY_SAVESTATE_X -#undef DEFINE_HOTKEY_LOADSTATE_X - -END_HOTKEY_LIST() - #ifdef _WIN32 #include "common/RedtapeWindows.h" @@ -1930,7 +2073,7 @@ static void InitializeCPUInfo() Console.WriteLn(ss.str()); } -static void SetMTVUAndAffinityControlDefault(Pcsx2Config& config) +static void SetMTVUAndAffinityControlDefault(SettingsInterface& si) { VMManager::EnsureCPUInfoInitialized(); @@ -1956,23 +2099,16 @@ static void SetMTVUAndAffinityControlDefault(Pcsx2Config& config) const u32 big_cores = cpuinfo_get_cluster(0)->core_count + ((cluster_count > 2) ? cpuinfo_get_cluster(1)->core_count : 0u); Console.WriteLn("Guessing we have %u big/medium cores...", big_cores); - bool mtvu_enable; - bool affinity_control; - if (big_cores >= 3 || big_cores == 1) + if (big_cores >= 3) { - Console.WriteLn(" So enabling MTVU and disabling affinity control"); - mtvu_enable = true; - affinity_control = false; + Console.WriteLn(" So enabling MTVU."); + si.SetBoolValue("EmuCore/Speedhacks", "vuThread", true); } else { - Console.WriteLn(" So disabling MTVU and enabling affinity control"); - mtvu_enable = false; - affinity_control = true; + Console.WriteLn(" So disabling MTVU."); + si.SetBoolValue("EmuCore/Speedhacks", "vuThread", false); } - - config.Speedhacks.vuThread = mtvu_enable; - config.Cpu.AffinityControlMode = affinity_control ? 1 : 0; } #else @@ -1982,7 +2118,7 @@ static void InitializeCPUInfo() DevCon.WriteLn("(VMManager) InitializeCPUInfo() not implemented."); } -static void SetMTVUAndAffinityControlDefault(Pcsx2Config& config) +static void SetMTVUAndAffinityControlDefault(SettingsInterface& si) { } @@ -2054,9 +2190,9 @@ void VMManager::SetEmuThreadAffinities() GetMTGS().GetThreadHandle().SetAffinity(gs_affinity); } -void VMManager::SetHardwareDependentDefaultSettings(Pcsx2Config& config) +void VMManager::SetHardwareDependentDefaultSettings(SettingsInterface& si) { - SetMTVUAndAffinityControlDefault(config); + SetMTVUAndAffinityControlDefault(si); } const std::vector& VMManager::GetSortedProcessorList() diff --git a/pcsx2/VMManager.h b/pcsx2/VMManager.h index fcffe631a8..e5af10e359 100644 --- a/pcsx2/VMManager.h +++ b/pcsx2/VMManager.h @@ -52,6 +52,9 @@ struct VMBootParameters namespace VMManager { + /// The number of usable save state slots. + static constexpr s32 NUM_SAVE_STATE_SLOTS = 10; + /// Makes sure that AVX2 is available if we were compiled with it. bool PerformEarlyHardwareChecks(const char** error); @@ -76,8 +79,11 @@ namespace VMManager /// Returns the name of the disc/executable currently running. std::string GetGameName(); + /// Loads global settings (i.e. EmuConfig). + void LoadSettings(); + /// Initializes all system components. - bool Initialize(const VMBootParameters& boot_params); + bool Initialize(VMBootParameters boot_params); /// Destroys all system components. void Shutdown(bool save_resume_state); @@ -116,7 +122,7 @@ namespace VMManager bool LoadStateFromSlot(s32 slot); /// Saves state to the specified filename. - bool SaveState(const char* filename, bool zip_on_thread = true); + bool SaveState(const char* filename, bool zip_on_thread = true, bool backup_old_state = false); /// Saves state to the specified slot. bool SaveStateToSlot(s32 slot, bool zip_on_thread = true); @@ -124,6 +130,9 @@ namespace VMManager /// Waits until all compressing save states have finished saving to disk. void WaitForSaveStateFlush(); + /// Removes all save states for the specified serial and crc. Returns the number of files deleted. + u32 DeleteSaveStates(const char* game_serial, u32 game_crc, bool also_backups = true); + /// Returns the current limiter mode. LimiterModeType GetLimiterMode(); @@ -149,6 +158,9 @@ namespace VMManager /// Returns true if the specified path is a save state. bool IsSaveStateFileName(const std::string_view& path); + /// Returns true if the specified path is a disc image. + bool IsDiscFileName(const std::string_view& path); + /// Returns true if the specified path is a disc/elf/etc. bool IsLoadableFileName(const std::string_view& path); @@ -162,8 +174,8 @@ namespace VMManager /// If the scale is set to 0, the internal resolution will be used, otherwise it is treated as a multiplier to 1x. void RequestDisplaySize(float scale = 0.0f); - /// Sets default settings based on hardware configuration. - void SetHardwareDependentDefaultSettings(Pcsx2Config& config); + /// Initializes default configuration in the specified file. + void SetDefaultSettings(SettingsInterface& si); /// Returns a list of processors in the system, and their corresponding affinity mask. /// This list is ordered by most performant to least performant for pinning threads to. @@ -195,6 +207,12 @@ namespace VMManager namespace Host { + /// Called with the settings lock held, when system settings are being loaded (should load input sources, etc). + void LoadSettings(SettingsInterface& si, std::unique_lock& lock); + + /// Called after settings are updated. + void CheckForSettingsChanges(const Pcsx2Config& old_config); + /// Called when the VM is starting initialization, but has not been completed yet. void OnVMStarting(); @@ -213,6 +231,10 @@ namespace Host /// Called when performance metrics are updated, approximately once a second. void OnPerformanceMetricsUpdated(); + /// Looks up the serial and CRC for a game in the most efficient manner possible. + /// Implemented in the host because it may have a game list cache. + bool GetSerialAndCRCForFilename(const char* filename, std::string* serial, u32* crc); + /// Called when a save state is loading, before the file is processed. void OnSaveStateLoading(const std::string_view& filename); @@ -227,33 +249,8 @@ namespace Host void OnGameChanged(const std::string& disc_path, const std::string& game_serial, const std::string& game_name, u32 game_crc); /// Provided by the host; called once per frame at guest vsync. - void PumpMessagesOnCPUThread(); + void CPUThreadVSync(); /// Provided by the host; called when a state is saved, and the frontend should invalidate its save state cache. void InvalidateSaveStateCache(); - - /// Requests a specific display window size. - void RequestResizeHostDisplay(s32 width, s32 height); - - /// Safely executes a function on the VM thread. - void RunOnCPUThread(std::function function, bool block = false); - - /// Asynchronously starts refreshing the game list. - void RefreshGameListAsync(bool invalidate_cache); - - /// Cancels game list refresh, if there is one in progress. - void CancelGameListRefresh(); - - /// Requests shut down and exit of the hosting application. This may not actually exit, - /// if the user cancels the shutdown confirmation. - void RequestExit(bool save_state_if_running); - - /// Requests shut down of the current virtual machine. - void RequestVMShutdown(bool save_state); - - /// Returns true if the hosting application is currently fullscreen. - bool IsFullscreen(); - - /// Alters fullscreen state of hosting application. - void SetFullscreen(bool enabled); } diff --git a/pcsx2/VU0.cpp b/pcsx2/VU0.cpp index fc054aad54..53d539cdb9 100644 --- a/pcsx2/VU0.cpp +++ b/pcsx2/VU0.cpp @@ -136,7 +136,7 @@ void CFC2() { _vu0FinishMicro(); } if (_Rt_ == 0) return; - + cpuRegs.GPR.r[_Rt_].UL[0] = VU0.VI[_Fs_].UL; if(VU0.VI[_Fs_].UL & 0x80000000) diff --git a/pcsx2/VU0microInterp.cpp b/pcsx2/VU0microInterp.cpp index 649fc24c90..7d9d4aa720 100644 --- a/pcsx2/VU0microInterp.cpp +++ b/pcsx2/VU0microInterp.cpp @@ -236,6 +236,9 @@ void vu0Exec(VURegs* VU) // -------------------------------------------------------------------------------------- // VU0microInterpreter // -------------------------------------------------------------------------------------- + +InterpVU0 CpuIntVU0; + InterpVU0::InterpVU0() { m_Idx = 0; diff --git a/pcsx2/VU1micro.cpp b/pcsx2/VU1micro.cpp index 3f28d04395..32d7d0ffd2 100644 --- a/pcsx2/VU1micro.cpp +++ b/pcsx2/VU1micro.cpp @@ -38,7 +38,10 @@ void vu1ResetRegs() void vu1Finish(bool add_cycles) { if (THREAD_VU1) { //if (VU0.VI[REG_VPU_STAT].UL & 0x100) DevCon.Error("MTVU: VU0.VI[REG_VPU_STAT].UL & 0x100"); - vu1Thread.WaitVU(); + if (INSTANT_VU1 || add_cycles) + { + vu1Thread.WaitVU(); + } vu1Thread.Get_MTVUChanges(); return; } @@ -70,7 +73,6 @@ void vu1ExecMicro(u32 addr) // VU0.VI[REG_VPU_STAT].UL |= 0x0100; // } // Update 25/06/2022: Disabled this for now, let games YOLO it, if it breaks MTVU, disable MTVU (it doesn't work properly anyway) - Refraction - vu1Thread.ExecuteVU(addr, vif1Regs.top, vif1Regs.itop, VU0.VI[REG_FBRST].UL); return; } @@ -90,3 +92,8 @@ void vu1ExecMicro(u32 addr) else CpuVU1->Execute(vu1RunCycles); } + +void MTVUInterrupt() +{ + VU0.VI[REG_VPU_STAT].UL &= ~0xFF00; +} diff --git a/pcsx2/VU1microInterp.cpp b/pcsx2/VU1microInterp.cpp index 33280a3b72..23ff27a1b3 100644 --- a/pcsx2/VU1microInterp.cpp +++ b/pcsx2/VU1microInterp.cpp @@ -81,7 +81,7 @@ static void _vu1Exec(VURegs* VU) VU1regs_UPPER_OPCODE[VU->code & 0x3f](&uregs); u32 cyclesBeforeOp = VU1.cycle-1; - + _vuTestUpperStalls(VU, &uregs); /* check upper flags */ @@ -217,7 +217,7 @@ static void _vu1Exec(VURegs* VU) VU1.xgkicklastcycle = cpuRegs.cycle; } } - + // Progress the write position of the FMAC pipeline by one place if (uregs.pipe == VUPIPE_FMAC || lregs.pipe == VUPIPE_FMAC) VU->fmacwritepos = (VU->fmacwritepos + 1) & 3; @@ -240,6 +240,8 @@ void vu1Exec(VURegs* VU) DbgCon.Error("VF[0].w != 1.0!!!!\n"); } +InterpVU1 CpuIntVU1; + InterpVU1::InterpVU1() { m_Idx = 1; @@ -255,12 +257,6 @@ void InterpVU1::Reset() VU1.ialuwritepos = 0; VU1.ialureadpos = 0; VU1.ialucount = 0; - vu1Thread.WaitVU(); -} - -void InterpVU1::Shutdown() noexcept -{ - vu1Thread.WaitVU(); } void InterpVU1::SetStartPC(u32 startPC) diff --git a/pcsx2/VUmicro.h b/pcsx2/VUmicro.h index 27b3cab850..aeb50a857a 100644 --- a/pcsx2/VUmicro.h +++ b/pcsx2/VUmicro.h @@ -33,45 +33,30 @@ static const uint VU1_PROGMASK = VU1_PROGSIZE-1; #define vu1RunCycles (3000000) // mVU1 uses this for inf loop detection on dev builds -// -------------------------------------------------------------------------------------- -// BaseCpuProvider -// -------------------------------------------------------------------------------------- -// -// Design Note: This class is only partial C++ style. It still relies on Alloc and Shutdown -// calls for memory and resource management. This is because the underlying implementations -// of our CPU emulators don't have properly encapsulated objects yet -- if we allocate ram -// in a constructor, it won't get free'd if an exception occurs during object construction. -// Once we've resolved all the 'dangling pointers' and stuff in the recompilers, Alloc -// and Shutdown can be removed in favor of constructor/destructor syntax. -// -class BaseCpuProvider -{ -protected: - // allocation counter for multiple calls to Reserve. Most implementations should utilize - // this variable for sake of robustness. - std::atomic m_Reserved; +// -------------------------------------------------------------------------------------- +// BaseVUmicroCPU +// -------------------------------------------------------------------------------------- +// Layer class for possible future implementation (currently is nothing more than a type-safe +// type define). +// +class BaseVUmicroCPU +{ public: + int m_Idx = 0; + // this boolean indicates to some generic logging facilities if the VU's registers // are valid for logging or not. (see DisVU1Micro.cpp, etc) [kinda hacky, might // be removed in the future] bool IsInterpreter; public: - BaseCpuProvider() + BaseVUmicroCPU() { - m_Reserved = 0; IsInterpreter = false; } - virtual ~BaseCpuProvider() - { - try { - if( m_Reserved != 0 ) - Console.Warning( "Cleanup miscount detected on CPU provider. Count=%d", m_Reserved.load() ); - } - DESTRUCTOR_CATCHALL - } + virtual ~BaseVUmicroCPU() = default; virtual const char* GetShortName() const=0; virtual const char* GetLongName() const=0; @@ -84,58 +69,20 @@ public: return 0; } - virtual void Reserve()=0; virtual void Shutdown()=0; virtual void Reset()=0; virtual void SetStartPC(u32 startPC)=0; virtual void Execute(u32 cycles)=0; - virtual void ExecuteBlock(bool startUp)=0; virtual void Step()=0; virtual void Clear(u32 Addr, u32 Size)=0; + // Executes a Block based on EE delta time (see VUmicro.cpp) + void ExecuteBlock(bool startUp = 0); + // C++ Calling Conventions are unstable, and some compilers don't even allow us to take the // address of C++ methods. We need to use a wrapper function to invoke the ExecuteBlock from // recompiled code. - static void ExecuteBlockJIT( BaseCpuProvider* cpu ) - { - cpu->Execute(1024); - } - - // Gets the current cache reserve allocated to this CPU (value returned in megabytes) - virtual uint GetCacheReserve() const=0; - - // Specifies the maximum cache reserve amount for this CPU (value in megabytes). - // CPU providers are allowed to reset their reserves (recompiler resets, etc) if such is - // needed to conform to the new amount requested. - virtual void SetCacheReserve( uint reserveInMegs ) const=0; - -}; - -// -------------------------------------------------------------------------------------- -// BaseVUmicroCPU -// -------------------------------------------------------------------------------------- -// Layer class for possible future implementation (currently is nothing more than a type-safe -// type define). -// -class BaseVUmicroCPU : public BaseCpuProvider { -public: - int m_Idx; - - BaseVUmicroCPU() { - m_Idx = 0; - } - virtual ~BaseVUmicroCPU() = default; - - virtual void Step() { - // Ideally this would fall back on interpretation for executing single instructions - // for all CPU types, but due to VU complexities and large discrepancies between - // clamping in recs and ints, it's not really worth bothering with yet. - } - - // Executes a Block based on EE delta time (see VUmicro.cpp) - virtual void ExecuteBlock(bool startUp=0); - static void ExecuteBlockJIT(BaseVUmicroCPU* cpu, bool interlocked); // VU1 sometimes needs to break execution on XGkick Path1 transfers if @@ -144,100 +91,93 @@ public: virtual void ResumeXGkick() {} }; - // -------------------------------------------------------------------------------------- // InterpVU0 / InterpVU1 // -------------------------------------------------------------------------------------- -class InterpVU0 : public BaseVUmicroCPU +class InterpVU0 final : public BaseVUmicroCPU { public: InterpVU0(); - virtual ~InterpVU0() { Shutdown(); } + ~InterpVU0() override { Shutdown(); } - const char* GetShortName() const { return "intVU0"; } - const char* GetLongName() const { return "VU0 Interpreter"; } + const char* GetShortName() const override { return "intVU0"; } + const char* GetLongName() const override { return "VU0 Interpreter"; } - void Reserve() { } - void Shutdown() noexcept { } - void Reset(); + void Shutdown() override {} + void Reset() override; - void Step(); - void SetStartPC(u32 startPC); - void Execute(u32 cycles); - void Clear(u32 addr, u32 size) {} - - uint GetCacheReserve() const { return 0; } - void SetCacheReserve( uint reserveInMegs ) const {} + void Step() override; + void SetStartPC(u32 startPC) override; + void Execute(u32 cycles) override; + void Clear(u32 addr, u32 size) override {} }; -class InterpVU1 : public BaseVUmicroCPU +class InterpVU1 final : public BaseVUmicroCPU { public: InterpVU1(); - virtual ~InterpVU1() { Shutdown(); } + ~InterpVU1() override { Shutdown(); } - const char* GetShortName() const { return "intVU1"; } - const char* GetLongName() const { return "VU1 Interpreter"; } + const char* GetShortName() const override { return "intVU1"; } + const char* GetLongName() const override { return "VU1 Interpreter"; } - void Reserve() { } - void Shutdown() noexcept; - void Reset(); + void Shutdown() override {} + void Reset() override; - void SetStartPC(u32 startPC); - void Step(); - void Execute(u32 cycles); - void Clear(u32 addr, u32 size) {} - void ResumeXGkick() {} - - uint GetCacheReserve() const { return 0; } - void SetCacheReserve( uint reserveInMegs ) const {} + void SetStartPC(u32 startPC) override; + void Step() override; + void Execute(u32 cycles) override; + void Clear(u32 addr, u32 size) override {} + void ResumeXGkick() override {} }; // -------------------------------------------------------------------------------------- // recMicroVU0 / recMicroVU1 // -------------------------------------------------------------------------------------- -class recMicroVU0 : public BaseVUmicroCPU +class recMicroVU0 final : public BaseVUmicroCPU { public: recMicroVU0(); - virtual ~recMicroVU0() { Shutdown(); } + ~recMicroVU0() override { Shutdown(); } - const char* GetShortName() const { return "mVU0"; } - const char* GetLongName() const { return "microVU0 Recompiler"; } + const char* GetShortName() const override { return "mVU0"; } + const char* GetLongName() const override { return "microVU0 Recompiler"; } void Reserve(); - void Shutdown() noexcept; + void Shutdown() override; - void Reset(); - void SetStartPC(u32 startPC); - void Execute(u32 cycles); - void Clear(u32 addr, u32 size); - - uint GetCacheReserve() const; - void SetCacheReserve( uint reserveInMegs ) const; + void Reset() override; + void Step() override; + void SetStartPC(u32 startPC) override; + void Execute(u32 cycles) override; + void Clear(u32 addr, u32 size) override; }; -class recMicroVU1 : public BaseVUmicroCPU +class recMicroVU1 final : public BaseVUmicroCPU { public: recMicroVU1(); virtual ~recMicroVU1() { Shutdown(); } - const char* GetShortName() const { return "mVU1"; } - const char* GetLongName() const { return "microVU1 Recompiler"; } + const char* GetShortName() const override { return "mVU1"; } + const char* GetLongName() const override { return "microVU1 Recompiler"; } void Reserve(); - void Shutdown() noexcept; - void Reset(); - void SetStartPC(u32 startPC); - void Execute(u32 cycles); - void Clear(u32 addr, u32 size); - void ResumeXGkick(); - - uint GetCacheReserve() const; - void SetCacheReserve( uint reserveInMegs ) const; + void Shutdown() override; + void Reset() override; + void Step() override; + void SetStartPC(u32 startPC) override; + void Execute(u32 cycles) override; + void Clear(u32 addr, u32 size) override; + void ResumeXGkick() override; }; +extern InterpVU0 CpuIntVU0; +extern InterpVU1 CpuIntVU1; + +extern recMicroVU0 CpuMicroVU0; +extern recMicroVU1 CpuMicroVU1; + extern BaseVUmicroCPU* CpuVU0; extern BaseVUmicroCPU* CpuVU1; @@ -256,6 +196,7 @@ extern void vu1ResetRegs(); extern void vu1ExecMicro(u32 addr); extern void vu1Exec(VURegs* VU); extern void iDumpVU1Registers(); +extern void MTVUInterrupt(); #ifdef VUM_LOG diff --git a/pcsx2/VUmicroMem.cpp b/pcsx2/VUmicroMem.cpp index 3c3911ee42..7c136951da 100644 --- a/pcsx2/VUmicroMem.cpp +++ b/pcsx2/VUmicroMem.cpp @@ -21,33 +21,42 @@ alignas(16) VURegs vuRegs[2]; + vuMemoryReserve::vuMemoryReserve() - : _parent( "VU0/1 on-chip memory", VU1_PROGSIZE + VU1_MEMSIZE + VU0_PROGSIZE + VU0_MEMSIZE ) + : _parent("VU0/1 on-chip memory") { } -void vuMemoryReserve::Reserve(VirtualMemoryManagerPtr allocator) +vuMemoryReserve::~vuMemoryReserve() { - _parent::Reserve(std::move(allocator), HostMemoryMap::VUmemOffset); - //_parent::Reserve(EmuConfig.HostMemMap.VUmem); + Release(); +} - u8* curpos = m_reserve.GetPtr(); +void vuMemoryReserve::Assign(VirtualMemoryManagerPtr allocator) +{ + static constexpr u32 VU_MEMORY_RESERVE_SIZE = VU1_PROGSIZE + VU1_MEMSIZE + VU0_PROGSIZE + VU0_MEMSIZE; + + _parent::Assign(std::move(allocator), HostMemoryMap::VUmemOffset, VU_MEMORY_RESERVE_SIZE); + + u8* curpos = GetPtr(); VU0.Micro = curpos; curpos += VU0_PROGSIZE; VU0.Mem = curpos; curpos += VU0_MEMSIZE; VU1.Micro = curpos; curpos += VU1_PROGSIZE; VU1.Mem = curpos; curpos += VU1_MEMSIZE; } -vuMemoryReserve::~vuMemoryReserve() +void vuMemoryReserve::Release() { - VU0.Micro = VU0.Mem = NULL; - VU1.Micro = VU1.Mem = NULL; + _parent::Release(); + + VU0.Micro = VU0.Mem = nullptr; + VU1.Micro = VU1.Mem = nullptr; } void vuMemoryReserve::Reset() { _parent::Reset(); - + pxAssert( VU0.Mem ); pxAssert( VU1.Mem ); diff --git a/pcsx2/VUops.cpp b/pcsx2/VUops.cpp index bd14e206ef..23dc3a31c0 100644 --- a/pcsx2/VUops.cpp +++ b/pcsx2/VUops.cpp @@ -1646,7 +1646,7 @@ static __fi void _vuFTOI4(VURegs* VU) { if (_Y) VU->VF[_Ft_].SL[1] = float_to_int(float_to_int4(vuDouble(VU->VF[_Fs_].i.y))); if (_Z) VU->VF[_Ft_].SL[2] = float_to_int(float_to_int4(vuDouble(VU->VF[_Fs_].i.z))); if (_W) VU->VF[_Ft_].SL[3] = float_to_int(float_to_int4(vuDouble(VU->VF[_Fs_].i.w))); -} +} static __fi void _vuFTOI12(VURegs* VU) { @@ -2129,7 +2129,7 @@ static __ri void _vuRNEXT(VURegs* VU) { if (_Ft_ == 0) return; - + AdvanceLFSR(VU); if (_X) VU->VF[_Ft_].UL[0] = VU->VI[REG_R].UL; if (_Y) VU->VF[_Ft_].UL[1] = VU->VI[REG_R].UL; @@ -2153,7 +2153,7 @@ static __ri void _vuFSAND(VURegs* VU) imm = (((VU->code >> 21) & 0x1) << 11) | (VU->code & 0x7ff); if (_It_ == 0) return; - + VU->VI[_It_].US[0] = (VU->VI[REG_STATUS_FLAG].US[0] & 0xFFF) & imm; } @@ -2164,7 +2164,7 @@ static __ri void _vuFSEQ(VURegs* VU) imm = (((VU->code >> 21) & 0x1) << 11) | (VU->code & 0x7ff); if (_It_ == 0) return; - + if ((VU->VI[REG_STATUS_FLAG].US[0] & 0xFFF) == imm) VU->VI[_It_].US[0] = 1; else @@ -2609,7 +2609,7 @@ static __ri void _vuXITOP(VURegs* VU) { if (_It_ == 0) return; - + if (VU == &VU1 && THREAD_VU1) VU->VI[_It_].US[0] = vu1Thread.vifRegs.itop; else @@ -2721,7 +2721,9 @@ static __ri void _vuXGKICK(VURegs* VU) VU->xgkicksizeremaining = 0; VU->xgkickendpacket = false; VU->xgkicklastcycle = VU->cycle; - VU->xgkickcyclecount = 0; + // XGKick command counts as one cycle for the transfer. + // Can be tested with Resident Evil: Outbreak, Kingdom Hearts, CART Fury. + VU->xgkickcyclecount = 1; VU0.VI[REG_VPU_STAT].UL |= (1 << 12); VUM_LOG("XGKICK addr %x", addr); } @@ -2730,7 +2732,7 @@ static __ri void _vuXTOP(VURegs* VU) { if (_It_ == 0) return; - + if (VU == &VU1 && THREAD_VU1) VU->VI[_It_].US[0] = (u16)vu1Thread.vifRegs.top; else diff --git a/pcsx2/Vif0_Dma.cpp b/pcsx2/Vif0_Dma.cpp index 1157b6a960..121900e352 100644 --- a/pcsx2/Vif0_Dma.cpp +++ b/pcsx2/Vif0_Dma.cpp @@ -108,13 +108,13 @@ __fi void vif0SetupTransfer() ret = VIF0transfer((u32*)&masked_tag + 2, 2, true); //Transfer Tag //ret = VIF0transfer((u32*)ptag + 2, 2); //Transfer Tag } - + if (!ret && vif0.irqoffset.enabled) { vif0.inprogress = 0; // Better clear this so it has to do it again (Jak 1) vif0ch.qwc = 0; // Gumball 3000 pauses the DMA when the tag stalls so we need to reset the QWC, it'll be gotten again later return; // IRQ set by VIFTransfer - + } } @@ -139,6 +139,7 @@ __fi void vif0VUFinish() if (VU0.VI[REG_VPU_STAT].UL & 0x5) { CPU_INT(VIF_VU0_FINISH, 128); + CPU_SET_DMASTALL(VIF_VU0_FINISH, true); return; } @@ -149,7 +150,8 @@ __fi void vif0VUFinish() vu0Finish(); _cycles = VU0.cycle - _cycles; //DevCon.Warning("Finishing VU0 %d cycles", _cycles); - CPU_INT(VIF_VU0_FINISH, _cycles * BIAS); + CPU_INT(VIF_VU0_FINISH, _cycles * BIAS); + CPU_SET_DMASTALL(VIF_VU0_FINISH, true); return; } vif0Regs.stat.VEW = false; @@ -177,6 +179,7 @@ __fi void vif0Interrupt() if(vif0.waitforvu) { CPU_INT(VIF_VU0_FINISH, 16); + CPU_SET_DMASTALL(DMAC_VIF0, true); return; } if (vif0Regs.stat.VGW) @@ -208,6 +211,7 @@ __fi void vif0Interrupt() { vif0Regs.stat.VPS = VPS_DECODING; //If there's more data you need to say it's decoding the next VIF CMD (Onimusha - Blade Warriors) VIF_LOG("VIF0 Stalled"); + CPU_SET_DMASTALL(DMAC_VIF0, true); return; } } @@ -216,11 +220,11 @@ __fi void vif0Interrupt() vif0.vifstalled.enabled = false; //Must go after the Stall, incase it's still in progress, GTC africa likes to see it still transferring. - if (vif0.cmd) + if (vif0.cmd) { if(vif0.done && vif0ch.qwc == 0) vif0Regs.stat.VPS = VPS_WAITING; } - else + else { vif0Regs.stat.VPS = VPS_IDLE; } @@ -266,6 +270,7 @@ __fi void vif0Interrupt() if(vif0.queued_program) vifExecQueue(0); g_vif0Cycles = 0; hwDmacIrq(DMAC_VIF0); + CPU_SET_DMASTALL(DMAC_VIF0, false); vif0Regs.stat.FQC = 0; DMA_LOG("VIF0 DMA End"); } @@ -278,7 +283,8 @@ void dmaVIF0() vif0ch.tadr, vif0ch.asr0, vif0ch.asr1); g_vif0Cycles = 0; - + CPU_SET_DMASTALL(DMAC_VIF0, false); + if (vif0ch.qwc > 0) // Normal Mode { if (vif0ch.chcr.MOD == CHAIN_MODE) diff --git a/pcsx2/Vif1_Dma.cpp b/pcsx2/Vif1_Dma.cpp index 91ba82fcf2..b76b91e4d4 100644 --- a/pcsx2/Vif1_Dma.cpp +++ b/pcsx2/Vif1_Dma.cpp @@ -40,7 +40,8 @@ void vif1TransferToMemory() u128* pMem = (u128*)dmaGetAddr(vif1ch.madr, false); // VIF from gsMemory - if (pMem == NULL) { // Is vif0ptag empty? + if (pMem == NULL) + { // Is vif0ptag empty? Console.WriteLn("Vif1 Tag BUSERR"); dmacRegs.stat.BEIS = true; // Bus Error vif1Regs.stat.FQC = 0; @@ -55,10 +56,11 @@ void vif1TransferToMemory() // stuff from the GS. The *only* way to handle this case safely is to flush the GS // completely and execute the transfer there-after. //Console.Warning("Real QWC %x", vif1ch.qwc); - const u32 size = std::min(vif1.GSLastDownloadSize, (u32)vif1ch.qwc); + const u32 size = std::min(vif1.GSLastDownloadSize, (u32)vif1ch.qwc); //const u128* pMemEnd = vif1.GSLastDownloadSize + pMem; - if (size) { + if (size) + { // Checking if any crazy game does a partial // gs primitive and then does a gs download... Gif_Path& p1 = gifUnit.gifPath[GIF_PATH_1]; @@ -70,7 +72,7 @@ void vif1TransferToMemory() } GetMTGS().InitAndReadFIFO(reinterpret_cast(pMem), size); -// pMem += size; + // pMem += size; //Some games such as Alex Ferguson's Player Manager 2001 reads less than GSLastDownloadSize by VIF then reads the remainder by FIFO //Clearing the memory is clearing memory it shouldn't be and kills it. @@ -89,25 +91,25 @@ void vif1TransferToMemory() g_vif1Cycles += size * 2; vif1ch.madr += size * 16; // mgs3 scene changes - if (vif1.GSLastDownloadSize >= vif1ch.qwc) { + if (vif1.GSLastDownloadSize >= vif1ch.qwc) + { vif1.GSLastDownloadSize -= vif1ch.qwc; vif1Regs.stat.FQC = std::min((u32)16, vif1.GSLastDownloadSize); vif1ch.qwc = 0; } - else { + else + { vif1Regs.stat.FQC = 0; vif1ch.qwc -= vif1.GSLastDownloadSize; vif1.GSLastDownloadSize = 0; //This could be potentially bad and cause hangs. I guess we will find out. DevCon.Warning("QWC left on VIF FIFO Reverse"); } - - } bool _VIF1chain() { - u32 *pMem; + u32* pMem; if (vif1ch.qwc == 0) { @@ -135,7 +137,7 @@ bool _VIF1chain() } VIF_LOG("VIF1chain size=%d, madr=%lx, tadr=%lx", - vif1ch.qwc, vif1ch.madr, vif1ch.tadr); + vif1ch.qwc, vif1ch.madr, vif1ch.tadr); if (vif1.irqoffset.enabled) return VIF1transfer(pMem + vif1.irqoffset.value, vif1ch.qwc * 4 - vif1.irqoffset.value, false); @@ -145,20 +147,21 @@ bool _VIF1chain() __fi void vif1SetupTransfer() { - tDMA_TAG *ptag; - + tDMA_TAG* ptag; + ptag = dmaGetAddr(vif1ch.tadr, false); //Set memory pointer to TADR - if (!(vif1ch.transfer("Vif1 Tag", ptag))) return; + if (!(vif1ch.transfer("Vif1 Tag", ptag))) + return; - vif1ch.madr = ptag[1]._u32; //MADR = ADDR field + SPR + vif1ch.madr = ptag[1]._u32; //MADR = ADDR field + SPR g_vif1Cycles += 1; // Add 1 g_vifCycles from the QW read for the tag vif1.inprogress &= ~1; VIF_LOG("VIF1 Tag %8.8x_%8.8x size=%d, id=%d, madr=%lx, tadr=%lx", - ptag[1]._u32, ptag[0]._u32, vif1ch.qwc, ptag->ID, vif1ch.madr, vif1ch.tadr); + ptag[1]._u32, ptag[0]._u32, vif1ch.qwc, ptag->ID, vif1ch.madr, vif1ch.tadr); - if (!vif1.done && ((dmacRegs.ctrl.STD == STD_VIF1) && (ptag->ID == TAG_REFS))) // STD == VIF1 + if (!vif1.done && ((dmacRegs.ctrl.STD == STD_VIF1) && (ptag->ID == TAG_REFS))) // STD == VIF1 { // there are still bugs, need to also check if gif->madr +16*qwc >= stadr, if not, stall if ((vif1ch.madr + vif1ch.qwc * 16) > dmacRegs.stadr.ADDR) @@ -177,7 +180,7 @@ __fi void vif1SetupTransfer() bool ret; alignas(16) static u128 masked_tag; - + masked_tag._u64[0] = 0; masked_tag._u64[1] = *((u64*)ptag + 1); @@ -185,7 +188,7 @@ __fi void vif1SetupTransfer() if (vif1.irqoffset.enabled) { - ret = VIF1transfer((u32*)&masked_tag + vif1.irqoffset.value, 4 - vif1.irqoffset.value, true); //Transfer Tag on stall + ret = VIF1transfer((u32*)&masked_tag + vif1.irqoffset.value, 4 - vif1.irqoffset.value, true); //Transfer Tag on stall //ret = VIF1transfer((u32*)ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset); //Transfer Tag on stall } else @@ -194,7 +197,7 @@ __fi void vif1SetupTransfer() // to the VU's, which breaks stuff, this is where the 128bit packet will fail, so we ignore the first 2 words vif1.irqoffset.value = 2; vif1.irqoffset.enabled = true; - ret = VIF1transfer((u32*)&masked_tag + 2, 2, true); //Transfer Tag + ret = VIF1transfer((u32*)&masked_tag + 2, 2, true); //Transfer Tag //ret = VIF1transfer((u32*)ptag + 2, 2); //Transfer Tag } @@ -202,7 +205,7 @@ __fi void vif1SetupTransfer() { vif1.inprogress &= ~1; // Better clear this so it has to do it again (Jak 1) vif1ch.qwc = 0; // Gumball 3000 pauses the DMA when the tag stalls so we need to reset the QWC, it'll be gotten again later - return; // IRQ set by VIFTransfer + return; // IRQ set by VIFTransfer } } vif1.irqoffset.value = 0; @@ -210,14 +213,15 @@ __fi void vif1SetupTransfer() vif1.done |= hwDmacSrcChainWithStack(vif1ch, ptag->ID); - if(vif1ch.qwc > 0) vif1.inprogress |= 1; + if (vif1ch.qwc > 0) + vif1.inprogress |= 1; //Check TIE bit of CHCR and IRQ bit of tag if (vif1ch.chcr.TIE && ptag->IRQ) { VIF_LOG("dmaIrq Set"); - //End Transfer + //End Transfer vif1.done = true; return; } @@ -229,23 +233,31 @@ __fi void vif1VUFinish() { vu1Thread.Get_MTVUChanges(); - CPU_INT(VIF_VU1_FINISH, 128); + if (THREAD_VU1 && !INSTANT_VU1 && (VU0.VI[REG_VPU_STAT].UL & 0x100)) + CPU_INT(VIF_VU1_FINISH, cpuGetCycles(VU_MTVU_BUSY)); + else + CPU_INT(VIF_VU1_FINISH, 128); + CPU_SET_DMASTALL(VIF_VU1_FINISH, true); return; } - + if (VU0.VI[REG_VPU_STAT].UL & 0x100) { u32 _cycles = VU1.cycle; //DevCon.Warning("Finishing VU1"); vu1Finish(false); - CPU_INT(VIF_VU1_FINISH, VU1.cycle - _cycles); + if (THREAD_VU1 && !INSTANT_VU1 && (VU0.VI[REG_VPU_STAT].UL & 0x100)) + CPU_INT(VIF_VU1_FINISH, cpuGetCycles(VU_MTVU_BUSY)); + else + CPU_INT(VIF_VU1_FINISH, VU1.cycle - _cycles); + CPU_SET_DMASTALL(VIF_VU1_FINISH, true); return; } vif1Regs.stat.VEW = false; VIF_LOG("VU1 finished"); - if(vif1.waitforvu) + if (vif1.waitforvu) { vif1.waitforvu = false; //Check if VIF is already scheduled to interrupt, if it's waiting, kick it :P @@ -257,7 +269,7 @@ __fi void vif1VUFinish() vif1Interrupt(); } } - + //DevCon.Warning("VU1 state cleared"); } @@ -267,19 +279,22 @@ __fi void vif1Interrupt() g_vif1Cycles = 0; - if( gifRegs.stat.APATH == 2 && gifUnit.gifPath[GIF_PATH_2].isDone()) + if (gifRegs.stat.APATH == 2 && gifUnit.gifPath[GIF_PATH_2].isDone()) { gifRegs.stat.APATH = 0; gifRegs.stat.OPH = 0; vif1Regs.stat.VGW = false; //Let vif continue if it's stuck on a flush - if(gifUnit.checkPaths(1,0,1)) gifUnit.Execute(false, true); + if (gifUnit.checkPaths(1, 0, 1)) + gifUnit.Execute(false, true); } //Some games (Fahrenheit being one) start vif first, let it loop through blankness while it sets MFIFO mode, so we need to check it here. - if (dmacRegs.ctrl.MFD == MFD_VIF1) { + if (dmacRegs.ctrl.MFD == MFD_VIF1) + { //Console.WriteLn("VIFMFIFO\n"); // Test changed because the Final Fantasy 12 opening somehow has the tag in *Undefined* mode, which is not in the documentation that I saw. - if (vif1ch.chcr.MOD == NORMAL_MODE) Console.WriteLn("MFIFO mode is normal (which isn't normal here)! %x", vif1ch.chcr._u32); + if (vif1ch.chcr.MOD == NORMAL_MODE) + Console.WriteLn("MFIFO mode is normal (which isn't normal here)! %x", vif1ch.chcr._u32); vif1Regs.stat.FQC = std::min((u32)0x10, vif1ch.qwc); vifMFIFOInterrupt(); return; @@ -287,42 +302,50 @@ __fi void vif1Interrupt() // We need to check the direction, if it is downloading // from the GS then we handle that separately (KH2 for testing) - if (vif1ch.chcr.DIR) { - bool isDirect = (vif1.cmd & 0x7f) == 0x50; + if (vif1ch.chcr.DIR) + { + bool isDirect = (vif1.cmd & 0x7f) == 0x50; bool isDirectHL = (vif1.cmd & 0x7f) == 0x51; - if((isDirect && !gifUnit.CanDoPath2()) - || (isDirectHL && !gifUnit.CanDoPath2HL())) { + if ((isDirect && !gifUnit.CanDoPath2()) || (isDirectHL && !gifUnit.CanDoPath2HL())) + { GUNIT_WARN("vif1Interrupt() - Waiting for Path 2 to be ready"); CPU_INT(DMAC_VIF1, 128); - if(gifRegs.stat.APATH == 3) vif1Regs.stat.VGW = 1; //We're waiting for path 3. Gunslinger II + if (gifRegs.stat.APATH == 3) + vif1Regs.stat.VGW = 1; //We're waiting for path 3. Gunslinger II return; } vif1Regs.stat.VGW = 0; //Path 3 isn't busy so we don't need to wait for it. vif1Regs.stat.FQC = std::min(vif1ch.qwc, (u32)16); //Simulated GS transfer time done, clear the flags } - - if(vif1.waitforvu) + + if (vif1.waitforvu) { //DevCon.Warning("Waiting on VU1"); //CPU_INT(DMAC_VIF1, 16); - CPU_INT(VIF_VU1_FINISH, 16); + CPU_INT(VIF_VU1_FINISH, std::max(16, cpuGetCycles(VU_MTVU_BUSY))); + CPU_SET_DMASTALL(DMAC_VIF1, true); return; } - + if (vif1Regs.stat.VGW) + { + CPU_SET_DMASTALL(DMAC_VIF1, true); return; - - if (!vif1ch.chcr.STR) Console.WriteLn("Vif1 running when CHCR == %x", vif1ch.chcr._u32); + } + + if (!vif1ch.chcr.STR) + Console.WriteLn("Vif1 running when CHCR == %x", vif1ch.chcr._u32); if (vif1.irq && vif1.vifstalled.enabled && vif1.vifstalled.value == VIF_IRQ_STALL) { VIF_LOG("VIF IRQ Firing"); if (!vif1Regs.stat.ER1) vif1Regs.stat.INT = true; - + //Yakuza watches VIF_STAT so lets do this here. - if (((vif1Regs.code >> 24) & 0x7f) != 0x7) { + if (((vif1Regs.code >> 24) & 0x7f) != 0x7) + { vif1Regs.stat.VIS = true; } @@ -336,10 +359,11 @@ __fi void vif1Interrupt() //NFSHPS stalls when the whole packet has gone across (it stalls in the last 32bit cmd) //In this case VIF will end vif1Regs.stat.FQC = std::min((u32)0x10, vif1ch.qwc); - if((vif1ch.qwc > 0 || !vif1.done) && !CHECK_VIF1STALLHACK) + if ((vif1ch.qwc > 0 || !vif1.done) && !CHECK_VIF1STALLHACK) { vif1Regs.stat.VPS = VPS_DECODING; //If there's more data you need to say it's decoding the next VIF CMD (Onimusha - Blade Warriors) VIF_LOG("VIF1 Stalled"); + CPU_SET_DMASTALL(DMAC_VIF1, true); return; } } @@ -350,95 +374,123 @@ __fi void vif1Interrupt() //Mirroring change to VIF0 if (vif1.cmd) { - if (vif1.done && (vif1ch.qwc == 0)) vif1Regs.stat.VPS = VPS_WAITING; + if (vif1.done && (vif1ch.qwc == 0)) + vif1Regs.stat.VPS = VPS_WAITING; } else { vif1Regs.stat.VPS = VPS_IDLE; } - + if (vif1.inprogress & 0x1) - { - _VIF1chain(); - // VIF_NORMAL_FROM_MEM_MODE is a very slow operation. - // Timesplitters 2 depends on this beeing a bit higher than 128. - if (vif1ch.chcr.DIR) vif1Regs.stat.FQC = std::min(vif1ch.qwc, (u32)16); - - if(!(vif1Regs.stat.VGW && gifUnit.gifPath[GIF_PATH_3].state != GIF_PATH_IDLE)) //If we're waiting on GIF, stop looping, (can be over 1000 loops!) + { + _VIF1chain(); + // VIF_NORMAL_FROM_MEM_MODE is a very slow operation. + // Timesplitters 2 depends on this beeing a bit higher than 128. + if (vif1ch.chcr.DIR) + vif1Regs.stat.FQC = std::min(vif1ch.qwc, (u32)16); + + if (!(vif1Regs.stat.VGW && gifUnit.gifPath[GIF_PATH_3].state != GIF_PATH_IDLE)) //If we're waiting on GIF, stop looping, (can be over 1000 loops!) + { + if (vif1.waitforvu) + { + //if (cpuGetCycles(VU_MTVU_BUSY) > static_cast(g_vif1Cycles)) + // DevCon.Warning("Waiting %d instead of %d", cpuGetCycles(VU_MTVU_BUSY), static_cast(g_vif1Cycles)); + CPU_INT(DMAC_VIF1, std::max(static_cast(g_vif1Cycles), cpuGetCycles(VU_MTVU_BUSY))); + } + else CPU_INT(DMAC_VIF1, g_vif1Cycles); - return; - } + } + return; + } - if (!vif1.done) - { + if (!vif1.done) + { - if (!(dmacRegs.ctrl.DMAE) || vif1Regs.stat.VSS) //Stopped or DMA Disabled - { - //Console.WriteLn("vif1 dma masked"); - return; - } + if (!(dmacRegs.ctrl.DMAE) || vif1Regs.stat.VSS) //Stopped or DMA Disabled + { + //Console.WriteLn("vif1 dma masked"); + return; + } - if ((vif1.inprogress & 0x1) == 0) vif1SetupTransfer(); - if (vif1ch.chcr.DIR) vif1Regs.stat.FQC = std::min(vif1ch.qwc, (u32)16); + if ((vif1.inprogress & 0x1) == 0) + vif1SetupTransfer(); + if (vif1ch.chcr.DIR) + vif1Regs.stat.FQC = std::min(vif1ch.qwc, (u32)16); - if(!(vif1Regs.stat.VGW && gifUnit.gifPath[GIF_PATH_3].state != GIF_PATH_IDLE)) //If we're waiting on GIF, stop looping, (can be over 1000 loops!) - CPU_INT(DMAC_VIF1, g_vif1Cycles); - return; + if (!(vif1Regs.stat.VGW && gifUnit.gifPath[GIF_PATH_3].state != GIF_PATH_IDLE)) //If we're waiting on GIF, stop looping, (can be over 1000 loops!) + { + if (vif1.waitforvu) + { + //if (cpuGetCycles(VU_MTVU_BUSY) > static_cast(g_vif1Cycles)) + // DevCon.Warning("Waiting %d instead of %d", cpuGetCycles(VU_MTVU_BUSY), static_cast(g_vif1Cycles)); + CPU_INT(DMAC_VIF1, std::max(static_cast(g_vif1Cycles), cpuGetCycles(VU_MTVU_BUSY))); + } + else + CPU_INT(DMAC_VIF1, g_vif1Cycles); + } + return; } if (vif1.vifstalled.enabled && vif1.done) { DevCon.WriteLn("VIF1 looping on stall at end\n"); CPU_INT(DMAC_VIF1, 0); + CPU_SET_DMASTALL(DMAC_VIF1, true); return; //Dont want to end if vif is stalled. } #ifdef PCSX2_DEVBUILD - if (vif1ch.qwc > 0) DevCon.WriteLn("VIF1 Ending with %x QWC left", vif1ch.qwc); - if (vif1.cmd != 0) DevCon.WriteLn("vif1.cmd still set %x tag size %x", vif1.cmd, vif1.tag.size); + if (vif1ch.qwc > 0) + DevCon.WriteLn("VIF1 Ending with %x QWC left", vif1ch.qwc); + if (vif1.cmd != 0) + DevCon.WriteLn("vif1.cmd still set %x tag size %x", vif1.cmd, vif1.tag.size); #endif - if((vif1ch.chcr.DIR == VIF_NORMAL_TO_MEM_MODE) && vif1.GSLastDownloadSize <= 16) + if ((vif1ch.chcr.DIR == VIF_NORMAL_TO_MEM_MODE) && vif1.GSLastDownloadSize <= 16) { //Reverse fifo has finished and nothing is left, so lets clear the outputting flag gifRegs.stat.OPH = false; } - if (vif1ch.chcr.DIR) vif1Regs.stat.FQC = std::min(vif1ch.qwc, (u32)16); + if (vif1ch.chcr.DIR) + vif1Regs.stat.FQC = std::min(vif1ch.qwc, (u32)16); vif1ch.chcr.STR = false; vif1.vifstalled.enabled = false; vif1.irqoffset.enabled = false; - if(vif1.queued_program) vifExecQueue(1); + if (vif1.queued_program) + vifExecQueue(1); g_vif1Cycles = 0; VIF_LOG("VIF1 DMA End"); hwDmacIrq(DMAC_VIF1); - + CPU_SET_DMASTALL(DMAC_VIF1, false); } void dmaVIF1() { VIF_LOG("dmaVIF1 chcr = %lx, madr = %lx, qwc = %lx\n" - " tadr = %lx, asr0 = %lx, asr1 = %lx", - vif1ch.chcr._u32, vif1ch.madr, vif1ch.qwc, - vif1ch.tadr, vif1ch.asr0, vif1ch.asr1); + " tadr = %lx, asr0 = %lx, asr1 = %lx", + vif1ch.chcr._u32, vif1ch.madr, vif1ch.qwc, + vif1ch.tadr, vif1ch.asr0, vif1ch.asr1); g_vif1Cycles = 0; vif1.inprogress = 0; + CPU_SET_DMASTALL(DMAC_VIF1, false); - if (vif1ch.qwc > 0) // Normal Mode + if (vif1ch.qwc > 0) // Normal Mode { - + // ignore tag if it's a GS download (Def Jam Fight for NY) - if(vif1ch.chcr.MOD == CHAIN_MODE && vif1ch.chcr.DIR) + if (vif1ch.chcr.MOD == CHAIN_MODE && vif1ch.chcr.DIR) { vif1.dmamode = VIF_CHAIN_MODE; //DevCon.Warning(L"VIF1 QWC on Chain CHCR " + vif1ch.chcr.desc()); - + if ((vif1ch.chcr.tag().ID == TAG_REFE) || (vif1ch.chcr.tag().ID == TAG_END) || (vif1ch.chcr.tag().IRQ && vif1ch.chcr.TIE)) { vif1.done = true; } - else + else { vif1.done = false; } @@ -448,12 +500,13 @@ void dmaVIF1() if (dmacRegs.ctrl.STD == STD_VIF1) Console.WriteLn("DMA Stall Control on VIF1 normal not implemented - Report which game to PCSX2 Team"); - if (vif1ch.chcr.DIR) // from Memory + if (vif1ch.chcr.DIR) // from Memory vif1.dmamode = VIF_NORMAL_FROM_MEM_MODE; else vif1.dmamode = VIF_NORMAL_TO_MEM_MODE; - if(vif1.irqoffset.enabled && !vif1.done) DevCon.Warning("Warning! VIF1 starting a Normal transfer with vif offset set (Possible force stop?)"); + if (vif1.irqoffset.enabled && !vif1.done) + DevCon.Warning("Warning! VIF1 starting a Normal transfer with vif offset set (Possible force stop?)"); vif1.done = true; } @@ -464,10 +517,10 @@ void dmaVIF1() vif1.inprogress &= ~0x1; vif1.dmamode = VIF_CHAIN_MODE; vif1.done = false; - } - if (vif1ch.chcr.DIR) vif1Regs.stat.FQC = std::min((u32)0x10, vif1ch.qwc); + if (vif1ch.chcr.DIR) + vif1Regs.stat.FQC = std::min((u32)0x10, vif1ch.qwc); // Check VIF isn't stalled before starting the loop. // Batman Vengence does something stupid and instead of cancelling a stall it tries to restart VIF, THEN check the stall diff --git a/pcsx2/Vif1_MFIFO.cpp b/pcsx2/Vif1_MFIFO.cpp index 4eff4a7928..a33cbcd83e 100644 --- a/pcsx2/Vif1_MFIFO.cpp +++ b/pcsx2/Vif1_MFIFO.cpp @@ -27,9 +27,9 @@ static u32 qwctag(u32 mask) static u32 QWCinVIFMFIFO(u32 DrainADDR, u32 qwc) { u32 ret; - + //Calculate what we have in the fifo. - if(DrainADDR <= spr0ch.madr) + if (DrainADDR <= spr0ch.madr) { //Drain is below the tadr, calculate the difference between them ret = (spr0ch.madr - DrainADDR) >> 4; @@ -37,7 +37,7 @@ static u32 QWCinVIFMFIFO(u32 DrainADDR, u32 qwc) else { u32 limit = dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16; - //Drain is higher than SPR so it has looped round, + //Drain is higher than SPR so it has looped round, //calculate from base to the SPR tag addr and what is left in the top of the ring ret = ((spr0ch.madr - dmacRegs.rbor.ADDR) + (limit - DrainADDR)) >> 4; } @@ -50,18 +50,19 @@ static __fi bool mfifoVIF1rbTransfer() { u32 msize = dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16; u32 mfifoqwc = std::min(QWCinVIFMFIFO(vif1ch.madr, vif1ch.qwc), vif1ch.qwc); - u32 *src; + u32* src; bool ret; - - if (mfifoqwc == 0) { + + if (mfifoqwc == 0) + { DevCon.Warning("VIF MFIFO no QWC before transfer (in transfer function, bit late really)"); - return true; //Cant do anything, lets forget it + return true; //Cant do anything, lets forget it } /* Check if the transfer should wrap around the ring buffer */ if ((vif1ch.madr + (mfifoqwc << 4)) > (msize)) { - int s1 = ((msize) - vif1ch.madr) >> 2; + int s1 = ((msize)-vif1ch.madr) >> 2; VIF_LOG("Split MFIFO"); @@ -69,7 +70,8 @@ static __fi bool mfifoVIF1rbTransfer() vif1ch.madr = qwctag(vif1ch.madr); src = (u32*)PSM(vif1ch.madr); - if (src == NULL) return false; + if (src == NULL) + return false; if (vif1.irqoffset.enabled) ret = VIF1transfer(src + vif1.irqoffset.value, s1 - vif1.irqoffset.value); @@ -78,15 +80,17 @@ static __fi bool mfifoVIF1rbTransfer() if (ret) { - if(vif1.irqoffset.value != 0) DevCon.Warning("VIF1 MFIFO Offest != 0! vifoffset=%x", vif1.irqoffset.value); - /* and second copy 's2' bytes from 'maddr' to '&data[s1]' */ + if (vif1.irqoffset.value != 0) + DevCon.Warning("VIF1 MFIFO Offest != 0! vifoffset=%x", vif1.irqoffset.value); + /* and second copy 's2' bytes from 'maddr' to '&data[s1]' */ //DevCon.Warning("Loopyloop"); vif1ch.tadr = qwctag(vif1ch.tadr); vif1ch.madr = qwctag(vif1ch.madr); - src = (u32*)PSM(vif1ch.madr); - if (src == NULL) return false; - VIF1transfer(src, ((mfifoqwc << 2) - s1)); + src = (u32*)PSM(vif1ch.madr); + if (src == NULL) + return false; + VIF1transfer(src, ((mfifoqwc << 2) - s1)); } } else @@ -95,7 +99,8 @@ static __fi bool mfifoVIF1rbTransfer() /* it doesn't, so just transfer 'qwc*4' words */ src = (u32*)PSM(vif1ch.madr); - if (src == NULL) return false; + if (src == NULL) + return false; if (vif1.irqoffset.enabled) ret = VIF1transfer(src + vif1.irqoffset.value, mfifoqwc * 4 - vif1.irqoffset.value); @@ -115,10 +120,11 @@ static __fi void mfifo_VIF1chain() } if (vif1ch.madr >= dmacRegs.rbor.ADDR && - vif1ch.madr < (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16u)) + vif1ch.madr < (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16u)) { //if(vif1ch.madr == (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16)) DevCon.Warning("Edge VIF1"); - if (QWCinVIFMFIFO(vif1ch.madr, vif1ch.qwc) == 0) { + if (QWCinVIFMFIFO(vif1ch.madr, vif1ch.qwc) == 0) + { VIF_LOG("VIF MFIFO Empty before transfer"); vif1.inprogress |= 0x10; g_vif1Cycles += 4; @@ -132,16 +138,16 @@ static __fi void mfifo_VIF1chain() //It does an END tag (which normally doesn't increment TADR because it breaks Soul Calibur 2) //with a QWC of 1 (rare) so we need to increment the TADR in the case of MFIFO. vif1ch.tadr = vif1ch.madr; - } else { - tDMA_TAG *pMem = dmaGetAddr(vif1ch.madr, !vif1ch.chcr.DIR); + tDMA_TAG* pMem = dmaGetAddr(vif1ch.madr, !vif1ch.chcr.DIR); VIF_LOG("Non-MFIFO Location"); //No need to exit on non-mfifo as it is indirect anyway, so it can be transferring this while spr refills the mfifo - if (pMem == NULL) return; + if (pMem == NULL) + return; if (vif1.irqoffset.enabled) VIF1transfer((u32*)pMem + vif1.irqoffset.value, vif1ch.qwc * 4 - vif1.irqoffset.value); @@ -152,19 +158,20 @@ static __fi void mfifo_VIF1chain() void mfifoVifMaskMem(int id) { - switch (id) { + switch (id) + { //These five transfer data following the tag, need to check its within the buffer (Front Mission 4) case TAG_CNT: case TAG_NEXT: - case TAG_CALL: + case TAG_CALL: case TAG_RET: case TAG_END: - if(vif1ch.madr < dmacRegs.rbor.ADDR) //probably not needed but we will check anyway. + if (vif1ch.madr < dmacRegs.rbor.ADDR) //probably not needed but we will check anyway. { //DevCon.Warning("VIF MFIFO MADR below bottom of ring buffer, wrapping VIF MADR = %x Ring Bottom %x", vif1ch.madr, dmacRegs.rbor.ADDR); vif1ch.madr = qwctag(vif1ch.madr); } - if(vif1ch.madr > (dmacRegs.rbor.ADDR + (u32)dmacRegs.rbsr.RMSK)) //Usual scenario is the tag is near the end (Front Mission 4) + if (vif1ch.madr > (dmacRegs.rbor.ADDR + (u32)dmacRegs.rbsr.RMSK)) //Usual scenario is the tag is near the end (Front Mission 4) { //DevCon.Warning("VIF MFIFO MADR outside top of ring buffer, wrapping VIF MADR = %x Ring Top %x", vif1ch.madr, (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK)+16); vif1ch.madr = qwctag(vif1ch.madr); @@ -178,13 +185,14 @@ void mfifoVifMaskMem(int id) void mfifoVIF1transfer() { - tDMA_TAG *ptag; + tDMA_TAG* ptag; g_vif1Cycles = 0; if (vif1ch.qwc == 0) { - if (QWCinVIFMFIFO(vif1ch.tadr, 1) == 0) { + if (QWCinVIFMFIFO(vif1ch.tadr, 1) == 0) + { VIF_LOG("VIF MFIFO Empty before tag"); vif1.inprogress |= 0x10; g_vif1Cycles += 4; @@ -212,21 +220,20 @@ void mfifoVIF1transfer() if (vif1.irqoffset.enabled) { - ret = VIF1transfer((u32*)&masked_tag + vif1.irqoffset.value, 4 - vif1.irqoffset.value, true); //Transfer Tag on stall + ret = VIF1transfer((u32*)&masked_tag + vif1.irqoffset.value, 4 - vif1.irqoffset.value, true); //Transfer Tag on stall //ret = VIF1transfer((u32*)ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset); //Transfer Tag on stall } else { vif1.irqoffset.value = 2; vif1.irqoffset.enabled = true; - ret = VIF1transfer((u32*)&masked_tag + 2, 2, true); //Transfer Tag + ret = VIF1transfer((u32*)&masked_tag + 2, 2, true); //Transfer Tag } if (!ret && vif1.irqoffset.enabled) { vif1.inprogress &= ~1; - return; //IRQ set by VIFTransfer - + return; //IRQ set by VIFTransfer } g_vif1Cycles += 2; } @@ -234,12 +241,12 @@ void mfifoVIF1transfer() vif1.irqoffset.value = 0; vif1.irqoffset.enabled = false; - vif1ch.unsafeTransfer(ptag); + vif1ch.unsafeTransfer(ptag); vif1ch.madr = ptag[1]._u32; VIF_LOG("dmaChain %8.8x_%8.8x size=%d, id=%d, madr=%lx, tadr=%lx spr0 madr = %x", - ptag[1]._u32, ptag[0]._u32, vif1ch.qwc, ptag->ID, vif1ch.madr, vif1ch.tadr, spr0ch.madr); + ptag[1]._u32, ptag[0]._u32, vif1ch.qwc, ptag->ID, vif1ch.madr, vif1ch.tadr, spr0ch.madr); vif1.done |= hwDmacSrcChainWithStack(vif1ch, ptag->ID); @@ -253,13 +260,14 @@ void mfifoVIF1transfer() vif1ch.tadr = qwctag(vif1ch.tadr); - if(vif1ch.qwc > 0) vif1.inprogress |= 1; + if (vif1ch.qwc > 0) + vif1.inprogress |= 1; } else { DevCon.Warning("Vif MFIFO QWC not 0 on tag"); } - + VIF_LOG("mfifoVIF1transfer end %x madr %x, tadr %x", vif1ch.chcr._u32, vif1ch.madr, vif1ch.tadr); } @@ -269,33 +277,38 @@ void vifMFIFOInterrupt() g_vif1Cycles = 0; VIF_LOG("vif mfifo interrupt"); - if (dmacRegs.ctrl.MFD != MFD_VIF1) { + if (dmacRegs.ctrl.MFD != MFD_VIF1) + { vif1Interrupt(); return; } - if( gifRegs.stat.APATH == 2 && gifUnit.gifPath[1].isDone()) + if (gifRegs.stat.APATH == 2 && gifUnit.gifPath[1].isDone()) { gifRegs.stat.APATH = 0; gifRegs.stat.OPH = 0; - if(gifUnit.checkPaths(1,0,1)) gifUnit.Execute(false, true); + if (gifUnit.checkPaths(1, 0, 1)) + gifUnit.Execute(false, true); } - if (vif1ch.chcr.DIR) { - bool isDirect = (vif1.cmd & 0x7f) == 0x50; + if (vif1ch.chcr.DIR) + { + bool isDirect = (vif1.cmd & 0x7f) == 0x50; bool isDirectHL = (vif1.cmd & 0x7f) == 0x51; - if((isDirect && !gifUnit.CanDoPath2()) - || (isDirectHL && !gifUnit.CanDoPath2HL())) { + if ((isDirect && !gifUnit.CanDoPath2()) || (isDirectHL && !gifUnit.CanDoPath2HL())) + { GUNIT_WARN("vifMFIFOInterrupt() - Waiting for Path 2 to be ready"); CPU_INT(DMAC_MFIFO_VIF, 128); + CPU_SET_DMASTALL(DMAC_VIF1, true); return; } } - if(vif1.waitforvu) + if (vif1.waitforvu) { - // DevCon.Warning("Waiting on VU1 MFIFO"); - CPU_INT(VIF_VU1_FINISH, 16); + //DevCon.Warning("Waiting on VU1 MFIFO"); + CPU_INT(VIF_VU1_FINISH, std::max(16, cpuGetCycles(VU_MTVU_BUSY))); + CPU_SET_DMASTALL(DMAC_VIF1, true); return; } @@ -303,60 +316,81 @@ void vifMFIFOInterrupt() // we handle that separately (KH2 for testing) // Simulated GS transfer time done, clear the flags - - if (vif1.irq && vif1.vifstalled.enabled && vif1.vifstalled.value == VIF_IRQ_STALL) { + + if (vif1.irq && vif1.vifstalled.enabled && vif1.vifstalled.value == VIF_IRQ_STALL) + { VIF_LOG("VIF MFIFO Code Interrupt detected"); vif1Regs.stat.INT = true; - if (((vif1Regs.code >> 24) & 0x7f) != 0x7) { + if (((vif1Regs.code >> 24) & 0x7f) != 0x7) + { vif1Regs.stat.VIS = true; } hwIntcIrq(INTC_VIF1); --vif1.irq; - - if (vif1Regs.stat.test(VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS)) { + + if (vif1Regs.stat.test(VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS)) + { //vif1Regs.stat.FQC = 0; // FQC=0 //vif1ch.chcr.STR = false; vif1Regs.stat.FQC = std::min((u32)0x10, vif1ch.qwc); VIF_LOG("VIF1 MFIFO Stalled qwc = %x done = %x inprogress = %x", vif1ch.qwc, vif1.done, vif1.inprogress & 0x10); //Used to check if the MFIFO was empty, there's really no need if it's finished what it needed. - if((vif1ch.qwc > 0 || !vif1.done)) { + if ((vif1ch.qwc > 0 || !vif1.done)) + { vif1Regs.stat.VPS = VPS_DECODING; //If there's more data you need to say it's decoding the next VIF CMD (Onimusha - Blade Warriors) VIF_LOG("VIF1 MFIFO Stalled"); + CPU_SET_DMASTALL(DMAC_VIF1, true); return; } } } //Mirroring change to VIF0 - if (vif1.cmd) { - if (vif1.done && vif1ch.qwc == 0) vif1Regs.stat.VPS = VPS_WAITING; + if (vif1.cmd) + { + if (vif1.done && vif1ch.qwc == 0) + vif1Regs.stat.VPS = VPS_WAITING; } - else { + else + { vif1Regs.stat.VPS = VPS_IDLE; } - if(vif1.inprogress & 0x10) { + if (vif1.inprogress & 0x10) + { FireMFIFOEmpty(); + CPU_SET_DMASTALL(DMAC_VIF1, true); return; } vif1.vifstalled.enabled = false; - if (!vif1.done || vif1ch.qwc) { - switch(vif1.inprogress & 1) { + if (!vif1.done || vif1ch.qwc) + { + switch (vif1.inprogress & 1) + { case 0: //Set up transfer mfifoVIF1transfer(); vif1Regs.stat.FQC = std::min((u32)0x10, vif1ch.qwc); [[fallthrough]]; case 1: //Transfer data - if(vif1.inprogress & 0x1) //Just in case the tag breaks early (or something wierd happens)! + if (vif1.inprogress & 0x1) //Just in case the tag breaks early (or something wierd happens)! mfifo_VIF1chain(); //Sanity check! making sure we always have non-zero values - if(!(vif1Regs.stat.VGW && gifUnit.gifPath[GIF_PATH_3].state != GIF_PATH_IDLE)) //If we're waiting on GIF, stop looping, (can be over 1000 loops!) - CPU_INT(DMAC_MFIFO_VIF, (g_vif1Cycles == 0 ? 4 : g_vif1Cycles) ); + if (!(vif1Regs.stat.VGW && gifUnit.gifPath[GIF_PATH_3].state != GIF_PATH_IDLE)) //If we're waiting on GIF, stop looping, (can be over 1000 loops!) + { + if (vif1.waitforvu) + { + //if (cpuGetCycles(VU_MTVU_BUSY) > static_cast(g_vif1Cycles)) + // DevCon.Warning("Waiting %d instead of %d", cpuGetCycles(VU_MTVU_BUSY), static_cast(g_vif1Cycles)); + CPU_INT(DMAC_MFIFO_VIF, std::max(static_cast((g_vif1Cycles == 0 ? 4 : g_vif1Cycles)), cpuGetCycles(VU_MTVU_BUSY))); + } + else + CPU_INT(DMAC_MFIFO_VIF, (g_vif1Cycles == 0 ? 4 : g_vif1Cycles)); + } vif1Regs.stat.FQC = std::min((u32)0x10, vif1ch.qwc); return; @@ -368,7 +402,8 @@ void vifMFIFOInterrupt() vif1.irqoffset.enabled = false; vif1.done = 1; - if (spr0ch.madr == vif1ch.tadr) { + if (spr0ch.madr == vif1ch.tadr) + { FireMFIFOEmpty(); } @@ -377,6 +412,6 @@ void vifMFIFOInterrupt() vif1ch.chcr.STR = false; hwDmacIrq(DMAC_VIF1); DMA_LOG("VIF1 MFIFO DMA End"); - + CPU_SET_DMASTALL(DMAC_VIF1, false); vif1Regs.stat.FQC = 0; } diff --git a/pcsx2/Vif_Codes.cpp b/pcsx2/Vif_Codes.cpp index e5e146e876..2782e5b73f 100644 --- a/pcsx2/Vif_Codes.cpp +++ b/pcsx2/Vif_Codes.cpp @@ -221,7 +221,7 @@ vifOp(vifCode_Flush) if (vif1.waitforvu || vif1Regs.stat.VGW) return 0; - + vif1.cmd = 0; vif1.pass = 0; } @@ -474,7 +474,7 @@ vifOp(vifCode_MSCNT) if (vifX.waitforvu) return 0; - + vuExecMicro(idx, -1, false); vifX.cmd = 0; vifX.pass = 0; diff --git a/pcsx2/Vif_Transfer.cpp b/pcsx2/Vif_Transfer.cpp index 4c8c60f259..dede156586 100644 --- a/pcsx2/Vif_Transfer.cpp +++ b/pcsx2/Vif_Transfer.cpp @@ -27,7 +27,7 @@ _vifT void vifTransferLoop(u32* &data) { vifStruct& vifX = GetVifX; u32& pSize = vifX.vifpacketsize; - + int ret = 0; vifXRegs.stat.VPS |= VPS_TRANSFERRING; @@ -39,7 +39,7 @@ _vifT void vifTransferLoop(u32* &data) { if(!vifXRegs.err.MII) { - if(vifX.irq && !CHECK_VIF1STALLHACK) + if(vifX.irq && !CHECK_VIF1STALLHACK) break; vifX.irq |= data[0] >> 31; @@ -47,8 +47,8 @@ _vifT void vifTransferLoop(u32* &data) { vifXRegs.code = data[0]; vifX.cmd = data[0] >> 24; - - + + VIF_LOG("New VifCMD %x tagsize %x irq %d", vifX.cmd, vifX.tag.size, vifX.irq); if (IsDevBuild && SysTrace.EE.VIFcode.IsActive()) { // Pass 2 means "log it" @@ -73,7 +73,7 @@ _vifT static __fi bool vifTransfer(u32 *data, int size, bool TTE) { // irqoffset necessary to add up the right qws, or else will spin (spiderman) int transferred = vifX.irqoffset.enabled ? vifX.irqoffset.value : 0; - + vifX.vifpacketsize = size; vifTransferLoop(data); @@ -85,13 +85,13 @@ _vifT static __fi bool vifTransfer(u32 *data, int size, bool TTE) { else g_vif1Cycles += std::max(1, (int)((transferred * BIAS) >> 2)); vifX.irqoffset.value = transferred % 4; // cannot lose the offset - + if (vifX.irq && vifX.cmd == 0) { VIF_LOG("Vif%d IRQ Triggering", idx); //Always needs to be set to return to the correct offset if there is data left. vifX.vifstalled.enabled = VifStallEnable(vifXch); vifX.vifstalled.value = VIF_IRQ_STALL; - } + } if (!TTE) // *WARNING* - Tags CAN have interrupts! so lets just ignore the dma modifying stuffs (GT4) { @@ -104,9 +104,9 @@ _vifT static __fi bool vifTransfer(u32 *data, int size, bool TTE) { vifX.irqoffset.enabled = false; - if(!vifXch.qwc) + if(!vifXch.qwc) vifX.inprogress &= ~0x1; - else if(vifX.irqoffset.value != 0) + else if(vifX.irqoffset.value != 0) vifX.irqoffset.enabled = true; } else diff --git a/pcsx2/Vif_Unpack.cpp b/pcsx2/Vif_Unpack.cpp index 97061cbdc5..f39fd90f9c 100644 --- a/pcsx2/Vif_Unpack.cpp +++ b/pcsx2/Vif_Unpack.cpp @@ -192,7 +192,7 @@ _vifT void vifUnpackSetup(const u32 *data) { vifStruct& vifX = GetVifX; GetVifX.unpackcalls++; - + if (GetVifX.unpackcalls > 3) { vifExecQueue(idx); diff --git a/pcsx2/gui/App.h b/pcsx2/gui/App.h index 144efde07b..4505887a24 100644 --- a/pcsx2/gui/App.h +++ b/pcsx2/gui/App.h @@ -30,8 +30,6 @@ #include "RecentIsoList.h" #include "DriveList.h" -#include "Recording/NewRecordingFrame.h" - class DisassemblyDialog; struct HostKeyEvent; @@ -201,25 +199,6 @@ enum MenuIdentifiers }; -namespace Exception -{ - // -------------------------------------------------------------------------- - // Exception used to perform an "errorless" termination of the app during OnInit - // procedures. This happens when a user cancels out of startup prompts/wizards. - // - class StartupAborted : public CancelEvent - { - DEFINE_RUNTIME_EXCEPTION(StartupAborted, CancelEvent, "Startup initialization was aborted by the user.") - - public: - StartupAborted(std::string reason) - { - m_message_diag = "Startup aborted: " + reason; - } - }; - -} // namespace Exception - // -------------------------------------------------------------------------------------- // AppImageIds - Config and Toolbar Images and Icons // -------------------------------------------------------------------------------------- @@ -501,13 +480,6 @@ public: MainEmuFrame* GetMainFramePtr() const { return (MainEmuFrame*)wxWindow::FindWindowById(m_id_MainFrame); } DisassemblyDialog* GetDisassemblyPtr() const { return (DisassemblyDialog*)wxWindow::FindWindowById(m_id_Disassembler); } -#ifndef PCSX2_CORE - NewRecordingFrame* GetNewRecordingFramePtr() const - { - return (NewRecordingFrame*)wxWindow::FindWindowById(m_id_NewRecordingFrame); - } -#endif - void enterDebugMode(); void leaveDebugMode(); void resetDebugger(); diff --git a/pcsx2/gui/AppAssert.cpp b/pcsx2/gui/AppAssert.cpp index 92d4c7c2e8..d17df1ad6d 100644 --- a/pcsx2/gui/AppAssert.cpp +++ b/pcsx2/gui/AppAssert.cpp @@ -69,7 +69,7 @@ protected: }*/ m_stackTrace.Write(pxsFmt( L"[%02d]", frame.GetLevel()-m_skipped).c_str()); - + if (!frame.GetName().IsEmpty()) m_stackTrace.Write(pxsFmt( L" %-44s", WX_STR(frame.GetName()) ).c_str()); else @@ -85,7 +85,7 @@ protected: m_stackTrace.Write( L" %s:%d", WX_STR(wxfn.GetFullPath()), frame.GetLine() ); } - + m_stackTrace.Write(L"\n"); } }; diff --git a/pcsx2/gui/AppConfig.cpp b/pcsx2/gui/AppConfig.cpp index d48190dbc1..98ce9cbb97 100644 --- a/pcsx2/gui/AppConfig.cpp +++ b/pcsx2/gui/AppConfig.cpp @@ -557,9 +557,10 @@ AppConfig::AppConfig() , McdSettingsTabName(L"none") , AppSettingsTabName(L"none") , GameDatabaseTabName(L"none") + , LanguageId(wxLANGUAGE_DEFAULT) + , LanguageCode(L"default") + , CdvdSource(CDVD_SourceType::Iso) { - LanguageId = wxLANGUAGE_DEFAULT; - LanguageCode = L"default"; RecentIsoCount = 20; Listbook_ImageSize = 32; Toolbar_ImageSize = 24; @@ -573,8 +574,6 @@ AppConfig::AppConfig() EnablePresets = true; PresetIndex = 1; - - CdvdSource = CDVD_SourceType::Iso; } // ------------------------------------------------------------------------ @@ -827,6 +826,8 @@ void AppSetEmuFolders() // ------------------------------------------------------------------------ AppConfig::GSWindowOptions::GSWindowOptions() + : WindowSize(wxSize(640, 480)) + , WindowPos(wxDefaultPosition) { CloseOnEsc = true; DefaultToFullscreen = false; @@ -834,8 +835,6 @@ AppConfig::GSWindowOptions::GSWindowOptions() DisableResizeBorders = false; DisableScreenSaver = true; - WindowSize = wxSize(640, 480); - WindowPos = wxDefaultPosition; IsMaximized = false; IsFullscreen = false; EnableVsyncWindowFlag = false; @@ -934,18 +933,18 @@ void AppConfig::CaptureOptions::LoadSave(IniInterface& ini) } AppConfig::UiTemplateOptions::UiTemplateOptions() + : LimiterUnlimited(L"Max") + , LimiterTurbo(L"Turbo") + , LimiterSlowmo(L"Slowmo") + , LimiterNormal(L"Normal") + , OutputFrame(L"Frame") + , OutputField(L"Field") + , OutputProgressive(L"Progressive") + , OutputInterlaced(L"Interlaced") + , Paused(L" ") + , TitleTemplate(L"Slot: ${slot} | Speed: ${speed} (${vfps}) | ${videomode} | Limiter: ${limiter} | ${gs} | ${omodei} | ${cpuusage}") + , RecordingTemplate(L"Slot: ${slot} | Frame: ${frame}/${maxFrame} | Rec. Mode: ${mode} | Speed: ${speed} (${vfps}) | Limiter: ${limiter}") { - LimiterUnlimited = L"Max"; - LimiterTurbo = L"Turbo"; - LimiterSlowmo = L"Slowmo"; - LimiterNormal = L"Normal"; - OutputFrame = L"Frame"; - OutputField = L"Field"; - OutputProgressive = L"Progressive"; - OutputInterlaced = L"Interlaced"; - Paused = L" "; - TitleTemplate = L"Slot: ${slot} | Speed: ${speed} (${vfps}) | ${videomode} | Limiter: ${limiter} | ${gs} | ${omodei} | ${cpuusage}"; - RecordingTemplate = L"Slot: ${slot} | Frame: ${frame}/${maxFrame} | Rec. Mode: ${mode} | Speed: ${speed} (${vfps}) | Limiter: ${limiter}"; } void AppConfig::UiTemplateOptions::LoadSave(IniInterface& ini) diff --git a/pcsx2/gui/AppConfig.h b/pcsx2/gui/AppConfig.h index 1184ee27ea..ba7fc1875c 100644 --- a/pcsx2/gui/AppConfig.h +++ b/pcsx2/gui/AppConfig.h @@ -18,7 +18,7 @@ #include "AppForwardDefs.h" #include "Config.h" #include "PathDefs.h" -#include "CDVD/CDVDaccess.h" +#include "CDVD/CDVDcommon.h" #include "common/General.h" #include "common/Path.h" @@ -34,7 +34,7 @@ enum DocsModeType // friendly to modern computing security requirements; as it isolates all file modification // to a zone of the hard drive that has granted write permissions to the user. DocsFolder_User, - + // uses a custom location for program data. Typically the custom folder is either the // absolute or relative location of the program -- absolute is preferred because it is // considered more secure by MSW standards, due to DLL search rules. @@ -57,7 +57,7 @@ namespace PathDefs extern wxDirName GetDocuments( DocsModeType mode ); } -extern DocsModeType DocsFolderMode; // +extern DocsModeType DocsFolderMode; // extern bool UseDefaultSettingsFolder; // when TRUE, pcsx2 derives the settings folder from the DocsFolderMode extern wxDirName CustomDocumentsFolder; // allows the specification of a custom home folder for PCSX2 documents files. @@ -91,7 +91,7 @@ extern InstallationModeType InstallationMode; extern const wxChar* CDVD_SourceLabels[]; // ===================================================================================================== -// Pcsx2 Application Configuration. +// Pcsx2 Application Configuration. // ===================================================================================================== class AppConfig @@ -286,7 +286,7 @@ public: InputRecordingOptions inputRecording; UiTemplateOptions Templates; CaptureOptions AudioCapture; - + // PCSX2-core emulation options, which are passed to the emu core prior to initiating // an emulation session. Note these are the options saved into the GUI ini file and // which are shown as options in the gui preferences, but *not* necessarily the options @@ -301,12 +301,12 @@ public: static int GetMaxPresetIndex(); static bool isOkGetPresetTextAndColor(int n, wxString& label, wxColor& c); - + bool IsOkApplyPreset(int n, bool ignoreMTVU); //The next 2 flags are used with ApplyConfigToGui which the presets system use: - + //Indicates that the scope is only for preset-related items. static const int APPLY_FLAG_FROM_PRESET = 0x01; diff --git a/pcsx2/gui/AppCoreThread.cpp b/pcsx2/gui/AppCoreThread.cpp index ebe47b989b..8b9e81b331 100644 --- a/pcsx2/gui/AppCoreThread.cpp +++ b/pcsx2/gui/AppCoreThread.cpp @@ -43,7 +43,6 @@ alignas(16) SysMtgsThread mtgsThread; alignas(16) AppCoreThread CoreThread; static std::vector s_widescreen_cheats_data; -static bool s_widescreen_cheats_loaded = false; typedef void (AppCoreThread::*FnPtr_CoreThreadMethod)(); @@ -112,8 +111,8 @@ static void PostCoreStatus(CoreThreadStatus pevt) // -------------------------------------------------------------------------------------- AppCoreThread::AppCoreThread() : SysCoreThread() + , m_resetCdvd(false) { - m_resetCdvd = false; } AppCoreThread::~AppCoreThread() @@ -236,12 +235,8 @@ void Pcsx2App::SysApplySettings() void AppCoreThread::OnResumeReady() { - if (!g_InputRecordingControls.IsFrameAdvancing()) - { - wxGetApp().SysApplySettings(); - wxGetApp().PostMethod(AppSaveSettings); - } - + wxGetApp().SysApplySettings(); + wxGetApp().PostMethod(AppSaveSettings); sApp.PostAppMethod(&Pcsx2App::leaveDebugMode); _parent::OnResumeReady(); } @@ -290,15 +285,14 @@ const IConsoleWriter* PatchesCon = &Console; static void SetupPatchesCon(bool verbose) { - bool devel = false; #ifdef PCSX2_DEVBUILD - devel = true; -#endif - - if (verbose || DevConWriterEnabled || devel) + PatchesCon = &Console; +#else + if (verbose || DevConWriterEnabled) PatchesCon = &Console; else PatchesCon = &ConsoleWriter_Null; +#endif } // fixup = src + command line overrides + game overrides (according to elfCRC). @@ -438,12 +432,9 @@ static void _ApplySettings(const Pcsx2Config& src, Pcsx2Config& fixup) else { // No ws cheat files found at the cheats_ws folder, try the ws cheats zip file. - if (!s_widescreen_cheats_loaded) - { - std::optional> data = Host::ReadResourceFile("cheats_ws.zip"); - if (data.has_value()) - s_widescreen_cheats_data = std::move(data.value()); - } + std::optional> data = Host::ReadResourceFile("cheats_ws.zip"); + if (data.has_value()) + s_widescreen_cheats_data = std::move(data.value()); if (!s_widescreen_cheats_data.empty()) { @@ -573,7 +564,7 @@ void AppCoreThread::GameStartingInThread() m_ExecMode = ExecMode_Paused; OnResumeReady(); _reset_stuff_as_needed(); - ClearMcdEjectTimeoutNow(); // probably safe to do this when a game boots, eliminates annoying prompts + AutoEject::ClearAll(); // probably safe to do this when a game boots, eliminates annoying prompts m_ExecMode = ExecMode_Opened; _parent::GameStartingInThread(); diff --git a/pcsx2/gui/AppEventSources.cpp b/pcsx2/gui/AppEventSources.cpp index ab0cc0b5fd..c1195e7084 100644 --- a/pcsx2/gui/AppEventSources.cpp +++ b/pcsx2/gui/AppEventSources.cpp @@ -48,7 +48,7 @@ void IEventListener_CoreThread::DispatchEvent( const CoreThreadStatus& status ) case CoreThread_Suspended: CoreThread_OnSuspended(); break; case CoreThread_Reset: CoreThread_OnReset(); break; case CoreThread_Stopped: CoreThread_OnStopped(); break; - + jNO_DEFAULT; } } diff --git a/pcsx2/gui/AppForwardDefs.h b/pcsx2/gui/AppForwardDefs.h index 551955d193..4b93e06a5a 100644 --- a/pcsx2/gui/AppForwardDefs.h +++ b/pcsx2/gui/AppForwardDefs.h @@ -19,9 +19,9 @@ // // Purpose: // This header file is meant to be a dependency-free include that provides a relatively -// full compliment of forward defines for PCSX2/App and wxwidgets types. When +// full compliment of forward defines for PCSX2/App and wxwidgets types. When // forward defined in this way, these types can be used by method and class definitions -// as either pointers or handles without running into complicated header file +// as either pointers or handles without running into complicated header file // inter-dependence. // diff --git a/pcsx2/gui/AppHost.cpp b/pcsx2/gui/AppHost.cpp index 294356e6c1..467a56a6dc 100644 --- a/pcsx2/gui/AppHost.cpp +++ b/pcsx2/gui/AppHost.cpp @@ -84,6 +84,16 @@ std::optional Host::ReadResourceFileToString(const char* filename) return ret; } +std::optional Host::GetResourceFileTimestamp(const char* filename) +{ + const std::string path(Path::Combine(EmuFolders::Resources, filename)); + FILESYSTEM_STAT_DATA sd; + if (!FileSystem::StatFile(filename, &sd)) + return std::nullopt; + + return sd.ModificationTime; +} + bool Host::GetBoolSettingValue(const char* section, const char* key, bool default_value /* = false */) { return default_value; @@ -102,55 +112,60 @@ void Host::ReportErrorAsync(const std::string_view& title, const std::string_vie MsgButtons().OK())); } -static std::unique_ptr s_host_display; +bool Host::ConfirmMessage(const std::string_view& title, const std::string_view& message) +{ + return true; +} -HostDisplay* Host::AcquireHostDisplay(HostDisplay::RenderAPI api) +bool Host::AcquireHostDisplay(RenderAPI api, bool clear_state_on_fail) { sApp.OpenGsPanel(); // can't go anywhere if we don't have a window to render into! if (g_gs_window_info.type == WindowInfo::Type::Surfaceless) - return nullptr; + return false; - s_host_display = HostDisplay::CreateDisplayForAPI(api); - if (!s_host_display) - return nullptr; + g_host_display = HostDisplay::CreateForAPI(api); + if (!g_host_display) + return false; - if (!s_host_display->CreateRenderDevice(g_gs_window_info, GSConfig.Adapter, EmuConfig.GetEffectiveVsyncMode(), - GSConfig.ThreadedPresentation, GSConfig.UseDebugDevice) || - !s_host_display->InitializeRenderDevice(EmuFolders::Cache, GSConfig.UseDebugDevice) || - !ImGuiManager::Initialize()) + if (!g_host_display->CreateDevice(g_gs_window_info) || !g_host_display->SetupDevice() || !ImGuiManager::Initialize()) { - s_host_display.reset(); - return nullptr; + g_host_display.reset(); + return false; } - Console.WriteLn(Color_StrongGreen, "%s Graphics Driver Info:", HostDisplay::RenderAPIToString(s_host_display->GetRenderAPI())); - Console.Indent().WriteLn(s_host_display->GetDriverInfo()); + Console.WriteLn(Color_StrongGreen, "%s Graphics Driver Info:", HostDisplay::RenderAPIToString(g_host_display->GetRenderAPI())); + Console.Indent().WriteLn(g_host_display->GetDriverInfo()); - return s_host_display.get(); + return true; } -void Host::ReleaseHostDisplay() +void Host::ReleaseHostDisplay(bool clear_state_on_fail) { - ImGuiManager::Shutdown(); + ImGuiManager::Shutdown(clear_state_on_fail); - if (s_host_display) - s_host_display.reset(); + if (g_host_display) + g_host_display.reset(); sApp.CloseGsPanel(); } -HostDisplay* Host::GetHostDisplay() +VsyncMode Host::GetEffectiveVSyncMode() { - return s_host_display.get(); + // Force vsync off when not running at 100% speed. + if (EmuConfig.GS.LimitScalar != 1.0f) + return VsyncMode::Off; + + // Otherwise use the config setting. + return EmuConfig.GS.VsyncEnable; } bool Host::BeginPresentFrame(bool frame_skip) { CheckForGSWindowResize(); - if (!s_host_display->BeginPresent(frame_skip)) + if (!g_host_display->BeginPresent(frame_skip)) { // if we're skipping a frame, we need to reset imgui's state, since // we won't be calling EndPresentFrame(). @@ -164,7 +179,7 @@ bool Host::BeginPresentFrame(bool frame_skip) void Host::EndPresentFrame() { ImGuiManager::RenderOSD(); - s_host_display->EndPresent(); + g_host_display->EndPresent(); ImGuiManager::NewFrame(); } @@ -209,11 +224,11 @@ void Host::CheckForGSWindowResize() s_gs_window_resized.store(false); } - if (!s_host_display) + if (!g_host_display) return; GSResetAPIState(); - s_host_display->ResizeRenderWindow(width, height, scale); + g_host_display->ResizeWindow(width, height, scale); GSRestoreAPIState(); ImGuiManager::WindowResized(); } diff --git a/pcsx2/gui/AppInit.cpp b/pcsx2/gui/AppInit.cpp index 913954ab8b..0fba4c8f97 100644 --- a/pcsx2/gui/AppInit.cpp +++ b/pcsx2/gui/AppInit.cpp @@ -49,6 +49,17 @@ using namespace pxSizerFlags; +static void HookSignals() +{ +#ifdef __linux__ + // Ignore SIGCHLD by default on Linux, since we kick off xdg-screensaver asynchronously. + struct sigaction sa_chld = {}; + sigemptyset(&sa_chld.sa_mask); + sa_chld.sa_flags = SA_SIGINFO | SA_RESTART | SA_NOCLDSTOP | SA_NOCLDWAIT; + sigaction(SIGCHLD, &sa_chld, nullptr); +#endif +} + void Pcsx2App::DetectCpuAndUserMode() { AffinityAssert_AllowFrom_MainUI(); @@ -62,7 +73,7 @@ void Pcsx2App::DetectCpuAndUserMode() { // This code will probably never run if the binary was correctly compiled for SSE4 // SSE4 is required for any decent speed and is supported by more than decade old x86 CPUs - throw Exception::HardwareDeficiency() + throw Exception::RuntimeError() .SetDiagMsg("Critical Failure: SSE4.1 Extensions not available.") .SetUserMsg("SSE4 extensions are not available. PCSX2 requires a cpu that supports the SSE4.1 instruction set."); } @@ -93,11 +104,6 @@ void Pcsx2App::OpenMainFrame() DisassemblyDialog* disassembly = new DisassemblyDialog(mainFrame); m_id_Disassembler = disassembly->GetId(); - NewRecordingFrame* newRecordingFrame = new NewRecordingFrame(mainFrame); - m_id_NewRecordingFrame = newRecordingFrame->GetId(); - if (g_Conf->EmuOptions.EnableRecordingTools) - g_InputRecording.InitVirtualPadWindows(mainFrame); - if (g_Conf->EmuOptions.Debugger.ShowDebuggerOnStart) disassembly->Show(); @@ -135,8 +141,8 @@ void Pcsx2App::OpenProgramLog() for( int li=wxLANGUAGE_UNKNOWN+1; liLanguage)) continue; + { + if (i18n_IsLegacyLanguageId((wxLanguage)info->Language)) continue; Console.WriteLn( L"|| %-30s || %-8s ||", info->Description.c_str(), info->CanonicalName.c_str() ); } } @@ -151,7 +157,8 @@ void Pcsx2App::AllocateCoreStuffs() SysLogMachineCaps(); AppApplySettings(); - GetVmReserve().ReserveAll(); + if (!GetVmReserve().Allocate()) + pxFailRel("Failed to allocate memory."); if (!m_CpuProviders) { @@ -159,55 +166,6 @@ void Pcsx2App::AllocateCoreStuffs() // so that the thread is safely blocked from being able to start emulation. m_CpuProviders = std::make_unique(); - - if (m_CpuProviders->HadSomeFailures(g_Conf->EmuOptions.Cpu.Recompiler)) - { - // HadSomeFailures only returns 'true' if an *enabled* cpu type fails to init. If - // the user already has all interps configured, for example, then no point in - // popping up this dialog. - - wxDialogWithHelpers exconf(NULL, _("PCSX2 Recompiler Error(s)")); - - wxTextCtrl* scrollableTextArea = new wxTextCtrl( - &exconf, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, - wxTE_READONLY | wxTE_MULTILINE | wxTE_WORDWRAP); - - exconf += 12; - exconf += exconf.Heading(pxE(L"Warning: Some of the configured PS2 recompilers failed to initialize and have been disabled:")); - - exconf += 6; - exconf += scrollableTextArea | pxExpand.Border(wxALL, 16); - - Pcsx2Config::RecompilerOptions& recOps = g_Conf->EmuOptions.Cpu.Recompiler; - - if (BaseException* ex = m_CpuProviders->GetException_EE()) - { - scrollableTextArea->AppendText(StringUtil::UTF8StringToWxString("* R5900 (EE)\n\t" + ex->FormatDisplayMessage() + "\n\n")); - recOps.EnableEE = false; - } - - if (BaseException* ex = m_CpuProviders->GetException_IOP()) - { - scrollableTextArea->AppendText(StringUtil::UTF8StringToWxString("* R3000A (IOP)\n\t" + ex->FormatDisplayMessage() + "\n\n")); - recOps.EnableIOP = false; - } - - if (BaseException* ex = m_CpuProviders->GetException_MicroVU0()) - { - scrollableTextArea->AppendText(StringUtil::UTF8StringToWxString("* microVU0\n\t" + ex->FormatDisplayMessage() + "\n\n")); - recOps.EnableVU0 = false; - } - - if (BaseException* ex = m_CpuProviders->GetException_MicroVU1()) - { - scrollableTextArea->AppendText(StringUtil::UTF8StringToWxString("* microVU1\n\t" + ex->FormatDisplayMessage() + "\n\n")); - recOps.EnableVU1 = false; - } - - exconf += exconf.Heading(pxE(L"Note: Recompilers are not necessary for PCSX2 to run, however they typically improve emulation speed substantially. You may have to manually re-enable the recompilers listed above, if you resolve the errors.")); - - pxIssueConfirmation(exconf, MsgButtons().OK()); - } } } @@ -383,6 +341,7 @@ typedef void (wxEvtHandler::*pxStuckThreadEventHandler)(pxMessageBoxEvent&); bool Pcsx2App::OnInit() { + HookSignals(); EnableAllLogging(); Console.WriteLn("Interface is initializing. Entering Pcsx2App::OnInit!"); @@ -504,12 +463,6 @@ bool Pcsx2App::OnInit() CleanupOnExit(); return false; } - catch (Exception::HardwareDeficiency& ex) - { - Msgbox::Alert(StringUtil::UTF8StringToWxString(ex.FormatDisplayMessage()) + L"\n\n" + AddAppName(_("Press OK to close %s.")), _("PCSX2 Error: Hardware Deficiency.")); - CleanupOnExit(); - return false; - } // ---------------------------------------------------------------------------- // Failures on the core initialization procedure (typically OutOfMemory errors) are bad, // since it means the emulator is completely non-functional. Let's pop up an error and @@ -677,6 +630,10 @@ protected: Pcsx2App::Pcsx2App() : SysExecutorThread(new SysEvtHandler()) + , m_id_MainFrame(wxID_ANY) + , m_id_GsFrame(wxID_ANY) + , m_id_ProgramLogBox(wxID_ANY) + , m_id_Disassembler(wxID_ANY) { // Warning: Do not delete this comment block! Gettext will parse it to allow // the translation of some wxWidget internal strings. -- greg @@ -717,10 +674,6 @@ Pcsx2App::Pcsx2App() m_UseGUI = true; m_NoGuiExitPrompt = true; - m_id_MainFrame = wxID_ANY; - m_id_GsFrame = wxID_ANY; - m_id_ProgramLogBox = wxID_ANY; - m_id_Disassembler = wxID_ANY; m_ptr_ProgramLog = NULL; SetAppName(L"PCSX2"); diff --git a/pcsx2/gui/AppMain.cpp b/pcsx2/gui/AppMain.cpp index addc28dac6..b849c709d2 100644 --- a/pcsx2/gui/AppMain.cpp +++ b/pcsx2/gui/AppMain.cpp @@ -98,6 +98,43 @@ void Pcsx2App::PostMenuAction( MenuIdentifiers menu_id ) const mainFrame->GetEventHandler()->AddPendingEvent( joe ); } +#ifdef _WIN32 + +// -------------------------------------------------------------------------------------- +// Exception::WinApiError (implementations) +// -------------------------------------------------------------------------------------- +Exception::WinApiError::WinApiError() +{ + ErrorId = GetLastError(); + m_message_diag = "Unspecified Windows API error."; +} + +std::string Exception::WinApiError::GetMsgFromWindows() const +{ + if (!ErrorId) + return "No valid error number was assigned to this exception!"; + + const DWORD BUF_LEN = 2048; + wchar_t t_Msg[BUF_LEN]; + if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, 0, ErrorId, 0, t_Msg, BUF_LEN, 0)) + return fmt::format("Win32 Error #{}: {}", ErrorId, StringUtil::WideStringToUTF8String(t_Msg)); + + return fmt::format("Win32 Error #{} (no text msg available)", ErrorId); +} + +std::string Exception::WinApiError::FormatDisplayMessage() const +{ + return m_message_user + "\n\n" + GetMsgFromWindows(); +} + +std::string Exception::WinApiError::FormatDiagnosticMessage() const +{ + return m_message_diag + "\n\t" + GetMsgFromWindows(); +} + +#endif + + // -------------------------------------------------------------------------------------- // Pcsx2AppMethodEvent // -------------------------------------------------------------------------------------- @@ -128,18 +165,18 @@ public: { m_Method = method; } - + Pcsx2AppMethodEvent( const Pcsx2AppMethodEvent& src ) : pxActionEvent( src ) { m_Method = src.m_Method; } - + void SetMethod( FnPtr_Pcsx2App method ) { m_Method = method; } - + protected: void InvokeEvent() { @@ -359,7 +396,7 @@ wxAppTraits* Pcsx2App::CreateTraits() // ---------------------------------------------------------------------------- // LogicalVsync - Event received from the AppCoreThread (EEcore) for each vsync, -// roughly 50/60 times a second when frame limiting is enabled, and up to 10,000 +// roughly 50/60 times a second when frame limiting is enabled, and up to 10,000 // times a second if not (ok, not quite, but you get the idea... I hope.) void Pcsx2App::LogicalVsync() { @@ -374,7 +411,7 @@ void Pcsx2App::LogicalVsync() { if( ev->key == 0 ) break; - // in the past, in the plugin api, all plugins would have a first chance at treating the + // in the past, in the plugin api, all plugins would have a first chance at treating the // input here, with the ui eventually dealing with it otherwise. Obviously this solution // sucked and we had multiple components battling for input processing. I managed to make // most of them go away during the plugin merge but GS still needs to process the inputs, @@ -413,23 +450,6 @@ void Pcsx2App::HandleEvent(wxEvtHandler* handler, wxEventFunction func, wxEvent& { try { - if (g_Conf->EmuOptions.EnableRecordingTools) - { - if (g_InputRecordingControls.IsPaused()) - { - // When the GSFrame CoreThread is paused, so is the logical VSync - // Meaning that we have to grab the user-input through here to potentially - // resume emulation. - if (const HostKeyEvent* ev = PADkeyEvent() ) - { - if( ev->key != 0 ) - { - PadKeyDispatch( *ev ); - } - } - } - g_InputRecordingControls.ResumeCoreThreadIfStarted(); - } (handler->*func)(event); } // ---------------------------------------------------------------------------- @@ -444,9 +464,6 @@ void Pcsx2App::HandleEvent(wxEvtHandler* handler, wxEventFunction func, wxEvent& // Saved state load failed prior to the system getting corrupted (ie, file not found // or some zipfile error) -- so log it and resume emulation. Console.Warning( ex.FormatDiagnosticMessage() ); - if (g_InputRecording.IsInitialLoad()) - g_InputRecording.FailedSavestate(); - CoreThread.Resume(); } // ---------------------------------------------------------------------------- @@ -456,17 +473,17 @@ void Pcsx2App::HandleEvent(wxEvtHandler* handler, wxEventFunction func, wxEvent& // [TODO] Bind a listener to the CoreThread status, and automatically close the dialog // if the thread starts responding while we're waiting (not hard in fact, but I'm getting // a little tired, so maybe later!) --air - + Console.Warning( ex.FormatDiagnosticMessage() ); wxDialogWithHelpers dialog( NULL, _("PCSX2 Unresponsive Thread"), wxVERTICAL ); - + dialog += dialog.Heading( ex.FormatDisplayMessage() + L"\n\n" + pxE( L"'Ignore' to continue waiting for the thread to respond.\n'Cancel' to attempt to cancel the thread.\n'Terminate' to quit PCSX2 immediately.\n" ) ); int result = pxIssueConfirmation( dialog, MsgButtons().Ignore().Cancel().Custom( _("Terminate") ) ); - + if( result == pxID_CUSTOM ) { // fastest way to kill the process! (works in Linux and win32, thanks to windows having very @@ -565,7 +582,7 @@ void Pcsx2App::enterDebugMode() if (dlg) dlg->setDebugMode(true,false); } - + void Pcsx2App::leaveDebugMode() { DisassemblyDialog* dlg = GetDisassemblyPtr(); @@ -716,7 +733,7 @@ void Pcsx2App::OpenGsPanel() // // FIXME: GS memory leaks in DX10 have been fixed. This code may not be needed // anymore. - + const wxSize oldsize( gsFrame->GetSize() ); wxSize newsize( oldsize ); newsize.DecBy(1); @@ -731,15 +748,6 @@ void Pcsx2App::OpenGsPanel() std::optional wi = gsFrame->GetViewport()->GetWindowInfo(); pxAssertDev(wi.has_value(), "GS frame has a valid native window"); g_gs_window_info = std::move(*wi); - - // Enable New & Play after the first game load of the session - sMainFrame.enableRecordingMenuItem(MenuId_Recording_New, !g_InputRecording.IsActive()); - sMainFrame.enableRecordingMenuItem(MenuId_Recording_Play, true); - - // Enable recording menu options as the game is now running - sMainFrame.enableRecordingMenuItem(MenuId_Recording_FrameAdvance, true); - sMainFrame.enableRecordingMenuItem(MenuId_Recording_TogglePause, true); - sMainFrame.enableRecordingMenuItem(MenuId_Recording_ToggleRecordingMode, g_InputRecording.IsActive()); } @@ -779,11 +787,6 @@ void Pcsx2App::OnGsFrameDestroyed(wxWindowID id) m_id_GsFrame = wxID_ANY; g_gs_window_info = {}; - - // Disable recording controls that only make sense if the game is running - sMainFrame.enableRecordingMenuItem(MenuId_Recording_FrameAdvance, false); - sMainFrame.enableRecordingMenuItem(MenuId_Recording_TogglePause, false); - sMainFrame.enableRecordingMenuItem(MenuId_Recording_ToggleRecordingMode, false); } void Pcsx2App::OnProgramLogClosed( wxWindowID id ) @@ -797,11 +800,6 @@ void Pcsx2App::OnProgramLogClosed( wxWindowID id ) void Pcsx2App::OnMainFrameClosed( wxWindowID id ) { - if (g_InputRecording.IsActive()) - { - g_InputRecording.Stop(); - } - // Nothing threaded depends on the mainframe (yet) -- it all passes through the main wxApp // message handler. But that might change in the future. if( m_id_MainFrame != id ) return; @@ -832,7 +830,7 @@ public: { return _("Executing PS2 Virtual Machine..."); } - + SysExecEvent_Execute() : m_UseCDVDsrc(false) , m_UseELFOverride(false) @@ -896,10 +894,6 @@ void Pcsx2App::SysExecute( CDVD_SourceType cdvdsrc, const wxString& elf_override return; SysExecutorThread.PostEvent( new SysExecEvent_Execute(cdvdsrc, elf_override) ); - if (g_Conf->EmuOptions.EnableRecordingTools) - { - g_InputRecording.RecordingReset(); - } } // Returns true if there is a "valid" virtual machine state from the user's perspective. This diff --git a/pcsx2/gui/AppRes.cpp b/pcsx2/gui/AppRes.cpp index 657b17b34b..abe10df6cf 100644 --- a/pcsx2/gui/AppRes.cpp +++ b/pcsx2/gui/AppRes.cpp @@ -39,8 +39,8 @@ #include "gui/Resources/AppIcon64.h" RecentIsoList::RecentIsoList(int firstIdForMenuItems_or_wxID_ANY) + : Menu(std::unique_ptr(new wxMenu())) { - Menu = std::unique_ptr(new wxMenu()); Menu->Append(MenuId_IsoBrowse, _("Browse..."), _("Browse for an ISO that is not in your recent history.")); Menu->AppendSeparator(); Menu->AppendCheckItem(MenuId_Ask_On_Booting, _("Always ask when booting"), _("Manually select an ISO upon boot ignoring the selection from recent ISO list.")); diff --git a/pcsx2/gui/AppUserMode.cpp b/pcsx2/gui/AppUserMode.cpp index cf582e2ccb..5084df229e 100644 --- a/pcsx2/gui/AppUserMode.cpp +++ b/pcsx2/gui/AppUserMode.cpp @@ -59,7 +59,7 @@ bool Pcsx2App::TestUserPermissionsRights( const wxDirName& testFolder, wxString& // If any of the folders are not writable, then the user should be informed asap via // friendly and courteous dialog box! - const wxDirName PermissionFolders[] = + const wxDirName PermissionFolders[] = { PathDefs::Base::Settings(), PathDefs::Base::MemoryCards(), @@ -89,7 +89,7 @@ bool Pcsx2App::TestUserPermissionsRights( const wxDirName& testFolder, wxString& { accessFailedStr = (wxString)_("The following folders exist, but are not writable:") + L"\n" + accessme; } - + if (!createme.IsEmpty()) { createFailedStr = (wxString)_("The following folders are missing and cannot be created:") + L"\n" + createme; @@ -131,7 +131,7 @@ wxConfigBase* Pcsx2App::TestForPortableInstall() { wxString accessFailedStr, createFailedStr; if (TestUserPermissionsRights( portableDocsFolder, createFailedStr, accessFailedStr )) break; - + wxDialogWithHelpers dialog( NULL, AddAppName(_("Portable mode error - %s")) ); wxTextCtrl* scrollText = new wxTextCtrl( @@ -149,13 +149,13 @@ wxConfigBase* Pcsx2App::TestForPortableInstall() dialog += scrollText | pxExpand.Border(wxALL, 16); dialog += 6; dialog += dialog.Text( GetMsg_PortableModeRights() ); - + // [TODO] : Add url for platform-relevant user permissions tutorials? (low priority) wxWindowID result = pxIssueConfirmation( dialog, MsgButtons().Retry().Cancel().Custom(_("Switch to User Documents Mode"), "switchmode") ); - + switch (result) { case wxID_CANCEL: @@ -164,33 +164,33 @@ wxConfigBase* Pcsx2App::TestForPortableInstall() case wxID_RETRY: // do nothing (continues while loop) break; - + case pxID_CUSTOM: wxDialogWithHelpers dialog2( NULL, AddAppName(_("%s is switching to local install mode.")) ); dialog2 += dialog2.Heading( _("Try to remove the file called \"portable.ini\" from your installation directory manually." ) ); dialog2 += 6; pxIssueConfirmation( dialog2, MsgButtons().OK() ); - + return NULL; } } - + // Success -- all user-based folders have write access. PCSX2 should be able to run error-free! - // Force-set the custom documents mode, and set the + // Force-set the custom documents mode, and set the InstallationMode = InstallMode_Portable; DocsFolderMode = DocsFolder_Custom; CustomDocumentsFolder = portableDocsFolder; return conf_portable.release(); } - + return NULL; } // Reset RunWizard so the FTWizard is run again on next PCSX2 start. void Pcsx2App::WipeUserModeSettings() -{ +{ if (InstallationMode == InstallMode_Portable) { // Remove the portable.ini entry "RunWizard" conforming to this instance of PCSX2. @@ -198,7 +198,7 @@ void Pcsx2App::WipeUserModeSettings() std::unique_ptr conf_portable( OpenFileConfig( portableIniFile.GetFullPath() ) ); conf_portable->DeleteEntry(L"RunWizard"); } - else + else { // Remove the registry entry "RunWizard" conforming to this instance of PCSX2. std::unique_ptr conf_install( OpenInstallSettingsFile() ); diff --git a/pcsx2/gui/ApplyState.h b/pcsx2/gui/ApplyState.h index bd7c72bf12..ea8bb7e286 100644 --- a/pcsx2/gui/ApplyState.h +++ b/pcsx2/gui/ApplyState.h @@ -43,7 +43,7 @@ namespace Exception protected: BaseApplicableConfigPanel* m_Panel; - + protected: CannotApplySettings() { IsVerbose = true; } @@ -237,7 +237,7 @@ public: ); virtual ~ApplicableWizardPage() { m_ApplyState.DoCleanup(); } - + virtual bool PrepForApply(); }; diff --git a/pcsx2/gui/ConsoleLogger.cpp b/pcsx2/gui/ConsoleLogger.cpp index 943f82c9b0..93ad6050d0 100644 --- a/pcsx2/gui/ConsoleLogger.cpp +++ b/pcsx2/gui/ConsoleLogger.cpp @@ -387,13 +387,13 @@ ConsoleLogFrame::ConsoleLogFrame( MainEmuFrame *parent, const wxString& title, A , m_timer_FlushUnlocker( this ) , m_ColorTable( options.FontSize ) + , m_pendingFlushMsg(false) + , m_WaitingThreadsForFlush(0) , m_QueueColorSection( "ConsoleLog::QueueColorSection" ) , m_QueueBuffer( "ConsoleLog::QueueBuffer" ) , m_threadlogger( EnableThreadedLoggingTest ? new ConsoleTestThread() : NULL ) { m_CurQueuePos = 0; - m_WaitingThreadsForFlush = 0; - m_pendingFlushMsg = false; m_FlushRefreshLocked = false; // create Log menu (contains most options) @@ -463,7 +463,7 @@ ConsoleLogFrame::ConsoleLogFrame( MainEmuFrame *parent, const wxString& title, A menuSources.Append( MenuId_LogSource_Devel, _("Dev/&Verbose"), _("Shows PCSX2 developer logs."), wxITEM_CHECK ); menuSources.Append( MenuId_LogSource_CDVD_Info, _("&CDVD reads"), _("Shows disk read activity."), wxITEM_CHECK ); - + menuSources.AppendSeparator(); uint srcnt = std::size(ConLogSources); diff --git a/pcsx2/gui/ConsoleLogger.h b/pcsx2/gui/ConsoleLogger.h index 17df62b86c..02a0cfa008 100644 --- a/pcsx2/gui/ConsoleLogger.h +++ b/pcsx2/gui/ConsoleLogger.h @@ -115,7 +115,7 @@ protected: { return m_table[(int)coloridx]; } - + void SetColorScheme_Dark(); void SetColorScheme_Light(); }; diff --git a/pcsx2/gui/Debugger/BreakpointWindow.cpp b/pcsx2/gui/Debugger/BreakpointWindow.cpp index a17c5adaaa..729643ce71 100644 --- a/pcsx2/gui/Debugger/BreakpointWindow.cpp +++ b/pcsx2/gui/Debugger/BreakpointWindow.cpp @@ -31,7 +31,7 @@ BreakpointWindow::BreakpointWindow( wxWindow* parent, DebugInterface* _cpu ) wxBoxSizer* upperPart = new wxBoxSizer(wxHORIZONTAL); wxFlexGridSizer* leftSizer = new wxFlexGridSizer(2,2,7,7); - + // address wxStaticText* addressText = new wxStaticText(this,wxID_ANY,L"Address"); editAddress = new wxTextCtrl(this,wxID_ANY,L""); @@ -151,10 +151,10 @@ void BreakpointWindow::setDefaultValues() swprintf(str,64,L"0x%08X",address); editAddress->SetValue(str); } - + swprintf(str,64,L"0x%08X",size); editSize->SetValue(str); - editCondition->SetValue(wxString(condition,wxConvUTF8)); + editCondition->SetValue(wxString(condition,wxConvUTF8)); } void BreakpointWindow::loadFromMemcheck(MemCheck& memcheck) @@ -221,7 +221,7 @@ void BreakpointWindow::initBreakpoint(u32 _address) void BreakpointWindow::onRadioChange(wxCommandEvent& evt) { memory = radioMemory->GetValue(); - + checkRead->Enable(memory); checkWrite->Enable(memory); checkOnChange->Enable(memory); diff --git a/pcsx2/gui/Debugger/BreakpointWindow.h b/pcsx2/gui/Debugger/BreakpointWindow.h index 3c12270cbc..482fc2f828 100644 --- a/pcsx2/gui/Debugger/BreakpointWindow.h +++ b/pcsx2/gui/Debugger/BreakpointWindow.h @@ -36,7 +36,7 @@ private: bool fetchDialogData(); DebugInterface* cpu; - + wxTextCtrl* editAddress; wxTextCtrl* editSize; wxRadioButton* radioMemory; diff --git a/pcsx2/gui/Debugger/CtrlDisassemblyView.h b/pcsx2/gui/Debugger/CtrlDisassemblyView.h index e322be2b39..97b9e34d3c 100644 --- a/pcsx2/gui/Debugger/CtrlDisassemblyView.h +++ b/pcsx2/gui/Debugger/CtrlDisassemblyView.h @@ -38,7 +38,7 @@ public: void clearFunctions() { manager.clear(); }; void redraw(); void getOpcodeText(u32 address, char* dest); - + u32 getInstructionSizeAt(u32 address) { u32 start = manager.getStartAddress(address); diff --git a/pcsx2/gui/Debugger/CtrlMemSearch.cpp b/pcsx2/gui/Debugger/CtrlMemSearch.cpp index ccee3ab1de..8937c1f153 100644 --- a/pcsx2/gui/Debugger/CtrlMemSearch.cpp +++ b/pcsx2/gui/Debugger/CtrlMemSearch.cpp @@ -277,7 +277,7 @@ void CtrlMemSearch::Search(wxCommandEvent& evt) else { // We're searching for either a BYTE, WORD, DWORD or QWORD - + const auto res = StringUtil::FromChars(txtSearch->GetValue().ToStdString()); if(!res.has_value()) { @@ -300,7 +300,7 @@ void CtrlMemSearch::onSearchFinished(wxCommandEvent& evt) m_searchResultsMutex.lock(); lblSearchHits->SetLabelText(wxString::Format(L"Hits: %zu", m_searchResults.size())); - + // Enable the buttons only if we have results // -1 indicates we haven't jumped to a result yet m_searchIter = -1; diff --git a/pcsx2/gui/Debugger/CtrlMemSearch.h b/pcsx2/gui/Debugger/CtrlMemSearch.h index 95292f94a4..7411ac73d4 100644 --- a/pcsx2/gui/Debugger/CtrlMemSearch.h +++ b/pcsx2/gui/Debugger/CtrlMemSearch.h @@ -87,7 +87,7 @@ private: void Search(wxCommandEvent& evt); const u8 SEARCHTYPEBITS[8] = {8,16,32,64,32,64,0}; - + DebugInterface* cpu; wxFont font, underlineFont; wxTextCtrl* txtSearch; diff --git a/pcsx2/gui/Debugger/CtrlMemView.h b/pcsx2/gui/Debugger/CtrlMemView.h index 6982c88f33..775b7a12a3 100644 --- a/pcsx2/gui/Debugger/CtrlMemView.h +++ b/pcsx2/gui/Debugger/CtrlMemView.h @@ -23,7 +23,7 @@ class CtrlMemView: public wxWindow { public: CtrlMemView(wxWindow* parent, DebugInterface* _cpu); - + void paintEvent(wxPaintEvent & evt); void mouseEvent(wxMouseEvent& evt); void keydownEvent(wxKeyEvent& evt); diff --git a/pcsx2/gui/Debugger/DisassemblyDialog.cpp b/pcsx2/gui/Debugger/DisassemblyDialog.cpp index bcf98f0849..b45065263d 100644 --- a/pcsx2/gui/Debugger/DisassemblyDialog.cpp +++ b/pcsx2/gui/Debugger/DisassemblyDialog.cpp @@ -330,7 +330,7 @@ void DisassemblyDialog::onBreakRunClicked(wxCommandEvent& evt) CBreakPoints::SetSkipFirst(BREAKPOINT_IOP, r3000Debug.getPC()); r5900Debug.resumeCpu(); } - else + else { r5900Debug.pauseCpu(); gotoPc(); @@ -401,13 +401,13 @@ void DisassemblyDialog::stepOver() breakpointAddress += 4; } else // j, ... - { + { // in case of absolute branches, set the breakpoint at the branch target breakpointAddress = info.branchTarget; } } else // beq, ... - { + { if (info.conditionMet) { breakpointAddress = info.branchTarget; @@ -419,7 +419,7 @@ void DisassemblyDialog::stepOver() } } } - else + else { disassembly->scrollStepping(breakpointAddress); } @@ -449,7 +449,7 @@ void DisassemblyDialog::stepInto() { breakpointAddress = info.branchTarget; } - else + else { if (info.conditionMet) { @@ -523,7 +523,7 @@ void DisassemblyDialog::onDebuggerEvent(wxCommandEvent& evt) if (!executeExpressionWindow(this, cpu, addr)) return; - if (currentCpu != NULL) + if (currentCpu != NULL) { // GetInt() is 0 when called by the disassembly view, 1 when called by the memory view if (!evt.GetInt()) @@ -615,7 +615,7 @@ void DisassemblyDialog::update() breakpointButton->Enable(true); currentCpu->update(); } - else + else { stepOverButton->Enable(false); breakpointButton->Enable(false); @@ -695,7 +695,7 @@ void DisassemblyDialog::setDebugMode(bool debugMode, bool switchPC) if (currentCpu != NULL) currentCpu->loadCycles(); } - else + else { breakRunButton->SetLabel(L"Break"); diff --git a/pcsx2/gui/Debugger/DisassemblyDialog.h b/pcsx2/gui/Debugger/DisassemblyDialog.h index 2ed63bd284..136103d979 100644 --- a/pcsx2/gui/Debugger/DisassemblyDialog.h +++ b/pcsx2/gui/Debugger/DisassemblyDialog.h @@ -89,7 +89,7 @@ public: static wxString GetNameStatic() { return L"DisassemblyDialog"; } wxString GetDialogName() const { return GetNameStatic(); } - + void update(); void reset(); void populate(); diff --git a/pcsx2/gui/Dialogs/ConfigurationDialog.h b/pcsx2/gui/Dialogs/ConfigurationDialog.h index 6f0b641f2a..a81ac61892 100644 --- a/pcsx2/gui/Dialogs/ConfigurationDialog.h +++ b/pcsx2/gui/Dialogs/ConfigurationDialog.h @@ -39,7 +39,7 @@ namespace Dialogs class BaseConfigurationDialog : public BaseApplicableDialog { typedef BaseApplicableDialog _parent; - + protected: wxListbook* m_listbook; wxArrayString m_labels; @@ -171,7 +171,7 @@ namespace Dialogs public: virtual ~CreateMemoryCardDialog() = default; CreateMemoryCardDialog( wxWindow* parent, const wxDirName& mcdpath, const wxString& suggested_mcdfileName); - + //duplicate of MemoryCardFile::Create. Don't know why the existing method isn't used. - avih static bool CreateIt( const wxString& mcdFile, uint sizeInMB, bool isPSX ); wxString result_createdMcdFilename; @@ -197,7 +197,7 @@ namespace Dialogs public: virtual ~ConvertMemoryCardDialog() = default; ConvertMemoryCardDialog( wxWindow* parent, const wxDirName& mcdPath, MemoryCardType type, const wxString& sourceFilename ); - + protected: void CreateControls( const MemoryCardType sourceType ); void OnOk_Click( wxCommandEvent& evt ); diff --git a/pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp b/pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp index f48f986372..42a161c05e 100644 --- a/pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp +++ b/pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp @@ -245,10 +245,10 @@ void Dialogs::CreateMemoryCardDialog::CreateControls() . SetInt(64), RadioPanelItem(_("Folder [Recommended]"), _("Store memory card contents in the host filesystem instead of a file.")) - . SetToolTip(_t("Dynamically allocate and store memory card contents in a folder.\n" + . SetToolTip(_t("Dynamically allocate and store memory card contents in a folder.\n" "Only exposes the save files for the running game, rather than the whole memory card.\n" "You can see the structure and the saves with your File Explorer.\n" - "Can be used to back-up individual saves instead of all saves on a memcard.\n" + "Can be used to back-up individual saves instead of all saves on a memcard.\n" "Incompatible with PS2 memory card editing tools or savegame managers (such as MyMC, MyMCPlus).\n" "You can always convert back between folder type and single memcard file.\n")) . SetInt(0), diff --git a/pcsx2/gui/Dialogs/FirstTimeWizard.cpp b/pcsx2/gui/Dialogs/FirstTimeWizard.cpp index a9ef924c3c..7c960f522d 100644 --- a/pcsx2/gui/Dialogs/FirstTimeWizard.cpp +++ b/pcsx2/gui/Dialogs/FirstTimeWizard.cpp @@ -69,8 +69,8 @@ Panels::FirstTimeIntroPanel::FirstTimeIntroPanel( wxWindow* parent ) { SetMinWidth( MSW_GetDPIScale() * 600 ); - FastFormatUnicode configFile, faqFile; - configFile.Write(L"file:///%s/Configuration_Guide.pdf", WX_STR(PathDefs::GetDocs().ToString())); + FastFormatUnicode faqFile; + // configFile.Write(L"file:///%s/Configuration_Guide.pdf", WX_STR(PathDefs::GetDocs().ToString())); faqFile.Write(L"file:///%s/PCSX2_FAQ.pdf", WX_STR(PathDefs::GetDocs().ToString())); wxStaticBoxSizer& langSel = *new wxStaticBoxSizer( wxVERTICAL, this, _("Language selector") ); @@ -91,11 +91,11 @@ Panels::FirstTimeIntroPanel::FirstTimeIntroPanel( wxWindow* parent ) ); *this += GetCharHeight() * 2; - + /* *this += new wxHyperlinkCtrl( this, wxID_ANY, _("Configuration Guide"), configFile.c_str() ) | pxCenter.Border( wxALL, 5 ); - + */ *this += new wxHyperlinkCtrl( this, wxID_ANY, _("Readme / FAQ"), faqFile.c_str() ) | pxCenter.Border( wxALL, 5 ); diff --git a/pcsx2/gui/Dialogs/GSDumpDialog.cpp b/pcsx2/gui/Dialogs/GSDumpDialog.cpp index 06e5fd8f40..f490a58028 100644 --- a/pcsx2/gui/Dialogs/GSDumpDialog.cpp +++ b/pcsx2/gui/Dialogs/GSDumpDialog.cpp @@ -787,7 +787,7 @@ void Dialogs::GSDumpDialog::ProcessDumpEvent(const GSDumpFile::GSData& event, u8 case GSType::ReadFIFO2: { std::unique_ptr arr(new u8[*((int*)event.data) * 16]); - GetMTGS().InitAndReadFIFO(arr.get(), *((int*)event.data)); + GSInitAndReadFIFO(arr.get(), *((int*)event.data)); break; } case GSType::Registers: diff --git a/pcsx2/gui/Dialogs/LogOptionsDialog.h b/pcsx2/gui/Dialogs/LogOptionsDialog.h index e6ebe5e0b5..31171c3ee2 100644 --- a/pcsx2/gui/Dialogs/LogOptionsDialog.h +++ b/pcsx2/gui/Dialogs/LogOptionsDialog.h @@ -35,7 +35,7 @@ public: protected: void OnOk_Click( wxCommandEvent& evt ); void OnApply_Click( wxCommandEvent& evt ); - + wxString& GetConfSettingsTabName() const { static wxString bleh = L"TraceLogs"; diff --git a/pcsx2/gui/Dialogs/McdConfigDialog.cpp b/pcsx2/gui/Dialogs/McdConfigDialog.cpp index d4af0e8555..31a7e29dc7 100644 --- a/pcsx2/gui/Dialogs/McdConfigDialog.cpp +++ b/pcsx2/gui/Dialogs/McdConfigDialog.cpp @@ -60,8 +60,8 @@ Panels::McdConfigPanel_Toggles::McdConfigPanel_Toggles(wxWindow *parent) // ------------------------------ for( uint i=0; i<2; ++i ) - *this += m_check_Multitap[i]; - + *this += m_check_Multitap[i]; + // *this += 4; // *this += m_check_SavestateBackup; @@ -106,7 +106,7 @@ Dialogs::McdConfigDialog::McdConfigDialog( wxWindow* parent ) wxFlexGridSizer* s_flex=new wxFlexGridSizer(3,1, 0, 0); s_flex->AddGrowableCol(0); s_flex->AddGrowableRow(1); - + //set own sizer to s_flex (3-rows-1-col table with growable width and growable middle-row-height) // instead of the default vertical sizer which cannot expand vertically. // (vertical sizers can expand horizontally and consume the minimum vertical height possible) diff --git a/pcsx2/gui/Dialogs/SysConfigDialog.cpp b/pcsx2/gui/Dialogs/SysConfigDialog.cpp index d2101e8bbb..fed19c930f 100644 --- a/pcsx2/gui/Dialogs/SysConfigDialog.cpp +++ b/pcsx2/gui/Dialogs/SysConfigDialog.cpp @@ -29,12 +29,12 @@ using namespace pxSizerFlags; static void CheckHacksOverrides() { if( !wxGetApp().Overrides.HasCustomHacks() ) return; - + // The user has commandline overrides enabled, so the options they see here and/or apply won't match // the commandline overrides. Let them know! wxDialogWithHelpers dialog( wxFindWindowByName( L"Dialog:" + Dialogs::SysConfigDialog::GetNameStatic() ), _("Config Overrides Warning") ); - + dialog += dialog.Text( pxEt( L"Warning! You are running PCSX2 with command line options that override your configured settings. These command line options will not be reflected in the Settings dialog, and will be disabled if you apply any changes here." )); @@ -60,7 +60,7 @@ void Dialogs::SysConfigDialog::UpdateGuiForPreset ( int presetIndex, bool preset AppConfig preset = *g_Conf; preset.IsOkApplyPreset( presetIndex, false ); //apply a preset to a copy of g_Conf. preset.EnablePresets = presetsEnabled; //override IsOkApplyPreset (which always applies/enabled) to actual required state - + //update the config panels of SysConfigDialog to reflect the preset. size_t pages = m_labels.GetCount(); for( size_t i=0; i patches are visually still enabled (last preset values) and grayed out. // 4. Clicking Apply (presets still unchecked) --> patches will be enabled and not grayed out, presets are disabled. // --> If clicking Cancel instead of Apply at 4., will revert everything to the state of 1 (preset disabled, patches disabled and not grayed out). - + bool origEnable=preset.EnablePresets; preset.EnablePresets=true; // will cause preset-related items to be grayed out at the menus regardless of their value. if ( GetMainFramePtr() ) GetMainFramePtr()->ApplyConfigToGui( preset, AppConfig::APPLY_FLAG_FROM_PRESET | AppConfig::APPLY_FLAG_MANUALLY_PROPAGATE ); - + // Not really needed as 'preset' is local and dumped anyway. For the sake of future modifications of more GUI elements. - preset.EnablePresets=origEnable; - + preset.EnablePresets=origEnable; + } void Dialogs::SysConfigDialog::AddPresetsControl() @@ -131,7 +131,7 @@ void Dialogs::SysConfigDialog::AddPresetsControl() m_msg_preset->Enable(g_Conf->EnablePresets); m_msg_preset->SetForegroundColour( c ); m_msg_preset->Bold(); - + //I'm unable to do without the next 2 rows.. what am I missing? m_msg_preset->SetMinWidth(250); m_msg_preset->Unwrapped(); @@ -161,7 +161,7 @@ void Dialogs::SysConfigDialog::Presets_Toggled(wxCommandEvent &event) void Dialogs::SysConfigDialog::Preset_Scroll(wxScrollEvent &event) -{ +{ wxString pl; wxColor c; AppConfig::isOkGetPresetTextAndColor(m_slider_presets->GetValue(), pl, c); @@ -180,7 +180,7 @@ void Dialogs::SysConfigDialog::Apply() //Console.WriteLn("Applying preset to to g_Conf: Preset index: %d, EnablePresets: %s", (int)m_slider_presets->GetValue(), m_check_presets->IsChecked()?"true":"false"); g_Conf->EnablePresets = m_check_presets->IsChecked(); g_Conf->PresetIndex = m_slider_presets->GetValue(); - + if (GetMainFramePtr()) GetMainFramePtr()->CommitPreset_noTrigger(); } diff --git a/pcsx2/gui/ExecutorThread.cpp b/pcsx2/gui/ExecutorThread.cpp index 3aebda61e3..e0de364c57 100644 --- a/pcsx2/gui/ExecutorThread.cpp +++ b/pcsx2/gui/ExecutorThread.cpp @@ -40,7 +40,7 @@ ConsoleLogSource_Event::ConsoleLogSource_Event() "SysEvents", "S&ysVM Control Events", "Logs events as they are passed to the PS2 virtual machine.", }; - + m_Descriptor = &myDesc; } @@ -183,7 +183,7 @@ struct ScopedThreadCancelDisable int oldstate; pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, &oldstate ); } - + ~ScopedThreadCancelDisable() { int oldstate; @@ -195,7 +195,7 @@ struct ScopedThreadCancelDisable void pxEvtQueue::ProcessEvents( pxEvtList& list, bool isIdle ) { ScopedLock synclock( m_mtx_pending ); - + pxEvtList::iterator node; while( node = list.begin(), node != list.end() ) { @@ -275,7 +275,7 @@ void pxEvtQueue::PostEvent( SysExecEvent* evt ) } ScopedLock synclock( m_mtx_pending ); - + pxEvtLog.Write( this, evt, pxsFmt(L"Posting event! (pending=%d, idle=%d)", m_pendingEvents.size(), m_idleEvents.size()) ); m_pendingEvents.push_back( sevt.release() ); @@ -371,7 +371,7 @@ bool pxEvtQueue::Rpc_TryInvoke( FnType_Void* method, const wxChar* traceName ) return true; } - + return false; } @@ -411,7 +411,7 @@ bool ExecutorThread::IsRunning() const void ExecutorThread::ShutdownQueue() { if( !m_EvtHandler ) return; - + if( !m_EvtHandler->IsShuttingDown() ) m_EvtHandler->ShutdownQueue(); diff --git a/pcsx2/gui/FrameForGS.cpp b/pcsx2/gui/FrameForGS.cpp index 83edb0c87a..7a35c3197e 100644 --- a/pcsx2/gui/FrameForGS.cpp +++ b/pcsx2/gui/FrameForGS.cpp @@ -107,76 +107,11 @@ void GSPanel::InitDefaultAccelerators() m_Accels->Map( FULLSCREEN_TOGGLE_ACCELERATOR_GSPANEL, "FullscreenToggle" ); } -void GSPanel::InitRecordingAccelerators() -{ - // Note: these override GlobalAccels ( Pcsx2App::InitDefaultGlobalAccelerators() ) - // For plain letters or symbols, replace e.g. WXK_F1 with e.g. wxKeyCode('q') or wxKeyCode('-') - // For plain letter keys with shift, use e.g. AAC( wxKeyCode('q') ).Shift() and NOT wxKeyCode('Q') - // For a symbol with shift (e.g. '_' which is '-' with shift) use AAC( wxKeyCode('-') ).Shift() - - typedef KeyAcceleratorCode AAC; - - if (!m_Accels) m_Accels = std::unique_ptr(new AcceleratorDictionary); - - m_Accels->Map(AAC(WXK_SPACE), "FrameAdvance"); - m_Accels->Map(AAC(wxKeyCode('p')).Shift(), "TogglePause"); - m_Accels->Map(AAC(wxKeyCode('r')).Shift(), "InputRecordingModeToggle"); - m_Accels->Map(AAC(wxKeyCode('l')).Shift(), "GoToFirstFrame"); -#if defined(__unix__) - // Shift+P (80) and Shift+p (112) have two completely different codes - // On Linux the former is sometimes fired so define bindings for both - m_Accels->Map(AAC(wxKeyCode('P')).Shift(), "TogglePause"); - m_Accels->Map(AAC(wxKeyCode('R')).Shift(), "InputRecordingModeToggle"); - m_Accels->Map(AAC(wxKeyCode('L')).Shift(), "GoToFirstFrame"); -#endif - - m_Accels->Map(AAC(WXK_NUMPAD0).Shift(), "States_SaveSlot0"); - m_Accels->Map(AAC(WXK_NUMPAD1).Shift(), "States_SaveSlot1"); - m_Accels->Map(AAC(WXK_NUMPAD2).Shift(), "States_SaveSlot2"); - m_Accels->Map(AAC(WXK_NUMPAD3).Shift(), "States_SaveSlot3"); - m_Accels->Map(AAC(WXK_NUMPAD4).Shift(), "States_SaveSlot4"); - m_Accels->Map(AAC(WXK_NUMPAD5).Shift(), "States_SaveSlot5"); - m_Accels->Map(AAC(WXK_NUMPAD6).Shift(), "States_SaveSlot6"); - m_Accels->Map(AAC(WXK_NUMPAD7).Shift(), "States_SaveSlot7"); - m_Accels->Map(AAC(WXK_NUMPAD8).Shift(), "States_SaveSlot8"); - m_Accels->Map(AAC(WXK_NUMPAD9).Shift(), "States_SaveSlot9"); - m_Accels->Map(AAC(WXK_NUMPAD0), "States_LoadSlot0"); - m_Accels->Map(AAC(WXK_NUMPAD1), "States_LoadSlot1"); - m_Accels->Map(AAC(WXK_NUMPAD2), "States_LoadSlot2"); - m_Accels->Map(AAC(WXK_NUMPAD3), "States_LoadSlot3"); - m_Accels->Map(AAC(WXK_NUMPAD4), "States_LoadSlot4"); - m_Accels->Map(AAC(WXK_NUMPAD5), "States_LoadSlot5"); - m_Accels->Map(AAC(WXK_NUMPAD6), "States_LoadSlot6"); - m_Accels->Map(AAC(WXK_NUMPAD7), "States_LoadSlot7"); - m_Accels->Map(AAC(WXK_NUMPAD8), "States_LoadSlot8"); - m_Accels->Map(AAC(WXK_NUMPAD9), "States_LoadSlot9"); - - GetMainFramePtr()->initializeRecordingMenuItem( - MenuId_Recording_FrameAdvance, - GetAssociatedKeyCode("FrameAdvance")); - GetMainFramePtr()->initializeRecordingMenuItem( - MenuId_Recording_TogglePause, - GetAssociatedKeyCode("TogglePause")); - GetMainFramePtr()->initializeRecordingMenuItem( - MenuId_Recording_ToggleRecordingMode, - GetAssociatedKeyCode("InputRecordingModeToggle"), - g_InputRecording.IsActive()); - - inputRec::consoleLog("Initialized Input Recording Key Bindings"); -} - wxString GSPanel::GetAssociatedKeyCode(const char* id) { return m_Accels->findKeycodeWithCommandId(id).toTitleizedString(); } -void GSPanel::RemoveRecordingAccelerators() -{ - m_Accels.reset(new AcceleratorDictionary); - InitDefaultAccelerators(); - recordingConLog("Disabled Input Recording Key Bindings\n"); -} - GSPanel::GSPanel( wxWindow* parent ) : wxWindow() , m_HideMouseTimer( this ) @@ -192,11 +127,6 @@ GSPanel::GSPanel( wxWindow* parent ) InitDefaultAccelerators(); - if (g_Conf->EmuOptions.EnableRecordingTools) - { - InitRecordingAccelerators(); - } - SetBackgroundColour(wxColour((unsigned long)0)); if( g_Conf->GSWindow.AlwaysHideMouse ) { @@ -527,8 +457,8 @@ void GSPanel::DirectKeyCommand( wxKeyEvent& evt ) void GSPanel::UpdateScreensaver() { - bool prevent = g_Conf->GSWindow.DisableScreenSaver && m_HasFocus && m_coreRunning; - ScreensaverAllow(!prevent); + const bool prevent = g_Conf->GSWindow.DisableScreenSaver && m_HasFocus && m_coreRunning; + WindowInfo::InhibitScreensaver(g_gs_window_info, prevent); } void GSPanel::OnFocus( wxFocusEvent& evt ) @@ -899,17 +829,7 @@ void GSFrame::OnUpdateTitle( wxTimerEvent& evt ) const u64& smode2 = *(u64*)PS2GS_BASE(GS_SMODE2); wxString omodef = (smode2 & 2) ? templates.OutputFrame : templates.OutputField; wxString omodei = (smode2 & 1) ? templates.OutputInterlaced : templates.OutputProgressive; - wxString title; - wxString movieMode; - if (g_InputRecording.IsActive()) - { - title = templates.RecordingTemplate; - title.Replace(L"${frame}", pxsFmt(L"%d", g_InputRecording.GetFrameCounter())); - title.Replace(L"${maxFrame}", pxsFmt(L"%d", g_InputRecording.GetInputRecordingData().GetTotalFrames())); - title.Replace(L"${mode}", g_InputRecording.RecordingModeTitleSegment()); - } else { - title = templates.TitleTemplate; - } + wxString title = templates.TitleTemplate; std::string gsStats; GSgetTitleStats(gsStats); diff --git a/pcsx2/gui/GSFrame.h b/pcsx2/gui/GSFrame.h index ae806e3f23..0166adf7f1 100644 --- a/pcsx2/gui/GSFrame.h +++ b/pcsx2/gui/GSFrame.h @@ -53,8 +53,6 @@ public: void DirectKeyCommand( const KeyAcceleratorCode& kac ); void InitDefaultAccelerators(); wxString GetAssociatedKeyCode(const char* id); - void InitRecordingAccelerators(); - void RemoveRecordingAccelerators(); protected: void AppStatusEvent_OnSettingsApplied(); diff --git a/pcsx2/gui/GlobalCommands.cpp b/pcsx2/gui/GlobalCommands.cpp index 4dfb46586e..80b486bdaa 100644 --- a/pcsx2/gui/GlobalCommands.cpp +++ b/pcsx2/gui/GlobalCommands.cpp @@ -305,10 +305,6 @@ namespace Implementations if (g_Conf->GSWindow.CloseOnEsc) { sMainFrame.SetFocus(); - // Disable recording controls that only make sense if the game is running - sMainFrame.enableRecordingMenuItem(MenuId_Recording_FrameAdvance, false); - sMainFrame.enableRecordingMenuItem(MenuId_Recording_TogglePause, false); - sMainFrame.enableRecordingMenuItem(MenuId_Recording_ToggleRecordingMode, false); } } @@ -420,38 +416,6 @@ namespace Implementations if (GSFrame* gsframe = wxGetApp().GetGsFramePtr()) gsframe->ShowFullScreen(!gsframe->IsFullScreen()); } - void FrameAdvance() - { - if (g_Conf->EmuOptions.EnableRecordingTools) - { - g_InputRecordingControls.FrameAdvance(); - } - } - - void TogglePause() - { - if (g_Conf->EmuOptions.EnableRecordingTools) - { - g_InputRecordingControls.TogglePause(); - } - } - - void InputRecordingModeToggle() - { - if (g_Conf->EmuOptions.EnableRecordingTools) - { - g_InputRecordingControls.RecordModeToggle(); - } - } - - void GoToFirstFrame() - { - if (g_Conf->EmuOptions.EnableRecordingTools && g_InputRecording.IsActive()) - { - // Assumes that gui is active, as you can't access recording options without it - g_InputRecording.GoToFirstFrame(GetMainFramePtr()); - } - } void States_SaveSlot(int slot) { @@ -730,11 +694,6 @@ static const GlobalCommandDescriptor CommandDeclarations[] = false, }, - {"FrameAdvance", Implementations::FrameAdvance, NULL, NULL, false}, - {"TogglePause", Implementations::TogglePause, NULL, NULL, false}, - {"InputRecordingModeToggle", Implementations::InputRecordingModeToggle, NULL, NULL, false}, - {"GoToFirstFrame", Implementations::GoToFirstFrame, NULL, NULL, false}, - {"States_SaveSlot0", Implementations::States_SaveSlot0, NULL, NULL, false}, {"States_SaveSlot1", Implementations::States_SaveSlot1, NULL, NULL, false}, {"States_SaveSlot2", Implementations::States_SaveSlot2, NULL, NULL, false}, @@ -915,7 +874,7 @@ void Pcsx2App::InitDefaultGlobalAccelerators() // At this early stage of startup, the application assumes installed mode, so portable mode custom keybindings may present issues. // Relevant - https://github.com/PCSX2/pcsx2/blob/678829a5b2b8ca7a3e42d8edc9ab201bf00b0fe9/pcsx2/gui/AppInit.cpp#L479 // Compared to L990 of GlobalCommands.cpp which also does an init for the GlobalAccelerators. - // The idea was to have: Reading from the PCSX2_keys.ini in the ini folder based on PCSX2_keys.ini.default which get overridden. + // The idea was to have: Reading from the PCSX2_keys.ini in the ini folder based on PCSX2_keys.ini.default which get overridden. // We also need to make it easier to do custom hotkeys for both normal/portable PCSX2 in the GUI. GlobalAccels->Map(AAC(WXK_TAB), "Framelimiter_TurboToggle"); GlobalAccels->Map(AAC(WXK_TAB).Shift(), "Framelimiter_SlomoToggle"); diff --git a/pcsx2/gui/IniInterface.cpp b/pcsx2/gui/IniInterface.cpp index 2ed8ffaec8..ef60907567 100644 --- a/pcsx2/gui/IniInterface.cpp +++ b/pcsx2/gui/IniInterface.cpp @@ -194,15 +194,17 @@ int IniLoader::EntryBitfield(const wxString& var, int value, const int defvalue) return result; } -void IniLoader::Entry(const wxString& var, double& value, const double defvalue) +void IniLoader::Entry(const wxString& var, float& value, const float defvalue) { - auto readval = wxString::FromCDouble(value); + auto readval = wxString::FromCDouble(static_cast(value)); if (m_Config) m_Config->Read(var, &readval); - if (!readval.ToCDouble(&value)) - value = 0.0; + double dvalue; + if (!readval.ToCDouble(&dvalue)) + dvalue = 0.0; + value = static_cast(dvalue); } void IniLoader::Entry(const wxString& var, wxPoint& value, const wxPoint defvalue) @@ -380,12 +382,12 @@ int IniSaver::EntryBitfield(const wxString& var, int value, const int defvalue) return value; } -void IniSaver::Entry(const wxString& var, double& value, const double defvalue) +void IniSaver::Entry(const wxString& var, float& value, const float defvalue) { if (!m_Config) return; - m_Config->Write(var, wxString::FromCDouble(value)); + m_Config->Write(var, wxString::FromCDouble(static_cast(value))); } void IniSaver::Entry(const wxString& var, wxPoint& value, const wxPoint defvalue) diff --git a/pcsx2/gui/IniInterface.h b/pcsx2/gui/IniInterface.h index 5c43208141..f1baa45e33 100644 --- a/pcsx2/gui/IniInterface.h +++ b/pcsx2/gui/IniInterface.h @@ -59,7 +59,7 @@ public: virtual void Entry(const wxString& var, int& value, const int defvalue = 0) = 0; virtual void Entry(const wxString& var, uint& value, const uint defvalue = 0) = 0; virtual void Entry(const wxString& var, bool& value, const bool defvalue = false) = 0; - virtual void Entry(const wxString& var, double& value, const double defvalue = 0.0) = 0; + virtual void Entry(const wxString& var, float& value, const float defvalue = 0.0) = 0; virtual void Entry(const wxString& var, std::string& value, const std::string& default_value = std::string()) = 0; // This special form of Entry is provided for bitfields, which cannot be passed by reference. @@ -124,7 +124,7 @@ public: void Entry(const wxString& var, int& value, const int defvalue = 0) override; void Entry(const wxString& var, uint& value, const uint defvalue = 0) override; void Entry(const wxString& var, bool& value, const bool defvalue = false) override; - void Entry(const wxString& var, double& value, const double defvalue = 0.0) override; + void Entry(const wxString& var, float& value, const float defvalue = 0.0) override; void Entry(const wxString& var, std::string& value, const std::string& default_value = std::string()) override; bool EntryBitBool(const wxString& var, bool value, const bool defvalue = false) override; @@ -164,7 +164,7 @@ public: void Entry(const wxString& var, int& value, const int defvalue = 0) override; void Entry(const wxString& var, uint& value, const uint defvalue = 0) override; void Entry(const wxString& var, bool& value, const bool defvalue = false) override; - void Entry(const wxString& var, double& value, const double defvalue = 0.0) override; + void Entry(const wxString& var, float& value, const float defvalue = 0.0) override; void Entry(const wxString& var, std::string& value, const std::string& default_value = std::string()) override; bool EntryBitBool(const wxString& var, bool value, const bool defvalue = false) override; diff --git a/pcsx2/gui/IsoDropTarget.cpp b/pcsx2/gui/IsoDropTarget.cpp index b4a2a66baf..63c3b0b7d1 100644 --- a/pcsx2/gui/IsoDropTarget.cpp +++ b/pcsx2/gui/IsoDropTarget.cpp @@ -41,8 +41,8 @@ protected: public: DroppedTooManyFiles( const wxWindow* window ) : pxActionEvent() + , m_ownerid(window->GetId()) { - m_ownerid = window->GetId(); } virtual ~DroppedTooManyFiles() = default; @@ -70,8 +70,8 @@ protected: public: DroppedElf( const wxWindow* window ) : pxActionEvent() + , m_ownerid(window->GetId()) { - m_ownerid = window->GetId(); } virtual ~DroppedElf() = default; @@ -118,9 +118,9 @@ protected: public: DroppedIso( const wxWindow* window, const wxString& filename ) : pxActionEvent() - , m_filename( filename ) + , m_ownerid(window->GetId()) + , m_filename(filename) { - m_ownerid = window->GetId(); } virtual ~DroppedIso() = default; diff --git a/pcsx2/gui/MainFrame.cpp b/pcsx2/gui/MainFrame.cpp index 10a599e5f4..a75fa85f5c 100644 --- a/pcsx2/gui/MainFrame.cpp +++ b/pcsx2/gui/MainFrame.cpp @@ -69,16 +69,11 @@ void MainEmuFrame::UpdateStatusBar() { wxString temp(wxEmptyString); - if (g_InputRecording.IsActive() && g_InputRecording.GetInputRecordingData().FromSaveState()) - temp += "Base Savestate - " + g_InputRecording.GetInputRecordingData().GetFilename() + "_SaveState.p2s"; - else - { - if (g_Conf->EnableFastBoot) - temp += "Fast Boot - "; + if (g_Conf->EnableFastBoot) + temp += "Fast Boot - "; - if (g_Conf->CdvdSource == CDVD_SourceType::Iso) - temp += "Load: '" + wxFileName(g_Conf->CurrentIso).GetFullName() + "' "; - } + if (g_Conf->CdvdSource == CDVD_SourceType::Iso) + temp += "Load: '" + wxFileName(g_Conf->CurrentIso).GetFullName() + "' "; m_statusbar.SetStatusText(temp, 0); @@ -111,10 +106,7 @@ void MainEmuFrame::UpdateCdvdSrcSelection() jNO_DEFAULT } sMenuBar.Check(cdsrc, true); - if (!g_InputRecording.IsActive()) - { - ApplyCDVDStatus(); - } + ApplyCDVDStatus(); UpdateStatusBar(); } @@ -152,7 +144,7 @@ bool MainEmuFrame::Destroy() // void MainEmuFrame::OnCloseWindow(wxCloseEvent& evt) { - // the main thread is busy suspending everything, so let's not try to call it + // the main thread is busy suspending everything, so let's not try to call it // when closing the emulator //init_gspanel = false; @@ -311,17 +303,6 @@ void MainEmuFrame::ConnectMenus() Bind(wxEVT_MENU, &MainEmuFrame::Menu_Capture_Video_IncludeAudio_Click, this, MenuId_Capture_Video_IncludeAudio); Bind(wxEVT_MENU, &MainEmuFrame::Menu_Capture_Screenshot_Screenshot_Click, this, MenuId_Capture_Screenshot_Screenshot); Bind(wxEVT_MENU, &MainEmuFrame::Menu_Capture_Screenshot_Screenshot_As_Click, this, MenuId_Capture_Screenshot_Screenshot_As); - - // Recording - Bind(wxEVT_MENU, &MainEmuFrame::Menu_Recording_New_Click, this, MenuId_Recording_New); - Bind(wxEVT_MENU, &MainEmuFrame::Menu_Recording_Play_Click, this, MenuId_Recording_Play); - Bind(wxEVT_MENU, &MainEmuFrame::Menu_Recording_Stop_Click, this, MenuId_Recording_Stop); - Bind(wxEVT_MENU, &MainEmuFrame::Menu_Recording_Config_FrameAdvance, this, MenuId_Recording_Config_FrameAdvance); - Bind(wxEVT_MENU, &MainEmuFrame::Menu_Recording_TogglePause_Click, this, MenuId_Recording_TogglePause); - Bind(wxEVT_MENU, &MainEmuFrame::Menu_Recording_FrameAdvance_Click, this, MenuId_Recording_FrameAdvance); - Bind(wxEVT_MENU, &MainEmuFrame::Menu_Recording_ToggleRecordingMode_Click, this, MenuId_Recording_ToggleRecordingMode); - Bind(wxEVT_MENU, &MainEmuFrame::Menu_Recording_VirtualPad_Open_Click, this, MenuId_Recording_VirtualPad_Port0); - Bind(wxEVT_MENU, &MainEmuFrame::Menu_Recording_VirtualPad_Open_Click, this, MenuId_Recording_VirtualPad_Port1); } void MainEmuFrame::InitLogBoxPosition(AppConfig::ConsoleLogOptions& conf) @@ -393,7 +374,7 @@ void MainEmuFrame::CreatePcsx2Menu() _("Enabling Widescreen Patches may occasionally cause issues."), wxITEM_CHECK); m_GameSettingsSubmenu.Append(MenuId_EnableInputRecording, _("Enable &Input Recording"), - _("Input Recording for controller/keyboard presses, tools for automation and playback."), wxITEM_CHECK); + _("Input Recording for controller/keyboard presses, tools for automation and playback."), wxITEM_NORMAL); m_GameSettingsSubmenu.Append(MenuId_EnableHostFs, _("Enable &Host Filesystem"), wxEmptyString, wxITEM_CHECK); @@ -583,11 +564,6 @@ MainEmuFrame::MainEmuFrame(wxWindow* parent, const wxString& title) SetMenuBar(&m_menubar); - // Append the Recording options if previously enabled and setting has been picked up from ini - if (g_Conf->EmuOptions.EnableRecordingTools) - { - m_menubar.Append(&m_menuRecording, _("&Input Record")); - } m_menubar.Append(&m_menuHelp, _("&Help")); // ------------------------------------------------------------------------ @@ -813,12 +789,6 @@ void MainEmuFrame::ApplyConfigToGui(AppConfig& configToApply, int flags) menubar.Check(MenuId_EnableWideScreenPatches, configToApply.EmuOptions.EnableWideScreenPatches); menubar.Check(MenuId_Capture_Video_IncludeAudio, configToApply.AudioCapture.EnableAudio); - menubar.Check(MenuId_EnableInputRecording, configToApply.EmuOptions.EnableRecordingTools); - wxString frame_advance_label = wxString(_("Configure Frame Advance")); - frame_advance_label.Append(wxString::Format(" (%d)", configToApply.inputRecording.m_frame_advance_amount)); - m_submenu_recording_settings.SetLabel(MenuId_Recording_Config_FrameAdvance, frame_advance_label); - g_InputRecordingControls.setFrameAdvanceAmount(configToApply.inputRecording.m_frame_advance_amount); - menubar.Check(MenuId_EnableHostFs, configToApply.EmuOptions.HostFs); menubar.Check(MenuId_Debug_CreateBlockdump, configToApply.EmuOptions.CdvdDumpBlocks); #if defined(__POSIX__) @@ -847,18 +817,3 @@ void MainEmuFrame::AppendShortcutToMenuOption(wxMenuItem& item, wxString keyCode const size_t tabPos = text.rfind(L'\t'); item.SetItemLabel(text.Mid(0, tabPos) + L"\t" + keyCodeStr); } - -void MainEmuFrame::initializeRecordingMenuItem(MenuIdentifiers menuId, wxString keyCodeStr, bool enable) -{ - wxMenuItem& item = *m_menuRecording.FindChildItem(menuId); - wxString text = item.GetItemLabel(); - const size_t tabPos = text.rfind(L'\t'); - item.SetItemLabel(text.Mid(0, tabPos) + L"\t" + keyCodeStr); - item.Enable(enable); -} - -void MainEmuFrame::enableRecordingMenuItem(MenuIdentifiers menuId, bool enable) -{ - wxMenuItem& item = *m_menuRecording.FindChildItem(menuId); - item.Enable(enable); -} diff --git a/pcsx2/gui/MainFrame.h b/pcsx2/gui/MainFrame.h index ba78ff6840..615013ad61 100644 --- a/pcsx2/gui/MainFrame.h +++ b/pcsx2/gui/MainFrame.h @@ -122,11 +122,6 @@ public: void VideoCaptureToggle(); bool IsCapturing() const noexcept { return m_capturingVideo; } - void initializeRecordingMenuItem(MenuIdentifiers menuId, wxString keyCodeStr, bool enable = true); - void enableRecordingMenuItem(MenuIdentifiers menuId, bool enable); - void StartInputRecording(); - void StopInputRecording(); - protected: void DoGiveHelp(const wxString& text, bool show); @@ -205,16 +200,6 @@ protected: void Menu_Capture_Screenshot_Screenshot_Click(wxCommandEvent& event); void Menu_Capture_Screenshot_Screenshot_As_Click(wxCommandEvent& event); - void Menu_Recording_New_Click(wxCommandEvent& event); - void Menu_Recording_Play_Click(wxCommandEvent& event); - void Menu_Recording_Stop_Click(wxCommandEvent& event); - void Menu_Recording_Config_FrameAdvance(wxCommandEvent& event); - void ApplyFirstFrameStatus(); - void Menu_Recording_TogglePause_Click(wxCommandEvent& event); - void Menu_Recording_FrameAdvance_Click(wxCommandEvent& event); - void Menu_Recording_ToggleRecordingMode_Click(wxCommandEvent& event); - void Menu_Recording_VirtualPad_Open_Click(wxCommandEvent& event); - void _DoBootCdvd(); bool _DoSelectIsoBrowser(wxString& dest); bool _DoSelectELFBrowser(); diff --git a/pcsx2/gui/MainMenuClicks.cpp b/pcsx2/gui/MainMenuClicks.cpp index a2601b6aae..310c44b90b 100644 --- a/pcsx2/gui/MainMenuClicks.cpp +++ b/pcsx2/gui/MainMenuClicks.cpp @@ -38,10 +38,6 @@ #include "fmt/core.h" #include "wx/numdlg.h" -#include "Recording/InputRecording.h" -#include "Recording/InputRecordingControls.h" -#include "Recording/VirtualPad/VirtualPad.h" - using namespace Dialogs; @@ -165,7 +161,7 @@ void MainEmuFrame::Menu_ResetAllSettings_Click(wxCommandEvent& event) ScopedCoreThreadPopup suspender; if (!Msgbox::OkCancel(pxsFmt( pxE(L"This command clears %s settings and allows you to re-run the First-Time Wizard. You will need to manually restart %s after this operation.\n\nWARNING!! Click OK to delete *ALL* settings for %s and force-close the app, losing any current emulation progress. Are you absolutely sure?"), WX_STR(pxGetAppName()), WX_STR(pxGetAppName()), WX_STR(pxGetAppName())), - _("Reset all settings?"))) + _("Reset all settings?"))) { suspender.AllowResume(); return; @@ -205,9 +201,6 @@ wxWindowID SwapOrReset_Iso(wxWindow* owner, IScopedCoreThread& core_control, con dialog += dialog.GetCharHeight(); dialog += dialog.Heading(_("Do you want to swap discs or boot the new image (via system reset)?")); - if (g_InputRecording.IsActive() && g_InputRecording.GetInputRecordingData().FromSaveState()) - dialog += dialog.Text(_("\n(Warning: The savestate accompanying the active input recording\nmay not be compatible with the new source)")); - result = pxIssueConfirmation(dialog, MsgButtons().Reset().Cancel().Custom(_("Swap Disc"), "swap")); if (result == wxID_CANCEL) { @@ -264,9 +257,6 @@ wxWindowID SwapOrReset_Disc(wxWindow* owner, IScopedCoreThread& core, const wxSt dialog += dialog.GetCharHeight(); dialog += dialog.Heading(_("Do you want to swap discs or boot the new disc (via system reset)?")); - if (g_InputRecording.IsActive() && g_InputRecording.GetInputRecordingData().FromSaveState()) - dialog += dialog.Text(_("\n(Warning: The savestate accompanying the active input recording\nmay not be compatible with the new source)")); - result = pxIssueConfirmation(dialog, MsgButtons().Reset().Cancel().Custom(_("Swap Disc"), "swap")); if (result == wxID_CANCEL) { @@ -309,14 +299,11 @@ wxWindowID SwapOrReset_CdvdSrc(wxWindow* owner, CDVD_SourceType newsrc) wxString changeMsg; changeMsg.Printf(_("You've selected to switch the CDVD source from %s to %s."), - CDVD_SourceLabels[enum_cast(g_Conf->CdvdSource)], CDVD_SourceLabels[enum_cast(newsrc)]); + CDVD_SourceLabels[enum_cast(g_Conf->CdvdSource)], CDVD_SourceLabels[enum_cast(newsrc)]); dialog += dialog.Heading(changeMsg + L"\n\n" + _("Do you want to swap discs or boot the new image (system reset)?")); - if (g_InputRecording.IsActive() && g_InputRecording.GetInputRecordingData().FromSaveState()) - dialog += dialog.Text(_("\n(Warning: The savestate accompanying the active input recording\nmay not be compatible with the new source)")); - result = pxIssueConfirmation(dialog, MsgButtons().Reset().Cancel().Custom(_("Swap Disc"), "swap")); if (result == wxID_CANCEL) @@ -334,8 +321,8 @@ wxWindowID SwapOrReset_CdvdSrc(wxWindow* owner, CDVD_SourceType newsrc) if (result != wxID_RESET) { Console.Indent().WriteLn("(CdvdSource) HotSwapping CDVD source types from %ls to %ls.", - WX_STR(wxString(CDVD_SourceLabels[enum_cast(oldsrc)])), - WX_STR(wxString(CDVD_SourceLabels[enum_cast(newsrc)]))); + WX_STR(wxString(CDVD_SourceLabels[enum_cast(oldsrc)])), + WX_STR(wxString(CDVD_SourceLabels[enum_cast(newsrc)]))); //CoreThread.ChangeCdvdSource(); sMainFrame.UpdateCdvdSrcSelection(); core.AllowResume(); @@ -401,7 +388,7 @@ bool MainEmuFrame::_DoSelectIsoBrowser(wxString& result) isoFilterTypes.Add(L"*.*"); wxFileDialog ctrl(this, _("Select disc image, compressed disc image, or block-dump..."), g_Conf->Folders.RunIso.ToString(), wxEmptyString, - JoinString(isoFilterTypes, L"|"), wxFD_OPEN | wxFD_FILE_MUST_EXIST); + JoinString(isoFilterTypes, L"|"), wxFD_OPEN | wxFD_FILE_MUST_EXIST); if (ctrl.ShowModal() != wxID_CANCEL) { @@ -418,7 +405,7 @@ bool MainEmuFrame::_DoSelectELFBrowser() static const wxChar* elfFilterType = L"ELF Files (.elf)|*.elf;*.ELF"; wxFileDialog ctrl(this, _("Select ELF file..."), g_Conf->Folders.RunELF.ToString(), wxEmptyString, - (wxString)elfFilterType + L"|" + _("All Files (*.*)") + L"|*.*", wxFD_OPEN | wxFD_FILE_MUST_EXIST); + (wxString)elfFilterType + L"|" + _("All Files (*.*)") + L"|*.*", wxFD_OPEN | wxFD_FILE_MUST_EXIST); if (ctrl.ShowModal() != wxID_CANCEL) { @@ -506,23 +493,13 @@ void MainEmuFrame::Menu_CdvdSource_Click(wxCommandEvent& event) } SwapOrReset_CdvdSrc(this, newsrc); - if (!g_InputRecording.IsActive()) - { - ApplyCDVDStatus(); - } + ApplyCDVDStatus(); } void MainEmuFrame::Menu_BootCdvd_Click(wxCommandEvent& event) { - if (g_InputRecording.IsActive()) - { - g_InputRecording.GoToFirstFrame(this); - } - else - { - g_Conf->EmuOptions.UseBOOT2Injection = g_Conf->EnableFastBoot; - _DoBootCdvd(); - } + g_Conf->EmuOptions.UseBOOT2Injection = g_Conf->EnableFastBoot; + _DoBootCdvd(); } void MainEmuFrame::Menu_FastBoot_Click(wxCommandEvent& event) @@ -681,66 +658,8 @@ void MainEmuFrame::Menu_EnableWideScreenPatches_Click(wxCommandEvent&) void MainEmuFrame::Menu_EnableRecordingTools_Click(wxCommandEvent& event) { - bool checked = GetMenuBar()->IsChecked(MenuId_EnableInputRecording); - // Confirm with User - if (checked) - { - if (!Msgbox::OkCancel(_("Please be aware that PCSX2's input recording features are still very much a work-in-progress.\n" - "As a result, there may be unforeseen bugs, performance implications and instability with certain games.\n\n" - "These tools are provided as-is and should be enabled under your own discretion."), - "Enabling Input Recording")) - { - checked = false; - m_GameSettingsSubmenu.FindChildItem(MenuId_EnableInputRecording)->Check(false); - } - } - - // If still enabled, add the menu item, else, remove it - if (checked) - { - GetMenuBar()->Insert(TopLevelMenu_InputRecording, &m_menuRecording, _("&Input Record")); - g_InputRecording.InitVirtualPadWindows(this); - SysConsole.recordingConsole.Enabled = true; - // Enable Recording Keybindings - if (GSFrame* gsFrame = wxGetApp().GetGsFramePtr()) - { - if (GSPanel* viewport = gsFrame->GetViewport()) - { - viewport->InitRecordingAccelerators(); - } - } - } - else - { - //Properly close any currently loaded recording file before disabling - StopInputRecording(); - GetMenuBar()->Remove(TopLevelMenu_InputRecording); - // Always turn controller logs off, but never turn it on by default - SysConsole.controlInfo.Enabled = checked; - // Return Keybindings Back to Normal - if (GSFrame* gsFrame = wxGetApp().GetGsFramePtr()) - { - if (GSPanel* viewport = gsFrame->GetViewport()) - { - viewport->RemoveRecordingAccelerators(); - } - } - SysConsole.recordingConsole.Enabled = false; - if (g_InputRecordingControls.IsPaused()) - g_InputRecordingControls.Resume(); - } - - g_Conf->EmuOptions.EnableRecordingTools = checked; - // Update GS Title Frequency - if (GSFrame* gsFrame = wxGetApp().GetGsFramePtr()) - { - gsFrame->UpdateTitleUpdateFreq(); - } - // Enable Recording Logs - ConsoleLogFrame* progLog = wxGetApp().GetProgramLog(); - progLog->UpdateLogList(); - AppApplySettings(); - AppSaveSettings(); + Msgbox::Alert("Input Recording has been deprecated from the wxWidgets version.\nUse an older dev build (before v1.7.3650) or switch to the Qt version!\nOld recordings should still play correctly!"); + return; } void MainEmuFrame::Menu_EnableHostFs_Click(wxCommandEvent&) @@ -782,7 +701,7 @@ void MainEmuFrame::Menu_SaveStates_Click(wxCommandEvent& event) void MainEmuFrame::Menu_LoadStateFromFile_Click(wxCommandEvent& event) { wxFileDialog loadStateDialog(this, _("Load State"), L"", L"", - L"Savestate files (*.p2s)|*.p2s", wxFD_OPEN); + L"Savestate files (*.p2s)|*.p2s", wxFD_OPEN); if (loadStateDialog.ShowModal() == wxID_CANCEL) { @@ -796,7 +715,7 @@ void MainEmuFrame::Menu_LoadStateFromFile_Click(wxCommandEvent& event) void MainEmuFrame::Menu_SaveStateToFile_Click(wxCommandEvent& event) { wxFileDialog saveStateDialog(this, _("Save State"), L"", L"", - L"Savestate files (*.p2s)|*.p2s", wxFD_OPEN); + L"Savestate files (*.p2s)|*.p2s", wxFD_OPEN); if (saveStateDialog.ShowModal() == wxID_CANCEL) { @@ -825,10 +744,6 @@ protected: if (CoreThread.IsOpen()) { CoreThread.Suspend(); - // Disable recording controls that only make sense if the game is running - sMainFrame.enableRecordingMenuItem(MenuId_Recording_FrameAdvance, false); - sMainFrame.enableRecordingMenuItem(MenuId_Recording_TogglePause, false); - sMainFrame.enableRecordingMenuItem(MenuId_Recording_ToggleRecordingMode, false); } else CoreThread.Resume(); @@ -849,40 +764,11 @@ void MainEmuFrame::Menu_SuspendResume_Click(wxCommandEvent& event) void MainEmuFrame::Menu_SysShutdown_Click(wxCommandEvent& event) { - bool doShutdown = true; - if (!g_InputRecording.IsActive()) - { - if (g_InputRecordingControls.IsPaused()) - g_InputRecordingControls.Resume(); - } - else - { - const bool initiallyPaused = g_InputRecordingControls.IsPaused(); - if (!initiallyPaused) - g_InputRecordingControls.Pause(); - wxWindowID result = wxID_CANCEL; - wxDialogWithHelpers dialog(this, _("Shutdown & Close Input Recording")); - dialog += dialog.Heading(L"\nShutting down emulation will close the active input recording file.\nProceed?"); - result = pxIssueConfirmation(dialog, MsgButtons().Close().Cancel()); - if (result == wxID_CLOSE) - { - StopInputRecording(); - g_InputRecordingControls.Resume(); - } - else if (!initiallyPaused) - { - g_InputRecordingControls.Resume(); - doShutdown = false; - } - } - if (doShutdown) - { - if (m_capturingVideo) - VideoCaptureToggle(); - UI_DisableSysShutdown(); - Console.SetTitle("PCSX2 Program Log"); - CoreThread.Reset(); - } + if (m_capturingVideo) + VideoCaptureToggle(); + UI_DisableSysShutdown(); + Console.SetTitle("PCSX2 Program Log"); + CoreThread.Reset(); } void MainEmuFrame::Menu_Debug_Open_Click(wxCommandEvent& event) @@ -1049,135 +935,3 @@ void MainEmuFrame::Menu_Capture_Screenshot_Screenshot_As_Click(wxCommandEvent& e CoreThread.Resume(); } -void MainEmuFrame::Menu_Recording_New_Click(wxCommandEvent& event) -{ - const bool emulation_initially_paused = CoreThread.IsPaused(); - const bool recording_initially_paused = g_InputRecordingControls.IsPaused(); - - if (!emulation_initially_paused && !recording_initially_paused) - g_InputRecordingControls.PauseImmediately(); - - NewRecordingFrame* newRecordingFrame = wxGetApp().GetNewRecordingFramePtr(); - if (newRecordingFrame) - { - if (newRecordingFrame->ShowModal(CoreThread.IsOpen()) != wxID_CANCEL) - { - if (g_InputRecording.Create(newRecordingFrame->GetFile(), newRecordingFrame->GetFrom(), newRecordingFrame->GetAuthor())) - { - if (!g_InputRecording.GetInputRecordingData().FromSaveState()) - StartInputRecording(); - return; - } - } - - if (!emulation_initially_paused && !recording_initially_paused) - g_InputRecordingControls.ResumeImmediately(); - } -} - -void MainEmuFrame::Menu_Recording_Play_Click(wxCommandEvent& event) -{ - const bool initiallyPaused = g_InputRecordingControls.IsPaused(); - - if (!initiallyPaused) - g_InputRecordingControls.PauseImmediately(); - - wxFileDialog openFileDialog(this, _("Select P2M2 record file."), L"", L"", - L"p2m2 file(*.p2m2)|*.p2m2", wxFD_OPEN); - if (openFileDialog.ShowModal() == wxID_CANCEL) - { - if (!initiallyPaused) - g_InputRecordingControls.Resume(); - return; - } - - StopInputRecording(); - if (!g_InputRecording.Play(this, openFileDialog.GetPath())) - { - if (!initiallyPaused) - g_InputRecordingControls.Resume(); - return; - } - - if (!g_InputRecording.GetInputRecordingData().FromSaveState()) - StartInputRecording(); -} - -void MainEmuFrame::ApplyFirstFrameStatus() -{ - wxMenuItem* cdvd_menu = m_menuSys.FindChildItem(MenuId_Boot_CDVD); - - wxString keyCodeStr; - if (GSFrame* gsFrame = wxGetApp().GetGsFramePtr()) - if (GSPanel* viewport = gsFrame->GetViewport()) - keyCodeStr = '\t' + viewport->GetAssociatedKeyCode(("GoToFirstFrame")); - - cdvd_menu->SetItemLabel(L"Restart Recording" + keyCodeStr); - if (g_InputRecording.GetInputRecordingData().FromSaveState()) - cdvd_menu->SetHelp(L"Loads the savestate that accompanies the active input recording"); - else - cdvd_menu->SetHelp(L"Reboots Emulation"); - - UpdateStatusBar(); -} - -void MainEmuFrame::Menu_Recording_Stop_Click(wxCommandEvent& event) -{ - StopInputRecording(); -} - -void MainEmuFrame::Menu_Recording_Config_FrameAdvance(wxCommandEvent& event) -{ - long result = wxGetNumberFromUser(_("Enter the number of frames to advance per advance"), _("Number of Frames"), _("Configure Frame Advance"), g_Conf->inputRecording.m_frame_advance_amount, 1, INT_MAX); - if (result != -1) - { - g_Conf->inputRecording.m_frame_advance_amount = result; - g_InputRecordingControls.setFrameAdvanceAmount(result); - wxString frame_advance_label = wxString(_("Configure Frame Advance")); - frame_advance_label.Append(wxString::Format(" (%ld)", result)); - m_submenu_recording_settings.SetLabel(MenuId_Recording_Config_FrameAdvance, frame_advance_label); - } -} - -void MainEmuFrame::StartInputRecording() -{ - m_menuRecording.FindChildItem(MenuId_Recording_New)->Enable(false); - m_menuRecording.FindChildItem(MenuId_Recording_Stop)->Enable(true); - m_menuRecording.FindChildItem(MenuId_Recording_ToggleRecordingMode)->Enable(true); - ApplyFirstFrameStatus(); -} - -void MainEmuFrame::StopInputRecording() -{ - if (g_InputRecording.IsActive()) - { - g_InputRecording.Stop(); - m_menuRecording.FindChildItem(MenuId_Recording_New)->Enable(true); - m_menuRecording.FindChildItem(MenuId_Recording_Stop)->Enable(false); - m_menuRecording.FindChildItem(MenuId_Recording_ToggleRecordingMode)->Enable(false); - ApplyCDVDStatus(); - } -} - -void MainEmuFrame::Menu_Recording_TogglePause_Click(wxCommandEvent& event) -{ - if (g_Conf->EmuOptions.EnableRecordingTools) - g_InputRecordingControls.TogglePause(); -} - -void MainEmuFrame::Menu_Recording_FrameAdvance_Click(wxCommandEvent& event) -{ - if (g_Conf->EmuOptions.EnableRecordingTools) - g_InputRecordingControls.FrameAdvance(); -} - -void MainEmuFrame::Menu_Recording_ToggleRecordingMode_Click(wxCommandEvent& event) -{ - if (g_Conf->EmuOptions.EnableRecordingTools) - g_InputRecordingControls.RecordModeToggle(); -} - -void MainEmuFrame::Menu_Recording_VirtualPad_Open_Click(wxCommandEvent& event) -{ - g_InputRecording.ShowVirtualPad(event.GetId() - MenuId_Recording_VirtualPad_Port0); -} diff --git a/pcsx2/gui/Mutex.cpp b/pcsx2/gui/Mutex.cpp index b866149a99..b6e8882eb2 100644 --- a/pcsx2/gui/Mutex.cpp +++ b/pcsx2/gui/Mutex.cpp @@ -126,7 +126,7 @@ Threading::MutexRecursive::MutexRecursive() if (++_attr_refcount == 1) { if (0 != pthread_mutexattr_init(&_attr_recursive)) - throw Exception::OutOfMemory("Recursive mutexing attributes"); + pxFailRel("pthread_mutexattr_init() failed"); pthread_mutexattr_settype(&_attr_recursive, PTHREAD_MUTEX_RECURSIVE); } diff --git a/pcsx2/gui/Panels/BiosSelectorPanel.cpp b/pcsx2/gui/Panels/BiosSelectorPanel.cpp index 8f6e8320b2..e110ce1803 100644 --- a/pcsx2/gui/Panels/BiosSelectorPanel.cpp +++ b/pcsx2/gui/Panels/BiosSelectorPanel.cpp @@ -214,7 +214,7 @@ void Panels::BiosSelectorPanel::OnEnumComplete(wxCommandEvent& evt) if (currentBios == (*m_BiosList)[result.second]) m_ComboBox->SetSelection(sel); } - // Select a bios if one isn't selected. + // Select a bios if one isn't selected. // This makes it so users don't _have_ to click on their bios, // possibly reducing confusion. if(m_ComboBox->GetSelection() == -1 && m_ComboBox->GetCount() > 0) diff --git a/pcsx2/gui/Panels/ConfigurationPanels.h b/pcsx2/gui/Panels/ConfigurationPanels.h index 2cee6b985c..41007448ee 100644 --- a/pcsx2/gui/Panels/ConfigurationPanels.h +++ b/pcsx2/gui/Panels/ConfigurationPanels.h @@ -341,7 +341,6 @@ namespace Panels void Defaults_Click(wxCommandEvent& evt); void EECycleRate_Scroll(wxScrollEvent& event); void VUCycleRate_Scroll(wxScrollEvent& event); - void VUThread_Enable(wxCommandEvent& evt); }; // -------------------------------------------------------------------------------------- diff --git a/pcsx2/gui/Panels/CpuPanel.cpp b/pcsx2/gui/Panels/CpuPanel.cpp index 115e56f1cc..4e2c09c59c 100644 --- a/pcsx2/gui/Panels/CpuPanel.cpp +++ b/pcsx2/gui/Panels/CpuPanel.cpp @@ -157,10 +157,10 @@ Panels::CpuPanelEE::CpuPanelEE( wxWindow* parent ) s_recs += s_ee | SubGroup(); s_recs += s_iop | SubGroup(); - + *this += &s_recs | StdExpand(); - - // move following line down so EE and VU panels look more uniform. + + // move following line down so EE and VU panels look more uniform. // Use an empty Label (std expanded) so it work with custom font sizes, too. //*this += Label(_("")) | StdExpand(); *this += new wxStaticLine( this ) | pxExpand.Border(wxALL, 18); diff --git a/pcsx2/gui/Panels/DirPickerPanel.cpp b/pcsx2/gui/Panels/DirPickerPanel.cpp index 8beb1c8c2a..97e59c8e7e 100644 --- a/pcsx2/gui/Panels/DirPickerPanel.cpp +++ b/pcsx2/gui/Panels/DirPickerPanel.cpp @@ -85,7 +85,7 @@ void Panels::DirPickerPanel::Explore_Click( wxCommandEvent &evt ) // // Parameters: // label - label for the StaticBox that surrounds the dir picker control. If the 'label' -// parameter is not specified, the layout of the panel is assumed to be "compact" which +// parameter is not specified, the layout of the panel is assumed to be "compact" which // lacks a static box and compresses itself onto a single line. Compact mode may be useful // for situations where the expanded format is just too invasive. // @@ -235,7 +235,7 @@ void Panels::DirPickerPanel::Reset() m_pickerCtrl->Enable( IsEnabled() ? ( m_checkCtrl ? !isDefault : true ) : false ); m_pickerCtrl->SetPath( GetNormalizedConfigFolder( m_FolderId ) ); } - + if (m_textCtrl) { m_textCtrl->Disable(); @@ -292,7 +292,7 @@ void Panels::DirPickerPanel::SetPath( const wxString& newPath ) { if (m_pickerCtrl) m_pickerCtrl->SetPath( newPath ); - + if (m_textCtrl) m_textCtrl->SetValue( newPath ); } diff --git a/pcsx2/gui/Panels/GameFixesPanel.cpp b/pcsx2/gui/Panels/GameFixesPanel.cpp index 81cc85492b..3d8c302a54 100644 --- a/pcsx2/gui/Panels/GameFixesPanel.cpp +++ b/pcsx2/gui/Panels/GameFixesPanel.cpp @@ -66,6 +66,11 @@ Panels::GameFixesPanel::GameFixesPanel( wxWindow* parent ) pxEt(L"Known to affect following games:\n * Digital Devil Saga (Fixes FMV and crashes)\n * SSX (Fixes bad graphics and crashes)\n * Resident Evil: Dead Aim (Causes garbled textures)" ) }, + { + _("Instant DMA hack. Try if all else fails."), + pxEt(L"Known to affect following games:\n * Fire Pro Wrestling Z (Bad ring graphics)" + ) + }, { _("Handle DMAC writes when it is busy."), pxEt( L"Known to affect following games:\n * Mana Khemia 1 (Going \"off campus\"), Metal Saga (Intro FMV), Pilot Down Behind Enemy Lines\n" @@ -174,9 +179,9 @@ void Panels::GameFixesPanel::ApplyConfigToGui( AppConfig& configToApply, int fla const Pcsx2Config::GamefixOptions& opts( configToApply.EmuOptions.Gamefixes ); for (GamefixId i=GamefixId_FIRST; i < pxEnumEnd; ++i) m_checkbox[i]->SetValue( opts.Get((GamefixId)i) );//apply the use/don't-use fix values - + m_check_Enable->SetValue( configToApply.EnableGameFixes );//main gamefixes checkbox EnableStuff( &configToApply );// enable/disable the all the fixes controls according to the main one - + this->Enable(!configToApply.EnablePresets); } diff --git a/pcsx2/gui/Panels/LogOptionsPanels.h b/pcsx2/gui/Panels/LogOptionsPanels.h index 9eda40e332..c67ba88597 100644 --- a/pcsx2/gui/Panels/LogOptionsPanels.h +++ b/pcsx2/gui/Panels/LogOptionsPanels.h @@ -90,7 +90,7 @@ namespace Panels void OnUpdateEnableAll(); void OnCheckBoxClicked(wxCommandEvent &event); void Apply(); - + protected: BaseCpuLogOptionsPanel* GetCpuPanel( const wxString& token ) const; }; diff --git a/pcsx2/gui/Panels/MemoryCardListPanel.cpp b/pcsx2/gui/Panels/MemoryCardListPanel.cpp index 43ed9599f3..d7063b7f22 100644 --- a/pcsx2/gui/Panels/MemoryCardListPanel.cpp +++ b/pcsx2/gui/Panels/MemoryCardListPanel.cpp @@ -563,7 +563,7 @@ void Panels::MemoryCardListPanel_Simple::Apply() if (!used) Console.WriteLn("No active slots."); - SetForceMcdEjectTimeoutNow(); + AutoEject::SetAll(); } void Panels::MemoryCardListPanel_Simple::AppStatusEvent_OnSettingsApplied() diff --git a/pcsx2/gui/Panels/MemoryCardListView.cpp b/pcsx2/gui/Panels/MemoryCardListView.cpp index fbca417416..2a1e6c1d45 100644 --- a/pcsx2/gui/Panels/MemoryCardListView.cpp +++ b/pcsx2/gui/Panels/MemoryCardListView.cpp @@ -53,7 +53,7 @@ void BaseMcdListView::LoadSaveColumns( IniInterface& ini ) int width = GetColumnWidth(col); ini.Entry( label, width, cinfo.width ); - + if (ini.IsLoading()) SetColumnWidth(col, width); } @@ -134,7 +134,7 @@ wxString MemoryCardListView_Simple::OnGetItemText(long item, long column) const return pxsFmt(wxString(L" ") + _("Port-%u / Multitap-%u--Port-1"), it.GetMtapPort()+1, it.GetMtapPort()+1); return pxsFmt(wxString(L" ")+_(" Multitap-%u--Port-%u"), it.GetMtapPort()+1, it.GetMtapSlot()+1); } - + return L""; /* case McdColS_Status: @@ -146,7 +146,7 @@ wxString MemoryCardListView_Simple::OnGetItemText(long item, long column) const res= L""; return prefix + res; } -*/ +*/ case McdColS_Size: return prefix + ( !it.IsPresent ? L"" : (it.IsPSX? pxsFmt( L"%u MBit", it.SizeInMB ) : ( it.SizeInMB > 0 ? pxsFmt( L"%u MiB", it.SizeInMB ) : L"Auto" ) ) ); case McdColS_Formatted: return prefix + ( !it.IsPresent ? L"" : ( it.IsFormatted ? _("Yes") : _("No")) ); case McdColS_Type: return prefix + ( !it.IsPresent ? L"" : ( it.IsPSX? _("PS1") : _("PS2")) ); @@ -168,7 +168,7 @@ wxString MemoryCardListView_Simple::OnGetItemText(long item, long column) const } wxDirName filepath( it.Filename.GetPath() ); - + if (filepath.SameAs(g_Conf->Folders.MemoryCards)) return prefix + it.Filename.GetFullName(); else diff --git a/pcsx2/gui/Panels/MemoryCardPanels.h b/pcsx2/gui/Panels/MemoryCardPanels.h index 4fe2548816..2ea360a01c 100644 --- a/pcsx2/gui/Panels/MemoryCardPanels.h +++ b/pcsx2/gui/Panels/MemoryCardPanels.h @@ -41,7 +41,7 @@ struct McdSlotItem int Slot; //0-7: internal slot. -1: unrelated to an internal slot (the rest of the files at the folder). bool IsPresent; //Whether or not a file is associated with this item (true/false when 0<=Slot<=7. Always true when Slot==-1) MemoryCardType Type; //The implementation used for this memory card - + //Only meaningful when IsPresent==true (a file exists for this item): wxFileName Filename; // full pathname bool IsFormatted; @@ -65,7 +65,7 @@ struct McdSlotItem Slot = -1; SizeInMB = 0; Type = MemoryCardType::Empty; - + IsPSX = false; IsPresent = false; IsEnabled = false; @@ -89,7 +89,7 @@ public: virtual void RemoveCardFromSlot(const wxFileName cardFile) =0; virtual bool IsNonEmptyFilesystemCards() const =0; virtual bool UiDuplicateCard( McdSlotItem& src, McdSlotItem& dest ) =0; - + }; // -------------------------------------------------------------------------------------- @@ -162,7 +162,7 @@ namespace Panels , public IMcdList // derived classes need to implement this { typedef BaseSelectorPanel _parent; - + protected: DirPickerPanel* m_FolderPicker; BaseMcdListView* m_listview; @@ -208,12 +208,12 @@ namespace Panels McdSlotItem m_Cards[8]; wxButton* m_button_Rename; - + // Doubles as Create and Delete buttons wxButton* m_button_Create; wxButton* m_button_Convert; - + // Doubles as Mount and Unmount buttons ("Enable"/"Disable" port) // wxButton* m_button_Mount; @@ -244,7 +244,7 @@ namespace Panels void OnRenameFile(wxCommandEvent& evt); void OnDuplicateFile(wxCommandEvent& evt); void OnAssignUnassignFile(wxCommandEvent& evt); - + void OnListDrag(wxListEvent& evt); void OnListSelectionChanged(wxListEvent& evt); void OnOpenItemContextMenu(wxListEvent& evt); @@ -275,7 +275,7 @@ namespace Panels virtual void UiConvertCard( McdSlotItem& card ); virtual void UiDeleteCard( McdSlotItem& card ); virtual void UiAssignUnassignFile( McdSlotItem& card ); - + }; // -------------------------------------------------------------------------------------- diff --git a/pcsx2/gui/Panels/MiscPanelStuff.cpp b/pcsx2/gui/Panels/MiscPanelStuff.cpp index 02c5f211c0..3c1d57c0e8 100644 --- a/pcsx2/gui/Panels/MiscPanelStuff.cpp +++ b/pcsx2/gui/Panels/MiscPanelStuff.cpp @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -39,7 +39,7 @@ Panels::DocsFolderPickerPanel::DocsFolderPickerPanel( wxWindow* parent, bool isF const wxString usermodeWarning( pxE( L"You can change the preferred default location for PCSX2 user-level documents here (includes memory cards, screenshots, settings, and savestates). This option only affects Standard Paths which are set to use the installation default value." ) ); - const RadioPanelItem UsermodeOptions[] = + const RadioPanelItem UsermodeOptions[] = { RadioPanelItem( _("User Documents (recommended)"), @@ -57,7 +57,7 @@ Panels::DocsFolderPickerPanel::DocsFolderPickerPanel( wxWindow* parent, bool isF m_radio_UserMode->SetPaddingHoriz( m_radio_UserMode->GetPaddingVert() + 4 ); m_radio_UserMode->Realize(); if( pxStaticText* woot = m_radio_UserMode->GetSubText(0) ) woot->Unwrapped(); // wrapping sucks for path names! - + m_dirpicker_custom = new DirPickerPanel( this, FolderId_Documents, AddAppName(_("Select a document root for %s")) ); *this += Heading( isFirstTime ? usermodeExplained : usermodeWarning ); @@ -150,7 +150,7 @@ void Panels::LanguageSelectionPanel::Apply() wxString sel( m_picker->GetString( m_picker->GetSelection() ) ); g_Conf->LanguageCode = L"default"; // use this if no matches found - g_Conf->LanguageId = wxLANGUAGE_DEFAULT; + g_Conf->LanguageId = wxLANGUAGE_DEFAULT; int size = m_langs.size(); for( int i=0; iSetToolTip( pxEt( L"Updates Status Flags only on blocks which will read them, instead of all the time. This is safe most of the time." ) ); - m_check_vuThread->SetToolTip( pxEt( L"Runs VU1 on its own thread (microVU1-only). Generally a speedup on CPUs with 3 or more cores. This is safe for most games, but a few games are incompatible and may hang. In the case of GS limited games, it may be a slowdown (especially on dual core CPUs)." + m_check_vuThread->SetToolTip( pxEt( L"Runs VU1 on its own thread. Generally a speedup on CPUs with 3 or more cores. This is safe for most games, but a few games are incompatible and may hang. In the case of GS limited games, it may be a slowdown (especially on dual core CPUs)." ) ); - m_check_vu1Instant->SetToolTip(pxEt(L"Runs VU1 instantly (when MTVU is disabled). Provides a modest speed improvement. This is safe for most games, but a few games may exhibit graphical errors." + m_check_vu1Instant->SetToolTip(pxEt(L"Runs VU1 instantly. Provides a modest speed improvement in most games. This is safe for most games, but a few games may exhibit graphical errors." )); // ------------------------------------------------------------------------ @@ -237,7 +237,6 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow* parent ) Bind(wxEVT_SCROLL_CHANGED, &SpeedHacksPanel::VUCycleRate_Scroll, this, m_slider_eeSkip->GetId()); Bind(wxEVT_CHECKBOX, &SpeedHacksPanel::OnEnable_Toggled, this, m_check_Enable->GetId()); Bind(wxEVT_BUTTON, &SpeedHacksPanel::Defaults_Click, this, wxID_DEFAULT); - Bind(wxEVT_CHECKBOX, &SpeedHacksPanel::VUThread_Enable, this, m_check_vuThread->GetId()); } // Doesn't modify values - only locks(gray out)/unlocks as necessary. @@ -267,11 +266,6 @@ void Panels::SpeedHacksPanel::EnableStuff( AppConfig* configToUse ) // Grayout MTVU on safest preset m_check_vuThread->Enable(hacksEnabled && (!hasPreset || configToUse->PresetIndex != 0)); - // Disables the Instant VU1 checkbox when MTVU is checked in the GUI as reflected in the code. - // Makes Instant VU1 toggleable when MTVU is unchecked in the GUI. - // Some may think that having MTVU + Instant VU1 checked, can have bad side-effects when it doesn't. - m_check_vu1Instant->Enable(hacksEnabled && !m_check_vuThread->GetValue()); - // Layout necessary to ensure changed slider text gets re-aligned properly // and to properly gray/ungray pxStaticText stuff (I suspect it causes a // paint event to be sent on Windows) @@ -370,9 +364,3 @@ void Panels::SpeedHacksPanel::VUCycleRate_Scroll(wxScrollEvent &event) event.Skip(); } - -void Panels::SpeedHacksPanel::VUThread_Enable(wxCommandEvent& evt) -{ - m_check_vu1Instant->Enable(!m_check_vuThread->GetValue()); - Layout(); -} diff --git a/pcsx2/gui/Panels/VideoPanel.cpp b/pcsx2/gui/Panels/VideoPanel.cpp index 6f0c5b52ef..f241b9e3cd 100644 --- a/pcsx2/gui/Panels/VideoPanel.cpp +++ b/pcsx2/gui/Panels/VideoPanel.cpp @@ -31,7 +31,7 @@ using namespace pxSizerFlags; Panels::FramelimiterPanel::FramelimiterPanel( wxWindow* parent ) : BaseApplicableConfigPanel_SpecificConfig( parent ) { - // Implement custom hotkeys (F4) with translatable string intact + not blank in GUI. + // Implement custom hotkeys (F4) with translatable string intact + not blank in GUI. m_check_LimiterDisable = new pxCheckBox( this, _("Disable Framelimiting") + wxString(" (") + wxGetApp().GlobalAccels->findKeycodeWithCommandId("Framelimiter_MasterToggle").toTitleizedString()+ wxString(")"), _("Uncaps FPS. Useful for running benchmarks.") ); @@ -63,7 +63,7 @@ Panels::FramelimiterPanel::FramelimiterPanel( wxWindow* parent ) s_spins += Label(L"%") | StdExpand(); s_spins += 5; - // Implement custom hotkeys (Shift + Tab) with translatable string intact + not blank in GUI. + // Implement custom hotkeys (Shift + Tab) with translatable string intact + not blank in GUI. s_spins += Label(_("Slow Motion Adjust:") + wxString::Format(" (%s)", wxGetApp().GlobalAccels->findKeycodeWithCommandId("Framelimiter_SlomoToggle").toTitleizedString())) | StdExpand(); s_spins += 5; @@ -71,7 +71,7 @@ Panels::FramelimiterPanel::FramelimiterPanel( wxWindow* parent ) s_spins += Label(L"%") | StdExpand(); s_spins += 5; - // Implement custom hotkeys (Tab) with translatable string intact + not blank in GUI. + // Implement custom hotkeys (Tab) with translatable string intact + not blank in GUI. s_spins += Label(_("Turbo Adjust:") + wxString::Format(" (%s)", wxGetApp().GlobalAccels->findKeycodeWithCommandId("Framelimiter_TurboToggle").toTitleizedString())) | StdExpand(); s_spins += 5; @@ -113,7 +113,7 @@ void Panels::FramelimiterPanel::ApplyConfigToGui( AppConfig& configToApply, int if( ! (flags & AppConfig::APPLY_FLAG_FROM_PRESET) ) { //Presets don't control these: only change if config doesn't come from preset. - + m_check_LimiterDisable->SetValue(!gsconf.FrameLimitEnable); m_spin_TurboPct->SetValue(appfps.TurboScalar * 100.0); @@ -174,7 +174,7 @@ Panels::VideoPanel::VideoPanel( wxWindow* parent ) : m_check_SynchronousGS = new pxCheckBox( left, _("Use Synchronized MTGS"), _t("For troubleshooting potential bugs in the MTGS only, as it is potentially very slow.") ); -#endif +#endif m_spinner_VsyncQueue = new wxSpinCtrl(left); m_spinner_VsyncQueue->SetRange(0, 3); @@ -182,9 +182,9 @@ Panels::VideoPanel::VideoPanel( wxWindow* parent ) : m_restore_defaults = new wxButton(this, wxID_DEFAULT, _("Restore Defaults")); m_spinner_VsyncQueue->SetToolTip( pxEt(L"Setting this to a lower value improves input lag, a value around 2 or 3 will slightly improve framerates. (Default is 2)")); -#ifdef PCSX2_DEVBUILD +#ifdef PCSX2_DEVBUILD m_check_SynchronousGS->SetToolTip( pxEt( L"Enable this if you think MTGS thread sync is causing crashes or graphical errors. For debugging to see if GS is running at the correct speed.")); -#endif +#endif //GSWindowSettingsPanel* winpan = new GSWindowSettingsPanel( left ); //winpan->AddFrame(_("Display/Window")); @@ -199,14 +199,14 @@ Panels::VideoPanel::VideoPanel( wxWindow* parent ) : *left += m_fpan | pxExpand; *left += 5; - + *s_vsyncs += left->Label(_("Vsyncs in MTGS Queue:")) | StdExpand(); *s_vsyncs += m_spinner_VsyncQueue | pxBorder(wxTOP, -2).Right(); *left += s_vsyncs | StdExpand(); -#ifdef PCSX2_DEVBUILD +#ifdef PCSX2_DEVBUILD *left += 2; *left += m_check_SynchronousGS | StdExpand(); -#endif +#endif *s_table += left | StdExpand(); @@ -238,9 +238,9 @@ void Panels::VideoPanel::OnOpenWindowSettings( wxCommandEvent& evt ) void Panels::VideoPanel::Apply() { -#ifdef PCSX2_DEVBUILD +#ifdef PCSX2_DEVBUILD g_Conf->EmuOptions.GS.SynchronousMTGS = m_check_SynchronousGS->GetValue(); -#endif +#endif g_Conf->EmuOptions.GS.VsyncQueueSize = m_spinner_VsyncQueue->GetValue(); } @@ -251,10 +251,10 @@ void Panels::VideoPanel::AppStatusEvent_OnSettingsApplied() void Panels::VideoPanel::ApplyConfigToGui( AppConfig& configToApply, int flags ){ -#ifdef PCSX2_DEVBUILD +#ifdef PCSX2_DEVBUILD m_check_SynchronousGS->SetValue( configToApply.EmuOptions.GS.SynchronousMTGS ); m_check_SynchronousGS->Enable(!configToApply.EnablePresets); -#endif +#endif m_spinner_VsyncQueue->SetValue( configToApply.EmuOptions.GS.VsyncQueueSize ); if( flags & AppConfig::APPLY_FLAG_MANUALLY_PROPAGATE ) diff --git a/pcsx2/gui/PathUtils.cpp b/pcsx2/gui/PathUtils.cpp index e5b18c1ce9..dedddeb40a 100644 --- a/pcsx2/gui/PathUtils.cpp +++ b/pcsx2/gui/PathUtils.cpp @@ -16,6 +16,7 @@ #include "common/Path.h" #include "common/Assertions.h" #include "common/Exceptions.h" +#include "gui/PersistentThread.h" #include "wxDirName.h" #include diff --git a/pcsx2/gui/PersistentThread.h b/pcsx2/gui/PersistentThread.h index 309db3dfb0..1ced6e68e2 100644 --- a/pcsx2/gui/PersistentThread.h +++ b/pcsx2/gui/PersistentThread.h @@ -95,9 +95,82 @@ extern ConsoleLogSource_Threading pxConLog_Thread; #define pxThreadLog pxConLog_Thread.IsActive() && pxConLog_Thread +using ScopedExcept = std::unique_ptr; namespace Exception { + // -------------------------------------------------------------------------------------- + // CancelAppEvent - Exception for canceling an event in a non-verbose fashion + // -------------------------------------------------------------------------------------- + // Typically the PCSX2 interface issues popup dialogs for runtime errors. This exception + // instead issues a "silent" cancelation that is handled by the app gracefully (generates + // log, and resumes messages queue processing). + // + // I chose to have this exception derive from RuntimeError, since if one is thrown from outside + // an App message loop we'll still want it to be handled in a reasonably graceful manner. + class CancelEvent : public RuntimeError + { + DEFINE_RUNTIME_EXCEPTION(CancelEvent, RuntimeError, "No reason given.") + + public: + explicit CancelEvent(std::string logmsg) + { + m_message_diag = std::move(logmsg); + // overridden message formatters only use the diagnostic version... + } + + virtual std::string FormatDisplayMessage() const override + { + return "Action canceled: " + m_message_diag; + } + + virtual std::string FormatDiagnosticMessage() const override + { + return "Action canceled: " + m_message_diag; + } + }; + + class ParseError : public RuntimeError + { + DEFINE_RUNTIME_EXCEPTION(ParseError, RuntimeError, "Parse error"); + }; + +#ifdef _WIN32 + // -------------------------------------------------------------------------------------- + // Exception::WinApiError + // -------------------------------------------------------------------------------------- + class WinApiError : public RuntimeError + { + DEFINE_EXCEPTION_COPYTORS(WinApiError, RuntimeError) + DEFINE_EXCEPTION_MESSAGES(WinApiError) + + public: + int ErrorId; + + public: + WinApiError(); + + std::string GetMsgFromWindows() const; + virtual std::string FormatDisplayMessage() const override; + virtual std::string FormatDiagnosticMessage() const override; + }; +#endif + + // -------------------------------------------------------------------------- + // Exception used to perform an "errorless" termination of the app during OnInit + // procedures. This happens when a user cancels out of startup prompts/wizards. + // + class StartupAborted : public CancelEvent + { + DEFINE_RUNTIME_EXCEPTION(StartupAborted, CancelEvent, "Startup initialization was aborted by the user.") + + public: + StartupAborted(std::string reason) + { + m_message_diag = "Startup aborted: " + reason; + } + }; + class BaseThreadError : public RuntimeError { DEFINE_EXCEPTION_COPYTORS(BaseThreadError, RuntimeError) @@ -125,8 +198,8 @@ namespace Exception m_message_diag = "An unspecified thread-related error occurred (thread=%s)"; } - virtual std::string FormatDiagnosticMessage() const; - virtual std::string FormatDisplayMessage() const; + virtual std::string FormatDiagnosticMessage() const override; + virtual std::string FormatDisplayMessage() const override; Threading::pxThread& Thread(); const Threading::pxThread& Thread() const; @@ -151,6 +224,47 @@ namespace Exception }; } // namespace Exception +// -------------------------------------------------------------------------------------- +// DESTRUCTOR_CATCHALL - safe destructor helper +// -------------------------------------------------------------------------------------- +// In C++ destructors *really* need to be "nothrow" garaunteed, otherwise you can have +// disasterous nested exception throws during the unwinding process of an originating +// exception. Use this macro to dispose of these dangerous exceptions, and generate a +// friendly error log in their wake. +// +// Note: Console can also fire an Exception::OutOfMemory +#define __DESTRUCTOR_CATCHALL(funcname) \ + catch (BaseException & ex) \ + { \ + try \ + { \ + Console.Error("Unhandled BaseException in %s (ignored!):", funcname); \ + Console.Error(ex.FormatDiagnosticMessage()); \ + } \ + catch (...) \ + { \ + fprintf(stderr, "ERROR: (out of memory?)\n"); \ + } \ + } \ + catch (std::exception & ex) \ + { \ + try \ + { \ + Console.Error("Unhandled std::exception in %s (ignored!):", funcname); \ + Console.Error(ex.what()); \ + } \ + catch (...) \ + { \ + fprintf(stderr, "ERROR: (out of memory?)\n"); \ + } \ + } \ + catch (...) \ + { \ + /* Unreachable code */ \ + } + +#define DESTRUCTOR_CATCHALL __DESTRUCTOR_CATCHALL(__pxFUNCTION__) + namespace Threading { extern void pxTestCancel(); diff --git a/pcsx2/gui/RecentIsoList.cpp b/pcsx2/gui/RecentIsoList.cpp index 4e36c125bd..1c5909a7b9 100644 --- a/pcsx2/gui/RecentIsoList.cpp +++ b/pcsx2/gui/RecentIsoList.cpp @@ -99,7 +99,7 @@ void RecentIsoManager::RemoveAllFromMenu() m_Menu->Destroy( curitem.ItemPtr ); curitem.ItemPtr = NULL; } - + if( m_Separator != nullptr ) { m_Menu->Destroy( m_Separator ); diff --git a/pcsx2/gui/Resources/Info.plist.in b/pcsx2/gui/Resources/Info.plist.in index 34d5a40d47..3747df09a5 100644 --- a/pcsx2/gui/Resources/Info.plist.in +++ b/pcsx2/gui/Resources/Info.plist.in @@ -39,5 +39,7 @@ ${CMAKE_OSX_DEPLOYMENT_TARGET} NSHighResolutionCapable + LSApplicationCategoryType + public.app-category.games diff --git a/pcsx2/gui/Saveslots.h b/pcsx2/gui/Saveslots.h index ec41576545..8a848b4cf1 100644 --- a/pcsx2/gui/Saveslots.h +++ b/pcsx2/gui/Saveslots.h @@ -115,7 +115,7 @@ public: void Used() { - // Update the saveslot cache with the new saveslot, and give it the current timestamp, + // Update the saveslot cache with the new saveslot, and give it the current timestamp, // Because we aren't going to be able to get the real timestamp from disk right now. empty = false; updated = wxDateTime::Now(); diff --git a/pcsx2/gui/StringHelpers.cpp b/pcsx2/gui/StringHelpers.cpp index c2668f2abc..2a5dfde57c 100644 --- a/pcsx2/gui/StringHelpers.cpp +++ b/pcsx2/gui/StringHelpers.cpp @@ -17,6 +17,7 @@ #include "common/Exceptions.h" #include "common/StringUtil.h" #include "common/Pcsx2Defs.h" +#include "PersistentThread.h" #include "StringHelpers.h" __fi wxString fromUTF8(const char* src) diff --git a/pcsx2/gui/SysCoreThread.cpp b/pcsx2/gui/SysCoreThread.cpp index 35f441d1d6..f03611daa5 100644 --- a/pcsx2/gui/SysCoreThread.cpp +++ b/pcsx2/gui/SysCoreThread.cpp @@ -64,14 +64,13 @@ namespace PINESettings // -------------------------------------------------------------------------------------- SysCoreThread::SysCoreThread() + : m_hasActiveMachine(false) { m_name = L"EE Core"; m_resetRecompilers = true; m_resetProfilers = true; m_resetVsyncTimers = true; m_resetVirtualMachine = true; - - m_hasActiveMachine = false; } SysCoreThread::~SysCoreThread() @@ -112,7 +111,7 @@ void SysCoreThread::OnSuspendInThread() void SysCoreThread::Start() { - SPU2init(); + SPU2init(false); PADinit(); DEV9init(); USBinit(); @@ -161,7 +160,6 @@ void SysCoreThread::ResetQuick() void SysCoreThread::Reset() { ResetQuick(); - GetVmMemory().DecommitAll(); SysClearExecutionCache(); sApp.PostAppMethod(&Pcsx2App::leaveDebugMode); g_FrameCount = 0; @@ -198,7 +196,7 @@ void SysCoreThread::ApplySettings(const Pcsx2Config& src) { Console.WriteLn("Applying GS settings..."); GetMTGS().ApplySettings(); - GetMTGS().SetVSync(EmuConfig.GetEffectiveVsyncMode()); + GetMTGS().UpdateVSyncMode(); } } @@ -217,8 +215,6 @@ void SysCoreThread::_reset_stuff_as_needed() // because of changes to the TLB. We don't actually support the TLB, however, so rec // resets aren't in fact *needed* ... yet. But might as well, no harm. --air - GetVmMemory().CommitAll(); - if (m_resetVirtualMachine || m_resetRecompilers || m_resetProfilers) { SysClearExecutionCache(); @@ -241,7 +237,7 @@ void SysCoreThread::_reset_stuff_as_needed() if (m_resetVsyncTimers) { - GetMTGS().SetVSync(EmuConfig.GetEffectiveVsyncMode()); + GetMTGS().UpdateVSyncMode(); UpdateVSyncRate(); frameLimitReset(); diff --git a/pcsx2/gui/SysThreadBase.cpp b/pcsx2/gui/SysThreadBase.cpp index 357886cf25..4f3bcabb9b 100644 --- a/pcsx2/gui/SysThreadBase.cpp +++ b/pcsx2/gui/SysThreadBase.cpp @@ -17,7 +17,7 @@ #include "System.h" #include "SysThreads.h" -#include "CDVD/CDVDaccess.h" +#include "CDVD/CDVDcommon.h" // -------------------------------------------------------------------------------------- // SysThreadBase *External Thread* Implementations diff --git a/pcsx2/gui/i18n.cpp b/pcsx2/gui/i18n.cpp index 29657a3d9e..6c88c4f7a6 100644 --- a/pcsx2/gui/i18n.cpp +++ b/pcsx2/gui/i18n.cpp @@ -50,9 +50,8 @@ static wxString i18n_GetBetterLanguageName( const wxLanguageInfo* info ) } LangPackEnumeration::LangPackEnumeration( wxLanguage langId ) + : wxLangId(langId) { - wxLangId = langId; - if (const wxLanguageInfo* info = wxLocale::GetLanguageInfo( wxLangId )) { canonicalName = info->CanonicalName; @@ -61,12 +60,10 @@ LangPackEnumeration::LangPackEnumeration( wxLanguage langId ) } LangPackEnumeration::LangPackEnumeration() + : wxLangId(wxLANGUAGE_DEFAULT) + , canonicalName(L"default") + , englishName(L"System Default" + _(" (default)")) { - wxLangId = wxLANGUAGE_DEFAULT; - englishName = L"System Default"; - englishName += _(" (default)"); - canonicalName = L"default"; - int sysLang = wxLocale::GetSystemLanguage(); if (sysLang == wxLANGUAGE_UNKNOWN) @@ -185,11 +182,11 @@ static wxLanguage i18n_FallbackToAnotherLang( wxLanguage wxLangId ) case wxLANGUAGE_ARABIC_UAE : case wxLANGUAGE_ARABIC_YEMEN : return wxLANGUAGE_ARABIC_SAUDI_ARABIA; - case wxLANGUAGE_CHINESE_HONGKONG : + case wxLANGUAGE_CHINESE_HONGKONG : case wxLANGUAGE_CHINESE_MACAU : return wxLANGUAGE_CHINESE_TRADITIONAL; case wxLANGUAGE_CHINESE_SINGAPORE : return wxLANGUAGE_CHINESE_SIMPLIFIED; - // case wxLANGUAGE_SAMI : + // case wxLANGUAGE_SAMI : // case wxLANGUAGE_DANISH : case wxLANGUAGE_NORWEGIAN_NYNORSK : return wxLANGUAGE_NORWEGIAN_BOKMAL; @@ -205,10 +202,10 @@ static wxLanguage i18n_FallbackToAnotherLang( wxLanguage wxLangId ) case wxLANGUAGE_PORTUGUESE : return wxLANGUAGE_PORTUGUESE_BRAZILIAN; // Overkill 9000? - case wxLANGUAGE_GERMAN_AUSTRIAN : - case wxLANGUAGE_GERMAN_BELGIUM : - case wxLANGUAGE_GERMAN_LIECHTENSTEIN : - case wxLANGUAGE_GERMAN_LUXEMBOURG : + case wxLANGUAGE_GERMAN_AUSTRIAN : + case wxLANGUAGE_GERMAN_BELGIUM : + case wxLANGUAGE_GERMAN_LIECHTENSTEIN : + case wxLANGUAGE_GERMAN_LUXEMBOURG : // case wxLANGUAGE_LOWER_SORBIAN : // case wxLANGUAGE_UPPER_SORBIAN : // - Sorbian is not supported by wxWidgets (3.0.0). @@ -283,7 +280,7 @@ bool i18n_SetLanguage( wxLanguage wxLangId, const wxString& langCode ) info = wxLocale::GetLanguageInfo(LangId_fallback); } - // note: language canonical name mismatch probably means wxWidgets version changed since + // note: language canonical name mismatch probably means wxWidgets version changed since // the user's ini file was provided. Missing/invalid ID probably means the same thing. // If either is true, and the caller provided a canonical name, then let wx do a best // match based on the canonical name. @@ -303,7 +300,7 @@ bool i18n_SetLanguage( wxLanguage wxLangId, const wxString& langCode ) if (!info) return false; if (wxGetLocale() && (info->Language == wxGetLocale()->GetLanguage())) return true; - + std::unique_ptr locale(new wxLocale(info->Language)); if( !locale->IsOk() ) @@ -315,7 +312,7 @@ bool i18n_SetLanguage( wxLanguage wxLangId, const wxString& langCode ) } wxLangId = (wxLanguage)locale->GetLanguage(); - + if (wxLangId == wxLANGUAGE_UNKNOWN) { Console.WriteLn("System-default language is unknown? Defaulting back to English/US."); @@ -328,7 +325,7 @@ bool i18n_SetLanguage( wxLanguage wxLangId, const wxString& langCode ) locale.release(); return true; } - + Console.WriteLn( "Loading language translation databases for '%ls' [%ls]", WX_STR(i18n_GetBetterLanguageName(info)), WX_STR(locale->GetCanonicalName()) ); @@ -338,7 +335,7 @@ bool i18n_SetLanguage( wxLanguage wxLangId, const wxString& langCode ) L"pcsx2_Main", L"pcsx2_Iconized" }; - + bool foundone = false; for (uint i=0; i$(SolutionDir)3rdparty\zlib;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\libpng;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\glad\include;%(AdditionalIncludeDirectories) - $(SolutionDir)3rdparty\cubeb\cubeb\include;$(SolutionDir)3rdparty\cubeb\include;%(AdditionalIncludeDirectories) - $(SolutionDir)3rdparty\imgui\imgui;$(SolutionDir)3rdparty\imgui\include;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\cubeb\include;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\imgui\include;$(SolutionDir)3rdparty\imgui\include;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\libzip;$(SolutionDir)3rdparty\libzip\libzip\lib;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\d3d12memalloc\include;%(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\zstd\zstd\lib + %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\rapidyaml\rapidyaml\ext\c4core\src\c4\ext\fast_float\include Async Use PrecompiledHeader.h @@ -57,11 +58,9 @@ PCSX2_DEVEL;PCSX2_DEVBUILD;NDEBUG;_SECURE_SCL_=1;%(PreprocessorDefinitions) NDEBUG;_SECURE_SCL_=0;%(PreprocessorDefinitions) PCSX2_CI;%(PreprocessorDefinitions) - _M_SSE=0x401;%(PreprocessorDefinitions) - _M_SSE=0x501;%(PreprocessorDefinitions) - - NotSet - StreamingSIMDExtensions2 + + __SSE4_1__;%(PreprocessorDefinitions) + NotSet AdvancedVectorExtensions2 false $(IntDir)%(RelativeDir) @@ -72,7 +71,7 @@ Yes comctl32.lib;ws2_32.lib;shlwapi.lib;winmm.lib;rpcrt4.lib;iphlpapi.lib;dsound.lib;%(AdditionalDependencies) - dxguid.lib;dinput8.lib;hid.lib;PowrProf.lib;d3dcompiler.lib;d3d11.lib;dxgi.lib;strmiids.lib;opengl32.lib;comsuppw.lib;%(AdditionalDependencies) + dxguid.lib;dinput8.lib;hid.lib;PowrProf.lib;d3dcompiler.lib;d3d11.lib;dxgi.lib;strmiids.lib;opengl32.lib;comsuppw.lib;OneCore.lib;%(AdditionalDependencies) @@ -172,82 +171,6 @@ %(RelativeDir)%(Filename).h - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - - - cmd.exe /c %(RelativeDir)bin2cpp.cmd %(Filename)%(Extension) - %(RelativeDir)%(Filename).h - @@ -327,6 +250,7 @@ + @@ -378,6 +302,8 @@ + + @@ -447,13 +373,9 @@ - - - - @@ -526,6 +448,7 @@ + @@ -533,6 +456,7 @@ + @@ -550,9 +474,12 @@ + + + @@ -634,7 +561,6 @@ - @@ -646,10 +572,11 @@ - + + @@ -799,6 +726,7 @@ + @@ -841,6 +769,8 @@ + + @@ -866,6 +796,7 @@ + @@ -944,27 +875,24 @@ + + - - - - - @@ -1078,7 +1006,6 @@ - @@ -1087,10 +1014,11 @@ - + + diff --git a/pcsx2/pcsx2.vcxproj.filters b/pcsx2/pcsx2.vcxproj.filters index adf3df9d11..dfe16c8353 100644 --- a/pcsx2/pcsx2.vcxproj.filters +++ b/pcsx2/pcsx2.vcxproj.filters @@ -142,12 +142,6 @@ {7b917318-5a5e-44c0-8463-1dfab67f3b67} - - {93e36831-627f-4529-b709-1f4bad398512} - - - {ae88cd9a-f9f2-4196-979c-7a16ed5e455e} - {be861049-a142-4650-85a5-a2fdd4eef011} @@ -163,9 +157,6 @@ {85c5a0d2-6404-439f-8756-d908a1442b96} - - {ad528458-08eb-49a2-aefa-3c2b86ab8896} - {8d5454f9-590c-4c53-aae1-8391c6465e50} @@ -656,9 +647,6 @@ System\Ps2\Iop - - System\Ps2\Iop - System\Ps2\Iop @@ -692,7 +680,7 @@ System\Ps2\Iop\CDVD - + System\Ps2\Iop\CDVD @@ -704,6 +692,9 @@ System\Ps2\IPU + + System\Ps2\IPU + System\Ps2\IPU @@ -1052,24 +1043,12 @@ Recording - - Recording\gui - - - Recording\VirtualPad - System\Ps2\IPU Recording - - Recording\VirtualPad - - - Recording\VirtualPad - System\Ps2\Iop\CDVD @@ -1520,6 +1499,9 @@ System\Ps2\GS + + System\Ps2\GS + System\Ps2\GS @@ -1535,6 +1517,9 @@ System\Ps2\GS + + System\Ps2\GS + System\Ps2\GS @@ -1544,6 +1529,9 @@ System\Ps2\GS + + System\Ps2\GS + AppHost\Dialogs @@ -1625,6 +1613,9 @@ System\Ps2\GS\Renderers\Hardware + + System\Ps2\GS\Renderers\Hardware + System\Ps2\GS\Renderers\Hardware @@ -1646,6 +1637,9 @@ System\Ps2\GS\Renderers\Common + + System\Ps2\GS\Renderers\Common + System\Ps2\GS\Renderers\Common @@ -1796,6 +1790,15 @@ AppHost + + Host + + + System\Ps2\Iop + + + System\Ps2\Iop + @@ -1975,9 +1978,6 @@ System\Ps2\Iop - - System\Ps2\Iop - System\Ps2\Iop @@ -2002,7 +2002,7 @@ System\Ps2\Iop\CDVD - + System\Ps2\Iop\CDVD @@ -2014,6 +2014,9 @@ System\Ps2\IPU + + System\Ps2\IPU + System\Ps2\IPU @@ -2245,9 +2248,6 @@ System\Ps2\Iop - - System\Ps2\Iop - System\Ps2 @@ -2263,21 +2263,9 @@ Recording - - Recording\gui - - - Recording\VirtualPad - Recording - - Recording\VirtualPad - - - Recording\VirtualPad - System\Ps2\Iop\CDVD @@ -2740,6 +2728,9 @@ System\Ps2\GS + + System\Ps2\GS + System\Ps2\GS @@ -2755,6 +2746,9 @@ System\Ps2\GS + + System\Ps2\GS + System\Ps2\GS @@ -2990,6 +2984,18 @@ AppHost + + Host + + + System\Include + + + System\Ps2\Iop + + + System\Ps2\Iop + @@ -3089,63 +3095,6 @@ AppHost\Resources - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - - - Recording\VirtualPad\Images - diff --git a/pcsx2/pcsx2core.vcxproj b/pcsx2/pcsx2core.vcxproj index 4c023d5f9e..755135d2df 100644 --- a/pcsx2/pcsx2core.vcxproj +++ b/pcsx2/pcsx2core.vcxproj @@ -41,30 +41,33 @@ $(SolutionDir)3rdparty\zlib;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\libpng;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\glad\include;%(AdditionalIncludeDirectories) - $(SolutionDir)3rdparty\cubeb\cubeb\include;$(SolutionDir)3rdparty\cubeb\include;%(AdditionalIncludeDirectories) - $(SolutionDir)3rdparty\imgui\imgui;$(SolutionDir)3rdparty\imgui\include;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\cubeb\include;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\imgui\include;$(SolutionDir)3rdparty\imgui\include;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\simpleini\include;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\sdl2\include;$(SolutionDir)3rdparty\sdl2\SDL\include;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\libzip;$(SolutionDir)3rdparty\libzip\libzip\lib;%(AdditionalIncludeDirectories) $(SolutionDir)3rdparty\d3d12memalloc\include;%(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\zstd\zstd\lib %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\cpuinfo\include + %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\rapidyaml\rapidyaml\ext\c4core\src\c4\ext\fast_float\include + %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\rcheevos\rcheevos\include;$(SolutionDir)3rdparty\rainterface + %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\discord-rpc\include + %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\zydis\include;$(SolutionDir)3rdparty\zydis\dependencies\zycore\include Async Use PrecompiledHeader.h PrecompiledHeader.h;%(ForcedIncludeFiles) NoExtensions /Zc:externConstexpr %(AdditionalOptions) - WIN32_LEAN_AND_MEAN;ZIP_STATIC;LZMA_API_STATIC;BUILD_DX=1;ENABLE_OPENGL;ENABLE_VULKAN;SPU2X_CUBEB;SDL_BUILD;PCSX2_CORE;%(PreprocessorDefinitions) + WIN32_LEAN_AND_MEAN;ZIP_STATIC;LZMA_API_STATIC;BUILD_DX=1;ENABLE_DISCORD_PRESENCE;ENABLE_RAINTEGRATION;ENABLE_ACHIEVEMENTS;ENABLE_OPENGL;ENABLE_VULKAN;SPU2X_CUBEB;SDL_BUILD;PCSX2_CORE;%(PreprocessorDefinitions) PCSX2_DEBUG;PCSX2_DEVBUILD;_SECURE_SCL_=1;%(PreprocessorDefinitions) PCSX2_DEVEL;PCSX2_DEVBUILD;NDEBUG;_SECURE_SCL_=1;%(PreprocessorDefinitions) NDEBUG;_SECURE_SCL_=0;%(PreprocessorDefinitions) PCSX2_CI;%(PreprocessorDefinitions) - _M_SSE=0x401;%(PreprocessorDefinitions) - _M_SSE=0x501;%(PreprocessorDefinitions) - - NotSet - StreamingSIMDExtensions2 + + __SSE4_1__;%(PreprocessorDefinitions) + ZYCORE_STATIC_DEFINE;ZYDIS_STATIC_DEFINE;%(PreprocessorDefinitions) + NotSet AdvancedVectorExtensions2 false $(IntDir)%(RelativeDir) @@ -186,20 +189,27 @@ + + + + + + - + + @@ -216,8 +226,10 @@ - + + + @@ -289,6 +301,7 @@ + @@ -296,6 +309,7 @@ + @@ -316,6 +330,9 @@ + + + @@ -398,7 +415,6 @@ - @@ -410,10 +426,11 @@ - + + @@ -448,6 +465,7 @@ + @@ -506,20 +524,26 @@ + + + + + - + + @@ -536,6 +560,8 @@ + + @@ -551,6 +577,8 @@ + + @@ -629,13 +657,14 @@ + + - @@ -700,7 +729,6 @@ - @@ -709,9 +737,10 @@ - + + @@ -765,9 +794,6 @@ {d6973076-9317-4ef2-a0b8-b7a18ac0713e} - - {47afdbef-f15f-4bc0-b436-5be443c3f80f} - {e9b51944-7e6d-4bcd-83f2-7bbd5a46182d} @@ -793,12 +819,21 @@ {88fb34ec-845e-4f21-a552-f1573b9ed167} + + {e960dfdf-1bd3-4c29-b251-d1a0919c9b09} + {20b2e9fe-f020-42a0-b324-956f5b06ea68} {7e183337-a7e9-460c-9d3d-568bc9f9bcc1} + + {95dd0a0c-d14d-4cff-a593-820ef26efcc8} + + + {6d5b5ad9-1525-459b-939f-a5e1082af6b3} + {812b4434-fd6b-4cb2-8865-5fd8eb34b046} @@ -811,4 +846,4 @@ - \ No newline at end of file + diff --git a/pcsx2/pcsx2core.vcxproj.filters b/pcsx2/pcsx2core.vcxproj.filters index 0418288126..36adca90f5 100644 --- a/pcsx2/pcsx2core.vcxproj.filters +++ b/pcsx2/pcsx2core.vcxproj.filters @@ -238,6 +238,9 @@ {03ba2aa7-2cd9-48cb-93c6-fc93d5bdc938} + + {78c9db9c-9c7c-4385-90e7-9fa71b922f60} + @@ -569,9 +572,6 @@ System\Ps2\Iop - - System\Ps2\Iop - System\Ps2\Iop @@ -605,7 +605,7 @@ System\Ps2\Iop\CDVD - + System\Ps2\Iop\CDVD @@ -617,6 +617,9 @@ System\Ps2\IPU + + System\Ps2\IPU + System\Ps2\IPU @@ -998,6 +1001,9 @@ System\Ps2\GS + + System\Ps2\GS + System\Ps2\GS @@ -1013,6 +1019,12 @@ System\Ps2\GS + + System\Ps2\GS + + + System\Ps2\GS + System\Ps2\GS @@ -1094,6 +1106,9 @@ System\Ps2\GS\Renderers\Hardware + + System\Ps2\GS\Renderers\Hardware + System\Ps2\GS\Renderers\Hardware @@ -1115,6 +1130,9 @@ System\Ps2\GS\Renderers\Common + + System\Ps2\GS\Renderers\Common + System\Ps2\GS\Renderers\Common @@ -1172,7 +1190,7 @@ Host - + Host @@ -1205,7 +1223,7 @@ System\Ps2\USB - + Host @@ -1266,15 +1284,42 @@ Tools\Input Recording - - Tools\Input Recording - Tools\Input Recording + + Tools\Input Recording\Utilities + Host + + Host + + + Host + + + Host + + + Host + + + Host + + + Host + + + Host + + + System\Ps2\Iop + + + System\Ps2\Iop + @@ -1457,9 +1502,6 @@ System\Ps2\Iop - - System\Ps2\Iop - System\Ps2\Iop @@ -1484,7 +1526,7 @@ System\Ps2\Iop\CDVD - + System\Ps2\Iop\CDVD @@ -1493,6 +1535,9 @@ System\Ps2\IPU + + System\Ps2\IPU + System\Ps2\IPU @@ -1619,9 +1664,6 @@ System\Ps2\Iop - - System\Ps2\Iop - System\Ps2 @@ -1850,6 +1892,12 @@ System\Ps2\GS + + System\Ps2\GS + + + System\Ps2\GS + System\Ps2\GS @@ -2028,7 +2076,7 @@ Host - + Host @@ -2110,15 +2158,46 @@ Tools\Input Recording - - Tools\Input Recording - Tools\Input Recording + + Tools\Input Recording\Utilities + Host + + Host + + + Host + + + Host + + + Host + + + + System\Include + + + Host + + + Host + + + System\Ps2\Iop + + + System\Ps2\Iop + + + System\Ps2\Iop + diff --git a/pcsx2/ps2/BiosTools.cpp b/pcsx2/ps2/BiosTools.cpp index a2573dc4ee..ea97cdba28 100644 --- a/pcsx2/ps2/BiosTools.cpp +++ b/pcsx2/ps2/BiosTools.cpp @@ -57,7 +57,6 @@ std::string BiosDescription; std::string BiosZone; std::string BiosPath; BiosDebugInformation CurrentBiosInformation; -s64 BiosRegionOffset = 0; static bool LoadBiosVersion(std::FILE* fp, u32& version, std::string& description, u32& region, std::string& zone) { @@ -89,28 +88,38 @@ static bool LoadBiosVersion(std::FILE* fp, u32& version, std::string& descriptio break; } + // TODO: some regions can be detected only from rom1 + /* + switch (rom1:DVDID[4]) + { + // clang-format off + case 'O': zone = "Oceania";region = 3; break; + case 'R': zone = "Russia"; region = 5; break; + case 'M': zone = "Mexico"; region = 7; break; + // clang-format on + } + */ + switch (romver[4]) { // clang-format off - case 'T': region = 0; break; - case 'X': region = 1; break; - case 'J': region = 2; break; - case 'A': region = 3; break; - case 'E': region = 4; break; - case 'H': region = 5; break; - case 'P': region = 6; break; - case 'C': region = 7; break; + case 'J': zone = "Japan"; region = 0; break; + case 'A': zone = "USA"; region = 1; break; + case 'E': zone = "Europe"; region = 2; break; + // case 'E': zone = "Oceania";region = 3; break; // Not implemented + case 'H': zone = "Asia"; region = 4; break; + // case 'E': zone = "Russia"; region = 3; break; // Not implemented + case 'C': zone = "China"; region = 6; break; + // case 'A': zone = "Mexico"; region = 7; break; // Not implemented + case 'T': zone = "T10K"; region = 8; break; + case 'X': zone = "Test"; region = 9; break; + case 'P': zone = "Free"; region = 10; break; // clang-format on - } - - if (region <= 7) - { - zone = BiosZoneStrings[region]; - } - else - { - zone.clear(); - zone += romver[4]; + default: + zone.clear(); + zone += romver[4]; + region = 0; + break; } char vermaj[3] = {romver[0], romver[1], 0}; @@ -127,7 +136,6 @@ static bool LoadBiosVersion(std::FILE* fp, u32& version, std::string& descriptio version = strtol(vermaj, (char**)NULL, 0) << 8; version |= strtol(vermin, (char**)NULL, 0); foundRomVer = true; - BiosRegionOffset = fileOffset; Console.WriteLn("Bios Found: %s", description.c_str()); } @@ -169,7 +177,7 @@ void ChecksumIt(u32& result, const u8 (&srcdata)[_size]) // the base. // // Parameters: -// ext - extension of the sub-component to load. Valid options are rom1, rom2, AND erom. +// ext - extension of the sub-component to load. Valid options are rom1 and rom2. // template static void LoadExtraRom(const char* ext, u8 (&dest)[_size]) @@ -195,7 +203,7 @@ static void LoadExtraRom(const char* ext, u8 (&dest)[_size]) Console.Warning("BIOS Warning: %s could not be read (permission denied?)", ext); return; } - // Checksum for ROM1, ROM2, EROM? Rama says no, Gigaherz says yes. I'm not sure either way. --air + // Checksum for ROM1, ROM2? Rama says no, Gigaherz says yes. I'm not sure either way. --air //ChecksumIt( BiosChecksum, dest ); } @@ -244,7 +252,7 @@ static std::string FindBiosImage() // this method being called. // // Remarks: -// This function does not fail if rom1, rom2, or erom files are missing, since none are +// This function does not fail if rom1 or rom2 files are missing, since none are // explicitly required for most emulation tasks. // // Exceptions: @@ -295,13 +303,6 @@ bool LoadBIOS() ChecksumIt(BiosChecksum, eeMem->ROM); BiosPath = std::move(path); - // Patch the region - if (EmuConfig.PatchBios) - { - eeMem->ROM[BiosRegionOffset + 4] = EmuConfig.PatchRegion[0]; - Console.WriteLn("Patching ROM with region code %c", EmuConfig.PatchRegion[0]); - } - #ifndef PCSX2_CORE Console.SetTitle(StringUtil::StdStringFromFormat("Running BIOS (%s v%u.%u)", BiosZone.c_str(), BiosVersion >> 8, BiosVersion & 0xff).c_str()); @@ -311,7 +312,6 @@ bool LoadBIOS() LoadExtraRom("rom1", eeMem->ROM1); LoadExtraRom("rom2", eeMem->ROM2); - LoadExtraRom("erom", eeMem->EROM); if (EmuConfig.CurrentIRX.length() > 3) LoadIrx(EmuConfig.CurrentIRX, &eeMem->ROM[0x3C0000], sizeof(eeMem->ROM) - 0x3C0000); diff --git a/pcsx2/ps2/BiosTools.h b/pcsx2/ps2/BiosTools.h index 6d8edbd7a5..60173bb998 100644 --- a/pcsx2/ps2/BiosTools.h +++ b/pcsx2/ps2/BiosTools.h @@ -28,24 +28,6 @@ struct BiosDebugInformation u32 threadListAddr; }; -// The following two arrays are used for Qt -[[maybe_unused]] static const char* BiosZoneStrings[] { - "T10K", - "Test", - "Japan", - "USA", - "Europe", - "HK", - "Free", - "China", - nullptr -}; - -[[maybe_unused]] static const char* BiosZoneBytes[] -{ - "T", "X", "J", "A", "E", "H", "P", "C", nullptr -}; - extern BiosDebugInformation CurrentBiosInformation; extern u32 BiosVersion; // Used by CDVD extern u32 BiosRegion; // Used by CDVD @@ -59,3 +41,4 @@ extern std::string BiosPath; extern bool LoadBIOS(); extern bool IsBIOS(const char* filename, u32& version, std::string& description, u32& region, std::string& zone); extern bool IsBIOSAvailable(const std::string& full_path); + diff --git a/pcsx2/ps2/HwInternal.h b/pcsx2/ps2/HwInternal.h index ee2e082a4b..e32d82c951 100644 --- a/pcsx2/ps2/HwInternal.h +++ b/pcsx2/ps2/HwInternal.h @@ -16,13 +16,14 @@ #pragma once #include "Hw.h" +#include "SingleRegisterTypes.h" // hw read functions template< uint page > extern mem8_t hwRead8 (u32 mem); template< uint page > extern mem16_t hwRead16 (u32 mem); template< uint page > extern mem32_t hwRead32 (u32 mem); -template< uint page > extern RETURNS_R64 hwRead64 (u32 mem); +template< uint page > extern mem64_t hwRead64 (u32 mem); template< uint page > extern RETURNS_R128 hwRead128(u32 mem); // Internal hwRead32 which does not log reads, used by hwWrite8/16 to perform @@ -39,8 +40,8 @@ template extern void hwWrite8 (u32 mem, u8 value); template extern void hwWrite16 (u32 mem, u16 value); template extern void hwWrite32 (u32 mem, mem32_t value); -template extern void hwWrite64 (u32 mem, const mem64_t* srcval); -template extern void hwWrite128(u32 mem, const mem128_t* srcval); +template extern void hwWrite64 (u32 mem, mem64_t srcval); +template extern void TAKES_R128 hwWrite128(u32 mem, r128 srcval); // -------------------------------------------------------------------------------------- // Hardware FIFOs (128 bit access only!) diff --git a/pcsx2/ps2/Iop/IopHwRead.cpp b/pcsx2/ps2/Iop/IopHwRead.cpp index 25ef234d38..483f2f36d7 100644 --- a/pcsx2/ps2/Iop/IopHwRead.cpp +++ b/pcsx2/ps2/Iop/IopHwRead.cpp @@ -24,12 +24,17 @@ #include "DEV9/DEV9.h" #include "USB/USB.h" #include "IopCounters.h" -#include "IopSio2.h" #include "IopDma.h" #include "ps2/pgif.h" #include "Mdec.h" +#define SIO0LOG_ENABLE 0 +#define SIO2LOG_ENABLE 0 + +#define Sio0Log if (SIO0LOG_ENABLE) DevCon +#define Sio2Log if (SIO2LOG_ENABLE) DevCon + namespace IopMemory { using namespace Internal; @@ -41,17 +46,26 @@ mem8_t iopHwRead8_Page1( u32 addr ) // all addresses are assumed to be prefixed with 0x1f801xxx: pxAssume( (addr >> 12) == 0x1f801 ); - u32 masked_addr = addr & 0x0fff; + const u32 masked_addr = addr & 0x0fff; - mem8_t ret; // using a return var can be helpful in debugging. + mem8_t ret = 0; // using a return var can be helpful in debugging. switch( masked_addr ) { - mcase(HW_SIO_DATA) : - // 1F801040h 1/4 JOY_DATA Joypad/Memory Card Data (R/W) - // psxmode: documentation suggests a valid 8 bit read and the rest of the 32 bit register is unclear. - // todo: check this and compare with the HW_SIO_DATA read around line 245 as well. - ret = sioRead8(); - break; + case (HW_SIO_DATA & 0x0fff): + ret = sio0.GetRxData(); + break; + case (HW_SIO_STAT & 0x0fff): + Sio0Log.Error("%s(%08X) Unexpected SIO0 STAT 8 bit read", __FUNCTION__, addr); + break; + case (HW_SIO_MODE & 0x0fff): + Sio0Log.Error("%s(%08X) Unexpected SIO0 MODE 8 bit read", __FUNCTION__, addr); + break; + case (HW_SIO_CTRL & 0x0fff): + Sio0Log.Error("%s(%08X) Unexpected SIO0 CTRL 8 bit read", __FUNCTION__, addr); + break; + case (HW_SIO_BAUD & 0x0fff): + Sio0Log.Error("%s(%08X) Unexpected SIO0 BAUD 8 bit read", __FUNCTION__, addr); + break; // for use of serial port ignore for now //case 0x50: ret = serial_read8(); break; @@ -118,10 +132,14 @@ mem8_t iopHwRead8_Page8( u32 addr ) mem8_t ret; - if( addr == HW_SIO2_FIFO ) - ret = sio2_fifoOut();//sio2 serial data feed/fifo_out + if (addr == HW_SIO2_FIFO) + { + ret = sio2.Read(); + } else - ret = psxHu8( addr ); + { + ret = psxHu8(addr); + } IopHwTraceLog( addr, ret, true ); return ret; @@ -168,7 +186,7 @@ static __fi T _HwRead_16or32_Page1( u32 addr ) case 0x8: ret = psxCounters[cntidx].target; break; - + default: DevCon.Warning("Unknown 16bit counter read %x", addr); ret = psxHu32(addr); @@ -255,38 +273,34 @@ static __fi T _HwRead_16or32_Page1( u32 addr ) switch( masked_addr ) { // ------------------------------------------------------------------------ - mcase(HW_SIO_DATA): - ret = sioRead8(); - ret |= sioRead8() << 8; - if( sizeof(T) == 4 ) + case (HW_SIO_DATA & 0x0fff): + Console.Warning("%s(%08X) Unexpected 16 or 32 bit access to SIO0 data register!", __FUNCTION__, addr); + ret = sio0.GetRxData(); + ret |= sio0.GetRxData() << 8; + if (sizeof(T) == 4) { - ret |= sioRead8() << 16; - ret |= sioRead8() << 24; + ret |= sio0.GetRxData() << 16; + ret |= sio0.GetRxData() << 24; } - break; - - mcase(HW_SIO_STAT): - ret = sio.StatReg; - sioStatRead(); - // Console.WriteLn( "SIO0 Read STAT %02X INT_STAT= %08X IOPpc= %08X " , ret, psxHu32(0x1070), psxRegs.pc); - break; - - mcase(HW_SIO_MODE): - ret = sio.ModeReg; - if( sizeof(T) == 4 ) + break; + case (HW_SIO_STAT & 0x0fff): + ret = sio0.GetStat(); + break; + case (HW_SIO_MODE & 0x0fff): + ret = sio0.GetMode(); + + if (sizeof(T) == 4) { - // My guess on 32-bit accesses. Dunno yet what the real hardware does. --air - ret |= sio.CtrlReg << 16; + Console.Warning("%s(%08X) Unexpected 32 bit access to SIO0 MODE register!", __FUNCTION__, addr); } - break; - - mcase(HW_SIO_CTRL): - ret = sio.CtrlReg; - break; - - mcase(HW_SIO_BAUD): - ret = sio.BaudReg; - break; + + break; + case (HW_SIO_CTRL & 0x0fff): + ret = sio0.GetCtrl(); + break; + case (HW_SIO_BAUD & 0x0fff): + ret = sio0.GetBaud(); + break; // ------------------------------------------------------------------------ //Serial port stuff not support now ;P @@ -316,11 +330,11 @@ static __fi T _HwRead_16or32_Page1( u32 addr ) mcase(HW_PS1_GPU_DATA) : ret = psxGPUr(addr); break; - + mcase(HW_PS1_GPU_STATUS) : ret = psxGPUr(addr); break; - + mcase (0x1f801820): // MDEC // ret = psxHu32(addr); // old ret = mdecRead0(); @@ -328,7 +342,7 @@ static __fi T _HwRead_16or32_Page1( u32 addr ) DevCon.Warning("MDEC 1820 Read %x", ret); #endif break; - + mcase (0x1f801824): // MDEC //ret = psxHu32(addr); // old ret = mdecRead1(); @@ -421,45 +435,60 @@ mem32_t iopHwRead32_Page8( u32 addr ) if( masked_addr < 0x240 ) { const int parm = (masked_addr-0x200) / 4; - ret = sio2_getSend3( parm ); + ret = sio2.send3.at(parm); + Sio2Log.WriteLn("%s(%08X) SIO2 SEND3 Read (%08X)", __FUNCTION__, addr, ret); } else if( masked_addr < 0x260 ) { // SIO2 Send commands alternate registers. First reg maps to Send1, second // to Send2, third to Send1, etc. And the following clever code does this: - const int parm = (masked_addr-0x240) / 8; - ret = (masked_addr & 4) ? sio2_getSend2( parm ) : sio2_getSend1( parm ); + ret = (masked_addr & 4) ? sio2.send2.at(parm) : sio2.send1.at(parm); + Sio2Log.WriteLn("%s(%08X) SIO2 SEND1/2 Read (%08X)", __FUNCTION__, addr, ret); } else if( masked_addr <= 0x280 ) { switch( masked_addr ) { - mcase(HW_SIO2_CTRL): ret = sio2_getCtrl(); break; - mcase(HW_SIO2_RECV1): ret = sio2_getRecv1(); break; - mcase(HW_SIO2_RECV2): ret = sio2_getRecv2(); break; - mcase(HW_SIO2_RECV3): ret = sio2_getRecv3(); break; - mcase(0x1f808278): ret = sio2_get8278(); break; - mcase(0x1f80827C): ret = sio2_get827C(); break; - mcase(HW_SIO2_INTR): ret = sio2_getIntr(); break; - - // HW_SIO2_FIFO -- A yet unknown: Should this be ignored on 32 bit writes, or handled as a - // 4-byte FIFO input? - // The old IOP system just ignored it, so that's what we do here. I've included commented code - // for treating it as a 16/32 bit write though [which is what the SIO does, for example). - mcase(HW_SIO2_FIFO) : - //ret = sio2_fifoOut(); - //ret |= sio2_fifoOut() << 8; - //ret |= sio2_fifoOut() << 16; - //ret |= sio2_fifoOut() << 24; - //break; - DevCon.Warning("HW_SIO2_FIFO read"); + case (HW_SIO2_DATAIN & 0x0fff): ret = psxHu32(addr); - break; - + Sio2Log.Warning("%s(%08X) Unexpected 32 bit read of HW_SIO2_DATAIN (%08X)", __FUNCTION__, addr, ret); + break; + case (HW_SIO2_FIFO & 0x0fff): + ret = psxHu32(addr); + Sio2Log.Warning("%s(%08X) Unexpected 32 bit read of HW_SIO2_FIFO (%08X)", __FUNCTION__, addr, ret); + break; + case (HW_SIO2_CTRL & 0x0fff): + ret = sio2.ctrl; + Sio2Log.WriteLn("%s(%08X) SIO2 CTRL Read (%08X)", __FUNCTION__, addr, ret); + break; + case (HW_SIO2_RECV1 & 0xfff): + ret = sio2.recv1; + Sio2Log.WriteLn("%s(%08X) SIO2 RECV1 Read (%08X)", __FUNCTION__, addr, ret); + break; + case (HW_SIO2_RECV2 & 0x0fff): + ret = sio2.recv2; + Sio2Log.WriteLn("%s(%08X) SIO2 RECV2 Read (%08X)", __FUNCTION__, addr, ret); + break; + case (HW_SIO2_RECV3 & 0x0fff): + ret = sio2.recv3; + Sio2Log.WriteLn("%s(%08X) SIO2 RECV3 Read (%08X)", __FUNCTION__, addr, ret); + break; + case (0x1f808278 & 0x0fff): + ret = sio2.unknown1; + Sio2Log.WriteLn("%s(%08X) SIO2 UNK1 Read (%08X)", __FUNCTION__, addr, ret); + break; + case (0x1f80827C & 0x0fff): + ret = sio2.unknown2; + Sio2Log.WriteLn("%s(%08X) SIO2 UNK2 Read (%08X)", __FUNCTION__, addr, ret); + break; + case (HW_SIO2_INTR & 0x0fff): + ret = sio2.iStat; + Sio2Log.WriteLn("%s(%08X) SIO2 ISTAT Read (%08X)", __FUNCTION__, addr, ret); + break; default: ret = psxHu32(addr); - break; + break; } } else if( masked_addr >= pgmsk(HW_FW_START) && masked_addr <= pgmsk(HW_FW_END) ) diff --git a/pcsx2/ps2/Iop/IopHwWrite.cpp b/pcsx2/ps2/Iop/IopHwWrite.cpp index 4013f6f359..a1e0378ef8 100644 --- a/pcsx2/ps2/Iop/IopHwWrite.cpp +++ b/pcsx2/ps2/Iop/IopHwWrite.cpp @@ -23,13 +23,18 @@ #include "DEV9/DEV9.h" #include "USB/USB.h" #include "IopCounters.h" -#include "IopSio2.h" #include "IopDma.h" #include "R3000A.h" #include "ps2/pgif.h" #include "Mdec.h" +#define SIO0LOG_ENABLE 0 +#define SIO2LOG_ENABLE 0 + +#define Sio0Log if (SIO0LOG_ENABLE) DevCon +#define Sio2Log if (SIO2LOG_ENABLE) DevCon + namespace IopMemory { using namespace Internal; @@ -80,8 +85,21 @@ void iopHwWrite8_Page1( u32 addr, mem8_t val ) switch( masked_addr ) { - mcase(HW_SIO_DATA): sioWrite8( val ); break; - + case (HW_SIO_DATA & 0x0fff): + sio0.SetTxData(val); + break; + case (HW_SIO_STAT & 0x0fff): + Sio0Log.Error("%s(%08X, %08X) Unexpected SIO0 STAT 8 bit write", __FUNCTION__, addr, val); + break; + case (HW_SIO_MODE & 0x0fff): + Sio0Log.Error("%s(%08X, %08X) Unexpected SIO0 MODE 8 bit write", __FUNCTION__, addr, val); + break; + case (HW_SIO_CTRL & 0x0fff): + Sio0Log.Error("%s(%08X, %08X) Unexpected SIO0 CTRL 8 bit write", __FUNCTION__, addr, val); + break; + case (HW_SIO_BAUD & 0x0fff): + Sio0Log.Error("%s(%08X, %08X) Unexpected SIO0 BAUD 8 bit write", __FUNCTION__, addr, val); + break; // for use of serial port ignore for now //case 0x50: serial_write8( val ); break; @@ -156,10 +174,14 @@ void iopHwWrite8_Page8( u32 addr, mem8_t val ) // all addresses are assumed to be prefixed with 0x1f808xxx: pxAssert( (addr >> 12) == 0x1f808 ); - if( addr == HW_SIO2_DATAIN ) // sio2 serial data feed input - sio2_serialIn( val ); + if (addr == HW_SIO2_DATAIN) + { + sio2.Write(val); + } else - psxHu8( addr ) = val; + { + psxHu8(addr) = val; + } IopHwTraceLog( addr, val, false ); } @@ -277,39 +299,39 @@ static __fi void _HwWrite_16or32_Page1( u32 addr, T val ) switch( masked_addr ) { // ------------------------------------------------------------------------ - mcase(HW_SIO_DATA): - sioWrite8( val & 0xFF ); - sioWrite8( (val >> 8) & 0xFF ); - if( sizeof(T) == 4 ) + case (HW_SIO_DATA & 0x0fff): + Console.Error("%s(%08X, %08X) Unexpected 16 or 32 bit write to SIO0 DATA!", __FUNCTION__, addr, val); +/* + sio0.SetTxData(val & 0xFF); + sio0.SetTxData((val >> 8) & 0xFF); + + if (sizeof(T) == 4) { - // u32 gets rid of compiler warnings when using the u16 version of this template - sioWrite8( ((u32)val >> 16) & 0xFF ); - sioWrite8( ((u32)val >> 24) & 0xFF ); + sio0.SetTxData((static_cast(val) >> 16) & 0xFF); + sio0.SetTxData((static_cast(val) >> 24) & 0xFF); } - break; +*/ + break; + case (HW_SIO_STAT & 0x0fff): + Console.Error("%s(%08X, %08X) Write issued to read-only SIO0 STAT!", __FUNCTION__, addr, val); + break; + case (HW_SIO_MODE & 0x0fff): + sio0.SetMode(static_cast(val)); - mcase(HW_SIO_STAT): // read-only? - //regname = "SIO_STAT (read-only?)"; - //sio.StatReg; - break; - - mcase(HW_SIO_MODE): - sio.ModeReg = (u16)val; - if( sizeof(T) == 4 ) + if (sizeof(T) == 4) { - // My guess on 32-bit accesses. Dunno yet what the real hardware does. --air - sio.CtrlReg = (u16)((u32)val >> 16); + Console.Error("%s(%08X, %08X) 32 bit write to 16 bit SIO0 MODE register!", __FUNCTION__, addr, val); } - break; + + break; - mcase(HW_SIO_CTRL): - //sio.CtrlReg = (u16)val; - sioWriteCtrl16((u16)val); - break; - - mcase(HW_SIO_BAUD): - sio.BaudReg = (u16)val; - break; + case (HW_SIO_CTRL & 0x0fff): + sio0.SetCtrl(static_cast(val)); + break; + + case (HW_SIO_BAUD & 0x0fff): + sio0.SetBaud(static_cast(val)); + break; // ------------------------------------------------------------------------ //Serial port stuff not support now ;P @@ -352,7 +374,7 @@ static __fi void _HwWrite_16or32_Page1( u32 addr, T val ) // ------------------------------------------------------------------------ // - + mcase(0x1f801088) : // DMA0 CHCR -- MDEC IN // psx mode HW_DMA0_CHCR = val; @@ -451,9 +473,9 @@ static __fi void _HwWrite_16or32_Page1( u32 addr, T val ) else { psxDmaInterrupt(33); } - } + } break; - + mcase(0x1f8010f6): // ICR_hi (16 bit?) [dunno if it ever happens] { DevCon.Warning("High ICR Write!!"); @@ -588,26 +610,66 @@ void iopHwWrite32_Page8( u32 addr, mem32_t val ) { if( masked_addr < 0x240 ) { - const int parm = (masked_addr-0x200) / 4; - sio2_setSend3( parm, val ); + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 SEND3 Write (len = %d / %d) (port = %d)", __FUNCTION__, addr, val, (val >> 8) & Send3::COMMAND_LENGTH_MASK, (val >> 18) & Send3::COMMAND_LENGTH_MASK, val & 0x01); + const int parm = (masked_addr - 0x200) / 4; + sio2.SetSend3(parm, val); } else if( masked_addr < 0x260 ) { // SIO2 Send commands alternate registers. First reg maps to Send1, second // to Send2, third to Send1, etc. And the following clever code does this: - const int parm = (masked_addr-0x240) / 8; - if(masked_addr & 4) sio2_setSend2( parm, val ); else sio2_setSend1( parm, val ); + const int parm = (masked_addr - 0x240) / 8; + + if (masked_addr & 4) + { + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 SEND2 Write", __FUNCTION__, addr, val); + sio2.send2.at(parm) = val; + } + else + { + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 SEND1 Write", __FUNCTION__, addr, val); + sio2.send1.at(parm) = val; + } } else if( masked_addr <= 0x280 ) { switch( masked_addr ) { - mcase(HW_SIO2_CTRL): sio2_setCtrl( val ); break; - mcase(0x1f808278): sio2_set8278( val ); break; - mcase(0x1f80827C): sio2_set827C( val ); break; - mcase(HW_SIO2_INTR): sio2_setIntr( val ); break; - + case (HW_SIO2_DATAIN & 0x0fff): + Sio2Log.Warning("%s(%08X, %08X) Unexpected 32 bit write to HW_SIO2_DATAIN", __FUNCTION__, addr, val); + break; + case (HW_SIO2_FIFO & 0x0fff): + Sio2Log.Warning("%s(%08X, %08X) Unexpected 32 bit write to HW_SIO2_FIFO", __FUNCTION__, addr, val); + break; + case (HW_SIO2_CTRL & 0x0fff): + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 CTRL Write", __FUNCTION__, addr, val); + sio2.SetCtrl(val); + break; + case (HW_SIO2_RECV1 & 0x0fff): + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 RECV1 Write", __FUNCTION__, addr, val); + sio2.recv1 = val; + break; + case (HW_SIO2_RECV2 & 0x0fff): + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 RECV2 Write", __FUNCTION__, addr, val); + sio2.recv2 = val; + break; + case (HW_SIO2_RECV3 & 0x0fff): + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 RECV3 Write", __FUNCTION__, addr, val); + sio2.recv3 = val; + break; + case (HW_SIO2_8278 & 0x0fff): + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 UNK1 Write", __FUNCTION__, addr, val); + sio2.unknown1 = val; + break; + case (HW_SIO2_827C & 0x0fff): + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 UNK2 Write", __FUNCTION__, addr, val); + sio2.unknown2 = val; + break; + case (HW_SIO2_INTR & 0x0fff): + Sio2Log.WriteLn("%s(%08X, %08X) SIO2 ISTAT Write", __FUNCTION__, addr, val); + sio2.iStat = val; + break; // Other SIO2 registers are read-only, no-ops on write. default: psxHu32(addr) = val; diff --git a/pcsx2/ps2/eeHwTraceLog.inl b/pcsx2/ps2/eeHwTraceLog.inl index bb8edc5493..9b5d721734 100644 --- a/pcsx2/ps2/eeHwTraceLog.inl +++ b/pcsx2/ps2/eeHwTraceLog.inl @@ -179,14 +179,14 @@ static __ri const char* _eelog_GetHwName( u32 addr, T val ) EasyCase(fromSPR_MADR); EasyCase(fromSPR_QWC); EasyCase(fromSPR_SADR); - + EasyCase(toSPR_CHCR); EasyCase(toSPR_MADR); EasyCase(toSPR_QWC); EasyCase(toSPR_TADR); EasyCase(toSPR_SADR); - // DMAC! + // DMAC! EasyCase(DMAC_CTRL); EasyCase(DMAC_STAT); EasyCase(DMAC_PCR); @@ -288,11 +288,11 @@ static __ri void eeHwTraceLog( u32 addr, T val, bool mode ) } else if constexpr (sizeof(T) == 8) { - valStr = fmt::format("0x{:08x}.{:08x}", ((u32*)&val)[1], ((u32*)&val)[0]); + valStr = fmt::format("0x{:08x}.{:08x}", static_cast(val >> 32), static_cast(val)); } else if constexpr (sizeof(T) == 16) { - valStr = StringUtil::U128ToString((u128&)val); + valStr = StringUtil::U128ToString(r128_to_u128(val)); } static const char* temp = "%-12s @ 0x%08X/%-16s %s %s"; @@ -301,4 +301,4 @@ static __ri void eeHwTraceLog( u32 addr, T val, bool mode ) HW_LOG( temp, labelStr.c_str(), addr, regname, mode ? "->" : "<-", valStr.c_str() ); else UnknownHW_LOG( temp, labelStr.c_str(), addr, "Unknown", mode ? "->" : "<-", valStr.c_str() ); -} \ No newline at end of file +} diff --git a/pcsx2/ps2/pgif.cpp b/pcsx2/ps2/pgif.cpp index f7848e0754..ba06ce84f5 100644 --- a/pcsx2/ps2/pgif.cpp +++ b/pcsx2/ps2/pgif.cpp @@ -521,7 +521,6 @@ void fillFifoOnDrain() void drainPgpuDmaLl() { - u32 data = 0; if (!dma.state.ll_active) return; @@ -550,7 +549,7 @@ void drainPgpuDmaLl() else { //Or the beginning of a new one - data = iopMemRead32(dma.ll_dma.next_address); + u32 data = iopMemRead32(dma.ll_dma.next_address); PGPU_DMA_LOG( "Next PGPU LL DMA header= %08X ", data); dmaRegs.madr.address = data & 0x00FFFFFF; //Copy the address in MADR. dma.ll_dma.data_read_address = dma.ll_dma.next_address + 4; //start of data section of packet @@ -562,7 +561,7 @@ void drainPgpuDmaLl() else { //We are in the middle of linked list transfer - data = iopMemRead32(dma.ll_dma.data_read_address); + u32 data = iopMemRead32(dma.ll_dma.data_read_address); PGPU_DMA_LOG( "PGPU LL DMA data= %08X addr %08X ", data, dma.ll_dma.data_read_address); ringBufPut(&rb_gp0, &data); dma.ll_dma.data_read_address += 4; @@ -572,7 +571,6 @@ void drainPgpuDmaLl() void drainPgpuDmaNrToGpu() { - u32 data = 0; if (!dma.state.to_gpu_active) return; @@ -582,7 +580,7 @@ void drainPgpuDmaNrToGpu() if (dma.normal.current_word < dma.normal.total_words) { - data = iopMemRead32(dma.normal.address); + u32 data = iopMemRead32(dma.normal.address); PGPU_DMA_LOG( "To GPU Normal DMA data= %08X addr %08X ", data, dma.ll_dma.data_read_address); ringBufPut(&rb_gp0, &data); @@ -610,12 +608,12 @@ void drainPgpuDmaNrToGpu() void drainPgpuDmaNrToIop() { - u32 data = 0; if (!dma.state.to_iop_active || rb_gp0.count <= 0) return; if (dma.normal.current_word < dma.normal.total_words) { + u32 data = 0; //This is not the best way, but... is there another? ringBufGet(&rb_gp0, &data); iopMemWrite32(dma.normal.address, data); diff --git a/pcsx2/resource.h b/pcsx2/resource.h index acc54ea69f..0aa425dab3 100644 --- a/pcsx2/resource.h +++ b/pcsx2/resource.h @@ -4,7 +4,7 @@ // // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 120 diff --git a/pcsx2/sif2.cpp b/pcsx2/sif2.cpp index 1bfab1e2b5..9c512de0b9 100644 --- a/pcsx2/sif2.cpp +++ b/pcsx2/sif2.cpp @@ -39,7 +39,7 @@ __fi bool WriteFifoSingleWord() // There's some data ready to transfer into the fifo.. SIF_LOG("Write Single word to SIF2 Fifo"); - + sif2.fifo.write((u32*)&psxHu32(HW_PS1_GPU_DATA), 1); if (sif2.fifo.size > 0) psxHu32(0x1000f300) &= ~0x4000000; return true; @@ -85,7 +85,7 @@ static __fi bool WriteFifoToEE() sif2dma.madr += readSize << 4; sif2.ee.cycles += readSize; // fixme : BIAS is factored in above sif2dma.qwc -= readSize; - + return true; } @@ -96,7 +96,7 @@ static __fi bool WriteIOPtoFifo() const int writeSize = std::min(sif2.iop.counter, sif2.fifo.sif_free()); SIF_LOG("Write IOP to Fifo: +++++++++++ %lX of %lX", writeSize, sif2.iop.counter); - + sif2.fifo.write((u32*)iopPhysMem(hw_dma2.madr), writeSize); hw_dma2.madr += writeSize << 2; @@ -150,14 +150,14 @@ static __fi bool ProcessIOPTag() //sif2.iop.data = *(sifData *)iopPhysMem(hw_dma2.madr); //comment this out and replace words below // Process DMA tag at hw_dma9.tadr if (HW_DMA2_CHCR & 0x400) DevCon.Warning("First bit %x", sif2.iop.data.data); - + sif2.iop.data.words = sif2.iop.data.data >> 24; // Round up to nearest 4. // send the EE's side of the DMAtag. The tag is only 64 bits, with the upper 64 bits // ignored by the EE. - + // We're only copying the first 24 bits. Bits 30 and 31 (checked below) are Stop/IRQ bits. - + //psxHu32(HW_PS1_GPU_DATA) += 4; sif2.iop.counter = (HW_DMA2_BCR_H16 * HW_DMA2_BCR_L16); //makes it do more stuff?? //sif2words; /*if (HW_DMA2_CHCR & 0x400) @@ -217,7 +217,7 @@ static __fi void HandleEETransfer() sif2.ee.busy = false; return; } - + /*if (sif2dma.qwc == 0) if (sif2dma.chcr.MOD == NORMAL_MODE) if (!sif2.ee.end){ @@ -357,7 +357,7 @@ __fi void sif2Interrupt() SIF2Dma(); return; } - + SIF_LOG("SIF2 IOP Intr end"); HW_DMA2_CHCR &= ~0x01000000; psxDmaInterrupt2(2); @@ -383,18 +383,18 @@ __fi void dmaSIF2() psHu32(SBUS_F240) |= 0x8000; sif2.ee.busy = true; - // Okay, this here is needed currently (r3644). + // Okay, this here is needed currently (r3644). // FFX battles in the thunder plains map die otherwise, Phantasy Star 4 as well // These 2 games could be made playable again by increasing the time the EE or the IOP run, // showing that this is very timing sensible. // Doing this DMA unfortunately brings back an old warning in Legend of Legaia though, but it still works. - //Updated 23/08/2011: The hangs are caused by the EE suspending SIF1 DMA and restarting it when in the middle + //Updated 23/08/2011: The hangs are caused by the EE suspending SIF1 DMA and restarting it when in the middle //of processing a "REFE" tag, so the hangs can be solved by forcing the ee.end to be false // (as it should always be at the beginning of a DMA). using "if iop is busy" flags breaks Tom Clancy Rainbow Six. // Legend of Legaia doesn't throw a warning either :) //sif2.ee.end = false; - + SIF2Dma(); } diff --git a/pcsx2/sio_internal.h b/pcsx2/sio_internal.h deleted file mode 100644 index ce77c041cc..0000000000 --- a/pcsx2/sio_internal.h +++ /dev/null @@ -1,104 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2009 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#pragma once -#include "IopSio2.h" - -// sio_internal.h -- contains defines and structs used by sio and sio2, which -// are of little or no use to the rest of the world. - -// Status Flags -static const int - TX_RDY = 0x0001, - RX_RDY = 0x0002, - TX_EMPTY = 0x0004, - PARITY_ERR = 0x0008, - RX_OVERRUN = 0x0010, - FRAMING_ERR = 0x0020, - SYNC_DETECT = 0x0040, - DSR = 0x0080, - CTS = 0x0100, - IRQ = 0x0200; - -// Control Flags -static const int - TX_PERM = 0x0001, - DTR = 0x0002, - RX_PERM = 0x0004, - BREAK = 0x0008, - RESET_ERR = 0x0010, - RTS = 0x0020, - SIO_RESET = 0x0040; - -void inline SIO_STAT_READY() -{ - sio.StatReg &= ~TX_EMPTY; // Now the Buffer is not empty - sio.StatReg |= RX_RDY; // Transfer is Ready -} - -void inline SIO_STAT_EMPTY() -{ - sio.StatReg &= ~RX_RDY; // Receive is not Ready now? - sio.StatReg |= TX_EMPTY; // Buffer is Empty -} - -void inline DEVICE_PLUGGED() -{ - sio.ret = 0xFF; - sio2.packet.recvVal1 = 0x01100; - memset8<0xFF>(sio.buf); -} - -void inline DEVICE_UNPLUGGED() -{ - sio.ret = 0x00; - sio2.packet.recvVal1 = 0x1D100; - memset8<0x00>(sio.buf); -} - -enum SIO_MODE -{ - SIO_START = 0, - SIO_CONTROLLER, - SIO_MULTITAP, - SIO_INFRARED, - SIO_MEMCARD, - SIO_MEMCARD_AUTH, - SIO_MEMCARD_ERASE, - SIO_MEMCARD_WRITE, - SIO_MEMCARD_READ, - SIO_MEMCARD_SECTOR, - SIO_MEMCARD_PSX, - SIO_DUMMY -}; - - -#ifdef _MSC_VER -#pragma pack(1) -#endif -struct mc_command_0x26_tag{ - u8 field_151; //+02 flags - u16 sectorSize; //+03 Size of each sector(page), in bytes. - u16 eraseBlocks; //+05 Number of sectors in the erase block - u32 mcdSizeInSectors; //+07 card size in sectors (pages). - u8 mc_xor; //+0b XOR Checksum of the superblock? (minus format ident and version?) - u8 Z; //+0c terminator? Appears to be overwritten/unused. -#ifdef _MSC_VER -}; -#pragma pack() -#else -} __attribute__((packed)); -#endif - diff --git a/pcsx2/vtlb.cpp b/pcsx2/vtlb.cpp index 030f0b627c..c466712b3d 100644 --- a/pcsx2/vtlb.cpp +++ b/pcsx2/vtlb.cpp @@ -35,11 +35,20 @@ #include "COP0.h" #include "Cache.h" #include "R5900Exceptions.h" +#include "IopMem.h" +#include "common/Align.h" #include "common/MemsetFast.inl" #include "fmt/core.h" +#include +#include +#include + +#define FASTMEM_LOG(...) +//#define FASTMEM_LOG(...) Console.WriteLn(__VA_ARGS__) + using namespace R5900; using namespace vtlb_private; @@ -58,6 +67,36 @@ static vtlbHandler UnmappedVirtHandler1; static vtlbHandler UnmappedPhyHandler0; static vtlbHandler UnmappedPhyHandler1; +struct FastmemVirtualMapping +{ + u32 offset; + u32 size; +}; + +struct LoadstoreBackpatchInfo +{ + u32 guest_pc; + u32 gpr_bitmask; + u32 fpr_bitmask; + u8 code_size; + u8 address_register; + u8 data_register; + u8 size_in_bits; + bool is_signed; + bool is_load; + bool is_fpr; +}; + +static constexpr size_t FASTMEM_AREA_SIZE = 0x100000000ULL; +static constexpr u32 FASTMEM_PAGE_COUNT = FASTMEM_AREA_SIZE / VTLB_PAGE_SIZE; +static constexpr u32 NO_FASTMEM_MAPPING = 0xFFFFFFFFu; + +static std::unique_ptr s_fastmem_area; +static std::vector s_fastmem_virtual_mapping; // maps vaddr -> mainmem offset +static std::unordered_multimap s_fastmem_physical_mapping; // maps mainmem offset -> vaddr +static std::unordered_map s_fastmem_backpatch_info; +static std::unordered_set s_fastmem_faulting_pcs; + vtlb_private::VTLBPhysical vtlb_private::VTLBPhysical::fromPointer(sptr ptr) { pxAssertMsg(ptr >= 0, "Address too high"); return VTLBPhysical(ptr); @@ -82,7 +121,7 @@ __inline int CheckCache(u32 addr) { u32 mask; - if(((cpuRegs.CP0.n.Config >> 16) & 0x1) == 0) + if(((cpuRegs.CP0.n.Config >> 16) & 0x1) == 0) { //DevCon.Warning("Data Cache Disabled! %x", cpuRegs.CP0.n.Config); return false;// @@ -92,17 +131,17 @@ __inline int CheckCache(u32 addr) { if (((tlb[i].EntryLo1 & 0x38) >> 3) == 0x3) { mask = tlb[i].PageMask; - + if ((addr >= tlb[i].PFN1) && (addr <= tlb[i].PFN1 + mask)) { - //DevCon.Warning("Yay! Cache check cache addr=%x, mask=%x, addr+mask=%x, VPN2=%x PFN0=%x", addr, mask, (addr & mask), tlb[i].VPN2, tlb[i].PFN0); + //DevCon.Warning("Yay! Cache check cache addr=%x, mask=%x, addr+mask=%x, VPN2=%x PFN0=%x", addr, mask, (addr & mask), tlb[i].VPN2, tlb[i].PFN0); return true; } } if (((tlb[i].EntryLo0 & 0x38) >> 3) == 0x3) { mask = tlb[i].PageMask; - + if ((addr >= tlb[i].PFN0) && (addr <= tlb[i].PFN0 + mask)) { - //DevCon.Warning("Yay! Cache check cache addr=%x, mask=%x, addr+mask=%x, VPN2=%x PFN0=%x", addr, mask, (addr & mask), tlb[i].VPN2, tlb[i].PFN0); + //DevCon.Warning("Yay! Cache check cache addr=%x, mask=%x, addr+mask=%x, VPN2=%x PFN0=%x", addr, mask, (addr & mask), tlb[i].VPN2, tlb[i].PFN0); return true; } } @@ -122,21 +161,24 @@ DataType vtlb_memRead(u32 addr) if (!vmv.isHandler(addr)) { - if (!CHECK_EEREC) + if (!CHECK_EEREC) { - if(CHECK_CACHE && CheckCache(addr)) + if(CHECK_CACHE && CheckCache(addr)) { switch( DataSize ) { - case 8: + case 8: return readCache8(addr); break; - case 16: + case 16: return readCache16(addr); break; - case 32: + case 32: return readCache32(addr); break; + case 64: + return readCache64(addr); + break; jNO_DEFAULT; } @@ -159,6 +201,8 @@ DataType vtlb_memRead(u32 addr) return vmv.assumeHandler<16, false>()(paddr); case 32: return vmv.assumeHandler<32, false>()(paddr); + case 64: + return vmv.assumeHandler<64, false>()(paddr); jNO_DEFAULT; } @@ -166,39 +210,15 @@ DataType vtlb_memRead(u32 addr) return 0; // technically unreachable, but suppresses warnings. } -RETURNS_R64 vtlb_memRead64(u32 mem) -{ - auto vmv = vtlbdata.vmap[mem>>VTLB_PAGE_BITS]; - - if (!vmv.isHandler(mem)) - { - if (!CHECK_EEREC) { - if(CHECK_CACHE && CheckCache(mem)) - { - return readCache64(mem); - } - } - - return r64_load(reinterpret_cast(vmv.assumePtr(mem))); - } - else - { - //has to: translate, find function, call function - u32 paddr = vmv.assumeHandlerGetPAddr(mem); - //Console.WriteLn("Translated 0x%08X to 0x%08X", addr,paddr); - return vmv.assumeHandler<64, false>()(paddr); - } -} - RETURNS_R128 vtlb_memRead128(u32 mem) { auto vmv = vtlbdata.vmap[mem>>VTLB_PAGE_BITS]; if (!vmv.isHandler(mem)) { - if (!CHECK_EEREC) + if (!CHECK_EEREC) { - if(CHECK_CACHE && CheckCache(mem)) + if(CHECK_CACHE && CheckCache(mem)) { return readCache128(mem); } @@ -223,14 +243,14 @@ void vtlb_memWrite(u32 addr, DataType data) auto vmv = vtlbdata.vmap[addr>>VTLB_PAGE_BITS]; if (!vmv.isHandler(addr)) - { - if (!CHECK_EEREC) + { + if (!CHECK_EEREC) { - if(CHECK_CACHE && CheckCache(addr)) + if(CHECK_CACHE && CheckCache(addr)) { switch( DataSize ) { - case 8: + case 8: writeCache8(addr, data); return; case 16: @@ -239,6 +259,9 @@ void vtlb_memWrite(u32 addr, DataType data) case 32: writeCache32(addr, data); return; + case 64: + writeCache64(addr, data); + return; } } } @@ -254,49 +277,23 @@ void vtlb_memWrite(u32 addr, DataType data) } } -void vtlb_memWrite64(u32 mem, const mem64_t* value) -{ - auto vmv = vtlbdata.vmap[mem>>VTLB_PAGE_BITS]; - - if (!vmv.isHandler(mem)) - { - if (!CHECK_EEREC) - { - if(CHECK_CACHE && CheckCache(mem)) - { - writeCache64(mem, *value); - return; - } - } - - *(mem64_t*)vmv.assumePtr(mem) = *value; - } - else - { - //has to: translate, find function, call function - u32 paddr = vmv.assumeHandlerGetPAddr(mem); - //Console.WriteLn("Translated 0x%08X to 0x%08X", addr,paddr); - - vmv.assumeHandler<64, true>()(paddr, value); - } -} - -void vtlb_memWrite128(u32 mem, const mem128_t *value) +void TAKES_R128 vtlb_memWrite128(u32 mem, r128 value) { auto vmv = vtlbdata.vmap[mem>>VTLB_PAGE_BITS]; if (!vmv.isHandler(mem)) { - if (!CHECK_EEREC) + if (!CHECK_EEREC) { - if(CHECK_CACHE && CheckCache(mem)) + if(CHECK_CACHE && CheckCache(mem)) { - writeCache128(mem, value); + alignas(16) const u128 r = r128_to_u128(value); + writeCache128(mem, &r); return; } } - CopyQWC((void*)vmv.assumePtr(mem), value); + r128_store_unaligned((void*)vmv.assumePtr(mem), value); } else { @@ -311,9 +308,11 @@ void vtlb_memWrite128(u32 mem, const mem128_t *value) template mem8_t vtlb_memRead(u32 mem); template mem16_t vtlb_memRead(u32 mem); template mem32_t vtlb_memRead(u32 mem); +template mem64_t vtlb_memRead(u32 mem); template void vtlb_memWrite(u32 mem, mem8_t data); template void vtlb_memWrite(u32 mem, mem16_t data); template void vtlb_memWrite(u32 mem, mem32_t data); +template void vtlb_memWrite(u32 mem, mem64_t data); template bool vtlb_ramRead(u32 addr, DataType* value) @@ -482,7 +481,7 @@ template void vtlbUnmappedVWriteSm(u32 addr,OperandType data) { vtlb_Miss(addr|saddr,1); } template -void vtlbUnmappedVWriteLg(u32 addr,const OperandType* data) { vtlb_Miss(addr|saddr,1); } +void __vectorcall vtlbUnmappedVWriteLg(u32 addr,u_to_r data) { vtlb_Miss(addr|saddr,1); } template OperandType vtlbUnmappedPReadSm(u32 addr) { vtlb_BusError(addr|saddr,0); return 0; } @@ -494,7 +493,7 @@ template void vtlbUnmappedPWriteSm(u32 addr,OperandType data) { vtlb_BusError(addr|saddr,1); } template -void vtlbUnmappedPWriteLg(u32 addr,const OperandType* data) { vtlb_BusError(addr|saddr,1); } +void __vectorcall vtlbUnmappedPWriteLg(u32 addr,u_to_r data) { vtlb_BusError(addr|saddr,1); } // -------------------------------------------------------------------------------------- // VTLB mapping errors @@ -521,13 +520,13 @@ static mem32_t vtlbDefaultPhyRead32(u32 addr) return 0; } -static __m128i __vectorcall vtlbDefaultPhyRead64(u32 addr) +static mem64_t vtlbDefaultPhyRead64(u32 addr) { pxFailDev(fmt::format("(VTLB) Attempted read64 from unmapped physical address @ 0x{:08X}.", addr).c_str()); - return r64_zero(); + return 0; } -static __m128i __vectorcall vtlbDefaultPhyRead128(u32 addr) +static RETURNS_R128 vtlbDefaultPhyRead128(u32 addr) { pxFailDev(fmt::format("(VTLB) Attempted read128 from unmapped physical address @ 0x{:08X}.", addr).c_str()); return r128_zero(); @@ -548,18 +547,18 @@ static void vtlbDefaultPhyWrite32(u32 addr, mem32_t data) pxFailDev(fmt::format("(VTLB) Attempted write32 to unmapped physical address @ 0x{:08X}.", addr).c_str()); } -static void vtlbDefaultPhyWrite64(u32 addr,const mem64_t* data) +static void vtlbDefaultPhyWrite64(u32 addr,mem64_t data) { pxFailDev(fmt::format("(VTLB) Attempted write64 to unmapped physical address @ 0x{:08X}.", addr).c_str()); } -static void vtlbDefaultPhyWrite128(u32 addr,const mem128_t* data) +static void TAKES_R128 vtlbDefaultPhyWrite128(u32 addr,r128 data) { pxFailDev(fmt::format("(VTLB) Attempted write128 to unmapped physical address @ 0x{:08X}.", addr).c_str()); } // =========================================================================================== -// VTLB Public API -- Init/Term/RegisterHandler stuff +// VTLB Public API -- Init/Term/RegisterHandler stuff // =========================================================================================== // @@ -697,6 +696,341 @@ __fi u32 vtlb_V2P(u32 vaddr) return paddr; } +static constexpr bool vtlb_MismatchedHostPageSize() +{ + return (__pagesize != VTLB_PAGE_SIZE); +} + +static bool vtlb_IsHostAligned(u32 paddr) +{ + if constexpr (!vtlb_MismatchedHostPageSize()) + return true; + + return ((paddr & __pagemask) == 0); +} + +static u32 vtlb_HostPage(u32 page) +{ + if constexpr (!vtlb_MismatchedHostPageSize()) + return page; + + return page >> (__pageshift - VTLB_PAGE_BITS); +} + +static u32 vtlb_HostAlignOffset(u32 offset) +{ + if constexpr (!vtlb_MismatchedHostPageSize()) + return offset; + + return offset & ~__pagemask; +} + +static bool vtlb_IsHostCoalesced(u32 page) +{ + if constexpr (__pagesize == VTLB_PAGE_SIZE) + { + return true; + } + else + { + static constexpr u32 shift = __pageshift - VTLB_PAGE_BITS; + static constexpr u32 count = (1u << shift); + static constexpr u32 mask = count - 1; + + const u32 base = page & ~mask; + const u32 base_offset = s_fastmem_virtual_mapping[base]; + if ((base_offset & __pagemask) != 0) + return false; + + for (u32 i = 0, expected_offset = base_offset; i < count; i++, expected_offset += VTLB_PAGE_SIZE) + { + if (s_fastmem_virtual_mapping[base + i] != expected_offset) + return false; + } + + return true; + } +} + +static bool vtlb_GetMainMemoryOffsetFromPtr(uptr ptr, u32* mainmem_offset, u32* mainmem_size, PageProtectionMode* prot) +{ + const uptr page_end = ptr + VTLB_PAGE_SIZE; + SysMainMemory& vmmem = GetVmMemory(); + + // EE memory and ROMs. + if (ptr >= (uptr)eeMem->Main && page_end <= (uptr)eeMem->ZeroRead) + { + const u32 eemem_offset = static_cast(ptr - (uptr)eeMem->Main); + const bool writeable = ((eemem_offset < Ps2MemSize::MainRam) ? (mmap_GetRamPageInfo(eemem_offset) != ProtMode_Write) : true); + *mainmem_offset = (eemem_offset + HostMemoryMap::EEmemOffset); + *mainmem_size = (offsetof(EEVM_MemoryAllocMess, ZeroRead) - eemem_offset); + *prot = PageProtectionMode().Read().Write(writeable); + return true; + } + + // IOP memory. + if (ptr >= (uptr)iopMem->Main && page_end <= (uptr)iopMem->P) + { + const u32 iopmem_offset = static_cast(ptr - (uptr)iopMem->Main); + *mainmem_offset = iopmem_offset + HostMemoryMap::IOPmemOffset; + *mainmem_size = (offsetof(IopVM_MemoryAllocMess, P) - iopmem_offset); + *prot = PageProtectionMode().Read().Write(); + return true; + } + + // VU memory - this includes both data and code for VU0/VU1. + // Practically speaking, this is only data, because the code goes through a handler. + if (ptr >= (uptr)vmmem.VUMemory().GetPtr() && page_end <= (uptr)vmmem.VUMemory().GetPtrEnd()) + { + const u32 vumem_offset = static_cast(ptr - (uptr)vmmem.VUMemory().GetPtr()); + *mainmem_offset = vumem_offset + HostMemoryMap::VUmemOffset; + *mainmem_size = vmmem.VUMemory().GetSize() - vumem_offset; + *prot = PageProtectionMode().Read().Write(); + return true; + } + + // We end up with some unknown mappings here; currently the IOP memory, instead of being physically mapped + // as 2MB, ends up being mapped as 8MB. But this shouldn't be virtual mapped anyway, so fallback to slowmem + // in such cases. + return false; +} + +static bool vtlb_GetMainMemoryOffset(u32 paddr, u32* mainmem_offset, u32* mainmem_size, PageProtectionMode* prot) +{ + if (paddr >= VTLB_PMAP_SZ) + return false; + + // Handlers aren't in our shared memory, obviously. + const VTLBPhysical& vm = vtlbdata.pmap[paddr >> VTLB_PAGE_BITS]; + if (vm.isHandler()) + return false; + + return vtlb_GetMainMemoryOffsetFromPtr(vm.raw(), mainmem_offset, mainmem_size, prot); +} + +static void vtlb_CreateFastmemMapping(u32 vaddr, u32 mainmem_offset, const PageProtectionMode& mode) +{ + FASTMEM_LOG("Create fastmem mapping @ vaddr %08X mainmem %08X", vaddr, mainmem_offset); + + const u32 page = vaddr / VTLB_PAGE_SIZE; + + if (s_fastmem_virtual_mapping[page] == mainmem_offset) + { + // current mapping is fine + return; + } + + if (s_fastmem_virtual_mapping[page] != NO_FASTMEM_MAPPING) + { + // current mapping needs to be removed + const bool was_coalesced = vtlb_IsHostCoalesced(page); + + s_fastmem_virtual_mapping[page] = NO_FASTMEM_MAPPING; + if (was_coalesced && !s_fastmem_area->Unmap(s_fastmem_area->PagePointer(vtlb_HostPage(page)), __pagesize)) + Console.Error("Failed to unmap vaddr %08X", vaddr); + + // remove reverse mapping + auto range = s_fastmem_physical_mapping.equal_range(mainmem_offset); + for (auto it = range.first; it != range.second; ) + { + auto this_it = it++; + if (this_it->second == vaddr) + s_fastmem_physical_mapping.erase(this_it); + } + } + + s_fastmem_virtual_mapping[page] = mainmem_offset; + if (vtlb_IsHostCoalesced(page)) + { + const u32 host_page = vtlb_HostPage(page); + const u32 host_offset = vtlb_HostAlignOffset(mainmem_offset); + + if (!s_fastmem_area->Map(GetVmMemory().MainMemory()->GetFileHandle(), host_offset, + s_fastmem_area->PagePointer(host_page), __pagesize, mode)) + { + Console.Error("Failed to map vaddr %08X to mainmem offset %08X", vtlb_HostAlignOffset(vaddr), host_offset); + s_fastmem_virtual_mapping[page] = NO_FASTMEM_MAPPING; + return; + } + } + + s_fastmem_physical_mapping.emplace(mainmem_offset, vaddr); +} + +static void vtlb_RemoveFastmemMapping(u32 vaddr) +{ + const u32 page = vaddr / VTLB_PAGE_SIZE; + if (s_fastmem_virtual_mapping[page] == NO_FASTMEM_MAPPING) + return; + + const u32 mainmem_offset = s_fastmem_virtual_mapping[page]; + const bool was_coalesced = vtlb_IsHostCoalesced(page); + FASTMEM_LOG("Remove fastmem mapping @ vaddr %08X mainmem %08X", vaddr, mainmem_offset); + s_fastmem_virtual_mapping[page] = NO_FASTMEM_MAPPING; + + if (was_coalesced && !s_fastmem_area->Unmap(s_fastmem_area->PagePointer(vtlb_HostPage(page)), __pagesize)) + Console.Error("Failed to unmap vaddr %08X", vtlb_HostAlignOffset(vaddr)); + + // remove from reverse map + auto range = s_fastmem_physical_mapping.equal_range(mainmem_offset); + for (auto it = range.first; it != range.second;) + { + auto this_it = it++; + if (this_it->second == vaddr) + s_fastmem_physical_mapping.erase(this_it); + } +} + +static void vtlb_RemoveFastmemMappings(u32 vaddr, u32 size) +{ + pxAssert((vaddr & VTLB_PAGE_MASK) == 0); + pxAssert(size > 0 && (size & VTLB_PAGE_MASK) == 0); + + const u32 num_pages = size / VTLB_PAGE_SIZE; + for (u32 i = 0; i < num_pages; i++, vaddr += VTLB_PAGE_SIZE) + vtlb_RemoveFastmemMapping(vaddr); +} + +static void vtlb_RemoveFastmemMappings() +{ + if (s_fastmem_virtual_mapping.empty()) + { + // not initialized yet + return; + } + + for (u32 page = 0; page < FASTMEM_PAGE_COUNT; page++) + { + if (s_fastmem_virtual_mapping[page] == NO_FASTMEM_MAPPING) + continue; + + s_fastmem_virtual_mapping[page] = NO_FASTMEM_MAPPING; + + if (!vtlb_IsHostAligned(page << VTLB_PAGE_BITS)) + continue; + + if (!s_fastmem_area->Unmap(s_fastmem_area->PagePointer(vtlb_HostPage(page)), __pagesize)) + Console.Error("Failed to unmap vaddr %08X", page * __pagesize); + } + + s_fastmem_physical_mapping.clear(); +} + +bool vtlb_ResolveFastmemMapping(uptr* addr) +{ + uptr uaddr = *addr; + uptr fastmem_start = (uptr)vtlbdata.fastmem_base; + uptr fastmem_end = fastmem_start + 0xFFFFFFFFu; + if (uaddr < fastmem_start || uaddr > fastmem_end) + return false; + + const u32 vaddr = static_cast(uaddr - fastmem_start); + FASTMEM_LOG("Trying to resolve %p (vaddr %08X)", (void*)uaddr, vaddr); + + const u32 vpage = vaddr / VTLB_PAGE_SIZE; + if (s_fastmem_virtual_mapping[vpage] == NO_FASTMEM_MAPPING) + { + FASTMEM_LOG("%08X is not virtual mapped", vaddr); + return false; + } + + const u32 mainmem_offset = s_fastmem_virtual_mapping[vpage] + (vaddr & VTLB_PAGE_MASK); + FASTMEM_LOG("Resolved %p (vaddr %08X) to mainmem offset %08X", uaddr, vaddr, mainmem_offset); + *addr = ((uptr)GetVmMemory().MainMemory()->GetBase()) + mainmem_offset; + return true; +} + +bool vtlb_GetGuestAddress(uptr host_addr, u32* guest_addr) +{ + uptr fastmem_start = (uptr)vtlbdata.fastmem_base; + uptr fastmem_end = fastmem_start + 0xFFFFFFFFu; + if (host_addr < fastmem_start || host_addr > fastmem_end) + return false; + + *guest_addr = static_cast(host_addr - fastmem_start); + return true; +} + +void vtlb_UpdateFastmemProtection(u32 paddr, u32 size, const PageProtectionMode& prot) +{ + if (!CHECK_FASTMEM) + return; + + pxAssert((paddr & VTLB_PAGE_MASK) == 0); + pxAssert(size > 0 && (size & VTLB_PAGE_MASK) == 0); + + u32 mainmem_start, mainmem_size; + PageProtectionMode old_prot; + if (!vtlb_GetMainMemoryOffset(paddr, &mainmem_start, &mainmem_size, &old_prot)) + return; + + FASTMEM_LOG("UpdateFastmemProtection %08X mmoffset %08X %08X", paddr, mainmem_start, size); + + u32 current_mainmem = mainmem_start; + const u32 num_pages = std::min(size, mainmem_size) / VTLB_PAGE_SIZE; + for (u32 i = 0; i < num_pages; i++, current_mainmem += VTLB_PAGE_SIZE) + { + // update virtual mapping mapping + auto range = s_fastmem_physical_mapping.equal_range(current_mainmem); + for (auto it = range.first; it != range.second; ++it) + { + FASTMEM_LOG(" valias %08X (size %u)", it->second, VTLB_PAGE_SIZE); + + if (vtlb_IsHostAligned(it->second)) + HostSys::MemProtect(s_fastmem_area->OffsetPointer(it->second), __pagesize, prot); + } + } +} + +void vtlb_ClearLoadStoreInfo() +{ + s_fastmem_backpatch_info.clear(); + s_fastmem_faulting_pcs.clear(); +} + +void vtlb_AddLoadStoreInfo(uptr code_address, u32 code_size, u32 guest_pc, u32 gpr_bitmask, u32 fpr_bitmask, u8 address_register, u8 data_register, u8 size_in_bits, bool is_signed, bool is_load, bool is_fpr) +{ + pxAssert(code_size < std::numeric_limits::max()); + + auto iter = s_fastmem_backpatch_info.find(code_address); + if (iter != s_fastmem_backpatch_info.end()) + s_fastmem_backpatch_info.erase(iter); + + LoadstoreBackpatchInfo info{guest_pc, gpr_bitmask, fpr_bitmask, static_cast(code_size), address_register, data_register, size_in_bits, is_signed, is_load, is_fpr}; + s_fastmem_backpatch_info.emplace(code_address, info); +} + +bool vtlb_BackpatchLoadStore(uptr code_address, uptr fault_address) +{ + uptr fastmem_start = (uptr)vtlbdata.fastmem_base; + uptr fastmem_end = fastmem_start + 0xFFFFFFFFu; + if (fault_address < fastmem_start || fault_address > fastmem_end) + return false; + + auto iter = s_fastmem_backpatch_info.find(code_address); + if (iter == s_fastmem_backpatch_info.end()) + return false; + + const LoadstoreBackpatchInfo& info = iter->second; + const u32 guest_addr = static_cast(fault_address - fastmem_start); + vtlb_DynBackpatchLoadStore(code_address, info.code_size, info.guest_pc, guest_addr, + info.gpr_bitmask, info.fpr_bitmask, info.address_register, info.data_register, + info.size_in_bits, info.is_signed, info.is_load, info.is_fpr); + + // queue block for recompilation later + Cpu->Clear(info.guest_pc, 1); + + // and store the pc in the faulting list, so that we don't emit another fastmem loadstore + s_fastmem_faulting_pcs.insert(info.guest_pc); + s_fastmem_backpatch_info.erase(iter); + return true; +} + +bool vtlb_IsFaultingPC(u32 guest_pc) +{ + return (s_fastmem_faulting_pcs.find(guest_pc) != s_fastmem_faulting_pcs.end()); +} + //virtual mappings //TODO: Add invalid paddr checks void vtlb_VMap(u32 vaddr,u32 paddr,u32 size) @@ -705,6 +1039,23 @@ void vtlb_VMap(u32 vaddr,u32 paddr,u32 size) verify(0==(paddr&VTLB_PAGE_MASK)); verify(0==(size&VTLB_PAGE_MASK) && size>0); + if (CHECK_FASTMEM) + { + const u32 num_pages = size / VTLB_PAGE_SIZE; + u32 current_vaddr = vaddr; + u32 current_paddr = paddr; + + for (u32 i = 0; i < num_pages; i++, current_vaddr += VTLB_PAGE_SIZE, current_paddr += VTLB_PAGE_SIZE) + { + u32 hoffset, hsize; + PageProtectionMode mode; + if (vtlb_GetMainMemoryOffset(current_paddr, &hoffset, &hsize, &mode)) + vtlb_CreateFastmemMapping(current_vaddr, hoffset, mode); + else + vtlb_RemoveFastmemMapping(current_vaddr); + } + } + while (size > 0) { VTLBVirtual vmv; @@ -734,6 +1085,22 @@ void vtlb_VMapBuffer(u32 vaddr,void* buffer,u32 size) verify(0==(vaddr&VTLB_PAGE_MASK)); verify(0==(size&VTLB_PAGE_MASK) && size>0); + if (CHECK_FASTMEM) + { + if (buffer == eeMem->Scratch && size == Ps2MemSize::Scratch) + { + u32 fm_vaddr = vaddr; + u32 fm_hostoffset = HostMemoryMap::EEmemOffset + offsetof(EEVM_MemoryAllocMess, Scratch); + PageProtectionMode mode = PageProtectionMode().Read().Write(); + for (u32 i = 0; i < (Ps2MemSize::Scratch / VTLB_PAGE_SIZE); i++, fm_vaddr += VTLB_PAGE_SIZE, fm_hostoffset += VTLB_PAGE_SIZE) + vtlb_CreateFastmemMapping(fm_vaddr, fm_hostoffset, mode); + } + else + { + vtlb_RemoveFastmemMappings(vaddr, size); + } + } + uptr bu8 = (uptr)buffer; while (size > 0) { @@ -749,6 +1116,8 @@ void vtlb_VMapUnmap(u32 vaddr,u32 size) verify(0==(vaddr&VTLB_PAGE_MASK)); verify(0==(size&VTLB_PAGE_MASK) && size>0); + vtlb_RemoveFastmemMappings(vaddr, size); + while (size > 0) { @@ -773,9 +1142,9 @@ void vtlb_Init() #define VTLB_BuildUnmappedHandler(baseName, highBit) \ baseName##ReadSm, baseName##ReadSm, baseName##ReadSm, \ - baseName##ReadLg, baseName##ReadLg, \ + baseName##ReadSm, baseName##ReadLg, \ baseName##WriteSm, baseName##WriteSm, baseName##WriteSm, \ - baseName##WriteLg, baseName##WriteLg + baseName##WriteSm, baseName##WriteLg //Register default handlers //Unmapped Virt handlers _MUST_ be registered first. @@ -813,12 +1182,45 @@ void vtlb_Init() // This function should probably be part of the COP0 rather than here in VTLB. void vtlb_Reset() { - for(int i=0; i<48; i++) UnmapTLB(i); + vtlb_RemoveFastmemMappings(); + for(int i=0; i<48; i++) UnmapTLB(tlb[i], i); } -void vtlb_Term() +void vtlb_Shutdown() { - //nothing to do for now + vtlb_RemoveFastmemMappings(); + s_fastmem_backpatch_info.clear(); + s_fastmem_faulting_pcs.clear(); +} + +void vtlb_ResetFastmem() +{ + DevCon.WriteLn("Resetting fastmem mappings..."); + + vtlb_RemoveFastmemMappings(); + s_fastmem_backpatch_info.clear(); + s_fastmem_faulting_pcs.clear(); + + if (!CHECK_FASTMEM || !CHECK_EEREC || !vtlbdata.vmap) + return; + + // we need to go through and look at the vtlb pointers, to remap the host area + for (size_t i = 0; i < VTLB_VMAP_ITEMS; i++) + { + const VTLBVirtual& vm = vtlbdata.vmap[i]; + const u32 vaddr = static_cast(i) << VTLB_PAGE_BITS; + if (vm.isHandler(vaddr)) + { + // Handlers should be unmapped. + continue; + } + + // Check if it's a physical mapping to our main memory area. + u32 mainmem_offset, mainmem_size; + PageProtectionMode prot; + if (vtlb_GetMainMemoryOffsetFromPtr(vm.assumePtr(vaddr), &mainmem_offset, &mainmem_size, &prot)) + vtlb_CreateFastmemMapping(vaddr, mainmem_offset, prot); + } } static constexpr size_t VMAP_SIZE = sizeof(VTLBVirtual) * VTLB_VMAP_ITEMS; @@ -832,17 +1234,29 @@ void vtlb_Core_Alloc() // Can't return regions to the bump allocator static VTLBVirtual* vmap = nullptr; if (!vmap) + { vmap = (VTLBVirtual*)GetVmMemory().BumpAllocator().Alloc(VMAP_SIZE); + if (!vmap) + pxFailRel("Failed to allocate vtlb vmap"); + } + if (!vtlbdata.vmap) { - bool okay = HostSys::MmapCommitPtr(vmap, VMAP_SIZE, PageProtectionMode().Read().Write()); - if (okay) { - vtlbdata.vmap = vmap; - } else { - throw Exception::OutOfMemory( "VTLB Virtual Address Translation LUT" ) - .SetDiagMsg(fmt::format("({} megs)", VTLB_VMAP_ITEMS * sizeof(*vtlbdata.vmap) / _1mb) - ); - } + HostSys::MemProtect(vmap, VMAP_SIZE, PageProtectionMode().Read().Write()); + vtlbdata.vmap = vmap; + } + + if (!vtlbdata.fastmem_base) + { + pxAssert(!s_fastmem_area); + s_fastmem_area = SharedMemoryMappingArea::Create(FASTMEM_AREA_SIZE); + if (!s_fastmem_area) + pxFailRel("Failed to allocate fastmem area"); + + s_fastmem_virtual_mapping.resize(FASTMEM_PAGE_COUNT, NO_FASTMEM_MAPPING); + vtlbdata.fastmem_base = (uptr)s_fastmem_area->BasePointer(); + Console.WriteLn(Color_StrongGreen, "Fastmem area: %p - %p", + vtlbdata.fastmem_base, vtlbdata.fastmem_base + (FASTMEM_AREA_SIZE - 1)); } } @@ -860,12 +1274,8 @@ void vtlb_Alloc_Ppmap() if (!ppmap) ppmap = (u32*)GetVmMemory().BumpAllocator().Alloc(PPMAP_SIZE); - bool okay = HostSys::MmapCommitPtr(ppmap, PPMAP_SIZE, PageProtectionMode().Read().Write()); - if (okay) - vtlbdata.ppmap = ppmap; - else - throw Exception::OutOfMemory("VTLB PS2 Virtual Address Translation LUT") - .SetDiagMsg(fmt::format("({} megs)", PPMAP_SIZE / _1mb)); + HostSys::MemProtect(ppmap, PPMAP_SIZE, PageProtectionMode().Read().Write()); + vtlbdata.ppmap = ppmap; // By default a 1:1 virtual to physical mapping for (u32 i = 0; i < VTLB_VMAP_ITEMS; i++) @@ -876,14 +1286,22 @@ void vtlb_Core_Free() { if (vtlbdata.vmap) { - HostSys::MmapResetPtr(vtlbdata.vmap, VMAP_SIZE); + HostSys::MemProtect(vtlbdata.vmap, VMAP_SIZE, PageProtectionMode()); vtlbdata.vmap = nullptr; } if (vtlbdata.ppmap) { - HostSys::MmapResetPtr(vtlbdata.ppmap, PPMAP_SIZE); + HostSys::MemProtect(vtlbdata.ppmap, PPMAP_SIZE, PageProtectionMode()); vtlbdata.ppmap = nullptr; } + + vtlb_RemoveFastmemMappings(); + vtlb_ClearLoadStoreInfo(); + + vtlbdata.fastmem_base = 0; + decltype(s_fastmem_physical_mapping)().swap(s_fastmem_physical_mapping); + decltype(s_fastmem_virtual_mapping)().swap(s_fastmem_virtual_mapping); + s_fastmem_area.reset(); } static std::string GetHostVmErrorMsg() @@ -893,45 +1311,28 @@ static std::string GetHostVmErrorMsg() // -------------------------------------------------------------------------------------- // VtlbMemoryReserve (implementations) // -------------------------------------------------------------------------------------- -VtlbMemoryReserve::VtlbMemoryReserve( std::string name, size_t size ) - : m_reserve( std::move(name), size ) +VtlbMemoryReserve::VtlbMemoryReserve(std::string name) + : VirtualMemoryReserve(std::move(name)) { - m_reserve.SetPageAccessOnCommit( PageAccess_ReadWrite() ); } -void VtlbMemoryReserve::Reserve( VirtualMemoryManagerPtr allocator, sptr offset ) +void VtlbMemoryReserve::Assign(VirtualMemoryManagerPtr allocator, size_t offset, size_t size) { - if (!m_reserve.Reserve( std::move(allocator), offset )) - { - throw Exception::OutOfMemory( m_reserve.GetName() ) - .SetDiagMsg("Vtlb memory could not be reserved.") - .SetUserMsg(GetHostVmErrorMsg()); - } -} + // Anything passed to the memory allocator must be page aligned. + size = Common::PageAlign(size); -void VtlbMemoryReserve::Commit() -{ - if (IsCommitted()) return; - if (!m_reserve.Commit()) + // Since the memory has already been allocated as part of the main memory map, this should never fail. + u8* base = allocator->Alloc(offset, size); + if (!base) { - throw Exception::OutOfMemory( m_reserve.GetName() ) - .SetDiagMsg("Vtlb memory could not be committed.") - .SetUserMsg(GetHostVmErrorMsg()); + Console.WriteLn("(VtlbMemoryReserve) Failed to allocate %zu bytes for %s at offset %zu", size, m_name.c_str(), offset); + pxFailRel("VtlbMemoryReserve allocation failed."); } + + VirtualMemoryReserve::Assign(std::move(allocator), base, size); } void VtlbMemoryReserve::Reset() { - Commit(); - memzero_sse_a(m_reserve.GetPtr(), m_reserve.GetCommittedBytes()); -} - -void VtlbMemoryReserve::Decommit() -{ - m_reserve.Reset(); -} - -bool VtlbMemoryReserve::IsCommitted() const -{ - return !!m_reserve.GetCommittedPageCount(); + memzero_sse_a(GetPtr(), GetSize()); } diff --git a/pcsx2/vtlb.h b/pcsx2/vtlb.h index 1b4c72890b..475d546c93 100644 --- a/pcsx2/vtlb.h +++ b/pcsx2/vtlb.h @@ -26,15 +26,15 @@ static const uptr VTLB_AllocUpperBounds = _1gb * 2; typedef mem8_t vtlbMemR8FP(u32 addr); typedef mem16_t vtlbMemR16FP(u32 addr); typedef mem32_t vtlbMemR32FP(u32 addr); -typedef RETURNS_R64 vtlbMemR64FP(u32 addr); +typedef mem64_t vtlbMemR64FP(u32 addr); typedef RETURNS_R128 vtlbMemR128FP(u32 addr); // Specialized function pointers for each write type typedef void vtlbMemW8FP(u32 addr,mem8_t data); typedef void vtlbMemW16FP(u32 addr,mem16_t data); typedef void vtlbMemW32FP(u32 addr,mem32_t data); -typedef void vtlbMemW64FP(u32 addr,const mem64_t* data); -typedef void vtlbMemW128FP(u32 addr,const mem128_t* data); +typedef void vtlbMemW64FP(u32 addr,mem64_t data); +typedef void TAKES_R128 vtlbMemW128FP(u32 addr,r128 data); template struct vtlbMemFP; @@ -55,9 +55,9 @@ extern void vtlb_Core_Alloc(); extern void vtlb_Core_Free(); extern void vtlb_Alloc_Ppmap(); extern void vtlb_Init(); +extern void vtlb_Shutdown(); extern void vtlb_Reset(); -extern void vtlb_Term(); - +extern void vtlb_ResetFastmem(); extern vtlbHandler vtlb_NewHandler(); @@ -83,18 +83,25 @@ extern void vtlb_DynV2P(); extern void vtlb_VMap(u32 vaddr,u32 paddr,u32 sz); extern void vtlb_VMapBuffer(u32 vaddr,void* buffer,u32 sz); extern void vtlb_VMapUnmap(u32 vaddr,u32 sz); +extern bool vtlb_ResolveFastmemMapping(uptr* addr); +extern bool vtlb_GetGuestAddress(uptr host_addr, u32* guest_addr); +extern void vtlb_UpdateFastmemProtection(u32 paddr, u32 size, const PageProtectionMode& prot); +extern bool vtlb_BackpatchLoadStore(uptr code_address, uptr fault_address); + +extern void vtlb_ClearLoadStoreInfo(); +extern void vtlb_AddLoadStoreInfo(uptr code_address, u32 code_size, u32 guest_pc, u32 gpr_bitmask, u32 fpr_bitmask, u8 address_register, u8 data_register, u8 size_in_bits, bool is_signed, bool is_load, bool is_fpr); +extern void vtlb_DynBackpatchLoadStore(uptr code_address, u32 code_size, u32 guest_pc, u32 guest_addr, u32 gpr_bitmask, u32 fpr_bitmask, u8 address_register, u8 data_register, u8 size_in_bits, bool is_signed, bool is_load, bool is_fpr); +extern bool vtlb_IsFaultingPC(u32 guest_pc); //Memory functions template< typename DataType > extern DataType vtlb_memRead(u32 mem); -extern RETURNS_R64 vtlb_memRead64(u32 mem); extern RETURNS_R128 vtlb_memRead128(u32 mem); template< typename DataType > extern void vtlb_memWrite(u32 mem, DataType value); -extern void vtlb_memWrite64(u32 mem, const mem64_t* value); -extern void vtlb_memWrite128(u32 mem, const mem128_t* value); +extern void TAKES_R128 vtlb_memWrite128(u32 mem, r128 value); // "Safe" variants of vtlb, designed for external tools. // These routines only access the various RAM, and will not call handlers @@ -104,32 +111,26 @@ extern DataType vtlb_ramRead(u32 mem); template extern bool vtlb_ramWrite(u32 mem, const DataType& value); -extern void vtlb_DynGenWrite(u32 sz); -extern void vtlb_DynGenRead32(u32 bits, bool sign); -extern int vtlb_DynGenRead64(u32 sz, int gpr); +using vtlb_ReadRegAllocCallback = int(*)(); +extern int vtlb_DynGenReadNonQuad(u32 bits, bool sign, bool xmm, int addr_reg, vtlb_ReadRegAllocCallback dest_reg_alloc = nullptr); +extern int vtlb_DynGenReadNonQuad_Const(u32 bits, bool sign, bool xmm, u32 addr_const, vtlb_ReadRegAllocCallback dest_reg_alloc = nullptr); +extern int vtlb_DynGenReadQuad(u32 bits, int addr_reg, vtlb_ReadRegAllocCallback dest_reg_alloc = nullptr); +extern int vtlb_DynGenReadQuad_Const(u32 bits, u32 addr_const, vtlb_ReadRegAllocCallback dest_reg_alloc = nullptr); -extern void vtlb_DynGenWrite_Const( u32 bits, u32 addr_const ); -extern int vtlb_DynGenRead64_Const( u32 bits, u32 addr_const, int gpr ); -extern void vtlb_DynGenRead32_Const( u32 bits, bool sign, u32 addr_const ); +extern void vtlb_DynGenWrite(u32 sz, bool xmm, int addr_reg, int value_reg); +extern void vtlb_DynGenWrite_Const(u32 bits, bool xmm, u32 addr_const, int value_reg); // -------------------------------------------------------------------------------------- // VtlbMemoryReserve // -------------------------------------------------------------------------------------- -class VtlbMemoryReserve +class VtlbMemoryReserve : public VirtualMemoryReserve { -protected: - VirtualMemoryReserve m_reserve; - public: - VtlbMemoryReserve( std::string name, size_t size ); + VtlbMemoryReserve(std::string name); - void Reserve( VirtualMemoryManagerPtr allocator, sptr offset ); + void Assign(VirtualMemoryManagerPtr allocator, size_t offset, size_t size); - virtual void Commit(); virtual void Reset(); - virtual void Decommit(); - - bool IsCommitted() const; }; // -------------------------------------------------------------------------------------- @@ -143,9 +144,9 @@ public: eeMemoryReserve(); ~eeMemoryReserve(); - void Reserve(VirtualMemoryManagerPtr allocator); - void Commit() override; - void Decommit() override; + void Assign(VirtualMemoryManagerPtr allocator); + void Release(); + void Reset() override; }; @@ -158,10 +159,11 @@ class iopMemoryReserve : public VtlbMemoryReserve public: iopMemoryReserve(); + ~iopMemoryReserve(); + + void Assign(VirtualMemoryManagerPtr allocator); + void Release(); - void Reserve(VirtualMemoryManagerPtr allocator); - void Commit() override; - void Decommit() override; void Reset() override; }; @@ -176,7 +178,8 @@ public: vuMemoryReserve(); ~vuMemoryReserve(); - void Reserve(VirtualMemoryManagerPtr allocator); + void Assign(VirtualMemoryManagerPtr allocator); + void Release(); void Reset() override; }; @@ -261,10 +264,13 @@ namespace vtlb_private u32* ppmap; //4MB (allocated by vtlb_init) // PS2 virtual to PS2 physical + uptr fastmem_base; + MapData() { vmap = NULL; ppmap = NULL; + fastmem_base = 0; } }; diff --git a/pcsx2/windows/AppIcon.ico b/pcsx2/windows/AppIcon.ico index 5a7a7a5f80..90aeddb8fa 100644 Binary files a/pcsx2/windows/AppIcon.ico and b/pcsx2/windows/AppIcon.ico differ diff --git a/pcsx2/windows/FlatFileReaderWindows.cpp b/pcsx2/windows/FlatFileReaderWindows.cpp index dd38441e9b..5e45e656ae 100644 --- a/pcsx2/windows/FlatFileReaderWindows.cpp +++ b/pcsx2/windows/FlatFileReaderWindows.cpp @@ -72,7 +72,7 @@ void FlatFileReader::BeginRead(void* pBuffer, uint sector, uint count) { LARGE_INTEGER offset; offset.QuadPart = sector * (s64)m_blocksize + m_dataoffset; - + DWORD bytesToRead = count * m_blocksize; ZeroMemory(&asyncOperationContext, sizeof(asyncOperationContext)); @@ -87,7 +87,7 @@ void FlatFileReader::BeginRead(void* pBuffer, uint sector, uint count) int FlatFileReader::FinishRead(void) { DWORD bytes; - + if(!GetOverlappedResult(hOverlappedFile, &asyncOperationContext, &bytes, TRUE)) { asyncInProgress = false; diff --git a/pcsx2/windows/VCprojects/IopSif.cpp b/pcsx2/windows/VCprojects/IopSif.cpp deleted file mode 100644 index 2917b091a9..0000000000 --- a/pcsx2/windows/VCprojects/IopSif.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2010 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" - -#include "Common.h" -#include "Sif.h" - -#if FALSE - -const u32 fifoSize = 0x1000; // in bytes - -s32 PrepareEEWrite() -{ - - return 0; -} - -s32 PrepareEERead() -{ - alignas(16) static u32 tag[4]; - - // Process DMA tag at hw_dma9.tadr - sif0.iop.data = *(sifData *)iopPhysMem(hw_dma9.tadr); - sif0.iop.data.words = (sif0.iop.data.words + 3) & 0xfffffffc; // Round up to nearest 4. - memcpy(tag, (u32*)iopPhysMem(hw_dma9.tadr + 8), 16); - - hw_dma9.tadr += 16; ///hw_dma9.madr + 16 + sif0.sifData.words << 2; - - // We're only copying the first 24 bits. - hw_dma9.madr = sif0data & 0xFFFFFF; - sif0.iop.counter = sif0words; - - if (sif0tag.IRQ || (sif0tag.ID & 4)) sif0.iop.end = true; - SIF_LOG("SIF0 IOP to EE Tag: madr=%lx, tadr=%lx, counter=%lx (%08X_%08X)" - "\n\tread tag: %x %x %x %x", hw_dma9.madr, hw_dma9.tadr, sif0.iop.counter, sif0words, sif0data, - tag[0], tag[1], tag[2], tag[3]); - - sif0ch.unsafeTransfer(((tDMA_TAG*)(tag))); - sif0ch.madr = tag[1]; - tDMA_TAG ptag(tag[0]); - - SIF_LOG("SIF0 EE dest chain tag madr:%08X qwc:%04X id:%X irq:%d(%08X_%08X)", - sif0ch.madr, sif0ch.qwc, ptag.ID, ptag.IRQ, tag[1], tag[0]); - - if (sif0ch.chcr.TIE && ptag.IRQ) - { - //Console.WriteLn("SIF0 TIE"); - sif0.ee.end = true; - } - - switch (ptag.ID) - { - case TAG_REFE: - sif0.ee.end = true; - if (dmacRegs.ctrl.STS != NO_STS) - dmacRegs.stadr.ADDR = sif0ch.madr + (sif0ch.qwc * 16); - break; - - case TAG_REFS: - if (dmacRegs.ctrl.STS != NO_STS) - dmacRegs.stadr.ADDR = sif0ch.madr + (sif0ch.qwc * 16); - break; - - case TAG_END: - sif0.ee.end = true; - break; - } - return true; -} - -void FinalizeEERead() -{ - SIF_LOG("Sif0: End EE"); - sif0.ee.end = false; - sif0.ee.busy = false; - SIF_LOG("CPU INT FIRED SIF0"); - CPU_INT(DMAC_SIF0, 16); -} - -s32 DoSIFWrite(u32 iopAvailable) -{ - u32 eeAvailable = PrepareEEWrite(); - -} - -s32 DoSifRead(u32 iopAvailable) -{ - u32 eeAvailable = PrepareEERead(); - - u32 transferSizeBytes = std::min(std::min(iopAvailable,eeAvailable),fifoSize); - u32 transferSizeWords = transferSizeBytes >> 2; - u32 transferSizeQWords = transferSizeBytes >> 4; - - SIF_LOG("Write IOP to EE: +++++++++++ %lX of %lX", transferSizeWords, sif0.iop.counter); - - tDMA_TAG *ptag = sif0ch.getAddr(sif0ch.madr, DMAC_SIF0, true); - if (ptag == NULL) - { - DevCon.Warning("Write IOP to EE: ptag == NULL"); - return false; - } - - memcpy((u32*)ptag, (u32*)iopPhysMem(hw_dma9.madr), transferSizeBytes); - - // Clearing handled by vtlb memory protection and manual blocks. - //Cpu->Clear(sif0ch.madr, readSize*4); - - sif0ch.madr += transferSizeBytes; - sif0.ee.cycles += transferSizeQWords * 2; - sif0ch.qwc -= transferSizeQWords; - - return transferSizeBytes; -} - -s32 CALLBACK sif0DmaRead (s32 channel, u32* data, u32 bytesLeft, u32* bytesProcessed) -{ - s32 processed = DoSIFWrite(bytesLeft); - - if(processed>0) - { - bytesLeft -= processed; - if(bytesLeft == 0) - FinalizeEERead(); - - *bytesProcessed = processed; - return 0; - } - - - *bytesProcessed=0; - return -processed; -} - -s32 CALLBACK sif0DmaWrite (s32 channel, u32* data, u32 bytesLeft, u32* bytesProcessed) -{ - DevCon.Warning("SIF0 Dma Write to iop?!"); - *bytesProcessed=0; return 0; -} - -void CALLBACK sif0DmaInterrupt (s32 channel) -{ - -} - -s32 CALLBACK sif1DmaRead (s32 channel, u32* data, u32 bytesLeft, u32* bytesProcessed) -{ - DevCon.Warning("SIF1 Dma Read from iop?!"); - *bytesProcessed=0; return 0; -} - -s32 CALLBACK sif1DmaWrite (s32 channel, u32* data, u32 bytesLeft, u32* bytesProcessed) -{ - *bytesProcessed=0; - return 0; -} - -void CALLBACK sif1DmaInterrupt (s32 channel) -{ - -} - -#endif diff --git a/pcsx2/windows/wxResources.rc b/pcsx2/windows/wxResources.rc index 95f3240124..fb94eae351 100644 --- a/pcsx2/windows/wxResources.rc +++ b/pcsx2/windows/wxResources.rc @@ -27,18 +27,18 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "resource.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#include ""afxresmw.h""\r\n" "\0" END -3 TEXTINCLUDE +3 TEXTINCLUDE BEGIN "\r\n" "\0" diff --git a/pcsx2/x86/R5900_Profiler.h b/pcsx2/x86/R5900_Profiler.h index e3f10dd63e..37310cc746 100644 --- a/pcsx2/x86/R5900_Profiler.h +++ b/pcsx2/x86/R5900_Profiler.h @@ -203,7 +203,7 @@ static const char eeOpcodeName[][16] = { // "COP1" "MFC1" , /* , */ "CFC1" , /* , */ "MTC1" , /* , */ "CTC1" , /* , */ - + // "COP1 BC1" "BC1F" , "BC1T" , "BC1FL" , "BC1TL" , /* , */ /* , */ /* , */ /* , */ diff --git a/pcsx2/x86/iCOP0.cpp b/pcsx2/x86/iCOP0.cpp index bdf015b633..51707e4e5a 100644 --- a/pcsx2/x86/iCOP0.cpp +++ b/pcsx2/x86/iCOP0.cpp @@ -44,7 +44,7 @@ namespace COP0 { // this should be a conditional Jump -- JZ or JNZ normally. static void _setupBranchTest() { - _eeFlushAllUnused(); + _eeFlushAllDirty(); // COP0 branch conditionals are based on the following equation: // (((psHu16(DMAC_STAT) | ~psHu16(DMAC_PCR)) & 0x3ff) == 0x3ff) @@ -64,26 +64,32 @@ static void _setupBranchTest() void recBC0F() { + const u32 branchTo = ((s32)_Imm_ * 4) + pc; + const bool swap = TrySwapDelaySlot(0, 0, 0, false); _setupBranchTest(); - recDoBranchImm(JE32(0)); + recDoBranchImm(branchTo, JE32(0), false, swap); } void recBC0T() { + const u32 branchTo = ((s32)_Imm_ * 4) + pc; + const bool swap = TrySwapDelaySlot(0, 0, 0, false); _setupBranchTest(); - recDoBranchImm(JNE32(0)); + recDoBranchImm(branchTo, JNE32(0), false, swap); } void recBC0FL() { + const u32 branchTo = ((s32)_Imm_ * 4) + pc; _setupBranchTest(); - recDoBranchImm_Likely(JE32(0)); + recDoBranchImm(branchTo, JE32(0), true, false); } void recBC0TL() { + const u32 branchTo = ((s32)_Imm_ * 4) + pc; _setupBranchTest(); - recDoBranchImm_Likely(JNE32(0)); + recDoBranchImm(branchTo, JNE32(0), true, false); } void recTLBR() { recCall(Interp::TLBR); } @@ -118,7 +124,7 @@ void recDI() // Jak X, Namco 50th anniversary, Spongebob the Movie, Spongebob Battle for Bikini Bottom, // The Incredibles, The Incredibles rize of the underminer, Soukou kihei armodyne, Garfield Saving Arlene, Tales of Fandom Vol. 2. if (!g_recompilingDelaySlot) - recompileNextInstruction(0); // DI execution is delayed by one instruction + recompileNextInstruction(false, false); // DI execution is delayed by one instruction xMOV(eax, ptr[&cpuRegs.CP0.n.Status]); xTEST(eax, 0x20006); // EXL | ERL | EDI @@ -146,19 +152,18 @@ void recMFC0() // This case needs to be handled even if the write-back is ignored (_Rt_ == 0 ) xMOV(ecx, ptr[&cpuRegs.cycle]); xMOV(eax, ecx); - xSUB(eax, ptr[&s_iLastCOP0Cycle]); + xSUB(eax, ptr[&cpuRegs.lastCOP0Cycle]); u8* skipInc = JNZ8(0); xINC(eax); x86SetJ8(skipInc); xADD(ptr[&cpuRegs.CP0.n.Count], eax); - xMOV(ptr[&s_iLastCOP0Cycle], ecx); - xMOV(eax, ptr[&cpuRegs.CP0.r[_Rd_]]); + xMOV(ptr[&cpuRegs.lastCOP0Cycle], ecx); if (!_Rt_) return; - _deleteEEreg(_Rt_, 0); - eeSignExtendTo(_Rt_); + const int regt = _Rt_ ? _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE) : -1; + xMOVSX(xRegister64(regt), ptr32[&cpuRegs.CP0.r[_Rd_]]); return; } @@ -169,22 +174,25 @@ void recMFC0() { if (0 == (_Imm_ & 1)) // MFPS, register value ignored { - xMOV(eax, ptr[&cpuRegs.PERF.n.pccr]); + const int regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); + xMOVSX(xRegister64(regt), ptr32[&cpuRegs.PERF.n.pccr]); } else if (0 == (_Imm_ & 2)) // MFPC 0, only LSB of register matters { iFlushCall(FLUSH_INTERPRETER); xFastCall((void*)COP0_UpdatePCCR); - xMOV(eax, ptr[&cpuRegs.PERF.n.pcr0]); + + const int regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); + xMOVSX(xRegister64(regt), ptr32[&cpuRegs.PERF.n.pcr0]); } else // MFPC 1 { iFlushCall(FLUSH_INTERPRETER); xFastCall((void*)COP0_UpdatePCCR); - xMOV(eax, ptr[&cpuRegs.PERF.n.pcr1]); + + const int regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); + xMOVSX(xRegister64(regt), ptr32[&cpuRegs.PERF.n.pcr1]); } - _deleteEEreg(_Rt_, 0); - eeSignExtendTo(_Rt_); return; } @@ -193,10 +201,9 @@ void recMFC0() COP0_LOG("MFC0 Breakpoint debug Registers code = %x\n", cpuRegs.code & 0x3FF); return; } - _eeOnWriteReg(_Rt_, 1); - _deleteEEreg(_Rt_, 0); - xMOV(eax, ptr[&cpuRegs.CP0.r[_Rd_]]); - eeSignExtendTo(_Rt_); + + const int regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); + xMOVSX(xRegister64(regt), ptr32[&cpuRegs.CP0.r[_Rd_]]); } void recMTC0() @@ -217,7 +224,7 @@ void recMTC0() case 9: xMOV(ecx, ptr[&cpuRegs.cycle]); - xMOV(ptr[&s_iLastCOP0Cycle], ecx); + xMOV(ptr[&cpuRegs.lastCOP0Cycle], ecx); xMOV(ptr32[&cpuRegs.CP0.r[9]], g_cpuConstRegs[_Rt_].UL[0]); break; @@ -236,13 +243,13 @@ void recMTC0() { xMOV(eax, ptr[&cpuRegs.cycle]); xMOV(ptr32[&cpuRegs.PERF.n.pcr0], g_cpuConstRegs[_Rt_].UL[0]); - xMOV(ptr[&s_iLastPERFCycle[0]], eax); + xMOV(ptr[&cpuRegs.lastPERFCycle[0]], eax); } else // MTPC 1 { xMOV(eax, ptr[&cpuRegs.cycle]); xMOV(ptr32[&cpuRegs.PERF.n.pcr1], g_cpuConstRegs[_Rt_].UL[0]); - xMOV(ptr[&s_iLastPERFCycle[1]], eax); + xMOV(ptr[&cpuRegs.lastPERFCycle[1]], eax); } break; @@ -260,21 +267,21 @@ void recMTC0() switch (_Rd_) { case 12: + _eeMoveGPRtoR(arg1reg, _Rt_); iFlushCall(FLUSH_INTERPRETER); - _eeMoveGPRtoR(ecx, _Rt_); - xFastCall((void*)WriteCP0Status, ecx); + xFastCall((void*)WriteCP0Status); break; case 16: + _eeMoveGPRtoR(arg1reg, _Rt_); iFlushCall(FLUSH_INTERPRETER); - _eeMoveGPRtoR(ecx, _Rt_); - xFastCall((void*)WriteCP0Config, ecx); + xFastCall((void*)WriteCP0Config); break; case 9: xMOV(ecx, ptr[&cpuRegs.cycle]); _eeMoveGPRtoM((uptr)&cpuRegs.CP0.r[9], _Rt_); - xMOV(ptr[&s_iLastCOP0Cycle], ecx); + xMOV(ptr[&cpuRegs.lastCOP0Cycle], ecx); break; case 25: @@ -291,13 +298,13 @@ void recMTC0() { xMOV(ecx, ptr[&cpuRegs.cycle]); _eeMoveGPRtoM((uptr)&cpuRegs.PERF.n.pcr0, _Rt_); - xMOV(ptr[&s_iLastPERFCycle[0]], ecx); + xMOV(ptr[&cpuRegs.lastPERFCycle[0]], ecx); } else // MTPC 1 { xMOV(ecx, ptr[&cpuRegs.cycle]); _eeMoveGPRtoM((uptr)&cpuRegs.PERF.n.pcr1, _Rt_); - xMOV(ptr[&s_iLastPERFCycle[1]], ecx); + xMOV(ptr[&cpuRegs.lastPERFCycle[1]], ecx); } break; diff --git a/pcsx2/x86/iCore.cpp b/pcsx2/x86/iCore.cpp index 38e5ff1e2a..c9e7d79450 100644 --- a/pcsx2/x86/iCore.cpp +++ b/pcsx2/x86/iCore.cpp @@ -32,116 +32,64 @@ u16 g_xmmAllocCounter = 0; EEINST* g_pCurInstInfo = NULL; -// used to make sure regs don't get changed while in recompiler -// use FreezeXMMRegs -u32 g_recWriteback = 0; - _xmmregs xmmregs[iREGCNT_XMM], s_saveXMMregs[iREGCNT_XMM]; // X86 caching _x86regs x86regs[iREGCNT_GPR], s_saveX86regs[iREGCNT_GPR]; -// XMM Caching -#define VU_VFx_ADDR(x) (uptr)&VU->VF[x].UL[0] -#define VU_ACCx_ADDR (uptr)&VU->ACC.UL[0] - - -alignas(16) u32 xmmBackup[iREGCNT_XMM][4]; - -alignas(16) u64 gprBackup[iREGCNT_GPR]; - -static int s_xmmchecknext = 0; - -void _backupNeededXMM() -{ - for (size_t i = 0; i < iREGCNT_XMM; i++) - { - if (xmmregs[i].inuse) - { - xMOVAPS(ptr128[&xmmBackup[i][0]], xRegisterSSE(i)); - } - } -} - -void _restoreNeededXMM() -{ - for (size_t i = 0; i < iREGCNT_XMM; i++) - { - if (xmmregs[i].inuse) - { - xMOVAPS(xRegisterSSE(i), ptr128[&xmmBackup[i][0]]); - } - } -} - -void _backupNeededx86() -{ - for (size_t i = 0; i < iREGCNT_GPR; i++) - { - if (x86regs[i].inuse) - { - xMOV(ptr64[&gprBackup[i]], xRegister64(i)); - } - } -} - -void _restoreNeededx86() -{ - for (size_t i = 0; i < iREGCNT_GPR; i++) - { - if (x86regs[i].inuse) - { - xMOV(xRegister64(i), ptr64[&gprBackup[i]]); - } - } -} - -void _cop2BackupRegs() -{ - _backupNeededx86(); - _backupNeededXMM(); -} - -void _cop2RestoreRegs() -{ - _restoreNeededx86(); - _restoreNeededXMM(); -} // Clear current register mapping structure // Clear allocation counter void _initXMMregs() { memzero(xmmregs); g_xmmAllocCounter = 0; - s_xmmchecknext = 0; } -// Get a pointer to the physical register (GPR / FPU / VU etc..) -__fi void* _XMMGetAddr(int type, int reg, VURegs* VU) +bool _isAllocatableX86reg(int x86reg) { - switch (type) + // we use rax, rcx and rdx as scratch (they have special purposes...) + if (x86reg <= 2) + return false; + + // We keep the first two argument registers free. + // On windows, this is ecx/edx, and it's taken care of above, but on Linux, it uses rsi/rdi. + // The issue is when we do a load/store, the address register overlaps a cached register. + // TODO(Stenzek): Rework loadstores to handle this and allow caching. + if (x86reg == arg1reg.GetId() || x86reg == arg2reg.GetId()) + return false; + + // arg3reg is also used for dispatching without fastmem + if (!CHECK_FASTMEM && x86reg == arg3reg.GetId()) + return false; + + // rbp is used as the fastmem base + if (CHECK_FASTMEM && x86reg == 5) + return false; + +#ifdef ENABLE_VTUNE + // vtune needs ebp... + if (!CHECK_FASTMEM && x86reg == 5) + return false; +#endif + + // rsp is never allocatable.. + if (x86reg == 4) + return false; + + return true; +} + +bool _hasX86reg(int type, int reg, int required_mode /*= 0*/) +{ + for (uint i = 0; i < iREGCNT_GPR; i++) { - case XMMTYPE_VFREG: - return (void*)VU_VFx_ADDR(reg); - - case XMMTYPE_ACC: - return (void*)VU_ACCx_ADDR; - - case XMMTYPE_GPRREG: - if (reg < 32) - pxAssert(!(g_cpuHasConstReg & (1 << reg)) || (g_cpuFlushedConstReg & (1 << reg))); - return &cpuRegs.GPR.r[reg].UL[0]; - - case XMMTYPE_FPREG: - return &fpuRegs.fpr[reg]; - - case XMMTYPE_FPACC: - return &fpuRegs.ACC.f; - - jNO_DEFAULT + if (x86regs[i].inuse && x86regs[i].type == type && x86regs[i].reg == reg) + { + return ((x86regs[i].mode & required_mode) == required_mode); + } } - return NULL; + return false; } // Get the index of a free register @@ -152,70 +100,79 @@ __fi void* _XMMGetAddr(int type, int reg, VURegs* VU) // // Note: I don't understand why we don't check register that aren't useful anymore // (i.e EEINST_USED is cleared) -int _getFreeXMMreg() +int _getFreeXMMreg(u32 maxreg) { int i, tempi; u32 bestcount = 0x10000; - for (i = 0; (uint)i < iREGCNT_XMM; i++) + // check for free registers + for (i = 0; (uint)i < maxreg; i++) { - if (xmmregs[(i + s_xmmchecknext) % iREGCNT_XMM].inuse == 0) - { - int ret = (s_xmmchecknext + i) % iREGCNT_XMM; - s_xmmchecknext = (s_xmmchecknext + i + 1) % iREGCNT_XMM; - return ret; - } + if (!xmmregs[i].inuse) + return i; } // check for dead regs - for (i = 0; (uint)i < iREGCNT_XMM; i++) - { - if (xmmregs[i].needed) - continue; - if (xmmregs[i].type == XMMTYPE_GPRREG) - { - if (!(EEINST_ISLIVEXMM(xmmregs[i].reg))) - { - _freeXMMreg(i); - return i; - } - } - } - - // check for future xmm usage - for (i = 0; (uint)i < iREGCNT_XMM; i++) - { - if (xmmregs[i].needed) - continue; - if (xmmregs[i].type == XMMTYPE_GPRREG) - { - if (!(g_pCurInstInfo->regs[xmmregs[i].reg] & EEINST_XMM)) - { - _freeXMMreg(i); - return i; - } - } - } - tempi = -1; bestcount = 0xffff; - for (i = 0; (uint)i < iREGCNT_XMM; i++) + for (i = 0; (uint)i < maxreg; i++) { + pxAssert(xmmregs[i].inuse); if (xmmregs[i].needed) continue; - if (xmmregs[i].type != XMMTYPE_TEMP) + + // temps should be needed + pxAssert(xmmregs[i].type != XMMTYPE_TEMP); + + if (xmmregs[i].counter < bestcount) { - - if (xmmregs[i].counter < bestcount) + switch (xmmregs[i].type) { - tempi = i; - bestcount = xmmregs[i].counter; - } - continue; - } + case XMMTYPE_GPRREG: + { + if (EEINST_USEDTEST(xmmregs[i].reg)) + continue; + } + break; - _freeXMMreg(i); - return i; + case XMMTYPE_FPREG: + { + if (FPUINST_USEDTEST(xmmregs[i].reg)) + continue; + } + break; + + case XMMTYPE_VFREG: + { + if (COP2INST_USEDTEST(xmmregs[i].reg)) + continue; + } + break; + } + + tempi = i; + bestcount = xmmregs[i].counter; + } + } + if (tempi != -1) + { + _freeXMMreg(tempi); + return tempi; + } + + // lastly, try without the used check + bestcount = 0xffff; + for (i = 0; (uint)i < maxreg; i++) + { + pxAssert(xmmregs[i].inuse); + if (xmmregs[i].needed) + continue; + + if (xmmregs[i].counter < bestcount) + { + tempi = i; + bestcount = xmmregs[i].counter; + } } if (tempi != -1) @@ -224,32 +181,19 @@ int _getFreeXMMreg() return tempi; } - pxFailDev("*PCSX2*: XMM Reg Allocation Error in _getFreeXMMreg()!"); - throw Exception::FailedToAllocateRegister(); + pxFailRel("*PCSX2*: XMM Reg Allocation Error in _getFreeXMMreg()!"); + return -1; } // Reserve a XMM register for temporary operation. -int _allocTempXMMreg(XMMSSEType type, int xmmreg) +int _allocTempXMMreg(XMMSSEType type) { - if (xmmreg == -1) - xmmreg = _getFreeXMMreg(); - else - _freeXMMreg(xmmreg); - - if (xmmreg == -1) - { - pxFailDev("*PCSX2*: XMM Reg Allocation Error in _allocTempXMMreg()!"); - throw Exception::FailedToAllocateRegister(); - } - else - { - xmmregs[xmmreg].inuse = 1; - xmmregs[xmmreg].type = XMMTYPE_TEMP; - xmmregs[xmmreg].needed = 1; - xmmregs[xmmreg].counter = g_xmmAllocCounter++; - g_xmmtypes[xmmreg] = type; - } - + const int xmmreg = _getFreeXMMreg(); + xmmregs[xmmreg].inuse = 1; + xmmregs[xmmreg].type = XMMTYPE_TEMP; + xmmregs[xmmreg].needed = 1; + xmmregs[xmmreg].counter = g_xmmAllocCounter++; + g_xmmtypes[xmmreg] = type; return xmmreg; } @@ -265,23 +209,19 @@ int _checkXMMreg(int type, int reg, int mode) { if (xmmregs[i].inuse && (xmmregs[i].type == (type & 0xff)) && (xmmregs[i].reg == reg)) { + // shouldn't have dirty constants... + pxAssert(type != XMMTYPE_GPRREG || !GPR_IS_DIRTY_CONST(reg)); - if (!(xmmregs[i].mode & MODE_READ)) + if (type == XMMTYPE_GPRREG && !(xmmregs[i].mode & (MODE_READ | MODE_WRITE)) && (mode & MODE_READ)) + pxFailRel("Somehow ended up with an allocated xmm without mode"); + + if (type == XMMTYPE_GPRREG && (mode & MODE_WRITE)) { - if (mode & MODE_READ) - { - xMOVDQA(xRegisterSSE(i), ptr[_XMMGetAddr(xmmregs[i].type, xmmregs[i].reg, xmmregs[i].VU ? &VU1 : &VU0)]); - } - else if (mode & MODE_READHALF) - { - if (g_xmmtypes[i] == XMMT_INT) - xMOVQZX(xRegisterSSE(i), ptr[(void*)(uptr)_XMMGetAddr(xmmregs[i].type, xmmregs[i].reg, xmmregs[i].VU ? &VU1 : &VU0)]); - else - xMOVL.PS(xRegisterSSE(i), ptr[(void*)(uptr)_XMMGetAddr(xmmregs[i].type, xmmregs[i].reg, xmmregs[i].VU ? &VU1 : &VU0)]); - } + // go through the alloc path instead, because we might need to invalidate a gpr. + return _allocGPRtoXMMreg(reg, mode); } - xmmregs[i].mode |= mode & ~MODE_READHALF; + xmmregs[i].mode |= mode; xmmregs[i].counter = g_xmmAllocCounter++; // update counter xmmregs[i].needed = 1; return i; @@ -291,6 +231,19 @@ int _checkXMMreg(int type, int reg, int mode) return -1; } +bool _hasXMMreg(int type, int reg, int required_mode /*= 0*/) +{ + for (uint i = 0; i < iREGCNT_XMM; i++) + { + if (xmmregs[i].inuse && xmmregs[i].type == type && xmmregs[i].reg == reg) + { + return ((xmmregs[i].mode & required_mode) == required_mode); + } + } + + return false; +} + // Fully allocate a FPU register // first trial: // search an already reserved reg then populate it if we read it @@ -298,7 +251,7 @@ int _checkXMMreg(int type, int reg, int mode) // reserve a new reg, then populate it if we read it // // Note: FPU are always in XMM register -int _allocFPtoXMMreg(int xmmreg, int fpreg, int mode) +int _allocFPtoXMMreg(int fpreg, int mode) { for (size_t i = 0; i < iREGCNT_XMM; i++) { @@ -322,24 +275,15 @@ int _allocFPtoXMMreg(int xmmreg, int fpreg, int mode) return i; } - if (xmmreg == -1) - xmmreg = _getFreeXMMreg(); + const int xmmreg = _getFreeXMMreg(); - if (xmmreg == -1) - { - pxFailDev("*PCSX2*: XMM Reg Allocation Error in _allocFPtoXMMreg()!"); - throw Exception::FailedToAllocateRegister(); - } - else - { - g_xmmtypes[xmmreg] = XMMT_FPS; - xmmregs[xmmreg].inuse = 1; - xmmregs[xmmreg].type = XMMTYPE_FPREG; - xmmregs[xmmreg].reg = fpreg; - xmmregs[xmmreg].mode = mode; - xmmregs[xmmreg].needed = 1; - xmmregs[xmmreg].counter = g_xmmAllocCounter++; - } + g_xmmtypes[xmmreg] = XMMT_FPS; + xmmregs[xmmreg].inuse = 1; + xmmregs[xmmreg].type = XMMTYPE_FPREG; + xmmregs[xmmreg].reg = fpreg; + xmmregs[xmmreg].mode = mode; + xmmregs[xmmreg].needed = 1; + xmmregs[xmmreg].counter = g_xmmAllocCounter++; if (mode & MODE_READ) xMOVSSZX(xRegisterSSE(xmmreg), ptr[&fpuRegs.fpr[fpreg].f]); @@ -347,74 +291,60 @@ int _allocFPtoXMMreg(int xmmreg, int fpreg, int mode) return xmmreg; } -// In short try to allocate a GPR register. Code is an uterly mess -// due to XMM/MMX/X86 crazyness ! -int _allocGPRtoXMMreg(int xmmreg, int gprreg, int mode) +static const char* GetModeString(int mode) { - for (size_t i = 0; i < iREGCNT_XMM; i++) + return ((mode & MODE_READ)) ? ((mode & MODE_WRITE) ? "readwrite" : "read") : "write"; +} + +int _allocGPRtoXMMreg(int gprreg, int mode) +{ + // is this already in a gpr? + const int hostx86reg = _checkX86reg(X86TYPE_GPR, gprreg, MODE_READ); + + for (u32 i = 0; i < iREGCNT_XMM; i++) { - if (xmmregs[i].inuse == 0) - continue; - if (xmmregs[i].type != XMMTYPE_GPRREG) - continue; - if (xmmregs[i].reg != gprreg) + if (!xmmregs[i].inuse || xmmregs[i].type != XMMTYPE_GPRREG || xmmregs[i].reg != gprreg) continue; - g_xmmtypes[i] = XMMT_INT; + if (!(xmmregs[i].mode & (MODE_READ | MODE_WRITE)) && (mode & MODE_READ)) + pxFailRel("Somehow ended up with an allocated register without mode"); - if (!(xmmregs[i].mode & MODE_READ) && (mode & MODE_READ)) + if (mode & MODE_WRITE && hostx86reg >= 0) { - if (gprreg == 0) - { - xPXOR(xRegisterSSE(i), xRegisterSSE(i)); - } - else - { - //pxAssert( !(g_cpuHasConstReg & (1<= 0) + { + // x86 register should be up to date, because if it was written, it should've been invalidated + pxAssert(!(x86regs[hostx86reg].mode & MODE_WRITE)); + _freeX86regWithoutWriteback(hostx86reg); + } } xmmregs[i].counter = g_xmmAllocCounter++; // update counter - xmmregs[i].needed = 1; + xmmregs[i].needed = true; xmmregs[i].mode |= mode; return i; } - // currently only gpr regs are const - // fixme - do we really need to execute this both here and in the loop? - if ((mode & MODE_WRITE) && gprreg < 32) - { - //pxAssert( !(g_cpuHasConstReg & (1<= 0) + { + RALOG("Invalidating guest reg %d in GPR %d due to constant value write to XMM %d\n", gprreg, hostx86reg, xmmreg); + x86regs[hostx86reg].inuse = 0; + } + } + else if (hostx86reg >= 0) + { + RALOG("Copying (for guest reg %d) host GPR %d to XMM %d\n", gprreg, hostx86reg, xmmreg); + + // load lower+upper, replace lower if dirty + xMOVDQA(xRegisterSSE(xmmreg), ptr128[&cpuRegs.GPR.r[gprreg].UQ]); + + // if the gpr was written to (dirty), we need to invalidate it + if (x86regs[hostx86reg].mode & MODE_WRITE) + { + RALOG("Moving dirty guest reg %d from GPR %d to XMM %d\n", gprreg, hostx86reg, xmmreg); + xPINSR.Q(xRegisterSSE(xmmreg), xRegister64(hostx86reg), 0); + _freeX86regWithoutWriteback(hostx86reg); + xmmregs[xmmreg].mode |= MODE_WRITE; + } + } + else + { + // not loaded + RALOG("Loading guest reg %d to host FPR %d\n", gprreg, xmmreg); + xMOVDQA(xRegisterSSE(xmmreg), ptr128[&cpuRegs.GPR.r[gprreg].UQ]); + } } } + if (mode & MODE_WRITE && gprreg < 32 && GPR_IS_CONST1(gprreg)) + { + RALOG("Clearing constant value for guest GPR reg %d on XMM alloc\n", gprreg); + GPR_DEL_CONST(gprreg); + } + if (mode & MODE_WRITE && hostx86reg >= 0) + { + RALOG("Invalidating cached guest GPR reg %d in host reg GPR %d due to XMM transition\n", gprreg, hostx86reg); + _freeX86regWithoutWriteback(hostx86reg); + } + return xmmreg; } // Same code as _allocFPtoXMMreg but for the FPU ACC register // (seriously boy you could have factorized it) -int _allocFPACCtoXMMreg(int xmmreg, int mode) +int _allocFPACCtoXMMreg(int mode) { for (size_t i = 0; i < iREGCNT_XMM; i++) { @@ -459,24 +435,15 @@ int _allocFPACCtoXMMreg(int xmmreg, int mode) return i; } - if (xmmreg == -1) - xmmreg = _getFreeXMMreg(); + const int xmmreg = _getFreeXMMreg(); - if (xmmreg == -1) - { - pxFailDev("*PCSX2*: XMM Reg Allocation Error in _allocFPACCtoXMMreg()!"); - throw Exception::FailedToAllocateRegister(); - } - else - { - g_xmmtypes[xmmreg] = XMMT_FPS; - xmmregs[xmmreg].inuse = 1; - xmmregs[xmmreg].type = XMMTYPE_FPACC; - xmmregs[xmmreg].mode = mode; - xmmregs[xmmreg].needed = 1; - xmmregs[xmmreg].reg = 0; - xmmregs[xmmreg].counter = g_xmmAllocCounter++; - } + g_xmmtypes[xmmreg] = XMMT_FPS; + xmmregs[xmmreg].inuse = 1; + xmmregs[xmmreg].type = XMMTYPE_FPACC; + xmmregs[xmmreg].mode = mode; + xmmregs[xmmreg].needed = 1; + xmmregs[xmmreg].reg = 0; + xmmregs[xmmreg].counter = g_xmmAllocCounter++; if (mode & MODE_READ) { @@ -486,11 +453,59 @@ int _allocFPACCtoXMMreg(int xmmreg, int mode) return xmmreg; } +void _reallocateXMMreg(int xmmreg, int newtype, int newreg, int newmode, bool writeback /*= true*/) +{ + pxAssert(xmmreg >= 0 && xmmreg <= static_cast(iREGCNT_XMM)); + _xmmregs& xr = xmmregs[xmmreg]; + if (writeback) + _freeXMMreg(xmmreg); + + xr.inuse = true; + xr.type = newtype; + xr.reg = newreg; + xr.mode = newmode; + xr.needed = true; +} + // Mark reserved GPR reg as needed. It won't be evicted anymore. // You must use _clearNeededXMMregs to clear the flag +void _addNeededGPRtoX86reg(int gprreg) +{ + for (uint i = 0; i < iREGCNT_GPR; i++) + { + if (x86regs[i].inuse == 0) + continue; + if (x86regs[i].type != X86TYPE_GPR) + continue; + if (x86regs[i].reg != gprreg) + continue; + + x86regs[i].counter = g_x86AllocCounter++; // update counter + x86regs[i].needed = 1; + break; + } +} + +void _addNeededPSXtoX86reg(int gprreg) +{ + for (uint i = 0; i < iREGCNT_GPR; i++) + { + if (x86regs[i].inuse == 0) + continue; + if (x86regs[i].type != X86TYPE_PSX) + continue; + if (x86regs[i].reg != gprreg) + continue; + + x86regs[i].counter = g_x86AllocCounter++; // update counter + x86regs[i].needed = 1; + break; + } +} + void _addNeededGPRtoXMMreg(int gprreg) { - for (size_t i = 0; i < iREGCNT_XMM; i++) + for (uint i = 0; i < iREGCNT_XMM; i++) { if (xmmregs[i].inuse == 0) continue; @@ -509,7 +524,7 @@ void _addNeededGPRtoXMMreg(int gprreg) // You must use _clearNeededXMMregs to clear the flag void _addNeededFPtoXMMreg(int fpreg) { - for (size_t i = 0; i < iREGCNT_XMM; i++) + for (uint i = 0; i < iREGCNT_XMM; i++) { if (xmmregs[i].inuse == 0) continue; @@ -528,7 +543,7 @@ void _addNeededFPtoXMMreg(int fpreg) // You must use _clearNeededXMMregs to clear the flag void _addNeededFPACCtoXMMreg() { - for (size_t i = 0; i < iREGCNT_XMM; i++) + for (uint i = 0; i < iREGCNT_XMM; i++) { if (xmmregs[i].inuse == 0) continue; @@ -545,7 +560,7 @@ void _addNeededFPACCtoXMMreg() // Written register will set MODE_READ (aka data is valid, no need to load it) void _clearNeededXMMregs() { - for (size_t i = 0; i < iREGCNT_XMM; i++) + for (uint i = 0; i < iREGCNT_XMM; i++) { if (xmmregs[i].needed) @@ -568,9 +583,86 @@ void _clearNeededXMMregs() // Flush is 1: Flush in memory. But register is still valid // Flush is 2: like 0 ... // Flush is 3: drop register content +void _deleteGPRtoX86reg(int reg, int flush) +{ + for (uint i = 0; i < iREGCNT_XMM; i++) + { + if (x86regs[i].inuse && x86regs[i].type == X86TYPE_GPR && x86regs[i].reg == reg) + { + switch (flush) + { + case DELETE_REG_FREE: + _freeX86reg(i); + break; + case DELETE_REG_FLUSH: + case DELETE_REG_FLUSH_AND_FREE: + if (x86regs[i].mode & MODE_WRITE) + { + pxAssert(reg != 0); + xMOV(ptr64[&cpuRegs.GPR.r[reg].UL[0]], xRegister64(i)); + + // get rid of MODE_WRITE since don't want to flush again + x86regs[i].mode &= ~MODE_WRITE; + x86regs[i].mode |= MODE_READ; + } + + if (flush == DELETE_REG_FLUSH_AND_FREE) + x86regs[i].inuse = 0; + break; + + case DELETE_REG_FREE_NO_WRITEBACK: + x86regs[i].inuse = 0; + break; + } + + return; + } + } +} + +void _deletePSXtoX86reg(int reg, int flush) +{ + for (uint i = 0; i < iREGCNT_GPR; i++) + { + if (x86regs[i].inuse && x86regs[i].type == X86TYPE_PSX && x86regs[i].reg == reg) + { + + switch (flush) + { + case DELETE_REG_FREE: + _freeX86reg(i); + break; + case DELETE_REG_FLUSH: + case DELETE_REG_FLUSH_AND_FREE: + if (x86regs[i].mode & MODE_WRITE) + { + pxAssert(reg != 0); + xMOV(ptr32[&psxRegs.GPR.r[reg]], xRegister32(i)); + + // get rid of MODE_WRITE since don't want to flush again + x86regs[i].mode &= ~MODE_WRITE; + x86regs[i].mode |= MODE_READ; + + RALOG("Writing back X86 reg %d for guest PSX reg %d P2\n", i, x86regs[i].reg); + } + + if (flush == 2) + x86regs[i].inuse = 0; + break; + + case DELETE_REG_FREE_NO_WRITEBACK: + x86regs[i].inuse = 0; + break; + } + + return; + } + } +} + void _deleteGPRtoXMMreg(int reg, int flush) { - for (size_t i = 0; i < iREGCNT_XMM; i++) + for (uint i = 0; i < iREGCNT_XMM; i++) { if (xmmregs[i].inuse && xmmregs[i].type == XMMTYPE_GPRREG && xmmregs[i].reg == reg) @@ -578,11 +670,11 @@ void _deleteGPRtoXMMreg(int reg, int flush) switch (flush) { - case 0: + case DELETE_REG_FREE: _freeXMMreg(i); break; - case 1: - case 2: + case DELETE_REG_FLUSH: + case DELETE_REG_FLUSH_AND_FREE: if (xmmregs[i].mode & MODE_WRITE) { pxAssert(reg != 0); @@ -595,11 +687,11 @@ void _deleteGPRtoXMMreg(int reg, int flush) xmmregs[i].mode |= MODE_READ; } - if (flush == 2) + if (flush == DELETE_REG_FLUSH_AND_FREE) xmmregs[i].inuse = 0; break; - case 3: + case DELETE_REG_FREE_NO_WRITEBACK: xmmregs[i].inuse = 0; break; } @@ -620,11 +712,12 @@ void _deleteFPtoXMMreg(int reg, int flush) { switch (flush) { - case 0: + case DELETE_REG_FREE: + case DELETE_REG_FLUSH_AND_FREE: _freeXMMreg(i); return; - case 1: + case DELETE_REG_FLUSH: if (xmmregs[i].mode & MODE_WRITE) { xMOVSS(ptr[&fpuRegs.fpr[reg].UL], xRegisterSSE(i)); @@ -634,7 +727,7 @@ void _deleteFPtoXMMreg(int reg, int flush) } return; - case 2: + case DELETE_REG_FREE_NO_WRITEBACK: xmmregs[i].inuse = 0; return; } @@ -642,374 +735,195 @@ void _deleteFPtoXMMreg(int reg, int flush) } } +void _writebackXMMreg(int xmmreg) +{ + switch (xmmregs[xmmreg].type) + { + case XMMTYPE_VFREG: + { + if (xmmregs[xmmreg].reg == 33) + xMOVSS(ptr[&VU0.VI[REG_I].F], xRegisterSSE(xmmreg)); + else if (xmmregs[xmmreg].reg == 32) + xMOVAPS(ptr[VU0.ACC.F], xRegisterSSE(xmmreg)); + else if (xmmregs[xmmreg].reg > 0) + xMOVAPS(ptr[VU0.VF[xmmregs[xmmreg].reg].F], xRegisterSSE(xmmreg)); + } + break; + + case XMMTYPE_GPRREG: + pxAssert(xmmregs[xmmreg].reg != 0); + xMOVDQA(ptr[&cpuRegs.GPR.r[xmmregs[xmmreg].reg].UL[0]], xRegisterSSE(xmmreg)); + break; + + case XMMTYPE_FPREG: + xMOVSS(ptr[&fpuRegs.fpr[xmmregs[xmmreg].reg]], xRegisterSSE(xmmreg)); + break; + + case XMMTYPE_FPACC: + xMOVSS(ptr[&fpuRegs.ACC.f], xRegisterSSE(xmmreg)); + break; + + default: + break; + } +} + // Free cached register // Step 1: flush content in memory if MODE_WRITE // Step 2: clear 'inuse' field -void _freeXMMreg(u32 xmmreg) +void _freeXMMreg(int xmmreg) { - pxAssert(xmmreg < iREGCNT_XMM); - + pxAssert(static_cast(xmmreg) < iREGCNT_XMM); if (!xmmregs[xmmreg].inuse) return; if (xmmregs[xmmreg].mode & MODE_WRITE) - { - switch (xmmregs[xmmreg].type) - { - case XMMTYPE_VFREG: - { - const VURegs* VU = xmmregs[xmmreg].VU ? &VU1 : &VU0; - if (xmmregs[xmmreg].mode & MODE_VUXYZ) - { - if (xmmregs[xmmreg].mode & MODE_VUZ) - { - // don't destroy w - uint t0reg; - for (t0reg = 0; t0reg < iREGCNT_XMM; ++t0reg) - { - if (!xmmregs[t0reg].inuse) - break; - } + _writebackXMMreg(xmmreg); - if (t0reg < iREGCNT_XMM) - { - xMOVHL.PS(xRegisterSSE(t0reg), xRegisterSSE(xmmreg)); - xMOVL.PS(ptr[(void*)(VU_VFx_ADDR(xmmregs[xmmreg].reg))], xRegisterSSE(xmmreg)); - xMOVSS(ptr[(void*)(VU_VFx_ADDR(xmmregs[xmmreg].reg) + 8)], xRegisterSSE(t0reg)); - } - else - { - // no free reg - xMOVL.PS(ptr[(void*)(VU_VFx_ADDR(xmmregs[xmmreg].reg))], xRegisterSSE(xmmreg)); - xSHUF.PS(xRegisterSSE(xmmreg), xRegisterSSE(xmmreg), 0xc6); - //xMOVHL.PS(xRegisterSSE(xmmreg), xRegisterSSE(xmmreg)); - xMOVSS(ptr[(void*)(VU_VFx_ADDR(xmmregs[xmmreg].reg) + 8)], xRegisterSSE(xmmreg)); - xSHUF.PS(xRegisterSSE(xmmreg), xRegisterSSE(xmmreg), 0xc6); - } - } - else - { - xMOVL.PS(ptr[(void*)(VU_VFx_ADDR(xmmregs[xmmreg].reg))], xRegisterSSE(xmmreg)); - } - } - else - { - xMOVAPS(ptr[(void*)(VU_VFx_ADDR(xmmregs[xmmreg].reg))], xRegisterSSE(xmmreg)); - } - } - break; - - case XMMTYPE_ACC: - { - const VURegs* VU = xmmregs[xmmreg].VU ? &VU1 : &VU0; - if (xmmregs[xmmreg].mode & MODE_VUXYZ) - { - if (xmmregs[xmmreg].mode & MODE_VUZ) - { - // don't destroy w - uint t0reg; - - for (t0reg = 0; t0reg < iREGCNT_XMM; ++t0reg) - { - if (!xmmregs[t0reg].inuse) - break; - } - - if (t0reg < iREGCNT_XMM) - { - xMOVHL.PS(xRegisterSSE(t0reg), xRegisterSSE(xmmreg)); - xMOVL.PS(ptr[(void*)(VU_ACCx_ADDR)], xRegisterSSE(xmmreg)); - xMOVSS(ptr[(void*)(VU_ACCx_ADDR + 8)], xRegisterSSE(t0reg)); - } - else - { - // no free reg - xMOVL.PS(ptr[(void*)(VU_ACCx_ADDR)], xRegisterSSE(xmmreg)); - xSHUF.PS(xRegisterSSE(xmmreg), xRegisterSSE(xmmreg), 0xc6); - //xMOVHL.PS(xRegisterSSE(xmmreg), xRegisterSSE(xmmreg)); - xMOVSS(ptr[(void*)(VU_ACCx_ADDR + 8)], xRegisterSSE(xmmreg)); - xSHUF.PS(xRegisterSSE(xmmreg), xRegisterSSE(xmmreg), 0xc6); - } - } - else - { - xMOVL.PS(ptr[(void*)(VU_ACCx_ADDR)], xRegisterSSE(xmmreg)); - } - } - else - { - xMOVAPS(ptr[(void*)(VU_ACCx_ADDR)], xRegisterSSE(xmmreg)); - } - } - break; - - case XMMTYPE_GPRREG: - pxAssert(xmmregs[xmmreg].reg != 0); - //pxAssert( g_xmmtypes[xmmreg] == XMMT_INT ); - xMOVDQA(ptr[&cpuRegs.GPR.r[xmmregs[xmmreg].reg].UL[0]], xRegisterSSE(xmmreg)); - break; - - case XMMTYPE_FPREG: - xMOVSS(ptr[&fpuRegs.fpr[xmmregs[xmmreg].reg]], xRegisterSSE(xmmreg)); - break; - - case XMMTYPE_FPACC: - xMOVSS(ptr[&fpuRegs.ACC.f], xRegisterSSE(xmmreg)); - break; - - default: - break; - } - } - xmmregs[xmmreg].mode &= ~(MODE_WRITE | MODE_VUXYZ); + xmmregs[xmmreg].mode = 0; xmmregs[xmmreg].inuse = 0; + + if (xmmregs[xmmreg].type == XMMTYPE_VFREG) + mVUFreeCOP2XMMreg(xmmreg); } -void _clearNeededCOP2Regs() +void _freeXMMregWithoutWriteback(int xmmreg) { - for (size_t i = 0; i < iREGCNT_XMM - 1; i++) + pxAssert(static_cast(xmmreg) < iREGCNT_XMM); + if (!xmmregs[xmmreg].inuse) + return; + + xmmregs[xmmreg].mode = 0; + xmmregs[xmmreg].inuse = 0; + + if (xmmregs[xmmreg].type == XMMTYPE_VFREG) + mVUFreeCOP2XMMreg(xmmreg); +} + +int _allocVFtoXMMreg(int vfreg, int mode) +{ + // mode == 0 is called by the microvu side, and we don't want to clash with its temps... + if (mode != 0) + { + for (uint i = 0; i < iREGCNT_XMM; i++) + { + if (xmmregs[i].inuse && xmmregs[i].type == XMMTYPE_VFREG && xmmregs[i].reg == vfreg) + { + pxAssert(mode == 0 || xmmregs[i].mode != 0); + xmmregs[i].counter = g_xmmAllocCounter++; + xmmregs[i].mode |= mode; + return i; + } + } + } + + // -1 here because we don't want to allocate PQ. + const int xmmreg = _getFreeXMMreg(iREGCNT_XMM - 1); + xmmregs[xmmreg].inuse = true; + xmmregs[xmmreg].type = XMMTYPE_VFREG; + xmmregs[xmmreg].counter = g_xmmAllocCounter++; + xmmregs[xmmreg].needed = true; + xmmregs[xmmreg].reg = vfreg; + xmmregs[xmmreg].mode = mode; + + if (mode & MODE_READ) + { + if (vfreg == 33) + xMOVSSZX(xRegisterSSE(xmmreg), ptr[&VU0.VI[REG_I].F]); + else if (vfreg == 32) + xMOVAPS(xRegisterSSE(xmmreg), ptr[VU0.ACC.F]); + else + xMOVAPS(xRegisterSSE(xmmreg), ptr[VU0.VF[xmmregs[xmmreg].reg].F]); + } + + return xmmreg; +} + +void _flushCOP2regs() +{ + for (uint i = 0; i < iREGCNT_XMM; i++) { if (xmmregs[i].inuse && xmmregs[i].type == XMMTYPE_VFREG) { - xmmregs[i].inuse = false; - xmmregs[i].type = XMMTYPE_VFREG; - xmmregs[i].counter = 0; - } - } -} - -u16 _freeXMMregsCOP2() -{ - // First check what's already free, it might be enough - for (size_t i = 0; i < iREGCNT_XMM - 1; i++) - { - if (!xmmregs[i].inuse) - { - xmmregs[i].inuse = true; - xmmregs[i].type = XMMTYPE_VFREG; - xmmregs[i].counter = 9999; - return i; - } - } - - // If we still don't have enough, find regs in use but not needed - for (size_t i = 0; i < iREGCNT_XMM - 1; i++) - { - if (xmmregs[i].inuse && xmmregs[i].counter == 0) - { + RALOG("Flushing cop2 fpr %u with vf%u\n", i, xmmregs[i].reg); _freeXMMreg(i); - xmmregs[i].inuse = true; - xmmregs[i].type = XMMTYPE_VFREG; - xmmregs[i].counter = 9999; - return i; } } - - int regtoclear = -1; - int maxcount = 9999; - - for (size_t i = 0; i < iREGCNT_XMM - 1; i++) - { - if (xmmregs[i].inuse && xmmregs[i].counter < maxcount) - { - regtoclear = i; - maxcount = xmmregs[i].counter; - } - } - if (regtoclear != -1) - { - _freeXMMreg(regtoclear); - xmmregs[regtoclear].inuse = true; - xmmregs[regtoclear].type = XMMTYPE_VFREG; - xmmregs[regtoclear].counter = 9999; - return regtoclear; - } - - pxAssert(0); - - return -1; } -// Return the number of inuse XMM register that have the MODE_WRITE flag -int _getNumXMMwrite() +void _flushXMMreg(int xmmreg) { - int num = 0; - for (size_t i = 0; i < iREGCNT_XMM; i++) + if (xmmregs[xmmreg].inuse && xmmregs[xmmreg].mode & MODE_WRITE) { - if (xmmregs[i].inuse && (xmmregs[i].mode & MODE_WRITE)) - ++num; + RALOG("Flushing xmm reg %u in _flushXMMregs()\n", i); + _writebackXMMreg(xmmreg); + xmmregs[xmmreg].mode = (xmmregs[xmmreg].mode & ~MODE_WRITE) | MODE_READ; } - - return num; -} - -// Step1: check any available register (inuse == 0) -// Step2: check registers that are not live (both EEINST_LIVE* are cleared) -// Step3: check registers that are not useful anymore (EEINST_USED cleared) -u8 _hasFreeXMMreg() -{ - for (size_t i = 0; i < iREGCNT_XMM; i++) - { - if (!xmmregs[i].inuse) - return 1; - } - - // check for dead regs - for (size_t i = 0; i < iREGCNT_XMM; i++) - { - if (xmmregs[i].needed) - continue; - if (xmmregs[i].type == XMMTYPE_GPRREG) - { - if (!EEINST_ISLIVEXMM(xmmregs[i].reg)) - { - return 1; - } - } - } - - // check for dead regs - for (size_t i = 0; i < iREGCNT_XMM; i++) - { - if (xmmregs[i].needed) - continue; - if (xmmregs[i].type == XMMTYPE_GPRREG) - { - if (!(g_pCurInstInfo->regs[xmmregs[i].reg] & EEINST_USED)) - { - return 1; - } - } - } - return 0; } // Flush in memory all inuse registers but registers are still valid void _flushXMMregs() { - for (size_t i = 0; i < iREGCNT_XMM; i++) - { - if (xmmregs[i].inuse == 0) - continue; - - pxAssert(xmmregs[i].type != XMMTYPE_TEMP); - pxAssert(xmmregs[i].mode & (MODE_READ | MODE_WRITE)); - - _freeXMMreg(i); - xmmregs[i].inuse = 1; - xmmregs[i].mode &= ~MODE_WRITE; - xmmregs[i].mode |= MODE_READ; - } + for (u32 i = 0; i < iREGCNT_XMM; ++i) + _flushXMMreg(i); } -// Flush in memory all inuse registers. All registers are invalid -void _freeXMMregs() +int _allocIfUsedGPRtoX86(int gprreg, int mode) { - for (size_t i = 0; i < iREGCNT_XMM; i++) - { - if (xmmregs[i].inuse == 0) - continue; + const int x86reg = _checkX86reg(X86TYPE_GPR, gprreg, mode); + if (x86reg >= 0) + return x86reg; - pxAssert(xmmregs[i].type != XMMTYPE_TEMP); - //pxAssert( xmmregs[i].mode & (MODE_READ|MODE_WRITE) ); - - _freeXMMreg(i); - } + return EEINST_USEDTEST(gprreg) ? _allocX86reg(X86TYPE_GPR, gprreg, mode) : -1; } -int _signExtendXMMtoM(uptr to, x86SSERegType from, int candestroy) +int _allocIfUsedGPRtoXMM(int gprreg, int mode) { - g_xmmtypes[from] = XMMT_INT; - if (candestroy) - { - if (g_xmmtypes[from] == XMMT_FPS) - xMOVSS(ptr[(void*)(to)], xRegisterSSE(from)); - else - xMOVD(ptr[(void*)(to)], xRegisterSSE(from)); + const int mmreg = _checkXMMreg(XMMTYPE_GPRREG, gprreg, mode); + if (mmreg >= 0) + return mmreg; - xPSRA.D(xRegisterSSE(from), 31); - xMOVD(ptr[(void*)(to + 4)], xRegisterSSE(from)); - return 1; - } - else - { - // can't destroy and type is int - pxAssert(g_xmmtypes[from] == XMMT_INT); - - - if (_hasFreeXMMreg()) - { - xmmregs[from].needed = 1; - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(from)); - xPSRA.D(xRegisterSSE(from), 31); - xMOVD(ptr[(void*)(to)], xRegisterSSE(t0reg)); - xMOVD(ptr[(void*)(to + 4)], xRegisterSSE(from)); - - // swap xmm regs.. don't ask - xmmregs[t0reg] = xmmregs[from]; - xmmregs[from].inuse = 0; - } - else - { - xMOVD(ptr[(void*)(to + 4)], xRegisterSSE(from)); - xMOVD(ptr[(void*)(to)], xRegisterSSE(from)); - xSAR(ptr32[(u32*)(to + 4)], 31); - } - - return 0; - } - - pxAssume(false); + return EEINST_XMMUSEDTEST(gprreg) ? _allocGPRtoXMMreg(gprreg, mode) : -1; } -// Seem related to the mix between XMM/x86 in order to avoid a couple of move -// But it is quite obscure !!! -int _allocCheckGPRtoXMM(EEINST* pinst, int gprreg, int mode) +int _allocIfUsedFPUtoXMM(int fpureg, int mode) { - if (pinst->regs[gprreg] & EEINST_XMM) - return _allocGPRtoXMMreg(-1, gprreg, mode); + const int mmreg = _checkXMMreg(XMMTYPE_FPREG, fpureg, mode); + if (mmreg >= 0) + return mmreg; - return _checkXMMreg(XMMTYPE_GPRREG, gprreg, mode); -} - -// Seem related to the mix between XMM/x86 in order to avoid a couple of move -// But it is quite obscure !!! -int _allocCheckFPUtoXMM(EEINST* pinst, int fpureg, int mode) -{ - if (pinst->fpuregs[fpureg] & EEINST_XMM) - return _allocFPtoXMMreg(-1, fpureg, mode); - - return _checkXMMreg(XMMTYPE_FPREG, fpureg, mode); -} - -int _allocCheckGPRtoX86(EEINST* pinst, int gprreg, int mode) -{ - if (pinst->regs[gprreg] & EEINST_USED) - return _allocX86reg(xEmptyReg, X86TYPE_GPR, gprreg, mode); - - return _checkX86reg(X86TYPE_GPR, gprreg, mode); + return FPUINST_USEDTEST(fpureg) ? _allocFPtoXMMreg(fpureg, mode) : -1; } void _recClearInst(EEINST* pinst) { + // we set everything as being live to begin with, since it needs to be written at the end of the block memzero(*pinst); - memset8(pinst->regs); - memset8(pinst->fpuregs); + memset8(pinst->regs); + memset8(pinst->fpuregs); + memset8(pinst->vfregs); + memset8(pinst->viregs); } // returns nonzero value if reg has been written between [startpc, endpc-4] -u32 _recIsRegWritten(EEINST* pinst, int size, u8 xmmtype, u8 reg) +u32 _recIsRegReadOrWritten(EEINST* pinst, int size, u8 xmmtype, u8 reg) { u32 inst = 1; while (size-- > 0) { - for (size_t i = 0; i < std::size(pinst->writeType); ++i) + for (u32 i = 0; i < std::size(pinst->writeType); ++i) { if ((pinst->writeType[i] == xmmtype) && (pinst->writeReg[i] == reg)) return inst; } + + for (u32 i = 0; i < std::size(pinst->readType); ++i) + { + if ((pinst->readType[i] == xmmtype) && (pinst->readReg[i] == reg)) + return inst; + } + ++inst; pinst++; } @@ -1021,7 +935,7 @@ void _recFillRegister(EEINST& pinst, int type, int reg, int write) { if (write) { - for (size_t i = 0; i < std::size(pinst.writeType); ++i) + for (size_t i = 0; i < std::size(pinst.writeType); ++i) { if (pinst.writeType[i] == XMMTYPE_TEMP) { @@ -1034,7 +948,7 @@ void _recFillRegister(EEINST& pinst, int type, int reg, int write) } else { - for (size_t i = 0; i < std::size(pinst.readType); ++i) + for (size_t i = 0; i < std::size(pinst.readType); ++i) { if (pinst.readType[i] == XMMTYPE_TEMP) { diff --git a/pcsx2/x86/iCore.h b/pcsx2/x86/iCore.h index a6a249e5df..af4b5d0b2e 100644 --- a/pcsx2/x86/iCore.h +++ b/pcsx2/x86/iCore.h @@ -22,86 +22,72 @@ // Namespace Note : iCore32 contains all of the Register Allocation logic, in addition to a handful // of utility functions for emitting frequent code. +//#define RALOG(...) fprintf(stderr, __VA_ARGS__) +#define RALOG(...) + //////////////////////////////////////////////////////////////////////////////// // Shared Register allocation flags (apply to X86, XMM, MMX, etc). #define MODE_READ 1 #define MODE_WRITE 2 -#define MODE_READHALF 4 // read only low 64 bits -#define MODE_VUXY 8 // vector only has xy valid (real zw are in mem), not the same as MODE_READHALF -#define MODE_VUZ 0x10 // z only doesn't work for now -#define MODE_VUXYZ (MODE_VUZ | MODE_VUXY) // vector only has xyz valid (real w is in memory) -#define MODE_NOFLUSH 0x20 // can't flush reg to mem -#define MODE_NOFRAME 0x40 // when allocating x86regs, don't use ebp reg -#define MODE_8BITREG 0x80 // when allocating x86regs, use only eax, ecx, edx, and ebx +#define MODE_CALLEESAVED 0x20 // can't flush reg to mem #define PROCESS_EE_XMM 0x02 -// currently only used in FPU #define PROCESS_EE_S 0x04 // S is valid, otherwise take from mem #define PROCESS_EE_T 0x08 // T is valid, otherwise take from mem +#define PROCESS_EE_D 0x10 // D is valid, otherwise take from mem -// not used in VU recs -#define PROCESS_EE_MODEWRITES 0x10 // if s is a reg, set if not in cpuRegs -#define PROCESS_EE_MODEWRITET 0x20 // if t is a reg, set if not in cpuRegs #define PROCESS_EE_LO 0x40 // lo reg is valid #define PROCESS_EE_HI 0x80 // hi reg is valid #define PROCESS_EE_ACC 0x40 // acc reg is valid -// used in VU recs -#define PROCESS_VU_UPDATEFLAGS 0x10 -#define PROCESS_VU_COP2 0x80 // simple cop2 - #define EEREC_S (((info) >> 8) & 0xf) #define EEREC_T (((info) >> 12) & 0xf) #define EEREC_D (((info) >> 16) & 0xf) #define EEREC_LO (((info) >> 20) & 0xf) #define EEREC_HI (((info) >> 24) & 0xf) #define EEREC_ACC (((info) >> 20) & 0xf) -#define EEREC_TEMP (((info) >> 24) & 0xf) -#define VUREC_FMAC ((info)&0x80000000) -#define PROCESS_EE_SET_S(reg) ((reg) << 8) -#define PROCESS_EE_SET_T(reg) ((reg) << 12) -#define PROCESS_EE_SET_D(reg) ((reg) << 16) -#define PROCESS_EE_SET_LO(reg) ((reg) << 20) -#define PROCESS_EE_SET_HI(reg) ((reg) << 24) -#define PROCESS_EE_SET_ACC(reg) ((reg) << 20) - -#define PROCESS_VU_SET_ACC(reg) PROCESS_EE_SET_ACC(reg) -#define PROCESS_VU_SET_TEMP(reg) ((reg) << 24) - -#define PROCESS_VU_SET_FMAC() 0x80000000 +#define PROCESS_EE_SET_S(reg) (((reg) << 8) | PROCESS_EE_S) +#define PROCESS_EE_SET_T(reg) (((reg) << 12) | PROCESS_EE_T) +#define PROCESS_EE_SET_D(reg) (((reg) << 16) | PROCESS_EE_D) +#define PROCESS_EE_SET_LO(reg) (((reg) << 20) | PROCESS_EE_LO) +#define PROCESS_EE_SET_HI(reg) (((reg) << 24) | PROCESS_EE_HI) +#define PROCESS_EE_SET_ACC(reg) (((reg) << 20) | PROCESS_EE_ACC) // special info not related to above flags #define PROCESS_CONSTS 1 #define PROCESS_CONSTT 2 +// XMM caching helpers +#define XMMINFO_READLO 0x001 +#define XMMINFO_READHI 0x002 +#define XMMINFO_WRITELO 0x004 +#define XMMINFO_WRITEHI 0x008 +#define XMMINFO_WRITED 0x010 +#define XMMINFO_READD 0x020 +#define XMMINFO_READS 0x040 +#define XMMINFO_READT 0x080 +#define XMMINFO_READACC 0x200 +#define XMMINFO_WRITEACC 0x400 +#define XMMINFO_WRITET 0x800 + +#define XMMINFO_64BITOP 0x1000 +#define XMMINFO_FORCEREGS 0x2000 +#define XMMINFO_FORCEREGT 0x4000 +#define XMMINFO_NORENAME 0x8000 // disables renaming of Rs to Rt in Rt = Rs op imm + //////////////////////////////////////////////////////////////////////////////// // X86 (32-bit) Register Allocation Tools #define X86TYPE_TEMP 0 #define X86TYPE_GPR 1 -#define X86TYPE_VI 2 -#define X86TYPE_MEMOFFSET 3 -#define X86TYPE_VIMEMOFFSET 4 -#define X86TYPE_VUQREAD 5 -#define X86TYPE_VUPREAD 6 -#define X86TYPE_VUQWRITE 7 -#define X86TYPE_VUPWRITE 8 -#define X86TYPE_PSX 9 -#define X86TYPE_PCWRITEBACK 10 -#define X86TYPE_VUJUMP 12 // jump from random mem (g_recWriteback) -#define X86TYPE_VITEMP 13 -#define X86TYPE_FNARG 14 // function parameter, max is 4 - -#define X86TYPE_VU1 0x80 - -//#define X86_ISVI(type) ((type&~X86TYPE_VU1) == X86TYPE_VI) -static __fi int X86_ISVI(int type) -{ - return ((type & ~X86TYPE_VU1) == X86TYPE_VI); -} +#define X86TYPE_FPRC 2 +#define X86TYPE_VIREG 3 +#define X86TYPE_PCWRITEBACK 4 +#define X86TYPE_PSX 5 +#define X86TYPE_PSX_PCWRITEBACK 6 struct _x86regs { @@ -116,79 +102,83 @@ struct _x86regs extern _x86regs x86regs[iREGCNT_GPR], s_saveX86regs[iREGCNT_GPR]; -uptr _x86GetAddr(int type, int reg); +bool _isAllocatableX86reg(int x86reg); void _initX86regs(); int _getFreeX86reg(int mode); -int _allocX86reg(x86Emitter::xRegister32 x86reg, int type, int reg, int mode); -void _deleteX86reg(int type, int reg, int flush); +int _allocX86reg(int type, int reg, int mode); int _checkX86reg(int type, int reg, int mode); +bool _hasX86reg(int type, int reg, int required_mode = 0); void _addNeededX86reg(int type, int reg); void _clearNeededX86regs(); void _freeX86reg(const x86Emitter::xRegister32& x86reg); void _freeX86reg(int x86reg); +void _freeX86regWithoutWriteback(int x86reg); void _freeX86regs(); -void _flushCachedRegs(); +void _flushX86regs(); void _flushConstRegs(); void _flushConstReg(int reg); +void _validateRegs(); +void _writebackX86Reg(int x86reg); //////////////////////////////////////////////////////////////////////////////// // XMM (128-bit) Register Allocation Tools -#define XMM_CONV_VU(VU) (VU == &VU1) - #define XMMTYPE_TEMP 0 // has to be 0 -#define XMMTYPE_VFREG 1 -#define XMMTYPE_ACC 2 -#define XMMTYPE_FPREG 3 -#define XMMTYPE_FPACC 4 -#define XMMTYPE_GPRREG 5 +#define XMMTYPE_GPRREG X86TYPE_GPR +#define XMMTYPE_FPREG 6 +#define XMMTYPE_FPACC 7 +#define XMMTYPE_VFREG 8 // lo and hi regs #define XMMGPR_LO 33 #define XMMGPR_HI 32 #define XMMFPU_ACC 32 +enum : int +{ + DELETE_REG_FREE = 0, + DELETE_REG_FLUSH = 1, + DELETE_REG_FLUSH_AND_FREE = 2, + DELETE_REG_FREE_NO_WRITEBACK = 3 +}; + struct _xmmregs { u8 inuse; - u8 reg; + s8 reg; u8 type; u8 mode; u8 needed; - u8 VU; // 0 = VU0, 1 = VU1 u16 counter; }; -void _cop2BackupRegs(); -void _cop2RestoreRegs(); void _initXMMregs(); -int _getFreeXMMreg(); -int _allocTempXMMreg(XMMSSEType type, int xmmreg); -int _allocFPtoXMMreg(int xmmreg, int fpreg, int mode); -int _allocGPRtoXMMreg(int xmmreg, int gprreg, int mode); -int _allocFPACCtoXMMreg(int xmmreg, int mode); +int _getFreeXMMreg(u32 maxreg = iREGCNT_XMM); +int _allocTempXMMreg(XMMSSEType type); +int _allocFPtoXMMreg(int fpreg, int mode); +int _allocGPRtoXMMreg(int gprreg, int mode); +int _allocFPACCtoXMMreg(int mode); +void _reallocateXMMreg(int xmmreg, int newtype, int newreg, int newmode, bool writeback = true); int _checkXMMreg(int type, int reg, int mode); +bool _hasXMMreg(int type, int reg, int required_mode = 0); void _addNeededFPtoXMMreg(int fpreg); void _addNeededFPACCtoXMMreg(); +void _addNeededGPRtoX86reg(int gprreg); +void _addNeededPSXtoX86reg(int gprreg); void _addNeededGPRtoXMMreg(int gprreg); void _clearNeededXMMregs(); -//void _deleteACCtoXMMreg(int vu, int flush); +void _deleteGPRtoX86reg(int reg, int flush); +void _deletePSXtoX86reg(int reg, int flush); void _deleteGPRtoXMMreg(int reg, int flush); void _deleteFPtoXMMreg(int reg, int flush); -void _freeXMMreg(u32 xmmreg); -void _clearNeededCOP2Regs(); -u16 _freeXMMregsCOP2(); -//void _moveXMMreg(int xmmreg); // instead of freeing, moves it to a diff location +void _freeXMMreg(int xmmreg); +void _freeXMMregWithoutWriteback(int xmmreg); +void _writebackXMMreg(int xmmreg); +int _allocVFtoXMMreg(int vfreg, int mode); +void mVUFreeCOP2XMMreg(int hostreg); +void _flushCOP2regs(); +void _flushXMMreg(int xmmreg); void _flushXMMregs(); -u8 _hasFreeXMMreg(); -void _freeXMMregs(); -int _getNumXMMwrite(); -void _signExtendSFtoM(uptr mem); - -// returns new index of reg, lower 32 bits already in mmx -// shift is used when the data is in the top bits of the mmx reg to begin with -// a negative shift is for sign extension -int _signExtendXMMtoM(uptr to, x86SSERegType from, int candestroy); // returns true if reg destroyed ////////////////////// // Instruction Info // @@ -205,55 +195,98 @@ int _signExtendXMMtoM(uptr to, x86SSERegType from, int candestroy); // returns t // 3/ EEINST_LIVE* is cleared when register is written. And set again when register is read. // My guess: the purpose is to detect the usage hole in the flow -#define EEINST_LIVE0 1 // if var is ever used (read or write) -#define EEINST_LIVE2 4 // if cur var's next 64 bits are needed +#define EEINST_LIVE 1 // if var is ever used (read or write) #define EEINST_LASTUSE 8 // if var isn't written/read anymore -//#define EEINST_MMX 0x10 // removed #define EEINST_XMM 0x20 // var will be used in xmm ops #define EEINST_USED 0x40 -#define EEINSTINFO_COP1 1 -#define EEINSTINFO_COP2 2 - #define EEINST_COP2_DENORMALIZE_STATUS_FLAG 0x100 #define EEINST_COP2_NORMALIZE_STATUS_FLAG 0x200 #define EEINST_COP2_STATUS_FLAG 0x400 #define EEINST_COP2_MAC_FLAG 0x800 #define EEINST_COP2_CLIP_FLAG 0x1000 -#define EEINST_COP2_FINISH_VU0_MICRO 0x2000 +#define EEINST_COP2_SYNC_VU0 0x2000 +#define EEINST_COP2_FINISH_VU0 0x4000 +#define EEINST_COP2_FLUSH_VU0_REGISTERS 0x8000 struct EEINST { u16 info; // extra info, if 1 inst is COP1, 2 inst is COP2. Also uses EEINST_XMM u8 regs[34]; // includes HI/LO (HI=32, LO=33) u8 fpuregs[33]; // ACC=32 + u8 vfregs[33]; // ACC=32 + u8 viregs[16]; // uses XMMTYPE_ flags; if type == XMMTYPE_TEMP, not used u8 writeType[3], writeReg[3]; // reg written in this inst, 0 if no reg u8 readType[4], readReg[4]; - - // valid if info & EEINSTINFO_COP2 - int cycle; // cycle of inst (at offset from block) - _VURegsNum vuregs; }; extern EEINST* g_pCurInstInfo; // info for the cur instruction extern void _recClearInst(EEINST* pinst); // returns the number of insts + 1 until written (0 if not written) -extern u32 _recIsRegWritten(EEINST* pinst, int size, u8 xmmtype, u8 reg); -// returns the number of insts + 1 until used (0 if not used) -//extern u32 _recIsRegUsed(EEINST* pinst, int size, u8 xmmtype, u8 reg); +extern u32 _recIsRegReadOrWritten(EEINST* pinst, int size, u8 xmmtype, u8 reg); + extern void _recFillRegister(EEINST& pinst, int type, int reg, int write); -static __fi bool EEINST_ISLIVE64(u32 reg) { return !!(g_pCurInstInfo->regs[reg] & (EEINST_LIVE0)); } -static __fi bool EEINST_ISLIVEXMM(u32 reg) { return !!(g_pCurInstInfo->regs[reg] & (EEINST_LIVE0 | EEINST_LIVE2)); } -static __fi bool EEINST_ISLIVE2(u32 reg) { return !!(g_pCurInstInfo->regs[reg] & EEINST_LIVE2); } +// If unset, values which are not live will not be written back to memory. +// Tends to break stuff at the moment. +#define EE_WRITE_DEAD_VALUES 1 -static __fi bool FPUINST_ISLIVE(u32 reg) { return !!(g_pCurInstInfo->fpuregs[reg] & EEINST_LIVE0); } +/// Returns true if the register is used later in the block, and this isn't the last instruction to use it. +/// In other words, the register is worth keeping in a host register/caching it. +static __fi bool EEINST_USEDTEST(u32 reg) +{ + return (g_pCurInstInfo->regs[reg] & (EEINST_USED | EEINST_LASTUSE)) == EEINST_USED; +} + +/// Returns true if the register is used later in the block as an XMM/128-bit value. +static __fi bool EEINST_XMMUSEDTEST(u32 reg) +{ + return (g_pCurInstInfo->regs[reg] & (EEINST_USED | EEINST_XMM | EEINST_LASTUSE)) == (EEINST_USED | EEINST_XMM); +} + +/// Returns true if the specified VF register is used later in the block. +static __fi bool COP2INST_USEDTEST(u32 reg) +{ + return (g_pCurInstInfo->vfregs[reg] & (EEINST_USED | EEINST_LASTUSE)) == EEINST_USED; +} + +/// Returns true if the value should be computed/written back. +/// Basically, this means it's either used before it's overwritten, or not overwritten by the end of the block. +static __fi bool EEINST_LIVETEST(u32 reg) +{ + return EE_WRITE_DEAD_VALUES || ((g_pCurInstInfo->regs[reg] & EEINST_LIVE) != 0); +} + +/// Returns true if the register can be renamed into another. +static __fi bool EEINST_RENAMETEST(u32 reg) +{ + return (reg == 0 || !EEINST_USEDTEST(reg) || !EEINST_LIVETEST(reg)); +} + +static __fi bool FPUINST_ISLIVE(u32 reg) { return !!(g_pCurInstInfo->fpuregs[reg] & EEINST_LIVE); } static __fi bool FPUINST_LASTUSE(u32 reg) { return !!(g_pCurInstInfo->fpuregs[reg] & EEINST_LASTUSE); } -extern u32 g_recWriteback; // used for jumps (VUrec mess!) +/// Returns true if the register is used later in the block, and this isn't the last instruction to use it. +/// In other words, the register is worth keeping in a host register/caching it. +static __fi bool FPUINST_USEDTEST(u32 reg) +{ + return (g_pCurInstInfo->fpuregs[reg] & (EEINST_USED | EEINST_LASTUSE)) == EEINST_USED; +} + +/// Returns true if the value should be computed/written back. +static __fi bool FPUINST_LIVETEST(u32 reg) +{ + return EE_WRITE_DEAD_VALUES || FPUINST_ISLIVE(reg); +} + +/// Returns true if the register can be renamed into another. +static __fi bool FPUINST_RENAMETEST(u32 reg) +{ + return (!EEINST_USEDTEST(reg) || !EEINST_LIVETEST(reg)); +} extern _xmmregs xmmregs[iREGCNT_XMM], s_saveXMMregs[iREGCNT_XMM]; @@ -263,47 +296,32 @@ extern thread_local u32* j32Ptr[32]; // depreciated item. use local u32* vars i extern u16 g_x86AllocCounter; extern u16 g_xmmAllocCounter; -// allocates only if later insts use XMM, otherwise checks -int _allocCheckGPRtoXMM(EEINST* pinst, int gprreg, int mode); -int _allocCheckFPUtoXMM(EEINST* pinst, int fpureg, int mode); - // allocates only if later insts use this register -int _allocCheckGPRtoX86(EEINST* pinst, int gprreg, int mode); +int _allocIfUsedGPRtoX86(int gprreg, int mode); +int _allocIfUsedGPRtoXMM(int gprreg, int mode); +int _allocIfUsedFPUtoXMM(int fpureg, int mode); ////////////////////////////////////////////////////////////////////////// // iFlushCall / _psxFlushCall Parameters -// Flushing vs. Freeing, as understood by Air (I could be wrong still....) - -// "Freeing" registers means that the contents of the registers are flushed to memory. -// This is good for any sort of C code function that plans to modify the actual -// registers. When the Recs resume, they'll reload the registers with values saved -// as needed. (similar to a "FreezeXMMRegs") - -// "Flushing" means that in addition to the standard free (which is actually a flush) -// the register allocations are additionally wiped. This should only be necessary if -// the code being called is going to modify register allocations -- ie, be doing -// some kind of recompiling of its own. - -#define FLUSH_CACHED_REGS 0x001 -#define FLUSH_FLUSH_XMM 0x002 -#define FLUSH_FREE_XMM 0x004 // both flushes and frees -#define FLUSH_FLUSH_ALLX86 0x020 // flush x86 -#define FLUSH_FREE_TEMPX86 0x040 // flush and free temporary x86 regs -#define FLUSH_FREE_ALLX86 0x080 // free all x86 regs -#define FLUSH_FREE_VU0 0x100 // free all vu0 related regs -#define FLUSH_PC 0x200 // program counter -#define FLUSH_CAUSE 0x000 // disabled for now: cause register, only the branch delay bit -#define FLUSH_CODE 0x800 // opcode for interpreter +#define FLUSH_NONE 0x000 // frees caller saved registers +#define FLUSH_CONSTANT_REGS 0x001 +#define FLUSH_FLUSH_XMM 0x002 +#define FLUSH_FREE_XMM 0x004 // both flushes and frees +#define FLUSH_ALL_X86 0x020 // flush x86 +#define FLUSH_FREE_TEMP_X86 0x040 // flush and free temporary x86 regs +#define FLUSH_FREE_NONTEMP_X86 0x080 // free all x86 regs, except temporary +#define FLUSH_FREE_VU0 0x100 // free all vu0 related regs +#define FLUSH_PC 0x200 // program counter +//#define FLUSH_CAUSE 0x000 // disabled for now: cause register, only the branch delay bit +#define FLUSH_CODE 0x800 // opcode for interpreter #define FLUSH_EVERYTHING 0x1ff //#define FLUSH_EXCEPTION 0x1ff // will probably do this totally differently actually #define FLUSH_INTERPRETER 0xfff -#define FLUSH_FULLVTLB FLUSH_NOCONST +#define FLUSH_FULLVTLB 0x000 // no freeing, used when callee won't destroy xmm regs -#define FLUSH_NODESTROY (FLUSH_CACHED_REGS | FLUSH_FLUSH_XMM | FLUSH_FLUSH_ALLX86) -// used when regs aren't going to be changed be callee -#define FLUSH_NOCONST (FLUSH_FREE_XMM | FLUSH_FREE_TEMPX86) +#define FLUSH_NODESTROY (FLUSH_CONSTANT_REGS | FLUSH_FLUSH_XMM | FLUSH_ALL_X86) #endif diff --git a/pcsx2/x86/iFPU.cpp b/pcsx2/x86/iFPU.cpp index 4ee6d8e95d..11255acf07 100644 --- a/pcsx2/x86/iFPU.cpp +++ b/pcsx2/x86/iFPU.cpp @@ -126,23 +126,18 @@ void recCFC1(void) return; EE::Profiler.EmitOp(eeOpcode::CFC1); - _eeOnWriteReg(_Rt_, 1); - - if (_Fs_ >= 16) - xMOV(eax, ptr[&fpuRegs.fprc[31]]); - else - xMOV(eax, ptr[&fpuRegs.fprc[0]]); - _deleteEEreg(_Rt_, 0); - + const int regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); if (_Fs_ >= 16) { - xAND(eax, 0x0083c078); //remove always-zero bits - xOR(eax, 0x01000001); //set always-one bits + xMOV(xRegister32(regt), ptr32[&fpuRegs.fprc[31]]); + xAND(xRegister32(regt), 0x0083c078); //remove always-zero bits + xOR(xRegister32(regt), 0x01000001); //set always-one bits + xMOVSX(xRegister64(regt), xRegister32(regt)); + } + else + { + xMOVSX(xRegister64(regt), ptr32[&fpuRegs.fprc[0]]); } - - xCDQ(); - xMOV(ptr[&cpuRegs.GPR.r[_Rt_].UL[0]], eax); - xMOV(ptr[&cpuRegs.GPR.r[_Rt_].UL[1]], edx); } void recCTC1() @@ -163,7 +158,10 @@ void recCTC1() { xMOVSS(ptr[&fpuRegs.fprc[_Fs_]], xRegisterSSE(mmreg)); } - + else if ((mmreg = _checkX86reg(X86TYPE_GPR, _Rt_, MODE_READ)) >= 0) + { + xMOV(ptr32[&fpuRegs.fprc[_Fs_]], xRegister32(mmreg)); + } else { _deleteGPRtoXMMreg(_Rt_, 1); @@ -184,36 +182,42 @@ void recMFC1() { if (!_Rt_) return; + EE::Profiler.EmitOp(eeOpcode::MFC1); - _eeOnWriteReg(_Rt_, 1); + const int xmmregt = _allocIfUsedGPRtoXMM(_Rt_, MODE_READ | MODE_WRITE); + const int regs = _allocIfUsedFPUtoXMM(_Fs_, MODE_READ); + if (regs >= 0 && xmmregt >= 0) + { + // if we're in xmm, we shouldn't be const + pxAssert(!GPR_IS_CONST1(_Rt_)); - const int regs = _checkXMMreg(XMMTYPE_FPREG, _Fs_, MODE_READ); + // both in xmm, sign extend and insert lower bits + const int temp = _allocTempXMMreg(XMMT_FPS); + xMOVAPS(xRegisterSSE(temp), xRegisterSSE(regs)); + xPSRA.D(xRegisterSSE(temp), 31); + xMOVSS(xRegisterSSE(xmmregt), xRegisterSSE(regs)); + xINSERTPS(xRegisterSSE(xmmregt), xRegisterSSE(temp), _MM_MK_INSERTPS_NDX(0, 1, 0)); + _freeXMMreg(temp); + return; + } + + // storing to a gpr.. + const int regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); + + // shouldn't be const after we're writing. + pxAssert(!GPR_IS_CONST1(_Rt_)); if (regs >= 0) { - _deleteGPRtoXMMreg(_Rt_, 2); - _signExtendXMMtoM((uptr)&cpuRegs.GPR.r[_Rt_].UL[0], regs, 0); + // xmm -> gpr + xMOVD(xRegister32(regt), xRegisterSSE(regs)); + xMOVSX(xRegister64(regt), xRegister32(regt)); } else { - const int regt = _checkXMMreg(XMMTYPE_GPRREG, _Rt_, MODE_READ); - - if (regt >= 0) - { - if (xmmregs[regt].mode & MODE_WRITE) - { - xMOVH.PS(ptr[&cpuRegs.GPR.r[_Rt_].UL[2]], xRegisterSSE(regt)); - } - xmmregs[regt].inuse = 0; - } - - _deleteEEreg(_Rt_, 0); - xMOV(eax, ptr[&fpuRegs.fpr[_Fs_].UL]); - - xCDQ(); - xMOV(ptr[&cpuRegs.GPR.r[_Rt_].UL[0]], eax); - xMOV(ptr[&cpuRegs.GPR.r[_Rt_].UL[1]], edx); + // mem -> gpr + xMOVSX(xRegister64(regt), ptr32[&fpuRegs.fpr[_Fs_].UL]); } } @@ -228,44 +232,60 @@ void recMTC1() EE::Profiler.EmitOp(eeOpcode::MTC1); if (GPR_IS_CONST1(_Rt_)) { - _deleteFPtoXMMreg(_Fs_, 0); - xMOV(ptr32[&fpuRegs.fpr[_Fs_].UL], g_cpuConstRegs[_Rt_].UL[0]); - } - else - { - int mmreg = _checkXMMreg(XMMTYPE_GPRREG, _Rt_, MODE_READ); - - if (mmreg >= 0) + const int xmmreg = _allocIfUsedFPUtoXMM(_Fs_, MODE_WRITE); + if (xmmreg >= 0) { - if (g_pCurInstInfo->regs[_Rt_] & EEINST_LASTUSE) + // common case: mtc1 zero, fnn + if (g_cpuConstRegs[_Rt_].UL[0] == 0) { - // transfer the reg directly - _deleteGPRtoXMMreg(_Rt_, 2); - _deleteFPtoXMMreg(_Fs_, 2); - _allocFPtoXMMreg(mmreg, _Fs_, MODE_WRITE); + xPXOR(xRegisterSSE(xmmreg), xRegisterSSE(xmmreg)); } else { - int mmreg2 = _allocCheckFPUtoXMM(g_pCurInstInfo, _Fs_, MODE_WRITE); - - if (mmreg2 >= 0) - xMOVSS(xRegisterSSE(mmreg2), xRegisterSSE(mmreg)); - else - xMOVSS(ptr[&fpuRegs.fpr[_Fs_].UL], xRegisterSSE(mmreg)); + // may as well flush the constant register, since we're needing it in a gpr anyway + const int x86reg = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + xMOVDZX(xRegisterSSE(xmmreg), xRegister32(x86reg)); } } else { - int mmreg2 = _allocCheckFPUtoXMM(g_pCurInstInfo, _Fs_, MODE_WRITE); - - if (mmreg2 >= 0) + pxAssert(!_hasXMMreg(XMMTYPE_FPREG, _Fs_)); + xMOV(ptr32[&fpuRegs.fpr[_Fs_].UL], g_cpuConstRegs[_Rt_].UL[0]); + } + } + else + { + const int xmmgpr = _checkXMMreg(XMMTYPE_GPRREG, _Rt_, MODE_READ); + if (xmmgpr >= 0) + { + if (g_pCurInstInfo->regs[_Rt_] & EEINST_LASTUSE) { - xMOVSSZX(xRegisterSSE(mmreg2), ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + // transfer the reg directly + _deleteFPtoXMMreg(_Fs_, DELETE_REG_FREE_NO_WRITEBACK); + _reallocateXMMreg(xmmgpr, XMMTYPE_FPREG, _Fs_, MODE_WRITE); } else { - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); - xMOV(ptr[&fpuRegs.fpr[_Fs_].UL], eax); + const int xmmreg2 = _allocIfUsedFPUtoXMM(_Fs_, MODE_WRITE); + if (xmmreg2 >= 0) + xMOVSS(xRegisterSSE(xmmreg2), xRegisterSSE(xmmgpr)); + else + xMOVSS(ptr[&fpuRegs.fpr[_Fs_].UL], xRegisterSSE(xmmgpr)); + } + } + else + { + // may as well cache it.. + const int regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + const int mmreg2 = _allocIfUsedFPUtoXMM(_Fs_, MODE_WRITE); + + if (mmreg2 >= 0) + { + xMOVDZX(xRegisterSSE(mmreg2), xRegister32(regt)); + } + else + { + xMOV(ptr32[&fpuRegs.fpr[_Fs_].UL], xRegister32(regt)); } } } @@ -311,31 +331,39 @@ REC_FPUFUNC(RSQRT_S); // Clamp Functions (Converts NaN's and Infinities to Normal Numbers) //------------------------------------------------------------------ -alignas(16) static u64 FPU_FLOAT_TEMP[2]; +static int fpuCopyToTempForClamp(int fpureg, int xmmreg) +{ + if (FPUINST_USEDTEST(fpureg)) + { + const int tempreg = _allocTempXMMreg(XMMT_FPS); + xMOVSS(xRegisterSSE(tempreg), xRegisterSSE(xmmreg)); + return tempreg; + } + + // flush back the original value, before we mess with it below + if (FPUINST_LIVETEST(fpureg)) + _flushXMMreg(xmmreg); + + // turn it into a temp, so in case the liveness was incorrect, we don't reuse it after clamp + _reallocateXMMreg(xmmreg, XMMTYPE_TEMP, 0, 0, true); + return xmmreg; +} + +static void fpuFreeIfTemp(int xmmreg) +{ + if (xmmregs[xmmreg].inuse && xmmregs[xmmreg].type == XMMTYPE_TEMP) + _freeXMMreg(xmmreg); +} + __fi void fpuFloat3(int regd) // +NaN -> +fMax, -NaN -> -fMax, +Inf -> +fMax, -Inf -> -fMax { - int t1reg = _allocTempXMMreg(XMMT_FPS, -1); - if (t1reg >= 0) - { - xMOVSS(xRegisterSSE(t1reg), xRegisterSSE(regd)); - xAND.PS(xRegisterSSE(t1reg), ptr[&s_neg[0]]); - xMIN.SS(xRegisterSSE(regd), ptr[&g_maxvals[0]]); - xMAX.SS(xRegisterSSE(regd), ptr[&g_minvals[0]]); - xOR.PS(xRegisterSSE(regd), xRegisterSSE(t1reg)); - _freeXMMreg(t1reg); - } - else - { - Console.Error("fpuFloat2() allocation error"); - t1reg = (regd == 0) ? 1 : 0; // get a temp reg thats not regd - xMOVAPS(ptr[&FPU_FLOAT_TEMP[0]], xRegisterSSE(t1reg)); // backup data in t1reg to a temp address - xMOVSS(xRegisterSSE(t1reg), xRegisterSSE(regd)); - xAND.PS(xRegisterSSE(t1reg), ptr[&s_neg[0]]); - xMIN.SS(xRegisterSSE(regd), ptr[&g_maxvals[0]]); - xMAX.SS(xRegisterSSE(regd), ptr[&g_minvals[0]]); - xOR.PS(xRegisterSSE(regd), xRegisterSSE(t1reg)); - xMOVAPS(xRegisterSSE(t1reg), ptr[&FPU_FLOAT_TEMP[0]]); // restore t1reg data - } + const int t1reg = _allocTempXMMreg(XMMT_FPS); + xMOVSS(xRegisterSSE(t1reg), xRegisterSSE(regd)); + xAND.PS(xRegisterSSE(t1reg), ptr[&s_neg[0]]); + xMIN.SS(xRegisterSSE(regd), ptr[&g_maxvals[0]]); + xMAX.SS(xRegisterSSE(regd), ptr[&g_minvals[0]]); + xOR.PS(xRegisterSSE(regd), xRegisterSSE(t1reg)); + _freeXMMreg(t1reg); } __fi void fpuFloat(int regd) // +/-NaN -> +fMax, +Inf -> +fMax, -Inf -> -fMax @@ -396,34 +424,31 @@ FPURECOMPILE_CONSTCODE(ABS_S, XMMINFO_WRITED | XMMINFO_READS); //------------------------------------------------------------------ void FPU_ADD_SUB(int regd, int regt, int issub) { - int tempecx = _allocX86reg(ecx, X86TYPE_TEMP, 0, 0); //receives regd - int temp2 = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); //receives regt - int xmmtemp = _allocTempXMMreg(XMMT_FPS, -1); //temporary for anding with regd/regt - - xMOVD(xRegister32(tempecx), xRegisterSSE(regd)); - xMOVD(xRegister32(temp2), xRegisterSSE(regt)); + const int xmmtemp = _allocTempXMMreg(XMMT_FPS); //temporary for anding with regd/regt + xMOVD(ecx, xRegisterSSE(regd)); // ecx receives regd + xMOVD(eax, xRegisterSSE(regt)); // eax receives regt //mask the exponents - xSHR(xRegister32(tempecx), 23); - xSHR(xRegister32(temp2), 23); - xAND(xRegister32(tempecx), 0xff); - xAND(xRegister32(temp2), 0xff); + xSHR(ecx, 23); + xSHR(eax, 23); + xAND(ecx, 0xff); + xAND(eax, 0xff); - xSUB(xRegister32(tempecx), xRegister32(temp2)); //tempecx = exponent difference - xCMP(xRegister32(tempecx), 25); + xSUB(ecx, eax); //tempecx = exponent difference + xCMP(ecx, 25); j8Ptr[0] = JGE8(0); - xCMP(xRegister32(tempecx), 0); + xCMP(ecx, 0); j8Ptr[1] = JG8(0); j8Ptr[2] = JE8(0); - xCMP(xRegister32(tempecx), -25); + xCMP(ecx, -25); j8Ptr[3] = JLE8(0); //diff = -24 .. -1 , expd < expt - xNEG(xRegister32(tempecx)); - xDEC(xRegister32(tempecx)); - xMOV(xRegister32(temp2), 0xffffffff); - xSHL(xRegister32(temp2), cl); //temp2 = 0xffffffff << tempecx - xMOVDZX(xRegisterSSE(xmmtemp), xRegister32(temp2)); + xNEG(ecx); + xDEC(ecx); + xMOV(eax, 0xffffffff); + xSHL(eax, cl); //temp2 = 0xffffffff << tempecx + xMOVDZX(xRegisterSSE(xmmtemp), eax); xAND.PS(xRegisterSSE(regd), xRegisterSSE(xmmtemp)); if (issub) xSUB.SS(xRegisterSSE(regd), xRegisterSSE(regt)); @@ -443,10 +468,10 @@ void FPU_ADD_SUB(int regd, int regt, int issub) x86SetJ8(j8Ptr[1]); //diff = 1 .. 24, expt < expd - xDEC(xRegister32(tempecx)); - xMOV(xRegister32(temp2), 0xffffffff); - xSHL(xRegister32(temp2), cl); //temp2 = 0xffffffff << tempecx - xMOVDZX(xRegisterSSE(xmmtemp), xRegister32(temp2)); + xDEC(ecx); + xMOV(eax, 0xffffffff); + xSHL(eax, cl); //temp2 = 0xffffffff << tempecx + xMOVDZX(xRegisterSSE(xmmtemp), eax); xAND.PS(xRegisterSSE(xmmtemp), xRegisterSSE(regt)); if (issub) xSUB.SS(xRegisterSSE(regd), xRegisterSSE(xmmtemp)); @@ -476,8 +501,6 @@ void FPU_ADD_SUB(int regd, int regt, int issub) x86SetJ8(j8Ptr[7]); _freeXMMreg(xmmtemp); - _freeX86reg(temp2); - _freeX86reg(tempecx); } void FPU_ADD(int regd, int regt) @@ -550,7 +573,7 @@ static void (*recComOpXMM_to_XMM_REV[])(x86SSERegType, x86SSERegType) = { //reve int recCommutativeOp(int info, int regd, int op) { - int t0reg = _allocTempXMMreg(XMMT_FPS, -1); + int t0reg = _allocTempXMMreg(XMMT_FPS); switch (info & (PROCESS_EE_S | PROCESS_EE_T)) { @@ -667,7 +690,7 @@ FPURECOMPILE_CONSTCODE(ADDA_S, XMMINFO_WRITEACC | XMMINFO_READS | XMMINFO_READT) static void _setupBranchTest() { - _eeFlushAllUnused(); + _eeFlushAllDirty(); // COP1 branch conditionals are based on the following equation: // (fpuRegs.fprc[31] & 0x00800000) @@ -680,29 +703,35 @@ static void _setupBranchTest() void recBC1F() { EE::Profiler.EmitOp(eeOpcode::BC1F); + const u32 branchTo = ((s32)_Imm_ * 4) + pc; + const bool swap = TrySwapDelaySlot(0, 0, 0, true); _setupBranchTest(); - recDoBranchImm(JNZ32(0)); + recDoBranchImm(branchTo, JNZ32(0), false, swap); } void recBC1T() { EE::Profiler.EmitOp(eeOpcode::BC1T); + const u32 branchTo = ((s32)_Imm_ * 4) + pc; + const bool swap = TrySwapDelaySlot(0, 0, 0, true); _setupBranchTest(); - recDoBranchImm(JZ32(0)); + recDoBranchImm(branchTo, JZ32(0), false, swap); } void recBC1FL() { EE::Profiler.EmitOp(eeOpcode::BC1FL); + const u32 branchTo = ((s32)_Imm_ * 4) + pc; _setupBranchTest(); - recDoBranchImm_Likely(JNZ32(0)); + recDoBranchImm(branchTo, JNZ32(0), true, false); } void recBC1TL() { EE::Profiler.EmitOp(eeOpcode::BC1TL); + const u32 branchTo = ((s32)_Imm_ * 4) + pc; _setupBranchTest(); - recDoBranchImm_Likely(JZ32(0)); + recDoBranchImm(branchTo, JZ32(0), true, false); } //------------------------------------------------------------------ @@ -713,49 +742,62 @@ void recBC1TL() void recC_EQ_xmm(int info) { EE::Profiler.EmitOp(eeOpcode::CEQ_F); - int tempReg; - int t0reg; //Console.WriteLn("recC_EQ_xmm()"); switch (info & (PROCESS_EE_S | PROCESS_EE_T)) { case PROCESS_EE_S: - fpuFloat3(EEREC_S); - t0reg = _allocTempXMMreg(XMMT_FPS, -1); - if (t0reg >= 0) { + const int regs = fpuCopyToTempForClamp(_Fs_, EEREC_S); + fpuFloat3(regs); + + const int t0reg = _allocTempXMMreg(XMMT_FPS); xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Ft_]]); fpuFloat3(t0reg); - xUCOMI.SS(xRegisterSSE(EEREC_S), xRegisterSSE(t0reg)); + + xUCOMI.SS(xRegisterSSE(regs), xRegisterSSE(t0reg)); + _freeXMMreg(t0reg); + fpuFreeIfTemp(regs); } - else - xUCOMI.SS(xRegisterSSE(EEREC_S), ptr[&fpuRegs.fpr[_Ft_]]); break; + case PROCESS_EE_T: - fpuFloat3(EEREC_T); - t0reg = _allocTempXMMreg(XMMT_FPS, -1); - if (t0reg >= 0) { + const int regt = fpuCopyToTempForClamp(_Ft_, EEREC_T); + fpuFloat3(regt); + + const int t0reg = _allocTempXMMreg(XMMT_FPS); xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Fs_]]); fpuFloat3(t0reg); - xUCOMI.SS(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); + + xUCOMI.SS(xRegisterSSE(t0reg), xRegisterSSE(regt)); + _freeXMMreg(t0reg); + fpuFreeIfTemp(regt); } - else - xUCOMI.SS(xRegisterSSE(EEREC_T), ptr[&fpuRegs.fpr[_Fs_]]); break; + case (PROCESS_EE_S | PROCESS_EE_T): - fpuFloat3(EEREC_S); - fpuFloat3(EEREC_T); - xUCOMI.SS(xRegisterSSE(EEREC_S), xRegisterSSE(EEREC_T)); + { + const int regs = fpuCopyToTempForClamp(_Fs_, EEREC_S); + fpuFloat3(regs); + + const int regt = fpuCopyToTempForClamp(_Ft_, EEREC_T); + fpuFloat3(regt); + + xUCOMI.SS(xRegisterSSE(regs), xRegisterSSE(regt)); + + fpuFreeIfTemp(regs); + fpuFreeIfTemp(regt); + } break; + default: Console.WriteLn(Color_Magenta, "recC_EQ_xmm: Default"); - tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); - xMOV(xRegister32(tempReg), ptr[&fpuRegs.fpr[_Fs_]]); - xCMP(xRegister32(tempReg), ptr[&fpuRegs.fpr[_Ft_]]); + xMOV(eax, ptr[&fpuRegs.fpr[_Fs_]]); + xCMP(eax, ptr[&fpuRegs.fpr[_Ft_]]); j8Ptr[0] = JZ8(0); xAND(ptr32[&fpuRegs.fprc[31]], ~FPUflagC); @@ -763,9 +805,6 @@ void recC_EQ_xmm(int info) x86SetJ8(j8Ptr[0]); xOR(ptr32[&fpuRegs.fprc[31]], FPUflagC); x86SetJ8(j8Ptr[1]); - - if (tempReg >= 0) - _freeX86reg(tempReg); return; } @@ -790,59 +829,62 @@ void recC_F() void recC_LE_xmm(int info) { EE::Profiler.EmitOp(eeOpcode::CLE_F); - int tempReg; //tempX86reg - int t0reg; //tempXMMreg //Console.WriteLn("recC_LE_xmm()"); switch (info & (PROCESS_EE_S | PROCESS_EE_T)) { case PROCESS_EE_S: - fpuFloat3(EEREC_S); - t0reg = _allocTempXMMreg(XMMT_FPS, -1); - if (t0reg >= 0) - { - xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Ft_]]); - fpuFloat3(t0reg); - xUCOMI.SS(xRegisterSSE(EEREC_S), xRegisterSSE(t0reg)); - _freeXMMreg(t0reg); - } - else - xUCOMI.SS(xRegisterSSE(EEREC_S), ptr[&fpuRegs.fpr[_Ft_]]); - break; - case PROCESS_EE_T: - fpuFloat3(EEREC_T); - t0reg = _allocTempXMMreg(XMMT_FPS, -1); - if (t0reg >= 0) - { - xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Fs_]]); - fpuFloat3(t0reg); - xUCOMI.SS(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); - _freeXMMreg(t0reg); - } - else - { - xUCOMI.SS(xRegisterSSE(EEREC_T), ptr[&fpuRegs.fpr[_Fs_]]); + { + const int regs = fpuCopyToTempForClamp(_Fs_, EEREC_S); + fpuFloat3(regs); + + const int t0reg = _allocTempXMMreg(XMMT_FPS); + xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Ft_]]); + fpuFloat3(t0reg); + + xUCOMI.SS(xRegisterSSE(regs), xRegisterSSE(t0reg)); + + _freeXMMreg(t0reg); + fpuFreeIfTemp(regs); + } + break; + + case PROCESS_EE_T: + { + const int regt = fpuCopyToTempForClamp(_Ft_, EEREC_T); + fpuFloat3(regt); + + const int t0reg = _allocTempXMMreg(XMMT_FPS); + xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Fs_]]); + fpuFloat3(t0reg); + + xUCOMI.SS(xRegisterSSE(t0reg), xRegisterSSE(regt)); + + _freeXMMreg(t0reg); + fpuFreeIfTemp(regt); + } + break; - j8Ptr[0] = JAE8(0); - xAND(ptr32[&fpuRegs.fprc[31]], ~FPUflagC); - j8Ptr[1] = JMP8(0); - x86SetJ8(j8Ptr[0]); - xOR(ptr32[&fpuRegs.fprc[31]], FPUflagC); - x86SetJ8(j8Ptr[1]); - return; - } - break; case (PROCESS_EE_S | PROCESS_EE_T): - fpuFloat3(EEREC_S); - fpuFloat3(EEREC_T); - xUCOMI.SS(xRegisterSSE(EEREC_S), xRegisterSSE(EEREC_T)); - break; + { + const int regs = fpuCopyToTempForClamp(_Fs_, EEREC_S); + fpuFloat3(regs); + + const int regt = fpuCopyToTempForClamp(_Ft_, EEREC_T); + fpuFloat3(regt); + + xUCOMI.SS(xRegisterSSE(regs), xRegisterSSE(regt)); + + fpuFreeIfTemp(regs); + fpuFreeIfTemp(regt); + } + break; + default: // Untested and incorrect, but this case is never reached AFAIK (cottonvibes) Console.WriteLn(Color_Magenta, "recC_LE_xmm: Default"); - tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); - xMOV(xRegister32(tempReg), ptr[&fpuRegs.fpr[_Fs_]]); - xCMP(xRegister32(tempReg), ptr[&fpuRegs.fpr[_Ft_]]); + xMOV(eax, ptr[&fpuRegs.fpr[_Fs_]]); + xCMP(eax, ptr[&fpuRegs.fpr[_Ft_]]); j8Ptr[0] = JLE8(0); xAND(ptr32[&fpuRegs.fprc[31]], ~FPUflagC); @@ -850,9 +892,6 @@ void recC_LE_xmm(int info) x86SetJ8(j8Ptr[0]); xOR(ptr32[&fpuRegs.fprc[31]], FPUflagC); x86SetJ8(j8Ptr[1]); - - if (tempReg >= 0) - _freeX86reg(tempReg); return; } @@ -870,61 +909,62 @@ FPURECOMPILE_CONSTCODE(C_LE, XMMINFO_READS | XMMINFO_READT); void recC_LT_xmm(int info) { EE::Profiler.EmitOp(eeOpcode::CLT_F); - int tempReg; - int t0reg; //Console.WriteLn("recC_LT_xmm()"); switch (info & (PROCESS_EE_S | PROCESS_EE_T)) { case PROCESS_EE_S: - fpuFloat3(EEREC_S); - t0reg = _allocTempXMMreg(XMMT_FPS, -1); - if (t0reg >= 0) - { - xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Ft_]]); - fpuFloat3(t0reg); - xUCOMI.SS(xRegisterSSE(EEREC_S), xRegisterSSE(t0reg)); - _freeXMMreg(t0reg); - } - else - xUCOMI.SS(xRegisterSSE(EEREC_S), ptr[&fpuRegs.fpr[_Ft_]]); - break; - case PROCESS_EE_T: - fpuFloat3(EEREC_T); - t0reg = _allocTempXMMreg(XMMT_FPS, -1); - if (t0reg >= 0) - { - xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Fs_]]); - fpuFloat3(t0reg); - xUCOMI.SS(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); - _freeXMMreg(t0reg); - } - else - { - xUCOMI.SS(xRegisterSSE(EEREC_T), ptr[&fpuRegs.fpr[_Fs_]]); + { + const int regs = fpuCopyToTempForClamp(_Fs_, EEREC_S); + fpuFloat3(regs); + + const int t0reg = _allocTempXMMreg(XMMT_FPS); + xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Ft_]]); + fpuFloat3(t0reg); + + xUCOMI.SS(xRegisterSSE(regs), xRegisterSSE(t0reg)); + + _freeXMMreg(t0reg); + fpuFreeIfTemp(regs); + } + break; + + case PROCESS_EE_T: + { + const int regt = fpuCopyToTempForClamp(_Ft_, EEREC_T); + fpuFloat3(regt); + + const int t0reg = _allocTempXMMreg(XMMT_FPS); + xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Fs_]]); + fpuFloat3(t0reg); + + xUCOMI.SS(xRegisterSSE(t0reg), xRegisterSSE(regt)); + + _freeXMMreg(t0reg); + fpuFreeIfTemp(regt); + } + break; - j8Ptr[0] = JA8(0); - xAND(ptr32[&fpuRegs.fprc[31]], ~FPUflagC); - j8Ptr[1] = JMP8(0); - x86SetJ8(j8Ptr[0]); - xOR(ptr32[&fpuRegs.fprc[31]], FPUflagC); - x86SetJ8(j8Ptr[1]); - return; - } - break; case (PROCESS_EE_S | PROCESS_EE_T): - // Clamp NaNs - // Note: This fixes a crash in Rule of Rose. - fpuFloat3(EEREC_S); - fpuFloat3(EEREC_T); - xUCOMI.SS(xRegisterSSE(EEREC_S), xRegisterSSE(EEREC_T)); - break; + { + const int regs = fpuCopyToTempForClamp(_Fs_, EEREC_S); + fpuFloat3(regs); + + const int regt = fpuCopyToTempForClamp(_Ft_, EEREC_T); + fpuFloat3(regt); + + xUCOMI.SS(xRegisterSSE(regs), xRegisterSSE(regt)); + + fpuFreeIfTemp(regs); + fpuFreeIfTemp(regt); + } + break; + default: Console.WriteLn(Color_Magenta, "recC_LT_xmm: Default"); - tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); - xMOV(xRegister32(tempReg), ptr[&fpuRegs.fpr[_Fs_]]); - xCMP(xRegister32(tempReg), ptr[&fpuRegs.fpr[_Ft_]]); + xMOV(eax, ptr[&fpuRegs.fpr[_Fs_]]); + xCMP(eax, ptr[&fpuRegs.fpr[_Ft_]]); j8Ptr[0] = JL8(0); xAND(ptr32[&fpuRegs.fprc[31]], ~FPUflagC); @@ -932,9 +972,6 @@ void recC_LT_xmm(int info) x86SetJ8(j8Ptr[0]); xOR(ptr32[&fpuRegs.fprc[31]], FPUflagC); x86SetJ8(j8Ptr[1]); - - if (tempReg >= 0) - _freeX86reg(tempReg); return; } @@ -957,13 +994,19 @@ FPURECOMPILE_CONSTCODE(C_LT, XMMINFO_READS | XMMINFO_READT); void recCVT_S_xmm(int info) { EE::Profiler.EmitOp(eeOpcode::CVTS_F); - if (!(info & PROCESS_EE_S) || (EEREC_D != EEREC_S && !(info & PROCESS_EE_MODEWRITES))) + if (info & PROCESS_EE_D) { - xCVTSI2SS(xRegisterSSE(EEREC_D), ptr32[&fpuRegs.fpr[_Fs_]]); + if (info & PROCESS_EE_S) + xCVTDQ2PS(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); + else + xCVTSI2SS(xRegisterSSE(EEREC_D), ptr32[&fpuRegs.fpr[_Fs_]]); } else { - xCVTDQ2PS(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); + const int temp = _allocTempXMMreg(XMMT_FPS); + xCVTSI2SS(xRegisterSSE(temp), ptr32[&fpuRegs.fpr[_Fs_]]); + xMOVSS(ptr32[&fpuRegs.fpr[_Fd_]], xRegisterSSE(temp)); + _freeXMMreg(temp); } } @@ -998,7 +1041,7 @@ void recCVT_W() } //kill register allocation for dst because we write directly to fpuRegs.fpr[_Fd_] - _deleteFPtoXMMreg(_Fd_, 2); + _deleteFPtoXMMreg(_Fd_, DELETE_REG_FREE_NO_WRITEBACK); xADD(edx, 0x7FFFFFFF); // 0x7FFFFFFF if positive, 0x8000 0000 if negative @@ -1018,23 +1061,22 @@ void recDIVhelper1(int regd, int regt) // Sets flags { u8 *pjmp1, *pjmp2; u32 *ajmp32, *bjmp32; - int t1reg = _allocTempXMMreg(XMMT_FPS, -1); - int tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); + const int t1reg = _allocTempXMMreg(XMMT_FPS); xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagI | FPUflagD)); // Clear I and D flags /*--- Check for divide by zero ---*/ xXOR.PS(xRegisterSSE(t1reg), xRegisterSSE(t1reg)); xCMPEQ.SS(xRegisterSSE(t1reg), xRegisterSSE(regt)); - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(t1reg)); - xAND(xRegister32(tempReg), 1); //Check sign (if regt == zero, sign will be set) + xMOVMSKPS(eax, xRegisterSSE(t1reg)); + xAND(eax, 1); //Check sign (if regt == zero, sign will be set) ajmp32 = JZ32(0); //Skip if not set /*--- Check for 0/0 ---*/ xXOR.PS(xRegisterSSE(t1reg), xRegisterSSE(t1reg)); xCMPEQ.SS(xRegisterSSE(t1reg), xRegisterSSE(regd)); - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(t1reg)); - xAND(xRegister32(tempReg), 1); //Check sign (if regd == zero, sign will be set) + xMOVMSKPS(eax, xRegisterSSE(t1reg)); + xAND(eax, 1); //Check sign (if regd == zero, sign will be set) pjmp1 = JZ8(0); //Skip if not set xOR(ptr32[&fpuRegs.fprc[31]], FPUflagI | FPUflagSI); // Set I and SI flags ( 0/0 ) pjmp2 = JMP8(0); @@ -1059,7 +1101,6 @@ void recDIVhelper1(int regd, int regt) // Sets flags x86SetJ32(bjmp32); _freeXMMreg(t1reg); - _freeX86reg(tempReg); } void recDIVhelper2(int regd, int regt) // Doesn't sets flags @@ -1075,7 +1116,7 @@ void recDIV_S_xmm(int info) { EE::Profiler.EmitOp(eeOpcode::DIV_F); bool roundmodeFlag = false; - int t0reg = _allocTempXMMreg(XMMT_FPS, -1); + int t0reg = _allocTempXMMreg(XMMT_FPS); //Console.WriteLn("DIV"); if (CHECK_FPUNEGDIVHACK) @@ -1181,7 +1222,7 @@ FPURECOMPILE_CONSTCODE(DIV_S, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); //------------------------------------------------------------------ void recMADDtemp(int info, int regd) { - const int t0reg = _allocTempXMMreg(XMMT_FPS, -1); + const int t0reg = _allocTempXMMreg(XMMT_FPS); switch (info & (PROCESS_EE_S | PROCESS_EE_T)) { @@ -1203,7 +1244,7 @@ void recMADDtemp(int info, int regd) FPU_ADD(regd, t0reg); } } - else if (regd == EEREC_ACC) + else if ((info & PROCESS_EE_ACC) && regd == EEREC_ACC) { xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Ft_]]); if (CHECK_FPU_EXTRA_OVERFLOW) { fpuFloat2(EEREC_S); fpuFloat2(t0reg); } @@ -1306,7 +1347,7 @@ void recMADDtemp(int info, int regd) FPU_ADD(regd, t0reg); } } - else if (regd == EEREC_ACC) + else if ((info & PROCESS_EE_ACC) && regd == EEREC_ACC) { xMOVSS(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); if (CHECK_FPU_EXTRA_OVERFLOW) { fpuFloat2(t0reg); fpuFloat2(EEREC_T); } @@ -1335,7 +1376,7 @@ void recMADDtemp(int info, int regd) default: if (regd == EEREC_ACC) { - const int t1reg = _allocTempXMMreg(XMMT_FPS, -1); + const int t1reg = _allocTempXMMreg(XMMT_FPS); xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Fs_]]); xMOVSSZX(xRegisterSSE(t1reg), ptr[&fpuRegs.fpr[_Ft_]]); if (CHECK_FPU_EXTRA_OVERFLOW) { fpuFloat2(t0reg); fpuFloat2(t1reg); } @@ -1433,7 +1474,7 @@ FPURECOMPILE_CONSTCODE(MOV_S, XMMINFO_WRITED | XMMINFO_READS); //------------------------------------------------------------------ void recMSUBtemp(int info, int regd) { - int t0reg = _allocTempXMMreg(XMMT_FPS, -1); + int t0reg = _allocTempXMMreg(XMMT_FPS); switch (info & (PROCESS_EE_S | PROCESS_EE_T)) { @@ -1559,7 +1600,7 @@ void recMSUBtemp(int info, int regd) default: if (regd == EEREC_ACC) { - const int t1reg = _allocTempXMMreg(XMMT_FPS, -1); + const int t1reg = _allocTempXMMreg(XMMT_FPS); xMOVSSZX(xRegisterSSE(t0reg), ptr[&fpuRegs.fpr[_Fs_]]); xMOVSSZX(xRegisterSSE(t1reg), ptr[&fpuRegs.fpr[_Ft_]]); if (CHECK_FPU_EXTRA_OVERFLOW) { fpuFloat2(t0reg); fpuFloat2(t1reg); } @@ -1663,7 +1704,7 @@ void recSUBhelper(int regd, int regt) void recSUBop(int info, int regd) { - int t0reg = _allocTempXMMreg(XMMT_FPS, -1); + int t0reg = _allocTempXMMreg(XMMT_FPS); //xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagO|FPUflagU)); // Clear O and U flags @@ -1761,19 +1802,15 @@ void recSQRT_S_xmm(int info) if (CHECK_FPU_EXTRA_FLAGS) { - int tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); - xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagI | FPUflagD)); // Clear I and D flags /*--- Check for negative SQRT ---*/ - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(EEREC_D)); - xAND(xRegister32(tempReg), 1); //Check sign + xMOVMSKPS(eax, xRegisterSSE(EEREC_D)); + xAND(eax, 1); //Check sign u8* pjmp = JZ8(0); //Skip if none are xOR(ptr32[&fpuRegs.fprc[31]], FPUflagI | FPUflagSI); // Set I and SI flags xAND.PS(xRegisterSSE(EEREC_D), ptr[&s_pos[0]]); // Make EEREC_D Positive x86SetJ8(pjmp); - - _freeX86reg(tempReg); } else xAND.PS(xRegisterSSE(EEREC_D), ptr[&s_pos[0]]); // Make EEREC_D Positive @@ -1800,14 +1837,13 @@ void recRSQRThelper1(int regd, int t0reg) // Preforms the RSQRT function when re u8 *pjmp1, *pjmp2; u32 *pjmp32; u8 *qjmp1, *qjmp2; - int t1reg = _allocTempXMMreg(XMMT_FPS, -1); - int tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); + int t1reg = _allocTempXMMreg(XMMT_FPS); xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagI | FPUflagD)); // Clear I and D flags /*--- (first) Check for negative SQRT ---*/ - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(t0reg)); - xAND(xRegister32(tempReg), 1); //Check sign + xMOVMSKPS(eax, xRegisterSSE(t0reg)); + xAND(eax, 1); //Check sign pjmp2 = JZ8(0); //Skip if not set xOR(ptr32[&fpuRegs.fprc[31]], FPUflagI | FPUflagSI); // Set I and SI flags xAND.PS(xRegisterSSE(t0reg), ptr[&s_pos[0]]); // Make t0reg Positive @@ -1816,14 +1852,14 @@ void recRSQRThelper1(int regd, int t0reg) // Preforms the RSQRT function when re /*--- Check for zero ---*/ xXOR.PS(xRegisterSSE(t1reg), xRegisterSSE(t1reg)); xCMPEQ.SS(xRegisterSSE(t1reg), xRegisterSSE(t0reg)); - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(t1reg)); - xAND(xRegister32(tempReg), 1); //Check sign (if t0reg == zero, sign will be set) + xMOVMSKPS(eax, xRegisterSSE(t1reg)); + xAND(eax, 1); //Check sign (if t0reg == zero, sign will be set) pjmp1 = JZ8(0); //Skip if not set /*--- Check for 0/0 ---*/ xXOR.PS(xRegisterSSE(t1reg), xRegisterSSE(t1reg)); xCMPEQ.SS(xRegisterSSE(t1reg), xRegisterSSE(regd)); - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(t1reg)); - xAND(xRegister32(tempReg), 1); //Check sign (if regd == zero, sign will be set) + xMOVMSKPS(eax, xRegisterSSE(t1reg)); + xAND(eax, 1); //Check sign (if regd == zero, sign will be set) qjmp1 = JZ8(0); //Skip if not set xOR(ptr32[&fpuRegs.fprc[31]], FPUflagI | FPUflagSI); // Set I and SI flags ( 0/0 ) qjmp2 = JMP8(0); @@ -1850,7 +1886,6 @@ void recRSQRThelper1(int regd, int t0reg) // Preforms the RSQRT function when re x86SetJ32(pjmp32); _freeXMMreg(t1reg); - _freeX86reg(tempReg); } void recRSQRThelper2(int regd, int t0reg) // Preforms the RSQRT function when regd <- Fs and t0reg <- Ft (Doesn't set flags) @@ -1872,7 +1907,7 @@ void recRSQRT_S_xmm(int info) // iFPUd (Full mode) sets roundmode to nearest for rSQRT. // Should this do the same, or should Full mode leave roundmode alone? --air - int t0reg = _allocTempXMMreg(XMMT_FPS, -1); + int t0reg = _allocTempXMMreg(XMMT_FPS); //Console.WriteLn("FPU: RSQRT"); switch (info & (PROCESS_EE_S | PROCESS_EE_T)) diff --git a/pcsx2/x86/iFPUd.cpp b/pcsx2/x86/iFPUd.cpp index 0a093242ba..486494aeb4 100644 --- a/pcsx2/x86/iFPUd.cpp +++ b/pcsx2/x86/iFPUd.cpp @@ -288,7 +288,7 @@ void SetMaxValue(int regd) #define ALLOC_S(sreg) \ do { \ - (sreg) = _allocTempXMMreg(XMMT_FPS, -1); \ + (sreg) = _allocTempXMMreg(XMMT_FPS); \ GET_S(sreg); \ } while (0) @@ -302,7 +302,7 @@ void SetMaxValue(int regd) #define ALLOC_T(treg) \ do { \ - (treg) = _allocTempXMMreg(XMMT_FPS, -1); \ + (treg) = _allocTempXMMreg(XMMT_FPS); \ GET_T(treg); \ } while (0) @@ -316,7 +316,7 @@ void SetMaxValue(int regd) #define ALLOC_ACC(areg) \ do { \ - (areg) = _allocTempXMMreg(XMMT_FPS, -1); \ + (areg) = _allocTempXMMreg(XMMT_FPS); \ GET_ACC(areg); \ } while (0) @@ -355,34 +355,31 @@ FPURECOMPILE_CONSTCODE(ABS_S, XMMINFO_WRITED | XMMINFO_READS); //------------------------------------------------------------------ void FPU_ADD_SUB(int tempd, int tempt) //tempd and tempt are overwritten, they are floats { - int tempecx = _allocX86reg(ecx, X86TYPE_TEMP, 0, 0); //receives regd - int temp2 = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); //receives regt - int xmmtemp = _allocTempXMMreg(XMMT_FPS, -1); //temporary for anding with regd/regt - - xMOVD(xRegister32(tempecx), xRegisterSSE(tempd)); - xMOVD(xRegister32(temp2), xRegisterSSE(tempt)); + const int xmmtemp = _allocTempXMMreg(XMMT_FPS); //temporary for anding with regd/regt + xMOVD(ecx, xRegisterSSE(tempd)); //receives regd + xMOVD(eax, xRegisterSSE(tempt)); //receives regt //mask the exponents - xSHR(xRegister32(tempecx), 23); - xSHR(xRegister32(temp2), 23); - xAND(xRegister32(tempecx), 0xff); - xAND(xRegister32(temp2), 0xff); + xSHR(ecx, 23); + xSHR(eax, 23); + xAND(ecx, 0xff); + xAND(eax, 0xff); - xSUB(xRegister32(tempecx), xRegister32(temp2)); //tempecx = exponent difference - xCMP(xRegister32(tempecx), 25); + xSUB(ecx, eax); //tempecx = exponent difference + xCMP(ecx, 25); j8Ptr[0] = JGE8(0); - xCMP(xRegister32(tempecx), 0); + xCMP(ecx, 0); j8Ptr[1] = JG8(0); j8Ptr[2] = JE8(0); - xCMP(xRegister32(tempecx), -25); + xCMP(ecx, -25); j8Ptr[3] = JLE8(0); //diff = -24 .. -1 , expd < expt - xNEG(xRegister32(tempecx)); - xDEC(xRegister32(tempecx)); - xMOV(xRegister32(temp2), 0xffffffff); - xSHL(xRegister32(temp2), cl); //temp2 = 0xffffffff << tempecx - xMOVDZX(xRegisterSSE(xmmtemp), xRegister32(temp2)); + xNEG(ecx); + xDEC(ecx); + xMOV(eax, 0xffffffff); + xSHL(eax, cl); //temp2 = 0xffffffff << tempecx + xMOVDZX(xRegisterSSE(xmmtemp), eax); xAND.PS(xRegisterSSE(tempd), xRegisterSSE(xmmtemp)); j8Ptr[4] = JMP8(0); @@ -393,10 +390,10 @@ void FPU_ADD_SUB(int tempd, int tempt) //tempd and tempt are overwritten, they a x86SetJ8(j8Ptr[1]); //diff = 1 .. 24, expt < expd - xDEC(xRegister32(tempecx)); - xMOV(xRegister32(temp2), 0xffffffff); - xSHL(xRegister32(temp2), cl); //temp2 = 0xffffffff << tempecx - xMOVDZX(xRegisterSSE(xmmtemp), xRegister32(temp2)); + xDEC(ecx); + xMOV(eax, 0xffffffff); + xSHL(eax, cl); //temp2 = 0xffffffff << tempecx + xMOVDZX(xRegisterSSE(xmmtemp), eax); xAND.PS(xRegisterSSE(tempt), xRegisterSSE(xmmtemp)); j8Ptr[6] = JMP8(0); @@ -412,8 +409,6 @@ void FPU_ADD_SUB(int tempd, int tempt) //tempd and tempt are overwritten, they a x86SetJ8(j8Ptr[6]); _freeXMMreg(xmmtemp); - _freeX86reg(temp2); - _freeX86reg(tempecx); } void FPU_MUL(int info, int regd, int sreg, int treg, bool acc) @@ -554,10 +549,21 @@ FPURECOMPILE_CONSTCODE(C_LT, XMMINFO_READS | XMMINFO_READT); void recCVT_S_xmm(int info) { EE::Profiler.EmitOp(eeOpcode::CVTS_F); - if (!(info & PROCESS_EE_S) || (EEREC_D != EEREC_S && !(info & PROCESS_EE_MODEWRITES))) - xCVTSI2SS(xRegisterSSE(EEREC_D), ptr32[&fpuRegs.fpr[_Fs_]]); + + if (info & PROCESS_EE_D) + { + if (info & PROCESS_EE_S) + xCVTDQ2PS(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); + else + xCVTSI2SS(xRegisterSSE(EEREC_D), ptr32[&fpuRegs.fpr[_Fs_]]); + } else - xCVTDQ2PS(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); + { + const int temp = _allocTempXMMreg(XMMT_FPS); + xCVTSI2SS(xRegisterSSE(temp), ptr32[&fpuRegs.fpr[_Fs_]]); + xMOVSS(ptr32[&fpuRegs.fpr[_Fd_]], xRegisterSSE(temp)); + _freeXMMreg(temp); + } } FPURECOMPILE_CONSTCODE(CVT_S, XMMINFO_WRITED | XMMINFO_READS); @@ -581,7 +587,7 @@ void recCVT_W() //called from iFPU.cpp's recCVT_W } //kill register allocation for dst because we write directly to fpuRegs.fpr[_Fd_] - _deleteFPtoXMMreg(_Fd_, 2); + _deleteFPtoXMMreg(_Fd_, DELETE_REG_FREE_NO_WRITEBACK); xADD(edx, 0x7FFFFFFF); // 0x7FFFFFFF if positive, 0x8000 0000 if negative @@ -601,23 +607,22 @@ void recDIVhelper1(int regd, int regt) // Sets flags { u8 *pjmp1, *pjmp2; u32 *ajmp32, *bjmp32; - int t1reg = _allocTempXMMreg(XMMT_FPS, -1); - int tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); + const int t1reg = _allocTempXMMreg(XMMT_FPS); xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagI | FPUflagD)); // Clear I and D flags //--- Check for divide by zero --- xXOR.PS(xRegisterSSE(t1reg), xRegisterSSE(t1reg)); xCMPEQ.SS(xRegisterSSE(t1reg), xRegisterSSE(regt)); - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(t1reg)); - xAND(xRegister32(tempReg), 1); //Check sign (if regt == zero, sign will be set) + xMOVMSKPS(eax, xRegisterSSE(t1reg)); + xAND(eax, 1); //Check sign (if regt == zero, sign will be set) ajmp32 = JZ32(0); //Skip if not set //--- Check for 0/0 --- xXOR.PS(xRegisterSSE(t1reg), xRegisterSSE(t1reg)); xCMPEQ.SS(xRegisterSSE(t1reg), xRegisterSSE(regd)); - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(t1reg)); - xAND(xRegister32(tempReg), 1); //Check sign (if regd == zero, sign will be set) + xMOVMSKPS(eax, xRegisterSSE(t1reg)); + xAND(eax, 1); //Check sign (if regd == zero, sign will be set) pjmp1 = JZ8(0); //Skip if not set xOR(ptr32[&fpuRegs.fprc[31]], FPUflagI | FPUflagSI); // Set I and SI flags ( 0/0 ) pjmp2 = JMP8(0); @@ -642,7 +647,6 @@ void recDIVhelper1(int regd, int regt) // Sets flags x86SetJ32(bjmp32); _freeXMMreg(t1reg); - _freeX86reg(tempReg); } void recDIVhelper2(int regd, int regt) // Doesn't sets flags @@ -951,8 +955,7 @@ void recSQRT_S_xmm(int info) { EE::Profiler.EmitOp(eeOpcode::SQRT_F); int roundmodeFlag = 0; - const int tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); - const int t1reg = _allocTempXMMreg(XMMT_FPS, -1); + const int t1reg = _allocTempXMMreg(XMMT_FPS); //Console.WriteLn("FPU: SQRT"); if (g_sseMXCSR.GetRoundMode() != SSEround_Nearest) @@ -972,8 +975,8 @@ void recSQRT_S_xmm(int info) xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagI | FPUflagD)); // Clear I and D flags //--- Check for negative SQRT --- (sqrt(-0) = 0, unlike what the docs say) - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(EEREC_D)); - xAND(xRegister32(tempReg), 1); //Check sign + xMOVMSKPS(eax, xRegisterSSE(EEREC_D)); + xAND(eax, 1); //Check sign u8* pjmp = JZ8(0); //Skip if none are xOR(ptr32[&fpuRegs.fprc[31]], FPUflagI | FPUflagSI); // Set I and SI flags xAND.PS(xRegisterSSE(EEREC_D), ptr[&s_const.pos[0]]); // Make EEREC_D Positive @@ -994,7 +997,6 @@ void recSQRT_S_xmm(int info) if (roundmodeFlag == 1) xLDMXCSR(g_sseMXCSR); - _freeX86reg(tempReg); _freeXMMreg(t1reg); } @@ -1010,14 +1012,13 @@ void recRSQRThelper1(int regd, int regt) // Preforms the RSQRT function when reg u8 *pjmp1, *pjmp2; u8 *qjmp1, *qjmp2; u32* pjmp32; - int t1reg = _allocTempXMMreg(XMMT_FPS, -1); - int tempReg = _allocX86reg(xEmptyReg, X86TYPE_TEMP, 0, 0); + int t1reg = _allocTempXMMreg(XMMT_FPS); xAND(ptr32[&fpuRegs.fprc[31]], ~(FPUflagI | FPUflagD)); // Clear I and D flags //--- (first) Check for negative SQRT --- - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(regt)); - xAND(xRegister32(tempReg), 1); //Check sign + xMOVMSKPS(eax, xRegisterSSE(regt)); + xAND(eax, 1); //Check sign pjmp2 = JZ8(0); //Skip if not set xOR(ptr32[&fpuRegs.fprc[31]], FPUflagI | FPUflagSI); // Set I and SI flags xAND.PS(xRegisterSSE(regt), ptr[&s_const.pos[0]]); // Make regt Positive @@ -1026,15 +1027,15 @@ void recRSQRThelper1(int regd, int regt) // Preforms the RSQRT function when reg //--- Check for zero --- xXOR.PS(xRegisterSSE(t1reg), xRegisterSSE(t1reg)); xCMPEQ.SS(xRegisterSSE(t1reg), xRegisterSSE(regt)); - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(t1reg)); - xAND(xRegister32(tempReg), 1); //Check sign (if regt == zero, sign will be set) + xMOVMSKPS(eax, xRegisterSSE(t1reg)); + xAND(eax, 1); //Check sign (if regt == zero, sign will be set) pjmp1 = JZ8(0); //Skip if not set //--- Check for 0/0 --- xXOR.PS(xRegisterSSE(t1reg), xRegisterSSE(t1reg)); xCMPEQ.SS(xRegisterSSE(t1reg), xRegisterSSE(regd)); - xMOVMSKPS(xRegister32(tempReg), xRegisterSSE(t1reg)); - xAND(xRegister32(tempReg), 1); //Check sign (if regd == zero, sign will be set) + xMOVMSKPS(eax, xRegisterSSE(t1reg)); + xAND(eax, 1); //Check sign (if regd == zero, sign will be set) qjmp1 = JZ8(0); //Skip if not set xOR(ptr32[&fpuRegs.fprc[31]], FPUflagI | FPUflagSI); // Set I and SI flags ( 0/0 ) qjmp2 = JMP8(0); @@ -1055,7 +1056,6 @@ void recRSQRThelper1(int regd, int regt) // Preforms the RSQRT function when reg x86SetJ32(pjmp32); _freeXMMreg(t1reg); - _freeX86reg(tempReg); } void recRSQRThelper2(int regd, int regt) // Preforms the RSQRT function when regd <- Fs and regt <- Ft (Doesn't set flags) diff --git a/pcsx2/x86/iMMI.cpp b/pcsx2/x86/iMMI.cpp index a80fd4b5f4..a96ba15f09 100644 --- a/pcsx2/x86/iMMI.cpp +++ b/pcsx2/x86/iMMI.cpp @@ -56,11 +56,14 @@ REC_FUNC_DEL(PSLLW, _Rd_); void recPLZCW() { - int regs = -1; + int x86regs = -1; + int xmmregs = -1; if (!_Rd_) return; + // TODO(Stenzek): Don't flush to memory at the end here. Careful of Rs == Rd. + EE::Profiler.EmitOp(eeOpcode::PLZCW); if (GPR_IS_CONST1(_Rs_)) @@ -78,16 +81,20 @@ void recPLZCW() _eeOnWriteReg(_Rd_, 0); - if ((regs = _checkXMMreg(XMMTYPE_GPRREG, _Rs_, MODE_READ)) >= 0) + if ((xmmregs = _checkXMMreg(XMMTYPE_GPRREG, _Rs_, MODE_READ)) >= 0) { - xMOVD(eax, xRegisterSSE(regs)); + xMOVD(eax, xRegisterSSE(xmmregs)); + } + else if ((x86regs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ)) >= 0) + { + xMOV(eax, xRegister32(x86regs)); } else { xMOV(eax, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); } - _deleteEEreg(_Rd_, 0); + _deleteEEreg(_Rd_, DELETE_REG_FREE_NO_WRITEBACK); // Count the number of leading bits (MSB) that match the sign bit, excluding the sign // bit itself. @@ -115,11 +122,14 @@ void recPLZCW() // second word - if (regs >= 0) + if (xmmregs >= 0) { - xPSHUF.D(xRegisterSSE(regs & 0xf), xRegisterSSE(regs & 0xf), 0xe1); - xMOVD(eax, xRegisterSSE(regs & 0xf)); - xPSHUF.D(xRegisterSSE(regs & 0xf), xRegisterSSE(regs & 0xf), 0xe1); + xPEXTR.D(eax, xRegisterSSE(xmmregs), 1); + } + else if (x86regs >= 0) + { + xMOV(rax, xRegister64(x86regs)); + xSHR(rax, 32); } else { @@ -158,7 +168,7 @@ void recPMFHL() { case 0x00: // LW - t0reg = _allocTempXMMreg(XMMT_INT, -1); + t0reg = _allocTempXMMreg(XMMT_INT); xPSHUF.D(xRegisterSSE(t0reg), xRegisterSSE(EEREC_HI), 0x88); xPSHUF.D(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_LO), 0x88); xPUNPCK.LDQ(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -167,7 +177,7 @@ void recPMFHL() break; case 0x01: // UW - t0reg = _allocTempXMMreg(XMMT_INT, -1); + t0reg = _allocTempXMMreg(XMMT_INT); xPSHUF.D(xRegisterSSE(t0reg), xRegisterSSE(EEREC_HI), 0xdd); xPSHUF.D(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_LO), 0xdd); xPUNPCK.LDQ(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -182,7 +192,7 @@ void recPMFHL() break; case 0x03: // LH - t0reg = _allocTempXMMreg(XMMT_INT, -1); + t0reg = _allocTempXMMreg(XMMT_INT); xPSHUF.LW(xRegisterSSE(t0reg), xRegisterSSE(EEREC_HI), 0x88); xPSHUF.LW(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_LO), 0x88); xPSHUF.HW(xRegisterSSE(t0reg), xRegisterSSE(t0reg), 0x88); @@ -452,7 +462,7 @@ void recPPACW() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); if (EEREC_D == EEREC_T) { xPSHUF.D(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S), 0x88); @@ -492,7 +502,7 @@ void recPPACH() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xPSHUF.LW(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S), 0x88); xPSHUF.LW(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T), 0x88); xPSHUF.HW(xRegisterSSE(t0reg), xRegisterSSE(t0reg), 0x88); @@ -518,28 +528,19 @@ void recPPACB() int info = eeRecompileCodeXMM((_Rs_ != 0 ? XMMINFO_READS : 0) | XMMINFO_READT | XMMINFO_WRITED); if (_Rs_ == 0) { - if (_hasFreeXMMreg()) - { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); - xPSLL.W(xRegisterSSE(EEREC_D), 8); - xPXOR(xRegisterSSE(t0reg), xRegisterSSE(t0reg)); - xPSRL.W(xRegisterSSE(EEREC_D), 8); - xPACK.USWB(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); - _freeXMMreg(t0reg); - } - else - { - xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); - xPSLL.W(xRegisterSSE(EEREC_D), 8); - xPSRL.W(xRegisterSSE(EEREC_D), 8); - xPACK.USWB(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_D)); - xPSRL.DQ(xRegisterSSE(EEREC_D), 8); - } + const int t0reg = _allocTempXMMreg(XMMT_INT); + + xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); + xPSLL.W(xRegisterSSE(EEREC_D), 8); + xPXOR(xRegisterSSE(t0reg), xRegisterSSE(t0reg)); + xPSRL.W(xRegisterSSE(EEREC_D), 8); + xPACK.USWB(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); + + _freeXMMreg(t0reg); } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + const int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); @@ -563,8 +564,8 @@ void recPEXT5() EE::Profiler.EmitOp(eeOpcode::PEXT5); int info = eeRecompileCodeXMM(XMMINFO_READT | XMMINFO_WRITED); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); // for bit 5..9 xMOVDQA(xRegisterSSE(t1reg), xRegisterSSE(EEREC_T)); // for bit 15 @@ -602,8 +603,8 @@ void recPPAC5() EE::Profiler.EmitOp(eeOpcode::PPAC5); int info = eeRecompileCodeXMM(XMMINFO_READT | XMMINFO_WRITED); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); // for bit 10..14 xMOVDQA(xRegisterSSE(t1reg), xRegisterSSE(EEREC_T)); // for bit 15 @@ -671,7 +672,7 @@ void recPCGTB() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPCMP.GTB(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -696,7 +697,7 @@ void recPCGTH() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPCMP.GTW(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -722,7 +723,7 @@ void recPCGTW() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPCMP.GTD(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -783,9 +784,9 @@ void recPADDSW() EE::Profiler.EmitOp(eeOpcode::PADDSW); int info = eeRecompileCodeXMM(XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); - int t2reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); + int t2reg = _allocTempXMMreg(XMMT_INT); // The idea is: // s = x + y; (wrap-arounded) @@ -843,7 +844,7 @@ void recPSUBSB() xPSUB.SB(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); else if (EEREC_D == EEREC_T) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPSUB.SB(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -870,7 +871,7 @@ void recPSUBSH() xPSUB.SW(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); else if (EEREC_D == EEREC_T) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPSUB.SW(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -894,9 +895,9 @@ void recPSUBSW() EE::Profiler.EmitOp(eeOpcode::PSUBSW); int info = eeRecompileCodeXMM(XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); - int t2reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); + int t2reg = _allocTempXMMreg(XMMT_INT); // The idea is: // s = x - y; (wrap-arounded) @@ -1050,7 +1051,7 @@ void recPSUBB() xPSUB.B(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); else if (EEREC_D == EEREC_T) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPSUB.B(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1077,7 +1078,7 @@ void recPSUBH() xPSUB.W(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); else if (EEREC_D == EEREC_T) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPSUB.W(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1104,7 +1105,7 @@ void recPSUBW() xPSUB.D(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); else if (EEREC_D == EEREC_T) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPSUB.D(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1138,7 +1139,7 @@ void recPEXTLW() xPUNPCK.LDQ(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); else if (EEREC_D == EEREC_S) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); xPUNPCK.LDQ(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1172,7 +1173,7 @@ void recPEXTLB() xPUNPCK.LBW(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); else if (EEREC_D == EEREC_S) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); xPUNPCK.LBW(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1206,7 +1207,7 @@ void recPEXTLH() xPUNPCK.LWD(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); else if (EEREC_D == EEREC_S) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); xPUNPCK.LWD(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1264,7 +1265,7 @@ void recPABSW() //needs clamping EE::Profiler.EmitOp(eeOpcode::PABSW); int info = eeRecompileCodeXMM(XMMINFO_READT | XMMINFO_WRITED); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xPCMP.EQD(xRegisterSSE(t0reg), xRegisterSSE(t0reg)); xPSLL.D(xRegisterSSE(t0reg), 31); xPCMP.EQD(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); //0xffffffff if equal to 0x80000000 @@ -1284,7 +1285,7 @@ void recPABSH() EE::Profiler.EmitOp(eeOpcode::PABSH); int info = eeRecompileCodeXMM(XMMINFO_READT | XMMINFO_WRITED); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xPCMP.EQW(xRegisterSSE(t0reg), xRegisterSSE(t0reg)); xPSLL.W(xRegisterSSE(t0reg), 15); xPCMP.EQW(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); //0xffff if equal to 0x8000 @@ -1337,7 +1338,7 @@ void recPADSBH() } else { - const int t0reg = _allocTempXMMreg(XMMT_INT, -1); + const int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); @@ -1387,8 +1388,8 @@ void recPADDUW() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); xPCMP.EQB(xRegisterSSE(t0reg), xRegisterSSE(t0reg)); xPSLL.D(xRegisterSSE(t0reg), 31); // 0x80000000 @@ -1432,7 +1433,7 @@ void recPSUBUB() xPSUB.USB(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); else if (EEREC_D == EEREC_T) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPSUB.USB(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1459,7 +1460,7 @@ void recPSUBUH() xPSUB.USW(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); else if (EEREC_D == EEREC_T) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xPSUB.USW(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1482,8 +1483,8 @@ void recPSUBUW() EE::Profiler.EmitOp(eeOpcode::PSUBUW); int info = eeRecompileCodeXMM(XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); xPCMP.EQB(xRegisterSSE(t0reg), xRegisterSSE(t0reg)); xPSLL.D(xRegisterSSE(t0reg), 31); // 0x80000000 @@ -1545,7 +1546,7 @@ void recPEXTUH() xPUNPCK.HWD(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); else if (EEREC_D == EEREC_S) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); xPUNPCK.HWD(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1614,7 +1615,7 @@ void recPEXTUB() xPUNPCK.HBW(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); else if (EEREC_D == EEREC_S) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); xPUNPCK.HBW(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1649,7 +1650,7 @@ void recPEXTUW() xPUNPCK.HDQ(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); else if (EEREC_D == EEREC_S) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); xPUNPCK.HDQ(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); @@ -1910,8 +1911,8 @@ void recPSLLVW() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); // shamt is 5-bit xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); @@ -1967,8 +1968,8 @@ void recPSRLVW() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); // shamt is 5-bit xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); @@ -2134,7 +2135,7 @@ void recPHMADH() EE::Profiler.EmitOp(eeOpcode::PHMADH); int info = eeRecompileCodeXMM((_Rd_ ? XMMINFO_WRITED : 0) | XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITELO | XMMINFO_WRITEHI); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); xPSRL.D(xRegisterSSE(t0reg), 16); @@ -2181,8 +2182,8 @@ void recPMSUBH() EE::Profiler.EmitOp(eeOpcode::PMSUBH); int info = eeRecompileCodeXMM((_Rd_ ? XMMINFO_WRITED : 0) | XMMINFO_READS | XMMINFO_READT | XMMINFO_READLO | XMMINFO_READHI | XMMINFO_WRITELO | XMMINFO_WRITEHI); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); if (!_Rd_) { @@ -2247,7 +2248,7 @@ void recPHMSBH() EE::Profiler.EmitOp(eeOpcode::PHMSBH); int info = eeRecompileCodeXMM((_Rd_ ? XMMINFO_WRITED : 0) | XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITELO | XMMINFO_WRITEHI); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xPCMP.EQD(xRegisterSSE(EEREC_LO), xRegisterSSE(EEREC_LO)); xPSRL.D(xRegisterSSE(EEREC_LO), 16); @@ -2316,7 +2317,7 @@ void recPINTH() int info = eeRecompileCodeXMM(XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); if (EEREC_D == EEREC_S) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVHL.PS(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); if (EEREC_D != EEREC_T) xMOVQZX(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); @@ -2360,7 +2361,7 @@ void recPMULTH() EE::Profiler.EmitOp(eeOpcode::PMULTH); int info = eeRecompileCodeXMM(XMMINFO_READS | XMMINFO_READT | (_Rd_ ? XMMINFO_WRITED : 0) | XMMINFO_WRITELO | XMMINFO_WRITEHI); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(EEREC_LO), xRegisterSSE(EEREC_S)); xMOVDQA(xRegisterSSE(EEREC_HI), xRegisterSSE(EEREC_S)); @@ -2506,8 +2507,8 @@ void recPMADDH() EE::Profiler.EmitOp(eeOpcode::PMADDH); int info = eeRecompileCodeXMM((_Rd_ ? XMMINFO_WRITED : 0) | XMMINFO_READS | XMMINFO_READT | XMMINFO_READLO | XMMINFO_READHI | XMMINFO_WRITELO | XMMINFO_WRITEHI); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); if (!_Rd_) { @@ -2616,8 +2617,8 @@ void recPSRAVW() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); + int t1reg = _allocTempXMMreg(XMMT_INT); // shamt is 5-bit xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); @@ -2699,7 +2700,7 @@ void recPINTEH() else if (EEREC_D == EEREC_T) { pxAssert(EEREC_D != EEREC_S); - t0reg = _allocTempXMMreg(XMMT_INT, -1); + t0reg = _allocTempXMMreg(XMMT_INT); xPSLL.D(xRegisterSSE(EEREC_D), 16); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); xPSRL.D(xRegisterSSE(EEREC_D), 16); @@ -2708,7 +2709,7 @@ void recPINTEH() } else { - t0reg = _allocTempXMMreg(XMMT_INT, -1); + t0reg = _allocTempXMMreg(XMMT_INT); xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_S)); xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); xPSLL.D(xRegisterSSE(t0reg), 16); @@ -2767,7 +2768,7 @@ void recPMULTUW() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xPSHUF.D(xRegisterSSE(t0reg), xRegisterSSE(EEREC_HI), 0xd8); xMOVDQA(xRegisterSSE(EEREC_LO), xRegisterSSE(t0reg)); xMOVDQA(xRegisterSSE(EEREC_HI), xRegisterSSE(t0reg)); @@ -2833,7 +2834,7 @@ void recPMADDUW() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xPSHUF.D(xRegisterSSE(t0reg), xRegisterSSE(EEREC_HI), 0xd8); xMOVDQA(xRegisterSSE(EEREC_LO), xRegisterSSE(t0reg)); xMOVDQA(xRegisterSSE(EEREC_HI), xRegisterSSE(t0reg)); @@ -2902,7 +2903,7 @@ void recPNOR() { if (EEREC_D == EEREC_T) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xPCMP.EQD(xRegisterSSE(t0reg), xRegisterSSE(t0reg)); xPXOR(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); _freeXMMreg(t0reg); @@ -2919,7 +2920,7 @@ void recPNOR() { if (EEREC_D == EEREC_S) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); xPCMP.EQD(xRegisterSSE(t0reg), xRegisterSSE(t0reg)); xPXOR(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); _freeXMMreg(t0reg); @@ -2932,7 +2933,7 @@ void recPNOR() } else { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); + int t0reg = _allocTempXMMreg(XMMT_INT); if (EEREC_D == EEREC_S) xPOR(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); diff --git a/pcsx2/x86/iR3000A.cpp b/pcsx2/x86/iR3000A.cpp index 61ef6841ff..9969fcce95 100644 --- a/pcsx2/x86/iR3000A.cpp +++ b/pcsx2/x86/iR3000A.cpp @@ -51,9 +51,21 @@ #include "fmt/core.h" +// #define DUMP_BLOCKS 1 +// #define TRACE_BLOCKS 1 + +#ifdef DUMP_BLOCKS +#include "Zydis/Zydis.h" +#include "Zycore/Format.h" +#include "Zycore/Status.h" +#endif + +#ifdef TRACE_BLOCKS +#include +#endif + using namespace x86Emitter; -extern u32 g_iopNextEventCycle; extern void psxBREAK(); u32 g_psxMaxRecMem = 0; @@ -66,8 +78,8 @@ static __fi u32 HWADDR(u32 mem) { return psxhwLUT[mem >> 16] + mem; } static RecompiledCodeReserve* recMem = NULL; -static BASEBLOCK* recRAM = NULL; // and the ptr to the blocks here -static BASEBLOCK* recROM = NULL; // and here +static BASEBLOCK* recRAM = NULL; // and the ptr to the blocks here +static BASEBLOCK* recROM = NULL; // and here static BASEBLOCK* recROM1 = NULL; // also here static BASEBLOCK* recROM2 = NULL; // also here static BaseBlocks recBlocks; @@ -92,6 +104,7 @@ static EEINST* s_psaveInstInfo = NULL; u32 s_psxBlockCycles = 0; // cycles of current block recompiling static u32 s_savenBlockCycles = 0; +static bool s_recompilingDelaySlot = false; static void iPsxBranchTest(u32 newpc, u32 cpuBranch); void psxRecompileNextInstruction(int delayslot); @@ -107,7 +120,58 @@ static u32 psxdump = 0; #define PSXREC_CLEARM(mem) \ (((mem) < g_psxMaxRecMem && (psxRecLUT[(mem) >> 16] + (mem))) ? \ - psxRecClearMem(mem) : 4) + psxRecClearMem(mem) : \ + 4) + +#ifdef DUMP_BLOCKS +static ZydisFormatterFunc s_old_print_address; + +static ZyanStatus ZydisFormatterPrintAddressAbsolute(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZyanU64 address; + ZYAN_CHECK(ZydisCalcAbsoluteAddress(context->instruction, context->operand, + context->runtime_address, &address)); + + char buf[128]; + u32 len = 0; + +#define A(x) ((u64)(x)) + + if (address >= A(iopMem->Main) && address < A(iopMem->P)) + { + len = snprintf(buf, sizeof(buf), "iopMem+0x%08X", static_cast(address - A(iopMem->Main))); + } + else if (address >= A(&psxRegs.GPR) && address < A(&psxRegs.CP0)) + { + len = snprintf(buf, sizeof(buf), "psxRegs.GPR.%s", R3000A::disRNameGPR[static_cast(address - A(&psxRegs)) / 4u]); + } + else if (address == A(&psxRegs.pc)) + { + len = snprintf(buf, sizeof(buf), "psxRegs.pc"); + } + else if (address == A(&psxRegs.cycle)) + { + len = snprintf(buf, sizeof(buf), "psxRegs.cycle"); + } + else if (address == A(&g_nextEventCycle)) + { + len = snprintf(buf, sizeof(buf), "g_nextEventCycle"); + } + +#undef A + + if (len > 0) + { + ZYAN_CHECK(ZydisFormatterBufferAppend(buffer, ZYDIS_TOKEN_SYMBOL)); + ZyanString* string; + ZYAN_CHECK(ZydisFormatterBufferGetString(buffer, &string)); + return ZyanStringAppendFormat(string, "&%s", buf); + } + + return s_old_print_address(formatter, buffer, context); +} +#endif // ===================================================================================================== // Dynamically Compiled Dispatchers - R3000A style @@ -120,12 +184,12 @@ alignas(__pagesize) static u8 iopRecDispatchers[__pagesize]; typedef void DynGenFunc(); -static DynGenFunc* iopDispatcherEvent = NULL; -static DynGenFunc* iopDispatcherReg = NULL; -static DynGenFunc* iopJITCompile = NULL; -static DynGenFunc* iopJITCompileInBlock = NULL; +static DynGenFunc* iopDispatcherEvent = NULL; +static DynGenFunc* iopDispatcherReg = NULL; +static DynGenFunc* iopJITCompile = NULL; +static DynGenFunc* iopJITCompileInBlock = NULL; static DynGenFunc* iopEnterRecompiledCode = NULL; -static DynGenFunc* iopExitRecompiledCode = NULL; +static DynGenFunc* iopExitRecompiledCode = NULL; static void recEventTest() { @@ -185,9 +249,9 @@ static DynGenFunc* _DynGen_EnterRecompiledCode() { // Properly scope the frame prologue/epilogue #ifdef ENABLE_VTUNE - xScopedStackFrame frame(true); + xScopedStackFrame frame(true, true); #else - xScopedStackFrame frame(IsDevBuild); + xScopedStackFrame frame(false, true); #endif xJMP((void*)iopDispatcherReg); @@ -215,10 +279,10 @@ static void _DynGen_Dispatchers() // most and stand to benefit from strong alignment and direct referencing. iopDispatcherEvent = (DynGenFunc*)xGetPtr(); xFastCall((void*)recEventTest); - iopDispatcherReg = _DynGen_DispatcherReg(); + iopDispatcherReg = _DynGen_DispatcherReg(); - iopJITCompile = _DynGen_JITCompile(); - iopJITCompileInBlock = _DynGen_JITCompileInBlock(); + iopJITCompile = _DynGen_JITCompile(); + iopJITCompileInBlock = _DynGen_JITCompileInBlock(); iopEnterRecompiledCode = _DynGen_EnterRecompiledCode(); HostSys::MemProtectStatic(iopRecDispatchers, PageAccess_ExecOnly()); @@ -254,7 +318,7 @@ static void iIopDumpBlock(int startpc, u8* ptr) } // write the instruction info - std::fprintf(f, "\n\nlive0 - %x, lastuse - %x used - %x\n", EEINST_LIVE0, EEINST_LASTUSE, EEINST_USED); + std::fprintf(f, "\n\nlive0 - %x, lastuse - %x used - %x\n", EEINST_LIVE, EEINST_LASTUSE, EEINST_USED); memzero(used); numused = 0; @@ -313,85 +377,14 @@ static void iIopDumpBlock(int startpc, u8* ptr) } int status = std::system(fmt::format("objdump -D -b binary -mi386 -M intel --no-show-raw-insn {} >> {}; rm {}", - "mydump1", filename.c_str(), "mydump1").c_str()); + "mydump1", filename.c_str(), "mydump1") + .c_str()); if (!WIFEXITED(status)) Console.Error("IOP dump didn't terminate normally"); #endif } -u8 _psxLoadWritesRs(u32 tempcode) -{ - switch (tempcode >> 26) - { - case 32: case 33: case 34: case 35: case 36: case 37: case 38: - return ((tempcode >> 21) & 0x1f) == ((tempcode >> 16) & 0x1f); // rs==rt - } - return 0; -} - -u8 _psxIsLoadStore(u32 tempcode) -{ - switch (tempcode >> 26) - { - case 32: case 33: case 34: case 35: case 36: case 37: case 38: - // 4 byte stores - case 40: case 41: case 42: case 43: case 46: - return 1; - } - return 0; -} - -void _psxFlushAllUnused() -{ - int i; - for (i = 0; i < 34; ++i) - { - if (psxpc < s_nEndBlock) - { - if ((g_pCurInstInfo[1].regs[i] & EEINST_USED)) - continue; - } - else if ((g_pCurInstInfo[0].regs[i] & EEINST_USED)) - { - continue; - } - - if (i < 32 && PSX_IS_CONST1(i)) - { - _psxFlushConstReg(i); - } - else - { - _deleteX86reg(X86TYPE_PSX, i, 1); - } - } -} - -int _psxFlushUnusedConstReg() -{ - int i; - for (i = 1; i < 32; ++i) - { - if ((g_psxHasConstReg & (1 << i)) && !(g_psxFlushedConstReg & (1 << i)) && - !_recIsRegWritten(g_pCurInstInfo + 1, (s_nEndBlock - psxpc) / 4, XMMTYPE_GPRREG, i)) - { - - // check if will be written in the future - xMOV(ptr32[&psxRegs.GPR.r[i]], g_psxConstRegs[i]); - g_psxFlushedConstReg |= 1 << i; - return 1; - } - } - - return 0; -} - -void _psxFlushCachedRegs() -{ - _psxFlushConstRegs(); -} - void _psxFlushConstReg(int reg) { if (PSX_IS_CONST1(reg) && !(g_psxFlushedConstReg & (1 << reg))) @@ -403,6 +396,8 @@ void _psxFlushConstReg(int reg) void _psxFlushConstRegs() { + // TODO: Combine flushes + int i; // flush constants @@ -430,66 +425,88 @@ void _psxDeleteReg(int reg, int flush) if (!reg) return; if (flush && PSX_IS_CONST1(reg)) - { _psxFlushConstReg(reg); - return; - } + PSX_DEL_CONST(reg); - _deleteX86reg(X86TYPE_PSX, reg, flush ? 0 : 2); + _deletePSXtoX86reg(reg, flush ? DELETE_REG_FREE : DELETE_REG_FREE_NO_WRITEBACK); } void _psxMoveGPRtoR(const xRegister32& to, int fromgpr) { if (PSX_IS_CONST1(fromgpr)) + { xMOV(to, g_psxConstRegs[fromgpr]); + } else { - // check x86 - xMOV(to, ptr[&psxRegs.GPR.r[fromgpr]]); + const int reg = EEINST_USEDTEST(fromgpr) ? _allocX86reg(X86TYPE_PSX, fromgpr, MODE_READ) : _checkX86reg(X86TYPE_PSX, fromgpr, MODE_READ); + if (reg >= 0) + xMOV(to, xRegister32(reg)); + else + xMOV(to, ptr[&psxRegs.GPR.r[fromgpr]]); } } -#if 0 void _psxMoveGPRtoM(uptr to, int fromgpr) { - if( PSX_IS_CONST1(fromgpr) ) - xMOV(ptr32[(u32*)(to)], g_psxConstRegs[fromgpr] ); - else { - // check x86 - xMOV(eax, ptr[&psxRegs.GPR.r[ fromgpr ] ]); - xMOV(ptr[(void*)(to)], eax); + if (PSX_IS_CONST1(fromgpr)) + { + xMOV(ptr32[(u32*)(to)], g_psxConstRegs[fromgpr]); + } + else + { + const int reg = EEINST_USEDTEST(fromgpr) ? _allocX86reg(X86TYPE_PSX, fromgpr, MODE_READ) : _checkX86reg(X86TYPE_PSX, fromgpr, MODE_READ); + if (reg >= 0) + { + xMOV(ptr32[(u32*)(to)], xRegister32(reg)); + } + else + { + xMOV(eax, ptr[&psxRegs.GPR.r[fromgpr]]); + xMOV(ptr32[(u32*)(to)], eax); + } } } -#endif - -#if 0 -void _psxMoveGPRtoRm(x86IntRegType to, int fromgpr) -{ - if( PSX_IS_CONST1(fromgpr) ) - xMOV(ptr32[xAddressReg(to)], g_psxConstRegs[fromgpr] ); - else { - // check x86 - xMOV(eax, ptr[&psxRegs.GPR.r[ fromgpr ] ]); - xMOV(ptr[xAddressReg(to)], eax); - } -} -#endif void _psxFlushCall(int flushtype) { - // x86-32 ABI : These registers are not preserved across calls: - _freeX86reg(eax); - _freeX86reg(ecx); - _freeX86reg(edx); + // Free registers that are not saved across function calls (x86-32 ABI): + for (u32 i = 0; i < iREGCNT_GPR; i++) + { + if (!x86regs[i].inuse) + continue; + + if (xRegisterBase::IsCallerSaved(i) || + ((flushtype & FLUSH_FREE_NONTEMP_X86) && x86regs[i].type != X86TYPE_TEMP) || + ((flushtype & FLUSH_FREE_TEMP_X86) && x86regs[i].type == X86TYPE_TEMP)) + { + _freeX86reg(i); + } + } + + if (flushtype & FLUSH_ALL_X86) + _flushX86regs(); + + if (flushtype & FLUSH_CONSTANT_REGS) + _psxFlushConstRegs(); if ((flushtype & FLUSH_PC) /*&& !g_cpuFlushedPC*/) { xMOV(ptr32[&psxRegs.pc], psxpc); //g_cpuFlushedPC = true; } +} - if (flushtype & FLUSH_CACHED_REGS) - _psxFlushConstRegs(); +void _psxFlushAllDirty() +{ + // TODO: Combine flushes + for (u32 i = 0; i < 32; ++i) + { + if (PSX_IS_CONST1(i)) + _psxFlushConstReg(i); + } + + _flushX86regs(); } void psxSaveBranchState() @@ -526,41 +543,235 @@ void _psxOnWriteReg(int reg) PSX_DEL_CONST(reg); } +bool psxTrySwapDelaySlot(u32 rs, u32 rt, u32 rd) +{ +#if 1 + if (s_recompilingDelaySlot) + return false; + + const u32 opcode_encoded = iopMemRead32(psxpc); + if (opcode_encoded == 0) + { + psxRecompileNextInstruction(true, true); + return true; + } + + const u32 opcode_rs = ((opcode_encoded >> 21) & 0x1F); + const u32 opcode_rt = ((opcode_encoded >> 16) & 0x1F); + const u32 opcode_rd = ((opcode_encoded >> 11) & 0x1F); + + switch (opcode_encoded >> 26) + { + case 8: // ADDI + case 9: // ADDIU + case 10: // SLTI + case 11: // SLTIU + case 12: // ANDIU + case 13: // ORI + case 14: // XORI + case 15: // LUI + case 32: // LB + case 33: // LH + case 34: // LWL + case 35: // LW + case 36: // LBU + case 37: // LHU + case 38: // LWR + case 39: // LWU + case 40: // SB + case 41: // SH + case 42: // SWL + case 43: // SW + case 46: // SWR + { + if ((rs != 0 && rs == opcode_rt) || (rt != 0 && rt == opcode_rt) || (rd != 0 && (rd == opcode_rs || rd == opcode_rt))) + goto is_unsafe; + } + break; + + case 50: // LWC2 + case 58: // SWC2 + break; + + case 0: // SPECIAL + { + switch (opcode_encoded & 0x3F) + { + case 0: // SLL + case 2: // SRL + case 3: // SRA + case 4: // SLLV + case 6: // SRLV + case 7: // SRAV + case 32: // ADD + case 33: // ADDU + case 34: // SUB + case 35: // SUBU + case 36: // AND + case 37: // OR + case 38: // XOR + case 39: // NOR + case 42: // SLT + case 43: // SLTU + { + if ((rs != 0 && rs == opcode_rd) || (rt != 0 && rt == opcode_rd) || (rd != 0 && (rd == opcode_rs || rd == opcode_rt))) + goto is_unsafe; + } + break; + + case 15: // SYNC + case 24: // MULT + case 25: // MULTU + case 26: // DIV + case 27: // DIVU + break; + + default: + goto is_unsafe; + } + } + break; + + case 16: // COP0 + case 17: // COP1 + case 18: // COP2 + case 19: // COP3 + { + switch ((opcode_encoded >> 21) & 0x1F) + { + case 0: // MFC0 + case 2: // CFC0 + { + if ((rs != 0 && rs == opcode_rt) || (rt != 0 && rt == opcode_rt) || (rd != 0 && rd == opcode_rt)) + goto is_unsafe; + } + break; + + case 4: // MTC0 + case 6: // CTC0 + break; + + default: + { + // swap when it's GTE + if ((opcode_encoded >> 26) != 18) + goto is_unsafe; + } + break; + } + break; + } + break; + + default: + goto is_unsafe; + } + + RALOG("Swapping delay slot %08X %s\n", psxpc, disR3000AF(iopMemRead32(psxpc), psxpc)); + psxRecompileNextInstruction(true, true); + return true; + +is_unsafe: + RALOG("NOT SWAPPING delay slot %08X %s\n", psxpc, disR3000AF(iopMemRead32(psxpc), psxpc)); + return false; +#else + return false; +#endif +} + +int psxTryRenameReg(int to, int from, int fromx86, int other, int xmminfo) +{ + // can't rename when in form Rd = Rs op Rt and Rd == Rs or Rd == Rt + if ((xmminfo & XMMINFO_NORENAME) || fromx86 < 0 || to == from || to == other || !EEINST_RENAMETEST(from)) + return -1; + + RALOG("Renaming %s to %s\n", R3000A::disRNameGPR[from], R3000A::disRNameGPR[to]); + + // flush back when it's been modified + if (x86regs[fromx86].mode & MODE_WRITE && EEINST_LIVETEST(from)) + _writebackX86Reg(fromx86); + + // remove all references to renamed-to register + _deletePSXtoX86reg(to, DELETE_REG_FREE_NO_WRITEBACK); + PSX_DEL_CONST(to); + + // and do the actual rename, new register has been modified. + x86regs[fromx86].reg = to; + x86regs[fromx86].mode |= MODE_READ | MODE_WRITE; + return fromx86; +} + // rd = rs op rt -void psxRecompileCodeConst0(R3000AFNPTR constcode, R3000AFNPTR_INFO constscode, R3000AFNPTR_INFO consttcode, R3000AFNPTR_INFO noconstcode) +void psxRecompileCodeConst0(R3000AFNPTR constcode, R3000AFNPTR_INFO constscode, R3000AFNPTR_INFO consttcode, R3000AFNPTR_INFO noconstcode, int xmminfo) { if (!_Rd_) return; - // for now, don't support xmm - - _deleteX86reg(X86TYPE_PSX, _Rs_, 1); - _deleteX86reg(X86TYPE_PSX, _Rt_, 1); - _deleteX86reg(X86TYPE_PSX, _Rd_, 0); - if (PSX_IS_CONST2(_Rs_, _Rt_)) { + _deletePSXtoX86reg(_Rd_, DELETE_REG_FREE_NO_WRITEBACK); PSX_SET_CONST(_Rd_); constcode(); return; } - if (PSX_IS_CONST1(_Rs_)) + // we have to put these up here, because the register allocator below will wipe out const flags + // for the destination register when/if it switches it to write mode. + const bool s_is_const = PSX_IS_CONST1(_Rs_); + const bool t_is_const = PSX_IS_CONST1(_Rt_); + const bool d_is_const = PSX_IS_CONST1(_Rd_); + const bool s_is_used = EEINST_USEDTEST(_Rs_); + const bool t_is_used = EEINST_USEDTEST(_Rt_); + + if (!s_is_const) + _addNeededGPRtoX86reg(_Rs_); + if (!t_is_const) + _addNeededGPRtoX86reg(_Rt_); + if (!d_is_const) + _addNeededGPRtoX86reg(_Rd_); + + u32 info = 0; + int regs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs < 0 && ((!s_is_const && s_is_used) || _Rs_ == _Rd_)) + regs = _allocX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + info |= PROCESS_EE_SET_S(regs); + + int regt = _checkX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + if (regt < 0 && ((!t_is_const && t_is_used) || _Rt_ == _Rd_)) + regt = _allocX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + if (regt >= 0) + info |= PROCESS_EE_SET_T(regt); + + // If S is no longer live, swap D for S. Saves the move. + int regd = psxTryRenameReg(_Rd_, _Rs_, regs, _Rt_, xmminfo); + if (regd < 0) { - constscode(0); + // TODO: If not live, write direct to memory. + regd = _allocX86reg(X86TYPE_PSX, _Rd_, MODE_WRITE); + } + if (regd >= 0) + info |= PROCESS_EE_SET_D(regd); + + _validateRegs(); + + if (s_is_const && regs < 0) + { + // This *must* go inside the if, because of when _Rs_ = _Rd_ PSX_DEL_CONST(_Rd_); + constscode(info /*| PROCESS_CONSTS*/); return; } - if (PSX_IS_CONST1(_Rt_)) + if (t_is_const && regt < 0) { - consttcode(0); PSX_DEL_CONST(_Rd_); + consttcode(info /*| PROCESS_CONSTT*/); return; } - noconstcode(0); PSX_DEL_CONST(_Rd_); + noconstcode(info); } static void psxRecompileIrxImport() @@ -607,7 +818,7 @@ static void psxRecompileIrxImport() } // rt = rs op imm16 -void psxRecompileCodeConst1(R3000AFNPTR constcode, R3000AFNPTR_INFO noconstcode) +void psxRecompileCodeConst1(R3000AFNPTR constcode, R3000AFNPTR_INFO noconstcode, int xmminfo) { if (!_Rt_) { @@ -617,108 +828,172 @@ void psxRecompileCodeConst1(R3000AFNPTR constcode, R3000AFNPTR_INFO noconstcode) return; } - // for now, don't support xmm - - _deleteX86reg(X86TYPE_PSX, _Rs_, 1); - _deleteX86reg(X86TYPE_PSX, _Rt_, 0); - if (PSX_IS_CONST1(_Rs_)) { + _deletePSXtoX86reg(_Rt_, DELETE_REG_FREE_NO_WRITEBACK); PSX_SET_CONST(_Rt_); constcode(); return; } - noconstcode(0); + _addNeededPSXtoX86reg(_Rs_); + _addNeededPSXtoX86reg(_Rt_); + + u32 info = 0; + + const bool s_is_used = EEINST_USEDTEST(_Rs_); + const int regs = s_is_used ? _allocX86reg(X86TYPE_PSX, _Rs_, MODE_READ) : _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + info |= PROCESS_EE_SET_S(regs); + + int regt = psxTryRenameReg(_Rt_, _Rs_, regs, 0, xmminfo); + if (regt < 0) + { + regt = _allocX86reg(X86TYPE_PSX, _Rt_, MODE_WRITE); + } + if (regt >= 0) + info |= PROCESS_EE_SET_T(regt); + + _validateRegs(); + PSX_DEL_CONST(_Rt_); + noconstcode(info); } // rd = rt op sa -void psxRecompileCodeConst2(R3000AFNPTR constcode, R3000AFNPTR_INFO noconstcode) +void psxRecompileCodeConst2(R3000AFNPTR constcode, R3000AFNPTR_INFO noconstcode, int xmminfo) { if (!_Rd_) return; - // for now, don't support xmm - - _deleteX86reg(X86TYPE_PSX, _Rt_, 1); - _deleteX86reg(X86TYPE_PSX, _Rd_, 0); - if (PSX_IS_CONST1(_Rt_)) { + _deletePSXtoX86reg(_Rd_, DELETE_REG_FREE_NO_WRITEBACK); PSX_SET_CONST(_Rd_); constcode(); return; } - noconstcode(0); + _addNeededPSXtoX86reg(_Rt_); + _addNeededPSXtoX86reg(_Rd_); + + u32 info = 0; + const bool s_is_used = EEINST_USEDTEST(_Rt_); + const int regt = s_is_used ? _allocX86reg(X86TYPE_PSX, _Rt_, MODE_READ) : _checkX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + if (regt >= 0) + info |= PROCESS_EE_SET_T(regt); + + int regd = psxTryRenameReg(_Rd_, _Rt_, regt, 0, xmminfo); + if (regd < 0) + { + regd = _allocX86reg(X86TYPE_PSX, _Rd_, MODE_WRITE); + } + if (regd >= 0) + info |= PROCESS_EE_SET_D(regd); + + _validateRegs(); + PSX_DEL_CONST(_Rd_); + noconstcode(info); } // rd = rt MULT rs (SPECIAL) void psxRecompileCodeConst3(R3000AFNPTR constcode, R3000AFNPTR_INFO constscode, R3000AFNPTR_INFO consttcode, R3000AFNPTR_INFO noconstcode, int LOHI) { - _deleteX86reg(X86TYPE_PSX, _Rs_, 1); - _deleteX86reg(X86TYPE_PSX, _Rt_, 1); - - if (LOHI) - { - _deleteX86reg(X86TYPE_PSX, PSX_HI, 1); - _deleteX86reg(X86TYPE_PSX, PSX_LO, 1); - } - if (PSX_IS_CONST2(_Rs_, _Rt_)) { + if (LOHI) + { + _deletePSXtoX86reg(PSX_LO, DELETE_REG_FREE_NO_WRITEBACK); + _deletePSXtoX86reg(PSX_HI, DELETE_REG_FREE_NO_WRITEBACK); + } + constcode(); return; } - if (PSX_IS_CONST1(_Rs_)) + // we have to put these up here, because the register allocator below will wipe out const flags + // for the destination register when/if it switches it to write mode. + const bool s_is_const = PSX_IS_CONST1(_Rs_); + const bool t_is_const = PSX_IS_CONST1(_Rt_); + const bool s_is_used = EEINST_USEDTEST(_Rs_); + const bool t_is_used = EEINST_USEDTEST(_Rt_); + + if (!s_is_const) + _addNeededGPRtoX86reg(_Rs_); + if (!t_is_const) + _addNeededGPRtoX86reg(_Rt_); + if (LOHI) { - constscode(0); + if (EEINST_LIVETEST(PSX_LO)) + _addNeededPSXtoX86reg(PSX_LO); + if (EEINST_LIVETEST(PSX_HI)) + _addNeededPSXtoX86reg(PSX_HI); + } + + u32 info = 0; + int regs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs < 0 && !s_is_const && s_is_used) + regs = _allocX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + info |= PROCESS_EE_SET_S(regs); + + // need at least one in a register + int regt = _checkX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + if (regs < 0 || (regt < 0 && !t_is_const && t_is_used)) + regt = _allocX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + if (regt >= 0) + info |= PROCESS_EE_SET_T(regt); + + if (LOHI) + { + // going to destroy lo/hi, so invalidate if we're writing it back to state + const bool lo_is_used = EEINST_USEDTEST(PSX_LO); + const int reglo = lo_is_used ? _allocX86reg(X86TYPE_PSX, PSX_LO, MODE_WRITE) : -1; + if (reglo >= 0) + info |= PROCESS_EE_SET_LO(reglo) | PROCESS_EE_LO; + else + _deletePSXtoX86reg(PSX_LO, DELETE_REG_FREE_NO_WRITEBACK); + + const bool hi_is_live = EEINST_USEDTEST(PSX_HI); + const int reghi = hi_is_live ? _allocX86reg(X86TYPE_PSX, PSX_HI, MODE_WRITE) : -1; + if (reghi >= 0) + info |= PROCESS_EE_SET_HI(reghi) | PROCESS_EE_HI; + else + _deletePSXtoX86reg(PSX_HI, DELETE_REG_FREE_NO_WRITEBACK); + } + + _validateRegs(); + + if (s_is_const && regs < 0) + { + // This *must* go inside the if, because of when _Rs_ = _Rd_ + constscode(info /*| PROCESS_CONSTS*/); return; } - if (PSX_IS_CONST1(_Rt_)) + if (t_is_const && regt < 0) { - consttcode(0); + consttcode(info /*| PROCESS_CONSTT*/); return; } - noconstcode(0); + noconstcode(info); } -static uptr m_ConfiguredCacheReserve = 32; static u8* m_recBlockAlloc = NULL; static const uint m_recBlockAllocSize = (((Ps2MemSize::IopRam + Ps2MemSize::Rom + Ps2MemSize::Rom1 + Ps2MemSize::Rom2) / 4) * sizeof(BASEBLOCK)); -static void recReserveCache() -{ - if (!recMem) - recMem = new RecompiledCodeReserve("R3000A Recompiler Cache", _8mb); - recMem->SetProfilerName("IOPrec"); - - while (!recMem->IsOk()) - { - if (recMem->Reserve(GetVmMemory().MainMemory(), HostMemoryMap::IOPrecOffset, m_ConfiguredCacheReserve * _1mb) != NULL) - break; - - // If it failed, then try again (if possible): - if (m_ConfiguredCacheReserve < 4) - break; - m_ConfiguredCacheReserve /= 2; - } - - recMem->ThrowIfNotOk(); -} - static void recReserve() { - // IOP has no hardware requirements! + if (recMem) + return; - recReserveCache(); + recMem = new RecompiledCodeReserve("R3000A Recompiler Cache"); + recMem->SetProfilerName("IOPrec"); + recMem->Assign(GetVmMemory().CodeMemory(), HostMemoryMap::IOPrecOffset, 32 * _1mb); } static void recAlloc() @@ -727,28 +1002,33 @@ static void recAlloc() // Any 4-byte aligned address makes a valid branch target as per MIPS design (all instructions are // always 4 bytes long). - if (m_recBlockAlloc == NULL) + if (!m_recBlockAlloc) + { + // We're on 64-bit, if these memory allocations fail, we're in real trouble. m_recBlockAlloc = (u8*)_aligned_malloc(m_recBlockAllocSize, 4096); - - if (m_recBlockAlloc == NULL) - throw Exception::OutOfMemory("R3000A BASEBLOCK lookup tables"); + if (!m_recBlockAlloc) + pxFailRel("Failed to allocate R3000A BASEBLOCK lookup tables"); + } u8* curpos = m_recBlockAlloc; - recRAM = (BASEBLOCK*)curpos; curpos += (Ps2MemSize::IopRam / 4) * sizeof(BASEBLOCK); - recROM = (BASEBLOCK*)curpos; curpos += (Ps2MemSize::Rom / 4) * sizeof(BASEBLOCK); - recROM1 = (BASEBLOCK*)curpos; curpos += (Ps2MemSize::Rom1 / 4) * sizeof(BASEBLOCK); - recROM2 = (BASEBLOCK*)curpos; curpos += (Ps2MemSize::Rom2 / 4) * sizeof(BASEBLOCK); + recRAM = (BASEBLOCK*)curpos; + curpos += (Ps2MemSize::IopRam / 4) * sizeof(BASEBLOCK); + recROM = (BASEBLOCK*)curpos; + curpos += (Ps2MemSize::Rom / 4) * sizeof(BASEBLOCK); + recROM1 = (BASEBLOCK*)curpos; + curpos += (Ps2MemSize::Rom1 / 4) * sizeof(BASEBLOCK); + recROM2 = (BASEBLOCK*)curpos; + curpos += (Ps2MemSize::Rom2 / 4) * sizeof(BASEBLOCK); - if (s_pInstCache == NULL) + if (!s_pInstCache) { s_nInstCacheSize = 128; s_pInstCache = (EEINST*)malloc(sizeof(EEINST) * s_nInstCacheSize); + if (!s_pInstCache) + pxFailRel("Failed to allocate R3000 InstCache array."); } - if (s_pInstCache == NULL) - throw Exception::OutOfMemory("R3000 InstCache."); - _DynGen_Dispatchers(); } @@ -789,7 +1069,7 @@ void recResetIOP() recLUT_SetPage(psxRecLUT, psxhwLUT, recROM, 0xa000, i, i - 0x1fc0); } - for (int i = 0x1e00; i < 0x1e04; i++) + for (int i = 0x1e00; i < 0x1e40; i++) { recLUT_SetPage(psxRecLUT, psxhwLUT, recROM1, 0x0000, i, i - 0x1e00); recLUT_SetPage(psxRecLUT, psxhwLUT, recROM1, 0x8000, i, i - 0x1e00); @@ -834,8 +1114,8 @@ static void iopClearRecLUT(BASEBLOCK* base, int count) static __noinline s32 recExecuteBlock(s32 eeCycles) { - iopBreak = 0; - iopCycleEE = eeCycles; + psxRegs.iopBreak = 0; + psxRegs.iopCycleEE = eeCycles; #ifdef PCSX2_DEVBUILD //if (SysTrace.SIF.IsActive()) @@ -860,7 +1140,7 @@ static __noinline s32 recExecuteBlock(s32 eeCycles) iopEnterRecompiledCode(); - return iopBreak + iopCycleEE; + return psxRegs.iopBreak + psxRegs.iopCycleEE; } // Returns the offset to the next instruction after any cleared memory @@ -934,35 +1214,38 @@ void psxSetBranchReg(u32 reg) if (reg != 0xffffffff) { - _allocX86reg(calleeSavedReg2d, X86TYPE_PCWRITEBACK, 0, MODE_WRITE); - _psxMoveGPRtoR(calleeSavedReg2d, reg); + const bool swap = psxTrySwapDelaySlot(reg, 0, 0); - psxRecompileNextInstruction(1); - - if (x86regs[calleeSavedReg2d.GetId()].inuse) + if (!swap) { - pxAssert(x86regs[calleeSavedReg2d.GetId()].type == X86TYPE_PCWRITEBACK); - xMOV(ptr32[&psxRegs.pc], calleeSavedReg2d); - x86regs[calleeSavedReg2d.GetId()].inuse = 0; -#ifdef PCSX2_DEBUG - xOR(calleeSavedReg2d, calleeSavedReg2d); -#endif + const int wbreg = _allocX86reg(X86TYPE_PCWRITEBACK, 0, MODE_WRITE | MODE_CALLEESAVED); + _psxMoveGPRtoR(xRegister32(wbreg), reg); + + psxRecompileNextInstruction(true, false); + + if (x86regs[wbreg].inuse && x86regs[wbreg].type == X86TYPE_PCWRITEBACK) + { + xMOV(ptr32[&psxRegs.pc], xRegister32(wbreg)); + x86regs[wbreg].inuse = 0; + } + else + { + xMOV(eax, ptr32[&psxRegs.pcWriteback]); + xMOV(ptr32[&psxRegs.pc], eax); + } } else { - xMOV(eax, ptr32[&g_recWriteback]); - xMOV(ptr32[&psxRegs.pc], eax); - -#ifdef PCSX2_DEBUG - xOR(eax, eax); -#endif + if (PSX_IS_DIRTY_CONST(reg) || _hasX86reg(X86TYPE_PSX, reg, 0)) + { + const int x86reg = _allocX86reg(X86TYPE_PSX, reg, MODE_READ); + xMOV(ptr32[&psxRegs.pc], xRegister32(x86reg)); + } + else + { + _psxMoveGPRtoM((uptr)&psxRegs.pc, reg); + } } - -#ifdef PCSX2_DEBUG - xForwardJNZ8 skipAssert; - xWrite8(0xcc); - skipAssert.SetTarget(); -#endif } _psxFlushCall(FLUSH_EVERYTHING); @@ -997,16 +1280,16 @@ static void iPsxBranchTest(u32 newpc, u32 cpuBranch) { xMOV(eax, ptr32[&psxRegs.cycle]); xMOV(ecx, eax); - xMOV(edx, ptr32[&iopCycleEE]); + xMOV(edx, ptr32[&psxRegs.iopCycleEE]); xADD(edx, 7); xSHR(edx, 3); xADD(eax, edx); - xCMP(eax, ptr32[&g_iopNextEventCycle]); - xCMOVNS(eax, ptr32[&g_iopNextEventCycle]); + xCMP(eax, ptr32[&psxRegs.iopNextEventCycle]); + xCMOVNS(eax, ptr32[&psxRegs.iopNextEventCycle]); xMOV(ptr32[&psxRegs.cycle], eax); xSUB(eax, ecx); xSHL(eax, 3); - xSUB(ptr32[&iopCycleEE], eax); + xSUB(ptr32[&psxRegs.iopCycleEE], eax); xJLE(iopExitRecompiledCode); xFastCall((void*)iopEventTest); @@ -1024,11 +1307,11 @@ static void iPsxBranchTest(u32 newpc, u32 cpuBranch) xMOV(ptr32[&psxRegs.cycle], eax); // update cycles // jump if iopCycleEE <= 0 (iop's timeslice timed out, so time to return control to the EE) - xSUB(ptr32[&iopCycleEE], blockCycles * 8); + xSUB(ptr32[&psxRegs.iopCycleEE], blockCycles * 8); xJLE(iopExitRecompiledCode); // check if an event is pending - xSUB(eax, ptr32[&g_iopNextEventCycle]); + xSUB(eax, ptr32[&psxRegs.iopNextEventCycle]); xForwardJS nointerruptpending; xFastCall((void*)iopEventTest); @@ -1075,7 +1358,7 @@ void rpsxSYSCALL() j8Ptr[0] = JE8(0); xADD(ptr32[&psxRegs.cycle], psxScaleBlockCycles()); - xSUB(ptr32[&iopCycleEE], psxScaleBlockCycles() * 8); + xSUB(ptr32[&psxRegs.iopCycleEE], psxScaleBlockCycles() * 8); JMP32((uptr)iopDispatcherReg - ((uptr)x86Ptr + 5)); // jump target for skipping blockCycle updates @@ -1097,7 +1380,7 @@ void rpsxBREAK() xCMP(ptr32[&psxRegs.pc], psxpc - 4); j8Ptr[0] = JE8(0); xADD(ptr32[&psxRegs.cycle], psxScaleBlockCycles()); - xSUB(ptr32[&iopCycleEE], psxScaleBlockCycles() * 8); + xSUB(ptr32[&psxRegs.iopCycleEE], psxScaleBlockCycles() * 8); JMP32((uptr)iopDispatcherReg - ((uptr)x86Ptr + 5)); x86SetJ8(j8Ptr[0]); @@ -1196,14 +1479,14 @@ static void psxRecMemcheck(u32 op, u32 bits, bool store) // logic: memAddress < bpEnd && bpStart < memAddress+memSize xMOV(eax, checks[i].end); - xCMP(ecx, eax); // address < end + xCMP(ecx, eax); // address < end xForwardJGE8 next1; // if address >= end then goto next1 xMOV(eax, checks[i].start); - xCMP(eax, edx); // start < address+size + xCMP(eax, edx); // start < address+size xForwardJGE8 next2; // if start >= address+size then goto next2 - // hit the breakpoint + // hit the breakpoint if (checks[i].result & MEMCHECK_LOG) { xMOV(edx, store); @@ -1244,17 +1527,47 @@ static void psxEncodeMemcheck() bool store = (opcode.flags & IS_STORE) != 0; switch (opcode.flags & MEMTYPE_MASK) { - case MEMTYPE_BYTE: psxRecMemcheck(op, 8, store); break; - case MEMTYPE_HALF: psxRecMemcheck(op, 16, store); break; - case MEMTYPE_WORD: psxRecMemcheck(op, 32, store); break; - case MEMTYPE_DWORD: psxRecMemcheck(op, 64, store); break; + case MEMTYPE_BYTE: + psxRecMemcheck(op, 8, store); + break; + case MEMTYPE_HALF: + psxRecMemcheck(op, 16, store); + break; + case MEMTYPE_WORD: + psxRecMemcheck(op, 32, store); + break; + case MEMTYPE_DWORD: + psxRecMemcheck(op, 64, store); + break; } } -void psxRecompileNextInstruction(int delayslot) +void psxRecompileNextInstruction(bool delayslot, bool swapped_delayslot) { - // pblock isn't used elsewhere in this function. - //BASEBLOCK* pblock = PSX_GETBLOCK(psxpc); +#ifdef DUMP_BLOCKS + const bool dump_block = true; + + const u8* instStart = x86Ptr; + ZydisDecoder disas_decoder; + ZydisFormatter disas_formatter; + ZydisDecodedInstruction disas_instruction; + + if (dump_block) + { + fprintf(stderr, "Compiling %s%s\n", delayslot ? "delay slot " : "", disR3000AF(iopMemRead32(psxpc), psxpc)); + if (!delayslot) + { + ZydisDecoderInit(&disas_decoder, ZYDIS_MACHINE_MODE_LONG_64, ZYDIS_ADDRESS_WIDTH_64); + ZydisFormatterInit(&disas_formatter, ZYDIS_FORMATTER_STYLE_INTEL); + s_old_print_address = (ZydisFormatterFunc)&ZydisFormatterPrintAddressAbsolute; + ZydisFormatterSetHook(&disas_formatter, ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS, (const void**)&s_old_print_address); + } + } +#endif + + const int old_code = psxRegs.code; + EEINST* old_inst_info = g_pCurInstInfo; + s_recompilingDelaySlot = delayslot; // add breakpoint if (!delayslot) @@ -1262,11 +1575,9 @@ void psxRecompileNextInstruction(int delayslot) psxEncodeBreakpoint(); psxEncodeMemcheck(); } - - if (IsDebugBuild) + else { - xNOP(); - xMOV(eax, psxpc); + _clearNeededX86regs(); } psxRegs.code = iopMemRead32(psxpc); @@ -1279,12 +1590,36 @@ void psxRecompileNextInstruction(int delayslot) rpsxBSC[psxRegs.code >> 26](); s_psxBlockCycles += g_iopCyclePenalty; - _clearNeededX86regs(); + if (!swapped_delayslot) + _clearNeededX86regs(); + + if (swapped_delayslot) + { + psxRegs.code = old_code; + g_pCurInstInfo = old_inst_info; + } + +#ifdef DUMP_BLOCKS + if (dump_block && !delayslot) + { + const u8* instPtr = instStart; + ZyanUSize instLength = static_cast(x86Ptr - instStart); + while (ZYAN_SUCCESS(ZydisDecoderDecodeBuffer(&disas_decoder, instPtr, instLength, &disas_instruction))) + { + char buffer[256]; + if (ZYAN_SUCCESS(ZydisFormatterFormatInstruction(&disas_formatter, &disas_instruction, buffer, sizeof(buffer), (ZyanU64)instPtr))) + std::fprintf(stderr, " %016" PRIX64 " %s\n", (u64)instPtr, buffer); + + instPtr += disas_instruction.length; + instLength -= disas_instruction.length; + } + } +#endif } static void PreBlockCheck(u32 blockpc) { -#ifdef PCSX2_DEBUG +#if 0 extern void iDumpPsxRegisters(u32 startpc, u32 temp); static u32 lastrec = 0; @@ -1307,6 +1642,37 @@ static void PreBlockCheck(u32 blockpc) lastrec = blockpc; } #endif +#ifdef TRACE_BLOCKS +#if 1 + static FILE* fp = nullptr; + static bool fp_opened = false; + if (!fp_opened && psxRegs.cycle >= 0) + { + fp = std::fopen("C:\\Dumps\\comp\\ioplog.txt", "wb"); + fp_opened = true; + } + if (fp) + { + u32 hash = crc32(0, (Bytef*)&psxRegs, offsetof(psxRegisters, pc)); + +#if 1 + std::fprintf(fp, "%08X (%u; %08X):", psxRegs.pc, psxRegs.cycle, hash); + for (int i = 0; i < 34; i++) + { + std::fprintf(fp, " %s: %08X", R3000A::disRNameGPR[i], psxRegs.GPR.r[i]); + } + std::fprintf(fp, "\n"); +#else + std::fprintf(fp, "%08X (%u): %08X\n", psxRegs.pc, psxRegs.cycle, hash); +#endif + // std::fflush(fp); + } +#endif +#if 0 + if (psxRegs.cycle == 0) + __debugbreak(); +#endif +#endif } static void iopRecRecompile(const u32 startpc) @@ -1344,8 +1710,7 @@ static void iopRecRecompile(const u32 startpc) s_pCurBlock = PSX_GETBLOCK(startpc); - pxAssert(s_pCurBlock->GetFnptr() == (uptr)iopJITCompile - || s_pCurBlock->GetFnptr() == (uptr)iopJITCompileInBlock); + pxAssert(s_pCurBlock->GetFnptr() == (uptr)iopJITCompile || s_pCurBlock->GetFnptr() == (uptr)iopJITCompileInBlock); s_pCurBlockEx = recBlocks.Get(HWADDR(startpc)); @@ -1370,10 +1735,9 @@ static void iopRecRecompile(const u32 startpc) xJNZ(iopDispatcherReg); } - if (IsDebugBuild) - { - xFastCall((void*)PreBlockCheck, psxpc); - } +#ifdef TRACE_BLOCKS + xFastCall((void*)PreBlockCheck, psxpc); +#endif // go until the next branch i = startpc; @@ -1383,9 +1747,7 @@ static void iopRecRecompile(const u32 startpc) while (1) { BASEBLOCK* pblock = PSX_GETBLOCK(i); - if (i != startpc - && pblock->GetFnptr() != (uptr)iopJITCompile - && pblock->GetFnptr() != (uptr)iopJITCompileInBlock) + if (i != startpc && pblock->GetFnptr() != (uptr)iopJITCompile && pblock->GetFnptr() != (uptr)iopJITCompileInBlock) { // branch = 3 willbranch3 = 1; @@ -1424,7 +1786,10 @@ static void iopRecRecompile(const u32 startpc) goto StartRecomp; // branches - case 4: case 5: case 6: case 7: + case 4: + case 5: + case 6: + case 7: s_branchTo = _Imm_ * 4 + i + 4; if (s_branchTo > startpc && s_branchTo < i) s_nEndBlock = s_branchTo; @@ -1500,7 +1865,7 @@ StartRecomp: g_pCurInstInfo = s_pInstCache; while (!psxbranch && psxpc < s_nEndBlock) { - psxRecompileNextInstruction(0); + psxRecompileNextInstruction(false, false); } if (IsDebugBuild && (psxdump & 1)) @@ -1533,7 +1898,7 @@ StartRecomp: else { xADD(ptr32[&psxRegs.cycle], psxScaleBlockCycles()); - xSUB(ptr32[&iopCycleEE], psxScaleBlockCycles() * 8); + xSUB(ptr32[&psxRegs.iopCycleEE], psxScaleBlockCycles() * 8); } if (willbranch3 || !psxbranch) @@ -1561,23 +1926,10 @@ StartRecomp: s_pCurBlockEx = NULL; } -static void recSetCacheReserve(uint reserveInMegs) -{ - m_ConfiguredCacheReserve = reserveInMegs; -} - -static uint recGetCacheReserve() -{ - return m_ConfiguredCacheReserve; -} - R3000Acpu psxRec = { recReserve, recResetIOP, recExecuteBlock, recClearIOP, recShutdown, - - recGetCacheReserve, - recSetCacheReserve }; diff --git a/pcsx2/x86/iR3000A.h b/pcsx2/x86/iR3000A.h index 3e1bf4c23f..946ed43650 100644 --- a/pcsx2/x86/iR3000A.h +++ b/pcsx2/x86/iR3000A.h @@ -34,25 +34,17 @@ static const int psxInstCycles_Load = 0; extern uptr psxRecLUT[]; -u8 _psxLoadWritesRs(u32 tempcode); -u8 _psxIsLoadStore(u32 tempcode); - -void _psxFlushAllUnused(); -int _psxFlushUnusedConstReg(); -void _psxFlushCachedRegs(); void _psxFlushConstReg(int reg); void _psxFlushConstRegs(); void _psxDeleteReg(int reg, int flush); void _psxFlushCall(int flushtype); +void _psxFlushAllDirty(); void _psxOnWriteReg(int reg); void _psxMoveGPRtoR(const x86Emitter::xRegister32& to, int fromgpr); -#if 0 void _psxMoveGPRtoM(uptr to, int fromgpr); -void _psxMoveGPRtoRm(x86IntRegType to, int fromgpr); -#endif extern u32 psxpc; // recompiler pc extern int psxbranch; // set for branch @@ -63,13 +55,14 @@ void psxLoadBranchState(); extern void psxSetBranchReg(u32 reg); extern void psxSetBranchImm(u32 imm); -extern void psxRecompileNextInstruction(int delayslot); +extern void psxRecompileNextInstruction(bool delayslot, bool swapped_delayslot); //////////////////////////////////////////////////////////////////// // IOP Constant Propagation Defines, Vars, and API - From here down! #define PSX_IS_CONST1(reg) ((reg) < 32 && (g_psxHasConstReg & (1 << (reg)))) #define PSX_IS_CONST2(reg1, reg2) ((g_psxHasConstReg & (1 << (reg1))) && (g_psxHasConstReg & (1 << (reg2)))) +#define PSX_IS_DIRTY_CONST(reg) ((reg) < 32 && (g_psxHasConstReg & (1 << (reg))) && (!(g_psxFlushedConstReg & (1 << (reg))))) #define PSX_SET_CONST(reg) \ { \ if ((reg) < 32) \ @@ -91,28 +84,31 @@ extern u32 g_psxHasConstReg, g_psxFlushedConstReg; typedef void (*R3000AFNPTR)(); typedef void (*R3000AFNPTR_INFO)(int info); +bool psxTrySwapDelaySlot(u32 rs, u32 rt, u32 rd); +int psxTryRenameReg(int to, int from, int fromx86, int other, int xmminfo); + // // non mmx/xmm version, slower // // rd = rs op rt -#define PSXRECOMPILE_CONSTCODE0(fn) \ +#define PSXRECOMPILE_CONSTCODE0(fn, info) \ void rpsx##fn(void) \ { \ - psxRecompileCodeConst0(rpsx##fn##_const, rpsx##fn##_consts, rpsx##fn##_constt, rpsx##fn##_); \ + psxRecompileCodeConst0(rpsx##fn##_const, rpsx##fn##_consts, rpsx##fn##_constt, rpsx##fn##_, info); \ } // rt = rs op imm16 -#define PSXRECOMPILE_CONSTCODE1(fn) \ +#define PSXRECOMPILE_CONSTCODE1(fn, info) \ void rpsx##fn(void) \ { \ - psxRecompileCodeConst1(rpsx##fn##_const, rpsx##fn##_); \ + psxRecompileCodeConst1(rpsx##fn##_const, rpsx##fn##_, info); \ } // rd = rt op sa -#define PSXRECOMPILE_CONSTCODE2(fn) \ +#define PSXRECOMPILE_CONSTCODE2(fn, info) \ void rpsx##fn(void) \ { \ - psxRecompileCodeConst2(rpsx##fn##_const, rpsx##fn##_); \ + psxRecompileCodeConst2(rpsx##fn##_const, rpsx##fn##_, info); \ } // [lo,hi] = rt op rs @@ -130,11 +126,11 @@ typedef void (*R3000AFNPTR_INFO)(int info); } // rd = rs op rt -void psxRecompileCodeConst0(R3000AFNPTR constcode, R3000AFNPTR_INFO constscode, R3000AFNPTR_INFO consttcode, R3000AFNPTR_INFO noconstcode); +void psxRecompileCodeConst0(R3000AFNPTR constcode, R3000AFNPTR_INFO constscode, R3000AFNPTR_INFO consttcode, R3000AFNPTR_INFO noconstcode, int xmminfo); // rt = rs op imm16 -void psxRecompileCodeConst1(R3000AFNPTR constcode, R3000AFNPTR_INFO noconstcode); +void psxRecompileCodeConst1(R3000AFNPTR constcode, R3000AFNPTR_INFO noconstcode, int xmminfo); // rd = rt op sa -void psxRecompileCodeConst2(R3000AFNPTR constcode, R3000AFNPTR_INFO noconstcode); +void psxRecompileCodeConst2(R3000AFNPTR constcode, R3000AFNPTR_INFO noconstcode, int xmminfo); // [lo,hi] = rt op rs void psxRecompileCodeConst3(R3000AFNPTR constcode, R3000AFNPTR_INFO constscode, R3000AFNPTR_INFO consttcode, R3000AFNPTR_INFO noconstcode, int LOHI); diff --git a/pcsx2/x86/iR3000Atables.cpp b/pcsx2/x86/iR3000Atables.cpp index e03a5246ad..f7e93dfe94 100644 --- a/pcsx2/x86/iR3000Atables.cpp +++ b/pcsx2/x86/iR3000Atables.cpp @@ -54,196 +54,252 @@ extern void psxLWR(); extern void psxSWL(); extern void psxSWR(); +// TODO(Stenzek): Operate directly on mem when destination register is not live. +// Do we want aligned targets? Seems wasteful... +#ifdef PCSX2_DEBUG +#define x86SetJ32A x86SetJ32 +#endif + +static int rpsxAllocRegIfUsed(int reg, int mode) +{ + if (EEINST_USEDTEST(reg)) + return _allocX86reg(X86TYPE_PSX, reg, mode); + else + return _checkX86reg(X86TYPE_PSX, reg, mode); +} + +static void rpsxMoveStoT(int info) +{ + if (EEREC_T == EEREC_S) + return; + + if (info & PROCESS_EE_S) + xMOV(xRegister32(EEREC_T), xRegister32(EEREC_S)); + else + xMOV(xRegister32(EEREC_T), ptr32[&psxRegs.GPR.r[_Rs_]]); +} + +static void rpsxMoveStoD(int info) +{ + if (EEREC_D == EEREC_S) + return; + + if (info & PROCESS_EE_S) + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + else + xMOV(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[_Rs_]]); +} + +static void rpsxMoveTtoD(int info) +{ + if (EEREC_D == EEREC_T) + return; + + if (info & PROCESS_EE_T) + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_T)); + else + xMOV(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[_Rt_]]); +} + +static void rpsxMoveSToECX(int info) +{ + if (info & PROCESS_EE_S) + xMOV(ecx, xRegister32(EEREC_S)); + else + xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); +} + +static void rpsxCopyReg(int dest, int src) +{ + // try a simple rename first... + const int roldsrc = _checkX86reg(X86TYPE_PSX, src, MODE_READ); + if (roldsrc >= 0 && psxTryRenameReg(dest, src, roldsrc, 0, 0) >= 0) + return; + + const int rdest = rpsxAllocRegIfUsed(dest, MODE_WRITE); + if (PSX_IS_CONST1(src)) + { + if (dest < 32) + { + g_psxConstRegs[dest] = g_psxConstRegs[src]; + PSX_SET_CONST(dest); + } + else + { + if (rdest >= 0) + xMOV(xRegister32(rdest), g_psxConstRegs[src]); + else + xMOV(ptr32[&psxRegs.GPR.r[dest]], g_psxConstRegs[src]); + } + + return; + } + + if (dest < 32) + PSX_DEL_CONST(dest); + + const int rsrc = rpsxAllocRegIfUsed(src, MODE_READ); + if (rsrc >= 0 && rdest >= 0) + { + xMOV(xRegister32(rdest), xRegister32(rsrc)); + } + else if (rdest >= 0) + { + xMOV(xRegister32(rdest), ptr32[&psxRegs.GPR.r[src]]); + } + else if (rsrc >= 0) + { + xMOV(ptr32[&psxRegs.GPR.r[dest]], xRegister32(rsrc)); + } + else + { + xMOV(eax, ptr32[&psxRegs.GPR.r[src]]); + xMOV(ptr32[&psxRegs.GPR.r[dest]], eax); + } +} + //// -void rpsxADDIU_const() +static void rpsxADDIU_const() { g_psxConstRegs[_Rt_] = g_psxConstRegs[_Rs_] + _Imm_; } -// adds a constant to sreg and puts into dreg -void rpsxADDconst(int dreg, int sreg, u32 off, int info) -{ - if (sreg) - { - if (sreg == dreg) - { - xADD(ptr32[&psxRegs.GPR.r[dreg]], off); - } - else - { - xMOV(eax, ptr32[&psxRegs.GPR.r[sreg]]); - if (off) - xADD(eax, off); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], eax); - } - } - else - { - xMOV(ptr32[&psxRegs.GPR.r[dreg]], off); - } -} - -void rpsxADDIU_(int info) +static void rpsxADDIU_(int info) { // Rt = Rs + Im - if (!_Rt_) - return; - rpsxADDconst(_Rt_, _Rs_, _Imm_, info); + rpsxMoveStoT(info); + if (_Imm_ != 0) + xADD(xRegister32(EEREC_T), _Imm_); } -PSXRECOMPILE_CONSTCODE1(ADDIU); +PSXRECOMPILE_CONSTCODE1(ADDIU, XMMINFO_WRITET | XMMINFO_READS); void rpsxADDI() { rpsxADDIU(); } //// SLTI -void rpsxSLTI_const() +static void rpsxSLTI_const() { g_psxConstRegs[_Rt_] = *(int*)&g_psxConstRegs[_Rs_] < _Imm_; } -void rpsxSLTconst(int info, int dreg, int sreg, int imm) +static void rpsxSLTI_(int info) { - xXOR(eax, eax); - xCMP(ptr32[&psxRegs.GPR.r[sreg]], imm); - xSETL(al); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], eax); + const xRegister32 dreg((_Rt_ == _Rs_) ? _allocX86reg(X86TYPE_TEMP, 0, 0) : EEREC_T); + xXOR(dreg, dreg); + + if (info & PROCESS_EE_S) + xCMP(xRegister32(EEREC_S), _Imm_); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], _Imm_); + + xSETL(xRegister8(dreg)); + + if (dreg.GetId() != EEREC_T) + { + std::swap(x86regs[dreg.GetId()], x86regs[EEREC_T]); + _freeX86reg(EEREC_T); + } } -void rpsxSLTI_(int info) { rpsxSLTconst(info, _Rt_, _Rs_, _Imm_); } - -PSXRECOMPILE_CONSTCODE1(SLTI); +PSXRECOMPILE_CONSTCODE1(SLTI, XMMINFO_WRITET | XMMINFO_READS | XMMINFO_NORENAME); //// SLTIU -void rpsxSLTIU_const() +static void rpsxSLTIU_const() { g_psxConstRegs[_Rt_] = g_psxConstRegs[_Rs_] < (u32)_Imm_; } -void rpsxSLTUconst(int info, int dreg, int sreg, int imm) +static void rpsxSLTIU_(int info) { - xXOR(eax, eax); - xCMP(ptr32[&psxRegs.GPR.r[sreg]], imm); - xSETB(al); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], eax); + const xRegister32 dreg((_Rt_ == _Rs_) ? _allocX86reg(X86TYPE_TEMP, 0, 0) : EEREC_T); + xXOR(dreg, dreg); + + if (info & PROCESS_EE_S) + xCMP(xRegister32(EEREC_S), _Imm_); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], _Imm_); + + xSETB(xRegister8(dreg)); + + if (dreg.GetId() != EEREC_T) + { + std::swap(x86regs[dreg.GetId()], x86regs[EEREC_T]); + _freeX86reg(EEREC_T); + } } -void rpsxSLTIU_(int info) { rpsxSLTUconst(info, _Rt_, _Rs_, (s32)_Imm_); } +PSXRECOMPILE_CONSTCODE1(SLTIU, XMMINFO_WRITET | XMMINFO_READS | XMMINFO_NORENAME); -PSXRECOMPILE_CONSTCODE1(SLTIU); +static void rpsxLogicalOpI(u64 info, int op) +{ + if (_ImmU_ != 0) + { + rpsxMoveStoT(info); + switch (op) + { + case 0: + xAND(xRegister32(EEREC_T), _ImmU_); + break; + case 1: + xOR(xRegister32(EEREC_T), _ImmU_); + break; + case 2: + xXOR(xRegister32(EEREC_T), _ImmU_); + break; + + jNO_DEFAULT + } + } + else + { + if (op == 0) + { + xXOR(xRegister32(EEREC_T), xRegister32(EEREC_T)); + } + else if (EEREC_T != EEREC_S) + { + rpsxMoveStoT(info); + } + } +} //// ANDI -void rpsxANDI_const() +static void rpsxANDI_const() { g_psxConstRegs[_Rt_] = g_psxConstRegs[_Rs_] & _ImmU_; } -void rpsxANDconst(int info, int dreg, int sreg, u32 imm) +static void rpsxANDI_(int info) { - if (imm) - { - if (sreg == dreg) - { - xAND(ptr32[&psxRegs.GPR.r[dreg]], imm); - } - else - { - xMOV(eax, ptr32[&psxRegs.GPR.r[sreg]]); - xAND(eax, imm); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], eax); - } - } - else - { - xMOV(ptr32[&psxRegs.GPR.r[dreg]], 0); - } + rpsxLogicalOpI(info, 0); } -void rpsxANDI_(int info) { rpsxANDconst(info, _Rt_, _Rs_, _ImmU_); } - -PSXRECOMPILE_CONSTCODE1(ANDI); +PSXRECOMPILE_CONSTCODE1(ANDI, XMMINFO_WRITET | XMMINFO_READS); //// ORI -void rpsxORI_const() +static void rpsxORI_const() { g_psxConstRegs[_Rt_] = g_psxConstRegs[_Rs_] | _ImmU_; } -void rpsxORconst(int info, int dreg, int sreg, u32 imm) +static void rpsxORI_(int info) { - if (imm) - { - if (sreg == dreg) - { - xOR(ptr32[&psxRegs.GPR.r[dreg]], imm); - } - else - { - xMOV(eax, ptr32[&psxRegs.GPR.r[sreg]]); - xOR(eax, imm); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], eax); - } - } - else - { - if (dreg != sreg) - { - xMOV(ecx, ptr32[&psxRegs.GPR.r[sreg]]); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], ecx); - } - } + rpsxLogicalOpI(info, 1); } -void rpsxORI_(int info) { rpsxORconst(info, _Rt_, _Rs_, _ImmU_); } +PSXRECOMPILE_CONSTCODE1(ORI, XMMINFO_WRITET | XMMINFO_READS); -PSXRECOMPILE_CONSTCODE1(ORI); - -void rpsxXORI_const() +static void rpsxXORI_const() { g_psxConstRegs[_Rt_] = g_psxConstRegs[_Rs_] ^ _ImmU_; } -void rpsxXORconst(int info, int dreg, int sreg, u32 imm) +static void rpsxXORI_(int info) { - if (imm == 0xffffffff) - { - if (dreg == sreg) - { - xNOT(ptr32[&psxRegs.GPR.r[dreg]]); - } - else - { - xMOV(ecx, ptr32[&psxRegs.GPR.r[sreg]]); - xNOT(ecx); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], ecx); - } - } - else if (imm) - { - - if (sreg == dreg) - { - xXOR(ptr32[&psxRegs.GPR.r[dreg]], imm); - } - else - { - xMOV(eax, ptr32[&psxRegs.GPR.r[sreg]]); - xXOR(eax, imm); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], eax); - } - } - else - { - if (dreg != sreg) - { - xMOV(ecx, ptr32[&psxRegs.GPR.r[sreg]]); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], ecx); - } - } + rpsxLogicalOpI(info, 2); } -void rpsxXORI_(int info) { rpsxXORconst(info, _Rt_, _Rs_, _ImmU_); } - -PSXRECOMPILE_CONSTCODE1(XORI); +PSXRECOMPILE_CONSTCODE1(XORI, XMMINFO_WRITET | XMMINFO_READS); void rpsxLUI() { @@ -255,309 +311,568 @@ void rpsxLUI() g_psxConstRegs[_Rt_] = psxRegs.code << 16; } -void rpsxADDU_const() +static void rpsxADDU_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rs_] + g_psxConstRegs[_Rt_]; } -void rpsxADDU_consts(int info) { rpsxADDconst(_Rd_, _Rt_, g_psxConstRegs[_Rs_], info); } -void rpsxADDU_constt(int info) +static void rpsxADDU_consts(int info) { - info |= PROCESS_EE_SET_S(EEREC_T); - rpsxADDconst(_Rd_, _Rs_, g_psxConstRegs[_Rt_], info); + const s32 cval = static_cast(g_psxConstRegs[_Rs_]); + rpsxMoveTtoD(info); + if (cval != 0) + xADD(xRegister32(EEREC_D), cval); +} + +static void rpsxADDU_constt(int info) +{ + const s32 cval = static_cast(g_psxConstRegs[_Rt_]); + rpsxMoveStoD(info); + if (cval != 0) + xADD(xRegister32(EEREC_D), cval); } void rpsxADDU_(int info) { - if (_Rs_ && _Rt_) + if ((info & PROCESS_EE_S) && (info & PROCESS_EE_T)) { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); - xADD(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); + if (EEREC_D == EEREC_S) + { + xADD(xRegister32(EEREC_D), xRegister32(EEREC_T)); + } + else if (EEREC_D == EEREC_T) + { + xADD(xRegister32(EEREC_D), xRegister32(EEREC_S)); + } + else + { + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + xADD(xRegister32(EEREC_D), xRegister32(EEREC_T)); + } } - else if (_Rs_) + else if (info & PROCESS_EE_S) { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + xADD(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[_Rt_]]); } - else if (_Rt_) + else if (info & PROCESS_EE_T) { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_T)); + xADD(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[_Rs_]]); } else { - xXOR(eax, eax); + xMOV(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[_Rs_]]); + xADD(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[_Rt_]]); } - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); } -PSXRECOMPILE_CONSTCODE0(ADDU); +PSXRECOMPILE_CONSTCODE0(ADDU, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); void rpsxADD() { rpsxADDU(); } - -void rpsxSUBU_const() +static void rpsxSUBU_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rs_] - g_psxConstRegs[_Rt_]; } -void rpsxSUBU_consts(int info) +static void rpsxSUBU_consts(int info) { - xMOV(eax, g_psxConstRegs[_Rs_]); - xSUB(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + // more complex because Rt can be Rd, and we're reversing the op + const s32 sval = g_psxConstRegs[_Rs_]; + const xRegister32 dreg((_Rt_ == _Rd_) ? eax.GetId() : EEREC_D); + xMOV(dreg, sval); + + if (info & PROCESS_EE_T) + xSUB(dreg, xRegister32(EEREC_T)); + else + xSUB(dreg, ptr32[&psxRegs.GPR.r[_Rt_]]); + + xMOV(xRegister32(EEREC_D), dreg); } -void rpsxSUBU_constt(int info) { rpsxADDconst(_Rd_, _Rs_, -(int)g_psxConstRegs[_Rt_], info); } +static void rpsxSUBU_constt(int info) +{ + const s32 tval = g_psxConstRegs[_Rt_]; + rpsxMoveStoD(info); + if (tval != 0) + xSUB(xRegister32(EEREC_D), tval); +} -void rpsxSUBU_(int info) +static void rpsxSUBU_(int info) { // Rd = Rs - Rt - if (!_Rd_) - return; - - if (_Rd_ == _Rs_) + if (_Rs_ == _Rt_) { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - xSUB(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + xXOR(xRegister32(EEREC_D), xRegister32(EEREC_D)); + return; + } + + // a bit messier here because it's not commutative.. + if ((info & PROCESS_EE_S) && (info & PROCESS_EE_T)) + { + if (EEREC_D == EEREC_S) + { + xSUB(xRegister32(EEREC_D), xRegister32(EEREC_T)); + } + else if (EEREC_D == EEREC_T) + { + // D might equal T + const xRegister32 dreg((_Rt_ == _Rd_) ? eax.GetId() : EEREC_D); + xMOV(dreg, xRegister32(EEREC_S)); + xSUB(dreg, xRegister32(EEREC_T)); + xMOV(xRegister32(EEREC_D), dreg); + } + else + { + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + xSUB(xRegister32(EEREC_D), xRegister32(EEREC_T)); + } + } + else if (info & PROCESS_EE_S) + { + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + xSUB(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[_Rt_]]); + } + else if (info & PROCESS_EE_T) + { + // D might equal T + const xRegister32 dreg((_Rt_ == _Rd_) ? eax.GetId() : EEREC_D); + xMOV(dreg, ptr32[&psxRegs.GPR.r[_Rs_]]); + xSUB(dreg, xRegister32(EEREC_T)); + xMOV(xRegister32(EEREC_D), dreg); } else { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); - xSUB(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + xMOV(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[_Rs_]]); + xSUB(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[_Rt_]]); } } -PSXRECOMPILE_CONSTCODE0(SUBU); +PSXRECOMPILE_CONSTCODE0(SUBU, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); void rpsxSUB() { rpsxSUBU(); } -void rpsxLogicalOp(int info, int op) +namespace { - if (_Rd_ == _Rs_ || _Rd_ == _Rt_) + enum class LogicalOp { - int vreg = _Rd_ == _Rs_ ? _Rt_ : _Rs_; - xMOV(ecx, ptr32[&psxRegs.GPR.r[vreg]]); + AND, + OR, + XOR, + NOR + }; +} // namespace - switch (op) { - case 0: xAND(ptr32[&psxRegs.GPR.r[_Rd_]], ecx); break; - case 1: xOR (ptr32[&psxRegs.GPR.r[_Rd_]], ecx); break; - case 2: xXOR(ptr32[&psxRegs.GPR.r[_Rd_]], ecx); break; - case 3: xOR (ptr32[&psxRegs.GPR.r[_Rd_]], ecx); break; - default: pxAssert(0); - } +static void rpsxLogicalOp_constv(LogicalOp op, int info, int creg, u32 vreg, int regv) +{ + xImpl_G1Logic bad{}; + const xImpl_G1Logic& xOP = op == LogicalOp::AND ? xAND : op == LogicalOp::OR ? xOR : + op == LogicalOp::XOR ? xXOR : + op == LogicalOp::NOR ? xOR : + bad; + s32 fixedInput, fixedOutput, identityInput; + bool hasFixed = true; + switch (op) + { + case LogicalOp::AND: + fixedInput = 0; + fixedOutput = 0; + identityInput = -1; + break; + case LogicalOp::OR: + fixedInput = -1; + fixedOutput = -1; + identityInput = 0; + break; + case LogicalOp::XOR: + hasFixed = false; + identityInput = 0; + break; + case LogicalOp::NOR: + fixedInput = -1; + fixedOutput = 0; + identityInput = 0; + break; + default: + pxAssert(0); + } - if (op == 3) - xNOT(ptr32[&psxRegs.GPR.r[_Rd_]]); + const s32 cval = static_cast(g_psxConstRegs[creg]); + + if (hasFixed && cval == fixedInput) + { + xMOV(xRegister32(EEREC_D), fixedOutput); } else { - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - - switch (op) { - case 0: xAND(ecx, ptr32[&psxRegs.GPR.r[_Rt_]]); break; - case 1: xOR (ecx, ptr32[&psxRegs.GPR.r[_Rt_]]); break; - case 2: xXOR(ecx, ptr32[&psxRegs.GPR.r[_Rt_]]); break; - case 3: xOR (ecx, ptr32[&psxRegs.GPR.r[_Rt_]]); break; - default: pxAssert(0); - } - - if (op == 3) - xNOT(ecx); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], ecx); + if (regv >= 0) + xMOV(xRegister32(EEREC_D), xRegister32(regv)); + else + xMOV(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[vreg]]); + if (cval != identityInput) + xOP(xRegister32(EEREC_D), cval); + if (op == LogicalOp::NOR) + xNOT(xRegister32(EEREC_D)); } } -void rpsxAND_const() +static void rpsxLogicalOp(LogicalOp op, int info) +{ + pxAssert(!(info & PROCESS_EE_XMM)); + + xImpl_G1Logic bad{}; + const xImpl_G1Logic& xOP = op == LogicalOp::AND ? xAND : op == LogicalOp::OR ? xOR : + op == LogicalOp::XOR ? xXOR : + op == LogicalOp::NOR ? xOR : + bad; + pxAssert(&xOP != &bad); + + // swap because it's commutative and Rd might be Rt + u32 rs = _Rs_, rt = _Rt_; + int regs = (info & PROCESS_EE_S) ? EEREC_S : -1, regt = (info & PROCESS_EE_T) ? EEREC_T : -1; + if (_Rd_ == _Rt_) + { + std::swap(rs, rt); + std::swap(regs, regt); + } + + if (op == LogicalOp::XOR && rs == rt) + { + xXOR(xRegister32(EEREC_D), xRegister32(EEREC_D)); + } + else + { + if (regs >= 0) + xMOV(xRegister32(EEREC_D), xRegister32(regs)); + else + xMOV(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[rs]]); + + if (regt >= 0) + xOP(xRegister32(EEREC_D), xRegister32(regt)); + else + xOP(xRegister32(EEREC_D), ptr32[&psxRegs.GPR.r[rt]]); + + if (op == LogicalOp::NOR) + xNOT(xRegister32(EEREC_D)); + } +} + +static void rpsxAND_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rs_] & g_psxConstRegs[_Rt_]; } -void rpsxAND_consts(int info) { rpsxANDconst(info, _Rd_, _Rt_, g_psxConstRegs[_Rs_]); } -void rpsxAND_constt(int info) { rpsxANDconst(info, _Rd_, _Rs_, g_psxConstRegs[_Rt_]); } -void rpsxAND_(int info) { rpsxLogicalOp(info, 0); } +static void rpsxAND_consts(int info) +{ + rpsxLogicalOp_constv(LogicalOp::AND, info, _Rs_, _Rt_, (info & PROCESS_EE_T) ? EEREC_T : -1); +} -PSXRECOMPILE_CONSTCODE0(AND); +static void rpsxAND_constt(int info) +{ + rpsxLogicalOp_constv(LogicalOp::AND, info, _Rt_, _Rs_, (info & PROCESS_EE_S) ? EEREC_S : -1); +} -void rpsxOR_const() +static void rpsxAND_(int info) +{ + rpsxLogicalOp(LogicalOp::AND, info); +} + +PSXRECOMPILE_CONSTCODE0(AND, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); + +static void rpsxOR_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rs_] | g_psxConstRegs[_Rt_]; } -void rpsxOR_consts(int info) { rpsxORconst(info, _Rd_, _Rt_, g_psxConstRegs[_Rs_]); } -void rpsxOR_constt(int info) { rpsxORconst(info, _Rd_, _Rs_, g_psxConstRegs[_Rt_]); } -void rpsxOR_(int info) { rpsxLogicalOp(info, 1); } +static void rpsxOR_consts(int info) +{ + rpsxLogicalOp_constv(LogicalOp::OR, info, _Rs_, _Rt_, (info & PROCESS_EE_T) ? EEREC_T : -1); +} -PSXRECOMPILE_CONSTCODE0(OR); +static void rpsxOR_constt(int info) +{ + rpsxLogicalOp_constv(LogicalOp::OR, info, _Rt_, _Rs_, (info & PROCESS_EE_S) ? EEREC_S : -1); +} + +static void rpsxOR_(int info) +{ + rpsxLogicalOp(LogicalOp::OR, info); +} + +PSXRECOMPILE_CONSTCODE0(OR, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); //// XOR -void rpsxXOR_const() +static void rpsxXOR_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rs_] ^ g_psxConstRegs[_Rt_]; } -void rpsxXOR_consts(int info) { rpsxXORconst(info, _Rd_, _Rt_, g_psxConstRegs[_Rs_]); } -void rpsxXOR_constt(int info) { rpsxXORconst(info, _Rd_, _Rs_, g_psxConstRegs[_Rt_]); } -void rpsxXOR_(int info) { rpsxLogicalOp(info, 2); } +static void rpsxXOR_consts(int info) +{ + rpsxLogicalOp_constv(LogicalOp::XOR, info, _Rs_, _Rt_, (info & PROCESS_EE_T) ? EEREC_T : -1); +} -PSXRECOMPILE_CONSTCODE0(XOR); +static void rpsxXOR_constt(int info) +{ + rpsxLogicalOp_constv(LogicalOp::XOR, info, _Rt_, _Rs_, (info & PROCESS_EE_S) ? EEREC_S : -1); +} + +static void rpsxXOR_(int info) +{ + rpsxLogicalOp(LogicalOp::XOR, info); +} + +PSXRECOMPILE_CONSTCODE0(XOR, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); //// NOR -void rpsxNOR_const() +static void rpsxNOR_const() { g_psxConstRegs[_Rd_] = ~(g_psxConstRegs[_Rs_] | g_psxConstRegs[_Rt_]); } -void rpsxNORconst(int info, int dreg, int sreg, u32 imm) +static void rpsxNOR_consts(int info) { - if (imm) - { - if (dreg == sreg) - { - xOR(ptr32[&psxRegs.GPR.r[dreg]], imm); - xNOT(ptr32[&psxRegs.GPR.r[dreg]]); - } - else - { - xMOV(ecx, ptr32[&psxRegs.GPR.r[sreg]]); - xOR(ecx, imm); - xNOT(ecx); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], ecx); - } - } - else - { - if (dreg == sreg) - { - xNOT(ptr32[&psxRegs.GPR.r[dreg]]); - } - else - { - xMOV(ecx, ptr32[&psxRegs.GPR.r[sreg]]); - xNOT(ecx); - xMOV(ptr32[&psxRegs.GPR.r[dreg]], ecx); - } - } + rpsxLogicalOp_constv(LogicalOp::NOR, info, _Rs_, _Rt_, (info & PROCESS_EE_T) ? EEREC_T : -1); } -void rpsxNOR_consts(int info) { rpsxNORconst(info, _Rd_, _Rt_, g_psxConstRegs[_Rs_]); } -void rpsxNOR_constt(int info) { rpsxNORconst(info, _Rd_, _Rs_, g_psxConstRegs[_Rt_]); } -void rpsxNOR_(int info) { rpsxLogicalOp(info, 3); } +static void rpsxNOR_constt(int info) +{ + rpsxLogicalOp_constv(LogicalOp::NOR, info, _Rt_, _Rs_, (info & PROCESS_EE_S) ? EEREC_S : -1); +} -PSXRECOMPILE_CONSTCODE0(NOR); +static void rpsxNOR_(int info) +{ + rpsxLogicalOp(LogicalOp::NOR, info); +} + +PSXRECOMPILE_CONSTCODE0(NOR, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); //// SLT -void rpsxSLT_const() +static void rpsxSLT_const() { g_psxConstRegs[_Rd_] = *(int*)&g_psxConstRegs[_Rs_] < *(int*)&g_psxConstRegs[_Rt_]; } -void rpsxSLT_consts(int info) +static void rpsxSLTs_const(int info, int sign, int st) { - xXOR(eax, eax); - xCMP(ptr32[&psxRegs.GPR.r[_Rt_]], g_psxConstRegs[_Rs_]); - xSETG(al); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + const s32 cval = g_psxConstRegs[st ? _Rt_ : _Rs_]; + + const xImpl_Set& SET = st ? (sign ? xSETL : xSETB) : (sign ? xSETG : xSETA); + + const xRegister32 dreg((_Rd_ == (st ? _Rs_ : _Rt_)) ? _allocX86reg(X86TYPE_TEMP, 0, 0) : EEREC_D); + const int regs = st ? ((info & PROCESS_EE_S) ? EEREC_S : -1) : ((info & PROCESS_EE_T) ? EEREC_T : -1); + xXOR(dreg, dreg); + + if (regs >= 0) + xCMP(xRegister32(regs), cval); + else + xCMP(ptr32[&psxRegs.GPR.r[st ? _Rs_ : _Rt_]], cval); + SET(xRegister8(dreg)); + + if (dreg.GetId() != EEREC_D) + { + std::swap(x86regs[dreg.GetId()], x86regs[EEREC_D]); + _freeX86reg(EEREC_D); + } } -void rpsxSLT_constt(int info) { rpsxSLTconst(info, _Rd_, _Rs_, g_psxConstRegs[_Rt_]); } -void rpsxSLT_(int info) +static void rpsxSLTs_(int info, int sign) { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); - xCMP(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - xSETL(al); - xAND(eax, 0xff); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + const xImpl_Set& SET = sign ? xSETL : xSETB; + + // need to keep Rs/Rt around. + const xRegister32 dreg((_Rd_ == _Rt_ || _Rd_ == _Rs_) ? _allocX86reg(X86TYPE_TEMP, 0, 0) : EEREC_D); + + // force Rs into a register, may as well cache it since we're loading anyway. + const int regs = (info & PROCESS_EE_S) ? EEREC_S : _allocX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + + xXOR(dreg, dreg); + if (info & PROCESS_EE_T) + xCMP(xRegister32(regs), xRegister32(EEREC_T)); + else + xCMP(xRegister32(regs), ptr32[&psxRegs.GPR.r[_Rt_]]); + + SET(xRegister8(dreg)); + + if (dreg.GetId() != EEREC_D) + { + std::swap(x86regs[dreg.GetId()], x86regs[EEREC_D]); + _freeX86reg(EEREC_D); + } } -PSXRECOMPILE_CONSTCODE0(SLT); +static void rpsxSLT_consts(int info) +{ + rpsxSLTs_const(info, 1, 0); +} + +static void rpsxSLT_constt(int info) +{ + rpsxSLTs_const(info, 1, 1); +} + +static void rpsxSLT_(int info) +{ + rpsxSLTs_(info, 1); +} + +PSXRECOMPILE_CONSTCODE0(SLT, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT | XMMINFO_NORENAME); //// SLTU -void rpsxSLTU_const() +static void rpsxSLTU_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rs_] < g_psxConstRegs[_Rt_]; } -void rpsxSLTU_consts(int info) +static void rpsxSLTU_consts(int info) { - xXOR(eax, eax); - xCMP(ptr32[&psxRegs.GPR.r[_Rt_]], g_psxConstRegs[_Rs_]); - xSETA(al); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + rpsxSLTs_const(info, 0, 0); } -void rpsxSLTU_constt(int info) { rpsxSLTUconst(info, _Rd_, _Rs_, g_psxConstRegs[_Rt_]); } -void rpsxSLTU_(int info) +static void rpsxSLTU_constt(int info) { - // Rd = Rs < Rt (unsigned) - if (!_Rd_) - return; - - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); - xCMP(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - xSBB(eax, eax); - xNEG(eax); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + rpsxSLTs_const(info, 0, 1); } -PSXRECOMPILE_CONSTCODE0(SLTU); +static void rpsxSLTU_(int info) +{ + rpsxSLTs_(info, 0); +} + +PSXRECOMPILE_CONSTCODE0(SLTU, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT | XMMINFO_NORENAME); //// MULT -void rpsxMULT_const() +static void rpsxMULT_const() { - u64 res = (s64)((s64)*(int*)&g_psxConstRegs[_Rs_] * (s64)*(int*)&g_psxConstRegs[_Rt_]); + _deletePSXtoX86reg(PSX_HI, DELETE_REG_FREE_NO_WRITEBACK); + _deletePSXtoX86reg(PSX_LO, DELETE_REG_FREE_NO_WRITEBACK); + + u64 res = (s64)((s64) * (int*)&g_psxConstRegs[_Rs_] * (s64) * (int*)&g_psxConstRegs[_Rt_]); xMOV(ptr32[&psxRegs.GPR.n.hi], (u32)((res >> 32) & 0xffffffff)); xMOV(ptr32[&psxRegs.GPR.n.lo], (u32)(res & 0xffffffff)); } -void rpsxMULTsuperconst(int info, int sreg, int imm, int sign) +static void rpsxWritebackHILO(int info) +{ + if (EEINST_LIVETEST(PSX_LO)) + { + if (info & PROCESS_EE_LO) + xMOV(xRegister32(EEREC_LO), eax); + else + xMOV(ptr32[&psxRegs.GPR.n.lo], eax); + } + + if (EEINST_LIVETEST(PSX_HI)) + { + if (info & PROCESS_EE_HI) + xMOV(xRegister32(EEREC_HI), edx); + else + xMOV(ptr32[&psxRegs.GPR.n.hi], edx); + } +} + +static void rpsxMULTsuperconst(int info, int sreg, int imm, int sign) { // Lo/Hi = Rs * Rt (signed) xMOV(eax, imm); + + const int regs = rpsxAllocRegIfUsed(sreg, MODE_READ); if (sign) - xMUL(ptr32[&psxRegs.GPR.r[sreg]]); + { + if (regs >= 0) + xMUL(xRegister32(regs)); + else + xMUL(ptr32[&psxRegs.GPR.r[sreg]]); + } else - xUMUL(ptr32[&psxRegs.GPR.r[sreg]]); - xMOV(ptr32[&psxRegs.GPR.n.lo], eax); - xMOV(ptr32[&psxRegs.GPR.n.hi], edx); + { + if (regs >= 0) + xUMUL(xRegister32(regs)); + else + xUMUL(ptr32[&psxRegs.GPR.r[sreg]]); + } + + rpsxWritebackHILO(info); } -void rpsxMULTsuper(int info, int sign) +static void rpsxMULTsuper(int info, int sign) { // Lo/Hi = Rs * Rt (signed) - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); + _psxMoveGPRtoR(eax, _Rs_); + + const int regt = rpsxAllocRegIfUsed(_Rt_, MODE_READ); if (sign) - xMUL(ptr32[&psxRegs.GPR.r[_Rt_]]); + { + if (regt >= 0) + xMUL(xRegister32(regt)); + else + xMUL(ptr32[&psxRegs.GPR.r[_Rt_]]); + } else - xUMUL(ptr32[&psxRegs.GPR.r[_Rt_]]); - xMOV(ptr32[&psxRegs.GPR.n.lo], eax); - xMOV(ptr32[&psxRegs.GPR.n.hi], edx); + { + if (regt >= 0) + xUMUL(xRegister32(regt)); + else + xUMUL(ptr32[&psxRegs.GPR.r[_Rt_]]); + } + + rpsxWritebackHILO(info); } -void rpsxMULT_consts(int info) { rpsxMULTsuperconst(info, _Rt_, g_psxConstRegs[_Rs_], 1); } -void rpsxMULT_constt(int info) { rpsxMULTsuperconst(info, _Rs_, g_psxConstRegs[_Rt_], 1); } -void rpsxMULT_(int info) { rpsxMULTsuper(info, 1); } +static void rpsxMULT_consts(int info) +{ + rpsxMULTsuperconst(info, _Rt_, g_psxConstRegs[_Rs_], 1); +} + +static void rpsxMULT_constt(int info) +{ + rpsxMULTsuperconst(info, _Rs_, g_psxConstRegs[_Rt_], 1); +} + +static void rpsxMULT_(int info) +{ + rpsxMULTsuper(info, 1); +} PSXRECOMPILE_CONSTCODE3_PENALTY(MULT, 1, psxInstCycles_Mult); //// MULTU -void rpsxMULTU_const() +static void rpsxMULTU_const() { + _deletePSXtoX86reg(PSX_HI, DELETE_REG_FREE_NO_WRITEBACK); + _deletePSXtoX86reg(PSX_LO, DELETE_REG_FREE_NO_WRITEBACK); + u64 res = (u64)((u64)g_psxConstRegs[_Rs_] * (u64)g_psxConstRegs[_Rt_]); xMOV(ptr32[&psxRegs.GPR.n.hi], (u32)((res >> 32) & 0xffffffff)); xMOV(ptr32[&psxRegs.GPR.n.lo], (u32)(res & 0xffffffff)); } -void rpsxMULTU_consts(int info) { rpsxMULTsuperconst(info, _Rt_, g_psxConstRegs[_Rs_], 0); } -void rpsxMULTU_constt(int info) { rpsxMULTsuperconst(info, _Rs_, g_psxConstRegs[_Rt_], 0); } -void rpsxMULTU_(int info) { rpsxMULTsuper(info, 0); } +static void rpsxMULTU_consts(int info) +{ + rpsxMULTsuperconst(info, _Rt_, g_psxConstRegs[_Rs_], 0); +} + +static void rpsxMULTU_constt(int info) +{ + rpsxMULTsuperconst(info, _Rs_, g_psxConstRegs[_Rt_], 0); +} + +static void rpsxMULTU_(int info) +{ + rpsxMULTsuper(info, 0); +} PSXRECOMPILE_CONSTCODE3_PENALTY(MULTU, 1, psxInstCycles_Mult); //// DIV -void rpsxDIV_const() +static void rpsxDIV_const() { + _deletePSXtoX86reg(PSX_HI, DELETE_REG_FREE_NO_WRITEBACK); + _deletePSXtoX86reg(PSX_LO, DELETE_REG_FREE_NO_WRITEBACK); + u32 lo, hi; /* @@ -595,16 +910,20 @@ void rpsxDIV_const() } } -void rpsxDIVsuper(int info, int sign, int process = 0) +static void rpsxDIVsuper(int info, int sign, int process = 0) { // Lo/Hi = Rs / Rt (signed) if (process & PROCESS_CONSTT) xMOV(ecx, g_psxConstRegs[_Rt_]); + else if (info & PROCESS_EE_T) + xMOV(ecx, xRegister32(EEREC_T)); else xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rt_]]); if (process & PROCESS_CONSTS) xMOV(eax, g_psxConstRegs[_Rs_]); + else if (info & PROCESS_EE_S) + xMOV(eax, xRegister32(EEREC_S)); else xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); @@ -655,13 +974,23 @@ void rpsxDIVsuper(int info, int sign, int process = 0) x86SetJ8(end1); x86SetJ8(end2); - xMOV(ptr32[&psxRegs.GPR.n.lo], eax); - xMOV(ptr32[&psxRegs.GPR.n.hi], edx); + rpsxWritebackHILO(info); } -void rpsxDIV_consts(int info) { rpsxDIVsuper(info, 1, PROCESS_CONSTS); } -void rpsxDIV_constt(int info) { rpsxDIVsuper(info, 1, PROCESS_CONSTT); } -void rpsxDIV_(int info) { rpsxDIVsuper(info, 1); } +static void rpsxDIV_consts(int info) +{ + rpsxDIVsuper(info, 1, PROCESS_CONSTS); +} + +static void rpsxDIV_constt(int info) +{ + rpsxDIVsuper(info, 1, PROCESS_CONSTT); +} + +static void rpsxDIV_(int info) +{ + rpsxDIVsuper(info, 1); +} PSXRECOMPILE_CONSTCODE3_PENALTY(DIV, 1, psxInstCycles_Div); @@ -670,6 +999,9 @@ void rpsxDIVU_const() { u32 lo, hi; + _deletePSXtoX86reg(PSX_HI, DELETE_REG_FREE_NO_WRITEBACK); + _deletePSXtoX86reg(PSX_LO, DELETE_REG_FREE_NO_WRITEBACK); + if (g_psxConstRegs[_Rt_] != 0) { lo = g_psxConstRegs[_Rs_] / g_psxConstRegs[_Rt_]; @@ -684,413 +1016,467 @@ void rpsxDIVU_const() } } -void rpsxDIVU_consts(int info) { rpsxDIVsuper(info, 0, PROCESS_CONSTS); } -void rpsxDIVU_constt(int info) { rpsxDIVsuper(info, 0, PROCESS_CONSTT); } -void rpsxDIVU_(int info) { rpsxDIVsuper(info, 0); } +void rpsxDIVU_consts(int info) +{ + rpsxDIVsuper(info, 0, PROCESS_CONSTS); +} + +void rpsxDIVU_constt(int info) +{ + rpsxDIVsuper(info, 0, PROCESS_CONSTT); +} + +void rpsxDIVU_(int info) +{ + rpsxDIVsuper(info, 0); +} PSXRECOMPILE_CONSTCODE3_PENALTY(DIVU, 1, psxInstCycles_Div); // TLB loadstore functions + +static u8* rpsxGetConstantAddressOperand(bool store) +{ +#if 0 + if (!PSX_IS_CONST1(_Rs_)) + return nullptr; + + const u32 addr = g_psxConstRegs[_Rs_]; + return store ? iopVirtMemW(addr) : const_cast(iopVirtMemR(addr)); +#else + return nullptr; +#endif +} + +static void rpsxCalcAddressOperand() +{ + // if it's a const register, just flush it, since we'll need to do that + // when we call the load/store function anyway + int rs; + if (PSX_IS_CONST1(_Rs_)) + rs = _allocX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + else + rs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + + _freeX86reg(arg1regd); + + if (rs >= 0) + xMOV(arg1regd, xRegister32(rs)); + else + xMOV(arg1regd, ptr32[&psxRegs.GPR.r[_Rs_]]); + + if (_Imm_) + xADD(arg1regd, _Imm_); +} + +static void rpsxCalcStoreOperand() +{ + int rt; + if (PSX_IS_CONST1(_Rt_)) + rt = _allocX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + else + rt = _checkX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + + _freeX86reg(arg2regd); + + if (rt >= 0) + xMOV(arg2regd, xRegister32(rt)); + else + xMOV(arg2regd, ptr32[&psxRegs.GPR.r[_Rt_]]); +} + +static void rpsxLoad(int size, bool sign) +{ + rpsxCalcAddressOperand(); + + if (_Rt_ != 0) + { + PSX_DEL_CONST(_Rt_); + _deletePSXtoX86reg(_Rt_, DELETE_REG_FREE_NO_WRITEBACK); + } + + _psxFlushCall(FLUSH_FULLVTLB); + xTEST(arg1regd, 0x10000000); + xForwardJZ8 is_ram_read; + + switch (size) + { + case 8: + xFastCall((void*)iopMemRead8); + break; + case 16: + xFastCall((void*)iopMemRead16); + break; + case 32: + xFastCall((void*)iopMemRead32); + break; + + jNO_DEFAULT + } + + if (_Rt_ == 0) + { + // dummy read + is_ram_read.SetTarget(); + return; + } + + xForwardJump8 done; + is_ram_read.SetTarget(); + + // read from psM directly + xAND(arg1regd, 0x1fffff); + + auto addr = xComplexAddress(rax, iopMem->Main, arg1reg); + switch (size) + { + case 8: + xMOVZX(eax, ptr8[addr]); + break; + case 16: + xMOVZX(eax, ptr16[addr]); + break; + case 32: + xMOV(eax, ptr32[addr]); + break; + + jNO_DEFAULT + } + + done.SetTarget(); + + const int rt = rpsxAllocRegIfUsed(_Rt_, MODE_WRITE); + const xRegister32 dreg((rt < 0) ? eax.GetId() : rt); + + // sign/zero extend as needed + switch (size) + { + case 8: + sign ? xMOVSX(dreg, al) : xMOVZX(dreg, al); + break; + case 16: + sign ? xMOVSX(dreg, ax) : xMOVZX(dreg, ax); + break; + case 32: + xMOV(dreg, eax); + break; + jNO_DEFAULT + } + + // if not caching, write back + if (rt < 0) + xMOV(ptr32[&psxRegs.GPR.r[_Rt_]], eax); +} + + REC_FUNC(LWL); REC_FUNC(LWR); REC_FUNC(SWL); REC_FUNC(SWR); -using namespace x86Emitter; - static void rpsxLB() { - _psxDeleteReg(_Rs_, 1); - _psxOnWriteReg(_Rt_); - _psxDeleteReg(_Rt_, 0); - - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - if (_Imm_) - xADD(ecx, _Imm_); - xFastCall((void*)iopMemRead8, ecx); // returns value in EAX - if (_Rt_) - { - xMOVSX(eax, al); - xMOV(ptr32[&psxRegs.GPR.r[_Rt_]], eax); - } - PSX_DEL_CONST(_Rt_); + rpsxLoad(8, true); } static void rpsxLBU() { - _psxDeleteReg(_Rs_, 1); - _psxOnWriteReg(_Rt_); - _psxDeleteReg(_Rt_, 0); - - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - if (_Imm_) - xADD(ecx, _Imm_); - xFastCall((void*)iopMemRead8, ecx); // returns value in EAX - if (_Rt_) - { - xMOVZX(eax, al); - xMOV(ptr32[&psxRegs.GPR.r[_Rt_]], eax); - } - PSX_DEL_CONST(_Rt_); + rpsxLoad(8, false); } static void rpsxLH() { - _psxDeleteReg(_Rs_, 1); - _psxOnWriteReg(_Rt_); - _psxDeleteReg(_Rt_, 0); - - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - if (_Imm_) - xADD(ecx, _Imm_); - xFastCall((void*)iopMemRead16, ecx); // returns value in EAX - if (_Rt_) - { - xMOVSX(eax, ax); - xMOV(ptr32[&psxRegs.GPR.r[_Rt_]], eax); - } - PSX_DEL_CONST(_Rt_); + rpsxLoad(16, true); } static void rpsxLHU() { - _psxDeleteReg(_Rs_, 1); - _psxOnWriteReg(_Rt_); - _psxDeleteReg(_Rt_, 0); - - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - if (_Imm_) - xADD(ecx, _Imm_); - xFastCall((void*)iopMemRead16, ecx); // returns value in EAX - if (_Rt_) - { - xMOVZX(eax, ax); - xMOV(ptr32[&psxRegs.GPR.r[_Rt_]], eax); - } - PSX_DEL_CONST(_Rt_); + rpsxLoad(16, false); } static void rpsxLW() { - _psxDeleteReg(_Rs_, 1); - _psxOnWriteReg(_Rt_); - _psxDeleteReg(_Rt_, 0); - - _psxFlushCall(FLUSH_EVERYTHING); - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - if (_Imm_) - xADD(ecx, _Imm_); - - xTEST(ecx, 0x10000000); - j8Ptr[0] = JZ8(0); - - xFastCall((void*)iopMemRead32, ecx); // returns value in EAX - if (_Rt_) - { - xMOV(ptr32[&psxRegs.GPR.r[_Rt_]], eax); - } - j8Ptr[1] = JMP8(0); - x86SetJ8(j8Ptr[0]); - - // read from psM directly - xAND(ecx, 0x1fffff); - - xMOV(ecx, ptr32[xComplexAddress(rax, iopMem->Main, rcx)]); - if (_Rt_) - { - xMOV(ptr32[&psxRegs.GPR.r[_Rt_]], ecx); - } - - x86SetJ8(j8Ptr[1]); - PSX_DEL_CONST(_Rt_); + rpsxLoad(32, false); } static void rpsxSB() { - _psxDeleteReg(_Rs_, 1); - _psxDeleteReg(_Rt_, 1); - - xMOV(arg1regd, ptr32[&psxRegs.GPR.r[_Rs_]]); - if (_Imm_) - xADD(arg1regd, _Imm_); - xMOV(arg2regd, ptr32[&psxRegs.GPR.r[_Rt_]]); - xFastCall((void*)iopMemWrite8, arg1regd, arg2regd); + rpsxCalcAddressOperand(); + rpsxCalcStoreOperand(); + _psxFlushCall(FLUSH_FULLVTLB); + xFastCall((void*)iopMemWrite8); } static void rpsxSH() { - _psxDeleteReg(_Rs_, 1); - _psxDeleteReg(_Rt_, 1); - - xMOV(arg1regd, ptr32[&psxRegs.GPR.r[_Rs_]]); - if (_Imm_) - xADD(arg1regd, _Imm_); - xMOV(arg2regd, ptr32[&psxRegs.GPR.r[_Rt_]]); - xFastCall((void*)iopMemWrite16, arg1regd, arg2regd); + rpsxCalcAddressOperand(); + rpsxCalcStoreOperand(); + _psxFlushCall(FLUSH_FULLVTLB); + xFastCall((void*)iopMemWrite16); } static void rpsxSW() { - _psxDeleteReg(_Rs_, 1); - _psxDeleteReg(_Rt_, 1); + u8* ptr = rpsxGetConstantAddressOperand(true); + if (ptr) + { + const int rt = _allocX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + xMOV(ptr32[ptr], xRegister32(rt)); + return; + } - xMOV(arg1regd, ptr32[&psxRegs.GPR.r[_Rs_]]); - if (_Imm_) - xADD(arg1regd, _Imm_); - xMOV(arg2regd, ptr32[&psxRegs.GPR.r[_Rt_]]); - xFastCall((void*)iopMemWrite32, arg1regd, arg2regd); + rpsxCalcAddressOperand(); + rpsxCalcStoreOperand(); + _psxFlushCall(FLUSH_FULLVTLB); + xFastCall((void*)iopMemWrite32); } //// SLL -void rpsxSLL_const() +static void rpsxSLL_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rt_] << _Sa_; } -// shifttype: 0 - sll, 1 - srl, 2 - sra -void rpsxShiftConst(int info, int rdreg, int rtreg, int imm, int shifttype) +static void rpsxSLLs_(int info, int sa) { - imm &= 0x1f; - if (imm) - { - if (rdreg == rtreg) - { - switch (shifttype) - { - case 0: xSHL(ptr32[&psxRegs.GPR.r[rdreg]], imm); break; - case 1: xSHR(ptr32[&psxRegs.GPR.r[rdreg]], imm); break; - case 2: xSAR(ptr32[&psxRegs.GPR.r[rdreg]], imm); break; - } - } - else - { - xMOV(eax, ptr32[&psxRegs.GPR.r[rtreg]]); - switch (shifttype) - { - case 0: xSHL(eax, imm); break; - case 1: xSHR(eax, imm); break; - case 2: xSAR(eax, imm); break; - } - xMOV(ptr32[&psxRegs.GPR.r[rdreg]], eax); - } - } - else - { - if (rdreg != rtreg) - { - xMOV(eax, ptr32[&psxRegs.GPR.r[rtreg]]); - xMOV(ptr32[&psxRegs.GPR.r[rdreg]], eax); - } - } + rpsxMoveTtoD(info); + if (sa != 0) + xSHL(xRegister32(EEREC_D), sa); } -void rpsxSLL_(int info) { rpsxShiftConst(info, _Rd_, _Rt_, _Sa_, 0); } -PSXRECOMPILE_CONSTCODE2(SLL); +static void rpsxSLL_(int info) +{ + rpsxSLLs_(info, _Sa_); +} + +PSXRECOMPILE_CONSTCODE2(SLL, XMMINFO_WRITED | XMMINFO_READS); //// SRL -void rpsxSRL_const() +static void rpsxSRL_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rt_] >> _Sa_; } -void rpsxSRL_(int info) { rpsxShiftConst(info, _Rd_, _Rt_, _Sa_, 1); } -PSXRECOMPILE_CONSTCODE2(SRL); +static void rpsxSRLs_(int info, int sa) +{ + rpsxMoveTtoD(info); + if (sa != 0) + xSHR(xRegister32(EEREC_D), sa); +} + +static void rpsxSRL_(int info) +{ + rpsxSRLs_(info, _Sa_); +} + +PSXRECOMPILE_CONSTCODE2(SRL, XMMINFO_WRITED | XMMINFO_READS); //// SRA -void rpsxSRA_const() +static void rpsxSRA_const() { g_psxConstRegs[_Rd_] = *(int*)&g_psxConstRegs[_Rt_] >> _Sa_; } -void rpsxSRA_(int info) { rpsxShiftConst(info, _Rd_, _Rt_, _Sa_, 2); } -PSXRECOMPILE_CONSTCODE2(SRA); +static void rpsxSRAs_(int info, int sa) +{ + rpsxMoveTtoD(info); + if (sa != 0) + xSAR(xRegister32(EEREC_D), sa); +} + +static void rpsxSRA_(int info) +{ + rpsxSRAs_(info, _Sa_); +} + +PSXRECOMPILE_CONSTCODE2(SRA, XMMINFO_WRITED | XMMINFO_READS); //// SLLV -void rpsxSLLV_const() +static void rpsxShiftV_constt(int info, const xImpl_Group2& shift) +{ + pxAssert(_Rs_ != 0); + rpsxMoveSToECX(info); + xMOV(xRegister32(EEREC_D), g_psxConstRegs[_Rt_]); + shift(xRegister32(EEREC_D), cl); +} + +static void rpsxShiftV(int info, const xImpl_Group2& shift) +{ + pxAssert(_Rs_ != 0); + + rpsxMoveSToECX(info); + rpsxMoveTtoD(info); + shift(xRegister32(EEREC_D), cl); +} + +static void rpsxSLLV_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rt_] << (g_psxConstRegs[_Rs_] & 0x1f); } -void rpsxShiftVconsts(int info, int shifttype) +static void rpsxSLLV_consts(int info) { - rpsxShiftConst(info, _Rd_, _Rt_, g_psxConstRegs[_Rs_], shifttype); + rpsxSLLs_(info, g_psxConstRegs[_Rs_] & 0x1f); } -void rpsxShiftVconstt(int info, int shifttype) +static void rpsxSLLV_constt(int info) { - xMOV(eax, g_psxConstRegs[_Rt_]); - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - switch (shifttype) - { - case 0: xSHL(eax, cl); break; - case 1: xSHR(eax, cl); break; - case 2: xSAR(eax, cl); break; - } - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + rpsxShiftV_constt(info, xSHL); } -void rpsxSLLV_consts(int info) { rpsxShiftVconsts(info, 0); } -void rpsxSLLV_constt(int info) { rpsxShiftVconstt(info, 0); } -void rpsxSLLV_(int info) +static void rpsxSLLV_(int info) { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - xSHL(eax, cl); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + rpsxShiftV(info, xSHL); } -PSXRECOMPILE_CONSTCODE0(SLLV); +PSXRECOMPILE_CONSTCODE0(SLLV, XMMINFO_WRITED | XMMINFO_READS); //// SRLV -void rpsxSRLV_const() +static void rpsxSRLV_const() { g_psxConstRegs[_Rd_] = g_psxConstRegs[_Rt_] >> (g_psxConstRegs[_Rs_] & 0x1f); } -void rpsxSRLV_consts(int info) { rpsxShiftVconsts(info, 1); } -void rpsxSRLV_constt(int info) { rpsxShiftVconstt(info, 1); } -void rpsxSRLV_(int info) +static void rpsxSRLV_consts(int info) { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - xSHR(eax, cl); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + rpsxSRLs_(info, g_psxConstRegs[_Rs_] & 0x1f); } -PSXRECOMPILE_CONSTCODE0(SRLV); +static void rpsxSRLV_constt(int info) +{ + rpsxShiftV_constt(info, xSHR); +} + +static void rpsxSRLV_(int info) +{ + rpsxShiftV(info, xSHR); +} + +PSXRECOMPILE_CONSTCODE0(SRLV, XMMINFO_WRITED | XMMINFO_READS); //// SRAV -void rpsxSRAV_const() +static void rpsxSRAV_const() { g_psxConstRegs[_Rd_] = *(int*)&g_psxConstRegs[_Rt_] >> (g_psxConstRegs[_Rs_] & 0x1f); } -void rpsxSRAV_consts(int info) { rpsxShiftVconsts(info, 2); } -void rpsxSRAV_constt(int info) { rpsxShiftVconstt(info, 2); } -void rpsxSRAV_(int info) +static void rpsxSRAV_consts(int info) { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - xMOV(ecx, ptr32[&psxRegs.GPR.r[_Rs_]]); - xSAR(eax, cl); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + rpsxSRAs_(info, g_psxConstRegs[_Rs_] & 0x1f); } -PSXRECOMPILE_CONSTCODE0(SRAV); +static void rpsxSRAV_constt(int info) +{ + rpsxShiftV_constt(info, xSAR); +} + +static void rpsxSRAV_(int info) +{ + rpsxShiftV(info, xSAR); +} + +PSXRECOMPILE_CONSTCODE0(SRAV, XMMINFO_WRITED | XMMINFO_READS); extern void rpsxSYSCALL(); extern void rpsxBREAK(); -void rpsxMFHI() +static void rpsxMFHI() { if (!_Rd_) return; - _psxOnWriteReg(_Rd_); - _psxDeleteReg(_Rd_, 0); - xMOV(eax, ptr32[&psxRegs.GPR.n.hi]); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + rpsxCopyReg(_Rd_, PSX_HI); } -void rpsxMTHI() +static void rpsxMTHI() { - if (PSX_IS_CONST1(_Rs_)) - { - xMOV(ptr32[&psxRegs.GPR.n.hi], g_psxConstRegs[_Rs_]); - } - else - { - _psxDeleteReg(_Rs_, 1); - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); - xMOV(ptr32[&psxRegs.GPR.n.hi], eax); - } + rpsxCopyReg(PSX_HI, _Rs_); } -void rpsxMFLO() +static void rpsxMFLO() { if (!_Rd_) return; - _psxOnWriteReg(_Rd_); - _psxDeleteReg(_Rd_, 0); - xMOV(eax, ptr32[&psxRegs.GPR.n.lo]); - xMOV(ptr32[&psxRegs.GPR.r[_Rd_]], eax); + rpsxCopyReg(_Rd_, PSX_LO); } -void rpsxMTLO() +static void rpsxMTLO() { - if (PSX_IS_CONST1(_Rs_)) - { - xMOV(ptr32[&psxRegs.GPR.n.lo], g_psxConstRegs[_Rs_]); - } - else - { - _psxDeleteReg(_Rs_, 1); - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); - xMOV(ptr32[&psxRegs.GPR.n.lo], eax); - } + rpsxCopyReg(PSX_LO, _Rs_); } -void rpsxJ() +static void rpsxJ() { // j target u32 newpc = _InstrucTarget_ * 4 + (psxpc & 0xf0000000); - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(newpc); } -void rpsxJAL() +static void rpsxJAL() { u32 newpc = (_InstrucTarget_ << 2) + (psxpc & 0xf0000000); - _psxDeleteReg(31, 0); + _psxDeleteReg(31, DELETE_REG_FREE_NO_WRITEBACK); PSX_SET_CONST(31); g_psxConstRegs[31] = psxpc + 4; - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(newpc); } -void rpsxJR() +static void rpsxJR() { psxSetBranchReg(_Rs_); } -void rpsxJALR() +static void rpsxJALR() { + const u32 newpc = psxpc + 4; + const bool swap = (_Rd_ == _Rs_) ? false : psxTrySwapDelaySlot(_Rs_, 0, _Rd_); + // jalr Rs - _allocX86reg(calleeSavedReg2d, X86TYPE_PCWRITEBACK, 0, MODE_WRITE); - _psxMoveGPRtoR(calleeSavedReg2d, _Rs_); + int wbreg = -1; + if (!swap) + { + wbreg = _allocX86reg(X86TYPE_PCWRITEBACK, 0, MODE_WRITE | MODE_CALLEESAVED); + _psxMoveGPRtoR(xRegister32(wbreg), _Rs_); + } if (_Rd_) { - _psxDeleteReg(_Rd_, 0); + _psxDeleteReg(_Rd_, DELETE_REG_FREE_NO_WRITEBACK); PSX_SET_CONST(_Rd_); - g_psxConstRegs[_Rd_] = psxpc + 4; + g_psxConstRegs[_Rd_] = newpc; } - psxRecompileNextInstruction(1); - - if (x86regs[calleeSavedReg2d.GetId()].inuse) + if (!swap) { - pxAssert(x86regs[calleeSavedReg2d.GetId()].type == X86TYPE_PCWRITEBACK); - xMOV(ptr32[&psxRegs.pc], calleeSavedReg2d); - x86regs[calleeSavedReg2d.GetId()].inuse = 0; -#ifdef PCSX2_DEBUG - xOR(calleeSavedReg2d, calleeSavedReg2d); -#endif + psxRecompileNextInstruction(true, false); + + if (x86regs[wbreg].inuse && x86regs[wbreg].type == X86TYPE_PCWRITEBACK) + { + xMOV(ptr32[&psxRegs.pc], xRegister32(wbreg)); + x86regs[wbreg].inuse = 0; + } + else + { + xMOV(eax, ptr32[&psxRegs.pcWriteback]); + xMOV(ptr32[&psxRegs.pc], eax); + } } else { - xMOV(eax, ptr32[&g_recWriteback]); - xMOV(ptr32[&psxRegs.pc], eax); -#ifdef PCSX2_DEBUG - xOR(eax, eax); -#endif + if (PSX_IS_DIRTY_CONST(_Rs_) || _hasX86reg(X86TYPE_PSX, _Rs_, 0)) + { + const int x86reg = _allocX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + xMOV(ptr32[&psxRegs.pc], xRegister32(x86reg)); + } + else + { + _psxMoveGPRtoM((uptr)&psxRegs.pc, _Rs_); + } } -#ifdef PCSX2_DEBUG - xForwardJNZ8 skipAssert; - xWrite8(0xcc); - skipAssert.SetTarget(); -#endif psxSetBranchReg(0xffffffff); } @@ -1098,27 +1484,40 @@ void rpsxJALR() //// BEQ static u32* s_pbranchjmp; -void rpsxSetBranchEQ(int info, int process) +static void rpsxSetBranchEQ(int process) { if (process & PROCESS_CONSTS) { - xCMP(ptr32[&psxRegs.GPR.r[_Rt_]], g_psxConstRegs[_Rs_]); - s_pbranchjmp = JNE32(0); + const int regt = _checkX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + if (regt >= 0) + xCMP(xRegister32(regt), g_psxConstRegs[_Rs_]); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rt_]], g_psxConstRegs[_Rs_]); } else if (process & PROCESS_CONSTT) { - xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], g_psxConstRegs[_Rt_]); - s_pbranchjmp = JNE32(0); + const int regs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + xCMP(xRegister32(regs), g_psxConstRegs[_Rt_]); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], g_psxConstRegs[_Rt_]); } else { - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rs_]]); - xCMP(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - s_pbranchjmp = JNE32(0); + // force S into register, since we need to load it, may as well cache. + const int regs = _allocX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + const int regt = _checkX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + + if (regt >= 0) + xCMP(xRegister32(regs), xRegister32(regt)); + else + xCMP(xRegister32(regs), ptr32[&psxRegs.GPR.r[_Rt_]]); } + + s_pbranchjmp = JNE32(0); } -void rpsxBEQ_const() +static void rpsxBEQ_const() { u32 branchTo; @@ -1127,47 +1526,62 @@ void rpsxBEQ_const() else branchTo = psxpc + 4; - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(branchTo); } -void rpsxBEQ_process(int info, int process) +static void rpsxBEQ_process(int process) { u32 branchTo = ((s32)_Imm_ * 4) + psxpc; if (_Rs_ == _Rt_) { - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(branchTo); } else { - _psxFlushAllUnused(); - psxSaveBranchState(); + const bool swap = psxTrySwapDelaySlot(_Rs_, _Rt_, 0); + _psxFlushAllDirty(); + rpsxSetBranchEQ(process); - rpsxSetBranchEQ(info, process); + if (!swap) + { + psxSaveBranchState(); + psxRecompileNextInstruction(true, false); + } - psxRecompileNextInstruction(1); psxSetBranchImm(branchTo); x86SetJ32A(s_pbranchjmp); - // recopy the next inst - psxpc -= 4; - psxLoadBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + psxpc -= 4; + psxLoadBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(psxpc); } } -void rpsxBEQ_(int info) { rpsxBEQ_process(info, 0); } -void rpsxBEQ_consts(int info) { rpsxBEQ_process(info, PROCESS_CONSTS); } -void rpsxBEQ_constt(int info) { rpsxBEQ_process(info, PROCESS_CONSTT); } -PSXRECOMPILE_CONSTCODE3(BEQ, 0); +static void rpsxBEQ() +{ + // prefer using the host register over an immediate, it'll be smaller code. + if (PSX_IS_CONST2(_Rs_, _Rt_)) + rpsxBEQ_const(); + else if (PSX_IS_CONST1(_Rs_) && _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ) < 0) + rpsxBEQ_process(PROCESS_CONSTS); + else if (PSX_IS_CONST1(_Rt_) && _checkX86reg(X86TYPE_PSX, _Rt_, MODE_READ) < 0) + rpsxBEQ_process(PROCESS_CONSTT); + else + rpsxBEQ_process(0); +} //// BNE -void rpsxBNE_const() +static void rpsxBNE_const() { u32 branchTo; @@ -1176,123 +1590,160 @@ void rpsxBNE_const() else branchTo = psxpc + 4; - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(branchTo); } -void rpsxBNE_process(int info, int process) +static void rpsxBNE_process(int process) { - u32 branchTo = ((s32)_Imm_ * 4) + psxpc; + const u32 branchTo = ((s32)_Imm_ * 4) + psxpc; if (_Rs_ == _Rt_) { - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(psxpc); return; } - _psxFlushAllUnused(); - rpsxSetBranchEQ(info, process); + const bool swap = psxTrySwapDelaySlot(_Rs_, _Rt_, 0); + _psxFlushAllDirty(); + rpsxSetBranchEQ(process); + + if (!swap) + { + psxSaveBranchState(); + psxRecompileNextInstruction(true, false); + } - psxSaveBranchState(); - psxRecompileNextInstruction(1); psxSetBranchImm(psxpc); x86SetJ32A(s_pbranchjmp); - // recopy the next inst - psxpc -= 4; - psxLoadBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + psxpc -= 4; + psxLoadBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(branchTo); } -void rpsxBNE_(int info) { rpsxBNE_process(info, 0); } -void rpsxBNE_consts(int info) { rpsxBNE_process(info, PROCESS_CONSTS); } -void rpsxBNE_constt(int info) { rpsxBNE_process(info, PROCESS_CONSTT); } -PSXRECOMPILE_CONSTCODE3(BNE, 0); +static void rpsxBNE() +{ + if (PSX_IS_CONST2(_Rs_, _Rt_)) + rpsxBNE_const(); + else if (PSX_IS_CONST1(_Rs_) && _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ) < 0) + rpsxBNE_process(PROCESS_CONSTS); + else if (PSX_IS_CONST1(_Rt_) && _checkX86reg(X86TYPE_PSX, _Rt_, MODE_READ) < 0) + rpsxBNE_process(PROCESS_CONSTT); + else + rpsxBNE_process(0); +} //// BLTZ -void rpsxBLTZ() +static void rpsxBLTZ() { // Branch if Rs < 0 u32 branchTo = (s32)_Imm_ * 4 + psxpc; - _psxFlushAllUnused(); - if (PSX_IS_CONST1(_Rs_)) { if ((int)g_psxConstRegs[_Rs_] >= 0) branchTo = psxpc + 4; - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(branchTo); return; } - xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); + const bool swap = psxTrySwapDelaySlot(_Rs_, 0, 0); + _psxFlushAllDirty(); + + const int regs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + xCMP(xRegister32(regs), 0); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); + u32* pjmp = JL32(0); - psxSaveBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + psxSaveBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(psxpc); x86SetJ32A(pjmp); - // recopy the next inst - psxpc -= 4; - psxLoadBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + psxpc -= 4; + psxLoadBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(branchTo); } //// BGEZ -void rpsxBGEZ() +static void rpsxBGEZ() { u32 branchTo = ((s32)_Imm_ * 4) + psxpc; - _psxFlushAllUnused(); - if (PSX_IS_CONST1(_Rs_)) { if ((int)g_psxConstRegs[_Rs_] < 0) branchTo = psxpc + 4; - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(branchTo); return; } - xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); + const bool swap = psxTrySwapDelaySlot(_Rs_, 0, 0); + _psxFlushAllDirty(); + + const int regs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + xCMP(xRegister32(regs), 0); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); + u32* pjmp = JGE32(0); - psxSaveBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + psxSaveBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(psxpc); x86SetJ32A(pjmp); - // recopy the next inst - psxpc -= 4; - psxLoadBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + psxpc -= 4; + psxLoadBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(branchTo); } //// BLTZAL -void rpsxBLTZAL() +static void rpsxBLTZAL() { // Branch if Rs < 0 u32 branchTo = (s32)_Imm_ * 4 + psxpc; - _psxFlushConstReg(31); - _psxDeleteReg(31, 0); - _psxFlushAllUnused(); + _psxDeleteReg(31, DELETE_REG_FREE_NO_WRITEBACK); PSX_SET_CONST(31); g_psxConstRegs[31] = psxpc + 4; @@ -1302,38 +1753,49 @@ void rpsxBLTZAL() if ((int)g_psxConstRegs[_Rs_] >= 0) branchTo = psxpc + 4; - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(branchTo); return; } - xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); + const bool swap = psxTrySwapDelaySlot(_Rs_, 0, 0); + _psxFlushAllDirty(); + + const int regs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + xCMP(xRegister32(regs), 0); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); + u32* pjmp = JL32(0); - psxSaveBranchState(); - - psxRecompileNextInstruction(1); + if (!swap) + { + psxSaveBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(psxpc); x86SetJ32A(pjmp); - // recopy the next inst - psxpc -= 4; - psxLoadBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + psxpc -= 4; + psxLoadBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(branchTo); } //// BGEZAL -void rpsxBGEZAL() +static void rpsxBGEZAL() { u32 branchTo = ((s32)_Imm_ * 4) + psxpc; - _psxFlushConstReg(31); - _psxDeleteReg(31, 0); - _psxFlushAllUnused(); + _psxDeleteReg(31, DELETE_REG_FREE_NO_WRITEBACK); PSX_SET_CONST(31); g_psxConstRegs[31] = psxpc + 4; @@ -1343,124 +1805,160 @@ void rpsxBGEZAL() if ((int)g_psxConstRegs[_Rs_] < 0) branchTo = psxpc + 4; - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(branchTo); return; } - xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); + const bool swap = psxTrySwapDelaySlot(_Rs_, 0, 0); + _psxFlushAllDirty(); + + const int regs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + xCMP(xRegister32(regs), 0); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); + u32* pjmp = JGE32(0); - psxSaveBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + psxSaveBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(psxpc); x86SetJ32A(pjmp); - // recopy the next inst - psxpc -= 4; - psxLoadBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + psxpc -= 4; + psxLoadBranchState(); + psxRecompileNextInstruction(true, false); + } psxSetBranchImm(branchTo); } //// BLEZ -void rpsxBLEZ() +static void rpsxBLEZ() { // Branch if Rs <= 0 u32 branchTo = (s32)_Imm_ * 4 + psxpc; - _psxFlushAllUnused(); - if (PSX_IS_CONST1(_Rs_)) { if ((int)g_psxConstRegs[_Rs_] > 0) branchTo = psxpc + 4; - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(branchTo); return; } - _psxDeleteReg(_Rs_, 1); - _clearNeededX86regs(); + const bool swap = psxTrySwapDelaySlot(_Rs_, 0, 0); + _psxFlushAllDirty(); + + const int regs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + xCMP(xRegister32(regs), 0); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); - xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); u32* pjmp = JLE32(0); - psxSaveBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + psxSaveBranchState(); + psxRecompileNextInstruction(true, false); + } + psxSetBranchImm(psxpc); x86SetJ32A(pjmp); - psxpc -= 4; - psxLoadBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + psxpc -= 4; + psxLoadBranchState(); + psxRecompileNextInstruction(true, false); + } + psxSetBranchImm(branchTo); } //// BGTZ -void rpsxBGTZ() +static void rpsxBGTZ() { // Branch if Rs > 0 u32 branchTo = (s32)_Imm_ * 4 + psxpc; - _psxFlushAllUnused(); + _psxFlushAllDirty(); if (PSX_IS_CONST1(_Rs_)) { if ((int)g_psxConstRegs[_Rs_] <= 0) branchTo = psxpc + 4; - psxRecompileNextInstruction(1); + psxRecompileNextInstruction(true, false); psxSetBranchImm(branchTo); return; } - _psxDeleteReg(_Rs_, 1); - _clearNeededX86regs(); + const bool swap = psxTrySwapDelaySlot(_Rs_, 0, 0); + _psxFlushAllDirty(); + + const int regs = _checkX86reg(X86TYPE_PSX, _Rs_, MODE_READ); + if (regs >= 0) + xCMP(xRegister32(regs), 0); + else + xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); - xCMP(ptr32[&psxRegs.GPR.r[_Rs_]], 0); u32* pjmp = JG32(0); - psxSaveBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + psxSaveBranchState(); + psxRecompileNextInstruction(true, false); + } + psxSetBranchImm(psxpc); x86SetJ32A(pjmp); - psxpc -= 4; - psxLoadBranchState(); - psxRecompileNextInstruction(1); + if (!swap) + { + psxpc -= 4; + psxLoadBranchState(); + psxRecompileNextInstruction(true, false); + } + psxSetBranchImm(branchTo); } -void rpsxMFC0() +static void rpsxMFC0() { // Rt = Cop0->Rd if (!_Rt_) return; - _psxOnWriteReg(_Rt_); - xMOV(eax, ptr32[&psxRegs.CP0.r[_Rd_]]); - xMOV(ptr32[&psxRegs.GPR.r[_Rt_]], eax); + const int rt = _allocX86reg(X86TYPE_PSX, _Rt_, MODE_WRITE); + xMOV(xRegister32(rt), ptr32[&psxRegs.CP0.r[_Rd_]]); } -void rpsxCFC0() +static void rpsxCFC0() { // Rt = Cop0->Rd if (!_Rt_) return; - _psxOnWriteReg(_Rt_); - xMOV(eax, ptr32[&psxRegs.CP0.r[_Rd_]]); - xMOV(ptr32[&psxRegs.GPR.r[_Rt_]], eax); + const int rt = _allocX86reg(X86TYPE_PSX, _Rt_, MODE_WRITE); + xMOV(xRegister32(rt), ptr32[&psxRegs.CP0.r[_Rd_]]); } -void rpsxMTC0() +static void rpsxMTC0() { // Cop0->Rd = Rt if (PSX_IS_CONST1(_Rt_)) @@ -1469,19 +1967,18 @@ void rpsxMTC0() } else { - _psxDeleteReg(_Rt_, 1); - xMOV(eax, ptr32[&psxRegs.GPR.r[_Rt_]]); - xMOV(ptr32[&psxRegs.CP0.r[_Rd_]], eax); + const int rt = _allocX86reg(X86TYPE_PSX, _Rt_, MODE_READ); + xMOV(ptr32[&psxRegs.CP0.r[_Rd_]], xRegister32(rt)); } } -void rpsxCTC0() +static void rpsxCTC0() { // Cop0->Rd = Rt rpsxMTC0(); } -void rpsxRFE() +static void rpsxRFE() { xMOV(eax, ptr32[&psxRegs.CP0.n.Status]); xMOV(ecx, eax); @@ -1549,6 +2046,7 @@ static void rpsxNULL() Console.WriteLn("psxUNK: %8.8x", psxRegs.code); } +// clang-format off void (*rpsxBSC[64])() = { rpsxSPECIAL, rpsxREGIMM, rpsxJ , rpsxJAL , rpsxBEQ , rpsxBNE , rpsxBLEZ, rpsxBGTZ, rpsxADDI , rpsxADDIU , rpsxSLTI, rpsxSLTIU, rpsxANDI, rpsxORI , rpsxXORI, rpsxLUI , @@ -1602,6 +2100,7 @@ void (*rpsxCP2BSC[32])() = { rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, rpsxNULL, }; +// clang-format on //////////////////////////////////////////////// // Back-Prob Function Tables - Gathering Info // @@ -1610,18 +2109,17 @@ void (*rpsxCP2BSC[32])() = { { \ if (!(pinst->regs[reg] & EEINST_USED)) \ pinst->regs[reg] |= EEINST_LASTUSE; \ - prev->regs[reg] |= EEINST_LIVE0 | EEINST_USED; \ + prev->regs[reg] |= EEINST_LIVE | EEINST_USED; \ pinst->regs[reg] |= EEINST_USED; \ _recFillRegister(*pinst, XMMTYPE_GPRREG, reg, 0); \ } #define rpsxpropSetWrite(reg) \ { \ - prev->regs[reg] &= ~EEINST_LIVE0; \ + prev->regs[reg] &= ~(EEINST_LIVE | EEINST_USED); \ if (!(pinst->regs[reg] & EEINST_USED)) \ pinst->regs[reg] |= EEINST_LASTUSE; \ pinst->regs[reg] |= EEINST_USED; \ - prev->regs[reg] |= EEINST_USED; \ _recFillRegister(*pinst, XMMTYPE_GPRREG, reg, 1); \ } @@ -1677,7 +2175,11 @@ void rpsxpropBSC(EEINST* prev, EEINST* pinst) break; // stores - case 40: case 41: case 42: case 43: case 46: + case 40: + case 41: + case 42: + case 43: + case 46: rpsxpropSetRead(_Rt_); rpsxpropSetRead(_Rs_); break; @@ -1794,7 +2296,7 @@ void rpsxpropREGIMM(EEINST* prev, EEINST* pinst) rpsxpropSetRead(_Rs_); break; - jNO_DEFAULT + jNO_DEFAULT } } @@ -1818,7 +2320,7 @@ void rpsxpropCP0(EEINST* prev, EEINST* pinst) case 16: // rfe break; - jNO_DEFAULT + jNO_DEFAULT } } diff --git a/pcsx2/x86/iR5900.h b/pcsx2/x86/iR5900.h index 22fabe2d5e..ef869b0941 100644 --- a/pcsx2/x86/iR5900.h +++ b/pcsx2/x86/iR5900.h @@ -21,6 +21,9 @@ #include "iCore.h" #include "R5900_Profiler.h" +// Register containing a pointer to our fastmem (4GB) area +#define RFASTMEMBASE x86Emitter::rbp + extern u32 maxrecmem; extern u32 pc; // recompiler pc extern int g_branch; // set for branch @@ -61,11 +64,16 @@ extern bool s_nBlockInterlocked; // Current block has VU0 interlocking extern bool g_recompilingDelaySlot; +// Used for generating backpatch thunks for fastmem. +u8* recBeginThunk(); +u8* recEndThunk(); + // used when processing branches +bool TrySwapDelaySlot(u32 rs, u32 rt, u32 rd, bool allow_loadstore); void SaveBranchState(); void LoadBranchState(); -void recompileNextInstruction(int delayslot); +void recompileNextInstruction(bool delayslot, bool swapped_delay_slot); void SetBranchReg(u32 reg); void SetBranchImm(u32 imm); @@ -78,8 +86,7 @@ namespace R5900 { namespace Dynarec { - extern void recDoBranchImm(u32* jmpSkip, bool isLikely = false); - extern void recDoBranchImm_Likely(u32* jmpSkip); + extern void recDoBranchImm(u32 branchTo, u32* jmpSkip, bool isLikely = false, bool swappedDelaySlot = false); } // namespace Dynarec } // namespace R5900 @@ -88,6 +95,7 @@ namespace R5900 #define GPR_IS_CONST1(reg) (EE_CONST_PROP && (reg) < 32 && (g_cpuHasConstReg & (1 << (reg)))) #define GPR_IS_CONST2(reg1, reg2) (EE_CONST_PROP && (g_cpuHasConstReg & (1 << (reg1))) && (g_cpuHasConstReg & (1 << (reg2)))) +#define GPR_IS_DIRTY_CONST(reg) (EE_CONST_PROP && (reg) < 32 && (g_cpuHasConstReg & (1 << (reg))) && (!(g_cpuFlushedConstReg & (1 << (reg))))) #define GPR_SET_CONST(reg) \ { \ if ((reg) < 32) \ @@ -106,28 +114,23 @@ namespace R5900 alignas(16) extern GPR_reg64 g_cpuConstRegs[32]; extern u32 g_cpuHasConstReg, g_cpuFlushedConstReg; -// gets a memory pointer to the constant reg -u32* _eeGetConstReg(int reg); - // finds where the GPR is stored and moves lower 32 bits to EAX -void _eeMoveGPRtoR(const x86Emitter::xRegister32& to, int fromgpr); -void _eeMoveGPRtoM(uptr to, int fromgpr); -void _eeMoveGPRtoRm(x86IntRegType to, int fromgpr); -void _signExtendToMem(void* mem); -void eeSignExtendTo(int gpr, bool onlyupper = false); +void _eeMoveGPRtoR(const x86Emitter::xRegister32& to, int fromgpr, bool allow_preload = true); +void _eeMoveGPRtoR(const x86Emitter::xRegister64& to, int fromgpr, bool allow_preload = true); +void _eeMoveGPRtoM(uptr to, int fromgpr); // 32-bit only -void _eeFlushAllUnused(); +void _eeFlushAllDirty(); void _eeOnWriteReg(int reg, int signext); // totally deletes from const, xmm, and mmx entries // if flush is 1, also flushes to memory // if 0, only flushes if not an xmm reg (used when overwriting lower 64bits of reg) void _deleteEEreg(int reg, int flush); +void _deleteEEreg128(int reg); void _flushEEreg(int reg, bool clear = false); -// allocates memory on the instruction size and returns the pointer -u32* recGetImm64(u32 hi, u32 lo); +int _eeTryRenameReg(int to, int from, int fromx86, int other, int xmminfo); ////////////////////////////////////// // Templates for code recompilation // @@ -140,14 +143,27 @@ typedef void (*R5900FNPTR_INFO)(int info); void rec##fn(void) \ { \ EE::Profiler.EmitOp(eeOpcode::fn); \ - eeRecompileCode0(rec##fn##_const, rec##fn##_consts, rec##fn##_constt, rec##fn##_, xmminfo); \ + eeRecompileCode0(rec##fn##_const, rec##fn##_consts, rec##fn##_constt, rec##fn##_, (xmminfo)); \ } - -#define EERECOMPILE_CODEX(codename, fn) \ +#define EERECOMPILE_CODERC0(fn, xmminfo) \ void rec##fn(void) \ { \ EE::Profiler.EmitOp(eeOpcode::fn); \ - codename(rec##fn##_const, rec##fn##_); \ + eeRecompileCodeRC0(rec##fn##_const, rec##fn##_consts, rec##fn##_constt, rec##fn##_, (xmminfo)); \ + } + +#define EERECOMPILE_CODEX(codename, fn, xmminfo) \ + void rec##fn(void) \ + { \ + EE::Profiler.EmitOp(eeOpcode::fn); \ + codename(rec##fn##_const, rec##fn##_, (xmminfo)); \ + } + +#define EERECOMPILE_CODEI(codename, fn, xmminfo) \ + void rec##fn(void) \ + { \ + EE::Profiler.EmitOp(eeOpcode::fn); \ + codename(rec##fn##_const, rec##fn##_, (xmminfo)); \ } // @@ -155,66 +171,11 @@ typedef void (*R5900FNPTR_INFO)(int info); // // rd = rs op rt -void eeRecompileCode0(R5900FNPTR constcode, R5900FNPTR_INFO constscode, R5900FNPTR_INFO consttcode, R5900FNPTR_INFO noconstcode, int xmminfo); +void eeRecompileCodeRC0(R5900FNPTR constcode, R5900FNPTR_INFO constscode, R5900FNPTR_INFO consttcode, R5900FNPTR_INFO noconstcode, int xmminfo); // rt = rs op imm16 -void eeRecompileCode1(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode); +void eeRecompileCodeRC1(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode, int xmminfo); // rd = rt op sa -void eeRecompileCode2(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode); -// rt op rs (SPECIAL) -void eeRecompileCode3(R5900FNPTR constcode, R5900FNPTR_INFO multicode); - -// -// non mmx/xmm version, slower -// -// rd = rs op rt -#define EERECOMPILE_CONSTCODE0(fn) \ - void rec##fn(void) \ - { \ - eeRecompileCodeConst0(rec##fn##_const, rec##fn##_consts, rec##fn##_constt, rec##fn##_); \ - } - -// rt = rs op imm16 -#define EERECOMPILE_CONSTCODE1(fn) \ - void rec##fn(void) \ - { \ - eeRecompileCodeConst1(rec##fn##_const, rec##fn##_); \ - } - -// rd = rt op sa -#define EERECOMPILE_CONSTCODE2(fn) \ - void rec##fn(void) \ - { \ - eeRecompileCodeConst2(rec##fn##_const, rec##fn##_); \ - } - -// rd = rt op rs -#define EERECOMPILE_CONSTCODESPECIAL(fn, mult) \ - void rec##fn(void) \ - { \ - eeRecompileCodeConstSPECIAL(rec##fn##_const, rec##fn##_, mult); \ - } - -// rd = rs op rt -void eeRecompileCodeConst0(R5900FNPTR constcode, R5900FNPTR_INFO constscode, R5900FNPTR_INFO consttcode, R5900FNPTR_INFO noconstcode); -// rt = rs op imm16 -void eeRecompileCodeConst1(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode); -// rd = rt op sa -void eeRecompileCodeConst2(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode); -// rd = rt MULT rs (SPECIAL) -void eeRecompileCodeConstSPECIAL(R5900FNPTR constcode, R5900FNPTR_INFO multicode, int MULT); - -// XMM caching helpers -#define XMMINFO_READLO 0x001 -#define XMMINFO_READHI 0x002 -#define XMMINFO_WRITELO 0x004 -#define XMMINFO_WRITEHI 0x008 -#define XMMINFO_WRITED 0x010 -#define XMMINFO_READD 0x020 -#define XMMINFO_READS 0x040 -#define XMMINFO_READT 0x080 -#define XMMINFO_READD_LO 0x100 // if set and XMMINFO_READD is set, reads only low 64 bits of D -#define XMMINFO_READACC 0x200 -#define XMMINFO_WRITEACC 0x400 +void eeRecompileCodeRC2(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode, int xmminfo); #define FPURECOMPILE_CONSTCODE(fn, xmminfo) \ void rec##fn(void) \ diff --git a/pcsx2/x86/iR5900Analysis.cpp b/pcsx2/x86/iR5900Analysis.cpp index ecbd824693..e8c018552f 100644 --- a/pcsx2/x86/iR5900Analysis.cpp +++ b/pcsx2/x86/iR5900Analysis.cpp @@ -51,10 +51,11 @@ void __fi R5900::AnalysisPass::DumpAnnotatedBlock(u32 start, u32 end, EEINST* in EEINST* eeinst = inst_cache; for (u32 apc = start; apc < end; apc += 4, eeinst++) { + const u32 code = memRead32(apc); d.clear(); - disR5900Fasm(d, memRead32(apc), apc, false); + disR5900Fasm(d, code, apc, false); func(apc, eeinst, d); - Console.WriteLn(" %08X %s", apc, d.c_str()); + Console.WriteLn(" %08X %08X %s", apc, code, d.c_str()); } } @@ -151,8 +152,10 @@ void COP2FlagHackPass::Run(u32 start, u32 end, EEINST* inst_cache) m_status_denormalized = true; } - // if we're still behind the next CFC2 after the sticky bits got cleared, we need to update flags - if (apc < m_cfc2_pc) + // If we're still behind the next CFC2 after the sticky bits got cleared, we need to update flags. + // Also do this if we're a vsqrt/vrsqrt/vdiv, these update status unconditionally. + const u32 sub_opcode = (cpuRegs.code & 3) | ((cpuRegs.code >> 4) & 0x7c); + if (apc < m_cfc2_pc || (_Rs_ >= 020 && _Funct_ >= 074 && sub_opcode >= 070 && sub_opcode <= 072)) inst->info |= EEINST_COP2_STATUS_FLAG; m_last_status_write = inst; @@ -234,14 +237,77 @@ COP2MicroFinishPass::~COP2MicroFinishPass() = default; void COP2MicroFinishPass::Run(u32 start, u32 end, EEINST* inst_cache) { + bool needs_vu0_sync = true; bool needs_vu0_finish = true; + bool block_interlocked = CHECK_FULLVU0SYNCHACK; - ForEachInstruction(start, end, inst_cache, [&needs_vu0_finish](u32 apc, EEINST* inst) { - // Catch SQ/SB/SH/SW/SD to potential DMA->VIF0->VU0 exec. - // This is very unlikely in a cop2 chain. - if (_Opcode_ == 037 || _Opcode_ == 050 || _Opcode_ == 051 || _Opcode_ == 053 || _Opcode_ == 077) + // First pass through the block to find out if it's interlocked or not. If it is, we need to use tighter + // synchronization on all COP2 instructions, otherwise Crash Twinsanity breaks. + ForEachInstruction(start, end, inst_cache, [&block_interlocked](u32 apc, EEINST* inst) { + if (_Opcode_ == 022 && (_Rs_ == 001 || _Rs_ == 002 || _Rs_ == 005 || _Rs_ == 006) && cpuRegs.code & 1) { + block_interlocked = true; + return false; + } + return true; + }); + + ForEachInstruction(start, end, inst_cache, [this, end, inst_cache, &needs_vu0_sync, &needs_vu0_finish, block_interlocked](u32 apc, EEINST* inst) { + // Catch SQ/SB/SH/SW/SD to potential DMA->VIF0->VU0 exec. + // Also VCALLMS/VCALLMSR, that can start a micro, so the next instruction needs to finish it. + // This is very unlikely in a cop2 chain. + if (_Opcode_ == 050 || _Opcode_ == 051 || _Opcode_ == 053 || _Opcode_ == 077 || (_Opcode_ == 022 && _Rs_ >= 020 && (_Funct_ == 070 || _Funct_ == 071))) + { + // If we started a micro, we'll need to finish it before the first COP2 instruction. + needs_vu0_sync = true; needs_vu0_finish = true; + inst->info |= EEINST_COP2_FLUSH_VU0_REGISTERS; + return true; + } + + // LQC2/SQC2 - these don't interlock with VU0, but still sync, so we can persist the cached registers + // for a LQC2..COP2 sequence. If there's no COP2 instructions following, don't bother, just yolo it. + // We do either a sync or a finish here depending on which COP2 instruction follows - we don't want + // to run the program until end if there's nothing which would actually trigger that. + // + // In essence, what we're doing is moving the finish from the COP2 instruction to the LQC2 in a LQC2..COP2 + // chain, so that we can preserve the cached registers and not need to reload them. + // + const bool is_lqc_sqc = (_Opcode_ == 066 || _Opcode_ == 076); + const bool is_non_interlocked_move = (_Opcode_ == 022 && _Rs_ < 020 && ((cpuRegs.code & 1) == 0)); + if (needs_vu0_sync && (is_lqc_sqc || is_non_interlocked_move)) + { + bool following_needs_finish = false; + ForEachInstruction(apc + 4, end, inst_cache + 1, [&following_needs_finish](u32 apc2, EEINST* inst2) { + if (_Opcode_ == 022) + { + // For VCALLMS/VCALLMSR, we only sync, because the VCALLMS in itself will finish. + // Since we're paying the cost of syncing anyway, better to be less risky. + if (_Rs_ >= 020 && (_Funct_ == 070 || _Funct_ == 071)) + return false; + + // Allow the finish from COP2 to be moved to the first LQC2 of LQC2..QMTC2..COP2. + // Otherwise, keep searching for a finishing COP2. + following_needs_finish = _Rs_ >= 020; + if (following_needs_finish) + return false; + } + + return true; + }); + if (following_needs_finish && !block_interlocked) + { + inst->info |= EEINST_COP2_FLUSH_VU0_REGISTERS | EEINST_COP2_FINISH_VU0; + needs_vu0_sync = false; + needs_vu0_finish = false; + } + else + { + inst->info |= EEINST_COP2_FLUSH_VU0_REGISTERS | EEINST_COP2_SYNC_VU0; + needs_vu0_sync = block_interlocked; + needs_vu0_finish = true; + } + return true; } @@ -249,26 +315,1305 @@ void COP2MicroFinishPass::Run(u32 start, u32 end, EEINST* inst_cache) if (_Opcode_ != 022) return true; - // If it's CFC2/CTC2/QMFC2/QMTC2 and it's not interlocked, we don't want to errornously set the flag. - if ((_Rs_ == 001 || _Rs_ == 002 || _Rs_ == 005 || _Rs_ == 006) && !(cpuRegs.code & 1)) - return true; - // Set the flag on the current instruction, and clear it for the next. - if (needs_vu0_finish) + if (_Rs_ >= 020 && needs_vu0_finish) { - inst->info |= EEINST_COP2_FINISH_VU0_MICRO; - - // QMTC2 and CTC2 interlock on M-Bit not just VU end, so VU0 might continue to run, so we need to continue to check. - if (_Rs_ == 005 || _Rs_ == 006) - return true; - + inst->info |= EEINST_COP2_FLUSH_VU0_REGISTERS | EEINST_COP2_FINISH_VU0; needs_vu0_finish = false; + needs_vu0_sync = false; + } + else if (needs_vu0_sync) + { + // Starting a sync-free block! + inst->info |= EEINST_COP2_FLUSH_VU0_REGISTERS | EEINST_COP2_SYNC_VU0; + needs_vu0_sync = block_interlocked; } - - // Except for VCALLMS/VCALLMSR, that can start a micro, so the next instruction needs to finish it. - if (_Funct_ == 070 || _Funct_ == 071) - needs_vu0_finish = true; return true; }); + +#if 0 + if (!block_interlocked) + return; +#endif + +#if 0 + Console.WriteLn("-- Beginning of COP2 block at %08X - %08X%s", start, end, block_interlocked ? " [BLOCK IS INTERLOCKED]" : ""); + AnalysisPass::DumpAnnotatedBlock(start, end, inst_cache, [](u32, EEINST* eeinst, std::string& d) { + if (eeinst->info & EEINST_COP2_DENORMALIZE_STATUS_FLAG) + d.append(" COP2_DENORMALIZE_STATUS_FLAG"); + if (eeinst->info & EEINST_COP2_NORMALIZE_STATUS_FLAG) + d.append(" COP2_NORMALIZE_STATUS_FLAG"); + if (eeinst->info & EEINST_COP2_STATUS_FLAG) + d.append(" COP2_STATUS_FLAG"); + if (eeinst->info & EEINST_COP2_MAC_FLAG) + d.append(" COP2_MAC_FLAG"); + if (eeinst->info & EEINST_COP2_CLIP_FLAG) + d.append(" COP2_CLIP_FLAG"); + if (eeinst->info & EEINST_COP2_SYNC_VU0) + d.append(" COP2_SYNC_VU0"); + if (eeinst->info & EEINST_COP2_FINISH_VU0) + d.append(" COP2_FINISH_VU0"); + if (eeinst->info & EEINST_COP2_FLUSH_VU0_REGISTERS) + d.append(" COP2_FLUSH_VU0_REGISTERS"); + }); + Console.WriteLn("-- End of COP2 block at %08X - %08X", start, end); +#endif +} + +///////////////////////////////////////////////////////////////////// +// Back-Prop Function Tables - Gathering Info +// Note to anyone changing these: writes must go before reads. +// Otherwise the last use flag won't get set. +///////////////////////////////////////////////////////////////////// + +// Preserve XMM flag from later reads, some instructions can operate in XMM. +#define recBackpropSetGPRRead(reg) \ + do \ + { \ + if ((reg) != 0) \ + { \ + if (!(pinst->regs[reg] & EEINST_USED)) \ + pinst->regs[reg] |= EEINST_LASTUSE; \ + prev->regs[reg] = (EEINST_LIVE | EEINST_USED); \ + pinst->regs[reg] = EEINST_USED; \ + _recFillRegister(*pinst, XMMTYPE_GPRREG, reg, 0); \ + } \ + } while (0) + +#define recBackpropSetGPRWrite(reg) \ + do \ + { \ + if ((reg) != 0) \ + { \ + prev->regs[reg] &= ~(EEINST_XMM | EEINST_LIVE | EEINST_USED); \ + if (!(pinst->regs[reg] & EEINST_USED)) \ + pinst->regs[reg] |= EEINST_LASTUSE; \ + pinst->regs[reg] |= EEINST_USED; \ + _recFillRegister(*pinst, XMMTYPE_GPRREG, reg, 1); \ + } \ + } while (0) + +#define recBackpropSetGPRRead128(reg) \ + do \ + { \ + if ((reg) != 0) \ + { \ + if (!(pinst->regs[reg] & EEINST_USED)) \ + pinst->regs[reg] |= EEINST_LASTUSE; \ + prev->regs[reg] |= EEINST_LIVE | EEINST_USED | EEINST_XMM; \ + pinst->regs[reg] |= EEINST_USED | EEINST_XMM; \ + _recFillRegister(*pinst, XMMTYPE_GPRREG, reg, 0); \ + } \ + } while (0) + +#define recBackpropSetGPRPartialWrite128(reg) \ + do \ + { \ + if ((reg) != 0) \ + { \ + if (!(pinst->regs[reg] & EEINST_USED)) \ + pinst->regs[reg] |= EEINST_LASTUSE; \ + pinst->regs[reg] |= EEINST_LIVE | EEINST_USED | EEINST_XMM; \ + prev->regs[reg] |= EEINST_USED | EEINST_XMM; \ + _recFillRegister(*pinst, XMMTYPE_GPRREG, reg, 1); \ + } \ + } while (0) + +#define recBackpropSetGPRWrite128(reg) \ + do \ + { \ + if ((reg) != 0) \ + { \ + prev->regs[reg] &= ~(EEINST_LIVE | EEINST_USED); \ + if (!(pinst->regs[reg] & EEINST_USED)) \ + pinst->regs[reg] |= EEINST_LASTUSE; \ + pinst->regs[reg] |= EEINST_USED | EEINST_XMM; \ + _recFillRegister(*pinst, XMMTYPE_GPRREG, reg, 1); \ + } \ + } while (0) + +#define recBackpropSetFPURead(reg) \ + do \ + { \ + if (!(pinst->fpuregs[reg] & EEINST_USED)) \ + pinst->fpuregs[reg] |= EEINST_LASTUSE; \ + prev->fpuregs[reg] |= EEINST_LIVE | EEINST_USED; \ + pinst->fpuregs[reg] |= EEINST_USED; \ + _recFillRegister(*pinst, XMMTYPE_FPREG, reg, 0); \ + } while (0) + +#define recBackpropSetFPUWrite(reg) \ + do \ + { \ + prev->fpuregs[reg] &= ~(EEINST_LIVE | EEINST_USED); \ + if (!(pinst->fpuregs[reg] & EEINST_USED)) \ + pinst->fpuregs[reg] |= EEINST_LASTUSE; \ + pinst->fpuregs[reg] |= EEINST_USED; \ + _recFillRegister(*pinst, XMMTYPE_FPREG, reg, 1); \ + } while (0) + +#define recBackpropSetVFRead(reg) \ + do \ + { \ + if (!(pinst->vfregs[reg] & EEINST_USED)) \ + pinst->vfregs[reg] |= EEINST_LASTUSE; \ + prev->vfregs[reg] |= EEINST_LIVE | EEINST_USED; \ + pinst->vfregs[reg] |= EEINST_USED; \ + _recFillRegister(*pinst, XMMTYPE_VFREG, reg, 0); \ + } while (0) + +#define recBackpropSetVFWrite(reg) \ + do \ + { \ + prev->vfregs[reg] &= ~(EEINST_LIVE | EEINST_USED); \ + if (!(pinst->vfregs[reg] & EEINST_USED)) \ + pinst->vfregs[reg] |= EEINST_LASTUSE; \ + pinst->vfregs[reg] |= EEINST_USED; \ + _recFillRegister(*pinst, XMMTYPE_VFREG, reg, 1); \ + } while (0) + +#define recBackpropSetVIRead(reg) \ + if ((reg) < 16) \ + { \ + if (!(pinst->viregs[reg] & EEINST_USED)) \ + pinst->viregs[reg] |= EEINST_LASTUSE; \ + prev->viregs[reg] |= EEINST_LIVE | EEINST_USED; \ + pinst->viregs[reg] |= EEINST_USED; \ + _recFillRegister(*pinst, X86TYPE_VIREG, reg, 0); \ + } + +#define recBackpropSetVIWrite(reg) \ + if ((reg) < 16) \ + { \ + prev->viregs[reg] &= ~(EEINST_LIVE | EEINST_USED); \ + if (!(pinst->viregs[reg] & EEINST_USED)) \ + pinst->viregs[reg] |= EEINST_LASTUSE; \ + pinst->viregs[reg] |= EEINST_USED; \ + _recFillRegister(*pinst, X86TYPE_VIREG, reg, 1); \ + } + +static void recBackpropSPECIAL(u32 code, EEINST* prev, EEINST* pinst); +static void recBackpropREGIMM(u32 code, EEINST* prev, EEINST* pinst); +static void recBackpropCOP0(u32 code, EEINST* prev, EEINST* pinst); +static void recBackpropCOP1(u32 code, EEINST* prev, EEINST* pinst); +static void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst); +static void recBackpropMMI(u32 code, EEINST* prev, EEINST* pinst); + +void recBackpropBSC(u32 code, EEINST* prev, EEINST* pinst) +{ + const u32 rs = ((code >> 21) & 0x1F); + const u32 rt = ((code >> 16) & 0x1F); + + switch (code >> 26) + { + case 0: + recBackpropSPECIAL(code, prev, pinst); + break; + case 1: + recBackpropREGIMM(code, prev, pinst); + break; + case 2: // j + break; + case 3: // jal + recBackpropSetGPRWrite(31); + break; + case 4: // beq + case 5: // bne + case 20: // beql + case 21: // bnel + recBackpropSetGPRRead(rs); + recBackpropSetGPRRead(rt); + break; + + case 6: // blez + case 7: // bgtz + case 22: // blezl + case 23: // bgtzl + recBackpropSetGPRRead(rs); + break; + + case 15: // lui + recBackpropSetGPRWrite(rt); + break; + + case 8: // addi + case 9: // addiu + case 10: // slti + case 11: // sltiu + case 12: // andi + case 13: // ori + case 14: // xori + case 24: // daddi + case 25: // daddiu + recBackpropSetGPRWrite(rt); + recBackpropSetGPRRead(rs); + break; + + case 32: // lb + case 33: // lh + case 35: // lw + case 36: // lbu + case 37: // lhu + case 39: // lwu + case 55: // ld + recBackpropSetGPRWrite(rt); + recBackpropSetGPRRead(rs); + break; + + case 30: // lq + recBackpropSetGPRWrite128(rt); + recBackpropSetGPRRead(rs); + break; + + case 26: // ldl + case 27: // ldr + case 34: // lwl + case 38: // lwr + recBackpropSetGPRWrite(rt); + recBackpropSetGPRRead(rs); + recBackpropSetGPRRead(rt); + break; + + case 40: // sb + case 41: // sh + case 42: // swl + case 43: // sw + case 44: // sdl + case 45: // sdr + case 46: // swr + case 63: // sd + recBackpropSetGPRRead(rt); + recBackpropSetGPRRead(rs); + break; + + case 31: // sq + recBackpropSetGPRRead(rt); + recBackpropSetGPRRead128(rs); + break; + + case 16: + recBackpropCOP0(code, prev, pinst); + break; + + case 17: + recBackpropCOP1(code, prev, pinst); + break; + + case 18: + recBackpropCOP2(code, prev, pinst); + break; + + case 28: + recBackpropMMI(code, prev, pinst); + break; + + case 49: // lwc1 + recBackpropSetGPRRead(rs); + recBackpropSetFPURead(rt); + break; + + case 57: // swc1 + recBackpropSetGPRRead(rs); + recBackpropSetFPURead(rt); + break; + + case 54: // lqc2 + recBackpropSetVFWrite(rt); + recBackpropSetGPRRead128(rs); + break; + + case 62: // sqc2 + recBackpropSetGPRRead128(rs); + recBackpropSetVFRead(rt); + break; + + case 47: // cache + recBackpropSetGPRRead(rs); + break; + + case 51: // pref + break; + + default: + Console.Warning("Unknown R5900 Standard: %08X", code); + break; + } +} + +void recBackpropSPECIAL(u32 code, EEINST* prev, EEINST* pinst) +{ + const u32 rs = ((code >> 21) & 0x1F); + const u32 rt = ((code >> 16) & 0x1F); + const u32 rd = ((code >> 11) & 0x1F); + const u32 funct = (code & 0x3F); + + switch (funct) + { + case 0: // sll + case 2: // srl + case 3: // sra + case 56: // dsll + case 58: // dsrl + case 59: // dsra + case 60: // dsll32 + case 62: // dsrl32 + case 63: // dsra32 + recBackpropSetGPRWrite(rd); + recBackpropSetGPRRead(rt); + break; + + case 4: // sllv + case 6: // srlv + case 7: // srav + case 10: // movz + case 11: // movn + case 20: // dsllv + case 22: // dsrlv + case 23: // dsrav + case 32: // add + case 33: // addu + case 34: // sub + case 35: // subu + case 36: // and + case 37: // or + case 38: // xor + case 39: // nor + case 42: // slt + case 43: // sltu + case 44: // dadd + case 45: // daddu + case 46: // dsub + case 47: // dsubu + recBackpropSetGPRWrite(rd); + recBackpropSetGPRRead(rs); + recBackpropSetGPRRead(rt); + break; + + case 8: // jr + recBackpropSetGPRRead(rs); + break; + + case 9: // jalr + recBackpropSetGPRWrite(rd); + recBackpropSetGPRRead(rs); + break; + + case 24: // mult + case 25: // multu + recBackpropSetGPRWrite(rd); + recBackpropSetGPRWrite(XMMGPR_LO); + recBackpropSetGPRWrite(XMMGPR_HI); + recBackpropSetGPRRead(rs); + recBackpropSetGPRRead(rt); + break; + + case 26: // div + case 27: // divu + recBackpropSetGPRWrite(XMMGPR_LO); + recBackpropSetGPRWrite(XMMGPR_HI); + recBackpropSetGPRRead(rs); + recBackpropSetGPRRead(rt); + break; + + case 16: // mfhi + recBackpropSetGPRWrite(rd); + recBackpropSetGPRRead(XMMGPR_HI); + break; + + case 17: // mthi + recBackpropSetGPRWrite(XMMGPR_HI); + recBackpropSetGPRRead(rs); + break; + + case 18: // mflo + recBackpropSetGPRWrite(rd); + recBackpropSetGPRRead(XMMGPR_LO); + break; + + case 19: // mtlo + recBackpropSetGPRWrite(XMMGPR_LO); + recBackpropSetGPRRead(rs); + break; + + case 40: // mfsa + recBackpropSetGPRWrite(rd); + break; + + case 41: // mtsa + recBackpropSetGPRRead(rs); + break; + + case 48: // tge + case 49: // tgeu + case 50: // tlt + case 51: // tltu + case 52: // teq + case 54: // tne + recBackpropSetGPRRead(rs); + break; + + case 15: // sync + break; + + case 12: // syscall + case 13: // break + _recClearInst(prev); + prev->info = 0; + break; + + default: + Console.Warning("Unknown R5900 SPECIAL: %08X", code); + break; + } +} + +void recBackpropREGIMM(u32 code, EEINST* prev, EEINST* pinst) +{ + const u32 rs = ((code >> 21) & 0x1F); + const u32 rt = ((code >> 16) & 0x1F); + + switch (rt) + { + case 0: // bltz + case 1: // bgez + case 2: // bltzl + case 3: // bgezl + case 9: // tgei + case 10: // tgeiu + case 11: // tlti + case 12: // tltiu + case 13: // teqi + case 15: // tnei + case 24: // mtsab + case 25: // mtsah + recBackpropSetGPRRead(rs); + break; + + case 16: // bltzal + case 17: // bgezal + case 18: // bltzall + case 19: // bgezall + // do not write 31 + recBackpropSetGPRRead(rs); + break; + + default: + Console.Warning("Unknown R5900 REGIMM: %08X", code); + break; + } +} + +void recBackpropCOP0(u32 code, EEINST* prev, EEINST* pinst) +{ + const u32 rs = ((code >> 21) & 0x1F); + const u32 rt = ((code >> 16) & 0x1F); + + switch (rs) + { + case 0: // mfc0 + case 2: // cfc0 + recBackpropSetGPRWrite(rt); + break; + + case 4: // mtc0 + case 6: // ctc0 + recBackpropSetGPRRead(rt); + break; + + case 8: // bc0f/bc0t/bc0fl/bc0tl + case 16: // tlb/eret/ei/di + break; + + default: + Console.Warning("Unknown R5900 COP0: %08X", code); + break; + } +} + +void recBackpropCOP1(u32 code, EEINST* prev, EEINST* pinst) +{ + const u32 fmt = ((code >> 21) & 0x1F); + const u32 rt = ((code >> 16) & 0x1F); + const u32 fs = ((code >> 11) & 0x1F); + const u32 ft = ((code >> 16) & 0x1F); + const u32 fd = ((code >> 6) & 0x1F); + const u32 funct = (code & 0x3F); + + switch (fmt) + { + case 0: // mfc1 + recBackpropSetGPRWrite(rt); + recBackpropSetFPURead(fs); + break; + + case 2: // cfc1 + recBackpropSetGPRWrite(rt); + // read fprc[31] or fprc[0] + break; + + case 4: // mtc1 + recBackpropSetFPUWrite(fs); + recBackpropSetGPRRead(rt); + break; + + case 6: // ctc1 + recBackpropSetGPRRead(rt); + // write fprc[fs] + break; + + case 8: // bc1f/bc1t/bc1fl/bc1tl + // read fprc[31] + break; + + case 16: // cop1.s + { + switch (funct) + { + case 0: // add.s + case 1: // sub.s + case 2: // mul.s + case 3: // div.s + case 40: // max.s + case 41: // min.s + recBackpropSetFPUWrite(fd); + recBackpropSetFPURead(fs); + recBackpropSetFPURead(ft); + break; + + case 5: // abs.s + case 6: // mov.s + case 7: // neg.s + case 36: // cvt.w + recBackpropSetFPUWrite(fd); + recBackpropSetFPURead(fs); + break; + + case 24: // adda.s + case 25: // suba.s + case 26: // mula.s + recBackpropSetFPUWrite(XMMFPU_ACC); + recBackpropSetFPURead(fs); + recBackpropSetFPURead(ft); + break; + + case 28: // madd.s + case 29: // msub.s + recBackpropSetFPUWrite(fd); + recBackpropSetFPURead(fs); + recBackpropSetFPURead(ft); + recBackpropSetFPURead(XMMFPU_ACC); + break; + + case 30: // madda.s + case 31: // msuba.s + recBackpropSetFPUWrite(XMMFPU_ACC); + recBackpropSetFPURead(fs); + recBackpropSetFPURead(ft); + recBackpropSetFPURead(XMMFPU_ACC); + break; + + case 4: // sqrt.s + case 22: // rsqrt.s + recBackpropSetFPUWrite(fd); + recBackpropSetFPURead(ft); + break; + + case 48: // c.f + // read + write fprc + break; + + case 50: // c.eq + case 52: // c.lt + case 54: // c.le + recBackpropSetFPURead(fs); + recBackpropSetFPURead(ft); + // read + write fprc + break; + + default: + Console.Warning("Unknown R5900 COP1: %08X", code); + break; + } + } + break; + + case 20: // cop1.w + { + switch (funct) + { + case 32: // cvt.s + recBackpropSetFPUWrite(fd); + recBackpropSetFPURead(fs); + break; + + default: + Console.Warning("Unknown R5900 COP1: %08X", code); + break; + } + } + break; + + default: + Console.Warning("Unknown R5900 COP1: %08X", code); + break; + } +} + +void recBackpropCOP2(u32 code, EEINST* prev, EEINST* pinst) +{ + const u32 fmt = ((code >> 21) & 0x1F); + const u32 rt = ((code >> 16) & 0x1F); + const u32 fs = ((code >> 11) & 0x1F); + const u32 ft = ((code >> 16) & 0x1F); + const u32 fd = ((code >> 6) & 0x1F); + const u32 funct = (code & 0x3F); + + constexpr u32 VF_ACC = 32; + + switch (fmt) + { + case 1: // qmfc2 + recBackpropSetGPRWrite128(rt); + recBackpropSetVFRead(fs); + break; + + case 2: // cfc1 + recBackpropSetGPRWrite(rt); + recBackpropSetVIRead(fs); + break; + + case 5: // qmtc2 + recBackpropSetVFWrite(fs); + recBackpropSetGPRRead128(rt); + break; + + case 6: // ctc2 + recBackpropSetVIWrite(fs); + recBackpropSetGPRRead(rt); + break; + + case 8: // bc2f/bc2t/bc2fl/bc2tl + // read vi[29] + break; + + case 16: // SPEC1 + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: // SPEC1 + { + switch (funct) + { + case 0: // VADDx + case 1: // VADDy + case 2: // VADDz + case 3: // VADDw + case 4: // VSUBx + case 5: // VSUBy + case 6: // VSUBz + case 7: // VSUBw + case 16: // VMAXx + case 17: // VMAXy + case 18: // VMAXz + case 19: // VMAXw + case 20: // VMINIx + case 21: // VMINIy + case 22: // VMINIz + case 23: // VMINIw + case 24: // VMULx + case 25: // VMULy + case 26: // VMULz + case 27: // VMULw + case 40: // VADD + case 42: // VMUL + case 43: // VMAX + case 44: // VSUB + case 47: // VMINI + recBackpropSetVFWrite(fd); + recBackpropSetVFRead(fs); + recBackpropSetVFRead(ft); + recBackpropSetVFRead(fd); // unnecessary if _X_Y_Z_W == 0xF + break; + + case 8: // VMADDx + case 9: // VMADDy + case 10: // VMADDz + case 11: // VMADDw + case 12: // VMSUBx + case 13: // VMSUBy + case 14: // VMSUBz + case 15: // VMSUBw + case 41: // VMADD + case 45: // VMSUB + case 46: // VOPMSUB + recBackpropSetVFWrite(fd); + recBackpropSetVFRead(fs); + recBackpropSetVFRead(ft); + recBackpropSetVFRead(VF_ACC); + recBackpropSetVFRead(fd); + break; + + case 29: // VMAXi + case 30: // VMULi + case 31: // VMINIi + case 34: // VADDi + case 35: // VMADDi + case 38: // VSUBi + case 39: // VMSUBi + recBackpropSetVFWrite(fd); + recBackpropSetVFRead(fs); + // recBackpropSetVIRead(REG_I); + recBackpropSetVFRead(fd); + break; + + case 28: // VMULq + case 32: // VADDq + case 33: // VMADDq + case 37: // VMSUBq + case 36: // VSUBq + recBackpropSetVFWrite(fd); + recBackpropSetVFRead(fs); + // recBackpropSetVIRead(REG_Q); + recBackpropSetVFRead(fd); + break; + + case 48: // VIADD + case 49: // VISUB + case 50: // VIADDI + case 52: // VIAND + case 53: // VIOR + { + const u32 is = fs & 0xFu; + const u32 it = ft & 0xFu; + const u32 id = fd & 0xFu; + recBackpropSetVIWrite(id); + recBackpropSetVIRead(is); + recBackpropSetVIRead(it); + recBackpropSetVIRead(id); + } + break; + + + case 56: // VCALLMS + case 57: // VCALLMSR + break; + + case 60: // COP2_SPEC2 + case 61: // COP2_SPEC2 + case 62: // COP2_SPEC2 + case 63: // COP2_SPEC2 + { + const u32 idx = (code & 3u) | ((code >> 4) & 0x7cu); + switch (idx) + { + case 0: // VADDAx + case 1: // VADDAy + case 2: // VADDAz + case 3: // VADDAw + case 4: // VSUBAx + case 5: // VSUBAy + case 6: // VSUBAz + case 7: // VSUBAw + case 24: // VMULAx + case 25: // VMULAy + case 26: // VMULAz + case 27: // VMULAw + case 40: // VADDA + case 42: // VMULA + case 44: // VSUBA + recBackpropSetVFWrite(VF_ACC); + recBackpropSetVFRead(fs); + recBackpropSetVFRead(ft); + recBackpropSetVFRead(VF_ACC); + break; + + case 8: // VMADDAx + case 9: // VMADDAy + case 10: // VMADDAz + case 11: // VMADDAw + case 12: // VMSUBAx + case 13: // VMSUBAy + case 14: // VMSUBAz + case 15: // VMSUBAw + case 41: // VMADDA + case 45: // VMSUBA + case 46: // VOPMULA + recBackpropSetVFWrite(VF_ACC); + recBackpropSetVFRead(fs); + recBackpropSetVFRead(ft); + recBackpropSetVFRead(VF_ACC); + break; + + case 16: // VITOF0 + case 17: // VITOF4 + case 18: // VITOF12 + case 19: // VITOF15 + case 20: // VFTOI0 + case 21: // VFTOI4 + case 22: // VFTOI12 + case 23: // VFTOI15 + case 29: // VABS + case 48: // VMOVE + case 49: // VMR32 + recBackpropSetVFWrite(ft); + recBackpropSetVFRead(fs); + recBackpropSetVFRead(ft); + break; + + case 31: // VCLIP + recBackpropSetVFRead(fs); + // Write CLIP + break; + + case 30: // VMULAi + case 34: // VADDAi + case 38: // VSUBAi + recBackpropSetVFWrite(VF_ACC); + recBackpropSetVFRead(fs); + // recBackpropSetVIRead(REG_I); + recBackpropSetVFRead(VF_ACC); + break; + + case 35: // VMADDAi + case 39: // VMSUBAi + recBackpropSetVFWrite(VF_ACC); + recBackpropSetVFRead(fs); + // recBackpropSetVIRead(REG_I); + recBackpropSetVFRead(VF_ACC); + break; + + case 32: // VADDAq + case 36: // VSUBAq + case 28: // VMULAq + recBackpropSetVFWrite(VF_ACC); + recBackpropSetVFRead(fs); + // recBackpropSetVIRead(REG_Q); + recBackpropSetVFRead(VF_ACC); + break; + + case 33: // VMADDAq + case 37: // VMSUBAq + recBackpropSetVFWrite(VF_ACC); + recBackpropSetVFRead(fs); + // recBackpropSetVIRead(REG_Q); + recBackpropSetVFRead(VF_ACC); + break; + + case 52: // VLQI + case 54: // VLQD + recBackpropSetVFWrite(ft); + recBackpropSetVIWrite(fs & 0xFu); + recBackpropSetVIRead(fs & 0xFu); + recBackpropSetVFRead(ft); + break; + + case 53: // VSQI + case 55: // VSQD + recBackpropSetVIWrite(ft & 0xFu); + recBackpropSetVIRead(ft & 0xFu); + recBackpropSetVFRead(fs); + break; + + case 56: // VDIV + case 58: // VRSQRT + // recBackpropSetVIWrite(REG_Q); + recBackpropSetVFRead(fs); + recBackpropSetVFRead(ft); + break; + + case 57: // VSQRT + recBackpropSetVFRead(ft); + break; + + + case 60: // VMTIR + recBackpropSetVIWrite(ft & 0xFu); + recBackpropSetVFRead(fs); + break; + + case 61: // VMFIR + recBackpropSetVFWrite(ft); + recBackpropSetVIRead(fs & 0xFu); + break; + + case 62: // VILWR + recBackpropSetVIWrite(ft & 0xFu); + recBackpropSetVIRead(fs & 0xFu); + break; + + case 63: // VISWR + recBackpropSetVIRead(fs & 0xFu); + recBackpropSetVIRead(ft & 0xFu); + break; + + case 64: // VRNEXT + case 65: // VRGET + recBackpropSetVFWrite(ft); + // recBackpropSetVIRead(REG_R); + break; + + case 66: // VRINIT + case 67: // VRXOR + // recBackpropSetVIWrite(REG_R); + recBackpropSetVFRead(fs); + // recBackpropSetVIRead(REG_R); + break; + + case 47: // VNOP + case 59: // VWAITQ + break; + + default: + Console.Warning("Unknown R5900 COP2 SPEC2: %08X", code); + break; + } + } + break; + + default: + Console.Warning("Unknown R5900 COP2 SPEC1: %08X", code); + break; + } + } + break; + + default: + break; + } +} + +void recBackpropMMI(u32 code, EEINST* prev, EEINST* pinst) +{ + const u32 funct = (code & 0x3F); + const u32 rs = ((code >> 21) & 0x1F); + const u32 rt = ((code >> 16) & 0x1F); + const u32 rd = ((code >> 11) & 0x1F); + + switch (funct) + { + case 0: // madd + case 1: // maddu + recBackpropSetGPRWrite(XMMGPR_LO); + recBackpropSetGPRWrite(XMMGPR_HI); + recBackpropSetGPRRead(rs); + recBackpropSetGPRRead(rt); + recBackpropSetGPRRead(XMMGPR_LO); + recBackpropSetGPRRead(XMMGPR_HI); + break; + + case 32: // madd1 + case 33: // maddu1 + recBackpropSetGPRPartialWrite128(XMMGPR_LO); + recBackpropSetGPRPartialWrite128(XMMGPR_HI); + recBackpropSetGPRRead(rs); + recBackpropSetGPRRead(rt); + recBackpropSetGPRRead128(XMMGPR_LO); + recBackpropSetGPRRead128(XMMGPR_HI); + break; + + case 24: // mult1 + case 25: // multu1 + recBackpropSetGPRPartialWrite128(XMMGPR_LO); + recBackpropSetGPRPartialWrite128(XMMGPR_HI); + recBackpropSetGPRRead(rs); + recBackpropSetGPRRead(rt); + recBackpropSetGPRWrite(rd); + break; + + case 26: // div1 + case 27: // divu1 + recBackpropSetGPRPartialWrite128(XMMGPR_LO); + recBackpropSetGPRPartialWrite128(XMMGPR_HI); + recBackpropSetGPRRead(rs); + recBackpropSetGPRRead(rt); + break; + + case 16: // mfhi1 + recBackpropSetGPRRead128(XMMGPR_HI); + recBackpropSetGPRWrite(rd); + break; + + case 17: // mthi1 + recBackpropSetGPRPartialWrite128(XMMGPR_HI); + recBackpropSetGPRRead(rs); + break; + + case 18: // mflo1 + recBackpropSetGPRRead128(XMMGPR_LO); + recBackpropSetGPRWrite(rd); + break; + + case 19: // mtlo1 + recBackpropSetGPRPartialWrite128(XMMGPR_LO); + recBackpropSetGPRRead(rs); + break; + + case 4: // plzcw + recBackpropSetGPRRead(rs); + recBackpropSetGPRWrite(rd); + break; + + case 48: // pmfhl + recBackpropSetGPRPartialWrite128(rd); + recBackpropSetGPRRead128(XMMGPR_LO); + recBackpropSetGPRRead128(XMMGPR_HI); + break; + + case 49: // pmthl + recBackpropSetGPRPartialWrite128(XMMGPR_LO); + recBackpropSetGPRPartialWrite128(XMMGPR_HI); + recBackpropSetGPRRead128(rs); + break; + + case 52: // psllh + case 54: // psrlh + case 55: // psrah + case 60: // psllw + case 62: // psrlw + case 63: // psraw + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(rt); + break; + + case 8: // mmi0 + { + const u32 idx = ((code >> 6) & 0x1F); + switch (idx) + { + case 0: // PADDW + case 1: // PSUBW + case 2: // PCGTW + case 3: // PMAXW + case 4: // PADDH + case 5: // PSUBH + case 6: // PCGTH + case 7: // PMAXH + case 8: // PADDB + case 9: // PSUBB + case 10: // PCGTB + case 16: // PADDSW + case 17: // PSUBSW + case 18: // PEXTLW + case 19: // PPACW + case 20: // PADDSH + case 21: // PSUBSH + case 22: // PEXTLH + case 23: // PPACH + case 24: // PADDSB + case 25: // PSUBSB + case 26: // PEXTLB + case 27: // PPACB + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + break; + + case 30: // PEXT5 + case 31: // PPAC5 + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(rt); + break; + + default: + Console.Warning("Unknown R5900 MMI0: %08X", code); + break; + } + } + break; + + case 40: // mmi1 + { + const u32 idx = ((code >> 6) & 0x1F); + switch (idx) + { + case 2: // PCEQW + case 3: // PMINW + case 4: // PADSBH + case 6: // PCEQH + case 7: // PMINH + case 10: // PCEQB + case 16: // PADDUW + case 17: // PSUBUW + case 18: // PEXTUW + case 20: // PADDUH + case 21: // PSUBUH + case 22: // PEXTUH + case 24: // PADDUB + case 25: // PSUBUB + case 26: // PEXTUB + case 27: // QFSRV + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + break; + + case 1: // PABSW + case 5: // PABSH + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(rt); + break; + + case 0: // MMI_Unknown + default: + Console.Warning("Unknown R5900 MMI1: %08X", code); + break; + } + } + break; + + case 9: // mmi2 + { + const u32 idx = ((code >> 6) & 0x1F); + switch (idx) + { + case 0: // PMADDW + case 4: // PMSUBW + case 16: // PMADDH + case 17: // PHMADH + case 20: // PMSUBH + case 21: // PHMSBH + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRWrite128(XMMGPR_LO); + recBackpropSetGPRWrite128(XMMGPR_HI); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + recBackpropSetGPRRead128(XMMGPR_LO); + recBackpropSetGPRRead128(XMMGPR_HI); + break; + + case 12: // PMULTW + case 28: // PMULTH + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRWrite128(XMMGPR_LO); + recBackpropSetGPRWrite128(XMMGPR_HI); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + break; + + case 13: // PDIVW + case 29: // PDIVBW + recBackpropSetGPRWrite128(XMMGPR_LO); + recBackpropSetGPRWrite128(XMMGPR_HI); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + break; + + case 2: // PSLLVW + case 3: // PSRLVW + case 10: // PINTH + case 14: // PCPYLD + case 18: // PAND + case 19: // PXOR + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + break; + + case 8: // PMFHI + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(XMMGPR_LO); + break; + + case 9: // PMFLO + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(XMMGPR_HI); + break; + + case 26: // PEXEH + case 27: // PREVH + case 30: // PEXEW + case 31: // PROT3W + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(rt); + break; + + default: + Console.Warning("Unknown R5900 MMI2: %08X", code); + break; + } + } + break; + + case 41: // mmi3 + { + const u32 idx = ((code >> 6) & 0x1F); + switch (idx) + { + case 0: // PMADDUW + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRWrite128(XMMGPR_LO); + recBackpropSetGPRWrite128(XMMGPR_HI); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + recBackpropSetGPRRead128(XMMGPR_LO); + recBackpropSetGPRRead128(XMMGPR_HI); + break; + + case 3: // PSRAVW + case 10: // PINTEH + case 18: // POR + case 19: // PNOR + case 14: // PCPYUD + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + break; + + case 26: // PEXCH + case 27: // PCPYH + case 30: // PEXCW + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRRead128(rt); + break; + + case 8: // PMTHI + recBackpropSetGPRWrite128(XMMGPR_HI); + recBackpropSetGPRRead128(rs); + break; + + case 9: // PMTLO + recBackpropSetGPRWrite128(XMMGPR_LO); + recBackpropSetGPRRead128(rs); + break; + + case 12: // PMULTUW + recBackpropSetGPRWrite128(rd); + recBackpropSetGPRWrite128(XMMGPR_LO); + recBackpropSetGPRWrite128(XMMGPR_HI); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + break; + + case 13: // PDIVUW + recBackpropSetGPRWrite128(XMMGPR_LO); + recBackpropSetGPRWrite128(XMMGPR_HI); + recBackpropSetGPRRead128(rs); + recBackpropSetGPRRead128(rt); + break; + + default: + Console.Warning("Unknown R5900 MMI3: %08X", code); + break; + } + } + break; + + default: + { + Console.Warning("Unknown R5900 MMI: %08X", code); + } + break; + } } diff --git a/pcsx2/x86/iR5900Analysis.h b/pcsx2/x86/iR5900Analysis.h index b9665271a4..218faf5197 100644 --- a/pcsx2/x86/iR5900Analysis.h +++ b/pcsx2/x86/iR5900Analysis.h @@ -71,4 +71,6 @@ namespace R5900 void Run(u32 start, u32 end, EEINST* inst_cache) override; }; -} // namespace R5900 \ No newline at end of file +} // namespace R5900 + +void recBackpropBSC(u32 code, EEINST* prev, EEINST* pinst); diff --git a/pcsx2/x86/iR5900Misc.cpp b/pcsx2/x86/iR5900Misc.cpp index 8a9191e307..ed2024d47f 100644 --- a/pcsx2/x86/iR5900Misc.cpp +++ b/pcsx2/x86/iR5900Misc.cpp @@ -31,17 +31,18 @@ namespace Dynarec { // Parameters: // jmpSkip - This parameter is the result of the appropriate J32 instruction // (usually JZ32 or JNZ32). -void recDoBranchImm(u32* jmpSkip, bool isLikely) +void recDoBranchImm(u32 branchTo, u32* jmpSkip, bool isLikely, bool swappedDelaySlot) { - // All R5900 branches use this format: - const u32 branchTo = ((s32)_Imm_ * 4) + pc; - // First up is the Branch Taken Path : Save the recompiler's state, compile the // DelaySlot, and issue a BranchTest insertion. The state is reloaded below for // the "did not branch" path (maintains consts, register allocations, and other optimizations). - SaveBranchState(); - recompileNextInstruction(1); + if (!swappedDelaySlot) + { + SaveBranchState(); + recompileNextInstruction(true, false); + } + SetBranchImm(branchTo); // Jump target when the branch is *not* taken, skips the branchtest code @@ -50,18 +51,17 @@ void recDoBranchImm(u32* jmpSkip, bool isLikely) // if it's a likely branch then we'll need to skip the delay slot here, since // MIPS cancels the delay slot instruction when branches aren't taken. - LoadBranchState(); - if (!isLikely) + if (!swappedDelaySlot) { - pc -= 4; // instruction rewinder for delay slot, if non-likely. - recompileNextInstruction(1); + LoadBranchState(); + if (!isLikely) + { + pc -= 4; // instruction rewinder for delay slot, if non-likely. + recompileNextInstruction(true, false); + } } - SetBranchImm(pc); // start a new recompiled block. -} -void recDoBranchImm_Likely(u32* jmpSkip) -{ - recDoBranchImm(jmpSkip, true); + SetBranchImm(pc); // start a new recompiled block. } namespace OpcodeImpl { @@ -95,6 +95,7 @@ void recMFSA() if (!_Rd_) return; + // TODO(Stenzek): Make these less rubbish mmreg = _checkXMMreg(XMMTYPE_GPRREG, _Rd_, MODE_WRITE); if (mmreg >= 0) { @@ -102,10 +103,9 @@ void recMFSA() } else { - xMOV(eax, ptr[&cpuRegs.sa]); + xMOV(rax, ptr32[&cpuRegs.sa]); _deleteEEreg(_Rd_, 0); - xMOV(ptr[&cpuRegs.GPR.r[_Rd_].UL[0]], eax); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].UL[1]], 0); + xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); } } @@ -124,6 +124,10 @@ void recMTSA() { xMOVSS(ptr[&cpuRegs.sa], xRegisterSSE(mmreg)); } + else if ((mmreg = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ)) >= 0) + { + xMOV(ptr[&cpuRegs.sa], xRegister32(mmreg)); + } else { xMOV(eax, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); diff --git a/pcsx2/x86/ix86-32/iCore-32.cpp b/pcsx2/x86/ix86-32/iCore-32.cpp index 812960623a..5a1d6cd1ff 100644 --- a/pcsx2/x86/ix86-32/iCore-32.cpp +++ b/pcsx2/x86/ix86-32/iCore-32.cpp @@ -21,6 +21,7 @@ #include "VU.h" #include "common/emitter/x86emitter.h" #include "R3000A.h" +#include "x86/iR3000A.h" using namespace x86Emitter; @@ -29,7 +30,7 @@ using namespace x86Emitter; extern u32 g_psxConstRegs[32]; // X86 caching -static int g_x86checknext; +static uint g_x86checknext; // use special x86 register allocation for ia32 @@ -40,92 +41,19 @@ void _initX86regs() g_x86checknext = 0; } -uptr _x86GetAddr(int type, int reg) -{ - uptr ret = 0; - - switch (type & ~X86TYPE_VU1) - { - case X86TYPE_GPR: - ret = (uptr)&cpuRegs.GPR.r[reg]; - break; - - case X86TYPE_VI: - if (type & X86TYPE_VU1) - ret = (uptr)&VU1.VI[reg]; - else - ret = (uptr)&VU0.VI[reg]; - break; - - case X86TYPE_MEMOFFSET: - ret = 0; - break; - - case X86TYPE_VIMEMOFFSET: - ret = 0; - break; - - case X86TYPE_VUQREAD: - if (type & X86TYPE_VU1) - ret = (uptr)&VU1.VI[REG_Q]; - else - ret = (uptr)&VU0.VI[REG_Q]; - break; - - case X86TYPE_VUPREAD: - if (type & X86TYPE_VU1) - ret = (uptr)&VU1.VI[REG_P]; - else - ret = (uptr)&VU0.VI[REG_P]; - break; - - case X86TYPE_VUQWRITE: - if (type & X86TYPE_VU1) - ret = (uptr)&VU1.q; - else - ret = (uptr)&VU0.q; - break; - - case X86TYPE_VUPWRITE: - if (type & X86TYPE_VU1) - ret = (uptr)&VU1.p; - else - ret = (uptr)&VU0.p; - break; - - case X86TYPE_PSX: - ret = (uptr)&psxRegs.GPR.r[reg]; - break; - - case X86TYPE_PCWRITEBACK: - ret = (uptr)&g_recWriteback; - break; - - case X86TYPE_VUJUMP: - ret = (uptr)&g_recWriteback; - break; - - jNO_DEFAULT; - } - - return ret; -} - int _getFreeX86reg(int mode) { int tempi = -1; u32 bestcount = 0x10000; - int maxreg = (mode & MODE_8BITREG) ? 4 : iREGCNT_GPR; - for (uint i = 0; i < iREGCNT_GPR; i++) { - int reg = (g_x86checknext + i) % iREGCNT_GPR; - if (reg == 0 || reg == esp.GetId() || reg == ebp.GetId()) + const int reg = (g_x86checknext + i) % iREGCNT_GPR; + if (x86regs[reg].inuse || !_isAllocatableX86reg(reg)) continue; - if (reg >= maxreg) + + if ((mode & MODE_CALLEESAVED) && xRegister32::IsCallerSaved(reg)) continue; - //if( (mode&MODE_NOFRAME) && reg==EBP ) continue; if (x86regs[reg].inuse == 0) { @@ -134,20 +62,26 @@ int _getFreeX86reg(int mode) } } - for (int i = 1; i < maxreg; i++) + for (uint i = 0; i < iREGCNT_GPR; i++) { - if (i == esp.GetId() || i == ebp.GetId()) + if (!_isAllocatableX86reg(i)) continue; - //if( (mode&MODE_NOFRAME) && i==EBP ) continue; + + if ((mode & MODE_CALLEESAVED) && xRegister32::IsCallerSaved(i)) + continue; + + // should have checked inuse in the previous loop. + pxAssert(x86regs[i].inuse); if (x86regs[i].needed) continue; + if (x86regs[i].type != X86TYPE_TEMP) { if (x86regs[i].counter < bestcount) { - tempi = i; + tempi = static_cast(i); bestcount = x86regs[i].counter; } continue; @@ -163,22 +97,15 @@ int _getFreeX86reg(int mode) return tempi; } - pxFailDev("x86 register allocation error"); - throw Exception::FailedToAllocateRegister(); -} - -void _flushCachedRegs() -{ - _flushConstRegs(); - _flushXMMregs(); + pxFailRel("x86 register allocation error"); + return -1; } void _flushConstReg(int reg) { if (GPR_IS_CONST1(reg) && !(g_cpuFlushedConstReg & (1 << reg))) { - xMOV(ptr32[&cpuRegs.GPR.r[reg].UL[0]], g_cpuConstRegs[reg].UL[0]); - xMOV(ptr32[&cpuRegs.GPR.r[reg].UL[1]], g_cpuConstRegs[reg].UL[1]); + xWriteImm64ToMem(&cpuRegs.GPR.r[reg].UD[0], rax, g_cpuConstRegs[reg].SD[0]); g_cpuFlushedConstReg |= (1 << reg); if (reg == 0) DevCon.Warning("Flushing r0!"); @@ -187,243 +114,367 @@ void _flushConstReg(int reg) void _flushConstRegs() { - s32 zero_cnt = 0, minusone_cnt = 0; - s32 eaxval = 1; // 0, -1 - u32 done[4] = {0, 0, 0, 0}; - u8* rewindPtr; - - // flush constants - - // flush 0 and -1 first - // ignore r0 - for (int i = 1, j = 0; i < 32; j++ && ++i, j %= 2) + int zero_reg_count = 0; + int minusone_reg_count = 0; + for (u32 i = 0; i < 32; i++) { - if (!GPR_IS_CONST1(i) || g_cpuFlushedConstReg & (1 << i)) - continue; - if (g_cpuConstRegs[i].SL[j] != 0) + if (!GPR_IS_CONST1(i) || g_cpuFlushedConstReg & (1u << i)) continue; - if (eaxval != 0) - { - xXOR(eax, eax); - eaxval = 0; - } - - xMOV(ptr[&cpuRegs.GPR.r[i].SL[j]], eax); - done[j] |= 1 << i; - zero_cnt++; + if (g_cpuConstRegs[i].SD[0] == 0) + zero_reg_count++; + else if (g_cpuConstRegs[i].SD[0] == -1) + minusone_reg_count++; } - rewindPtr = x86Ptr; - - for (int i = 1, j = 0; i < 32; j++ && ++i, j %= 2) + // if we have more than one of zero/minus-one, precompute + bool rax_is_zero = false; + if (zero_reg_count > 1) { - if (!GPR_IS_CONST1(i) || g_cpuFlushedConstReg & (1 << i)) - continue; - if (g_cpuConstRegs[i].SL[j] != -1) - continue; - - if (eaxval > 0) + xXOR(eax, eax); + for (u32 i = 0; i < 32; i++) { - xXOR(eax, eax); - eaxval = 0; - } - if (eaxval == 0) - { - xNOT(eax); - eaxval = -1; - } + if (!GPR_IS_CONST1(i) || g_cpuFlushedConstReg & (1u << i)) + continue; - xMOV(ptr[&cpuRegs.GPR.r[i].SL[j]], eax); - done[j + 2] |= 1 << i; - minusone_cnt++; - } - - if (minusone_cnt == 1 && !zero_cnt) // not worth it for one byte - { - x86SetPtr(rewindPtr); - } - else - { - done[0] |= done[2]; - done[1] |= done[3]; - } - - for (int i = 1; i < 32; ++i) - { - if (GPR_IS_CONST1(i)) - { - if (!(g_cpuFlushedConstReg & (1 << i))) + if (g_cpuConstRegs[i].SD[0] == 0) { - if (!(done[0] & (1 << i))) - xMOV(ptr32[&cpuRegs.GPR.r[i].UL[0]], g_cpuConstRegs[i].UL[0]); - if (!(done[1] & (1 << i))) - xMOV(ptr32[&cpuRegs.GPR.r[i].UL[1]], g_cpuConstRegs[i].UL[1]); - - g_cpuFlushedConstReg |= 1 << i; + xMOV(ptr64[&cpuRegs.GPR.r[i].UD[0]], rax); + g_cpuFlushedConstReg |= 1u << i; } - if (g_cpuHasConstReg == g_cpuFlushedConstReg) - break; } + rax_is_zero = true; + } + if (minusone_reg_count > 1) + { + if (!rax_is_zero) + xMOV(rax, -1); + else + xNOT(rax); + + for (u32 i = 0; i < 32; i++) + { + if (!GPR_IS_CONST1(i) || g_cpuFlushedConstReg & (1u << i)) + continue; + + if (g_cpuConstRegs[i].SD[0] == -1) + { + xMOV(ptr64[&cpuRegs.GPR.r[i].UD[0]], rax); + g_cpuFlushedConstReg |= 1u << i; + } + } + } + + // and whatever's left over.. + for (u32 i = 0; i < 32; i++) + { + if (!GPR_IS_CONST1(i) || g_cpuFlushedConstReg & (1u << i)) + continue; + + xWriteImm64ToMem(&cpuRegs.GPR.r[i].UD[0], rax, g_cpuConstRegs[i].UD[0]); + g_cpuFlushedConstReg |= 1u << i; } } -int _allocX86reg(xRegister32 x86reg, int type, int reg, int mode) +static const char* GetModeString(int mode) { - uint i; - pxAssertDev(reg >= 0 && reg < 32, "Register index out of bounds."); - pxAssertDev(x86reg != esp && x86reg != ebp, "Allocation of ESP/EBP is not allowed!"); + return ((mode & MODE_READ)) ? ((mode & MODE_WRITE) ? "readwrite" : "read") : "write"; +} - // don't alloc EAX and ESP,EBP if MODE_NOFRAME - int oldmode = mode; - //int noframe = mode & MODE_NOFRAME; - uint maxreg = (mode & MODE_8BITREG) ? 4 : iREGCNT_GPR; - mode &= ~(MODE_NOFRAME | MODE_8BITREG); - int readfromreg = -1; - - if (type != X86TYPE_TEMP) +void _validateRegs() +{ +#ifdef PCSX2_DEVBUILD + // check that no two registers are in write mode in both fprs and gprs + for (s8 guestreg = 0; guestreg < 32; guestreg++) { - if (maxreg < iREGCNT_GPR) + u32 gprreg = 0, gprmode = 0; + u32 fprreg = 0, fprmode = 0; + for (u32 hostreg = 0; hostreg < iREGCNT_GPR; hostreg++) { - // make sure reg isn't in the higher regs - - for (i = maxreg; i < iREGCNT_GPR; ++i) + if (x86regs[hostreg].inuse && x86regs[hostreg].type == X86TYPE_GPR && x86regs[hostreg].reg == guestreg) { - if (!x86regs[i].inuse || x86regs[i].type != type || x86regs[i].reg != reg) - continue; - - if (mode & MODE_READ) - { - readfromreg = i; - x86regs[i].inuse = 0; - break; - } - else if (mode & MODE_WRITE) - { - x86regs[i].inuse = 0; - break; - } + pxAssertMsg(gprreg == 0 && gprmode == 0, "register is not already allocated in a GPR"); + gprreg = hostreg; + gprmode = x86regs[hostreg].mode; + } + } + for (u32 hostreg = 0; hostreg < iREGCNT_XMM; hostreg++) + { + if (xmmregs[hostreg].inuse && xmmregs[hostreg].type == XMMTYPE_GPRREG && xmmregs[hostreg].reg == guestreg) + { + pxAssertMsg(fprreg == 0 && fprmode == 0, "register is not already allocated in a XMM"); + fprreg = hostreg; + fprmode = xmmregs[hostreg].mode; } } - for (i = 1; i < maxreg; i++) + if ((gprmode | fprmode) & MODE_WRITE) + pxAssertMsg((gprmode & MODE_WRITE) != (fprmode & MODE_WRITE), "only one of gpr or fps is in write state"); + + if (gprmode & MODE_WRITE) + pxAssertMsg(fprmode == 0, "when writing to the gpr, fpr is invalid"); + if (fprmode & MODE_WRITE) + pxAssertMsg(gprmode == 0, "when writing to the fpr, gpr is invalid"); + } +#endif +} + +int _allocX86reg(int type, int reg, int mode) +{ + if (type == X86TYPE_GPR || type == X86TYPE_PSX) + { + pxAssertDev(reg >= 0 && reg < 34, "Register index out of bounds."); + } + + int hostXMMreg = (type == X86TYPE_GPR) ? _checkXMMreg(XMMTYPE_GPRREG, reg, 0) : -1; + if (type != X86TYPE_TEMP) + { + for (int i = 0; i < static_cast(iREGCNT_GPR); i++) { - if ((int)i == esp.GetId() || (int)i == ebp.GetId()) - continue; if (!x86regs[i].inuse || x86regs[i].type != type || x86regs[i].reg != reg) continue; - // We're in a for loop until i= maxreg ) { - if (x86regs[i].mode & MODE_READ) readfromreg = i; + pxAssert(type != X86TYPE_GPR || !GPR_IS_CONST1(reg) || (GPR_IS_CONST1(reg) && g_cpuFlushedConstReg & (1u << reg))); - mode |= x86regs[i].mode&MODE_WRITE; - x86regs[i].inuse = 0; - break; - }*/ + // can't go from write to read + pxAssert(!((x86regs[i].mode & (MODE_READ | MODE_WRITE)) == MODE_WRITE && (mode & (MODE_READ | MODE_WRITE)) == MODE_READ)); + // if (type != X86TYPE_TEMP && !(x86regs[i].mode & MODE_READ) && (mode & MODE_READ)) - if (!x86reg.IsEmpty()) + if (type == X86TYPE_GPR) { - // requested specific reg, so return that instead - if (i != (uint)x86reg.GetId()) + RALOG("Changing host reg %d for guest reg %d from %s to %s mode\n", i, reg, GetModeString(x86regs[i].mode), GetModeString(x86regs[i].mode | mode)); + + if (mode & MODE_WRITE) { - if (x86regs[i].mode & MODE_READ) - readfromreg = i; - mode |= x86regs[i].mode & MODE_WRITE; - x86regs[i].inuse = 0; - break; + if (GPR_IS_CONST1(reg)) + { + RALOG("Clearing constant value for guest reg %d on change to write mode\n", reg); + GPR_DEL_CONST(reg); + } + + if (hostXMMreg >= 0) + { + // ensure upper bits get written + RALOG("Invalidating host XMM reg %d for guest reg %d due to GPR write transition\n", hostXMMreg, reg); + pxAssert(!(xmmregs[hostXMMreg].mode & MODE_WRITE)); + _freeXMMreg(hostXMMreg); + } } } - - if (type != X86TYPE_TEMP && !(x86regs[i].mode & MODE_READ) && (mode & MODE_READ)) + else if (type == X86TYPE_PSX) { + RALOG("Changing host reg %d for guest PSX reg %d from %s to %s mode\n", i, reg, GetModeString(x86regs[i].mode), GetModeString(x86regs[i].mode | mode)); - if (type == X86TYPE_GPR) - _flushConstReg(reg); - - if (X86_ISVI(type) && reg < 16) - xMOVZX(xRegister32(i), ptr16[(u16*)(_x86GetAddr(type, reg))]); - else - xMOV(xRegister32(i), ptr[(void*)(_x86GetAddr(type, reg))]); - - x86regs[i].mode |= MODE_READ; + if (mode & MODE_WRITE) + { + if (PSX_IS_CONST1(reg)) + { + RALOG("Clearing constant value for guest PSX reg %d on change to write mode\n", reg); + PSX_DEL_CONST(reg); + } + } + } + else if (type == X86TYPE_VIREG) + { + // keep VI temporaries separate + if (reg < 0) + continue; } - x86regs[i].needed = 1; - x86regs[i].mode |= mode; + x86regs[i].counter = g_x86AllocCounter++; + x86regs[i].mode |= mode & ~MODE_CALLEESAVED; + x86regs[i].needed = true; return i; } } - if (x86reg.IsEmpty()) - x86reg = xRegister32(_getFreeX86reg(oldmode)); - else - _freeX86reg(x86reg); + const int regnum = _getFreeX86reg(mode); + xRegister64 new_reg(regnum); + x86regs[regnum].type = type; + x86regs[regnum].reg = reg; + x86regs[regnum].mode = mode & ~MODE_CALLEESAVED; + x86regs[regnum].counter = g_x86AllocCounter++; + x86regs[regnum].needed = true; + x86regs[regnum].inuse = true; - x86regs[x86reg.GetId()].type = type; - x86regs[x86reg.GetId()].reg = reg; - x86regs[x86reg.GetId()].mode = mode; - x86regs[x86reg.GetId()].needed = 1; - x86regs[x86reg.GetId()].inuse = 1; + if (type == X86TYPE_GPR) + { + RALOG("Allocating host reg %d to guest reg %d in %s mode\n", regnum, reg, GetModeString(mode)); + } if (mode & MODE_READ) { - if (readfromreg >= 0) - xMOV(x86reg, xRegister32(readfromreg)); - else + switch (type) { - if (type == X86TYPE_GPR) + case X86TYPE_GPR: { - if (reg == 0) { - xXOR(x86reg, x86reg); + xXOR(xRegister32(new_reg), xRegister32(new_reg)); // 32-bit is smaller and zexts anyway } else { - _flushConstReg(reg); - _deleteGPRtoXMMreg(reg, 1); + if (hostXMMreg >= 0) + { + // is in a XMM. we don't need to free the XMM since we're not writing, and it's still valid + RALOG("Copying %d from XMM %d to GPR %d on read\n", reg, hostXMMreg, regnum); + xMOVD(new_reg, xRegisterSSE(hostXMMreg)); // actually MOVQ - _eeMoveGPRtoR(x86reg, reg); + // if the XMM was dirty, just get rid of it, we don't want to try to sync the values up... + if (xmmregs[hostXMMreg].mode & MODE_WRITE) + { + RALOG("Freeing dirty XMM %d for GPR %d\n", hostXMMreg, reg); + _freeXMMreg(hostXMMreg); + } + } + else if (GPR_IS_CONST1(reg)) + { + xMOV64(new_reg, g_cpuConstRegs[reg].SD[0]); + g_cpuFlushedConstReg |= (1u << reg); + x86regs[regnum].mode |= MODE_WRITE; // reg is dirty - _deleteGPRtoXMMreg(reg, 0); - } - } - else - { - if (X86_ISVI(type) && reg < 16) - { - if (reg == 0) - xXOR(x86reg, x86reg); + RALOG("Writing constant value %lld from guest reg %d to host reg %d\n", g_cpuConstRegs[reg].SD[0], reg, regnum); + } else - xMOVZX(x86reg, ptr16[(u16*)(_x86GetAddr(type, reg))]); + { + // not loaded + RALOG("Loading guest reg %d to GPR %d\n", reg, regnum); + xMOV(new_reg, ptr64[&cpuRegs.GPR.r[reg].UD[0]]); + } + } + } + break; + + case X86TYPE_FPRC: + RALOG("Loading guest reg FPCR %d to GPR %d\n", reg, regnum); + xMOV(xRegister32(regnum), ptr32[&fpuRegs.fprc[reg]]); + break; + + case X86TYPE_PSX: + { + const xRegister32 new_reg32(regnum); + if (reg == 0) + { + xXOR(new_reg32, new_reg32); } else - xMOV(x86reg, ptr[(void*)(_x86GetAddr(type, reg))]); + { + if (PSX_IS_CONST1(reg)) + { + xMOV(new_reg32, g_psxConstRegs[reg]); + g_psxFlushedConstReg |= (1u << reg); + x86regs[regnum].mode |= MODE_WRITE; // reg is dirty + + RALOG("Writing constant value %d from guest PSX reg %d to host reg %d\n", g_psxConstRegs[reg], reg, regnum); + } + else + { + RALOG("Loading guest PSX reg %d to GPR %d\n", reg, regnum); + xMOV(new_reg32, ptr32[&psxRegs.GPR.r[reg]]); + } + } } + break; + + default: + abort(); + break; } } - // Need to port all the code - // return x86reg; - return x86reg.GetId(); + if (type == X86TYPE_GPR && (mode & MODE_WRITE)) + { + if (reg < 32 && GPR_IS_CONST1(reg)) + { + RALOG("Clearing constant value for guest reg %d on write allocation\n", reg); + GPR_DEL_CONST(reg); + } + if (hostXMMreg >= 0) + { + // writing, so kill the xmm allocation. gotta ensure the upper bits gets stored first. + RALOG("Invalidating %d from XMM %d because of GPR %d write\n", reg, hostXMMreg, regnum); + _freeXMMreg(hostXMMreg); + } + } + else if (type == X86TYPE_PSX && (mode & MODE_WRITE)) + { + if (reg < 32 && PSX_IS_CONST1(reg)) + { + RALOG("Clearing constant value for guest PSX reg %d on write allocation\n", reg); + PSX_DEL_CONST(reg); + } + } + + // Console.WriteLn("Allocating reg %d", regnum); + return regnum; +} + +void _writebackX86Reg(int x86reg) +{ + switch (x86regs[x86reg].type) + { + case X86TYPE_GPR: + RALOG("Writing back GPR reg %d for guest reg %d P2\n", x86reg, x86regs[x86reg].reg); + xMOV(ptr64[&cpuRegs.GPR.r[x86regs[x86reg].reg].UD[0]], xRegister64(x86reg)); + break; + + case X86TYPE_FPRC: + RALOG("Writing back GPR reg %d for guest reg FPCR %d P2\n", x86reg, x86regs[x86reg].reg); + xMOV(ptr32[&fpuRegs.fprc[x86regs[x86reg].reg]], xRegister32(x86reg)); + break; + + case X86TYPE_VIREG: + RALOG("Writing back VI reg %d for guest reg %d P2\n", x86reg, x86regs[x86reg].reg); + xMOV(ptr16[&VU0.VI[x86regs[x86reg].reg].UL], xRegister16(x86reg)); + break; + + case X86TYPE_PCWRITEBACK: + RALOG("Writing back PC writeback in host reg %d\n", x86reg); + xMOV(ptr32[&cpuRegs.pcWriteback], xRegister32(x86reg)); + break; + + case X86TYPE_PSX: + RALOG("Writing back PSX GPR reg %d for guest reg %d P2\n", x86reg, x86regs[x86reg].reg); + xMOV(ptr32[&psxRegs.GPR.r[x86regs[x86reg].reg]], xRegister32(x86reg)); + break; + + case X86TYPE_PSX_PCWRITEBACK: + RALOG("Writing back PSX PC writeback in host reg %d\n", x86reg); + xMOV(ptr32[&psxRegs.pcWriteback], xRegister32(x86reg)); + break; + + default: + abort(); + break; + } } int _checkX86reg(int type, int reg, int mode) { - uint i; - - for (i = 0; i < iREGCNT_GPR; i++) + for (uint i = 0; i < iREGCNT_GPR; i++) { if (x86regs[i].inuse && x86regs[i].reg == reg && x86regs[i].type == type) { + // shouldn't have dirty constants... + pxAssert((type != X86TYPE_GPR || !GPR_IS_DIRTY_CONST(reg)) && + (type != X86TYPE_PSX || !PSX_IS_DIRTY_CONST(reg))); - if (!(x86regs[i].mode & MODE_READ) && (mode & MODE_READ)) + if ((type == X86TYPE_GPR || type == X86TYPE_PSX) && !(x86regs[i].mode & MODE_READ) && (mode & MODE_READ)) + pxFailRel("Somehow ended up with an allocated x86 without mode"); + + // ensure constants get deleted once we alloc as write + if (mode & MODE_WRITE) { - if (X86_ISVI(type)) - xMOVZX(xRegister32(i), ptr16[(u16*)(_x86GetAddr(type, reg))]); - else - xMOV(xRegister32(i), ptr[(void*)(_x86GetAddr(type, reg))]); + if (type == X86TYPE_GPR) + { + // go through the alloc path instead, because we might need to invalidate an xmm. + return _allocX86reg(X86TYPE_GPR, reg, mode); + } + else if (type == X86TYPE_PSX) + { + pxAssert(!PSX_IS_DIRTY_CONST(reg)); + PSX_DEL_CONST(reg); + } } x86regs[i].mode |= mode; @@ -438,9 +489,7 @@ int _checkX86reg(int type, int reg, int mode) void _addNeededX86reg(int type, int reg) { - uint i; - - for (i = 0; i < iREGCNT_GPR; i++) + for (uint i = 0; i < iREGCNT_GPR; i++) { if (!x86regs[i].inuse || x86regs[i].reg != reg || x86regs[i].type != type) continue; @@ -452,9 +501,7 @@ void _addNeededX86reg(int type, int reg) void _clearNeededX86regs() { - uint i; - - for (i = 0; i < iREGCNT_GPR; i++) + for (uint i = 0; i < iREGCNT_GPR; i++) { if (x86regs[i].needed) { @@ -465,44 +512,6 @@ void _clearNeededX86regs() } } -void _deleteX86reg(int type, int reg, int flush) -{ - uint i; - - for (i = 0; i < iREGCNT_GPR; i++) - { - if (x86regs[i].inuse && x86regs[i].reg == reg && x86regs[i].type == type) - { - switch (flush) - { - case 0: - _freeX86reg(i); - break; - - case 1: - if (x86regs[i].mode & MODE_WRITE) - { - - if (X86_ISVI(type) && x86regs[i].reg < 16) - xMOV(ptr[(void*)(_x86GetAddr(type, x86regs[i].reg))], xRegister16(i)); - else - xMOV(ptr[(void*)(_x86GetAddr(type, x86regs[i].reg))], xRegister32(i)); - - // get rid of MODE_WRITE since don't want to flush again - x86regs[i].mode &= ~MODE_WRITE; - x86regs[i].mode |= MODE_READ; - } - return; - - case 2: - x86regs[i].inuse = 0; - break; - } - } - } -} - -// Temporary solution to support eax/ebx... type void _freeX86reg(const x86Emitter::xRegister32& x86reg) { _freeX86reg(x86reg.GetId()); @@ -514,17 +523,33 @@ void _freeX86reg(int x86reg) if (x86regs[x86reg].inuse && (x86regs[x86reg].mode & MODE_WRITE)) { + _writebackX86Reg(x86reg); x86regs[x86reg].mode &= ~MODE_WRITE; - - if (X86_ISVI(x86regs[x86reg].type) && x86regs[x86reg].reg < 16) - { - xMOV(ptr[(void*)(_x86GetAddr(x86regs[x86reg].type, x86regs[x86reg].reg))], xRegister16(x86reg)); - } - else - xMOV(ptr[(void*)(_x86GetAddr(x86regs[x86reg].type, x86regs[x86reg].reg))], xRegister32(x86reg)); } + _freeX86regWithoutWriteback(x86reg); +} + +void _freeX86regWithoutWriteback(int x86reg) +{ + pxAssert(x86reg >= 0 && x86reg < (int)iREGCNT_GPR); + x86regs[x86reg].inuse = 0; + + if (x86regs[x86reg].type == X86TYPE_VIREG) + { + RALOG("Freeing VI reg %d in host GPR %d\n", x86regs[x86reg].reg, x86reg); + //mVUFreeCOP2GPR(x86reg); + abort(); + } + else if (x86regs[x86reg].inuse && x86regs[x86reg].type == X86TYPE_GPR) + { + RALOG("Freeing X86 register %d (was guest %d)...\n", x86reg, x86regs[x86reg].reg); + } + else if (x86regs[x86reg].inuse) + { + RALOG("Freeing X86 register %d...\n", x86reg); + } } void _freeX86regs() @@ -533,12 +558,18 @@ void _freeX86regs() _freeX86reg(i); } -// Misc - -void _signExtendSFtoM(uptr mem) +void _flushX86regs() { - xLAHF(); - xSAR(ax, 15); - xCWDE(); - xMOV(ptr[(void*)(mem)], eax); + for (u32 i = 0; i < iREGCNT_GPR; ++i) + { + if (x86regs[i].inuse && x86regs[i].mode & MODE_WRITE) + { + // shouldn't be const, because if we got to write mode, we should've flushed then + pxAssert(x86regs[i].type != X86TYPE_GPR || !GPR_IS_DIRTY_CONST(x86regs[i].reg)); + + RALOG("Flushing x86 reg %u in _eeFlushAllDirty()\n", i); + _writebackX86Reg(i); + x86regs[i].mode = (x86regs[i].mode & ~MODE_WRITE) | MODE_READ; + } + } } diff --git a/pcsx2/x86/ix86-32/iR5900-32.cpp b/pcsx2/x86/ix86-32/iR5900-32.cpp index e67a8b052b..f109a895cb 100644 --- a/pcsx2/x86/ix86-32/iR5900-32.cpp +++ b/pcsx2/x86/ix86-32/iR5900-32.cpp @@ -47,6 +47,21 @@ #include "common/MemsetFast.inl" #include "common/Perf.h" +// Only for MOVQ workaround. +#include "common/emitter/internal.h" + +//#define DUMP_BLOCKS 1 +//#define TRACE_BLOCKS 1 + +#ifdef DUMP_BLOCKS +#include "Zydis/Zydis.h" +#include "Zycore/Format.h" +#include "Zycore/Status.h" +#endif + +#ifdef TRACE_BLOCKS +#include +#endif using namespace x86Emitter; using namespace R5900; @@ -70,7 +85,7 @@ static __fi u32 HWADDR(u32 mem) { return hwLUT[mem >> 16] + mem; } u32 s_nBlockCycles = 0; // cycles of current block recompiling bool s_nBlockInterlocked = false; // Block is VU0 interlocked -u32 pc; // recompiler pc +u32 pc; // recompiler pc int g_branch; // set for branch alignas(16) GPR_reg64 g_cpuConstRegs[32] = {0}; @@ -83,24 +98,19 @@ eeProfiler EE::Profiler; // Static Private Variables - R5900 Dynarec #define X86 -static const int RECCONSTBUF_SIZE = 16384 * 2; // 64 bit consts in 32 bit units static RecompiledCodeReserve* recMem = NULL; static u8* recRAMCopy = NULL; static u8* recLutReserve_RAM = NULL; static const size_t recLutSize = (Ps2MemSize::MainRam + Ps2MemSize::Rom + Ps2MemSize::Rom1 + Ps2MemSize::Rom2) * wordsize / 4; -static uptr m_ConfiguredCacheReserve = 64; - -alignas(16) static u32 recConstBuf[RECCONSTBUF_SIZE]; // 64-bit pseudo-immediates -static BASEBLOCK* recRAM = NULL; // and the ptr to the blocks here -static BASEBLOCK* recROM = NULL; // and here +static BASEBLOCK* recRAM = NULL; // and the ptr to the blocks here +static BASEBLOCK* recROM = NULL; // and here static BASEBLOCK* recROM1 = NULL; // also here static BASEBLOCK* recROM2 = NULL; // also here static BaseBlocks recBlocks; static u8* recPtr = NULL; -static u32* recConstBufPtr = NULL; EEINST* s_pInstCache = NULL; static u32 s_nInstCacheSize = 0; @@ -128,66 +138,186 @@ static void ClearRecLUT(BASEBLOCK* base, int count); static u32 scaleblockcycles(); static void recExitExecution(); -void _eeFlushAllUnused() +#ifdef TRACE_BLOCKS +static void pauseAAA() { - u32 i; - for (i = 0; i < 34; ++i) - { - if (pc < s_nEndBlock) - { - if ((g_pCurInstInfo[1].regs[i] & EEINST_USED)) - continue; - } - else if ((g_pCurInstInfo[0].regs[i] & EEINST_USED)) - continue; + fprintf(stderr, "\nPaused\n"); + fflush(stdout); + fflush(stderr); +#ifdef _MSC_VER + __debugbreak(); +#else + sleep(1); +#endif +} +#endif - if (i < 32 && GPR_IS_CONST1(i)) - _flushConstReg(i); +#ifdef DUMP_BLOCKS +static ZydisFormatterFunc s_old_print_address; + +static ZyanStatus ZydisFormatterPrintAddressAbsolute(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + ZyanU64 address; + ZYAN_CHECK(ZydisCalcAbsoluteAddress(context->instruction, context->operand, + context->runtime_address, &address)); + + char buf[128]; + u32 len = 0; + +#define A(x) ((u64)(x)) + + if (address >= A(eeMem->Main) && address < A(eeMem->Scratch)) + { + len = snprintf(buf, sizeof(buf), "eeMem+0x%08X", static_cast(address - A(eeMem->Main))); + } + else if (address >= A(eeMem->Scratch) && address < A(eeMem->ROM)) + { + len = snprintf(buf, sizeof(buf), "eeScratchpad+0x%08X", static_cast(address - A(eeMem->Scratch))); + } + else if (address >= A(&cpuRegs.GPR) && address < A(&cpuRegs.HI)) + { + const u32 offset = static_cast(address - A(&cpuRegs)) % 16u; + if (offset != 0) + len = snprintf(buf, sizeof(buf), "cpuRegs.GPR.%s+%u", GPR_REG[static_cast(address - A(&cpuRegs)) / 16u], offset); else - _deleteGPRtoXMMreg(i, 1); + len = snprintf(buf, sizeof(buf), "cpuRegs.GPR.%s", GPR_REG[static_cast(address - A(&cpuRegs)) / 16u]); } - - //TODO when used info is done for FPU and VU0 - for (i = 0; i < iREGCNT_XMM; ++i) + else if (address >= A(&cpuRegs.HI) && address < A(&cpuRegs.CP0)) { - if (xmmregs[i].inuse && xmmregs[i].type != XMMTYPE_GPRREG) - _freeXMMreg(i); + const u32 offset = static_cast(address - A(&cpuRegs.HI)) % 16u; + if (offset != 0) + len = snprintf(buf, sizeof(buf), "cpuRegs.%s+%u", (address >= A(&cpuRegs.LO) ? "LO" : "HI"), offset); + else + len = snprintf(buf, sizeof(buf), "cpuRegs.%s", (address >= A(&cpuRegs.LO) ? "LO" : "HI")); + } + else if (address == A(&cpuRegs.pc)) + { + len = snprintf(buf, sizeof(buf), "cpuRegs.pc"); + } + else if (address == A(&cpuRegs.cycle)) + { + len = snprintf(buf, sizeof(buf), "cpuRegs.cycle"); + } + else if (address == A(&cpuRegs.nextEventCycle)) + { + len = snprintf(buf, sizeof(buf), "cpuRegs.nextEventCycle"); + } + else if (address >= A(fpuRegs.fpr) && address < A(fpuRegs.fprc)) + { + len = snprintf(buf, sizeof(buf), "fpuRegs.f%02u", static_cast(address - A(fpuRegs.fpr)) / 4u); + } + else if (address >= A(&VU0.VF[0]) && address < A(&VU0.VI[0])) + { + const u32 offset = static_cast(address - A(&VU0.VF[0])) % 16u; + if (offset != 0) + len = snprintf(buf, sizeof(buf), "VU0.VF[%02u]+%u", static_cast(address - A(&VU0.VF[0])) / 16u, offset); + else + len = snprintf(buf, sizeof(buf), "VU0.VF[%02u]", static_cast(address - A(&VU0.VF[0])) / 16u); + } + else if (address >= A(&VU0.VI[0]) && address < A(&VU0.ACC)) + { + const u32 offset = static_cast(address - A(&VU0.VI[0])) % 16u; + const u32 vi = static_cast(address - A(&VU0.VI[0])) / 16u; + if (offset != 0) + len = snprintf(buf, sizeof(buf), "VU0.%s+%u", COP2_REG_CTL[vi], offset); + else + len = snprintf(buf, sizeof(buf), "VU0.%s", COP2_REG_CTL[vi]); + } + else if (address >= A(&VU0.ACC) && address < A(&VU0.q)) + { + const u32 offset = static_cast(address - A(&VU0.ACC)); + if (offset != 0) + len = snprintf(buf, sizeof(buf), "VU0.ACC+%u", offset); + else + len = snprintf(buf, sizeof(buf), "VU0.ACC"); + } + else if (address >= A(&VU0.q) && address < A(&VU0.idx)) + { + const u32 offset = static_cast(address - A(&VU0.q)) % 16u; + const char* reg = (address >= A(&VU0.p)) ? "p" : "q"; + if (offset != 0) + len = snprintf(buf, sizeof(buf), "VU0.%s+%u", reg, offset); + else + len = snprintf(buf, sizeof(buf), "VU0.%s", reg); } -} -u32* _eeGetConstReg(int reg) +#undef A + + if (len > 0) + { + ZYAN_CHECK(ZydisFormatterBufferAppend(buffer, ZYDIS_TOKEN_SYMBOL)); + ZyanString* string; + ZYAN_CHECK(ZydisFormatterBufferGetString(buffer, &string)); + return ZyanStringAppendFormat(string, "&%s", buf); + } + + return s_old_print_address(formatter, buffer, context); +} +#endif + +void _eeFlushAllDirty() { - pxAssert(GPR_IS_CONST1(reg)); + _flushXMMregs(); + _flushX86regs(); - if (g_cpuFlushedConstReg & (1 << reg)) - return &cpuRegs.GPR.r[reg].UL[0]; - - // if written in the future, don't flush - if (_recIsRegWritten(g_pCurInstInfo + 1, (s_nEndBlock - pc) / 4, XMMTYPE_GPRREG, reg)) - return recGetImm64(g_cpuConstRegs[reg].UL[1], g_cpuConstRegs[reg].UL[0]); - - _flushConstReg(reg); - return &cpuRegs.GPR.r[reg].UL[0]; + // flush constants, do them all at once for slightly better codegen + _flushConstRegs(); } -void _eeMoveGPRtoR(const xRegister32& to, int fromgpr) +void _eeMoveGPRtoR(const xRegister32& to, int fromgpr, bool allow_preload) { if (fromgpr == 0) - xXOR(to, to); // zero register should use xor, thanks --air + xXOR(to, to); else if (GPR_IS_CONST1(fromgpr)) xMOV(to, g_cpuConstRegs[fromgpr].UL[0]); else { - int mmreg; + int x86reg = _checkX86reg(X86TYPE_GPR, fromgpr, MODE_READ); + int xmmreg = _checkXMMreg(XMMTYPE_GPRREG, fromgpr, MODE_READ); - if ((mmreg = _checkXMMreg(XMMTYPE_GPRREG, fromgpr, MODE_READ)) >= 0 && (xmmregs[mmreg].mode & MODE_WRITE)) + if (allow_preload && x86reg < 0 && xmmreg < 0) { - xMOVD(to, xRegisterSSE(mmreg)); + if (EEINST_XMMUSEDTEST(fromgpr)) + xmmreg = _allocGPRtoXMMreg(fromgpr, MODE_READ); + else if (EEINST_USEDTEST(fromgpr)) + x86reg = _allocX86reg(X86TYPE_GPR, fromgpr, MODE_READ); } + + if (x86reg >= 0) + xMOV(to, xRegister32(x86reg)); + else if (xmmreg >= 0) + xMOVD(to, xRegisterSSE(xmmreg)); else - { xMOV(to, ptr[&cpuRegs.GPR.r[fromgpr].UL[0]]); + } +} + +void _eeMoveGPRtoR(const xRegister64& to, int fromgpr, bool allow_preload) +{ + if (fromgpr == 0) + xXOR(xRegister32(to), xRegister32(to)); + else if (GPR_IS_CONST1(fromgpr)) + xMOV64(to, g_cpuConstRegs[fromgpr].UD[0]); + else + { + int x86reg = _checkX86reg(X86TYPE_GPR, fromgpr, MODE_READ); + int xmmreg = _checkXMMreg(XMMTYPE_GPRREG, fromgpr, MODE_READ); + + if (allow_preload && x86reg < 0 && xmmreg < 0) + { + if (EEINST_XMMUSEDTEST(fromgpr)) + xmmreg = _allocGPRtoXMMreg(fromgpr, MODE_READ); + else if (EEINST_USEDTEST(fromgpr)) + x86reg = _allocX86reg(X86TYPE_GPR, fromgpr, MODE_READ); } + + if (x86reg >= 0) + xMOV(to, xRegister64(x86reg)); + else if (xmmreg >= 0) + xMOVD(to, xRegisterSSE(xmmreg)); + else + xMOV(to, ptr32[&cpuRegs.GPR.r[fromgpr].UD[0]]); } } @@ -197,143 +327,33 @@ void _eeMoveGPRtoM(uptr to, int fromgpr) xMOV(ptr32[(u32*)(to)], g_cpuConstRegs[fromgpr].UL[0]); else { - int mmreg; + int x86reg = _checkX86reg(X86TYPE_GPR, fromgpr, MODE_READ); + int xmmreg = _checkXMMreg(XMMTYPE_GPRREG, fromgpr, MODE_READ); - if ((mmreg = _checkXMMreg(XMMTYPE_GPRREG, fromgpr, MODE_READ)) >= 0) + if (x86reg < 0 && xmmreg < 0) { - xMOVSS(ptr[(void*)(to)], xRegisterSSE(mmreg)); + if (EEINST_XMMUSEDTEST(fromgpr)) + xmmreg = _allocGPRtoXMMreg(fromgpr, MODE_READ); + else if (EEINST_USEDTEST(fromgpr)) + x86reg = _allocX86reg(X86TYPE_GPR, fromgpr, MODE_READ); + } + + if (x86reg >= 0) + { + xMOV(ptr32[(void*)(to)], xRegister32(x86reg)); + } + else if (xmmreg >= 0) + { + xMOVSS(ptr32[(void*)(to)], xRegisterSSE(xmmreg)); } else { - xMOV(eax, ptr[&cpuRegs.GPR.r[fromgpr].UL[0]]); - xMOV(ptr[(void*)(to)], eax); + xMOV(eax, ptr32[&cpuRegs.GPR.r[fromgpr].UL[0]]); + xMOV(ptr32[(void*)(to)], eax); } } } -void _eeMoveGPRtoRm(x86IntRegType to, int fromgpr) -{ - if (GPR_IS_CONST1(fromgpr)) - xMOV(ptr32[xAddressReg(to)], g_cpuConstRegs[fromgpr].UL[0]); - else - { - int mmreg; - - if ((mmreg = _checkXMMreg(XMMTYPE_GPRREG, fromgpr, MODE_READ)) >= 0) - { - xMOVSS(ptr[xAddressReg(to)], xRegisterSSE(mmreg)); - } - else - { - xMOV(eax, ptr[&cpuRegs.GPR.r[fromgpr].UL[0]]); - xMOV(ptr[xAddressReg(to)], eax); - } - } -} - -void _signExtendToMem(void* mem) -{ - xCDQE(); - xMOV(ptr64[mem], rax); -} - -void eeSignExtendTo(int gpr, bool onlyupper) -{ - if (onlyupper) - { - xCDQ(); - xMOV(ptr32[&cpuRegs.GPR.r[gpr].UL[1]], edx); - } - else - { - _signExtendToMem(&cpuRegs.GPR.r[gpr].UD[0]); - } -} - -int _flushXMMunused() -{ - u32 i; - for (i = 0; i < iREGCNT_XMM; i++) - { - if (!xmmregs[i].inuse || xmmregs[i].needed || !(xmmregs[i].mode & MODE_WRITE)) - continue; - - if (xmmregs[i].type == XMMTYPE_GPRREG) - { - //if( !(g_pCurInstInfo->regs[xmmregs[i].reg]&EEINST_USED) ) { - if (!_recIsRegWritten(g_pCurInstInfo + 1, (s_nEndBlock - pc) / 4, XMMTYPE_GPRREG, xmmregs[i].reg)) - { - _freeXMMreg(i); - xmmregs[i].inuse = 1; - return 1; - } - } - } - - return 0; -} - -int _flushUnusedConstReg() -{ - int i; - for (i = 1; i < 32; ++i) - { - if ((g_cpuHasConstReg & (1 << i)) && !(g_cpuFlushedConstReg & (1 << i)) && - !_recIsRegWritten(g_pCurInstInfo + 1, (s_nEndBlock - pc) / 4, XMMTYPE_GPRREG, i)) - { - - // check if will be written in the future - xMOV(ptr32[&cpuRegs.GPR.r[i].UL[0]], g_cpuConstRegs[i].UL[0]); - xMOV(ptr32[&cpuRegs.GPR.r[i].UL[1]], g_cpuConstRegs[i].UL[1]); - g_cpuFlushedConstReg |= 1 << i; - return 1; - } - } - - return 0; -} - -// Some of the generated MMX code needs 64-bit immediates but x86 doesn't -// provide this. One of the reasons we are probably better off not doing -// MMX register allocation for the EE. -u32* recGetImm64(u32 hi, u32 lo) -{ - u32* imm64; // returned pointer - static u32* imm64_cache[509]; - int cacheidx = lo % (sizeof imm64_cache / sizeof *imm64_cache); - - imm64 = imm64_cache[cacheidx]; - if (imm64 && imm64[0] == lo && imm64[1] == hi) - return imm64; - - if (recConstBufPtr >= recConstBuf + RECCONSTBUF_SIZE) - { - Console.WriteLn("EErec const buffer filled; Resetting..."); - throw Exception::ExitCpuExecute(); - - /*for (u32 *p = recConstBuf; p < recConstBuf + RECCONSTBUF_SIZE; p += 2) - { - if (p[0] == lo && p[1] == hi) { - imm64_cache[cacheidx] = p; - return p; - } - } - - return recConstBuf;*/ - } - - imm64 = recConstBufPtr; - recConstBufPtr += 2; - imm64_cache[cacheidx] = imm64; - - imm64[0] = lo; - imm64[1] = hi; - - //Console.Warning("Consts allocated: %d of %u", (recConstBufPtr - recConstBuf) / 2, count); - - return imm64; -} - // Use this to call into interpreter functions that require an immediate branchtest // to be done afterward (anything that throws an exception or enables interrupts, etc). void recBranchCall(void (*func)()) @@ -342,7 +362,7 @@ void recBranchCall(void (*func)()) // to the current cpu cycle. xMOV(eax, ptr[&cpuRegs.cycle]); - xMOV(ptr[&g_nextEventCycle], eax); + xMOV(ptr[&cpuRegs.nextEventCycle], eax); recCall(func); g_branch = 2; @@ -367,14 +387,14 @@ alignas(__pagesize) static u8 eeRecDispatchers[__pagesize]; typedef void DynGenFunc(); -static DynGenFunc* DispatcherEvent = NULL; -static DynGenFunc* DispatcherReg = NULL; -static DynGenFunc* JITCompile = NULL; -static DynGenFunc* JITCompileInBlock = NULL; -static DynGenFunc* EnterRecompiledCode = NULL; -static DynGenFunc* ExitRecompiledCode = NULL; +static DynGenFunc* DispatcherEvent = NULL; +static DynGenFunc* DispatcherReg = NULL; +static DynGenFunc* JITCompile = NULL; +static DynGenFunc* JITCompileInBlock = NULL; +static DynGenFunc* EnterRecompiledCode = NULL; +static DynGenFunc* ExitRecompiledCode = NULL; static DynGenFunc* DispatchBlockDiscard = NULL; -static DynGenFunc* DispatchPageReset = NULL; +static DynGenFunc* DispatchPageReset = NULL; static void recEventTest() { @@ -452,11 +472,14 @@ static DynGenFunc* _DynGen_EnterRecompiledCode() { // Properly scope the frame prologue/epilogue #ifdef ENABLE_VTUNE - xScopedStackFrame frame(true); + xScopedStackFrame frame(true, true); #else - xScopedStackFrame frame(IsDevBuild); + xScopedStackFrame frame(false, true); #endif + if (CHECK_FASTMEM) + xMOV(RFASTMEMBASE, ptrNative[&vtlb_private::vtlbdata.fastmem_base]); + xJMP((void*)DispatcherReg); // Save an exit point @@ -497,13 +520,13 @@ static void _DynGen_Dispatchers() // Place the EventTest and DispatcherReg stuff at the top, because they get called the // most and stand to benefit from strong alignment and direct referencing. DispatcherEvent = _DynGen_DispatcherEvent(); - DispatcherReg = _DynGen_DispatcherReg(); + DispatcherReg = _DynGen_DispatcherReg(); - JITCompile = _DynGen_JITCompile(); - JITCompileInBlock = _DynGen_JITCompileInBlock(); - EnterRecompiledCode = _DynGen_EnterRecompiledCode(); + JITCompile = _DynGen_JITCompile(); + JITCompileInBlock = _DynGen_JITCompileInBlock(); + EnterRecompiledCode = _DynGen_EnterRecompiledCode(); DispatchBlockDiscard = _DynGen_DispatchBlockDiscard(); - DispatchPageReset = _DynGen_DispatchPageReset(); + DispatchPageReset = _DynGen_DispatchPageReset(); HostSys::MemProtectStatic(eeRecDispatchers, PageAccess_ExecOnly()); @@ -522,42 +545,14 @@ static __ri void ClearRecLUT(BASEBLOCK* base, int memsize) base[i].SetFnptr((uptr)JITCompile); } - -static void recThrowHardwareDeficiency(const char* extFail) -{ - throw Exception::HardwareDeficiency() - .SetDiagMsg(fmt::format("R5900-32 recompiler init failed: {} is not available.", extFail)) - .SetUserMsg(fmt::format("{} Extensions not found. The R5900-32 recompiler requires a host CPU with SSE2 extensions.", extFail)); -} - -static void recReserveCache() -{ - if (!recMem) - recMem = new RecompiledCodeReserve("R5900-32 Recompiler Cache", _16mb); - recMem->SetProfilerName("EErec"); - - while (!recMem->IsOk()) - { - if (recMem->Reserve(GetVmMemory().MainMemory(), HostMemoryMap::EErecOffset, m_ConfiguredCacheReserve * _1mb) != NULL) - break; - - // If it failed, then try again (if possible): - if (m_ConfiguredCacheReserve < 16) - break; - m_ConfiguredCacheReserve /= 2; - } - - recMem->ThrowIfNotOk(); -} - static void recReserve() { - // Hardware Requirements Check... + if (recMem) + return; - if (!x86caps.hasStreamingSIMD4Extensions) - recThrowHardwareDeficiency("SSE4"); - - recReserveCache(); + recMem = new RecompiledCodeReserve("R5900 Recompiler Cache"); + recMem->SetProfilerName("EErec"); + recMem->Assign(GetVmMemory().CodeMemory(), HostMemoryMap::EErecOffset, 64 * _1mb); } static void recAlloc() @@ -573,10 +568,14 @@ static void recAlloc() } BASEBLOCK* basepos = (BASEBLOCK*)recLutReserve_RAM; - recRAM = basepos; basepos += (Ps2MemSize::MainRam / 4); - recROM = basepos; basepos += (Ps2MemSize::Rom / 4); - recROM1 = basepos; basepos += (Ps2MemSize::Rom1 / 4); - recROM2 = basepos; basepos += (Ps2MemSize::Rom2 / 4); + recRAM = basepos; + basepos += (Ps2MemSize::MainRam / 4); + recROM = basepos; + basepos += (Ps2MemSize::Rom / 4); + recROM1 = basepos; + basepos += (Ps2MemSize::Rom1 / 4); + recROM2 = basepos; + basepos += (Ps2MemSize::Rom2 / 4); for (int i = 0; i < 0x10000; i++) recLUT_SetPage(recLUT, 0, 0, 0, i, 0); @@ -600,7 +599,7 @@ static void recAlloc() recLUT_SetPage(recLUT, hwLUT, recROM, 0xa000, i, i - 0x1fc0); } - for (int i = 0x1e00; i < 0x1e04; i++) + for (int i = 0x1e00; i < 0x1e40; i++) { recLUT_SetPage(recLUT, hwLUT, recROM1, 0x0000, i, i - 0x1e00); recLUT_SetPage(recLUT, hwLUT, recROM1, 0x8000, i, i - 0x1e00); @@ -618,11 +617,10 @@ static void recAlloc() { s_nInstCacheSize = 128; s_pInstCache = (EEINST*)malloc(sizeof(EEINST) * s_nInstCacheSize); + if (!s_pInstCache) + pxFailRel("Failed to allocate R5900-32 InstCache array"); } - if (s_pInstCache == NULL) - throw Exception::OutOfMemory("R5900-32 InstCache"); - // No errors.. Proceed with initialization: _DynGen_Dispatchers(); @@ -652,18 +650,16 @@ static void recResetRaw() maxrecmem = 0; - memset(recConstBuf, 0, RECCONSTBUF_SIZE * sizeof(*recConstBuf)); - if (s_pInstCache) memset(s_pInstCache, 0, sizeof(EEINST) * s_nInstCacheSize); recBlocks.Reset(); mmap_ResetBlockTracking(); + vtlb_ClearLoadStoreInfo(); x86SetPtr(*recMem); recPtr = *recMem; - recConstBufPtr = recConstBuf; g_branch = 0; g_resetEeScalingStats = true; @@ -708,7 +704,7 @@ void recStep() static fastjmp_buf m_SetJmp_StateCheck; static std::unique_ptr m_cpuException; -static ScopedExcept m_Exception; +static std::unique_ptr m_Exception; static void recExitExecution() { @@ -740,7 +736,7 @@ static void recExecute() recResetRaw(); m_cpuException = nullptr; - m_Exception = nullptr; + m_Exception = nullptr; // setjmp will save the register context and will return 0 // A call to longjmp will restore the context (included the eip/rip) @@ -879,8 +875,7 @@ void recClear(u32 addr, u32 size) if (s_pCurBlock == PC_GETBLOCK(pexblock->startpc)) continue; u32 blockend = pexblock->startpc + pexblock->size * 4; - if (pexblock->startpc >= addr && pexblock->startpc < addr + size * 4 - || pexblock->startpc < addr && blockend > addr) + if (pexblock->startpc >= addr && pexblock->startpc < addr + size * 4 || pexblock->startpc < addr && blockend > addr) { if (!IsDevBuild) Console.Error("[EE] Impossible block clearing failure"); @@ -902,51 +897,67 @@ void SetBranchReg(u32 reg) if (reg != 0xffffffff) { -// if (GPR_IS_CONST1(reg)) -// xMOV(ptr32[&cpuRegs.pc], g_cpuConstRegs[reg].UL[0]); -// else -// { -// int mmreg; -// -// if ((mmreg = _checkXMMreg(XMMTYPE_GPRREG, reg, MODE_READ)) >= 0) -// { -// xMOVSS(ptr[&cpuRegs.pc], xRegisterSSE(mmreg)); -// } -// else -// { -// xMOV(eax, ptr[(void*)((int)&cpuRegs.GPR.r[reg].UL[0])]); -// xMOV(ptr[&cpuRegs.pc], eax); -// } -// } - _allocX86reg(calleeSavedReg2d, X86TYPE_PCWRITEBACK, 0, MODE_WRITE); - _eeMoveGPRtoR(calleeSavedReg2d, reg); - - if (EmuConfig.Gamefixes.GoemonTlbHack) + // if (GPR_IS_CONST1(reg)) + // xMOV(ptr32[&cpuRegs.pc], g_cpuConstRegs[reg].UL[0]); + // else + // { + // int mmreg; + // + // if ((mmreg = _checkXMMreg(XMMTYPE_GPRREG, reg, MODE_READ)) >= 0) + // { + // xMOVSS(ptr[&cpuRegs.pc], xRegisterSSE(mmreg)); + // } + // else + // { + // xMOV(eax, ptr[(void*)((int)&cpuRegs.GPR.r[reg].UL[0])]); + // xMOV(ptr[&cpuRegs.pc], eax); + // } + // } + const bool swap = EmuConfig.Gamefixes.GoemonTlbHack ? false : TrySwapDelaySlot(reg, 0, 0, true); + if (!swap) { - xMOV(ecx, calleeSavedReg2d); - vtlb_DynV2P(); - xMOV(calleeSavedReg2d, eax); - } + const int wbreg = _allocX86reg(X86TYPE_PCWRITEBACK, 0, MODE_WRITE | MODE_CALLEESAVED); + _eeMoveGPRtoR(xRegister32(wbreg), reg); - recompileNextInstruction(1); + if (EmuConfig.Gamefixes.GoemonTlbHack) + { + xMOV(ecx, xRegister32(wbreg)); + vtlb_DynV2P(); + xMOV(xRegister32(wbreg), eax); + } - if (x86regs[calleeSavedReg2d.GetId()].inuse) - { - pxAssert(x86regs[calleeSavedReg2d.GetId()].type == X86TYPE_PCWRITEBACK); - xMOV(ptr[&cpuRegs.pc], calleeSavedReg2d); - x86regs[calleeSavedReg2d.GetId()].inuse = 0; + recompileNextInstruction(true, false); + + // the next instruction may have flushed the register.. so reload it if so. + if (x86regs[wbreg].inuse && x86regs[wbreg].type == X86TYPE_PCWRITEBACK) + { + xMOV(ptr[&cpuRegs.pc], xRegister32(wbreg)); + x86regs[wbreg].inuse = 0; + } + else + { + xMOV(eax, ptr[&cpuRegs.pcWriteback]); + xMOV(ptr[&cpuRegs.pc], eax); + } } else { - xMOV(eax, ptr[&g_recWriteback]); - xMOV(ptr[&cpuRegs.pc], eax); + if (GPR_IS_DIRTY_CONST(reg) || _hasX86reg(X86TYPE_GPR, reg, 0)) + { + const int x86reg = _allocX86reg(X86TYPE_GPR, reg, MODE_READ); + xMOV(ptr32[&cpuRegs.pc], xRegister32(x86reg)); + } + else + { + _eeMoveGPRtoM((uptr)&cpuRegs.pc, reg); + } } } -// xCMP(ptr32[&cpuRegs.pc], 0); -// j8Ptr[5] = JNE8(0); -// xFastCall((void*)(uptr)tempfn); -// x86SetJ8(j8Ptr[5]); + // xCMP(ptr32[&cpuRegs.pc], 0); + // j8Ptr[5] = JNE8(0); + // xFastCall((void*)(uptr)tempfn); + // x86SetJ8(j8Ptr[5]); iFlushCall(FLUSH_EVERYTHING); @@ -965,6 +976,288 @@ void SetBranchImm(u32 imm) iBranchTest(imm); } +u8* recBeginThunk() +{ + // if recPtr reached the mem limit reset whole mem + if (recPtr >= (recMem->GetPtrEnd() - _64kb)) + eeRecNeedsReset = true; + + xSetPtr(recPtr); + recPtr = xGetAlignedCallTarget(); + + x86Ptr = recPtr; + return recPtr; +} + +u8* recEndThunk() +{ + u8* block_end = x86Ptr; + + pxAssert(block_end < recMem->GetPtrEnd()); + recPtr = block_end; + return block_end; +} + +bool TrySwapDelaySlot(u32 rs, u32 rt, u32 rd, bool allow_loadstore) +{ +#if 1 + if (g_recompilingDelaySlot) + return false; + + const u32 opcode_encoded = *(u32*)PSM(pc); + if (opcode_encoded == 0) + { + recompileNextInstruction(true, true); + return true; + } + + //std::string disasm; + //disR5900Fasm(disasm, opcode_encoded, pc, false); + + const u32 opcode_rs = ((opcode_encoded >> 21) & 0x1F); + const u32 opcode_rt = ((opcode_encoded >> 16) & 0x1F); + const u32 opcode_rd = ((opcode_encoded >> 11) & 0x1F); + + switch (opcode_encoded >> 26) + { + case 8: // ADDI + case 9: // ADDIU + case 10: // SLTI + case 11: // SLTIU + case 12: // ANDIU + case 13: // ORI + case 14: // XORI + case 24: // DADDI + case 25: // DADDIU + { + if ((rs != 0 && rs == opcode_rt) || (rt != 0 && rt == opcode_rt) || (rd != 0 && (rd == opcode_rs || rd == opcode_rt))) + goto is_unsafe; + } + break; + + case 26: // LDL + case 27: // LDR + case 30: // LQ + case 31: // SQ + case 32: // LB + case 33: // LH + case 34: // LWL + case 35: // LW + case 36: // LBU + case 37: // LHU + case 38: // LWR + case 39: // LWU + case 40: // SB + case 41: // SH + case 42: // SWL + case 43: // SW + case 44: // SDL + case 45: // SDR + case 46: // SWR + case 55: // LD + case 63: // SD + { + // We can't allow loadstore swaps for BC0x/BC2x, since they could affect the condition. + if (!allow_loadstore || (rs != 0 && rs == opcode_rt) || (rt != 0 && rt == opcode_rt) || (rd != 0 && (rd == opcode_rs || rd == opcode_rt))) + goto is_unsafe; + } + break; + + case 15: // LUI + { + if ((rs != 0 && rs == opcode_rt) || (rt != 0 && rt == opcode_rt) || (rd != 0 && rd == opcode_rt)) + goto is_unsafe; + } + break; + + case 49: // LWC1 + case 57: // SWC1 + case 54: // LQC2 + case 62: // SQC2 + // fprintf(stderr, "SWAPPING coprocessor load delay slot (block %08X) %08X %s\n", s_pCurBlockEx->startpc, pc, disasm.c_str()); + break; + + case 0: // SPECIAL + { + switch (opcode_encoded & 0x3F) + { + case 0: // SLL + case 2: // SRL + case 3: // SRA + case 4: // SLLV + case 6: // SRLV + case 7: // SRAV + case 10: // MOVZ + case 11: // MOVN + case 20: // DSLLV + case 22: // DSRLV + case 23: // DSRAV + case 24: // MULT + case 25: // MULTU + case 32: // ADD + case 33: // ADDU + case 34: // SUB + case 35: // SUBU + case 36: // AND + case 37: // OR + case 38: // XOR + case 39: // NOR + case 42: // SLT + case 43: // SLTU + case 44: // DADD + case 45: // DADDU + case 46: // DSUB + case 47: // DSUBU + case 56: // DSLL + case 58: // DSRL + case 59: // DSRA + case 60: // DSLL32 + case 62: // DSRL31 + case 64: // DSRA32 + { + if ((rs != 0 && rs == opcode_rd) || (rt != 0 && rt == opcode_rd) || (rd != 0 && (rd == opcode_rs || rd == opcode_rt))) + goto is_unsafe; + } + break; + + case 15: // SYNC + case 26: // DIV + case 27: // DIVU + break; + + default: + goto is_unsafe; + } + } + break; + + case 16: // COP0 + { + switch ((opcode_encoded >> 21) & 0x1F) + { + case 0: // MFC0 + case 2: // CFC0 + { + if ((rs != 0 && rs == opcode_rt) || (rt != 0 && rt == opcode_rt) || (rd != 0 && rd == opcode_rt)) + goto is_unsafe; + } + break; + + case 4: // MTC0 + case 6: // CTC0 + break; + + case 16: // TLB (technically would be safe, but we don't use it anyway) + default: + goto is_unsafe; + } + break; + } + break; + + case 17: // COP1 + { + switch ((opcode_encoded >> 21) & 0x1F) + { + case 0: // MFC1 + case 2: // CFC1 + { + if ((rs != 0 && rs == opcode_rt) || (rt != 0 && rt == opcode_rt) || (rd != 0 && rd == opcode_rt)) + goto is_unsafe; + } + break; + + case 4: // MTC1 + case 6: // CTC1 + case 16: // S + { + const u32 funct = (opcode_encoded & 0x3F); + if (funct == 50 || funct == 52 || funct == 54) // C.EQ, C.LT, C.LE + { + // affects flags that we're comparing + goto is_unsafe; + } + } + [[fallthrough]]; + + case 20: // W + { + // fprintf(stderr, "Swapping FPU delay slot (block %08X) %08X %s\n", s_pCurBlockEx->startpc, pc, disasm.c_str()); + } + break; + + default: + goto is_unsafe; + } + } + break; + + case 18: // COP2 + { + switch ((opcode_encoded >> 21) & 0x1F) + { + case 8: // BC2XX + goto is_unsafe; + + case 1: // QMFC2 + case 2: // CFC2 + { + if ((rs != 0 && rs == opcode_rt) || (rt != 0 && rt == opcode_rt) || (rd != 0 && rd == opcode_rt)) + goto is_unsafe; + } + break; + + default: + break; + } + + // fprintf(stderr, "Swapping COP2 delay slot (block %08X) %08X %s\n", s_pCurBlockEx->startpc, pc, disasm.c_str()); + } + break; + + case 28: // MMI + { + switch (opcode_encoded & 0x3F) + { + case 8: // MMI0 + case 9: // MMI1 + case 10: // MMI2 + case 40: // MMI3 + case 41: // MMI3 + case 52: // PSLLH + case 54: // PSRLH + case 55: // LSRAH + case 60: // PSLLW + case 62: // PSRLW + case 63: // PSRAW + { + if ((rs != 0 && rs == opcode_rd) || (rt != 0 && rt == opcode_rd) || (rd != 0 && rd == opcode_rd)) + goto is_unsafe; + } + break; + + default: + goto is_unsafe; + } + } + break; + + default: + goto is_unsafe; + } + + // fprintf(stderr, "Swapping delay slot %08X %s\n", pc, disasm.c_str()); + recompileNextInstruction(true, true); + return true; + +is_unsafe: + // fprintf(stderr, "NOT SWAPPING delay slot %08X %s\n", pc, disasm.c_str()); + return false; +#else + return false; +#endif +} + void SaveBranchState() { s_savenBlockCycles = s_nBlockCycles; @@ -991,9 +1284,41 @@ void LoadBranchState() void iFlushCall(int flushtype) { // Free registers that are not saved across function calls (x86-32 ABI): - _freeX86reg(eax); - _freeX86reg(ecx); - _freeX86reg(edx); + for (u32 i = 0; i < iREGCNT_GPR; i++) + { + if (!x86regs[i].inuse) + continue; + + if (xRegisterBase::IsCallerSaved(i) || + ((flushtype & FLUSH_FREE_VU0) && x86regs[i].type == X86TYPE_VIREG) || + ((flushtype & FLUSH_FREE_NONTEMP_X86) && x86regs[i].type != X86TYPE_TEMP) || + ((flushtype & FLUSH_FREE_TEMP_X86) && x86regs[i].type == X86TYPE_TEMP)) + { + _freeX86reg(i); + } + } + + for (u32 i = 0; i < iREGCNT_XMM; i++) + { + if (!xmmregs[i].inuse) + continue; + + if (xRegisterSSE::IsCallerSaved(i) || + (flushtype & FLUSH_FREE_XMM) || + ((flushtype & FLUSH_FREE_VU0) && xmmregs[i].type == XMMTYPE_VFREG)) + { + _freeXMMreg(i); + } + } + + if (flushtype & FLUSH_ALL_X86) + _flushX86regs(); + + if (flushtype & FLUSH_FLUSH_XMM) + _flushXMMregs(); + + if (flushtype & FLUSH_CONSTANT_REGS) + _flushConstRegs(); if ((flushtype & FLUSH_PC) && !g_cpuFlushedPC) { @@ -1007,20 +1332,14 @@ void iFlushCall(int flushtype) g_cpuFlushedCode = true; } +#if 0 if ((flushtype == FLUSH_CAUSE) && !g_maySignalException) { if (g_recompilingDelaySlot) xOR(ptr32[&cpuRegs.CP0.n.Cause], 1 << 31); // BD g_maySignalException = true; } - - if (flushtype & FLUSH_FREE_XMM) - _freeXMMregs(); - else if (flushtype & FLUSH_FLUSH_XMM) - _flushXMMregs(); - - if (flushtype & FLUSH_CACHED_REGS) - _flushConstRegs(); +#endif } // Note: scaleblockcycles() scales s_nBlockCycles respective to the EECycleRate value for manipulating the cycles of current block recompiling. @@ -1133,7 +1452,7 @@ static void iBranchTest(u32 newpc) if (EmuConfig.Speedhacks.WaitLoop && s_nBlockFF && newpc == s_branchTo) { - xMOV(eax, ptr32[&g_nextEventCycle]); + xMOV(eax, ptr32[&cpuRegs.nextEventCycle]); xADD(ptr32[&cpuRegs.cycle], scaleblockcycles()); xCMP(eax, ptr32[&cpuRegs.cycle]); xCMOVS(eax, ptr32[&cpuRegs.cycle]); @@ -1146,7 +1465,7 @@ static void iBranchTest(u32 newpc) xMOV(eax, ptr[&cpuRegs.cycle]); xADD(eax, scaleblockcycles()); xMOV(ptr[&cpuRegs.cycle], eax); // update cycles - xSUB(eax, ptr[&g_nextEventCycle]); + xSUB(eax, ptr[&cpuRegs.nextEventCycle]); if (newpc == 0xffffffff) xJS(DispatcherReg); @@ -1419,7 +1738,7 @@ void encodeMemcheck() } } -void recompileNextInstruction(int delayslot) +void recompileNextInstruction(bool delayslot, bool swapped_delay_slot) { u32 i; int count; @@ -1430,15 +1749,31 @@ void recompileNextInstruction(int delayslot) encodeBreakpoint(); encodeMemcheck(); } + else + { +#ifdef DUMP_BLOCKS + std::string disasm; + disR5900Fasm(disasm, *(u32*)PSM(pc), pc, false); + fprintf(stderr, "Compiling delay slot %08X %s\n", pc, disasm.c_str()); +#endif + + _clearNeededX86regs(); + _clearNeededXMMregs(); + } s_pCode = (int*)PSM(pc); pxAssert(s_pCode); +#if 0 // acts as a tag for delimiting recompiled instructions when viewing x86 disasm. if (IsDevBuild) xNOP(); if (IsDebugBuild) xMOV(eax, pc); +#endif + + const int old_code = cpuRegs.code; + EEINST* old_inst_info = g_pCurInstInfo; cpuRegs.code = *(int*)s_pCode; @@ -1456,16 +1791,38 @@ void recompileNextInstruction(int delayslot) g_pCurInstInfo++; - for (i = 0; i < iREGCNT_XMM; ++i) + // pc might be past s_nEndBlock if the last instruction in the block is a DI. + if (pc <= s_nEndBlock) { - if (xmmregs[i].inuse) + for (i = 0; i < iREGCNT_GPR; ++i) { - count = _recIsRegWritten(g_pCurInstInfo, (s_nEndBlock - pc) / 4 + 1, xmmregs[i].type, xmmregs[i].reg); - if (count > 0) - xmmregs[i].counter = 1000 - count; - else - xmmregs[i].counter = 0; + if (x86regs[i].inuse) + { + count = _recIsRegReadOrWritten(g_pCurInstInfo, (s_nEndBlock - pc) / 4 + 1, x86regs[i].type, x86regs[i].reg); + if (count > 0) + x86regs[i].counter = 1000 - count; + else + x86regs[i].counter = 0; + } } + + for (i = 0; i < iREGCNT_XMM; ++i) + { + if (xmmregs[i].inuse) + { + count = _recIsRegReadOrWritten(g_pCurInstInfo, (s_nEndBlock - pc) / 4 + 1, xmmregs[i].type, xmmregs[i].reg); + if (count > 0) + xmmregs[i].counter = 1000 - count; + else + xmmregs[i].counter = 0; + } + } + } + + if (g_pCurInstInfo->info & EEINST_COP2_FLUSH_VU0_REGISTERS) + { + RALOG("Flushing cop2 registers\n"); + _flushCOP2regs(); } const OPCODE& opcode = GetCurrentInstruction(); @@ -1481,12 +1838,28 @@ void recompileNextInstruction(int delayslot) case 1: switch (_Rt_) { - case 0: case 1: case 2: case 3: case 0x10: case 0x11: case 0x12: case 0x13: + case 0: + case 1: + case 2: + case 3: + case 0x10: + case 0x11: + case 0x12: + case 0x13: check_branch_delay = true; } break; - case 2: case 3: case 4: case 5: case 6: case 7: case 0x14: case 0x15: case 0x16: case 0x17: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 0x14: + case 0x15: + case 0x16: + case 0x17: check_branch_delay = true; } // Check for branch in delay slot, new code by FlatOut. @@ -1517,31 +1890,15 @@ void recompileNextInstruction(int delayslot) { //If the COP0 DIE bit is disabled, cycles should be doubled. s_nBlockCycles += opcode.cycles * (2 - ((cpuRegs.CP0.n.Config >> 18) & 0x1)); - try - { - opcode.recompile(); - } - catch (Exception::FailedToAllocateRegister&) - { - // Fall back to the interpreter - recCall(opcode.interpret); -#if 0 - // TODO: Free register ? - // _freeXMMregs(); -#endif - } + opcode.recompile(); } - if (!delayslot && (_getNumXMMwrite() > 2)) - _flushXMMunused(); - - //CHECK_XMMCHANGED(); - _clearNeededX86regs(); - _clearNeededXMMregs(); - -// _freeXMMregs(); -// _flushCachedRegs(); -// g_cpuHasConstReg = 1; + if (!swapped_delay_slot) + { + _clearNeededX86regs(); + _clearNeededXMMregs(); + } + _validateRegs(); if (delayslot) { @@ -1597,7 +1954,9 @@ void recompileNextInstruction(int delayslot) { disasm = ""; disR5900Fasm(disasm, memRead32(i), i, false); - Console.Warning("%x %s%08X %s", i, i == pc - 4 ? "*" : i == p ? "=" : " ", memRead32(i), disasm.c_str()); + Console.Warning("%x %s%08X %s", i, i == pc - 4 ? "*" : i == p ? "=" : + " ", + memRead32(i), disasm.c_str()); } break; } @@ -1620,8 +1979,10 @@ void recompileNextInstruction(int delayslot) for (u32 i = s_pCurBlockEx->startpc; i < s_nEndBlock; i += 4) { disasm = ""; - disR5900Fasm(disasm, memRead32(i), i,false); - Console.Warning("%x %s%08X %s", i, i == pc - 4 ? "*" : i == p ? "=" : " ", memRead32(i), disasm.c_str()); + disR5900Fasm(disasm, memRead32(i), i, false); + Console.Warning("%x %s%08X %s", i, i == pc - 4 ? "*" : i == p ? "=" : + " ", + memRead32(i), disasm.c_str()); } break; } @@ -1638,8 +1999,11 @@ void recompileNextInstruction(int delayslot) } cpuRegs.code = *s_pCode; - if (!delayslot && (xGetPtr() - recPtr > 0x1000)) - s_nEndBlock = pc; + if (swapped_delay_slot) + { + cpuRegs.code = old_code; + g_pCurInstInfo = old_inst_info; + } } // (Called from recompiled code)] @@ -1661,6 +2025,57 @@ static void PreBlockCheck(u32 blockpc) lastrec = blockpc; }*/ + +#ifdef TRACE_BLOCKS +#if 0 + static FILE* fp = nullptr; + static bool fp_opened = false; + if (!fp_opened && cpuRegs.cycle >= 0) + { + fp = std::fopen("C:\\Dumps\\comp\\reglog.txt", "wb"); + fp_opened = true; + } + if (fp) + { + u32 hash = crc32(0, (Bytef*)&cpuRegs, offsetof(cpuRegisters, pc)); + u32 hashf = crc32(0, (Bytef*)&fpuRegs, sizeof(fpuRegisters)); + u32 hashi = crc32(0, (Bytef*)&VU0, offsetof(VURegs, idx)); + +#if 1 + std::fprintf(fp, "%08X (%u; %08X; %08X; %08X):", cpuRegs.pc, cpuRegs.cycle, hash, hashf, hashi); + for (int i = 0; i < 34; i++) + { + std::fprintf(fp, " %s: %08X%08X%08X%08X", R3000A::disRNameGPR[i], cpuRegs.GPR.r[i].UL[3], cpuRegs.GPR.r[i].UL[2], cpuRegs.GPR.r[i].UL[1], cpuRegs.GPR.r[i].UL[0]); + } +#if 1 + std::fprintf(fp, "\nFPR: CR: %08X ACC: %08X", fpuRegs.fprc[31], fpuRegs.ACC.UL); + for (int i = 0; i < 32; i++) + std::fprintf(fp, " %08X", fpuRegs.fpr[i].UL); +#endif +#if 1 + std::fprintf(fp, "\nVF: "); + for (int i = 0; i < 32; i++) + std::fprintf(fp, " %u: %08X %08X %08X %08X", i, VU0.VF[i].UL[0], VU0.VF[i].UL[1], VU0.VF[i].UL[2], VU0.VF[i].UL[3]); + std::fprintf(fp, "\nVI: "); + for (int i = 0; i < 32; i++) + std::fprintf(fp, " %u: %08X", i, VU0.VI[i].UL); + std::fprintf(fp, "\nACC: %08X %08X %08X %08X Q: %08X P: %08X", VU0.ACC.UL[0], VU0.ACC.UL[1], VU0.ACC.UL[2], VU0.ACC.UL[3], VU0.q.UL, VU0.p.UL); + std::fprintf(fp, " MAC %08X %08X %08X %08X", VU0.micro_macflags[3], VU0.micro_macflags[2], VU0.micro_macflags[1], VU0.micro_macflags[0]); + std::fprintf(fp, " CLIP %08X %08X %08X %08X", VU0.micro_clipflags[3], VU0.micro_clipflags[2], VU0.micro_clipflags[1], VU0.micro_clipflags[0]); + std::fprintf(fp, " STATUS %08X %08X %08X %08X", VU0.micro_statusflags[3], VU0.micro_statusflags[2], VU0.micro_statusflags[1], VU0.micro_statusflags[0]); +#endif + std::fprintf(fp, "\n"); +#else + std::fprintf(fp, "%08X (%u): %08X %08X %08X\n", cpuRegs.pc, cpuRegs.cycle, hash, hashf, hashi); +#endif + // std::fflush(fp); + } +#endif +#if 0 + if (cpuRegs.cycle == 0) + pauseAAA(); +#endif +#endif } #ifdef PCSX2_DEBUG @@ -1691,7 +2106,7 @@ void dyna_page_reset(u32 start, u32 sz) static void memory_protect_recompiled_code(u32 startpc, u32 size) { u32 inpage_ptr = HWADDR(startpc); - u32 inpage_sz = size * 4; + u32 inpage_sz = size * 4; // The kernel context register is stored @ 0x800010C0-0x80001300 // The EENULL thread context register is stored @ 0x81000-.... @@ -1816,7 +2231,6 @@ static void recRecompile(const u32 startpc) { u32 i = 0; u32 willbranch3 = 0; - u32 usecop2; #ifdef PCSX2_DEBUG if (dumplog & 4) @@ -1827,14 +2241,7 @@ static void recRecompile(const u32 startpc) // if recPtr reached the mem limit reset whole mem if (recPtr >= (recMem->GetPtrEnd() - _64kb)) - { eeRecNeedsReset = true; - } - else if ((recConstBufPtr - recConstBuf) >= RECCONSTBUF_SIZE - 64) - { - Console.WriteLn("EE recompiler stack reset"); - eeRecNeedsReset = true; - } if (eeRecNeedsReset) recResetRaw(); @@ -1847,8 +2254,7 @@ static void recRecompile(const u32 startpc) s_pCurBlock = PC_GETBLOCK(startpc); - pxAssert(s_pCurBlock->GetFnptr() == (uptr)JITCompile - || s_pCurBlock->GetFnptr() == (uptr)JITCompileInBlock); + pxAssert(s_pCurBlock->GetFnptr() == (uptr)JITCompile || s_pCurBlock->GetFnptr() == (uptr)JITCompileInBlock); s_pCurBlockEx = recBlocks.Get(HWADDR(startpc)); pxAssert(!s_pCurBlockEx || s_pCurBlockEx->startpc != HWADDR(startpc)); @@ -1925,14 +2331,9 @@ static void recRecompile(const u32 startpc) _initX86regs(); _initXMMregs(); - if (EmuConfig.Cpu.Recompiler.PreBlockCheckEE) - { - // per-block dump checks, for debugging purposes. - // [TODO] : These must be enabled from the GUI or INI to be used, otherwise the - // code that calls PreBlockCheck will not be generated. - - xFastCall((void*)PreBlockCheck, pc); - } +#ifdef TRACE_BLOCKS + xFastCall((void*)PreBlockCheck, pc); +#endif if (EmuConfig.Gamefixes.GoemonTlbHack) { @@ -2030,8 +2431,14 @@ static void recRecompile(const u32 startpc) goto StartRecomp; // branches - case 4: case 5: case 6: case 7: - case 20: case 21: case 22: case 23: + case 4: + case 5: + case 6: + case 7: + case 20: + case 21: + case 22: + case 23: s_branchTo = _Imm_ * 4 + i + 4; if (s_branchTo > startpc && s_branchTo < i) s_nEndBlock = s_branchTo; @@ -2183,9 +2590,10 @@ StartRecomp: { cpuRegs.code = *(int*)PSM(i - 4); pcur[-1] = pcur[0]; + recBackpropBSC(cpuRegs.code, pcur - 1, pcur); pcur--; - has_cop2_instructions |= (_Opcode_ == 022); + has_cop2_instructions |= (_Opcode_ == 022 || _Opcode_ == 066 || _Opcode_ == 076); } } @@ -2198,49 +2606,6 @@ StartRecomp: COP2FlagHackPass().Run(startpc, s_nEndBlock, s_pInstCache + 1); } - // analyze instructions // - { - usecop2 = 0; - g_pCurInstInfo = s_pInstCache; - - for (i = startpc; i < s_nEndBlock; i += 4) - { - g_pCurInstInfo++; - cpuRegs.code = *(u32*)PSM(i); - - // cop2 // - if (g_pCurInstInfo->info & EEINSTINFO_COP2) - { - - if (!usecop2) - { - // init - usecop2 = 1; - } - - VU0.code = cpuRegs.code; - continue; - } - } - // This *is* important because g_pCurInstInfo is checked a bit later on and - // if it's not equal to s_pInstCache it handles recompilation differently. - // ... but the empty if() conditional inside the for loop is still amusing. >_< - if (usecop2) - { - // add necessary mac writebacks - g_pCurInstInfo = s_pInstCache; - - for (i = startpc; i < s_nEndBlock - 4; i += 4) - { - g_pCurInstInfo++; - - if (g_pCurInstInfo->info & EEINSTINFO_COP2) - { - } - } - } - } - #ifdef PCSX2_DEBUG // dump code for (u32 recblock : s_recblocks) @@ -2255,6 +2620,26 @@ StartRecomp: iDumpBlock(startpc, recPtr); #endif +#ifdef DUMP_BLOCKS + ZydisDecoder disas_decoder; + ZydisDecoderInit(&disas_decoder, ZYDIS_MACHINE_MODE_LONG_64, ZYDIS_ADDRESS_WIDTH_64); + + ZydisFormatter disas_formatter; + ZydisFormatterInit(&disas_formatter, ZYDIS_FORMATTER_STYLE_INTEL); + + s_old_print_address = (ZydisFormatterFunc)&ZydisFormatterPrintAddressAbsolute; + ZydisFormatterSetHook(&disas_formatter, ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS, (const void**)&s_old_print_address); + + ZydisDecodedInstruction disas_instruction; +#if 0 + const bool dump_block = (startpc == 0x00000000); +#elif 1 + const bool dump_block = true; +#else + const bool dump_block = false; +#endif +#endif + // Detect and handle self-modified code memory_protect_recompiled_code(startpc, (s_nEndBlock - startpc) >> 2); @@ -2267,7 +2652,35 @@ StartRecomp: g_pCurInstInfo = s_pInstCache; while (!g_branch && pc < s_nEndBlock) { - recompileNextInstruction(0); // For the love of recursion, batman! +#ifdef DUMP_BLOCKS + if (dump_block) + { + std::string disasm; + disR5900Fasm(disasm, *(u32*)PSM(pc), pc, false); + fprintf(stderr, "Compiling %08X %s\n", pc, disasm.c_str()); + + const u8* instStart = x86Ptr; + recompileNextInstruction(false, false); + + const u8* instPtr = instStart; + ZyanUSize instLength = static_cast(x86Ptr - instStart); + while (ZYAN_SUCCESS(ZydisDecoderDecodeBuffer(&disas_decoder, instPtr, instLength, &disas_instruction))) + { + char buffer[256]; + if (ZYAN_SUCCESS(ZydisFormatterFormatInstruction(&disas_formatter, &disas_instruction, buffer, sizeof(buffer), (ZyanU64)instPtr))) + std::fprintf(stderr, " %016" PRIX64 " %s\n", (u64)instPtr, buffer); + + instPtr += disas_instruction.length; + instLength -= disas_instruction.length; + } + } + else + { + recompileNextInstruction(false, false); + } +#else + recompileNextInstruction(false, false); // For the love of recursion, batman! +#endif } } @@ -2358,7 +2771,6 @@ StartRecomp: } pxAssert(xGetPtr() < recMem->GetPtrEnd()); - pxAssert(recConstBufPtr < recConstBuf + RECCONSTBUF_SIZE); pxAssert(xGetPtr() - recPtr < _64kb); s_pCurBlockEx->x86size = xGetPtr() - recPtr; @@ -2394,22 +2806,11 @@ static void recThrowException(const BaseException& ex) { if (!eeCpuExecuting) ex.Rethrow(); - m_Exception = ScopedExcept(ex.Clone()); + m_Exception = std::unique_ptr(ex.Clone()); recExitExecution(); } -static void recSetCacheReserve(uint reserveInMegs) -{ - m_ConfiguredCacheReserve = reserveInMegs; -} - -static uint recGetCacheReserve() -{ - return m_ConfiguredCacheReserve; -} - -R5900cpu recCpu = -{ +R5900cpu recCpu = { recReserve, recShutdown, @@ -2420,8 +2821,4 @@ R5900cpu recCpu = recSafeExitExecution, recThrowException, recThrowException, - recClear, - - recGetCacheReserve, - recSetCacheReserve, -}; + recClear}; diff --git a/pcsx2/x86/ix86-32/iR5900Arit.cpp b/pcsx2/x86/ix86-32/iR5900Arit.cpp index fd6dd4c8dc..9ade81fc77 100644 --- a/pcsx2/x86/ix86-32/iR5900Arit.cpp +++ b/pcsx2/x86/ix86-32/iR5900Arit.cpp @@ -22,10 +22,8 @@ using namespace x86Emitter; -namespace R5900 { -namespace Dynarec { -namespace OpcodeImpl { - +namespace R5900::Dynarec::OpcodeImpl +{ /********************************************************* * Register arithmetic * * Format: OP rd, rs, rt * @@ -37,67 +35,126 @@ namespace OpcodeImpl { namespace Interp = R5900::Interpreter::OpcodeImpl; -REC_FUNC_DEL(ADD, _Rd_); -REC_FUNC_DEL(ADDU, _Rd_); -REC_FUNC_DEL(DADD, _Rd_); +REC_FUNC_DEL(ADD, _Rd_); +REC_FUNC_DEL(ADDU, _Rd_); +REC_FUNC_DEL(DADD, _Rd_); REC_FUNC_DEL(DADDU, _Rd_); -REC_FUNC_DEL(SUB, _Rd_); -REC_FUNC_DEL(SUBU, _Rd_); -REC_FUNC_DEL(DSUB, _Rd_); +REC_FUNC_DEL(SUB, _Rd_); +REC_FUNC_DEL(SUBU, _Rd_); +REC_FUNC_DEL(DSUB, _Rd_); REC_FUNC_DEL(DSUBU, _Rd_); -REC_FUNC_DEL(AND, _Rd_); -REC_FUNC_DEL(OR, _Rd_); -REC_FUNC_DEL(XOR, _Rd_); -REC_FUNC_DEL(NOR, _Rd_); -REC_FUNC_DEL(SLT, _Rd_); -REC_FUNC_DEL(SLTU, _Rd_); +REC_FUNC_DEL(AND, _Rd_); +REC_FUNC_DEL(OR, _Rd_); +REC_FUNC_DEL(XOR, _Rd_); +REC_FUNC_DEL(NOR, _Rd_); +REC_FUNC_DEL(SLT, _Rd_); +REC_FUNC_DEL(SLTU, _Rd_); #else +static void recMoveStoD(int info) +{ + if (info & PROCESS_EE_S) + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + else + xMOV(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]); +} + +static void recMoveStoD64(int info) +{ + if (info & PROCESS_EE_S) + xMOV(xRegister64(EEREC_D), xRegister64(EEREC_S)); + else + xMOV(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); +} + +static void recMoveTtoD(int info) +{ + if (info & PROCESS_EE_T) + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_T)); + else + xMOV(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); +} + +static void recMoveTtoD64(int info) +{ + if (info & PROCESS_EE_T) + xMOV(xRegister64(EEREC_D), xRegister64(EEREC_T)); + else + xMOV(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]]); +} + //// ADD -void recADD_const() +static void recADD_const() { g_cpuConstRegs[_Rd_].SD[0] = s64(s32(g_cpuConstRegs[_Rs_].UL[0] + g_cpuConstRegs[_Rt_].UL[0])); } -void recADD_constv(int info, int creg, u32 vreg) +// s is constant +static void recADD_consts(int info) { pxAssert(!(info & PROCESS_EE_XMM)); - s32 cval = g_cpuConstRegs[creg].SL[0]; - - xMOV(eax, ptr32[&cpuRegs.GPR.r[vreg].SL[0]]); - if (cval) - xADD(eax, cval); - eeSignExtendTo(_Rd_, _Rd_ == vreg && !cval); -} - -// s is constant -void recADD_consts(int info) -{ - recADD_constv(info, _Rs_, _Rt_); + const s32 cval = g_cpuConstRegs[_Rs_].SL[0]; + recMoveTtoD(info); + if (cval != 0) + xADD(xRegister32(EEREC_D), cval); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); } // t is constant -void recADD_constt(int info) -{ - recADD_constv(info, _Rt_, _Rs_); -} - -// nothing is constant -void recADD_(int info) +static void recADD_constt(int info) { pxAssert(!(info & PROCESS_EE_XMM)); - xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rs_].SL[0]]); - if (_Rs_ == _Rt_) - xADD(eax, eax); - else - xADD(eax, ptr32[&cpuRegs.GPR.r[_Rt_].SL[0]]); - eeSignExtendTo(_Rd_); + const s32 cval = g_cpuConstRegs[_Rt_].SL[0]; + recMoveStoD(info); + if (cval != 0) + xADD(xRegister32(EEREC_D), cval); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); } -EERECOMPILE_CODE0(ADD, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); +// nothing is constant +static void recADD_(int info) +{ + pxAssert(!(info & PROCESS_EE_XMM)); + + if ((info & PROCESS_EE_S) && (info & PROCESS_EE_T)) + { + if (EEREC_D == EEREC_S) + { + xADD(xRegister32(EEREC_D), xRegister32(EEREC_T)); + } + else if (EEREC_D == EEREC_T) + { + xADD(xRegister32(EEREC_D), xRegister32(EEREC_S)); + } + else + { + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + xADD(xRegister32(EEREC_D), xRegister32(EEREC_T)); + } + } + else if (info & PROCESS_EE_S) + { + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + xADD(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rt_].UD[0]]); + } + else if (info & PROCESS_EE_T) + { + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_T)); + xADD(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rs_].UD[0]]); + } + else + { + xMOV(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rs_].UD[0]]); + xADD(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rt_].UD[0]]); + } + + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); +} + +EERECOMPILE_CODERC0(ADD, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); //// ADDU void recADDU(void) @@ -111,77 +168,67 @@ void recDADD_const(void) g_cpuConstRegs[_Rd_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] + g_cpuConstRegs[_Rt_].UD[0]; } -void recDADD_constv(int info, int creg, u32 vreg) +// s is constant +static void recDADD_consts(int info) { pxAssert(!(info & PROCESS_EE_XMM)); - GPR_reg64 cval = g_cpuConstRegs[creg]; + const s64 cval = g_cpuConstRegs[_Rs_].SD[0]; + recMoveTtoD64(info); + if (cval != 0) + xImm64Op(xADD, xRegister64(EEREC_D), rax, cval); +} - if (_Rd_ == vreg) +// t is constant +static void recDADD_constt(int info) +{ + pxAssert(!(info & PROCESS_EE_XMM)); + + const s64 cval = g_cpuConstRegs[_Rt_].SD[0]; + recMoveStoD64(info); + if (cval != 0) + xImm64Op(xADD, xRegister64(EEREC_D), rax, cval); +} + +// nothing is constant +static void recDADD_(int info) +{ + pxAssert(!(info & PROCESS_EE_XMM)); + + if ((info & PROCESS_EE_S) && (info & PROCESS_EE_T)) { - if (!cval.SD[0]) - return; // no-op - xImm64Op(xADD, ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]], rax, cval.SD[0]); - } - else - { - if (cval.SD[0]) + if (EEREC_D == EEREC_S) { - xMOV64(rax, cval.SD[0]); - xADD(rax, ptr64[&cpuRegs.GPR.r[vreg].SD[0]]); + xADD(xRegister64(EEREC_D), xRegister64(EEREC_T)); + } + else if (EEREC_D == EEREC_T) + { + xADD(xRegister64(EEREC_D), xRegister64(EEREC_S)); } else { - xMOV(rax, ptr64[&cpuRegs.GPR.r[vreg].SD[0]]); + xMOV(xRegister64(EEREC_D), xRegister64(EEREC_S)); + xADD(xRegister64(EEREC_D), xRegister64(EEREC_T)); } - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]], rax); } -} - -void recDADD_consts(int info) -{ - recDADD_constv(info, _Rs_, _Rt_); -} - -void recDADD_constt(int info) -{ - recDADD_constv(info, _Rt_, _Rs_); -} - -void recDADD_(int info) -{ - pxAssert(!(info & PROCESS_EE_XMM)); - - u32 rs = _Rs_, rt = _Rt_; - if (_Rd_ == _Rt_) - rs = _Rt_, rt = _Rs_; - - if (_Rd_ == _Rs_ && _Rs_ == _Rt_) + else if (info & PROCESS_EE_S) { - xSHL(ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]], 1); - return; + xMOV(xRegister64(EEREC_D), xRegister64(EEREC_S)); + xADD(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]]); } - - xMOV(rax, ptr64[&cpuRegs.GPR.r[rt].SD[0]]); - - if (_Rd_ == rs) + else if (info & PROCESS_EE_T) { - xADD(ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]], rax); - return; - } - else if (rs == rt) - { - xADD(rax, rax); + xMOV(xRegister64(EEREC_D), xRegister64(EEREC_T)); + xADD(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); } else { - xADD(rax, ptr32[&cpuRegs.GPR.r[rs].SD[0]]); + xMOV(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); + xADD(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]]); } - - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]], rax); } -EERECOMPILE_CODE0(DADD, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT); +EERECOMPILE_CODERC0(DADD, XMMINFO_WRITED | XMMINFO_READS | XMMINFO_READT | XMMINFO_64BITOP); //// DADDU void recDADDU(void) @@ -191,50 +238,92 @@ void recDADDU(void) //// SUB -void recSUB_const() +static void recSUB_const() { g_cpuConstRegs[_Rd_].SD[0] = s64(s32(g_cpuConstRegs[_Rs_].UL[0] - g_cpuConstRegs[_Rt_].UL[0])); } -void recSUB_consts(int info) +static void recSUB_consts(int info) { pxAssert(!(info & PROCESS_EE_XMM)); - s32 sval = g_cpuConstRegs[_Rs_].SL[0]; - + const s32 sval = g_cpuConstRegs[_Rs_].SL[0]; xMOV(eax, sval); - xSUB(eax, ptr32[&cpuRegs.GPR.r[_Rt_].SL[0]]); - eeSignExtendTo(_Rd_); + + if (info & PROCESS_EE_T) + xSUB(eax, xRegister32(EEREC_T)); + else + xSUB(eax, ptr32[&cpuRegs.GPR.r[_Rt_].SL[0]]); + + xMOVSX(xRegister64(EEREC_D), eax); } -void recSUB_constt(int info) +static void recSUB_constt(int info) { pxAssert(!(info & PROCESS_EE_XMM)); - s32 tval = g_cpuConstRegs[_Rt_].SL[0]; + const s32 tval = g_cpuConstRegs[_Rt_].SL[0]; + recMoveStoD(info); + if (tval != 0) + xSUB(xRegister32(EEREC_D), tval); - xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rs_].SL[0]]); - if (tval) - xSUB(eax, tval); - eeSignExtendTo(_Rd_, _Rd_ == _Rs_ && !tval); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); } -void recSUB_(int info) +static void recSUB_(int info) { pxAssert(!(info & PROCESS_EE_XMM)); if (_Rs_ == _Rt_) { - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]], 0); + xXOR(xRegister32(EEREC_D), xRegister32(EEREC_D)); return; } - xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rs_].SL[0]]); - xSUB(eax, ptr32[&cpuRegs.GPR.r[_Rt_].SL[0]]); - eeSignExtendTo(_Rd_); + // a bit messier here because it's not commutative.. + if ((info & PROCESS_EE_S) && (info & PROCESS_EE_T)) + { + if (EEREC_D == EEREC_S) + { + xSUB(xRegister32(EEREC_D), xRegister32(EEREC_T)); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); + } + else if (EEREC_D == EEREC_T) + { + // D might equal T + xMOV(eax, xRegister32(EEREC_S)); + xSUB(eax, xRegister32(EEREC_T)); + xMOVSX(xRegister64(EEREC_D), eax); + } + else + { + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + xSUB(xRegister32(EEREC_D), xRegister32(EEREC_T)); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); + } + } + else if (info & PROCESS_EE_S) + { + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_S)); + xSUB(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); + } + else if (info & PROCESS_EE_T) + { + // D might equal T + xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]); + xSUB(eax, xRegister32(EEREC_T)); + xMOVSX(xRegister64(EEREC_D), eax); + } + else + { + xMOV(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]); + xSUB(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); + } } -EERECOMPILE_CODE0(SUB, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(SUB, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); //// SUBU void recSUBU(void) @@ -243,74 +332,79 @@ void recSUBU(void) } //// DSUB -void recDSUB_const() +static void recDSUB_const() { g_cpuConstRegs[_Rd_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] - g_cpuConstRegs[_Rt_].UD[0]; } -void recDSUB_consts(int info) +static void recDSUB_consts(int info) { pxAssert(!(info & PROCESS_EE_XMM)); - GPR_reg64 sval = g_cpuConstRegs[_Rs_]; + // gross, because if d == t, we can't destroy t + const s64 sval = g_cpuConstRegs[_Rs_].SD[0]; + const xRegister64 regd((info & PROCESS_EE_T && EEREC_D == EEREC_T) ? rax.GetId() : EEREC_D); + xMOV64(regd, sval); - if (!sval.SD[0] && _Rd_ == _Rt_) - { - xNEG(ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]]); - return; - } + if (info & PROCESS_EE_T) + xSUB(regd, xRegister64(EEREC_T)); else - { - xMOV64(rax, sval.SD[0]); - } + xSUB(regd, ptr64[&cpuRegs.GPR.r[_Rt_].SD[0]]); - xSUB(rax, ptr32[&cpuRegs.GPR.r[_Rt_].SD[0]]); - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].SL[0]], rax); + // emitter will eliminate redundant moves. + xMOV(xRegister64(EEREC_D), regd); } -void recDSUB_constt(int info) +static void recDSUB_constt(int info) { pxAssert(!(info & PROCESS_EE_XMM)); - GPR_reg64 tval = g_cpuConstRegs[_Rt_]; - - if (_Rd_ == _Rs_) - { - xImm64Op(xSUB, ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]], rax, tval.SD[0]); - } - else - { - xMOV(rax, ptr64[&cpuRegs.GPR.r[_Rs_].SD[0]]); - if (tval.SD[0]) - { - xImm64Op(xSUB, rax, rdx, tval.SD[0]); - } - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].SL[0]], rax); - } + const s64 tval = g_cpuConstRegs[_Rt_].SD[0]; + recMoveStoD64(info); + if (tval != 0) + xImm64Op(xSUB, xRegister64(EEREC_D), rax, tval); } -void recDSUB_(int info) +static void recDSUB_(int info) { pxAssert(!(info & PROCESS_EE_XMM)); if (_Rs_ == _Rt_) { - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]], 0); + xXOR(xRegister32(EEREC_D), xRegister32(EEREC_D)); + return; } - else if (_Rd_ == _Rs_) + + // a bit messier here because it's not commutative.. + if ((info & PROCESS_EE_S) && (info & PROCESS_EE_T)) { - xMOV(rax, ptr64[&cpuRegs.GPR.r[_Rt_].SD[0]]); - xSUB(ptr64[&cpuRegs.GPR.r[_Rd_].SD[0]], rax); + // D might equal T + const xRegister64 regd(EEREC_D == EEREC_T ? rax.GetId() : EEREC_D); + xMOV(regd, xRegister64(EEREC_S)); + xSUB(regd, xRegister64(EEREC_T)); + xMOV(xRegister64(EEREC_D), regd); + } + else if (info & PROCESS_EE_S) + { + xMOV(xRegister64(EEREC_D), xRegister64(EEREC_S)); + xSUB(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]]); + } + else if (info & PROCESS_EE_T) + { + // D might equal T + const xRegister64 regd(EEREC_D == EEREC_T ? rax.GetId() : EEREC_D); + xMOV(regd, ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); + xSUB(regd, xRegister64(EEREC_T)); + xMOV(xRegister64(EEREC_D), regd); } else { - xMOV(rax, ptr64[&cpuRegs.GPR.r[_Rs_].SD[0]]); - xSUB(rax, ptr64[&cpuRegs.GPR.r[_Rt_].SD[0]]); - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].SL[0]], rax); + xMOV(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); + xSUB(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]]); } } -EERECOMPILE_CODE0(DSUB, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(DSUB, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_64BITOP); //// DSUBU void recDSUBU(void) @@ -320,24 +414,24 @@ void recDSUBU(void) namespace { - enum class LogicalOp - { - AND, - OR, - XOR, - NOR - }; +enum class LogicalOp +{ + AND, + OR, + XOR, + NOR +}; } // namespace -static void recLogicalOp_constv(LogicalOp op, int info, int creg, u32 vreg) +static void recLogicalOp_constv(LogicalOp op, int info, int creg, u32 vreg, int regv) { pxAssert(!(info & PROCESS_EE_XMM)); xImpl_G1Logic bad{}; - const xImpl_G1Logic& xOP = op == LogicalOp::AND ? xAND - : op == LogicalOp::OR ? xOR - : op == LogicalOp::XOR ? xXOR - : op == LogicalOp::NOR ? xOR : bad; + const xImpl_G1Logic& xOP = op == LogicalOp::AND ? xAND : op == LogicalOp::OR ? xOR : + op == LogicalOp::XOR ? xXOR : + op == LogicalOp::NOR ? xOR : + bad; s64 fixedInput, fixedOutput, identityInput; bool hasFixed = true; switch (op) @@ -369,29 +463,18 @@ static void recLogicalOp_constv(LogicalOp op, int info, int creg, u32 vreg) if (hasFixed && cval.SD[0] == fixedInput) { - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], fixedOutput); - } - else if (_Rd_ == vreg) - { - if (cval.SD[0] != identityInput) - xImm64Op(xOP, ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax, cval.UD[0]); - if (op == LogicalOp::NOR) - xNOT(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]]); + xMOV64(xRegister64(EEREC_D), fixedOutput); } else { - if (cval.SD[0] != identityInput) - { - xMOV64(rax, cval.SD[0]); - xOP(rax, ptr32[&cpuRegs.GPR.r[vreg].UD[0]]); - } + if (regv >= 0) + xMOV(xRegister64(EEREC_D), xRegister64(regv)); else - { - xMOV(rax, ptr32[&cpuRegs.GPR.r[vreg].UD[0]]); - } + xMOV(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[vreg].UD[0]]); + if (cval.SD[0] != identityInput) + xImm64Op(xOP, xRegister64(EEREC_D), rax, cval.UD[0]); if (op == LogicalOp::NOR) - xNOT(rax); - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + xNOT(xRegister64(EEREC_D)); } } @@ -400,208 +483,234 @@ static void recLogicalOp(LogicalOp op, int info) pxAssert(!(info & PROCESS_EE_XMM)); xImpl_G1Logic bad{}; - const xImpl_G1Logic& xOP = op == LogicalOp::AND ? xAND - : op == LogicalOp::OR ? xOR - : op == LogicalOp::XOR ? xXOR - : op == LogicalOp::NOR ? xOR : bad; + const xImpl_G1Logic& xOP = op == LogicalOp::AND ? xAND : op == LogicalOp::OR ? xOR : + op == LogicalOp::XOR ? xXOR : + op == LogicalOp::NOR ? xOR : + bad; pxAssert(&xOP != &bad); + // swap because it's commutative and Rd might be Rt u32 rs = _Rs_, rt = _Rt_; + int regs = (info & PROCESS_EE_S) ? EEREC_S : -1, regt = (info & PROCESS_EE_T) ? EEREC_T : -1; if (_Rd_ == _Rt_) - rs = _Rt_, rt = _Rs_; + { + std::swap(rs, rt); + std::swap(regs, regt); + } if (op == LogicalOp::XOR && rs == rt) { - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], 0); - } - else if (_Rd_ == rs) - { - if (rs != rt) - { - xMOV(rax, ptr64[&cpuRegs.GPR.r[rt].UD[0]]); - xOP(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); - } - if (op == LogicalOp::NOR) - xNOT(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]]); + xXOR(xRegister32(EEREC_D), xRegister32(EEREC_D)); } else { - xMOV(rax, ptr64[&cpuRegs.GPR.r[rs].UD[0]]); - if (rs != rt) - xOP(rax, ptr64[&cpuRegs.GPR.r[rt].UD[0]]); + if (regs >= 0) + xMOV(xRegister64(EEREC_D), xRegister64(regs)); + else + xMOV(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[rs].UD[0]]); + + if (regt >= 0) + xOP(xRegister64(EEREC_D), xRegister64(regt)); + else + xOP(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[rt].UD[0]]); + if (op == LogicalOp::NOR) - xNOT(rax); - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + xNOT(xRegister64(EEREC_D)); } } //// AND -void recAND_const() +static void recAND_const() { g_cpuConstRegs[_Rd_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] & g_cpuConstRegs[_Rt_].UD[0]; } -void recAND_consts(int info) +static void recAND_consts(int info) { - recLogicalOp_constv(LogicalOp::AND, info, _Rs_, _Rt_); + recLogicalOp_constv(LogicalOp::AND, info, _Rs_, _Rt_, (info & PROCESS_EE_T) ? EEREC_T : -1); } -void recAND_constt(int info) +static void recAND_constt(int info) { - recLogicalOp_constv(LogicalOp::AND, info, _Rt_, _Rs_); + recLogicalOp_constv(LogicalOp::AND, info, _Rt_, _Rs_, (info & PROCESS_EE_S) ? EEREC_S : -1); } -void recAND_(int info) +static void recAND_(int info) { recLogicalOp(LogicalOp::AND, info); } -EERECOMPILE_CODE0(AND, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(AND, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_64BITOP); //// OR -void recOR_const() +static void recOR_const() { g_cpuConstRegs[_Rd_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] | g_cpuConstRegs[_Rt_].UD[0]; } -void recOR_consts(int info) +static void recOR_consts(int info) { - recLogicalOp_constv(LogicalOp::OR, info, _Rs_, _Rt_); + recLogicalOp_constv(LogicalOp::OR, info, _Rs_, _Rt_, (info & PROCESS_EE_T) ? EEREC_T : -1); } -void recOR_constt(int info) +static void recOR_constt(int info) { - recLogicalOp_constv(LogicalOp::OR, info, _Rt_, _Rs_); + recLogicalOp_constv(LogicalOp::OR, info, _Rt_, _Rs_, (info & PROCESS_EE_S) ? EEREC_S : -1); } -void recOR_(int info) +static void recOR_(int info) { recLogicalOp(LogicalOp::OR, info); } -EERECOMPILE_CODE0(OR, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(OR, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_64BITOP); //// XOR -void recXOR_const() +static void recXOR_const() { g_cpuConstRegs[_Rd_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] ^ g_cpuConstRegs[_Rt_].UD[0]; } -void recXOR_consts(int info) +static void recXOR_consts(int info) { - recLogicalOp_constv(LogicalOp::XOR, info, _Rs_, _Rt_); + recLogicalOp_constv(LogicalOp::XOR, info, _Rs_, _Rt_, (info & PROCESS_EE_T) ? EEREC_T : -1); } -void recXOR_constt(int info) +static void recXOR_constt(int info) { - recLogicalOp_constv(LogicalOp::XOR, info, _Rt_, _Rs_); + recLogicalOp_constv(LogicalOp::XOR, info, _Rt_, _Rs_, (info & PROCESS_EE_S) ? EEREC_S : -1); } -void recXOR_(int info) +static void recXOR_(int info) { recLogicalOp(LogicalOp::XOR, info); } -EERECOMPILE_CODE0(XOR, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(XOR, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_64BITOP); //// NOR -void recNOR_const() +static void recNOR_const() { g_cpuConstRegs[_Rd_].UD[0] = ~(g_cpuConstRegs[_Rs_].UD[0] | g_cpuConstRegs[_Rt_].UD[0]); } -void recNOR_consts(int info) +static void recNOR_consts(int info) { - recLogicalOp_constv(LogicalOp::NOR, info, _Rs_, _Rt_); + recLogicalOp_constv(LogicalOp::NOR, info, _Rs_, _Rt_, (info & PROCESS_EE_T) ? EEREC_T : -1); } -void recNOR_constt(int info) +static void recNOR_constt(int info) { - recLogicalOp_constv(LogicalOp::NOR, info, _Rt_, _Rs_); + recLogicalOp_constv(LogicalOp::NOR, info, _Rt_, _Rs_, (info & PROCESS_EE_S) ? EEREC_S : -1); } -void recNOR_(int info) +static void recNOR_(int info) { recLogicalOp(LogicalOp::NOR, info); } -EERECOMPILE_CODE0(NOR, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(NOR, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_64BITOP); //// SLT - test with silent hill, lemans -void recSLT_const() +static void recSLT_const() { g_cpuConstRegs[_Rd_].UD[0] = g_cpuConstRegs[_Rs_].SD[0] < g_cpuConstRegs[_Rt_].SD[0]; } -void recSLTs_const(int info, int sign, int st) +static void recSLTs_const(int info, int sign, int st) { pxAssert(!(info & PROCESS_EE_XMM)); - GPR_reg64 cval = g_cpuConstRegs[st ? _Rt_ : _Rs_]; + const s64 cval = g_cpuConstRegs[st ? _Rt_ : _Rs_].SD[0]; const xImpl_Set& SET = st ? (sign ? xSETL : xSETB) : (sign ? xSETG : xSETA); - xXOR(eax, eax); - xImm64Op(xCMP, ptr64[&cpuRegs.GPR.r[st ? _Rs_ : _Rt_].UD[0]], rdx, cval.UD[0]); - SET(al); - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + // If Rd == Rs or Rt, we can't xor it before it's used. + // So, allocate a temporary register first, and then reallocate it to Rd. + const xRegister32 dreg((_Rd_ == (st ? _Rs_ : _Rt_)) ? _allocX86reg(X86TYPE_TEMP, 0, 0) : EEREC_D); + const int regs = st ? ((info & PROCESS_EE_S) ? EEREC_S : -1) : ((info & PROCESS_EE_T) ? EEREC_T : -1); + xXOR(dreg, dreg); + + if (regs >= 0) + xImm64Op(xCMP, xRegister64(regs), rcx, cval); + else + xImm64Op(xCMP, ptr64[&cpuRegs.GPR.r[st ? _Rs_ : _Rt_].UD[0]], rcx, cval); + SET(xRegister8(dreg)); + + if (dreg.GetId() != EEREC_D) + { + std::swap(x86regs[dreg.GetId()], x86regs[EEREC_D]); + _freeX86reg(EEREC_D); + } } -void recSLTs_(int info, int sign) +static void recSLTs_(int info, int sign) { pxAssert(!(info & PROCESS_EE_XMM)); const xImpl_Set& SET = sign ? xSETL : xSETB; - xXOR(eax, eax); - xMOV(rdx, ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); - xCMP(rdx, ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]]); - SET(al); - xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + // need to keep Rs/Rt around. + const xRegister32 dreg((_Rd_ == _Rt_ || _Rd_ == _Rs_) ? _allocX86reg(X86TYPE_TEMP, 0, 0) : EEREC_D); + + // force Rs into a register, may as well cache it since we're loading anyway. + const int regs = (info & PROCESS_EE_S) ? EEREC_S : _allocX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + + xXOR(dreg, dreg); + if (info & PROCESS_EE_T) + xCMP(xRegister64(regs), xRegister64(EEREC_T)); + else + xCMP(xRegister64(regs), ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]]); + + SET(xRegister8(dreg)); + + if (dreg.GetId() != EEREC_D) + { + std::swap(x86regs[dreg.GetId()], x86regs[EEREC_D]); + _freeX86reg(EEREC_D); + } } -void recSLT_consts(int info) +static void recSLT_consts(int info) { recSLTs_const(info, 1, 0); } -void recSLT_constt(int info) +static void recSLT_constt(int info) { recSLTs_const(info, 1, 1); } -void recSLT_(int info) +static void recSLT_(int info) { recSLTs_(info, 1); } -EERECOMPILE_CODE0(SLT, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(SLT, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_NORENAME); // SLTU - test with silent hill, lemans -void recSLTU_const() +static void recSLTU_const() { g_cpuConstRegs[_Rd_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] < g_cpuConstRegs[_Rt_].UD[0]; } -void recSLTU_consts(int info) +static void recSLTU_consts(int info) { recSLTs_const(info, 0, 0); } -void recSLTU_constt(int info) +static void recSLTU_constt(int info) { recSLTs_const(info, 0, 1); } -void recSLTU_(int info) +static void recSLTU_(int info) { recSLTs_(info, 0); } -EERECOMPILE_CODE0(SLTU, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(SLTU, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_NORENAME); #endif -} // namespace OpcodeImpl -} // namespace Dynarec -} // namespace R5900 +} // namespace R5900::Dynarec::OpcodeImpl diff --git a/pcsx2/x86/ix86-32/iR5900AritImm.cpp b/pcsx2/x86/ix86-32/iR5900AritImm.cpp index 736d97b8e8..9f60af19b0 100644 --- a/pcsx2/x86/ix86-32/iR5900AritImm.cpp +++ b/pcsx2/x86/ix86-32/iR5900AritImm.cpp @@ -22,10 +22,8 @@ using namespace x86Emitter; -namespace R5900 { -namespace Dynarec { -namespace OpcodeImpl { - +namespace R5900::Dynarec::OpcodeImpl +{ /********************************************************* * Arithmetic with immediate operand * * Format: OP rt, rs, immediate * @@ -35,47 +33,50 @@ namespace OpcodeImpl { namespace Interp = R5900::Interpreter::OpcodeImpl; -REC_FUNC_DEL(ADDI, _Rt_); -REC_FUNC_DEL(ADDIU, _Rt_); -REC_FUNC_DEL(DADDI, _Rt_); +REC_FUNC_DEL(ADDI, _Rt_); +REC_FUNC_DEL(ADDIU, _Rt_); +REC_FUNC_DEL(DADDI, _Rt_); REC_FUNC_DEL(DADDIU, _Rt_); -REC_FUNC_DEL(ANDI, _Rt_); -REC_FUNC_DEL(ORI, _Rt_); -REC_FUNC_DEL(XORI, _Rt_); +REC_FUNC_DEL(ANDI, _Rt_); +REC_FUNC_DEL(ORI, _Rt_); +REC_FUNC_DEL(XORI, _Rt_); -REC_FUNC_DEL(SLTI, _Rt_); -REC_FUNC_DEL(SLTIU, _Rt_); +REC_FUNC_DEL(SLTI, _Rt_); +REC_FUNC_DEL(SLTIU, _Rt_); #else +static void recMoveStoT(int info) +{ + if (info & PROCESS_EE_S) + xMOV(xRegister32(EEREC_T), xRegister32(EEREC_S)); + else + xMOV(xRegister32(EEREC_T), ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]); +} + +static void recMoveStoT64(int info) +{ + if (info & PROCESS_EE_S) + xMOV(xRegister64(EEREC_T), xRegister64(EEREC_S)); + else + xMOV(xRegister64(EEREC_T), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); +} + //// ADDI -void recADDI_const(void) +static void recADDI_const(void) { g_cpuConstRegs[_Rt_].SD[0] = s64(s32(g_cpuConstRegs[_Rs_].UL[0] + u32(s32(_Imm_)))); } -void recADDI_(int info) +static void recADDI_(int info) { pxAssert(!(info & PROCESS_EE_XMM)); - - if (_Rt_ == _Rs_) - { - // must perform the ADD unconditionally, to maintain flags status: - xADD(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]], _Imm_); - _signExtendSFtoM((uptr)&cpuRegs.GPR.r[_Rt_].UL[1]); - } - else - { - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); - - if (_Imm_ != 0) - xADD(eax, _Imm_); - - eeSignExtendTo(_Rt_); - } + recMoveStoT(info); + xADD(xRegister32(EEREC_T), _Imm_); + xMOVSX(xRegister64(EEREC_T), xRegister32(EEREC_T)); } -EERECOMPILE_CODEX(eeRecompileCode1, ADDI); +EERECOMPILE_CODEX(eeRecompileCodeRC1, ADDI, XMMINFO_WRITET | XMMINFO_READS); //////////////////////////////////////////////////// void recADDIU() @@ -84,33 +85,19 @@ void recADDIU() } //////////////////////////////////////////////////// -void recDADDI_const() +static void recDADDI_const() { g_cpuConstRegs[_Rt_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] + u64(s64(_Imm_)); } -void recDADDI_(int info) +static void recDADDI_(int info) { pxAssert(!(info & PROCESS_EE_XMM)); - - if (_Rt_ == _Rs_) - { - xADD(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], _Imm_); - } - else - { - xMOV(rax, ptr[&cpuRegs.GPR.r[_Rs_].UD[0]]); - - if (_Imm_ != 0) - { - xADD(rax, _Imm_); - } - - xMOV(ptr[&cpuRegs.GPR.r[_Rt_].UD[0]], rax); - } + recMoveStoT64(info); + xADD(xRegister64(EEREC_T), _Imm_); } -EERECOMPILE_CODEX(eeRecompileCode1, DADDI); +EERECOMPILE_CODEX(eeRecompileCodeRC1, DADDI, XMMINFO_WRITET | XMMINFO_READS | XMMINFO_64BITOP); //// DADDIU void recDADDIU() @@ -119,133 +106,137 @@ void recDADDIU() } //// SLTIU -void recSLTIU_const() +static void recSLTIU_const() { g_cpuConstRegs[_Rt_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] < (u64)(_Imm_); } -extern void recSLTmemconstt(int regd, int regs, u32 mem, int sign); -extern u32 s_sltone; - -void recSLTIU_(int info) +static void recSLTIU_(int info) { - xXOR(eax, eax); - xCMP(ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], _Imm_); - xSETB(al); - xMOV(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], rax); + pxAssert(!(info & PROCESS_EE_XMM)); + + // TODO(Stenzek): this can be made to suck less by turning Rs into a temp and reallocating Rt. + const xRegister32 dreg((_Rt_ == _Rs_) ? _allocX86reg(X86TYPE_TEMP, 0, 0) : EEREC_T); + xXOR(dreg, dreg); + + if (info & PROCESS_EE_S) + xCMP(xRegister64(EEREC_S), _Imm_); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], _Imm_); + + xSETB(xRegister8(dreg)); + + if (dreg.GetId() != EEREC_T) + { + std::swap(x86regs[dreg.GetId()], x86regs[EEREC_T]); + _freeX86reg(EEREC_T); + } } -EERECOMPILE_CODEX(eeRecompileCode1, SLTIU); +EERECOMPILE_CODEX(eeRecompileCodeRC1, SLTIU, XMMINFO_WRITET | XMMINFO_READS | XMMINFO_64BITOP | XMMINFO_NORENAME); //// SLTI -void recSLTI_const() +static void recSLTI_const() { g_cpuConstRegs[_Rt_].UD[0] = g_cpuConstRegs[_Rs_].SD[0] < (s64)(_Imm_); } -void recSLTI_(int info) +static void recSLTI_(int info) { - // test silent hill if modding - xXOR(eax, eax); - xCMP(ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], _Imm_); - xSETL(al); - xMOV(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], rax); + const xRegister32 dreg((_Rt_ == _Rs_) ? _allocX86reg(X86TYPE_TEMP, 0, 0) : EEREC_T); + xXOR(dreg, dreg); + + if (info & PROCESS_EE_S) + xCMP(xRegister64(EEREC_S), _Imm_); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], _Imm_); + + xSETL(xRegister8(dreg)); + + if (dreg.GetId() != EEREC_T) + { + std::swap(x86regs[dreg.GetId()], x86regs[EEREC_T]); + _freeX86reg(EEREC_T); + } } -EERECOMPILE_CODEX(eeRecompileCode1, SLTI); +EERECOMPILE_CODEX(eeRecompileCodeRC1, SLTI, XMMINFO_WRITET | XMMINFO_READS | XMMINFO_64BITOP | XMMINFO_NORENAME); //// ANDI -void recANDI_const() +static void recANDI_const() { g_cpuConstRegs[_Rt_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] & (u64)_ImmU_; // Zero-extended Immediate } namespace { - enum class LogicalOp - { - AND, - OR, - XOR - }; +enum class LogicalOp +{ + AND, + OR, + XOR +}; } // namespace static void recLogicalOpI(int info, LogicalOp op) { xImpl_G1Logic bad{}; - const xImpl_G1Logic& xOP = op == LogicalOp::AND ? xAND - : op == LogicalOp::OR ? xOR - : op == LogicalOp::XOR ? xXOR : bad; + const xImpl_G1Logic& xOP = op == LogicalOp::AND ? xAND : op == LogicalOp::OR ? xOR : + op == LogicalOp::XOR ? xXOR : + bad; pxAssert(&xOP != &bad); if (_ImmU_ != 0) { - if (_Rt_ == _Rs_) - { - if (op == LogicalOp::AND) - xOP(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], _ImmU_); - else - xOP(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]], _ImmU_); - } - else - { - xMOV(rax, ptr[&cpuRegs.GPR.r[_Rs_].UD[0]]); - xOP(rax, _ImmU_); - xMOV(ptr[&cpuRegs.GPR.r[_Rt_].UD[0]], rax); - } + recMoveStoT64(info); + xOP(xRegister64(EEREC_T), _ImmU_); } else { if (op == LogicalOp::AND) { - xMOV(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], 0); + xXOR(xRegister32(EEREC_T), xRegister32(EEREC_T)); } else { - if (_Rt_ != _Rs_) - { - xMOV(rax, ptr[&cpuRegs.GPR.r[_Rs_].UD[0]]); - xMOV(ptr[&cpuRegs.GPR.r[_Rt_].UD[0]], rax); - } + recMoveStoT64(info); } } } -void recANDI_(int info) +static void recANDI_(int info) { recLogicalOpI(info, LogicalOp::AND); } -EERECOMPILE_CODEX(eeRecompileCode1, ANDI); +EERECOMPILE_CODEX(eeRecompileCodeRC1, ANDI, XMMINFO_WRITET | XMMINFO_READS | XMMINFO_64BITOP); //////////////////////////////////////////////////// -void recORI_const() +static void recORI_const() { g_cpuConstRegs[_Rt_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] | (u64)_ImmU_; // Zero-extended Immediate } -void recORI_(int info) +static void recORI_(int info) { recLogicalOpI(info, LogicalOp::OR); } -EERECOMPILE_CODEX(eeRecompileCode1, ORI); +EERECOMPILE_CODEX(eeRecompileCodeRC1, ORI, XMMINFO_WRITET | XMMINFO_READS | XMMINFO_64BITOP); //////////////////////////////////////////////////// -void recXORI_const() +static void recXORI_const() { g_cpuConstRegs[_Rt_].UD[0] = g_cpuConstRegs[_Rs_].UD[0] ^ (u64)_ImmU_; // Zero-extended Immediate } -void recXORI_(int info) +static void recXORI_(int info) { recLogicalOpI(info, LogicalOp::XOR); } -EERECOMPILE_CODEX(eeRecompileCode1, XORI); +EERECOMPILE_CODEX(eeRecompileCodeRC1, XORI, XMMINFO_WRITET | XMMINFO_READS | XMMINFO_64BITOP); #endif -} // namespace OpcodeImpl -} // namespace Dynarec -} // namespace R5900 +} // namespace R5900::Dynarec::OpcodeImpl diff --git a/pcsx2/x86/ix86-32/iR5900Branch.cpp b/pcsx2/x86/ix86-32/iR5900Branch.cpp index f31b1699c0..0d0211e344 100644 --- a/pcsx2/x86/ix86-32/iR5900Branch.cpp +++ b/pcsx2/x86/ix86-32/iR5900Branch.cpp @@ -24,10 +24,8 @@ using namespace x86Emitter; -namespace R5900 { -namespace Dynarec { -namespace OpcodeImpl { - +namespace R5900::Dynarec::OpcodeImpl +{ /********************************************************* * Register branch logic * * Format: OP rs, rt, offset * @@ -46,144 +44,71 @@ REC_SYS(BLEZ); REC_SYS(BGEZ); REC_SYS(BGTZL); REC_SYS(BLTZL); -REC_SYS_DEL(BLTZAL, 31); +REC_SYS_DEL(BLTZAL, 31); REC_SYS_DEL(BLTZALL, 31); REC_SYS(BLEZL); REC_SYS(BGEZL); -REC_SYS_DEL(BGEZAL, 31); +REC_SYS_DEL(BGEZAL, 31); REC_SYS_DEL(BGEZALL, 31); #else -void recSetBranchEQ(int info, int bne, int process) +static void recSetBranchEQ(int bne, int process) { - if (info & PROCESS_EE_XMM) + // TODO(Stenzek): This is suboptimal if the registers are in XMMs. + // If the constant register is already in a host register, we don't need the immediate... + + if (process & PROCESS_CONSTS) { - int t0reg; + _eeFlushAllDirty(); - if (process & PROCESS_CONSTS) - { - if ((g_pCurInstInfo->regs[_Rt_] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(_Rt_)) - { - _deleteGPRtoXMMreg(_Rt_, 1); - xmmregs[EEREC_T].inuse = 0; - t0reg = EEREC_T; - } - else - { - t0reg = _allocTempXMMreg(XMMT_INT, -1); - xMOVQZX(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); - } - - _flushConstReg(_Rs_); - xPCMP.EQD(xRegisterSSE(t0reg), ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); - - - if (t0reg != EEREC_T) - _freeXMMreg(t0reg); - } - else if (process & PROCESS_CONSTT) - { - if ((g_pCurInstInfo->regs[_Rs_] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(_Rs_)) - { - _deleteGPRtoXMMreg(_Rs_, 1); - xmmregs[EEREC_S].inuse = 0; - t0reg = EEREC_S; - } - else - { - t0reg = _allocTempXMMreg(XMMT_INT, -1); - xMOVQZX(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); - } - - _flushConstReg(_Rt_); - xPCMP.EQD(xRegisterSSE(t0reg), ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); - - if (t0reg != EEREC_S) - _freeXMMreg(t0reg); - } + _deleteGPRtoXMMreg(_Rt_, DELETE_REG_FLUSH_AND_FREE); + const int regt = _checkX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + if (regt >= 0) + xImm64Op(xCMP, xRegister64(regt), rax, g_cpuConstRegs[_Rs_].UD[0]); else - { + xImm64Op(xCMP, ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], rax, g_cpuConstRegs[_Rs_].UD[0]); + } + else if (process & PROCESS_CONSTT) + { + _eeFlushAllDirty(); - if ((g_pCurInstInfo->regs[_Rs_] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(_Rs_)) - { - _deleteGPRtoXMMreg(_Rs_, 1); - xmmregs[EEREC_S].inuse = 0; - t0reg = EEREC_S; - xPCMP.EQD(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); - } - else if ((g_pCurInstInfo->regs[_Rt_] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(_Rt_)) - { - _deleteGPRtoXMMreg(_Rt_, 1); - xmmregs[EEREC_T].inuse = 0; - t0reg = EEREC_T; - xPCMP.EQD(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); - } - else - { - t0reg = _allocTempXMMreg(XMMT_INT, -1); - xMOVQZX(xRegisterSSE(t0reg), xRegisterSSE(EEREC_S)); - xPCMP.EQD(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T)); - } - - if (t0reg != EEREC_S && t0reg != EEREC_T) - _freeXMMreg(t0reg); - } - - xMOVMSKPS(eax, xRegisterSSE(t0reg)); - - _eeFlushAllUnused(); - - xAND(al, 3); - xCMP(al, 0x3); - - if (bne) - j32Ptr[1] = JE32(0); + _deleteGPRtoXMMreg(_Rs_, DELETE_REG_FLUSH_AND_FREE); + const int regs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + if (regs >= 0) + xImm64Op(xCMP, xRegister64(regs), rax, g_cpuConstRegs[_Rt_].UD[0]); else - j32Ptr[0] = j32Ptr[1] = JNE32(0); + xImm64Op(xCMP, ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], rax, g_cpuConstRegs[_Rt_].UD[0]); } else { + // force S into register, since we need to load it, may as well cache. + _deleteGPRtoXMMreg(_Rt_, DELETE_REG_FLUSH_AND_FREE); + const int regs = _allocX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + const int regt = _checkX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + _eeFlushAllDirty(); - _eeFlushAllUnused(); - - if (process & PROCESS_CONSTS) - { - xImm64Op(xCMP, ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], rax, g_cpuConstRegs[_Rs_].UD[0]); - } - else if (process & PROCESS_CONSTT) - { - xImm64Op(xCMP, ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], rax, g_cpuConstRegs[_Rt_].UD[0]); - } + if (regt >= 0) + xCMP(xRegister64(regs), xRegister64(regt)); else - { - xMOV(rax, ptr[&cpuRegs.GPR.r[_Rs_].UD[0]]); - xCMP(rax, ptr[&cpuRegs.GPR.r[_Rt_].UD[0]]); - } - - if (bne) - { - j32Ptr[1] = JE32(0); - } - else - { - j32Ptr[0] = j32Ptr[1] = JNE32(0); - } + xCMP(xRegister64(regs), ptr64[&cpuRegs.GPR.r[_Rt_]]); } - _clearNeededXMMregs(); + if (bne) + j32Ptr[0] = JE32(0); + else + j32Ptr[0] = JNE32(0); } -void recSetBranchL(int ltz) +static void recSetBranchL(int ltz) { - int regs = _checkXMMreg(XMMTYPE_GPRREG, _Rs_, MODE_READ); + const int regs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + const int regsxmm = _checkXMMreg(XMMTYPE_GPRREG, _Rs_, MODE_READ); + _eeFlushAllDirty(); - if (regs >= 0) + if (regsxmm >= 0) { - xMOVMSKPS(eax, xRegisterSSE(regs)); - - _eeFlushAllUnused(); - + xMOVMSKPS(eax, xRegisterSSE(regsxmm)); xTEST(al, 2); if (ltz) @@ -194,17 +119,19 @@ void recSetBranchL(int ltz) return; } - xCMP(ptr32[&cpuRegs.GPR.r[_Rs_].UL[1]], 0); + if (regs >= 0) + xCMP(xRegister64(regs), 0); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], 0); + if (ltz) j32Ptr[0] = JGE32(0); else j32Ptr[0] = JL32(0); - - _clearNeededXMMregs(); } //// BEQ -void recBEQ_const() +static void recBEQ_const() { u32 branchTo; @@ -213,48 +140,62 @@ void recBEQ_const() else branchTo = pc + 4; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } -void recBEQ_process(int info, int process) +static void recBEQ_process(int process) { u32 branchTo = ((s32)_Imm_ * 4) + pc; if (_Rs_ == _Rt_) { - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } else { - recSetBranchEQ(info, 0, process); + const bool swap = TrySwapDelaySlot(_Rs_, _Rt_, 0, true); - SaveBranchState(); - recompileNextInstruction(1); + recSetBranchEQ(0, process); + + if (!swap) + { + SaveBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); - x86SetJ32(j32Ptr[1]); - // recopy the next inst - pc -= 4; - LoadBranchState(); - recompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + pc -= 4; + LoadBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(pc); } } -void recBEQ_(int info) { recBEQ_process(info, 0); } -void recBEQ_consts(int info) { recBEQ_process(info, PROCESS_CONSTS); } -void recBEQ_constt(int info) { recBEQ_process(info, PROCESS_CONSTT); } - -EERECOMPILE_CODE0(BEQ, XMMINFO_READS | XMMINFO_READT); +void recBEQ() +{ + // prefer using the host register over an immediate, it'll be smaller code. + if (GPR_IS_CONST2(_Rs_, _Rt_)) + recBEQ_const(); + else if (GPR_IS_CONST1(_Rs_) && _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ) < 0) + recBEQ_process(PROCESS_CONSTS); + else if (GPR_IS_CONST1(_Rt_) && _checkX86reg(X86TYPE_GPR, _Rt_, MODE_READ) < 0) + recBEQ_process(PROCESS_CONSTT); + else + recBEQ_process(0); +} //// BNE -void recBNE_const() +static void recBNE_const() { u32 branchTo; @@ -263,51 +204,65 @@ void recBNE_const() else branchTo = pc + 4; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } -void recBNE_process(int info, int process) +static void recBNE_process(int process) { u32 branchTo = ((s32)_Imm_ * 4) + pc; if (_Rs_ == _Rt_) { - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(pc); return; } - recSetBranchEQ(info, 1, process); + const bool swap = TrySwapDelaySlot(_Rs_, _Rt_, 0, true); - SaveBranchState(); - recompileNextInstruction(1); + recSetBranchEQ(1, process); + + if (!swap) + { + SaveBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(branchTo); - x86SetJ32(j32Ptr[1]); + x86SetJ32(j32Ptr[0]); - // recopy the next inst - pc -= 4; - LoadBranchState(); - recompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + pc -= 4; + LoadBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(pc); } -void recBNE_(int info) { recBNE_process(info, 0); } -void recBNE_consts(int info) { recBNE_process(info, PROCESS_CONSTS); } -void recBNE_constt(int info) { recBNE_process(info, PROCESS_CONSTT); } - -EERECOMPILE_CODE0(BNE, XMMINFO_READS | XMMINFO_READT); +void recBNE() +{ + if (GPR_IS_CONST2(_Rs_, _Rt_)) + recBNE_const(); + else if (GPR_IS_CONST1(_Rs_) && _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ) < 0) + recBNE_process(PROCESS_CONSTS); + else if (GPR_IS_CONST1(_Rt_) && _checkX86reg(X86TYPE_GPR, _Rt_, MODE_READ) < 0) + recBNE_process(PROCESS_CONSTT); + else + recBNE_process(0); +} //// BEQL -void recBEQL_const() +static void recBEQL_const() { if (g_cpuConstRegs[_Rs_].SD[0] == g_cpuConstRegs[_Rt_].SD[0]) { u32 branchTo = ((s32)_Imm_ * 4) + pc; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } else @@ -316,35 +271,40 @@ void recBEQL_const() } } -void recBEQL_process(int info, int process) +static void recBEQL_process(int process) { u32 branchTo = ((s32)_Imm_ * 4) + pc; - recSetBranchEQ(info, 0, process); + recSetBranchEQ(0, process); SaveBranchState(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); - x86SetJ32(j32Ptr[1]); LoadBranchState(); SetBranchImm(pc); } -void recBEQL_(int info) { recBEQL_process(info, 0); } -void recBEQL_consts(int info) { recBEQL_process(info, PROCESS_CONSTS); } -void recBEQL_constt(int info) { recBEQL_process(info, PROCESS_CONSTT); } - -EERECOMPILE_CODE0(BEQL, XMMINFO_READS | XMMINFO_READT); +void recBEQL() +{ + if (GPR_IS_CONST2(_Rs_, _Rt_)) + recBEQL_const(); + else if (GPR_IS_CONST1(_Rs_) && _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ) < 0) + recBEQL_process(PROCESS_CONSTS); + else if (GPR_IS_CONST1(_Rt_) && _checkX86reg(X86TYPE_GPR, _Rt_, MODE_READ) < 0) + recBEQL_process(PROCESS_CONSTT); + else + recBEQL_process(0); +} //// BNEL -void recBNEL_const() +static void recBNEL_const() { if (g_cpuConstRegs[_Rs_].SD[0] != g_cpuConstRegs[_Rt_].SD[0]) { u32 branchTo = ((s32)_Imm_ * 4) + pc; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } else @@ -353,29 +313,34 @@ void recBNEL_const() } } -void recBNEL_process(int info, int process) +static void recBNEL_process(int process) { u32 branchTo = ((s32)_Imm_ * 4) + pc; - recSetBranchEQ(info, 0, process); + recSetBranchEQ(0, process); SaveBranchState(); SetBranchImm(pc + 4); x86SetJ32(j32Ptr[0]); - x86SetJ32(j32Ptr[1]); // recopy the next inst LoadBranchState(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } -void recBNEL_(int info) { recBNEL_process(info, 0); } -void recBNEL_consts(int info) { recBNEL_process(info, PROCESS_CONSTS); } -void recBNEL_constt(int info) { recBNEL_process(info, PROCESS_CONSTT); } - -EERECOMPILE_CODE0(BNEL, XMMINFO_READS | XMMINFO_READT); +void recBNEL() +{ + if (GPR_IS_CONST2(_Rs_, _Rt_)) + recBNEL_const(); + else if (GPR_IS_CONST1(_Rs_) && _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ) < 0) + recBNEL_process(PROCESS_CONSTS); + else if (GPR_IS_CONST1(_Rt_) && _checkX86reg(X86TYPE_GPR, _Rt_, MODE_READ) < 0) + recBNEL_process(PROCESS_CONSTT); + else + recBNEL_process(0); +} /********************************************************* * Register branch logic * @@ -402,36 +367,43 @@ void recBLTZAL() u32 branchTo = ((s32)_Imm_ * 4) + pc; _eeOnWriteReg(31, 0); - _eeFlushAllUnused(); + _eeFlushAllDirty(); _deleteEEreg(31, 0); - xMOV(ptr32[&cpuRegs.GPR.r[31].UL[0]], pc + 4); - xMOV(ptr32[&cpuRegs.GPR.r[31].UL[1]], 0); + xMOV64(rax, pc + 4); + xMOV(ptr64[&cpuRegs.GPR.n.ra.UD[0]], rax); if (GPR_IS_CONST1(_Rs_)) { if (!(g_cpuConstRegs[_Rs_].SD[0] < 0)) branchTo = pc + 4; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); return; } + const bool swap = TrySwapDelaySlot(_Rs_, 0, 0, true); + recSetBranchL(1); - SaveBranchState(); - - recompileNextInstruction(1); + if (!swap) + { + SaveBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); - // recopy the next inst - pc -= 4; - LoadBranchState(); - recompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + pc -= 4; + LoadBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(pc); } @@ -444,36 +416,43 @@ void recBGEZAL() u32 branchTo = ((s32)_Imm_ * 4) + pc; _eeOnWriteReg(31, 0); - _eeFlushAllUnused(); + _eeFlushAllDirty(); _deleteEEreg(31, 0); - xMOV(ptr32[&cpuRegs.GPR.r[31].UL[0]], pc + 4); - xMOV(ptr32[&cpuRegs.GPR.r[31].UL[1]], 0); + xMOV64(rax, pc + 4); + xMOV(ptr64[&cpuRegs.GPR.n.ra.UD[0]], rax); if (GPR_IS_CONST1(_Rs_)) { if (!(g_cpuConstRegs[_Rs_].SD[0] >= 0)) branchTo = pc + 4; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); return; } + const bool swap = TrySwapDelaySlot(_Rs_, 0, 0, true); + recSetBranchL(0); - SaveBranchState(); - - recompileNextInstruction(1); + if (!swap) + { + SaveBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); - // recopy the next inst - pc -= 4; - LoadBranchState(); - recompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + pc -= 4; + LoadBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(pc); } @@ -486,11 +465,11 @@ void recBLTZALL() u32 branchTo = ((s32)_Imm_ * 4) + pc; _eeOnWriteReg(31, 0); - _eeFlushAllUnused(); + _eeFlushAllDirty(); _deleteEEreg(31, 0); - xMOV(ptr32[&cpuRegs.GPR.r[31].UL[0]], pc + 4); - xMOV(ptr32[&cpuRegs.GPR.r[31].UL[1]], 0); + xMOV64(rax, pc + 4); + xMOV(ptr64[&cpuRegs.GPR.n.ra.UD[0]], rax); if (GPR_IS_CONST1(_Rs_)) { @@ -498,7 +477,7 @@ void recBLTZALL() SetBranchImm(pc + 4); else { - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } return; @@ -507,7 +486,7 @@ void recBLTZALL() recSetBranchL(1); SaveBranchState(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); @@ -524,11 +503,11 @@ void recBGEZALL() u32 branchTo = ((s32)_Imm_ * 4) + pc; _eeOnWriteReg(31, 0); - _eeFlushAllUnused(); + _eeFlushAllDirty(); _deleteEEreg(31, 0); - xMOV(ptr32[&cpuRegs.GPR.r[31].UL[0]], pc + 4); - xMOV(ptr32[&cpuRegs.GPR.r[31].UL[1]], 0); + xMOV64(rax, pc + 4); + xMOV(ptr64[&cpuRegs.GPR.n.ra.UD[0]], rax); if (GPR_IS_CONST1(_Rs_)) { @@ -536,7 +515,7 @@ void recBGEZALL() SetBranchImm(pc + 4); else { - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } return; @@ -545,7 +524,7 @@ void recBGEZALL() recSetBranchL(0); SaveBranchState(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); @@ -562,43 +541,44 @@ void recBLEZ() u32 branchTo = ((s32)_Imm_ * 4) + pc; - _eeFlushAllUnused(); - if (GPR_IS_CONST1(_Rs_)) { if (!(g_cpuConstRegs[_Rs_].SD[0] <= 0)) branchTo = pc + 4; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); return; } - _flushEEreg(_Rs_); + const bool swap = TrySwapDelaySlot(_Rs_, 0, 0, true); + const int regs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + _eeFlushAllDirty(); - xCMP(ptr32[&cpuRegs.GPR.r[_Rs_].UL[1]], 0); - j8Ptr[0] = JL8(0); - j32Ptr[1] = JG32(0); + if (regs >= 0) + xCMP(xRegister64(regs), 0); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], 0); - xCMP(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]], 0); - j32Ptr[2] = JNZ32(0); + j32Ptr[0] = JG32(0); - x86SetJ8(j8Ptr[0]); - - _clearNeededXMMregs(); - - SaveBranchState(); - recompileNextInstruction(1); + if (!swap) + { + SaveBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(branchTo); - x86SetJ32(j32Ptr[1]); - x86SetJ32(j32Ptr[2]); + x86SetJ32(j32Ptr[0]); - // recopy the next inst - pc -= 4; - LoadBranchState(); - recompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + pc -= 4; + LoadBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(pc); } @@ -610,43 +590,44 @@ void recBGTZ() u32 branchTo = ((s32)_Imm_ * 4) + pc; - _eeFlushAllUnused(); - if (GPR_IS_CONST1(_Rs_)) { if (!(g_cpuConstRegs[_Rs_].SD[0] > 0)) branchTo = pc + 4; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); return; } - _flushEEreg(_Rs_); + const bool swap = TrySwapDelaySlot(_Rs_, 0, 0, true); + const int regs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + _eeFlushAllDirty(); - xCMP(ptr32[&cpuRegs.GPR.r[_Rs_].UL[1]], 0); - j8Ptr[0] = JG8(0); - j32Ptr[1] = JL32(0); + if (regs >= 0) + xCMP(xRegister64(regs), 0); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], 0); - xCMP(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]], 0); - j32Ptr[2] = JZ32(0); + j32Ptr[0] = JLE32(0); - x86SetJ8(j8Ptr[0]); - - _clearNeededXMMregs(); - - SaveBranchState(); - recompileNextInstruction(1); + if (!swap) + { + SaveBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(branchTo); - x86SetJ32(j32Ptr[1]); - x86SetJ32(j32Ptr[2]); + x86SetJ32(j32Ptr[0]); - // recopy the next inst - pc -= 4; - LoadBranchState(); - recompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + pc -= 4; + LoadBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(pc); } @@ -658,31 +639,37 @@ void recBLTZ() u32 branchTo = ((s32)_Imm_ * 4) + pc; - _eeFlushAllUnused(); - if (GPR_IS_CONST1(_Rs_)) { if (!(g_cpuConstRegs[_Rs_].SD[0] < 0)) branchTo = pc + 4; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); return; } + const bool swap = TrySwapDelaySlot(_Rs_, 0, 0, true); + _eeFlushAllDirty(); recSetBranchL(1); - SaveBranchState(); - recompileNextInstruction(1); + if (!swap) + { + SaveBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); - // recopy the next inst - pc -= 4; - LoadBranchState(); - recompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + pc -= 4; + LoadBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(pc); } @@ -694,31 +681,38 @@ void recBGEZ() u32 branchTo = ((s32)_Imm_ * 4) + pc; - _eeFlushAllUnused(); - if (GPR_IS_CONST1(_Rs_)) { if (!(g_cpuConstRegs[_Rs_].SD[0] >= 0)) branchTo = pc + 4; - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); return; } + const bool swap = TrySwapDelaySlot(_Rs_, 0, 0, true); + _eeFlushAllDirty(); + recSetBranchL(0); - SaveBranchState(); - recompileNextInstruction(1); + if (!swap) + { + SaveBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); - // recopy the next inst - pc -= 4; - LoadBranchState(); - recompileNextInstruction(1); + if (!swap) + { + // recopy the next inst + pc -= 4; + LoadBranchState(); + recompileNextInstruction(true, false); + } SetBranchImm(pc); } @@ -728,9 +722,7 @@ void recBLTZL() { EE::Profiler.EmitOp(eeOpcode::BLTZL); - u32 branchTo = ((s32)_Imm_ * 4) + pc; - - _eeFlushAllUnused(); + const u32 branchTo = ((s32)_Imm_ * 4) + pc; if (GPR_IS_CONST1(_Rs_)) { @@ -738,16 +730,17 @@ void recBLTZL() SetBranchImm(pc + 4); else { - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } return; } + _eeFlushAllDirty(); recSetBranchL(1); SaveBranchState(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); @@ -762,9 +755,7 @@ void recBGEZL() { EE::Profiler.EmitOp(eeOpcode::BGEZL); - u32 branchTo = ((s32)_Imm_ * 4) + pc; - - _eeFlushAllUnused(); + const u32 branchTo = ((s32)_Imm_ * 4) + pc; if (GPR_IS_CONST1(_Rs_)) { @@ -772,16 +763,17 @@ void recBGEZL() SetBranchImm(pc + 4); else { - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } return; } + _eeFlushAllDirty(); recSetBranchL(0); SaveBranchState(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); x86SetJ32(j32Ptr[0]); @@ -802,9 +794,7 @@ void recBLEZL() { EE::Profiler.EmitOp(eeOpcode::BLEZL); - u32 branchTo = ((s32)_Imm_ * 4) + pc; - - _eeFlushAllUnused(); + const u32 branchTo = ((s32)_Imm_ * 4) + pc; if (GPR_IS_CONST1(_Rs_)) { @@ -812,32 +802,27 @@ void recBLEZL() SetBranchImm(pc + 4); else { - _clearNeededXMMregs(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } return; } - _flushEEreg(_Rs_); + const int regs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + _eeFlushAllDirty(); - xCMP(ptr32[&cpuRegs.GPR.r[_Rs_].UL[1]], 0); - j32Ptr[0] = JL32(0); - j32Ptr[1] = JG32(0); + if (regs >= 0) + xCMP(xRegister64(regs), 0); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], 0); - xCMP(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]], 0); - j32Ptr[2] = JNZ32(0); - - x86SetJ32(j32Ptr[0]); - - _clearNeededXMMregs(); + j32Ptr[0] = JG32(0); SaveBranchState(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); - x86SetJ32(j32Ptr[1]); - x86SetJ32(j32Ptr[2]); + x86SetJ32(j32Ptr[0]); LoadBranchState(); SetBranchImm(pc); @@ -848,9 +833,7 @@ void recBGTZL() { EE::Profiler.EmitOp(eeOpcode::BGTZL); - u32 branchTo = ((s32)_Imm_ * 4) + pc; - - _eeFlushAllUnused(); + const u32 branchTo = ((s32)_Imm_ * 4) + pc; if (GPR_IS_CONST1(_Rs_)) { @@ -859,31 +842,27 @@ void recBGTZL() else { _clearNeededXMMregs(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); } return; } - _flushEEreg(_Rs_); + const int regs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + _eeFlushAllDirty(); - xCMP(ptr32[&cpuRegs.GPR.r[_Rs_].UL[1]], 0); - j32Ptr[0] = JG32(0); - j32Ptr[1] = JL32(0); + if (regs >= 0) + xCMP(xRegister64(regs), 0); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], 0); - xCMP(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]], 0); - j32Ptr[2] = JZ32(0); - - x86SetJ32(j32Ptr[0]); - - _clearNeededXMMregs(); + j32Ptr[0] = JLE32(0); SaveBranchState(); - recompileNextInstruction(1); + recompileNextInstruction(true, false); SetBranchImm(branchTo); - x86SetJ32(j32Ptr[1]); - x86SetJ32(j32Ptr[2]); + x86SetJ32(j32Ptr[0]); LoadBranchState(); SetBranchImm(pc); @@ -891,6 +870,4 @@ void recBGTZL() #endif -} // namespace OpcodeImpl -} // namespace Dynarec -} // namespace R5900 +} // namespace R5900::Dynarec::OpcodeImpl diff --git a/pcsx2/x86/ix86-32/iR5900Jump.cpp b/pcsx2/x86/ix86-32/iR5900Jump.cpp index 49597899da..bdf2771a35 100644 --- a/pcsx2/x86/ix86-32/iR5900Jump.cpp +++ b/pcsx2/x86/ix86-32/iR5900Jump.cpp @@ -14,8 +14,6 @@ */ -// recompiler reworked to add dynamic linking zerofrog(@gmail.com) Jan06 - #include "PrecompiledHeader.h" #include "Common.h" @@ -24,9 +22,8 @@ using namespace x86Emitter; -namespace R5900 { -namespace Dynarec { -namespace OpcodeImpl { +namespace R5900::Dynarec::OpcodeImpl +{ /********************************************************* * Jump to target * @@ -50,7 +47,7 @@ void recJ() // SET_FPUSTATE; u32 newpc = (_InstrucTarget_ << 2) + (pc & 0xf0000000); - recompileNextInstruction(1); + recompileNextInstruction(true, false); if (EmuConfig.Gamefixes.GoemonTlbHack) SetBranchImm(vtlb_V2P(newpc)); else @@ -76,7 +73,7 @@ void recJAL() xMOV(ptr32[&cpuRegs.GPR.r[31].UL[1]], 0); } - recompileNextInstruction(1); + recompileNextInstruction(true, false); if (EmuConfig.Gamefixes.GoemonTlbHack) SetBranchImm(vtlb_V2P(newpc)); else @@ -101,34 +98,40 @@ void recJALR() { EE::Profiler.EmitOp(eeOpcode::JALR); - int newpc = pc + 4; - _allocX86reg(calleeSavedReg2d, X86TYPE_PCWRITEBACK, 0, MODE_WRITE); - _eeMoveGPRtoR(calleeSavedReg2d, _Rs_); + const u32 newpc = pc + 4; + const bool swap = (EmuConfig.Gamefixes.GoemonTlbHack || _Rd_ == _Rs_) ? false : TrySwapDelaySlot(_Rs_, 0, _Rd_, true); - if (EmuConfig.Gamefixes.GoemonTlbHack) - { - xMOV(ecx, calleeSavedReg2d); - vtlb_DynV2P(); - xMOV(calleeSavedReg2d, eax); - } // uncomment when there are NO instructions that need to call interpreter -// int mmreg; -// if (GPR_IS_CONST1(_Rs_)) -// xMOV(ptr32[&cpuRegs.pc], g_cpuConstRegs[_Rs_].UL[0]); -// else -// { -// int mmreg; -// -// if ((mmreg = _checkXMMreg(XMMTYPE_GPRREG, _Rs_, MODE_READ)) >= 0) -// { -// xMOVSS(ptr[&cpuRegs.pc], xRegisterSSE(mmreg)); -// } -// else { -// xMOV(eax, ptr[(void*)((int)&cpuRegs.GPR.r[_Rs_].UL[0])]); -// xMOV(ptr[&cpuRegs.pc], eax); -// } -// } + // int mmreg; + // if (GPR_IS_CONST1(_Rs_)) + // xMOV(ptr32[&cpuRegs.pc], g_cpuConstRegs[_Rs_].UL[0]); + // else + // { + // int mmreg; + // + // if ((mmreg = _checkXMMreg(XMMTYPE_GPRREG, _Rs_, MODE_READ)) >= 0) + // { + // xMOVSS(ptr[&cpuRegs.pc], xRegisterSSE(mmreg)); + // } + // else { + // xMOV(eax, ptr[(void*)((int)&cpuRegs.GPR.r[_Rs_].UL[0])]); + // xMOV(ptr[&cpuRegs.pc], eax); + // } + // } + int wbreg = -1; + if (!swap) + { + wbreg = _allocX86reg(X86TYPE_PCWRITEBACK, 0, MODE_WRITE | MODE_CALLEESAVED); + _eeMoveGPRtoR(xRegister32(wbreg), _Rs_); + + if (EmuConfig.Gamefixes.GoemonTlbHack) + { + xMOV(ecx, xRegister32(wbreg)); + vtlb_DynV2P(); + xMOV(xRegister32(wbreg), eax); + } + } if (_Rd_) { @@ -136,29 +139,41 @@ void recJALR() if (EE_CONST_PROP) { GPR_SET_CONST(_Rd_); - g_cpuConstRegs[_Rd_].UL[0] = newpc; - g_cpuConstRegs[_Rd_].UL[1] = 0; + g_cpuConstRegs[_Rd_].UD[0] = newpc; } else { - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].UL[0]], newpc); - xMOV(ptr32[&cpuRegs.GPR.r[_Rd_].UL[1]], 0); + xWriteImm64ToMem(&cpuRegs.GPR.r[_Rd_].UD[0], rax, newpc); } } - _clearNeededXMMregs(); - recompileNextInstruction(1); - - if (x86regs[calleeSavedReg2d.GetId()].inuse) + if (!swap) { - pxAssert(x86regs[calleeSavedReg2d.GetId()].type == X86TYPE_PCWRITEBACK); - xMOV(ptr[&cpuRegs.pc], calleeSavedReg2d); - x86regs[calleeSavedReg2d.GetId()].inuse = 0; + recompileNextInstruction(true, false); + + // the next instruction may have flushed the register.. so reload it if so. + if (x86regs[wbreg].inuse && x86regs[wbreg].type == X86TYPE_PCWRITEBACK) + { + xMOV(ptr[&cpuRegs.pc], xRegister32(wbreg)); + x86regs[wbreg].inuse = 0; + } + else + { + xMOV(eax, ptr[&cpuRegs.pcWriteback]); + xMOV(ptr[&cpuRegs.pc], eax); + } } else { - xMOV(eax, ptr[&g_recWriteback]); - xMOV(ptr[&cpuRegs.pc], eax); + if (GPR_IS_DIRTY_CONST(_Rs_) || _hasX86reg(X86TYPE_GPR, _Rs_, 0)) + { + const int x86reg = _allocX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + xMOV(ptr32[&cpuRegs.pc], xRegister32(x86reg)); + } + else + { + _eeMoveGPRtoM((uptr)&cpuRegs.pc, _Rs_); + } } SetBranchReg(0xffffffff); @@ -166,6 +181,4 @@ void recJALR() #endif -} // namespace OpcodeImpl -} // namespace Dynarec -} // namespace R5900 +} // namespace R5900::Dynarec::OpcodeImpl diff --git a/pcsx2/x86/ix86-32/iR5900LoadStore.cpp b/pcsx2/x86/ix86-32/iR5900LoadStore.cpp index 310a25401c..f26d9ee2af 100644 --- a/pcsx2/x86/ix86-32/iR5900LoadStore.cpp +++ b/pcsx2/x86/ix86-32/iR5900LoadStore.cpp @@ -26,9 +26,13 @@ using namespace x86Emitter; #define REC_STORES #define REC_LOADS -namespace R5900 { -namespace Dynarec { -namespace OpcodeImpl { +static int RETURN_READ_IN_RAX() +{ + return rax.GetId(); +} + +namespace R5900::Dynarec::OpcodeImpl +{ /********************************************************* * Load and store for GPR * @@ -38,18 +42,18 @@ namespace OpcodeImpl { namespace Interp = R5900::Interpreter::OpcodeImpl; -REC_FUNC_DEL(LB, _Rt_); +REC_FUNC_DEL(LB, _Rt_); REC_FUNC_DEL(LBU, _Rt_); -REC_FUNC_DEL(LH, _Rt_); +REC_FUNC_DEL(LH, _Rt_); REC_FUNC_DEL(LHU, _Rt_); -REC_FUNC_DEL(LW, _Rt_); +REC_FUNC_DEL(LW, _Rt_); REC_FUNC_DEL(LWU, _Rt_); REC_FUNC_DEL(LWL, _Rt_); REC_FUNC_DEL(LWR, _Rt_); -REC_FUNC_DEL(LD, _Rt_); +REC_FUNC_DEL(LD, _Rt_); REC_FUNC_DEL(LDR, _Rt_); REC_FUNC_DEL(LDL, _Rt_); -REC_FUNC_DEL(LQ, _Rt_); +REC_FUNC_DEL(LQ, _Rt_); REC_FUNC(SB); REC_FUNC(SH); REC_FUNC(SW); @@ -66,147 +70,100 @@ REC_FUNC(SQC2); #else -alignas(16) u64 retValues[2]; - -void _eeOnLoadWrite(u32 reg) -{ - int regt; - - if (!reg) - return; - - _eeOnWriteReg(reg, 1); - regt = _checkXMMreg(XMMTYPE_GPRREG, reg, MODE_READ); - - if (regt >= 0) - { - if (xmmregs[regt].mode & MODE_WRITE) - { - if (reg != _Rs_) - { - xPUNPCK.HQDQ(xRegisterSSE(regt), xRegisterSSE(regt)); - xMOVQ(ptr[&cpuRegs.GPR.r[reg].UL[2]], xRegisterSSE(regt)); - } - else - xMOVH.PS(ptr[&cpuRegs.GPR.r[reg].UL[2]], xRegisterSSE(regt)); - } - xmmregs[regt].inuse = 0; - } -} - using namespace Interpreter::OpcodeImpl; -alignas(16) u32 dummyValue[4]; - ////////////////////////////////////////////////////////////////////////////////////////// // -void recLoad64(u32 bits, bool sign) +static void recLoadQuad(u32 bits, bool sign) { - pxAssume(bits == 64 || bits == 128); + pxAssume(bits == 128); - // Load arg2 with the destination. - // 64/128 bit modes load the result directly into the cpuRegs.GPR struct. - - int gprreg = ((bits == 128) && _Rt_) ? _Rt_ : -1; - int reg; + // This mess is so we allocate *after* the vtlb flush, not before. + vtlb_ReadRegAllocCallback alloc_cb = nullptr; + if (_Rt_) + alloc_cb = []() { return _allocGPRtoXMMreg(_Rt_, MODE_WRITE); }; + int xmmreg; if (GPR_IS_CONST1(_Rs_)) { - u32 srcadr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; - if (bits == 128) - srcadr &= ~0x0f; - - _eeOnLoadWrite(_Rt_); - _deleteEEreg(_Rt_, 0); - - reg = vtlb_DynGenRead64_Const(bits, srcadr, gprreg); + const u32 srcadr = (g_cpuConstRegs[_Rs_].UL[0] + _Imm_) & ~0x0f; + xmmreg = vtlb_DynGenReadQuad_Const(bits, srcadr, _Rt_ ? alloc_cb : nullptr); } else { // Load ECX with the source memory address that we're reading from. - _eeMoveGPRtoR(arg1regd, _Rs_); + _freeX86reg(arg1regd); + _eeMoveGPRtoR(arg1reg, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); - if (bits == 128) // force 16 byte alignment on 128 bit reads - xAND(arg1regd, ~0x0F); - _eeOnLoadWrite(_Rt_); - _deleteEEreg(_Rt_, 0); + // force 16 byte alignment on 128 bit reads + xAND(arg1regd, ~0x0F); - iFlushCall(FLUSH_FULLVTLB); - reg = vtlb_DynGenRead64(bits, gprreg); + xmmreg = vtlb_DynGenReadQuad(bits, arg1regd.GetId(), _Rt_ ? alloc_cb : nullptr); } - if (gprreg == -1) - { - if (_Rt_) - xMOVQ(ptr64[&cpuRegs.GPR.r[_Rt_].UL[0]], xRegisterSSE(reg)); - - _freeXMMreg(reg); - } + // if there was a constant, it should have been invalidated. + pxAssert(!_Rt_ || !GPR_IS_CONST1(_Rt_)); + if (!_Rt_) + _freeXMMreg(xmmreg); } ////////////////////////////////////////////////////////////////////////////////////////// // -void recLoad32(u32 bits, bool sign) +static void recLoad(u32 bits, bool sign) { - pxAssume(bits <= 32); + pxAssume(bits <= 64); - // 8/16/32 bit modes return the loaded value in EAX. + // This mess is so we allocate *after* the vtlb flush, not before. + // TODO(Stenzek): If not live, save directly to state, and delete constant. + vtlb_ReadRegAllocCallback alloc_cb = nullptr; + if (_Rt_) + alloc_cb = []() { return _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); }; + int x86reg; if (GPR_IS_CONST1(_Rs_)) { - u32 srcadr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; - - _eeOnLoadWrite(_Rt_); - _deleteEEreg(_Rt_, 0); - - vtlb_DynGenRead32_Const(bits, sign, srcadr); + const u32 srcadr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; + x86reg = vtlb_DynGenReadNonQuad_Const(bits, sign, false, srcadr, alloc_cb); } else { // Load arg1 with the source memory address that we're reading from. + _freeX86reg(arg1regd); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); - _eeOnLoadWrite(_Rt_); - _deleteEEreg(_Rt_, 0); - - iFlushCall(FLUSH_FULLVTLB); - vtlb_DynGenRead32(bits, sign); + x86reg = vtlb_DynGenReadNonQuad(bits, sign, false, arg1regd.GetId(), alloc_cb); } - if (_Rt_) - { - // EAX holds the loaded value, so sign extend as needed: - if (sign) - xCDQE(); - - xMOV(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], rax); - } + // if there was a constant, it should have been invalidated. + pxAssert(!_Rt_ || !GPR_IS_CONST1(_Rt_)); + if (!_Rt_) + _freeX86reg(x86reg); } ////////////////////////////////////////////////////////////////////////////////////////// // -void recStore(u32 bits) +static void recStore(u32 bits) { // Performance note: Const prop for the store address is good, always. // Constprop for the value being stored is not really worthwhile (better to use register // allocation -- simpler code and just as fast) - // Load EDX first with the value being written, or the address of the value - // being written (64/128 bit modes). - - if (bits < 64) + int regt; + bool xmm; + if (bits < 128) { - _eeMoveGPRtoR(arg2regd, _Rt_); + regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + xmm = false; } - else if (bits == 128 || bits == 64) + else { - _flushEEreg(_Rt_); // flush register to mem - xLEA(arg2reg, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + regt = _allocGPRtoXMMreg(_Rt_, MODE_READ); + xmm = true; } // Load ECX with the destination address, or issue a direct optimized write @@ -218,76 +175,151 @@ void recStore(u32 bits) if (bits == 128) dstadr &= ~0x0f; - vtlb_DynGenWrite_Const(bits, dstadr); + vtlb_DynGenWrite_Const(bits, xmm, dstadr, regt); } else { - _eeMoveGPRtoR(arg1regd, _Rs_); - if (_Imm_ != 0) - xADD(arg1regd, _Imm_); + if (_Rs_ != 0) + { + // TODO(Stenzek): Preload Rs when it's live. Turn into LEA. + _eeMoveGPRtoR(arg1regd, _Rs_); + if (_Imm_ != 0) + xADD(arg1regd, _Imm_); + } + else + { + xMOV(arg1regd, _Imm_); + } + if (bits == 128) xAND(arg1regd, ~0x0F); - iFlushCall(FLUSH_FULLVTLB); - - vtlb_DynGenWrite(bits); + // TODO(Stenzek): Use Rs directly if imm=0. But beware of upper bits. + vtlb_DynGenWrite(bits, xmm, arg1regd.GetId(), regt); } } ////////////////////////////////////////////////////////////////////////////////////////// // -void recLB() { recLoad32( 8, true); EE::Profiler.EmitOp(eeOpcode::LB); } -void recLBU() { recLoad32( 8, false); EE::Profiler.EmitOp(eeOpcode::LBU); } -void recLH() { recLoad32( 16, true); EE::Profiler.EmitOp(eeOpcode::LH); } -void recLHU() { recLoad32( 16, false); EE::Profiler.EmitOp(eeOpcode::LHU); } -void recLW() { recLoad32( 32, true); EE::Profiler.EmitOp(eeOpcode::LW); } -void recLWU() { recLoad32( 32, false); EE::Profiler.EmitOp(eeOpcode::LWU); } -void recLD() { recLoad64( 64, false); EE::Profiler.EmitOp(eeOpcode::LD); } -void recLQ() { recLoad64(128, false); EE::Profiler.EmitOp(eeOpcode::LQ); } +void recLB() +{ + recLoad(8, true); + EE::Profiler.EmitOp(eeOpcode::LB); +} +void recLBU() +{ + recLoad(8, false); + EE::Profiler.EmitOp(eeOpcode::LBU); +} +void recLH() +{ + recLoad(16, true); + EE::Profiler.EmitOp(eeOpcode::LH); +} +void recLHU() +{ + recLoad(16, false); + EE::Profiler.EmitOp(eeOpcode::LHU); +} +void recLW() +{ + recLoad(32, true); + EE::Profiler.EmitOp(eeOpcode::LW); +} +void recLWU() +{ + recLoad(32, false); + EE::Profiler.EmitOp(eeOpcode::LWU); +} +void recLD() +{ + recLoad(64, false); + EE::Profiler.EmitOp(eeOpcode::LD); +} +void recLQ() +{ + recLoadQuad(128, false); + EE::Profiler.EmitOp(eeOpcode::LQ); +} -void recSB() { recStore( 8); EE::Profiler.EmitOp(eeOpcode::SB); } -void recSH() { recStore( 16); EE::Profiler.EmitOp(eeOpcode::SH); } -void recSW() { recStore( 32); EE::Profiler.EmitOp(eeOpcode::SW); } -void recSD() { recStore( 64); EE::Profiler.EmitOp(eeOpcode::SD); } -void recSQ() { recStore(128); EE::Profiler.EmitOp(eeOpcode::SQ); } +void recSB() +{ + recStore(8); + EE::Profiler.EmitOp(eeOpcode::SB); +} +void recSH() +{ + recStore(16); + EE::Profiler.EmitOp(eeOpcode::SH); +} +void recSW() +{ + recStore(32); + EE::Profiler.EmitOp(eeOpcode::SW); +} +void recSD() +{ + recStore(64); + EE::Profiler.EmitOp(eeOpcode::SD); +} +void recSQ() +{ + recStore(128); + EE::Profiler.EmitOp(eeOpcode::SQ); +} //////////////////////////////////////////////////// void recLWL() { #ifdef REC_LOADS - iFlushCall(FLUSH_FULLVTLB); - _deleteEEreg(_Rt_, 1); + _freeX86reg(eax); + _freeX86reg(ecx); + _freeX86reg(edx); + _freeX86reg(arg1regd); + + // avoid flushing and immediately reading back + if (_Rt_) + _addNeededX86reg(X86TYPE_GPR, _Rt_); + if (_Rs_) + _addNeededX86reg(X86TYPE_GPR, _Rs_); + + const xRegister32 temp(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); // calleeSavedReg1 = bit offset in word - xMOV(calleeSavedReg1d, arg1regd); - xAND(calleeSavedReg1d, 3); - xSHL(calleeSavedReg1d, 3); + xMOV(temp, arg1regd); + xAND(temp, 3); + xSHL(temp, 3); xAND(arg1regd, ~3); - vtlb_DynGenRead32(32, false); + vtlb_DynGenReadNonQuad(32, false, false, arg1regd.GetId(), RETURN_READ_IN_RAX); if (!_Rt_) + { + _freeX86reg(temp); return; + } // mask off bytes loaded - xMOV(ecx, calleeSavedReg1d); + xMOV(ecx, temp); + _freeX86reg(temp); + + const int treg = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ | MODE_WRITE); xMOV(edx, 0xffffff); xSHR(edx, cl); - xAND(edx, ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); + xAND(edx, xRegister32(treg)); // OR in bytes loaded xNEG(ecx); xADD(ecx, 24); xSHL(eax, cl); xOR(eax, edx); - - eeSignExtendTo(_Rt_); + xMOVSX(xRegister64(treg), eax); #else iFlushCall(FLUSH_INTERPRETER); _deleteEEreg(_Rs_, 1); @@ -303,41 +335,58 @@ void recLWL() void recLWR() { #ifdef REC_LOADS - iFlushCall(FLUSH_FULLVTLB); - _deleteEEreg(_Rt_, 1); + _freeX86reg(eax); + _freeX86reg(ecx); + _freeX86reg(edx); + _freeX86reg(arg1regd); + + // avoid flushing and immediately reading back + if (_Rt_) + _addNeededX86reg(X86TYPE_GPR, _Rt_); + if (_Rs_) + _addNeededX86reg(X86TYPE_GPR, _Rs_); + + const xRegister32 temp(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); // edi = bit offset in word - xMOV(calleeSavedReg1d, arg1regd); + xMOV(temp, arg1regd); xAND(arg1regd, ~3); - vtlb_DynGenRead32(32, false); + vtlb_DynGenReadNonQuad(32, false, false, arg1regd.GetId(), RETURN_READ_IN_RAX); if (!_Rt_) + { + _freeX86reg(temp); return; + } + + const int treg = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ | MODE_WRITE); + xAND(temp, 3); - xAND(calleeSavedReg1d, 3); xForwardJE8 nomask; - xSHL(calleeSavedReg1d, 3); - // mask off bytes loaded - xMOV(ecx, 24); - xSUB(ecx, calleeSavedReg1d); - xMOV(edx, 0xffffff00); - xSHL(edx, cl); - xAND(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]], edx); + xSHL(temp, 3); + // mask off bytes loaded + xMOV(ecx, 24); + xSUB(ecx, temp); + xMOV(edx, 0xffffff00); + xSHL(edx, cl); + xAND(xRegister32(treg), edx); - // OR in bytes loaded - xMOV(ecx, calleeSavedReg1d); - xSHR(eax, cl); - xOR(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]], eax); + // OR in bytes loaded + xMOV(ecx, temp); + xSHR(eax, cl); + xOR(xRegister32(treg), eax); - xForwardJump8 end; + xForwardJump8 end; nomask.SetTarget(); - eeSignExtendTo(_Rt_); + // NOTE: This might look wrong, but it's correct - see interpreter. + xMOVSX(xRegister64(treg), eax); end.SetTarget(); + _freeX86reg(temp); #else iFlushCall(FLUSH_INTERPRETER); _deleteEEreg(_Rs_, 1); @@ -350,52 +399,73 @@ void recLWR() } //////////////////////////////////////////////////// + void recSWL() { #ifdef REC_STORES - iFlushCall(FLUSH_FULLVTLB); + // avoid flushing and immediately reading back + _addNeededX86reg(X86TYPE_GPR, _Rs_); + + // preload Rt, since we can't do so inside the branch + if (!GPR_IS_CONST1(_Rt_)) + _allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + else + _addNeededX86reg(X86TYPE_GPR, _Rt_); + + const xRegister32 temp(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); + _freeX86reg(eax); + _freeX86reg(ecx); + _freeX86reg(arg1regd); + _freeX86reg(arg2regd); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); // edi = bit offset in word - xMOV(calleeSavedReg1d, arg1regd); + xMOV(temp, arg1regd); xAND(arg1regd, ~3); - xAND(calleeSavedReg1d, 3); - xCMP(calleeSavedReg1d, 3); + xAND(temp, 3); + xCMP(temp, 3); + + // If we're not using fastmem, we need to flush early. Because the first read + // (which would flush) happens inside a branch. + if (!CHECK_FASTMEM || vtlb_IsFaultingPC(pc)) + iFlushCall(FLUSH_FULLVTLB); + xForwardJE8 skip; - xSHL(calleeSavedReg1d, 3); + xSHL(temp, 3); - vtlb_DynGenRead32(32, false); + vtlb_DynGenReadNonQuad(32, false, false, arg1regd.GetId(), RETURN_READ_IN_RAX); - // mask read -> arg2 - xMOV(ecx, calleeSavedReg1d); - xMOV(arg2regd, 0xffffff00); - xSHL(arg2regd, cl); - xAND(arg2regd, eax); + // mask read -> arg2 + xMOV(ecx, temp); + xMOV(arg2regd, 0xffffff00); + xSHL(arg2regd, cl); + xAND(arg2regd, eax); - if (_Rt_) - { - // mask write and OR -> edx - xNEG(ecx); - xADD(ecx, 24); - _eeMoveGPRtoR(eax, _Rt_); - xSHR(eax, cl); - xOR(arg2regd, eax); - } + if (_Rt_) + { + // mask write and OR -> edx + xNEG(ecx); + xADD(ecx, 24); + _eeMoveGPRtoR(eax, _Rt_, false); + xSHR(eax, cl); + xOR(arg2regd, eax); + } - _eeMoveGPRtoR(arg1regd, _Rs_); - if (_Imm_ != 0) - xADD(arg1regd, _Imm_); - xAND(arg1regd, ~3); + _eeMoveGPRtoR(arg1regd, _Rs_, false); + if (_Imm_ != 0) + xADD(arg1regd, _Imm_); + xAND(arg1regd, ~3); - xForwardJump8 end; + xForwardJump8 end; skip.SetTarget(); - _eeMoveGPRtoR(arg2regd, _Rt_); + _eeMoveGPRtoR(arg2regd, _Rt_, false); end.SetTarget(); - vtlb_DynGenWrite(32); + _freeX86reg(temp); + vtlb_DynGenWrite(32, false, arg1regd.GetId(), arg2regd.GetId()); #else iFlushCall(FLUSH_INTERPRETER); _deleteEEreg(_Rs_, 1); @@ -410,48 +480,67 @@ void recSWL() void recSWR() { #ifdef REC_STORES - iFlushCall(FLUSH_FULLVTLB); + // avoid flushing and immediately reading back + _addNeededX86reg(X86TYPE_GPR, _Rs_); + + // preload Rt, since we can't do so inside the branch + if (!GPR_IS_CONST1(_Rt_)) + _allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + else + _addNeededX86reg(X86TYPE_GPR, _Rt_); + + const xRegister32 temp(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); + _freeX86reg(ecx); + _freeX86reg(arg1regd); + _freeX86reg(arg2regd); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); // edi = bit offset in word - xMOV(calleeSavedReg1d, arg1regd); + xMOV(temp, arg1regd); xAND(arg1regd, ~3); - xAND(calleeSavedReg1d, 3); + xAND(temp, 3); + + // If we're not using fastmem, we need to flush early. Because the first read + // (which would flush) happens inside a branch. + if (!CHECK_FASTMEM || vtlb_IsFaultingPC(pc)) + iFlushCall(FLUSH_FULLVTLB); + xForwardJE8 skip; - xSHL(calleeSavedReg1d, 3); + xSHL(temp, 3); - vtlb_DynGenRead32(32, false); + vtlb_DynGenReadNonQuad(32, false, false, arg1regd.GetId(), RETURN_READ_IN_RAX); - // mask read -> edx - xMOV(ecx, 24); - xSUB(ecx, calleeSavedReg1d); - xMOV(arg2regd, 0xffffff); - xSHR(arg2regd, cl); - xAND(arg2regd, eax); + // mask read -> edx + xMOV(ecx, 24); + xSUB(ecx, temp); + xMOV(arg2regd, 0xffffff); + xSHR(arg2regd, cl); + xAND(arg2regd, eax); - if (_Rt_) - { - // mask write and OR -> edx - xMOV(ecx, calleeSavedReg1d); - _eeMoveGPRtoR(eax, _Rt_); - xSHL(eax, cl); - xOR(arg2regd, eax); - } + if (_Rt_) + { + // mask write and OR -> edx + xMOV(ecx, temp); + _eeMoveGPRtoR(eax, _Rt_, false); + xSHL(eax, cl); + xOR(arg2regd, eax); + } - _eeMoveGPRtoR(arg1regd, _Rs_); - if (_Imm_ != 0) - xADD(arg1regd, _Imm_); - xAND(arg1regd, ~3); + _eeMoveGPRtoR(arg1regd, _Rs_, false); + if (_Imm_ != 0) + xADD(arg1regd, _Imm_); + xAND(arg1regd, ~3); - xForwardJump8 end; + xForwardJump8 end; skip.SetTarget(); - _eeMoveGPRtoR(arg2regd, _Rt_); + _eeMoveGPRtoR(arg2regd, _Rt_, false); end.SetTarget(); - vtlb_DynGenWrite(32); + _freeX86reg(temp); + vtlb_DynGenWrite(32, false, arg1regd.GetId(), arg2regd.GetId()); #else iFlushCall(FLUSH_INTERPRETER); _deleteEEreg(_Rs_, 1); @@ -465,40 +554,35 @@ void recSWR() //////////////////////////////////////////////////// /// Masks rt with (0xffffffffffffffff maskshift maskamt), merges with (value shift amt), leaves result in value -static void ldlrhelper_const(int maskamt, const xImplSimd_Shift& maskshift, int amt, const xImplSimd_Shift& shift, const xRegisterSSE& value, const xRegisterSSE& rt) +static void ldlrhelper_const(int maskamt, const xImpl_Group2& maskshift, int amt, const xImpl_Group2& shift, const xRegister64& value, const xRegister64& rt) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - xRegisterSSE t0(t0reg); + pxAssert(rt.GetId() != ecx.GetId() && value.GetId() != ecx.GetId()); - xPCMP.EQD(t0, t0); - maskshift.Q(t0, maskamt); - xPAND(t0, rt); + // Would xor rcx, rcx; not rcx be better here? + xMOV(rcx, -1); - shift.Q(value, amt); - xPOR(value, t0); + maskshift(rcx, maskamt); + xAND(rt, rcx); - _freeXMMreg(t0reg); + shift(value, amt); + xOR(rt, value); } /// Masks rt with (0xffffffffffffffff maskshift maskamt), merges with (value shift amt), leaves result in value -static void ldlrhelper(const xRegister32& maskamt, const xImplSimd_Shift& maskshift, const xRegister32& amt, const xImplSimd_Shift& shift, const xRegisterSSE& value, const xRegisterSSE& rt) +static void ldlrhelper(const xRegister32& maskamt, const xImpl_Group2& maskshift, const xRegister32& amt, const xImpl_Group2& shift, const xRegister64& value, const xRegister64& rt) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); - xRegisterSSE t0(t0reg); - xRegisterSSE t1(t1reg); + pxAssert(rt.GetId() != ecx.GetId() && amt.GetId() != ecx.GetId() && value.GetId() != ecx.GetId()); - xMOVDZX(t1, maskamt); - xPCMP.EQD(t0, t0); - maskshift.Q(t0, t1); - xPAND(t0, rt); + // Would xor rcx, rcx; not rcx be better here? + const xRegister64 maskamt64(maskamt); + xMOV(ecx, maskamt); + xMOV(maskamt64, -1); + maskshift(maskamt64, cl); + xAND(rt, maskamt64); - xMOVDZX(t1, amt); - shift.Q(value, t1); - xPOR(value, t0); - - _freeXMMreg(t1reg); - _freeXMMreg(t0reg); + xMOV(ecx, amt); + shift(value, cl); + xOR(rt, value); } void recLDL() @@ -506,43 +590,46 @@ void recLDL() if (!_Rt_) return; -#ifdef LOADSTORE_RECOMPILE - int t2reg; +#ifdef REC_LOADS + // avoid flushing and immediately reading back + if (_Rt_) + _addNeededX86reg(X86TYPE_GPR, _Rt_); + if (_Rs_) + _addNeededX86reg(X86TYPE_GPR, _Rs_); - if (GPR_IS_CONST1(_Rt_)) - { - _flushConstReg(_Rt_); - _eeOnWriteReg(_Rt_, 0); - } + const xRegister32 temp1(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); + _freeX86reg(eax); + _freeX86reg(ecx); + _freeX86reg(edx); + _freeX86reg(arg1regd); if (GPR_IS_CONST1(_Rs_)) { u32 srcadr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; - // If _Rs_ is equal to _Rt_ we need to put the shift in to eax since it won't take the CONST path + // If _Rs_ is equal to _Rt_ we need to put the shift in to eax since it won't take the CONST path. if (_Rs_ == _Rt_) - xMOV(calleeSavedReg1d, srcadr); + xMOV(temp1, srcadr); srcadr &= ~0x07; - t2reg = vtlb_DynGenRead64_Const(64, srcadr, -1); + vtlb_DynGenReadNonQuad_Const(64, false, false, srcadr, RETURN_READ_IN_RAX); } else { // Load ECX with the source memory address that we're reading from. + _freeX86reg(arg1regd); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); - xMOV(calleeSavedReg1d, arg1regd); + xMOV(temp1, arg1regd); xAND(arg1regd, ~0x07); - iFlushCall(FLUSH_FULLVTLB); - - t2reg = vtlb_DynGenRead64(64, -1); + vtlb_DynGenReadNonQuad(64, false, false, arg1regd.GetId(), RETURN_READ_IN_RAX); } - - int rtreg = _allocGPRtoXMMreg(-1, _Rt_, MODE_READ | MODE_WRITE); + + const xRegister64 treg(_allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ | MODE_WRITE)); if (GPR_IS_CONST1(_Rs_)) { @@ -550,28 +637,30 @@ void recLDL() shift = ((shift & 0x7) + 1) * 8; if (shift != 64) { - ldlrhelper_const(shift, xPSRL, 64 - shift, xPSLL, xRegisterSSE(t2reg), xRegisterSSE(rtreg)); + ldlrhelper_const(shift, xSHR, 64 - shift, xSHL, rax, treg); + } + else + { + xMOV(treg, rax); } } else { - xAND(calleeSavedReg1d, 0x7); - xCMP(calleeSavedReg1d, 7); + xAND(temp1, 0x7); + xCMP(temp1, 7); + xCMOVE(treg, rax); // swap register with memory when not shifting xForwardJE8 skip; - // Calculate the shift from top bit to lowest - xADD(calleeSavedReg1d, 1); - xMOV(edx, 64); - xSHL(calleeSavedReg1d, 3); - xSUB(edx, calleeSavedReg1d); + // Calculate the shift from top bit to lowest. + xADD(temp1, 1); + xMOV(edx, 64); + xSHL(temp1, 3); + xSUB(edx, temp1); - ldlrhelper(calleeSavedReg1d, xPSRL, edx, xPSLL, xRegisterSSE(t2reg), xRegisterSSE(rtreg)); + ldlrhelper(temp1, xSHR, edx, xSHL, rax, treg); skip.SetTarget(); } - xMOVSD(xRegisterSSE(rtreg), xRegisterSSE(t2reg)); - - _freeXMMreg(t2reg); - _clearNeededXMMregs(); + _freeX86reg(temp1); #else iFlushCall(FLUSH_INTERPRETER); _deleteEEreg(_Rs_, 1); @@ -588,43 +677,46 @@ void recLDR() if (!_Rt_) return; -#ifdef LOADSTORE_RECOMPILE - int t2reg; - - if (GPR_IS_CONST1(_Rt_)) - { - _flushConstReg(_Rt_); - _eeOnWriteReg(_Rt_, 0); - } +#ifdef REC_LOADS + // avoid flushing and immediately reading back + if (_Rt_) + _addNeededX86reg(X86TYPE_GPR, _Rt_); + if (_Rs_) + _addNeededX86reg(X86TYPE_GPR, _Rs_); + + const xRegister32 temp1(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); + _freeX86reg(eax); + _freeX86reg(ecx); + _freeX86reg(edx); + _freeX86reg(arg1regd); if (GPR_IS_CONST1(_Rs_)) { u32 srcadr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; - // If _Rs_ is equal to _Rt_ we need to put the shift in to eax since it won't take the CONST path - if(_Rs_ == _Rt_) - xMOV(calleeSavedReg1d, srcadr); + // If _Rs_ is equal to _Rt_ we need to put the shift in to eax since it won't take the CONST path. + if (_Rs_ == _Rt_) + xMOV(temp1, srcadr); srcadr &= ~0x07; - t2reg = vtlb_DynGenRead64_Const(64, srcadr, -1); + vtlb_DynGenReadNonQuad_Const(64, false, false, srcadr, RETURN_READ_IN_RAX); } else { // Load ECX with the source memory address that we're reading from. + _freeX86reg(arg1regd); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); - xMOV(calleeSavedReg1d, arg1regd); + xMOV(temp1, arg1regd); xAND(arg1regd, ~0x07); - iFlushCall(FLUSH_FULLVTLB); - - t2reg = vtlb_DynGenRead64(64, -1); + vtlb_DynGenReadNonQuad(64, false, false, arg1regd.GetId(), RETURN_READ_IN_RAX); } - int rtreg = _allocGPRtoXMMreg(-1, _Rt_, MODE_READ | MODE_WRITE); + const xRegister64 treg(_allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ | MODE_WRITE)); if (GPR_IS_CONST1(_Rs_)) { @@ -632,27 +724,28 @@ void recLDR() shift = (shift & 0x7) * 8; if (shift != 0) { - ldlrhelper_const(64 - shift, xPSLL, shift, xPSRL, xRegisterSSE(t2reg), xRegisterSSE(rtreg)); + ldlrhelper_const(64 - shift, xSHL, shift, xSHR, rax, treg); + } + else + { + xMOV(treg, rax); } } else { - xAND(calleeSavedReg1d, 0x7); + xAND(temp1, 0x7); + xCMOVE(treg, rax); // swap register with memory when not shifting xForwardJE8 skip; - // Calculate the shift from top bit to lowest - xMOV(edx, 64); - xSHL(calleeSavedReg1d, 3); - xSUB(edx, calleeSavedReg1d); + // Calculate the shift from top bit to lowest. + xMOV(edx, 64); + xSHL(temp1, 3); + xSUB(edx, temp1); - ldlrhelper(edx, xPSLL, calleeSavedReg1d, xPSRL, xRegisterSSE(t2reg), xRegisterSSE(rtreg)); + ldlrhelper(edx, xSHL, temp1, xSHR, rax, treg); skip.SetTarget(); } - xMOVSD(xRegisterSSE(rtreg), xRegisterSSE(t2reg)); - - _freeXMMreg(t2reg); - _clearNeededXMMregs(); - + _freeX86reg(temp1); #else iFlushCall(FLUSH_INTERPRETER); _deleteEEreg(_Rs_, 1); @@ -666,54 +759,45 @@ void recLDR() //////////////////////////////////////////////////// /// Masks value with (0xffffffffffffffff maskshift maskamt), merges with (rt shift amt), saves to dummyValue -static void sdlrhelper_const(int maskamt, const xImplSimd_Shift& maskshift, int amt, const xImplSimd_Shift& shift, const xRegisterSSE& value, const xRegisterSSE& rt) +static void sdlrhelper_const(int maskamt, const xImpl_Group2& maskshift, int amt, const xImpl_Group2& shift, const xRegister64& value, const xRegister64& rt) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - xRegisterSSE t0(t0reg); + pxAssert(rt.GetId() != ecx.GetId() && value.GetId() != ecx.GetId()); + xMOV(rcx, -1); + maskshift(rcx, maskamt); + xAND(rcx, value); - xPCMP.EQD(t0, t0); - maskshift.Q(t0, maskamt); - xPAND(t0, value); - - shift.Q(rt, amt); - xPOR(rt, t0); - - xLEA(arg2reg, ptr[&dummyValue[0]]); - xMOVQ(ptr64[arg2reg], rt); - - _freeXMMreg(t0reg); + shift(rt, amt); + xOR(rt, rcx); } /// Masks value with (0xffffffffffffffff maskshift maskamt), merges with (rt shift amt), saves to dummyValue -static void sdlrhelper(const xRegister32& maskamt, const xImplSimd_Shift& maskshift, const xRegister32& amt, const xImplSimd_Shift& shift, const xRegisterSSE& value, const xRegisterSSE& rt) +static void sdlrhelper(const xRegister32& maskamt, const xImpl_Group2& maskshift, const xRegister32& amt, const xImpl_Group2& shift, const xRegister64& value, const xRegister64& rt) { - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - int t1reg = _allocTempXMMreg(XMMT_INT, -1); - xRegisterSSE t0(t0reg); - xRegisterSSE t1(t1reg); + pxAssert(rt.GetId() != ecx.GetId() && amt.GetId() != ecx.GetId() && value.GetId() != ecx.GetId()); // Generate mask 128-(shiftx8) - xMOVDZX(t1, maskamt); - xPCMP.EQD(t0, t0); - maskshift.Q(t0, t1); - xPAND(t0, value); + const xRegister64 maskamt64(maskamt); + xMOV(ecx, maskamt); + xMOV(maskamt64, -1); + maskshift(maskamt64, cl); + xAND(maskamt64, value); // Shift over reg value - xMOVDZX(t1, amt); - shift.Q(rt, t1); - xPOR(rt, t0); - - xLEA(arg2reg, ptr[&dummyValue[0]]); - xMOVQ(ptr64[arg2reg], rt); - - _freeXMMreg(t1reg); - _freeXMMreg(t0reg); + xMOV(ecx, amt); + shift(rt, cl); + xOR(rt, maskamt64); } void recSDL() { -#ifdef LOADSTORE_RECOMPILE - _flushEEreg(_Rt_); // flush register to mem +#ifdef REC_STORES + // avoid flushing and immediately reading back + if (_Rt_) + _addNeededX86reg(X86TYPE_GPR, _Rt_); + + _freeX86reg(ecx); + _freeX86reg(arg2regd); + if (GPR_IS_CONST1(_Rs_)) { u32 adr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; @@ -721,57 +805,65 @@ void recSDL() u32 shift = ((adr & 0x7) + 1) * 8; if (shift == 64) { - xLEA(arg2reg, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + _eeMoveGPRtoR(arg2reg, _Rt_); } else { - int t2reg = vtlb_DynGenRead64_Const(64, aligned, -1); - int rtreg = _allocGPRtoXMMreg(-1, _Rt_, MODE_READ); - sdlrhelper_const(shift, xPSLL, 64 - shift, xPSRL, xRegisterSSE(t2reg), xRegisterSSE(rtreg)); - _deleteGPRtoXMMreg(_Rt_, 3); - _freeXMMreg(t2reg); + vtlb_DynGenReadNonQuad_Const(64, false, false, aligned, RETURN_READ_IN_RAX); + _eeMoveGPRtoR(arg2reg, _Rt_); + sdlrhelper_const(shift, xSHL, 64 - shift, xSHR, rax, arg2reg); } - vtlb_DynGenWrite_Const(64, aligned); + vtlb_DynGenWrite_Const(64, false, aligned, arg2regd.GetId()); } else { + if (_Rs_) + _addNeededX86reg(X86TYPE_GPR, _Rs_); + // Load ECX with the source memory address that we're reading from. + _freeX86reg(arg1regd); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); - iFlushCall(FLUSH_FULLVTLB); - xMOV(calleeSavedReg1d, arg1regd); + _freeX86reg(ecx); + _freeX86reg(edx); + _freeX86reg(arg2regd); + const xRegister32 temp1(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); + const xRegister64 temp2(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); + _eeMoveGPRtoR(arg2reg, _Rt_); + + xMOV(temp1, arg1regd); + xMOV(temp2, arg2reg); xAND(arg1regd, ~0x07); - xAND(calleeSavedReg1d, 0x7); - xCMP(calleeSavedReg1d, 7); + xAND(temp1, 0x7); + xCMP(temp1, 7); + + // If we're not using fastmem, we need to flush early. Because the first read + // (which would flush) happens inside a branch. + if (!CHECK_FASTMEM || vtlb_IsFaultingPC(pc)) + iFlushCall(FLUSH_FULLVTLB); + xForwardJE8 skip; - xADD(calleeSavedReg1d, 1); - int t2reg = vtlb_DynGenRead64(64, -1); - int rtreg = _allocGPRtoXMMreg(-1, _Rt_, MODE_READ); + xADD(temp1, 1); + vtlb_DynGenReadNonQuad(64, false, false, arg1regd.GetId(), RETURN_READ_IN_RAX); - //Calculate the shift from top bit to lowest - xMOV(edx, 64); - xSHL(calleeSavedReg1d, 3); - xSUB(edx, calleeSavedReg1d); + //Calculate the shift from top bit to lowest + xMOV(edx, 64); + xSHL(temp1, 3); + xSUB(edx, temp1); - sdlrhelper(calleeSavedReg1d, xPSLL, edx, xPSRL, xRegisterSSE(t2reg), xRegisterSSE(rtreg)); + sdlrhelper(temp1, xSHL, edx, xSHR, rax, temp2); - _deleteGPRtoXMMreg(_Rt_, 3); - _freeXMMreg(t2reg); - - _eeMoveGPRtoR(arg1regd, _Rs_); - if (_Imm_ != 0) - xADD(arg1regd, _Imm_); - xAND(arg1regd, ~0x7); - xForwardJump8 end; + _eeMoveGPRtoR(arg1regd, _Rs_, false); + if (_Imm_ != 0) + xADD(arg1regd, _Imm_); + xAND(arg1regd, ~0x7); skip.SetTarget(); - xLEA(arg2reg, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); - end.SetTarget(); - iFlushCall(FLUSH_FULLVTLB); - - vtlb_DynGenWrite(64); + vtlb_DynGenWrite(64, false, arg1regd.GetId(), temp2.GetId()); + _freeX86reg(temp2.GetId()); + _freeX86reg(temp1.GetId()); } #else iFlushCall(FLUSH_INTERPRETER); @@ -785,8 +877,14 @@ void recSDL() //////////////////////////////////////////////////// void recSDR() { -#ifdef LOADSTORE_RECOMPILE - _flushEEreg(_Rt_); // flush register to mem +#ifdef REC_STORES + // avoid flushing and immediately reading back + if (_Rt_) + _addNeededX86reg(X86TYPE_GPR, _Rt_); + + _freeX86reg(ecx); + _freeX86reg(arg2regd); + if (GPR_IS_CONST1(_Rs_)) { u32 adr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; @@ -794,55 +892,63 @@ void recSDR() u32 shift = (adr & 0x7) * 8; if (shift == 0) { - xLEA(arg2reg, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + _eeMoveGPRtoR(arg2reg, _Rt_); } else { - int t2reg = vtlb_DynGenRead64_Const(64, aligned, -1); - int rtreg = _allocGPRtoXMMreg(-1, _Rt_, MODE_READ); - sdlrhelper_const(64 - shift, xPSRL, shift, xPSLL, xRegisterSSE(t2reg), xRegisterSSE(rtreg)); - _deleteGPRtoXMMreg(_Rt_, 3); - _freeXMMreg(t2reg); + vtlb_DynGenReadNonQuad_Const(64, false, false, aligned, RETURN_READ_IN_RAX); + _eeMoveGPRtoR(arg2reg, _Rt_); + sdlrhelper_const(64 - shift, xSHR, shift, xSHL, rax, arg2reg); } - vtlb_DynGenWrite_Const(64, aligned); + vtlb_DynGenWrite_Const(64, false, aligned, arg2reg.GetId()); } else { + if (_Rs_) + _addNeededX86reg(X86TYPE_GPR, _Rs_); + // Load ECX with the source memory address that we're reading from. _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); - iFlushCall(FLUSH_FULLVTLB); - xMOV(calleeSavedReg1d, arg1regd); + _freeX86reg(ecx); + _freeX86reg(edx); + _freeX86reg(arg2regd); + const xRegister32 temp1(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); + const xRegister64 temp2(_allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED)); + _eeMoveGPRtoR(arg2reg, _Rt_); + + xMOV(temp1, arg1regd); + xMOV(temp2, arg2reg); xAND(arg1regd, ~0x07); - xAND(calleeSavedReg1d, 0x7); + xAND(temp1, 0x7); + + // If we're not using fastmem, we need to flush early. Because the first read + // (which would flush) happens inside a branch. + if (!CHECK_FASTMEM || vtlb_IsFaultingPC(pc)) + iFlushCall(FLUSH_FULLVTLB); + xForwardJE8 skip; - int t2reg = vtlb_DynGenRead64(64, -1); - int rtreg = _allocGPRtoXMMreg(-1, _Rt_, MODE_READ); + vtlb_DynGenReadNonQuad(64, false, false, arg1regd.GetId(), RETURN_READ_IN_RAX); - xMOV(edx, 64); - xSHL(calleeSavedReg1d, 3); - xSUB(edx, calleeSavedReg1d); + xMOV(edx, 64); + xSHL(temp1, 3); + xSUB(edx, temp1); - sdlrhelper(edx, xPSRL, calleeSavedReg1d, xPSLL, xRegisterSSE(t2reg), xRegisterSSE(rtreg)); + sdlrhelper(edx, xSHR, temp1, xSHL, rax, temp2); - _deleteGPRtoXMMreg(_Rt_, 3); - _freeXMMreg(t2reg); - - _eeMoveGPRtoR(arg1regd, _Rs_); - if (_Imm_ != 0) - xADD(arg1regd, _Imm_); - xAND(arg1regd, ~0x7); - xForwardJump8 end; + _eeMoveGPRtoR(arg1regd, _Rs_, false); + if (_Imm_ != 0) + xADD(arg1regd, _Imm_); + xAND(arg1regd, ~0x7); + xMOV(arg2reg, temp2); skip.SetTarget(); - xLEA(arg2reg, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); - end.SetTarget(); - iFlushCall(FLUSH_FULLVTLB); - - vtlb_DynGenWrite(64); + vtlb_DynGenWrite(64, false, arg1regd.GetId(), temp2.GetId()); + _freeX86reg(temp2.GetId()); + _freeX86reg(temp1.GetId()); } #else iFlushCall(FLUSH_INTERPRETER); @@ -866,26 +972,23 @@ void recLWC1() #ifndef FPU_RECOMPILE recCall(::R5900::Interpreter::OpcodeImpl::LWC1); #else - _deleteFPtoXMMreg(_Rt_, 2); + const vtlb_ReadRegAllocCallback alloc_cb = []() { return _allocFPtoXMMreg(_Rt_, MODE_WRITE); }; if (GPR_IS_CONST1(_Rs_)) { - int addr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; - vtlb_DynGenRead32_Const(32, false, addr); + const u32 addr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; + vtlb_DynGenReadNonQuad_Const(32, false, true, addr, alloc_cb); } else { + _freeX86reg(arg1regd); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); - iFlushCall(FLUSH_FULLVTLB); - - vtlb_DynGenRead32(32, false); + vtlb_DynGenReadNonQuad(32, false, true, arg1regd.GetId(), alloc_cb); } - xMOV(ptr32[&fpuRegs.fpr[_Rt_].UL], eax); - EE::Profiler.EmitOp(eeOpcode::LWC1); #endif } @@ -897,137 +1000,26 @@ void recSWC1() #ifndef FPU_RECOMPILE recCall(::R5900::Interpreter::OpcodeImpl::SWC1); #else - _deleteFPtoXMMreg(_Rt_, 1); - - xMOV(arg2regd, ptr32[&fpuRegs.fpr[_Rt_].UL]); - + const int regt = _allocFPtoXMMreg(_Rt_, MODE_READ); if (GPR_IS_CONST1(_Rs_)) { - int addr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; - vtlb_DynGenWrite_Const(32, addr); + const u32 addr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; + vtlb_DynGenWrite_Const(32, true, addr, regt); } else { + _freeX86reg(arg1regd); _eeMoveGPRtoR(arg1regd, _Rs_); if (_Imm_ != 0) xADD(arg1regd, _Imm_); - iFlushCall(FLUSH_FULLVTLB); - - vtlb_DynGenWrite(32); + vtlb_DynGenWrite(32, true, arg1regd.GetId(), regt); } EE::Profiler.EmitOp(eeOpcode::SWC1); #endif } -//////////////////////////////////////////////////// - -/********************************************************* -* Load and store for COP2 (VU0 unit) * -* Format: OP rt, offset(base) * -*********************************************************/ - -#define _Ft_ _Rt_ -#define _Fs_ _Rd_ -#define _Fd_ _Sa_ - - - -void recLQC2() -{ - _freeX86reg(eax); - xMOV(eax, ptr32[&cpuRegs.cycle]); - xADD(eax, scaleblockcycles_clear()); - xMOV(ptr32[&cpuRegs.cycle], eax); // update cycles - - xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); - xForwardJZ32 skipvuidle; - xSUB(eax, ptr32[&VU0.cycle]); - xSUB(eax, ptr32[&VU0.nextBlockCycles]); - xCMP(eax, 4); - xForwardJL32 skip; - _cop2BackupRegs(); - xLoadFarAddr(arg1reg, CpuVU0); - xMOV(arg2reg, s_nBlockInterlocked); - xFastCall((void*)BaseVUmicroCPU::ExecuteBlockJIT, arg1reg, arg2reg); - _cop2RestoreRegs(); - skip.SetTarget(); - skipvuidle.SetTarget(); - - int gpr; - - if (GPR_IS_CONST1(_Rs_)) - { - int addr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; - - gpr = vtlb_DynGenRead64_Const(128, addr, -1); - } - else - { - _eeMoveGPRtoR(arg1regd, _Rs_); - if (_Imm_ != 0) - xADD(arg1regd, _Imm_); - - iFlushCall(FLUSH_FULLVTLB); - - gpr = vtlb_DynGenRead64(128, -1); - } - - if (_Rt_) - xMOVAPS(ptr128[&VU0.VF[_Ft_].UD[0]], xRegisterSSE(gpr)); - - _freeXMMreg(gpr); - - EE::Profiler.EmitOp(eeOpcode::LQC2); -} - -//////////////////////////////////////////////////// - -void recSQC2() -{ - _freeX86reg(eax); - xMOV(eax, ptr32[&cpuRegs.cycle]); - xADD(eax, scaleblockcycles_clear()); - xMOV(ptr32[&cpuRegs.cycle], eax); // update cycles - - xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); - xForwardJZ32 skipvuidle; - xSUB(eax, ptr32[&VU0.cycle]); - xSUB(eax, ptr32[&VU0.nextBlockCycles]); - xCMP(eax, 4); - xForwardJL32 skip; - _cop2BackupRegs(); - xLoadFarAddr(arg1reg, CpuVU0); - xMOV(arg2reg, s_nBlockInterlocked); - xFastCall((void*)BaseVUmicroCPU::ExecuteBlockJIT, arg1reg, arg2reg); - _cop2RestoreRegs(); - skip.SetTarget(); - skipvuidle.SetTarget(); - - xLEA(arg2reg, ptr[&VU0.VF[_Ft_].UD[0]]); - - if (GPR_IS_CONST1(_Rs_)) - { - int addr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_; - vtlb_DynGenWrite_Const(128, addr); - } - else - { - _eeMoveGPRtoR(arg1regd, _Rs_); - if (_Imm_ != 0) - xADD(arg1regd, _Imm_); - - iFlushCall(FLUSH_FULLVTLB); - - vtlb_DynGenWrite(128); - } - - EE::Profiler.EmitOp(eeOpcode::SQC2); -} - #endif -} // namespace OpcodeImpl -} // namespace Dynarec -} // namespace R5900 +} // namespace R5900::Dynarec::OpcodeImpl diff --git a/pcsx2/x86/ix86-32/iR5900Move.cpp b/pcsx2/x86/ix86-32/iR5900Move.cpp index 4021b05545..0a92a83f98 100644 --- a/pcsx2/x86/ix86-32/iR5900Move.cpp +++ b/pcsx2/x86/ix86-32/iR5900Move.cpp @@ -22,9 +22,8 @@ using namespace x86Emitter; -namespace R5900 { -namespace Dynarec { -namespace OpcodeImpl { +namespace R5900::Dynarec::OpcodeImpl +{ /********************************************************* * Shift arithmetic with constant shift * @@ -34,7 +33,7 @@ namespace OpcodeImpl { namespace Interp = R5900::Interpreter::OpcodeImpl; -REC_FUNC_DEL(LUI, _Rt_); +REC_FUNC_DEL(LUI, _Rt_); REC_FUNC_DEL(MFLO, _Rd_); REC_FUNC_DEL(MFHI, _Rd_); REC_FUNC(MTLO); @@ -56,11 +55,6 @@ static void xCopy64(u64* dst, u64* src) xMOV(ptr64[dst], rax); } -static void xCMPToZero64(u64* mem) -{ - xCMP(ptr64[mem], 0); -} - /********************************************************* * Load higher 16 bits of the first word in GPR with imm * * Format: OP rt, immediate * @@ -69,22 +63,13 @@ static void xCMPToZero64(u64* mem) //// LUI void recLUI() { - int mmreg; if (!_Rt_) return; - _eeOnWriteReg(_Rt_, 1); - - if ((mmreg = _checkXMMreg(XMMTYPE_GPRREG, _Rt_, MODE_WRITE)) >= 0) - { - if (xmmregs[mmreg].mode & MODE_WRITE) - { - xMOVH.PS(ptr[&cpuRegs.GPR.r[_Rt_].UL[2]], xRegisterSSE(mmreg)); - } - xmmregs[mmreg].inuse = 0; - } - - _deleteEEreg(_Rt_, 0); + // need to flush the upper 64 bits for xmm + GPR_DEL_CONST(_Rt_); + _deleteGPRtoX86reg(_Rt_, DELETE_REG_FREE_NO_WRITEBACK); + _deleteGPRtoXMMreg(_Rt_, DELETE_REG_FLUSH_AND_FREE); if (EE_CONST_PROP) { @@ -93,363 +78,300 @@ void recLUI() } else { - xMOV(eax, (s32)(cpuRegs.code << 16)); - eeSignExtendTo(_Rt_); + const int regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); + xMOV64(xRegister64(regt), (s64)(s32)(cpuRegs.code << 16)); } EE::Profiler.EmitOp(eeOpcode::LUI); } //////////////////////////////////////////////////// -void recMFHILO(int hi) +static void recMFHILO(bool hi, bool upper) { - int reghi, regd, xmmhilo; if (!_Rd_) return; - xmmhilo = hi ? XMMGPR_HI : XMMGPR_LO; - reghi = _checkXMMreg(XMMTYPE_GPRREG, xmmhilo, MODE_READ); - + // kill any constants on rd, lower 64 bits get written regardless of upper _eeOnWriteReg(_Rd_, 0); - regd = _checkXMMreg(XMMTYPE_GPRREG, _Rd_, MODE_READ | MODE_WRITE); - - if (reghi >= 0) + const int reg = hi ? XMMGPR_HI : XMMGPR_LO; + const int xmmd = EEINST_XMMUSEDTEST(_Rd_) ? _allocGPRtoXMMreg(_Rd_, MODE_READ | MODE_WRITE) : _checkXMMreg(XMMTYPE_GPRREG, _Rd_, MODE_READ | MODE_WRITE); + const int xmmhilo = EEINST_XMMUSEDTEST(reg) ? _allocGPRtoXMMreg(reg, MODE_READ) : _checkXMMreg(XMMTYPE_GPRREG, reg, MODE_READ); + if (xmmd >= 0) { - if (regd >= 0) + if (xmmhilo >= 0) { - pxAssert(regd != reghi); - - xmmregs[regd].inuse = 0; - - xMOVQ(ptr[&cpuRegs.GPR.r[_Rd_].UL[0]], xRegisterSSE(reghi)); - - if (xmmregs[regd].mode & MODE_WRITE) - { - xMOVH.PS(ptr[&cpuRegs.GPR.r[_Rd_].UL[2]], xRegisterSSE(regd)); - } + if (upper) + xMOVHL.PS(xRegisterSSE(xmmd), xRegisterSSE(xmmhilo)); + else + xMOVSD(xRegisterSSE(xmmd), xRegisterSSE(xmmhilo)); } else { - _deleteEEreg(_Rd_, 0); - xMOVQ(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], xRegisterSSE(reghi)); + const int gprhilo = upper ? -1 : _allocIfUsedGPRtoX86(reg, MODE_READ); + if (gprhilo >= 0) + xPINSR.Q(xRegisterSSE(xmmd), xRegister64(gprhilo), 0); + else + xPINSR.Q(xRegisterSSE(xmmd), ptr64[hi ? &cpuRegs.HI.UD[static_cast(upper)] : &cpuRegs.LO.UD[static_cast(upper)]], 0); } } else { - if (regd >= 0) + // try rename {hi,lo} -> rd + const int gprreg = upper ? -1 : _checkX86reg(X86TYPE_GPR, reg, MODE_READ); + if (gprreg >= 0 && _eeTryRenameReg(_Rd_, reg, gprreg, -1, 0) >= 0) + return; + + const int gprd = _allocIfUsedGPRtoX86(_Rd_, MODE_WRITE); + if (gprd >= 0 && xmmhilo >= 0) { - if (EEINST_ISLIVE2(_Rd_)) - xMOVL.PS(xRegisterSSE(regd), ptr[(void*)(hi ? (uptr)&cpuRegs.HI.UD[0] : (uptr)&cpuRegs.LO.UD[0])]); + pxAssert(gprreg < 0); + if (upper) + xPEXTR.Q(xRegister64(gprd), xRegisterSSE(xmmhilo), 1); else - xMOVQZX(xRegisterSSE(regd), ptr[(void*)(hi ? (uptr)&cpuRegs.HI.UD[0] : (uptr)&cpuRegs.LO.UD[0])]); + xMOVD(xRegister64(gprd), xRegisterSSE(xmmhilo)); + } + else if (gprd < 0 && xmmhilo >= 0) + { + pxAssert(gprreg < 0); + if (upper) + xPEXTR.Q(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], xRegisterSSE(xmmhilo), 1); + else + xMOVQ(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], xRegisterSSE(xmmhilo)); + } + else if (gprd >= 0) + { + if (gprreg >= 0) + xMOV(xRegister64(gprd), xRegister64(gprreg)); + else + xMOV(xRegister64(gprd), ptr64[hi ? &cpuRegs.HI.UD[static_cast(upper)] : &cpuRegs.LO.UD[static_cast(upper)]]); + } + else if (gprreg >= 0) + { + xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], xRegister64(gprreg)); } else { - _deleteEEreg(_Rd_, 0); - xCopy64(&cpuRegs.GPR.r[_Rd_].UD[0], hi ? &cpuRegs.HI.UD[0] : &cpuRegs.LO.UD[0]); + xMOV(rax, ptr64[hi ? &cpuRegs.HI.UD[static_cast(upper)] : &cpuRegs.LO.UD[static_cast(upper)]]); + xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); } } } -void recMTHILO(int hi) +static void recMTHILO(bool hi, bool upper) { - int reghi, regs, xmmhilo; - uptr addrhilo; + const int reg = hi ? XMMGPR_HI : XMMGPR_LO; + _eeOnWriteReg(reg, 0); - xmmhilo = hi ? XMMGPR_HI : XMMGPR_LO; - addrhilo = hi ? (uptr)&cpuRegs.HI.UD[0] : (uptr)&cpuRegs.LO.UD[0]; - - regs = _checkXMMreg(XMMTYPE_GPRREG, _Rs_, MODE_READ); - reghi = _checkXMMreg(XMMTYPE_GPRREG, xmmhilo, MODE_READ | MODE_WRITE); - - if (reghi >= 0) + const int xmms = EEINST_XMMUSEDTEST(_Rs_) ? _allocGPRtoXMMreg(_Rs_, MODE_READ) : _checkXMMreg(XMMTYPE_GPRREG, _Rs_, MODE_READ); + const int xmmhilo = EEINST_XMMUSEDTEST(reg) ? _allocGPRtoXMMreg(reg, MODE_READ | MODE_WRITE) : _checkXMMreg(XMMTYPE_GPRREG, reg, MODE_READ | MODE_WRITE); + if (xmms >= 0) { - if (regs >= 0) + if (xmmhilo >= 0) { - pxAssert(reghi != regs); - - _deleteGPRtoXMMreg(_Rs_, 0); - xPUNPCK.HQDQ(xRegisterSSE(reghi), xRegisterSSE(reghi)); - xPUNPCK.LQDQ(xRegisterSSE(regs), xRegisterSSE(reghi)); - - // swap regs - xmmregs[regs] = xmmregs[reghi]; - xmmregs[reghi].inuse = 0; - xmmregs[regs].mode |= MODE_WRITE; + if (upper) + xMOVLH.PS(xRegisterSSE(xmmhilo), xRegisterSSE(xmms)); + else + xMOVSD(xRegisterSSE(xmmhilo), xRegisterSSE(xmms)); } else { - _flushConstReg(_Rs_); - xMOVL.PS(xRegisterSSE(reghi), ptr[&cpuRegs.GPR.r[_Rs_].UD[0]]); - xmmregs[reghi].mode |= MODE_WRITE; + const int gprhilo = upper ? -1 : _allocIfUsedGPRtoX86(reg, MODE_WRITE); + if (gprhilo >= 0) + xMOVD(xRegister64(gprhilo), xRegisterSSE(xmms)); // actually movq + else + xMOVQ(ptr64[hi ? &cpuRegs.HI.UD[static_cast(upper)] : &cpuRegs.LO.UD[static_cast(upper)]], xRegisterSSE(xmms)); } } else { - if (regs >= 0) + // try rename rs -> {hi,lo} + const int gprs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + if (gprs >= 0 && !upper && _eeTryRenameReg(reg, _Rs_, gprs, -1, 0) >= 0) + return; + + if (xmmhilo >= 0) { - xMOVQ(ptr[(void*)(addrhilo)], xRegisterSSE(regs)); - } - else - { - if (GPR_IS_CONST1(_Rs_)) + if (gprs >= 0) { - xWriteImm64ToMem((u64*)addrhilo, rax, g_cpuConstRegs[_Rs_].UD[0]); + xPINSR.Q(xRegisterSSE(xmmhilo), xRegister64(gprs), static_cast(upper)); + } + else if (GPR_IS_CONST1(_Rs_)) + { + _eeMoveGPRtoR(rax, _Rs_); + xPINSR.Q(xRegisterSSE(xmmhilo), rax, static_cast(upper)); } else { - _eeMoveGPRtoR(ecx, _Rs_); - _flushEEreg(_Rs_); - xCopy64((u64*)addrhilo, &cpuRegs.GPR.r[_Rs_].UD[0]); + xPINSR.Q(xRegisterSSE(xmmhilo), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]], static_cast(upper)); } } + else + { + const int gprreg = upper ? -1 : _allocIfUsedGPRtoX86(reg, MODE_WRITE); + if (gprreg >= 0) + _eeMoveGPRtoR(xRegister64(gprreg), _Rs_); + else + _eeMoveGPRtoM((uptr)(hi ? &cpuRegs.HI.UD[static_cast(upper)] : &cpuRegs.LO.UD[static_cast(upper)]), _Rs_); + } } } + void recMFHI() { - recMFHILO(1); + recMFHILO(true, false); EE::Profiler.EmitOp(eeOpcode::MFHI); } void recMFLO() { - recMFHILO(0); + recMFHILO(false, false); EE::Profiler.EmitOp(eeOpcode::MFLO); } void recMTHI() { - recMTHILO(1); + recMTHILO(true, false); EE::Profiler.EmitOp(eeOpcode::MTHI); } void recMTLO() { - recMTHILO(0); + recMTHILO(false, false); EE::Profiler.EmitOp(eeOpcode::MTLO); } -//////////////////////////////////////////////////// -void recMFHILO1(int hi) -{ - int reghi, regd, xmmhilo; - if (!_Rd_) - return; - - xmmhilo = hi ? XMMGPR_HI : XMMGPR_LO; - reghi = _checkXMMreg(XMMTYPE_GPRREG, xmmhilo, MODE_READ); - - _eeOnWriteReg(_Rd_, 0); - - regd = _checkXMMreg(XMMTYPE_GPRREG, _Rd_, MODE_READ | MODE_WRITE); - - if (reghi >= 0) - { - if (regd >= 0) - { - xMOVHL.PS(xRegisterSSE(regd), xRegisterSSE(reghi)); - xmmregs[regd].mode |= MODE_WRITE; - } - else - { - _deleteEEreg(_Rd_, 0); - xMOVH.PS(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], xRegisterSSE(reghi)); - } - } - else - { - if (regd >= 0) - { - if (EEINST_ISLIVE2(_Rd_)) - { - xPUNPCK.HQDQ(xRegisterSSE(regd), ptr[(void*)(hi ? (uptr)&cpuRegs.HI.UD[0] : (uptr)&cpuRegs.LO.UD[0])]); - xPSHUF.D(xRegisterSSE(regd), xRegisterSSE(regd), 0x4e); - } - else - { - xMOVQZX(xRegisterSSE(regd), ptr[(void*)(hi ? (uptr)&cpuRegs.HI.UD[1] : (uptr)&cpuRegs.LO.UD[1])]); - } - - xmmregs[regd].mode |= MODE_WRITE; - } - else - { - _deleteEEreg(_Rd_, 0); - xCopy64(&cpuRegs.GPR.r[_Rd_].UD[0], hi ? &cpuRegs.HI.UD[1] : &cpuRegs.LO.UD[1]); - } - } -} - -void recMTHILO1(int hi) -{ - int reghi, regs, xmmhilo; - uptr addrhilo; - - xmmhilo = hi ? XMMGPR_HI : XMMGPR_LO; - addrhilo = hi ? (uptr)&cpuRegs.HI.UD[0] : (uptr)&cpuRegs.LO.UD[0]; - - regs = _checkXMMreg(XMMTYPE_GPRREG, _Rs_, MODE_READ); - reghi = _allocCheckGPRtoXMM(g_pCurInstInfo, xmmhilo, MODE_WRITE | MODE_READ); - - if (reghi >= 0) - { - if (regs >= 0) - { - xPUNPCK.LQDQ(xRegisterSSE(reghi), xRegisterSSE(regs)); - } - else - { - _flushEEreg(_Rs_); - xPUNPCK.LQDQ(xRegisterSSE(reghi), ptr[&cpuRegs.GPR.r[_Rs_].UD[0]]); - } - } - else - { - if (regs >= 0) - { - xMOVQ(ptr[(void*)(addrhilo + 8)], xRegisterSSE(regs)); - } - else - { - if (GPR_IS_CONST1(_Rs_)) - { - xWriteImm64ToMem((u64*)(addrhilo + 8), rax, g_cpuConstRegs[_Rs_].UD[0]); - } - else - { - _flushEEreg(_Rs_); - xCopy64((u64*)(addrhilo + 8), &cpuRegs.GPR.r[_Rs_].UD[0]); - } - } - } -} - void recMFHI1() { - recMFHILO1(1); + recMFHILO(true, true); EE::Profiler.EmitOp(eeOpcode::MFHI1); } void recMFLO1() { - recMFHILO1(0); + recMFHILO(false, true); EE::Profiler.EmitOp(eeOpcode::MFLO1); } void recMTHI1() { - recMTHILO1(1); + recMTHILO(true, true); EE::Profiler.EmitOp(eeOpcode::MTHI1); } void recMTLO1() { - recMTHILO1(0); + recMTHILO(false, true); EE::Profiler.EmitOp(eeOpcode::MTLO1); } //// MOVZ -void recMOVZtemp_const() +// if (rt == 0) then rd <- rs +static void recMOVZtemp_const() { g_cpuConstRegs[_Rd_].UD[0] = g_cpuConstRegs[_Rs_].UD[0]; } -void recMOVZtemp_consts(int info) +static void recMOVZtemp_consts(int info) { - xCMPToZero64(&cpuRegs.GPR.r[_Rt_].UD[0]); - j8Ptr[0] = JNZ8(0); + // we need the constant anyway, so just force it into a register + const int regs = (info & PROCESS_EE_S) ? EEREC_S : _allocX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + if (info & PROCESS_EE_T) + xTEST(xRegister64(EEREC_T), xRegister64(EEREC_T)); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], 0); - xWriteImm64ToMem(&cpuRegs.GPR.r[_Rd_].UD[0], rax, g_cpuConstRegs[_Rs_].UD[0]); - - x86SetJ8(j8Ptr[0]); + xCMOVE(xRegister64(EEREC_D), xRegister64(regs)); } -void recMOVZtemp_constt(int info) +static void recMOVZtemp_constt(int info) { - xCopy64(&cpuRegs.GPR.r[_Rd_].UD[0], &cpuRegs.GPR.r[_Rs_].UD[0]); + if (info & PROCESS_EE_S) + xMOV(xRegister64(EEREC_D), xRegister64(EEREC_S)); + else + xMOV(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); } -void recMOVZtemp_(int info) +static void recMOVZtemp_(int info) { - xCMPToZero64(&cpuRegs.GPR.r[_Rt_].UD[0]); - j8Ptr[0] = JNZ8(0); + if (info & PROCESS_EE_T) + xTEST(xRegister64(EEREC_T), xRegister64(EEREC_T)); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], 0); - xCopy64(&cpuRegs.GPR.r[_Rd_].UD[0], &cpuRegs.GPR.r[_Rs_].UD[0]); - - x86SetJ8(j8Ptr[0]); + if (info & PROCESS_EE_S) + xCMOVE(xRegister64(EEREC_D), xRegister64(EEREC_S)); + else + xCMOVE(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); } -EERECOMPILE_CODE0(MOVZtemp, XMMINFO_READS | XMMINFO_READD | XMMINFO_READD | XMMINFO_WRITED); +// Specify READD here, because we might not write to it, and want to preserve the value. +static EERECOMPILE_CODERC0(MOVZtemp, XMMINFO_READS | XMMINFO_READT | XMMINFO_READD | XMMINFO_WRITED | XMMINFO_NORENAME); void recMOVZ() { if (_Rs_ == _Rd_) return; - if (GPR_IS_CONST1(_Rt_)) - { - if (g_cpuConstRegs[_Rt_].UD[0] != 0) - return; - } - else - _deleteEEreg(_Rd_, 1); + if (GPR_IS_CONST1(_Rt_) && g_cpuConstRegs[_Rt_].UD[0] != 0) + return; recMOVZtemp(); } //// MOVN -void recMOVNtemp_const() +static void recMOVNtemp_const() { g_cpuConstRegs[_Rd_].UD[0] = g_cpuConstRegs[_Rs_].UD[0]; } -void recMOVNtemp_consts(int info) +static void recMOVNtemp_consts(int info) { - xCMPToZero64(&cpuRegs.GPR.r[_Rt_].UD[0]); - j8Ptr[0] = JZ8(0); + // we need the constant anyway, so just force it into a register + const int regs = (info & PROCESS_EE_S) ? EEREC_S : _allocX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + if (info & PROCESS_EE_T) + xTEST(xRegister64(EEREC_T), xRegister64(EEREC_T)); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], 0); - xWriteImm64ToMem(&cpuRegs.GPR.r[_Rd_].UD[0], rax, g_cpuConstRegs[_Rs_].UD[0]); - - x86SetJ8(j8Ptr[0]); + xCMOVNE(xRegister64(EEREC_D), xRegister64(regs)); } -void recMOVNtemp_constt(int info) +static void recMOVNtemp_constt(int info) { - xCopy64(&cpuRegs.GPR.r[_Rd_].UD[0], &cpuRegs.GPR.r[_Rs_].UD[0]); + if (info & PROCESS_EE_S) + xMOV(xRegister64(EEREC_D), xRegister64(EEREC_S)); + else + xMOV(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); } -void recMOVNtemp_(int info) +static void recMOVNtemp_(int info) { - xCMPToZero64(&cpuRegs.GPR.r[_Rt_].UD[0]); - j8Ptr[0] = JZ8(0); + if (info & PROCESS_EE_T) + xTEST(xRegister64(EEREC_T), xRegister64(EEREC_T)); + else + xCMP(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], 0); - xCopy64(&cpuRegs.GPR.r[_Rd_].UD[0], &cpuRegs.GPR.r[_Rs_].UD[0]); - - x86SetJ8(j8Ptr[0]); + if (info & PROCESS_EE_S) + xCMOVNE(xRegister64(EEREC_D), xRegister64(EEREC_S)); + else + xCMOVNE(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rs_].UD[0]]); } -EERECOMPILE_CODE0(MOVNtemp, XMMINFO_READS | XMMINFO_READD | XMMINFO_READD | XMMINFO_WRITED); +static EERECOMPILE_CODERC0(MOVNtemp, XMMINFO_READS | XMMINFO_READT | XMMINFO_READD | XMMINFO_WRITED | XMMINFO_NORENAME); void recMOVN() { if (_Rs_ == _Rd_) return; - if (GPR_IS_CONST1(_Rt_)) - { - if (g_cpuConstRegs[_Rt_].UD[0] == 0) - return; - } - else - _deleteEEreg(_Rd_, 1); + if (GPR_IS_CONST1(_Rt_) && g_cpuConstRegs[_Rt_].UD[0] == 0) + return; recMOVNtemp(); } #endif -} // namespace OpcodeImpl -} // namespace Dynarec -} // namespace R5900 +} // namespace R5900::Dynarec::OpcodeImpl diff --git a/pcsx2/x86/ix86-32/iR5900MultDiv.cpp b/pcsx2/x86/ix86-32/iR5900MultDiv.cpp index 3435176808..8c0a58a973 100644 --- a/pcsx2/x86/ix86-32/iR5900MultDiv.cpp +++ b/pcsx2/x86/ix86-32/iR5900MultDiv.cpp @@ -24,9 +24,8 @@ using namespace x86Emitter; namespace Interp = R5900::Interpreter::OpcodeImpl; -namespace R5900 { -namespace Dynarec { -namespace OpcodeImpl { +namespace R5900::Dynarec::OpcodeImpl +{ /********************************************************* * Register mult/div & Register trap logic * @@ -34,9 +33,9 @@ namespace OpcodeImpl { *********************************************************/ #ifndef MULTDIV_RECOMPILE -REC_FUNC_DEL(MULT, _Rd_); -REC_FUNC_DEL(MULTU, _Rd_); -REC_FUNC_DEL(MULT1, _Rd_); +REC_FUNC_DEL(MULT, _Rd_); +REC_FUNC_DEL(MULTU, _Rd_); +REC_FUNC_DEL(MULT1, _Rd_); REC_FUNC_DEL(MULTU1, _Rd_); REC_FUNC(DIV); @@ -44,290 +43,300 @@ REC_FUNC(DIVU); REC_FUNC(DIV1); REC_FUNC(DIVU1); -REC_FUNC_DEL(MADD, _Rd_); -REC_FUNC_DEL(MADDU, _Rd_); -REC_FUNC_DEL(MADD1, _Rd_); +REC_FUNC_DEL(MADD, _Rd_); +REC_FUNC_DEL(MADDU, _Rd_); +REC_FUNC_DEL(MADD1, _Rd_); REC_FUNC_DEL(MADDU1, _Rd_); #else -// if upper is 1, write in upper 64 bits of LO/HI -void recWritebackHILO(int info, int writed, int upper) +static void recWritebackHILO(int info, bool writed, bool upper) { - int savedlo = 0; - uptr loaddr = (uptr)&cpuRegs.LO.UL[upper ? 2 : 0]; - const uptr hiaddr = (uptr)&cpuRegs.HI.UL[upper ? 2 : 0]; - const u8 testlive = upper ? EEINST_LIVE2 : EEINST_LIVE0; + // writeback low 32 bits, sign extended to 64 bits + bool eax_sign_extended = false; - if (g_pCurInstInfo->regs[XMMGPR_HI] & testlive) - xMOVSX(rcx, edx); + // case 1: LO is already in an XMM - use the xmm + // case 2: LO is used as an XMM later in the block - use or allocate the XMM + // case 3: LO is used as a GPR later in the block - use XMM if upper, otherwise use GPR, so it can be renamed + // case 4: LO is already in a GPR - write to the GPR, or write to memory if upper + // case 4: LO is not used - writeback to memory - if (g_pCurInstInfo->regs[XMMGPR_LO] & testlive) + if (EEINST_LIVETEST(XMMGPR_LO)) { - int reglo = 0; - if ((reglo = _checkXMMreg(XMMTYPE_GPRREG, XMMGPR_LO, MODE_READ)) >= 0) + const bool loused = EEINST_USEDTEST(XMMGPR_LO); + const bool lousedxmm = loused && (upper || EEINST_XMMUSEDTEST(XMMGPR_LO)); + const int xmmlo = lousedxmm ? _allocGPRtoXMMreg(XMMGPR_LO, MODE_READ | MODE_WRITE) : _checkXMMreg(XMMTYPE_GPRREG, XMMGPR_LO, MODE_WRITE); + if (xmmlo >= 0) { - if (xmmregs[reglo].mode & MODE_WRITE) - { - if (upper) - xMOVQ(ptr[(void*)(loaddr - 8)], xRegisterSSE(reglo)); - else - xMOVH.PS(ptr[(void*)(loaddr + 8)], xRegisterSSE(reglo)); - } - - xmmregs[reglo].inuse = 0; - reglo = -1; + // we use CDQE over MOVSX because it's shorter. + xCDQE(); + xPINSR.Q(xRegisterSSE(xmmlo), rax, static_cast(upper)); } - - _signExtendToMem((void*)loaddr); - savedlo = 1; - } - - if (writed && _Rd_) - { - _eeOnWriteReg(_Rd_, 1); - - int regd = -1; - if (g_pCurInstInfo->regs[_Rd_] & EEINST_XMM) + else { - if (savedlo) + const int gprlo = upper ? -1 : (loused ? _allocX86reg(X86TYPE_GPR, XMMGPR_LO, MODE_WRITE) : _checkX86reg(X86TYPE_GPR, XMMGPR_LO, MODE_WRITE)); + if (gprlo >= 0) { - regd = _checkXMMreg(XMMTYPE_GPRREG, _Rd_, MODE_WRITE | MODE_READ); - if (regd >= 0) - { - xMOVL.PS(xRegisterSSE(regd), ptr[(void*)(loaddr)]); - } + xMOVSX(xRegister64(gprlo), eax); } - } - - if (regd < 0) - { - _deleteEEreg(_Rd_, 0); - - if (!savedlo) + else + { xCDQE(); - xMOV(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + eax_sign_extended = true; + xMOV(ptr64[&cpuRegs.LO.UD[upper]], rax); + } } } - if (g_pCurInstInfo->regs[XMMGPR_HI] & testlive) + if (EEINST_LIVETEST(XMMGPR_HI)) { - int reghi = 0; - if ((reghi = _checkXMMreg(XMMTYPE_GPRREG, XMMGPR_HI, MODE_READ)) >= 0) + const bool hiused = EEINST_USEDTEST(XMMGPR_HI); + const bool hiusedxmm = hiused && (upper || EEINST_XMMUSEDTEST(XMMGPR_HI)); + const int xmmhi = hiusedxmm ? _allocGPRtoXMMreg(XMMGPR_HI, MODE_READ | MODE_WRITE) : _checkXMMreg(XMMTYPE_GPRREG, XMMGPR_HI, MODE_WRITE); + if (xmmhi >= 0) { - if (xmmregs[reghi].mode & MODE_WRITE) - { - if (upper) - xMOVQ(ptr[(void*)(hiaddr - 8)], xRegisterSSE(reghi)); - else - xMOVH.PS(ptr[(void*)(hiaddr + 8)], xRegisterSSE(reghi)); - } - - xmmregs[reghi].inuse = 0; - reghi = -1; + xMOVSX(rdx, edx); + xPINSR.Q(xRegisterSSE(xmmhi), rdx, static_cast(upper)); } + else + { + const int gprhi = upper ? -1 : (hiused ? _allocX86reg(X86TYPE_GPR, XMMGPR_HI, MODE_WRITE) : _checkX86reg(X86TYPE_GPR, XMMGPR_HI, MODE_WRITE)); + if (gprhi >= 0) + { + xMOVSX(xRegister64(gprhi), edx); + } + else + { + xMOVSX(rdx, edx); + xMOV(ptr64[&cpuRegs.HI.UD[upper]], rdx); + } + } + } - xMOV(ptr[(void*)(hiaddr)], rcx); + // writeback lo to Rd if present + if (writed && _Rd_ && EEINST_LIVETEST(_Rd_)) + { + // TODO: This can be made optimal by keeping it in an xmm. + // But currently the templates aren't hooked up for that - we'd need a "allow xmm" flag. + if (info & PROCESS_EE_D) + { + if (eax_sign_extended) + xMOV(xRegister64(EEREC_D), rax); + else + xMOVSX(xRegister64(EEREC_D), eax); + } + else + { + if (!eax_sign_extended) + xCDQE(); + xMOV(ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + } } } -void recWritebackConstHILO(u64 res, int writed, int upper) + +static void recWritebackConstHILO(u64 res, bool writed, int upper) { - uptr loaddr = (uptr)&cpuRegs.LO.UL[upper ? 2 : 0]; - uptr hiaddr = (uptr)&cpuRegs.HI.UL[upper ? 2 : 0]; - u8 testlive = upper ? EEINST_LIVE2 : EEINST_LIVE0; + // It's not often that MULT/DIV are entirely constant. So while the MOV64s here are not optimal + // by any means, it's not something that's going to be hit often enough to worry about a cache. + // Except for apparently when it's getting set to all-zeros, but that'll be fine with immediates. + const s64 loval = static_cast(static_cast(static_cast(res))); + const s64 hival = static_cast(static_cast(static_cast(res >> 32))); - if (g_pCurInstInfo->regs[XMMGPR_LO] & testlive) + if (EEINST_LIVETEST(XMMGPR_LO)) { - int reglo = _allocCheckGPRtoXMM(g_pCurInstInfo, XMMGPR_LO, MODE_WRITE | MODE_READ); - - if (reglo >= 0) + const bool lolive = EEINST_USEDTEST(XMMGPR_LO); + const bool lolivexmm = lolive && (upper || EEINST_XMMUSEDTEST(XMMGPR_LO)); + const int xmmlo = lolivexmm ? _allocGPRtoXMMreg(XMMGPR_LO, MODE_READ | MODE_WRITE) : _checkXMMreg(XMMTYPE_GPRREG, XMMGPR_LO, MODE_WRITE); + if (xmmlo >= 0) { - u32* mem_ptr = recGetImm64(res & 0x80000000 ? -1 : 0, (u32)res); - if (upper) - xMOVH.PS(xRegisterSSE(reglo), ptr[mem_ptr]); - else - xMOVL.PS(xRegisterSSE(reglo), ptr[mem_ptr]); + xMOV64(rax, loval); + xPINSR.Q(xRegisterSSE(xmmlo), rax, static_cast(upper)); } else { - xWriteImm64ToMem((u64*)loaddr, rax, (s64)(s32)(res & 0xffffffff)); + const int gprlo = upper ? -1 : (lolive ? _allocX86reg(X86TYPE_GPR, XMMGPR_LO, MODE_WRITE) : _checkX86reg(X86TYPE_GPR, XMMGPR_LO, MODE_WRITE)); + if (gprlo >= 0) + xImm64Op(xMOV, xRegister64(gprlo), rax, loval); + else + xImm64Op(xMOV, ptr64[&cpuRegs.LO.UD[upper]], rax, loval); } } - if (g_pCurInstInfo->regs[XMMGPR_HI] & testlive) + if (EEINST_LIVETEST(XMMGPR_HI)) { - - int reghi = _allocCheckGPRtoXMM(g_pCurInstInfo, XMMGPR_HI, MODE_WRITE | MODE_READ); - - if (reghi >= 0) + const bool hilive = EEINST_USEDTEST(XMMGPR_HI); + const bool hilivexmm = hilive && (upper || EEINST_XMMUSEDTEST(XMMGPR_HI)); + const int xmmhi = hilivexmm ? _allocGPRtoXMMreg(XMMGPR_HI, MODE_READ | MODE_WRITE) : _checkXMMreg(XMMTYPE_GPRREG, XMMGPR_HI, MODE_WRITE); + if (xmmhi >= 0) { - u32* mem_ptr = recGetImm64((res >> 63) ? -1 : 0, res >> 32); - if (upper) - xMOVH.PS(xRegisterSSE(reghi), ptr[mem_ptr]); - else - xMOVL.PS(xRegisterSSE(reghi), ptr[mem_ptr]); + xMOV64(rax, hival); + xPINSR.Q(xRegisterSSE(xmmhi), rax, static_cast(upper)); } else { - _deleteEEreg(XMMGPR_HI, 0); - xWriteImm64ToMem((u64*)hiaddr, rax, (s64)res >> 32); + const int gprhi = upper ? -1 : (hilive ? _allocX86reg(X86TYPE_GPR, XMMGPR_HI, MODE_WRITE) : _checkX86reg(X86TYPE_GPR, XMMGPR_HI, MODE_WRITE)); + if (gprhi >= 0) + xImm64Op(xMOV, xRegister64(gprhi), rax, hival); + else + xImm64Op(xMOV, ptr64[&cpuRegs.HI.UD[upper]], rax, hival); } } - if (!writed || !_Rd_) - return; - g_cpuConstRegs[_Rd_].SD[0] = (s32)(res & 0xffffffffULL); //that is the difference + // writeback lo to Rd if present + if (writed && _Rd_ && EEINST_LIVETEST(_Rd_)) + { + _eeOnWriteReg(_Rd_, 0); + + const int regd = _checkX86reg(X86TYPE_GPR, _Rd_, MODE_WRITE); + if (regd >= 0) + xImm64Op(xMOV, xRegister64(regd), rax, loval); + else + xImm64Op(xMOV, ptr64[&cpuRegs.GPR.r[_Rd_].UD[0]], rax, loval); + } } //// MULT -void recMULT_const() +static void recMULT_const() { s64 res = (s64)g_cpuConstRegs[_Rs_].SL[0] * (s64)g_cpuConstRegs[_Rt_].SL[0]; recWritebackConstHILO(res, 1, 0); } -void recMULTUsuper(int info, int upper, int process); -void recMULTsuper(int info, int upper, int process) +static void recMULTsuper(int info, bool sign, bool upper, int process) { + // TODO(Stenzek): Use MULX where available. if (process & PROCESS_CONSTS) { xMOV(eax, g_cpuConstRegs[_Rs_].UL[0]); - xMUL(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); + if (info & PROCESS_EE_T) + sign ? xMUL(xRegister32(EEREC_T)) : xUMUL(xRegister32(EEREC_T)); + else + sign ? xMUL(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]) : xUMUL(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); } else if (process & PROCESS_CONSTT) { xMOV(eax, g_cpuConstRegs[_Rt_].UL[0]); - xMUL(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]); + if (info & PROCESS_EE_S) + sign ? xMUL(xRegister32(EEREC_S)) : xUMUL(xRegister32(EEREC_S)); + else + sign ? xMUL(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]) : xUMUL(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]); } else { - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); - xMUL(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); + // S is more likely to be in a register than T (so put T in eax). + if (info & PROCESS_EE_T) + xMOV(eax, xRegister32(EEREC_T)); + else + xMOV(eax, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + + if (info & PROCESS_EE_S) + sign ? xMUL(xRegister32(EEREC_S)) : xUMUL(xRegister32(EEREC_S)); + else + sign ? xMUL(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]) : xUMUL(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]); } recWritebackHILO(info, 1, upper); } -void recMULT_(int info) +static void recMULT_(int info) { - recMULTsuper(info, 0, 0); + recMULTsuper(info, true, false, 0); } -void recMULT_consts(int info) +static void recMULT_consts(int info) { - recMULTsuper(info, 0, PROCESS_CONSTS); + recMULTsuper(info, true, false, PROCESS_CONSTS); } -void recMULT_constt(int info) +static void recMULT_constt(int info) { - recMULTsuper(info, 0, PROCESS_CONSTT); + recMULTsuper(info, true, false, PROCESS_CONSTT); } -// don't set XMMINFO_WRITED|XMMINFO_WRITELO|XMMINFO_WRITEHI -EERECOMPILE_CODE0(MULT, XMMINFO_READS | XMMINFO_READT | (_Rd_ ? XMMINFO_WRITED : 0)); +// lo/hi allocation are taken care of in recWritebackHILO(). +EERECOMPILE_CODERC0(MULT, XMMINFO_READS | XMMINFO_READT | (_Rd_ ? XMMINFO_WRITED : 0)); //// MULTU -void recMULTU_const() +static void recMULTU_const() { - u64 res = (u64)g_cpuConstRegs[_Rs_].UL[0] * (u64)g_cpuConstRegs[_Rt_].UL[0]; + const u64 res = (u64)g_cpuConstRegs[_Rs_].UL[0] * (u64)g_cpuConstRegs[_Rt_].UL[0]; recWritebackConstHILO(res, 1, 0); } -void recMULTUsuper(int info, int upper, int process) +static void recMULTU_(int info) { - if (process & PROCESS_CONSTS) - { - xMOV(eax, g_cpuConstRegs[_Rs_].UL[0]); - xUMUL(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); - } - else if (process & PROCESS_CONSTT) - { - xMOV(eax, g_cpuConstRegs[_Rt_].UL[0]); - xUMUL(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]]); - } - else - { - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); - xUMUL(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); - } - - recWritebackHILO(info, 1, upper); + recMULTsuper(info, false, false, 0); } -void recMULTU_(int info) +static void recMULTU_consts(int info) { - recMULTUsuper(info, 0, 0); + recMULTsuper(info, false, false, PROCESS_CONSTS); } -void recMULTU_consts(int info) +static void recMULTU_constt(int info) { - recMULTUsuper(info, 0, PROCESS_CONSTS); -} - -void recMULTU_constt(int info) -{ - recMULTUsuper(info, 0, PROCESS_CONSTT); + recMULTsuper(info, false, false, PROCESS_CONSTT); } // don't specify XMMINFO_WRITELO or XMMINFO_WRITEHI, that is taken care of -EERECOMPILE_CODE0(MULTU, XMMINFO_READS | XMMINFO_READT | (_Rd_ ? XMMINFO_WRITED : 0)); +EERECOMPILE_CODERC0(MULTU, XMMINFO_READS | XMMINFO_READT | (_Rd_ ? XMMINFO_WRITED : 0)); //////////////////////////////////////////////////// -void recMULT1_const() +static void recMULT1_const() { s64 res = (s64)g_cpuConstRegs[_Rs_].SL[0] * (s64)g_cpuConstRegs[_Rt_].SL[0]; recWritebackConstHILO((u64)res, 1, 1); } -void recMULT1_(int info) +static void recMULT1_(int info) { - recMULTsuper(info, 1, 0); + recMULTsuper(info, true, true, 0); } -void recMULT1_consts(int info) +static void recMULT1_consts(int info) { - recMULTsuper(info, 1, PROCESS_CONSTS); + recMULTsuper(info, true, true, PROCESS_CONSTS); } -void recMULT1_constt(int info) +static void recMULT1_constt(int info) { - recMULTsuper(info, 1, PROCESS_CONSTT); + recMULTsuper(info, true, true, PROCESS_CONSTT); } -EERECOMPILE_CODE0(MULT1, XMMINFO_READS | XMMINFO_READT | (_Rd_ ? XMMINFO_WRITED : 0)); +EERECOMPILE_CODERC0(MULT1, XMMINFO_READS | XMMINFO_READT | (_Rd_ ? XMMINFO_WRITED : 0)); //////////////////////////////////////////////////// -void recMULTU1_const() +static void recMULTU1_const() { u64 res = (u64)g_cpuConstRegs[_Rs_].UL[0] * (u64)g_cpuConstRegs[_Rt_].UL[0]; recWritebackConstHILO(res, 1, 1); } -void recMULTU1_(int info) +static void recMULTU1_(int info) { - recMULTUsuper(info, 1, 0); + recMULTsuper(info, false, true, 0); } -void recMULTU1_consts(int info) +static void recMULTU1_consts(int info) { - recMULTUsuper(info, 1, PROCESS_CONSTS); + recMULTsuper(info, false, true, PROCESS_CONSTS); } -void recMULTU1_constt(int info) +static void recMULTU1_constt(int info) { - recMULTUsuper(info, 1, PROCESS_CONSTT); + recMULTsuper(info, false, true, PROCESS_CONSTT); } -EERECOMPILE_CODE0(MULTU1, XMMINFO_READS | XMMINFO_READT | (_Rd_ ? XMMINFO_WRITED : 0)); +EERECOMPILE_CODERC0(MULTU1, XMMINFO_READS | XMMINFO_READT | (_Rd_ ? XMMINFO_WRITED : 0)); //// DIV -void recDIVconst(int upper) +static void recDIVconst(int upper) { s32 quot, rem; if (g_cpuConstRegs[_Rs_].UL[0] == 0x80000000 && g_cpuConstRegs[_Rt_].SL[0] == -1) @@ -348,29 +357,36 @@ void recDIVconst(int upper) recWritebackConstHILO((u64)quot | ((u64)rem << 32), 0, upper); } -void recDIV_const() +static void recDIV_const() { recDIVconst(0); } -void recDIVsuper(int info, int sign, int upper, int process) +static void recDIVsuper(int info, bool sign, bool upper, int process) { - if (process & PROCESS_CONSTT) - xMOV(ecx, g_cpuConstRegs[_Rt_].UL[0]); - else - xMOV(ecx, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + const xRegister32 divisor((info & PROCESS_EE_T) ? EEREC_T : ecx.GetId()); + if (!(info & PROCESS_EE_T)) + { + if (process & PROCESS_CONSTT) + xMOV(divisor, g_cpuConstRegs[_Rt_].UL[0]); + else + xMOV(divisor, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + } + + // can't use edx, it's part of the dividend + pxAssert(divisor.GetId() != edx.GetId()); if (process & PROCESS_CONSTS) xMOV(eax, g_cpuConstRegs[_Rs_].UL[0]); else - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); + _eeMoveGPRtoR(rax, _Rs_); u8* end1; if (sign) //test for overflow (x86 will just throw an exception) { xCMP(eax, 0x80000000); u8* cont1 = JNE8(0); - xCMP(ecx, 0xffffffff); + xCMP(divisor, 0xffffffff); u8* cont2 = JNE8(0); //overflow case: xXOR(edx, edx); //EAX remains 0x80000000 @@ -380,7 +396,7 @@ void recDIVsuper(int info, int sign, int upper, int process) x86SetJ8(cont2); } - xCMP(ecx, 0); + xCMP(divisor, 0); u8* cont3 = JNE8(0); //divide by zero xMOV(edx, eax); @@ -398,12 +414,12 @@ void recDIVsuper(int info, int sign, int upper, int process) if (sign) { xCDQ(); - xDIV(ecx); + xDIV(divisor); } else { xXOR(edx, edx); - xUDIV(ecx); + xUDIV(divisor); } if (sign) @@ -411,28 +427,29 @@ void recDIVsuper(int info, int sign, int upper, int process) x86SetJ8(end2); // need to execute regardless of bad divide - recWritebackHILO(info, 0, upper); + recWritebackHILO(info, false, upper); } -void recDIV_(int info) +static void recDIV_(int info) { recDIVsuper(info, 1, 0, 0); } -void recDIV_consts(int info) +static void recDIV_consts(int info) { recDIVsuper(info, 1, 0, PROCESS_CONSTS); } -void recDIV_constt(int info) +static void recDIV_constt(int info) { recDIVsuper(info, 1, 0, PROCESS_CONSTT); } -EERECOMPILE_CODE0(DIV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITELO | XMMINFO_WRITEHI); +// We handle S reading in the routine itself, since it needs to go into eax. +EERECOMPILE_CODERC0(DIV, /*XMMINFO_READS |*/ XMMINFO_READT); //// DIVU -void recDIVUconst(int upper) +static void recDIVUconst(int upper) { u32 quot, rem; if (g_cpuConstRegs[_Rt_].UL[0] != 0) @@ -449,71 +466,73 @@ void recDIVUconst(int upper) recWritebackConstHILO((u64)quot | ((u64)rem << 32), 0, upper); } -void recDIVU_const() +static void recDIVU_const() { recDIVUconst(0); } -void recDIVU_(int info) +static void recDIVU_(int info) { - recDIVsuper(info, 0, 0, 0); + recDIVsuper(info, false, false, 0); } -void recDIVU_consts(int info) +static void recDIVU_consts(int info) { - recDIVsuper(info, 0, 0, PROCESS_CONSTS); + recDIVsuper(info, false, false, PROCESS_CONSTS); } -void recDIVU_constt(int info) +static void recDIVU_constt(int info) { - recDIVsuper(info, 0, 0, PROCESS_CONSTT); + recDIVsuper(info, false, false, PROCESS_CONSTT); } -EERECOMPILE_CODE0(DIVU, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITELO | XMMINFO_WRITEHI); +EERECOMPILE_CODERC0(DIVU, /*XMMINFO_READS |*/ XMMINFO_READT); -void recDIV1_const() +static void recDIV1_const() { recDIVconst(1); } -void recDIV1_(int info) +static void recDIV1_(int info) { - recDIVsuper(info, 1, 1, 0); + recDIVsuper(info, true, true, 0); } -void recDIV1_consts(int info) +static void recDIV1_consts(int info) { - recDIVsuper(info, 1, 1, PROCESS_CONSTS); + recDIVsuper(info, true, true, PROCESS_CONSTS); } -void recDIV1_constt(int info) +static void recDIV1_constt(int info) { - recDIVsuper(info, 1, 1, PROCESS_CONSTT); + recDIVsuper(info, true, true, PROCESS_CONSTT); } -EERECOMPILE_CODE0(DIV1, XMMINFO_READS | XMMINFO_READT); +EERECOMPILE_CODERC0(DIV1, /*XMMINFO_READS |*/ XMMINFO_READT); -void recDIVU1_const() +static void recDIVU1_const() { recDIVUconst(1); } -void recDIVU1_(int info) +static void recDIVU1_(int info) { - recDIVsuper(info, 0, 1, 0); + recDIVsuper(info, false, true, 0); } -void recDIVU1_consts(int info) +static void recDIVU1_consts(int info) { - recDIVsuper(info, 0, 1, PROCESS_CONSTS); + recDIVsuper(info, false, true, PROCESS_CONSTS); } -void recDIVU1_constt(int info) +static void recDIVU1_constt(int info) { - recDIVsuper(info, 0, 1, PROCESS_CONSTT); + recDIVsuper(info, false, true, PROCESS_CONSTT); } -EERECOMPILE_CODE0(DIVU1, XMMINFO_READS | XMMINFO_READT); +EERECOMPILE_CODERC0(DIVU1, /*XMMINFO_READS |*/ XMMINFO_READT); + +// TODO(Stenzek): All of these :( static void writeBackMAddToHiLoRd(int hiloID) { @@ -564,8 +583,10 @@ void recMADD() _deleteEEreg(XMMGPR_LO, 1); _deleteEEreg(XMMGPR_HI, 1); - _deleteGPRtoXMMreg(_Rs_, 1); - _deleteGPRtoXMMreg(_Rt_, 1); + _deleteGPRtoX86reg(_Rs_, DELETE_REG_FLUSH); + _deleteGPRtoX86reg(_Rt_, DELETE_REG_FLUSH); + _deleteGPRtoXMMreg(_Rs_, DELETE_REG_FLUSH); + _deleteGPRtoXMMreg(_Rt_, DELETE_REG_FLUSH); if (GPR_IS_CONST1(_Rs_)) { @@ -597,8 +618,10 @@ void recMADDU() _deleteEEreg(XMMGPR_LO, 1); _deleteEEreg(XMMGPR_HI, 1); - _deleteGPRtoXMMreg(_Rs_, 1); - _deleteGPRtoXMMreg(_Rt_, 1); + _deleteGPRtoX86reg(_Rs_, DELETE_REG_FLUSH); + _deleteGPRtoX86reg(_Rt_, DELETE_REG_FLUSH); + _deleteGPRtoXMMreg(_Rs_, DELETE_REG_FLUSH); + _deleteGPRtoXMMreg(_Rt_, DELETE_REG_FLUSH); if (GPR_IS_CONST1(_Rs_)) { @@ -630,8 +653,10 @@ void recMADD1() _deleteEEreg(XMMGPR_LO, 1); _deleteEEreg(XMMGPR_HI, 1); - _deleteGPRtoXMMreg(_Rs_, 1); - _deleteGPRtoXMMreg(_Rt_, 1); + _deleteGPRtoX86reg(_Rs_, DELETE_REG_FLUSH); + _deleteGPRtoX86reg(_Rt_, DELETE_REG_FLUSH); + _deleteGPRtoXMMreg(_Rs_, DELETE_REG_FLUSH); + _deleteGPRtoXMMreg(_Rt_, DELETE_REG_FLUSH); if (GPR_IS_CONST1(_Rs_)) { @@ -663,8 +688,10 @@ void recMADDU1() _deleteEEreg(XMMGPR_LO, 1); _deleteEEreg(XMMGPR_HI, 1); - _deleteGPRtoXMMreg(_Rs_, 1); - _deleteGPRtoXMMreg(_Rt_, 1); + _deleteGPRtoX86reg(_Rs_, DELETE_REG_FLUSH); + _deleteGPRtoX86reg(_Rt_, DELETE_REG_FLUSH); + _deleteGPRtoXMMreg(_Rs_, DELETE_REG_FLUSH); + _deleteGPRtoXMMreg(_Rt_, DELETE_REG_FLUSH); if (GPR_IS_CONST1(_Rs_)) { @@ -688,6 +715,4 @@ void recMADDU1() #endif -} // namespace OpcodeImpl -} // namespace Dynarec -} // namespace R5900 +} // namespace R5900::Dynarec::OpcodeImpl diff --git a/pcsx2/x86/ix86-32/iR5900Shift.cpp b/pcsx2/x86/ix86-32/iR5900Shift.cpp index 3ef2274042..22368bc9a8 100644 --- a/pcsx2/x86/ix86-32/iR5900Shift.cpp +++ b/pcsx2/x86/ix86-32/iR5900Shift.cpp @@ -22,9 +22,8 @@ using namespace x86Emitter; -namespace R5900 { -namespace Dynarec { -namespace OpcodeImpl { +namespace R5900::Dynarec::OpcodeImpl +{ /********************************************************* * Shift arithmetic with constant shift * @@ -34,431 +33,406 @@ namespace OpcodeImpl { namespace Interp = R5900::Interpreter::OpcodeImpl; -REC_FUNC_DEL(SLL, _Rd_); -REC_FUNC_DEL(SRL, _Rd_); -REC_FUNC_DEL(SRA, _Rd_); -REC_FUNC_DEL(DSLL, _Rd_); -REC_FUNC_DEL(DSRL, _Rd_); -REC_FUNC_DEL(DSRA, _Rd_); +REC_FUNC_DEL(SLL, _Rd_); +REC_FUNC_DEL(SRL, _Rd_); +REC_FUNC_DEL(SRA, _Rd_); +REC_FUNC_DEL(DSLL, _Rd_); +REC_FUNC_DEL(DSRL, _Rd_); +REC_FUNC_DEL(DSRA, _Rd_); REC_FUNC_DEL(DSLL32, _Rd_); REC_FUNC_DEL(DSRL32, _Rd_); REC_FUNC_DEL(DSRA32, _Rd_); -REC_FUNC_DEL(SLLV, _Rd_); -REC_FUNC_DEL(SRLV, _Rd_); -REC_FUNC_DEL(SRAV, _Rd_); -REC_FUNC_DEL(DSLLV, _Rd_); -REC_FUNC_DEL(DSRLV, _Rd_); -REC_FUNC_DEL(DSRAV, _Rd_); +REC_FUNC_DEL(SLLV, _Rd_); +REC_FUNC_DEL(SRLV, _Rd_); +REC_FUNC_DEL(SRAV, _Rd_); +REC_FUNC_DEL(DSLLV, _Rd_); +REC_FUNC_DEL(DSRLV, _Rd_); +REC_FUNC_DEL(DSRAV, _Rd_); #else +static void recMoveTtoD(int info) +{ + if (info & PROCESS_EE_T) + xMOV(xRegister32(EEREC_D), xRegister32(EEREC_T)); + else + xMOV(xRegister32(EEREC_D), ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); +} + +static void recMoveTtoD64(int info) +{ + if (info & PROCESS_EE_T) + xMOV(xRegister64(EEREC_D), xRegister64(EEREC_T)); + else + xMOV(xRegister64(EEREC_D), ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]]); +} + +static void recMoveSToRCX(int info) +{ + // load full 64-bits for store->load forwarding, since we always store >=64. + if (info & PROCESS_EE_S) + xMOV(rcx, xRegister64(EEREC_S)); + else + xMOV(rcx, ptr64[&cpuRegs.GPR.r[_Rs_].UL[0]]); +} + //// SLL -void recSLL_const() +static void recSLL_const() { g_cpuConstRegs[_Rd_].SD[0] = (s32)(g_cpuConstRegs[_Rt_].UL[0] << _Sa_); } -void recSLLs_(int info, int sa) +static void recSLLs_(int info, int sa) { + // TODO: Use BMI pxAssert(!(info & PROCESS_EE_XMM)); - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + recMoveTtoD(info); if (sa != 0) - { - xSHL(eax, sa); - } - - eeSignExtendTo(_Rd_); + xSHL(xRegister32(EEREC_D), sa); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); } -void recSLL_(int info) +static void recSLL_(int info) { recSLLs_(info, _Sa_); } -EERECOMPILE_CODEX(eeRecompileCode2, SLL); +EERECOMPILE_CODEX(eeRecompileCodeRC2, SLL, XMMINFO_WRITED | XMMINFO_READT); //// SRL -void recSRL_const() +static void recSRL_const() { g_cpuConstRegs[_Rd_].SD[0] = (s32)(g_cpuConstRegs[_Rt_].UL[0] >> _Sa_); } -void recSRLs_(int info, int sa) +static void recSRLs_(int info, int sa) { pxAssert(!(info & PROCESS_EE_XMM)); - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + recMoveTtoD(info); if (sa != 0) - xSHR(eax, sa); - - eeSignExtendTo(_Rd_); + xSHR(xRegister32(EEREC_D), sa); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); } -void recSRL_(int info) +static void recSRL_(int info) { recSRLs_(info, _Sa_); } -EERECOMPILE_CODEX(eeRecompileCode2, SRL); +EERECOMPILE_CODEX(eeRecompileCodeRC2, SRL, XMMINFO_WRITED | XMMINFO_READT); //// SRA -void recSRA_const() +static void recSRA_const() { g_cpuConstRegs[_Rd_].SD[0] = (s32)(g_cpuConstRegs[_Rt_].SL[0] >> _Sa_); } -void recSRAs_(int info, int sa) +static void recSRAs_(int info, int sa) { pxAssert(!(info & PROCESS_EE_XMM)); - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); + recMoveTtoD(info); if (sa != 0) - xSAR(eax, sa); - - eeSignExtendTo(_Rd_); + xSAR(xRegister32(EEREC_D), sa); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); } -void recSRA_(int info) +static void recSRA_(int info) { recSRAs_(info, _Sa_); } -EERECOMPILE_CODEX(eeRecompileCode2, SRA); +EERECOMPILE_CODEX(eeRecompileCodeRC2, SRA, XMMINFO_WRITED | XMMINFO_READT); //////////////////////////////////////////////////// -void recDSLL_const() +static void recDSLL_const() { g_cpuConstRegs[_Rd_].UD[0] = (u64)(g_cpuConstRegs[_Rt_].UD[0] << _Sa_); } -void recDSLLs_(int info, int sa) +static void recDSLLs_(int info, int sa) { pxAssert(!(info & PROCESS_EE_XMM)); - xMOV(rax, ptr[&cpuRegs.GPR.r[_Rt_].UD[0]]); + recMoveTtoD64(info); if (sa != 0) - xSHL(rax, sa); - xMOV(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + xSHL(xRegister64(EEREC_D), sa); } -void recDSLL_(int info) +static void recDSLL_(int info) { recDSLLs_(info, _Sa_); } -EERECOMPILE_CODEX(eeRecompileCode2, DSLL); +EERECOMPILE_CODEX(eeRecompileCodeRC2, DSLL, XMMINFO_WRITED | XMMINFO_READT | XMMINFO_64BITOP); //////////////////////////////////////////////////// -void recDSRL_const() +static void recDSRL_const() { g_cpuConstRegs[_Rd_].UD[0] = (u64)(g_cpuConstRegs[_Rt_].UD[0] >> _Sa_); } -void recDSRLs_(int info, int sa) +static void recDSRLs_(int info, int sa) { pxAssert(!(info & PROCESS_EE_XMM)); - xMOV(rax, ptr[&cpuRegs.GPR.r[_Rt_].UD[0]]); + recMoveTtoD64(info); if (sa != 0) - xSHR(rax, sa); - xMOV(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + xSHR(xRegister64(EEREC_D), sa); } -void recDSRL_(int info) +static void recDSRL_(int info) { recDSRLs_(info, _Sa_); } -EERECOMPILE_CODEX(eeRecompileCode2, DSRL); +EERECOMPILE_CODEX(eeRecompileCodeRC2, DSRL, XMMINFO_WRITED | XMMINFO_READT | XMMINFO_64BITOP); //// DSRA -void recDSRA_const() +static void recDSRA_const() { g_cpuConstRegs[_Rd_].SD[0] = (u64)(g_cpuConstRegs[_Rt_].SD[0] >> _Sa_); } -void recDSRAs_(int info, int sa) +static void recDSRAs_(int info, int sa) { pxAssert(!(info & PROCESS_EE_XMM)); - xMOV(rax, ptr[&cpuRegs.GPR.r[_Rt_].UD[0]]); + recMoveTtoD64(info); if (sa != 0) - xSAR(rax, sa); - xMOV(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + xSAR(xRegister64(EEREC_D), sa); } -void recDSRA_(int info) +static void recDSRA_(int info) { recDSRAs_(info, _Sa_); } -EERECOMPILE_CODEX(eeRecompileCode2, DSRA); +EERECOMPILE_CODEX(eeRecompileCodeRC2, DSRA, XMMINFO_WRITED | XMMINFO_READT | XMMINFO_64BITOP); ///// DSLL32 -void recDSLL32_const() +static void recDSLL32_const() { g_cpuConstRegs[_Rd_].UD[0] = (u64)(g_cpuConstRegs[_Rt_].UD[0] << (_Sa_ + 32)); } -void recDSLL32s_(int info, int sa) +static void recDSLL32_(int info) { - pxAssert(!(info & PROCESS_EE_XMM)); - - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); - xSHL(rax, sa + 32); - xMOV(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + recDSLLs_(info, _Sa_ + 32); } -void recDSLL32_(int info) -{ - recDSLL32s_(info, _Sa_); -} - -EERECOMPILE_CODEX(eeRecompileCode2, DSLL32); +EERECOMPILE_CODEX(eeRecompileCodeRC2, DSLL32, XMMINFO_WRITED | XMMINFO_READT | XMMINFO_64BITOP); //// DSRL32 -void recDSRL32_const() +static void recDSRL32_const() { g_cpuConstRegs[_Rd_].UD[0] = (u64)(g_cpuConstRegs[_Rt_].UD[0] >> (_Sa_ + 32)); } -void recDSRL32s_(int info, int sa) +static void recDSRL32_(int info) { - pxAssert(!(info & PROCESS_EE_XMM)); - - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rt_].UL[1]]); - if (sa != 0) - xSHR(eax, sa); - - xMOV(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + recDSRLs_(info, _Sa_ + 32); } -void recDSRL32_(int info) -{ - recDSRL32s_(info, _Sa_); -} - -EERECOMPILE_CODEX(eeRecompileCode2, DSRL32); +EERECOMPILE_CODEX(eeRecompileCodeRC2, DSRL32, XMMINFO_WRITED | XMMINFO_READT); //// DSRA32 -void recDSRA32_const() +static void recDSRA32_const() { g_cpuConstRegs[_Rd_].SD[0] = (u64)(g_cpuConstRegs[_Rt_].SD[0] >> (_Sa_ + 32)); } -void recDSRA32s_(int info, int sa) +static void recDSRA32_(int info) { - recDSRAs_(info, sa + 32); + recDSRAs_(info, _Sa_ + 32); } -void recDSRA32_(int info) -{ - recDSRA32s_(info, _Sa_); -} - -EERECOMPILE_CODEX(eeRecompileCode2, DSRA32); +EERECOMPILE_CODEX(eeRecompileCodeRC2, DSRA32, XMMINFO_WRITED | XMMINFO_READT | XMMINFO_64BITOP); /********************************************************* * Shift arithmetic with variant register shift * * Format: OP rd, rt, rs * *********************************************************/ -static void recShiftV_constt(const xImpl_Group2& shift) +static void recShiftV_constt(int info, const xImpl_Group2& shift) { - xMOV(ecx, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); - - xMOV(eax, g_cpuConstRegs[_Rt_].UL[0]); - shift(eax, cl); - - eeSignExtendTo(_Rd_); + pxAssert(_Rs_ != 0); + recMoveSToRCX(info); + xMOV(xRegister32(EEREC_D), g_cpuConstRegs[_Rt_].UL[0]); + shift(xRegister32(EEREC_D), cl); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); } -static void recShiftV(const xImpl_Group2& shift) +static void recShiftV(int info, const xImpl_Group2& shift) { - xMOV(eax, ptr[&cpuRegs.GPR.r[_Rt_].UL[0]]); - if (_Rs_ != 0) - { - xMOV(ecx, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); - shift(eax, cl); - } - eeSignExtendTo(_Rd_); + pxAssert(_Rs_ != 0); + + recMoveSToRCX(info); + recMoveTtoD(info); + shift(xRegister32(EEREC_D), cl); + xMOVSX(xRegister64(EEREC_D), xRegister32(EEREC_D)); } -static void recDShiftV_constt(const xImpl_Group2& shift) +static void recDShiftV_constt(int info, const xImpl_Group2& shift) { - xMOV(ecx, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); - - xMOV64(rax, g_cpuConstRegs[_Rt_].UD[0]); - shift(rax, cl); - - xMOV(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + pxAssert(_Rs_ != 0); + recMoveSToRCX(info); + xMOV64(xRegister64(EEREC_D), g_cpuConstRegs[_Rt_].SD[0]); + shift(xRegister64(EEREC_D), cl); } -static void recDShiftV(const xImpl_Group2& shift) +static void recDShiftV(int info, const xImpl_Group2& shift) { - xMOV(rax, ptr[&cpuRegs.GPR.r[_Rt_].UD[0]]); - if (_Rs_ != 0) - { - xMOV(ecx, ptr[&cpuRegs.GPR.r[_Rs_].UL[0]]); - shift(rax, cl); - } - xMOV(ptr[&cpuRegs.GPR.r[_Rd_].UD[0]], rax); + pxAssert(_Rs_ != 0); + recMoveSToRCX(info); + recMoveTtoD64(info); + shift(xRegister64(EEREC_D), cl); } //// SLLV -void recSLLV_const() +static void recSLLV_const() { g_cpuConstRegs[_Rd_].SD[0] = (s32)(g_cpuConstRegs[_Rt_].UL[0] << (g_cpuConstRegs[_Rs_].UL[0] & 0x1f)); } -void recSLLV_consts(int info) +static void recSLLV_consts(int info) { recSLLs_(info, g_cpuConstRegs[_Rs_].UL[0] & 0x1f); } -void recSLLV_constt(int info) +static void recSLLV_constt(int info) { - recShiftV_constt(xSHL); + recShiftV_constt(info, xSHL); } -void recSLLV_(int info) +static void recSLLV_(int info) { - recShiftV(xSHL); + recShiftV(info, xSHL); } -EERECOMPILE_CODE0(SLLV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(SLLV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); //// SRLV -void recSRLV_const() +static void recSRLV_const() { g_cpuConstRegs[_Rd_].SD[0] = (s32)(g_cpuConstRegs[_Rt_].UL[0] >> (g_cpuConstRegs[_Rs_].UL[0] & 0x1f)); } -void recSRLV_consts(int info) +static void recSRLV_consts(int info) { recSRLs_(info, g_cpuConstRegs[_Rs_].UL[0] & 0x1f); } -void recSRLV_constt(int info) +static void recSRLV_constt(int info) { - recShiftV_constt(xSHR); + recShiftV_constt(info, xSHR); } -void recSRLV_(int info) +static void recSRLV_(int info) { - recShiftV(xSHR); + recShiftV(info, xSHR); } -EERECOMPILE_CODE0(SRLV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(SRLV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); //// SRAV -void recSRAV_const() +static void recSRAV_const() { g_cpuConstRegs[_Rd_].SD[0] = (s32)(g_cpuConstRegs[_Rt_].SL[0] >> (g_cpuConstRegs[_Rs_].UL[0] & 0x1f)); } -void recSRAV_consts(int info) +static void recSRAV_consts(int info) { recSRAs_(info, g_cpuConstRegs[_Rs_].UL[0] & 0x1f); } -void recSRAV_constt(int info) +static void recSRAV_constt(int info) { - recShiftV_constt(xSAR); + recShiftV_constt(info, xSAR); } -void recSRAV_(int info) +static void recSRAV_(int info) { - recShiftV(xSAR); + recShiftV(info, xSAR); } -EERECOMPILE_CODE0(SRAV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(SRAV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); //// DSLLV -void recDSLLV_const() +static void recDSLLV_const() { g_cpuConstRegs[_Rd_].UD[0] = (u64)(g_cpuConstRegs[_Rt_].UD[0] << (g_cpuConstRegs[_Rs_].UL[0] & 0x3f)); } -void recDSLLV_consts(int info) +static void recDSLLV_consts(int info) { int sa = g_cpuConstRegs[_Rs_].UL[0] & 0x3f; - if (sa < 32) - recDSLLs_(info, sa); - else - recDSLL32s_(info, sa - 32); + recDSLLs_(info, sa); } -void recDSLLV_constt(int info) +static void recDSLLV_constt(int info) { - recDShiftV_constt(xSHL); + recDShiftV_constt(info, xSHL); } -void recDSLLV_(int info) +static void recDSLLV_(int info) { - recDShiftV(xSHL); + recDShiftV(info, xSHL); } -EERECOMPILE_CODE0(DSLLV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(DSLLV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_64BITOP); //// DSRLV -void recDSRLV_const() +static void recDSRLV_const() { g_cpuConstRegs[_Rd_].UD[0] = (u64)(g_cpuConstRegs[_Rt_].UD[0] >> (g_cpuConstRegs[_Rs_].UL[0] & 0x3f)); } -void recDSRLV_consts(int info) +static void recDSRLV_consts(int info) { int sa = g_cpuConstRegs[_Rs_].UL[0] & 0x3f; - if (sa < 32) - recDSRLs_(info, sa); - else - recDSRL32s_(info, sa - 32); + recDSRLs_(info, sa); } -void recDSRLV_constt(int info) +static void recDSRLV_constt(int info) { - recDShiftV_constt(xSHR); + recDShiftV_constt(info, xSHR); } -void recDSRLV_(int info) +static void recDSRLV_(int info) { - recDShiftV(xSHR); + recDShiftV(info, xSHR); } -EERECOMPILE_CODE0(DSRLV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(DSRLV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_64BITOP); //// DSRAV -void recDSRAV_const() +static void recDSRAV_const() { g_cpuConstRegs[_Rd_].SD[0] = (s64)(g_cpuConstRegs[_Rt_].SD[0] >> (g_cpuConstRegs[_Rs_].UL[0] & 0x3f)); } -void recDSRAV_consts(int info) +static void recDSRAV_consts(int info) { int sa = g_cpuConstRegs[_Rs_].UL[0] & 0x3f; - if (sa < 32) - recDSRAs_(info, sa); - else - recDSRA32s_(info, sa - 32); + recDSRAs_(info, sa); } -void recDSRAV_constt(int info) +static void recDSRAV_constt(int info) { - recDShiftV_constt(xSAR); + recDShiftV_constt(info, xSAR); } -void recDSRAV_(int info) +static void recDSRAV_(int info) { - recDShiftV(xSAR); + recDShiftV(info, xSAR); } -EERECOMPILE_CODE0(DSRAV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED); +EERECOMPILE_CODERC0(DSRAV, XMMINFO_READS | XMMINFO_READT | XMMINFO_WRITED | XMMINFO_64BITOP); #endif -} // namespace OpcodeImpl -} // namespace Dynarec -} // namespace R5900 +} // namespace R5900::Dynarec::OpcodeImpl diff --git a/pcsx2/x86/ix86-32/iR5900Templates.cpp b/pcsx2/x86/ix86-32/iR5900Templates.cpp index 745306bbdd..53cc9a7e2b 100644 --- a/pcsx2/x86/ix86-32/iR5900Templates.cpp +++ b/pcsx2/x86/ix86-32/iR5900Templates.cpp @@ -47,527 +47,238 @@ void _deleteEEreg(int reg, int flush) _flushConstReg(reg); } GPR_DEL_CONST(reg); - _deleteGPRtoXMMreg(reg, flush ? 0 : 2); + _deleteGPRtoXMMreg(reg, flush ? DELETE_REG_FREE : DELETE_REG_FLUSH_AND_FREE); + _deleteGPRtoX86reg(reg, flush ? DELETE_REG_FREE : DELETE_REG_FLUSH_AND_FREE); +} + +void _deleteEEreg128(int reg) +{ + if (!reg) + return; + + GPR_DEL_CONST(reg); + _deleteGPRtoXMMreg(reg, DELETE_REG_FREE_NO_WRITEBACK); + _deleteGPRtoX86reg(reg, DELETE_REG_FREE_NO_WRITEBACK); } void _flushEEreg(int reg, bool clear) { if (!reg) return; - if (GPR_IS_CONST1(reg)) - { + + if (GPR_IS_DIRTY_CONST(reg)) _flushConstReg(reg); - return; - } - _deleteGPRtoXMMreg(reg, clear ? 2 : 1); + if (clear) + GPR_DEL_CONST(reg); + + _deleteGPRtoXMMreg(reg, clear ? DELETE_REG_FLUSH_AND_FREE : DELETE_REG_FLUSH); + _deleteGPRtoX86reg(reg, clear ? DELETE_REG_FLUSH_AND_FREE : DELETE_REG_FLUSH); } -int eeProcessHILO(int reg, int mode, int mmx) +int _eeTryRenameReg(int to, int from, int fromx86, int other, int xmminfo) { - if (_hasFreeXMMreg() || !(g_pCurInstInfo->regs[reg] & EEINST_LASTUSE)) - { - return _allocGPRtoXMMreg(-1, reg, mode); - } + // can't rename when in form Rd = Rs op Rt and Rd == Rs or Rd == Rt + if ((xmminfo & XMMINFO_NORENAME) || fromx86 < 0 || to == from || to == other || !EEINST_RENAMETEST(from)) + return -1; - return -1; + RALOG("Renaming %s to %s\n", R3000A::disRNameGPR[from], R3000A::disRNameGPR[to]); + + // flush back when it's been modified + if (x86regs[fromx86].mode & MODE_WRITE && EEINST_LIVETEST(from)) + _writebackX86Reg(fromx86); + + // remove all references to renamed-to register + _deleteGPRtoX86reg(to, DELETE_REG_FREE_NO_WRITEBACK); + _deleteGPRtoXMMreg(to, DELETE_REG_FLUSH_AND_FREE); + GPR_DEL_CONST(to); + + // and do the actual rename, new register has been modified. + x86regs[fromx86].reg = to; + x86regs[fromx86].mode |= MODE_READ | MODE_WRITE; + return fromx86; } -// Strangely this code is used on NOT-MMX path ... -#define PROCESS_EE_SETMODES(mmreg) (/*(mmxregs[mmreg].mode&MODE_WRITE)*/ false ? PROCESS_EE_MODEWRITES : 0) -#define PROCESS_EE_SETMODET(mmreg) (/*(mmxregs[mmreg].mode&MODE_WRITE)*/ false ? PROCESS_EE_MODEWRITET : 0) -// ignores XMMINFO_READS, XMMINFO_READT, and XMMINFO_READD_LO from xmminfo -// core of reg caching -void eeRecompileCode0(R5900FNPTR constcode, R5900FNPTR_INFO constscode, R5900FNPTR_INFO consttcode, R5900FNPTR_INFO noconstcode, int xmminfo) +static bool FitsInImmediate(int reg, int fprinfo) +{ + if (fprinfo & XMMINFO_64BITOP) + return (s32)g_cpuConstRegs[reg].SD[0] == g_cpuConstRegs[reg].SD[0]; + else + return true; // all 32bit ops fit +} + +void eeRecompileCodeRC0(R5900FNPTR constcode, R5900FNPTR_INFO constscode, R5900FNPTR_INFO consttcode, R5900FNPTR_INFO noconstcode, int xmminfo) { if (!_Rd_ && (xmminfo & XMMINFO_WRITED)) return; if (GPR_IS_CONST2(_Rs_, _Rt_)) { - if (xmminfo & XMMINFO_WRITED) + if (_Rd_ && (xmminfo & XMMINFO_WRITED)) { - _deleteGPRtoXMMreg(_Rd_, 2); - } - if (xmminfo & XMMINFO_WRITED) + _deleteGPRtoX86reg(_Rd_, DELETE_REG_FREE_NO_WRITEBACK); + _deleteGPRtoXMMreg(_Rd_, DELETE_REG_FLUSH_AND_FREE); GPR_SET_CONST(_Rd_); + } constcode(); return; } - const int moded = MODE_WRITE | ((xmminfo & XMMINFO_READD) ? MODE_READ : 0); + // this function should not be used for lo/hi. + pxAssert(!(xmminfo & (XMMINFO_READLO | XMMINFO_READHI | XMMINFO_WRITELO | XMMINFO_WRITEHI))); - // test if should write xmm, mirror to mmx code - if (g_pCurInstInfo->info & EEINST_XMM) - { - int mmreg1, mmreg3, mmtemp; - pxAssert(0); - - if (xmminfo & (XMMINFO_READLO | XMMINFO_WRITELO)) - _addNeededGPRtoXMMreg(XMMGPR_LO); - if (xmminfo & (XMMINFO_READHI | XMMINFO_WRITEHI)) - _addNeededGPRtoXMMreg(XMMGPR_HI); - _addNeededGPRtoXMMreg(_Rs_); - _addNeededGPRtoXMMreg(_Rt_); - - if (GPR_IS_CONST1(_Rs_) || GPR_IS_CONST1(_Rt_)) - { - u32 creg = GPR_IS_CONST1(_Rs_) ? _Rs_ : _Rt_; - int vreg = creg == _Rs_ ? _Rt_ : _Rs_; - -// if (g_pCurInstInfo->regs[vreg] & EEINST_XMM) -// { -// mmreg1 = _allocGPRtoXMMreg(-1, vreg, MODE_READ); -// _addNeededGPRtoXMMreg(vreg); -// } - mmreg1 = _allocCheckGPRtoXMM(g_pCurInstInfo, vreg, MODE_READ); - - if (mmreg1 >= 0) - { - int info = PROCESS_EE_XMM; - - if (GPR_IS_CONST1(_Rs_)) - info |= PROCESS_EE_SETMODET(mmreg1); - else - info |= PROCESS_EE_SETMODES(mmreg1); - - if (xmminfo & XMMINFO_WRITED) - { - - _addNeededGPRtoXMMreg(_Rd_); - mmreg3 = _checkXMMreg(XMMTYPE_GPRREG, _Rd_, MODE_WRITE); - - if (!(xmminfo & XMMINFO_READD) && mmreg3 < 0 && ((g_pCurInstInfo->regs[vreg] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(vreg))) - { - _freeXMMreg(mmreg1); - if (GPR_IS_CONST1(_Rs_)) - info &= ~PROCESS_EE_MODEWRITET; - else - info &= ~PROCESS_EE_MODEWRITES; - xmmregs[mmreg1].inuse = 1; - xmmregs[mmreg1].reg = _Rd_; - xmmregs[mmreg1].mode = moded; - mmreg3 = mmreg1; - } - else if (mmreg3 < 0) - mmreg3 = _allocGPRtoXMMreg(-1, _Rd_, moded); - - info |= PROCESS_EE_SET_D(mmreg3); - } - - if (xmminfo & (XMMINFO_READLO | XMMINFO_WRITELO)) - { - mmtemp = eeProcessHILO(XMMGPR_LO, ((xmminfo & XMMINFO_READLO) ? MODE_READ : 0) | ((xmminfo & XMMINFO_WRITELO) ? MODE_WRITE : 0), 0); - if (mmtemp >= 0) - info |= PROCESS_EE_SET_LO(mmtemp); - } - if (xmminfo & (XMMINFO_READHI | XMMINFO_WRITEHI)) - { - mmtemp = eeProcessHILO(XMMGPR_HI, ((xmminfo & XMMINFO_READLO) ? MODE_READ : 0) | ((xmminfo & XMMINFO_WRITELO) ? MODE_WRITE : 0), 0); - if (mmtemp >= 0) - info |= PROCESS_EE_SET_HI(mmtemp); - } - - if (creg == _Rs_) - constscode(info | PROCESS_EE_SET_T(mmreg1)); - else - consttcode(info | PROCESS_EE_SET_S(mmreg1)); - _clearNeededXMMregs(); - if (xmminfo & XMMINFO_WRITED) - GPR_DEL_CONST(_Rd_); - return; - } - } - else - { - // no const regs - mmreg1 = _allocCheckGPRtoXMM(g_pCurInstInfo, _Rs_, MODE_READ); - int mmreg2 = _allocCheckGPRtoXMM(g_pCurInstInfo, _Rt_, MODE_READ); - - if (mmreg1 >= 0 || mmreg2 >= 0) - { - int info = PROCESS_EE_XMM; - - // do it all in xmm - if (mmreg1 < 0) - mmreg1 = _allocGPRtoXMMreg(-1, _Rs_, MODE_READ); - if (mmreg2 < 0) - mmreg2 = _allocGPRtoXMMreg(-1, _Rt_, MODE_READ); - - info |= PROCESS_EE_SETMODES(mmreg1) | PROCESS_EE_SETMODET(mmreg2); - - if (xmminfo & XMMINFO_WRITED) - { - // check for last used, if so don't alloc a new XMM reg - _addNeededGPRtoXMMreg(_Rd_); - mmreg3 = _checkXMMreg(XMMTYPE_GPRREG, _Rd_, moded); - - if (mmreg3 < 0) - { - if (!(xmminfo & XMMINFO_READD) && ((g_pCurInstInfo->regs[_Rt_] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(_Rt_))) - { - _freeXMMreg(mmreg2); - info &= ~PROCESS_EE_MODEWRITET; - xmmregs[mmreg2].inuse = 1; - xmmregs[mmreg2].reg = _Rd_; - xmmregs[mmreg2].mode = moded; - mmreg3 = mmreg2; - } - else if (!(xmminfo & XMMINFO_READD) && ((g_pCurInstInfo->regs[_Rs_] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(_Rs_))) - { - _freeXMMreg(mmreg1); - info &= ~PROCESS_EE_MODEWRITES; - xmmregs[mmreg1].inuse = 1; - xmmregs[mmreg1].reg = _Rd_; - xmmregs[mmreg1].mode = moded; - mmreg3 = mmreg1; - } - else - mmreg3 = _allocGPRtoXMMreg(-1, _Rd_, moded); - } - - info |= PROCESS_EE_SET_D(mmreg3); - } - - if (xmminfo & (XMMINFO_READLO | XMMINFO_WRITELO)) - { - mmtemp = eeProcessHILO(XMMGPR_LO, ((xmminfo & XMMINFO_READLO) ? MODE_READ : 0) | ((xmminfo & XMMINFO_WRITELO) ? MODE_WRITE : 0), 0); - if (mmtemp >= 0) - info |= PROCESS_EE_SET_LO(mmtemp); - } - if (xmminfo & (XMMINFO_READHI | XMMINFO_WRITEHI)) - { - mmtemp = eeProcessHILO(XMMGPR_HI, ((xmminfo & XMMINFO_READLO) ? MODE_READ : 0) | ((xmminfo & XMMINFO_WRITELO) ? MODE_WRITE : 0), 0); - if (mmtemp >= 0) - info |= PROCESS_EE_SET_HI(mmtemp); - } - - noconstcode(info | PROCESS_EE_SET_S(mmreg1) | PROCESS_EE_SET_T(mmreg2)); - _clearNeededXMMregs(); - if (xmminfo & XMMINFO_WRITED) - GPR_DEL_CONST(_Rd_); - return; - } - } - - _clearNeededXMMregs(); - } + // we have to put these up here, because the register allocator below will wipe out const flags + // for the destination register when/if it switches it to write mode. + const bool s_is_const = GPR_IS_CONST1(_Rs_); + const bool t_is_const = GPR_IS_CONST1(_Rt_); + const bool d_is_const = GPR_IS_CONST1(_Rd_); + const bool s_is_used = EEINST_USEDTEST(_Rs_); + const bool t_is_used = EEINST_USEDTEST(_Rt_); + const bool s_in_xmm = _hasXMMreg(XMMTYPE_GPRREG, _Rs_); + const bool t_in_xmm = _hasXMMreg(XMMTYPE_GPRREG, _Rt_); // regular x86 - _deleteGPRtoXMMreg(_Rs_, 1); - _deleteGPRtoXMMreg(_Rt_, 1); - if (xmminfo & XMMINFO_WRITED) - _deleteGPRtoXMMreg(_Rd_, (xmminfo & XMMINFO_READD) ? 0 : 2); + if ((xmminfo & XMMINFO_READS) && !s_is_const) + _addNeededGPRtoX86reg(_Rs_); + if ((xmminfo & XMMINFO_READT) && !t_is_const) + _addNeededGPRtoX86reg(_Rt_); + if ((xmminfo & XMMINFO_READD) && !d_is_const) + _addNeededGPRtoX86reg(_Rd_); - // don't delete, fn will take care of them -// if (xmminfo & (XMMINFO_READLO|XMMINFO_WRITELO)) -// { -// _deleteGPRtoXMMreg(XMMGPR_LO, (xmminfo & XMMINFO_READLO) ? 1 : 0); -// } -// if (xmminfo & (XMMINFO_READHI|XMMINFO_WRITEHI)) -// { -// _deleteGPRtoXMMreg(XMMGPR_HI, (xmminfo & XMMINFO_READHI) ? 1 : 0); -// } - - if (GPR_IS_CONST1(_Rs_)) + // when it doesn't fit in an immediate, we'll flush it to a reg early to save code + u32 info = 0; + int regs = -1, regt = -1; + if (xmminfo & XMMINFO_READS) { - constscode(0); - if (xmminfo & XMMINFO_WRITED) - GPR_DEL_CONST(_Rd_); - return; + regs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + if (regs < 0 && (!s_is_const || !FitsInImmediate(_Rs_, xmminfo)) && (s_is_used || s_in_xmm || ((xmminfo & XMMINFO_WRITED) && _Rd_ == _Rs_) || (xmminfo & XMMINFO_FORCEREGS))) + { + regs = _allocX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + } + if (regs >= 0) + info |= PROCESS_EE_SET_S(regs); } - if (GPR_IS_CONST1(_Rt_)) + if (xmminfo & XMMINFO_READT) { - consttcode(0); - if (xmminfo & XMMINFO_WRITED) - GPR_DEL_CONST(_Rd_); - return; + regt = _checkX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + if (regt < 0 && (!t_is_const || !FitsInImmediate(_Rt_, xmminfo)) && (t_is_used || t_in_xmm || ((xmminfo & XMMINFO_WRITED) && _Rd_ == _Rt_) || (xmminfo & XMMINFO_FORCEREGT))) + { + regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + } + if (regt >= 0) + info |= PROCESS_EE_SET_T(regt); + } + + if (xmminfo & (XMMINFO_WRITED | XMMINFO_READD)) + { + // _eeTryRenameReg() sets READ | WRITE already, so this is only needed when allocating. + const int moded = ((xmminfo & XMMINFO_WRITED) ? MODE_WRITE : 0) | ((xmminfo & XMMINFO_READD) ? MODE_READ : 0); + + // If S is no longer live, swap D for S. Saves the move. + int regd = (_Rd_ && xmminfo & XMMINFO_WRITED) ? _eeTryRenameReg(_Rd_, (xmminfo & XMMINFO_READS) ? _Rs_ : 0, regs, (xmminfo & XMMINFO_READT) ? _Rt_ : 0, xmminfo) : 0; + if (regd < 0) + regd = _allocX86reg(X86TYPE_GPR, _Rd_, moded); + + pxAssert(regd >= 0); + info |= PROCESS_EE_SET_D(regd); } - noconstcode(0); if (xmminfo & XMMINFO_WRITED) GPR_DEL_CONST(_Rd_); + + _validateRegs(); + + if (s_is_const && regs < 0) + { + constscode(info /*| PROCESS_CONSTS*/); + return; + } + + if (t_is_const && regt < 0) + { + consttcode(info /*| PROCESS_CONSTT*/); + return; + } + + noconstcode(info); } -// rt = rs op imm16 -void eeRecompileCode1(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode) +void eeRecompileCodeRC1(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode, int xmminfo) { + pxAssert((xmminfo & (XMMINFO_READS | XMMINFO_WRITET)) == (XMMINFO_READS | XMMINFO_WRITET)); + if (!_Rt_) return; if (GPR_IS_CONST1(_Rs_)) { - _deleteGPRtoXMMreg(_Rt_, 2); + _deleteGPRtoXMMreg(_Rt_, DELETE_REG_FLUSH_AND_FREE); + _deleteGPRtoX86reg(_Rt_, DELETE_REG_FREE_NO_WRITEBACK); GPR_SET_CONST(_Rt_); constcode(); return; } - // test if should write xmm, mirror to mmx code - if (g_pCurInstInfo->info & EEINST_XMM) - { - pxAssert(0); + const bool s_is_used = EEINST_USEDTEST(_Rs_); + const bool s_in_xmm = _hasXMMreg(XMMTYPE_GPRREG, _Rs_); - // no const regs - const int mmreg1 = _allocCheckGPRtoXMM(g_pCurInstInfo, _Rs_, MODE_READ); + u32 info = 0; + int regs = _checkX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + if (regs < 0 && (s_is_used || s_in_xmm || _Rt_ == _Rs_ || (xmminfo & XMMINFO_FORCEREGS))) + regs = _allocX86reg(X86TYPE_GPR, _Rs_, MODE_READ); + if (regs >= 0) + info |= PROCESS_EE_SET_S(regs); - if (mmreg1 >= 0) - { - int info = PROCESS_EE_XMM | PROCESS_EE_SETMODES(mmreg1); + // If S is no longer live, swap D for S. Saves the move. + int regt = _eeTryRenameReg(_Rt_, _Rs_, regs, 0, xmminfo); + if (regt < 0) + regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); - // check for last used, if so don't alloc a new XMM reg - _addNeededGPRtoXMMreg(_Rt_); - int mmreg2 = _checkXMMreg(XMMTYPE_GPRREG, _Rt_, MODE_WRITE); + info |= PROCESS_EE_SET_T(regt); + _validateRegs(); - if (mmreg2 < 0) - { - if ((g_pCurInstInfo->regs[_Rs_] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(_Rs_)) - { - _freeXMMreg(mmreg1); - info &= ~PROCESS_EE_MODEWRITES; - xmmregs[mmreg1].inuse = 1; - xmmregs[mmreg1].reg = _Rt_; - xmmregs[mmreg1].mode = MODE_WRITE | MODE_READ; - mmreg2 = mmreg1; - } - else - mmreg2 = _allocGPRtoXMMreg(-1, _Rt_, MODE_WRITE); - } - - noconstcode(info | PROCESS_EE_SET_S(mmreg1) | PROCESS_EE_SET_T(mmreg2)); - _clearNeededXMMregs(); - GPR_DEL_CONST(_Rt_); - return; - } - - _clearNeededXMMregs(); - } - - // regular x86 - _deleteGPRtoXMMreg(_Rs_, 1); - _deleteGPRtoXMMreg(_Rt_, 2); - - noconstcode(0); GPR_DEL_CONST(_Rt_); + noconstcode(info); } // rd = rt op sa -void eeRecompileCode2(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode) +void eeRecompileCodeRC2(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode, int xmminfo) { + pxAssert((xmminfo & (XMMINFO_READT | XMMINFO_WRITED)) == (XMMINFO_READT | XMMINFO_WRITED)); + if (!_Rd_) return; if (GPR_IS_CONST1(_Rt_)) { - _deleteGPRtoXMMreg(_Rd_, 2); + _deleteGPRtoXMMreg(_Rd_, DELETE_REG_FLUSH_AND_FREE); + _deleteGPRtoX86reg(_Rd_, DELETE_REG_FREE_NO_WRITEBACK); GPR_SET_CONST(_Rd_); constcode(); return; } - // test if should write xmm, mirror to mmx code - if (g_pCurInstInfo->info & EEINST_XMM) - { - pxAssert(0); + const bool t_is_used = EEINST_USEDTEST(_Rt_); + const bool t_in_xmm = _hasXMMreg(XMMTYPE_GPRREG, _Rt_); - // no const regs - const int mmreg1 = _allocCheckGPRtoXMM(g_pCurInstInfo, _Rt_, MODE_READ); + u32 info = 0; + int regt = _checkX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + if (regt < 0 && (t_is_used || t_in_xmm || (_Rd_ == _Rt_) || (xmminfo & XMMINFO_FORCEREGT))) + regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_READ); + if (regt >= 0) + info |= PROCESS_EE_SET_T(regt); - if (mmreg1 >= 0) - { - int info = PROCESS_EE_XMM | PROCESS_EE_SETMODET(mmreg1); + // If S is no longer live, swap D for T. Saves the move. + int regd = _eeTryRenameReg(_Rd_, _Rt_, regt, 0, xmminfo); + if (regd < 0) + regd = _allocX86reg(X86TYPE_GPR, _Rd_, MODE_WRITE); - // check for last used, if so don't alloc a new XMM reg - _addNeededGPRtoXMMreg(_Rd_); - int mmreg2 = _checkXMMreg(XMMTYPE_GPRREG, _Rd_, MODE_WRITE); + info |= PROCESS_EE_SET_D(regd); + _validateRegs(); - if (mmreg2 < 0) - { - if ((g_pCurInstInfo->regs[_Rt_] & EEINST_LASTUSE) || !EEINST_ISLIVE64(_Rt_)) - { - _freeXMMreg(mmreg1); - info &= ~PROCESS_EE_MODEWRITET; - xmmregs[mmreg1].inuse = 1; - xmmregs[mmreg1].reg = _Rd_; - xmmregs[mmreg1].mode = MODE_WRITE | MODE_READ; - mmreg2 = mmreg1; - } - else - mmreg2 = _allocGPRtoXMMreg(-1, _Rd_, MODE_WRITE); - } - - noconstcode(info | PROCESS_EE_SET_T(mmreg1) | PROCESS_EE_SET_D(mmreg2)); - _clearNeededXMMregs(); - GPR_DEL_CONST(_Rd_); - return; - } - - _clearNeededXMMregs(); - } - - // regular x86 - _deleteGPRtoXMMreg(_Rt_, 1); - _deleteGPRtoXMMreg(_Rd_, 2); - - noconstcode(0); GPR_DEL_CONST(_Rd_); -} - -// rt op rs -void eeRecompileCode3(R5900FNPTR constcode, R5900FNPTR_INFO multicode) -{ - pxFail("Unfinished code reached."); - - // for now, don't support xmm - _deleteEEreg(_Rs_, 0); - _deleteEEreg(_Rt_, 1); - - if (GPR_IS_CONST2(_Rs_, _Rt_)) - { - constcode(); - return; - } - - if (GPR_IS_CONST1(_Rs_)) - { - //multicode(PROCESS_EE_CONSTT); - return; - } - - if (GPR_IS_CONST1(_Rt_)) - { - //multicode(PROCESS_EE_CONSTT); - return; - } - - multicode(0); -} - -// Simple Code Templates // - -// rd = rs op rt -void eeRecompileCodeConst0(R5900FNPTR constcode, R5900FNPTR_INFO constscode, R5900FNPTR_INFO consttcode, R5900FNPTR_INFO noconstcode) -{ - if (!_Rd_) - return; - - // for now, don't support xmm - - _deleteGPRtoXMMreg(_Rs_, 1); - _deleteGPRtoXMMreg(_Rt_, 1); - _deleteGPRtoXMMreg(_Rd_, 0); - - if (GPR_IS_CONST2(_Rs_, _Rt_)) - { - GPR_SET_CONST(_Rd_); - constcode(); - return; - } - - if (GPR_IS_CONST1(_Rs_)) - { - constscode(0); - GPR_DEL_CONST(_Rd_); - return; - } - - if (GPR_IS_CONST1(_Rt_)) - { - consttcode(0); - GPR_DEL_CONST(_Rd_); - return; - } - - noconstcode(0); - GPR_DEL_CONST(_Rd_); -} - -// rt = rs op imm16 -void eeRecompileCodeConst1(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode) -{ - if (!_Rt_) - return; - - // for now, don't support xmm - - _deleteGPRtoXMMreg(_Rs_, 1); - _deleteGPRtoXMMreg(_Rt_, 0); - - if (GPR_IS_CONST1(_Rs_)) - { - GPR_SET_CONST(_Rt_); - constcode(); - return; - } - - noconstcode(0); - GPR_DEL_CONST(_Rt_); -} - -// rd = rt op sa -void eeRecompileCodeConst2(R5900FNPTR constcode, R5900FNPTR_INFO noconstcode) -{ - if (!_Rd_) - return; - - // for now, don't support xmm - - _deleteGPRtoXMMreg(_Rt_, 1); - _deleteGPRtoXMMreg(_Rd_, 0); - - if (GPR_IS_CONST1(_Rt_)) - { - GPR_SET_CONST(_Rd_); - constcode(); - return; - } - - noconstcode(0); - GPR_DEL_CONST(_Rd_); -} - -// rd = rt MULT rs (SPECIAL) -void eeRecompileCodeConstSPECIAL(R5900FNPTR constcode, R5900FNPTR_INFO multicode, int MULT) -{ - pxFail("Unfinished code reached."); - - // for now, don't support xmm - if (MULT) - { - _deleteGPRtoXMMreg(_Rd_, 0); - } - - _deleteGPRtoXMMreg(_Rs_, 1); - _deleteGPRtoXMMreg(_Rt_, 1); - - if (GPR_IS_CONST2(_Rs_, _Rt_)) - { - if (MULT && _Rd_) - GPR_SET_CONST(_Rd_); - constcode(); - return; - } - - if (GPR_IS_CONST1(_Rs_)) - { - //multicode(PROCESS_EE_CONSTS); - if (MULT && _Rd_) - GPR_DEL_CONST(_Rd_); - return; - } - - if (GPR_IS_CONST1(_Rt_)) - { - //multicode(PROCESS_EE_CONSTT); - if (MULT && _Rd_) - GPR_DEL_CONST(_Rd_); - return; - } - - multicode(0); - if (MULT && _Rd_) - GPR_DEL_CONST(_Rd_); + noconstcode(info); } // EE XMM allocation code @@ -575,40 +286,11 @@ int eeRecompileCodeXMM(int xmminfo) { int info = PROCESS_EE_XMM; - // flush consts - if (xmminfo & XMMINFO_READT) - { - if (GPR_IS_CONST1(_Rt_) && !(g_cpuFlushedConstReg & (1 << _Rt_))) - { - xMOV(ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]], g_cpuConstRegs[_Rt_].UL[0]); - xMOV(ptr32[&cpuRegs.GPR.r[_Rt_].UL[1]], g_cpuConstRegs[_Rt_].UL[1]); - g_cpuFlushedConstReg |= (1 << _Rt_); - } - } - if (xmminfo & XMMINFO_READS) - { - if (GPR_IS_CONST1(_Rs_) && !(g_cpuFlushedConstReg & (1 << _Rs_))) - { - xMOV(ptr32[&cpuRegs.GPR.r[_Rs_].UL[0]], g_cpuConstRegs[_Rs_].UL[0]); - xMOV(ptr32[&cpuRegs.GPR.r[_Rs_].UL[1]], g_cpuConstRegs[_Rs_].UL[1]); - g_cpuFlushedConstReg |= (1 << _Rs_); - } - } - - if (xmminfo & XMMINFO_WRITED) - { - GPR_DEL_CONST(_Rd_); - } - // add needed if (xmminfo & (XMMINFO_READLO | XMMINFO_WRITELO)) - { _addNeededGPRtoXMMreg(XMMGPR_LO); - } if (xmminfo & (XMMINFO_READHI | XMMINFO_WRITEHI)) - { _addNeededGPRtoXMMreg(XMMGPR_HI); - } if (xmminfo & XMMINFO_READS) _addNeededGPRtoXMMreg(_Rs_); if (xmminfo & XMMINFO_READT) @@ -616,58 +298,59 @@ int eeRecompileCodeXMM(int xmminfo) if (xmminfo & XMMINFO_WRITED) _addNeededGPRtoXMMreg(_Rd_); - // allocate + // TODO: we could do memory operands here if not live. but the MMI implementations aren't hooked up to that at the moment. if (xmminfo & XMMINFO_READS) { - int reg = _allocGPRtoXMMreg(-1, _Rs_, MODE_READ); - info |= PROCESS_EE_SET_S(reg) | PROCESS_EE_SETMODES(reg); + const int reg = _allocGPRtoXMMreg(_Rs_, MODE_READ); + info |= PROCESS_EE_SET_S(reg); } if (xmminfo & XMMINFO_READT) { - int reg = _allocGPRtoXMMreg(-1, _Rt_, MODE_READ); - info |= PROCESS_EE_SET_T(reg) | PROCESS_EE_SETMODET(reg); + const int reg = _allocGPRtoXMMreg(_Rt_, MODE_READ); + info |= PROCESS_EE_SET_T(reg); } if (xmminfo & XMMINFO_WRITED) { - int readd = MODE_WRITE | ((xmminfo & XMMINFO_READD) ? ((xmminfo & XMMINFO_READD_LO) ? (MODE_READ | MODE_READHALF) : MODE_READ) : 0); + int readd = MODE_WRITE | ((xmminfo & XMMINFO_READD) ? MODE_READ : 0); int regd = _checkXMMreg(XMMTYPE_GPRREG, _Rd_, readd); if (regd < 0) { - if (!(xmminfo & XMMINFO_READD) && (xmminfo & XMMINFO_READT) && (_Rt_ == 0 || (g_pCurInstInfo->regs[_Rt_] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(_Rt_))) + if (!(xmminfo & XMMINFO_READD) && (xmminfo & XMMINFO_READT) && EEINST_RENAMETEST(_Rt_)) { - _freeXMMreg(EEREC_T); - xmmregs[EEREC_T].inuse = 1; - xmmregs[EEREC_T].reg = _Rd_; - xmmregs[EEREC_T].mode = readd; + _deleteEEreg128(_Rd_); + _reallocateXMMreg(EEREC_T, XMMTYPE_GPRREG, _Rd_, readd, EEINST_LIVETEST(_Rt_)); regd = EEREC_T; } - else if (!(xmminfo & XMMINFO_READD) && (xmminfo & XMMINFO_READS) && (_Rs_ == 0 || (g_pCurInstInfo->regs[_Rs_] & EEINST_LASTUSE) || !EEINST_ISLIVEXMM(_Rs_))) + else if (!(xmminfo & XMMINFO_READD) && (xmminfo & XMMINFO_READS) && EEINST_RENAMETEST(_Rs_)) { - _freeXMMreg(EEREC_S); - xmmregs[EEREC_S].inuse = 1; - xmmregs[EEREC_S].reg = _Rd_; - xmmregs[EEREC_S].mode = readd; + _deleteEEreg128(_Rd_); + _reallocateXMMreg(EEREC_S, XMMTYPE_GPRREG, _Rd_, readd, EEINST_LIVETEST(_Rs_)); regd = EEREC_S; } else - regd = _allocGPRtoXMMreg(-1, _Rd_, readd); + { + regd = _allocGPRtoXMMreg(_Rd_, readd); + } } info |= PROCESS_EE_SET_D(regd); } if (xmminfo & (XMMINFO_READLO | XMMINFO_WRITELO)) { - info |= PROCESS_EE_SET_LO(_allocGPRtoXMMreg(-1, XMMGPR_LO, ((xmminfo & XMMINFO_READLO) ? MODE_READ : 0) | ((xmminfo & XMMINFO_WRITELO) ? MODE_WRITE : 0))); - info |= PROCESS_EE_LO; + info |= PROCESS_EE_SET_LO(_allocGPRtoXMMreg(XMMGPR_LO, ((xmminfo & XMMINFO_READLO) ? MODE_READ : 0) | ((xmminfo & XMMINFO_WRITELO) ? MODE_WRITE : 0))); } if (xmminfo & (XMMINFO_READHI | XMMINFO_WRITEHI)) { - info |= PROCESS_EE_SET_HI(_allocGPRtoXMMreg(-1, XMMGPR_HI, ((xmminfo & XMMINFO_READHI) ? MODE_READ : 0) | ((xmminfo & XMMINFO_WRITEHI) ? MODE_WRITE : 0))); - info |= PROCESS_EE_HI; + info |= PROCESS_EE_SET_HI(_allocGPRtoXMMreg(XMMGPR_HI, ((xmminfo & XMMINFO_READHI) ? MODE_READ : 0) | ((xmminfo & XMMINFO_WRITEHI) ? MODE_WRITE : 0))); } + + if (xmminfo & XMMINFO_WRITED) + GPR_DEL_CONST(_Rd_); + + _validateRegs(); return info; } @@ -676,9 +359,6 @@ int eeRecompileCodeXMM(int xmminfo) #define _Fs_ _Rd_ #define _Fd_ _Sa_ -#define PROCESS_EE_SETMODES_XMM(mmreg) ((xmmregs[mmreg].mode & MODE_WRITE) ? PROCESS_EE_MODEWRITES : 0) -#define PROCESS_EE_SETMODET_XMM(mmreg) ((xmmregs[mmreg].mode & MODE_WRITE) ? PROCESS_EE_MODEWRITET : 0) - // rd = rs op rt void eeFPURecompileCode(R5900FNPTR_INFO xmmcode, R5900FNPTR fpucode, int xmminfo) { @@ -699,7 +379,7 @@ void eeFPURecompileCode(R5900FNPTR_INFO xmmcode, R5900FNPTR fpucode, int xmminfo if (g_pCurInstInfo->fpuregs[_Ft_] & EEINST_LASTUSE) mmregt = _checkXMMreg(XMMTYPE_FPREG, _Ft_, MODE_READ); else - mmregt = _allocFPtoXMMreg(-1, _Ft_, MODE_READ); + mmregt = _allocFPtoXMMreg(_Ft_, MODE_READ); } if (xmminfo & XMMINFO_READS) @@ -709,26 +389,27 @@ void eeFPURecompileCode(R5900FNPTR_INFO xmmcode, R5900FNPTR fpucode, int xmminfo mmregs = _checkXMMreg(XMMTYPE_FPREG, _Fs_, MODE_READ); } else - mmregs = _allocFPtoXMMreg(-1, _Fs_, MODE_READ); - } + { + mmregs = _allocFPtoXMMreg(_Fs_, MODE_READ); - if (mmregs >= 0) - info |= PROCESS_EE_SETMODES_XMM(mmregs); - if (mmregt >= 0) - info |= PROCESS_EE_SETMODET_XMM(mmregt); + // if we just allocated S and Fs == Ft, share it + if ((xmminfo & XMMINFO_READT) && _Fs_ == _Ft_) + mmregt = mmregs; + } + } if (xmminfo & XMMINFO_READD) { pxAssert(xmminfo & XMMINFO_WRITED); - mmregd = _allocFPtoXMMreg(-1, _Fd_, MODE_READ); + mmregd = _allocFPtoXMMreg(_Fd_, MODE_READ); } if (xmminfo & XMMINFO_READACC) { - if (!(xmminfo & XMMINFO_WRITEACC) && (g_pCurInstInfo->fpuregs[_Ft_] & EEINST_LASTUSE)) + if (!(xmminfo & XMMINFO_WRITEACC) && (g_pCurInstInfo->fpuregs[XMMFPU_ACC] & EEINST_LASTUSE)) mmregacc = _checkXMMreg(XMMTYPE_FPACC, 0, MODE_READ); else - mmregacc = _allocFPACCtoXMMreg(-1, MODE_READ); + mmregacc = _allocFPACCtoXMMreg(MODE_READ); } if (xmminfo & XMMINFO_WRITEACC) @@ -741,34 +422,28 @@ void eeFPURecompileCode(R5900FNPTR_INFO xmmcode, R5900FNPTR fpucode, int xmminfo if (mmregacc < 0) { - if ((xmminfo & XMMINFO_READT) && mmregt >= 0 && (FPUINST_LASTUSE(_Ft_) || !FPUINST_ISLIVE(_Ft_))) + if ((xmminfo & XMMINFO_READT) && mmregt >= 0 && FPUINST_RENAMETEST(_Ft_)) { - if (FPUINST_ISLIVE(_Ft_)) - { - _freeXMMreg(mmregt); - info &= ~PROCESS_EE_MODEWRITET; - } - xmmregs[mmregt].inuse = 1; + if (EE_WRITE_DEAD_VALUES && xmmregs[mmregt].mode & MODE_WRITE) + _writebackXMMreg(mmregt); + xmmregs[mmregt].reg = 0; xmmregs[mmregt].mode = readacc; xmmregs[mmregt].type = XMMTYPE_FPACC; mmregacc = mmregt; } - else if ((xmminfo & XMMINFO_READS) && mmregs >= 0 && (FPUINST_LASTUSE(_Fs_) || !FPUINST_ISLIVE(_Fs_))) + else if ((xmminfo & XMMINFO_READS) && mmregs >= 0 && FPUINST_RENAMETEST(_Fs_)) { - if (FPUINST_ISLIVE(_Fs_)) - { - _freeXMMreg(mmregs); - info &= ~PROCESS_EE_MODEWRITES; - } - xmmregs[mmregs].inuse = 1; + if (EE_WRITE_DEAD_VALUES && xmmregs[mmregs].mode & MODE_WRITE) + _writebackXMMreg(mmregs); + xmmregs[mmregs].reg = 0; xmmregs[mmregs].mode = readacc; xmmregs[mmregs].type = XMMTYPE_FPACC; mmregacc = mmregs; } else - mmregacc = _allocFPACCtoXMMreg(-1, readacc); + mmregacc = _allocFPACCtoXMMreg(readacc); } xmmregs[mmregacc].mode |= MODE_WRITE; @@ -778,48 +453,43 @@ void eeFPURecompileCode(R5900FNPTR_INFO xmmcode, R5900FNPTR fpucode, int xmminfo // check for last used, if so don't alloc a new XMM reg int readd = MODE_WRITE | ((xmminfo & XMMINFO_READD) ? MODE_READ : 0); if (xmminfo & XMMINFO_READD) - mmregd = _allocFPtoXMMreg(-1, _Fd_, readd); + mmregd = _allocFPtoXMMreg(_Fd_, readd); else mmregd = _checkXMMreg(XMMTYPE_FPREG, _Fd_, readd); if (mmregd < 0) { - if ((xmminfo & XMMINFO_READT) && mmregt >= 0 && (FPUINST_LASTUSE(_Ft_) || !FPUINST_ISLIVE(_Ft_))) + if ((xmminfo & XMMINFO_READT) && mmregt >= 0 && FPUINST_RENAMETEST(_Ft_)) { - if (FPUINST_ISLIVE(_Ft_)) - { - _freeXMMreg(mmregt); - info &= ~PROCESS_EE_MODEWRITET; - } - xmmregs[mmregt].inuse = 1; + if (EE_WRITE_DEAD_VALUES && xmmregs[mmregt].mode & MODE_WRITE) + _writebackXMMreg(mmregt); + xmmregs[mmregt].reg = _Fd_; xmmregs[mmregt].mode = readd; mmregd = mmregt; } - else if ((xmminfo & XMMINFO_READS) && mmregs >= 0 && (FPUINST_LASTUSE(_Fs_) || !FPUINST_ISLIVE(_Fs_))) + else if ((xmminfo & XMMINFO_READS) && mmregs >= 0 && FPUINST_RENAMETEST(_Fs_)) { - if (FPUINST_ISLIVE(_Fs_)) - { - _freeXMMreg(mmregs); - info &= ~PROCESS_EE_MODEWRITES; - } + if (EE_WRITE_DEAD_VALUES && xmmregs[mmregs].mode & MODE_WRITE) + _writebackXMMreg(mmregs); + xmmregs[mmregs].inuse = 1; xmmregs[mmregs].reg = _Fd_; xmmregs[mmregs].mode = readd; mmregd = mmregs; } - else if ((xmminfo & XMMINFO_READACC) && mmregacc >= 0 && (FPUINST_LASTUSE(XMMFPU_ACC) || !FPUINST_ISLIVE(XMMFPU_ACC))) + else if ((xmminfo & XMMINFO_READACC) && mmregacc >= 0 && FPUINST_RENAMETEST(XMMFPU_ACC)) { - if (FPUINST_ISLIVE(XMMFPU_ACC)) - _freeXMMreg(mmregacc); - xmmregs[mmregacc].inuse = 1; + if (EE_WRITE_DEAD_VALUES && xmmregs[mmregacc].mode & MODE_WRITE) + _writebackXMMreg(mmregacc); + xmmregs[mmregacc].reg = _Fd_; xmmregs[mmregacc].mode = readd; xmmregs[mmregacc].type = XMMTYPE_FPREG; mmregd = mmregacc; } else - mmregd = _allocFPtoXMMreg(-1, _Fd_, readd); + mmregd = _allocFPtoXMMreg(_Fd_, readd); } } @@ -841,12 +511,12 @@ void eeFPURecompileCode(R5900FNPTR_INFO xmmcode, R5900FNPTR fpucode, int xmminfo if (xmminfo & XMMINFO_READS) { if (mmregs >= 0) - info |= PROCESS_EE_SET_S(mmregs) | PROCESS_EE_S; + info |= PROCESS_EE_SET_S(mmregs); } if (xmminfo & XMMINFO_READT) { if (mmregt >= 0) - info |= PROCESS_EE_SET_T(mmregt) | PROCESS_EE_T; + info |= PROCESS_EE_SET_T(mmregt); } // at least one must be in xmm @@ -856,5 +526,4 @@ void eeFPURecompileCode(R5900FNPTR_INFO xmmcode, R5900FNPTR fpucode, int xmminfo } xmmcode(info); - _clearNeededXMMregs(); } diff --git a/pcsx2/x86/ix86-32/recVTLB.cpp b/pcsx2/x86/ix86-32/recVTLB.cpp index 926d559520..a3c6122120 100644 --- a/pcsx2/x86/ix86-32/recVTLB.cpp +++ b/pcsx2/x86/ix86-32/recVTLB.cpp @@ -26,74 +26,31 @@ using namespace vtlb_private; using namespace x86Emitter; -////////////////////////////////////////////////////////////////////////////////////////// -// iAllocRegSSE -- allocates an xmm register. If no xmm register is available, xmm0 is -// saved into g_globalXMMData and returned as a free register. -// -class iAllocRegSSE +// we need enough for a 32-bit jump forwards (5 bytes) +static constexpr u32 LOADSTORE_PADDING = 5; + +//#define LOG_STORES + +static u32 GetAllocatedGPRBitmask() { -protected: - xRegisterSSE m_reg; - bool m_free; - -public: - iAllocRegSSE() - : m_reg(xmm0) - , m_free(!!_hasFreeXMMreg()) + u32 mask = 0; + for (u32 i = 0; i < iREGCNT_GPR; i++) { - if (m_free) - m_reg = xRegisterSSE(_allocTempXMMreg(XMMT_INT, -1)); - else - xStoreReg(m_reg); + if (x86regs[i].inuse) + mask |= (1u << i); } - - ~iAllocRegSSE() - { - if (m_free) - _freeXMMreg(m_reg.Id); - else - xRestoreReg(m_reg); - } - - operator xRegisterSSE() const { return m_reg; } -}; - -// Moves 128 bits from point B to point A, using SSE's MOVAPS (or MOVDQA). -// This instruction always uses an SSE register, even if all registers are allocated! It -// saves an SSE register to memory first, performs the copy, and restores the register. -// -static void iMOV128_SSE(const xIndirectVoid& destRm, const xIndirectVoid& srcRm) -{ - iAllocRegSSE reg; - xMOVDQA(reg, srcRm); - xMOVDQA(destRm, reg); + return mask; } -// Moves 64 bits of data from point B to point A, using either SSE, or x86 registers -// -static void iMOV64_Smart(const xIndirectVoid& destRm, const xIndirectVoid& srcRm) +static u32 GetAllocatedXMMBitmask() { - if (wordsize == 8) + u32 mask = 0; + for (u32 i = 0; i < iREGCNT_XMM; i++) { - xMOV(rax, srcRm); - xMOV(destRm, rax); - return; + if (xmmregs[i].inuse) + mask |= (1u << i); } - - if (_hasFreeXMMreg()) - { - // Move things using MOVLPS: - xRegisterSSE reg(_allocTempXMMreg(XMMT_INT, -1)); - xMOVL.PS(reg, srcRm); - xMOVL.PS(destRm, reg); - _freeXMMreg(reg.Id); - return; - } - - xMOV(eax, srcRm); - xMOV(destRm, eax); - xMOV(eax, srcRm + 4); - xMOV(destRm + 4, eax); + return mask; } /* @@ -146,62 +103,105 @@ static void iMOV64_Smart(const xIndirectVoid& destRm, const xIndirectVoid& srcRm */ +#ifdef LOG_STORES +static std::FILE* logfile; +static bool CheckLogFile() +{ + if (!logfile) + logfile = std::fopen("C:\\Dumps\\comp\\memlog.bad.txt", "wb"); + return (logfile != nullptr); +} + +static void LogWrite(u32 addr, u64 val) +{ + if (!CheckLogFile()) + return; + + std::fprintf(logfile, "%08X @ %u: %llx\n", addr, cpuRegs.cycle, val); + std::fflush(logfile); +} + +static void __vectorcall LogWriteQuad(u32 addr, __m128i val) +{ + if (!CheckLogFile()) + return; + + std::fprintf(logfile, "%08X @ %u: %llx %llx\n", addr, cpuRegs.cycle, val.m128i_u64[0], val.m128i_u64[1]); + std::fflush(logfile); +} +#endif + namespace vtlb_private { // ------------------------------------------------------------------------ // Prepares eax, ecx, and, ebx for Direct or Indirect operations. // Returns the writeback pointer for ebx (return address from indirect handling) // - static u32* DynGen_PrepRegs() + static void DynGen_PrepRegs(int addr_reg, int value_reg, u32 sz, bool xmm) { - // Warning dirty ebx (in case someone got the very bad idea to move this code) EE::Profiler.EmitMem(); + _freeX86reg(arg1regd); + xMOV(arg1regd, xRegister32(addr_reg)); + + if (value_reg >= 0) + { + if (sz == 128) + { + pxAssert(xmm); + _freeXMMreg(xRegisterSSE::GetArgRegister(1, 0).GetId()); + xMOVAPS(xRegisterSSE::GetArgRegister(1, 0), xRegisterSSE::GetInstance(value_reg)); + } + else if (xmm) + { + // 32bit xmms are passed in GPRs + pxAssert(sz == 32); + _freeX86reg(arg2regd); + xMOVD(arg2regd, xRegisterSSE(value_reg)); + } + else + { + _freeX86reg(arg2regd); + xMOV(arg2reg, xRegister64(value_reg)); + } + } + xMOV(eax, arg1regd); xSHR(eax, VTLB_PAGE_BITS); - xMOV(rax, ptrNative[xComplexAddress(rbx, vtlbdata.vmap, rax * wordsize)]); - u32* writeback = xLEA_Writeback(rbx); + xMOV(rax, ptrNative[xComplexAddress(arg3reg, vtlbdata.vmap, rax * wordsize)]); xADD(arg1reg, rax); - - return writeback; } // ------------------------------------------------------------------------ static void DynGen_DirectRead(u32 bits, bool sign) { - pxAssert(bits == 8 || bits == 16 || bits == 32); + pxAssert(bits == 8 || bits == 16 || bits == 32 || bits == 64 || bits == 128); switch (bits) { case 8: if (sign) - xMOVSX(eax, ptr8[arg1reg]); + xMOVSX(rax, ptr8[arg1reg]); else - xMOVZX(eax, ptr8[arg1reg]); + xMOVZX(rax, ptr8[arg1reg]); break; case 16: if (sign) - xMOVSX(eax, ptr16[arg1reg]); + xMOVSX(rax, ptr16[arg1reg]); else - xMOVZX(eax, ptr16[arg1reg]); + xMOVZX(rax, ptr16[arg1reg]); break; case 32: - xMOV(eax, ptr[arg1reg]); + if (sign) + xMOVSX(rax, ptr32[arg1reg]); + else + xMOV(eax, ptr32[arg1reg]); break; - jNO_DEFAULT - } - } - - static void DynGen_DirectRead64(u32 bits) - { - pxAssert(bits == 64 || bits == 128); - - switch (bits) { case 64: - xMOVQZX(xmm0, ptr64[arg1reg]); + xMOV(rax, ptr64[arg1reg]); break; case 128: @@ -215,17 +215,14 @@ namespace vtlb_private // ------------------------------------------------------------------------ static void DynGen_DirectWrite(u32 bits) { - // TODO: x86Emitter can't use dil switch (bits) { - //8 , 16, 32 : data on EDX case 8: - xMOV(edx, arg2regd); - xMOV(ptr[arg1reg], dl); + xMOV(ptr[arg1reg], xRegister8(arg2regd)); break; case 16: - xMOV(ptr[arg1reg], xRegister16(arg2reg)); + xMOV(ptr[arg1reg], xRegister16(arg2regd)); break; case 32: @@ -233,11 +230,11 @@ namespace vtlb_private break; case 64: - iMOV64_Smart(ptr[arg1reg], ptr[arg2reg]); + xMOV(ptr[arg1reg], arg2reg); break; case 128: - iMOV128_SSE(ptr[arg1reg], ptr[arg2reg]); + xMOVAPS(ptr[arg1reg], xRegisterSSE::GetArgRegister(1, 0)); break; } } @@ -257,7 +254,7 @@ alignas(__pagesize) static u8 m_IndirectDispatchers[__pagesize]; // static u8* GetIndirectDispatcherPtr(int mode, int operandsize, int sign = 0) { - assert(mode || operandsize >= 2 ? !sign : true); + assert(mode || operandsize >= 3 ? !sign : true); // Each dispatcher is aligned to 64 bytes. The actual dispatchers are only like // 20-some bytes each, but 64 byte alignment on functions that are called @@ -268,14 +265,16 @@ static u8* GetIndirectDispatcherPtr(int mode, int operandsize, int sign = 0) // Gregory: a 32 bytes alignment is likely enough and more cache friendly const int A = 32; - return &m_IndirectDispatchers[(mode * (7 * A)) + (sign * 5 * A) + (operandsize * A)]; + return &m_IndirectDispatchers[(mode * (8 * A)) + (sign * 5 * A) + (operandsize * A)]; } // ------------------------------------------------------------------------ // Generates a JS instruction that targets the appropriate templated instance of // the vtlb Indirect Dispatcher. // -static void DynGen_IndirectDispatch(int mode, int bits, bool sign = false) + +template +static void DynGen_HandlerTest(const GenDirectFn& gen_direct, int mode, int bits, bool sign = false) { int szidx = 0; switch (bits) @@ -287,7 +286,12 @@ static void DynGen_IndirectDispatch(int mode, int bits, bool sign = false) case 128: szidx = 4; break; jNO_DEFAULT; } - xJS(GetIndirectDispatcherPtr(mode, szidx, sign)); + xForwardJS8 to_handler; + gen_direct(); + xForwardJump8 done; + to_handler.SetTarget(); + xFastCall(GetIndirectDispatcherPtr(mode, szidx, sign)); + done.SetTarget(); } // ------------------------------------------------------------------------ @@ -296,6 +300,13 @@ static void DynGen_IndirectDispatch(int mode, int bits, bool sign = false) // Out: eax: result (if mode < 64) static void DynGen_IndirectTlbDispatcher(int mode, int bits, bool sign) { + // fixup stack +#ifdef _WIN32 + xSUB(rsp, 32 + 8); +#else + xSUB(rsp, 8); +#endif + xMOVZX(eax, al); if (wordsize != 8) xSUB(arg1regd, 0x80000000); @@ -319,20 +330,31 @@ static void DynGen_IndirectTlbDispatcher(int mode, int bits, bool sign) if (bits == 0) { if (sign) - xMOVSX(eax, al); + xMOVSX(rax, al); else - xMOVZX(eax, al); + xMOVZX(rax, al); } else if (bits == 1) { if (sign) - xMOVSX(eax, ax); + xMOVSX(rax, ax); else - xMOVZX(eax, ax); + xMOVZX(rax, ax); + } + else if (bits == 2) + { + if (sign) + xCDQE(); } } - xJMP(rbx); +#ifdef _WIN32 + xADD(rsp, 32 + 8); +#else + xADD(rsp, 8); +#endif + + xRET(); } // One-time initialization procedure. Multiple subsequent calls during the lifespan of the @@ -355,7 +377,7 @@ void vtlb_dynarec_init() { for (int bits = 0; bits < 5; ++bits) { - for (int sign = 0; sign < (!mode && bits < 2 ? 2 : 1); sign++) + for (int sign = 0; sign < (!mode && bits < 3 ? 2 : 1); sign++) { xSetPtr(GetIndirectDispatcherPtr(mode, bits, !!sign)); @@ -383,79 +405,83 @@ static void vtlb_SetWriteback(u32* writeback) ////////////////////////////////////////////////////////////////////////////////////////// // Dynarec Load Implementations -int vtlb_DynGenRead64(u32 bits, int gpr) -{ - pxAssume(bits == 64 || bits == 128); - - u32* writeback = DynGen_PrepRegs(); - - int reg = gpr == -1 ? _allocTempXMMreg(XMMT_INT, 0) : _allocGPRtoXMMreg(0, gpr, MODE_WRITE); // Handler returns in xmm0 - DynGen_IndirectDispatch(0, bits); - DynGen_DirectRead64(bits); - - vtlb_SetWriteback(writeback); // return target for indirect's call/ret - return reg; -} - // ------------------------------------------------------------------------ // Recompiled input registers: // ecx - source address to read from // Returns read value in eax. -void vtlb_DynGenRead32(u32 bits, bool sign) +int vtlb_DynGenReadNonQuad(u32 bits, bool sign, bool xmm, int addr_reg, vtlb_ReadRegAllocCallback dest_reg_alloc) { - pxAssume(bits <= 32); + pxAssume(bits <= 64); - u32* writeback = DynGen_PrepRegs(); - - DynGen_IndirectDispatch(0, bits, sign && bits < 32); - DynGen_DirectRead(bits, sign); - - vtlb_SetWriteback(writeback); -} - -// ------------------------------------------------------------------------ -// TLB lookup is performed in const, with the assumption that the COP0/TLB will clear the -// recompiler if the TLB is changed. -int vtlb_DynGenRead64_Const(u32 bits, u32 addr_const, int gpr) -{ - EE::Profiler.EmitConstMem(addr_const); - - int reg; - auto vmv = vtlbdata.vmap[addr_const >> VTLB_PAGE_BITS]; - if (!vmv.isHandler(addr_const)) + int x86_dest_reg; + if (!CHECK_FASTMEM || vtlb_IsFaultingPC(pc)) { - void* ppf = reinterpret_cast(vmv.assumePtr(addr_const)); - reg = gpr == -1 ? _allocTempXMMreg(XMMT_INT, -1) : _allocGPRtoXMMreg(-1, gpr, MODE_WRITE); + iFlushCall(FLUSH_FULLVTLB); + + DynGen_PrepRegs(addr_reg, -1, bits, xmm); + DynGen_HandlerTest([bits, sign]() { DynGen_DirectRead(bits, sign); }, 0, bits, sign && bits < 64); + + if (!xmm) + { + x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeX86reg(eax), eax.GetId()); + xMOV(xRegister64(x86_dest_reg), rax); + } + else + { + // we shouldn't be loading any FPRs which aren't 32bit.. + // we use MOVD here despite it being floating-point data, because we're going int->float reinterpret. + pxAssert(bits == 32); + x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeXMMreg(0), 0); + xMOVDZX(xRegisterSSE(x86_dest_reg), eax); + } + + return x86_dest_reg; + } + + const u8* codeStart; + const xAddressReg x86addr(addr_reg); + if (!xmm) + { + x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeX86reg(eax), eax.GetId()); + codeStart = x86Ptr; + const xRegister64 x86reg(x86_dest_reg); switch (bits) { - case 64: - xMOVQZX(xRegisterSSE(reg), ptr64[ppf]); - break; - - case 128: - xMOVAPS(xRegisterSSE(reg), ptr128[ppf]); - break; + case 8: + sign ? xMOVSX(x86reg, ptr8[RFASTMEMBASE + x86addr]) : xMOVZX(xRegister32(x86reg), ptr8[RFASTMEMBASE + x86addr]); + break; + case 16: + sign ? xMOVSX(x86reg, ptr16[RFASTMEMBASE + x86addr]) : xMOVZX(xRegister32(x86reg), ptr16[RFASTMEMBASE + x86addr]); + break; + case 32: + sign ? xMOVSX(x86reg, ptr32[RFASTMEMBASE + x86addr]) : xMOV(xRegister32(x86reg), ptr32[RFASTMEMBASE + x86addr]); + break; + case 64: + xMOV(x86reg, ptr64[RFASTMEMBASE + x86addr]); + break; jNO_DEFAULT } } else { - // has to: translate, find function, call function - u32 paddr = vmv.assumeHandlerGetPAddr(addr_const); - - int szidx = 0; - switch (bits) - { - case 64: szidx = 3; break; - case 128: szidx = 4; break; - } - - iFlushCall(FLUSH_FULLVTLB); - reg = gpr == -1 ? _allocTempXMMreg(XMMT_INT, 0) : _allocGPRtoXMMreg(0, gpr, MODE_WRITE); // Handler returns in xmm0 - xFastCall(vmv.assumeHandlerGetRaw(szidx, 0), paddr, arg2reg); + pxAssert(bits == 32); + x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeXMMreg(0), 0); + codeStart = x86Ptr; + const xRegisterSSE xmmreg(x86_dest_reg); + xMOVSSZX(xmmreg, ptr32[RFASTMEMBASE + x86addr]); } - return reg; + + const u32 padding = LOADSTORE_PADDING - std::min(static_cast(x86Ptr - codeStart), 5); + for (u32 i = 0; i < padding; i++) + xNOP(); + + vtlb_AddLoadStoreInfo((uptr)codeStart, static_cast(x86Ptr - codeStart), + pc, GetAllocatedGPRBitmask(), GetAllocatedXMMBitmask(), + static_cast(addr_reg), static_cast(x86_dest_reg), + static_cast(bits), sign, true, xmm); + + return x86_dest_reg; } // ------------------------------------------------------------------------ @@ -466,33 +492,41 @@ int vtlb_DynGenRead64_Const(u32 bits, u32 addr_const, int gpr) // TLB lookup is performed in const, with the assumption that the COP0/TLB will clear the // recompiler if the TLB is changed. // -void vtlb_DynGenRead32_Const(u32 bits, bool sign, u32 addr_const) +int vtlb_DynGenReadNonQuad_Const(u32 bits, bool sign, bool xmm, u32 addr_const, vtlb_ReadRegAllocCallback dest_reg_alloc) { EE::Profiler.EmitConstMem(addr_const); + int x86_dest_reg; auto vmv = vtlbdata.vmap[addr_const >> VTLB_PAGE_BITS]; if (!vmv.isHandler(addr_const)) { auto ppf = vmv.assumePtr(addr_const); - switch (bits) + if (!xmm) { + x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeX86reg(eax), eax.GetId()); + switch (bits) + { case 8: - if (sign) - xMOVSX(eax, ptr8[(u8*)ppf]); - else - xMOVZX(eax, ptr8[(u8*)ppf]); + sign ? xMOVSX(xRegister64(x86_dest_reg), ptr8[(u8*)ppf]) : xMOVZX(xRegister32(x86_dest_reg), ptr8[(u8*)ppf]); break; case 16: - if (sign) - xMOVSX(eax, ptr16[(u16*)ppf]); - else - xMOVZX(eax, ptr16[(u16*)ppf]); + sign ? xMOVSX(xRegister64(x86_dest_reg), ptr16[(u16*)ppf]) : xMOVZX(xRegister32(x86_dest_reg), ptr16[(u16*)ppf]); break; case 32: - xMOV(eax, ptr32[(u32*)ppf]); + sign ? xMOVSX(xRegister64(x86_dest_reg), ptr32[(u32*)ppf]) : xMOV(xRegister32(x86_dest_reg), ptr32[(u32*)ppf]); break; + + case 64: + xMOV(xRegister64(x86_dest_reg), ptr64[(u64*)ppf]); + break; + } + } + else + { + x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeXMMreg(0), 0); + xMOVSSZX(xRegisterSSE(x86_dest_reg), ptr32[(float*)ppf]); } } else @@ -506,49 +540,236 @@ void vtlb_DynGenRead32_Const(u32 bits, bool sign, u32 addr_const) case 8: szidx = 0; break; case 16: szidx = 1; break; case 32: szidx = 2; break; + case 64: szidx = 3; break; } // Shortcut for the INTC_STAT register, which many games like to spin on heavily. if ((bits == 32) && !EmuConfig.Speedhacks.IntcStat && (paddr == INTC_STAT)) { - xMOV(eax, ptr[&psHu32(INTC_STAT)]); + x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeX86reg(eax), eax.GetId()); + if (!xmm) + { + if (sign) + xMOVSX(xRegister64(x86_dest_reg), ptr32[&psHu32(INTC_STAT)]); + else + xMOV(xRegister32(x86_dest_reg), ptr32[&psHu32(INTC_STAT)]); + } + else + { + xMOVDZX(xRegisterSSE(x86_dest_reg), ptr32[&psHu32(INTC_STAT)]); + } } else { iFlushCall(FLUSH_FULLVTLB); xFastCall(vmv.assumeHandlerGetRaw(szidx, false), paddr); - // perform sign extension on the result: + if (!xmm) + { + x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeX86reg(eax), eax.GetId()); + switch (bits) + { + // save REX prefix by using 32bit dest for zext + case 8: + sign ? xMOVSX(xRegister64(x86_dest_reg), al) : xMOVZX(xRegister32(x86_dest_reg), al); + break; - if (bits == 8) - { - if (sign) - xMOVSX(eax, al); - else - xMOVZX(eax, al); + case 16: + sign ? xMOVSX(xRegister64(x86_dest_reg), ax) : xMOVZX(xRegister32(x86_dest_reg), ax); + break; + + case 32: + sign ? xMOVSX(xRegister64(x86_dest_reg), eax) : xMOV(xRegister32(x86_dest_reg), eax); + break; + + case 64: + xMOV(xRegister64(x86_dest_reg), rax); + break; + } } - else if (bits == 16) + else { - if (sign) - xMOVSX(eax, ax); - else - xMOVZX(eax, ax); + x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeXMMreg(0), 0); + xMOVDZX(xRegisterSSE(x86_dest_reg), eax); } } } + + return x86_dest_reg; +} + +int vtlb_DynGenReadQuad(u32 bits, int addr_reg, vtlb_ReadRegAllocCallback dest_reg_alloc) +{ + pxAssume(bits == 128); + + if (!CHECK_FASTMEM || vtlb_IsFaultingPC(pc)) + { + iFlushCall(FLUSH_FULLVTLB); + + DynGen_PrepRegs(arg1regd.GetId(), -1, bits, true); + DynGen_HandlerTest([bits]() {DynGen_DirectRead(bits, false); }, 0, bits); + + const int reg = dest_reg_alloc ? dest_reg_alloc() : (_freeXMMreg(0), 0); // Handler returns in xmm0 + if (reg >= 0) + xMOVAPS(xRegisterSSE(reg), xmm0); + + return reg; + } + + const int reg = dest_reg_alloc ? dest_reg_alloc() : (_freeXMMreg(0), 0); // Handler returns in xmm0 + const u8* codeStart = x86Ptr; + + xMOVAPS(xRegisterSSE(reg), ptr128[RFASTMEMBASE + arg1reg]); + + const u32 padding = LOADSTORE_PADDING - std::min(static_cast(x86Ptr - codeStart), 5); + for (u32 i = 0; i < padding; i++) + xNOP(); + + vtlb_AddLoadStoreInfo((uptr)codeStart, static_cast(x86Ptr - codeStart), + pc, GetAllocatedGPRBitmask(), GetAllocatedXMMBitmask(), + static_cast(arg1reg.GetId()), static_cast(reg), + static_cast(bits), false, true, true); + + return reg; +} + + +// ------------------------------------------------------------------------ +// TLB lookup is performed in const, with the assumption that the COP0/TLB will clear the +// recompiler if the TLB is changed. +int vtlb_DynGenReadQuad_Const(u32 bits, u32 addr_const, vtlb_ReadRegAllocCallback dest_reg_alloc) +{ + pxAssert(bits == 128); + + EE::Profiler.EmitConstMem(addr_const); + + int reg; + auto vmv = vtlbdata.vmap[addr_const >> VTLB_PAGE_BITS]; + if (!vmv.isHandler(addr_const)) + { + void* ppf = reinterpret_cast(vmv.assumePtr(addr_const)); + reg = dest_reg_alloc ? dest_reg_alloc() : (_freeXMMreg(0), 0); + if (reg >= 0) + xMOVAPS(xRegisterSSE(reg), ptr128[ppf]); + } + else + { + // has to: translate, find function, call function + u32 paddr = vmv.assumeHandlerGetPAddr(addr_const); + + const int szidx = 4; + iFlushCall(FLUSH_FULLVTLB); + xFastCall(vmv.assumeHandlerGetRaw(szidx, 0), paddr); + + reg = dest_reg_alloc ? dest_reg_alloc() : (_freeXMMreg(0), 0); + xMOVAPS(xRegisterSSE(reg), xmm0); + } + + return reg; } ////////////////////////////////////////////////////////////////////////////////////////// // Dynarec Store Implementations -void vtlb_DynGenWrite(u32 sz) +void vtlb_DynGenWrite(u32 sz, bool xmm, int addr_reg, int value_reg) { - u32* writeback = DynGen_PrepRegs(); +#ifdef LOG_STORES + //if (!xmm) + { + iFlushCall(FLUSH_FULLVTLB); - DynGen_IndirectDispatch(1, sz); - DynGen_DirectWrite(sz); + xPUSH(xRegister64(addr_reg)); + xPUSH(xRegister64(value_reg)); + xPUSH(arg1reg); + xPUSH(arg2reg); + xMOV(arg1regd, xRegister32(addr_reg)); + if (xmm) + { + xSUB(rsp, 32 + 32); + xMOVAPS(ptr[rsp + 32], xRegisterSSE::GetInstance(value_reg)); + xMOVAPS(ptr[rsp + 48], xRegisterSSE::GetArgRegister(1, 0)); + xMOVAPS(xRegisterSSE::GetArgRegister(1, 0), xRegisterSSE::GetInstance(value_reg)); + xFastCall((void*)LogWriteQuad); + xMOVAPS(xRegisterSSE::GetArgRegister(1, 0), ptr[rsp + 48]); + xMOVAPS(xRegisterSSE::GetInstance(value_reg), ptr[rsp + 32]); + xADD(rsp, 32 + 32); + } + else + { + xMOV(arg2reg, xRegister64(value_reg)); + if (sz == 8) + xAND(arg2regd, 0xFF); + else if (sz == 16) + xAND(arg2regd, 0xFFFF); + else if (sz == 32) + xAND(arg2regd, -1); + xSUB(rsp, 32); + xFastCall((void*)LogWrite); + xADD(rsp, 32); + } + xPOP(arg2reg); + xPOP(arg1reg); + xPOP(xRegister64(value_reg)); + xPOP(xRegister64(addr_reg)); + } +#endif - vtlb_SetWriteback(writeback); + if (!CHECK_FASTMEM || vtlb_IsFaultingPC(pc)) + { + iFlushCall(FLUSH_FULLVTLB); + + DynGen_PrepRegs(addr_reg, value_reg, sz, xmm); + DynGen_HandlerTest([sz]() { DynGen_DirectWrite(sz); }, 1, sz); + return; + } + + const u8* codeStart = x86Ptr; + + const xAddressReg vaddr_reg(addr_reg); + if (!xmm) + { + switch (sz) + { + case 8: + xMOV(ptr8[RFASTMEMBASE + vaddr_reg], xRegister8(xRegister32(value_reg))); + break; + case 16: + xMOV(ptr16[RFASTMEMBASE + vaddr_reg], xRegister16(value_reg)); + break; + case 32: + xMOV(ptr32[RFASTMEMBASE + vaddr_reg], xRegister32(value_reg)); + break; + case 64: + xMOV(ptr64[RFASTMEMBASE + vaddr_reg], xRegister64(value_reg)); + break; + + jNO_DEFAULT + } + } + else + { + pxAssert(sz == 32 || sz == 128); + switch (sz) + { + case 32: + xMOVSS(ptr32[RFASTMEMBASE + vaddr_reg], xRegisterSSE(value_reg)); + break; + case 128: + xMOVAPS(ptr128[RFASTMEMBASE + vaddr_reg], xRegisterSSE(value_reg)); + break; + + jNO_DEFAULT + } + } + + const u32 padding = LOADSTORE_PADDING - std::min(static_cast(x86Ptr - codeStart), 5); + for (u32 i = 0; i < padding; i++) + xNOP(); + + vtlb_AddLoadStoreInfo((uptr)codeStart, static_cast(x86Ptr - codeStart), + pc, GetAllocatedGPRBitmask(), GetAllocatedXMMBitmask(), + static_cast(addr_reg), static_cast(value_reg), + static_cast(sz), false, false, xmm); } @@ -556,38 +777,92 @@ void vtlb_DynGenWrite(u32 sz) // Generates code for a store instruction, where the address is a known constant. // TLB lookup is performed in const, with the assumption that the COP0/TLB will clear the // recompiler if the TLB is changed. -void vtlb_DynGenWrite_Const(u32 bits, u32 addr_const) +void vtlb_DynGenWrite_Const(u32 bits, bool xmm, u32 addr_const, int value_reg) { EE::Profiler.EmitConstMem(addr_const); +#ifdef LOG_STORES + iFlushCall(FLUSH_FULLVTLB); + + //if (!xmm) + { + xPUSH(xRegister64(value_reg)); + xPUSH(xRegister64(value_reg)); + xPUSH(arg1reg); + xPUSH(arg2reg); + xMOV(arg1reg, addr_const); + if (xmm) + { + xSUB(rsp, 32 + 32); + xMOVAPS(ptr[rsp + 32], xRegisterSSE::GetInstance(value_reg)); + xMOVAPS(ptr[rsp + 48], xRegisterSSE::GetArgRegister(1, 0)); + xMOVAPS(xRegisterSSE::GetArgRegister(1, 0), xRegisterSSE::GetInstance(value_reg)); + xFastCall((void*)LogWriteQuad); + xMOVAPS(xRegisterSSE::GetArgRegister(1, 0), ptr[rsp + 48]); + xMOVAPS(xRegisterSSE::GetInstance(value_reg), ptr[rsp + 32]); + xADD(rsp, 32 + 32); + } + else + { + xMOV(arg2reg, xRegister64(value_reg)); + if (bits == 8) + xAND(arg2regd, 0xFF); + else if (bits == 16) + xAND(arg2regd, 0xFFFF); + else if (bits == 32) + xAND(arg2regd, -1); + xSUB(rsp, 32); + xFastCall((void*)LogWrite); + xADD(rsp, 32); + } + xPOP(arg2reg); + xPOP(arg1reg); + xPOP(xRegister64(value_reg)); + xPOP(xRegister64(value_reg)); + } +#endif + auto vmv = vtlbdata.vmap[addr_const >> VTLB_PAGE_BITS]; if (!vmv.isHandler(addr_const)) { - // TODO: x86Emitter can't use dil auto ppf = vmv.assumePtr(addr_const); - switch (bits) + if (!xmm) { - //8 , 16, 32 : data on arg2 - case 8: - xMOV(edx, arg2regd); - xMOV(ptr[(void*)ppf], dl); - break; + switch (bits) + { + case 8: + xMOV(ptr[(void*)ppf], xRegister8(xRegister32(value_reg))); + break; - case 16: - xMOV(ptr[(void*)ppf], xRegister16(arg2reg)); - break; + case 16: + xMOV(ptr[(void*)ppf], xRegister16(value_reg)); + break; - case 32: - xMOV(ptr[(void*)ppf], arg2regd); - break; + case 32: + xMOV(ptr[(void*)ppf], xRegister32(value_reg)); + break; - case 64: - iMOV64_Smart(ptr[(void*)ppf], ptr[arg2reg]); - break; + case 64: + xMOV(ptr64[(void*)ppf], xRegister64(value_reg)); + break; - case 128: - iMOV128_SSE(ptr[(void*)ppf], ptr[arg2reg]); - break; + jNO_DEFAULT + } + } + else + { + switch (bits) + { + case 32: + xMOVSS(ptr[(void*)ppf], xRegisterSSE(value_reg)); + break; + + case 128: + xMOVAPS(ptr128[(void*)ppf], xRegisterSSE(value_reg)); + break; + + jNO_DEFAULT + } } } else @@ -598,15 +873,47 @@ void vtlb_DynGenWrite_Const(u32 bits, u32 addr_const) int szidx = 0; switch (bits) { - case 8: szidx=0; break; - case 16: szidx=1; break; - case 32: szidx=2; break; - case 64: szidx=3; break; - case 128: szidx=4; break; + case 8: + szidx = 0; + break; + case 16: + szidx = 1; + break; + case 32: + szidx = 2; + break; + case 64: + szidx = 3; + break; + case 128: + szidx = 4; + break; } iFlushCall(FLUSH_FULLVTLB); - xFastCall(vmv.assumeHandlerGetRaw(szidx, true), paddr, arg2reg); + + _freeX86reg(arg1regd); + xMOV(arg1regd, paddr); + if (bits == 128) + { + pxAssert(xmm); + const xRegisterSSE argreg(xRegisterSSE::GetArgRegister(1, 0)); + _freeXMMreg(argreg.GetId()); + xMOVAPS(argreg, xRegisterSSE(value_reg)); + } + else if (xmm) + { + pxAssert(bits == 32); + _freeX86reg(arg2regd); + xMOVD(arg2regd, xRegisterSSE(value_reg)); + } + else + { + _freeX86reg(arg2regd); + xMOV(arg2reg, xRegister64(value_reg)); + } + + xFastCall(vmv.assumeHandlerGetRaw(szidx, true)); } } @@ -626,3 +933,159 @@ void vtlb_DynV2P() xOR(eax, ecx); } + +void vtlb_DynBackpatchLoadStore(uptr code_address, u32 code_size, u32 guest_pc, u32 guest_addr, + u32 gpr_bitmask, u32 fpr_bitmask, u8 address_register, u8 data_register, + u8 size_in_bits, bool is_signed, bool is_load, bool is_xmm) +{ + static constexpr u32 GPR_SIZE = 8; + static constexpr u32 XMM_SIZE = 16; + + // on win32, we need to reserve an additional 32 bytes shadow space when calling out to C +#ifdef _WIN32 + static constexpr u32 SHADOW_SIZE = 32; +#else + static constexpr u32 SHADOW_SIZE = 0; +#endif + + DevCon.WriteLn("Backpatching %s at %p[%u] (pc %08X vaddr %08X): Bitmask %08X %08X Addr %u Data %u Size %u Flags %02X %02X", + is_load ? "load" : "store", (void*)code_address, code_size, guest_pc, guest_addr, gpr_bitmask, fpr_bitmask, + address_register, data_register, size_in_bits, is_signed, is_load); + + u8* thunk = recBeginThunk(); + + // save regs + u32 num_gprs = 0; + u32 num_fprs = 0; + + const u32 rbxid = static_cast(rbx.GetId()); + const u32 arg1id = static_cast(arg1reg.GetId()); + const u32 arg2id = static_cast(arg2reg.GetId()); + const u32 arg3id = static_cast(arg3reg.GetId()); + + for (u32 i = 0; i < iREGCNT_GPR; i++) + { + if ((gpr_bitmask & (1u << i)) && (i == rbxid || i == arg1id || i == arg2id || xRegisterBase::IsCallerSaved(i)) && (!is_load || is_xmm || data_register != i)) + num_gprs++; + } + for (u32 i = 0; i < iREGCNT_XMM; i++) + { + if (fpr_bitmask & (1u << i) && xRegisterSSE::IsCallerSaved(i) && (!is_load || !is_xmm || data_register != i)) + num_fprs++; + } + + const u32 stack_size = (((num_gprs + 1) & ~1u) * GPR_SIZE) + (num_fprs * XMM_SIZE) + SHADOW_SIZE; + + if (stack_size > 0) + { + xSUB(rsp, stack_size); + + u32 stack_offset = SHADOW_SIZE; + for (u32 i = 0; i < iREGCNT_XMM; i++) + { + if (fpr_bitmask & (1u << i) && xRegisterSSE::IsCallerSaved(i) && (!is_load || !is_xmm || data_register != i)) + { + xMOVAPS(ptr128[rsp + stack_offset], xRegisterSSE(i)); + stack_offset += XMM_SIZE; + } + } + + for (u32 i = 0; i < iREGCNT_GPR; i++) + { + if ((gpr_bitmask & (1u << i)) && (i == arg1id || i == arg2id || i == arg3id || xRegisterBase::IsCallerSaved(i)) && (!is_load || is_xmm || data_register != i)) + { + xMOV(ptr64[rsp + stack_offset], xRegister64(i)); + stack_offset += GPR_SIZE; + } + } + } + + if (is_load) + { + DynGen_PrepRegs(address_register, -1, size_in_bits, is_xmm); + DynGen_HandlerTest([size_in_bits, is_signed]() {DynGen_DirectRead(size_in_bits, is_signed); }, 0, size_in_bits, is_signed && size_in_bits <= 32); + + if (size_in_bits == 128) + { + if (data_register != xmm0.GetId()) + xMOVAPS(xRegisterSSE(data_register), xmm0); + } + else + { + if (is_xmm) + { + xMOVDZX(xRegisterSSE(data_register), rax); + } + else + { + if (data_register != eax.GetId()) + xMOV(xRegister64(data_register), rax); + } + } + } + else + { + if (address_register != arg1reg.GetId()) + xMOV(arg1regd, xRegister32(address_register)); + + if (size_in_bits == 128) + { + const xRegisterSSE argreg(xRegisterSSE::GetArgRegister(1, 0)); + if (data_register != argreg.GetId()) + xMOVAPS(argreg, xRegisterSSE(data_register)); + } + else + { + if (is_xmm) + { + xMOVD(arg2reg, xRegisterSSE(data_register)); + } + else + { + if (data_register != arg2reg.GetId()) + xMOV(arg2reg, xRegister64(data_register)); + } + } + + DynGen_PrepRegs(address_register, data_register, size_in_bits, is_xmm); + DynGen_HandlerTest([size_in_bits]() { DynGen_DirectWrite(size_in_bits); }, 1, size_in_bits); + } + + // restore regs + if (stack_size > 0) + { + u32 stack_offset = SHADOW_SIZE; + for (u32 i = 0; i < iREGCNT_XMM; i++) + { + if (fpr_bitmask & (1u << i) && xRegisterSSE::IsCallerSaved(i) && (!is_load || !is_xmm || data_register != i)) + { + xMOVAPS(xRegisterSSE(i), ptr128[rsp + stack_offset]); + stack_offset += XMM_SIZE; + } + } + + for (u32 i = 0; i < iREGCNT_GPR; i++) + { + if ((gpr_bitmask & (1u << i)) && (i == arg1id || i == arg2id || i == arg3id || xRegisterBase::IsCallerSaved(i)) && (!is_load || is_xmm || data_register != i)) + { + xMOV(xRegister64(i), ptr64[rsp + stack_offset]); + stack_offset += GPR_SIZE; + } + } + + xADD(rsp, stack_size); + } + + xJMP((void*)(code_address + code_size)); + + recEndThunk(); + + // backpatch to a jump to the slowmem handler + x86Ptr = (u8*)code_address; + xJMP(thunk); + + // fill the rest of it with nops, if any + pxAssertRel(static_cast((uptr)x86Ptr - code_address) <= code_size, "Overflowed when backpatching"); + for (u32 i = static_cast((uptr)x86Ptr - code_address); i < code_size; i++) + xNOP(); +} diff --git a/pcsx2/x86/microVU.cpp b/pcsx2/x86/microVU.cpp index 342a86c673..75eeb57aab 100644 --- a/pcsx2/x86/microVU.cpp +++ b/pcsx2/x86/microVU.cpp @@ -20,6 +20,7 @@ #include "common/AlignedMalloc.h" #include "common/Perf.h" +#include "common/StringUtil.h" //------------------------------------------------------------------ // Micro VU - Main Functions @@ -27,33 +28,19 @@ alignas(__pagesize) static u8 vu0_RecDispatchers[mVUdispCacheSize]; alignas(__pagesize) static u8 vu1_RecDispatchers[mVUdispCacheSize]; -static __fi void mVUthrowHardwareDeficiency(const char* extFail, int vuIndex) -{ - throw Exception::HardwareDeficiency() - .SetDiagMsg(fmt::format("microVU{} recompiler init failed: %s is not available.", vuIndex, extFail)) - .SetUserMsg(fmt::format("{} Extensions not found. microVU requires a host CPU with SSE4 extensions.", extFail)); -} - void mVUreserveCache(microVU& mVU) { + mVU.cache_reserve = new RecompiledCodeReserve(StringUtil::StdStringFromFormat("Micro VU%u Recompiler Cache", mVU.index)); + mVU.cache_reserve->SetProfilerName(StringUtil::StdStringFromFormat("mVU%urec", mVU.index)); - mVU.cache_reserve = new RecompiledCodeReserve(fmt::format("Micro VU{} Recompiler Cache", mVU.index), _16mb); - mVU.cache_reserve->SetProfilerName(fmt::format("mVU{}rec", mVU.index)); - - mVU.cache = mVU.index - ? (u8*)mVU.cache_reserve->Reserve(GetVmMemory().MainMemory(), HostMemoryMap::mVU1recOffset, mVU.cacheSize * _1mb) - : (u8*)mVU.cache_reserve->Reserve(GetVmMemory().MainMemory(), HostMemoryMap::mVU0recOffset, mVU.cacheSize * _1mb); - - mVU.cache_reserve->ThrowIfNotOk(); + const size_t alloc_offset = mVU.index ? HostMemoryMap::mVU0recOffset : HostMemoryMap::mVU1recOffset; + mVU.cache_reserve->Assign(GetVmMemory().CodeMemory(), alloc_offset, mVU.cacheSize * _1mb); + mVU.cache = mVU.cache_reserve->GetPtr(); } // Only run this once per VU! ;) void mVUinit(microVU& mVU, uint vuIndex) { - - if (!x86caps.hasStreamingSIMD4Extensions) - mVUthrowHardwareDeficiency("SSE4", vuIndex); - memzero(mVU.prog); mVU.index = vuIndex; @@ -204,7 +191,8 @@ __ri microProgram* mVUcreateProg(microVU& mVU, int startPC) prog->idx = mVU.prog.total++; prog->ranges = new std::deque(); prog->startPC = startPC; - mVUcacheProg(mVU, *prog); // Cache Micro Program + if(doWholeProgCompare) + mVUcacheProg(mVU, *prog); // Cache Micro Program double cacheSize = (double)((uptr)mVU.prog.x86end - (uptr)mVU.prog.x86start); double cacheUsed = ((double)((uptr)mVU.prog.x86ptr - (uptr)mVU.prog.x86start)) / (double)_1mb; double cachePerc = ((double)((uptr)mVU.prog.x86ptr - (uptr)mVU.prog.x86start)) / cacheSize * 100; @@ -217,10 +205,18 @@ __ri microProgram* mVUcreateProg(microVU& mVU, int startPC) // Caches Micro Program __ri void mVUcacheProg(microVU& mVU, microProgram& prog) { - if (!mVU.index) - memcpy(prog.data, mVU.regs().Micro, 0x1000); + if (!doWholeProgCompare) + { + auto cmpOffset = [&](void* x) { return (u8*)x + mVUrange.start; }; + memcpy(cmpOffset(prog.data), cmpOffset(mVU.regs().Micro), (mVUrange.end - mVUrange.start)); + } else - memcpy(prog.data, mVU.regs().Micro, 0x4000); + { + if (!mVU.index) + memcpy(prog.data, mVU.regs().Micro, 0x1000); + else + memcpy(prog.data, mVU.regs().Micro, 0x4000); + } mVUdumpProg(mVU, prog); } @@ -273,9 +269,9 @@ void mVUprintUniqueRatio(microVU& mVU) } // Compare Cached microProgram to mVU.regs().Micro -__fi bool mVUcmpProg(microVU& mVU, microProgram& prog, const bool cmpWholeProg) +__fi bool mVUcmpProg(microVU& mVU, microProgram& prog) { - if (cmpWholeProg) + if (doWholeProgCompare) { if (memcmp((u8*)prog.data, mVU.regs().Micro, mVU.microMemSize)) return false; @@ -284,16 +280,19 @@ __fi bool mVUcmpProg(microVU& mVU, microProgram& prog, const bool cmpWholeProg) { for (const auto& range : *prog.ranges) { - auto cmpOffset = [&](void* x) { return (u8*)x + range.start; }; +#if defined(PCSX2_DEVBUILD) || defined(_DEBUG) if ((range.start < 0) || (range.end < 0)) DevCon.Error("microVU%d: Negative Range![%d][%d]", mVU.index, range.start, range.end); +#endif + auto cmpOffset = [&](void* x) { return (u8*)x + range.start; }; + if (memcmp(cmpOffset(prog.data), cmpOffset(mVU.regs().Micro), (range.end - range.start))) return false; } } mVU.prog.cleared = 0; mVU.prog.cur = &prog; - mVU.prog.isSame = cmpWholeProg ? 1 : -1; + mVU.prog.isSame = doWholeProgCompare ? 1 : -1; return true; } @@ -309,7 +308,7 @@ _mVUt __fi void* mVUsearchProg(u32 startPC, uptr pState) std::deque::iterator it(list->begin()); for (; it != list->end(); ++it) { - bool b = mVUcmpProg(mVU, *it[0], 0); + bool b = mVUcmpProg(mVU, *it[0]); if (b) { @@ -359,47 +358,45 @@ _mVUt __fi void* mVUsearchProg(u32 startPC, uptr pState) //------------------------------------------------------------------ // recMicroVU0 / recMicroVU1 //------------------------------------------------------------------ + +recMicroVU0 CpuMicroVU0; +recMicroVU1 CpuMicroVU1; + recMicroVU0::recMicroVU0() { m_Idx = 0; IsInterpreter = false; } recMicroVU1::recMicroVU1() { m_Idx = 1; IsInterpreter = false; } void recMicroVU0::Reserve() { - if (m_Reserved.exchange(1) == 0) - mVUinit(microVU0, 0); + mVUinit(microVU0, 0); } void recMicroVU1::Reserve() { - if (m_Reserved.exchange(1) == 0) - { - mVUinit(microVU1, 1); - vu1Thread.Open(); - } + mVUinit(microVU1, 1); + vu1Thread.Open(); } -void recMicroVU0::Shutdown() noexcept +void recMicroVU0::Shutdown() { - if (m_Reserved.exchange(0) == 1) - mVUclose(microVU0); + mVUclose(microVU0); } -void recMicroVU1::Shutdown() noexcept +void recMicroVU1::Shutdown() { - if (m_Reserved.exchange(0) == 1) - { + if (vu1Thread.IsOpen()) vu1Thread.WaitVU(); - mVUclose(microVU1); - } + mVUclose(microVU1); } void recMicroVU0::Reset() { - if (!pxAssertDev(m_Reserved, "MicroVU0 CPU Provider has not been reserved prior to reset!")) - return; mVUreset(microVU0, true); } + +void recMicroVU0::Step() +{ +} + void recMicroVU1::Reset() { - if (!pxAssertDev(m_Reserved, "MicroVU1 CPU Provider has not been reserved prior to reset!")) - return; vu1Thread.WaitVU(); vu1Thread.Get_MTVUChanges(); mVUreset(microVU1, true); @@ -412,8 +409,6 @@ void recMicroVU0::SetStartPC(u32 startPC) void recMicroVU0::Execute(u32 cycles) { - pxAssert(m_Reserved); // please allocate me first! :| - VU0.flags &= ~VUFLAG_MFLAGSET; if (!(VU0.VI[REG_VPU_STAT].UL & 1)) @@ -434,10 +429,12 @@ void recMicroVU1::SetStartPC(u32 startPC) VU1.start_pc = startPC; } +void recMicroVU1::Step() +{ +} + void recMicroVU1::Execute(u32 cycles) { - pxAssert(m_Reserved); // please allocate me first! :| - if (!THREAD_VU1) { if (!(VU0.VI[REG_VPU_STAT].UL & 0x100)) @@ -455,43 +452,15 @@ void recMicroVU1::Execute(u32 cycles) void recMicroVU0::Clear(u32 addr, u32 size) { - pxAssert(m_Reserved); // please allocate me first! :| mVUclear(microVU0, addr, size); } void recMicroVU1::Clear(u32 addr, u32 size) { - pxAssert(m_Reserved); // please allocate me first! :| mVUclear(microVU1, addr, size); } -uint recMicroVU0::GetCacheReserve() const -{ - return microVU0.cacheSize; -} -uint recMicroVU1::GetCacheReserve() const -{ - return microVU1.cacheSize; -} - -void recMicroVU0::SetCacheReserve(uint reserveInMegs) const -{ - DevCon.WriteLn("microVU0: Changing cache size [%dmb]", reserveInMegs); - microVU0.cacheSize = std::min(reserveInMegs, mVUcacheReserve); - safe_delete(microVU0.cache_reserve); // I assume this unmaps the memory - mVUreserveCache(microVU0); // Need rec-reset after this -} -void recMicroVU1::SetCacheReserve(uint reserveInMegs) const -{ - DevCon.WriteLn("microVU1: Changing cache size [%dmb]", reserveInMegs); - microVU1.cacheSize = std::min(reserveInMegs, mVUcacheReserve); - safe_delete(microVU1.cache_reserve); // I assume this unmaps the memory - mVUreserveCache(microVU1); // Need rec-reset after this -} - void recMicroVU1::ResumeXGkick() { - pxAssert(m_Reserved); // please allocate me first! :| - if (!(VU0.VI[REG_VPU_STAT].UL & 0x100)) return; ((mVUrecCallXG)microVU1.startFunctXG)(); diff --git a/pcsx2/x86/microVU.h b/pcsx2/x86/microVU.h index 09df4180af..20683c7f4e 100644 --- a/pcsx2/x86/microVU.h +++ b/pcsx2/x86/microVU.h @@ -43,11 +43,18 @@ struct microBlockLink microBlockLink* next; }; +struct microBlockLinkRef +{ + microBlock* pBlock; + u64 quick; +}; + class microBlockManager { private: microBlockLink *qBlockList, *qBlockEnd; // Quick Search microBlockLink *fBlockList, *fBlockEnd; // Full Search + std::vector quickLookup; int qListI, fListI; public: @@ -55,20 +62,20 @@ public: microBlockManager() { qListI = fListI = 0; - qBlockEnd = qBlockList = NULL; - fBlockEnd = fBlockList = NULL; + qBlockEnd = qBlockList = nullptr; + fBlockEnd = fBlockList = nullptr; } ~microBlockManager() { reset(); } void reset() { - for (microBlockLink* linkI = qBlockList; linkI != NULL;) + for (microBlockLink* linkI = qBlockList; linkI != nullptr;) { microBlockLink* freeI = linkI; safe_delete_array(linkI->block.jumpCache); linkI = linkI->next; _aligned_free(freeI); } - for (microBlockLink* linkI = fBlockList; linkI != NULL;) + for (microBlockLink* linkI = fBlockList; linkI != nullptr;) { microBlockLink* freeI = linkI; safe_delete_array(linkI->block.jumpCache); @@ -76,8 +83,9 @@ public: _aligned_free(freeI); } qListI = fListI = 0; - qBlockEnd = qBlockList = NULL; - fBlockEnd = fBlockList = NULL; + qBlockEnd = qBlockList = nullptr; + fBlockEnd = fBlockList = nullptr; + quickLookup.clear(); }; microBlock* add(microBlock* pBlock) { @@ -92,9 +100,9 @@ public: microBlockLink*& blockList = fullCmp ? fBlockList : qBlockList; microBlockLink*& blockEnd = fullCmp ? fBlockEnd : qBlockEnd; - microBlockLink* newBlock = (microBlockLink*)_aligned_malloc(sizeof(microBlockLink), 16); - newBlock->block.jumpCache = NULL; - newBlock->next = NULL; + microBlockLink* newBlock = (microBlockLink*)_aligned_malloc(sizeof(microBlockLink), 32); + newBlock->block.jumpCache = nullptr; + newBlock->next = nullptr; if (blockEnd) { @@ -106,8 +114,10 @@ public: blockEnd = blockList = newBlock; } - memcpy(&newBlock->block, pBlock, sizeof(microBlock)); + std::memcpy(&newBlock->block, pBlock, sizeof(microBlock)); thisBlock = &newBlock->block; + + quickLookup.push_back({&newBlock->block, pBlock->pState.quick64[0]}); } return thisBlock; } @@ -115,24 +125,34 @@ public: { if (pState->needExactMatch) // Needs Detailed Search (Exact Match of Pipeline State) { - for (microBlockLink* linkI = fBlockList; linkI != NULL; linkI = linkI->next) + microBlockLink* prevI = nullptr; + for (microBlockLink* linkI = fBlockList; linkI != nullptr; prevI = linkI, linkI = linkI->next) { - if (mVUquickSearch((void*)pState, (void*)&linkI->block.pState, sizeof(microRegInfo))) + if (mVUquickSearch(pState, &linkI->block.pState, sizeof(microRegInfo))) + { + if (linkI != fBlockList) + { + prevI->next = linkI->next; + linkI->next = fBlockList; + fBlockList = linkI; + } + return &linkI->block; + } } } else // Can do Simple Search (Only Matches the Important Pipeline Stuff) { - for (microBlockLink* linkI = qBlockList; linkI != NULL; linkI = linkI->next) + const u64 quick64 = pState->quick64[0]; + for (const microBlockLinkRef& ref : quickLookup) { - if (linkI->block.pState.quick32[0] != pState->quick32[0]) continue; - if (linkI->block.pState.quick32[1] != pState->quick32[1]) continue; - if (doConstProp && (linkI->block.pState.vi15 != pState->vi15)) continue; - if (doConstProp && (linkI->block.pState.vi15v != pState->vi15v)) continue; - return &linkI->block; + if (ref.quick != quick64) continue; + if (doConstProp && (ref.pBlock->pState.vi15 != pState->vi15)) continue; + if (doConstProp && (ref.pBlock->pState.vi15v != pState->vi15v)) continue; + return ref.pBlock; } } - return NULL; + return nullptr; } void printInfo(int pc, bool printQuick) { diff --git a/pcsx2/x86/microVU_Alloc.inl b/pcsx2/x86/microVU_Alloc.inl index 1d462f9263..606ff1a582 100644 --- a/pcsx2/x86/microVU_Alloc.inl +++ b/pcsx2/x86/microVU_Alloc.inl @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. diff --git a/pcsx2/x86/microVU_Analyze.inl b/pcsx2/x86/microVU_Analyze.inl index de29c74f50..f76068f543 100644 --- a/pcsx2/x86/microVU_Analyze.inl +++ b/pcsx2/x86/microVU_Analyze.inl @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -594,7 +594,7 @@ __ri int mVUbranchCheck(mV) mVUregs.blockType = 2; mVUregs.needExactMatch |= 7; // This might not be necessary, but w/e... mVUregs.flagInfo = 0; - + if (mVUlow.branch == 2 || mVUlow.branch == 10) { Console.Error("microVU%d: %s in branch, branch delay slot requires link [%04x] - If game broken report to PCSX2 Team", mVU.index, diff --git a/pcsx2/x86/microVU_Branch.inl b/pcsx2/x86/microVU_Branch.inl index fc684e64f6..106b8e07dd 100644 --- a/pcsx2/x86/microVU_Branch.inl +++ b/pcsx2/x86/microVU_Branch.inl @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -125,7 +125,8 @@ void mVUDTendProgram(mV, microFlagCycles* mFC, int isEbit) xMOVAPS(ptr128[&mVU.regs().micro_statusflags], xmmT1); } - xMOV(ptr32[&mVU.regs().nextBlockCycles], 0); + if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack) + xMOV(ptr32[&mVU.regs().nextBlockCycles], 0); xMOV(ptr32[&mVU.regs().VI[REG_TPC].UL], xPC); @@ -251,7 +252,8 @@ void mVUendProgram(mV, microFlagCycles* mFC, int isEbit) if ((isEbit && isEbit != 3)) // Clear 'is busy' Flags { - xMOV(ptr32[&mVU.regs().nextBlockCycles], 0); + if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack) + xMOV(ptr32[&mVU.regs().nextBlockCycles], 0); if (!mVU.index || !THREAD_VU1) { xAND(ptr32[&VU0.VI[REG_VPU_STAT].UL], (isVU1 ? ~0x100 : ~0x001)); // VBS0/VBS1 flag @@ -259,7 +261,8 @@ void mVUendProgram(mV, microFlagCycles* mFC, int isEbit) } else if(isEbit) { - xMOV(ptr32[&mVU.regs().nextBlockCycles], 0); + if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack) + xMOV(ptr32[&mVU.regs().nextBlockCycles], 0); } if (isEbit != 2 && isEbit != 3) // Save PC, and Jump to Exit Point diff --git a/pcsx2/x86/microVU_Clamp.inl b/pcsx2/x86/microVU_Clamp.inl index d01929a93d..9f85b5f120 100644 --- a/pcsx2/x86/microVU_Clamp.inl +++ b/pcsx2/x86/microVU_Clamp.inl @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. diff --git a/pcsx2/x86/microVU_Compile.inl b/pcsx2/x86/microVU_Compile.inl index 57c2c0065b..d9544fcb1a 100644 --- a/pcsx2/x86/microVU_Compile.inl +++ b/pcsx2/x86/microVU_Compile.inl @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -54,12 +54,15 @@ void mVUsetupRange(microVU& mVU, s32 pc, bool isStartPC) pxFailDev("microVU: PC out of VU memory"); } + // The PC handling will prewrap the PC so we need to set the end PC to the end of the micro memory, but only if it wraps, no more. + const s32 cur_pc = (!isStartPC && mVUrange.start > pc && pc == 0) ? mVU.microMemSize : pc; + if (isStartPC) // Check if startPC is already within a block we've recompiled { std::deque::const_iterator it(ranges->begin()); for (; it != ranges->end(); ++it) { - if ((pc >= it[0].start) && (pc <= it[0].end)) + if ((cur_pc >= it[0].start) && (cur_pc <= it[0].end)) { if (it[0].start != it[0].end) { @@ -71,53 +74,51 @@ void mVUsetupRange(microVU& mVU, s32 pc, bool isStartPC) } } } - else if (mVUrange.end >= pc) + else if (mVUrange.end >= cur_pc) { // existing range covers more area than current PC so no need to process it return; } - - mVUcheckIsSame(mVU); + + if (doWholeProgCompare) + mVUcheckIsSame(mVU); if (isStartPC) { - microRange mRange = {pc, -1}; + microRange mRange = {cur_pc, -1}; ranges->push_front(mRange); return; } - if (mVUrange.start <= pc) + + if (mVUrange.start <= cur_pc) { - mVUrange.end = pc; - bool mergedRange = false; - s32 rStart = mVUrange.start; - s32 rEnd = mVUrange.end; + mVUrange.end = cur_pc; + s32& rStart = mVUrange.start; + s32& rEnd = mVUrange.end; std::deque::iterator it(ranges->begin()); - for (++it; it != ranges->end(); ++it) + it++; + for (;it != ranges->end();) { - if ((it[0].start >= rStart) && (it[0].start <= rEnd)) // Starts after this prog but starts before the end of current prog + if (((it->start >= rStart) && (it->start <= rEnd)) || ((it->end >= rStart) && (it->end <= rEnd))) // Starts after this prog but starts before the end of current prog { - it[0].start = std::min(it[0].start, rStart); // Choose the earlier start - mergedRange = true; + rStart = std::min(it->start, rStart); // Choose the earlier start + rEnd = std::max(it->end, rEnd); + it = ranges->erase(it); } - // Make sure we check both as the start on the other one may be later, we don't want to delete that - if ((it[0].end >= rStart) && (it[0].end <= rEnd)) // Ends after this prog starts but ends before this one ends - { - it[0].end = std::max(it[0].end, rEnd); // Extend the end of this prog to match this program - mergedRange = true; - } - } - if (mergedRange) - { - ranges->erase(ranges->begin()); + else + it++; } } else { mVUrange.end = mVU.microMemSize; - DevCon.WriteLn(Color_Green, "microVU%d: Prog Range Wrap [%04x] [%d]", mVU.index, mVUrange.start, mVUrange.end); - microRange mRange = {0, pc}; + DevCon.WriteLn(Color_Green, "microVU%d: Prog Range Wrap [%04x] [%04x] PC %x", mVU.index, mVUrange.start, mVUrange.end, cur_pc); + microRange mRange = {0, cur_pc }; ranges->push_front(mRange); } + + if(!doWholeProgCompare) + mVUcacheProg(mVU, *mVU.prog.cur); } //------------------------------------------------------------------ @@ -483,7 +484,9 @@ void mVUtestCycles(microVU& mVU, microFlagCycles& mFC) xForwardJGE32 skip; mVUsavePipelineState(mVU); - xMOV(ptr32[&mVU.regs().nextBlockCycles], mVUcycles); + if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack) + xMOV(ptr32[&mVU.regs().nextBlockCycles], mVUcycles); + mVUendProgram(mVU, &mFC, 0); skip.SetTarget(); @@ -678,7 +681,9 @@ void* mVUcompile(microVU& mVU, u32 startPC, uptr pState) } else { - mVUregs.xgkickcycles = 0; + // XGKick command counts as one cycle for the transfer. + // Can be tested with Resident Evil: Outbreak, Kingdom Hearts, CART Fury. + mVUregs.xgkickcycles = 1; mVUlow.kickcycles = 0; } @@ -800,7 +805,8 @@ void* mVUcompile(microVU& mVU, u32 startPC, uptr pState) } incPC(2); mVUsetupRange(mVU, xPC, false); - xMOV(ptr32[&mVU.regs().nextBlockCycles], 0); + if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack) + xMOV(ptr32[&mVU.regs().nextBlockCycles], 0); mVUendProgram(mVU, &mFC, 0); normBranchCompile(mVU, xPC); incPC(-2); diff --git a/pcsx2/x86/microVU_IR.h b/pcsx2/x86/microVU_IR.h index a29db8f966..77f07c049a 100644 --- a/pcsx2/x86/microVU_IR.h +++ b/pcsx2/x86/microVU_IR.h @@ -51,7 +51,8 @@ union alignas(16) microRegInfo u8 blockType; // 0 = Normal; 1,2 = Compile one instruction (E-bit/Branch Ending) u8 r; }; - u32 quick32[4]; + u64 quick64[1]; + u32 quick32[2]; }; u32 xgkickcycles; @@ -66,12 +67,13 @@ union alignas(16) microRegInfo }; }; - u128 full128[176 / sizeof(u128)]; - u64 full64[176 / sizeof(u64)]; - u32 full32[176 / sizeof(u32)]; + u128 full128[160 / sizeof(u128)]; + u64 full64[160 / sizeof(u64)]; + u32 full32[160 / sizeof(u32)]; }; -static_assert(sizeof(microRegInfo) == 176, "microRegInfo was not 176 bytes"); +// Note: mVUcustomSearch needs to be updated if this is changed +static_assert(sizeof(microRegInfo) == 160, "microRegInfo was not 160 bytes"); struct microProgram; struct microJumpCache @@ -214,6 +216,9 @@ struct microIR // Reg Alloc //------------------------------------------------------------------ +//#define MVURALOG(...) fprintf(stderr, __VA_ARGS__) +#define MVURALOG(...) + struct microMapXMM { int VFreg; // VF Reg Number Stored (-1 = Temp; 0 = vf0 and will not be written back; 32 = ACC; 33 = I reg) @@ -230,6 +235,13 @@ protected: microMapXMM xmmMap[xmmTotal]; int counter; // Current allocation count int index; // VU0 or VU1 + + // DO NOT REMOVE THIS. + // This is here for a reason. MSVC likes to turn global writes into a load+conditional move+store. + // That creates a race with the EE thread when we're compiling on the VU thread, even though + // regAllocCOP2 is false. By adding another level of indirection, it emits a branch instead. + _xmmregs* pxmmregs; + bool regAllocCOP2; // Local COP2 check // Helper functions to get VU regs @@ -259,11 +271,11 @@ protected: return -1; } - int findFreeReg() + int findFreeReg(int vfreg) { if (regAllocCOP2) { - return _freeXMMregsCOP2(); + return _allocVFtoXMMreg(vfreg, 0); } for (int i = 0; i < xmmTotal; i++) @@ -288,12 +300,38 @@ public: // Fully resets the regalloc by clearing all cached data void reset(bool cop2mode) { + // we run this at the of cop2, so don't free fprs + regAllocCOP2 = false; + for (int i = 0; i < xmmTotal; i++) { clearReg(i); } counter = 0; regAllocCOP2 = cop2mode; + pxmmregs = cop2mode ? xmmregs : nullptr; + + if (cop2mode) + { + for (int i = 0; i < xmmTotal; i++) + { + if (!pxmmregs[i].inuse || pxmmregs[i].type != XMMTYPE_VFREG) + continue; + + // we shouldn't have any temp registers in here.. except for PQ, which + // isn't allocated here yet. + // pxAssertRel(fprregs[i].reg >= 0, "Valid full register preserved"); + if (pxmmregs[i].reg >= 0) + { + MVURALOG("Preserving VF reg %d in host reg %d across instruction\n", pxmmregs[i].reg, i); + pxAssert(pxmmregs[i].reg != 255); + pxmmregs[i].needed = false; + xmmMap[i].isNeeded = false; + xmmMap[i].VFreg = pxmmregs[i].reg; + xmmMap[i].xyzw = ((pxmmregs[i].mode & MODE_WRITE) != 0) ? 0xf : 0x0; + } + } + } } int getXmmCount() @@ -313,6 +351,35 @@ public: } } + void flushPartialForCOP2() + { + for (int i = 0; i < xmmTotal; i++) + { + microMapXMM& clear = xmmMap[i]; + + // toss away anything which is not a full cached register + if (pxmmregs[i].inuse && pxmmregs[i].type == XMMTYPE_VFREG) + { + // Should've been done in clearNeeded() + if (clear.xyzw != 0 && clear.xyzw != 0xf) + writeBackReg(xRegisterSSE::GetInstance(i), false); + + if (clear.VFreg <= 0) + { + // temps really shouldn't be here.. + _freeXMMreg(i); + } + } + + // needed gets cleared in iCore. + clear.VFreg = -1; + clear.count = 0; + clear.xyzw = 0; + clear.isNeeded = 0; + clear.isZero = 0; + } + } + void TDwritebackAll(bool clearState = false) { for (int i = 0; i < xmmTotal; i++) @@ -351,6 +418,12 @@ public: void clearReg(int regId) { microMapXMM& clear = xmmMap[regId]; + if (regAllocCOP2) + { + pxAssert(pxmmregs[regId].type == XMMTYPE_VFREG); + pxmmregs[regId].inuse = false; + } + clear.VFreg = -1; clear.count = 0; clear.xyzw = 0; @@ -367,6 +440,24 @@ public: } } + void clearRegCOP2(int xmmReg) + { + if (regAllocCOP2) + clearReg(xmmReg); + } + + void updateCOP2AllocState(int rn) + { + if (!regAllocCOP2) + return; + + const bool dirty = (xmmMap[rn].VFreg > 0 && xmmMap[rn].xyzw != 0); + pxAssert(pxmmregs[rn].type == XMMTYPE_VFREG); + pxmmregs[rn].reg = xmmMap[rn].VFreg; + pxmmregs[rn].mode = dirty ? (MODE_READ | MODE_WRITE) : MODE_READ; + pxmmregs[rn].needed = xmmMap[rn].isNeeded; + } + // Writes back modified reg to memory. // If all vectors modified, then keeps the VF reg cached in the xmm register. // If reg was not modified, then keeps the VF reg cached in the xmm register. @@ -405,6 +496,7 @@ public: mapX.count = counter; mapX.xyzw = 0; mapX.isNeeded = false; + updateCOP2AllocState(reg.Id); return; } clearReg(reg); @@ -452,6 +544,7 @@ public: mapI.xyzw = 0xf; mapI.count = counter; mergeRegs = 2; + updateCOP2AllocState(i); } else clearReg(i); // Clears when mergeRegs is 0 or 2 @@ -465,6 +558,12 @@ public: else clearReg(reg); // If Reg was temp or vf0, then invalidate itself } + else if (regAllocCOP2 && clear.VFreg < 0) + { + // free on the EE side + pxAssert(pxmmregs[reg.Id].type == XMMTYPE_VFREG); + pxmmregs[reg.Id].inuse = false; + } } // vfLoadReg = VF reg to be loaded to the xmm register @@ -494,7 +593,7 @@ public: { if (cloneWrite) // Clone Reg so as not to use the same Cached Reg { - z = findFreeReg(); + z = findFreeReg(vfWriteReg); const xmm& xmmZ = xmm::GetInstance(z); writeBackReg(xmmZ); @@ -527,11 +626,13 @@ public: } xmmMap[z].count = counter; xmmMap[z].isNeeded = true; + updateCOP2AllocState(z); + return xmm::GetInstance(z); } } } - int x = findFreeReg(); + int x = findFreeReg((vfWriteReg >= 0) ? vfWriteReg : vfLoadReg); const xmm& xmmX = xmm::GetInstance(x); writeBackReg(xmmX); @@ -564,6 +665,7 @@ public: xmmMap[x].isZero = (vfLoadReg == 0); xmmMap[x].count = counter; xmmMap[x].isNeeded = true; + updateCOP2AllocState(x); return xmmX; } }; diff --git a/pcsx2/x86/microVU_Log.inl b/pcsx2/x86/microVU_Log.inl index 718849f649..a47ffa50ed 100644 --- a/pcsx2/x86/microVU_Log.inl +++ b/pcsx2/x86/microVU_Log.inl @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -55,7 +55,7 @@ void __mVUdumpProgram(microVU& mVU, microProgram& prog) int bPC = iPC; mVUbranch = 0; - const std::string logname(fmt::format("microVU{} prog - {:02d}.html"), mVU.index, prog.idx); + const std::string logname(fmt::format("microVU{} prog - {:02d}.html", mVU.index, prog.idx)); mVU.logFile = FileSystem::OpenCFile(Path::Combine(EmuFolders::Logs, logname).c_str(), "w"); if (!mVU.logFile) return; diff --git a/pcsx2/x86/microVU_Lower.inl b/pcsx2/x86/microVU_Lower.inl index 3da2fe2f59..3e0ca1fa1b 100644 --- a/pcsx2/x86/microVU_Lower.inl +++ b/pcsx2/x86/microVU_Lower.inl @@ -1686,7 +1686,7 @@ mVUop(mVU_XGKICK) mVU_XGKICK_DELAY(mVU); mVUinfo.doXGKICK = false; } - + if (!CHECK_XGKICKHACK) { mVUallocVIa(mVU, gprT1, _Is_); diff --git a/pcsx2/x86/microVU_Macro.inl b/pcsx2/x86/microVU_Macro.inl index 1ab12ddc19..a10ef6c848 100644 --- a/pcsx2/x86/microVU_Macro.inl +++ b/pcsx2/x86/microVU_Macro.inl @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. @@ -28,6 +28,10 @@ using namespace R5900::Dynarec; #define printCOP2(...) (void)0 //#define printCOP2 DevCon.Status +// For now, we need to free all XMMs. Because we're not saving the nonvolatile registers when +// we enter micro mode, they will get overriden otherwise... +#define FLUSH_FOR_POSSIBLE_MICRO_EXEC (FLUSH_FREE_XMM | FLUSH_FREE_VU0) + void setupMacroOp(int mode, const char* opName) { // Set up reg allocation @@ -49,7 +53,7 @@ void setupMacroOp(int mode, const char* opName) microVU0.prog.IRinfo.curPC = 0; microVU0.code = cpuRegs.code; memset(µVU0.prog.IRinfo.info[0], 0, sizeof(microVU0.prog.IRinfo.info[0])); - + if (mode & 0x01) // Q-Reg will be Read { xMOVSSZX(xmmPQ, ptr32[&vu0Regs.VI[REG_Q].UL]); @@ -71,7 +75,7 @@ void setupMacroOp(int mode, const char* opName) microVU0.prog.IRinfo.info[0].mFlag.doFlag = true; microVU0.prog.IRinfo.info[0].mFlag.write = 0xff; } - if (mode & 0x10) + if (mode & 0x10 && (!CHECK_VU_FLAGHACK || g_pCurInstInfo->info & (EEINST_COP2_STATUS_FLAG | EEINST_COP2_DENORMALIZE_STATUS_FLAG))) { _freeX86reg(gprF0); @@ -96,8 +100,7 @@ void endMacroOp(int mode) xMOVSS(ptr32[&vu0Regs.VI[REG_Q].UL], xmmPQ); } - microVU0.regAlloc->flushAll(); - _clearNeededCOP2Regs(); + microVU0.regAlloc->flushPartialForCOP2(); if (mode & 0x10) { @@ -107,7 +110,7 @@ void endMacroOp(int mode) mVUallocSFLAGc(eax, gprF0, 0); xMOV(ptr32[&vu0Regs.VI[REG_STATUS_FLAG].UL], eax); } - else + else if (g_pCurInstInfo->info & (EEINST_COP2_STATUS_FLAG | EEINST_COP2_DENORMALIZE_STATUS_FLAG)) { // backup denormalized flags for the next instruction // this is fine, because we'll normalize them again before this reg is accessed @@ -119,6 +122,11 @@ void endMacroOp(int mode) microVU0.regAlloc->reset(false); } +void mVUFreeCOP2XMMreg(int hostreg) +{ + microVU0.regAlloc->clearRegCOP2(hostreg); +} + #define REC_COP2_mVU0(f, opName, mode) \ void recV##f() \ { \ @@ -142,13 +150,9 @@ void endMacroOp(int mode) #define INTERPRETATE_COP2_FUNC(f) \ void recV##f() \ { \ - _freeX86reg(eax); \ - xMOV(eax, ptr32[&cpuRegs.cycle]); \ - xADD(eax, scaleblockcycles_clear()); \ - xMOV(ptr32[&cpuRegs.cycle], eax); \ - _cop2BackupRegs(); \ + iFlushCall(FLUSH_FOR_POSSIBLE_MICRO_EXEC); \ + xADD(ptr32[&cpuRegs.cycle], scaleblockcycles_clear()); \ recCall(V##f); \ - _cop2RestoreRegs(); \ } //------------------------------------------------------------------ @@ -303,13 +307,15 @@ INTERPRETATE_COP2_FUNC(CALLMSR); // Macro VU - Branches //------------------------------------------------------------------ -void _setupBranchTest(u32*(jmpType)(u32), bool isLikely) +static void _setupBranchTest(u32*(jmpType)(u32), bool isLikely) { printCOP2("COP2 Branch"); - _eeFlushAllUnused(); + const u32 branchTo = ((s32)_Imm_ * 4) + pc; + const bool swap = isLikely ? false : TrySwapDelaySlot(0, 0, 0, false); + _eeFlushAllDirty(); //xTEST(ptr32[&vif1Regs.stat._u32], 0x4); xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x100); - recDoBranchImm(jmpType(0), isLikely); + recDoBranchImm(branchTo, jmpType(0), isLikely, swap); } void recBC2F() { _setupBranchTest(JNZ32, false); } @@ -321,7 +327,7 @@ void recBC2TL() { _setupBranchTest(JZ32, true); } // Macro VU - COP2 Transfer Instructions //------------------------------------------------------------------ -void COP2_Interlock(bool mBitSync) +static void COP2_Interlock(bool mBitSync) { if (cpuRegs.code & 1) { @@ -329,8 +335,9 @@ void COP2_Interlock(bool mBitSync) // We can safely skip the _vu0FinishMicro() call, when there's nothing // that can trigger a VU0 program between CFC2/CTC2/COP2 instructions. - if ((g_pCurInstInfo->info & EEINST_COP2_FINISH_VU0_MICRO) || mBitSync) + if (g_pCurInstInfo->info & EEINST_COP2_SYNC_VU0) { + iFlushCall(FLUSH_FOR_POSSIBLE_MICRO_EXEC); _freeX86reg(eax); xMOV(eax, ptr32[&cpuRegs.cycle]); xADD(eax, scaleblockcycles_clear()); @@ -338,11 +345,15 @@ void COP2_Interlock(bool mBitSync) xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); xForwardJZ32 skipvuidle; - _cop2BackupRegs(); if (mBitSync) { xSUB(eax, ptr32[&VU0.cycle]); - xSUB(eax, ptr32[&VU0.nextBlockCycles]); + + // Why do we check this here? Ratchet games, maybe others end up with flickering polygons + // when we use lazy COP2 sync, otherwise. The micro resumption getting deferred an extra + // EE block is apparently enough to cause issues. + if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack) + xSUB(eax, ptr32[&VU0.nextBlockCycles]); xCMP(eax, 4); xForwardJL32 skip; xLoadFarAddr(arg1reg, CpuVU0); @@ -354,18 +365,47 @@ void COP2_Interlock(bool mBitSync) } else xFastCall((void*)_vu0FinishMicro); - _cop2RestoreRegs(); skipvuidle.SetTarget(); } } } -void TEST_FBRST_RESET(FnType_Void* resetFunct, int vuIndex) +static void mVUSyncVU0() { - xTEST(eax, (vuIndex) ? 0x200 : 0x002); + iFlushCall(FLUSH_FOR_POSSIBLE_MICRO_EXEC); + _freeX86reg(eax); + xMOV(eax, ptr32[&cpuRegs.cycle]); + xADD(eax, scaleblockcycles_clear()); + xMOV(ptr32[&cpuRegs.cycle], eax); // update cycles + + xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); + xForwardJZ32 skipvuidle; + xSUB(eax, ptr32[&VU0.cycle]); + if (EmuConfig.Gamefixes.VUSyncHack || EmuConfig.Gamefixes.FullVU0SyncHack) + xSUB(eax, ptr32[&VU0.nextBlockCycles]); + xCMP(eax, 4); + xForwardJL32 skip; + xLoadFarAddr(arg1reg, CpuVU0); + xMOV(arg2reg, s_nBlockInterlocked); + xFastCall((void*)BaseVUmicroCPU::ExecuteBlockJIT, arg1reg, arg2reg); + skip.SetTarget(); + skipvuidle.SetTarget(); +} + +static void mVUFinishVU0() +{ + iFlushCall(FLUSH_FOR_POSSIBLE_MICRO_EXEC); + xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); + xForwardJZ32 skipvuidle; + xFastCall((void*)_vu0FinishMicro); + skipvuidle.SetTarget(); +} + +static void TEST_FBRST_RESET(int flagreg, FnType_Void* resetFunct, int vuIndex) +{ + xTEST(xRegister32(flagreg), (vuIndex) ? 0x200 : 0x002); xForwardJZ8 skip; xFastCall((void*)resetFunct); - xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); skip.SetTarget(); } @@ -380,43 +420,20 @@ static void recCFC2() if (!(cpuRegs.code & 1)) { - _freeX86reg(eax); - xMOV(eax, ptr32[&cpuRegs.cycle]); - xADD(eax, scaleblockcycles_clear()); - xMOV(ptr32[&cpuRegs.cycle], eax); // update cycles - - xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); - xForwardJZ32 skipvuidle; - xSUB(eax, ptr32[&VU0.cycle]); - xSUB(eax, ptr32[&VU0.nextBlockCycles]); - xCMP(eax, 4); - xForwardJL32 skip; - _cop2BackupRegs(); - xLoadFarAddr(arg1reg, CpuVU0); - xMOV(arg2reg, s_nBlockInterlocked); - xFastCall((void*)BaseVUmicroCPU::ExecuteBlockJIT, arg1reg, arg2reg); - _cop2RestoreRegs(); - skip.SetTarget(); - skipvuidle.SetTarget(); + if (g_pCurInstInfo->info & EEINST_COP2_SYNC_VU0) + mVUSyncVU0(); + else if (g_pCurInstInfo->info & EEINST_COP2_FINISH_VU0) + mVUFinishVU0(); } - _flushEEreg(_Rt_, true); - - if (_Rd_ == REG_STATUS_FLAG) // Normalize Status Flag - xMOV(eax, ptr32[&vu0Regs.VI[REG_STATUS_FLAG].UL]); - else - xMOV(eax, ptr32[&vu0Regs.VI[_Rd_].UL]); + const int regt = _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); + pxAssert(!GPR_IS_CONST1(_Rt_)); // FixMe: Should R-Reg have upper 9 bits 0? - if (_Rd_ >= 16) - xCDQE(); // Sign Extend - - xMOV(ptr64[&cpuRegs.GPR.r[_Rt_].UD[0]], rax); - - // FixMe: I think this is needed, but not sure how it works - // Update Refraction 20/09/2021: This is needed because Const Prop is broken - // the Flushed flag isn't being cleared when it's not flushed. TODO I guess - _eeOnWriteReg(_Rt_, 0); + if (_Rd_ >= REG_STATUS_FLAG) + xMOVSX(xRegister64(regt), ptr32[&vu0Regs.VI[_Rd_].UL]); + else + xMOV(xRegister64(regt), ptr32[&vu0Regs.VI[_Rd_].UL]); } static void recCTC2() @@ -430,28 +447,12 @@ static void recCTC2() if (!(cpuRegs.code & 1)) { - _freeX86reg(eax); - xMOV(eax, ptr32[&cpuRegs.cycle]); - xADD(eax, scaleblockcycles_clear()); - xMOV(ptr32[&cpuRegs.cycle], eax); // update cycles - - xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); - xForwardJZ32 skipvuidle; - xSUB(eax, ptr32[&VU0.cycle]); - xSUB(eax, ptr32[&VU0.nextBlockCycles]); - xCMP(eax, 4); - xForwardJL32 skip; - _cop2BackupRegs(); - xLoadFarAddr(arg1reg, CpuVU0); - xMOV(arg2reg, s_nBlockInterlocked); - xFastCall((void*)BaseVUmicroCPU::ExecuteBlockJIT, arg1reg, arg2reg); - _cop2RestoreRegs(); - skip.SetTarget(); - skipvuidle.SetTarget(); + if (g_pCurInstInfo->info & EEINST_COP2_SYNC_VU0) + mVUSyncVU0(); + else if (g_pCurInstInfo->info & EEINST_COP2_FINISH_VU0) + mVUFinishVU0(); } - _flushEEreg(_Rt_); - switch (_Rd_) { case REG_MAC_FLAG: @@ -459,7 +460,7 @@ static void recCTC2() case REG_VPU_STAT: break; // Read Only Regs case REG_R: - xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); + _eeMoveGPRtoR(eax, _Rt_); xAND(eax, 0x7FFFFF); xOR(eax, 0x3f800000); xMOV(ptr32[&vu0Regs.VI[REG_R].UL], eax); @@ -468,7 +469,7 @@ static void recCTC2() { if (_Rt_) { - xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); + _eeMoveGPRtoR(eax, _Rt_); xAND(eax, 0xFC0); xAND(ptr32[&vu0Regs.VI[REG_STATUS_FLAG].UL], 0x3F); xOR(ptr32[&vu0Regs.VI[REG_STATUS_FLAG].UL], eax); @@ -476,48 +477,69 @@ static void recCTC2() else xAND(ptr32[&vu0Regs.VI[REG_STATUS_FLAG].UL], 0x3F); - _freeXMMreg(xmmT1.Id); + const int xmmtemp = _allocTempXMMreg(XMMT_INT); + //Need to update the sticky flags for microVU mVUallocSFLAGd(&vu0Regs.VI[REG_STATUS_FLAG].UL); - xMOVDZX(xmmT1, eax); - xSHUF.PS(xmmT1, xmmT1, 0); + xMOVDZX(xRegisterSSE(xmmtemp), eax); // TODO(Stenzek): This can be a broadcast. + xSHUF.PS(xRegisterSSE(xmmtemp), xRegisterSSE(xmmtemp), 0); // Make sure the values are everywhere the need to be - xMOVAPS(ptr128[&vu0Regs.micro_statusflags], xmmT1); + xMOVAPS(ptr128[&vu0Regs.micro_statusflags], xRegisterSSE(xmmtemp)); + _freeXMMreg(xmmtemp); break; } case REG_CMSAR1: // Execute VU1 Micro SubRoutine - _cop2BackupRegs(); - xMOV(ecx, 1); - xFastCall((void*)vu1Finish, ecx); - if (_Rt_) - { - xMOV(ecx, ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); - } - else - xXOR(ecx, ecx); - xFastCall((void*)vu1ExecMicro, ecx); - _cop2RestoreRegs(); + iFlushCall(FLUSH_NONE); + xMOV(arg1regd, 1); + xFastCall((void*)vu1Finish); + _eeMoveGPRtoR(arg1regd, _Rt_); + iFlushCall(FLUSH_NONE); + xFastCall((void*)vu1ExecMicro); break; case REG_FBRST: - if (!_Rt_) { - xMOV(ptr32[&vu0Regs.VI[REG_FBRST].UL], 0); - return; + if (!_Rt_) + { + xMOV(ptr32[&vu0Regs.VI[REG_FBRST].UL], 0); + return; + } + + const int flagreg = _allocX86reg(X86TYPE_TEMP, 0, MODE_CALLEESAVED); + _eeMoveGPRtoR(xRegister32(flagreg), _Rt_); + + iFlushCall(FLUSH_FREE_VU0); + TEST_FBRST_RESET(flagreg, vu0ResetRegs, 0); + TEST_FBRST_RESET(flagreg, vu1ResetRegs, 1); + + xAND(xRegister32(flagreg), 0x0C0C); + xMOV(ptr32[&vu0Regs.VI[REG_FBRST].UL], xRegister32(flagreg)); + _freeX86reg(flagreg); } - else - xMOV(eax, ptr32[&cpuRegs.GPR.r[_Rt_].UL[0]]); - _cop2BackupRegs(); - TEST_FBRST_RESET(vu0ResetRegs, 0); - TEST_FBRST_RESET(vu1ResetRegs, 1); - _cop2RestoreRegs(); - xAND(eax, 0x0C0C); - xMOV(ptr32[&vu0Regs.VI[REG_FBRST].UL], eax); + break; + case 0: + // Ignore writes to vi00. break; default: // Executing vu0 block here fixes the intro of Ratchet and Clank // sVU's COP2 has a comment that "Donald Duck" needs this too... - if (_Rd_) + if (_Rd_ < REG_STATUS_FLAG) + { + // I isn't invalidated correctly yet, ideally we would move this to the XMM directly. + if (_Rd_ == REG_I) + { + const int xmmreg = _checkXMMreg(XMMTYPE_VFREG, 33, 0); + if (xmmreg >= 0) + _freeXMMregWithoutWriteback(xmmreg); + } + + // Need to expand this out, because we want to write as 16 bits. + _eeMoveGPRtoR(eax, _Rt_); + xMOV(ptr16[&vu0Regs.VI[_Rd_].US[0]], ax); + } + else + { _eeMoveGPRtoM((uptr)&vu0Regs.VI[_Rd_].UL, _Rt_); + } break; } } @@ -534,35 +556,36 @@ static void recQMFC2() if (!(cpuRegs.code & 1)) { - _freeX86reg(eax); - xMOV(eax, ptr32[&cpuRegs.cycle]); - xADD(eax, scaleblockcycles_clear()); - xMOV(ptr32[&cpuRegs.cycle], eax); // update cycles - - xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); - xForwardJZ32 skipvuidle; - xSUB(eax, ptr32[&VU0.cycle]); - xSUB(eax, ptr32[&VU0.nextBlockCycles]); - xCMP(eax, 4); - xForwardJL32 skip; - _cop2BackupRegs(); - xLoadFarAddr(arg1reg, CpuVU0); - xMOV(arg2reg, s_nBlockInterlocked); - xFastCall((void*)BaseVUmicroCPU::ExecuteBlockJIT, arg1reg, arg2reg); - _cop2RestoreRegs(); - skip.SetTarget(); - skipvuidle.SetTarget(); + if (g_pCurInstInfo->info & EEINST_COP2_SYNC_VU0) + mVUSyncVU0(); + else if (g_pCurInstInfo->info & EEINST_COP2_FINISH_VU0) + mVUFinishVU0(); } - int rtreg = _allocGPRtoXMMreg(-1, _Rt_, MODE_WRITE); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - // Update Refraction 20/09/2021: This is needed because Const Prop is broken - // the Flushed flag isn't being cleared when it's not flushed. TODO I guess - _eeOnWriteReg(_Rt_, 0); // This is needed because Const Prop is broken + const bool vf_used = COP2INST_USEDTEST(_Rd_); + const int ftreg = _allocVFtoXMMreg(_Rd_, MODE_READ); + _deleteEEreg128(_Rt_); - xMOVAPS(xRegisterSSE(t0reg), ptr128[&vu0Regs.VF[_Rd_]]); - xMOVAPS(xRegisterSSE(rtreg), xRegisterSSE(t0reg)); - _freeXMMreg(t0reg); + // const flag should've been cleared, but sanity check.. + pxAssert(!GPR_IS_CONST1(_Rt_)); + + if (vf_used) + { + // store direct to state if rt is not used + const int rtreg = _allocIfUsedGPRtoXMM(_Rt_, MODE_WRITE); + if (rtreg >= 0) + xMOVAPS(xRegisterSSE(rtreg), xRegisterSSE(ftreg)); + else + xMOVAPS(ptr128[&cpuRegs.GPR.r[_Rt_].UQ], xRegisterSSE(ftreg)); + + // don't cache vf00, microvu doesn't like it + if (_Rd_ == 0) + _freeXMMreg(ftreg); + } + else + { + _reallocateXMMreg(ftreg, XMMTYPE_GPRREG, _Rt_, MODE_WRITE, true); + } } static void recQMTC2() @@ -575,32 +598,46 @@ static void recQMTC2() if (!(cpuRegs.code & 1)) { - _freeX86reg(eax); - xMOV(eax, ptr32[&cpuRegs.cycle]); - xADD(eax, scaleblockcycles_clear()); - xMOV(ptr32[&cpuRegs.cycle], eax); // update cycles - - xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); - xForwardJZ32 skipvuidle; - xSUB(eax, ptr32[&VU0.cycle]); - xSUB(eax, ptr32[&VU0.nextBlockCycles]); - xCMP(eax, 4); - xForwardJL32 skip; - _cop2BackupRegs(); - xLoadFarAddr(arg1reg, CpuVU0); - xMOV(arg2reg, s_nBlockInterlocked); - xFastCall((void*)BaseVUmicroCPU::ExecuteBlockJIT, arg1reg, arg2reg); - _cop2RestoreRegs(); - skip.SetTarget(); - skipvuidle.SetTarget(); + if (g_pCurInstInfo->info & EEINST_COP2_SYNC_VU0) + mVUSyncVU0(); + else if (g_pCurInstInfo->info & EEINST_COP2_FINISH_VU0) + mVUFinishVU0(); } - int rtreg = _allocGPRtoXMMreg(-1, _Rt_, MODE_READ); - int t0reg = _allocTempXMMreg(XMMT_INT, -1); - - xMOVAPS(xRegisterSSE(t0reg), xRegisterSSE(rtreg)); - xMOVAPS(ptr128[&vu0Regs.VF[_Rd_]], xRegisterSSE(t0reg)); - _freeXMMreg(t0reg); + if (_Rt_) + { + // if we have to flush to memory anyway (has a constant or is x86), force load. + [[maybe_unused]] const bool vf_used = COP2INST_USEDTEST(_Rd_); + const bool can_rename = EEINST_RENAMETEST(_Rt_); + const int rtreg = (GPR_IS_DIRTY_CONST(_Rt_) || _hasX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE)) ? + _allocGPRtoXMMreg(_Rt_, MODE_READ) : + _checkXMMreg(XMMTYPE_GPRREG, _Rt_, MODE_READ); + + // NOTE: can't transfer xmm15 to VF, it's reserved for PQ. + int vfreg = _checkXMMreg(XMMTYPE_VFREG, _Rd_, MODE_WRITE); + if (can_rename && rtreg >= 0 && rtreg != xmmPQ.GetId()) + { + // rt is no longer needed, so transfer to VF. + if (vfreg >= 0) + _freeXMMregWithoutWriteback(vfreg); + _reallocateXMMreg(rtreg, XMMTYPE_VFREG, _Rd_, MODE_WRITE, true); + } + else + { + // copy to VF. + if (vfreg < 0) + vfreg = _allocVFtoXMMreg(_Rd_, MODE_WRITE); + if (rtreg >= 0) + xMOVAPS(xRegisterSSE(vfreg), xRegisterSSE(rtreg)); + else + xMOVAPS(xRegisterSSE(vfreg), ptr128[&cpuRegs.GPR.r[_Rt_].UQ]); + } + } + else + { + const int vfreg = _allocVFtoXMMreg(_Rd_, MODE_WRITE); + xPXOR(xRegisterSSE(vfreg), xRegisterSSE(vfreg)); + } } //------------------------------------------------------------------ @@ -664,22 +701,102 @@ void (*recCOP2SPECIAL2t[128])() = { namespace R5900 { namespace Dynarec { namespace OpcodeImpl { - void recCOP2() { recCOP2t[_Rs_](); } +void recCOP2() { recCOP2t[_Rs_](); } + +#if defined(LOADSTORE_RECOMPILE) && defined(CP2_RECOMPILE) + +/********************************************************* +* Load and store for COP2 (VU0 unit) * +* Format: OP rt, offset(base) * +*********************************************************/ + +void recLQC2() +{ + if (g_pCurInstInfo->info & EEINST_COP2_SYNC_VU0) + mVUSyncVU0(); + else if (g_pCurInstInfo->info & EEINST_COP2_FINISH_VU0) + mVUFinishVU0(); + + vtlb_ReadRegAllocCallback alloc_cb = nullptr; + if (_Rt_) + { + // init regalloc after flush + alloc_cb = []() { return _allocVFtoXMMreg(_Rt_, MODE_WRITE); }; + } + + int xmmreg; + if (GPR_IS_CONST1(_Rs_)) + { + const u32 addr = (g_cpuConstRegs[_Rs_].UL[0] + _Imm_) & ~0xFu; + xmmreg = vtlb_DynGenReadQuad_Const(128, addr, alloc_cb); + } + else + { + _eeMoveGPRtoR(arg1regd, _Rs_); + if (_Imm_ != 0) + xADD(arg1regd, _Imm_); + xAND(arg1regd, ~0xF); + + xmmreg = vtlb_DynGenReadQuad(128, arg1regd.GetId(), alloc_cb); + } + + // toss away if loading to vf00 + if (!_Rt_) + _freeXMMreg(xmmreg); + + EE::Profiler.EmitOp(eeOpcode::LQC2); +} + +//////////////////////////////////////////////////// + +void recSQC2() +{ + if (g_pCurInstInfo->info & EEINST_COP2_SYNC_VU0) + mVUSyncVU0(); + else if (g_pCurInstInfo->info & EEINST_COP2_FINISH_VU0) + mVUFinishVU0(); + + // vf00 has to be special cased here, because of the microvu temps... + const int ftreg = _Rt_ ? _allocVFtoXMMreg(_Rt_, MODE_READ) : _allocTempXMMreg(XMMT_FPS); + if (!_Rt_) + xMOVAPS(xRegisterSSE(ftreg), ptr128[&vu0Regs.VF[0].F]); + + if (GPR_IS_CONST1(_Rs_)) + { + const u32 addr = (g_cpuConstRegs[_Rs_].UL[0] + _Imm_) & ~0xFu; + vtlb_DynGenWrite_Const(128, true, addr, ftreg); + } + else + { + _eeMoveGPRtoR(arg1regd, _Rs_); + if (_Imm_ != 0) + xADD(arg1regd, _Imm_); + xAND(arg1regd, ~0xF); + + vtlb_DynGenWrite(128, true, arg1regd.GetId(), ftreg); + } + + if (!_Rt_) + _freeXMMreg(ftreg); + + EE::Profiler.EmitOp(eeOpcode::SQC2); +} + +#else + +REC_FUNC(LQC2); +REC_FUNC(SQC2); + +#endif + } // namespace OpcodeImpl } // namespace Dynarec } // namespace R5900 void recCOP2_BC2() { recCOP2_BC2t[_Rt_](); } void recCOP2_SPEC1() { - if (g_pCurInstInfo->info & EEINST_COP2_FINISH_VU0_MICRO) - { - xTEST(ptr32[&VU0.VI[REG_VPU_STAT].UL], 0x1); - xForwardJZ32 skipvuidle; - _cop2BackupRegs(); - xFastCall((void*)_vu0FinishMicro); - _cop2RestoreRegs(); - skipvuidle.SetTarget(); - } + if (g_pCurInstInfo->info & (EEINST_COP2_SYNC_VU0 | EEINST_COP2_FINISH_VU0)) + mVUFinishVU0(); recCOP2SPECIAL1t[_Funct_](); diff --git a/pcsx2/x86/microVU_Misc.h b/pcsx2/x86/microVU_Misc.h index 38daa9fd3b..7db1615ca6 100644 --- a/pcsx2/x86/microVU_Misc.h +++ b/pcsx2/x86/microVU_Misc.h @@ -198,7 +198,7 @@ typedef Fntype_mVUrecInst* Fnptr_mVUrecInst; //------------------------------------------------------------------ alignas(__pagesize) extern u8 mVUsearchXMM[__pagesize]; typedef u32 (*mVUCall)(void*, void*); -#define mVUquickSearch(dest, src, size) ((((mVUCall)((void*)mVUsearchXMM))(dest, src)) == 0xf) +#define mVUquickSearch(dest, src, size) ((((mVUCall)((void*)mVUsearchXMM))(dest, src)) == 0) #define mVUemitSearch() \ { \ mVUcustomSearch(); \ @@ -288,14 +288,14 @@ typedef u32 (*mVUCall)(void*, void*); //------------------------------------------------------------------ // Reg Alloc -static const bool doRegAlloc = true; // Set to false to flush every 32bit Instruction +static constexpr bool doRegAlloc = true; // Set to false to flush every 32bit Instruction // This turns off reg alloc for the most part, but reg alloc will still // be done within instructions... Also on doSwapOp() regAlloc is needed between // Lower and Upper instructions, so in this case it flushes after the full // 64bit instruction (lower and upper) // No Flag Optimizations -static const bool noFlagOpts = false; // Set to true to disable all flag setting optimizations +static constexpr bool noFlagOpts = false; // Set to true to disable all flag setting optimizations // Note: The flag optimizations this disables should all be harmless, so // this option is mainly just for debugging... it effectively forces mVU // to always update Mac and Status Flags (both sticky and non-sticky) whenever @@ -303,9 +303,9 @@ static const bool noFlagOpts = false; // Set to true to disable all flag setting // flag instances between blocks... // Multiple Flag Instances -static const bool doSFlagInsts = true; // Set to true to enable multiple status flag instances -static const bool doMFlagInsts = true; // Set to true to enable multiple mac flag instances -static const bool doCFlagInsts = true; // Set to true to enable multiple clip flag instances +static constexpr bool doSFlagInsts = true; // Set to true to enable multiple status flag instances +static constexpr bool doMFlagInsts = true; // Set to true to enable multiple mac flag instances +static constexpr bool doCFlagInsts = true; // Set to true to enable multiple clip flag instances // This is the correct behavior of the VU's. Due to the pipeline of the VU's // there can be up to 4 different instances of values to keep track of // for the 3 different types of flags: Status, Mac, Clip flags. @@ -313,27 +313,27 @@ static const bool doCFlagInsts = true; // Set to true to enable multiple clip // corresponding flag, which may be useful when debugging flag pipeline bugs. // Branch in Branch Delay Slots -static const bool doBranchInDelaySlot = true; // Set to true to enable evil-branches +static constexpr bool doBranchInDelaySlot = true; // Set to true to enable evil-branches // This attempts to emulate the correct behavior for branches in branch delay // slots. It is evil that games do this, and handling the different possible // cases is tricky and bug prone. If this option is disabled then the second // branch is treated as a NOP and effectively ignored. // Constant Propagation -static const bool doConstProp = false; // Set to true to turn on vi15 const propagation +static constexpr bool doConstProp = false; // Set to true to turn on vi15 const propagation // Enables Constant Propagation for Jumps based on vi15 'link-register' // allowing us to know many indirect jump target addresses. // Makes GoW a lot slower due to extra recompilation time and extra code-gen! // Indirect Jump Caching -static const bool doJumpCaching = true; // Set to true to enable jump caching +static constexpr bool doJumpCaching = true; // Set to true to enable jump caching // Indirect jumps (JR/JALR) will remember the entry points to their previously // jumped-to addresses. This allows us to skip the microBlockManager::search() // routine that is performed every indirect jump in order to find a block within a // program that matches the correct pipeline state. // Indirect Jumps are part of same cached microProgram -static const bool doJumpAsSameProgram = false; // Set to true to treat jumps as same program +static constexpr bool doJumpAsSameProgram = false; // Set to true to treat jumps as same program // Enabling this treats indirect jumps (JR/JALR) as part of the same microProgram // when determining the valid ranges for the microProgram cache. Disabling this // counts indirect jumps as separate cached microPrograms which generally leads @@ -343,11 +343,17 @@ static const bool doJumpAsSameProgram = false; // Set to true to treat jumps as // Note: You MUST disable doJumpCaching if you enable this option. // Handling of D-Bit in Micro Programs -static const bool doDBitHandling = false; +static constexpr bool doDBitHandling = false; // This flag shouldn't be enabled in released versions of games. Any games which // need this method of pausing the VU should be using the T-Bit instead, however // this could prove useful for VU debugging. +// Whole program comparison on search +static constexpr bool doWholeProgCompare = false; +// This shouldn't be needed and could inflate program generation. +// Compares the entire VU memory with the stored micro program's memory, regardless of if it's used. +// Generally slower but may be useful for debugging. + //------------------------------------------------------------------ // Speed Hacks (can cause infinite loops, SPS, Black Screens, etc...) //------------------------------------------------------------------ diff --git a/pcsx2/x86/microVU_Misc.inl b/pcsx2/x86/microVU_Misc.inl index c2cf097eb7..d74ba969d0 100644 --- a/pcsx2/x86/microVU_Misc.inl +++ b/pcsx2/x86/microVU_Misc.inl @@ -537,46 +537,81 @@ void mVUcustomSearch() memset(mVUsearchXMM, 0xcc, __pagesize); xSetPtr(mVUsearchXMM); - xMOVAPS (xmm0, ptr32[arg1reg]); - xPCMP.EQD(xmm0, ptr32[arg2reg]); - xMOVAPS (xmm1, ptr32[arg1reg + 0x10]); - xPCMP.EQD(xmm1, ptr32[arg2reg + 0x10]); - xPAND (xmm0, xmm1); + if (!x86caps.hasAVX2) + { + xMOVAPS (xmm0, ptr32[arg1reg]); + xPCMP.EQD(xmm0, ptr32[arg2reg]); + xMOVAPS (xmm1, ptr32[arg1reg + 0x10]); + xPCMP.EQD(xmm1, ptr32[arg2reg + 0x10]); + xPAND (xmm0, xmm1); - xMOVMSKPS(eax, xmm0); - xCMP (eax, 0xf); - xForwardJL8 exitPoint; + xMOVMSKPS(eax, xmm0); + xXOR (eax, 0xf); + xForwardJNZ8 exitPoint; - xMOVAPS (xmm0, ptr32[arg1reg + 0x20]); - xPCMP.EQD(xmm0, ptr32[arg2reg + 0x20]); - xMOVAPS (xmm1, ptr32[arg1reg + 0x30]); - xPCMP.EQD(xmm1, ptr32[arg2reg + 0x30]); - xPAND (xmm0, xmm1); + xMOVAPS (xmm0, ptr32[arg1reg + 0x20]); + xPCMP.EQD(xmm0, ptr32[arg2reg + 0x20]); + xMOVAPS (xmm1, ptr32[arg1reg + 0x30]); + xPCMP.EQD(xmm1, ptr32[arg2reg + 0x30]); + xPAND (xmm0, xmm1); - xMOVAPS (xmm2, ptr32[arg1reg + 0x40]); - xPCMP.EQD(xmm2, ptr32[arg2reg + 0x40]); - xMOVAPS (xmm3, ptr32[arg1reg + 0x50]); - xPCMP.EQD(xmm3, ptr32[arg2reg + 0x50]); - xPAND (xmm2, xmm3); + xMOVAPS (xmm1, ptr32[arg1reg + 0x40]); + xPCMP.EQD(xmm1, ptr32[arg2reg + 0x40]); + xMOVAPS (xmm2, ptr32[arg1reg + 0x50]); + xPCMP.EQD(xmm2, ptr32[arg2reg + 0x50]); + xPAND (xmm1, xmm2); - xMOVAPS (xmm4, ptr32[arg1reg + 0x60]); - xPCMP.EQD(xmm4, ptr32[arg2reg + 0x60]); - xMOVAPS (xmm5, ptr32[arg1reg + 0x70]); - xPCMP.EQD(xmm5, ptr32[arg2reg + 0x70]); - xPAND (xmm4, xmm5); + xMOVAPS (xmm2, ptr32[arg1reg + 0x60]); + xPCMP.EQD(xmm2, ptr32[arg2reg + 0x60]); + xMOVAPS (xmm3, ptr32[arg1reg + 0x70]); + xPCMP.EQD(xmm3, ptr32[arg2reg + 0x70]); + xPAND (xmm2, xmm3); - xMOVAPS (xmm6, ptr32[arg1reg + 0x80]); - xPCMP.EQD(xmm6, ptr32[arg2reg + 0x80]); - xMOVAPS (xmm7, ptr32[arg1reg + 0x90]); - xPCMP.EQD(xmm7, ptr32[arg2reg + 0x90]); - xPAND (xmm6, xmm7); + xMOVAPS (xmm3, ptr32[arg1reg + 0x80]); + xPCMP.EQD(xmm3, ptr32[arg2reg + 0x80]); + xMOVAPS (xmm4, ptr32[arg1reg + 0x90]); + xPCMP.EQD(xmm4, ptr32[arg2reg + 0x90]); + xPAND (xmm3, xmm4); - xPAND (xmm0, xmm2); - xPAND (xmm4, xmm6); - xPAND (xmm0, xmm4); - xMOVMSKPS(eax, xmm0); + xPAND (xmm0, xmm1); + xPAND (xmm2, xmm3); + xPAND (xmm0, xmm2); + xMOVMSKPS(eax, xmm0); + xXOR(eax, 0xf); + + exitPoint.SetTarget(); + } + else + { + // We have to use unaligned loads here, because the blocks are only 16 byte aligned. + xVMOVUPS(ymm0, ptr[arg1reg]); + xVPCMP.EQD(ymm0, ymm0, ptr[arg2reg]); + xVPMOVMSKB(eax, ymm0); + xNOT(eax); + xForwardJNZ8 exitPoint; + + xVMOVUPS(ymm0, ptr[arg1reg + 0x20]); + xVPCMP.EQD(ymm0, ymm0, ptr[arg2reg + 0x20]); + + xVMOVUPS(ymm1, ptr[arg1reg + 0x40]); + xVPCMP.EQD(ymm1, ymm1, ptr[arg2reg + 0x40]); + + xVMOVUPS(ymm2, ptr[arg1reg + 0x60]); + xVPCMP.EQD(ymm2, ymm2, ptr[arg2reg + 0x60]); + xVPAND(ymm0, ymm0, ymm1); + + xVMOVUPS(ymm3, ptr[arg1reg + 0x80]); + xVPCMP.EQD(ymm3, ymm3, ptr[arg2reg + 0x80]); + xVPAND(ymm2, ymm2, ymm3); + xVPAND(ymm0, ymm0, ymm2); + + xVPMOVMSKB(eax, ymm0); + xNOT(eax); + + exitPoint.SetTarget(); + xVZEROUPPER(); + } - exitPoint.SetTarget(); xRET(); HostSys::MemProtectStatic(mVUsearchXMM, PageAccess_ExecOnly()); } diff --git a/pcsx2/x86/microVU_Profiler.h b/pcsx2/x86/microVU_Profiler.h index 84e9be9243..9e9de013b2 100644 --- a/pcsx2/x86/microVU_Profiler.h +++ b/pcsx2/x86/microVU_Profiler.h @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. diff --git a/pcsx2/x86/microVU_Tables.inl b/pcsx2/x86/microVU_Tables.inl index b473016528..b6c5afb5e3 100644 --- a/pcsx2/x86/microVU_Tables.inl +++ b/pcsx2/x86/microVU_Tables.inl @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. diff --git a/pcsx2/x86/microVU_Upper.inl b/pcsx2/x86/microVU_Upper.inl index f993eb4920..7572d30d7b 100644 --- a/pcsx2/x86/microVU_Upper.inl +++ b/pcsx2/x86/microVU_Upper.inl @@ -1,6 +1,6 @@ /* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2010 PCSX2 Dev Team - * + * * PCSX2 is free software: you can redistribute it and/or modify it under the terms * of the GNU Lesser General Public License as published by the Free Software Found- * ation, either version 3 of the License, or (at your option) any later version. diff --git a/pcsx2/x86/newVif.h b/pcsx2/x86/newVif.h index ac9c3d2b93..17157d8648 100644 --- a/pcsx2/x86/newVif.h +++ b/pcsx2/x86/newVif.h @@ -72,7 +72,6 @@ struct nVifStruct nVifStruct() = default; }; -extern void closeNewVif(int idx); extern void resetNewVif(int idx); extern void releaseNewVif(int idx); @@ -80,4 +79,4 @@ alignas(16) extern nVifStruct nVif[2]; alignas(16) extern nVifCall nVifUpk[(2 * 2 * 16) * 4]; // ([USN][Masking][Unpack Type]) [curCycle] alignas(16) extern u32 nVifMask[3][4][4]; // [MaskNumber][CycleNumber][Vector] -static const bool newVifDynaRec = 1; // Use code in newVif_Dynarec.inl +static constexpr bool newVifDynaRec = 1; // Use code in newVif_Dynarec.inl diff --git a/pcsx2/x86/newVif_Dynarec.cpp b/pcsx2/x86/newVif_Dynarec.cpp index dc56a89ced..b3cab55d65 100644 --- a/pcsx2/x86/newVif_Dynarec.cpp +++ b/pcsx2/x86/newVif_Dynarec.cpp @@ -21,6 +21,7 @@ #include "newVif_UnpackSSE.h" #include "MTVU.h" #include "common/Perf.h" +#include "common/StringUtil.h" #include "fmt/core.h" static void recReset(int idx) @@ -34,11 +35,12 @@ static void recReset(int idx) void dVifReserve(int idx) { - if (!nVif[idx].recReserve) - nVif[idx].recReserve = new RecompiledCodeReserve(fmt::format("VIF{} Unpack Recompiler Cache", idx), _8mb); - - auto offset = idx ? HostMemoryMap::VIF1recOffset : HostMemoryMap::VIF0recOffset; - nVif[idx].recReserve->Reserve(GetVmMemory().MainMemory(), offset, 8 * _1mb); + if (nVif[idx].recReserve) + return; + + const size_t offset = idx ? HostMemoryMap::VIF1recOffset : HostMemoryMap::VIF0recOffset; + nVif[idx].recReserve = new RecompiledCodeReserve(StringUtil::StdStringFromFormat("VIF%u Unpack Recompiler Cache", idx)); + nVif[idx].recReserve->Assign(GetVmMemory().CodeMemory(), offset, 8 * _1mb); } void dVifReset(int idx) diff --git a/pcsx2/x86/newVif_HashBucket.h b/pcsx2/x86/newVif_HashBucket.h index 1bc3d1aec5..49940e1344 100644 --- a/pcsx2/x86/newVif_HashBucket.h +++ b/pcsx2/x86/newVif_HashBucket.h @@ -98,8 +98,7 @@ public: // Performance note: 64B align to reduce cache miss penalty in `find` if ((m_bucket[b] = (nVifBlock*)pcsx2_aligned_realloc(m_bucket[b], sizeof(nVifBlock) * (size + 2), 64, sizeof(nVifBlock) * (size + 1))) == NULL) { - throw Exception::OutOfMemory( - fmt::format("HashBucket Chain (bucket size={})", size + 2)); + pxFailRel("Failed to allocate HashBucket Chain"); } // Replace the empty cell by the new block and create a new empty cell @@ -138,9 +137,9 @@ public: // Allocate an empty cell for all buckets for (auto& bucket : m_bucket) { - if ((bucket = (nVifBlock*)_aligned_malloc(sizeof(nVifBlock), 64)) == nullptr) + if ((bucket = (nVifBlock*)_aligned_malloc(sizeof(nVifBlock), 16)) == nullptr) { - throw Exception::OutOfMemory(fmt::format("HashBucket Chain (bucket size=%d)", 1)); + pxFailRel("Failed to allocate HashBucket Chain on reset"); } memset(bucket, 0, sizeof(nVifBlock)); diff --git a/pcsx2/x86/newVif_Unpack.cpp b/pcsx2/x86/newVif_Unpack.cpp index 0ac4243186..7d0c413d6d 100644 --- a/pcsx2/x86/newVif_Unpack.cpp +++ b/pcsx2/x86/newVif_Unpack.cpp @@ -88,10 +88,6 @@ void resetNewVif(int idx) dVifReset(idx); } -void closeNewVif(int idx) -{ -} - void releaseNewVif(int idx) { } diff --git a/pcsx2/x86/newVif_UnpackSSE.cpp b/pcsx2/x86/newVif_UnpackSSE.cpp index e3226b801d..dc9a993d45 100644 --- a/pcsx2/x86/newVif_UnpackSSE.cpp +++ b/pcsx2/x86/newVif_UnpackSSE.cpp @@ -345,12 +345,9 @@ void VifUnpackSSE_Init() DevCon.WriteLn("Generating SSE-optimized unpacking functions for VIF interpreters..."); - nVifUpkExec = new RecompiledCodeReserve("VIF SSE-optimized Unpacking Functions", _64kb); + nVifUpkExec = new RecompiledCodeReserve("VIF SSE-optimized Unpacking Functions"); nVifUpkExec->SetProfilerName("iVIF-SSE"); - nVifUpkExec->Reserve(GetVmMemory().BumpAllocator(), _64kb); - - nVifUpkExec->ThrowIfNotOk(); - + nVifUpkExec->Assign(GetVmMemory().CodeMemory(), HostMemoryMap::VIFUnpackRecOffset, _1mb); xSetPtr(*nVifUpkExec); for (int a = 0; a < 2; a++) @@ -364,7 +361,7 @@ void VifUnpackSSE_Init() DevCon.Indent().WriteLn( "Reserved buffer : %u bytes @ 0x%016" PRIXPTR "\n" "x86 code generated : %u bytes\n", - (uint)nVifUpkExec->GetCommittedBytes(), + (uint)nVifUpkExec->GetSize(), nVifUpkExec->GetPtr(), (uint)(xGetPtr() - nVifUpkExec->GetPtr()) ); diff --git a/tests/ctest/CMakeLists.txt b/tests/ctest/CMakeLists.txt index a57e3ca802..d466caa02e 100644 --- a/tests/ctest/CMakeLists.txt +++ b/tests/ctest/CMakeLists.txt @@ -44,9 +44,9 @@ endif() if (MSVC) set(compile_options_avx /arch:AVX) set(compile_options_avx2 /arch:AVX2) - set(definitions_sse4 _M_SSE=0x401) - set(definitions_avx _M_SSE=0x500) - set(definitions_avx2 _M_SSE=0x501) + set(definitions_sse4 __SSE4_1__) + set(definitions_avx __SSE4_1__) + set(definitions_avx2 __SSE4_1__) else() set(compile_options_sse4 -msse4.1) set(compile_options_avx -mavx) @@ -70,4 +70,4 @@ endmacro() add_subdirectory(x86emitter) add_subdirectory(GS) -add_subdirectory(common) \ No newline at end of file +add_subdirectory(common) diff --git a/tests/ctest/GS/swizzle_test_main.cpp b/tests/ctest/GS/swizzle_test_main.cpp index 9057aa49b4..fccd85334c 100644 --- a/tests/ctest/GS/swizzle_test_main.cpp +++ b/tests/ctest/GS/swizzle_test_main.cpp @@ -16,9 +16,12 @@ #include "PrecompiledHeader.h" #include "GSBlock.h" #include "GSClut.h" +#include "MultiISA.h" #include #include +using namespace CURRENT_ISA; + static void swizzle(const u8* table, u8* dst, const u8* src, int bpp, bool deswizzle) { int pxbytes = bpp / 8; diff --git a/tests/ctest/common/CMakeLists.txt b/tests/ctest/common/CMakeLists.txt index 974be98089..5eaaa67009 100644 --- a/tests/ctest/common/CMakeLists.txt +++ b/tests/ctest/common/CMakeLists.txt @@ -1 +1 @@ -add_pcsx2_test(common_test path_tests.cpp) +add_pcsx2_test(common_test path_tests.cpp string_util_tests.cpp) diff --git a/tests/ctest/common/string_util_tests.cpp b/tests/ctest/common/string_util_tests.cpp new file mode 100644 index 0000000000..b7b788772b --- /dev/null +++ b/tests/ctest/common/string_util_tests.cpp @@ -0,0 +1,82 @@ +/* PCSX2 - PS2 Emulator for PCs + * Copyright (C) 2002-2022 PCSX2 Dev Team + * + * PCSX2 is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with PCSX2. + * If not, see . + */ + +#include "common/Pcsx2Defs.h" +#include "common/StringUtil.h" +#include +#include +#include + +TEST(StringUtil, ToChars) +{ + ASSERT_EQ(StringUtil::ToChars(false), "false"); + ASSERT_EQ(StringUtil::ToChars(true), "true"); + ASSERT_EQ(StringUtil::ToChars(0), "0"); + ASSERT_EQ(StringUtil::ToChars(-1337), "-1337"); + ASSERT_EQ(StringUtil::ToChars(1337), "1337"); + ASSERT_EQ(StringUtil::ToChars(1337u), "1337"); + ASSERT_EQ(StringUtil::ToChars(13.37f), "13.37"); + ASSERT_EQ(StringUtil::ToChars(255, 16), "ff"); +} + +TEST(StringUtil, FromChars) +{ + ASSERT_EQ(StringUtil::FromChars("false").value_or(true), false); + ASSERT_EQ(StringUtil::FromChars("true").value_or(false), true); + ASSERT_EQ(StringUtil::FromChars("0").value_or(-1), 0); + ASSERT_EQ(StringUtil::FromChars("-1337").value_or(0), -1337); + ASSERT_EQ(StringUtil::FromChars("1337").value_or(0), 1337); + ASSERT_EQ(StringUtil::FromChars("1337").value_or(0), 1337); + ASSERT_TRUE(std::abs(StringUtil::FromChars("13.37").value_or(0.0f) - 13.37) < 0.01f); + ASSERT_EQ(StringUtil::FromChars("ff", 16).value_or(0), 255); +} + +#if 0 +// NOTE: These tests are disabled, because they require the da_DK locale to actually be present. +// Which probably isn't going to be the case on the CI. + +TEST(StringUtil, ToCharsIsLocaleIndependent) +{ + const auto old_locale = std::locale(); + std::locale::global(std::locale::classic()); + + std::string classic_result(StringUtil::ToChars(13.37f)); + + std::locale::global(std::locale("da_DK")); + + std::string dk_result(StringUtil::ToChars(13.37f)); + + std::locale::global(old_locale); + + ASSERT_EQ(classic_result, dk_result); +} + +TEST(StringUtil, FromCharsIsLocaleIndependent) +{ + const auto old_locale = std::locale(); + std::locale::global(std::locale::classic()); + + const float classic_result = StringUtil::FromChars("13.37").value_or(0.0f); + + std::locale::global(std::locale("da_DK")); + + const float dk_result = StringUtil::FromChars("13.37").value_or(0.0f); + + std::locale::global(old_locale); + + ASSERT_EQ(classic_result, dk_result); +} + +#endif diff --git a/tests/ctest/x86emitter/codegen_tests.h b/tests/ctest/x86emitter/codegen_tests.h index ce31c8b59f..70288b5b06 100644 --- a/tests/ctest/x86emitter/codegen_tests.h +++ b/tests/ctest/x86emitter/codegen_tests.h @@ -17,7 +17,4 @@ void runCodegenTest(void (*exec)(void *base), const char* description, const char* expected); -// Use null to skip, empty string to expect no output -#define CODEGEN_TEST(command, expected32, expected64) runCodegenTest([](void *base){ command; }, #command, expected64) -#define CODEGEN_TEST_64(command, expected) CODEGEN_TEST(command, nullptr, expected) -#define CODEGEN_TEST_BOTH(command, expected) CODEGEN_TEST(command, expected, expected) +#define CODEGEN_TEST(command, expected) runCodegenTest([](void *base){ command; }, #command, expected) diff --git a/tests/ctest/x86emitter/codegen_tests_main.cpp b/tests/ctest/x86emitter/codegen_tests_main.cpp index 71353e3c13..d47b97e43a 100644 --- a/tests/ctest/x86emitter/codegen_tests_main.cpp +++ b/tests/ctest/x86emitter/codegen_tests_main.cpp @@ -22,148 +22,274 @@ using namespace x86Emitter; TEST(CodegenTests, MOVTest) { - CODEGEN_TEST_BOTH(xMOV(rax, 0), "31 c0"); - CODEGEN_TEST_64(xMOV(rax, rcx), "48 89 c8"); - CODEGEN_TEST_BOTH(xMOV(eax, ecx), "89 c8"); - CODEGEN_TEST_64(xMOV(r8, 0), "45 31 c0"); - CODEGEN_TEST_64(xMOV(rax, r8), "4c 89 c0"); - CODEGEN_TEST_64(xMOV(r8, rax), "49 89 c0"); - CODEGEN_TEST_64(xMOV(r8, r9), "4d 89 c8"); - CODEGEN_TEST_64(xMOV(rax, ptrNative[rcx]), "48 8b 01"); - CODEGEN_TEST_BOTH(xMOV(eax, ptrNative[rcx]), "8b 01"); - CODEGEN_TEST_64(xMOV(ptrNative[rax], rcx), "48 89 08"); - CODEGEN_TEST_BOTH(xMOV(ptr32[rax], ecx), "89 08"); - CODEGEN_TEST_64(xMOV(rax, ptrNative[r8]), "49 8b 00"); - CODEGEN_TEST_64(xMOV(ptrNative[r8], rax), "49 89 00"); - CODEGEN_TEST_64(xMOV(r8, ptrNative[r9]), "4d 8b 01"); - CODEGEN_TEST_64(xMOV(ptrNative[r8], r9), "4d 89 08"); - CODEGEN_TEST_64(xMOV(rax, ptrNative[rbx*4+3+rcx]), "48 8b 44 99 03"); - CODEGEN_TEST_64(xMOV(ptrNative[rbx*4+3+rax], rcx), "48 89 4c 98 03"); - CODEGEN_TEST_BOTH(xMOV(eax, ptr32[rbx*4+3+rcx]), "8b 44 99 03"); - CODEGEN_TEST_BOTH(xMOV(ptr32[rbx*4+3+rax], ecx), "89 4c 98 03"); - CODEGEN_TEST_64(xMOV(r8, ptrNative[r10*4+3+r9]), "4f 8b 44 91 03"); - CODEGEN_TEST_64(xMOV(ptrNative[r9*4+3+r8], r10), "4f 89 54 88 03"); - CODEGEN_TEST_64(xMOV(ptrNative[r8], 0), "49 c7 00 00 00 00 00"); - CODEGEN_TEST_BOTH(xMOV(ptr32[rax], 0), "c7 00 00 00 00 00"); - CODEGEN_TEST_BOTH(xMOV(ptr32[rbx*4+3+rax], -1), "c7 44 98 03 ff ff ff ff"); - CODEGEN_TEST_64(xMOV(rax, 0xffffffff), "b8 ff ff ff ff"); - CODEGEN_TEST_64(xMOV(r8, -1), "49 c7 c0 ff ff ff ff"); - CODEGEN_TEST_64(xMOV64(rax, 0x1234567890), "48 b8 90 78 56 34 12 00 00 00"); - CODEGEN_TEST_64(xMOV64(r8, 0x1234567890), "49 b8 90 78 56 34 12 00 00 00"); - CODEGEN_TEST_64(xMOV(ptr32[base], 0x12), "c7 05 f6 ff ff ff 12 00 00 00"); - CODEGEN_TEST_BOTH(xMOVSX(eax, dx), "0f bf c2"); - CODEGEN_TEST_64(xMOVSX(rax, r8d), "49 63 c0"); - CODEGEN_TEST_64(xMOVSX(rax, ebx), "48 63 c3"); + CODEGEN_TEST(xMOV(rax, 0), "31 c0"); + CODEGEN_TEST(xMOV(rax, rcx), "48 89 c8"); + CODEGEN_TEST(xMOV(eax, ecx), "89 c8"); + CODEGEN_TEST(xMOV(r8, 0), "45 31 c0"); + CODEGEN_TEST(xMOV(rax, r8), "4c 89 c0"); + CODEGEN_TEST(xMOV(r8, rax), "49 89 c0"); + CODEGEN_TEST(xMOV(r8, r9), "4d 89 c8"); + CODEGEN_TEST(xMOV(rax, ptr64[rcx]), "48 8b 01"); + CODEGEN_TEST(xMOV(eax, ptr32[rcx]), "8b 01"); + CODEGEN_TEST(xMOV(ptr64[rax], rcx), "48 89 08"); + CODEGEN_TEST(xMOV(ptr32[rax], ecx), "89 08"); + CODEGEN_TEST(xMOV(rax, ptr64[r8]), "49 8b 00"); + CODEGEN_TEST(xMOV(ptr64[r8], rax), "49 89 00"); + CODEGEN_TEST(xMOV(r8, ptr64[r9]), "4d 8b 01"); + CODEGEN_TEST(xMOV(ptr64[r8], r9), "4d 89 08"); + CODEGEN_TEST(xMOV(rax, ptr64[rbx*4+3+rcx]), "48 8b 44 99 03"); + CODEGEN_TEST(xMOV(ptr64[rbx*4+3+rax], rcx), "48 89 4c 98 03"); + CODEGEN_TEST(xMOV(eax, ptr32[rbx*4+3+rcx]), "8b 44 99 03"); + CODEGEN_TEST(xMOV(ptr32[rbx*4+3+rax], ecx), "89 4c 98 03"); + CODEGEN_TEST(xMOV(r8, ptr64[r10*4+3+r9]), "4f 8b 44 91 03"); + CODEGEN_TEST(xMOV(ptr64[r9*4+3+r8], r10), "4f 89 54 88 03"); + CODEGEN_TEST(xMOV(ptr64[r8], 0), "49 c7 00 00 00 00 00"); + CODEGEN_TEST(xMOV(ptr32[rax], 0), "c7 00 00 00 00 00"); + CODEGEN_TEST(xMOV(ptr32[rbx*4+3+rax], -1), "c7 44 98 03 ff ff ff ff"); + CODEGEN_TEST(xMOV(rax, 0xffffffff), "b8 ff ff ff ff"); + CODEGEN_TEST(xMOV(r8, -1), "49 c7 c0 ff ff ff ff"); + CODEGEN_TEST(xMOV64(rax, 0x1234567890), "48 b8 90 78 56 34 12 00 00 00"); + CODEGEN_TEST(xMOV64(r8, 0x1234567890), "49 b8 90 78 56 34 12 00 00 00"); + CODEGEN_TEST(xMOV(ptr32[base], 0x12), "c7 05 f6 ff ff ff 12 00 00 00"); + CODEGEN_TEST(xMOVSX(eax, dx), "0f bf c2"); + CODEGEN_TEST(xMOVSX(rax, r8d), "49 63 c0"); + CODEGEN_TEST(xMOVSX(rax, ebx), "48 63 c3"); } TEST(CodegenTests, LEATest) { - CODEGEN_TEST_64(xLEA(rax, ptr[rcx]), "48 89 c8"); // Converted to mov rax, rcx - CODEGEN_TEST_BOTH(xLEA(eax, ptr[rcx]), "89 c8"); // Converted to mov eax, ecx - CODEGEN_TEST_64(xLEA(rax, ptr[r8]), "4c 89 c0"); // Converted to mov rax, r8 - CODEGEN_TEST_64(xLEA(r8, ptr[r9]), "4d 89 c8"); // Converted to mov r8, r9 - CODEGEN_TEST_64(xLEA(rax, ptr[rbx*4+3+rcx]), "48 8d 44 99 03"); - CODEGEN_TEST_BOTH(xLEA(eax, ptr32[rbx*4+3+rcx]), "8d 44 99 03"); - CODEGEN_TEST_64(xLEA(r8, ptr[r10*4+3+r9]), "4f 8d 44 91 03"); - CODEGEN_TEST_64(xLEA(r8, ptr[base]), "4c 8d 05 f9 ff ff ff"); - CODEGEN_TEST_64(xLoadFarAddr(r8, base), "4c 8d 05 f9 ff ff ff"); - CODEGEN_TEST_64(xLoadFarAddr(r8, (void*)0x1234567890), "49 b8 90 78 56 34 12 00 00 00"); - CODEGEN_TEST_BOTH(xLEA(rax, ptr[(void*)0x1234]), "b8 34 12 00 00"); // Converted to mov rax, 0x1234 - CODEGEN_TEST_BOTH(xLoadFarAddr(rax, (void*)0x1234), "b8 34 12 00 00"); - CODEGEN_TEST(xLEA_Writeback(rbx), "bb cd cd cd cd", "48 8d 1d cd cd cd 0d"); + CODEGEN_TEST(xLEA(rax, ptr[rcx]), "48 89 c8"); // Converted to mov rax, rcx + CODEGEN_TEST(xLEA(eax, ptr[rcx]), "89 c8"); // Converted to mov eax, ecx + CODEGEN_TEST(xLEA(rax, ptr[r8]), "4c 89 c0"); // Converted to mov rax, r8 + CODEGEN_TEST(xLEA(r8, ptr[r9]), "4d 89 c8"); // Converted to mov r8, r9 + CODEGEN_TEST(xLEA(rax, ptr[rbx*4+3+rcx]), "48 8d 44 99 03"); + CODEGEN_TEST(xLEA(eax, ptr32[rbx*4+3+rcx]), "8d 44 99 03"); + CODEGEN_TEST(xLEA(r8, ptr[r10*4+3+r9]), "4f 8d 44 91 03"); + CODEGEN_TEST(xLEA(r8, ptr[base]), "4c 8d 05 f9 ff ff ff"); + CODEGEN_TEST(xLoadFarAddr(r8, base), "4c 8d 05 f9 ff ff ff"); + CODEGEN_TEST(xLoadFarAddr(r8, (void*)0x1234567890), "49 b8 90 78 56 34 12 00 00 00"); + CODEGEN_TEST(xLEA(rax, ptr[(void*)0x1234]), "b8 34 12 00 00"); // Converted to mov rax, 0x1234 + CODEGEN_TEST(xLoadFarAddr(rax, (void*)0x1234), "b8 34 12 00 00"); + CODEGEN_TEST(xLEA_Writeback(rbx), "48 8d 1d cd cd cd 0d"); } TEST(CodegenTests, PUSHTest) { - CODEGEN_TEST_BOTH(xPUSH(rax), "50"); - CODEGEN_TEST_64(xPUSH(r8), "41 50"); - CODEGEN_TEST_BOTH(xPUSH(0x1234), "68 34 12 00 00"); - CODEGEN_TEST_BOTH(xPUSH(0x12), "6a 12"); - CODEGEN_TEST_BOTH(xPUSH(ptrNative[rax]), "ff 30"); - CODEGEN_TEST_64(xPUSH(ptrNative[r8]), "41 ff 30"); - CODEGEN_TEST_BOTH(xPUSH(ptrNative[rax*2+3+rbx]), "ff 74 43 03"); - CODEGEN_TEST_64(xPUSH(ptrNative[rax*2+3+r8]), "41 ff 74 40 03"); - CODEGEN_TEST_64(xPUSH(ptrNative[r9*4+3+r8]), "43 ff 74 88 03"); - CODEGEN_TEST_64(xPUSH(ptrNative[r8*4+3+rax]), "42 ff 74 80 03"); - CODEGEN_TEST_BOTH(xPUSH(ptrNative[rax*8+0x1234+rbx]), "ff b4 c3 34 12 00 00"); - CODEGEN_TEST_64(xPUSH(ptrNative[base]), "ff 35 fa ff ff ff"); - CODEGEN_TEST(xPUSH(ptrNative[(void*)0x1234]), "ff 35 34 12 00 00", "ff 34 25 34 12 00 00"); + CODEGEN_TEST(xPUSH(rax), "50"); + CODEGEN_TEST(xPUSH(r8), "41 50"); + CODEGEN_TEST(xPUSH(0x1234), "68 34 12 00 00"); + CODEGEN_TEST(xPUSH(0x12), "6a 12"); + CODEGEN_TEST(xPUSH(ptr64[rax]), "ff 30"); + CODEGEN_TEST(xPUSH(ptr64[r8]), "41 ff 30"); + CODEGEN_TEST(xPUSH(ptr64[rax*2+3+rbx]), "ff 74 43 03"); + CODEGEN_TEST(xPUSH(ptr64[rax*2+3+r8]), "41 ff 74 40 03"); + CODEGEN_TEST(xPUSH(ptr64[r9*4+3+r8]), "43 ff 74 88 03"); + CODEGEN_TEST(xPUSH(ptr64[r8*4+3+rax]), "42 ff 74 80 03"); + CODEGEN_TEST(xPUSH(ptr64[rax*8+0x1234+rbx]), "ff b4 c3 34 12 00 00"); + CODEGEN_TEST(xPUSH(ptr64[base]), "ff 35 fa ff ff ff"); + CODEGEN_TEST(xPUSH(ptr64[(void*)0x1234]), "ff 34 25 34 12 00 00"); } TEST(CodegenTests, POPTest) { - CODEGEN_TEST_BOTH(xPOP(rax), "58"); - CODEGEN_TEST_64(xPOP(r8), "41 58"); - CODEGEN_TEST_BOTH(xPOP(ptrNative[rax]), "8f 00"); - CODEGEN_TEST_64(xPOP(ptrNative[r8]), "41 8f 00"); - CODEGEN_TEST_BOTH(xPOP(ptrNative[rax*2+3+rbx]), "8f 44 43 03"); - CODEGEN_TEST_64(xPOP(ptrNative[rax*2+3+r8]), "41 8f 44 40 03"); - CODEGEN_TEST_64(xPOP(ptrNative[r9*4+3+r8]), "43 8f 44 88 03"); - CODEGEN_TEST_64(xPOP(ptrNative[r8*4+3+rax]), "42 8f 44 80 03"); - CODEGEN_TEST_BOTH(xPOP(ptrNative[rax*8+0x1234+rbx]), "8f 84 c3 34 12 00 00"); - CODEGEN_TEST_64(xPOP(ptrNative[base]), "8f 05 fa ff ff ff"); - CODEGEN_TEST(xPOP(ptrNative[(void*)0x1234]), "8f 05 34 12 00 00", "8f 04 25 34 12 00 00"); + CODEGEN_TEST(xPOP(rax), "58"); + CODEGEN_TEST(xPOP(r8), "41 58"); + CODEGEN_TEST(xPOP(ptr64[rax]), "8f 00"); + CODEGEN_TEST(xPOP(ptr64[r8]), "41 8f 00"); + CODEGEN_TEST(xPOP(ptr64[rax*2+3+rbx]), "8f 44 43 03"); + CODEGEN_TEST(xPOP(ptr64[rax*2+3+r8]), "41 8f 44 40 03"); + CODEGEN_TEST(xPOP(ptr64[r9*4+3+r8]), "43 8f 44 88 03"); + CODEGEN_TEST(xPOP(ptr64[r8*4+3+rax]), "42 8f 44 80 03"); + CODEGEN_TEST(xPOP(ptr64[rax*8+0x1234+rbx]), "8f 84 c3 34 12 00 00"); + CODEGEN_TEST(xPOP(ptr64[base]), "8f 05 fa ff ff ff"); + CODEGEN_TEST(xPOP(ptr64[(void*)0x1234]), "8f 04 25 34 12 00 00"); } TEST(CodegenTests, MathTest) { - CODEGEN_TEST(xINC(eax), "40", "ff c0"); - CODEGEN_TEST(xDEC(rax), "48", "48 ff c8"); - CODEGEN_TEST_64(xINC(r8), "49 ff c0"); - CODEGEN_TEST_64(xADD(r8, r9), "4d 01 c8"); - CODEGEN_TEST_64(xADD(r8, 0x12), "49 83 c0 12"); - CODEGEN_TEST_64(xADD(rax, 0x1234), "48 05 34 12 00 00"); - CODEGEN_TEST_64(xADD(ptr8[base], 1), "80 05 f9 ff ff ff 01"); - CODEGEN_TEST_64(xADD(ptr32[base], -0x60), "83 05 f9 ff ff ff a0"); - CODEGEN_TEST_64(xADD(ptr32[base], 0x1234), "81 05 f6 ff ff ff 34 12 00 00"); - CODEGEN_TEST_BOTH(xADD(eax, ebx), "01 d8"); - CODEGEN_TEST_BOTH(xADD(eax, 0x1234), "05 34 12 00 00"); - CODEGEN_TEST_64(xADD(r8, ptrNative[r10*4+3+r9]), "4f 03 44 91 03"); - CODEGEN_TEST_64(xADD(ptrNative[r9*4+3+r8], r10), "4f 01 54 88 03"); - CODEGEN_TEST_BOTH(xADD(eax, ptr32[rbx*4+3+rcx]), "03 44 99 03"); - CODEGEN_TEST_BOTH(xADD(ptr32[rax*4+3+rbx], ecx), "01 4c 83 03"); - CODEGEN_TEST_64(xSUB(r8, 0x12), "49 83 e8 12"); - CODEGEN_TEST_64(xSUB(rax, 0x1234), "48 2d 34 12 00 00"); - CODEGEN_TEST_BOTH(xSUB(eax, ptr32[rcx*4+rax]), "2b 04 88"); - CODEGEN_TEST_64(xMUL(ptr32[base]), "f7 2d fa ff ff ff"); - CODEGEN_TEST(xMUL(ptr32[(void*)0x1234]), "f7 2d 34 12 00 00", "f7 2c 25 34 12 00 00"); - CODEGEN_TEST_BOTH(xDIV(ecx), "f7 f9"); + CODEGEN_TEST(xINC(eax), "ff c0"); + CODEGEN_TEST(xDEC(rax), "48 ff c8"); + CODEGEN_TEST(xINC(r8), "49 ff c0"); + CODEGEN_TEST(xADD(r8, r9), "4d 01 c8"); + CODEGEN_TEST(xADD(r8, 0x12), "49 83 c0 12"); + CODEGEN_TEST(xADD(rax, 0x1234), "48 05 34 12 00 00"); + CODEGEN_TEST(xADD(ptr8[base], 1), "80 05 f9 ff ff ff 01"); + CODEGEN_TEST(xADD(ptr32[base], -0x60), "83 05 f9 ff ff ff a0"); + CODEGEN_TEST(xADD(ptr32[base], 0x1234), "81 05 f6 ff ff ff 34 12 00 00"); + CODEGEN_TEST(xADD(eax, ebx), "01 d8"); + CODEGEN_TEST(xADD(eax, 0x1234), "05 34 12 00 00"); + CODEGEN_TEST(xADD(r8, ptr64[r10*4+3+r9]), "4f 03 44 91 03"); + CODEGEN_TEST(xADD(ptr64[r9*4+3+r8], r10), "4f 01 54 88 03"); + CODEGEN_TEST(xADD(eax, ptr32[rbx*4+3+rcx]), "03 44 99 03"); + CODEGEN_TEST(xADD(ptr32[rax*4+3+rbx], ecx), "01 4c 83 03"); + CODEGEN_TEST(xSUB(r8, 0x12), "49 83 e8 12"); + CODEGEN_TEST(xSUB(rax, 0x1234), "48 2d 34 12 00 00"); + CODEGEN_TEST(xSUB(eax, ptr32[rcx*4+rax]), "2b 04 88"); + CODEGEN_TEST(xMUL(ptr32[base]), "f7 2d fa ff ff ff"); + CODEGEN_TEST(xMUL(ptr32[(void*)0x1234]), "f7 2c 25 34 12 00 00"); + CODEGEN_TEST(xDIV(ecx), "f7 f9"); } TEST(CodegenTests, BitwiseTest) { - CODEGEN_TEST_64(xSHR(r8, cl), "49 d3 e8"); - CODEGEN_TEST_64(xSHR(rax, cl), "48 d3 e8"); - CODEGEN_TEST_BOTH(xSHR(ecx, cl), "d3 e9"); - CODEGEN_TEST_64(xSAR(r8, 1), "49 d1 f8"); - CODEGEN_TEST_64(xSAR(rax, 60), "48 c1 f8 3c"); - CODEGEN_TEST_BOTH(xSAR(eax, 30), "c1 f8 1e"); - CODEGEN_TEST_BOTH(xSHL(ebx, 30), "c1 e3 1e"); - CODEGEN_TEST_64(xSHL(ptr32[base], 4), "c1 25 f9 ff ff ff 04"); - CODEGEN_TEST_64(xAND(r8, r9), "4d 21 c8"); - CODEGEN_TEST_64(xXOR(rax, ptrNative[r10]), "49 33 02"); - CODEGEN_TEST_BOTH(xOR(esi, ptr32[rax+rbx]), "0b 34 18"); - CODEGEN_TEST_64(xNOT(r8), "49 f7 d0"); - CODEGEN_TEST_64(xNOT(ptrNative[rax]), "48 f7 10"); - CODEGEN_TEST_BOTH(xNOT(ptr32[rbx]), "f7 13"); + CODEGEN_TEST(xSHR(r8, cl), "49 d3 e8"); + CODEGEN_TEST(xSHR(rax, cl), "48 d3 e8"); + CODEGEN_TEST(xSHR(ecx, cl), "d3 e9"); + CODEGEN_TEST(xSAR(r8, 1), "49 d1 f8"); + CODEGEN_TEST(xSAR(rax, 60), "48 c1 f8 3c"); + CODEGEN_TEST(xSAR(eax, 30), "c1 f8 1e"); + CODEGEN_TEST(xSHL(ebx, 30), "c1 e3 1e"); + CODEGEN_TEST(xSHL(ptr32[base], 4), "c1 25 f9 ff ff ff 04"); + CODEGEN_TEST(xAND(r8, r9), "4d 21 c8"); + CODEGEN_TEST(xXOR(rax, ptr64[r10]), "49 33 02"); + CODEGEN_TEST(xOR(esi, ptr32[rax+rbx]), "0b 34 18"); + CODEGEN_TEST(xNOT(r8), "49 f7 d0"); + CODEGEN_TEST(xNOT(ptr64[rax]), "48 f7 10"); + CODEGEN_TEST(xNOT(ptr32[rbx]), "f7 13"); } TEST(CodegenTests, JmpTest) { - CODEGEN_TEST_64(xJMP(r8), "41 ff e0"); - CODEGEN_TEST_BOTH(xJMP(rdi), "ff e7"); - CODEGEN_TEST_BOTH(xJMP(ptrNative[rax]), "ff 20"); - CODEGEN_TEST_BOTH(xJA(base), "77 fe"); - CODEGEN_TEST_BOTH(xJB((char*)base - 0xFFFF), "0f 82 fb ff fe ff"); + CODEGEN_TEST(xJMP(r8), "41 ff e0"); + CODEGEN_TEST(xJMP(rdi), "ff e7"); + CODEGEN_TEST(xJMP(ptr64[rax]), "ff 20"); + CODEGEN_TEST(xJA(base), "77 fe"); + CODEGEN_TEST(xJB((char*)base - 0xFFFF), "0f 82 fb ff fe ff"); } TEST(CodegenTests, SSETest) { - CODEGEN_TEST_BOTH(xMOVAPS(xmm0, xmm1), "0f 28 c1"); - CODEGEN_TEST_64(xMOVAPS(xmm8, xmm9), "45 0f 28 c1"); - CODEGEN_TEST_64(xMOVUPS(xmm8, ptr128[r8+r9]), "47 0f 10 04 08"); - CODEGEN_TEST_64(xMOVAPS(ptr128[rax+r9], xmm8), "46 0f 29 04 08"); - CODEGEN_TEST_BOTH(xBLEND.PS(xmm0, xmm1, 0x55), "66 0f 3a 0c c1 55"); - CODEGEN_TEST_64(xBLEND.PD(xmm8, xmm9, 0xaa), "66 45 0f 3a 0d c1 aa"); - CODEGEN_TEST_64(xEXTRACTPS(ptr32[base], xmm1, 2), "66 0f 3a 17 0d f6 ff ff ff 02"); + CODEGEN_TEST(xMOVAPS(xmm0, xmm1), "0f 28 c1"); + CODEGEN_TEST(xMOVAPS(xmm8, xmm9), "45 0f 28 c1"); + CODEGEN_TEST(xMOVUPS(xmm8, ptr128[r8+r9]), "47 0f 10 04 08"); + CODEGEN_TEST(xMOVAPS(ptr128[rax+r9], xmm8), "46 0f 29 04 08"); + CODEGEN_TEST(xBLEND.PS(xmm0, xmm1, 0x55), "66 0f 3a 0c c1 55"); + CODEGEN_TEST(xBLEND.PD(xmm8, xmm9, 0xaa), "66 45 0f 3a 0d c1 aa"); + CODEGEN_TEST(xEXTRACTPS(ptr32[base], xmm1, 2), "66 0f 3a 17 0d f6 ff ff ff 02"); + CODEGEN_TEST(xMOVD(eax, xmm1), "66 0f 7e c8"); + CODEGEN_TEST(xMOVD(eax, xmm10), "66 44 0f 7e d0"); + CODEGEN_TEST(xMOVD(rax, xmm1), "66 48 0f 7e c8"); + CODEGEN_TEST(xMOVD(r10, xmm1), "66 49 0f 7e ca"); + CODEGEN_TEST(xMOVD(rax, xmm10), "66 4c 0f 7e d0"); + CODEGEN_TEST(xMOVD(r10, xmm10), "66 4d 0f 7e d2"); + CODEGEN_TEST(xPINSR.B(xmm0, ebx, 1), "66 0f 3a 20 c3 01"); + CODEGEN_TEST(xPINSR.W(xmm0, ebx, 1), "66 0f c4 c3 01"); + CODEGEN_TEST(xPINSR.D(xmm0, ebx, 1), "66 0f 3a 22 c3 01"); + CODEGEN_TEST(xPINSR.Q(xmm0, rbx, 1), "66 48 0f 3a 22 c3 01"); + CODEGEN_TEST(xPEXTR.B(ebx, xmm0, 1), "66 0f 3a 14 c3 01"); + CODEGEN_TEST(xPEXTR.W(ebx, xmm0, 1), "66 0f c5 c3 01"); + CODEGEN_TEST(xPEXTR.D(ebx, xmm0, 1), "66 0f 3a 16 c3 01"); + CODEGEN_TEST(xPEXTR.Q(rbx, xmm0, 1), "66 48 0f 3a 16 c3 01"); + CODEGEN_TEST(xPEXTR.Q(ptr64[rax], xmm0, 1), "66 48 0f 3a 16 00 01"); +} + +TEST(CodegenTests, AVXTest) +{ + CODEGEN_TEST(xVMOVAPS(xmm0, xmm1), "c5 f8 28 c1"); + CODEGEN_TEST(xVMOVAPS(xmm0, ptr32[rdi]), "c5 f8 28 07"); + CODEGEN_TEST(xVMOVAPS(ptr32[rdi], xmm0), "c5 f8 29 07"); + CODEGEN_TEST(xVMOVUPS(xmm0, ptr32[rdi]), "c5 f8 10 07"); + CODEGEN_TEST(xVMOVUPS(ptr32[rdi], xmm0), "c5 f8 11 07"); + + CODEGEN_TEST(xVADD.PS(xmm0, xmm1, xmm2), "c5 f0 58 c2"); + CODEGEN_TEST(xVADD.PD(xmm0, xmm1, xmm2), "c5 f1 58 c2"); + CODEGEN_TEST(xVADD.SS(xmm0, xmm1, xmm2), "c5 f2 58 c2"); + CODEGEN_TEST(xVADD.SD(xmm0, xmm1, xmm2), "c5 f3 58 c2"); + CODEGEN_TEST(xVSUB.PS(xmm0, xmm1, xmm2), "c5 f0 5c c2"); + CODEGEN_TEST(xVSUB.PD(xmm0, xmm1, xmm2), "c5 f1 5c c2"); + CODEGEN_TEST(xVSUB.SS(xmm0, xmm1, xmm2), "c5 f2 5c c2"); + CODEGEN_TEST(xVSUB.SD(xmm0, xmm1, xmm2), "c5 f3 5c c2"); + CODEGEN_TEST(xVMUL.PS(xmm0, xmm1, xmm2), "c5 f0 59 c2"); + CODEGEN_TEST(xVMUL.PD(xmm0, xmm1, xmm2), "c5 f1 59 c2"); + CODEGEN_TEST(xVMUL.SS(xmm0, xmm1, xmm2), "c5 f2 59 c2"); + CODEGEN_TEST(xVMUL.SD(xmm0, xmm1, xmm2), "c5 f3 59 c2"); + CODEGEN_TEST(xVDIV.PS(xmm0, xmm1, xmm2), "c5 f0 5e c2"); + CODEGEN_TEST(xVDIV.PD(xmm0, xmm1, xmm2), "c5 f1 5e c2"); + CODEGEN_TEST(xVDIV.SS(xmm0, xmm1, xmm2), "c5 f2 5e c2"); + CODEGEN_TEST(xVDIV.SD(xmm0, xmm1, xmm2), "c5 f3 5e c2"); + + // Don't need to test all variants, since they just change the condition immediate. + CODEGEN_TEST(xVCMP.EQ.PS(xmm0, xmm1, xmm2), "c5 f0 c2 c2 00"); + CODEGEN_TEST(xVCMP.EQ.PD(xmm0, xmm1, xmm2), "c5 f1 c2 c2 00"); + CODEGEN_TEST(xVCMP.EQ.SS(xmm0, xmm1, xmm2), "c5 f2 c2 c2 00"); + CODEGEN_TEST(xVCMP.EQ.SD(xmm0, xmm1, xmm2), "c5 f3 c2 c2 00"); + CODEGEN_TEST(xVCMP.LE.PS(xmm0, xmm1, xmm2), "c5 f0 c2 c2 02"); + CODEGEN_TEST(xVCMP.LE.PD(xmm0, xmm1, xmm2), "c5 f1 c2 c2 02"); + CODEGEN_TEST(xVCMP.LE.SS(xmm0, xmm1, xmm2), "c5 f2 c2 c2 02"); + CODEGEN_TEST(xVCMP.LE.SD(xmm0, xmm1, xmm2), "c5 f3 c2 c2 02"); + + CODEGEN_TEST(xVPCMP.EQB(xmm0, xmm1, xmm2), "c5 f1 74 c2"); + CODEGEN_TEST(xVPCMP.EQW(xmm0, xmm1, xmm2), "c5 f1 75 c2"); + CODEGEN_TEST(xVPCMP.EQD(xmm0, xmm1, xmm2), "c5 f1 76 c2"); + CODEGEN_TEST(xVPCMP.GTB(xmm0, xmm1, xmm2), "c5 f1 64 c2"); + CODEGEN_TEST(xVPCMP.GTW(xmm0, xmm1, xmm2), "c5 f1 65 c2"); + CODEGEN_TEST(xVPCMP.GTD(xmm0, xmm1, xmm2), "c5 f1 66 c2"); + + CODEGEN_TEST(xVPAND(xmm0, xmm1, xmm2), "c5 f1 db c2"); + CODEGEN_TEST(xVPANDN(xmm0, xmm1, xmm2), "c5 f1 df c2"); + CODEGEN_TEST(xVPOR(xmm0, xmm1, xmm2), "c5 f1 eb c2"); + CODEGEN_TEST(xVPXOR(xmm0, xmm1, xmm2), "c5 f1 ef c2"); + + CODEGEN_TEST(xVMOVMSKPS(eax, xmm1), "c5 f8 50 c1"); + CODEGEN_TEST(xVMOVMSKPD(eax, xmm1), "c5 f9 50 c1"); +} + +TEST(CodegenTests, AVX256Test) +{ + CODEGEN_TEST(xVMOVAPS(ymm0, ymm1), "c5 fc 28 c1"); + CODEGEN_TEST(xVMOVAPS(ymm0, ptr32[rdi]), "c5 fc 28 07"); + CODEGEN_TEST(xVMOVAPS(ptr32[rdi], ymm0), "c5 fc 29 07"); + CODEGEN_TEST(xVMOVUPS(ymm0, ptr32[rdi]), "c5 fc 10 07"); + CODEGEN_TEST(xVMOVUPS(ptr32[rdi], ymm0), "c5 fc 11 07"); + + CODEGEN_TEST(xVZEROUPPER(), "c5 f8 77"); + + CODEGEN_TEST(xVADD.PS(ymm0, ymm1, ymm2), "c5 f4 58 c2"); + CODEGEN_TEST(xVADD.PD(ymm0, ymm1, ymm2), "c5 f5 58 c2"); + CODEGEN_TEST(xVSUB.PS(ymm0, ymm1, ymm2), "c5 f4 5c c2"); + CODEGEN_TEST(xVSUB.PD(ymm0, ymm1, ymm2), "c5 f5 5c c2"); + CODEGEN_TEST(xVMUL.PS(ymm0, ymm1, ymm2), "c5 f4 59 c2"); + CODEGEN_TEST(xVMUL.PD(ymm0, ymm1, ymm2), "c5 f5 59 c2"); + CODEGEN_TEST(xVDIV.PS(ymm0, ymm1, ymm2), "c5 f4 5e c2"); + CODEGEN_TEST(xVDIV.PD(ymm0, ymm1, ymm2), "c5 f5 5e c2"); + + CODEGEN_TEST(xVCMP.EQ.PS(ymm0, ymm1, ymm2), "c5 f4 c2 c2 00"); + CODEGEN_TEST(xVCMP.EQ.PD(ymm0, ymm1, ymm2), "c5 f5 c2 c2 00"); + CODEGEN_TEST(xVCMP.LE.PS(ymm0, ymm1, ymm2), "c5 f4 c2 c2 02"); + CODEGEN_TEST(xVCMP.LE.PD(ymm0, ymm1, ymm2), "c5 f5 c2 c2 02"); + + CODEGEN_TEST(xVPCMP.EQB(ymm0, ymm1, ymm2), "c5 f5 74 c2"); + CODEGEN_TEST(xVPCMP.EQW(ymm0, ymm1, ymm2), "c5 f5 75 c2"); + CODEGEN_TEST(xVPCMP.EQD(ymm0, ymm1, ymm2), "c5 f5 76 c2"); + CODEGEN_TEST(xVPCMP.GTB(ymm0, ymm1, ymm2), "c5 f5 64 c2"); + CODEGEN_TEST(xVPCMP.GTW(ymm0, ymm1, ymm2), "c5 f5 65 c2"); + CODEGEN_TEST(xVPCMP.GTD(ymm0, ymm1, ymm2), "c5 f5 66 c2"); + + CODEGEN_TEST(xVPAND(ymm0, ymm1, ymm2), "c5 f5 db c2"); + CODEGEN_TEST(xVPANDN(ymm0, ymm1, ymm2), "c5 f5 df c2"); + CODEGEN_TEST(xVPOR(ymm0, ymm1, ymm2), "c5 f5 eb c2"); + CODEGEN_TEST(xVPXOR(ymm0, ymm1, ymm2), "c5 f5 ef c2"); + + CODEGEN_TEST(xVMOVMSKPS(eax, ymm1), "c5 fc 50 c1"); + CODEGEN_TEST(xVMOVMSKPD(eax, ymm1), "c5 fd 50 c1"); +} + +TEST(CodegenTests, Extended8BitTest) +{ + CODEGEN_TEST(xSETL(al), "0f 9c c0"); + CODEGEN_TEST(xSETL(cl), "0f 9c c1"); + CODEGEN_TEST(xSETL(dl), "0f 9c c2"); + CODEGEN_TEST(xSETL(bl), "0f 9c c3"); + CODEGEN_TEST(xSETL(spl), "40 0f 9c c4"); + CODEGEN_TEST(xSETL(bpl), "40 0f 9c c5"); + CODEGEN_TEST(xSETL(sil), "40 0f 9c c6"); + CODEGEN_TEST(xSETL(dil), "40 0f 9c c7"); + CODEGEN_TEST(xSETL(r8b), "41 0f 9c c0"); + CODEGEN_TEST(xSETL(r9b), "41 0f 9c c1"); + CODEGEN_TEST(xSETL(r10b), "41 0f 9c c2"); + CODEGEN_TEST(xSETL(r11b), "41 0f 9c c3"); + CODEGEN_TEST(xSETL(r12b), "41 0f 9c c4"); + CODEGEN_TEST(xSETL(r13b), "41 0f 9c c5"); + CODEGEN_TEST(xSETL(r14b), "41 0f 9c c6"); + CODEGEN_TEST(xSETL(r15b), "41 0f 9c c7"); } diff --git a/tools/generate_update_fa_glyph_ranges.py b/tools/generate_update_fa_glyph_ranges.py new file mode 100644 index 0000000000..04cd3c9e0a --- /dev/null +++ b/tools/generate_update_fa_glyph_ranges.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 + +import sys +import os +import glob +import re +import functools + +# PCSX2 - PS2 Emulator for PCs +# Copyright (C) 2002-2022 PCSX2 Dev Team +# +# PCSX2 is free software: you can redistribute it and/or modify it under the terms +# of the GNU Lesser General Public License as published by the Free Software Found- +# ation, either version 3 of the License, or (at your option) any later version. +# +# PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with PCSX2. +# If not, see . + +# pylint: disable=bare-except, disable=missing-function-docstring + +src_dirs = [os.path.join(os.path.dirname(__file__), "..", "pcsx2"), os.path.join(os.path.dirname(__file__), "..", "pcsx2-qt")] +fa_file = os.path.join(os.path.dirname(__file__), "..", "3rdparty", "include", "IconsFontAwesome5.h") +dst_file = os.path.join(os.path.dirname(__file__), "..", "pcsx2", "Frontend", "ImguiManager.cpp") + +all_source_files = list(functools.reduce(lambda prev, src_dir: prev + glob.glob(os.path.join(src_dir, "**", "*.cpp"), recursive=True) + \ + glob.glob(os.path.join(src_dir, "**", "*.h"), recursive=True) + \ + glob.glob(os.path.join(src_dir, "**", "*.inl"), recursive=True), src_dirs, [])) + +tokens = set() +for filename in all_source_files: + data = None + with open(filename, "r") as f: + try: + data = f.read() + except: + continue + + tokens = tokens.union(set(re.findall("(ICON_FA_[a-zA-Z0-9_]+)", data))) + +print("{} tokens found.".format(len(tokens))) +if len(tokens) == 0: + sys.exit(0) + +u8_encodings = {} +with open(fa_file, "r") as f: + for line in f.readlines(): + match = re.match("#define (ICON_FA_[^ ]+) \"([^\"]+)\"", line) + if match is None: + continue + u8_encodings[match[1]] = bytes.fromhex(match[2].replace("\\x", "")) + +out_pattern = "(static constexpr ImWchar range_fa\[\] = \{)[0-9A-Z_a-z, \n]+(\};)" + +codepoints = list() +for token in tokens: + u8_bytes = u8_encodings[token] + u8 = str(u8_bytes, "utf-8") + u16 = u8.encode("utf-16le") + if len(u16) > 2: + raise ValueError("{} too long".format(u8_bytes)) + + codepoint = int.from_bytes(u16, byteorder="little", signed=False) + codepoints.append(codepoint) +codepoints.sort() +codepoints.append(0) # null terminator + +startc = codepoints[0] +endc = None +pairs = [startc] +for codepoint in codepoints: + if endc is not None and (endc + 1) != codepoint: + pairs.append(endc) + pairs.append(codepoint) + startc = codepoint + endc = codepoint + else: + endc = codepoint +pairs.append(endc) + +pairs_str = ",".join(map("0x{:x}".format, pairs)) + +with open(dst_file, "r") as f: + original = f.read() + updated = re.sub(out_pattern, "\\1 " + pairs_str + " \\2", original) + if original != updated: + with open(dst_file, "w") as f: + f.write(updated) + print("Updated {}".format(dst_file)) + else: + print("Skipping updating {}".format(dst_file)) + diff --git a/updater/CMakeLists.txt b/updater/CMakeLists.txt index 19b7192f0c..94368051d5 100644 --- a/updater/CMakeLists.txt +++ b/updater/CMakeLists.txt @@ -1,15 +1,30 @@ add_executable(updater + SZErrors.h Updater.cpp Updater.h + UpdaterExtractor.h ) target_link_libraries(updater PRIVATE common fmt::fmt) +target_include_directories(updater PRIVATE .) if(WIN32) target_link_libraries(updater PRIVATE LZMA::LZMA + Comctl32.lib ) target_sources(updater PRIVATE - Win32Update.cpp + Windows/WindowsUpdater.cpp + Windows/resource.h + Windows/updater.rc + Windows/updater.manifest ) + set_target_properties(updater PROPERTIES WIN32_EXECUTABLE TRUE) +endif() + +if(NOT PACKAGE_MODE) + install(TARGETS updater DESTINATION ${CMAKE_SOURCE_DIR}/bin) + if(MSVC) + install(FILES $ DESTINATION ${CMAKE_SOURCE_DIR}/bin) + endif() endif() diff --git a/updater/Windows/updater.ico b/updater/Windows/updater.ico index 5a7a7a5f80..90aeddb8fa 100644 Binary files a/updater/Windows/updater.ico and b/updater/Windows/updater.ico differ diff --git a/updater/Windows/updater.rc b/updater/Windows/updater.rc index 1cd896f3ef..51c9c2c98d 100644 --- a/updater/Windows/updater.rc +++ b/updater/Windows/updater.rc @@ -25,18 +25,18 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS // TEXTINCLUDE // -1 TEXTINCLUDE +1 TEXTINCLUDE BEGIN "resource.h\0" END -2 TEXTINCLUDE +2 TEXTINCLUDE BEGIN "#include ""winres.h""\r\n" "\0" END -3 TEXTINCLUDE +3 TEXTINCLUDE BEGIN "\r\n" "\0" diff --git a/updater/updater.vcxproj b/updater/updater.vcxproj index 6b2ce5ba39..9bc76622d5 100644 --- a/updater/updater.vcxproj +++ b/updater/updater.vcxproj @@ -33,6 +33,7 @@ $(SolutionDir)3rdparty\lzma\include;%(AdditionalIncludeDirectories) + $(SolutionDir)3rdparty\rapidyaml\rapidyaml\ext\c4core\src\c4\ext\fast_float\include;%(AdditionalIncludeDirectories) $(ProjectDir);%(AdditionalIncludeDirectories) Async NotUsing
    Time of Day (8 bytes)